是否有可能在 中包含 utf8 字符(例如德语变音符号)\edef
?如果将变音符号直接作为参数给出,例如 ,则以下示例文档表现良好\convertTest{Müller}
。转换后,结果输出为“Mueller”。如果通过\edef
中的类似给出“Müller” \convertTest{\authorname}
,则结果输出不符合预期(“M.ller”),尽管\newcommand
输入时(转换前)的消息是相同的。
\documentclass{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{stringstrings}
\newcommand{\convertTest}[1]{
\message {before convert: #1}
\convertword[q]{#1}{}{ue}
\message {after convert: \thestring}
\thestring \
}
\begin{document}
\convertTest{Müller}
\edef\authorname{Müller}
\convertTest{\authorname}
\end{document}
答案1
马丁说得对:另一种选择可能是保护……
你可以这样做
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\usepackage[ngerman]{babel}
\usepackage{stringstrings}
\newcommand{\convertTest}[1]{
\message {before convert: #1}
\convertword[q]{#1}{}{ue}
\message {after convert: \thestring}
\thestring \
}
\begin{document}
\convertTest{Müller}
\makeatletter
\protected@edef\authorname{Müller}
\makeatother
\authorname
\convertTest{\authorname}
\end{document}
您需要使用带有 etex 的引擎,但 pfd(e)tex 实际上非常常见
替代方案:您可以在序言中加上定义:
\makeatletter
\newcommand{\defauthorname}[1]{
\protected@edef\authorname{#1}
}
\makeatother
你可以使用它
\defauthorname{Müller}
\authorname
答案2
变音符号通常定义为活跃角色,例如~
。它们基本上是单字符宏,不需要在它们前面加上反斜杠。
现在,\edef
扩展所有宏,因此也扩展所有活动字符,直到生成的标记无法再扩展为止。这就是导致问题的原因:在 之后\edef
不再ü
是ü
:
\show ü
> ü=macro:
->\UTFviii@two@octets ü.
我在向我的svn-多包,应该在里面使用\csname ... \endcsname
,它也会像那样扩展\edef
(但如果结果不是纯文本则会导致错误)。
解决方案:
您可以ü
在之前本地重新定义\edef
:如果您想要做的就是将变成ü
然后ue
执行以下操作:
\def ü{ue}
\edef\authorname{Müller}
\message{\authorname}% Prints Mueller!
另一种方法可能是保护ü
,例如使其更强大。我尝试了\robustify
中的宏etoolbox
,但没有用。但这可能是我的本地编码的问题。
你也可以尝试使用 XeTeX,它本身就支持 Unicode。但我个人没有使用过它。
答案3
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{xstring}
\newcommand\convertTest[1]{\StrSubstitute{#1}{ü}{ue}}
\begin{document}
\convertTest{Müller}
\edef\authorname{Müller}
\convertTest{\authorname}
\end{document}