假设我使用 csname 语法在 aux 中存储了一个值。
辅助包含
\relax
\expandafter\gdef \csname inputsectioncount@en-US\endcsname{0}
这是正确的,因为我没有在上下文“en-US”中添加任何部分。
期望
\ifnum <number stored in aux> > 3\relax \tableofcontents\else Sorry, not enough sections to warrant a contents table.\fi
例子
在处理宏之前,我尝试了不同的技术来将\csname
其扩展两次。\ifnum
\documentclass{article}
\usepackage{fontspec}% xelatex
\newcounter{inputsectioncount}% latex counter, equiv of \global\newcount\inputsectioncounter\inputsectioncounter=0
% Add aux write hook
\let\latexsection\section
\def\section{\addtocounter{inputsectioncount}{1}\latexsection}
\makeatletter
\newcommand\someinput{%
\setcounter{inputsectioncount}{0}% reset inputsectioncounter
\def\contextid{en-US}% set context id (just a suffix to differentiate contexts)
Hello, I just simulated inputting some file within a context. Afterwhich, I'd like to know how many sections I just added.
\immediate\write\@mainaux{\string\expandafter\gdef\noexpand\csname inputsectioncount@\contextid\string\endcsname{\the\c@ inputsectioncount}}%
}
\makeatother
% Above code writes \expandafter\gdef \csname inputsectioncount@en-US\endcsname{0} to aux
% Now we can use this on next run
\newcommand\inputcontents{% Add contents lists if requirements are met (more than 3 sections within a context)
% \expandafter\let\expandafter\expandafter\expandafter\reserved@a\csname inputsectioncount@\ithlanguage\endcsname
% \expandafter\ifnum\reserved@a>3\relax Here should be tableofcontents\fi
% \expandafter\ifnum\csname inputsectioncount@\ithlanguage\endcsname>3\relax\tableofcontents\fi
}%
\begin{document}
\someinput
\inputcontents
\end{document}
答案1
你可以将测试写为
\ifnum 3<0\csname inputsectioncount@en-US\endcsname\relax
为什么这样而不是更明显的
\ifnum \csname inputsectioncount@en-US\endcsname>3\relax
那应该有效吗?实际上,当文件中的注释.aux
尚未读取时,第二种方法将失败(例如,.aux
文件在作业开始时不存在,这是第一次运行的情况)。它不起作用,因为如果由宏生成的宏\csname
尚未定义,它就会\relax
变成
\ifnum\relax>3\relax
是违法的。
而对于第一个代码,这种情况不会发生:添加了初始零是为了应对宏尚未定义的情况。在这种情况下,我们会得到
\ifnum3<0\relax\relax
如果文件中的注释.aux
定义宏来保存值 42,那么在宏扩展之后,测试将变成
\ifnum3<042\relax
并且在数字规范中忽略初始零。
请注意,之后的标记\ifnum
会被完全扩展,直到找到对 有意义的标记为止\ifnum
,因此\csname
会被扩展,并且由此产生的宏也会被扩展(如果不等于\relax
)。