如果参数的最后一个字符是 '+' 或 '-',则更改它

如果参数的最后一个字符是 '+' 或 '-',则更改它

我想使用该包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}

相关内容