我想创建一个\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@}