当我对可能参数采用非整数值时出现错误:
\documentclass{article}
\def\marks#1{{%
\hskip20pt plus 1 fil (#1 mark\ifnum#1=1\else s\fi)
\parfillskip=0pt\par}}
\begin{document}
Your mark is: \marks{5} % fine
Your mark is: \marks{1} % fine
Your mark is: \marks{0.5} % error !
\end{document}
答案1
经典的方法是使用\ifdim
\ifdim#1pt=1pt \else s\fi
或者\ifx
\def\tempa{#1}\tempb{1}\ifx\tempa\tempb\else s\fi
答案2
\ifnum
只能用于 -2 31 -1 至 2 31 -1 范围内的整数。Dimension 可用于带小数点的数字,同样具有有限的范围(\maxdimen
= 16383.99999 pt)和精度(最小单位为 1 sp = 2 -16 pt)。
例子:
\documentclass[a5paper]{article}
\def\marks#1{{%
\hskip20pt plus 1 fil (#1 mark\ifdim#1pt=1pt \else s\fi)
\parfillskip=0pt\par}}
\begin{document}
Your mark is: \marks{5} % fine
Your mark is: \marks{1} % fine
Your mark is: \marks{0.5} % fine, now
\end{document}
答案3
\ifnum
不能与浮点数一起使用,即,它仅适用于整数值。
有一些方法:使用\ifdim
旁路(如 David Carlisle 和 Heiko Oberdiek 的答案)或检查浮点“实体”的expl3
样式\fp_compare:nNnF
这很容易实现,如果需要的话,可以扩展以解决更复杂的问题,例如添加/乘以标记等。
\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
% expl3 direct access
\cs_new:Nn \check_marks:n{
\fp_compare:nNnF {#1} = {1} {s}
}
% expl3 wrapper/importer macro that can be used outside of \ExplSyntaxOn...\ExplSyntaxOff
\newcommand{\checkmarks}[1]{%
\check_marks:n{#1}
}
\ExplSyntaxOff
\def\marks#1{{%
\hskip20pt plus 1 fil (#1 mark\checkmarks{#1})
\parfillskip=0pt\par}
}
\begin{document}
Your mark is: \marks{5} % fine
Your mark is: \marks{1} % fine
Your mark is: \marks{0.5} % fine
Your mark is: \marks{1.4141362} % fine
\end{document}