diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/exsheets/tasks.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/exsheets/tasks.sty | 166 |
1 files changed, 114 insertions, 52 deletions
diff --git a/Master/texmf-dist/tex/latex/exsheets/tasks.sty b/Master/texmf-dist/tex/latex/exsheets/tasks.sty index 14981e67db8..b6f2d01eef5 100644 --- a/Master/texmf-dist/tex/latex/exsheets/tasks.sty +++ b/Master/texmf-dist/tex/latex/exsheets/tasks.sty @@ -28,8 +28,8 @@ % If you have any ideas, questions, suggestions or bugs to report, please % feel free to contact me. % -------------------------------------------------------------------------- -\def\@tasks@date{2013/04/04} -\def\@tasks@version{0.8a} +\def\@tasks@date{2013/04/07} +\def\@tasks@version{0.9} \RequirePackage { expl3 , xparse , l3keys2e } \ProvidesExplPackage @@ -46,7 +46,7 @@ \int_new:N \l__tasks_depth_int \int_new:N \g__tasks_int -\int_new:N \l__tasks_total_items_int +\int_new:N \g__tasks_total_items_int \int_new:N \l__tasks_columns_int \int_new:N \l__tasks_rows_int @@ -55,10 +55,15 @@ \bool_new:N \l__tasks_load_tasks_bool \bool_new:N \l__tasks_label_width_bool \bool_new:N \l__tasks_label_offset_bool +\bool_new:N \l__tasks_custom_label_bool +\bool_new:N \l__tasks_custom_after_item_skip_bool \tl_new:N \l__tasks_instance_tl \tl_new:N \l__tasks_label_tl +\tl_new:N \l__tasks_custom_label_tl \tl_new:N \l__tasks_label_pattern_tl +\tl_new:N \l__tasks_custom_label_pattern_tl +\tl_new:N \l__tasks_label_format_tl \tl_new:N \l__tasks_custom_label_format_tl \tl_new:N \l__tasks_item_fill_left_tl \tl_new:N \l__tasks_item_fill_right_tl @@ -75,6 +80,7 @@ \dim_new:N \l__tasks_label_default_offset_dim \skip_new:N \l__tasks_after_item_skip +\skip_new:N \l__tasks_custom_after_item_skip \skip_new:N \l__tasks_before_list_skip \skip_new:N \l__tasks_after_list_skip @@ -83,13 +89,14 @@ % scratch variables: \tl_new:N \l__tasks_tmpa_tl -\int_new:N \l__tasks_tmpa_int +\int_new:N \g__tasks_tmpa_int +\int_new:N \l__tasks_tmpb_int \coffin_new:N \l__tasks_tmpa_coffin \coffin_new:N \l__tasks_tmpb_coffin \coffin_new:N \l__tasks_tmpc_coffin % collect the tasks: -\cs_new:Npn \__tasks_collect_tasks:nw #1#2 \end #3 +\cs_new_protected:Npn \__tasks_collect_tasks:nw #1#2 \end #3 { \tl_put_right:Nn \l__tasks_body_tl { #1 } \end { #3 } @@ -101,37 +108,40 @@ % #2: number of columns % #3: item separator % #4: environment body -\cs_new:Npn \__tasks:nnnn #1#2#3#4 +\cs_new_protected:Npn \__tasks:nnnn #1#2#3#4 { \seq_set_split:Nnn \l__tasks_seq { #3 } { #4 } % remove the first (empty) item: \seq_pop_left:NN \l__tasks_seq \l__tasks_tmpa_tl \tl_if_blank:VF \l__tasks_tmpa_tl { \tl_show:N \l__tasks_tmpa_tl \@noitemerr } - \int_set:Nn \l__tasks_total_items_int + \int_gset:Nn \g__tasks_total_items_int { \seq_count:N \l__tasks_seq } \UseInstance { tasks } { #1 } - { \l__tasks_total_items_int } + { \g__tasks_total_items_int } { #2 } - { \l__tasks_custom_label_format_tl } + { \l__tasks_custom_label_pattern_tl } % just to be sure: \seq_clear:N \l__tasks_seq } \cs_generate_variant:Nn \__tasks:nnnn { VnnV } -\cs_new:Npn \__tasks_task:nnw #1#2[#3,#4][#5,#6](#7,#8) +\cs_new_protected:Npn \__tasks_task:nnw #1#2[#3,#4][#5,#6](#7,#8) { \dim_set:Nn \l__tasks_item_width_dim { \linewidth / \l__tasks_columns_int - \l__tasks_depth_int \l__tasks_item_indent_dim } - \int_incr:N \l__tasks_tmpa_int - \__tasks_set_rows_num:NN - \l__tasks_total_items_int + \int_gincr:N \g__tasks_tmpa_int + \__tasks_gset_rows_num:NN + \g__tasks_total_items_int \l__tasks_columns_int - \int_compare:nT { \l__tasks_tmpa_int > \l__tasks_columns_int } - { \int_set:Nn \l__tasks_tmpa_int { 1 } } + \int_compare:nT { \g__tasks_tmpa_int > \l__tasks_columns_int } + { + \int_gset:Nn \g__tasks_tmpa_int { 1 } + \int_incr:N \l__tasks_tmpb_int + } % the item: \hcoffin_set:Nn \l__tasks_tmpa_coffin { @@ -155,13 +165,18 @@ { -\l__tasks_label_width_dim - \l__tasks_label_offset_dim } { 0pt } % typeset label & item: % need this when a new row starts: - \int_compare:nT { \l__tasks_tmpa_int = 1 } + \int_compare:nT { \g__tasks_tmpa_int = 1 } { \skip_vertical:N \c_zero_skip } \skip_horizontal:N \l__tasks_item_indent_dim \coffin_typeset:Nnnnn \l__tasks_tmpa_coffin { l } { T } { 0pt } { 0pt } % need this before a new row starts: - \int_compare:nT { \l__tasks_tmpa_int = \l__tasks_columns_int } + \bool_if:nT + { + ( \int_compare_p:n { \g__tasks_tmpa_int = \l__tasks_columns_int } ) + && + ( \int_compare_p:n { \l__tasks_tmpb_int != \l__tasks_rows_int } ) + } { \skip_vertical:N \l__tasks_after_item_skip } \coffin_clear:N \l__tasks_tmpa_coffin \coffin_clear:N \l__tasks_tmpb_coffin @@ -169,7 +184,7 @@ } \cs_generate_variant:Nn \__tasks_task:nnw { VV } -\cs_new:Npn \__tasks_setup: +\cs_new_protected:Npn \__tasks_setup: { \dim_set:Nn \parskip { 0pt } \skip_set:Nn \parfillskip { 0pt plus 1fil } @@ -178,14 +193,14 @@ \strut } -\cs_new:Npn \__tasks_set_rows_num:NN #1#2 +\cs_new_protected:Npn \__tasks_gset_rows_num:NN #1#2 { - \int_set:Nn \l__tasks_rows_int { \int_div_truncate:nn { #1 } { #2 } } + \int_gset:Nn \l__tasks_rows_int { \int_div_truncate:nn { #1 } { #2 } } \int_compare:nNnT { \int_mod:nn { #1 } { #2 } } > { 0 } - { \int_incr:N \l__tasks_rows_int } + { \int_gincr:N \l__tasks_rows_int } } -\cs_new:Npn \__tasks_label_align:n #1 +\cs_new_protected:Npn \__tasks_label_align:n #1 { \clist_if_in:nnTF { left , center , right } { #1 } { @@ -224,9 +239,10 @@ enumerate : boolean = true , label : tokenlist , indent : length = 2.5em , - label-format : tokenlist = tsk[a]) , - label-width : length = 3ex , - label-offset : length = 1ex , + counter-format : tokenlist = tsk[a]) , + label-format : tokenlist , + label-width : length = 1em , + label-offset : length = .3333em , after-item-skip : skip = 1ex plus 1ex minus 1ex } % the `default' template code: @@ -235,7 +251,8 @@ enumerate = \l__tasks_enumerate_bool , label = \l__tasks_label_tl , indent = \l__tasks_item_indent_dim , - label-format = \l__tasks_label_pattern_tl , + counter-format = \l__tasks_label_pattern_tl , + label-format = \l__tasks_label_format_tl , label-width = \l__tasks_label_default_width_dim , label-offset = \l__tasks_label_default_offset_dim , after-item-skip = \l__tasks_after_item_skip @@ -254,17 +271,37 @@ \l__tasks_label_offset_dim \l__tasks_label_default_offset_dim } + \bool_if:NT \l__tasks_custom_after_item_skip_bool + { + \skip_set_eq:NN + \l__tasks_after_item_skip + \l__tasks_custom_after_item_skip + } + \bool_if:NT \l__tasks_custom_label_bool + { + \tl_set_eq:NN + \l__tasks_label_tl + \l__tasks_custom_label_tl + \bool_set_false:N \l__tasks_enumerate_bool + } \__tasks_label_align:V \l__tasks_label_align_tl % need this for enumerate list: \bool_if:nT { !\l__tasks_resume_bool && \l__tasks_enumerate_bool } { \int_gzero:N \g__tasks_int } \int_set:Nn \l__tasks_columns_int { #2 } % set all the items in their own coffins and join with the ground: - \int_zero:N \l__tasks_tmpa_int - \tl_if_blank:VF \l__tasks_custom_label_format_tl + \int_gzero:N \g__tasks_tmpa_int + \int_set:Nn \l__tasks_tmpb_int { 1 } + \tl_if_blank:VF \l__tasks_custom_label_pattern_tl { \tl_set_eq:NN \l__tasks_label_pattern_tl + \l__tasks_custom_label_pattern_tl + } + \tl_if_blank:VF \l__tasks_custom_label_format_tl + { + \tl_set_eq:NN + \l__tasks_label_format_tl \l__tasks_custom_label_format_tl } \seq_map_inline:Nn \l__tasks_seq @@ -272,21 +309,22 @@ \__tasks_read_item:w ##1 \q_stop \bool_if:NTF \l__tasks_enumerate_bool { - \int_gincr:N \g__tasks_int - \tl_if_blank:VT \l__tasks_label_tl + \tl_if_eq:VnT \l__tasks_tmp_label_tl { @tasks@default@label@ } { - \tl_set:Nn \l__tasks_label_tl - { - \ReadCounterPatternFrom [ tasks ] - \l__tasks_label_pattern_tl - } + \int_gincr:N \g__tasks_int + \SaveCounterPatternFrom [ tasks ] + \l__tasks_tmpa_tl + \l__tasks_label_tl + \l__tasks_label_pattern_tl + \cs_gset:Npx \@currentlabel { \l__tasks_label_tl } } } { \tl_if_blank:VT \l__tasks_label_tl { \tl_set_eq:NN \l__tasks_label_tl \labelitemi } } - \tl_if_blank:VTF \l__tasks_tmp_label_tl + \tl_put_left:NV \l__tasks_label_tl \l__tasks_label_format_tl + \tl_if_eq:VnTF \l__tasks_tmp_label_tl { @tasks@default@label@ } { \__tasks_task:VVw \l__tasks_label_tl @@ -302,18 +340,21 @@ } } } +\cs_generate_variant:Nn \tl_if_eq:nnTF { V } +\cs_generate_variant:Nn \tl_if_eq:nnT { V } \cs_new:Npn \__tasks_read_item:w { \peek_meaning:NTF [ { \__tasks_read_item_aux:w } - { \__tasks_read_item_aux:w[] } + { \__tasks_read_item_aux:w[@tasks@default@label@] } } -\cs_new:Npn \__tasks_read_item_aux:w [#1]#2 \q_stop +\cs_new_protected:Npn \__tasks_read_item_aux:w [#1]#2 \q_stop { - \tl_if_blank:nF { #1 } - { \tl_set:Nn \l__tasks_tmp_label_tl { #1 } } + \tl_set:Nn \l__tasks_tmp_label_tl { #1 } + \tl_if_eq:nnF { #1 } { @tasks@default@label@ } + { \tl_put_left:NV \l__tasks_tmp_label_tl \l__tasks_label_format_tl } \tl_set:Nn \l__tasks_item_tl { \ignorespaces #2 } } @@ -328,7 +369,7 @@ \dim_new:N \l__tasks_choice_raise_dim \dim_set:Nn \l__tasks_choice_raise_dim { .1ex } -\cs_new:Npn \tasks_choice: +\cs_new_protected:Npn \tasks_choice: { \leavevmode \bool_set_false:N \l__tasks_choice_checked_bool @@ -337,7 +378,7 @@ { \hbox:n { \__tasks_choice: } } } -\cs_new:Npn \tasks_choice_checked: +\cs_new_protected:Npn \tasks_choice_checked: { \leavevmode \bool_set_true:N \l__tasks_choice_checked_bool @@ -346,7 +387,7 @@ { \hbox:n { \__tasks_choice: } } } -\cs_new:Npn \__tasks_choice: +\cs_new_protected:Npn \__tasks_choice: {% \dim_set:Nn \unitlength { .1\l__tasks_choice_width_dim } \begin{picture}(10,0) @@ -370,18 +411,25 @@ \keys_define:nn { tasks / list } { - style .tl_set:N = \l__tasks_instance_tl , - label .tl_set:N = \l__tasks_custom_label_format_tl , - label-width .code:n = + style .tl_set:N = \l__tasks_instance_tl , + counter-format .tl_set:N = \l__tasks_custom_label_pattern_tl , + label .code:n = + \bool_set_true:N \l__tasks_custom_label_bool + \tl_set:Nn \l__tasks_custom_label_tl { #1 } , + label-format .tl_set:N = \l__tasks_custom_label_format_tl , + label-width .code:n = \dim_set:Nn \l__tasks_label_width_dim { #1 } \bool_set_true:N \l__tasks_label_width_bool , - label-offset .code:n = + label-offset .code:n = \dim_set:Nn \l__tasks_label_offset_dim { #1 } \bool_set_true:N \l__tasks_label_offset_bool , - label-align .tl_set:N = \l__tasks_label_align_tl , - before-skip .skip_set:N = \l__tasks_before_list_skip , - after-skip .skip_set:N = \l__tasks_after_list_skip , - resume .bool_set:N = \l__tasks_resume_bool + label-align .tl_set:N = \l__tasks_label_align_tl , + before-skip .skip_set:N = \l__tasks_before_list_skip , + after-skip .skip_set:N = \l__tasks_after_list_skip , + after-item-skip .code:n = + \bool_set_true:N \l__tasks_custom_after_item_skip_bool + \skip_set:Nn \l__tasks_custom_after_item_skip { #1 } , + resume .bool_set:N = \l__tasks_resume_bool } % the generic environment: @@ -404,6 +452,20 @@ \skip_vertical:N \l__tasks_after_list_skip } +% command to start a new row: +\cs_new_protected:Npn \tasks_new_row: + { + \int_gset:Nn \g__tasks_total_items_int + { \g__tasks_total_items_int + \l__tasks_columns_int - \g__tasks_tmpa_int } + \__tasks_gset_rows_num:NN + \g__tasks_total_items_int + \l__tasks_columns_int + \int_gset_eq:NN \g__tasks_tmpa_int \l__tasks_columns_int + } + +\NewDocumentCommand \startnewitemline {} + { \tasks_new_row: } + % the user environment: \NewDocumentCommand \NewTasks { O{}mO{\task}D(){1} } { @@ -436,7 +498,7 @@ { \input { tasks.cfg } } } -\cs_new:Npn \tasks_setup:n #1 +\cs_new_protected:Npn \tasks_setup:n #1 { \keys_set:nn { tasks / list } { #1 } } \NewDocumentCommand \settasks { m } |