具有文字 UTF-8 内容的通用宏定义

具有文字 UTF-8 内容的通用宏定义

由于 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 中的本地化标题和月份名称的宏语言定义文件

相关内容