我该如何创建这个复杂的环境?

我该如何创建这个复杂的环境?

我正在创建一个问题集,每个问题都有一个提示。我想将提示列表与问题列表分开。像这样:

问题 1
问题 2
问题 3

提示 1
提示 2
提示 3

会有 42 道题目。我还不确定它们的顺序。我可以简单地为题目和提示创建带有计数器的单独环境。但是当我切换题目时,我也需要切换提示。

我只是好奇是否有可能创建这样的环境,使我能够将问题陈述和提示放在一起,即使它们将在不同的部分呈现。

答案1

带有 的版本expl3,将问题和提示内容存储在不同的属性列表中,然后按顺序或仅从中选择一部分提取它们。

\DefineProblem{foo}[foo hint]将定义问题及其提示,\ProblemDisplay*将显示所有问题,\ProblemDisplay[select={1,3}]将仅显示问题13。这也会填充要显示的列表hints。没有提示的问题将不会显示。

用于\HintDisplay稍后显示提示。

\documentclass{article}

\usepackage{xparse}

\usepackage[most]{tcolorbox}

\newcounter{prbcntr}
\newcounter{prbdefcntr}


\newtcolorbox[auto counter]{problembox}[1][]{colback=white,enhanced,sharp corners,colbacktitle={yellow},coltitle=black,title={Problem \thetcbcounter},#1}
\newtcolorbox{hintbox}[1][]{colback=white,enhanced,sharp corners,colbacktitle={green},coltitle=black,title={Hint \theprbcntr},#1}

\ExplSyntaxOn

\prop_new:N \g_patrik_problem_prop
\prop_new:N \g_patrik_hint_prop





\cs_generate_variant:Nn \prop_gput:Nnn {Nxn}

\NewDocumentCommand{\DefineProblem}{O{}+m+o}{%
  \refstepcounter{prbdefcntr}%
  \prop_gput:Nxn \g_patrik_problem_prop {defproblem\theprbdefcntr}{#2}
  \IfValueT{#3}{%
    \prop_gput:Nxn \g_patrik_hint_prop {hintproblem\theprbdefcntr}{#3}
  }
}

\keys_define:nn {patrik} {
  select .code:n={\seq_set_from_clist:Nn \l_tmpa_seq {#1}},
  tcolorbox .code:n={\cs_set:Npn \localtcolorboxoptions {#1}}
}

\NewDocumentCommand{\ProblemDisplay}{sO{}}{%
  \group_begin:
  \cs_set:Npn \localtcolorboxoptions {}
  \keys_set:nn {patrik}{#2}
  \IfBooleanTF{#1}{%
    \int_zero:N \l_tmpa_int
    \prop_map_inline:Nn \g_patrik_problem_prop {%
      \int_incr:N \l_tmpa_int
      \seq_gput_right:NV \g_patrik_display_seq {\l_tmpa_int}
      \begin{problembox}[code={\pgfkeysalsofrom{\localtcolorboxoptions}}]
        ##2
      \end{problembox}
    }
  }{%
    \seq_gset_eq:NN \g_patrik_display_seq \l_tmpa_seq
    \seq_map_inline:Nn \g_patrik_display_seq {%
      \begin{problembox}[code={\pgfkeysalsofrom{\localtcolorboxoptions}}]
        \prop_item:Nn \g_patrik_problem_prop {defproblem##1}
      \end{problembox}
    }
  }
  \group_end:
}


\NewDocumentCommand{\HintDisplay}{O{}}{%
  \setcounter{prbcntr}{0}
  \seq_map_inline:Nn \g_patrik_display_seq {%
    \stepcounter{prbcntr}%
    \prop_if_in:NnT \g_patrik_hint_prop {hintproblem##1} {
      \begin{hintbox}[#1]
        \prop_item:Nn \g_patrik_hint_prop {hintproblem##1}
      \end{hintbox}
    }
  }
}





\seq_new:N \g_patrik_display_seq% Stores the number of the displayed problems

\ExplSyntaxOff


\DefineProblem{%
  Proove $E=mc^{2}$
}[Use your brain]

\DefineProblem{%
  Proove that in any rectangular triangle with hypotenuse $c$ and cathetes $a$ and $b$ the theorem of Pythagoras holds: \begin{align}c^{2} &= a^{2} + b^{2}\end{align}
}[Make a sketch]


\begin{document}

\ProblemDisplay*[tcolorbox={colback=yellow!40!white}]

% Or select some of the problems:

%\ProblemDisplay[select={2},tcolorbox={colback=yellow!40!white}]

\HintDisplay





\end{document}

在此处输入图片描述

相关内容