有没有一种安全的方法来检查某个宏输入是否是数字\let
?例如,假设我们说\let\foo=1
,是否可以定义一个宏\isnumber
来确定是否\foo
是数字?(\isnumber\foo{true}{false}
)
答案1
冒着暴露我记忆力差的风险,我记得这个问题已经从原来的形式发生了变化。在这里,我使用 David 的想法来尝试重构你原始问题的答案,这绕过了\let
变量不能在\ifnum
上下文中使用的限制。
该\testdigit
宏测试以下标记是否是实际数字、\def
ed 数字,或\let
数字。唯一含糊不清的结果(如果您希望将其称为)是,如果下一个标记已被\def
转换为多位字母数字组合。在这种情况下,测试是在 的第一个标记上执行的\def
。
\documentclass{article}
\def\thedigit#1{%
\ifx0#10\else\ifx1#11\else\ifx2#12\else
\ifx3#13\else\ifx4#14\else\ifx5#15\else
\ifx6#16\else\ifx7#17\else\ifx8#18\else
\ifx9#19\else\detokenize\expandafter{#1}%
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi}
\def\testdigit#1{\if\relax\ifnum9>1\thedigit#1\relax F\fi\relax T\else F\fi}
\begin{document}
1 \testdigit1
2 \testdigit\section
3 \def\zzz{5}\testdigit\zzz
4 \def\zzz{56}\testdigit\zzz
5 \let\zzz7\testdigit\zzz
6 \testdigit t
7 \testdigit\relax
\end{document}
答案2
我认为在很多情况下这种区别没什么用,但这可能满足了人们的要求:
从第一个测试可以看出,隐式和显式数字字符都是如此,如果需要,可以区分它们。(例如比较的输出\string
)
\documentclass{article}
\begin{document}
\makeatletter
\def\isdigit#1{%
\if y\ifx0#1y\else\ifx1#1y\else\ifx2#1y\else
\ifx3#1y\else\ifx4#1y\else\ifx5#1y\else
\ifx6#1y\else\ifx7#1y\else\ifx8#1y\else
\ifx9#1y\else n%
\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi}
1 \isdigit1{1 yes}{1 no}
2 \isdigit\section{section yes}{section no}
3 \def\zzz{5}\isdigit\zzz{def 5 yes}{def 5 no}
4 \let\zzz7\isdigit\zzz{let 7 yes}{let 7 no}
5 \isdigit t{t yes}{t no}
\end{document}