Kompilowanie podplików za pomocą xeCJK

Oct 27 2020

Kiedy kompiluję plik główny main.texz podplikami pakietów i xeCJK, pojawia się błąd Improper alphabetic constant. Działa dobrze podczas kompilowania podpliku

Tutaj pokaż main.tex(który nie działa):

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

sub.tex (który działa):

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

i część pliku dziennika 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.

Poniżej znajduje się lista wersji pakietów i XeTeX-a, których używam.

  • pliki podrzędne: 2.0
  • xeCJK: 3.8.6
  • XeTeX: 3.14159265-2.6-0.999992 (TeX Live 2020 / W32TeX)

Odpowiedzi

2 UlrikeFischer Oct 27 2020 at 16:02

Problem polega na tym, że xeCJK dodaje kod do jednego z punktów zaczepienia dokumentu, a ponieważ pliki podrzędne nie opróżniają tego zaczepu, kod jest przetwarzany dwukrotnie iw tym przypadku szkodzi. Możesz sprowokować podobny błąd za pomocą

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

Pierwsze wywołanie poprawki działa, ale drugie zawodzi.

W ten sposób można pokazać podobny błąd strukturalny:

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

Dodając \RemoveFromHook{env/document/before}[*]możesz usunąć kod. Potem znowu działa. subfilespowinien prawdopodobnie to zrobić przed załadowaniem podpliku.

Ale xeCJKmożna by również uniknąć tego problemu, używając \AddToHookNext{env/document/before}( \hook_gput_next_code:nn) zamiast \AddToHookdla kodu, który powinien być wykonywany tylko raz. Lub mógłby (to prawdopodobnie nawet lepiej) zamiast tego użyć begindocument / before hook).

gernot Oct 28 2020 at 05:58

W wersji 2020/10/24 v2.1z subfilespakietu, ten problem jest rozwiązany. W tej chwili ta wersja nie jest jeszcze na CTAN, ale tylko na Github .