% \iffalse meta-comment % % TUDa-CI -- Corporate Design for TU Darmstadt % ---------------------------------------------------------------------------- % % Copyright (C) 2018--2025 by Marei Peischl % % ============================================================================ % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c % of this license or (at your option) any later version. % The latest version of this license is in % http://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2008/05/04 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is % Marei Peischl % % The development repository can be found at % https://github.com/tudace/tuda_latex_templates % Please use the issue tracker for feedback! % % ============================================================================ % % \fi % % \iffalse% no documentation on this % \iffalse^^A Preparation for real docstrip documentation %<*driver> \ProvidesFile{tudaexercise.dtx}[2025-01-26 v4.00 Exercise sheets and exams using TU Darmstadt's Corporate Desing (TUDa-CI)] \typeout{***********************************************************} \typeout{No documentation included in this file! Please see tuda-ci.pdf for more information and DEMO-TUDaExercise.tex/.pdf for an example of use.} \typeout{***********************************************************} \stop % %<*class&initialization> %<@@=ptxcd> \NeedsTeXFormat{LaTeX2e}[2020/10/01] \ProvidesExplClass{tudaexercise}{2025-01-26}{4.00}{Exercise sheets and exams using TU Darmstadt's Corporate Desing (TUDa-CI)} % %<*driver>^^A Preparation for real docstrip documentation \providecommand*{\TUDaDocDTXfiles}{tudaexercise.dtx} \input{tuda-ci.dtx} % % \fi % % \changes{v4.00}{2025-01-26}{Converted to DTX file} % % \DoNotIndex{\newcommand,\newenvironment} % % % \maketitle % % % % \DescribeEnv{solution} % % % \DescribeMacro{\sectionlinesformat} % % % \DescribeMacro{\institution} % % % \DescribeMacro{\titlepagestyle} % % % \DescribeMacro{\titleimage} % % % \DescribeMacro{\author} % % % \DescribeMacro{\title} % % % \DescribeMacro{\sheetnumber} % % % \DescribeMacro{\term} % % % \DescribeMacro{\sheetsep} % % % \DescribeMacro{\tasksep} % % % \DescribeMacro{\solutionsep} % % % \DescribeMacro{\StudentNamesep} % % % \DescribeMacro{\StudentIDname} % % % \DescribeMacro{\StudentIDsep} % % % \DescribeMacro{\creditformat} % % % \DescribeMacro{\creditformatsum} % % % \DescribeMacro{\pointformat} % % % \DescribeMacro{\PointsName} % % % \DescribeMacro{\thetask} % % % \DescribeMacro{\taskformat} % % % \DescribeEnv{task} % % % \DescribeMacro{\thesubtask} % % % \DescribeMacro{\subtaskformat} % % % \DescribeEnv{subtask} % % % \MaybeStop{} % % \section{Implementation} % % \iffalse %<*initialization> % \fi % % \begin{macrocode} \msg_new:nnnn {tudaexercise} {outdated-koma-script} { Your~KOMA-Script~is~outdated.\\ To~use~the~feature~'#1'~you~will~be~required~to~update. } { Please~do~not~use~this~feature~or~update~your~TeX~distribution.\\ The~feature~requires~KOMA-Script~v#2~or~newer. } \str_const:Nn \c_@@_base_str {exercise} \prop_new:N \g_ptxcd_clsopts_prop \prop_new:N \g_ptxcd_unknown_clsopts_prop \prop_gput:Nnn \g_ptxcd_clsopts_prop {captions} {nooneline} \prop_gput:Nnn \g_ptxcd_clsopts_prop {parskip} {half-} \prop_new:N \g_@@_points_collector_prop \prop_new:N \g_@@_subtask_points_collector_prop \prop_new:N \g_@@_property_collector_prop \bool_new:N \l_@@_points_auto_bool \bool_new:N \g_@@_points_bool \prop_new:N \g_@@_loaded_points_prop \fp_new:N \g_@@_points_total_fp \int_new:N \g_ptxcd_paper_int \bool_new:N \g_ptxcd_geometry_bool \bool_new:N \g_ptxcd_custommargins_bool \bool_new:N \l_@@_solution_bool \bool_new:N \g_ptxcd_smalltitle_bool \str_new:N \g_ptxcd_department_str \tl_new:N \g_ptxcd_tmp_tl \int_new:N \g_ptxcd_tmp_int \tl_new:N \l_ptxcd_tmp_tl \clist_map_inline:nn {section,subsection,subsubsection,task,subtask,@solution} { \bool_new:c {g_@@_ruled_#1_bool} \bool_gset_true:c {g_@@_ruled_#1_bool} } \bool_new:N \g_@@_runin_subtask_bool % \end{macrocode} % \begin{documentation} % \DescribeEnv{solution} % % \end{documentation} % \begin{environment}{solution} % \begin{macrocode} \newenvironment{solution}{}{} % \end{macrocode} % \end{environment} % \end{implementation} % % \begin{documentation} % \DescribeEnv{solution*} % % \end{documentation} % \begin{environment}{solution*} % \begin{macrocode} \newenvironment{solution*}{}{} % \end{macrocode} % \end{environment} % \end{implementation} % \changes{v4.00}{2025-01-26}{Remove obsolete use of environ} % \begin{macrocode} \cs_new:Nn \_@@_setup_solution: { \bool_if:NTF \l_@@_solution_bool { \def\solution{\_@@_solutionheader:} \def\endsolution{} \expandafter\def\csname solution*\endcsname{\ignorespaces} \expandafter\let\csname endsolution*\endcsname\endsolution }{ \RenewDocumentEnvironment{solution}{+b}{}{} \RenewDocumentEnvironment{solution*}{+b}{}{} } } \_@@_setup_solution: \prg_new_conditional:Nnn \_@@_if_solution: {T,F,TF} { \bool_if:NTF \l_@@_solution_bool {\prg_return_true:} {\prg_return_false:} } \let\IfSolutionT \_@@_if_solution:T \let\IfSolutionF \_@@_if_solution:F \let\IfSolutionTF \_@@_if_solution:TF % \end{macrocode} % Message Declaration for option processing % \begin{macrocode} \msg_new:nnn{tudaexercise} {titlepage-option-disabled} { You~set~the~titlepage~option~to~#1.\\ This option is not supported by tudaexercise.cls.\\ The~KOMA-Script~option~titlepage~is~forced~to~"false". } % \end{macrocode} % \changes{v4.00}{2025-01-26}{add bookmarksnumbered option and enable by default} % The options have to be passed before the package options to allow being changed by the user. % \begin{macrocode} \PassOptionsToPackage{pdfusetitle,bookmarksnumbered=true}{hyperref} \keys_define:nn {ptxcd/exercise} { % \end{macrocode} % % \begin{macrocode} bookmarksnumbered .code:n = \PassOptionsToPackage{bookmarksnumbered=#1}{hyperref}, compat .bool_gset:N = \g_@@_compatibility_bool, compat .initial:n = false, compatilibity .meta:n = {compat=#1}, compatibility .default:n = true, credit .tl_set:N = \l_@@_credit_tl, credit .initial:n =, headontitle .bool_gset:N = \g_ptxcd_headontitle_bool, headontitle .initial:n = false, headontitle .default:n =true, titlepage .code:n = {\msg_warning:nnn {tudapub} {titlepage-option-disabled} {#1}}, match-task-subtask-syntax .bool_gset:N = \g_ptxcd_match_task_subtask_bool, match-task-subtask-syntax .initial:n = false, match-task-subtask-syntax .default:n = true, solution .code:n = { \bool_set_eq:Nc \l_@@_solution_bool {c_#1_bool} \_@@_setup_solution: }, solution .default:n = true, unknown .code:n = {\prop_gput:NVn \g_ptxcd_unknown_clsopts_prop \l_keys_key_tl {#1}}, points .choice:, points / true .code:n = \bool_set_false:N \l_@@_points_auto_bool\bool_gset_true:N \g_@@_points_bool, points /false .code:n = \bool_set_false:N \l_@@_points_auto_bool\bool_gset_false:N \g_@@_points_bool, points / auto .code:n = \bool_set_true:N \l_@@_points_auto_bool\bool_gset_true:N \g_@@_points_bool, points .initial:n = false, subtask .choice:, subtask / ruled .code:n = \bool_gset_true:N \g_@@_ruled_subtask_bool \bool_gset_false:N \g_@@_runin_subtask_bool, subtask / runin .code:n = \bool_gset_false:N \g_@@_ruled_subtask_bool \bool_gset_true:N \g_@@_runin_subtask_bool, subtask / plain .code:n = \bool_gset_false:N \g_@@_ruled_subtask_bool \bool_gset_false:N \g_@@_runin_subtask_bool, % % ^AA} %<*center> \ProcessKeyOptions[ptxcd/exercise] \prop_map_inline:Nn \g_ptxcd_clsopts_prop { \tl_if_empty:nTF {#2} {\PassOptionsToClass {#1} {scrartcl}} { \clist_map_inline:nn {#2} {\PassOptionsToClass {#1=##1} {scrartcl}} } } \bool_new:N \l_@@_subtask_fallback_bool \fp_new:N \l_@@_task_points_fp \fp_new:N \g_@@_ex_collected_points_fp \tl_new:N \l_@@_task_credit_tl \keys_define:nn {ptxcd/task}{ points .choice:, points / auto .code:n = \bool_set_true:N \l_@@_points_auto_bool, points / unknown .code:n = \fp_set:Nn \l_@@_task_points_fp {#1} \bool_set_false:N \l_@@_points_auto_bool, credit .code:n = \tl_set:Nn \l_@@_task_credit_tl {#1} \bool_set_false:N \l_@@_points_auto_bool, solution .meta:nn ={ptxcd/exercise}{solution=#1}, } \fp_new:N \l_@@_subtask_points_fp \keys_define:nn {ptxcd/subtask} { credit .tl_set:N = \l_@@_subtask_credit_tl, credit .initial:n =, points .code:n = \fp_set:Nn \l_@@_subtask_points_fp {#1} \bool_set_false:N \l_@@_points_auto_bool, title .tl_set:N = \l_@@_title_tl, title .initial:n =, unknown .code:n = { \bool_set_true:N \l_@@_subtask_fallback_bool \tl_clear:N \l_@@_subtask_credit_tl \fp_zero:N \l_@@_subtask_points_fp }, } \keys_define:nn {ptxcd/exercise/headline} { headline .code:n = { \if@twoside \keys_set:nn {ptxcd/exercise/headline} {odd=#1,even=#1} \else \keys_set:nn {ptxcd/exercise/headline} {oneside=#1} \fi }, } \clist_map_inline:nn {odd, even, oneside} { \tl_new:c {g_@@_headline_#1_tl} \box_new:c {g_@@_headline_#1_box} \keys_define:nn {ptxcd/exercise/headline} { #1 .choice:, #1 / title-name-id .meta:n = { #1 = { \g_ptxcd_shorttitle_tl\par \StudentName\StudentID } }, #1 / title-name .meta:n = { #1 = { \g_ptxcd_shorttitle_tl\par \smallskip \StudentName } }, #1 / title .meta:n = {#1 = {\g_ptxcd_shorttitle_tl}}, #1 / name-id .meta:n = {#1 = {\StudentName\StudentID}}, #1 / name .meta:n = {#1 = {\StudentName}}, #1 / unknown .code:n = \tl_gset:cn {g_@@_headline_#1_tl} {##1} } } % \end{macrocode} % Load tudasize clo file if available % \begin{macrocode} \file_if_exist:nT {tudasize\prop_item:Nn \g_ptxcd_clsopts_prop {fontsize}.clo} {\providecommand*{\@fontsizefilebase}{tudasize}} \LoadClass{scrartcl} \bool_if:NT \g_@@_points_bool { \cs_if_exist:NF \AddtoDoHook{ \msg_error:nnnn {tudaexercise} {outdated-koma-script} {points=true/auto} {3.27} \keys_set:nn {ptxcd/exercise} {points=false} } } \RequirePackage{tudarules} % \end{macrocode} % Has to be loaded here due to headwidth options % \begin{macrocode} \RequirePackage[draft=false]{scrlayer-scrpage} \KOMAoptions {twoside = false} \prop_map_inline:Nn \g_ptxcd_unknown_clsopts_prop { \cs_if_exist:cT {KV@KOMA.scrartcl.cls@#1} { \tl_if_empty:nTF {#2} {\KOMAoptions{#1}} {\KOMAoption{#1}{#2} } } } % \end{macrocode} % \begin{implementation} % \begin{macro}{\sectionlinesformat} % \begin{macrocode} \renewcommand*\sectionlinesformat[4]{% \parbox{\linewidth}{ \bool_if:cT {g_@@_ruled_#1_bool} { \rule[5\g_ptxcd_titlerule_dim]{\linewidth}{\g_ptxcd_titlerule_dim}\par\nointerlineskip } \@hangfrom{% \hskip #2#3}{ \tl_if_eq:nnT {#1} {task} { \exp_args:No \tl_if_empty:nF {#4} {:~} \bool_if:NT \l_@@_points_auto_bool { \exp_args:NNx \prop_get:NnN \g_@@_loaded_points_prop {\thetask} \l_ptxcd_tmp_tl \quark_if_no_value:NF \l_ptxcd_tmp_tl { \fp_set:Nn \l_@@_task_points_fp {\l_ptxcd_tmp_tl} } } } #4 \tl_if_in:nnT {#1} {task} { \tl_if_empty:cTF{l_@@_#1_credit_tl} {\pointformat{\fp_to_decimal:c {l_@@_#1_points_fp}}} {\creditformat{\tl_use:c {l_@@_#1_credit_tl}}} } \rule[-\dp\strutbox]{0pt}{\dp\strutbox}\par}\nointerlineskip \skip_vertical:n {\ptxcd_titlerule_sep: -\dp\strutbox} \bool_if:cT {g_@@_ruled_#1_bool} {\smash{\rule{\linewidth}{\g_ptxcd_titlerule_dim}}} } } \RequirePackage{tudafonts} % \end{macrocode} % \iffalse % %<*body> % \fi % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\institution} % %^^A TODO Rename and deprecate variable names % \end{documentation} % \begin{implementation} % \begin{macro}{\institution} % \begin{macrocode} \newcommand*{\institution}[1]{ \def\ptxcd_institution{#1} } % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\ptxcd_datename} % % \end{documentation} % \begin{implementation} % \begin{macro}{\ptxcd_datename} % \begin{macrocode} \gdef\ptxcd_datename{Datum} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\ptxcd_dateseparator} % % \end{documentation} % \begin{implementation} % \begin{macro}{\ptxcd_dateseparator} % \begin{macrocode} \gdef\ptxcd_dateseparator{:~} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \setkomafont{disposition}{\sffamily\bfseries} \cs_new:Nn \ptxcd_titlerule_sep: {\the\dp\strutbox} \RequirePackage{tudacolors} \setkomafont{pageheadfoot}{\sffamily\small} \setkomafont{pagenumber}{} \addtokomafont{captionlabel}{\sffamily} \addtokomafont{caption}{\sffamily} \cs_new:Nn \_@@_preamble_ConfigureHeadline:n { \tl_if_empty:nF {#1} {\keys_set:nn {ptxcd/exercise/headline} {#1}} } \cs_new:Nn \ptxcd_ConfigureHeadline:n { \_@@_preamble_ConfigureHeadline:n {#1} \ptxcd_update_headline_boxes: \_@@_adjust_headheight: } \NewDocumentCommand{\ConfigureHeadline}{m}{\_@@_preamble_ConfigureHeadline:n {#1}} \bool_if:NT \g_@@_compatibility_bool { \cs_new:Npn \_@@_env_to_tl_aux:w #1 \q_stop { \tl_gset:Nn \g_@@_headline_oneside_tl {#1} } \NewDocumentEnvironment{examheader}{+b}{}{ \tl_gset:Nn \g_@@_headline_oneside_tl {#1} \tl_gset:Nn \g_@@_headline_odd_tl {#1} \tl_gset:Nn \g_@@_headline_even_tl {#1} \ptxcd_ConfigureHeadline:n {} } \newcommand*{\examheaderdefault}{\par\StudentName\StudentID} } \cs_new:Nn \ptxcd_update_headline_boxes: { \clist_map_inline:nn {even, odd, oneside} { \tl_if_empty:cF {g_@@_headline_##1_tl} { \vbox_gset:cn {g_@@_headline_##1_box} { \begin{minipage}[b]{\textwidth} \usekomafont{pagehead} \raggedright \leavevmode\rule{\z@}{\dimexpr\ht\strutbox+\c_ptxcd_rulesep_dim} \ignorespaces \use:c {g_@@_headline_##1_tl}\ignorespaces\strut \par\vspace{\z@} \end{minipage} } } } } \cs_new:Nn \_@@_adjust_headheight: { \if@twoside \dim_set:Nn \l_tmpa_dim { \dim_max:nn {\box_ht:N \g_@@_headline_odd_box+\box_dp:N \g_@@_headline_odd_box} {\box_ht:N \g_@@_headline_even_box+\box_dp:N \g_@@_headline_even_box} } \else \dim_set:Nn \l_tmpa_dim { \box_ht:N \g_@@_headline_oneside_box + \box_dp:N \g_@@_headline_oneside_box } \fi \dim_compare:nT {\l_tmpa_dim > \z@} { \dim_add:Nn \l_tmpa_dim {\box_dp:N \ptxcd_headrule_box +\c_ptxcd_rulesep_dim} \KOMAoptions{headinclude, headheight=\l_tmpa_dim,headsepline = .5\c_ptxcd_smallrule_dim} \if@twoside \cehead{\box_use:c {g_@@_headline_even_box}} \cohead{\box_use:c {g_@@_headline_odd_box}} \else \chead{\box_use:c {g_@@_headline_oneside_box}} \fi \global\setlength{\headheight}{\l_tmpa_dim} } } \newpairofpagestyles{TUDa.exercise}{ \KOMAoptions{plainfootsepline,headtopline,plainheadtopline} \KOMAoptions { headwidth=text, footwidth=text } \setkomafont{pagehead}{} \box_if_exist:NF \ptxcd_headrule_box { \ptxcd_makeheadrule[color=identbarcolor, width=\sls@headwidth]{ptxcd_headrule} } \ModifyLayer[ background, height=\box_dp:N \ptxcd_headrule_box, align=tl, voffset=\g_ptxcd_topMargin_dim, contents=\raisebox{\depth}{\box_use:N \ptxcd_headrule_box}, ]{plain.TUDa.exercise.head.above.line} \ModifyLayer[ background, height=\box_dp:N \ptxcd_headrule_box, align=tl, voffset=\g_ptxcd_topMargin_dim, contents=\raisebox{\depth}{\box_use:N \ptxcd_headrule_box}, ]{TUDa.exercise.head.above.line} \ofoot[\pagemark]{\pagemark} \ModifyLayer[addvoffset=\c_ptxcd_rulesep_dim]{TUDa.exercise.foot.even} \ModifyLayer[addvoffset=\c_ptxcd_rulesep_dim]{TUDa.exercise.foot.odd} \ModifyLayer[addvoffset=\c_ptxcd_rulesep_dim]{TUDa.exercise.foot.oneside} \ModifyLayer[addvoffset=\c_ptxcd_rulesep_dim]{plain.TUDa.exercise.foot.even} \ModifyLayer[addvoffset=\c_ptxcd_rulesep_dim]{plain.TUDa.exercise.foot.odd} \ModifyLayer[addvoffset=\c_ptxcd_rulesep_dim]{plain.TUDa.exercise.foot.oneside} } \DeclarePageStyleAlias{TUDa}{TUDa.exercise} \DeclarePageStyleAlias{plain.TUDa}{plain.TUDa.exercise} % \end{macrocode} % \begin{implementation} % \begin{macrocode} \renewcommand{\titlepagestyle}{plain.TUDa} \pagestyle{TUDa} % \end{macrocode} % % \begin{macrocode} \seq_new:N \g_ptxcd_author_seq % \end{macrocode} % \begin{documentation} % \DescribeMacro{\author} % % \end{documentation} % \begin{implementation} % \begin{macro}{\author} % \begin{macrocode} \renewcommand*\author[1]{ \seq_gset_split:Nnn \g_ptxcd_author_seq {\and} {#1} } % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \msg_new:nnn{tudapub} {unknown-language} { You~selected~an~unknown~language~#1.\\ The~Variable~#2~does~not~have~a~predefined~value.\\ Ensure~to~redefine~#2~to~match~your~language.\\ Otherwise~the~ngerman~vaue~#3~will~be~used. } \cs_new:Nn \ptxcd_define_captionFallback:Nn { \providecommand*#1{ \msg_warning:nnxxx{tudapub} {unknown-language} {\languagename} {\exp_not:N #1} {#2} \def#1{#2} } } \cs_new:Nn \ptxcd_declare_caption:Nnnn { \ptxcd_define_captionFallback:Nn #1 {#2} \defcaptionname{ngerman, german}{#1}{#2} \defcaptionname{english, USenglish, american}{#1}{#3} \defcaptionname{UKenglish, british}{#1}{#4} } \cs_new:Nn \ptxcd_declare_caption:Nnn { \ptxcd_declare_caption:Nnnn #1 {#2} {#3} {#3} } \ptxcd_declare_caption:Nnn \authorandname {und} {and} % \end{macrocode} % \begin{documentation} % \DescribeMacro{\@author} % % \end{documentation} % \begin{implementation} % \begin{macro}{\@author} % \begin{macrocode} \renewcommand*{\@author}{ \seq_use:Nnnn \g_ptxcd_author_seq {~\authorandname{}~} {,~} {~\&~} } \tl_new:N \g_ptxcd_shorttitle_tl % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\title} % % \end{documentation} % \begin{implementation} % \begin{macro}{\title} % \begin{macrocode} \RenewDocumentCommand{\title}{om}{ \IfNoValueTF{#1}{ \tl_gset:Nn \g_ptxcd_shorttitle_tl {#2} }{ \tl_gset:Nn \g_ptxcd_shorttitle_tl {#1} } \def\@title{#2} } % \end{macrocode} % \end{macro} % \end{implementation} % % Define \subsubtitle for compatibility % \begin{macrocode} \newcommand*{\subsubtitle}[1]{ \def\@subsubtitle{#1} } \subsubtitle{} % \end{macrocode} % \begin{documentation} % \DescribeMacro{\ptxcd_title@footnote} % % \end{documentation} % \begin{implementation} % \begin{macro}{\ptxcd_title@footnote} % \begin{macrocode} \newcommand*{\ptxcd_title@footnote}[2][1]{ \textsuperscript{\@fnsymbol{#1}}#2 } % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\@maketitle} % % \end{documentation} % \begin{implementation} % \begin{macro}{\@maketitle} % \begin{macrocode} \renewcommand*{\@maketitle}{% \global\@topnum=\z@ \setparsizes{\z@}{\z@}{\z@\@plus 1fil}\par@updaterelative \vspace*{-\dim_eval:n { \headheight -\c_ptxcd_largerule_dim -\c_ptxcd_rulesep_dim +\headsep +\ht\strutbox +\p@ }} \par \nointerlineskip \begingroup \setlength{\fboxsep}{\z@} \bool_if:NT \g_ptxcd_colorback_bool {\colorbox{accentcolor}}{\parbox[t]{\linewidth}{ \rule{0pt}{\bool_if:NTF \g_ptxcd_smalltitle_bool {.25} {.5}\c_ptxcd_logoheight_dim} \par\nointerlineskip \raisebox{-\height}{% \begin{minipage}[t]{\dimexpr\linewidth-\_@@_logowidth:-1ex} \bool_if:NT \g_ptxcd_colorback_bool {\begin{addmargin}{3mm}} \raggedright \bool_if:NT \g_ptxcd_colorback_bool {\color{textonaccentcolor}} \tl_if_empty:NF \@titlehead {\usekomafont{titlehead}{\@titlehead\par}} \leavevmode\usekomafont{title}% {\usekomafont{title}\bool_if:NTF \g_ptxcd_smalltitle_bool {\LARGE} {\huge} {\@title\par}}% \vskip 1em \bool_if:NF \g_@@_compatibility_bool { {\ifx\@subtitle\@empty\else\usekomafont{subtitle}\@subtitle\par\fi}% \gdef\@subtitle{} \vskip .5em } { \xdef\@author {\@author} \ifx\@author\@empty\else\usekomafont{author}\@author\par\fi } \vskip .5em \bool_if:NTF \g_ptxcd_colorback_bool {\end{addmargin}} {\par} \end{minipage}} \tl_if_empty:NF \g_ptxcd_logofile_tl { \hfill\raisebox{\dim_eval:n { \bool_if:NTF \g_ptxcd_colorback_bool {-\height} {-.9\c_ptxcd_logoheight_dim} }} [0pt] [\dim_eval:n { \bool_if:NTF \g_ptxcd_smalltitle_bool {\bool_if:NTF \g_ptxcd_colorback_bool {1.15}{1}} {\bool_if:NTF \g_ptxcd_colorback_bool {1.5}{1.3} }\c_ptxcd_logoheight_dim}] {\makebox[\_@@_logowidth:][l]{\_@@_insert_logo:}} } \par\medskip }} \par \nointerlineskip \rule{\linewidth}{\g_ptxcd_titlerule_dim} % \end{macrocode} % subtitle fields if not compat % \begin{macrocode} \exp_args:Nf \tl_if_empty:nF {\g_ptxcd_ex_sheetnum_tl\@date\g_ptxcd_ex_term_tl\use:c {@subsubtitle}\@subtitle}{ \par\nointerlineskip \bool_if:NT \g_ptxcd_colorback_bool {\colorbox{accentcolor}}{ \parbox{\linewidth}{ \begin{minipage}{\linewidth} \bool_if:NT \g_ptxcd_colorback_bool { \color{textonaccentcolor} \begin{addmargin}{3mm} } \null\par \def\ptxcd_nextsep{} \clist_map_inline:nn {@subtitle, @subsubtitle, g_ptxcd_ex_term_tl, @date} { \tl_if_empty:cF {##1} {\ptxcd_nextsep\use:c {##1}\def\ptxcd_nextsep{\\}} } \tl_if_empty:NF \g_ptxcd_ex_sheetnum_tl {\ptxcd_nextsep\sheetname\sheetsep\g_ptxcd_ex_sheetnum_tl} \bool_if:NT \g_ptxcd_colorback_bool {\end{addmargin}} \end{minipage} \vspace*{\dp\strutbox} }}\par\nointerlineskip \rule{\linewidth}{\g_ptxcd_titlerule_dim} } \par \bool_if:NT \g_ptxcd_headontitle_bool { \if@twoside \box_use:N \g_@@_headline_odd_box \else \box_use:N \g_@@_headline_oneside_box \fi \par \rule{\linewidth}{\g_ptxcd_titlerule_dim} \par } \endgroup \vskip 2em \ConfigureHeadline{} }% \setkomafont{subtitle}{\bfseries} \setkomafont{author}{} \setkomafont{date}{} \newkomafont{sheetnumber}{\usekomafont{date}} \newkomafont{term}{\usekomafont{date}} \date{} \tl_new:N \g_ptxcd_ex_sheetnum_tl % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\sheetnumber} % % \end{documentation} % \begin{implementation} % \begin{macro}{\sheetnumber} % \begin{macrocode} \newcommand*{\sheetnumber}[1]{\tl_gset:Nn \g_ptxcd_ex_sheetnum_tl {#1}} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \sheetnumber{} \tl_new:N \g_ptxcd_ex_term_tl % \end{macrocode} % \begin{documentation} % \DescribeMacro{\term} % % \end{documentation} % \begin{implementation} % \begin{macro}{\term} % \begin{macrocode} \newcommand*{\term}[1]{\tl_gset:Nn \g_ptxcd_ex_term_tl {#1}} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \term{} % \end{macrocode} % Logos % \begin{macrocode} \RequirePackage{graphicx} % \end{macrocode} % %hyperref % \begin{macrocode} \RequirePackage{hyperref} \hypersetup{hidelinks, unicode} \providecaptionname{ngerman, german}{\sheetname}{Übungsblatt} \providecaptionname{english, american, british}{\sheetname}{Sheet} % \end{macrocode} % \begin{documentation} % \DescribeMacro{\sheetsep} % % \end{documentation} % \begin{implementation} % \begin{macro}{\sheetsep} % \begin{macrocode} \newcommand*{\sheetsep}{~} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \providecaptionname{ngerman, german}{\taskname}{Aufgabe} \providecaptionname{english, american, british}{\taskname}{Task} % \end{macrocode} % \begin{documentation} % \DescribeMacro{\tasksep} % % \end{documentation} % \begin{implementation} % \begin{macro}{\tasksep} % \begin{macrocode} \newcommand*{\tasksep}{~}%TODO % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \providecaptionname{ngerman, german}{\solutionname}{Lösungsvorschlag} \providecaptionname{english, american, british}{\solutionname}{Solution} % \end{macrocode} % \begin{documentation} % \DescribeMacro{\solutionsep} % % \end{documentation} % \begin{implementation} % \begin{macro}{\solutionsep} % \begin{macrocode} \newcommand*{\solutionsep}{:~} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \providecaptionname{ngerman, german}{\StudentNamename}{Nachname,~Vorname} \providecaptionname{english, american, british}{\StudentNamename}{Last Name,~ First Name} % \end{macrocode} % \begin{documentation} % \DescribeMacro{\StudentNamesep} % % \end{documentation} % \begin{implementation} % \begin{macro}{\StudentNamesep} % \begin{macrocode} \newcommand*{\StudentNamesep}{:~} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\StudentIDname} % % \end{documentation} % \begin{implementation} % \begin{macro}{\StudentIDname} % \begin{macrocode} \providecommand{\StudentIDname}{Matrikelnummer} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \providecaptionname{ngerman, german}{\StudentIDname}{Matrikelnummer} \providecaptionname{english, american, british}{\StudentIDname}{Enrollment ID} % \end{macrocode} % \begin{documentation} % \DescribeMacro{\StudentIDsep} % % \end{documentation} % \begin{implementation} % \begin{macro}{\StudentIDsep} % \begin{macrocode} \newcommand*{\StudentIDsep}{:~} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\creditformat} % % \end{documentation} % \begin{implementation} % \begin{macro}{\creditformat} % \begin{macrocode} \providecommand{\creditformat}[1]{\space(#1)} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\creditformatsum} % % \end{documentation} % \begin{implementation} % \begin{macro}{\creditformatsum} % \begin{macrocode} \providecommand{\creditformatsum}[1]{\creditformat{#1}} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\pointformat} % % \end{documentation} % \begin{implementation} % \begin{macro}{\pointformat} % \begin{macrocode} \newcommand*{\pointformat}[1]{ \fp_compare:nF {#1 = 0} { \bool_if:NTF \l_@@_points_auto_bool \creditformatsum \creditformat { \fp_to_decimal:n {#1}\space \fp_compare:nTF {#1=1} \PointName \PointsName } } } % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \providecaptionname{ngerman, german}{\PointName}{Punkt} \providecaptionname{english, american, british}{\PointName}{Point} % \end{macrocode} % \begin{documentation} % \DescribeMacro{\PointsName} % % \end{documentation} % \begin{implementation} % \begin{macro}{\PointsName} % \begin{macrocode} \providecommand{\PointsName}{Punkte} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \providecaptionname{ngerman, german}{\PointsName}{Punkte} \providecaptionname{english, american, british}{\PointsName}{Points} % \end{macrocode} % Has to be initialized after captionnames have been defined % \begin{macrocode} \AtBeginDocument{ \ptxcd_update_headline_boxes: \_@@_adjust_headheight: \global\let\ConfigureHeadline\ptxcd_ConfigureHeadline:n } % \end{macrocode} % task environment % \begin{macrocode} \DeclareSectionCommand[% style=section,% level=2,% indent=\z@,% beforeskip=\cs_if_exist_use:NF \scr@subsection@beforeskip {-3.25ex\@plus -1ex \@minus -.2ex},% afterskip=\cs_if_exist_use:NF \scr@subsection@afterskip {1.5ex \@plus .2ex},% tocstyle=section,% tocindent=\cs_if_exist_use:NF \scr@tso@subsection@indent {1.5em},% tocnumwidth=\cs_if_exist_use:NF \scr@tso@subsection@numwidth {2.3em},% ]{task} % \end{macrocode} % \begin{documentation} % \DescribeMacro{\thetask} % % \end{documentation} % \begin{implementation} % \begin{macro}{\thetask} % \begin{macrocode} \renewcommand*{\thetask}{ \g_ptxcd_ex_sheetnum_tl\tl_if_empty:NF \g_ptxcd_ex_sheetnum_tl{.} \arabic{task} } % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\taskformat} % % \end{documentation} % \begin{implementation} % \begin{macro}{\taskformat} % \begin{macrocode} \newcommand*{\tasklabel}{\thetask} \renewcommand*{\taskformat}{\taskname\tasksep\tasklabel{}} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \let\@task\task \cs_undefine:N \task % \end{macrocode} % \begin{documentation} % \DescribeEnv{task} % % \end{documentation} % \begin{environment}{task} % \begin{macrocode} \NewDocumentEnvironment{task}{om}{ \IfNoValueF{#1}{\keys_set:nn {ptxcd/task}{#1}} \@task{#2} \edef\@currenttasklabel{\tasklabel} }{ \_@@_save_task_properties:nnnn {} {\thetask} {#2} { \bool_if:NTF \l_@@_points_auto_bool { \fp_to_decimal:N \g_@@_ex_collected_points_fp }{ \fp_to_decimal:N \l_@@_task_points_fp } } \fp_gzero:N \g_@@_ex_collected_points_fp } % \end{macrocode} % \changes{v4.00}{2025-01-26}{Write task properties diractly per task/subtask} % \begin{macrocode} \cs_new:Nn \_@@_save_task_properties:nnnn { \iow_now:Ne \@auxout { \exp_not:N \ptxcd@TaskProperties {#1} {#2} { \tl_if_empty:cF {l_@@_#1credit_tl} {credit=\tl_to_str:v {l_ptxcd_#1credit_tl},} \tl_if_blank:nF {#3} {title=\tl_to_str:n {#3},} } {#4} } \prop_gput:cee {g_@@_#1points_collector_prop} {#2} {#4} } \cs_generate_variant:Nn \_@@_save_task_properties:nnnn {nnon} % \end{macrocode} % % \begin{macrocode} \iffalse \newcommand*{\addsubtasktocentry}[4]{ \show\subtaskentry %% {Dateierweiterung }{Ebene }{Gliederungsnummer }{Eintrag } %\IfArgIsEmpty {#3}{\addcontentsline {#1}{#2}{\protect \nonumberline #4}}{\addcontentsline {#1}{#2}{\protect \numberline {#3}#4}} \tocbasic@addxcontentsline{#1}{#2}{#3}{#4} \iow_now:Ne \@auxout { \exp_not:N \ptxcd@TaskProperties {\the\c@task} {\the\c@subtask} {\tl_to_str:n {#2}} { \bool_if:NTF \l_@@_points_auto_bool { \fp_to_decimal:N \l_@@_task_points_fp }{ \fp_to_decimal:N \g_@@_ex_collected_points_fp } } } } \fi %\ptxcd@TaskProperties {}{5.10}{Einheitliche Syntax für Task/Subtask}{0} \newcommand*\ptxcd@TaskProperties [4]{ \prop_gput:cnn {g_@@_#1points_collector_prop} {#2} {#4} \clist_map_inline:nn {#3} { \prop_gput_from_keyval:Nn \g_@@_property_collector_prop { #2-##1 } } \prop_gput:Nnn \g_@@_property_collector_prop {#2-points} {#4} } % \end{macrocode} % \end{environment} % \end{implementation} % % \begin{macrocode} \cs_set_eq:cN {task*} \task \cs_set_eq:cN {endtask*} \endtask % \end{macrocode} % subtasks % \begin{macrocode} \DeclareSectionCommand[% style=section,% level=3,% indent=\z@,% beforeskip=\cs_if_exist_use:NF \scr@subsubsection@beforeskip {-3.25ex\@plus -1ex \@minus -.2ex},% afterskip=\cs_if_exist_use:NF \scr@subsubsection@afterskip {1.5ex \@plus .2ex},% tocstyle=subsection,% tocindent=\cs_if_exist_use:NF \scr@tso@subsubsection@indent {1.5em},% tocnumwidth=\cs_if_exist_use:NF \scr@tso@subsubsection@numwidth {2.3em},% counterwithin=task,% ]{subtask} \bool_if:NT \g_@@_runin_subtask_bool { \RedeclareSectionCommand[runin=true]{subtask} } % \end{macrocode} % \begin{documentation} % \DescribeMacro{\thesubtask} % % \end{documentation} % \begin{implementation} % \begin{macro}{\thesubtask} % \begin{macrocode} \renewcommand*{\thesubtask}{\alph{subtask})} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{documentation} % \DescribeMacro{\subtaskformat} % % \end{documentation} % \begin{implementation} % \begin{macro}{\subtaskformat} % \begin{macrocode} \newcommand*{\subtasklabel}{\thetask\thesubtask} \renewcommand*{\subtaskformat}{\subtasklabel\enskip} % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \setkomafont{subtask}{\mdseries\normalsize} \let\@subtask\subtask \cs_undefine:N \subtask % \end{macrocode} % \begin{documentation} % \DescribeEnv{subtask} % % \end{documentation} % \begin{environment}{subtask} % \begin{macrocode} \NewDocumentEnvironment{subtask}{o}{ \begingroup \tl_if_in:nnTF {#1} {=} { \keys_set:nn {ptxcd/subtask} {#1} } { \keys_set:nn {ptxcd/subtask} {title={#1}} } \bool_if:NTF \l_@@_subtask_fallback_bool { \@subtask{\IfNoValueF{#1}{#1}} }{ \@subtask{\l_@@_title_tl} } \edef\@currenttasklabel{\subtasklabel} \_@@_save_task_properties:nnon {subtask_} {\@currenttasklabel} {\l_@@_title_tl} {\fp_to_decimal:N \l_@@_subtask_points_fp} \bool_if:NT \g_@@_runin_subtask_bool \strut \tl_gset_eq:NN \g_tmpa_tl \@currentlabel \endgroup \edef\@currentcounter{subtask} \protected@edef\@currentlabel{\p@subtask\thesubtask} }{} % \end{macrocode} % \end{environment} % \end{implementation} % % \begin{documentation} % \DescribeEnv{subtask*} % % \end{documentation} % \begin{environment}{subtask*} % \begin{macrocode} \NewDocumentEnvironment{subtask*}{om}{ \begingroup \IfNoValueF{#1}{\keys_set:nn {ptxcd/subtask}{#1}} \@subtask{#2} \tl_gset_eq:NN \g_tmpa_tl \@currentlabel \endgroup \tl_set_eq:NN \@currentlabel \g_tmpa_tl }{} % Solution mechanism % \DeclareSectionCommand[% style=section,% level=3,% indent=\z@,% beforeskip=\cs_if_exist_use:NF \scr@subsubsection@beforeskip {-3.25ex\@plus -1ex \@minus -.2ex},% afterskip=\cs_if_exist_use:NF \scr@subsubsection@afterskip {1.5ex \@plus .2ex},% tocstyle=subsection,% tocindent=\cs_if_exist_use:NF \scr@tso@subsubsection@indent {1.5em},% tocnumwidth=\cs_if_exist_use:NF \scr@tso@subsubsection@numwidth {2.3em},% ]{@solution} \setkomafont{@solution}{\normalfont} \cs_new:Nn \_@@_solutionheader: { \@solution*{\solutionname\solutionsep} \if@newlist\global\@newlistfalse\fi } % \end{macrocode} % \end{environment} % \end{implementation} % % \begin{macrocode} \box_new:N \g_ptxcd_NumberForm_box \hbox_gset:Nn \g_ptxcd_NumberForm_box { \rule{\fboxrule}{1ex} \rule{1em}{\fboxrule} \rule{\fboxrule}{1ex} \, } % \end{macrocode} % \begin{documentation} % \DescribeMacro{\ptxcd_StudentID} % % \end{documentation} % \begin{implementation} % \begin{macro}{\ptxcd_StudentID} % \begin{macrocode} \newcommand*\ptxcd_StudentID[1][7]{ \StudentIDname\StudentIDsep\prg_replicate:nn {#1} {\box_use:N \g_ptxcd_NumberForm_box} } % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \let\StudentID\ptxcd_StudentID % \end{macrocode} % \begin{documentation} % \DescribeMacro{\ptxcd_StudentName} % % \end{documentation} % \begin{implementation} % \begin{macro}{\ptxcd_StudentName} % \begin{macrocode} \newcommand*\ptxcd_StudentName{ \StudentNamename\StudentNamesep\hrulefill\qquad } % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \let\StudentName\ptxcd_StudentName \let\ShortTitle\g_ptxcd_shorttitle_tl % \end{macrocode} % Compatibility Features % % \begin{macrocode} \bool_if:NT \g_@@_compatibility_bool { \cs_set_eq:NN \c@subsection \c@task \cs_set_eq:NN \subsection \task \cs_set_eq:NN \c@subsubsection \c@subtask \cs_set_eq:NN \subsubsection \subtask \cs_set_eq:NN \thetask \thesubsection \cs_set_eq:NN \thesubtask \thesubsection } \file_if_exist_input:n {\g_@@_config_prefix_tl\g_ptxcd_department_str.cfg} \ptxcd_makeheadrule[color=identbarcolor, width=\textwidth]{ptxcd_headrule} % \end{macrocode} % Point referencing % \begin{macrocode} \cs_if_exist:NTF \AddtoDoHook { \AddtoDoHook{heading/preinit/subtask}{ \bool_if:NT \g_@@_points_bool { \fp_gadd:Nn \g_@@_ex_collected_points_fp {\l_@@_subtask_points_fp} } } \AddtoDoHook{heading/preinit/task}{ \fp_gzero:N \g_@@_ex_collected_points_fp } } { \msg_warning:nnnn {tudaexercise} {outdated-koma-script} {point~references} {3.27} } \msg_new:nnn {tudaexercise} {points-differ} { Value~of~points~changed~for~at~least~one~task.\\ Please~rerun~LaTeX~to~get~correct~references~and~calculations. } \msg_new:nnn {tudaexercise} {empty-point-mapping} { I~could~not~find~references~for~points~in~the~aux~file.\\ Please~rerun~LaTeX~to~get~correct~references~and~calculations. } \msg_new:nnn {tudaexercise} {point-referencing-disabled} { You~try~to~use~#1.\\ This~function~is~only~available~with~points=true~or~points=auto.\\ Please~activate~referencing~to~use~it. } \bool_if:NTF \g_@@_points_bool { \BeforeClosingMainAux{ \tl_clear:N \l_tmpa_tl \tl_clear:N \l_tmpb_tl \fp_zero:N \l_tmpa_fp \prop_map_inline:Nn \g_@@_points_collector_prop { \tl_put_right:Nn \l_tmpa_tl {#1=#2,} \fp_add:Nn \l_tmpa_fp {#2} } \prop_map_inline:Nn \g_@@_subtask_points_collector_prop { \tl_put_right:Nn \l_tmpa_tl {#1=#2,} } \prop_map_inline:Nn \g_@@_loaded_points_prop { \tl_put_right:Nn \l_tmpb_tl {#1=#2,} } \tl_if_eq:NNF \l_tmpa_tl \l_tmpb_tl { \msg_warning:nn {tudaexercise} {points-differ} } \iow_now:Nx \@auxout{ \exp_not:N \ptxcd@LoadPoints[\the\c@task][\fp_use:N \l_tmpa_fp]{\l_tmpa_tl} } } \cs_new:Nn \_@@_getPoints:n { \prop_if_in:NnTF \g_@@_loaded_points_prop {#1} {\prop_item:Nn \g_@@_loaded_points_prop {#1}} {\nfss@text{\reset@font\bfseries??}} } \cs_generate_variant:Nn \_@@_getPoints:n {x} \newcommand{\getPoints}[1]{\_@@_getPoints:x {#1}} \newcommand{\refPoints}[1]{ \edef\x{#1} \cs_if_exist:cTF {r@\x} { \str_if_in:cnTF {r@\x} {subtask} { \tl_set_eq:Nc \l_tmpa_tl {r@\x} \getPoints{\tl_item:Nn \l_tmpa_tl {2}\tl_item:Nn \l_tmpa_tl {1}} } { \getPoints{\tl_head:v {r@\x}} } }{ \nfss@text{\reset@font\bfseries??} } } \newcommand{\getPointsTotal}{ \fp_use:N \g_@@_points_total_fp } % \end{macrocode} % \DescribeMacro{\getTaskProperty}\oarg{Task Number}{title/credit/points} % Suggested in PR \# 316 \url{https://github.com/tudace/tuda_latex_templates/pull/316} % \changes{v4.00}{2025-01-26}{Add Interface to access task title} % \begin{macrocode} \NewDocumentCommand{\getTaskProperty}{O{\@currenttasklabel}m}{ \exp_args:Ne \tl_show:n {#1-#2} \prop_show:N \g_@@_property_collector_prop \prop_if_in:NnTF \g_@@_property_collector_prop {#1-#2} {\prop_item:Nn \g_@@_property_collector_prop {#1-#2}} {{\nfss@text{\reset@font\bfseries??}}} } \NewDocumentCommand{\mapPoints}{sO{1}m}{ \mapTasks[skip-zero-points=true,\IfBooleanF{#1}{subtask=false},start-task=#2]{#3}{#3} } % \end{macrocode} % \changes{v4.00}{2025-01-26}{Add mapping Mechanismus including subtasks based on Pull-request 316} % \begin{Syntax} % \_@@_point_mapping_aux:nnn \marg{task/subtask} \marg{start value} \marg{action to do before continuing the loop} % \end{Syntax} % \begin{macrocode} \cs_new:Nn \_@@_point_mapping_aux:nnn { \bool_set_true:c {l_@@_#1_bool} \cs_set:ce {_@@_cached_#1_counter:} {\int_eval:n {\value{#1}}} \setcounter{#1}{#2} \bool_while_do:cn {l_@@_#1_bool} { \prop_get:NeNTF \g_@@_loaded_points_prop {\use:c {#1label}} \l_tmpa_tl { % \end{macrocode} % mechanism to skip item if it doesn't have points % \begin{macrocode} \bool_if:NT \l_@@_skip_zero_points_bool {\fp_compare:nF {\l_tmpa_tl = 0}} \use:n { \tl_build_put_right:Ne \l_ptxcd_tmp_tl { \exp_not:c {_@@_map_points_#1:nn} {\use:c {#1label}} {\l_tmpa_tl} } } #3 \stepcounter{#1} } {\bool_set_false:c {l_@@_#1_bool}} } \setcounter{#1}{\use:c {_@@_cached_#1_counter:}} } % \end{macrocode} % \changes{v4.00}{2025-01-26}{Add generic mechanism to iterate over tasks} % \begin{macrocode} \keys_define:nn {ptxcd/task-mapping} { task .bool_set:N = \l_@@_task_bool, task .initial:n = false, subtask .bool_set:N = \l_@@_subtask_bool, subtask .initial:n = false, skip-zero-points .bool_set:N = \l_@@_skip_zero_points_bool, skip-zero-points .initial:n = false, start-task .int_set:N = \l_@@_start_task_int, start-task .initial:n = 1, } \NewDocumentCommand{\mapTasks}{O{}+m+m}{ \cs_gset:Ne \_@@_restore_task_counters: { \exp_not:N \setcounter{task}{\the\value{task}} \exp_not:N \setcounter{subtask}{\the\value{subtask}} } \group_begin: \keys_set:ne {ptxcd/task-mapping} { task = true, subtask=true, #1 } \cs_gset:Nn \_@@_map_points_task:nn {#2} \cs_gset:Nn \_@@_map_points_subtask:nn {#3} \prop_if_empty:NTF \g_@@_loaded_points_prop { \msg_warning:nn {tudaexercise} {empty-point-mapping} \tl_set:Nn \l_ptxcd_tmp_tl {\_@@_map_points_task:nn {?task?} {?points?}} } { \tl_build_begin:N \l_ptxcd_tmp_tl \exp_args:Nne \use:n { \bool_if:NTF \l_@@_task_bool \use:n \use_ii:nn {\_@@_point_mapping_aux:nnn {task} {\int_use:N \l_@@_start_task_int}} }{ \bool_if:NT \l_@@_subtask_bool { \exp_not:n { \bool_set_true:N \l_@@_subtask_bool \_@@_point_mapping_aux:nnn {subtask} {1} {} } } } \tl_build_end:N \l_ptxcd_tmp_tl } \cs_gset_eq:NN \g_ptxcd_tmp_tl \l_ptxcd_tmp_tl \exp_last_unbraced:No \group_end: \g_ptxcd_tmp_tl % \end{macrocode} % check if between tabular rows to use \noalign % \begin{macrocode} \ifhmode\else\ifvoid\@arstrutbox\else\noalign\fi\fi {\_@@_restore_task_counters:} } } { \newcommand{\getPoints}[1]{ \msg_error:nnn {tudaexercise} {point-referencing-disabled} {\getPoints} } \newcommand{\refPoints}[1]{ \msg_error:nnn {tudaexercise} {point-referencing-disabled} {\refPoints} } \newcommand{\getPointsTotal}[1]{ \msg_error:nnn {tudaexercise} {point-referencing-disabled} {\getPointsTotal} } \NewDocumentCommand{\mapPoints}{som} { \msg_error:nnn {tudaexercise} {point-referencing-disabled} {\mapPoints} } \NewDocumentCommand{\getTaskProperty}{om}{ \msg_error:nnn {tudaexercise} {point-referencing-disabled} {\getTaskProperty} } } % \end{macrocode} % \begin{documentation} % \DescribeMacro{\ptxcd@LoadPoints} % % \end{documentation} % \begin{implementation} % \begin{macro}{\ptxcd@LoadPoints} % \begin{macrocode} \int_new:N \g_@@_max_task_int \NewDocumentCommand{\ptxcd@LoadPoints}{oO{0}m}{ \IfNoValueF{#1}{\int_gset:Nn \g_@@_max_task_int {#1}} \prop_gset_from_keyval:Nn \g_@@_loaded_points_prop { #3 } \fp_gset:Nn \g_@@_points_total_fp {#2} } % \end{macrocode} % \end{macro} % \end{implementation} % % \begin{macrocode} \endinput % \end{macrocode} % % \iffalse % % \fi % \Finale % \fi^^A No documentation on this \endinput