summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/exsheets/tasks.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/exsheets/tasks.sty')
-rw-r--r--Master/texmf-dist/tex/latex/exsheets/tasks.sty445
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