考试类别错误与表格中需要正数的行数/列数有关

考试类别错误与表格中需要正数的行数/列数有关

我问了一个问题几个月前,我使用考试文档类调整了成绩表设置,并在此基础上做了大量工作一个答案提供。今天我更新了我的发行版(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.5exam.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}

相关内容