我必须在 LaTeX 文档中每页多次包含特定于页面的内容(具体来说是 DM 代码)。为此,我使用了storebox
和的组合everypage
,这样内容在生成的 PDF 中排版一次并多次引用:
\documentclass[a4paper]{article}
\usepackage[pagestyles,extramarks]{titlesec}
\usepackage{everypage}
\usepackage{storebox}
\AtBeginDocument{{}} % due to https://tex.stackexchange.com/a/141540
\newpagestyle{mypagestyle}{%
\sethead[%
][%
\usestorebox{\mybox}%
][%
]{%
}{%
\usestorebox{\mybox}%
}{%
}%
\setfoot[%
][%
\usestorebox{\mybox}%
][%
]{%
}{%
\usestorebox{\mybox}%
}{%
}%
}
\pagestyle{mypagestyle}
\AddEverypageHook{\storebox{\mybox}{some page-specific stuff repeated multiple times on that page}}
\begin{document}
Page 1
\clearpage
Page 2
\end{document}
这对于 2020 之前的任何版本都适用。但是,texlive 2020
引入了本机钩子,使该everypage
包过时了。自该版本以来,上述方法导致:
! Undefined control sequence.
<argument> \pdfrefxform \mybox
直接使用新的钩子,即\AddToHook{shipout/before}{stuff}
,会出现同样的错误。使用xsavebox
代替 也storebox
可以,但xsavebox
速度会慢很多,因此不是一种替代方法。
有人知道如何使用storebox
它吗texlive 2020
?
答案1
下面的代码允许在每一页上存储一个新框,并在页脚或页眉的不同位置重复使用它。pdf 包含两个 xobject,每个页面一个。类似的东西可能也可以实现,titlesec
但我不太了解这个包。
需要修补内部 storebox 命令,因为它不存储对 xform 全局的引用。应将此和 \AtBeginDocument 错误报告给作者。
\documentclass{article}
\usepackage{fancyhdr}
\usepackage{storebox}
\makeatletter
%make command global
\def\@storebox#1{%
\begingroup
\@collectboxto\collectedbox{%
\storebox@immediate\pdfxform resources {\the\pdfpageresources}\collectedbox
\endgroup\global\mathchardef#1=\pdflastxform
}%
}
\makeatother
\pagestyle{fancy}
\fancyhf{}
\newcommand\mybox{} %allocate the name to avoid to overwrite an existing command.
\lhead{\storebox{\mybox}{some page-specific stuff repeated multiple times on that page\thepage/\leftmark}%
\usestorebox{\mybox}}
\rfoot{\usestorebox{\mybox}}
\begin{document}
\section{abc}
Page 1
\clearpage
\section{cde}
Page 2
\end{document}