我正在尝试在命令\aa
中使用\eappto
。下面的最小代码在 XeLaTeX 和 LuaLaTeX 中运行良好,但在 pdfLaTeX 中会失败,除非我包含包fontenc
。这让我很困惑,因为即使没有包,在命令\aa
之外也能完美运行。\eappto
fontenc
\documentclass{article}
% \usepackage[T1]{fontenc}
\usepackage{etoolbox}
\makeatletter
\newcommand{\zz}{%
\def\@tmp{}%
\eappto\@tmp{\aa}%
\@tmp%
}
\makeatother
\begin{document}
\aa tta% works just fine
\zz% only works with `fontenc`
\end{document}
答案1
在 pdflatex 中,瑞典语应始终使用 T1 enoding,否则连字符会出错,而且通常不能应用于\edef
latex 构造。也就是说,utf-8 字符\protected
在 中非常安全,\edef
因此如果您确实需要它,只需使用å
而不是\aa
。
\documentclass{article}
% \usepackage[T1]{fontenc}
\usepackage{etoolbox}
\makeatletter
\newcommand{\zz}{%
\def\@tmp{}%
\eappto\@tmp{å}%
\@tmp%
}
\makeatother
\begin{document}
\aa tta % works just fine
\zz tta % only works with `fontenc`
\end{document}
如果您有旧的乳胶,您可以使用标准乳胶,\protected@edef
而不是依赖不受支持的 edef 使用。
\documentclass{article}
% \usepackage[T1]{fontenc}
\usepackage{etoolbox}
\makeatletter
\newcommand{\zz}{%
\def\@tmp{}%
\protected@edef\@tmp{\@tmp å}%
\@tmp%
}
\makeatother
\begin{document}
\aa tta % works just fine
\zz tta % only works with `fontenc`
\end{document}
答案2
的定义\aa
是
\r a
\r
XeLaTeX 或 LuaLaTeX的定义是
\TU-cmd \r \TU\r
\TU\r
我们可以看到(这是一个名称中带有反斜杠的奇怪命令)的定义是
#1->\@text@composite \TU\r #1\@empty \@text@composite {\add@unicode@accent {"030A}{#1}}.
并\r a
最终扩展为单个 Unicode 字符å
。
使用 pdflatex 中默认的 OT1 编码,该\r
命令变成了一个复杂的构造,旨在在 上方添加环音符a
,但它无法\edef
在 的使用中存活下来\eappto
。
另一方面,T1 的情况与前一种情况类似,因为 T1 编码字体具有预制å
字符。
\edef
但是,在任何情况下我都不建议使用这种依赖编码的命令。