\if 在类文件中何时执行

\if 在类文件中何时执行

我有一个自定义类文件,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},它们.auxLaTeX 运行。

因此,在读取类文件时,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
}

相关内容