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}

XeLaTeX로 이 MWE를 컴파일하면 원하는 동작을 얻을 수 있습니다. 내용이 있는 플로트 페이지 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구체적으로 말하면, 이전에 사용했는지 sidewaysfigure, 사용하지 않았는지, 여러 도형이 연속적으로 사용되었는지 에 따라 다른 결과가 나왔습니다 .

이 문제를 해결하기 위해 Ulrike Fischer가 언급한 것과 유사한 \label+ 를 사용한 접근 방식을 선택했습니다.\pageref이 댓글. 한 가지 참고 사항: \pageref숫자로 확장되지 않고 텍스트로 확장되기 때문에(에 따라 다르므로 \pagenumbering그렇지 않을 수도 있음)바라보다\getpagerefnumber숫자처럼) 패키지 에 있는 명령을 사용해야 했어요 refcount.2

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}

관련 정보