由于 UTF-8 是默认的输入编码,因此在宏参数中使用文字 Unicode 字符应该很简单,例如
\newcommand*{\regards}{Grüße}
如果宏是在外部文件(比如说包)中定义的,但在使用旧版本的文档中使用,则此方法会失败输入编码(例如“latin1”)。
一种解决方法是将字符串包装在输入编码开关中:
\documentclass[a4paper]{article}
\ifdefined\UnicodeEncodingName
\else
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage[latin1]{inputenc}
\fi
\newcommand*{\UTFviiiInputEncodingName}{utf8}
\newcommand*{\UTFviiiInput}[1]{%
\ifdefined \inputencoding
\ifx\inputencodingname\UTFviiiInputEncodingName
#1
\else
\let\PreviousInputEncodingName\inputencodingname
\inputencoding{utf8}#1\inputencoding{\PreviousInputEncodingName}
\fi
\else
#1
\fi
}
\begin{document}
Let's define and use an example:
\newcommand{\regardsI}{\UTFviiiInput{Grüße}}
regards -> \regardsI.
Without \verb|\protect|, a section heading
using the macro fails in the ToC:
\section{Freundliche \protect\regardsI}
We also need to think about indices, glossaries,
footnotes\footnote{Viele \regardsI}, hyperref, \ldots
\tableofcontents
\end{document}
用于移动参数时,包装器宏应该是强壮的或者可扩展或者介于两者之间?
我更喜欢将“部分早期扩展”降至 LICR,以便\meaning
示例宏的变成macro:->Gr\" u\ss e
。
预期用例是“greek.ldf”Babel 中的本地化标题和月份名称的宏语言定义文件。