多言語 + 出力ルーチン = ファイル書き込み時の誤った展開 (???)

多言語 + 出力ルーチン = ファイル書き込み時の誤った展開 (???)

次のカスタム クラスを使用する場合:

\NeedsTeXFormat{LaTeX2e}
\ProvidesClass{upecha}[2014/09/21 v0.8 tibetan modern pecha class]
\input{size11.clo}
\def\@outputpage{\shipout\vbox{\box\@outputbox}}

次のテストファイル

\documentclass{myclass}
\usepackage{polyglossia}
\setdefaultlanguage{english}
\begin{document}
a
\end{document}

私は

(./testbug1.aux
! Missing control sequence inserted.
<inserted text> 
\inaccessible 
l.2 ...phenmin =\tw@ \righthyphenmin =\thr@@ \edef e
                                              nglish{english}\def tt{tt}...
?

aux ファイルには以下が含まれます:

\protect \language =\z@ \lefthyphenmin =\tw@ \righthyphenmin =\thr@@ \edef english{english}\def tt{tt}\def sf{sf}\edef {}\edef English{English}\protect \relax \protect \edef lmr{lmr}\protect \xdef \EU2/lmr/m/n/10.95 {\EU2/lmr/m/n/10.95 }\EU2/lmr/m/n/10.95 \size@update \enc@update \def rm{rm}\language =\l@english \def 21{21}\def September{September}\def September 21, 2014{September 21, 2014}\lefthyphenmin 2\relax \righthyphenmin 3\relax \relax \def Preface{Preface}\def References{References}\def Abstract{Abstract}\def Bibliography{Bibliography}\def Chapter{Chapter}\def Appendix{Appendix}\def Contents{Contents}\def List of Figures{List of Figures}\def List of Tables{List of Tables}\def Index{Index}\def Figure{Figure}\def Table{Table}\def Part{Part}\def encl{encl}\def cc{cc}\def To{To}\def Page{Page}\def see{see}\def see also{see also}\def Proof{Proof}

含まれているべきである

\select@language {english}

aux ファイル内のこの誤った定義は、多かれ少なかれ の定義ですselect@language

私は polyglossia.sty の次の行を非難したいと思いました:

\protected@write\@auxout{}{\protect\select@language{#1}}%

\protectを に置き換えると\string、すべてが再び機能します。しかし、最も奇妙なのは、この行をコメントアウトするとこの動作が消えることです。

\def\@outputpage{\shipout\vbox{\box\@outputbox}}

クラス ファイル内。また、article クラスを使用してこの行をドキュメントに追加した場合、このエラーは表示されません...

では、ここで間違っているのは誰でしょうか: 私のコード、LaTeX コア、それとも polyglossia でしょうか? (LuaTeX と XeLaTeX はここで同じ動作をするため、エンジンに原因があるとは言いません...)

ありがとう!

答え1

LaTeX カーネルはこれに対していくつかの予防策を講じています。

\documentclass{myclass}
\usepackage{polyglossia}
\setdefaultlanguage{english}

\makeatletter
\def\@outputpage{%
  \begingroup
  \let\protect\noexpand
  \@resetactivechars
  \shipout\vbox{
    \set@typeset@protect
    \aftergroup \endgroup
    \aftergroup \set@typeset@protect
    \box\@outputbox
  }%
}
\makeatother

\begin{document}
a
\end{document}

ここでなぜトリックが必要なのか、またトリックが使用されるsource2e.pdf理由については、334 ページを参照してください。\let\protect\noexpand\aftergroup

関連情報