CTAN update: xecjk
Date: July 26, 2026 7:40:25 AM CEST
Liam Huang submitted an update to the
xecjk
package.
Version: 3.10.4
License: lppl1.3c
Summary description: Typeset CJK in XeLaTeX
Announcement text:
This release introduces a unified command-boundary capture/register framework that replaces numerous ad-hoc mechanisms for handling inter-character spacing around boxes, color changes, hyperlinks, and third-party commands. It also fixes several boundary and glue-handling bugs. NEW FEATURES - New command-boundary capture/register framework that determines the visible head/tail character class of boxes, opaque node streams, and commands with no visible output, and restores inter-character boundaries accordingly (#992). - New experimental `experiment/boundary-register` interface allowing expert users to register custom commands into the unified command-boundary framework (#1010). - New dedicated inline-math boundary class that separately handles end-of-formula spacing and post-formula source spaces in argument contexts, enabling registered commands to restore left/right boundaries with correct direct-formula source-space semantics (#1002). - New `\@@_glue_check_expire_stale:` routine: when the top-level recovery chain finds an empty node list, it clears stale pending state, preventing `\g_@@_glue_check_pending_bool` from surviving across `\hbox`/`\setbox` boundaries (#996). - `siunitx` compatibility: `\unit`, `\qty`, `\num` and v2 legacy names `\si`, `\SI` are registered as fixed Default head/tail stream captures, fixing space loss at unit-command boundaries in CJK context (#1000). BUG FIXES - Fixed range parsing of default endpoints in `\@@_check_num_range:nnNN`. - Boundary-to-CJK source-space check now uses the same `\@@_skip_if_interword:N` test as the Default direction; explicit glue whose natural width differs from the current inter-word space is no longer replaced by `\CJKglue` (#996). - box/wrapped-box capture now rebuilds boundaries as Default head/tail when a box has emitted visible content (non-zero width, non-zero height or depth, with a terminal char/rule/math/kern node) but no character class was observed. Math and `\vrule` etc. that do not trigger interchar transitions are no longer misidentified as "no visible output" (#998). - Default marker replay now synchronises `\spacefactor` with the outer list; post-transparent processing also relocates the marker together with its candidate glue, fixing right-boundary spacing when `xCJKecglue` is enabled and a trailing uppercase letter or `\null` inside a box obscures the boundary suffix (#1003). - Invisible nodes separating a real space from a marker in a normal stream now cause the marker to expire (direct-formula semantics) and preserve the original ordering of intermediate glue and nodes (#1002). - Fixed nested `ulem`/xeCJKfntef underline commands: only the outermost invocation now starts a stream capture, preventing per-nesting state leakage on the capture stack (#992). DOCUMENTATION - Clarified that `xCJKecglue` also controls source spaces adjacent to inline math (#1002). - Documented in the user manual that TeX cannot distinguish source spaces from certain explicit glue, and provided a zero-width `\kern` workaround (#992). - Added Boundary→CJK direction note: certain explicit glue may also be replaced by `CJKglue` (#996). INTERNAL CHANGES - Allowed the Boundary-to-Default recovery path to tentatively remove trailing source inter-word glue that has no infinite-order stretch but does have shrink; if a CJK marker is found beneath, it is replaced by `\CJKecglue`, completing symmetric command-boundary handling with the Default-to-CJK direction (#992). - Command-boundary framework now manages `xeCJKfntef`, box commands, and color commands; removed the legacy fallback that guessed hlist/whatsit categories via a global tl. The glue branch now only accepts immediately adjacent xeCJK markers (#992). - Removed the dedicated color pending boolean; color push/pop and box output are now handled by transparent/wrapped-box capture (#992). - Wrapped the kernel-private `\@imakebox` and `\@iframebox` `[#1][#2]#3` signatures to register `\makebox`/`\framebox`; this wrapper must be updated if the kernel changes that signature (#992). - Migrated link-annotation entry saving and tail-anchor replay to unified stream capture, restoring boundaries on both sides according to the link's actual visible head/tail class (#992). - Registered `\set@color` and `\reset@color` as transparent captures; removed the dedicated color push/pop marker save/replay branch (#992). - Registered `l3color` color push/pop entries as transparent captures; removed the corresponding dedicated marker protection branch (#992). - Migrated `\HD@target` to unified transparent capture, restoring marker and source-space state on both sides (#992). - Wrapped `\Url@z`'s full formatting phase in a fixed Default head/tail stream capture; removed the #880 dedicated drain (#992). - Migrated `\verb` from the entry drain (which assumed Western output) to unified stream capture, restoring boundaries according to verbatim's actual head/tail class (#992). - Registered `\eqref` as fixed Default head/tail and `\cs` as fixed Default head-only stream captures; codedoc/doc meta internal adapters now directly wrap a fixed Default stream, removing the dedicated drain and covering all its public call sites (#992). - Registered kernel `\@setref` (or `hyperref`-saved `\real@setref`) as auto stream capture, replacing the #991 dedicated saved-node/replay patch with the unified framework. - Changed `\blx@pagetracker` from a one-way state drain to transparent capture, making write whatsits transparent to the actual visible boundaries on both sides (#992). - Integrated xeCJKfntef underline commands, native `ulem` entries (e.g. `\uline`), `\xeCJKfntefon`, and standalone symbol commands into stream capture; internal pending is now published through the framework's unified helper; removed fntef-specific tail-state restoration and pending setup (#992). - Measurement-time box isolation for decorative symbols now uses the framework's nestable pause zones, simultaneously saving and restoring marker and pending state (#992). - Connected `\lstinline`'s delimiter, active-character, and brace scanning paths to auto stream capture, making all four source-space combinations around color switches consistent with direct input (#992). Source code: https://github.com/CTeX-org/ctex-kit Issue tracker: https://github.com/CTeX-org/ctex-kit/issues
The package’s Catalogue entry can be viewed at https://ctan.org/pkg/xecjk The package’s files themselves can be inspected at https://mirrors.ctan.org/macros/xetex/latex/xecjk/
Thanks for the upload. For the CTAN Team Petra Rübe-Pugliese
CTAN is run entirely by volunteers and supported by TeX user groups. Please join a user group or donate to one, see https://ctan.org/lugs
This release introduces a unified command-boundary capture/register framework that replaces numerous ad-hoc mechanisms for handling inter-character spacing around boxes, color changes, hyperlinks, and third-party commands. It also fixes several boundary and glue-handling bugs. NEW FEATURES - New command-boundary capture/register framework that determines the visible head/tail character class of boxes, opaque node streams, and commands with no visible output, and restores inter-character boundaries accordingly (#992). - New experimental `experiment/boundary-register` interface allowing expert users to register custom commands into the unified command-boundary framework (#1010). - New dedicated inline-math boundary class that separately handles end-of-formula spacing and post-formula source spaces in argument contexts, enabling registered commands to restore left/right boundaries with correct direct-formula source-space semantics (#1002). - New `\@@_glue_check_expire_stale:` routine: when the top-level recovery chain finds an empty node list, it clears stale pending state, preventing `\g_@@_glue_check_pending_bool` from surviving across `\hbox`/`\setbox` boundaries (#996). - `siunitx` compatibility: `\unit`, `\qty`, `\num` and v2 legacy names `\si`, `\SI` are registered as fixed Default head/tail stream captures, fixing space loss at unit-command boundaries in CJK context (#1000). BUG FIXES - Fixed range parsing of default endpoints in `\@@_check_num_range:nnNN`. - Boundary-to-CJK source-space check now uses the same `\@@_skip_if_interword:N` test as the Default direction; explicit glue whose natural width differs from the current inter-word space is no longer replaced by `\CJKglue` (#996). - box/wrapped-box capture now rebuilds boundaries as Default head/tail when a box has emitted visible content (non-zero width, non-zero height or depth, with a terminal char/rule/math/kern node) but no character class was observed. Math and `\vrule` etc. that do not trigger interchar transitions are no longer misidentified as "no visible output" (#998). - Default marker replay now synchronises `\spacefactor` with the outer list; post-transparent processing also relocates the marker together with its candidate glue, fixing right-boundary spacing when `xCJKecglue` is enabled and a trailing uppercase letter or `\null` inside a box obscures the boundary suffix (#1003). - Invisible nodes separating a real space from a marker in a normal stream now cause the marker to expire (direct-formula semantics) and preserve the original ordering of intermediate glue and nodes (#1002). - Fixed nested `ulem`/xeCJKfntef underline commands: only the outermost invocation now starts a stream capture, preventing per-nesting state leakage on the capture stack (#992). DOCUMENTATION - Clarified that `xCJKecglue` also controls source spaces adjacent to inline math (#1002). - Documented in the user manual that TeX cannot distinguish source spaces from certain explicit glue, and provided a zero-width `\kern` workaround (#992). - Added Boundary→CJK direction note: certain explicit glue may also be replaced by `CJKglue` (#996). INTERNAL CHANGES - Allowed the Boundary-to-Default recovery path to tentatively remove trailing source inter-word glue that has no infinite-order stretch but does have shrink; if a CJK marker is found beneath, it is replaced by `\CJKecglue`, completing symmetric command-boundary handling with the Default-to-CJK direction (#992). - Command-boundary framework now manages `xeCJKfntef`, box commands, and color commands; removed the legacy fallback that guessed hlist/whatsit categories via a global tl. The glue branch now only accepts immediately adjacent xeCJK markers (#992). - Removed the dedicated color pending boolean; color push/pop and box output are now handled by transparent/wrapped-box capture (#992). - Wrapped the kernel-private `\@imakebox` and `\@iframebox` `[#1][#2]#3` signatures to register `\makebox`/`\framebox`; this wrapper must be updated if the kernel changes that signature (#992). - Migrated link-annotation entry saving and tail-anchor replay to unified stream capture, restoring boundaries on both sides according to the link's actual visible head/tail class (#992). - Registered `\set@color` and `\reset@color` as transparent captures; removed the dedicated color push/pop marker save/replay branch (#992). - Registered `l3color` color push/pop entries as transparent captures; removed the corresponding dedicated marker protection branch (#992). - Migrated `\HD@target` to unified transparent capture, restoring marker and source-space state on both sides (#992). - Wrapped `\Url@z`'s full formatting phase in a fixed Default head/tail stream capture; removed the #880 dedicated drain (#992). - Migrated `\verb` from the entry drain (which assumed Western output) to unified stream capture, restoring boundaries according to verbatim's actual head/tail class (#992). - Registered `\eqref` as fixed Default head/tail and `\cs` as fixed Default head-only stream captures; codedoc/doc meta internal adapters now directly wrap a fixed Default stream, removing the dedicated drain and covering all its public call sites (#992). - Registered kernel `\@setref` (or `hyperref`-saved `\real@setref`) as auto stream capture, replacing the #991 dedicated saved-node/replay patch with the unified framework. - Changed `\blx@pagetracker` from a one-way state drain to transparent capture, making write whatsits transparent to the actual visible boundaries on both sides (#992). - Integrated xeCJKfntef underline commands, native `ulem` entries (e.g. `\uline`), `\xeCJKfntefon`, and standalone symbol commands into stream capture; internal pending is now published through the framework's unified helper; removed fntef-specific tail-state restoration and pending setup (#992). - Measurement-time box isolation for decorative symbols now uses the framework's nestable pause zones, simultaneously saving and restoring marker and pending state (#992). - Connected `\lstinline`'s delimiter, active-character, and brace scanning paths to auto stream capture, making all four source-space combinations around color switches consistent with direct input (#992). Source code: https://github.com/CTeX-org/ctex-kit Issue tracker: https://github.com/CTeX-org/ctex-kit/issues
The package’s Catalogue entry can be viewed at https://ctan.org/pkg/xecjk The package’s files themselves can be inspected at https://mirrors.ctan.org/macros/xetex/latex/xecjk/
Thanks for the upload. For the CTAN Team Petra Rübe-Pugliese
CTAN is run entirely by volunteers and supported by TeX user groups. Please join a user group or donate to one, see https://ctan.org/lugs
xecjk – Typeset CJK in XeLaTeX
xeCJK is a package for typesetting documents in Chinese, Japanese or Korean with XeLaTeX. It provides CJK-specific automatic glue between CJK and non-CJK characters, full control over CJK punctuation compression, separate font families for CJK and Latin scripts, and a number of fine-grained typographic refinements for the CJK script.
| Package | xecjk |
| Version | 3.10.4 |
| Copyright | 2007–2010 Wenchang Sun 2009–2022 Leo Liu 2012–2022 Qing Lee 2026 Liam Huang |
| Maintainer | Liam Huang Qing Lee Leo Liu Jiang Jiang (inactive) Wenchang Sun (inactive) |