替换参数中的字符 - 即使在其他命令中

替换参数中的字符 - 即使在其他命令中

我需要用其他字符替换作为参数给出的所有字符,进行某种音译。

这个答案提供了一种与 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}

相关内容