From 9ce87495da8b3b9e6adbccb41c78d1554af1d71a Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 22 Dec 2018 21:54:42 +0000 Subject: multicolrule (22dec18) git-svn-id: svn://tug.org/texlive/trunk@49480 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/latex/multicolrule/multicolrule.sty | 242 +++++++++++++-------- 1 file changed, 153 insertions(+), 89 deletions(-) (limited to 'Master/texmf-dist/tex/latex/multicolrule') diff --git a/Master/texmf-dist/tex/latex/multicolrule/multicolrule.sty b/Master/texmf-dist/tex/latex/multicolrule/multicolrule.sty index bfb62d6e86e..1494adbee72 100644 --- a/Master/texmf-dist/tex/latex/multicolrule/multicolrule.sty +++ b/Master/texmf-dist/tex/latex/multicolrule/multicolrule.sty @@ -15,11 +15,12 @@ %% \RequirePackage{expl3} \RequirePackage{xparse} -\ProvidesExplPackage {multicolrule} {2018/12/18} {1.0} -{Decorative~vertical~rules~between~columns} +\ProvidesExplPackage {multicolrule} {2018/12/21} {1.1} + {Decorative~vertical~rules~between~columns} \RequirePackage{l3keys2e} \RequirePackage{xpatch} \RequirePackage{xcolor} +\RequirePackage{scrlfile} \msg_new:nnn {multicolrule} {patch-success} {Patched~#1.} \msg_new:nnn {multicolrule} {patch-failure} {Error~patching~#1.} \msg_new:nnn {multicolrule} {tikz-required} @@ -29,9 +30,13 @@ option~with~multicol~already~loaded.~You~will~likely~run~into~problems.} \bool_new:N \g__mcrule_twocolumn_bool \bool_new:N \g__mcrule_use_tikz_bool -\int_new:N \l__mcrule_repeat_int +\int_new:N \l__mcrule_repeat_int \int_set:Nn \l__mcrule_repeat_int {1} -\dim_new:N \l__mcrule_repeat_distance_dim +\dim_new:N \l__mcrule_repeat_distance_dim +\dim_new:N \l__mcrule_extend_top_dim +\dim_new:N \l__mcrule_extend_bot_dim +\bool_new:N \l__mcrule_extend_fill_bool +\dim_new:N \l__mcrule_extend_reserve_dim \tl_new:N \l__mcrule_color_name_tl \tl_new:N \l__mcrule_color_model_tl \@ifpackageloaded{tikz} @@ -45,35 +50,50 @@ tikz .default:n = true, } \ProcessKeysOptions{mcrule-opts} -\cs_new:Npn \__mcrule_col_box: {} +\cs_new:Npn \__mcrule_column_height: {} +\cs_new:Npn \__mcrule_column_depth: {} +\cs_new_protected:Npn \__mcrule_patch_mcol_output:N #1 +{ + \xpatchcmd{#1} {\vrule\@width\columnseprule} {\mcruledivider} + {\msg_info:nnn {multicolrule} {patch-success} {#1}} + {\msg_info:nnn {multicolrule} {patch-failure} {#1}} +} +\cs_new_protected:Npn \__mcrule_patch_twocol_output:N #1 +{ + \xpatchcmd{#1} {\normalcolor\vrule\@width\columnseprule} + {\columnseprulecolor\mcruledivider} + {\msg_info:nnn {multicolrule} {patch-success} {#1}} + {\msg_info:nnn {multicolrule} {patch-failure} {#1}} +} \bool_if:NTF \g__mcrule_twocolumn_bool { \@ifpackageloaded{multicol} - { - \msg_warning:nn {multicolrule} {multicol-loaded} - } + {\msg_warning:nn {multicolrule} {multicol-loaded}}{} \cs_gset:Npn \columnseprulecolor {\normalcolor} - \cs_gset:Npn \__mcrule_col_box: {\@outputbox} - \xpatchcmd{\@outputdblcol} {\normalcolor\vrule\@width\columnseprule} - {\columnseprulecolor\mcruledivider} - { - \msg_info:nnn {multicolrule} {patch-success} {\@outputdblcol} - } + \cs_gset:Npn \__mcrule_column_height: {\box_ht:N \@outputbox} + \cs_gset:Npn \__mcrule_column_depth: {\box_dp:N \@outputbox} + \__mcrule_patch_twocol_output:N \@outputdblcol + \__mcrule_patch_twocol_output:N \@outputdblcol + \AfterPackage!{bidi} { - \msg_info:nnn {multicolrule} {patch-failure} {\@outputdblcol} + \__mcrule_patch_twocol_output:N \RTL@outputdblcol + \__mcrule_patch_twocol_output:N \LTR@outputdblcol } } { \RequirePackage{multicol} - \cs_gset:Npn \__mcrule_col_box: {\mult@rightbox} - % Patch the code in multicol that creates the vertical rule. - \xpatchcmd{\LR@column@boxes} {\vrule\@width\columnseprule} {\mcruledivider} - {\msg_info:nnn {multicolrule} {patch-success} {\LR@column@boxes}} - {\msg_info:nnn {multicolrule} {patch-failure} {\LR@column@boxes}} - \xpatchcmd{\RL@column@boxes} {\vrule\@width\columnseprule} {\mcruledivider} - {\msg_info:nnn {multicolrule} {patch-success} {\RL@column@boxes}} - {\msg_info:nnn {multicolrule} {patch-failure} {\RL@column@boxes}} - \LRmulticolcolumns + \__mcrule_patch_mcol_output:N \LR@column@boxes + \__mcrule_patch_mcol_output:N \RL@column@boxes + \cs_gset:Npn \__mcrule_column_height: {\box_ht:N \mult@rightbox} + \cs_gset:Npn \__mcrule_column_depth: {\dimen\tw@} + \LRmulticolcolumns + \AfterPackage!{bidi} + { + \cs_gset_eq:NN \LTR@column@boxes \LR@column@boxes + \cs_gset_eq:NN \RTL@column@boxes \RL@column@boxes + \cs_gset_eq:NN \LRmulticolcolumns \LTRmulticolcolumns + \cs_gset_eq:NN \RLmulticolcolumns \RTLmulticolcolumns + } } \cs_new:Npn \mcruledivider { @@ -89,22 +109,63 @@ } } } +\cs_new:Npn \__mcrule_column_total_height: +{ + \dim_eval:n {\__mcrule_column_height: + \__mcrule_column_depth: + + \__mcrule_extend_column_top: + \__mcrule_extend_column_bottom:} +} +\cs_new:Npn \__mcrule_column_total_depth: +{ + \dim_eval:n {\__mcrule_column_depth: + \__mcrule_extend_column_bottom:} +} +\cs_new:Npn \__mcrule_extend_column_top: +{ + \l__mcrule_extend_top_dim +} +\cs_new:Npn \__mcrule_extend_column_bottom: +{ + \bool_lazy_and:nnTF + {\bool_if_p:n {\l__mcrule_extend_fill_bool}} + {\bool_not_p:n {\g__mcrule_twocolumn_bool}} + { + \dim_compare:nNnTF + {\@colroom - \__mcrule_column_height: - \__mcrule_extend_reserve:} > {0pt} + {\@colroom - \__mcrule_column_height: - \__mcrule_extend_reserve:} + {0pt} + } + {\l__mcrule_extend_bot_dim} +} +\cs_new:Npn \__mcrule_extend_reserve: +{ + \dim_compare:nNnTF {\l__mcrule_extend_reserve_dim} > {0pt} + {\dim_eval:n {\l__mcrule_extend_reserve_dim + \multicolsep}} + {0pt} +} \cs_new:Npn \__mcrule_divider: {\vrule\@width\columnseprule} \cs_new_nopar:Npn \__mcrule_pattern:nnn #1#2#3 { - \vbox_to_ht:nn {\box_ht:N \__mcrule_col_box:} - { \vfill - \kern #2 \hbox:n{#1} \kern #3 - \vfill + \box_move_down:nn {\__mcrule_column_total_depth:} + { + \vbox_to_ht:nn {\__mcrule_column_total_height:} + { + \vfill + \kern #2 \hbox:n{#1} \kern #3 + \vfill + } } } \cs_new_nopar:Npn \__mcrule_tile_pattern:nnn #1#2#3 { - \vbox_to_ht:nn {\box_ht:N \__mcrule_col_box:} + \box_move_down:nn {\__mcrule_column_total_depth:} { - \cleaders \vbox:n { - \kern #2 \hbox:n{#1} \kern #3 - }\vfill + \vbox_to_ht:nn {\__mcrule_column_total_height:} + { + \cleaders \vbox:n + { + \kern #2 \hbox:n{#1} \kern #3 + } + \vfill + } } } \cs_new:Npn \__mcrule_line_pattern:nnnn #1#2#3#4 @@ -117,35 +178,31 @@ \__mcrule_tile_pattern:nnn {\rule{\columnseprule}{#2}}{#3}{#4} } } +\cs_new:Npn \__mcrule_solid_line: +{ + \rule[-\__mcrule_column_total_depth:]{\columnseprule}{\__mcrule_column_total_height:} +} \bool_if:NTF \g__mcrule_use_tikz_bool { \ExplSyntaxOff \RequirePackage{tikz} \ExplSyntaxOn - \cs_set:Npn \__mcrule_tikz_picture:n #1 - { - \__mcrule_tikz_picture:nx {#1} {\__mcrule_col_box:} - } - \cs_set:Npn \__mcrule_tikz_picture:nn #1#2 - { - \begin{tikzpicture}[x=1pt,y=1pt,inner~sep=0pt,outer~sep=0pt] - \node (TOP) at (0,\ht#2) {}; - \node (BOT) at (0,0) {}; - #1 - \end{tikzpicture} - } - \cs_generate_variant:Nn \__mcrule_tikz_picture:nn {nx} - \cs_set:Npn \__mcrule_pattern_line:n #1 - { - \__mcrule_pattern_line:nx {#1} {\__mcrule_col_box:} - } - \cs_set:Npn \__mcrule_pattern_line:nn #1#2 - { - \begin{tikzpicture}[x=1pt,y=1pt,inner~sep=0pt,outer~sep=0pt] - \draw[line~width=\columnseprule,#1] (0,\ht#2) -- (0,0); +\cs_set:Npn \__mcrule_tikz_picture:n #1 +{ + \begin{tikzpicture}[x=1pt,y=1pt,inner~sep=0pt,outer~sep=0pt, + baseline={([yshift=\__mcrule_column_total_depth:]current~bounding~box.south)}] + \node (TOP) at (0,\__mcrule_column_total_height:) {}; + \node (BOT) at (0,0) {}; + #1 \end{tikzpicture} - } - \cs_generate_variant:Nn \__mcrule_pattern_line:nn {nx} +} +\cs_set:Npn \__mcrule_pattern_line:n #1 +{ + \begin{tikzpicture}[x=1pt,y=1pt,inner~sep=0pt,outer~sep=0pt, + baseline={([yshift=\__mcrule_column_total_depth:]current~bounding~box.south)}] + \draw[line~width=\columnseprule,#1] (0,\__mcrule_column_total_height:) -- (0,0); + \end{tikzpicture} +} \cs_set:Npn \__mcrule_circle: { \begin{tikzpicture}[x=1pt,y=1pt,inner~sep=0pt,outer~sep=0pt] @@ -186,66 +243,73 @@ } \keys_define:nn {mcrule} { - line-style .choice:, - line-style / solid .code:n = \cs_set:Npn \__mcrule_divider: + extend-top .dim_set:N = \l__mcrule_extend_top_dim, + extend-bot .dim_set:N = \l__mcrule_extend_bot_dim, + extend-fill .bool_set:N = \l__mcrule_extend_fill_bool, + extend-fill .default:n = true, + extend-reserve .dim_set:N = \l__mcrule_extend_reserve_dim, + line-style .choice:, + line-style / default .code:n = \cs_set:Npn \__mcrule_divider: {\vrule\@width\columnseprule}, - line-style / dots .code:n = \cs_set:Npn \__mcrule_divider: + line-style / solid .code:n = \cs_set:Npn \__mcrule_divider: + {\__mcrule_solid_line:}, + line-style / dots .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn {.}{1pt}{1pt}}, - line-style / dense-dots .code:n = \cs_set:Npn \__mcrule_divider: + line-style / dense-dots .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn {.}{1pt}{0pt}}, - line-style / loose-dots .code:n = \cs_set:Npn \__mcrule_divider: + line-style / loose-dots .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn {.}{2pt}{2pt}}, - line-style / circles .code:n = \cs_set:Npn \__mcrule_divider: + line-style / circles .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn {\__mcrule_circle:}{1pt}{1pt}}, - line-style / dense-circles .code:n = \cs_set:Npn \__mcrule_divider: + line-style / dense-circles .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn {\__mcrule_circle:}{1pt}{0pt}}, - line-style / loose-circles .code:n = \cs_set:Npn \__mcrule_divider: + line-style / loose-circles .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn {\__mcrule_circle:}{2pt}{2pt}}, - line-style / solid-circles .code:n = \cs_set:Npn \__mcrule_divider: + line-style / solid-circles .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn {\__mcrule_solid_circle:}{1pt}{1pt}}, line-style / dense-solid-circles .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn {\__mcrule_solid_circle:}{1pt}{0pt}}, line-style / loose-solid-circles .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn {\__mcrule_solid_circle:}{2pt}{2pt}}, - line-style / dotted .code:n = \cs_set:Npn \__mcrule_divider: + line-style / dotted .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_line_pattern:nnnn {dotted}{\columnseprule}{1pt}{1pt}}, - line-style / densely-dotted .code:n = \cs_set:Npn \__mcrule_divider: + line-style / densely-dotted .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_line_pattern:nnnn {densely~dotted}{\columnseprule}{1pt}{0pt}}, - line-style / loosely-dotted .code:n = \cs_set:Npn \__mcrule_divider: + line-style / loosely-dotted .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_line_pattern:nnnn {loosely~dotted}{\columnseprule}{2pt}{2pt}}, - line-style / dashed .code:n = \cs_set:Npn \__mcrule_divider: + line-style / dashed .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_line_pattern:nnnn {dashed}{3pt}{1.5pt}{1.5pt}}, - line-style / densely-dashed .code:n = \cs_set:Npn \__mcrule_divider: + line-style / densely-dashed .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_line_pattern:nnnn {densely~dashed}{3pt}{1pt}{1pt}}, - line-style / loosely-dashed .code:n = \cs_set:Npn \__mcrule_divider: + line-style / loosely-dashed .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_line_pattern:nnnn {loosely~dashed}{3pt}{3pt}{3pt}}, - line-style / dash-dot .code:n = - \cs_set:Npn \__mcrule_divider: {\__mcrule_pattern_line:n{dash~dot}}, - line-style / densely-dash-dot .code:n = - \cs_set:Npn \__mcrule_divider: {\__mcrule_pattern_line:n{densely~dash~dot}}, - line-style / loosely-dash-dot .code:n = - \cs_set:Npn \__mcrule_divider: {\__mcrule_pattern_line:n{loosely~dash~dot}}, - line-style / dash-dot-dot .code:n = - \cs_set:Npn \__mcrule_divider: {\__mcrule_pattern_line:n{dash~dot~dot}}, - line-style / densely-dash-dot-dot .code:n = - \cs_set:Npn \__mcrule_divider: {\__mcrule_pattern_line:n{densely~dash~dot~dot}}, - line-style / loosely-dash-dot-dot .code:n = - \cs_set:Npn \__mcrule_divider: {\__mcrule_pattern_line:n{loosely~dash~dot~dot}}, - color .code:n = { + line-style / dash-dot .code:n = \cs_set:Npn \__mcrule_divider: + {\__mcrule_pattern_line:n{dash~dot}}, + line-style / densely-dash-dot .code:n = \cs_set:Npn \__mcrule_divider: + {\__mcrule_pattern_line:n{densely~dash~dot}}, + line-style / loosely-dash-dot .code:n = \cs_set:Npn \__mcrule_divider: + {\__mcrule_pattern_line:n{loosely~dash~dot}}, + line-style / dash-dot-dot .code:n = \cs_set:Npn \__mcrule_divider: + {\__mcrule_pattern_line:n{dash~dot~dot}}, + line-style / densely-dash-dot-dot .code:n = \cs_set:Npn \__mcrule_divider: + {\__mcrule_pattern_line:n{densely~dash~dot~dot}}, + line-style / loosely-dash-dot-dot .code:n = \cs_set:Npn \__mcrule_divider: + {\__mcrule_pattern_line:n{loosely~dash~dot~dot}}, + color .code:n = { \tl_set:Nn \l__mcrule_color_name_tl {#1} \__mcrule_set_rule_color: }, - color-model .code:n = { + color-model .code:n = { \tl_set:Nn \l__mcrule_color_model_tl {#1} \__mcrule_set_rule_color: }, - custom-line .code:n = \cs_set:Npn \__mcrule_divider: + custom-line .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tikz_picture:n {#1}}, - custom-pattern .code:n = \cs_set:Npn \__mcrule_divider: + custom-pattern .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_pattern:nnn #1}, - custom-tile .code:n = \cs_set:Npn \__mcrule_divider: + custom-tile .code:n = \cs_set:Npn \__mcrule_divider: {\__mcrule_tile_pattern:nnn #1}, - width .choice:, + width .choice:, width / ultra-thin .code:n = \dim_set:Nn \columnseprule {0.1pt}, width / very-thin .code:n = \dim_set:Nn \columnseprule {0.2pt}, width / thin .code:n = \dim_set:Nn \columnseprule {0.4pt}, @@ -280,7 +344,7 @@ %% %% This file may be distributed and/or modified under the %% conditions of the LaTeX Project Public License (LPPL), either -%% version 1.3 of this license or (at your option) any later +%% version 1.3c of this license or (at your option) any later %% version. The latest version of this license is in the file: %% https://www.latex-project.org/lppl.txt %% -- cgit v1.2.3