![Неудача с [греческим] babel и lastpage, \frontmatter?](https://rvso.com/image/305904/%D0%9D%D0%B5%D1%83%D0%B4%D0%B0%D1%87%D0%B0%20%D1%81%20%5B%D0%B3%D1%80%D0%B5%D1%87%D0%B5%D1%81%D0%BA%D0%B8%D0%BC%5D%20babel%20%D0%B8%20lastpage%2C%20%5Cfrontmatter%3F.png)
У меня есть большой документ, для которого я хотел бы сгенерировать «предварительно скомпилированные заголовки» (Экстернализация 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
) закомментирован; ИЛИ если \frontmatter
(в test.tex
) закомментирован?
И после этого я обнаружил, что .pdf
сборка не будет работать даже без использования предварительно скомпилированного .fmt
файла (т.е. просто с pdflatex test.tex
) - даже если в моем исходном документе я никогда не получал подобную ошибку, до того, как начал возиться с .fmt
файлами ?! (Хотя, должен отметить, что ошибка, которую я получаю в моем исходном документе, не выражена как ошибка с \lipsum
, сообщение об ошибке другое)
Что я делаю не так и как мне заставить этот набор пакетов собраться с помощью предварительно скомпилированного .fmt
файла без ошибок?
(P.S.: может быть связано сВозможная ошибка в 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, чтобы продемонстрировать проблему, которая у меня все еще есть :)
)
Кстати, я увидел это, используя package {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
.