我正在尝试让 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
。
您应该使用尾随可选参数,而不是这样做
\def\strA{\StrSubstitute{...}{...}{...}}
您必须注意不要进行不必要的扩展:使用该
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}