我正在创建一个问题集,每个问题都有一个提示。我想将提示列表与问题列表分开。像这样:
问题 1
问题 2
问题 3
提示 1
提示 2
提示 3
会有 42 道题目。我还不确定它们的顺序。我可以简单地为题目和提示创建带有计数器的单独环境。但是当我切换题目时,我也需要切换提示。
我只是好奇是否有可能创建这样的环境,使我能够将问题陈述和提示放在一起,即使它们将在不同的部分呈现。
答案1
带有 的版本expl3
,将问题和提示内容存储在不同的属性列表中,然后按顺序或仅从中选择一部分提取它们。
\DefineProblem{foo}[foo hint]
将定义问题及其提示,\ProblemDisplay*
将显示所有问题,\ProblemDisplay[select={1,3}]
将仅显示问题1
和3
。这也会填充要显示的列表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}