我想了解为什么定义新的章节标题需要函数具有扩展保护。
答案1
它曾经是最常见的问题,因为几乎所有的 latex 命令都是脆弱的,默认情况下在标题中会失败,但现在大多数命令默认情况下都是健壮的(因为更多的内存允许这样做)。因此,下面这个示例显示了一个以*
经典方式定义形式的命令,因此它很脆弱:
\documentclass{article}
\makeatletter
\def\foo{\@ifstar{star}{not star}}
%\protected\def\foo{\@ifstar{star}{not star}}
\makeatother
\begin{document}
\tableofcontents
1 \foo
2 \foo*
\section{aaa \foo* bbb}
xxx
\end{document}
产生错误
! Argument of \@sect has an extra }.
<inserted text>
\par
l.16 \section{aaa \foo* bbb}
?
因为\@ifstar
前瞻在\write
目录所需的部分失败,但如果您将定义切换为,\protected\def
则\write
安全并且aux
文件具有
\@writefile{toc}{\contentsline {section}{\numberline {1}aaa \foo * bbb}{1}{}\pro
tected@file@percent }
其中\foo
根本没有扩展,只是写成它自己。