我正在尝试创建漂亮的 Mcq(多项选择题)答案网格,所以有人能帮助我改进它以满足以下需求:
- 添加参数以获取网格表中的自动行列号
- 自动标记正确答案
\ding{53}
输入将类似于\McqAnswerGrid{<number of questions>}{<number of choices>}{<correct cells>}
按<number of choices>
字母顺序列举的列表,并且<correct cells>
包含可能的正确选择的列表。
下面是一个输入参数的示例,您可以自行创建或使用该示例进行调整:
标出所有适用的答案
\McqAnswerGrid{6}{6}{ {1,2,3},{1,6},{1,3},{2,3},{2,4},{2,4} }
意味着我们有 6 个问题,每个问题有 6 个选项 A、B、C、D、E 和 F,其中答案适用于
问题 1 是 1、2 和 3
第 2 题是 1 和 6
问题 3 是 1 和 3
问题 4 是 2 和 3
第 5 题是 2 和 4
第 6 题是 2 和 4
选择一个答案选项
\McqAnswerGrid{5}{4}{ {1},{1},{3},{2},{4} }
意味着我们有 5 个问题,每个问题有 4 个选项 A、B、C 和 D,其中正确答案为
问题 1 是 1
第 2 题是 1
第 3 题是 3
第 4 题是 2
第 5 题是 4
请注意,大多数书籍为多项选择题提供了 4 个选项,而其他书籍可能最多提供 5 个或 6 个选项,因此最大选项数至少为 6 个,最大问题数至少为 80 个。
起初我尝试过,tikz
但tabular
手动填充需要花费很多时间。
这是我的代码:
\documentclass{article}
\usepackage{tikz}
\newcounter{row}
\newcounter{col}
\usepackage{tabu}
\usepackage{pifont}
\begin{document}
\begin{center}
\begin{tikzpicture}[scale=.4]
\begin{scope}
\draw (0, 0) grid (5,10);
\end{scope}
\end{tikzpicture}
\end{center}
\begin{tabular}{|c|c|c|c|c|c|c|}
\hline
N & A & B & C & D & E & F \\ \hline
1 & \ding{53} & \ding{53} & \ding{53} & & & \\ \hline
2 & \ding{53} & & & & & \ding{53}\\ \hline
3 & \ding{53} & & \ding{53} & & & \\ \hline
4 & & \ding{53} & \ding{53} & & & \\ \hline
5 & & \ding{53} & & \ding{53} & & \\ \hline
6 & & \ding{53} & & \ding{53} & & \\ \hline
\end{tabular}
\begin{tabular}{|c|c|c|c|c|}
\hline
N & A & B & C & D \\ \hline
1 & \ding{53} & & & \\ \hline
2 & \ding{53} & & & \\ \hline
3 & & & \ding{53} & \\ \hline
4 & & \ding{53} & & \\ \hline
5 & & & & \ding{53} \\ \hline
\end{tabular}
\end{document}
如果有人不能通过这些参数输入来解决这个问题,那么您可以想出一个解决方案来解决该问题。
答案1
以下示例提供了\McqAnswerGrid{<rows>}{<columns>}{<answer spec>}
和 重复项\McqOneAnswerGrid
(纯粹是因为它们可能表示不同的含义)。它们彼此重复,因为它们都使用相同的样式输入:
\documentclass{article}
\usepackage{multido,xparse}
\DeclareRobustCommand{\correctsymbol}{$\times$}
\makeatletter
\NewDocumentCommand{\row@column@element}
{ m }
{\@namedef{row@element@\therow@cnt @#1}{\correctsymbol}}
\DeclareDocumentCommand{\process@columns}
{ > { \SplitList { , } } m }
{\stepcounter{row@cnt}\ProcessList{#1}{\row@column@element}}%
\DeclareDocumentCommand{\process@rows}%
{ > { \SplitList { , } } m }
{\ProcessList{#1}{\process@columns}}
\newcounter{row@cnt}
\newcommand{\McqAnswerGrid}[3]{{%
\def\row@elements{N}% Top left entry
\let\tabularline\relax% Create non-expandable \tabularline (will be used later)
\multido{\iColumn=1+1}{#2}{% Create first row
\protected@xdef\row@elements{\row@elements & \@Alph{\iColumn}}}%
% Construct the top row of answer grid
\g@addto@macro\row@elements{ \\ \tabularline}% Add line
\setcounter{row@cnt}{0}%
\process@rows{#3}%
\multido{\iRow=1+1}{#1}{%
\protected@xdef\row@elements{\row@elements \iRow}
\multido{\iColumn=1+1}{#2}{%
\protected@xdef\row@elements{\row@elements &
\ifcsname row@element@\iRow @\iColumn\endcsname
\csname row@element@\iRow @\iColumn\endcsname
\fi}%
}%
\g@addto@macro\row@elements{ \\ \tabularline}%
}%
% Set actual answer grid
\begin{tabular}{ | *{\number\numexpr#2+1}{c|} }
\hline
\global\let\tabularline\hline% Make sure \tabularline is equivalent to \hline
\row@elements
\end{tabular}
}}
\let\McqOneAnswerGrid\McqAnswerGrid
\makeatother
\begin{document}
\McqAnswerGrid{6}{6}{ {1,2,3},{1,6},{1,3},{2,3},{2,4},{2,4} }
\bigskip
\McqOneAnswerGrid{5}{4}{ {1},{1},{3},{2},{4} }
\end{document}
tabular
我们使用一系列循环构造来自列表处理器的信息。如果指定了,列表处理器将创建一个\row@element@<row>@<column>
包含的宏。否则,宏不存在。在构造的扩展过程中,将测试是否存在,然后使用。\correctsymbol
tabular
\row@element@<row>@<column>
答案2
这是一个 LaTeX 3 解决方案。
它有 3 个参数,分别是行数、列数和要标记的单元格数。它还有一个可选参数,指定表格中第一个问题的编号。这样,您可以将长表格“拆分”为多个较短的表格,并将它们放在一起。
\McqAnswerGrid {5} {6}{ {1,2,3},{1,6},{1,3},{2,3},{2,4} }
\hspace{1cm}
\McqAnswerGrid [6] {5} {6}{ {1,2,3},{1,6},{1,3},{2,3},{2,4} }
\documentclass{article}
\usepackage{xparse}
\usepackage{pifont}
\ExplSyntaxOn
\NewDocumentCommand{\McqAnswerGrid}{ O{1} m m m }{
\begin{tabular}{|c*{#3}{|c}|}
\hline
\tl_clear:N \l_tmpa_tl
\tl_put_right:Nn \l_tmpa_tl {N}
\int_step_inline:nnnn {1} {1} {#3} {\tl_put_right:Nn \l_tmpa_tl {& \int_to_Alph:n{##1}}}
\tl_put_right:Nn \l_tmpa_tl {\\\hline}
\int_step_inline:nnnn {#1} {1} {#1+#2-1} {
\seq_set_split:Nnn \splitted_seq{,}{#4}
\exp_args:NNnx \seq_set_split:Nnn \splitted_again {,} {\seq_item:Nn \splitted_seq {##1-#1+1}}
\tl_put_right:Nn \l_tmpa_tl {##1}
\int_step_inline:nnnn {1} {1} {#3} {
\seq_if_in:NnTF \splitted_again {####1} {
\tl_put_right:Nn \l_tmpa_tl {& \ding{53}}
} {
\tl_put_right:Nn \l_tmpa_tl {& }
}
}
\tl_put_right:Nn \l_tmpa_tl {\\\hline}
}
\tl_use:N \l_tmpa_tl
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\McqAnswerGrid {5} {6}{ {1,2,3},{1,6},{1,3},{2,3},{2,4} }
\hspace{1cm}
\McqAnswerGrid [6] {5} {6}{ {1,2,3},{1,6},{1,3},{2,3},{2,4} }
\end{document}