eso-pic/AddToShipoutPicture 的放置问题

eso-pic/AddToShipoutPicture 的放置问题

我正在尝试使用 为每个页面添加一些装饰pgfornament,就像该包的文档中描述的那样。我遇到了一些问题,我认为这些问题与eso-pic和有关\AddToShipoutPicture;页面上的某些内容\put没有显示在应有的位置。这是一个相当简单的例子:

\documentclass{article}
\usepackage[a6paper]{geometry}
\usepackage{eso-pic}
\usepackage{calc}
\usepackage{lipsum}
\makeatletter
\AddToShipoutPicture{%
\begingroup
\setlength{\@tempdima}{2mm}%
\setlength{\@tempdimb}{\paperwidth-\@tempdima-2cm}%
\setlength{\@tempdimc}{\paperheight-\@tempdima}%
\put(\LenToUnit{\@tempdima},\LenToUnit{\@tempdimc}){OK} % upper left
\put(\LenToUnit{\@tempdima},\LenToUnit{\@tempdima}){OK} % lower left
\put(\LenToUnit{\@tempdimb},\LenToUnit{\@tempdimc}){wrong} % upper right
\put(\LenToUnit{\@tempdimb},\LenToUnit{\@tempdima}){OK} % lower right
\endgroup
}
\makeatother
\begin{document}
\lipsum[1]
\end{document}

这将产生以下内容:

在此处输入图片描述

如您所见,其中一个添加的标签位置错误,我完全不知道原因。同样的事情也发生在例如以下代码中Gonzalo 对此问题的回答(当他发布它时这显然对他起了作用)。

如能得到任何帮助将不胜感激,我甚至不确定如何开始调试这个问题。eso-pic是当前的,日志文件中没有任何异常。

答案1

永远不要认为临时寄存器等\@tempdimc在非本地范围内使用是“安全的”。它可能会起作用,但(在较新的 latex 实现中)它可能被用于其他目的,因此不会具有您设置的值。

如果你分配一个寄存器那么它就可以工作

\documentclass{article}
\usepackage[a6paper]{geometry}
\usepackage{eso-pic}
\usepackage{calc}
\newlength\zzz
\usepackage{lipsum}
\makeatletter
\AddToShipoutPicture{%
\begingroup
\setlength{\@tempdima}{2mm}%
\setlength{\@tempdimb}{\paperwidth-\@tempdima-2cm}%
\setlength{\zzz}{\paperheight-\@tempdima}%
\put(\LenToUnit{\@tempdima},\LenToUnit{\zzz}){OK} % upper left
\put(\LenToUnit{\@tempdima},\LenToUnit{\@tempdima}){OK} % lower left
\put(\LenToUnit{\@tempdimb},\LenToUnit{\zzz}){wrong} % upper right
\put(\LenToUnit{\@tempdimb},\LenToUnit{\@tempdima}){OK} % lower right
\endgroup
}
\makeatother
\begin{document}
\lipsum[1]
\end{document}

请注意,引入内部使用的更改\@tempdimc是为了允许使用长度,因此您不需要\LenToUnit

\documentclass{article}
\usepackage[a6paper]{geometry}
\usepackage{eso-pic}
\usepackage{calc}
\newlength\zzz
\usepackage{lipsum}
\makeatletter
\AddToShipoutPicture{%
\begingroup
\setlength{\@tempdima}{2mm}%
\setlength{\@tempdimb}{\paperwidth-\@tempdima-2cm}%
\setlength{\zzz}{\paperheight-\@tempdima}%
\put(\@tempdima,\zzz){OK} % upper left
\put(\@tempdima,\@tempdima){OK} % lower left
\put(\@tempdimb,\zzz){wrong} % upper right
\put(\@tempdimb,\@tempdima){OK} % lower right
\endgroup
}
\makeatother
\begin{document}
\lipsum[1]
\end{document}

calc虽然您根本不需要任何寄存器分配(或包),因为您可以在所有图片模式上下文中使用维度表达式。

\documentclass{article}
\usepackage[a6paper]{geometry}
\usepackage{eso-pic}
\usepackage{lipsum}

\AddToShipoutPicture{%
\put(2mm,\paperheight-2mm){OK} % upper left
\put(2mm,2mm){OK} % lower left
\put(\paperwidth-2mm-2cm,\paperheight-2mm){wrong} % upper right
\put(\paperwidth-2mm-2cm,2mm){OK} % lower right
}
\begin{document}
\lipsum[1]
\end{document}

答案2

评论太长了。只是想eso-pic在 2020 年 10 月之后不使用 LaTeX 格式的背景钩子来展示这一点:

\documentclass{article}
\usepackage[a6paper]{geometry}
\usepackage{lipsum}
\AddToHook{shipout/background}{%
  \put(2mm,-4mm){OK} % upper left
  \put(2mm,4mm-\paperheight){OK} % lower left
  \put(\paperwidth-12mm,-4mm){wrong} % upper right
  \put(\paperwidth-6mm,4mm-\paperheight){OK} % lower right
}
\begin{document}
\lipsum[1]
\end{document}

但为了在右侧更一致地放置它们,我可能会将它们排版为\llap{...}使得插入文本的右侧位于给定的坐标。

相关内容