\edef 包含 utf8 变音符号

\edef 包含 utf8 变音符号

是否有可能在 中包含 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}

相关内容