Ich versuche, das rotating
Paket zu erweitern, um die entsprechenden Seiten auch in der PDF-Ausgabe richtig gedreht anzuzeigen, indem ich das PDF-Seitenattribut setze /Rotate
. Ich habe eine funktionierende Version für XeLaTeX, aber ich schaffe es nicht, dies für LuaLaTeX hinzubekommen. Bitte beachten Sie das folgende MWE:
\documentclass{article}
\usepackage{lipsum}
\usepackage{rotating}
\usepackage{etoolbox}
\usepackage{iftex}
\usepackage{afterpage}
\ifLuaTeX
\edef\pdfpageattr{\pdfvariable pageattr}
\fi
\makeatletter
\def\@PDFrot#1{%
\ifXeTeX%
\special{pdf: put @thispage <</Rotate #1>>}%
\fi%
\ifLuaTeX%
\global\pdfpageattr\expandafter{\the\pdfpageattr/Rotate #1}%
\afterpage{\global\pdfpageattr\expandafter{\the\pdfpageattr/Rotate 0}}%
\fi%
}
\patchcmd{\@xrotfloat}%
{\begin{minipage}\textheight}%
{\begin{minipage}\textheight\@PDFrot{90}}%
{}{}%
\makeatother
\begin{document}
\lipsum[1-10]
\begin{sidewaysfigure}
\centering
Test
\caption{Just an example figure.}
\end{sidewaysfigure}
\lipsum[1-5]
\end{document}
Beim Kompilieren dieses MWE mit XeLaTeX erhält man das gewünschte Verhalten: Die Float-Seite mit dem sidewaysfigure
Inhalt (Seite 3) wird in der PDF-Ausgabe korrekt gedreht. Beim Kompilieren mit LuaLaTeX wird jedoch auch Seite 2 gedreht, was nicht erwünscht ist.
Gewünschte PDF-Seitenausrichtungen beim Kompilieren mit XeLaTeX.
Falsche PDF-Seitenausrichtung von Seite 2 beim Kompilieren mit LuaLaTeX.
Ich denke, das liegt daran, dass die Definition des sidewaysfigure
Inhalts (zusammen mit dem Setzen des PDF-Attributs) bereits auf Seite 2 ausgewertet wird, wo der Inhalt erscheinen würde, wenn er kein Float wäre. Ich habe bisher keine Möglichkeit gefunden, dieses Problem zu umgehen und wäre für jede Idee dankbar.
Hinweis:Das MWE ist lediglich ein reduziertes Beispiel, das die Ausrichtung der Seite anhand ihrer Seitenzahl (gerade/ungerade) nicht richtig berücksichtigt. Ich habe diese Codeteile eliminiert, um das MWE leichter verständlich zu machen.
Antwort1
Basierend aufAntwort auf eine andere Fragebereitgestellt im Kommentar von Ulrike Fischer, habe ich den folgenden Patch entwickelt, der auch gerade/ungerade Seiten berücksichtigt:
\documentclass{article}
\usepackage{lipsum}
\usepackage{rotating}
\usepackage{etoolbox}
\usepackage{iftex}
\usepackage{pdflscape}
\usepackage{atbegshi}
\usepackage{zref-user}
\makeatletter
\ifXeTeX%
\patchcmd{\@xrotfloat}%
{\begin{minipage}\textheight}%
{%
\begin{minipage}\textheight%
\ifnumodd{\thepage}%
{\special{pdf: put @thispage <</Rotate 90>>}}%
{\special{pdf: put @thispage <</Rotate -90>>}}%
}%
{}{}%
\fi%
\ifLuaTeX%
\newcounter{cntsideways}%
\AtBeginShipout{%
\ifnum\zref@extractdefault{rotate\number\value{page}}{page}{0}=0%
\PLS@RemoveRotate%
\else%
\ifnumodd{\thepage}{\PLS@AddRotate{90}}{\PLS@AddRotate{-90}}%
\fi}%
\patchcmd{\@xrotfloat}%
{\begin{minipage}\textheight}%
{\begin{minipage}\textheight\rotatesidewayslabel}%
{}{}%
\newcommand\rotatesidewayslabel{\stepcounter{cntsideways}%
\zlabel{tmp\thecntsideways}\zlabel{rotate\zref@extractdefault{tmp\thecntsideways}{page}{0}}}%
\fi%
\makeatother
\begin{document}
\lipsum[1-10]
\begin{sidewaysfigure}
\centering
Test
\caption{Just an example figure.}
\end{sidewaysfigure}
\lipsum[1-5]
\end{document}
Danke schön!
Antwort2
Das Hauptproblem ist, dass \afterpage
es zwar gut funktioniert, aber das Setzen des Seitenattributs so lange verzögert werden muss, bis TeX auf der vorherigen Seite nicht mehr funktioniert. Glücklicherweise \latelua
ermöglicht es die Ausführung von Lua-Code, der auf einen geeigneten Zeitpunkt verzögert wird, sodass Sie verwenden können
\documentclass{article}
\usepackage{lipsum}
\usepackage{rotating}
\usepackage{etoolbox}
\usepackage{iftex}
\usepackage{afterpage}
\ifLuaTeX
\edef\pdfpageattr{\pdfvariable pageattr}
\fi
\makeatletter
\def\@PDFrot#1{%
\ifXeTeX%
\special{pdf: put @thispage <</Rotate #1>>}%
\fi%
\ifLuaTeX%
\latelua{pdf.setpageattributes(string.gsub(pdf.getpageattributes() or '', '/Rotate [+-]?\csstring\%d+', '') .. '/Rotate #1')}%
\afterpage{\directlua{pdf.setpageattributes((string.gsub(pdf.getpageattributes(), '/Rotate #1', '')))}}%
\fi%
}
\patchcmd{\@xrotfloat}%
{\begin{minipage}\textheight}%
{\begin{minipage}\textheight\@PDFrot{90}}%
{}{}%
\makeatother
\begin{document}
\lipsum[1-10]
\begin{sidewaysfigure}
\centering
Test
\caption{Just an example figure.}
\end{sidewaysfigure}
\lipsum[1-5]
\lipsum[1-10]
\begin{sidewaysfigure}
\centering
Test
\caption{Just an example figure.}
\end{sidewaysfigure}
\lipsum[1-5]
\lipsum[1-10]
\begin{sidewaysfigure}
\centering
Test
\caption{Just an example figure.}
\end{sidewaysfigure}
\lipsum[1-5]
\end{document}
Antwort3
WährendDie Lösung von DigNativefür XeLaTeX funktioniert es größtenteils, ich hatte einige Probleme damit. Es stellt sich heraus, dass es \thepage
auf die Seitenzahl erweitert wird, die beim ersten Durchlauf vorliegt, was beim letzten Durchlauf möglicherweise nicht der Seitenzahl entspricht.1Insbesondere habe ich unterschiedliche Ergebnisse erhalten, je nachdem, ob ich \clearpage
davor etwas verwendet habe sidewaysfigure
oder nicht, oder ob mehrere Zahlen aufeinander folgten.
Um dieses Problem zu lösen, habe ich mich für einen Ansatz mit \label
+ entschieden \pageref
, ähnlich dem, was Ulrike Fischer indieser Kommentar. Eine Randbemerkung: weil \pageref
wird nicht zu einer Zahl, sondern zu Text erweitert (was von abhängt \pagenumbering
, also wird es möglicherweise nicht einmalsehenwie eine Zahl), musste ich den \getpagerefnumber
Befehl aus dem refcount
Paket verwenden.2
Beachten Sie, dass ich den LuaLaTeX-Teil nicht aktualisiert habe. Dieser scheint einwandfrei zu funktionieren. Da ich aber XeLaTeX verwende, wollte ich diesen Fix einbauen :)
\documentclass[twoside]{article}
\usepackage{lipsum}
\usepackage{rotating}
\usepackage{etoolbox}
\usepackage{iftex}
\usepackage{pdflscape}
\usepackage{refcount}
\usepackage{atbegshi}
\usepackage{zref-user}
\makeatletter
\ifXeTeX%
\newcounter{rotfigcount}%
\patchcmd{\@xrotfloat}%
{\begin{minipage}\textheight}%
{%
\begin{minipage}\textheight%
\stepcounter{rotfigcount}%
\label{rotfig:\therotfigcount}%
\ifnumodd{\getpagerefnumber{rotfig:\therotfigcount}}%
{\special{pdf: put @thispage <</Rotate 90>>}}%
{\special{pdf: put @thispage <</Rotate -90>>}}%
}%
{}{}%
\fi%
\ifLuaTeX%
\newcounter{cntsideways}%
\AtBeginShipout{%
\ifnum\zref@extractdefault{rotate\number\value{page}}{page}{0}=0%
\PLS@RemoveRotate%
\else%
\ifnumodd{\thepage}{\PLS@AddRotate{90}}{\PLS@AddRotate{-90}}%
\fi}%
\patchcmd{\@xrotfloat}%
{\begin{minipage}\textheight}%
{\begin{minipage}\textheight\rotatesidewayslabel}%
{}{}%
\newcommand\rotatesidewayslabel{\stepcounter{cntsideways}%
\zlabel{tmp\thecntsideways}\zlabel{rotate\zref@extractdefault{tmp\thecntsideways}{page}{0}}}%
\fi%
\makeatotherz
\begin{document}
\lipsum[1-10]
\begin{sidewaysfigure}
\centering
Test
\caption{Just an example figure.}
\end{sidewaysfigure}
\begin{sidewaysfigure}
\centering
Test 2
\caption{Just a second example figure.}
\end{sidewaysfigure}
\lipsum[1-5]
\end{document}