如何测试给定的参数是否为数字,以便应用不同的样式?如果不是,则忽略...例如:
\domorestuffifnumber{things} -> things
\domorestuffifnumber{123} -> \emph{123}
谢谢。
答案1
这是一个稍微有缺陷的东西,但比你要求的稍微更通用一点。
\documentclass{article}
\usepackage{etoolbox}
\makeatletter
\newcommand\ifnumber[1]{%
\begingroup
\edef\temp{#1}%
\expandafter\ifstrempty\expandafter{\temp}
{\endgroup\@secondoftwo}
{\expandafter\ifnumber@i\temp\@nnil}%
}
\def\ifnumber@i#1#2\@nnil{%
\if-#1%
\ifstrempty{#2}
{\def\temp{X}}
{\def\temp{#2}}%
\else
\def\temp{#1#2}%
\fi
\afterassignment\ifnumhelper
\count@0\temp\relax\@nnil
\endgroup
}
\def\numrelax{\relax}%
\def\ifnumhelper#1\@nnil{%
\def\temp{#1}%
\ifx\temp\numrelax
\aftergroup\@firstoftwo
\else
\aftergroup\@secondoftwo
\fi
}
\makeatother
\newcommand\testnumber[1]{#1: \ifnumber{#1}{Number}{Not a number}\par}
\begin{document}
\def\foo{-55}
\testnumber{1234}
\testnumber{\foo}
\testnumber{-}
\testnumber{}
\testnumber{1}
\testnumber{1234abc}
\testnumber{abc1234}
\end{document}
通过检查参数扩展中的第一个标记是否为,这有点复杂-
。不幸的是,如果参数是寄存器,它就不起作用。(在其他情况下可能也不起作用。)
但从\ifnumber
宏观上看,您应该很容易就能构建您想要的东西。
\newcommand\domorestuffifnumber[1]{\ifnumber{#1}{\emph{#1}}{#1}}
答案2
\documentclass{article}
\def\isnum#1{%
\if!\ifnum9<1#1!\fi%
\emph{#1}%
\else#1%
\fi}
\begin{document}
\isnum{dummy}
\isnum{123}
\end{document}
如果#1
是数字,则有\ifnum9<1xxx
,为真,因此为空,这导致\if!!
,也为真,并且\emph{#1}
是输出。在另一种情况下,我们有(#1 mybe 0a)
\ifnum9<10a
,为真,剩下a
。因此我们比较,这是错误的,这就是为什么现在部分是输出的\if!a
原因。\else
警告:不适用于数字 > 999999999。
答案3
LuaTeX 解决方案:
\documentclass{article}
\begin{document}
\directlua{ dofile("myluastuff.lua") }
\newcommand\domorestuffifnumber[1]{%
\directlua{
domorestuffifnumber("#1")
}}
\def\foo{-55}
\domorestuffifnumber{1234}
\domorestuffifnumber{\foo}
\domorestuffifnumber{-}
\domorestuffifnumber{}
\domorestuffifnumber{1}
\domorestuffifnumber{1234abc}
\domorestuffifnumber{abc1234}
\end{document}
和myluastuff.lua
文件:
function domorestuffifnumber( arg )
if tonumber(arg) then
tex.sprint("\\emph{" .. arg .. "}")
else
tex.sprint(arg or "")
end
end
我认为该解决方案非常易读。
答案4
该xstring
包提供了两个命令:\IfInteger
和\IfDecimal
。它们每个都使用语法
\IfInteger{<value being tested>}{<result if true>}{<result if false>}
如果你不想区分整数和小数,我们可以这样做
\documentclass{article}
\usepackage{xstring}
\newcommand{\DoStuff}[1]{\emph{#1}}
\newcommand{\IfNumber}[1]
{%
\IfInteger{#1}
{\DoStuff{#1}}
{%
\IfDecimal{#1}
{\DoStuff{#1}}
{#1}%
}%
}
\begin{document}
\IfNumber{123}
\IfNumber{123.123}
\IfNumber{abc}
\end{document}