使用 xeCJK 编译子文件

使用 xeCJK 编译子文件

main.tex当我使用软件包 subfiles 和 xeCJK 编译主文件时,出现错误Improper alphabetic constant。它在编译子文件时运行良好

这里显示 main.tex(不起作用):

\documentclass{article}
\usepackage{xeCJK}
\usepackage{subfiles}
\begin{document}
MAIN test
\subfile{sub.tex}
\end{document}

sub.tex(有效):

\documentclass[main.tex]{subfiles}
\begin{document}
SUB test
\end{document}

以及日志文件的一部分main.log

./sub.tex:2: Improper alphabetic constant.
<to be read again> 
                   \__xeCJK_ambiguous_char:n 
l.2 \begin{document}
                    
A one-character control sequence belongs after a ` mark.
So I'm essentially inserting \0 here.

下面列出了我使用的软件包和 XeTeX 的版本。

  • 子文件:2.0
  • 中日韩文: 3.8.6
  • XeTeX:3.14159265-2.6-0.999992(TeX Live 2020/W32TeX)

答案1

问题在于 xeCJK 将代码添加到其中一个文档挂钩中,由于子文件不会清空此挂钩,因此代码会被处理两次,在这种情况下会造成损害。您可以使用

\documentclass{article}
\usepackage{xeCJK}
\ExplSyntaxOn
\__xeCJK_patch_text_command:
\__xeCJK_patch_text_command:
\ExplSyntaxOff
\end{document}

第一次调用补丁成功,但第二次调用失败。

结构上类似的错误可以用以下方式显示:

\begin{filecontents}{sub.tex}
\documentclass{subfiles}
\begin{document}
SUB test
\blub
\end{document}
\end{filecontents}

\documentclass{article}
\AddToHook{env/document/before}{\newcommand\blub{abc}}
\usepackage{subfiles}
\begin{document}
%\RemoveFromHook{env/document/before}[*]
MAIN test \blub
\subfile{sub.tex}
\end{document}

通过添加,\RemoveFromHook{env/document/before}[*]您可以删除代码。然后它再次工作。subfiles在加载子文件之前,可能应该这样做。

但是xeCJK也可以通过使用\AddToHookNext{env/document/before}( \hook_gput_next_code:nn) 而不是\AddToHook只应执行一次的代码来避免此问题。或者可以(这可能更好)使用 begindocument/before 钩子。

答案2

随着软件包版本2020/10/24 v2.1的推出subfiles,这个问题得到了解决。目前,该版本尚未在 CTAN 上推出,但仅在Github

相关内容