LaTeX调用calculator包处理条件数值运算报错求助
你的判断完全准确:ifthen包的\ifthenelse命令本身是为排版分支设计的,不会直接返回可被运算命令识别的纯数值。它的内部逻辑包含不可完全展开的分支控制标记,当你把\ProficiencyBonus传给calculator包的\ADD命令时,运算流程读不到完整的有效数字,就会触发Missing number, treated as zero和非法单位的报错。
你之前用\show、\meaning看不到有效结果也很正常:这两个命令只会展示宏的原始定义,不会把宏完全展开后显示实际输出的内容。
把不可展开的\ifthenelse替换成TeX原生支持完全展开的数值条件原语\ifnum即可,修复后的最小可运行示例如下:
\documentclass{article} \usepackage{calculator} \begin{document} \newcommand\Level{3} % 用可完全展开的\ifnum做数值分支判断,输出纯数字结果 \newcommand\ProficiencyBonus{% \ifnum\Level<5 2\else 3\fi } \newcommand\AbilityScore{% \ADD{\ProficiencyBonus}{10}{\TMP}% \TMP% } Level: \Level \\ Proficiency Bonus: \ProficiencyBonus \\ Ability Score: \AbilityScore \end{document}
编译后可以正常输出Ability Score: 12的结果,没有报错。
排查LaTeX宏展开/数值运算类问题,可以用以下方法:
- 强制展开后再查看宏内容:不要直接
\show原宏,先用\edef把宏做一次完全展开存入临时变量,再查看临时变量的内容,示例:
编译时控制台会直接打印\edef\tempdebug{\ProficiencyBonus} \show\tempdebug\tempdebug展开后的实际内容,用你原来的出错代码测试,就能看到\ProficiencyBonus展开后残留了\ifthenelse的内部控制逻辑,不是纯数字。 - 做数值类分支判断时,优先选用可完全展开的命令:如果只是简单的整数判断,用原生
\ifnum即可;如果要做更复杂的逻辑、浮点运算,推荐直接用LaTeX3的expl3模块,不需要额外加载calculator、ifthen包,逻辑更稳定,更适合你要做的类电子表格自动计算模板,示例:\documentclass{article}
\ExplSyntaxOn
% 定义变量和计算逻辑,所有命令均可完全展开,无展开残留问题
\newcommand\Level{3}
\newcommand\ProficiencyBonus{\int_compare:nNnTF {\Level} < {5} {2} {3}}
\newcommand\AbilityScore{\int_eval:n {\ProficiencyBonus + 10}}
\ExplSyntaxOff
\begin{document}
Level: \Level \
Proficiency Bonus: \ProficiencyBonus \
Ability Score: \AbilityScore
\end{document}
内容的提问来源于stack exchange,提问作者bloxx

