diff options
author | Norbert Preining <norbert@preining.info> | 2023-10-17 03:01:53 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2023-10-17 03:01:53 +0000 |
commit | 3e9c5c6e1c118283b7775fd707379f8c9fdd3fd5 (patch) | |
tree | 40f420b2cc25378ebd0cd509854828b1b7aa337f /macros/latex/contrib/stex | |
parent | c4125da665ac93db063e3c177f4fc5d172f5866f (diff) |
CTAN sync 202310170301
Diffstat (limited to 'macros/latex/contrib/stex')
25 files changed, 711 insertions, 264 deletions
diff --git a/macros/latex/contrib/stex/Makefile b/macros/latex/contrib/stex/Makefile index 43942d6051..d12908d2d4 100644 --- a/macros/latex/contrib/stex/Makefile +++ b/macros/latex/contrib/stex/Makefile @@ -4,5 +4,3 @@ MAKEDIRS = source doc all package doc: @for d in $(MAKEDIRS); do (cd $$d && $(MAKE) -$(MAKEFLAGS) $@) || exit $$?; done - ls - pdflatex test.en.tex diff --git a/macros/latex/contrib/stex/doc/packages/stex-problem.tex b/macros/latex/contrib/stex/doc/packages/stex-problem.tex index 81315415a4..75032724f5 100644 --- a/macros/latex/contrib/stex/doc/packages/stex-problem.tex +++ b/macros/latex/contrib/stex/doc/packages/stex-problem.tex @@ -1,10 +1,8 @@ \begin{sfragment}{Introduction} - The \pkg{problem} package supplies an infrastructure that allows specify problem. Problems -are text fragments that come with auxiliary functions: hints, notes, and -solutions\footnote{for the moment multiple choice problems are not supported, but may - well be in a future version}. Furthermore, we can specify how long the solution to a -given problem is estimated to take and how many points will be awarded for a perfect -solution. + The \pkg{problem} package supplies an infrastructure that allows specify problem. + Problems are text fragments that come with auxiliary functions: hints, notes, and + solutions. Furthermore, we can specify how long the solution to a given problem is + estimated to take and how many points will be awarded for a perfect solution. Finally, the \pkg{problem} package facilitates the management of problems in small files, so that problems can be re-used in multiple environment. @@ -48,7 +46,7 @@ so that problems can be re-used in multiple environment. \begin{exnote} Justify your answer \end{exnote} -\begin{solution}[for=elefants] +\begin{solution} Four, two in the front seats, and two in the back. \begin{gnote} if they do not give the justification deduct 5 pts diff --git a/macros/latex/contrib/stex/doc/stex-doc.pdf b/macros/latex/contrib/stex/doc/stex-doc.pdf Binary files differindex a978cbb2e7..1a4a1e5a14 100644 --- a/macros/latex/contrib/stex/doc/stex-doc.pdf +++ b/macros/latex/contrib/stex/doc/stex-doc.pdf diff --git a/macros/latex/contrib/stex/doc/stex-doc.tex b/macros/latex/contrib/stex/doc/stex-doc.tex index 6dbf566c2c..ff82e9457f 100644 --- a/macros/latex/contrib/stex/doc/stex-doc.tex +++ b/macros/latex/contrib/stex/doc/stex-doc.tex @@ -40,6 +40,7 @@ \end{sfragment} \begin{sfragment}{User Manual} + \let\RequirePackage\documentclass \inputref[sTeX/Documentation]{manual} \begin{sfragment}{Additional Packages} diff --git a/macros/latex/contrib/stex/doc/stex-docheader.tex b/macros/latex/contrib/stex/doc/stex-docheader.tex index b8b6313be8..34d3c93eb0 100644 --- a/macros/latex/contrib/stex/doc/stex-docheader.tex +++ b/macros/latex/contrib/stex/doc/stex-docheader.tex @@ -5,7 +5,7 @@ \usepackage[hyperref=auto,style=alphabetic]{biblatex} %\usepackage[mathhub=\stexdocpath/mh,usedeps]{stex} \usepackage[lang={en,de}]{stex} - +\usepackage[show]{ed} \usepackage{rustex} \usepackage{stex-highlighting,stexthm} @@ -36,7 +36,7 @@ \newif\ifhadtitle\hadtitlefalse -\def\stexversion{3.3.0} +\def\stexversion{3.4.0} \def\changedate{\today} \def\stextoptitle#1#2{\title{#1\thanks{Version {\stexversion} (last revised {\changedate})} }\def\thispkg{#2}} @@ -402,4 +402,5 @@ } -\AtBeginDocument{\catcode`_=8}
\ No newline at end of file +\AtBeginDocument{\catcode`_=8} + diff --git a/macros/latex/contrib/stex/doc/stex-manual.pdf b/macros/latex/contrib/stex/doc/stex-manual.pdf Binary files differindex dcc5371fad..f866203912 100644 --- a/macros/latex/contrib/stex/doc/stex-manual.pdf +++ b/macros/latex/contrib/stex/doc/stex-manual.pdf diff --git a/macros/latex/contrib/stex/doc/stex-tutorial.pdf b/macros/latex/contrib/stex/doc/stex-tutorial.pdf Binary files differindex 1c380fadde..c7740a4d90 100644 --- a/macros/latex/contrib/stex/doc/stex-tutorial.pdf +++ b/macros/latex/contrib/stex/doc/stex-tutorial.pdf diff --git a/macros/latex/contrib/stex/source/hwexam.dtx b/macros/latex/contrib/stex/source/hwexam.dtx index 003d8a3d87..783c8c2382 100644 --- a/macros/latex/contrib/stex/source/hwexam.dtx +++ b/macros/latex/contrib/stex/source/hwexam.dtx @@ -41,7 +41,7 @@ % % \begin{macrocode} %<*package> -\ProvidesExplPackage{hwexam}{2023/03/19}{3.3.0}{homework assignments and exams} +\ProvidesExplPackage{hwexam}{2023/10/13}{3.4.0}{homework assignments and exams} \RequirePackage{l3keys2e} \keys_define:nn {hwexam / pkg}{ @@ -63,7 +63,7 @@ \ExplSyntaxOn\makeatletter \input{hwexam-english.ldf} \ltx@ifpackageloaded{babel}{ - \clist_set:Nx \l_tmpa_clist {\bbl@loaded} + \clist_set:Nx \l_tmpa_clist {\exp_args:No \tl_to_str:n \bbl@loaded} \exp_args:NNx \clist_if_in:NnT \l_tmpa_clist {\detokenize{ngerman}}{ \input{hwexam-ngerman.ldf} } @@ -130,10 +130,10 @@ }\par\smallskip \textbf{ \tl_if_empty:NF \l_stex_key_given_tl { - \hwexam@kw@given:~\l_stex_key_given_tl\quad + \hwexam@kw@given :~\l_stex_key_given_tl\quad } \tl_if_empty:NF \l_stex_key_due_tl { - \hwexam@kw@due:~\l_stex_key_due_tl\quad + \hwexam@kw@due :~\l_stex_key_due_tl\quad } } \end{center} @@ -246,26 +246,6 @@ % \end{macrocode} % \end{macro} % -% \begin{macro}{\testemptypage} -% \begin{macrocode} -\newcommand\testemptypage[1][]{% - \bool_if:NT \c__problems_test_bool {\ \vfill\begin{center}\hwexam@kw@testemptypage\end{center}\eject} -} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\testspace} -% \begin{macrocode} -\newcommand\testspace[1]{\bool_if:NT \c__problems_test_bool {\vspace*{#1}}} -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\testnewpage} -% \begin{macrocode} -\newcommand\testnewpage{\bool_if:NT \c__problems_test_bool {\newpage}} -% \end{macrocode} -% \end{macro} -% % % \begin{macrocode} %</package> diff --git a/macros/latex/contrib/stex/source/notesslides.dtx b/macros/latex/contrib/stex/source/notesslides.dtx index c2f9f594c9..31f012240b 100644 --- a/macros/latex/contrib/stex/source/notesslides.dtx +++ b/macros/latex/contrib/stex/source/notesslides.dtx @@ -46,7 +46,7 @@ % \begin{macrocode} %<*cls> %<@@=notesslides> -\ProvidesExplClass{notesslides}{2023/03/19}{3.3.0}{notesslides Class} +\ProvidesExplClass{notesslides}{2023/10/13}{3.4.0}{notesslides Class} \RequirePackage{l3keys2e} \str_const:Nn \c_@@_class_str {article} @@ -93,7 +93,7 @@ % now we do the same for the |notesslides| package. % \begin{macrocode} %<*package> -\ProvidesExplPackage{notesslides}{2023/03/19}{3.3.0}{notesslides Package} +\ProvidesExplPackage{notesslides}{2023/10/13}{3.4.0}{notesslides Package} \RequirePackage{l3keys2e} \keys_define:nn{notesslides / pkg}{ diff --git a/macros/latex/contrib/stex/source/problem.dtx b/macros/latex/contrib/stex/source/problem.dtx index c62a9242ba..9d503e0d52 100644 --- a/macros/latex/contrib/stex/source/problem.dtx +++ b/macros/latex/contrib/stex/source/problem.dtx @@ -19,7 +19,7 @@ % % \begin{stexmanual} % \begin{sfragment}{Problem Manual} - % \input{\stexdocpath/packages/stex-problem} +% \input{\stexdocpath/packages/stex-problem} % \end{sfragment} % \end{stexmanual} % @@ -42,7 +42,7 @@ % \begin{macrocode} %<*package> %<@@=problems> -\ProvidesExplPackage{problem}{2023/03/19}{3.3.0}{Semantic Markup for Problems} +\ProvidesExplPackage{problem}{2023/10/13}{3.4.0}{Semantic Markup for Problems} \RequirePackage{l3keys2e} \keys_define:nn { problem / pkg }{ @@ -74,6 +74,13 @@ }{ \solutionsfalse } +\newif\ifintest +\bool_if:NTF \c_@@_test_bool { + \intesttrue +}{ + \intestfalse +} + \RequirePackage{stex} % \end{macrocode} % @@ -85,7 +92,7 @@ \ExplSyntaxOn\makeatletter \input{problem-english.ldf} \ltx@ifpackageloaded{babel}{ - \clist_set:Nx \l_tmpa_clist {\bbl@loaded} + \clist_set:Nx \l_tmpa_clist {\exp_args:No \tl_to_str:n \bbl@loaded} \exp_args:NNx \clist_if_in:NnT \l_tmpa_clist {\detokenize{ngerman}}{ \input{problem-ngerman.ldf} } @@ -110,16 +117,20 @@ % internal macros. % % \begin{macrocode} +\bool_new:N \l_stex_key_autogradable_bool \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 + \bool_set_false:N \l_stex_key_autogradable_bool }{ 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, + autogradable .bool_set:N = \l_stex_key_autogradable_bool, + archive .code:n = {}, + %archive .str_set:N = \l_stex_key_mhrepos_str, creators .code:n = {} %imports .tl_set:N = \l_@@_prob_imports_tl, %refnum .int_set:N = \l_@@_prob_refnum_int, @@ -142,9 +153,26 @@ % % \begin{environment}{sproblem} % \begin{macrocode} +\cs_new:Nn \_@@_activate_macros: { + \stex_reactivate_macro:N \solution + \stex_reactivate_macro:N \mcb + \stex_reactivate_macro:N \scb + \stex_reactivate_macro:N \fillinsol + \stex_reactivate_macro:N \hint + \stex_reactivate_macro:N \exnote + \stex_reactivate_macro:N \gnote +} + \newcounter{pts} \newcounter{min} +\bool_new:N \l_@@_in_problem_bool +\bool_new:N \l_@@_has_pts_bool +\bool_new:N \l_@@_has_min_bool +\bool_set_false:N \l_@@_in_problem_bool \stex_new_stylable_env:nnnnnnn {problem} {O{}}{ + \bool_if:NT \l_@@_in_problem_bool { + \msg_error:nn{stex}{error/nestedproblem} + } \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}{ @@ -154,60 +182,65 @@ \stex_keys_set:nn{problem}{#1} } \refstepcounter{sproblem} - \str_if_empty:NT \l_stex_key_name_str { - \stex_file_split_off_lang:NN \l_@@_path_seq \g_stex_current_file - \seq_get_right:NN \l_@@_path_seq \l_stex_key_name_str - } - - \exp_args:No \stex_module_setup:n \l_stex_key_name_str \stex_if_do_html:T { + \str_if_empty:NT \l_stex_key_name_str { + \stex_file_split_off_lang:NN \l_@@_path_seq \g_stex_current_file + \seq_get_right:NN \l_@@_path_seq \l_stex_key_name_str + } \exp_args:Nne \begin{stex_annotate_env} { - shtml:problem={\l_stex_current_module_str}, + shtml:problem={\l_stex_key_name_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} - } + shtml:autogradable={\bool_if:NTF \l_stex_key_autogradable_bool {true}{false}} } - \stex_annotate_invisible:n{} \tl_if_empty:NF \l_stex_key_title_tl { \exp_args:No \stexdoctitle \l_stex_key_title_tl } + \stex_annotate_invisible:nn{ + shtml:problempoints={\l_stex_key_pts_tl} + }{ \l_stex_key_pts_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: - \_@@_record_problem: - } - \stex_reactivate_macro:N \solution - \stex_reactivate_macro:N \mcb - \stex_reactivate_macro:N \fillinsol - \stex_smsmode_do: + + \tl_set_eq:NN \thistitle \l_stex_key_title_tl + + \bool_set_true:N \l_@@_in_problem_bool + \tl_set_eq:NN \l_@@_pts_tl \l_stex_key_pts_tl + \tl_set_eq:NN \l_@@_min_tl \l_stex_key_min_tl + \tl_if_eq:NnTF \l_@@_pts_tl {0} + {\bool_set_false:N \l_@@_has_pts_bool} + {\bool_set_true:N \l_@@_has_pts_bool} + \tl_if_eq:NnTF \l_@@_min_tl {0} + {\bool_set_false:N \l_@@_has_min_bool} + {\bool_set_true:N \l_@@_has_min_bool} + \int_gzero:N \g_@@_subproblem_int + + \stex_style_apply: + \_stex_do_id: + \_@@_activate_macros: }{ - \stex_close_module: - \stex_if_smsmode:F \stex_style_apply: + \addtocounter{pts}{\l_@@_pts_tl} + \addtocounter{min}{\l_@@_min_tl} + \_@@_record_problem: + \stex_style_apply: \stex_if_do_html:T{ \end{stex_annotate_env} } }{ \par\noindent\problemheader \bool_if:NT \c_@@_pts_bool { - \marginpar{\l_stex_key_pts_tl{}~\problem@kw@points\smallskip} + \tl_if_eq:NnF \l_@@_pts_tl {0}{ + \marginpar{\l_@@_pts_tl{}~\problem@kw@pts\smallskip} + } } \bool_if:NT \c_@@_min_bool { - \marginpar{\l_stex_key_min_tl{}~\problem@kw@minutes\smallskip} + \tl_if_eq:NnF \l_@@_min_tl {0} { + \marginpar{\l_@@_min_tl{}~\problem@kw@minutes\smallskip} + } } - \\ + \par \stex_ignore_spaces_and_pars: }{ \par\bigskip % \bool_if:NT \c_@@_test_bool \pagebreak }{s} -\stex_sms_allow_env:n{sproblem} \tl_set:Nn \problemheader { \textbf{\sproblemautorefname{~}\thesproblem @@ -219,7 +252,7 @@ \cs_new_protected:Nn \_@@_record_problem: { \exp_args:NNe \iow_now:Nn \@auxout { - \problem@restore {\thesproblem}{\l_stex_key_pts_tl}{\l_stex_key_min_tl} + \problem@restore {\thesproblem}{\l_@@_pts_tl}{\l_@@_min_tl} } } @@ -227,6 +260,73 @@ % \end{macrocode} % \end{environment} % +% \begin{environment}{subproblem} +% \begin{macrocode} +\int_new:N \g_@@_subproblem_int + +\stex_new_stylable_env:nnnnnnn {subproblem} {O{}}{ + \stex_keys_set:nn{problem}{#1} + \bool_if:NF \l_@@_in_problem_bool{ + \ifstexhtml\else + \par{\bfseries WARNING~subproblem~to~be~used~in~some~problem}\par + \fi + \_@@_activate_macros: + \bool_set_true:N \l_@@_in_problem_bool + \tl_set:Nn \l_@@_pts_tl{0} + \tl_set:Nn \l_@@_min_tl{0} + } + \str_if_empty:NT \l_stex_key_name_str { + \stex_file_split_off_lang:NN \l_@@_path_seq \g_stex_current_file + \seq_get_right:NN \l_@@_path_seq \l_stex_key_name_str + } + \stex_if_do_html:T { + \str_if_empty:NT \l_stex_key_name_str { + \stex_file_split_off_lang:NN \l_@@_path_seq \g_stex_current_file + \seq_get_right:NN \l_@@_path_seq \l_stex_key_name_str + } + \exp_args:Nne \begin{stex_annotate_env} { + shtml:subproblem={\l_stex_key_name_str}, + shtml:language={ \l_stex_current_language_str}, + shtml:autogradable={\bool_if:NTF \l_stex_key_autogradable_bool {true}{false}} + } + \stex_annotate_invisible:n{} + \tl_if_empty:NF \l_stex_key_title_tl { + \exp_args:No \stexdoctitle \l_stex_key_title_tl + } + } + \int_gincr:N \g_@@_subproblem_int + \bool_if:NF \l_@@_has_pts_bool { + \tl_gset:Nx \l_@@_pts_tl {\int_eval:n {\l_@@_pts_tl + \l_stex_key_pts_tl}} + } + \bool_if:NF \l_@@_has_min_bool { + \tl_gset:Nx \l_@@_min_tl {\int_eval:n {\l_@@_min_tl + \l_stex_key_min_tl}} + } + \stex_if_smsmode:F \stex_style_apply: +}{ + \stex_if_smsmode:F \stex_style_apply: + \stex_if_do_html:T{ \end{stex_annotate_env} } +}{ + \begin{list}{}{ + \setlength\topsep{0pt} + \setlength\parsep{0pt} + \setlength\rightmargin{0pt} + }\item[\int_use:N \g_@@_subproblem_int .] + \bool_if:NT \c_@@_pts_bool { + \bool_if:NF \l_@@_has_pts_bool { + \marginpar{\smallskip\l_stex_key_pts_tl{}~\problem@kw@pts} + } + } + \bool_if:NT \c_@@_min_bool { + \bool_if:NF \l_@@_has_min_bool{ + \marginpar{\smallskip\l_stex_key_min_tl{}~\problem@kw@minutes} + } + } +}{ + \end{list} +}{} +% \end{macrocode} +% \end{environment} +% % \begin{macro}{\includeproblem} % \begin{macrocode} \stex_keys_define:nnnn{ includeproblem }{ @@ -250,10 +350,17 @@ % \begin{environment}{solution} % \begin{macrocode} \int_new:N \g_problem_id_counter +\dim_new:N \l_stex_key_testspace_dim +\stex_keys_define:nnnn{ solution }{ + \str_clear:N \l_stex_key_answerclass_str + \dim_zero:N \l_stex_key_testspace_dim +}{ + testspace .dim_set:N = \l_stex_key_testspace_dim, + answerclass .str_set:N = \l_stex_key_answerclass_str +}{id,title,style} \cs_new_protected:Nn \_@@_solution_start:n { - \str_set:Nn \l_stex_key_title_tl {#1} - \str_set:Nn \l_stex_key_id_str {#1} + \stex_keys_set:nn{ solution }{#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 { @@ -262,7 +369,8 @@ } \stex_if_do_html:T{ \begin{stex_annotate_env}{ - shtml:solution=\l_stex_key_id_str + shtml:solution=\l_stex_key_id_str, + shtml:answerclass={\l_stex_key_answerclass_str} } } \stex_style_apply: @@ -275,6 +383,8 @@ \ifsolutions \_@@_solution_start:n{#1} \else + \stex_keys_set:nn{ solution }{#1} + \testspace{\l_stex_key_testspace_dim} \setbox\l_tmpa_box\vbox\bgroup \fi } @@ -293,12 +403,14 @@ \fi } }{ - \par\smallskip\hrule\smallskip - \noindent\emph{Solution\str_if_empty:NF \l_stex_key_title_tl{ - {~}\l_stex_key_title_tl + \par\smallskip\rule[.3em]{\linewidth}{0.4pt}\newline\smallskip + \noindent\emph{\problem@kw@solution\tl_if_empty:NF \l_stex_key_title_tl{ + {~}\l_stex_key_title_tl \str_if_empty:NF \l_stex_key_answerclass_str { + (Answer Class: \l_stex_key_answerclass_str) + } } :~} }{ - \par\smallskip\hrule + \par\rule[.3em]{\linewidth}{0.4pt}\newline }{} \stex_deactivate_macro:Nn \solution {sproblem~environments} @@ -318,9 +430,11 @@ % % \begin{environment}{hint} % \begin{macrocode} + +\stex_keys_define:nnnn{ problemenv }{}{}{id,title,style} + \cs_new_protected:Nn \_@@_hint_start:n { - \str_set:Nn \l_stex_key_title_tl {#1} - \str_set:Nn \l_stex_key_id_str {#1} + \stex_keys_set:nn{ problemenv }{#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 { @@ -360,21 +474,21 @@ } } }{ - \par\smallskip\hrule\smallskip - \noindent\emph{Hint\str_if_empty:NF \l_stex_key_title_tl{ + \par\smallskip\rule[.3em]{\linewidth}{0.4pt}\newline\smallskip + \noindent\emph{\problem@kw@hint\tl_if_empty:NF \l_stex_key_title_tl{ {~}\l_stex_key_title_tl } :~} }{ - \par\smallskip\hrule + \par\rule[.3em]{\linewidth}{0.4pt}\newline }{} +\stex_deactivate_macro:Nn \hint {sproblem~environments} % \end{macrocode} % \end{environment} % % \begin{environment}{exnote} % \begin{macrocode} \cs_new_protected:Nn \_@@_exnote_start:n { - \str_set:Nn \l_stex_key_title_tl {#1} - \str_set:Nn \l_stex_key_id_str {#1} + \stex_keys_set:nn{ problemenv }{#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 { @@ -414,26 +528,29 @@ } } }{ - \par\smallskip\hrule\smallskip - \noindent\emph{Note\str_if_empty:NF \l_stex_key_title_tl{ + \par\smallskip\rule[.3em]{\linewidth}{0.4pt}\newline\smallskip + \noindent\emph{\problem@kw@note\tl_if_empty:NF \l_stex_key_title_tl{ {~}\l_stex_key_title_tl } :~} }{ - \par\smallskip\hrule + \par\rule[.3em]{\linewidth}{0.4pt}\newline }{} +\stex_deactivate_macro:Nn \exnote {sproblem~environments} % \end{macrocode} % \end{environment} %% \begin{environment}{gnote} % \begin{macrocode} +\int_new:N \l_@@_anscls_int + \cs_new_protected:Nn \_@@_gnote_start:n { - \str_set:Nn \l_stex_key_title_tl {#1} - \str_set:Nn \l_stex_key_id_str {#1} + \stex_keys_set:nn{ problemenv }{#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 @@ -452,6 +569,7 @@ \setbox\l_tmpa_box\vbox\bgroup } } + \stex_reactivate_macro:N \anscls }{ \stex_if_do_html:TF{ \stex_style_apply: @@ -467,13 +585,59 @@ } } }{ - \par\smallskip\hrule\smallskip - \noindent\emph{Grading\str_if_empty:NF \l_stex_key_title_tl{ + \par\smallskip\rule[.3em]{\linewidth}{0.4pt}\newline\smallskip + \noindent\emph{\problem@kw@grading\str_if_empty:NF \l_stex_key_title_tl{ {~}\l_stex_key_title_tl } :~} }{ - \par\smallskip\hrule + \par\rule[.3em]{\linewidth}{0.4pt}\newline }{} +\stex_deactivate_macro:Nn \gnote {sproblem~environments} + + +\stex_keys_define:nnnn{ anscls }{ + \str_clear:N \l_stex_key_pts_str + \tl_clear:N \l_stex_key_feedback_tl +}{ + pts .str_set:N = \l_stex_key_pts_str, + feedback .tl_set:N = \l_stex_key_feedback_str, + update .code:n = {} +}{id} +\newcommand \anscls [2][] { + \stex_keys_set:nn{ anscls }{#1} + \str_if_empty:NT \l_stex_key_id_str { + \int_incr:N \l_@@_anscls_int + \str_set:Nx \l_stex_key_id_str { + AC\int_use:N \l_@@_anscls_int + } + } + \begin{list}{}{ + \setlength\topsep{0pt} + \setlength\parsep{0pt} + \setlength\rightmargin{0pt} + }\item[\l_stex_key_id_str] + \stex_if_do_html:TF{ + \stex_annotate:nn{ + shtml:answerclass={\l_stex_key_id_str} + \str_if_empty:NF \l_stex_key_pts_str{ + ,shtml:answerclass-pts={\l_stex_key_pts_str} + } + \str_if_empty:NF \l_stex_key_feedback_str{ + ,shtml:answerclass-feedback={\l_stex_key_feedback_str} + } + }{ + #2 + } + }{#2} + \str_if_empty:NF \l_stex_key_pts_str {\par + ~ \problem@kw@points:~\l_stex_key_pts_str + } + \str_if_empty:NF \l_stex_key_feedback_str {\par + ~ \problem@kw@feedback :~\l_stex_key_feedback_str + } + \end{list} +} +\stex_deactivate_macro:Nn \anscls {gnote~environments} % \end{macrocode} % \end{environment} % @@ -482,33 +646,55 @@ % \begin{macrocode} \def\pts#1{ \bool_if:NT \c_@@_pts_bool { - \marginpar{#1~\problem@kw@points} - } + \stex_annotate:nn{shtml:problempoints={#1}}{\marginpar{#1~\problem@kw@pts}} + }\hbox_unpack:N\c_empty_box } \def\min#1{ \bool_if:NT \c_@@_min_bool { - \marginpar{#1~\problem@kw@minutes} - } + \stex_annotate:nn{shtml:problemminutes={}}{\marginpar{#1~\problem@kw@minutes}} + }\hbox_unpack:N\c_empty_box } % \end{macrocode} % % \begin{environment}{mcb} % % \begin{macrocode} -\newenvironment{mcb}{\par +\stex_new_stylable_env:nnnnnnn{mcb}{O{}}{ + \stex_keys_set:nn{style}{#1} \stex_if_do_html:T{ - \begin{stex_annotate_env}{shtml:multiple-choice-block={}} + \tl_set:Nn\problem_mcc_box_tl{} + \exp_args:Nne \begin{stex_annotate_env}{ + shtml:multiple-choice-block={} + \clist_if_empty:NF \l_stex_key_style_clist {, + shtml:styles={\l_stex_key_style_clist} + } + } } \stex_deactivate_macro:Nn \mcb {sproblem~environments} + \stex_deactivate_macro:Nn \scb {sproblem~environments} \stex_deactivate_macro:Nn \solution {sproblem~environments} + \stex_deactivate_macro:Nn \hint {sproblem~environments} + \stex_deactivate_macro:Nn \exnote {sproblem~environments} + \stex_deactivate_macro:Nn \gnote {sproblem~environments} \stex_reactivate_macro:N \mcc - \begin{enumerate} + \cs_set:Nn \_@@_mccline:n{ + \begin{list}{}{ + \setlength\topsep{0pt} + \setlength\parsep{0pt} + \setlength\rightmargin{0pt} + }\item[\problem_mcc_box_tl] ##1 \end{list} + } + \stex_style_apply: }{ - \end{enumerate} + \stex_style_apply: \stex_if_do_html:T{ \end{stex_annotate_env} } -} +}{\par}{}{} +\stexstylemcb[inline]{ + \cs_set:Nn \_@@_mccline:n{\problem_mcc_box_tl{~} #1} +}{} + \stex_deactivate_macro:Nn \mcb {sproblem~environments} % \end{macrocode} % @@ -529,9 +715,7 @@ \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 } , + T .code:n = {\bool_set_true:N \l_stex_key_T_bool} , 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 , @@ -547,8 +731,8 @@ } } \newcommand\mcc[2][]{ - \stex_keys_set:nn{mcc}{#1}\par - \tl_set:Nn \l_tmpb_tl {~--~ + \stex_keys_set:nn{mcc}{#1} + \tl_set:Nn \l_tmpa_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 }{ @@ -558,51 +742,217 @@ \\\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} + + \_@@_mccline:n{ + \stex_if_do_html:TF{ + \stex_annotate:nn{shtml:mcc={ + \bool_if:NTF \l_stex_key_T_bool {true}{false} + }}{ + #2\stex_annotate:nn{shtml:mcc-solution={}}{\l_tmpa_tl} + } }{ - \ifsolutions\l_tmpb_tl\fi + #2\ifsolutions\footnote{\l_tmpa_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} % \end{macrocode} % \end{macro} +% \end{environment} +% +% \begin{environment}{scb} +% +% \begin{macrocode} + +\tl_set:Nn\problem_scc_box_tl{$\bigcirc$} + +\stex_new_stylable_env:nnnnnnn{scb}{O{}}{ + \stex_keys_set:nn{style}{#1} + \stex_if_do_html:T{ + \exp_args:Nne\begin{stex_annotate_env}{ + shtml:single-choice-block={} + \clist_if_empty:NF \l_stex_key_style_clist {, + shtml:styles={\l_stex_key_style_clist} + } + } + \tl_set:Nn\problem_scc_box_tl{} + } + \stex_deactivate_macro:Nn \mcb {sproblem~environments} + \stex_deactivate_macro:Nn \scb {sproblem~environments} + \stex_deactivate_macro:Nn \solution {sproblem~environments} + \stex_deactivate_macro:Nn \hint {sproblem~environments} + \stex_deactivate_macro:Nn \exnote {sproblem~environments} + \stex_deactivate_macro:Nn \gnote {sproblem~environments} + \stex_reactivate_macro:N \scc + \cs_set:Nn \_@@_sccline:n{ + \begin{list}{}{ + \setlength\topsep{0pt} + \setlength\parsep{0pt} + \setlength\rightmargin{0pt} + }\item[\problem_scc_box_tl] ##1 \end{list} + } + \stex_style_apply: +}{ + \stex_style_apply: + \stex_if_do_html:T{ + \end{stex_annotate_env} + } +}{\par}{}{} +\stexstylescb[inline]{ + \cs_set:Nn \_@@_sccline:n{\problem_scc_box_tl{~} #1} +}{} + +\stex_deactivate_macro:Nn \scb {sproblem~environments} +% \end{macrocode} +% +% \begin{macro}{\scc} +% \begin{macrocode} + +\newcommand\scc[2][]{ + \stex_keys_set:nn{mcc}{#1} + \tl_set:Nn \l_tmpa_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} + } + } + + \_@@_sccline:n{ + \stex_if_do_html:TF{ + \stex_annotate:nn{shtml:scc={ + \bool_if:NTF \l_stex_key_T_bool {true}{false} + }}{ + #2\stex_annotate:nn{shtml:scc-solution={}}{\l_tmpa_tl} + } + }{ + #2\ifsolutions\footnote{\l_tmpa_tl}\fi + } + } +} +\stex_deactivate_macro:Nn \scc {scb~environments} + + +\newcommand\yesTnoF{ + \begin{scb}[style=inline] + \scc[T]{yes}~\scc[F]{no} + \end{scb} +} +\newcommand\yesFnoT{ + \begin{scb}[style=inline] + \scc[F]{yes}~\scc[T]{no} + \end{scb} +} +\newcommand\trueTfalseF{ + \begin{scb}[style=inline] + \scc[T]{true}~\scc[F]{false} + \end{scb} +} +\newcommand\trueFfalseT{ + \begin{scb}[style=inline] + \scc[F]{true}~\scc[T]{false} + \end{scb} +} +% \end{macrocode} +% \end{macro} +% \end{environment} % % \begin{macro}{\fillinsol} % \begin{macrocode} +\stex_keys_define:nnnn{fillinsol}{ + \tl_clear:N \l_@@_fillin_solution_tl + \dim_zero:N \l_stex_key_testspace_dim +}{ + testspace .dim_set:N = \l_stex_key_testspace_dim, + exact .code:n = {\_@@_parse_fillin_arg:nnnn{exact}#1 }, + numrange .code:n = {\_@@_parse_fillin_arg:nnnn{numrange}#1 }, + regex .code:n = {\_@@_parse_fillin_arg:nnnn{regex}#1 } +}{} + +\cs_new:Nn \_@@_parse_fillin_arg:nnnn { + \stex_if_do_html:TF{ + \tl_set:Nn \l_tmpa_tl{#3} + \tl_set:Nn \l_tmpb_tl{T} + \stex_annotate_invisible:nn{ + shtml:fillin-case={#1}, + shtml:fillin-case-value={#2}, + shtml:fillin-case-verdict={ + \tl_if_eq:NNTF\l_tmpa_tl\l_tmpb_tl{true}{false} + }, + }{#4} + }{ + \tl_put_right:Nn \l_@@_fillin_solution_tl { + #1{~} & #2{~} & #3{~} & #4{~} \\ + } + } +} + \newcommand\fillinsol[2][]{ \quad + \mode_if_math:TF{ + \hbox{\_@@_fillinsol:nn{#1}{$#2$}} + }{ + \_@@_fillinsol:nn{#1}{#2} + } + \quad +} +\cs_new_protected:Nn \_@@_fillinsol:nn { + \stex_keys_set:nn{fillinsol}{#1} \stex_if_do_html:TF{ - \stex_annotate:nn{shtml:fillinsol={}}{ \_stex_annotate_force_break:n{#2} } + \stex_annotate:nn{shtml:fillinsol={}}{ \_stex_annotate_force_break:n{ + #2 + \l_@@_fillin_solution_tl + } } }{ \ifsolutions \textcolor{red}{\fbox{#2}} - \else - \fbox{ - \tl_if_empty:nTF{#1}{ - \phantom{\huge{#2}} - }{ - \hspace{#1} + \tl_if_empty:NF \l_@@_fillin_solution_tl { + \footnote{ + \halign{ ##\hfil & ##\hfil &##\hfil&##\hfil \cr + \textbf{type }&\textbf{case }&\textbf{verdict }&\textbf{feedback }\cr + \l_@@_fillin_solution_tl + } } } + \else + \fbox{\dim_compare:nNnTF\l_stex_key_testspace_dim={0pt}{ + \phantom{\huge{#2}} + }{ + \hspace{\l_stex_key_testspace_dim} + }} \fi } - \quad } \stex_deactivate_macro:Nn \fillinsol {sproblem~environments} % \end{macrocode} % \end{macro} % -% \end{environment} +% +% \begin{macro}{\testemptypage} +% \begin{macrocode} +\newcommand\testemptypage[1][]{% + \bool_if:NT \c_@@_test_bool {\ \vfill\begin{center}\hwexam@kw@testemptypage\end{center}\eject} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\testspace} +% \begin{macrocode} +\newcommand\testspace[1]{\bool_if:NT \c_@@_test_bool {\vspace*{#1}}} +\newcommand\testsmallspace{\testspace{1cm}} +\newcommand\testmedspace{\testspace{2cm}} +\newcommand\testbigspace{\testspace{3cm}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\testnewpage} +% \begin{macrocode} +\newcommand\testnewpage{\bool_if:NT \c_@@_test_bool {\newpage}} +% \end{macrocode} +% \end{macro} % % % \begin{macrocode} diff --git a/macros/latex/contrib/stex/source/stex.dtx b/macros/latex/contrib/stex/source/stex.dtx index dcbc4dfe7a..b128f38dd1 100644 --- a/macros/latex/contrib/stex/source/stex.dtx +++ b/macros/latex/contrib/stex/source/stex.dtx @@ -36,7 +36,10 @@ %%%%%%%%%%%%% stex.dtx %%%%%%%%%%%%% \RequirePackage{expl3,l3keys2e} -\ProvidesExplClass{stex}{2023/03/19}{3.3.0}{sTeX document class} +\ProvidesExplClass{stex}{2023/10/13}{3.4.0}{sTeX document class} +\IfFileExists{stex-expl-compat.sty}{ + \usepackage{stex-expl-compat} +}{} \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{stex}} \ProcessOptions @@ -52,11 +55,14 @@ % \begin{macrocode} %<*package> \RequirePackage{expl3,l3keys2e,ltxcmds} -\ProvidesExplPackage{stex}{2023/03/19}{3.3.0}{sTeX package} +\ProvidesExplPackage{stex}{2023/10/13}{3.4.0}{sTeX package} +\IfFileExists{stex-expl-compat.sty}{ + \usepackage{stex-expl-compat} +}{} \RequirePackage{stex-logo} % externalized for backwards-compatibility reasons \RequirePackage{standalone} -\message{^^J*~This~is~sTeX~version~3.3.0~*^^J} +\message{^^J*~This~is~sTeX~version~3.4.0~*^^J} % \end{macrocode} % % Package options: @@ -70,6 +76,7 @@ writesms .bool_set:N = \c_stex_persist_write_mode_bool , checkterms .bool_set:N = \c_stex_check_terms_bool , image .bool_set:N = \c_tikzinput_image_bool, + nofrontmatter .bool_set:N = \c_stex_no_frontmatter_bool, unknown .code:n = {} } \exp_args:NNo \clist_set:Nn \c_stex_debug_clist \c_stex_debug_clist @@ -185,11 +192,11 @@ } \exp_args:NNo \clist_if_in:NnTF \c_stex_debug_clist {\tl_to_str:n{all}} { - \msg_redirect_module:nnn{ stex }{ none }{ term } + \msg_redirect_module:nnn{ stex }{ none }{ warning } \stex_debug:nn{all}{Logging~everything!} }{ \clist_map_inline:Nn \c_stex_debug_clist { - \msg_redirect_name:nnn{ stex }{ debug / #1 }{ term } + \msg_redirect_name:nnn{ stex }{ debug / #1 }{ warning } \stex_debug:nn{#1}{Logging~#1} } } @@ -547,8 +554,8 @@ % \begin{macrocode} \cs_new_protected:Nn \stex_deactivate_macro:Nn { \tl_set_eq:cN{\tl_to_str:n{#1}~-~orig}#1 - \tl_set:Nn#1{ - \msg_error:nnnn{stex}{error/deactivated-macro}{\detokenize{#1}}{#2} + \cs_set_protected:Npn#1{ + \exp_args:Nnno\msg_error:nnnn{stex}{error/deactivated-macro}{#1}{#2} } } \cs_new_protected:Nn \stex_reactivate_macro:N { @@ -1915,46 +1922,48 @@ } \AtBeginDocument{ - \cs_if_exist:NTF\frontmatter{ - \let\_@@_orig_frontmatter\frontmatter - \let\frontmatter\relax - }{ - \tl_set:Nn\_@@_orig_frontmatter{ - \clearpage - %\@mainmatterfalse - \pagenumbering{roman} + \bool_if:NF \c_stex_no_frontmatter_bool { + \cs_if_exist:NTF\frontmatter{ + \let\_@@_orig_frontmatter\frontmatter + \let\frontmatter\relax + }{ + \tl_set:Nn\_@@_orig_frontmatter{ + \clearpage + %\@mainmatterfalse + \pagenumbering{roman} + } } - } - \cs_if_exist:NTF\backmatter{ - \let\_@@_orig_backmatter\backmatter - \let\backmatter\relax - }{ - \tl_set:Nn\_@@_orig_backmatter{ - \clearpage - %\@mainmatterfalse - \pagenumbering{roman} + \cs_if_exist:NTF\backmatter{ + \let\_@@_orig_backmatter\backmatter + \let\backmatter\relax + }{ + \tl_set:Nn\_@@_orig_backmatter{ + \clearpage + %\@mainmatterfalse + \pagenumbering{roman} + } } - } - \newenvironment{frontmatter}{ - \_@@_orig_frontmatter - }{ - \cs_if_exist:NTF\mainmatter{ - \mainmatter + \newenvironment{frontmatter}{ + \_@@_orig_frontmatter }{ - \clearpage - %\@mainmattertrue - \pagenumbering{arabic} + \cs_if_exist:NTF\mainmatter{ + \mainmatter + }{ + \clearpage + %\@mainmattertrue + \pagenumbering{arabic} + } } - } - \newenvironment{backmatter}{ - \_@@_orig_backmatter - }{ - \cs_if_exist:NTF\mainmatter{ - \mainmatter + \newenvironment{backmatter}{ + \_@@_orig_backmatter }{ - \clearpage - %\@mainmattertrue - \pagenumbering{arabic} + \cs_if_exist:NTF\mainmatter{ + \mainmatter + }{ + \clearpage + %\@mainmattertrue + \pagenumbering{arabic} + } } } } @@ -2320,7 +2329,10 @@ } \cs_new_protected:Nn \stex_ref_new_sym_target:n { - \exp_args:Ne \label{\tl_to_str:n{sref@sym@ #1}} + \cs_if_exist:NT \hypertarget{ + \exp_args:Ne \hypertarget{\tl_to_str:n{sref@sym@ #1}}{} + \str_gset:cx{\tl_to_str:n{r@sref@sym@ #1}}{\tl_to_str:n{sref@sym@ #1}} + } } \cs_new_protected:Nn \stex_ref_new_sym_target:nn { @@ -2342,8 +2354,8 @@ } \cs_new_protected:Npn \_@@_do_internal_link:nn #1 { - \cs_if_exist:NTF \hyperref { - \hyperref[{#1}] + \cs_if_exist:NTF \hyperlink { + \hyperlink{#1} }\use:n } @@ -2352,7 +2364,7 @@ } \cs_new_protected:Npn \_@@_sym_aux:nn #1 { - \cs_if_exist:cTF{r@sref@sym@\tl_to_str:n{#1}}{ + \cs_if_exist:cTF{\tl_to_str:n{r@sref@sym@#1}}{ \exp_args:Ne \_@@_do_internal_link:nn{\tl_to_str:n{sref@sym@#1}} }{ \str_if_exist:cTF{g_stex_sref_sym_#1_label}{ @@ -2448,9 +2460,9 @@ } }{ \IfFileExists{ \stex_file_use:N \c_stex_mathhub_file / #1 / source / #2 }{ - \par\stex_annotate_invisible:nn{shtml:inputref={ + \ifvmode\noindent\fi\stex_annotate_invisible:nn{shtml:inputref={ \l_tmpa_str / #2 - }}{~} + }}{} }{ \input{ \stex_file_use:N \c_stex_mathhub_file / #1 / source / #2 } } @@ -2536,7 +2548,9 @@ \bool_while_do:nn { ! \seq_if_empty_p:N \l_@@_id_seq }{ \str_set:Nx \l_@@_path_str {\stex_file_use:N \l_@@_path_seq / meta-inf / lib / #1.#2} \IfFileExists{ \l_@@_path_str }{ - \seq_put_right:No \l_@@_libinput_files_seq \l_@@_path_str + \exp_args:NNo \seq_if_in:NnF \l_@@_libinput_files_seq \l_@@_path_str { + \seq_put_right:No \l_@@_libinput_files_seq \l_@@_path_str + } }{} \seq_pop_left:NN \l_@@_id_seq \l_@@_path_str \seq_put_right:No \l_@@_path_seq \l_@@_path_str @@ -2544,7 +2558,9 @@ \str_set:Nx \l_@@_path_str {\stex_file_use:N \l_@@_path_seq / lib / #1.#2} \IfFileExists{ \l_@@_path_str }{ - \seq_put_right:No \l_@@_libinput_files_seq \l_@@_path_str + \exp_args:NNo \seq_if_in:NnF \l_@@_libinput_files_seq \l_@@_path_str { + \seq_put_right:No \l_@@_libinput_files_seq \l_@@_path_str + } }{} } @@ -2637,7 +2653,7 @@ % % \begin{macro}{\libusetikzlibrary} % \begin{macrocode} -\cs_new_protected:Nn \_@@_usetikzlibrary:nn { +\cs_new_protected:Nn \_@@_usetikzlibrary_i:nn { \pgfkeys@spdef\pgf@temp{#1} \expandafter\ifx\csname tikz@library@\pgf@temp @loaded\endcsname\relax% \expandafter\global\expandafter\let\csname tikz@library@\pgf@temp @loaded\endcsname=\pgfutil@empty% @@ -2653,17 +2669,25 @@ \catcode`\$=\csname tikz@library@#1@dollarcode\endcsname } -\cs_new_protected:Npn \libusetikzlibrary #1 { - \cs_if_exist:NF \usetikzlibrary { - \msg_error:nnx{stex}{error/notikz}{\tl_to_str:n{\libusetikzlibrary}} - } +\cs_new_protected:Nn \_@@_usetikzlibrary:n{ \_@@_up_archive:nn{tikzlibrary#1}{code.tex} \int_compare:nNnTF {\seq_count:N \l_@@_libinput_files_seq} = 1 { - \exp_args:Nne \_@@_usetikzlibrary:nn{#1}{ \seq_item:Nn \l_@@_libinput_files_seq 1 } + \exp_args:Nne \_@@_usetikzlibrary_i:nn{#1}{ \seq_item:Nn \l_@@_libinput_files_seq 1 } }{ \stex_fatal_error:nnn{error/nofile}{\libusetikzlibrary}{tikzlibrary#1.code.tex} } } + +\newcommand \libusetikzlibrary [2][] { + \cs_if_exist:NF \usetikzlibrary { + \msg_error:nnx{stex}{error/notikz}{\tl_to_str:n{\libusetikzlibrary}} + } + \tl_if_empty:nTF{#1}{ + \_@@_usetikzlibrary:n{#2} + }{ + \stex_in_archive:nn{#1}{\_@@_usetikzlibrary:n{#2}} + } +} % \end{macrocode} % \end{macro} % @@ -4370,11 +4394,14 @@ \str_clear:N \l_@@_name_str \str_clear:N \l_@@_newname_str \tl_clear:N \l_@@_ass_tl + \stex_debug:nn{morphisms}{Parsing~#1} \exp_args:NNe \seq_set_split:Nnn \l_@@_seq {\tl_to_str:n{@}} {#1} \int_compare:nNnTF {\seq_count:N \l_@@_seq} = 1 { + \stex_debug:nn{morphisms}{No~@} \seq_pop_left:NN \l_@@_seq \l_@@_next_tl }{ \seq_pop_left:NN \l_@@_seq \l_@@_name_str + \stex_debug:nn{morphisms}{Name:~\l_@@_name_str} \exp_args:NNo \str_set:Nn \l_@@_name_str \l_@@_name_str \tl_set:Nx \l_@@_next_tl {\seq_use:Nn \l_@@_seq @} } @@ -4449,7 +4476,7 @@ }{} \stex_deactivate_macro:Nn \interpretmod {module~environments} \stex_every_module:n { - \stex_reactivate_macro:N \iterpretmod + \stex_reactivate_macro:N \interpretmod } \stex_sms_allow_escape:N\interpretmod @@ -4553,12 +4580,14 @@ \tl_clear:N \l_stex_key_type_tl \tl_clear:N \l_stex_key_def_tl \tl_clear:N \l_stex_key_return_tl + \str_clear:N \l_stex_key_wikidata_str \clist_clear:N \l_stex_key_argtypes_clist }{ name .str_set:N = \l_stex_key_name_str , return .tl_set:N = \l_stex_key_return_tl , argtypes .clist_set:N = \l_stex_key_argtypes_clist , + wikidata .str_set:N = \l_stex_key_wikidata_str , type .tl_set:N = \l_stex_key_type_tl , def .tl_set:N = \l_stex_key_def_tl , @@ -4640,6 +4669,9 @@ \str_if_empty:NF \l_stex_macroname_str {, shtml:macroname={\l_stex_macroname_str} } + \str_if_empty:NF \l_stex_key_wikidata_str {, + shtml:wikidata={\l_stex_key_wikidata_str} + } \str_if_empty:NF \l_stex_key_assoc_str {, shtml:assoctype={\l_stex_key_assoc_str} } @@ -5036,7 +5068,11 @@ intent .str_set:N = \l_stex_key_intent_str , argnames .clist_set:N = \l_stex_key_intent_args_clist , unknown .code:n = { - \str_set_eq:NN \l_stex_key_variant_str \l_keys_key_str + \str_if_empty:NTF \l_keys_key_str { + \str_set:Nx \l_stex_key_variant_str {\l_keys_key_tl} + }{ + \str_set_eq:NN \l_stex_key_variant_str \l_keys_key_str + } } }{style} % \end{macrocode} @@ -5368,10 +5404,21 @@ } \cs_new_protected:Nn \_stex_notation_set_default:n{ - \stex_module_add_notation:eoeoo{#1}{} - {\int_use:N \l_stex_get_symbol_arity_int} - \l_stex_notation_macrocode_cs - \l_stex_key_op_tl + \stex_if_in_module:TF{ + \stex_module_add_notation:eoeoo{#1}{} + {\int_use:N \l_stex_get_symbol_arity_int} + \l_stex_notation_macrocode_cs + \l_stex_key_op_tl + }{ + \cs_set_eq:cN {l_stex_notation_ + \l_stex_get_symbol_mod_str?\l_stex_get_symbol_name_str + __cs}\l_stex_notation_macrocode_cs + \tl_if_empty:NF \l_stex_key_op_tl { + \cs_set_eq:cN{l_stex_notation_ + \l_stex_get_symbol_mod_str?\l_stex_get_symbol_name_str + _op__cs}\l_stex_key_op_tl + } + } } % \end{macrocode} % \end{macro} @@ -7278,7 +7325,11 @@ }{ this .tl_set:N = \l_stex_current_this_tl , unknown .code:n = { - \str_set_eq:NN \l_@@_name_str \l_keys_key_str + \str_if_empty:NTF \l_keys_key_str { + \str_set:Nx \l_@@_name_str {\l_keys_key_tl} + }{ + \str_set_eq:NN \l_@@_name_str \l_keys_key_str + } } }{} @@ -8304,7 +8355,7 @@ \NewDocumentCommand \premise {O{} m} { \tl_if_empty:nF {#1} { \stex_debug:nn{Here:}{Variable~#1} - \exp_args:NNx\exp_args:Nnx\vardef{v#1}{#1} + \exp_args:Nne\use:nn{\vardef}{{v#1}[name=#1]{#1}} } \stex_annotate:nn{shtml:premise={#1}}{#2} } @@ -8684,7 +8735,7 @@ \stex_keys_set:nn{spfsteps}{##2} \str_if_empty:NF \l_stex_key_name_str { \stex_debug:nn{Here:}{Variable~\l_stex_key_name_str} - \exp_args:NNx\exp_args:Nnx\vardef{v\l_stex_key_name_str}{\l_stex_key_name_str} + \exp_args:Nne\use:nn{\vardef}{{v\l_stex_key_name_str}[name=\l_stex_key_name_str]{\l_stex_key_name_str}} } \begin{spfstepenv} @@ -8983,6 +9034,51 @@ % \end{macrocode} % \end{macro} % +% VoLL-KI Annotations +% \begin{macrocode} +\newcommand\precondition[2]{ + \str_clear:N \l_stex_get_symbol_name_str + \stex_get_symbol:n{#2} + \str_if_empty:NTF \l_stex_get_symbol_name_str{ + \errmessage{Unknown~symbol~#2} + }{ + \str_case:nnTF {#1}{ + {remember}{} + {understand}{} + {analyze}{} + {evaluate}{} + {apply}{} + {create}{} + }{ + \stex_annotate_invisible:nn{ + shtml:preconditionsymbol={\l_stex_get_symbol_mod_str ? \l_stex_get_symbol_name_str}, + shtml:preconditiondimension={#1} + }{} + }{\errmessage{Unknown~cognitive~dimension~#1}} + } +} +\newcommand\objective[2]{ + \str_clear:N \l_stex_get_symbol_name_str + \stex_get_symbol:n{#2} + \str_if_empty:NTF \l_stex_get_symbol_name_str{ + \errmessage{Unknown~symbol~#2} + }{ + \str_case:nnTF {#1}{ + {remember}{} + {understand}{} + {analyze}{} + {evaluate}{} + {apply}{} + {create}{} + }{ + \stex_annotate_invisible:nn{ + shtml:objectivesymbol={\l_stex_get_symbol_mod_str ? \l_stex_get_symbol_name_str}, + shtml:objectivedimension={#1} + }{} + }{\errmessage{Unknown~cognitive~dimension~#1}} + } +} +% \end{macrocode} % % \begin{macrocode} \seq_if_empty:NT \g_stex_current_file { diff --git a/macros/latex/contrib/stex/source/tikzinput.dtx b/macros/latex/contrib/stex/source/tikzinput.dtx index 988d483b12..da4615fbbe 100644 --- a/macros/latex/contrib/stex/source/tikzinput.dtx +++ b/macros/latex/contrib/stex/source/tikzinput.dtx @@ -42,7 +42,7 @@ % \end{macrocode} % % \begin{macrocode} -\ProvidesExplPackage{tikzinput}{2023/03/19}{3.3.0}{tikzinput package} +\ProvidesExplPackage{tikzinput}{2023/10/13}{3.4.0}{tikzinput package} \RequirePackage{l3keys2e} \keys_define:nn { tikzinput } { diff --git a/macros/latex/contrib/stex/tex/etc/hwexam-default.header b/macros/latex/contrib/stex/tex/etc/hwexam-default.header index d36a97c718..fa70218e14 100644 --- a/macros/latex/contrib/stex/tex/etc/hwexam-default.header +++ b/macros/latex/contrib/stex/tex/etc/hwexam-default.header @@ -3,7 +3,7 @@ Matriculation Number:\hspace*{2cm}\strut\\[1ex] \begin{center} \Large\textbf{\@title}\\[1ex] - \large\@date\\[3ex] + \large\@date\strut\\[3ex] \end{center} \textbf{You have {\hwexamminutes} (sharp) for the test};\\ @@ -22,11 +22,9 @@ You will only need {\hwexam@reqpts} points for a perfect score, i.e. \vfill \begin{center} { - \Large\em You have ample time, so take it slow and avoid rushing - to mistakes!\\[2ex] Different problems test different skills and knowledge, so do not get stuck on one problem. }\vfill \correction@table\\[3ex] -\end{center}
\ No newline at end of file +\end{center} diff --git a/macros/latex/contrib/stex/tex/etc/lststex.sty b/macros/latex/contrib/stex/tex/etc/lststex.sty index 423e0b4a20..7d127fddc5 100644 --- a/macros/latex/contrib/stex/tex/etc/lststex.sty +++ b/macros/latex/contrib/stex/tex/etc/lststex.sty @@ -15,6 +15,7 @@ symdef,symdecl,notation,sref}, morekeywords={smodule,sdefinition,sassertion,sparagraph, inputref, + sproblem,hint,exnote,solution,gnote, sproof,spfstep,spfcases,spfcase,justification,premise}} \definecolor{backcolor}{gray}{.96} @@ -71,8 +72,10 @@ classoffset=5,keywordstyle=\color{magenta},morekeywords={ smodule,sdefinition,sassertion,sparagraph,sexample, sproof,subproof,spfcases,spfcase,spfstep,spfcomment,spfblock, + sproblem,subproblem,solution,hint,exnote,mcb,scb, \\spfidea,\\spfsketch,\\spfcasesketch,\\sproofend, \\spfjust,\\premise,\\justarg,\\inlinedef,\\inlineex,\\inlineass, + \\scc,\\mcc,\\objective, \\varbind, copymodule,interpretmodule,mathstructure,sexample,extstructure, extstructure*,realization @@ -125,11 +128,21 @@ } }, unknown .code:n = { - \tl_if_empty:nTF{#1}{ - \exp_args:NNo \clist_put_right:Nn \l_lststex_pass_on_args_clist \l_keys_key_str + \str_if_empty:NTF \l_keys_key_str { + \tl_if_empty:nTF{#1}{ + \exp_args:NNo \clist_put_right:Nn \l_lststex_pass_on_args_clist \l_keys_key_tl + }{ + \exp_args:NNx \clist_put_right:Nn \l_lststex_pass_on_args_clist { + \l_keys_key_tl = \exp_not:n{{#1}} + } + } }{ - \exp_args:NNx \clist_put_right:Nn \l_lststex_pass_on_args_clist { - \l_keys_key_str = \exp_not:n{{#1}} + \tl_if_empty:nTF{#1}{ + \exp_args:NNo \clist_put_right:Nn \l_lststex_pass_on_args_clist \l_keys_key_str + }{ + \exp_args:NNx \clist_put_right:Nn \l_lststex_pass_on_args_clist { + \l_keys_key_str = \exp_not:n{{#1}} + } } } } diff --git a/macros/latex/contrib/stex/tex/etc/stex-highlighting.sty b/macros/latex/contrib/stex/tex/etc/stex-highlighting.sty index 0cd04872a1..ec0058d519 100644 --- a/macros/latex/contrib/stex/tex/etc/stex-highlighting.sty +++ b/macros/latex/contrib/stex/tex/etc/stex-highlighting.sty @@ -1,5 +1,16 @@ %\RequirePackage{xcolor} \RequirePackage{pdfcomment} +\RequirePackage{l3keys2e} +\ExplSyntaxOn + +\keys_define:nn { stexhighlighting / pkg}{ + boxes .default:n = {true}, + boxes .bool_set:N = \c_stexhighlighting_boxes_bool, +} + +\ProcessKeysOptions{ stexhighlighting / pkg} + +\ExplSyntaxOff \def\compemph#1{% \ifcsname textcolor\endcsname @@ -28,20 +39,40 @@ } \def\varemph#1{\ifcsname textcolor\endcsname\textcolor{gray}{#1}\else#1\fi} -\protected\def\compemph@uri#1#2{% - \pdftooltip{% - \srefsymuri{#2}{\compemph{#1}}% - }{% - URI:~\detokenize{#2}% - }% +\ExplSyntaxOn + +\bool_if:NTF\c_stexhighlighting_boxes_bool{ + \protected\def\compemph@uri#1#2{ + \pdftooltip{ + \srefsymuri{#2}{\compemph{#1}} + }{ + URI:~\detokenize{#2} + } + } + \protected\def\symrefemph@uri#1#2{ + \pdftooltip{ + \srefsymuri{#2}{\symrefemph{#1}} + }{ + URI:~\detokenize{#2} + } + } +}{ + \protected\def\compemph@uri#1#2{ + \pdftooltip{{\hypersetup{pdfborder={0~0~0}} + \srefsymuri{#2}{\compemph{#1}} + }}{ + URI:~\detokenize{#2} + } + } + \protected\def\symrefemph@uri#1#2{ + \pdftooltip{{\hypersetup{pdfborder={0~0~0}} + \srefsymuri{#2}{\symrefemph{#1}} + }}{ + URI:~\detokenize{#2} + } + } } -\protected\def\symrefemph@uri#1#2{% - \pdftooltip{% - \srefsymuri{#2}{\symrefemph{#1}}% - }{% - URI:~\detokenize{#2}% - }% - } + \protected\def\defemph@uri#1#2{% \pdftooltip{% \defemph{#1}% @@ -56,3 +87,5 @@ Variable~\detokenize{#2}% }% } + +\ExplSyntaxOff
\ No newline at end of file diff --git a/macros/latex/contrib/stex/tex/etc/stex-logo.sty b/macros/latex/contrib/stex/tex/etc/stex-logo.sty index 1bcb487aba..cc4c6154ac 100644 --- a/macros/latex/contrib/stex/tex/etc/stex-logo.sty +++ b/macros/latex/contrib/stex/tex/etc/stex-logo.sty @@ -1,7 +1,7 @@ \RequirePackage{xspace} \protected\def\stex{% \@ifundefined{texorpdfstring}{\raisebox{-.5ex}S\kern-.5ex\TeX}{% - \texorpdfstring{\raisebox{-.5ex}S\kern-.5ex\TeX}{sTeX}\xspace% - }% + \texorpdfstring{\raisebox{-.5ex}S\kern-.5ex\TeX}{sTeX}% + }\xspace% } -\let\sTeX\stex
\ No newline at end of file +\let\sTeX\stex diff --git a/macros/latex/contrib/stex/tex/etc/stex.cls.ltxml b/macros/latex/contrib/stex/tex/etc/stex.cls.ltxml deleted file mode 100644 index 6915d0db92..0000000000 --- a/macros/latex/contrib/stex/tex/etc/stex.cls.ltxml +++ /dev/null @@ -1,10 +0,0 @@ -package LaTeXML::Package::Pool; -use strict; -use warnings; -use LaTeXML::Package; - -RequirePackage('xparse'); - -InputDefinitions('stex', type => 'cls', noltxml => 1); - -1;
\ No newline at end of file diff --git a/macros/latex/contrib/stex/tex/etc/stex.sty.ltxml b/macros/latex/contrib/stex/tex/etc/stex.sty.ltxml deleted file mode 100644 index 44e30b44c5..0000000000 --- a/macros/latex/contrib/stex/tex/etc/stex.sty.ltxml +++ /dev/null @@ -1,23 +0,0 @@ -package LaTeXML::Package::Pool; -use strict; -use warnings; -use LaTeXML::Package; - -RequirePackage('xparse'); - -DefPrimitive('\csname stex_kpsewhich:Nn\endcsname Token {}',sub { - my ($stomach, $target, $value) = @_; - $value = ToString(Expand($value)); - my $out = ToString(`kpsewhich $value`); - $out =~ s/^\s+//; - $out =~ s/\s+$//; - Note("Here: $value => $out"); - my @ret = Explode($out); - DefMacroI($target, undef, Tokens(@ret)); -},locked=>1); - -\DefMacroI('\stex@backend',undef,Explode("latexml")); - -InputDefinitions('stex', type => 'sty', noltxml => 1); - -1;
\ No newline at end of file diff --git a/macros/latex/contrib/stex/tex/etc/stexthm.sty b/macros/latex/contrib/stex/tex/etc/stexthm.sty index 4b89af5b39..7c37c2678a 100644 --- a/macros/latex/contrib/stex/tex/etc/stexthm.sty +++ b/macros/latex/contrib/stex/tex/etc/stexthm.sty @@ -1,4 +1,4 @@ -\ProvidesExplPackage{stexthm}{2023/03/19}{3.3.0}{Default Typesetting for sTeX Statements} +\ProvidesExplPackage{stexthm}{2023/10/13}{3.4.0}{Default Typesetting for sTeX Statements} \RequirePackage{stex} \RequirePackage{amsthm} diff --git a/macros/latex/contrib/stex/tex/ldf/problem-english.ldf b/macros/latex/contrib/stex/tex/ldf/problem-english.ldf index bd202814e6..137b9cbe9e 100644 --- a/macros/latex/contrib/stex/tex/ldf/problem-english.ldf +++ b/macros/latex/contrib/stex/tex/ldf/problem-english.ldf @@ -3,7 +3,9 @@ \tl_set:Nn \problem@kw@hint{Hint} \tl_set:Nn \problem@kw@note{Note} \tl_set:Nn \problem@kw@grading{Grading} -\tl_set:Nn \problem@kw@points{pt} +\tl_set:Nn \problem@kw@pts{pt} \tl_set:Nn \problem@kw@minutes{min} \tl_set:Nn \problem@kw@correct{Correct} -\tl_set:Nn \problem@kw@wrong{Wrong}
\ No newline at end of file +\tl_set:Nn \problem@kw@wrong{Wrong} +\tl_set:Nn \problem@kw@feedback{Feedback} +\tl_set:Nn \problem@kw@points{Points} diff --git a/macros/latex/contrib/stex/tex/ldf/problem-finnish.ldf b/macros/latex/contrib/stex/tex/ldf/problem-finnish.ldf index 11fc490c4a..63718739b0 100644 --- a/macros/latex/contrib/stex/tex/ldf/problem-finnish.ldf +++ b/macros/latex/contrib/stex/tex/ldf/problem-finnish.ldf @@ -12,7 +12,9 @@ \tl_set:Nn \problem@kw@hint{Hint} \tl_set:Nn \problem@kw@note{Note} \tl_set:Nn \problem@kw@grading{Grading} -\tl_set:Nn \problem@kw@points{pt} +\tl_set:Nn \problem@kw@pts{pt} \tl_set:Nn \problem@kw@minutes{min} \tl_set:Nn \problem@kw@correct{Correct} \tl_set:Nn \problem@kw@wrong{Wrong} +\tl_set:Nn \problem@kw@schema{Schema} +\tl_set:Nn \problem@kw@points{Points} diff --git a/macros/latex/contrib/stex/tex/ldf/problem-french.ldf b/macros/latex/contrib/stex/tex/ldf/problem-french.ldf index bdcae874b2..53004d1f39 100644 --- a/macros/latex/contrib/stex/tex/ldf/problem-french.ldf +++ b/macros/latex/contrib/stex/tex/ldf/problem-french.ldf @@ -12,7 +12,9 @@ \tl_set:Nn \problem@kw@hint{Hint} \tl_set:Nn \problem@kw@note{Note} \tl_set:Nn \problem@kw@grading{Grading} -\tl_set:Nn \problem@kw@points{pt} +\tl_set:Nn \problem@kw@pts{pt} \tl_set:Nn \problem@kw@minutes{min} \tl_set:Nn \problem@kw@correct{Correct} \tl_set:Nn \problem@kw@wrong{Wrong} +\tl_set:Nn \problem@kw@schema{Schema} +\tl_set:Nn \problem@kw@points{Points} diff --git a/macros/latex/contrib/stex/tex/ldf/problem-ngerman.ldf b/macros/latex/contrib/stex/tex/ldf/problem-ngerman.ldf index 0747555783..beea10724a 100644 --- a/macros/latex/contrib/stex/tex/ldf/problem-ngerman.ldf +++ b/macros/latex/contrib/stex/tex/ldf/problem-ngerman.ldf @@ -11,8 +11,9 @@ \tl_set:Nn \problem@kw@hint{Hinweis} \tl_set:Nn \problem@kw@note{Bemerkung} \tl_set:Nn \problem@kw@grading{Bewertung} -\tl_set:Nn \problem@kw@points{Pkt} +\tl_set:Nn \problem@kw@pts{Pkt} \tl_set:Nn \problem@kw@minutes{Min} \tl_set:Nn \problem@kw@correct{Korrekt} \tl_set:Nn \problem@kw@wrong{Falsch} - +\tl_set:Nn \problem@kw@feedback{Rückmeldung} +\tl_set:Nn \problem@kw@points{Punkte} diff --git a/macros/latex/contrib/stex/tex/ldf/problem-russian.ldf b/macros/latex/contrib/stex/tex/ldf/problem-russian.ldf index f0a08c7761..7aa362391c 100644 --- a/macros/latex/contrib/stex/tex/ldf/problem-russian.ldf +++ b/macros/latex/contrib/stex/tex/ldf/problem-russian.ldf @@ -11,7 +11,9 @@ \tl_set:Nn \problem@kw@hint{Подсказка} \tl_set:Nn \problem@kw@note{Примечание} \tl_set:Nn \problem@kw@grading{Grading} -\tl_set:Nn \problem@kw@points{бл} +\tl_set:Nn \problem@kw@pts{бл} \tl_set:Nn \problem@kw@minutes{мин} \tl_set:Nn \problem@kw@correct{Correct} -\tl_set:Nn \problem@kw@wrong{Wrong}
\ No newline at end of file +\tl_set:Nn \problem@kw@wrong{Wrong} +\tl_set:Nn \problem@kw@schema{Schema} +\tl_set:Nn \problem@kw@points{Points} diff --git a/macros/latex/contrib/stex/tex/ldf/stex-en.ldf b/macros/latex/contrib/stex/tex/ldf/stex-en.ldf index 1501a92c82..04a11c6208 100644 --- a/macros/latex/contrib/stex/tex/ldf/stex-en.ldf +++ b/macros/latex/contrib/stex/tex/ldf/stex-en.ldf @@ -3,7 +3,7 @@ } \msg_set:nnn{stex}{warning/nomathhub}{ MATHHUB~system~variable~not~found~and~no~ - \tl_to_str:n{\mathhub}-value~set! + \tl_to_str:n{\mathhub}-value~set!^^JUsing~HOME/MathHub. } \msg_set:nnn{stex}{error/deactivated-macro}{ The~\tl_to_str:n{#1}~command~is~only~allowed~in~#2! @@ -129,6 +129,9 @@ \msg_set:nnn{stex}{error/nomorphism}{ No~morphism~#1~found~in~domain~of~morphism } +\msg_set:nnn{stex}{error/nestedproblem}{ + Nested~problem;~sproblem~not~allowed~in~another~sproblem +} \str_set:Nn \spfsketchenvautorefname {Proof~sketch} \str_set:Nn \sproofautorefname {Proof} \str_set:Nn \spfstepautorefname {Proof~step}
\ No newline at end of file |