我已经实现了几个宏,它们应该能从数字中删除逗号。这是很肮脏的东西,但当输入是数字时它可以工作:
\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 将参数作为标记抓取。以示例输入为例,在第一种情况下,您将扩展\mynumber
为12,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}