Compilando subarquivos com xeCJK

Oct 27 2020

Quando eu compilo um arquivo principal main.texcom os subarquivos dos pacotes e xeCJK, recebo o erro Improper alphabetic constant. Funciona bem ao compilar o subarquivo

Aqui mostre main.tex(o que não funciona):

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

sub.tex (que funciona):

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

e uma parte do arquivo de log 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.

A lista abaixo de versões de pacotes e XeTeX que uso.

  • subarquivos: 2.0
  • xeCJK: 3.8.6
  • XeTeX: 3.14159265-2.6-0.999992 (TeX Live 2020 / W32TeX)

Respostas

2 UlrikeFischer Oct 27 2020 at 16:02

O problema é que o xeCJK adiciona código a um dos ganchos do documento e, como os subarquivos não esvaziam esse gancho, o código é processado duas vezes e, neste caso, é prejudicial. Você pode provocar um erro semelhante com

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

A primeira chamada para o patch funciona, mas a segunda falha.

Um erro estrutural semelhante pode ser mostrado com isto:

\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}

Ao adicionar, \RemoveFromHook{env/document/before}[*]você pode remover o código. Então está funcionando novamente. subfilesprovavelmente deve fazer isso, antes de carregar um subarquivo.

Mas também xeCJKpoderia evitar o problema usando \AddToHookNext{env/document/before}( \hook_gput_next_code:nn) em vez de \AddToHookpara o código que deve ser executado apenas uma vez. Ou poderia (provavelmente é ainda melhor) usar o begindocument / before hook ao invés).

gernot Oct 28 2020 at 05:58

Com a versão 2020/10/24 v2.1do subfilespacote, esse problema está resolvido. No momento, esta versão ainda não está no CTAN, mas apenas no Github .