TeX 宏和命令扩展?

TeX 宏和命令扩展?

我已经实现了几个宏,它们应该能从数字中删除逗号。这是很肮脏的东西,但当输入是数字时它可以工作:

\removecommas{12,34,56.7} % => 123456.7

但是当输入某些命令时它会停止工作,例如:

\newcommand\mynumber{12,34,56.7}
\removecommas\mynumber

为什么会发生这种情况?如何强制 TeX\mynumber在逗号前扩展?我试过:

\expandafter\removecommas\mynumber

但这似乎没有帮助。

答案1

您即将完成

\expandafter\removecommas\mynumber

需要的是一个组:

\expandafter\removecommas\expandafter{\mynumber}

要理解原因,您必须记住 TeX 将参数作为标记抓取。以示例输入为例,在第一种情况下,您将扩展\mynumber12,34,56.7。然后 TeX 将 抓取1为 的参数\removecommas,不出所料,实际上什么也没有发生。另一方面,在组到位的情况下, 的所有 都12,34,56.7被 抓取\removecommas,并且处理将按您的意愿进行。

(请注意,我们需要两个\expandafter原语。第二个原语用于扩展{。)

答案2

如果您只需要最多一个级别的扩展,那么可以这样做:

\def\removecommas{\begingroup\catcode`,=9 \doremove}
\def\doremove#1{\scantokens\expandafter{#1\endinput}\endgroup}

答案3

其他答案解释了宏扩展。但是,如果您只想删除数字中的逗号,则可以使用numprint包裹使用以下设置:

\documentclass{article}
\usepackage{numprint}

\makeatletter%
\renewcommand*\nprt@dotlist{.}% only . for decimal separator in input
\renewcommand*\nprt@ignorelist{,}% ignore , in input
\npdecimalsign{\ensuremath{.}}% use . as decimal output
\npthousandsep{}%
\makeatother%

\begin{document}
\numprint{12,34,56.7}
\end{document}

相关内容