我认为我的问题的答案在于此主题,但我找不到它,而且我觉得我问的是该帖子中首先提出的问题的反面。无论如何...
我一直在尝试重新定义\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。,而不是标记\thesection
,ETC。
如果要使用xparse
这些定义,则需要使用\DeclareExpandableDocumentCommand
。名称很长,因为这些很少见:语法与相同\RenewDocumentCommand
。请注意,您只需要在这里使用可扩展参数即可使所有内容正常工作:作为测试,请确保执行
\edef\test{\thesection}\show\test
给出了预期的结果。
答案2
\thesection
不一定是脆弱的,但用 定义时很容易扩展\newcommand
。它被写入.aux
和.toc
文件,然后应该完全扩展到当前节号,否则目录和标签等将会损坏。出于这个原因,您可能不想将其定义为复杂的东西。
如果\thesection
是脆弱的,上面提到的内容也会被破坏。不是任何不健壮的东西都是脆弱的,只有当它包含必须由 TeX 胃执行的代码时,它才是脆弱的,因此不能完全扩展。