考虑以下 MWE:
\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\answergrid}{ m m m }{
\begin{tikzpicture}[x=0.75cm,baseline]
\seq_set_split:Nnn \splitted_seq{;}{#3}
\newcounter{answer}
\int_step_inline:nnnn {1} {1} {#2} {
\stepcounter{answer}
\node[draw,circle,inner~sep=1pt,anchor=base] at (##1,0) {\Alph{answer}};}
\int_step_inline:nnnn {1} {1} {#1} {
\int_step_inline:nnnn {1} {1} {#2} {
\int_compare:nNnTF {####1} = {\seq_item:Nn \splitted_seq {#1-##1+1}} {
\node[fill=black!10,draw,circle,inner~sep=1pt,anchor=base] at (####1, 0) {\Alph{answer}};
}{
}
}
}
\end{tikzpicture}
}
\ExplSyntaxOff
\begin{document}
\par
\begin{enumerate}
\item \answergrid {1} {4} {2}
\item \answergrid {1} {4} {2}
\end{enumerate}
\end{document}
汲取灵感使用 xparse 包的多项选择题,我尝试编辑代码,以便能够生成答题卡答案。它只用一行就可以工作,但如果我尝试添加第二行,就会出现错误。我知道我遗漏了计数器的一些内容,但不确定是什么。
请注意,它没有打印正确的答案,并且多次使用该命令会产生奇怪的交互。
答案1
我感觉代码有点太复杂了,好像要\item \answergrid {1} {4} {2}
输出四个圆圈(A)到(D),然后标记第二个。
然后,我不太确定,但看起来链接的代码也提供了标记多个答案的可能性,因此\item \answergrid {1} {4} {1;2}
会标记四个圆圈中的前两个。但是,我认为,与其\int_step_inline:nnnn
像你那样嵌套几个,不如使用\seq_if_in:NnTF
,这样可以大大简化代码。
下面的代码正是这样做的。另外,作为一种附加功能,如果您说\item \answergrid {2} {4} {3}
,代码将输出三个圆圈 (B)、(C) 和 (D),并标记中间的圆圈。
请注意,您可能应该遵守expl3
命名约定:
\documentclass{article}
\usepackage{tikz}
\ExplSyntaxOn
\newcounter{answer}
\NewDocumentCommand{\answergrid}{ m m m }{
\begin{tikzpicture}[x=0.75cm, baseline]
\seq_set_split:Nnn \l_azetina_answers_split_seq { ; } { #3 }
\setcounter{answer}{ \int_eval:n { #1 - 1 } }
\int_step_inline:nnnn { \int_eval:n { \value{answer} + 1 } } { 1 } { #2 } {
\stepcounter{answer}
\seq_if_in:NnTF \l_azetina_answers_split_seq { ##1 } {
\tikzset{answer~node/.style={fill=gray!20}}
}{
\tikzset{answer~node/.style={fill=none}}
}
\node[answer~node, draw, circle, inner~sep=1pt, anchor=base] at (##1, 0) {\Alph{answer}};
}
\end{tikzpicture}
}
\ExplSyntaxOff
\begin{document}
\begin{enumerate}
\item \answergrid {1} {4} {1;2}
\item \answergrid {1} {4} {2}
\item \answergrid {2} {4} {3}
\end{enumerate}
\end{document}