我使用命令\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
扩展为。1ß
ß
我无法解决主要问题,但以防万一,有人偶然发现了这个问题:
\def\OT#11{} % for understanding: \OT{#1}1 => {}
是一种解决方法。原理很简单:
\OT 1 is defined with #1 = SPACE and 1 = delimiter
它会膨胀到无。