我有一个定义
\def\datetoint#1-#2-#3 {#1#2#3}
\def\lastrecorddate@debug{1970-01-01}
\edef\lastrecorddate{\expandafter\datetoint\lastrecorddate@debug{} }
\newcommand*{\record}[2]{%
\edef\currentrecorddate{\datetoint#1 }%
\ifnum\currentrecorddate<\lastrecorddate % <<--- ok
\errmessage{%
...
}%
\fi
...
}
...
\record{2020-09-29}{Lorem ipsum}
它运行没有错误。但如果我在条件中交换命令
\ifnum\lastrecorddate>\currentrecorddate
然后就会出现错误Missing = inserted for \ifnum
。为什么?
答案1
问题{}
在于
\edef\lastrecorddate{\expandafter\datetoint\lastrecorddate@debug{} }
因此,\lastrecorddate
不会扩展为 a <number>
,也无法完成扩展以形成 a <number>
。但是,在测试中, a<number>
必须在比较运算符之前。当放在最后时,您看不到问题,因为它是一个不可扩展的标记,它完成了读取,然后被跳过,因为这里的测试为假。\ifnum
\lastrecorddate
{
<number>
由于 TeX 的解析规则,我建议您使用除空格标记之外的其他标记来标记日期的结束。例如,您可以使用类别代码为 11(字母)的标记\@nil
。@
\documentclass{article}
\makeatletter
\def\datetoint#1-#2-#3\@nil{#1#2#3}
\def\lastrecorddate@debug{1970-01-01}
\edef\lastrecorddate{\expandafter\datetoint\lastrecorddate@debug\@nil}
\newcommand*{\record}[2]{%
\edef\currentrecorddate{\datetoint#1\@nil}%
\ifnum\lastrecorddate>\currentrecorddate\relax % <- finishes a <number> to be extra safe
\errmessage{Fake date?}%
\fi
No error.
}
\makeatother
\begin{document}
\record{2020-09-29}{Lorem ipsum}
\end{document}