我正在尝试使用 为每个页面添加一些装饰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{...}
使得插入文本的右侧位于给定的坐标。