我发现 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}