该函数应该输出\alpha+2
输入,\alpha+1
但我无法在不弄乱符号部分的情况下将 +1 添加到输入的数字部分。到目前为止,我有这样的事情:
\newcommand{func}[1]{#1+1}
func[\alpha+1]
>>\alpha+1+1
答案1
\documentclass{article}
\ExplSyntaxOn
\seq_new:N\l_func_seq
\cs_new_protected:Npn\func#1{
\regex_extract_once:nnNTF
{^(.*[\+]\ *)?(\d+)\ *$}
{#1}
\l_func_seq
{
\seq_item:Nn\l_func_seq{2}
\int_eval:n{\seq_item:Nn\l_func_seq{3}+1}
}
{#1+1}
}
\ExplSyntaxOff
\newcommand\test[1]{#1 :\quad \func{#1}}
\begin{document}
\test{3}
\test{42}
\test{-3}
\test{x}
\test{x+2}
\test{x+22}
\end{document}
这实际上并不解释表达式,但尝试确保安全,因此 -3 变为 -3+1 。基本上,如果表达式全是数字或结尾+
后跟数字,它只是在数字上加一。
答案2
这只会在(如果存在)处拆分参数+
,并将两者转发到另一个测试两个现在拆分的参数的宏。
当后面的部分+
不是整数时,此操作将会失败。
代码
\documentclass{article}
\usepackage{xstring}
\NewDocumentCommand{\funcA} { > {\SplitArgument{1}{+}} m }{\funcADo#1}
\NewDocumentCommand{\funcADo}{ m m }
{#1+\inteval{\IfNoValueTF{#2}{0}{#2}+1}}
\NewDocumentCommand{\funcB} { > {\SplitArgument{1}{+}} m }{\funcBDo#1}
\NewDocumentCommand{\funcBDo}{ m m }{%
\IfNoValueTF{#2}{%
\IfInteger{#1}
{\inteval{#1+1}}
{#1+1}%
}{#1+\inteval{#2+1}}}
\newcommand*\test[1]{%
\noindent\texttt{\string\funcA\{#1\}}: \funcA{#1}\\
\texttt{\string\funcB\{#1\}}: \funcB{#1}\par\vspace{1ex}}
\begin{document}
\test{3}
\test{42}
\test{-3}
\test{+-3}
\test{4+1}
\test{x}
\test{x+2}
\test{x+22}
\end{document}