我已经学会了如何通过命令定义简写
\useshorthands{(a character, e.g. ')}
在序言和
\defineshorthand{(shorthand code)}{(expansion)}
就在 之后\begin{document}
,例如\defineshorthand{'a}{apple
}«'a»
排版成«apple»
。问题是,当我尝试'
在节、小节、小小节或章的标题中放置速记字符(在我的情况下是撇号 )并将其与目录结合时,我收到一条显然与 toc 文件有关的错误消息。所有这些,自然地,在创建命令 之后\newcommand{\6}{'\Gr{}}
,其中\Gr
是与默认字体相同的字体系列,创建该命令是为了避免排版不应该是速记的速记,因为 'a 在任何上下文中都会变成 apple,即使它是 ' a 中间有空格。因此,部分标题包含命令\6
。为什么会发生这种情况?我该如何解决?
例如,错误发生于:
\documentclass[a4paper]{report}
\usepackage[italian]{babel}
\useshorthands{'}
\begin{document}
\defineshorthand{'a}{apple}
\section{Un'\,arpa}
\tableofcontents
\end{document}
产生的错误是:
.mu2.toc:2: Missing $ inserted.
<inserted text>
$
l.2 ...t@token \egroup \Gr {}arpa}{1}
{section.0.1}
?
完整的 .toc 文件内容如下:
\select@language {italian}
\contentsline {section}{\numberline {0.1}Un^\bgroup
\prime \futurelet \@let@token \egroup \,arpa}{1}
最后两行合为一行。
答案1
'
首先不要将其用作简写字符。就这样。
为什么会出现这种奇怪的行为?这有点复杂,但我还是会尝试一下。
某些字符可能处于“活动”状态,因此它们的行为类似于宏;主要示例是
~
。Babel 简写前缀也会变为活动状态。有些字符可能“数学激活”,这意味着它们仅在数学模式下表现得像宏,但它们仍然不可扩展。主要示例是 ASCII 撇号
'
,它在数学模式下几乎等同于输入^{\prime}
。节标题是“移动参数”:它们保存在特殊位置,写入文件时会展开其中的宏
.aux
。活动字符会展开,数学活动字符则不会展开。当 Babel 激活简写前缀时,它会确保其行为与成为简写前缀之前(后面没有定义的组合)的行为相同。
如果有
\useshorthands{'}
,撇号就会变为有效。如果有
\section{Un'\,arpa}
,则当.aux
文件写出时,令牌'
就会扩展。该组合
'\,
未定义为简写,因此 LaTeX 使用'
在将其定义为简写字符之前分配给活动字符的任何含义。'
数学模式(活动时)中的扩展为^\bgroup\prim@s
。标记
^
和\bgroup
不可扩展;的扩展\prim@s
是\prime\futurelet\@let@token\pr@m@s
上面的前三个 token 是不可扩展的,最后一个是可扩展的,并且变为
\ifx'\@let@token \expandafter\pr@@@s \else \ifx^\@let@token \expandafter\expandafter\expandafter\pr@@@t \else \egroup \fi \fi
并且,此时,事情真的不可预测,因为
\let@token
可以是任何值。在您的例子中,它不等同于'
,因此遵循错误分支,并且\let@token
也不等同于^
,因此\egroup
生成 ,这是不可扩展的。结果:在
.aux
文件中你发现的是乱码,准确地说Un^\bgroup \prime \futurelet \@let@token \egroup \,arpa
但您可能会发现其他结果,具体取决于
\@let@token
发生的情况。