失控参数?使用 \def

失控参数?使用 \def

我有一个格式为 HH:MM(即 03:00)的时间值。

我需要计算本次的 TotalMinutes(预期结果 180)。

我现在的代码是

\documentclass{article}

\makeatletter

\newcommand{\timeHHMMToTotalMinutes}[1]%
  {\timeHHMMToTotalMinutes@h#1}%
\def\timeHHMMToTotalMinutes@h#1:#2{\the\numexpr#1*60+#2}%

\makeatother

\begin{document}
\def\tOne{03:00}%
\timeHHMMToTotalMinutes{\tOne}\\%
\end{document}

但不幸的是,它给了我错误:

失控的争论?

\tOne \\end {document}

!扫描使用 \timeHHMMToTotalMinutes@h 时文件结束。

我该如何解决这个问题?我对参数解析有什么误解?

答案1

根据您的定义,输入

\timeHHMMToTotalMinutes{\tOne}

转化为

\timeHHMMToTotalMinutes@h\tOne

由于辅助宏期望看到

<tokens>:<argument>

TeX 会一直寻找冒号,直到找到\par标记或文件末尾。原因是 TeX 不会收集宏参数时进行宏扩展。

因此,您需要\tOne在 TeX 扩展\timeHHMMToTotalMinutes@h并开始寻找其参数之前进行扩展。

无论如何,还有另一个修复方法。如果你定义

\newcommand{\timeHHMMToTotalMinutes}[1]%
  {\expandafter\timeHHMMToTotalMinutes@h#1}

那么你的电话将成为第一个

\expandafter\timeHHMMToTotalMinutes@h\tOne

进而

\timeHHMMToTotalMinutes@h 03:00

收集到的参数将为03#10第二#20将保留在输入流中,您将获得

\the\numexpr#1*60+00

这提供了正确的结果,但只是偶然。类似

\timeHHMMToTotalMinutes{\tOne}23

会让你大吃一惊。最好也划定第二个参数的范围,并\numexpr以结尾\relax

\documentclass{article}

\makeatletter

\newcommand{\timeHHMMToTotalMinutes}[1]{%
  \expandafter\timeHHMMToTotalMinutes@h#1\@nil
}
\def\timeHHMMToTotalMinutes@h#1:#2\@nil{%
  \the\numexpr#1*60+#2\relax
}

\makeatother

\begin{document}

\def\tOne{03:00}%
\timeHHMMToTotalMinutes{\tOne}23

\end{document}

这将打印 18023。您刚刚添加的代码\expandafter将打印 203。

相关内容