![自定义考试类别评分表:如何访问自定义命令的 numinrange](https://linux22.com/image/436165/%E8%87%AA%E5%AE%9A%E4%B9%89%E8%80%83%E8%AF%95%E7%B1%BB%E5%88%AB%E8%AF%84%E5%88%86%E8%A1%A8%EF%BC%9A%E5%A6%82%E4%BD%95%E8%AE%BF%E9%97%AE%E8%87%AA%E5%AE%9A%E4%B9%89%E5%91%BD%E4%BB%A4%E7%9A%84%20numinrange.png)
我如何获取输出\numqinrange
并在自己的自定义命令中使用它?
我为考试类创建了一个自定义评分表。这样我就可以向用于评分考试的表格中添加自定义元素。我的考试 latex 文件中的所有内容都是自动的(问题总数、每部分的分数等),从而减少将来考试时用户的错误。但是,目前,为了使用我的自定义\GradingTable
命令,您必须输入问题范围的开始和结束。我怎样才能使它自动化?由于\numqinrange
输出我需要的精确数字,因此将其放入命令中会很好\GradingTable
。
我尝试过很多解决方案,包括\expandafter
,但我对 LaTeX 不够熟悉,无法使其发挥作用。
这是一个最小工作示例:
\documentclass[12pt, addpoints]{exam}
% Grading Table Packages
\usepackage{makecell}
\usepackage{adjustbox}
\usepackage{forloop}
\usepackage{xfp}
\begin{document}
\begin{questions}
\section*{Section A}
\label{section-a}
\begingradingrange{seca}
\question[4] Question Text
\question[7] Question Text
\endgradingrange{seca}
\section*{Section B}
\label{section-b}
\begingradingrange{secb}
\question[2] Question Text
\question[8] Question Text
\endgradingrange{secb}
\end{questions}
\newcounter{QNum}
\newcommand{\InnerContent}[2]{
\forloop{QNum}{#1}{\value{QNum} < \fpeval{#2+1}}
{ \\\hline
$\theQNum$ &
\pointsofquestion{\value{QNum}} &
\makecell{\vspace{-1mm} \\ ------ \\ \vspace{-1mm}} &
\makecell{\vspace{-1mm} \\ ------ \\ \vspace{-1mm}}}
}
\newcommand{\GradingTable}[3]{
\adjustbox{valign=t}{
\begin{tabular}{|c|c|c|c|} \hline
\multicolumn{4}{|c|}{#1} \\\hline
Q & P & M1 & M2%
\InnerContent{#2}{#3}
\\\hline
\end{tabular}
}
}
% These numbers: "1,2,3,4" are hard coded. How can I use the "numinrange" to automate this?
\GradingTable{Section A}{1}{2}
\GradingTable{Section B}{3}{4}
% This does not work
% \GradingTable{Section A}{1}{\numqinrange{seca}}
\end{document}
任何帮助都值得感激。谢谢。
劳埃德
答案1
我重写了一些\InnerContent
,所以现在您可以使用\GradingTable{<title of the table>}{<range>}
。
例如,\GradingTable{Section A}{seca}
会生成第一个表格,其中范围内的问题编号会自动填入。
第一次将编译三次来构建表。
(为了测试目的添加了一个问题和起始问题编号)
\documentclass[12pt, addpoints]{exam}
% Grading Table Packages
\usepackage{makecell}
\usepackage{adjustbox}
\usepackage{forloop}
\newcounter{QNum}
%% ************************************ added
\makeatletter
\newcommand{\InnerContent}[1]{% #1 => range name
\@ifundefined{range@#1@firstq}{\\\hline &&&}{%
\forloop{QNum}{\csname range@#1@firstq\endcsname}{\numexpr\value{QNum}-1 <\csname range@#1@lastq\endcsname}
{ \\\hline
\theQNum &
\pointsofquestion{\value{QNum}} &
\makecell{\vspace{-1mm} \\ ------ \\ \vspace{-1mm}} &
\makecell{\vspace{-1mm} \\ ------ \\ \vspace{-1mm}}
}}
}
\makeatother
%%***********************************************
\newcommand{\GradingTable}[2]{% #1 => table title, #2 => range name
\adjustbox{valign=t}{%
\begin{tabular}{|c|c|c|c|} \hline
\multicolumn{4}{|c|}{#1} \\\hline
Q & P & M1 & M2%
\InnerContent{#2}
\\\hline
\end{tabular}
}
}
\begin{document}
\begin{questions}
\addtocounter{question}{5} % added for testing
\section*{Section A}
\label{section-a}
\begingradingrange{seca}
\question[4] Question Text 1
\question[7] Question Text 2
\endgradingrange{seca}
\section*{Section B}
\label{section-b}
\begingradingrange{secb}
\question[2] Question Text 3
\question[8] Question Text 4
\question[10] Question Text 5 % added for testing
\endgradingrange{secb}
\end{questions}
\GradingTable{Section A}{seca}
\bigskip
\GradingTable{Section B}{secb}
\end{document}