我一直在尝试弄清楚如何为我的问题创建一个标记系统,并在摘要表中显示结果(见附图)。
我有一个如下所示的示例 .tex 文件。
\documentclass{exam}
\begin{document}
\begin{questions}
\question[1] \tag{Algebra}
This is Question 1. This is tagged against Algebra.
\question[2] \tag{Equations}
This is Question 2.This is tagged against Equations.
\question[2] \tag{Data}
This is Question 3.This is tagged against Data.
\question[1] \tag{Algebra}
This is Question 4. This is tagged against Algebra.
\question[2] \tag{Algebra}
This is Question 5.This is tagged against Algebra.
\question[2] \tag{Data}
This is Question 6.This is tagged against Data.
\end{questions}
\end{document}
我想使用标签系统生成如下的汇总表。我想要的结果是:
答案1
此解决方案需要您提供标签列表按显示顺序。没有标签或不在列表中的问题将被忽略(已计算的总分除外)。
此版本仅在问题之后有效。如果您想要在问题之前获得摘要,您还需要将标签放入辅助文件中。
\documentclass[addpoints]{exam}
\usepackage{tikz}% foreach and pgfmath
\newcommand{\tag}[1]{\expandafter\gdef\csname tagofq@\roman{question}\endcsname{#1}}
\makeatletter
\newcommand{\taglist}[1]{% #1 = comma delimmited list of tags (in order) for summary
\@ifundefined{exam@numquestions}{}{%
\bgroup% use local definitions
\lineskip=0pt
\noindent
\fbox{\parbox[t][1cm][t]{4cm}{\strut Tag}}\hspace{-\fboxrule}%
\fbox{\parbox[t][1cm][t]{4cm}{\strut Question}}\hspace{-\fboxrule}%
\fbox{\parbox[t][1cm][t]{4cm}{\strut Points}}\newline
\foreach \x in {#1} {\count1=0
\let\qlist=\empty
\edef\pointsum{0}%
\loop\ifnum\count1<\exam@numquestions\relax
\advance\count1 by 1
\@ifundefined{tagofq@\@roman\count1}{}{%
\edef\thistag{\csname tagofq@\@roman\count1\endcsname}%
\ifx\x\thistag\relax
\ifx\empty\qlist\relax
\edef\qlist{\the\count1}%
\else
\edef\qlist{\qlist, \the\count1}%
\fi
\edef\thispoints{\csname pointsofq@\@roman\count1\endcsname}%
\pgfmathparse{int(\pointsum+\thispoints)}%
\let\pointsum=\pgfmathresult
\fi}%
\repeat
\vskip-\fboxrule\noindent
\fbox{\parbox[t][1cm][t]{4cm}{\strut\x}}\hspace{-\fboxrule}%
\fbox{\parbox[t][1cm][t]{4cm}{\strut\qlist}}\hspace{-\fboxrule}%
\fbox{\parbox[t][1cm][t]{4cm}{\strut\pointsum}}\newline}%
\vskip-\fboxrule\noindent
\fbox{\parbox[t][1cm][t]{4cm}{\strut Total}}\hspace{-\fboxrule}%
\fbox{\parbox[t][1cm][t]{4cm}{\strut}}\hspace{-\fboxrule}%
\fbox{\parbox[t][1cm][t]{4cm}{\strut\exam@numpoints}}
\egroup}}
\makeatother
\begin{document}
\begin{questions}
\question[1] \tag{Algebra}
This is Question 1. This is tagged against Algebra.
\question[2] \tag{Equations}
This is Question 2.This is tagged against Equations.
\question[2] \tag{Data}
This is Question 3.This is tagged against Data.
\question[1] \tag{Algebra}
This is Question 4. This is tagged against Algebra.
\question[2] \tag{Algebra}
This is Question 5.This is tagged against Algebra.
\question[2] \tag{Data}
This is Question 6.This is tagged against Data.
\end{questions}
\taglist{Algebra,Data,Equations}
\end{document}
答案2
当切换到包时,你很可能会成功,这是同一作者xsim
的延续:exsheets
https://ctan.org/pkg/xsim。这似乎是最适合的一个https://ctan.org/topic/exam。
虽然文档这本书太过复杂,我建议从头到尾通读一遍,跳过所有细节,只了解整体思路。它旨在提供练习-解决方案对(如果需要),包括标记。下载 github 代码并查看 /doc/examples 也是一个好主意。
在我评论下面的代码之前,先说几点:
- 如果你想将“练习”重命名为“问题”,请参阅第 6 章“新练习类型”;你可能可以跳过那里介绍的许多代码
- 不要害怕“模板”,这只是创建自己的布局和内容的另一种方式;如手册所示,它们使用了很多基本的 Latex 命令
- 它提供了一些循环命令,让您可以访问您创建的每个练习对象,并根据需要提取信息(参见下面的第一个示例)
在下面的代码中,我将您的问题改写为 xsim-speak,其中第一个问题显示了您可能想要或可能不想使用的一些功能。我最后展示了 xsim 中的练习-解决方案对。
第一条\gradingtable
语句水平打印,而更简单的一条语句垂直打印。您可能需要修改这一点,即重写为 xsim 模板以满足您的需求。
最后几行告诉你我迄今为止失败的尝试以接近您想要的输出。主要是手册中的信息对我来说不够,示例并没有真正涵盖它,到目前为止,互联网搜索也没有太大帮助。但也许一些更有使用 xsim 经验的成员可以提供帮助。
所以,对我来说,xsim 似乎确实提供了您逐步创建结果所需的一切...只是我对这个包还不够熟悉 ;-)
\documentclass[12pt]{article}
\usepackage{xsim}
\xsimsetup{
solution/print = true
}
\begin{document}
% your examples
\begin{exercise}[ subtitle={About algebra}, % showing some features
points=1,
bonus-points=1,
tags={Algebra}]
This is Question 1. This is tagged against Algebra.
Tag set is: \GetExerciseProperty{tags}
\end{exercise}
%
\begin{exercise}[points=2]%,tags={Equations}]
This is Question 2. This is tagged against Equations.
\end{exercise}
%
\begin{exercise}[points=2, tags={Data}]
This is Question 3. This is tagged against Data.
\end{exercise}
%
\begin{exercise}[points=1, tags={Algebra}]
This is Question 4. This is tagged against Algebra.
\end{exercise}
%
\begin{exercise}[points=2, tags={Algebra}]
This is Question 5. This is tagged against Algebra.
\end{exercise}
%
\begin{exercise}[points=2, tags={Data}]
This is Question 6. This is tagged against Data.
\end{exercise}
% ~~~ an exercise with solution
\begin{exercise}
A first example for an exercise.
\end{exercise}
%
\begin{solution}
A first example for a solution.
\end{solution}
% this is standard (hor)
\gradingtable[template=default*]
% this is simpler (vert)
\gradingtable
> > > >
% here I failed so far
% \begin{tabular}
\ForEachExerciseTag{Data}{\ListExerciseTags{Data}{,}}
%\ListExerciseTags{Data}{&}
% \end{tabular}
> > > >
\end{document}
结果:
附言:在这里,我将补充可能从进一步的评论中出现的新见解。
一条建议:同时阅读 pdf 手册和 xsim 源代码;代码查找相关部分,手册查找所有 xsim 命令。在我的系统中,可以在以下位置找到 4 个源文件C:\AppData\Local\Programs\MiKTeX\tex\latex\xsim。使用 Notepad++ 之类的编辑器,打开这 4 个文件并在所有打开的文件中找到您感兴趣的搜索词(使其快速而简单)。// 确保不要修改这些文件(!)
B.\gradingtable\NewDocumentCommand
:它在 中被定义为xsim.sty
。此处仅供参考。要修改,请参阅第 12 章“评分表”。它旨在编写您自己的模板并将其指定给此命令,如\gradingtable[type=myTable]
。如何创建和插入您自己的模板myTable
(您想要的摘要表)请参阅第 13 章“设置练习模板的样式”。
C. 模板“机制”:参考 Notepad++ 或类似搜索。您可以在、和DeclareExerciseEnvironmentTemplate
中找到手册中提到的所有模板。同样,这只是为了看看所有这些 xsim 命令是如何应用的。请参阅xsim.sty
xsim.style.layouts.code.tex
xsim-manual.cls
A。以上。这应该给你一些想法,如何设计你的预期myTable
,见B.。
D. xsim 作为工具箱:就像 Latex 一样,xsim 旨在成为一个工具箱。即它提供这些练习和解决方案对象以及它们的所有内部信息。您可以通过 xsim 命令访问它们的内容...并使用此信息起草表格,就像您在示例中所做的那样。而且它非常强大。
E. 改变例子:复制和修改示例是一个好主意,可以在/doc/示例来自 github(见上文),例如更改练习-解决方案对的顺序、删除部分、添加愚蠢的文本标记、引入标签或 xsim 命令。这样,您就可以更好地了解事物的工作原理以及需要满足哪些要求。