我有一个自定义类文件,myclass.cls
其中包含以下片段:
\usepackage{totcount}
\newtotcounter{hintcounter}
\newtotcounter{draftcounter}
\usepackage[printwatermark]{xwatermark}
\if\ifnum\totvalue{hintcounter}>0 T\else\ifnum\totvalue{draftcounter}>0 T\else F\fi\fi T%
\newwatermark*[allpages,color=red,angle=45,scale=4,xpos=0,ypos=20]{\textbf{DRAFT}}
\fi
\newcommand{\hint}[1]{\stepcounter{hintcounter}\textcolor{blue}{#1}}
\newcommand{\draft}[1]{\stepcounter{draftcounter}\textcolor{red}{#1}}
用英语来说:如果在某处使用了\hint
或\draft
命令,那么每个页面都应该有一个覆盖。
问题:它永远不会被评估为真,如果您使用硬编码值 (>0) 而不是\totvalue{draftcounter}
在每一页上显示水印,则 if 逻辑是正确的。我也尝试在文档中打印计数器本身的值,\total{draftcounter}
它们也是正确的。这让我相信 \if 根本没有被(重新)评估。
使用自定义类的文档被编译了几次以获取最后一页,适当的表格宽度等,但看起来 \if 从未在类文件中被重新评估。
\if
我做错了什么/类文件中的语句何时执行?
(使用 LuaLatex,但我更喜欢通用解决方案)
答案1
类文件中的代码在读取时即在 LaTeX 运行开始时执行。
\totvalue{hintcounter}
但是,您的特定代码需要和的知识\totvalue{draftcounter}
,它们.aux
在前LaTeX 运行。
因此,在读取类文件时,LaTeX 不知道这些值是什么,因此默认使用值 0。
该.aux
文件作为代码的一部分被读取\begin{document}
,因此您想将该部分的执行推迟到该点之后。
LaTeX 提供了一个钩子,用于以所需的方式延迟代码:如果你这样做
\AtBeginDocument{<code>}
然后<code>
作为例程的一部分执行\begin{document}
,但是后文件.aux
已被读取。
解决方案:
\AtBeginDocument{%
\if\ifnum\totvalue{hintcounter}>0 T%
\else
\ifnum\totvalue{draftcounter}>0 T%
\else F%
\fi
\fi T%
\newwatermark*[allpages,color=red,angle=45,scale=4,xpos=0,ypos=20]{\textbf{DRAFT}}%
\fi
}