我有一个文档,希望将其格式化为横向格式,并通过 TikZ 添加一些材料作为叠加层。如果我创建纵向页面,则可以使所有内容正确无误,但如果创建横向页面,则不行。
以下是我的 MWE肖像显示我想要的内容(页面方向除外)
\documentclass{article}
\usepackage[margin=0.5in]{geometry}
\usepackage{tikz}
\usepackage{lipsum}
\begin{document}
\lipsum[1-4]
\begin{tikzpicture}[remember picture,overlay]
\node at (current page.south west) [text width=5cm,fill=red!20,above right] { This material is in the south west corner of the page };
\end{tikzpicture}
\end{document}
但是当我尝试在横向模式下获得相同效果时,.south west
锚点显然超出了页面范围。无论我将landscape
可选参数传递给类声明还是通过 ,似乎都会发生这种情况geometry
。
这是我的故障 MWE:
\documentclass{article}
\usepackage[margin=0.5in,landscape]{geometry}
\usepackage{tikz}
\usepackage{lipsum}
\begin{document}
\lipsum[1-4]
\begin{tikzpicture}[remember picture,overlay]
\node at (current page.south west) [text width=5cm,fill=red!20,above right] { This material is in the south west corner of the page };
\end{tikzpicture}
\end{document}
有任何想法吗?
根据 @HarishKumar 的建议,我发现我的编译路径是问题的一部分:我通过以下方式进行编译:latex
→ dvips
→ps2pdf
而不是仅仅pdflatex
。但是,我的印象是,如果我在 LaTeX 文档中合并 PostScript 命令,我需要采用更迂回的方式。有人知道这方面的信息并愿意解释为什么我应该始终使用pdflatex
?
答案1
我不太确定是否将其称为 中的错误pdflatex
,但从我不太深入的调查来看,\pdfsavepos
当处于横向模式并生成 dvi 时,图元返回的位置似乎发生了偏移。一种解释这种行为的方法(虽然我不知道这幅图有多准确)是,当\pdfsavepos
运行时,它实际上计算了相对于左下方页面的坐标。但 TeX 需要相对于左上方因此pdflatex
必须(0,paperheight) - (saved x, saved y)
通过 计算并返回该值。但是(仍然猜测)在 模式下运行时,\pdfsavepos
好像不知道已发送页面的实际页面大小。因此,当它计算时,它会使用其“标准”纸张高度。这是基于这样一个事实:使用 运行和使用 运行之间辅助文件中记录的位置差异恰好是:pdflatex
dvi
paperheight
latex
pdflatex
\paperheight-\paperwidth
pdflatex
生成:\pgfsyspdfmark {pgfid1}{10467319}{17617993}
latex
生成:\pgfsyspdfmark {pgfid1}{10467319}{29458709}
差值为11840716(单位为sp)。
并且(在横向模式下),我们可以通过以下方式将其与纸张尺寸进行比较:
\newdimen\stuff
\stuff=11840716sp
\showthe\stuff
\stuff=\paperwidth
\advance\stuff by -\paperheight
\showthe\stuff
然后产生:
> 180.67499pt.
l.9 \showthe\stuff
?
> 180.67499pt.
l.13 \showthe\stuff
这个解释不可能完全正确,因为虽然我得到了类似的故事(即存在一致的 y 偏移),但当我尝试时,\usepackage[a5paper]{geometry}
数字却不会以相同的方式加起来。
对于在两个环境之间切换的情况tikzpicture
,这种偏移并不重要,因为它是一致的,因此相对的图片的分离是相同的。它只对current page
节点有影响,因为它是“绝对”定位的。要修复current page
,只需修复pgf
页面原点所在的位置即可。这保存在宏中\pgf@sys@pdf@mark@pos@pgfpageorigin
,因此我们需要重新定义它。
理想情况下,我们应该重新定义它以了解当前的页面大小和几何形状,但正如我的实验所a5paper
显示的那样,我并不完全理解所涉及的计算。因此,这是使用包设置横向 a4paper 时的修复方法geometry
。如果处理混合文档,您可以让宏本身包含条件。通过将其包围起来,\ifpdf ... \fi
我们得到了一个适用于和latex
的系统pdflatex
。
\makeatletter
\ifpdf
\else
\ifGm@landscape
\def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfqpoint{0sp}{11840716sp}}
\fi
\fi
\makeatother
在您的 MWE 的改编中:
\documentclass{article}
%\url{http://tex.stackexchange.com/q/91105/86}
\usepackage[landscape]{geometry}
\usepackage{tikz}
\usepackage{lipsum}
\makeatletter
\ifpdf
\else
\ifGm@landscape
\def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfqpoint{0sp}{11840716sp}}
\fi
\fi
\makeatother
\begin{document}
\lipsum[1-4]
\begin{tikzpicture}[remember picture,overlay]
\foreach \anchor in {north west,north east,south west,south east} {
\node[anchor=\anchor] at (current page.\anchor) {some stuff at \anchor};
}
\end{tikzpicture}
\end{document}
由此pdflatex
产生:
通过latex; latex; dvips; pstopdf
(注意 的双重运行latex
)可得出:
答案2
pdflatex(以及 lualatex)依赖 \pdfpageheight 的值来计算位置,但如果使用 dvi 模式,则 geometry 不会设置此值。如果调整长度,节点将正确放置:
\RequirePackage[T1]{fontenc} %for dvilualatex
\RequirePackage{luatex85} % for current lualatex
\documentclass{article}
\usepackage[margin=0.5in,landscape]{geometry}
\pdfpageheight\paperheight
\pdfpagewidth\paperwidth %not sure if needed but can't harm
\usepackage{tikz}
\usepackage{lipsum}
\begin{document}
\lipsum[1-4]
\begin{tikzpicture}[remember picture,overlay]
\node at (current page.south west) [text width=5cm,fill=red!20,above right] { This material is in the south west corner of the page };
\end{tikzpicture}
\end{document}