[greek] babel 和 lastpage、\frontmatter 失败?

[greek] 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文件构建文件,如下所示(我没有将%&test注释作为文件的第一行test.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而不会出现错误?

(PS:可能与babel-greek、TexLive 2014 中可能存在错误- 因为那里的文件也有问题.fmt,但我不确定)。

答案1

好吧,事实证明这是 @egreg 的答案解决的完全相同的问题使用希腊语 babel、mparhack 和 \pagenumbering{roman} 时出错。这里也[greek,]{babel}重新定义\thepage为使用不可扩展的\textlatin——但这里的问题是因为{lastpage}想要通过其函数/宏写入\thepage文件。.aux\lastpage@putl@bel

因此,一个解决方案是将其添加到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}一个)meld

相关内容