\thesection(及相关部分)一定是脆弱的吗?

\thesection(及相关部分)一定是脆弱的吗?

我认为我的问题的答案在于此主题,但我找不到它,而且我觉得我问的是该帖子中首先提出的问题的反面。无论如何...

我一直在尝试重新定义\thesection(和相关的\the...分段命令)来为我的分段生成替代序数。如果我使用\renewcommand,一切就都好了。如果我尝试使用\DeclareRobustCommand或包中的任何命令声明符xparse,我会遇到目录问题。

所以第一个问题是,我是否必须\renewcommand在这里使用,因为\thesection需要是脆弱的?这对我来说不太合理,因为序数在文档中正确显示。只是目录有点混乱。

第二个问题是,如果我不必使用\renewcommand,那么我将如何使用,比如说\RenewDocumentCommand。通常情况下,我很乐意只使用有效的方法,但我计划在未来做一些更棘手的事情\thesection(即允许我解析序数样式的字符串,就像enumerate为枚举列表提供的字符串一样 - 我已经在使用它,应该能够插入。)


用 MWE 来说明(必须注释掉序言中的其中一行):

\documentclass{article}

\DeclareRobustCommand{\thesection}{\Alph{section}}% does not work in toc
\renewcommand{\thesection}{\Alph{section}}% works always

\begin{document}
\tableofcontents
\section{Section One}
\section{Section Two}
\section{Section Red}
\section{Section Blue}
\end{document}

答案1

我们这里讨论的并不是“脆弱”的宏,而是可扩展必须有\the...可扩展的宏。原因是,在编写目录时,健壮的宏会.toc“按原样”放置在文件中,而可扩展的宏则会被展开。在.toc文件中,您想要保存各节的编号,ETC。,而不是标记\thesectionETC。

如果要使用xparse这些定义,则需要使用\DeclareExpandableDocumentCommand。名称很长,因为这些很少见:语法与相同\RenewDocumentCommand。请注意,您只需要在这里使用可扩展参数即可使所有内容正常工作:作为测试,请确保执行

\edef\test{\thesection}\show\test

给出了预期的结果。

答案2

\thesection不一定是脆弱的,但用 定义时很容易扩展\newcommand。它被写入.aux.toc文件,然后应该完全扩展到当前节号,否则目录和标签等将会损坏。出于这个原因,您可能不想将其定义为复杂的东西。

如果\thesection是脆弱的,上面提到的内容也会被破坏。不是任何不健壮的东西都是脆弱的,只有当它包含必须由 TeX 胃执行的代码时,它才是脆弱的,因此不能完全扩展。

相关内容