PDF の回転を設定するための `rotating` パッケージの拡張

PDF の回転を設定するための `rotating` パッケージの拡張

rotatingPDF ページ属性を設定することで、PDF 出力でそれぞれのページが適切に回転して表示されるようにパッケージを拡張しようとしています/Rotate。XeLaTeX 用の作業バージョンはありますが、LuaLaTeX ではこれを実行できません。次の 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}

この MWE を XeLaTeX でコンパイルすると、望ましい動作が得られます。コンテンツを含むフロート ページsidewaysfigure(ページ 3) は、PDF 出力で適切に回転されます。ただし、LuaLaTeX でコンパイルすると、ページ 2 も回転しますが、これは望ましくありません。


XeLaTeX でコンパイルした場合の望ましい PDF ページの方向。 XeLaTeX でコンパイルした場合の望ましい PDF ページの方向。


LuaLaTeX でコンパイルすると、ページ 2 の PDF ページの方向が間違っています。 LuaLaTeX でコンパイルすると、ページ 2 の PDF ページの方向が間違っています。


これは、コンテンツの定義sidewaysfigure(PDF 属性の設定と併せて) が、フロートでない場合はコンテンツが表示されるページ 2 で既に評価されるためだと思います。この問題を回避する方法が見つからず、何かアイデアがあれば教えてください。

注意:MWE は単なる縮小された例であり、ページ番号 (偶数/奇数) に基づくページの向きを適切に考慮していません。MWE を理解しやすくするために、これらのコード部分を削除しました。

答え1

に基づく別の質問への回答Ulrike Fischer のコメントに従って、偶数/奇数ページも考慮した次のパッチを開発しました。

\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}

ありがとう!

答え2

主な問題は、\afterpage正常に動作するが、ページ属性の設定は、TeXが前のページで動作しなくなるまで遅延する必要があることです。幸いなことに、\latelua適切なタイミングで遅延されるLuaコードを実行できるため、次のように使用できます。

\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}

答え3

その間DigNativeのソリューションXeLaTeX は大部分で動作しますが、いくつか問題がありました。\thepage最初の実行ではページ番号に展開されますが、最終実行ではページ番号と一致しない可能性があることが判明しました。1\clearpage具体的には、 before を使用したsidewaysfigureかどうか、または複数の図が連続しているかどうかによって、異なる結果が得られました。

これを解決するために、私はUlrike Fischerが述べたのと同様の\label+を使ったアプローチを採用しました。\pagerefこのコメント補足: は\pageref数値ではなくテキストに展開されます( に依存するため\pagenumbering見て数値など) を入力する場合は、パッケージ\getpagerefnumberのコマンドを使用する必要がありましたrefcount2

LuaLaTeX 部分は更新していないことに注意してください。問題なく動作しているようです。ただし、XeLaTeX を使用しているため、この修正を追加したいと思いました :)

\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}

関連情報