我习惯pdflscape
将一些横向页面放置在较长的纵向文档中,因为它包含一些非常宽的浮点数。
然而,当浮动对象太大以致于需要单独的页面时,它就不再正确旋转:
以下代码:
\documentclass{article}
\usepackage{pdflscape}
\usepackage{lipsum}
\begin{document}
\lipsum[1-4]
\begin{landscape}
\lipsum[5-6]
\begin{figure}
\lipsum[7-8]
\caption{Some text, rotated correctly.}
\end{figure}
\begin{figure}
\lipsum[9-12]
\caption{Some more text, wrong side up.}
\end{figure}
\end{landscape}
\end{document}
产生该输出:
如何正确旋转仅浮动的页面?
答案1
包pdflscape
只是包的包装器lscape
。它设置/Rotate
PDF 页面数据结构中的条目。因此,问题显示了纸张的正确方向,第 2 页和第 3 页是横向的。
但是第三页的内容显示不正确。包lscape
挂接到构造页面内容和旋转输出框的输出例程的宏中。但它漏掉了一个案例:
\documentclass[12pt]{article}
\usepackage[a6paper]{geometry}% smaller images for answer
\usepackage{lscape}
\begin{document}
\begin{landscape}
\rule{5mm}{50mm}\hfill\rule{5mm}{50mm}
\begin{figure}
\rule{5mm}{90mm}\hfill\rule{5mm}{90mm}
\caption{Some text, not rotated, wrong footer}
\end{figure}
\end{landscape}
\end{document}
第 1 页:
第2页:
包lscape
挂钩
\@makecol
:正常页面\@makefcolumn
:浮动页面。它\@tryfcolumn
在组内调用,实际工作在宏中完成\@vtryfc
。
但这漏掉了一个案例。输出例程以以下内容开始:
\output {%
\let \par \@@par
\ifnum \outputpenalty<-\@M
\@specialoutput
\else
\@makecol
\@opcol
\@startcolumn
\@whilesw \if@fcolmade \fi
{%
\@opcol\@startcolumn}%
\fi
\@makecol
构造第一页,它被包捕获lscape
并旋转。\@opcol
输出页面。然后\@startcolumn
被调用。它还调用\@tryfcolumn
,但不调用\@makefcolumn
。因此,构造了一个输出页面,但未被包检测到lscape
。(同样的\@startdblcolumn
事情也发生在调用上\@tryfcolumn
,但我还没有测试过,twocolumn 的东西是否真的有效。)
修复建议(包lscape
或之后pdflscape
):
\makeatletter
\let\LS@vtryfc\@vtryfc
\g@addto@macro\landscape{%
\def\@vtryfc#1{%
\LS@vtryfc{#1}%
\LS@rot
}%
}
\makeatother
那么示例的第二页就变成:
而且问题的最后一页也是正确的: