我需要用其他字符替换作为参数给出的所有字符,进行某种音译。
这个答案提供了一种与 XeLaTeX 和 Unicode 完美配合的解决方案。遗憾的是,它无法替换出现在以下命令中的参数\myreplace
:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\myreplace}{m}
{
\tl_set:Nn \l__maxd_argument_tl { #1 }
\tl_replace_all:Nnn \l__maxd_argument_tl { e } { ẹ }
\tl_replace_all:Nnn \l__maxd_argument_tl { E } { Ẹ }
\tl_use:N \l__maxd_argument_tl
}
\tl_new:N \l__maxd_argument_tl
\ExplSyntaxOff
\begin{document}
\myreplace{Ee} \myreplace{E\emph{e}}
\end{document}
针对所有文本命令的通用解决方案非常棒,但\emph
仅针对我的目的解决它就足够了。
我还想知道是否可以添加一些基本的错误处理,例如,让宏用容易发现的字符(如“???”)替换除指定字符之外的所有字符。
答案1
regex_replace_all:nnN
在这里工作:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\myreplace}{m}
{
\tl_set:Nn \l__maxd_argument_tl { #1 }
\regex_replace_all:nnN { e } { x } \l__maxd_argument_tl
\regex_replace_all:nnN { E } { X } \l__maxd_argument_tl
\tl_use:N \l__maxd_argument_tl
}
\tl_new:N \l__maxd_argument_tl
\ExplSyntaxOff
\begin{document}
\myreplace{Ee} \myreplace{E\emph{e}}
\end{document}
为了使其适用于 pdfLaTeX 中的特殊字符,必须为替换指定正确的类别代码(不要将其与 LuaLaTeX 或 XeLaTeX 一起使用 - 它会引发错误):
\documentclass{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{lmodern}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\myreplace}{m}
{
\tl_set:Nn \l__maxd_argument_tl { #1 }
\regex_replace_all:nnN { e } { \cA(ẹ) } \l__maxd_argument_tl
\regex_replace_all:nnN { E } { \cA(Ẹ) } \l__maxd_argument_tl
\tl_use:N \l__maxd_argument_tl
}
\tl_new:N \l__maxd_argument_tl
\ExplSyntaxOff
\begin{document}
\myreplace{Ee} \myreplace{E\emph{e}}
\end{document}
答案2
这是一个基于 LuaLaTeX 的解决方案。它可以在文本替换操作中处理 utf8 编码的字符,并且可以处理所有嵌入的宏名称,包括\emph
。(唯一的假设是 的参数\myreplace
不包含名称以ẹ
或Ẹ
开头的宏。这不应该是一个约束限制,对吧?)
% !TEX TS-program = lualatex
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
function myreplace ( s )
s = unicode.utf8.gsub ( s, "E", "Ẹ" )
s = unicode.utf8.gsub ( s, "e", "ẹ" )
s = unicode.utf8.gsub ( s , "\\[%aẸẹ]+" ,
function ( x )
x = unicode.utf8.gsub ( x , "ẹ" , "e" )
x = unicode.utf8.gsub ( x , "Ẹ" , "E" )
return ( x )
end )
tex.sprint ( s )
end
\end{luacode*}
\newcommand\myreplace[1]{\directlua{myreplace(\luastringN{#1})}}
\begin{document}
\myreplace{Ee} \myreplace{E\textit{e}\emph{e}\textbf{E}}
\end{document}