You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
958 lines
33 KiB
958 lines
33 KiB
%%
|
|
%% This is file `l3galley.sty',
|
|
%% generated with the docstrip utility.
|
|
%%
|
|
%% The original source files were:
|
|
%%
|
|
%% l3galley.dtx (with options: `package')
|
|
%%
|
|
%% Copyright (C) 2010-2020 The LaTeX3 Project
|
|
%%
|
|
%% It may be distributed and/or modified under the conditions of
|
|
%% the LaTeX Project Public License (LPPL), either version 1.3c of
|
|
%% this license or (at your option) any later version. The latest
|
|
%% version of this license is in the file:
|
|
%%
|
|
%% http://www.latex-project.org/lppl.txt
|
|
%%
|
|
%% This file is part of the "l3experimental bundle" (The Work in LPPL)
|
|
%% and all files in that bundle must be distributed together.
|
|
%%
|
|
%% File: l3galley.dtx
|
|
\RequirePackage{expl3}[2018/02/21]
|
|
\@ifpackagelater{expl3}{2018/02/21}
|
|
{}
|
|
{%
|
|
\PackageError{l3galley}{Support package l3kernel too old}
|
|
{%
|
|
Please install an up to date version of l3kernel\MessageBreak
|
|
using your TeX package manager or from CTAN.\MessageBreak
|
|
\MessageBreak
|
|
Loading l3galley will abort!%
|
|
}%
|
|
\endinput
|
|
}
|
|
\ProvidesExplPackage{l3galley}{2020-08-07}{}
|
|
{L3 Experimental galley code}
|
|
\int_new:N \l__galley_tmp_int
|
|
\seq_new:N \g__galley_tmpa_seq
|
|
\seq_new:N \g__galley_tmpb_seq
|
|
\seq_new:N \l__galley_tmp_seq
|
|
\tl_new:N \l__galley_tmp_tl
|
|
\bool_new:N \g__galley_cutout_active_bool
|
|
\bool_new:N \l__galley_cutout_active_bool
|
|
\seq_new:N \l__galley_cutout_left_indent_seq
|
|
\seq_new:N \l__galley_cutout_right_indent_seq
|
|
\bool_new:N \l__galley_parshape_multipar_bool
|
|
\seq_new:N \l__galley_parshape_left_indent_seq
|
|
\seq_new:N \l__galley_parshape_right_indent_seq
|
|
\cs_new_eq:NN \l_galley_text_width_dim \linewidth
|
|
\cs_new_eq:NN \l_galley_total_left_margin_dim \@totalleftmargin
|
|
\dim_new:N \l_galley_total_right_margin_dim
|
|
\int_new:N \l_galley_interpar_penalty_int
|
|
\skip_new:N \l_galley_interpar_vspace_skip
|
|
\cs_new_eq:NN \l_galley_width_dim \tex_hsize:D
|
|
\bool_new:N \g__galley_begin_level_bool
|
|
\bool_new:N \l__galley_begin_level_bool
|
|
\seq_new:N \g__galley_cutout_left_seq
|
|
\seq_new:N \l__galley_cutout_left_seq
|
|
\seq_new:N \g__galley_cutout_right_seq
|
|
\seq_new:N \l__galley_cutout_right_seq
|
|
\bool_new:N \g_galley_omit_next_indent_bool
|
|
\bool_new:N \l__galley_omit_next_indent_bool
|
|
\bool_new:N \g_galley_no_break_next_bool
|
|
\bool_new:N \l__galley_no_break_next_bool
|
|
\tl_new:N \g_galley_par_begin_hook_tl
|
|
\tl_new:N \l__galley_par_begin_hook_tl
|
|
\tl_new:N \g_galley_par_end_hook_tl
|
|
\tl_new:N \l__galley_par_end_hook_tl
|
|
\tl_new:N \g_galley_par_reset_hook_tl
|
|
\tl_new:N \l__galley_par_reset_hook_tl
|
|
\int_new:N \g_galley_previous_par_lines_int
|
|
\int_new:N \l__galley_previous_par_lines_int
|
|
\int_new:N \g__galley_current_par_lines_int
|
|
\int_new:N \l__galley_current_par_lines_int
|
|
\tl_new:N \g_galley_restore_running_tl
|
|
\tl_new:N \l__galley_restore_running_tl
|
|
\tl_new:N \g_galley_whatsit_next_tl
|
|
\tl_new:N \l__galley_whatsit_next_tl
|
|
\tl_new:N \g_galley_whatsit_previous_tl
|
|
\tl_new:N \l__galley_whatsit_previous_tl
|
|
\tl_new:N \g__galley_interpar_penalty_user_tl
|
|
\tl_new:N \l__galley_interpar_penalty_user_tl
|
|
\tl_new:N \g__galley_interpar_vspace_user_tl
|
|
\tl_new:N \l__galley_interpar_vspace_user_tl
|
|
\int_const:Nn \c__galley_max_penalty_int { 10000 }
|
|
\int_new:N \l__galley_group_level_int
|
|
\cs_new_protected:Npn \__galley_initialise_variables:
|
|
{
|
|
\int_set:Nn \l__galley_group_level_int { \tex_currentgrouplevel:D }
|
|
\bool_gset_true:N \g__galley_begin_level_bool
|
|
\bool_gset_false:N \g__galley_cutout_active_bool
|
|
\seq_gclear:N \g__galley_cutout_left_seq
|
|
\seq_gclear:N \g__galley_cutout_right_seq
|
|
\tl_gclear:N \g__galley_interpar_penalty_user_tl
|
|
\tl_gclear:N \g__galley_interpar_vspace_user_tl
|
|
\bool_gset_true:N \g_galley_omit_next_indent_bool
|
|
\bool_gset_false:N \g_galley_no_break_next_bool
|
|
\tl_gclear:N \g_galley_par_begin_hook_tl
|
|
\tl_gclear:N \g_galley_par_end_hook_tl
|
|
\tl_gclear:N \g_galley_par_reset_hook_tl
|
|
\int_gzero:N \g__galley_current_par_lines_int
|
|
\int_gzero:N \g_galley_previous_par_lines_int
|
|
\tl_gclear:N \g_galley_restore_running_tl
|
|
\tl_gclear:N \g_galley_whatsit_previous_tl
|
|
\tl_gclear:N \g_galley_whatsit_next_tl
|
|
}
|
|
\__galley_initialise_variables:
|
|
\cs_new_protected:Npn \__galley_initialise_settings:
|
|
{
|
|
\bool_set_true:N \l__galley_parshape_multipar_bool
|
|
\seq_clear:N \l__galley_parshape_left_indent_seq
|
|
\seq_clear:N \l__galley_parshape_right_indent_seq
|
|
\dim_set_eq:NN \l_galley_text_width_dim \l_galley_width_dim
|
|
\dim_zero:N \l_galley_total_left_margin_dim
|
|
\dim_zero:N \l_galley_total_right_margin_dim
|
|
}
|
|
\cs_new_protected:Npn \__galley_save_parameters:
|
|
{
|
|
\bool_set_eq:NN \l__galley_begin_level_bool
|
|
\g__galley_begin_level_bool
|
|
\bool_set_eq:NN \l__galley_cutout_active_bool
|
|
\g__galley_cutout_active_bool
|
|
\seq_set_eq:NN \l__galley_cutout_left_seq
|
|
\g__galley_cutout_left_seq
|
|
\seq_set_eq:NN \l__galley_cutout_right_seq
|
|
\g__galley_cutout_right_seq
|
|
\tl_set_eq:NN \l__galley_interpar_penalty_user_tl
|
|
\g__galley_interpar_penalty_user_tl
|
|
\tl_set_eq:NN \l__galley_interpar_vspace_user_tl
|
|
\g__galley_interpar_vspace_user_tl
|
|
\bool_set_eq:NN \l__galley_omit_next_indent_bool
|
|
\g_galley_omit_next_indent_bool
|
|
\bool_set_eq:NN \l__galley_no_break_next_bool
|
|
\g_galley_no_break_next_bool
|
|
\tl_set_eq:NN \l__galley_par_begin_hook_tl
|
|
\g_galley_par_begin_hook_tl
|
|
\tl_set_eq:NN \l__galley_par_end_hook_tl
|
|
\g_galley_par_end_hook_tl
|
|
\tl_set_eq:NN \l__galley_par_reset_hook_tl
|
|
\g_galley_par_reset_hook_tl
|
|
\int_set_eq:NN \l__galley_current_par_lines_int
|
|
\g__galley_current_par_lines_int
|
|
\int_set_eq:NN \l__galley_previous_par_lines_int
|
|
\g_galley_previous_par_lines_int
|
|
\tl_set_eq:NN \l__galley_restore_running_tl
|
|
\g_galley_restore_running_tl
|
|
\tl_set_eq:NN \l__galley_whatsit_previous_tl
|
|
\g_galley_whatsit_previous_tl
|
|
\tl_set_eq:NN \l__galley_whatsit_next_tl
|
|
\g_galley_whatsit_next_tl
|
|
}
|
|
\cs_new_protected:Npn \__galley_restore_parameters:
|
|
{
|
|
\bool_gset_eq:NN \g__galley_begin_level_bool
|
|
\l__galley_begin_level_bool
|
|
\bool_gset_eq:NN \g__galley_cutout_active_bool
|
|
\l__galley_cutout_active_bool
|
|
\seq_gset_eq:NN \g__galley_cutout_left_seq
|
|
\l__galley_cutout_left_seq
|
|
\seq_gset_eq:NN \g__galley_cutout_right_seq
|
|
\l__galley_cutout_right_seq
|
|
\tl_gset_eq:NN \g__galley_interpar_penalty_user_tl
|
|
\l__galley_interpar_penalty_user_tl
|
|
\tl_gset_eq:NN \g__galley_interpar_vspace_user_tl
|
|
\l__galley_interpar_vspace_user_tl
|
|
\bool_gset_eq:NN \g_galley_omit_next_indent_bool
|
|
\l__galley_omit_next_indent_bool
|
|
\bool_gset_eq:NN \g_galley_no_break_next_bool
|
|
\l__galley_no_break_next_bool
|
|
\tl_gset_eq:NN \g_galley_par_begin_hook_tl
|
|
\l__galley_par_begin_hook_tl
|
|
\tl_gset_eq:NN \g_galley_par_end_hook_tl
|
|
\l__galley_par_end_hook_tl
|
|
\tl_gset_eq:NN \g_galley_par_reset_hook_tl
|
|
\l__galley_par_reset_hook_tl
|
|
\int_gset_eq:NN \g__galley_current_par_lines_int
|
|
\l__galley_current_par_lines_int
|
|
\int_gset_eq:NN \g_galley_previous_par_lines_int
|
|
\l__galley_previous_par_lines_int
|
|
\tl_gset_eq:NN \g_galley_restore_running_tl
|
|
\l__galley_restore_running_tl
|
|
\tl_gset_eq:NN \g_galley_whatsit_previous_tl
|
|
\l__galley_whatsit_previous_tl
|
|
\tl_gset_eq:NN \g_galley_whatsit_next_tl
|
|
\l__galley_whatsit_next_tl
|
|
}
|
|
\cs_new_protected:Npn \galley_level:
|
|
{
|
|
\__galley_save_parameters:
|
|
\group_begin:
|
|
\__galley_initialise_variables:
|
|
\__galley_initialise_settings:
|
|
\group_insert_after:N \__galley_level_end:
|
|
}
|
|
\cs_new_protected:Npn \__galley_level_end:
|
|
{
|
|
\par
|
|
\__galley_restore_parameters:
|
|
\group_end:
|
|
}
|
|
\scan_new:N \s__galley_par_omit
|
|
\cs_new_protected:Npn \galley_par:
|
|
{
|
|
\s__galley_par_omit
|
|
\exp_after:wN \__galley_par_auxi: \exp:w \exp_end_continue_f:w
|
|
}
|
|
\cs_new_protected:Npn \__galley_par_auxi:
|
|
{
|
|
\peek_meaning:NTF \s__galley_par_omit
|
|
{ \__galley_par_aux:N }
|
|
{ \__galley_par_auxii: }
|
|
}
|
|
\cs_new_protected:Npn \__galley_par_aux:N #1
|
|
{
|
|
\str_if_eq:nnF {#1} { \s__galley_par_omit }
|
|
{
|
|
\__galley_par_auxii:
|
|
#1
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__galley_par_auxii:
|
|
{
|
|
\mode_if_vertical:TF
|
|
{
|
|
\group_begin:
|
|
\tex_par:D
|
|
\group_end:
|
|
}
|
|
{
|
|
\g_galley_par_end_hook_tl
|
|
\bool_if:NT \g__galley_cutout_active_bool
|
|
{ \__galley_parshape_set: }
|
|
\group_begin:
|
|
\tex_par:D
|
|
\group_end:
|
|
\int_gset:Nn \g_galley_previous_par_lines_int
|
|
{ \tex_prevgraf:D + \g__galley_current_par_lines_int }
|
|
\int_gzero:N \g__galley_current_par_lines_int
|
|
\bool_if:NF \l__galley_parshape_multipar_bool
|
|
{
|
|
\seq_clear:N \l__galley_parshape_left_indent_seq
|
|
\seq_clear:N \l__galley_parshape_right_indent_seq
|
|
\bool_set_true:N \l__galley_parshape_multipar_bool
|
|
\__galley_parshape_set:
|
|
}
|
|
\__galley_par_update_cutout:
|
|
}
|
|
\g_galley_par_reset_hook_tl
|
|
\tl_gclear:N \g_galley_par_reset_hook_tl
|
|
\tex_penalty:D \c__galley_max_penalty_int
|
|
}
|
|
\cs_new_protected:Npn \__galley_par_update_cutout:
|
|
{
|
|
\bool_lazy_and:nnF
|
|
{ \seq_if_empty_p:N \g__galley_cutout_left_seq }
|
|
{ \seq_if_empty_p:N \g__galley_cutout_right_seq }
|
|
{
|
|
\prg_replicate:nn \tex_prevgraf:D
|
|
{
|
|
\seq_gpop_left:NN \g__galley_cutout_left_seq \l__galley_tmp_tl
|
|
\seq_gpop_left:NN \g__galley_cutout_right_seq \l__galley_tmp_tl
|
|
}
|
|
\__galley_parshape_set:
|
|
}
|
|
\int_compare:nNnT \l__galley_group_level_int = \tex_currentgrouplevel:D
|
|
{
|
|
\bool_lazy_and:nnT
|
|
{ \seq_if_empty_p:N \g__galley_cutout_left_seq }
|
|
{ \seq_if_empty_p:N \g__galley_cutout_right_seq }
|
|
{ \bool_gset_false:N \g__galley_cutout_active_bool }
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \galley_par:n #1
|
|
{
|
|
\s__galley_par_omit
|
|
\bool_if:NF \g__galley_begin_level_bool
|
|
{
|
|
#1
|
|
\galley_par:
|
|
}
|
|
}
|
|
\cs_set_protected:Npn \par { \galley_par: }
|
|
\tl_set:Nn \@par { \galley_par: }
|
|
\cs_new_protected:Npn \galley_display_begin:
|
|
{
|
|
\group_begin:
|
|
\__galley_save_parameters:
|
|
\mode_if_vertical:TF
|
|
{
|
|
\__galley_display_penalty:N \l_galley_display_begin_par_penalty_tl
|
|
\__galley_display_vspace:N \l_galley_display_begin_par_vspace_tl
|
|
}
|
|
{
|
|
\__galley_display_penalty:N \l_galley_display_begin_penalty_tl
|
|
\__galley_display_vspace:N \l_galley_display_begin_vspace_tl
|
|
}
|
|
\par
|
|
}
|
|
\cs_new_protected:Npn \__galley_display_penalty:N #1
|
|
{
|
|
\tl_if_empty:NF #1
|
|
{
|
|
\tl_gput_right:Nx \g_galley_restore_running_tl
|
|
{
|
|
\int_gset:Nn \exp_not:N \g_galley_penalty_int
|
|
{ \int_use:N \g_galley_penalty_int }
|
|
}
|
|
\int_gset:Nn \g_galley_penalty_int {#1}
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__galley_display_vspace:N #1
|
|
{
|
|
\tl_if_empty:NF #1
|
|
{
|
|
\tl_gput_right:Nx \g_galley_restore_running_tl
|
|
{
|
|
\skip_gset:Nn \exp_not:N \g_galley_vspace_skip
|
|
{ \skip_use:N \g_galley_vspace_skip }
|
|
}
|
|
\skip_gset:Nn \g_galley_vspace_int {#1}
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \galley_display_end:
|
|
{
|
|
\par
|
|
\__galley_restore_parameters:
|
|
\group_end:
|
|
\group_insert_after:N \__galley_display_par_setup:
|
|
}
|
|
\cs_new_protected:Npn \__galley_display_par_setup:
|
|
{
|
|
\bool_gset_false:N \g_galley_omit_next_indent_bool
|
|
\cs_set_eq:NN \par \__galley_display_par:
|
|
}
|
|
\cs_new_protected:Npn \__galley_display_par:
|
|
{
|
|
\cs_set_eq:NN \par \galley_par:
|
|
\mode_if_vertical:TF
|
|
{
|
|
\par
|
|
\bool_gset_false:N \g_galley_omit_next_indent_bool
|
|
\__galley_display_penalty:N \l_galley_display_end_par_penalty_tl
|
|
\__galley_display_vspace:N \l_galley_display_end_par_vspace_tl
|
|
}
|
|
{
|
|
\__galley_par_set_cutout:
|
|
\group_begin:
|
|
\tex_par:D
|
|
\group_end:
|
|
\int_gadd:Nn \g__galley_current_par_lines_int \tex_prevgraf:D
|
|
\bool_set_false:N \l__galley_tmp_bool
|
|
\__galley_par_update_cutout:
|
|
\__galley_display_penalty:N \l_galley_display_end_penalty_tl
|
|
\__galley_display_vspace:N \l_galley_display_end_vspace_tl
|
|
}
|
|
}
|
|
\cs_undefine:N \everypar
|
|
\newtoks \everypar
|
|
\cs_if_exist:NTF \AtBeginDocument
|
|
{ \AtBeginDocument }
|
|
{ \use:n }
|
|
{
|
|
\tex_everypar:D
|
|
{
|
|
\bool_if:NTF \g__galley_begin_level_bool
|
|
{ \__galley_start_paragraph_first: }
|
|
{ \__galley_start_paragraph_std: }
|
|
\tex_the:D \everypar
|
|
}
|
|
}
|
|
\box_new:N \g__galley_last_box
|
|
\cs_new_protected:Npn \__galley_start_paragraph_common:N #1
|
|
{
|
|
\group_begin:
|
|
\box_gset_to_last:N \g__galley_last_box
|
|
\tex_par:D
|
|
#1
|
|
\tex_everypar:D { }
|
|
\tex_noindent:D
|
|
\group_end:
|
|
}
|
|
\cs_new_protected:Npn \__galley_start_paragraph_std:
|
|
{
|
|
\__galley_start_paragraph_common:N \__galley_insert_vertical_items:
|
|
\__galley_insert_horizontal_items:
|
|
\__galley_restore_running_parameters:
|
|
}
|
|
\cs_new_protected:Npn \__galley_start_paragraph_first:
|
|
{
|
|
\bool_gset_false:N \g__galley_begin_level_bool
|
|
\mode_if_horizontal:TF
|
|
{ \__galley_start_paragraph_common:N \__galley_insert_vspace_first: }
|
|
{ \__galley_insert_vspace_first: }
|
|
\__galley_insert_horizontal_items:
|
|
\__galley_restore_running_parameters:
|
|
}
|
|
\cs_new_protected:Npn \__galley_insert_vspace_first:
|
|
{
|
|
\tl_if_empty:NF \g__galley_interpar_vspace_user_tl
|
|
{ \skip_vertical:n { \g__galley_interpar_vspace_user_tl } }
|
|
}
|
|
\cs_new_protected:Npn \__galley_insert_vertical_items:
|
|
{
|
|
\g_galley_whatsit_previous_tl
|
|
\tl_gclear:N \g_galley_whatsit_previous_tl
|
|
\tl_if_empty:NTF \g__galley_interpar_penalty_user_tl
|
|
{
|
|
\bool_if:NTF \g_galley_no_break_next_bool
|
|
{ \tex_penalty:D \c__galley_max_penalty_int }
|
|
{ \tex_penalty:D \l_galley_interpar_penalty_int }
|
|
}
|
|
{
|
|
\tex_penalty:D
|
|
\int_eval:n { \g__galley_interpar_penalty_user_tl } \exp_stop_f:
|
|
\tl_gclear:N \g__galley_interpar_penalty_user_tl
|
|
}
|
|
\bool_gset_false:N \g_galley_no_break_next_bool
|
|
\tl_if_empty:NTF \g__galley_interpar_vspace_user_tl
|
|
{ \skip_vertical:N \l_galley_interpar_vspace_skip }
|
|
{
|
|
\skip_vertical:n { \g__galley_interpar_vspace_user_tl }
|
|
\tl_gclear:N \g__galley_interpar_vspace_user_tl
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__galley_insert_horizontal_items:
|
|
{
|
|
\g_galley_whatsit_next_tl
|
|
\tl_gclear:N \g_galley_whatsit_next_tl
|
|
\bool_if:NF \g_galley_omit_next_indent_bool
|
|
{
|
|
\box_if_empty:NF \g__galley_last_box
|
|
{ \hbox_to_wd:nn \l_galley_par_indent_dim { } }
|
|
}
|
|
\skip_horizontal:N \l_galley_par_begin_skip
|
|
\g_galley_par_begin_hook_tl
|
|
\bool_gset_false:N \g_galley_omit_next_indent_bool
|
|
}
|
|
\cs_new_protected:Npn \__galley_restore_running_parameters:
|
|
{
|
|
\g_galley_restore_running_tl
|
|
\tl_gclear:N \g_galley_restore_running_tl
|
|
}
|
|
\dim_new:N \l__galley_total_left_margin_dim
|
|
\dim_new:N \l__galley_total_right_margin_dim
|
|
\cs_new_protected:Npn \galley_margins_set_absolute:nn #1#2
|
|
{
|
|
\dim_set:Nn \l_galley_total_left_margin_dim {#1}
|
|
\dim_set:Nn \l_galley_total_right_margin_dim {#2}
|
|
\dim_set:Nn \l_galley_text_width_dim
|
|
{
|
|
\l_galley_width_dim
|
|
- \l_galley_total_left_margin_dim
|
|
- \l_galley_total_right_margin_dim
|
|
}
|
|
\__galley_parshape_set:
|
|
}
|
|
\cs_new_protected:Npn \galley_margins_set_relative:nn #1#2
|
|
{
|
|
\dim_add:Nn \l_galley_total_left_margin_dim {#1}
|
|
\dim_add:Nn \l_galley_total_right_margin_dim {#2}
|
|
\dim_set:Nn \l_galley_text_width_dim
|
|
{
|
|
\l_galley_width_dim
|
|
- \l_galley_total_left_margin_dim
|
|
- \l_galley_total_right_margin_dim
|
|
}
|
|
\__galley_parshape_set:
|
|
}
|
|
\cs_new_protected:Npn \galley_parshape_set_multi:nnnN
|
|
{
|
|
\bool_set_true:N \l__galley_parshape_multipar_bool
|
|
\__galley_parshape_set:nnnN
|
|
}
|
|
\cs_new_protected:Npn \galley_parshape_set_single:nnnN
|
|
{
|
|
\bool_set_false:N \l__galley_parshape_multipar_bool
|
|
\__galley_parshape_set:nnnN
|
|
}
|
|
\cs_generate_variant:Nn \galley_parshape_set_multi:nnnN { nVV }
|
|
\cs_generate_variant:Nn \galley_parshape_set_single:nnnN { nVV }
|
|
\cs_new_protected:Npn \__galley_parshape_set:nnnN #1#2#3#4
|
|
{
|
|
\seq_set_from_clist:Nn \l__galley_parshape_left_indent_seq {#2}
|
|
\seq_set_from_clist:Nn \l__galley_parshape_right_indent_seq {#3}
|
|
\prg_replicate:nn {#1}
|
|
{
|
|
\seq_put_left:Nn \l__galley_parshape_left_indent_seq { 0pt }
|
|
\seq_put_left:Nn \l__galley_parshape_right_indent_seq { 0pt }
|
|
}
|
|
\bool_if:NT #4
|
|
{
|
|
\seq_put_right:Nn \l__galley_parshape_left_indent_seq { 0pt }
|
|
\seq_put_right:Nn \l__galley_parshape_right_indent_seq { 0pt }
|
|
}
|
|
\__galley_parshape_set:
|
|
}
|
|
\cs_new_protected:Npn \galley_cutout_left:nn
|
|
{ \__galley_cutout:nnn { left } }
|
|
\cs_new_protected:Npn \galley_cutout_right:nn
|
|
{ \__galley_cutout:nnn { right } }
|
|
\cs_new_protected:Npn \__galley_cutout:nnn #1#2#3
|
|
{
|
|
\seq_gset_from_clist:Nn \g__galley_tmpa_seq {#3}
|
|
\prg_replicate:nn {#2}
|
|
{ \seq_gput_left:Nn \g__galley_tmpa_seq { 0pt } }
|
|
\seq_if_empty:cTF { g__galley_cutout_ #1 _seq }
|
|
{ \seq_gset_eq:cN { g__galley_cutout_ #1 _seq } \g__galley_tmpa_seq }
|
|
{
|
|
\int_compare:nNnTF
|
|
{ \seq_count:c { g__galley_cutout_ #1 _seq } } >
|
|
{ \seq_count:N \g__galley_tmpa_seq }
|
|
{ \__galley_cutout:cN { g__galley_cutout_ #1 _seq } \g__galley_tmpa_seq }
|
|
{ \__galley_cutout:Nc \g__galley_tmpa_seq { g__galley_cutout_ #1 _seq } }
|
|
\seq_gset_eq:cN { g__galley_cutout_ #1 _seq } \l__galley_tmp_seq
|
|
}
|
|
\seq_if_empty:cF { g__galley_cutout_ #1 _seq }
|
|
{ \bool_gset_true:N \g__galley_cutout_active_bool }
|
|
}
|
|
\cs_new_protected:Npn \__galley_cutout:NN #1#2
|
|
{
|
|
\seq_clear:N \l__galley_tmp_seq
|
|
\seq_map_inline:Nn #1
|
|
{
|
|
\seq_gpop_left:NNF #2 \l__galley_tmp_tl
|
|
{ \tl_set:Nn \l__galley_tmp_tl { 0pt } }
|
|
\seq_put_right:Nx \l__galley_tmp_seq
|
|
{ \dim_eval:n { ##1 + \l__galley_tmp_tl } }
|
|
}
|
|
}
|
|
\cs_generate_variant:Nn \__galley_cutout:NN { c , Nc }
|
|
\cs_new_protected:Npn \__galley_parshape_set:
|
|
{
|
|
\__galley_parshape_set_margins:
|
|
\__galley_parshape_set_indents:
|
|
\__galley_parshape_set_cutouts:
|
|
}
|
|
\cs_new_protected:Npn \__galley_parshape_set_margins:
|
|
{
|
|
\bool_lazy_and:nnTF
|
|
{ \dim_compare_p:nNn \l_galley_total_left_margin_dim = \c_zero_dim }
|
|
{ \dim_compare_p:nNn \l_galley_total_right_margin_dim = \c_zero_dim }
|
|
{ \tex_parshape:D 0 \exp_stop_f: }
|
|
{
|
|
\tex_parshape:D
|
|
1 \exp_stop_f:
|
|
\l_galley_total_left_margin_dim
|
|
\l_galley_text_width_dim
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__galley_parshape_set_indents:
|
|
{
|
|
\bool_lazy_and:nnF
|
|
{ \seq_if_empty_p:N \l__galley_parshape_left_indent_seq }
|
|
{ \seq_if_empty_p:N \l__galley_parshape_right_indent_seq }
|
|
{
|
|
\__galley_parshape_set_indents:NN
|
|
\l__galley_parshape_left_indent_seq
|
|
\l__galley_parshape_right_indent_seq
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__galley_parshape_set_indents:NN #1#2
|
|
{
|
|
\tex_parshape:D
|
|
\int_min:nn { \seq_count:N #1 } { \seq_count:N #2 }
|
|
\exp_stop_f:
|
|
\seq_mapthread_function:NNN #1 #2
|
|
\__galley_parshape_set_indents:nn
|
|
}
|
|
\cs_new:Npn \__galley_parshape_set_indents:nn #1#2
|
|
{
|
|
\dim_eval:n { \l_galley_total_left_margin_dim + #1 } \exp_stop_f:
|
|
\dim_eval:n { \l_galley_text_width_dim - ( #1 + #2 ) } \exp_stop_f:
|
|
}
|
|
\cs_new_protected:Npn \__galley_parshape_set_cutouts:
|
|
{
|
|
\bool_lazy_and:nnF
|
|
{ \seq_if_empty_p:N \g__galley_cutout_left_seq }
|
|
{ \seq_if_empty_p:N \g__galley_cutout_right_seq }
|
|
{
|
|
\__galley_parshape_set_cutouts:n { left }
|
|
\__galley_parshape_set_cutouts:n { right }
|
|
\int_set:Nn \l__galley_tmp_int
|
|
{
|
|
\seq_count:N \l__galley_cutout_left_indent_seq
|
|
- \seq_count:N \l__galley_cutout_right_indent_seq
|
|
}
|
|
\int_compare:nNnTF \l__galley_tmp_int > 0
|
|
{ \__galley_parshape_set_cutouts:N \l__galley_cutout_right_indent_seq }
|
|
{ \__galley_parshape_set_cutouts:N \l__galley_cutout_left_indent_seq }
|
|
\__galley_parshape_set_indents:NN
|
|
\l__galley_cutout_left_indent_seq
|
|
\l__galley_cutout_right_indent_seq
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__galley_parshape_set_cutouts:n #1
|
|
{
|
|
\seq_if_empty:cTF { g__galley_cutout_ #1 _seq }
|
|
{
|
|
\seq_set_eq:cc { l__galley_cutout_ #1 _indent_seq }
|
|
{ l__galley_parshape_ #1 _indent_seq }
|
|
}
|
|
{
|
|
\seq_gset_eq:Nc \g__galley_tmpa_seq { g__galley_cutout_ #1 _seq }
|
|
\seq_gset_eq:Nc \g__galley_tmpb_seq { l__galley_parshape_ #1 _indent_seq }
|
|
\seq_get_right:NNF \g__galley_tmpb_seq \l__galley_tmp_tl
|
|
{ \tl_clear:N \l__galley_tmp_tl }
|
|
\tl_if_empty:NT \l__galley_tmp_tl
|
|
{ \tl_set:Nn \l__galley_tmp_tl { 0pt } }
|
|
\int_set:Nn \l__galley_tmp_int
|
|
{
|
|
\seq_count:N \g__galley_tmpa_seq
|
|
- \seq_count:N \g__galley_tmpb_seq
|
|
+ 1
|
|
}
|
|
\int_compare:nNnT \l__galley_tmp_int > 0
|
|
{
|
|
\prg_replicate:nn
|
|
{ \l__galley_tmp_int }
|
|
{ \seq_gput_right:NV \g__galley_tmpb_seq \l__galley_tmp_tl }
|
|
}
|
|
\__galley_cutout:NN \g__galley_tmpb_seq \g__galley_tmpa_seq
|
|
\seq_set_eq:cN { l__galley_cutout_ #1 _indent_seq } \l__galley_tmp_seq
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__galley_parshape_set_cutouts:N #1
|
|
{
|
|
\seq_get_right:NNF #1 \l__galley_tmp_tl
|
|
{ \tl_clear:N \l__galley_tmp_tl }
|
|
\tl_if_empty:NT \l__galley_tmp_tl
|
|
{ \tl_set:Nn \l__galley_tmp_tl { 0pt } }
|
|
\prg_replicate:nn { \int_abs:n \l__galley_tmp_int }
|
|
{ \seq_put_right:NV #1 \l__galley_tmp_tl }
|
|
}
|
|
\cs_new_protected:Npn \galley_penalty_set_single:n #1
|
|
{ \tl_gset:Nx \g__galley_interpar_penalty_user_tl { \int_eval:n {#1} } }
|
|
\cs_new_protected:Npn \galley_penalty_add_single:n #1
|
|
{
|
|
\tl_gset:Nx \g__galley_interpar_penalty_user_tl
|
|
{
|
|
\int_eval:n
|
|
{
|
|
\tl_if_empty:NF \g__galley_interpar_penalty_user_tl
|
|
{ \g__galley_interpar_penalty_user_tl + }
|
|
#1
|
|
}
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \galley_vspace_set_single:n #1
|
|
{ \tl_gset:Nx \g__galley_interpar_vspace_user_tl { \skip_eval:n {#1} } }
|
|
\cs_new_protected:Npn \galley_vspace_add_single:n #1
|
|
{
|
|
\tl_gset:Nx \g__galley_interpar_vspace_user_tl
|
|
{
|
|
\skip_eval:n
|
|
{
|
|
\tl_if_empty:NF \g__galley_interpar_vspace_user_tl
|
|
{ \g__galley_interpar_vspace_user_tl + }
|
|
#1
|
|
}
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \galley_vspace_max_single:n #1
|
|
{
|
|
\tl_if_empty:NTF \g__galley_interpar_vspace_user_tl
|
|
{ \galley_vspace_set_single:n {#1} }
|
|
{
|
|
\dim_compare:nNnT
|
|
{ \tex_glueexpr:D \g__galley_interpar_vspace_user_tl }
|
|
< { \tex_glueexpr:D (#1) \scan_stop: }
|
|
{ \galley_vspace_set_single:n {#1} }
|
|
}
|
|
}
|
|
\dim_set:Nn \parskip \c_zero_dim
|
|
\cs_undefine:N \parskip
|
|
\skip_new:N \parskip
|
|
\cs_new_eq:NN \l_galley_line_left_skip \tex_leftskip:D
|
|
\cs_new_eq:NN \l_galley_line_right_skip \tex_rightskip:D
|
|
\dim_new:N \l_galley_par_begin_skip
|
|
\cs_new_eq:NN \l_galley_par_end_skip \tex_parfillskip:D
|
|
\cs_new_eq:NN \l_galley_par_indent_dim \tex_parindent:D
|
|
\cs_new_eq:NN \l_galley_last_line_fit_int \tex_lastlinefit:D
|
|
\cs_new_protected:Npn \galley_interword_spacing_set:N #1
|
|
{
|
|
\bool_if:NTF #1
|
|
{ % TODO Hook for font changes required!
|
|
\dim_compare:nNnTF { \tex_fontdimen:D 3 \tex_font:D }
|
|
= \c_zero_dim
|
|
{ \tex_spaceskip:D \c_zero_dim }
|
|
{ \tex_spaceskip:D \tex_fontdimen:D 2 \tex_font:D }
|
|
}
|
|
{ \tex_spaceskip:D \c_zero_dim }
|
|
}
|
|
\int_new:N \l_galley_hyphen_left_int
|
|
\int_set:Nn \l_galley_hyphen_left_int { \tex_lefthyphenmin:D }
|
|
\cs_new_eq:NN \l_galley_binop_penalty_int \tex_binoppenalty:D
|
|
\cs_new_eq:NN \l_galley_double_hyphen_demerits_int \tex_doublehyphendemerits:D
|
|
\cs_new_eq:NN \l_galley_emergency_stretch_skip \tex_emergencystretch:D
|
|
\cs_new_eq:NN \l_galley_final_hyphen_demerits_int \tex_finalhyphendemerits:D
|
|
\cs_new_eq:NN \l_galley_linebreak_badness_int \tex_hbadness:D
|
|
\cs_new_eq:NN \l_galley_linebreak_fuzz_dim \tex_hfuzz:D
|
|
\cs_new_eq:NN \l_galley_linebreak_penalty_int \tex_linepenalty:D
|
|
\cs_new_eq:NN \l_galley_linebreak_pretolerance_int \tex_pretolerance:D
|
|
\cs_new_eq:NN \l_galley_mismatch_demerits_int \tex_adjdemerits:D
|
|
\cs_new_eq:NN \l_galley_relation_penalty_int \tex_relpenalty:D
|
|
\cs_new_eq:NN \l_galley_linebreak_tolerance_int \tex_tolerance:D
|
|
\cs_new_protected:Npn \galley_break_line:Nn #1#2
|
|
{
|
|
\mode_if_vertical:TF
|
|
{ \__kernel_msg_error:nn { galley } { no-line-to-end } }
|
|
{
|
|
\tex_unskip:D
|
|
\bool_if:NF #1
|
|
{ \tex_vadjust:D { \tex_penalty:D \c__galley_max_penalty_int } }
|
|
\dim_compare:nNnF {#2} = \c_zero_dim
|
|
{ \tex_vadjust:D { \skip_vertical:n {#2} } }
|
|
\tex_penalty:D \c__galley_max_penalty_int
|
|
\tex_hfil:D
|
|
\tex_penalty:D - \c__galley_max_penalty_int
|
|
}
|
|
}
|
|
\cs_new_eq:NN \l_galley_broken_penalty_int \tex_brokenpenalty:D
|
|
\cs_new_eq:NN \l_galley_interline_penalty_int \tex_interlinepenalty:D
|
|
\cs_new_eq:NN \l_galley_parbreak_badness_int \tex_vbadness:D
|
|
\cs_new_eq:NN \l_galley_parbreak_fuzz_dim \tex_vfuzz:D
|
|
\cs_new_eq:NN \l_galley_post_display_penalty_int \tex_postdisplaypenalty:D
|
|
\cs_new_eq:NN \l_galley_pre_display_penalty_int \tex_predisplaypenalty:D
|
|
\clist_new:N \l_galley_club_penalties_clist
|
|
\clist_new:N \l_galley_line_penalties_clist
|
|
\cs_new_protected:Npn \galley_display_widow_penalties_set:n #1
|
|
{
|
|
\tex_displaywidowpenalties:D
|
|
\int_eval:n { \clist_count:n {#1} + 1 } \exp_stop_f:
|
|
\clist_map_function:nN {#1} \__galley_set_aux:n
|
|
0 \exp_stop_f:
|
|
}
|
|
\cs_generate_variant:Nn \galley_display_widow_penalties_set:n { V , v }
|
|
\cs_new_protected:Npn \galley_widow_penalties_set:n #1
|
|
{
|
|
\tex_widowpenalties:D
|
|
\int_eval:n { \clist_count:n {#1} + 1 } \exp_stop_f:
|
|
\clist_map_function:nN {#1} \__galley_set_aux:n
|
|
0 \exp_stop_f:
|
|
}
|
|
\cs_generate_variant:Nn \galley_widow_penalties_set:n { V , v }
|
|
\cs_new:Npn \__galley_set_aux:n #1 { \int_eval:n {#1} ~ }
|
|
\cs_new_protected:Npn \galley_club_penalties_set:n #1
|
|
{
|
|
\clist_set:Nn \l_galley_club_penalties_clist {#1}
|
|
\__galley_calc_interline_penalties:
|
|
}
|
|
\cs_generate_variant:Nn \galley_club_penalties_set:n { V , v }
|
|
\cs_new_protected:Npn \galley_interline_penalties_set:n #1
|
|
{
|
|
\clist_set:Nn \l_galley_line_penalties_clist {#1}
|
|
\__galley_calc_interline_penalties:
|
|
}
|
|
\cs_generate_variant:Nn \galley_interline_penalties_set:n { V , v }
|
|
\cs_new_protected:Npn \galley_display_club_penalties_set:n #1
|
|
{
|
|
\tex_clubpenalties:D
|
|
\int_eval:n { \clist_count:n {#1} + 1 } \exp_stop_f:
|
|
\clist_map_function:nN {#1} \__galley_set_aux:n
|
|
0 \exp_stop_f:
|
|
\__galley_calc_interline_penalties:
|
|
}
|
|
\cs_generate_variant:Nn \galley_display_club_penalties_set:n { V , v }
|
|
\cs_new_protected:Npn \galley_interline_penalty_set:n #1
|
|
{
|
|
\int_compare:nNnTF { \tex_interlinepenalties:D 0 } = 0
|
|
{
|
|
\tex_interlinepenalties:D 1 = \int_eval:n {#1} \exp_stop_f:
|
|
\__galley_calc_interline_penalties:
|
|
}
|
|
{
|
|
\cs_set:Npn \__galley_set_interline_penalty_auxii:n ##1
|
|
{
|
|
\int_eval:n
|
|
{
|
|
\tex_interlinepenalties:D ##1
|
|
- \tex_interlinepenalties:D \tex_interlinepenalties:D 0
|
|
+ #1
|
|
}
|
|
\exp_stop_f:
|
|
}
|
|
\exp_args:Nf \__galley_set_interline_penalty:nn
|
|
{ \clist_count:N \l_galley_line_penalties_clist } {#1}
|
|
}
|
|
}
|
|
\cs_new_protected:Npn \__galley_set_interline_penalty:nn #1#2
|
|
{
|
|
\tex_interlinepenalties:D
|
|
\tex_interlinepenalties:D 0 \exp_stop_f:
|
|
\int_step_function:nN {#1}
|
|
\__galley_set_interline_penalty_auxi:n
|
|
\int_step_function:nnN { #1 + 1 } { \tex_interlinepenalties:D 0 - 1 }
|
|
\__galley_set_interline_penalty_auxii:n
|
|
\int_eval:n {#2} \exp_stop_f:
|
|
}
|
|
\cs_new:Npn \__galley_set_interline_penalty_auxi:n #1
|
|
{ \tex_interlinepenalties:D \int_eval:n {#1} \exp_stop_f: }
|
|
\cs_new:Npn \__galley_set_interline_penalty_auxii:n #1 { }
|
|
\cs_new_protected:Npn \__galley_calc_interline_penalties:
|
|
{
|
|
\exp_args:Nff \__galley_calc_interline_penalties:nn
|
|
{
|
|
\int_max:nn
|
|
{ \clist_count:N \l_galley_club_penalties_clist + 1 }
|
|
{
|
|
\int_max:nn
|
|
{ \clist_count:N \l_galley_line_penalties_clist + 1 }
|
|
{ \tex_clubpenalties:D 0 }
|
|
}
|
|
}
|
|
{ \clist_count:N \l_galley_line_penalties_clist }
|
|
}
|
|
\cs_new_protected:Npn \__galley_calc_interline_penalties:nn #1#2
|
|
{
|
|
\tex_interlinepenalties:D #1 ~
|
|
\int_step_function:nN {#2}
|
|
\__galley_calc_interline_penalties_auxi:n
|
|
\int_step_function:nnN { #2 + 1 } { #1 - 1 }
|
|
\__galley_calc_interline_penalties_auxii:n
|
|
\tex_interlinepenalties:D \tex_interlinepenalties:D 0 \exp_stop_f:
|
|
}
|
|
\cs_new:Npn \__galley_calc_interline_penalties_auxi:n #1
|
|
{
|
|
\int_eval:n
|
|
{
|
|
\clist_item:Nn \l_galley_line_penalties_clist {#1}
|
|
+ 0 \clist_item:Nn \l_galley_club_penalties_clist {#1}
|
|
- \tex_clubpenalties:D #1 ~
|
|
}
|
|
\exp_stop_f:
|
|
}
|
|
\cs_new:Npn \__galley_calc_interline_penalties_auxii:n #1
|
|
{
|
|
\int_eval:n
|
|
{
|
|
\tex_interlinepenalties:D \tex_interlinepenalties:D 0 \exp_stop_f:
|
|
+ 0 \clist_item:Nn \l_galley_club_penalties_clist {#1}
|
|
- \tex_clubpenalties:D #1 ~
|
|
}
|
|
\exp_stop_f:
|
|
}
|
|
\cs_new_protected:Npn \galley_save_club_penalties:N #1
|
|
{ \clist_set_eq:NN #1 \l_galley_club_penalties_clist }
|
|
\cs_new_protected:Npn \galley_save_interline_penalties:N #1
|
|
{ \clist_set_eq:NN #1 \l_galley_line_penalties_clist }
|
|
\cs_new_protected:Npn \galley_save_display_club_penalties:N #1
|
|
{
|
|
\clist_set:Nx #1
|
|
{
|
|
\int_step_function:nN { \tex_clubpenalties:D 0 - 1 }
|
|
\__galley_save_display_club_penalties:n
|
|
}
|
|
}
|
|
\cs_new:Npn \__galley_save_display_club_penalties:n #1
|
|
{ \int_value:w \tex_clubpenalties:D \int_eval:n {#1} , }
|
|
\cs_new_protected:Npn \galley_save_display_widow_penalties:N #1
|
|
{
|
|
\clist_set:Nx #1
|
|
{
|
|
\int_step_function:nN { \tex_displaywidowpenalties:D 0 - 1 }
|
|
\__galley_save_display_widow_penalties:n
|
|
}
|
|
}
|
|
\cs_new:Npn \__galley_save_display_widow_penalties:n #1
|
|
{
|
|
\int_value:w \tex_displaywidowpenalties:D
|
|
\int_eval:n {#1} ,
|
|
}
|
|
\cs_new_protected:Npn \galley_save_widow_penalties:N #1
|
|
{
|
|
\clist_set:Nx #1
|
|
{
|
|
\int_step_function:nN { \tex_widowpenalties:D 0 - 1 }
|
|
\__galley_save_widow_penalties:n
|
|
}
|
|
}
|
|
\cs_new:Npn \__galley_save_widow_penalties:n #1
|
|
{ \int_value:w \tex_widowpenalties:D \int_eval:n {#1} , }
|
|
\cs_new_protected:Npn \galley_interline_penalty:
|
|
{ \int_value:w \tex_interlinepenalties:D \tex_interlinepenalties:D 0 \exp_stop_f: }
|
|
\__kernel_msg_new:nnn { galley } { no-line-to-end }
|
|
{ There's~no~line~here~to~end. }
|
|
\cs_set:Npn \clearpage
|
|
{
|
|
\mode_if_vertical:T
|
|
{
|
|
\int_compare:nNnT \@dbltopnum = { -1 }
|
|
{
|
|
\dim_compare:nNnT \tex_pagetotal:D < \topskip
|
|
{ \tex_hbox:D { } }
|
|
}
|
|
}
|
|
\newpage
|
|
\galley_penalty_set_single:n { -\@Mi }
|
|
}
|
|
\cs_set_protected:Npn \nobreak
|
|
{ \bool_gset_true:N \g_galley_no_break_next_bool }
|
|
\cs_set_protected:Npn \noindent
|
|
{
|
|
\tex_noindent:D
|
|
\bool_gset_false:N \g_galley_omit_next_indent_bool
|
|
}
|
|
\DeclareRobustCommand \vspace
|
|
{
|
|
\@ifstar
|
|
\@vspace
|
|
\@vspace
|
|
}
|
|
\cs_set:Npn \@vspace #1 { \galley_vspace_add_single:n {#1} }
|
|
\DeclareRobustCommand \\
|
|
{
|
|
\@ifstar
|
|
{ \cs_set_eq:NN \reserved@e \c_true_bool }
|
|
{ \cs_set_eq:NN \reserved@e \c_false_bool }
|
|
\@xnewline
|
|
}
|
|
\cs_set:Npn \@xnewline
|
|
{
|
|
\@ifnextchar [ % ]
|
|
{ \@newline }
|
|
{ \@newline [ 0pt ] }
|
|
}
|
|
\cs_set:Npn \@newline [ #1 ]
|
|
{ \galley_break_line:Nn \reserved@e {#1} }
|
|
\DeclareRobustCommand \newline
|
|
{ \galley_break_line:Nn \c_true_bool { 0pt } }
|
|
\cs_set_eq:NN \@@par \galley_par:
|
|
\cs_set_protected:Npn \addpenalty { \galley_penalty_add_single:n }
|
|
\cs_set_protected:Npn \addvspace { \galley_vspace_max_single:n }
|
|
\cs_set_protected:Npn \@afterheading
|
|
{
|
|
\bool_gset_true:N \g_galley_no_break_next_bool
|
|
\if@afterindent
|
|
\else
|
|
\bool_gset_true:N \g_galley_omit_next_indent_bool
|
|
\fi
|
|
}
|
|
\cs_set_protected:Npn \@hangfrom #1
|
|
{
|
|
\bool_gset_true:N \g_galley_omit_next_indent_bool
|
|
\leavevmode
|
|
\setbox \@tempboxa = \hbox { {#1} }
|
|
\galley_parshape_set_single:nnnN
|
|
{ 1 }
|
|
{ \box_wd:N \@tempboxa }
|
|
\c_zero_dim
|
|
\c_false_bool
|
|
\bool_gset_true:N \g_galley_no_break_next_bool
|
|
\bool_gset_true:N \g_galley_omit_next_indent_bool
|
|
\box \@tempboxa
|
|
}
|
|
\cs_set_eq:Nc \@normalcr { \cs_to_str:N \\ }
|
|
%%
|
|
%%
|
|
%% End of file `l3galley.sty'.
|
|
|