我正在使用一个函数来对类似论文中的数字进行求和,并且我在参数中的输入如下:
\showsum{123+456}
我需要代替自定义函数与来自包xlop
-的其他函数。我想要相同的函数名,但和\opadd
中有两个独立的参数\opadd
我想{123+456}
用来\opadd
争论. 如何制作这个分隔符?
\documentclass{article}
\usepackage{xlop}
\usepackage{amsmath}
\usepackage{setspace}
\newcommand{\showsum}[2][c]{%
$\edef\originalplusmathcode{\the\mathcode`+}%
\begingroup\lccode`~=`+ \lowercase{\endgroup\def~}{\\\mathchar\originalplusmathcode&}%
\edef\originalminusmathcode{\the\mathcode`-}%
\begingroup\lccode`~=`- \lowercase{\endgroup\def~}{\\\mathchar\originalminusmathcode&}%
\mathcode`+ "8000
\mathcode`- "8000
\begin{array}[#1]{@{}r@{\;}r@{}}
& #2 \\
\hline
& \the\numexpr#2\relax
\end{array}%
$%
}
\begin{document}
Original function(don't need anymore)\showsum{123+456}
\\
\\
Replacement needed \opadd{123}{456}
\end{document}
答案1
您可以使用带有分隔参数的宏:
\documentclass{article}
\usepackage{xlop}
\newcommand{\showsum}[1]{\doshowsum#1\doshowsum}
\def\doshowsum#1+#2\doshowsum{\opadd{#1}{#2}}
\begin{document}
\showsum{123+456} \qquad \opadd{123}{456}
\end{document}
您还可以支持减法:
\documentclass{article}
\usepackage{xparse}
\usepackage{xlop}
\ExplSyntaxOn
\NewDocumentCommand{\showsum}{m}
{
\regex_match:nnTF { \+ } { #1 }
{
\simeon_showsum:nnn { #1 } { \+ } { opadd }
}
{
\simeon_showsum:nnn { #1 } { \- } { opsub }
}
}
\cs_new_protected:Nn \simeon_showsum:nnn
{
\tl_set:Nn \l_tmpa_tl { #1 }
% remove all spaces
\regex_replace_all:nnN { \s } { } \l_tmpa_tl
% replace <number>+<number> with \opadd{<number>}{<number>} or
% replace <number>-<number> with \opsub{<number>}{<number>}
\regex_replace_once:nnN
{ \A ([^#2]*) #2 (.*) \Z }
{ \c{#3}\cB\{\1\cE\}\cB\{\2\cE\} }
\l_tmpa_tl
% deliver the result
\tl_use:N \l_tmpa_tl
}
\ExplSyntaxOff
\begin{document}
\showsum{123+456} \qquad \showsum{456-123}
\end{document}