当 ß 出现在目录中时,未定义控制序列 \OT

当 ß 出现在目录中时,未定义控制序列 \OT

我使用命令\addtocontents

\documentclass[a5paper, 11pt]{scrbook}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{helvet}

\usepackage{tocloft}
\usepackage{scrpage2}

\begin{document}
\addtocontents{toc}{\textbf{Laßt, ihr buntbemützten Scharen}\vspace*{2.5pt}

}
\tableofcontents
\end{document}

它将以下乱码写入目录

\textbf {La\OT 1\ss t, ihr buntbem\unhbox \voidb@x \bgroup \let \unhbox \voidb@x \setbox \@tempboxa \hbox {u\global \mathchardef \accent@spacefactor \spacefactor }\accent 127 u\egroup \spacefactor \accent@spacefactor tzten Scharen\unhbox \voidb@x \hbox {}}\vspace *{2.5pt} \par 

导致\OT 1错误。如果我删除它,我会得到所需的输出。问题是:我该如何删除它?我怀疑,它是由错误插入的,这意味着我需要一个解决方法。我不能用 替换 ß \ss,因为Laßt, ihr.....它本身就是 edef 中的结果。

这是一个已知的错误吗?我找不到任何类似的问题。

我怀疑 helvet、tocloft、scrpage2 和 scrbook 是“坏家伙”。注释掉它们要么是不可能的(因为这是必要的),要么会导致其他错误,但不是解决方案。

答案1

我认为你的例子没有说明真相。你可能涉及了 \edef。类似这样的操作会给出你的输出和错误(第二次编译后):

\documentclass[a5paper, 11pt]{scrbook}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{helvet}

\usepackage{tocloft}
\usepackage{scrpage2}

\begin{document}
\edef\test{Laßt, ihr buntbemützten Scharen}

\addtocontents{toc}{\textbf{\test}\vspace*{2.5pt}}
\tableofcontents
\end{document}

如果你的实际代码包含这样的 \edef:\protected@edef则使用。这在我的示例中有效(首先删除旧的目录):

\makeatletter
\protected@edef\test{Laßt, ihr buntbemützten Scharen}
\makeatother

答案2

在我的问题中,ß将其改为\OT 1\ss,它扩展为,而不是<ucs-error> 1\ss扩展为。ß

我无法解决主要问题,但以防万一,有人偶然发现了这个问题:

\def\OT#11{} % for understanding: \OT{#1}1 => {}

是一种解决方法。原理很简单:

\OT 1 is defined with #1 = SPACE and 1 = delimiter

它会膨胀到无。

相关内容