自 texlive 2020 以来,storebox 无法按预期工作

自 texlive 2020 以来,storebox 无法按预期工作

我必须在 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}

相关内容