我问了一个问题几个月前,我使用考试文档类调整了成绩表设置,并在此基础上做了大量工作一个答案提供。今天我更新了我的发行版(MiKTeX)以安装最新的 exam.cls 文件(我运行的是 MiKTeX 版本 2.9 和 exam.cls 版本 2.6),现在我的文档遇到了以下问题:
错误: ! Class exam Error: The number of columns in a table must be positive. (exam)
下面是链接答案中的代码,它将重现该错误。我的问题只是如何创建一个解决方法,以便我仍然可以编译我创建的现在遇到此问题的大量文档。
\documentclass[addpoints]{exam}
\usepackage{twoopt}
\makeatletter
\newcommandtwoopt{\emptygradetable}[2][v][questions]{{%
\renewcommand{\pointsofquestion}[1]{}
\renewcommand{\prt@tablepoints}{}
\@scorestrue
\@bonusfalse
\@partialfalse
\@combinedfalse
\ii@gtable{#1}[#2]%
}}
\newcommandtwoopt{\emptybonusgradetable}[2][v][questions]{{%
\renewcommand{\bonuspointsofquestion}[1]{}
\renewcommand{\prt@tablebonuspoints}{}
\@scorestrue
\@bonustrue
\@partialfalse
\@combinedfalse
\ii@gtable{#1}[#2]%
}}
\newcommandtwoopt{\emptypartialgradetable}[3][v][questions]{{%
\renewcommand{\pointsofquestion}[1]{}
\renewcommand{\prt@tablepoints}{}
\@scorestrue
\@bonusfalse
\@partialtrue
\@combinedfalse
\def\tbl@range{#3}%
\ii@gtable{#1}[#2]%
}}%
\newcommandtwoopt{\emptypartialbonusgradetable}[3][v][questions]{{%
\renewcommand{\bonuspointsofquestion}[1]{}
\renewcommand{\prt@tablebonuspoints}{}
\@scorestrue
\@bonustrue
\@partialtrue
\@combinedfalse
\def\tbl@range{#3}%
\ii@gtable{#1}[#2]%
}}%
\makeatother
\begin{document}
\emptygradetable[h]
\bigskip
\emptybonusgradetable[v]
\bigskip
\emptypartialgradetable[h][questions]{myrange}
\bigskip
\emptypartialbonusgradetable[v][questions]{myrange}
\bigskip
\begin{questions}
\question[10] Question 1
\question[20] Question 2
\begingradingrange{myrange}
\bonusquestion[15] Question 3
\question[10] Question 4
\question[15] Question 5
\endgradingrange{myrange}
\end{questions}
\end{document}
添加:我发现版本 2.5的exam.cls
,并且至少有两段代码缺失,现在存在于最新版本(2.603)exam.cls
,但我没有在“2.4 版以来的变更日志”中的任何地方看到对此的记录:
行(2.6 版为第 6218-6236 行):
%--------------------------------------------------------------------
% Check that the number of rows is OK, and compute the number of
% columns:
\def\check@num@rows@h{%
% We get here from \tbl@v@or@h.
% We make sure the number of rows is a positive integer. If it
% is, we go on to \@computenumcols@h
\ifnum \value{num@rows} < 1\relax
\ClassError{exam}{%
The number of rows in a table must be positive.\MessageBreak
}{%
The number of rows must be a positive integer.\MessageBreak
}%
\fbox{\textbf{Error:} Multirow table with no rows!}%
\else
\@computenumcols@h
\fi
}% check@num@rows@h
列(2.6 版为第 6728-6754 行):
% Check that the number of cols is OK, and compute the number of rows:
\def\check@num@cols@v{%
% We get here from \tbl@v@or@h.
% We make sure the number of cols is between 1 and 10 (since we
% can't handle more than 10 cols in a multicolumn table).
% If it is, we go on to \@computenumrows@v
\ifnum \value{num@cols} < 1\relax
\ClassError{exam}{%
The number of columns in a table must be positive.\MessageBreak
}{%
The number of columns must be a positive integer.\MessageBreak
}%
\fbox{\textbf{Error:} Multicolumn table with no columns!}%
\else
\ifnum \value{num@cols} > 10\relax
\ClassError{exam}{%
Multicolumn tables can have at most 10 columns.\MessageBreak
}{%
Multicolumn tables can have at most 10 columns.\MessageBreak
}%
\fbox{\textbf{Error:} Multicolumn table with more than 10 columns!}%
\else
\@computenumrows@v
\fi
\fi
}% check@num@cols@v
添加:我使用 2.5 版运行了上述代码exam.cls
,一切运行正常,但使用 2.6 版时代码显然存在问题。我希望 LaTeX 侦探能够找出问题所在,但我将恢复使用旧版本,exam.cls
直到我自己(不太可能)找出原因或其他人能为我指点迷津。
答案1
从 exam.cls 2.6 版开始,您可以创建多列或多行成绩表或点表,创建单列(或单行)表的旧代码已被删除,取而代之的是使用具有 1 列的多列表和具有 1 行的多行表的代码。您的代码试图通过设置 exam.cls 使用的内部参数来跳过 \gradetable 等命令,希望 exam.cls 不会注意到,但从 2.6 版开始,需要设置额外的参数。
我不建议任何人做你正在做的事情,但是:如果你添加命令
\setcounter{num@cols}{1}
\setcounter{num@rows}{1}
对于所有绕过 \gradetable 等的命令,您的代码都有效。查看 \gradetable、\pointtable 等的定义,看看这些就是您缺少的内容。
编辑,稍后添加:这是一个更好的解决方案。它做的事情和你的代码完全一样,但它更“面向未来”,因为它使用较少的 exam.cls 内部知识。它还可以很好地与 exam class 的 2.5 版和 2.603 版配合使用。
的新定义\emptygradetable
是
\newcommandtwoopt{\emptygradetable}[2][v][questions]{{%
\renewcommand{\pointsofquestion}[1]{}%
\settabletotalpoints{}%
\gradetable[#1][#2]%
}}
如果您检查 的定义\settabletotalpoints
,您会发现它的作用与您之前的命令完全相同。这些新版本的命令也不需要\makeatletter
和\makeatother
。
然后整个 latex 文件
\documentclass[addpoints]{exam}
\usepackage{twoopt}
\newcommandtwoopt{\emptygradetable}[2][v][questions]{{%
\renewcommand{\pointsofquestion}[1]{}%
\settabletotalpoints{}%
\gradetable[#1][#2]%
}}
\newcommandtwoopt{\emptybonusgradetable}[2][v][questions]{{%
\renewcommand{\bonuspointsofquestion}[1]{}%
\settabletotalbonuspoints{}%
\bonusgradetable[#1][#2]%
}}
\newcommandtwoopt{\emptypartialgradetable}[3][v][questions]{{%
\renewcommand{\pointsofquestion}[1]{}%
\settabletotalpoints{}%
\partialgradetable{#3}[#1][#2]%
}}
\newcommandtwoopt{\emptypartialbonusgradetable}[3][v][questions]{{%
\renewcommand{\bonuspointsofquestion}[1]{}%
\settabletotalbonuspoints{}%
\partialbonusgradetable{#3}[#1][#2]%
}}
\begin{document}
\emptygradetable[h]
\bigskip
\emptybonusgradetable[v]
\bigskip
\emptypartialgradetable[h][questions]{myrange}
\bigskip
\emptypartialbonusgradetable[v][questions]{myrange}
\bigskip
\begin{questions}
\question[10] Question 1
\question[20] Question 2
\begingradingrange{myrange}
\bonusquestion[15] Question 3
\question[10] Question 4
\question[15] Question 5
\endgradingrange{myrange}
\end{questions}
\end{document}