rotating
PDF 페이지 속성을 설정하여 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 페이지 방향입니다.
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}