使用章节标题时具有扩展保护功能

使用章节标题时具有扩展保护功能

我想了解为什么定义新的章节标题需要函数具有扩展保护。

答案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 根本没有扩展,只是写成它自己。

相关内容