我有一个格式为 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
和#1
。0
第二#2
个0
将保留在输入流中,您将获得
\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。