[ギリシャ語] babel と lastpage、\frontmatter で失敗しましたか?

[ギリシャ語] babel と lastpage、\frontmatter で失敗しましたか?

大きな文書があり、それに対して「プリコンパイル済みヘッダー」を生成したいと考えていました(TikZ の外部化と mylatex(注、\jobnameは同じである必要があります))そして、mylatexformatそれを使用することを考えました(プリコンパイルによる超高速 pdflatex)。それは失敗に終わったので、投稿する MWE を導き出そうとしたときに、より正確な問題に遭遇したと思います。

構造は次のようになります。

setup/_preamble.tex

\documentclass[10pt]{book}

\usepackage{cmap}% (causes pdflatex: dangling objects discarded, no output file produced. with -ini/mylatexformat)
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[english]{babel} % ok
% \usepackage[greek,english]{babel} % BAD with lastpage (+\frontmatter)!!!!
\usepackage{amsmath,amssymb}
\usepackage{csquotes}
\usepackage[backend=biber]{biblatex}
\usepackage{tikz}
\usepackage{siunitx}

\usepackage{lastpage}

test.tex

%% This is the file `test.tex'

\input{setup/_preamble.tex}

\csname endofdump\endcsname%

\usepackage{lipsum}

\begin{document}
\frontmatter
\clearpage

\section{Something}
\lipsum[1-5]

\end{document}

これを でコンパイルするとpdflatex test.tex、正常にコンパイルされます。

次のようにファイルを「コンパイル」しますtest.fmt

$ pdflatex -ini -jobname="test" "&pdflatex" mylatexformat.ltx "test.tex"
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (INITEX)
...
Beginning to dump on file test.fmt
 (preloaded format=test 2015.2.18)
31400 strings of total length 611843
661162 memory locations dumped; current usage is 654&652915
28229 multiletter control sequences
\font\nullfont=nullfont
\font\OMX/cmex/m/n/10=cmex10
...
20 words of pdfTeX memory
8 indirect objects
No pages of output.

pdfTeX warning: pdflatex: dangling objects discarded, no output file produced.
Transcript written on test.log.

.pdf次に、次のようにプリコンパイルされたファイルを使用してファイルをビルドします(ファイルの最初の行にコメント.fmtを含めず、代わりにコマンド ラインで指定します)。%&testtest.tex

$ pdflatex --file-line-error --synctex=1 "&test" test.tex
This is pdfTeX, Version 3.14159265-2.6-1.40.15 (TeX Live 2014) (preloaded format=pdflatex)
 restricted \write18 enabled.
...
==============================================================================
JOB NAME         : "test"
CUSTOMISED FORMAT: "test"
PRELOADED FILES:
setup/_preamble.tex
    book.cls    2014/09/29 v1.4h Standard LaTeX document class
...
==============================================================================
(mylatexformat)Info: start reading document "test"
(mylatexformat)      on input line 6. (\endofdump)
==============================================================================
(/media/disk/texlive/2014/texmf-dist/tex/latex/lipsum/lipsum.sty)
...
Output written on test.pdf (1 page, 41826 bytes).
SyncTeX written on test.synctex.gz.
Transcript written on test.log.

したがって、MWE はそのままの状態で「プリコンパイル済み」.fmtファイルで動作します。

ここで、 をコメント化し\usepackage[english]{babel}\usepackage[greek,english]{babel}の行のコメントを解除するsetup/_preamble.texと、.fmtファイルは正常にビルドできますが、 のビルドは.pdf失敗します。

$ pdflatex --file-line-error --synctex=1 "&test" test.tex
...
==============================================================================
JOB NAME         : "test"
CUSTOMISED FORMAT: "test"
PRELOADED FILES:
setup/_preamble.tex
...
==============================================================================
(mylatexformat)Info: start reading document "test"
(mylatexformat)      on input line 6. (\endofdump)
==============================================================================
(/media/disk/texlive/2014/texmf-dist/tex/latex/lipsum/lipsum.sty)
...
(/media/disk/texlive/2014/texmf-dist/tex/latex/siunitx/siunitx-abbreviati
ons.cfg)<<ot1.cmap>><<ot1tt.cmap>><<t1.cmap>> 
AED: lastpage setting LastPage
[1{/media/disk/texlive/2014/texmf-var/fonts/map/pdftex/updmap/pdftex.map}
]
./test.tex:16: Use of \\@lipsum doesn't match its definition.
\text@command #1->\def \reserved@a {
                                    #1}\ifx \reserved@a \@empty \let \check@...
l.16 \end{document}

? 

...そして、 の失敗は\lipsum、おそらく、他の何らかの問題の単なる兆候です。

ただし、プリコンパイル済みで、( ) がコメント化されている場合、または( ) がコメント化されている場合は.pdf、ビルドは成功しますか?.fmt[greek,]{babel}\usepackage{lastpage}_preamble.tex\frontmattertest.tex

そしてその後、プリ.pdfコンパイルされたファイルを使用せずに.fmt(つまり、 のみを使用してpdflatex test.tex) ビルドが失敗することがわかりました。元のドキュメントでは、ファイルをいじり始める前はこのようなエラーは発生しませんでしたが.fmt?! (ただし、元のドキュメントで発生したエラーは を使用したエラーとして表現されておらず\lipsum、エラー メッセージが異なります)

何が間違っているのでしょうか。また、このパッケージ セットを.fmtエラーなしでプリコンパイル済みファイルでビルドするにはどうすればよいでしょうか。

(追記:関連があるかもしれないbabel-greek、TexLive 2014 のバグの可能性- そこにあるファイルにも問題があったのです.fmtが、よくわかりません。

答え1

わかりました、これは@egregの回答で解決されたのと全く同じ問題ですギリシャ語の babel、mparhack、\pagenumbering{roman} を使用するとエラーが発生するここでも、展開不可能な を使用するように[greek,]{babel}再定義しますが、関数/マクロを通じてファイルに書き込もうとするため、問題が発生します。\thepage\textlatin{lastpage}\thepage.aux\lastpage@putl@bel

したがって、1 つの解決策は、これを に追加することですsetup/_preamble.tex

\usepackage{lastpage}
\makeatletter
\let\oldlastpage@putl@bel\lastpage@putl@bel
\renewcommand*\lastpage@putl@bel{%
  \bgroup
  \let\textlatin\@firstofone % make \textlatin a no-op
  \oldlastpage@putl@bel%
  \egroup
}
\makeatother

...そして、[greek,english]{babel}プリコンパイルされたファイルを生成して使用する場合でも、すべて正常に動作するようです.fmt

結局、これはmylatexformatそれほど関係がなかったのです(ですから、まだ抱えている問題を証明するために、MWE を探す必要があるでしょう:)

ちなみに、私は次のよう{trace}にパッケージを使用してこれを確認しましたtest.tex:

\input{setup/_preamble.tex}

\csname endofdump\endcsname%

\usepackage{lipsum}
\usepackage{trace}

\begin{document}
\frontmatter
\clearpage

\section{Something}
\lipsum[1-5]

\traceon % trace only the \end{document} part
\end{document}

...そして、内の.logファイル ([greek,english]{babel}実行用と[english]{babel}1 つ用)を比較しますmeld

関連情報