zref:使用 \ztotpages 和 \AtVeryEndDocument 有条件地附加 tikz 绘制的页面时输出不稳定

zref:使用 \ztotpages 和 \AtVeryEndDocument 有条件地附加 tikz 绘制的页面时输出不稳定

仅当主文档的总页数为奇数时,我才需要附加草稿页。

以下方法很有效

\documentclass{exam}
\usepackage{blindtext,tikz,ulem,atveryend,hyperref}
\usepackage[totpages,user]{zref}
\newcommand\DraftPage{%https://tex.stackexchange.com/a/263613/2288
    \clearpage
    \begingroup
    \null
    \thispagestyle{empty}%
    \begin{tikzpicture}[remember picture,overlay]
    \node at ([yshift=-2cm]current page.north) {\LARGE\textbf{\uline{Draft Page}}};
    \draw[line width=5pt]
    (current page.north west) -- (current page.south east);
    \draw[line width=5pt]
    (current page.south west) -- (current page.north east);
    \end{tikzpicture}
    \addtocounter{page}{-1}%
    \hypersetup{pageanchor=false}%
    \clearpage
    \endgroup
}
\AtVeryEndDocument{
    \ifodd\ztotpages 
    \DraftPage
    \fi
}
\begin{document}
    \blindtext[1-30]\\
    \textbf{Total number of pages is \ztotpages.}
    \DraftPage
\end{document}

在此处输入图片描述

在此处输入图片描述

直到将其更改为

\begin{document}
    \blindtext[1-30]\\
    \textbf{Total number of pages is \ztotpages.}
\end{document}

然后我在第二页上得到了错误呈现的附加草稿页。

在此处输入图片描述

在此处输入图片描述

因此,我有两个问题:

1- 如何使命令\DraftPage不影响前一个工作案例中检测到的总页数\ztotpages?换句话说。\ztotpages需要1

2-为什么第二种情况会导致错误的输出?以及如何解决它?

答案1

编辑:

另一个解决方案,希望这次更稳定:

\documentclass{exam}
\usepackage{tikz,ulem,etoolbox,hyperref}
\usepackage{lipsum}
\usepackage[totpages,user]{zref}
\newcommand\DraftPage{
    \cleardoublepage                % <---
    \thispagestyle{empty}
    \ifodd\thepage\else             % <---
    \centering\LARGE\textbf{\uline{Draft Page}} % <--- 
    \begin{tikzpicture}[remember picture,overlay]
    \draw[line width=5pt]
    (current page.north west) -- (current page.south east);
    \draw[line width=5pt]
    (current page.south west) -- (current page.north east);
    \end{tikzpicture}
   \fi%                             % <---
}
\AtEndDocument{\DraftPage}          % <---

\begin{document}
    \lipsum%\lipsum\lipsum\lipsum
    \lipsum[1-3]
    \textbf{Number of pages is \ztotpages.}
\end{document}

此解决方案在奇数页的文档中添加了\DraftPage文档末尾。这是在至少两次编译文档后获得的。我使用最多包含五页文本的文档测试了此解决方案。两次编译后所有结果都是正确的。

  • 的定义\DraftPage已更改。现在它包含最后一页是否为奇数的测试。
  • 在我的 MWE 中我使用lipsum它,blindtext因为我更熟悉它。
  • 解决方案中使用了etoolbox包及其文档挂钩\AtEndDocument而不是atveryend包及其挂钩\AtVeryEndDocument,据我所知,它并不像您预期​​的那样工作(但我可能是错的)。
  • 解决方案中不再使用\ztotpages。它现在仅用于显示文档的页数。

答案2

我会用\BeforeLastShipout

\documentclass{exam}
\usepackage{lipsum,tikz,ulem,atveryend,hyperref}
\usepackage[totpages,user]{zref}

\BeforeClearDocument{\clearpage\DraftPage}
\newcommand{\DraftPage}{%
  \ifodd\value{page}\else
    \thispagestyle{empty}%
    \mbox{}%
    \begin{tikzpicture}[remember picture,overlay]
    \node at ([yshift=-2cm]current page.north) {\LARGE\textbf{\uline{Draft Page}}};
    \draw[line width=5pt]
    (current page.north west) -- (current page.south east);
    \draw[line width=5pt]
    (current page.south west) -- (current page.north east);
    \end{tikzpicture}%
    \addtocounter{page}{-1}%
    \hypersetup{pageanchor=false}%
    \renewcommand{\DraftPage}{}%
  \fi
}

\begin{document}

\lipsum[1-25]

\textbf{Total number of pages is \zpageref{LastPage}.}

\end{document}

在此处输入图片描述

如果更改为\lipsum[1-30],则不会发走附加页面。

相关内容