\ifnum 和实数

\ifnum 和实数

当我对可能参数采用非整数值时出现错误:

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

在此处输入图片描述

相关内容