命令顺序和“缺少 = 插入 \ifnum”错误

命令顺序和“缺少 = 插入 \ifnum”错误

我有一个定义

\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}

相关内容