多子字符串替换

多子字符串替换

我正在尝试让 Werner 自动回答我的问题这里


简而言之,为了Æ Ø Å正确地对挪威语字母(它们位于常规拉丁字母表的末尾)进行排序dtlsort,需要一些帮助。这意味着用 替换æzaø替换zb,等等。

我尝试使用命令执行此xstring操作\StrSubstitute,但它一次只能替换一个字符串,并且似乎不喜欢嵌套。

一次单次通行即可PDFLaTeX


这个 MWE 应该输出zbzazc

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{datatool,xparse}
\usepackage{xstring}

\NewDocumentCommand{\norskletterssub}{m}{%
    \def\strA{\StrSubstitute{#1}{æ}{za}}
    \def\strB{\StrSubstitute{\strA}{ø}{zb}}
    \def\strC{\StrSubstitute{\strB}{å}{zc}}
    \strC
    }

\begin{document}

    \norskletterssub{øæå}

\end{document}

我需要运行多次,因为显然不能保证每个字母只有一个。

此外,不需要检查任何大写字母。

做到这一点的最好方法是什么?

答案1

尽管我完全赞同使用expl3基于的方法,但您可以使用以下方法执行相同操作xstring

  1. 您应该使用尾随可选参数,而不是这样做\def\strA{\StrSubstitute{...}{...}{...}}

  2. 您必须注意不要进行不必要的扩展:使用该utf8选项,非 ASCII 字符本质上是宏,因此\noexpandarg是有序的。

这是代码。

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{datatool,xparse}
\usepackage{xstring}

\NewDocumentCommand{\norskletterssub}{m}{%
  \saveexpandmode\noexpandarg
  \def\tempstring{#1}%
  \xStrSubstitute{\tempstring}{æ}{za}[\tempstring]%
  \xStrSubstitute{\tempstring}{ø}{zb}[\tempstring]%
  \xStrSubstitute{\tempstring}{å}{zc}[\tempstring]%
  \tempstring
  \restoreexpandmode
}
\newcommand*{\xStrSubstitute}{%
  \expandafter\StrSubstitute\expandafter
}

\begin{document}

\norskletterssub{øæå}

\end{document}

在此处输入图片描述

如果你的目的是进行替换,例如使用\IfStrEq,你可以这样做

\NewDocumentCommand{\IfNorskStrEq}{mmmm}{%
  \saveexpandmode\noexpandarg
  \def\tempstring{#1}%
  \xStrSubstitute{\tempstring}{æ}{za}[\tempstring]%
  \xStrSubstitute{\tempstring}{ø}{zb}[\tempstring]%
  \xStrSubstitute{\tempstring}{å}{zc}[\tempstring]%
  \restoreexpandmode
  \IfStrEq{\tempstring}{#2}{#3}{#4}%
}
\newcommand*{\xStrSubstitute}{%
  \expandafter\StrSubstitute\expandafter
}

现在像

\IfNorskStrEq{våkne}}{vzckne}{true}{false}

应评估为真。

答案2

即将推出的 LaTeX3 的编程层expl3为此类任务提供了许多方便的功能。expl3下划线_字符可用于宏名称。我们首先分配一个新的标记列表变量

\tl_new:N \l_azor_string_tl

然后我们定义一个代码级函数,它将标记列表变量设置为输入字符串,然后替换所需的子字符串。

\cs_new_protected:Npn \azor_replace_norsk:n #1
 {
  \tl_set:Nn \l_azor_string_tl { #1 }
  \tl_replace_all:Nnn \l_azor_string_tl { æ } { za }
  \tl_replace_all:Nnn \l_azor_string_tl { ø } { zb }
  \tl_replace_all:Nnn \l_azor_string_tl { å } { zc }
  \tl_use:N \l_azor_string_tl
 }

最后,我们定义了一个文档级函数(即,在键入文档时要使用的函数),它只是使用适当的参数调用代码级函数。

\NewDocumentCommand \norskletterssub { m }
 {
  \azor_replace_norsk:n { #1 }
 }

(不幸的是,整个东西是不可扩展的,即当执行\edef\temp{\norskletterssub{øæå}}\temp不是包含zbzazc,但仍然\norskletterssub {øæå}

\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{xparse}

\ExplSyntaxOn

\tl_new:N \l_azor_string_tl

\cs_new_protected:Npn \azor_replace_norsk:n #1
 {
  \tl_set:Nn \l_azor_string_tl { #1 }
  \tl_replace_all:Nnn \l_azor_string_tl { æ } { za }
  \tl_replace_all:Nnn \l_azor_string_tl { ø } { zb }
  \tl_replace_all:Nnn \l_azor_string_tl { å } { zc }
  \tl_use:N \l_azor_string_tl
 }

\NewDocumentCommand \norskletterssub { m }
 {
  \azor_replace_norsk:n { #1 }
 }

\ExplSyntaxOff

\begin{document}

øæå \norskletterssub{øæå}

\end{document}

在此处输入图片描述

相关内容