\label / \ref 中的非英语标识符(“缺少 \endcsname 插入”)

\label / \ref 中的非英语标识符(“缺少 \endcsname 插入”)

我发现 LaTeX 会对某些非 ASCII 标识符造成阻碍\ref

这很好用:

\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}

\section{Foobär}
\label{sec:Foobär}

See \ref{sec:Foobär}

\end{document}

同样,如果将“Foobär”替换为“Barbaß”,则会中止并显示“缺少 \endcsname 插入”。(嗯?)。

现在,最简单的解决方案当然是“不要使用非 ASCII 标识符”。但由于我使用了一些宏魔法来让标签由节标题/表格标题自动定义,以及生成一些用于引用的周围文本,所以我会真的喜欢在标签中使用母语,而不是将其压缩为 ASCII-7。

有什么办法可以完成这个吗?

答案1

摘自《LaTeX 伴侣》第二版:

2.4 管理引用

[...] 为了允许文档内元素的交叉引用,您应该为给key定的结构元素分配一个(由 ASCII 字母、数字和标点符号组成的字符串),然后使用该键在其他地方引用该元素。

\label{key}  \ref{key}  \pageref{key}

从技术上讲,key应该可以保留\csname...\endcsname。该软件包babel使一些标点符号可以作为简写字符使用,但它会修补引用系统以允许在键内使用简写。可以使用该重新定义\IeC它是 Unicode 字母的内部包装器utf8.def

\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\makeatletter
\renewcommand*{\IeC}{%
  \ifx\protect\@typeset@protect
    \if@safe@actives
      \expandafter\expandafter\expandafter\IeC@detokenize
    \else
      \expandafter\expandafter\expandafter\@firstofone
    \fi
  \else
    \noexpand\IeC
  \fi
}
\newcommand*{\IeC@detokenize}[1]{\detokenize{#1}}
\makeatother

\begin{document}

\section{Barbaß}
\label{sec:Barbaß}

See \ref{sec:Barbaß}

\end{document}

答案2

嗯这似乎有效,在乳胶保护机制中添加了一些额外的 etex:

在此处输入图片描述

\documentclass{scrartcl}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\makeatletter

\def\IeCb#1{\string\IeCb{\detokenize{#1}}}
\def\label#1{\@bsphack
  \protected@write\@auxout{\let\IeC\IeCb}%
         {\string\newlabel{#1}{{\@currentlabel}{\thepage}}}%
  \@esphack}

\let\oldref\ref
\protected\def\ref#1{\let\IeC\IeCb\oldref{#1}}

\let\oldpageref\pageref
\protected\def\pageref#1{\let\IeC\IeCb\oldpageref{#1}}

\makeatother


\begin{document}

\section{Foobärß}
\label{sec:Foobärß}

See \ref{sec:Foobärß}

\end{document}

相关内容