一个宏,接受一个数字变量,将其解释为字符串,检查它是否有加号,将其删除,然后将其存储到变量中

一个宏,接受一个数字变量,将其解释为字符串,检查它是否有加号,将其删除,然后将其存储到变量中

我想创建一个\foo接受\newcommand数字变量的宏,例如,\bar它定义为

\newcommand{\bar}{<number>}

并将其解释为字符串,然后检查它是否有加号(+),如果有则将其删除,否则不执行任何操作,然后\bar通过\renewcommand(?)重新定义将字符串存储回变量中。

期望的结果如下。

在此处输入图片描述

\documentclass[oneside,DIV=12]{scrbook}
\usepackage{scrhack}
\usepackage[automark]{scrlayer-scrpage}
\usepackage[english]{babel}
\usepackage[babel]{microtype}
\usepackage{mathtools, amsthm, amssymb}
\usepackage[warnings-off={mathtools-colon,mathtools-overbracket}]{unicode-math}
    \setmathfont{Latin Modern Math}
\usepackage{setspace}\setdisplayskipstretch{}
\usepackage{xparse}

\newcommand{\bari}{}
\newcommand{\barii}{}
\newcommand{\bariii}{}
\newcommand{\testbar}{\[\text{bar}_{\text{i}} = \bari,\, \text{bar}_{\text{ii}} = \barii,\, \text{bar}_{\text{iii}} = \bariii. \]}
\newcommand{\foo}[1]{...}

\begin{document}
\noindent\textbf{Before:}
\renewcommand{\bari}{-2.5}
\renewcommand{\barii}{+7}
\renewcommand{\bariii}{\frac{4}{3}}
\testbar
\textbf{After:}
\foo{\bari}
\foo{\barii}
\foo{\bariii}
\testbar
\end{document}

我该如何定义这样的宏?

答案1

这样做效果还不错:

\makeatletter
\long\def\ahmed#1{\ahmedA#1\relax+\ahmedA #1}
\long\def\ahmedA#1+#2\ahmedA{\ifx\@nnil#1\@nnil \expandafter\@gobble \fi}
\makeatother

\ahmed{123}\ \ahmed{+123}\ \ahmed{+++}\ \ahmed{}

输出

稍加修改,我们就可以让它将结果存储在宏中。

\long\def\ahmed#1#2{\expandafter\def\expandafter#1\expandafter
    {\romannumeral \ahmedA#2\relax+\ahmedA #2}}
\long\def\ahmedA#1+#2\ahmedA{\ifx\@nnil#1\@nnil \expandafter\@firstoftwo \fi \z@}

相关内容