我有一个database.tex
包含大量 ExSheets 包格式的问题和解决方案的大文件。如果我用一个\includequestions
命令包含多个问题,则问题将按照 中的定义顺序包含database.tex
。因此,以下两行没有区别
\includequestions[IDs={q1,q2}]{database.tex}
\includequestions[IDs={q2,q1}]{database.tex}
如果我想要一个特定的顺序或问题,我需要多个\includequestions
命令:
\includequestions[IDs={q2}]{database.tex}
\includequestions[IDs={q1}]{database.tex}
但是database.tex
因为内容比较多,而且我想按一定的顺序包含6个或更多的问题,所以排版需要1分钟以上,有没有更好更快的方法?
更新:我忘了说我使用自定义标题来表示问题和解决方案(为了简单起见,我只给出了问题标题的代码):
...
\begin{question}[ID=q1,subtitle={T1}]
...
\def\loesung{}
\ExplSyntaxOn
\DeclareInstance{exsheets-heading}{myhead}{default}{
number-post-code = {\hspace{1em}\textbf{\tl_use:N \l__exsheets_questions_subtitle_tl}~%
\ifdef{\loesung}{\color{blue}\tiny(\texttt{\tl_use:N \l__exsheets_questions_id_tl})}{}
} ,
join = {
title[r,B]number[l,B](.333em,0pt)
} ,
attach = {
main[l,vc]title[l,vc](0pt,0pt)
}
}
\ExplSyntaxOff
\RenewQuSolPair
{question}[][headings=myhead]
{solution}[][headings=myhead]
如果我使用@cgnieder 的答案,我会得到:
答案1
这是一个可能的解决方法:想法是包含问题但隐藏它们,即,不打印任何内容。exsheets
然后问题属性允许有选择地打印所需的部分。
警告:下面的代码是使用内部函数的黑客攻击,因此它可能会在未来的版本中失效
exsheets
......
为了在包含时隐藏问题,需要一些技巧:
\cs_new_protected:Npn \hidequestions
{
\keys_set:nn {exsheets}
{
headings=blank ,
skip-below=0pt
}
\cs_set:Npn \__exsheets_save_and_print_question_body:n ##1
{ \exsheets_set_question_properties:n { question-body = {##1} } }
\cs_set_eq:NN \exsheets_h_or_vspace:N \use_none:n
}
打印问题需要做一点工作(但这次不使用内部函数,因此以下内容可以安全使用)。想法是映射逗号分隔的 ID 列表,并为每个 ID 打印一个问题,其中包含每个 ID 的原始问题的问题主体。问题必须获得0
积分值和奖励积分(如果没有给出积分)以避免错误,这意味着我们需要先检查它们。
\tl_new:N \l_exsheets_this_question_points_tl
\tl_new:N \l_exsheets_this_question_bonus_tl
\cs_new_protected:Npn \printquestions #1
{%
\clist_map_inline:nn {#1}
{
% check if points are given or unknown,
% if yes feed `0' to the heading:
\prop_get:NnNF \g__exsheets_question_property_points_prop
{##1}
\l_exsheets_this_question_points_tl
{ \tl_set:Nn \l_exsheets_this_question_points_tl {0} }
% same for bonus points
\prop_get:cnNF {g__exsheets_question_property_bonus-points_prop}
{##1}
\l_exsheets_this_question_bonus_tl
{ \tl_set:Nn \l_exsheets_this_question_bonus_tl {0} }
% typeset the question:
\begin{question}{
\l_exsheets_this_question_points_tl +
\l_exsheets_this_question_bonus_tl
}
\exsheets_get_question_property:nn {question-body} {##1}
\end{question}
}
}
exercises.tex
使用上面定义的函数和包含以下内容的文件
\begin{question}[ID=q1]
Q1
\end{question}
\begin{question}[ID=q2]
Q2
\end{question}
\begin{question}[ID=q3]
Q3
\end{question}
文件主体
\begin{document}
\printquestions{q3,q1}
\hidequestions
\includequestions{exercises.tex}
\end{document}
给出
警告:这种方法有一些缺点
- 最值得注意的是:
\totalpoints
你的朋友会计算两次问题的分数:一次是包含在内时,第二次是打印出来时。 \ForEachQuestion
会因为同样的原因循环回答问题两次。- 其他我还没想到的……
完整代码:
\documentclass{article}
\usepackage{exsheets}
\usepackage{filecontents}
\begin{filecontents*}{exercises.tex}
\begin{question}[ID=q1]
Q1
\end{question}
\begin{question}[ID=q2]
Q2
\end{question}
\begin{question}[ID=q3]
Q3
\end{question}
\end{filecontents*}
\DeclareInstance{exsheets-heading}{blank}{default}{
inline = true ,
above = 0pt ,
below = 0pt ,
}
\ExplSyntaxOn
\cs_new_protected:Npn \hidequestions
{
\keys_set:nn {exsheets}
{
headings=blank ,
skip-below=0pt
}
\cs_set:Npn \__exsheets_save_and_print_question_body:n ##1
{ \exsheets_set_question_properties:n { question-body = {##1} } }
\cs_set_eq:NN \exsheets_h_or_vspace:N \use_none:n
}
\tl_new:N \l_exsheets_this_question_points_tl
\tl_new:N \l_exsheets_this_question_bonus_tl
\cs_new_protected:Npn \printquestions #1
{%
\clist_map_inline:nn {#1}
{
% check if points are given or unknown, if yes feed `0' to the heading:
\prop_get:NnNF \g__exsheets_question_property_points_prop
{##1}
\l_exsheets_this_question_points_tl
{ \tl_set:Nn \l_exsheets_this_question_points_tl {0} }
% same for bonus points
\prop_get:cnNF {g__exsheets_question_property_bonus-points_prop}
{##1}
\l_exsheets_this_question_bonus_tl
{ \tl_set:Nn \l_exsheets_this_question_bonus_tl {0} }
\begin{question}{
\l_exsheets_this_question_points_tl+\l_exsheets_this_question_bonus_tl
}
\exsheets_get_question_property:nn {question-body} {##1}
\end{question}
}
}
\ExplSyntaxOff
\begin{document}
\printquestions{q3,q1}
\hidequestions
\includequestions{exercises.tex}
\end{document}