![一个宏,接受一个数字变量,将其解释为字符串,检查它是否有加号,将其删除,然后将其存储到变量中](https://linux22.com/image/452913/%E4%B8%80%E4%B8%AA%E5%AE%8F%EF%BC%8C%E6%8E%A5%E5%8F%97%E4%B8%80%E4%B8%AA%E6%95%B0%E5%AD%97%E5%8F%98%E9%87%8F%EF%BC%8C%E5%B0%86%E5%85%B6%E8%A7%A3%E9%87%8A%E4%B8%BA%E5%AD%97%E7%AC%A6%E4%B8%B2%EF%BC%8C%E6%A3%80%E6%9F%A5%E5%AE%83%E6%98%AF%E5%90%A6%E6%9C%89%E5%8A%A0%E5%8F%B7%EF%BC%8C%E5%B0%86%E5%85%B6%E5%88%A0%E9%99%A4%EF%BC%8C%E7%84%B6%E5%90%8E%E5%B0%86%E5%85%B6%E5%AD%98%E5%82%A8%E5%88%B0%E5%8F%98%E9%87%8F%E4%B8%AD.png)
我想创建一个\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@}