我有这个 MWE
\documentclass{article}
\def\posa(#1) {%
\ifx #1+ Plus \else \ifx #1- Minus\else Retry \fi \fi
}
\begin{document}
\posa(+)
\end{document}
将\posa
命令的参数与+
和进行比较-
,我需要删除参数前后的空格,\posa
这样即使我们写道:
\posa( +)
或者\posa(+ )
或者\posa( + )
我们得到Plus
结果(与-相同)
答案1
这里,我使用一个listofitems
包\readlist*
将参数读取为 1 项列表,并删除前导/尾随空格。然后我可以\if
对列表项是+
还是进行(扩展)比较-
。
\documentclass{article}
\usepackage{listofitems}
\def\posa(#1){%
\readlist*\myarg{#1}
\if+\myarg[1]Plus\else \if-\myarg[1]Minus\else Retry \fi\fi
}
\begin{document}
\posa(+)
\posa( -)
\posa(?)
\posa( + )
\end{document}
如果需要进行测试非膨胀型的参数\posa
,那么这就足够了,因为\myarg[1]
当展开两次时,会产生参数的标记(删除前导/尾随空格)。
\documentclass{article}
\usepackage{listofitems}
\def\posa(#1){%
\readlist*\myarg{#1}
\expandafter\expandafter\expandafter\def\expandafter\expandafter\expandafter\tmp%
\expandafter\expandafter\expandafter{\myarg[1]}%
\expandafter\ifx\expandafter+\tmp Plus\else%
\expandafter\ifx\expandafter-\tmp Minus\else Retry \fi\fi%
}
\begin{document}
\posa(+)
\posa( -)
\posa(?)
\posa( + )
\end{document}
在纯 TeX 中,使用\input{listofitems}
而不是\usepackage{listofitems}
。
答案2
答案3
答案4
我们xparse
有更简单的语法:
\documentclass{article}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\posa}{ r() }
{
\str_case_x:nnF { \tl_trim_spaces:n { #1 } }
{
{+}{Plus}
{-}{Minus}
}
{Retry}
}
\ExplSyntaxOff
\begin{document}
X\posa(+)X\posa( +)X\posa(+ )X\posa( + )X
X\posa(-)X\posa( -)X\posa(- )X\posa( - )X
X\posa(=)X\posa( =)X\posa(= )X\posa( = )X
\end{document}