%% %% This is file `problem.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% problem.dtx (with options: `package') %% \ProvidesExplPackage{problem}{2023/03/19}{3.3.0}{Semantic Markup for Problems} \RequirePackage{l3keys2e} \keys_define:nn { problem / pkg }{ notes .default:n = { true }, notes .bool_set:N = \c__problems_notes_bool, gnotes .default:n = { true }, gnotes .bool_set:N = \c__problems_gnotes_bool, hints .default:n = { true }, hints .bool_set:N = \c__problems_hints_bool, solutions .default:n = { true }, solutions .bool_set:N = \c__problems_solutions_bool, pts .default:n = { true }, pts .bool_set:N = \c__problems_pts_bool, min .default:n = { true }, min .bool_set:N = \c__problems_min_bool, %boxed .default:n = { true }, %boxed .bool_set:N = \c__problems_boxed_bool, test .default:n = { true }, test .bool_set:N = \c__problems_test_bool, unknown .code:n = { \PassOptionsToPackage{\CurrentOption}{stex} } } \newif\ifsolutions \ProcessKeysOptions{ problem / pkg } \bool_if:NTF \c__problems_solutions_bool { \solutionstrue }{ \solutionsfalse } \RequirePackage{stex} \AddToHook{begindocument}{ \ExplSyntaxOn\makeatletter \input{problem-english.ldf} \ltx@ifpackageloaded{babel}{ \clist_set:Nx \l_tmpa_clist {\bbl@loaded} \exp_args:NNx \clist_if_in:NnT \l_tmpa_clist {\detokenize{ngerman}}{ \input{problem-ngerman.ldf} } \exp_args:NNx \clist_if_in:NnT \l_tmpa_clist {\detokenize{finnish}}{ \input{problem-finnish.ldf} } \exp_args:NNx \clist_if_in:NnT \l_tmpa_clist {\detokenize{french}}{ \input{problem-french.ldf} } \exp_args:NNx \clist_if_in:NnT \l_tmpa_clist {\detokenize{russian}}{ \input{problem-russian.ldf} } }{} \makeatother\ExplSyntaxOff } \stex_keys_define:nnnn{ problem }{ \tl_set:Nn \l_stex_key_pts_tl 0 \tl_set:Nn \l_stex_key_min_tl 0 \str_clear:N \l_stex_key_name_str \str_clear:N \l_stex_key_mhrepos_str }{ pts .tl_set:N = \l_stex_key_pts_tl, min .tl_set:N = \l_stex_key_min_tl, name .str_set:N = \l_stex_key_name_str, archive .str_set:N = \l_stex_key_mhrepos_str, creators .code:n = {} %imports .tl_set:N = \l__problems_prob_imports_tl, %refnum .int_set:N = \l__problems_prob_refnum_int, }{id,title,style,uses} \newcounter{sproblem}[section] \newcommand\numberproblemsin[1]{ \@addtoreset{sproblem}{#1} \def\thesproblem{\arabic{#1}.\arabic{sproblem}} } \numberproblemsin{section} \newcounter{pts} \newcounter{min} \stex_new_stylable_env:nnnnnnn {problem} {O{}}{ \cs_if_exist:NTF \l_problem_inputproblem_keys_tl { \tl_put_left:Nn \l_problem_inputproblem_keys_tl {#1,} \exp_args:Nno \stex_keys_set:nn{problem}{ \l_problem_inputproblem_keys_tl } }{ \stex_keys_set:nn{problem}{#1} } \refstepcounter{sproblem} \str_if_empty:NT \l_stex_key_name_str { \stex_file_split_off_lang:NN \l__problems_path_seq \g_stex_current_file \seq_get_right:NN \l__problems_path_seq \l_stex_key_name_str } \exp_args:No \stex_module_setup:n \l_stex_key_name_str \stex_if_do_html:T { \exp_args:Nne \begin{stex_annotate_env} { shtml:problem={\l_stex_current_module_str}, shtml:language={ \l_stex_current_language_str}, shtml:signature={\l_stex_key_sig_str} \tl_if_empty:NF \l_stex_metatheory_uri {, shtml:metatheory={\stex_uri_use:N \l_stex_metatheory_uri} } } \stex_annotate_invisible:n{} \tl_if_empty:NF \l_stex_key_title_tl { \exp_args:No \stexdoctitle \l_stex_key_title_tl } } \stex_if_smsmode:F { \str_set_eq:NN \thismoduleuri \l_stex_current_module_str \tl_set_eq:NN \thismodulename \l_stex_key_name_str \tl_set_eq:NN \thistitle \l_stex_key_title_tl \stex_style_apply: \addtocounter{pts}{\l_stex_key_pts_tl} \addtocounter{min}{\l_stex_key_min_tl} \_stex_do_id: \__problems_record_problem: } \stex_reactivate_macro:N \solution \stex_reactivate_macro:N \mcb \stex_reactivate_macro:N \fillinsol \stex_smsmode_do: }{ \stex_close_module: \stex_if_smsmode:F \stex_style_apply: \stex_if_do_html:T{ \end{stex_annotate_env} } }{ \par\noindent\problemheader \bool_if:NT \c__problems_pts_bool { \marginpar{\l_stex_key_pts_tl{}~\problem@kw@points\smallskip} } \bool_if:NT \c__problems_min_bool { \marginpar{\l_stex_key_min_tl{}~\problem@kw@minutes\smallskip} } \\ \stex_ignore_spaces_and_pars: }{ \par\bigskip }{s} \stex_sms_allow_env:n{sproblem} \tl_set:Nn \problemheader { \textbf{\sproblemautorefname{~}\thesproblem \tl_if_empty:NF \thistitle { {~}(\thistitle) } } } \cs_new_protected:Nn \__problems_record_problem: { \exp_args:NNe \iow_now:Nn \@auxout { \problem@restore {\thesproblem}{\l_stex_key_pts_tl}{\l_stex_key_min_tl} } } \cs_new_protected:Npn \problem@restore #1 #2 #3 {} \stex_keys_define:nnnn{ includeproblem }{ \str_clear:N \l_stex_key_mhrepos_str }{ archive .str_set:N = \l_stex_key_mhrepos_str, unknown .code:n = {} }{} \NewDocumentCommand\includeproblem{O{} m}{ \group_begin: \tl_set:Nn \l_problem_inputproblem_keys_tl {#1} \stex_keys_set:nn{includeproblem}{#1} \exp_args:Nno \use:nn{\inputref[}\l_stex_key_mhrepos_str]{#2} \group_end: } \int_new:N \g_problem_id_counter \cs_new_protected:Nn \__problems_solution_start:n { \str_set:Nn \l_stex_key_title_tl {#1} \str_set:Nn \l_stex_key_id_str {#1} \str_if_empty:NT \l_stex_key_id_str { \int_gincr:N \g_problem_id_counter \str_set:Nx \l_stex_key_id_str { SOLUTION_\int_use:N \g_problem_id_counter } } \stex_if_do_html:T{ \begin{stex_annotate_env}{ shtml:solution=\l_stex_key_id_str } } \stex_style_apply: } \stex_new_stylable_env:nnnnnnn { solution }{ O{} }{ \stex_if_do_html:TF{ \__problems_solution_start:n{#1} }{ \ifsolutions \__problems_solution_start:n{#1} \else \setbox\l_tmpa_box\vbox\bgroup \fi } }{ \stex_if_do_html:TF{ \stex_style_apply: \end{stex_annotate_env} }{ \ifsolutions \stex_style_apply: \stex_if_do_html:T{ \end{stex_annotate_env} } \else \egroup \fi } }{ \par\smallskip\hrule\smallskip \noindent\emph{Solution\str_if_empty:NF \l_stex_key_title_tl{ {~}\l_stex_key_title_tl } :~} }{ \par\smallskip\hrule }{} \stex_deactivate_macro:Nn \solution {sproblem~environments} \cs_new_protected:Npn \startsolutions{ \global\solutionstrue } \cs_new_protected:Npn \stopsolutions{ \global\solutionsfalse } \cs_new_protected:Nn \__problems_hint_start:n { \str_set:Nn \l_stex_key_title_tl {#1} \str_set:Nn \l_stex_key_id_str {#1} \str_if_empty:NT \l_stex_key_id_str { \int_gincr:N \g_problem_id_counter \str_set:Nx \l_stex_key_id_str { HINT_\int_use:N \g_problem_id_counter } } \stex_if_do_html:T{ \begin{stex_annotate_env}{ shtml:problemhint=\l_stex_key_id_str } } \stex_style_apply: } \stex_new_stylable_env:nnnnnnn { hint }{ O{} }{ \stex_if_do_html:TF{ \__problems_hint_start:n{#1} }{ \bool_if:NTF \c__problems_hints_bool { \__problems_hint_start:n{#1} }{ \setbox\l_tmpa_box\vbox\bgroup } } }{ \stex_if_do_html:TF{ \stex_style_apply: \end{stex_annotate_env} }{ \bool_if:NTF \c__problems_hints_bool { \stex_style_apply: \stex_if_do_html:T{ \end{stex_annotate_env} } }{ \egroup } } }{ \par\smallskip\hrule\smallskip \noindent\emph{Hint\str_if_empty:NF \l_stex_key_title_tl{ {~}\l_stex_key_title_tl } :~} }{ \par\smallskip\hrule }{} \cs_new_protected:Nn \__problems_exnote_start:n { \str_set:Nn \l_stex_key_title_tl {#1} \str_set:Nn \l_stex_key_id_str {#1} \str_if_empty:NT \l_stex_key_id_str { \int_gincr:N \g_problem_id_counter \str_set:Nx \l_stex_key_id_str { EXNOTE_\int_use:N \g_problem_id_counter } } \stex_if_do_html:T{ \begin{stex_annotate_env}{ shtml:problemnote=\l_stex_key_id_str } } \stex_style_apply: } \stex_new_stylable_env:nnnnnnn { exnote }{ O{} }{ \stex_if_do_html:TF{ \__problems_exnote_start:n{#1} }{ \bool_if:NTF \c__problems_notes_bool { \__problems_exnote_start:n{#1} }{ \setbox\l_tmpa_box\vbox\bgroup } } }{ \stex_if_do_html:TF{ \stex_style_apply: \end{stex_annotate_env} }{ \bool_if:NTF \c__problems_notes_bool { \stex_style_apply: \stex_if_do_html:T{ \end{stex_annotate_env} } }{ \egroup } } }{ \par\smallskip\hrule\smallskip \noindent\emph{Note\str_if_empty:NF \l_stex_key_title_tl{ {~}\l_stex_key_title_tl } :~} }{ \par\smallskip\hrule }{} %% \begin{environment}{gnote} \cs_new_protected:Nn \__problems_gnote_start:n { \str_set:Nn \l_stex_key_title_tl {#1} \str_set:Nn \l_stex_key_id_str {#1} \str_if_empty:NT \l_stex_key_id_str { \int_gincr:N \g_problem_id_counter \str_set:Nx \l_stex_key_id_str { GNOTE_\int_use:N \g_problem_id_counter } } \stex_if_do_html:T{ \begin{stex_annotate_env}{ shtml:problemgnote=\l_stex_key_id_str } } \stex_style_apply: } \stex_new_stylable_env:nnnnnnn { gnote }{ O{} }{ \stex_if_do_html:TF{ \__problems_gnote_start:n{#1} }{ \bool_if:NTF \c__problems_gnotes_bool { \__problems_gnote_start:n{#1} }{ \setbox\l_tmpa_box\vbox\bgroup } } }{ \stex_if_do_html:TF{ \stex_style_apply: \end{stex_annotate_env} }{ \bool_if:NTF \c__problems_gnotes_bool { \stex_style_apply: \stex_if_do_html:T{ \end{stex_annotate_env} } }{ \egroup } } }{ \par\smallskip\hrule\smallskip \noindent\emph{Grading\str_if_empty:NF \l_stex_key_title_tl{ {~}\l_stex_key_title_tl } :~} }{ \par\smallskip\hrule }{} \def\pts#1{ \bool_if:NT \c__problems_pts_bool { \marginpar{#1~\problem@kw@points} } } \def\min#1{ \bool_if:NT \c__problems_min_bool { \marginpar{#1~\problem@kw@minutes} } } \newenvironment{mcb}{\par \stex_if_do_html:T{ \begin{stex_annotate_env}{shtml:multiple-choice-block={}} } \stex_deactivate_macro:Nn \mcb {sproblem~environments} \stex_deactivate_macro:Nn \solution {sproblem~environments} \stex_reactivate_macro:N \mcc \begin{enumerate} }{ \end{enumerate} \stex_if_do_html:T{ \end{stex_annotate_env} } } \stex_deactivate_macro:Nn \mcb {sproblem~environments} \cs_new_protected:Nn \__problems_do_yes_param:Nn { \exp_args:Nx \str_if_eq:nnTF { \str_lowercase:n{ #2 } }{ yes }{ \bool_set_true:N #1 }{ \bool_set_false:N #1 } } \stex_keys_define:nnnn{mcc}{ \tl_clear:N \l_stex_key_feedback_tl \bool_set_false:N \l_stex_key_T_bool \tl_clear:N \l_stex_key_Ttext_tl \tl_clear:N \l_stex_key_Ftext_tl }{ feedback .tl_set:N = \l_stex_key_feedback_tl , T .default:n = { false } , T .bool_set:N = \l_stex_key_T_bool , F .default:n = { false } , F .code:n = {\bool_set_false:N \l_stex_key_T_bool} , Ttext .tl_set:N = \l_stex_key_Ttext_tl , Ftext .tl_set:N = \l_stex_key_Ftext_tl , }{id} \tl_set:Nn \problem_mcc_box_tl { \ltx@ifpackageloaded{amssymb}{$\square$}{ \hbox{\vrule\vbox{\hrule width 6 pt\vskip 6pt\hrule}\vrule} } } \newcommand\mcc[2][]{ \stex_keys_set:nn{mcc}{#1}\par \tl_set:Nn \l_tmpb_tl {~--~ \bool_if:NTF \l_stex_key_T_bool { \tl_if_empty:NTF \l_stex_key_Ttext_tl \problem@kw@correct \l_stex_key_Ttext_tl }{ \tl_if_empty:NTF \l_stex_key_Ftext_tl \problem@kw@wrong \l_stex_key_Ftext_tl } \tl_if_empty:NF \l_stex_key_feedback_tl { \\\emph{\l_stex_key_feedback_tl} } } \tl_set:Nn \l_tmpa_tl { #2 \stex_if_do_html:TF{ \stex_annotate:nn{shtml:mcc-solution={}}{\l_tmpb_tl} }{ \ifsolutions\l_tmpb_tl\fi } } \item[\problem_mcc_box_tl]{}~ \stex_if_do_html:TF{ \stex_annotate:nn{shtml:mcc={ \bool_if:NTF \l_stex_key_T_bool {true}{false} }}{\l_tmpa_tl} }{\l_tmpa_tl} } \stex_deactivate_macro:Nn \mcc {mcb~environments} \newcommand\fillinsol[2][]{ \quad \stex_if_do_html:TF{ \stex_annotate:nn{shtml:fillinsol={}}{ \_stex_annotate_force_break:n{#2} } }{ \ifsolutions \textcolor{red}{\fbox{#2}} \else \fbox{ \tl_if_empty:nTF{#1}{ \phantom{\huge{#2}} }{ \hspace{#1} } } \fi } \quad } \stex_deactivate_macro:Nn \fillinsol {sproblem~environments} \endinput %% %% End of file `problem.sty'.