%3F.png)
Ich schreibe (trage dazu bei) ein LuaLaTeX-Paket, in dem eine Lua-Funktion zum Generieren von Bildern verwendet wird, die in das LaTeX-Dokument eingefügt werden.
Eine Information, die wir brauchen, ist die aktuelle Seitenzahl, um zu bestimmen, ob wir uns auf einer geraden oder ungeraden Seite befinden (ich weiß, dass das nicht ganz so trivial ist, und ich kenne auch einige Strategien, die darüber hinausgehen \thepage
). Wir setzen eine Lua-Variable, wenn wir noch im LaTeX-Teil sind, und bisher funktioniert das ziemlich gut.
Nun stellt sich jedoch heraus, dass die von uns erstellte Bildfolge auf mehrere Seiten verteilt sein kann, und das möchten wir unbedingt berücksichtigen, da sich unsere Bilder auf geraden und ungeraden Seiten unterschiedlich verhalten können.
Im Grunde haben wir eine Reihe von
tex.print('\\includegraphics{something}\\par')
Anweisungen, die in einer Schleife innerhalb einer Lua-Funktion ausgeführt werden.
Nun die Frage: Gibt es eine Möglichkeit, zwischen zwei solchen Grafiken entweder einen Seitenwechsel direkt zu erkennen oder innerhalb einer solchen Schleife immer wieder die aktuelle Seite abzurufen?
Alle Lösungen, die ich zum Bestimmen des aktuellen geraden oder ungeraden Zustands gefunden habe, befinden sich in LaTeX selbst. Ich weiß, wie man \directlua
einen Wert zur Verwendung in LaTeX abruft, aber gibt es eine Möglichkeit, das Gegenteil zu tun – also einen LaTeX-Wert aus LUa abzurufen?
Bearbeiten:um auf den Kommentar und die Antwort von TeXnician zu reagieren: Wenn ich den Beispielcode so ändere, dass er Wiederholungen von Absätzen erzeugt, scheint es, dass der Seitenzähler nicht aktualisiert wirdinnerhalb eines Lua-Blocks:
\documentclass{article}
\newcommand\printluapage{%
\directlua{for i = 1, 60 do tex.print(tex.count['c@page'])
tex.print([[\par]]) end}
}
\begin{document}
\printluapage
New command
\printluapage
New command
\printluapage
\end{document}
Eine Aktualisierung der Seitenzahl erfolgt nur bei jedem Neuaufruf von \printluapage
.
Antwort1
Sie können den Seitenzähler fast nie genau aus dem Hauptdokument heraus referenzieren, nur während der Ausgaberoutine, bei der die ausgegebene Seite genau bekannt ist. Luatex ändert das grundlegende Modell der Ausgabe von TeX-Seiten nicht, daher gilt das Gleiche für Luatex.
In Ihrer Lua-Schleife können Sie verwenden
mcount=mycount+1
tex.print('\\includegraphics{something}\\label{graphic-' .. mycount .. '}\\par')
Dann wird jedem Bild ein zugeordnet \label
und beim nächsten Durchlauf können Sie \pageref{graphic-5}
(von Lua oder TeX) abrufen, was Ihnen sagt, auf welcher Seite die 5. Grafik gelandet ist.
ein vollständiges Beispiel:
\documentclass{article}
\directlua{j=0}
\newcommand\printluapage{%
\directlua{
for i = 1, 60 do
j=j+1
tex.print('\string\\pageref{foo' .. j .. '}\string\\label{foo' .. j .. '}')
tex.print([[\par]]) end}%
}
\begin{document}
\printluapage
New command
\printluapage
New command
\printluapage
\end{document}
Antwort2
Dies ist eine sehr einfache Lösung, die nur den Wert der LaTeX-Zählerseite in Lua liest (das Drucken dient Testzwecken, aber die Anweisung tex.count kann auch an anderen Stellen verwendet werden).
\documentclass{article}
\newcommand\printluapage{%
\directlua{tex.print(tex.count['c@page'])}
}
\begin{document}
\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage\printluapage\clearpage
\end{document}
Antwort3
Hier gibt es zwei Komplikationen.
Erstens wird jeder Aufruf \directlua
von sofort ausgeführt. Wenn Sie also möchten, dass die übliche Verarbeitung von TeX erfolgt, müssen Sie die Kontrolle an TeX abgeben (und Coroutinen oder etwas anderes verwenden). Wenn Sie also
\directlua{for i = 1, 60 do tex.print(tex.count['c@page'])
tex.print([[\par]]) end}
}
wie in der Frage werden hierdurch einfach 60 Instanzen von 42
(oder was auch immer die Seitenzahl ist) und \par
auf den TeX-Eingabestapel gelegt, damit TeX sie als Nächstes lesen kann, nachdem der gesamte \directlua
Aufruf abgeschlossen ist. (Dies führt nicht dazu, dass TeX jede Instanz \par
und den Rest des Satzes sofort verarbeitet, noch bevor die Schleife endet.) Ihr genaues Problem wird in dieser Frage mit Lösungen erörtert:Gleichzeitige Ausführung von Lua und TeX in LuaTeX.
Zweitens hängt TeX einfach Elemente an seine vertikalen Listen an, bis ein Seitenumbruch unvermeidlich wird (z. B. gibt es keine Möglichkeit, das gesamte bisher gesammelte Material auf eine einzige Seite zu bringen), sodass der Wert des Seitenzählers zum Zeitpunkt des Hinzufügens des Materials nicht unbedingt die Seite ist, auf der es landet (es kann beispielsweise auf der nächsten Seite landen). Die Seitenzahl wird erst endgültig festgelegt, wenn Kartons verschickt werden. Es gibt einige Tricks, um mit dieser Tatsache umzugehen (z. B. Ihren Lua-Code während des Versands ausführen lassen?), aber ich kenne diese Tricks nicht; vielleicht antwortet jemand anderes. :-)
Sie können ungefähre Ergebnisse erhalten, indem Sie Werte wie \pagetotal
(oder von Lua, tex.pagetotal
) verwenden, die zeigen, wie viel Material der aktuellen Seite hinzugefügt wurde. Dies ist mit Einschränkungen verbunden: Der erste Punkt oben besagt, dass Sie TeX seine Arbeit machen lassen (Ihren Lua-Code auf verschiedene Aufrufe von aufteilen \directlua
), und Sie müssen möglicherweise auch mit schrumpfbarem und dehnbarem Klebstoff umgehen und diese berücksichtigen.
Antwort4
Das Problem der Verflechtung istteilweisein ConTeXt gelöst. Sie können die Seitenzahl von Lua aus aufrufen und sie wird irgendwann aktualisiert, aber das Problem, das David insein Kommentarbesteht fort.
\starttext
\startluacode
for i = 1, 60 do
context(context.currentpage)
context.par()
end
\stopluacode
\stoptext