我想使用该包xstring
创建一个新命令来更改最后一个字符
例如,如果我有 2+,我想显示 2 加,如果是 2-,则显示 2 减,但如果我有 2-3,那么我什么都不想改变
这两个命令\StrSubstitute
和 包\IfEndWith
中的命令xstring
应该可以完成这项工作,但我真的不知道如何编写命令将其应用于所有文档。谢谢帮助
答案1
这是一个合适的正则表达式替换:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\foo}{m}
{
\tl_set:Nn \l_tmpa_tl { #1 }
\regex_replace_once:nnN { (\+|\-) \Z } { \c{gmasa_pm:N} \1 } \l_tmpa_tl
\tl_use:N \l_tmpa_tl
}
\cs_new:Nn \gmasa_pm:N
{
\str_case:nn { #1 }
{
{+}{\nobreakspace plus}
{-}{\nobreakspace minus}
}
}
\ExplSyntaxOff
\begin{document}
\foo{2-}
\foo{2+}
\foo{2-3}
\end{document}
选择一个比 更好的名字\foo
。
搜索位于字符串末尾的+
或,因为匹配输入字符串的末尾(为此,您也可以使用更常见的标记)。 这样的或被其自身替换,其前面是,其定义为查看下一个标记并相应地生成或。-
\Z
$
+
-
\gmasa_pm:N
~plus
~minus
不使用正则表达式:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\foo}{m}
{
% print all the items except the last one
\tl_range:nnn { #1 } { 1 } { -2 }
% check the last item; if it is + or -, act accordingly, or just print it
\str_case_e:nnF { \tl_item:nn { #1 } { -1 } }
{
{+}{\nobreakspace plus}
{-}{\nobreakspace minus}
}
{ \tl_item:nn { #1 } { -1 } }
}
\ExplSyntaxOff
\begin{document}
\foo{2-}
\foo{2+}
\foo{2-3}
\end{document}