Wenn ich lualatex auf einer .tex-Datei ausführe, erhalte ich ??
als Ergebnis nur „letzte Seite“ in meinem Dokument. Wenn ich lualatex dann ein zweites Mal ausführe, 2
wird das richtige Ergebnis () in der Fußzeile des Dokuments angezeigt.
Hauptfrage:Wie kann ich vermeiden, Latex zweimal auf demselben Dokument (.tex-Datei) ausführen zu müssen?
Es wäre schön, wenn es dafür eine Lösung gäbe, da ich Latex-Dateien dynamisch aus Java generiere und jeder Konsolenaufruf lualatex doc.tex
ungefähr 2,5 Sekunden dauert.
Verwendete Quellen:lualatex auf der Konsole und test.tex -> mwe
Konsolenbefehl: lualatex test.tex
Fehlerausgabe:
LaTeX Warning: Reference `LastPage' on page 1 undefined on input line 23 Package lastpage Warning: Rerun to get the references right on input line 23
MWE:
\documentclass[8pt,a4paper]{extarticle}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage{lastpage}
\usepackage[left=1.5cm, right=1.5cm, top=0.0cm, bottom=0.0cm, headheight=42pt, includeheadfoot]{geometry}
\usepackage{fancyhdr}
\usepackage{lipsum}
\fancypagestyle{style1}{
\fancyhf{}
\fancyhead[L]{}
\fancyhead[R]{}
\fancyfoot[L]{\scriptsize Test}
\fancyfoot[R]{\scriptsize Seite \textbf{\thepage} von \textbf{\pageref{LastPage}}}
\setlength{\topmargin}{-70pt}
\setlength{\headsep}{10pt}
\setlength{\footskip}{20pt}
}
\begin{document}
\pagestyle{style1}
\lipsum[1-15]
\end{document}
Antwort1
Normalerweise kann TeX Daten wie die Seitenzahl auf den ersten Seiten nicht verwenden, da LaTeX noch nicht weiß, wie viele Seiten es sein werden. Es gibt aber einen Trick: Man kann auf jeder Seite, auf der die Seitenzahl stehen soll, eine Referenz auf ein PDF-XObject einfügen. Ein XObject ist ein separates Objekt in einer PDF-Datei, auf das in beliebiger Reihenfolge verwiesen werden kann. Dieses XObject kann man dann später mit der Seitenzahl füllen.
Eine weitere Komplikation besteht darin, dass LuaTeX Sie zwingt, den Inhalt von XObject festzulegen, bevor Sie es verwenden können. Sie können es jedoch austricksen, indem Sie die PDF-Strukturen auf einer niedrigeren Ebene manipulieren:
\documentclass[8pt,a4paper]{extarticle}
\usepackage[T1]{fontenc}
\usepackage{graphicx}
\usepackage[left=1.5cm, right=1.5cm, top=0.0cm, bottom=0.0cm, headheight=42pt, includeheadfoot]{geometry}
\usepackage{fancyhdr}
\usepackage{lipsum}
\directlua{
local n = pdf.reserveobj()% `n` will be a PDF object storing
% a reference to the XObject created later.
local list = token.scan_list() % First we read a list to get the dimensions.
node.flush_list(list.head) % The actual content isn't important
local whatsit = node.new('whatsit', 'pdf_literal') % Now "call" the XObject /Form "manually"
whatsit.mode = 1
whatsit.data = "/Form Do"
list.head = whatsit
% Create a XObject managed by LuaTeX which only references our manual reference
pages_xform = tex.saveboxresource(list, nil, '/XObject ' .. n .. ' 0 R')
final_form_hack = n % And save the identifiers
}\hbox{\scriptsize\textbf{29}}% This \hbox decides how much space to reserve for the page number. 29 makes sure that all numbers up to 99 should be fine
\fancypagestyle{style1}{
\fancyhf{}
\fancyhead[L]{}
\fancyhead[R]{}
\fancyfoot[L]{\scriptsize Test}
% Reference the XObject from TeX
\fancyfoot[R]{\scriptsize Seite \textbf{\thepage} von \directlua{node.write((tex.useboxresource(pages_xform)))}}
\setlength{\topmargin}{-70pt}
\setlength{\headsep}{10pt}
\setlength{\footskip}{20pt}
}
\AtEndDocument{
\clearpage
\directlua{
% Now we know how many pages there are, so we can fill the XObject.
local n = final_form_hack
final_form_hack = nil
local list = token.scan_list() % Scan the list with the number of pages
local w, h, d, m = tex.getboxresourcedimensions(pages_xform)
list.height, list.depth, list.width = h, d, w % Make sure our boxes have consistant sizes (otherwise LuaTeX will be confused)
local xform = tex.saveboxresource(list, nil, nil, true, m)% And save it in a XObject
pdf.immediateobj(n, "<</Form " .. xform .. " 0 R>>")% Finally store a reference in the object `n` created above
}\hbox{%
\scriptsize\textbf{\the\numexpr\value{page}-1\relax}% The actual number of pages
}
}
\begin{document}
\pagestyle{style1}
\lipsum[1-30]
\end{document}
Dies betrifft natürlich nur die Seitenanzahl. Wenn Du in Deiner Datei noch weitere Verweise hast (z.B. \label/\ref
oder nur ein Inhaltsverzeichnis), treten ähnliche Probleme erneut auf.