我想设置一个 LaTeX 评分模板,其中包含多个类别,模板用户可以使用 AF 单独评分。最终成绩必须计算为这些类别的算术平均值。
我定义了三个函数:
- 将 AF 转换为数值 (
\gradetovalue
)。 - 计算平均值 (
\calculatemean
)。 - 将值转换回等级(
\valuetograde
)。
但是,我不知道如何进行第二步。我查看了包fpeval
中的一些简单用法xfp
,但当参数包含常量以外的其他内容时,我最终只得到了一堆编译错误。
此处有简化的示例:
\documentclass{article}
\usepackage{xstring}
% Definitions %
\newcommand{\gradetovalue}[1]{%
\IfStrEq{#1}{A}{1.0}
{\IfStrEq{#1}{B}{1.5}
{\IfStrEq{#1}{C}{2.0}
{\IfStrEq{#1}{D}{3.0}
{\IfStrEq{#1}{E}{4.0}
{\IfStrEq{#1}{F}{5.0}
{Error}
}}}}}}
\newcommand{\calculatemean}{%
% Return (\gradetovalue{\categoryA} + \gradetovalue{\categoryB} + \gradetovalue{\categoryC}) / 3
}
\newcommand{\valuetograde}[1]{%
\newdimen \x
\x = #1pt
\ifdim \x < 1.24pt A \else
\ifdim \x < 1.74pt B \else
\ifdim \x < 2.44pt C \else
\ifdim \x < 3.44pt D \else
\ifdim \x < 4.44pt E \else F
\fi\fi\fi\fi\fi
}
\newcommand{\finalgrade}{\valuetograde{\calculatemean}}
% User should provide these %
\newcommand{\categoryA}{B}
\newcommand{\categoryB}{A}
\newcommand{\categoryC}{D}
\begin{document}
Grades in categories are: \categoryA, \categoryB, \categoryC. The final grade is \finalgrade.
\end{document}
答案1
您可以用于\dimexpr
此计算,因为您使用的是\x
尺寸。
\def\gradeA{1.0}
\def\gradeB{1.5}
\def\gradeC{2.0}
\def\gradeD{3.0}
\def\gradeE{4.0}
\def\gradeF{5.0}
\def\gradetovalue#1{\csname grade#1\endcsname}
\newdimen\x
\def\finalgrade{%
\x=\dimexpr (\gradetovalue\categoryA pt + \gradetovalue\categoryB pt + \gradetovalue\categoryC pt) / 3 \relax
\ifdim \x < 1.24pt A \else
\ifdim \x < 1.74pt B \else
\ifdim \x < 2.44pt C \else
\ifdim \x < 3.44pt D \else
\ifdim \x < 4.44pt E \else F
\fi\fi\fi\fi\fi
}
\def\categoryA{B}
\def\categoryB{A}
\def\categoryC{D}
Grades in categories are: \categoryA, \categoryB, \categoryC. The final grade is \finalgrade.
\bye
\newdimen
并在宏之外使用。