diff options
Diffstat (limited to 'Master/texmf-dist/tex/latex/exsheets/tasks.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/exsheets/tasks.sty | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/exsheets/tasks.sty b/Master/texmf-dist/tex/latex/exsheets/tasks.sty new file mode 100644 index 00000000000..88b613d7dbd --- /dev/null +++ b/Master/texmf-dist/tex/latex/exsheets/tasks.sty @@ -0,0 +1,445 @@ +% -------------------------------------------------------------------------- +% the TASKS package +% +% Horizontal columned lists. +% +% -------------------------------------------------------------------------- +% Clemens Niederberger +% Web: https://bitbucket.org/cgnieder/exsheets/ +% E-Mail: contact@mychemistry.eu +% -------------------------------------------------------------------------- +% Copyright 2011-2013 Clemens Niederberger +% +% This work may be distributed and/or modified under the +% conditions of the LaTeX Project Public License, either version 1.3 +% 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.3 or later is part of all distributions of LaTeX +% version 2005/12/01 or later. +% +% This work has the LPPL maintenance status `maintained'. +% +% The Current Maintainer of this work is Clemens Niederberger. +% -------------------------------------------------------------------------- +% The tasks package consists of the files +% - tasks.sty, tasks.cfg +% -------------------------------------------------------------------------- +% If you have any ideas, questions, suggestions or bugs to report, please +% feel free to contact me. +% -------------------------------------------------------------------------- +\def\@tasks@date{2013/01/20} +\def\@tasks@version{0.7} + +\RequirePackage { expl3 , xparse , l3keys2e } +\ProvidesExplPackage + {tasks} + {\@tasks@date} + {\@tasks@version} + {Horizontal columned lists.} + +% requirements: +\RequirePackage { epic , cntformats , xtemplate , environ } + +% variables: +\seq_new:N \l__tasks_seq + +\int_new:N \l__tasks_depth_int +\int_new:N \g__tasks_int +\int_new:N \l__tasks_total_items_int +\int_new:N \l__tasks_columns_int +\int_new:N \l__tasks_rows_int + +\bool_new:N \l__tasks_enumerate_bool +\bool_new:N \l__tasks_resume_bool +\bool_new:N \l__tasks_load_tasks_bool +\bool_new:N \l__tasks_label_width_bool +\bool_new:N \l__tasks_label_offset_bool + +\tl_new:N \l__tasks_instance_tl +\tl_new:N \l__tasks_label_tl +\tl_new:N \l__tasks_label_pattern_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 +\tl_new:N \l__tasks_label_align_tl +\tl_new:N \task +\tl_new:N \l__tasks_item_tl +\tl_new:N \l__tasks_tmp_label_tl + +\dim_new:N \l__tasks_item_indent_dim +\dim_new:N \l__tasks_item_width_dim +\dim_new:N \l__tasks_label_width_dim +\dim_new:N \l__tasks_label_default_width_dim +\dim_new:N \l__tasks_label_offset_dim +\dim_new:N \l__tasks_label_default_offset_dim + +\skip_new:N \l__tasks_after_item_skip +\skip_new:N \l__tasks_before_list_skip +\skip_new:N \l__tasks_after_list_skip + +\NewCounterPattern* [ tasks ] { task } { tsk } +\ReadCounterFrom [ tasks ] { task } \g__tasks_int + +% scratch variables: +\tl_new:N \l__tasks_tmpa_tl +\int_new:N \l__tasks_tmpa_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 + { + \tl_put_right:Nn \l__tasks_body_tl { #1 } + \end { #3 } + \tl_if_eq:nnF { #1 } { #3 } + { \__tasks_collect_tasks:nw { #1 } } + } + +% #1: instance +% #2: number of columns +% #3: item separator +% #4: environment body +\cs_new: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 + { \seq_length:N \l__tasks_seq } + \UseInstance { tasks } { #1 } + { \l__tasks_total_items_int } + { #2 } + { \l__tasks_custom_label_format_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) + { + \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 + \l__tasks_columns_int + \int_compare:nT { \l__tasks_tmpa_int > \l__tasks_columns_int } + { \int_set:Nn \l__tasks_tmpa_int { 1 } } + % the item: + \hcoffin_set:Nn \l__tasks_tmpa_coffin + { + \vcoffin_set:Nnn \l__tasks_tmpc_coffin + { \l__tasks_item_width_dim } + { \__tasks_setup: #2 } + \coffin_typeset:Nnnnn \l__tasks_tmpc_coffin + { l } { T } { 0pt } { 0pt } + } + % the label: + \vcoffin_set:Nnn \l__tasks_tmpb_coffin + { \l__tasks_label_width_dim } + { + \tl_use:N \l__tasks_item_fill_left_tl + \strut #1 + \tl_use:N \l__tasks_item_fill_right_tl + } + \coffin_attach:NnnNnnnn + \l__tasks_tmpa_coffin { l } { T } + \l__tasks_tmpb_coffin { l } { T } + { -\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 } + { \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 } + { \skip_vertical:N \l__tasks_after_item_skip } + \coffin_clear:N \l__tasks_tmpa_coffin + \coffin_clear:N \l__tasks_tmpb_coffin + \coffin_clear:N \l__tasks_tmpc_coffin + } +\cs_generate_variant:Nn \__tasks_task:nnw { VV } + +\cs_new:Npn \__tasks_setup: + { + \dim_set:Nn \parskip { 0pt } + \skip_set:Nn \parfillskip { 0pt plus 1fil } + \dim_set_eq:NN \parskip \parsep + \dim_set_eq:NN \parindent \listparindent + \strut + } + +\cs_new:Npn \__tasks_set_rows_num:NN #1#2 + { + \int_set: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 } + } + +\cs_new:Npn \__tasks_label_align:n #1 + { + \clist_if_in:nnTF { left , center , right } { #1 } + { + \tl_if_eq:nnT { #1 } { left } + { + \tl_clear:N \l__tasks_item_fill_left_tl + \tl_set_eq:NN \l__tasks_item_fill_right_tl \hfil + } + \tl_if_eq:nnT { #1 } { right } + { + \tl_set_eq:NN \l__tasks_item_fill_left_tl \hfill + \tl_clear:N \l__tasks_item_fill_right_tl + } + \tl_if_eq:nnT { #1 } { center } + { + \tl_set_eq:NN \l__tasks_item_fill_left_tl \hfil + \tl_set_eq:NN \l__tasks_item_fill_right_tl \hfil + } + } + { + \tl_clear:N \l__tasks_item_fill_left_tl + \tl_set_eq:NN \l__tasks_item_fill_right_tl \hfil + } + } +\cs_generate_variant:Nn \__tasks_label_align:n { V } +\__tasks_label_align:n { left } + +% the `tasks' object: +% #1: number of items +% #2: number of columns +% #3: label-format +\DeclareObjectType { tasks } { 3 } +% the `default' template interface: +\DeclareTemplateInterface { tasks } { default } { 3 } + { + enumerate : boolean = true , + label : tokenlist , + indent : length = 2.5em , + label-format : tokenlist = tsk[a]) , + label-width : length = 3ex , + label-offset : length = 1ex , + after-item-skip : skip = 1ex plus 1ex minus 1ex + } +% the `default' template code: +\DeclareTemplateCode { tasks } { default } { 3 } + { + enumerate = \l__tasks_enumerate_bool , + label = \l__tasks_label_tl , + indent = \l__tasks_item_indent_dim , + label-format = \l__tasks_label_pattern_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 + } + { + \AssignTemplateKeys + \bool_if:NF \l__tasks_label_width_bool + { + \dim_set_eq:NN + \l__tasks_label_width_dim + \l__tasks_label_default_width_dim + } + \bool_if:NF \l__tasks_label_offset_bool + { + \dim_set_eq:NN + \l__tasks_label_offset_dim + \l__tasks_label_default_offset_dim + } + \__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 + { + \tl_set_eq:NN + \l__tasks_label_pattern_tl + \l__tasks_custom_label_format_tl + } + \seq_map_inline:Nn \l__tasks_seq + { + \__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_set:Nn \l__tasks_label_tl + { + \ReadCounterPatternFrom [ tasks ] + \l__tasks_label_pattern_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 + { + \__tasks_task:VVw + \l__tasks_label_tl + \l__tasks_item_tl + [ l , b ] [ l , t ] ( 0pt , 0pt ) + } + { + \__tasks_task:VVw + \l__tasks_tmp_label_tl + \l__tasks_item_tl + [ l , b ] [ l , t ] ( 0pt , 0pt ) + \tl_clear:N \l__tasks_tmp_label_tl + } + } + } + +\cs_new:Npn \__tasks_read_item:w + { + \peek_meaning:NTF [ + { \__tasks_read_item_aux:w } + { \__tasks_read_item_aux:w[] } + } + +\cs_new: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_item_tl { \ignorespaces #2 } + } + +% choice box: +\bool_new:N \l__tasks_choice_checked_bool +\dim_new:N \l__tasks_choice_width_dim +\dim_set:Nn \l__tasks_choice_width_dim { 1.25ex } +\dim_new:N \l__tasks_choice_linewidth_dim +\dim_set:Nn \l__tasks_choice_linewidth_dim { .3pt } +\dim_new:N \l__tasks_choice_checkwidth_dim +\dim_set:Nn \l__tasks_choice_checkwidth_dim { .5pt } +\dim_new:N \l__tasks_choice_raise_dim +\dim_set:Nn \l__tasks_choice_raise_dim { .1ex } + +\cs_new:Npn \tasks_choice: + { + \leavevmode + \bool_set_false:N \l__tasks_choice_checked_bool + \box_move_up:nn + { \l__tasks_choice_raise_dim } + { \hbox:n { \__tasks_choice: } } + } + +\cs_new:Npn \tasks_choice_checked: + { + \leavevmode + \bool_set_true:N \l__tasks_choice_checked_bool + \box_move_up:nn + { \l__tasks_choice_raise_dim } + { \hbox:n { \__tasks_choice: } } + } + +\cs_new:Npn \__tasks_choice: + {% + \dim_set:Nn \unitlength { .1\l__tasks_choice_width_dim } + \begin{picture}(10,0) + \linethickness \l__tasks_choice_linewidth_dim + \drawline(0,0)(0,10)(10,10)(10,0)(0,0) + \linethickness \l__tasks_choice_checkwidth_dim + \bool_if:NT \l__tasks_choice_checked_bool + { + \drawline(2,2)(8,8) + \drawline(2,8)(8,2) + } + \end{picture}% + } + +\providecommand* \choicebox { \tasks_choice: } +\providecommand* \checkedchoicebox { \tasks_choice_checked: } + +% base instance: +% ALPHABETIZE: a) b) c) +\DeclareInstance { tasks } { alphabetize } { default } { } + +\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 = + \dim_set:Nn \l__tasks_label_width_dim { #1 } + \bool_set_true:N \l__tasks_label_width_bool , + 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 + } + +% the generic environment: +\NewEnviron { __tasks_env: } [ 3 ] + { + \keys_set:nn { tasks / list } { #2 } + \tl_if_blank:VT \l__tasks_instance_tl + { \keys_set:nn { tasks / list } { style = alphabetize } } + \skip_vertical:N \l__tasks_before_list_skip + \skip_vertical:N \c_zero_skip + \list {} + { + \dim_set:Nn \leftmargin { 0pt } + \dim_set:Nn \rightmargin { 0pt } + } + \item \scan_stop: + \int_incr:N \l__tasks_depth_int + \__tasks:VnnV \l__tasks_instance_tl { #3 } { #1 } \BODY + \endlist + \skip_vertical:N \l__tasks_after_list_skip + } + +% the user environment: +\NewDocumentCommand \NewTasks { O{}mO{\task}D(){1} } + { + \NewDocumentEnvironment { #2 } { O{}D(){#4} } + { \__tasks_env: { #3 } { #1,##1 } { ##2 } } + { \end__tasks_env: } + } + +\NewDocumentCommand \RenewTasks { O{}mO{\task}D(){1} } + { + \RenewDocumentEnvironment { #2 } { O{}D(){#4} } + { \__tasks_env: { #3 } { #1,##1 } { ##2 } } + { \end__tasks_env: } + } + +% default list: +\NewTasks { tasks } + +% package options: +\keys_define:nn { tasks / options } + { + more .bool_set:N = \l__tasks_load_tasks_bool + } + +\ProcessKeysOptions { tasks / options } + +\bool_if:NT \l__tasks_load_tasks_bool + { + \cs_if_exist:NF \tasks_config_file_loaded: + { \input { tasks.cfg } } + } + +\cs_new:Npn \tasks_setup:n #1 + { \keys_set:nn { tasks / list } { #1 } } + +\NewDocumentCommand \settasks { m } + { \tasks_setup:n { #1 } } + +\tex_endinput:D
\ No newline at end of file |