多项选择题答案表

多项选择题答案表

我正在尝试创建漂亮的 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 个。

起初我尝试过,tikztabular手动填充需要花费很多时间。

这是我的代码:

\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>包含的宏。否则,宏不存在。在构造的扩展过程中,将测试是否存在,然后使用。\correctsymboltabular\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}

相关内容