\let-number 检查器

\let-number 检查器

有没有一种安全的方法来检查某个宏输入是否是数字\let?例如,假设我们说\let\foo=1,是否可以定义一个宏\isnumber来确定是否\foo是数字?(\isnumber\foo{true}{false}

答案1

冒着暴露我记忆力差的风险,我记得这个问题已经从原来的形式发生了变化。在这里,我使用 David 的想法来尝试重构你原始问题的答案,这绕过了\let变量不能在\ifnum上下文中使用的限制。

\testdigit宏测试以下标记是否是实际数字、\defed 数字,\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}

相关内容