我正在尝试转换一些带重音字母的字符串。我希望能够只删除重音符号,同时保留字母。(例如将 ô 转换为 o,这样 Hôspital 就会变成 Hosiptal)。
实现这一目标的最佳方法是什么?
我可以这样做
\documentclass{article}
\usepackage[T1]{fontenc}
\ExplSyntaxOn
\tl_new:N \l_accented_tl
\cs_generate_variant:Nn \regex_replace_all:nnN { neN }
\seq_set_from_clist:Nn \g_my_seq { é , è , ê , à , â , ô , ö, î , ï , ç , É , È , Ê , À , Â , Ô , Ö , Î , Ï , Ç }
\prop_const_from_keyval:Nn \g_my_pl {
é = e , è = e , ê = e ,
à = a , â = a ,
ô = o , ö = o ,
î = i , ï = i , ç = c ,
É = E , È = E , Ê = E ,
À = A , Â = A ,
Ô = o , Ö = O ,
Î = I , Ï = I , Ç = C }
\NewDocumentCommand{\remove}{ m }
{
\tl_set:Nn \l_accented_tl { #1 }
\seq_map_inline:Nn \g_my_seq
{
\regex_replace_all:neN { ##1 } { \prop_item:Nn \g_my_pl { ##1 } } \l_accented_tl
}
\tl_use:N \l_accented_tl
}
\ExplSyntaxOff
\begin{document}
\remove{Hörmander}, \remove{Hôspital}
\end{document}
是否有可能通过类似
\tl_set:Nn \l_accented_tl { #1 }
\regex_replace_all:nnN { (é)|(è)|(à)|(ç) } { (?1:e)|(?2:e)|(?3:a)|(?4:c) } \l_accented_tl
\tl_use:N \l_accented_tl
或更好?
答案1
如果您使用 pdflatex,那么这非常简单:只需(本地)将重音宏重新定义为无操作。
\documentclass{article}
\makeatletter
\newcommand{\removeaccents}[1]{%
\begingroup
\let\'\@firstofone
\let\`\@firstofone
\let\^\@firstofone
\let\"\@firstofone
% add the other accent commands you need
#1
\endgroup
}
\makeatother
\begin{document}
\removeaccents{Hörmander}
\removeaccents{Hôpital}
\end{document}
哦,顺便说一句,“Hôspital” 是错的:它要么是“Hospital”,要么是“Hôpital”。这位著名的侯爵使用了后者的拼写。