TikZ:特殊节点“当前页面”的锚点在横向显示时似乎不正确

TikZ:特殊节点“当前页面”的锚点在横向显示时似乎不正确

我有一个文档,希望将其格式化为横向格式,并通过 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 的建议,我发现我的编译路径是问题的一部分:我通过以下方式进行编译:latexdvipsps2pdf而不是仅仅pdflatex。但是,我的印象是,如果我在 LaTeX 文档中合并 PostScript 命令,我需要采用更迂回的方式。有人知道这方面的信息并愿意解释为什么我应该始终使用pdflatex

答案1

我不太确定是否将其称为 中的错误pdflatex,但从我不太深入的调查来看,\pdfsavepos当处于横向模式并生成 dvi 时,图元返回的位置似乎发生了偏移。一种解释这种行为的方法(虽然我不知道这幅图有多准确)是,当\pdfsavepos运行时,它实际上计算了相对于左下方页面的坐标。但 TeX 需要相对于左上方因此pdflatex必须(0,paperheight) - (saved x, saved y)通过 计算并返回该值。但是(仍然猜测)在 模式下运行时,\pdfsavepos好像不知道已发送页面的实际页面大小。因此,当它计算时,它会使用其“标准”纸张高度。这是基于这样一个事实:使用 运行和使用 运行之间辅助文件中记录的位置差异恰好是:pdflatexdvipaperheightlatexpdflatex\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产生:

使用 pdflatex 进行横向绝对定位

通过latex; latex; dvips; pstopdf(注意 的双重运行latex)可得出:

使用 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}

相关内容