ExSheets 包含问题

ExSheets 包含问题

我有一个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}

相关内容