我有一张整页的图,需要旋转才能适合页面。我从文档末尾的附录中的这张图开始,然后将图包装起来\begin{landscape}...\end{landscape}
(从pdflscape
包中取出;我正在使用pdflatex
),我对结果非常满意。但是,我决定将图放在文档中间,但在那里重现结果时遇到了麻烦。
我目前想到的最好的办法是使用包sidewaysfigure
中的环境rotating
:
\documentclass{article}
\usepackage{blindtext}
\usepackage{pdflscape}
\usepackage{rotating}
\begin{document}
\blindtext[3]
\begin{sidewaysfigure}
\caption{This figure and its caption are sideways. Ideally I would also like the pdf page containing it to be rotated so that the figure is upright for on-screen viewing.}
\end{sidewaysfigure}
\blindtext[3]
\begin{figure}
\caption{this figure should be numbered after the other one, come after it in the document, and be oriented normally.}
\end{figure}
\blindtext[2]
\end{document}
效果很好,不过我真的很喜欢pdflscape
PDF 页面旋转的功能,这样图形内容和标题就可以以最佳方式定向以适合屏幕查看,而使用该rotating
包时似乎缺少这个功能。
我尝试过的事情:
- 无论如何都要使用
landscape
环境。这样会在源中出现图形的位置立即产生分页符。 landscape
在 中使用环境\afterpage{}
。这种方法虽然可行,但实际上会移动图形,编号会与后续图形交换,这是不可取的。- 我其实没有试过,但是该解决方案涉及
fancyhdr
不会起作用,因为还会有其他图形页面(事实上,目前看起来这个横向图形后面会紧跟着一个图形页面) - 我甚至绝望地尝试使用
\PLS@AddRotate{90}
pdflscape 使用的内部命令(),但它们立即应用,因此错误的页面被旋转。
的输出sidewaysfigure
已经足够好了(我想我陷入了这个陷阱!),但如果有任何方法可以解决这个问题,我将非常感激!
这个问题最终与另一个另一位用户由于缺乏详细信息而从未收到答复。
答案1
这将sidwaysfigure
和合并pdflscape
到一个环境中。它使用辅助文件来定位图形实际结束的位置。
\documentclass{article}
\usepackage{blindtext}% MWE only
\usepackage{graphicx}% for \rotatebox
\usepackage{everypage}
\usepackage{environ}
\usepackage{pdflscape}% not required
\newcounter{abspage}% \thepage not reliab
\makeatletter
\newcommand{\newSFPage}[1]% #1 = \theabspage
{\global\expandafter\let\csname SFPage@#1\endcsname\null}
\NewEnviron{SidewaysFigure}{\begin{figure}[p]
\protected@write\@auxout{\let\theabspage=\relax}% delays expansion until shipout
{\string\newSFPage{\theabspage}}%
\ifdim\textwidth=\textheight
\rotatebox{90}{\parbox[c][\textwidth][c]{\linewidth}{\BODY}}%
\else
\rotatebox{90}{\parbox[c][\textwidth][c]{\textheight}{\BODY}}%
\fi
\end{figure}}
\AddEverypageHook{% check if sideways figure on this page
\ifdim\textwidth=\textheight
\stepcounter{abspage}% already in landscape
\else
\@ifundefined{SFPage@\theabspage}{}{\global\pdfpageattr{/Rotate 0}}%
\stepcounter{abspage}%
\@ifundefined{SFPage@\theabspage}{}{\global\pdfpageattr{/Rotate 90}}%
\fi}
\makeatother
\begin{document}
\blindtext[3]
\begin{SidewaysFigure}
\caption{This figure and its caption are sideways.
Ideally I would also like the pdf page containing it to be rotated so that the figure is upright for on-screen viewing.}
\end{SidewaysFigure}
%\begin{landscape}
\blindtext[3]
\begin{figure}
\caption{this figure should be numbered after the other one, come after it in the document, and be oriented normally.}
\end{figure}
\blindtext[4]
%\end{landscape}
\end{document}
答案2
基于这是另一个问题的答案(由@UlrikeFischer 建议),我偶然发现了这个atbegshi
包,它可以让你在排版页面时运行一些功能(在本例中,将/Rotate 90
命令添加到 PDF 页面)。
我最初尝试这样做(简化了一些从原始答案中看似不必要的东西,并将其更改为旋转页面而不是双倍页面宽度):
\AtBeginShipout{\ifnum\thepage=0\pageref{landscapefigure}
\pdfpageattr{/Rotate 90}
\fi}
但是,当包含包时,这似乎会中断hyperref
,而我肯定想在实际文档中使用它。因此,我返回并将\zref
原始答案中的内容合并到一起,并将其全部包装在一个漂亮的宏中:
\makeatletter
\newcommand{\rotateFigurePageForLabel}[1]{%
\zlabel{#1}%
\AtBeginShipout{%
\ifnum\c@page=\zref@extractdefault{#1}{abspage}{0}
\pdfpageattr{/Rotate 90}
\fi}
}
\makeatother
现在的用法类似于:
\begin{sidewaysfigure}
\caption{This figure and its caption are sideways. So is the page in the PDF.}
\label{fig:landscapefigure}
\rotateFigurePageForLabel{fig:landscapefigure}
\end{sidewaysfigure}
(当然,这可能有点狡猾,因为它会用\zlabel
你给它的标签文本创建一个新的,但我最初希望它只使用常规标签。但我找不到一个好的方法让它很好地发挥作用hyperref
。)