辅助包含

辅助包含

假设我使用 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)。

相关内容