Erweiterung des Pakets „rotating“ zum Festlegen der PDF-Rotation

Erweiterung des Pakets „rotating“ zum Festlegen der PDF-Rotation

Ich versuche, das rotatingPaket 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 sidewaysfigureInhalt (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. Gewünschte PDF-Seitenausrichtungen beim Kompilieren mit XeLaTeX.


Falsche PDF-Seitenausrichtung von Seite 2 beim Kompilieren mit LuaLaTeX. Falsche PDF-Seitenausrichtung von Seite 2 beim Kompilieren mit LuaLaTeX.


Ich denke, das liegt daran, dass die Definition des sidewaysfigureInhalts (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 \afterpagees 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 \lateluaermö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 \thepageauf 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 \clearpagedavor etwas verwendet habe sidewaysfigureoder 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 \pagerefwird 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 \getpagerefnumberBefehl aus dem refcountPaket 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}

verwandte Informationen