From b097d4a5b14944af0b31fe710a220899b8483754 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Tue, 26 Jul 2022 19:41:08 +0000 Subject: wrapstuff (26jul22) git-svn-id: svn://tug.org/texlive/trunk@63981 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/doc/latex/wrapstuff/wrapstuff.pdf | Bin 422157 -> 449185 bytes .../source/latex/wrapstuff/wrapstuff.dtx | 1387 ++++++++++++-------- .../texmf-dist/tex/latex/wrapstuff/wrapstuff.sty | 1198 ++++++++++------- 3 files changed, 1551 insertions(+), 1034 deletions(-) (limited to 'Master/texmf-dist') diff --git a/Master/texmf-dist/doc/latex/wrapstuff/wrapstuff.pdf b/Master/texmf-dist/doc/latex/wrapstuff/wrapstuff.pdf index c9cd89da980..d190fafbd8a 100644 Binary files a/Master/texmf-dist/doc/latex/wrapstuff/wrapstuff.pdf and b/Master/texmf-dist/doc/latex/wrapstuff/wrapstuff.pdf differ diff --git a/Master/texmf-dist/source/latex/wrapstuff/wrapstuff.dtx b/Master/texmf-dist/source/latex/wrapstuff/wrapstuff.dtx index 5b8c03ec038..7fef0c95424 100644 --- a/Master/texmf-dist/source/latex/wrapstuff/wrapstuff.dtx +++ b/Master/texmf-dist/source/latex/wrapstuff/wrapstuff.dtx @@ -119,12 +119,12 @@ Copyright and Licence %<*internal> \fi % -%\NeedsTeXFormat{LaTeX2e} +%\NeedsTeXFormat{LaTeX2e}[2021-06-01] %\@ifundefined{ExplLoaderFileDate}{\RequirePackage{expl3}}{} -%<+package>\GetIdInfo$Id: wrapstuff.dtx 564fe9d 2022-07-20 19:55:58 +0800 Qing Lee $ +%<+package>\GetIdInfo$Id: wrapstuff.dtx e891159 2022-07-26 19:00:31 +0800 Qing Lee $ % {Wrapping text around stuff} %\ProvidesExplPackage{\ExplFileName} -% {\ExplFileDate}{0.1}{\ExplFileDescription} +% {\ExplFileDate}{0.2}{\ExplFileDescription} %<*driver> \documentclass{ctxdoc} \usepackage{wrapstuff} @@ -173,10 +173,11 @@ Copyright and Licence % % \fi % -% \CheckSum{2923} +% \CheckSum{3127} % % \changes{v0.1}{2022/07/05}{初始版本。} % \changes{v0.1}{2022/07/20}{首次提交到 CTAN 发布。} +% \changes{v0.2}{2022/07/21}{改进放置方式。} % % \GetFileId{wrapstuff.sty} % @@ -190,6 +191,11 @@ Copyright and Licence % \section{基本用法} % % \pkg{wrapstuff} 宏包提供了图文绕排的另一种实现。 +% \pkg{wrapstuff} 尝试整合和扩展 \pkg{picinpar}、\pkg{floatflt}、\pkg{wrapfig}、 +% \pkg{cutwin} 和 \pkg{wrapfig2} 等同类宏包的功能。 +% 本宏包兼容 \pkg{caption}、\pkg{float} 和 \pkg{floatrow} 等宏包, +% 并试图兼容显示(display)数学公式和各种 \LaTeX\ 列表环境,可以让他们正确绕排。 +% % \pkg{wrapstuff} 的实现依赖 \LaTeX\ 2021-06-01 开始提供的段落钩子, % 并依赖 \LaTeXiii\ 2022-04-10 之后的版本。 % @@ -242,24 +248,19 @@ Copyright and Licence % 设置绕排内容的高度,初始值为 \qty{0}{pt},代表自然高度。 % \end{function} % -% \begin{function}{leftsep,rightsep,hsep} +% \begin{function}{lines} % \begin{syntax} -% leftsep = <长度> -% rightsep = <长度> -% hsep = <长度> +% lines = <正整数> % \end{syntax} -% 设置绕排内容与正文的左/右间距,选项 \opt{hsep} 同时设置 \opt{leftsep} 和 \opt{rightsep}。 -% 初始值是 \qty{1}{em}。 +% 设置绕排内容占据正文的行数,可以设置正整数。 +% 初始值为空,根据绕排内容的高度自动计算行数。 % \end{function} % -% \begin{function}{abovesep,belowsep,vsep} +% \begin{function}{linewidth} % \begin{syntax} -% abovesep = <长度> -% belowsep = <长度> -% vsep = <长度> +% linewidth = <宽度> % \end{syntax} -% 设置绕排内容与正文的上/下间距,选项 \opt{vsep} 同时设置 \opt{abovesep} 和 \opt{belowsep}。 -% 初始值是 \qty{0}{pt}。 +% 设置正文段落的行宽,初始设置为 |\linewidth|,一般不需要调整。 % \end{function} % % \begin{function}{l,r,c,i,o,ratio} @@ -298,6 +299,26 @@ Copyright and Licence % \end{SideBySideExample} % \end{function} % +% \begin{function}{leftsep,rightsep,hsep} +% \begin{syntax} +% leftsep = <长度> +% rightsep = <长度> +% hsep = <长度> +% \end{syntax} +% 设置绕排内容与正文的左/右间距,选项 \opt{hsep} 同时设置 \opt{leftsep} 和 \opt{rightsep}。 +% 初始值是 \qty{1}{em}。 +% \end{function} +% +% \begin{function}{abovesep,belowsep,vsep} +% \begin{syntax} +% abovesep = <长度> +% belowsep = <长度> +% vsep = <长度> +% \end{syntax} +% 设置绕排内容与正文的上/下间距,选项 \opt{vsep} 同时设置 \opt{abovesep} 和 \opt{belowsep}。 +% 初始值是 \qty{0}{pt}。 +% \end{function} +% % \begin{function}{hoffset} % \begin{syntax} % hoffset = <长度> @@ -334,21 +355,6 @@ Copyright and Licence % \end{SideBySideExample} % \end{function} % -% \begin{function}{lines} -% \begin{syntax} -% lines = <正整数> -% \end{syntax} -% 设置绕排内容占据正文的行数,可以设置正整数。 -% 初始值为空,根据绕排内容的高度自动计算行数。 -% \end{function} -% -% \begin{function}{linewidth} -% \begin{syntax} -% linewidth = <宽度> -% \end{syntax} -% 设置正文段落的行宽,初始设置为 |\linewidth|,一般不需要调整。 -% \end{function} -% % \begin{function}{\wrapstuffclear} % 如果当前正文段落的行数不够,\pkg{wrapstuff} 的作用会延续到下一段。 % 这可能会导致某些意外结果,可以在下一段之前启用命令 \tn{wrapstuffclear} 消除影响。 @@ -405,6 +411,270 @@ Copyright and Licence \prop_gput:Nnn \g_msg_module_name_prop { wstf } { wrapstuff } % \end{macrocode} % +% \begin{macro}[var]{ +% \c_@@_global_tl_tl, +% \c_@@_global_dim_tl, +% \c_@@_global_int_tl, +% \c_@@_global_bool_tl} +% 一些需要全局设置的变量。 +% \begin{macrocode} +\tl_const:Nn \c_@@_global_tl_tl + { \g_@@_main_setting_tl } +\tl_const:Nn \c_@@_global_dim_tl + { + \g_@@_hang_ht_dim + \g_@@_total_ht_dim + \g_@@_stuff_ht_dim + \g_@@_stuff_wd_dim + \g_@@_first_dp_dim + \g_@@_first_sep_dim + \g_@@_prevdepth_dim + \g_@@_column_ht_dim + \g_@@_window_ht_dim + \g_@@_remaining_dim + \g_@@_column_room_dim + \g_@@_parshape_indent_dim + \g_@@_parshape_length_dim + } +\tl_const:Nn \c_@@_global_int_tl + { + \g_@@_top_int + \g_@@_column_int + \g_@@_window_int + } +\tl_const:Nn \c_@@_global_bool_tl + { + \g_@@_next_bool + \g_@@_leqno_bool + \g_@@_column_bool + \g_@@_entire_bool + \g_@@_display_bool + \g_@@_move_hang_bool + \g_@@_next_hang_bool + \g_@@_first_set_bool + \g_@@_first_save_bool + \g_@@_right_move_bool + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ +% \@@_tl_init:N, +% \@@_dim_init:N, +% \@@_int_init:N, +% \@@_bool_init:N} +% 全局变量的初始化,注意保存好清除和恢复的设置。 +% \begin{macrocode} +\cs_new_protected:Npn \@@_tl_init:N #1 + { + \tl_new:N #1 + \tl_gput_right:Nn \g_@@_var_clear_tl + { \tl_gclear:N #1 } + \tl_gput_right:Nn \g_@@_var_push_tl + { \tl_gset:Nn \exp_not:N #1 { \exp_not:o {#1} } } + } +\cs_new_protected:Npn \@@_dim_init:N #1 + { + \dim_new:N #1 + \tl_gput_right:Nn \g_@@_var_clear_tl + { \dim_gzero:N #1 } + \tl_gput_right:Nn \g_@@_var_push_tl + { \dim_gset:Nn #1 { \dim_use:N #1 } } + } +\cs_new_protected:Npn \@@_int_init:N #1 + { + \int_new:N #1 + \tl_gput_right:Nn \g_@@_var_clear_tl + { \int_gzero:N #1 } + \tl_gput_right:Nn \g_@@_var_push_tl + { \int_gset:Nn #1 { \int_use:N #1 } } + } +\cs_new_protected:Npn \@@_bool_init:N #1 + { + \bool_new:N #1 + \tl_gput_right:Nn \g_@@_var_clear_tl + { \bool_gset_false:N #1 } + \tl_gput_right:Nn \g_@@_var_push_tl + { + \bool_if:NTF #1 + { \bool_gset_true:N #1 } + { \bool_gset_false:N #1 } + } + } +\tl_new:N \g_@@_var_clear_tl +\tl_new:N \g_@@_var_push_tl +\tl_map_function:NN \c_@@_global_tl_tl \@@_tl_init:N +\tl_map_function:NN \c_@@_global_dim_tl \@@_dim_init:N +\tl_map_function:NN \c_@@_global_int_tl \@@_int_init:N +\tl_map_function:NN \c_@@_global_bool_tl \@@_bool_init:N +% \end{macrocode} +% \cs{g_@@_top_int} 的初始值是 $-1$。 +% \begin{macrocode} +\int_gdecr:N \g_@@_top_int +\tl_gput_right:Nn \g_@@_var_clear_tl + { \int_gdecr:N \g_@@_top_int } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ +% \@@_clear:, +% \@@_clear_variable:, +% \@@_clear_kludge:, +% \@@_clear_stuff_box:} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_clear: + { + \@@_clear_para_hook: + \@@_clear_kludge: + \@@_clear_variable: + } +\cs_new_protected_nopar:Npn \@@_clear_variable: + { + \tl_use:N \g_@@_var_clear_tl + \box_gclear:N \g_@@_stuff_box + } +\cs_new_protected_nopar:Npn \@@_clear_kludge: + { + \bool_if:NTF \g_@@_next_bool + { + \skip_vertical:n + { \tex_baselineskip:D * \g_@@_window_int } + } + { + \box_if_empty:NF \g_@@_stuff_box + { \@@_clear_stuff_box: } + } + } +\cs_new_protected_nopar:Npn \@@_clear_stuff_box: + { + \@@_ignore_depth: + \skip_set:Nn \l_@@_last_skip + { \box_dp:N \strutbox } + \skip_vertical:N \l_@@_last_skip + \box_use_drop:N \g_@@_stuff_box + \skip_vertical:N \l_@@_last_skip + \@@_ignore_depth: + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{ +% \@@_status_push:, +% \@@_status_pop:, +% \@@_status_restore:, +% \@@_status_clear:} +% 全局变量的保存与恢复。 +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_status_push: + { + \tl_clear:N \l_@@_status_tl + \int_gincr:N \g_@@_status_int + \exp_args:Ne \@@_status_push_aux:n + { \int_use:N \g_@@_status_int } + \seq_gpush:No \g_@@_status_seq { \l_@@_status_tl } + } +\cs_new_protected:Npn \@@_status_push_aux:n #1 + { + \@@_push_cs:nN {#1} \@@_para_before: + \@@_push_cs:nN {#1} \@@_para_begin: + \@@_push_cs:nN {#1} \@@_para_end: + \@@_push_cs:nN {#1} \@@_display_hook: + \@@_push_box:N \g_@@_stuff_box + \@@_push_var: + } +\cs_new_protected:Npn \@@_push_cs:nN #1#2 + { + \exp_args:NNc \@@_push_cs_aux:NN #2 + { @@_ #1 _ \token_to_str:N #2 } + } +\cs_new_protected:Npn \@@_push_cs_aux:NN #1#2 + { + \cs_gset_eq:NN #2#1 + \tl_put_right:Nn \l_@@_status_tl + { + \cs_gset_eq:NN #1#2 + \cs_undefine:N #2 + } + } +\cs_new_protected:Npn \@@_push_box:N #1 + { + \hbox_gset:Nn \g_@@_stauts_box + { + \hbox_unpack_drop:N \g_@@_stauts_box + \box_use:N #1 + } + \tl_put_right:Nn \l_@@_status_tl + { \@@_pop_box:N #1 } + } +\cs_new_protected:Npn \@@_pop_box:N #1 + { + \hbox_gset:Nw \g_@@_stauts_box + \hbox_unpack_drop:N \g_@@_stauts_box + \box_gset_to_last:N #1 + \@@_if_last_hlist:TF + { \hbox_gset_end: } + { + \hbox_gset_end: + \box_gclear:N \g_@@_stauts_box + } + } +\cs_new_protected_nopar:Npn \@@_push_var: + { + \tl_put_right:Nx \l_@@_status_tl + { \g_@@_var_push_tl } + } +\cs_new_protected_nopar:Npn \@@_status_pop: + { + \seq_gpop:NNT \g_@@_status_seq \l_@@_status_tl + { + \int_gdecr:N \g_@@_status_int + \tl_use:N \l_@@_status_tl + } + } +\cs_new_protected_nopar:Npn \@@_status_restore: + { + \@@_status_push: + \@@_clear_para_hook: + \@@_clear_display_hook: + \@@_clear_variable: + \group_insert_after:N \@@_status_pop: + } +\cs_new_protected_nopar:Npn \@@_status_clear: + { + \bool_if:NT \g_@@_next_bool + { + \@@_clear_para_hook: + \@@_clear_variable: + } + } +\tl_new:N \l_@@_status_tl +\box_new:N \g_@@_stauts_box +\int_new:N \g_@@_status_int +\seq_new:N \g_@@_status_seq +% \end{macrocode} +% \end{macro} +% +% \changes{v0.2}{2022/07/21}{兼容 \tn{parbox} 与 \env{minipage} 等使用环境。} +% +% \begin{macro}{\wrapstuff@parboxrestore,\@arrayparboxrestore} +% 在 \LaTeX\ 的 \cs{parbox} 和 \env{minipage} 等环境中恢复正常的段落状态。 +% \tn{wrapstuff@parboxrestore} 的初始值是在分组后清除活动的段落钩子和相关全局变量, +% 只有在 \env{wrapstuff@par} 环境内部才等于 \cs{@@_status_restore:}, +% 保存和恢复相关状态。 +% \begin{macrocode} +\cs_new_protected_nopar:Npn \wrapstuff@parboxrestore + { \group_insert_after:N \@@_status_clear: } +\cs_new_protected_nopar:Npn \@@_parbox_restore: + { + \cs_set_eq:NN + \wrapstuff@parboxrestore + \@@_status_restore: + } +\g@addto@macro \@arrayparboxrestore + { \wrapstuff@parboxrestore } +% \end{macrocode} +% \end{macro} +% % \begin{macro}[TF]{ % \@@_if_last_none:, % \@@_if_last_hlist:, @@ -451,6 +721,21 @@ Copyright and Licence % \end{macrocode} % \end{macro} % +% \begin{macro}{\@@_para_raw_end:} +% 将 \cs{para_raw_end:} 放在分组中是为了保持 \tn{parshape}。 +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_para_raw_end: + { \group_begin: \para_raw_end: \group_end: } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_gadd_ht:Nn} +% \begin{macrocode} +\cs_new_protected:Npn \@@_gadd_ht:Nn #1#2 + { \box_gset_ht:Nn #1 { \box_ht:N #1 + \dim_eval:n {#2} } } +% \end{macrocode} +% \end{macro} +% % \begin{macro}{wrapstuff} % 主要功能环境接口。 % \begin{macrocode} @@ -551,19 +836,16 @@ Copyright and Licence \box_gset_dp:Nn \g_@@_stuff_box { \c_zero_dim } } \tl_new:N \l_@@_main_kv_tl -\tl_new:N \g_@@_main_setting_tl \box_new:N \g_@@_stuff_box -\dim_new:N \g_@@_stuff_ht_dim -\dim_new:N \g_@@_stuff_wd_dim \dim_new:N \l_@@_shift_dim \dim_new:N \l_@@_width_dim \dim_new:N \l_@@_height_dim -\dim_new:N \g_@@_prevdepth_dim -\dim_new:N \g_@@_remaining_dim % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_attach_label:, \@@_write_label:} +% \changes{v0.2}{2022/07/26}{优化重新编译警告。} +% +% \begin{macro}{\@@_attach_label:, \@@_write_label:,\@@_rerun_check:} % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_attach_label: { @@ -576,20 +858,26 @@ Copyright and Licence } \cs_new_protected_nopar:Npn \@@_write_label: { - \iow_shipout_x:Nx \@auxout + \exp_args:Nee \@@_write_label_aux:nn + { \@@_counter:n { wrapstuff } } + { \@@_counter:n { page } } + } +\cs_new_protected:Npx \@@_write_label_aux:nn #1#2 + { + \prop_gput_if_new:Nnn \exp_not:N \g_@@_page_prop {#1} {#2} + \iow_shipout_x:Nn \exp_not:N \@auxout { \c_backslash_str wrapstuff@label - { \@@_counter:n { wrapstuff } } + {#1} { \exp_not:N \wrapstuff@counter { page } } } } +\newcounter { wrapstuff } \cs_new:Npn \@@_counter:n #1 { \int_value:w \value {#1} } \cs_new_eq:NN \wrapstuff@counter \@@_counter:n \cs_new_protected_nopar:Npn \wrapstuff@label - { \@newl@bel { wrapstuff@label } } -\tl_const:Nn \c_@@_label_tl - { wrapstuff@label@ \int_value:w \value { wrapstuff } } + { \prop_gput:Nnn \g_@@_page_prop } \@@_gadd_hook:nn { begindocument } { \legacy_if:nTF { @filesw } @@ -602,7 +890,35 @@ Copyright and Licence } { \cs_gset_eq:NN \@@_write_label: \@@_empty: } } -\newcounter { wrapstuff } +\@@_gadd_hook:nn { enddocument/afterlastpage } + { + \legacy_if:nT { @filesw } + { \prop_gclear:N \g_@@_page_prop } + } +\@@_gadd_hook:nn { enddocument/info } + { + \prop_if_empty:NF \g_@@_rerun_prop + { \@@_rerun_check: } + } +\cs_new_protected_nopar:Npn \@@_rerun_check: + { + \prop_map_inline:Nn \g_@@_rerun_prop + { + \prop_get:NnN \g_@@_page_prop { ##1 } \l_@@_page_tl + \int_if_even:nF { \l_@@_page_tl - ##2 } + { \prop_map_break:n { \@@_rerun_warning: } } + } + } +\cs_new_protected_nopar:Npn \@@_rerun_warning: + { \msg_warning:nn { wstf } { rerun-required } } +\msg_new:nnn { wstf } { rerun-required } + { + Page(s)~may~have~changed.\\ + Rerun~to~get~i/o~setting~right. + } +\tl_new:N \l_@@_page_tl +\prop_new:N \g_@@_page_prop +\prop_new:N \g_@@_rerun_prop % \end{macrocode} % \end{macro} % @@ -636,8 +952,10 @@ Copyright and Licence \keys_precompile:nnN { wrapstuff } { \l_@@_main_kv_tl } \l_@@_main_kv_tl - \tl_gconcat:NNN \g_@@_main_setting_tl - \g_@@_main_setting_tl \l_@@_main_kv_tl + \tl_gconcat:NNN + \g_@@_main_setting_tl + \g_@@_main_setting_tl + \l_@@_main_kv_tl } % \end{macrocode} % \end{macro} @@ -661,20 +979,23 @@ Copyright and Licence % \begin{macro}{\@@_swap_ratio:} % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_swap_ratio: + { + \exp_args:Ne \@@_swap_ratio_aux:n + { \@@_counter:n { wrapstuff } } + } +\cs_new_protected:Npn \@@_swap_ratio_aux:n #1 { \fp_compare:nF { \c_zero_fp < \l_@@_ratio_fp < \c_one_fp } { \fp_zero:N \l_@@_ratio_fp } - \int_if_odd:nTF - { - \exp_args:Ne \cs_if_exist_use:cF - { \c_@@_label_tl } - { \@@_counter:n { page } } - } + \prop_get:NnNF \g_@@_page_prop {#1} \l_@@_page_tl + { \tl_set:Nx \l_@@_page_tl { \@@_counter:n { page } } } + \int_if_odd:nTF { \l_@@_page_tl } { \bool_if:NTF \l_@@_inner_bool } { \bool_if:NTF \l_@@_outer_bool } { \@@_set_ratio:N \l_@@_ratio_fp } { \@@_set_ratio:n { \c_one_fp - \l_@@_ratio_fp } } + \prop_gput:Nno \g_@@_rerun_prop {#1} { \l_@@_page_tl } } \bool_new:N \l_@@_swap_bool \bool_new:N \l_@@_inner_bool @@ -682,69 +1003,13 @@ Copyright and Licence % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_gadd_ht:Nn,\@@_gsub_ht:Nn} -% \begin{macrocode} -\cs_new_protected:Npn \@@_gadd_ht:Nn #1#2 - { \box_gset_ht:Nn #1 { \box_ht:N #1 + \dim_eval:n {#2} } } -\cs_new_protected:Npn \@@_gsub_ht:Nn #1#2 - { \box_gset_ht:Nn #1 { \box_ht:N #1 - \dim_eval:n {#2} } } -% \end{macrocode} -% \end{macro} -% -% \begin{macro}{\@@_clear:} -% \begin{macrocode} -\cs_new_protected_nopar:Npn \@@_clear: - { - \@@_clear_para_hook: - \@@_clear_kludge: - \@@_clear_variable: - } -\cs_new_protected_nopar:Npn \@@_clear_variable: - { - \int_gset:Nn \g_@@_top_int { -1 } - \int_gzero:N \g_@@_window_int - \dim_gzero:N \g_@@_total_ht_dim - \dim_gzero:N \g_@@_column_left_dim - \tl_gclear:N \g_@@_main_setting_tl - \bool_gset_false:N \g_@@_next_bool - \bool_gset_false:N \g_@@_hoffset_bool - \bool_gset_false:N \g_@@_next_hang_bool - \bool_gset_false:N \g_@@_first_save_bool - \bool_gset_false:N \g_@@_right_move_bool - \bool_gset_false:N \g_@@_column_right_bool - } -\cs_new_protected_nopar:Npn \@@_clear_kludge: - { - \bool_if:NTF \g_@@_next_bool - { - \box_gclear:N \g_@@_stuff_box - \skip_vertical:n - { \tex_baselineskip:D * \g_@@_window_int } - } - { - \box_if_empty:NF \g_@@_stuff_box - { \@@_clear_stuff_box: } - } - } -\cs_new_protected_nopar:Npn \@@_clear_stuff_box: - { - \@@_ignore_depth: - \skip_set:Nn \l_@@_last_skip - { \box_dp:N \strutbox } - \skip_vertical:N \l_@@_last_skip - \box_use_drop:N \g_@@_stuff_box - \skip_vertical:N \l_@@_last_skip - \@@_ignore_depth: - } -% \end{macrocode} -% \end{macro} -% % \begin{macro}{\@@_next_para:} % 将 \env{wrapstuff} 环境之后的段落放入内部环境 \env{wrapstuff@par} 中。 % 为了控制钩子执行顺序,需要使用 |wrapstuff| 标签, % 而不用更为方便的 \cs{hook_gput_next_code:nn} 实现。 % \begin{macrocode} \@@_gadd_hook:nn { para/before } { \@@_para_before: } +\@@_gadd_hook:nn { para/after } { \@@_para_after: } \@@_gadd_hook:nn { para/begin } { \@@_para_begin: } \@@_gadd_hook:nn { para/end } { \@@_para_end: } \cs_new_protected_nopar:Npn \@@_next_para: @@ -762,12 +1027,14 @@ Copyright and Licence \cs_new_protected_nopar:Npn \@@_clear_para_hook: { \cs_gset_eq:NN \@@_para_before: \@@_empty: + \cs_gset_eq:NN \@@_para_after: \@@_empty: \cs_gset_eq:NN \@@_para_begin: \@@_empty: \cs_gset_eq:NN \@@_para_end: \@@_empty: } \cs_new_protected_nopar:Npn \@@_empty: { } \cs_new_eq:NN \@@_para_before: \@@_empty: +\cs_new_eq:NN \@@_para_after: \@@_empty: \cs_new_eq:NN \@@_para_begin: \@@_empty: \cs_new_eq:NN \@@_para_end: \@@_empty: % \end{macrocode} @@ -812,14 +1079,15 @@ Copyright and Licence \int_set:Nn \l_@@_window_int { \l_@@_window_int * 2 } \int_set:Nn \l_@@_window_line_int { - \bool_if:NTF \g_@@_column_right_bool - { \l_@@_window_int / 2 + \g_@@_column_window_int } + \bool_if:NTF \g_@@_column_bool + { \l_@@_window_int / 2 + \g_@@_column_int } { \l_@@_window_int } } } \cs_gset_eq:NN \@@_para_before: \@@_empty: \cs_gset_eq:NN \@@_para_begin: \@@_empty: \@@_save_parshape: + \@@_parbox_restore: \vbox_set:Nw \l_@@_body_box \@@_set_prevdepth:N \g_@@_prevdepth_dim \@@_save_tex_skip: @@ -839,7 +1107,8 @@ Copyright and Licence \int_gset_eq:NN \g_@@_line_int \tex_prevgraf:D \vbox_set_end: \@@_adjust_tex_skip: - \cs_gset_eq:NN \@@_para_end: \@@_empty: + \cs_gset_eq:NN \@@_para_end: \@@_empty: + \cs_gset_eq:NN \@@_para_after: \@@_empty: \int_compare:nNnTF \g_@@_line_int > \l_@@_top_int { \@@_build_par: } { \@@_put_par: } @@ -847,10 +1116,8 @@ Copyright and Licence \box_new:N \l_@@_body_box \box_new:N \l_@@_window_box \int_new:N \l_@@_window_int -\int_new:N \g_@@_window_int \int_new:N \g_@@_line_int \int_new:N \l_@@_window_line_int -\int_new:N \g_@@_column_window_int \dim_new:N \l_@@_l_dim \dim_new:N \l_@@_r_dim \dim_new:N \l_@@_min_dim @@ -860,10 +1127,7 @@ Copyright and Licence \dim_new:N \l_@@_voffset_dim \dim_new:N \l_@@_leftsep_dim \dim_new:N \l_@@_rightsep_dim -\dim_new:N \g_@@_window_ht_dim \dim_new:N \l_@@_main_width_dim -\int_new:N \g_@@_top_int -\int_gdecr:N \g_@@_top_int \bool_new:N \l_@@_hang_bool % \end{macrocode} % \end{macro} @@ -873,9 +1137,7 @@ Copyright and Licence \cs_new_protected_nopar:Npn \@@_set_hang_left: { \bool_set_true:N \l_@@_hang_bool - \bool_if:NF \g_@@_hoffset_bool - { \@@_set_hoffset:NN \l_@@_rightsep_dim \use:nn } - \dim_sub:Nn \l_@@_window_dim { \l_@@_rightsep_dim } + \@@_set_hoffset:N \l_@@_rightsep_dim \dim_zero:N \l_@@_l_dim \dim_set_eq:NN \l_@@_r_dim \l_@@_window_dim \cs_set_eq:NN \@@_build_box: \@@_build_hang: @@ -883,9 +1145,7 @@ Copyright and Licence \cs_new_protected_nopar:Npn \@@_set_hang_right: { \bool_set_true:N \l_@@_hang_bool - \bool_if:NF \g_@@_hoffset_bool - { \@@_set_hoffset:NN \l_@@_leftsep_dim \use_ii_i:nn } - \dim_sub:Nn \l_@@_window_dim { \l_@@_leftsep_dim } + \@@_set_hoffset:N \l_@@_leftsep_dim \dim_zero:N \l_@@_r_dim \dim_set_eq:NN \l_@@_l_dim \l_@@_window_dim \cs_set_eq:NN \@@_build_box: \@@_build_hang: @@ -903,28 +1163,23 @@ Copyright and Licence { \cs_set_eq:NN \@@_build_box: \@@_build_column: } { \cs_set_eq:NN \@@_build_box: \@@_build_block: } } -\cs_new_protected:Npn \@@_set_hoffset:NN #1#2 +% \end{macrocode} +% \end{macro} +% +% \changes{v0.2}{2022/07/24}{修复 \opt{hoffset} 选项。} +% +% \begin{macro}{\@@_set_hoffset:N} +% \begin{macrocode} +\cs_new_protected:Npn \@@_set_hoffset:N #1 { - \bool_gset_true:N \g_@@_hoffset_bool - \dim_set:Nn \l_@@_hoffset_width_dim - { #1 + \g_@@_stuff_wd_dim } + \dim_sub:Nn \l_@@_window_dim {#1} \group_begin: - \cs_set_eq:NN \width \l_@@_hoffset_width_dim - \dim_gset:Nn \g_@@_hoffset_dim { \l_@@_hoffset_tl } - \group_end: - \int_compare:nNnF \g_@@_hoffset_dim = \c_zero_dim - { - \hbox_gset:Nn \g_@@_stuff_box - { - #2 { \tex_kern:D - \g_@@_hoffset_dim } - { \box_use_drop:N \g_@@_stuff_box } - } - \dim_add:Nn \l_@@_window_dim { \g_@@_hoffset_dim } - } + \dim_set:Nn \l_@@_width_dim { #1 + \g_@@_stuff_wd_dim } + \cs_set_eq:NN \width \l_@@_width_dim + \exp_args:NNNx \group_end: + \dim_add:Nn \l_@@_window_dim + { \dim_eval:n { \l_@@_hoffset_tl } } } -\dim_new:N \g_@@_hoffset_dim -\dim_new:N \l_@@_hoffset_width_dim -\bool_new:N \g_@@_hoffset_bool % \end{macrocode} % \end{macro} % @@ -952,9 +1207,9 @@ Copyright and Licence } \cs_new_protected_nopar:Npn \@@_window_init: { - \int_gset_eq:NN \g_@@_column_window_int \l_@@_window_int + \int_gset_eq:NN \g_@@_column_int \l_@@_window_int \dim_gset:Nn \g_@@_window_ht_dim - { \tex_baselineskip:D * \g_@@_column_window_int } + { \tex_baselineskip:D * \g_@@_column_int } \tl_if_empty:NF \l_@@_lines_tl { \dim_gset:Nn \g_@@_remaining_dim @@ -1011,7 +1266,8 @@ Copyright and Licence \int_compare:nNnTF \g_@@_parshape_int = \c_one_int { \tex_parshape:D \g_@@_parshape_int - \g_@@_parshape_indent_dim \g_@@_parshape_length_dim + \g_@@_parshape_indent_dim + \g_@@_parshape_length_dim } { \@@_restore_hangfrom: } } @@ -1050,8 +1306,6 @@ Copyright and Licence \int_new:N \g_@@_parshape_int \int_new:N \g_@@_hangafter_int \dim_new:N \g_@@_hangindent_dim -\dim_new:N \g_@@_parshape_indent_dim -\dim_new:N \g_@@_parshape_length_dim % \end{macrocode} % \end{macro} % @@ -1087,16 +1341,15 @@ Copyright and Licence { \fp_to_dim:n { #1 \dim_to_fp:n {#2} } } \cs_new:Npn \@@_unit:n #1 { - \fp_eval:n + \int_eval:n { - ceil - ( - \dim_to_decimal_in_unit:nn - {#1} - { \tex_baselineskip:D } - ) + \exp_last_unbraced:Ne \@@_unit_aux:w + { \dim_to_decimal_in_unit:nn {#1} { \tex_baselineskip:D } } + \s_stop } } +\cs_new:Npn \@@_unit_aux:w #1 . #2 \s_stop + { #1 + 1 } % \end{macrocode} % \end{macro} % @@ -1131,6 +1384,7 @@ Copyright and Licence \skip_set_eq:NN \tex_leftskip:D \g_@@_left_skip \skip_set_eq:NN \tex_rightskip:D \g_@@_right_skip \skip_set_eq:NN \tex_parfillskip:D \g_@@_parfill_skip + \skip_set_eq:NN \tex_baselineskip:D \g_@@_baseline_skip } \skip_new:N \g_@@_left_skip \skip_new:N \g_@@_right_skip @@ -1148,16 +1402,32 @@ Copyright and Licence \tex_everydisplay:D \exp_after:wN { \tex_the:D \tex_everydisplay:D - \@@_test_leqno: - \dim_compare:nNnF \tex_displaywidth:D < \c_max_dim - { - \bool_gset_true:N \g_@@_display_bool - \dim_set_eq:NN \tex_displaywidth:D \l_@@_display_dim - } + \@@_display_hook: + } + } +\cs_new_protected_nopar:Npn \@@_display_hook: + { + \@@_test_leqno: + \dim_compare:nNnF \tex_displaywidth:D < \c_max_dim + { + \bool_gset_true:N \g_@@_display_bool + \dim_set_eq:NN \tex_displaywidth:D \l_@@_display_dim } } \cs_new_eq:NN \@@_test_leqno: \@@_empty: -\bool_new:N \g_@@_display_bool +\cs_new_protected_nopar:Npn \@@_clear_display_hook: + { \cs_gset_eq:NN \@@_display_hook: \@@_empty: } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_split_parameter:} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_split_parameter: + { + \skip_zero:N \tex_splittopskip:D + \dim_set_eq:NN \tex_vfuzz:D \c_max_dim + \int_set_eq:NN \tex_vbadness:D \c_max_int + } % \end{macrocode} % \end{macro} % @@ -1207,7 +1477,7 @@ Copyright and Licence % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_put_body_box: { - \para_raw_end: + \@@_para_raw_end: \dim_compare:nNnTF { \box_wd:N \l_@@_body_box } < \c_max_dim { \@@_put_body_aux:N \l_@@_body_box } { @@ -1215,14 +1485,34 @@ Copyright and Licence \@@_put_body_aux:N \l_@@_body_box \box_set_eq_drop:NN \l_@@_body_box \l_@@_bottom_box } - \para_raw_end: + \@@_para_raw_end: } \cs_new_protected_nopar:Npn \@@_put_body_aux:N #1 { \dim_gset:Nn \g_@@_prevdepth_dim { \box_dp:N #1 } + \dim_compare:nNnT \g_@@_prevdepth_dim = \c_zero_dim + { \@@_extract_depth:N #1 } \vbox_unpack_drop:N #1 \@@_set_prevdepth:N \g_@@_prevdepth_dim } +\cs_new_protected_nopar:Npn \@@_extract_depth:N #1 + { + \vbox_set:Nn \l_@@_last_box + { + \vbox_unpack:N #1 + \@@_if_last_hlist:F + { + \tex_unskip:D \tex_unpenalty:D + \tex_unskip:D \tex_unpenalty:D + } + \@@_if_last_hlist:T + { + \box_set_to_last:N \l_@@_last_box + \dim_gset:Nn \g_@@_prevdepth_dim + { \box_dp:N \l_@@_last_box } + } + } + } % \end{macrocode} % \end{macro} % @@ -1250,23 +1540,27 @@ Copyright and Licence \box_if_empty:NTF \l_@@_body_box { \@@_build_display_auxi: } { \@@_build_display_auxii: } - } -\cs_new_protected_nopar:Npn \@@_build_display_amsmath: - { - \vbox_gset:Nn \g_@@_equation_box - { - \skip_vertical:n { - \g_@@_display_pre_skip } - \vbox_unpack_drop:N \g_@@_display_box - \skip_gset_eq:NN \g_@@_pos_skip \tex_lastskip:D - \tex_unskip:D - \int_gset_eq:NN \g_@@_pos_int \tex_lastpenalty:D - \tex_unpenalty:D - \skip_gadd:Nn \g_@@_pos_skip { \tex_lastskip:D } - \tex_unskip:D - \tex_unpenalty:D - } - \box_gset_wd:Nn \g_@@_equation_box - { \l_@@_display_dim } + } +\cs_new_protected_nopar:Npn \@@_build_display_amsmath: + { + \group_begin: + \vbox_gset:Nn \g_@@_equation_box + { + \@@_break: + \vbox_unpack_drop:N \g_@@_display_box + \skip_gset_eq:NN \g_@@_pos_skip \tex_lastskip:D + \tex_unskip:D + \int_gset_eq:NN \g_@@_pos_int \tex_lastpenalty:D + \tex_unpenalty:D + \skip_gadd:Nn \g_@@_pos_skip { \tex_lastskip:D } + \tex_unskip:D + \tex_unpenalty:D + } + \@@_split_parameter: + \vbox_set_split_to_ht:NNn \l_@@_last_box \g_@@_equation_box + { \c_zero_dim } + \group_end: + \box_gset_wd:Nn \g_@@_equation_box { \l_@@_display_dim } \vbox_gset:Nn \g_@@_display_box { \tex_penalty:D \g_@@_display_pre_int @@ -1344,35 +1638,64 @@ Copyright and Licence \cs_new_protected_nopar:Npn \@@_build_display_auxiii: { \bool_set_true:N \l_@@_attach_equation_bool - \bool_if:NTF \g_@@_amsmath_bool - { \box_set_eq_drop:NN \l_@@_display_box \g_@@_display_box } + \box_gclear:N \g_@@_display_box + \bool_if:NF \g_@@_amsmath_bool + { \@@_adjust_equation: } + \@@_build_body_box: + } +\bool_new:N \l_@@_display_bool +\bool_new:N \l_@@_attach_equation_bool +% \end{macrocode} +% \end{macro} +% +% \changes{v0.2}{2022/07/23}{改进对显示数学公式的处理。} +% +% \begin{macro}{\@@_attach_left:N,\@@_attach_right:N} +% \begin{macrocode} +\cs_new_protected:Npn \@@_attach_left:N #1 + { + \@@_attach_equation:Nn #1 + { \g_@@_parshape_indent_dim } + } +\cs_new_protected:Npn \@@_attach_right:N #1 + { + \@@_attach_equation:Nn #1 { - \box_gclear:N \g_@@_display_box - \@@_adjust_equation: + \l_@@_line_dim + - \l_@@_display_dim + + \g_@@_parshape_indent_dim } - \@@_build_body_box: } -\cs_new_protected_nopar:Npn \@@_attach_equation:N +\cs_new_protected:Npn \@@_attach_equation:Nn #1#2 { - \bool_if:NTF \g_@@_amsmath_bool - { \@@_attach_equation_amsmath:N } - { \@@_attach_equation_normal:N } + \vbox_set:Nn \l_@@_last_box + { + \vbox_unpack:N #1 + \box_set_to_last:N \l_@@_last_box + \bool_if:NTF \g_@@_amsmath_bool + { \@@_attach_equation_amsmath:Nn } + { \@@_attach_equation_normal:Nn } + \l_@@_last_box {#2} + } } -\cs_new_protected:Npn \@@_attach_equation_amsmath:N #1 +\cs_new_protected:Npn \@@_attach_equation_amsmath:Nn #1#2 { - \vbox_set:Nn #1 + \vbox_gset:Nn \g_@@_equation_box { - \box_use:N #1 - \@@_ignore_depth: - \vbox_unpack_drop:N \l_@@_display_box + \@@_nobreak: \skip_vertical:n - { \g_@@_display_pre_dim - \box_dp:N #1 } - \box_use_drop:N \g_@@_equation_box + { + \g_@@_display_pre_skip + + \g_@@_display_pre_dim + - \box_dp:N #1 + } + \box_move_right:nn {#2} + { \box_use_drop:N \g_@@_equation_box } } } -\cs_new_protected:Npn \@@_attach_equation_normal:N #1 +\cs_new_protected:Npn \@@_attach_equation_normal:Nn #1#2 { - \vbox_set:Nn #1 + \vbox_set:Nn \l_@@_last_box { \@@_tex_parameter: \dim_set_eq:NN \tex_hsize:D \l_@@_display_dim @@ -1384,6 +1707,25 @@ Copyright and Licence \tex_unskip:D \int_gset_eq:NN \g_@@_pos_int \tex_lastpenalty:D \tex_unpenalty:D + \box_set_to_last:N \l_@@_last_box + \skip_set_eq:NN \l_@@_last_skip \tex_lastskip:D + \tex_unskip:D + \skip_add:Nn \l_@@_last_skip { \tex_lastskip:D } + \vbox_gset:Nn \g_@@_equation_box + { + \@@_nobreak: + \skip_vertical:N \l_@@_last_skip + \box_move_right:nn {#2} + { + \hbox_to_wd:nn + { \l_@@_display_dim } + { + \tex_hss:D + \box_use_drop:N \l_@@_last_box + \tex_hss:D + } + } + } } } \cs_new_protected_nopar:Npn \@@_insert_equation: @@ -1419,15 +1761,15 @@ Copyright and Licence { \bool_gset_false:N \g_@@_eqnum_bool \hbox_unpack:N \g_@@_equation_box - \@@_if_last_hlist:F { \use_none_delimit_by_q_stop:w } + \@@_if_last_hlist:F { \use_none_delimit_by_s_stop:w } \box_gset_to_last:N \g_@@_eqnum_box - \@@_if_last_kern:F { \use_none_delimit_by_q_stop:w } + \@@_if_last_kern:F { \use_none_delimit_by_s_stop:w } \tex_unkern:D - \@@_if_last_hlist:F { \use_none_delimit_by_q_stop:w } + \@@_if_last_hlist:F { \use_none_delimit_by_s_stop:w } \box_gset_to_last:N \g_@@_eqbody_box - \@@_if_last_none:F { \use_none_delimit_by_q_stop:w } + \@@_if_last_none:F { \use_none_delimit_by_s_stop:w } \bool_gset_true:N \g_@@_eqnum_bool - \use_none_delimit_by_q_stop:w \q_stop + \use_none_delimit_by_s_stop:w \s_stop } } \cs_new_protected_nopar:Npn \@@_adjust_equation_width: @@ -1457,27 +1799,26 @@ Copyright and Licence \box_new:N \g_@@_eqbody_box \box_new:N \g_@@_eqnum_box \box_new:N \g_@@_equation_box -\box_new:N \l_@@_display_box \int_new:N \g_@@_pos_int \skip_new:N \g_@@_pos_skip \bool_new:N \g_@@_eqnum_bool -\bool_new:N \g_@@_leqno_bool -\bool_new:N \l_@@_display_bool -\bool_new:N \l_@@_attach_equation_bool % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_add_pos_skip:} +% \begin{macro}{\@@_add_pos_kludge:} % \begin{macrocode} -\cs_new_protected_nopar:Npn \@@_add_pos_skip: +\cs_new_protected_nopar:Npn \@@_add_pos_kludge: { - \bool_lazy_or:nnTF - { \g_@@_right_move_bool } - { \int_compare_p:nNn \g_@@_window_int > \c_zero_int } + \dim_gset:Nn \g_@@_prevdepth_dim + { \box_dp:N \l_@@_window_box } + \bool_gset_false:N \g_@@_equation_dp_bool + \bool_if:NTF \g_@@_next_bool { \tex_vadjust:D { - \tex_penalty:D \c_@@_nobreak_int + \box_if_empty:NF \g_@@_equation_box + { \@@_output_equation_box: } + \@@_nobreak: \bool_if:NT \l_@@_display_bool { \skip_vertical:N \g_@@_pos_skip } } @@ -1487,6 +1828,8 @@ Copyright and Licence { \tex_vadjust:D { + \box_if_empty:NF \g_@@_equation_box + { \@@_output_equation_box: } \tex_penalty:D \g_@@_pos_int \skip_vertical:N \g_@@_pos_skip } @@ -1495,6 +1838,23 @@ Copyright and Licence \int_gzero:N \g_@@_pos_int \skip_gzero:N \g_@@_pos_skip } +\cs_new_protected_nopar:Npn \@@_output_equation_box: + { + \cs_gset_eq:NN + \@@_para_after: + \@@_set_equation_depth: + \bool_gset_true:N \g_@@_equation_dp_bool + \dim_gset:Nn \g_@@_prevdepth_dim + { \box_dp:N \g_@@_equation_box } + \vbox_unpack_drop:N \g_@@_equation_box + } +\cs_new_protected_nopar:Npn \@@_set_equation_depth: + { + \cs_gset_eq:NN \@@_para_after: \@@_empty: + \bool_gset_false:N \g_@@_equation_dp_bool + \@@_set_prevdepth:N \g_@@_prevdepth_dim + } +\bool_new:N \g_@@_equation_dp_bool % \end{macrocode} % \end{macro} % @@ -1522,9 +1882,6 @@ Copyright and Licence { \vbox_set:Nn \l_@@_body_box { - \@@_tex_parameter: - \@@_make_parshape: - \@@_column_penalties: \dim_zero:N \tex_emergencystretch:D \dim_set_eq:NN \tex_hfuzz:D \c_max_dim \dim_set_eq:NN \tex_vfuzz:D \c_max_dim @@ -1533,6 +1890,9 @@ Copyright and Licence \int_set:Nn \tex_tolerance:D { 1000 } \para_raw_noindent: \hbox_unpack_drop:N \l_@@_bottom_box + \@@_tex_parameter: + \@@_make_parshape: + \@@_interline_penalties: \para_raw_end: \int_gset_eq:NN \g_@@_line_int \tex_prevgraf:D } @@ -1560,8 +1920,8 @@ Copyright and Licence { \c_zero_dim \l_@@_l_dim } \prg_replicate:nn { - \bool_if:NTF \g_@@_column_right_bool - { \g_@@_column_window_int } + \bool_if:NTF \g_@@_column_bool + { \g_@@_column_int } { \l_@@_window_int / 2 } } { \c_zero_dim \l_@@_r_dim } @@ -1580,17 +1940,18 @@ Copyright and Licence % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_column_penalties:} +% \begin{macro}{\@@_interline_penalties:} % \begin{macrocode} -\cs_new_protected_nopar:Npn \@@_column_penalties: +\cs_new_protected_nopar:Npn \@@_interline_penalties: { \bool_if:NF \l_@@_hang_bool { - \bool_if:NT \l_@@_column_bool - { \@@_column_penalties_aux: } + \bool_if:NTF \l_@@_column_bool + { \@@_column_penalties: } + { \@@_block_penalties: } } } -\cs_new_protected_nopar:Npn \@@_column_penalties_aux: +\cs_new_protected_nopar:Npn \@@_column_penalties: { \tex_interlinepenalties:D \int_eval:n { \l_@@_window_int / 2 + \c_one_int } ~ @@ -1600,95 +1961,82 @@ Copyright and Licence \c_@@_break_int \c_zero_int } +\cs_new_protected_nopar:Npn \@@_block_penalties: + { + \tex_interlinepenalties:D \l_@@_window_int + \prg_replicate:nn + { \l_@@_window_int - \c_one_int } + { \c_@@_break_int } + \c_zero_int + } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_break:,\@@_nobreak:} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_break: + { \tex_penalty:D \c_@@_break_int } +\cs_new_protected_nopar:Npn \@@_nobreak: + { \tex_penalty:D \c_@@_nobreak_int } +\int_const:Nn \c_@@_break_int { -10000 } +\int_const:Nn \c_@@_nobreak_int { 10000 } % \end{macrocode} % \end{macro} % +% \changes{v0.2}{2022/07/22}{提高稳定性。} +% % \begin{macro}{\@@_build_box:, \@@_build_block:} % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_build_block: { - \@@_build_block_auxi: \vbox_set:Nn \l_@@_window_box { - \@@_tex_parameter: - \dim_set_eq:NN \tex_hsize:D \l_@@_line_dim - \para_raw_noindent: - \hbox_unpack_drop:N \g_@@_line_box - \para_raw_end: - } - \bool_if:NT \l_@@_attach_equation_bool - { - \box_set_ht:Nn \l_@@_window_box - { \box_ht_plus_dp:N \l_@@_window_box - \g_@@_dp_dim } - \box_set_dp:Nn \l_@@_window_box { \g_@@_dp_dim } + \@@_split_parameter: + \skip_set_eq:NN \tex_baselineskip:D \g_@@_baseline_skip + \@@_build_line: } } -\cs_new_protected_nopar:Npn \@@_build_block_auxi: +\cs_new_protected_nopar:Npn \@@_build_line: { - \vbox_set:Nn \l_@@_body_box + \vbox_set_split_to_ht:NNn \l_@@_l_box \l_@@_body_box + { \g_@@_baseline_skip } + \vbox_set_split_to_ht:NNn \l_@@_r_box \l_@@_body_box + { \g_@@_baseline_skip } + \@@_build_line_repack: + \box_if_empty:NTF \l_@@_body_box + { \@@_put_last_line: } { - \vbox_unpack_drop:N \l_@@_body_box - \bool_lazy_and:nnTF - { \box_if_empty_p:N \l_@@_bottom_box } - { \int_if_odd_p:n { \g_@@_line_int } } - { \box_set_eq:NN \l_@@_r_box \l_@@_empty_box } - { - \box_set_to_last:N \l_@@_r_box - \tex_unskip:D \tex_unpenalty:D - } - \box_set_to_last:N \l_@@_l_box - \tex_unskip:D \tex_unpenalty:D - \hbox_gset:Nn \g_@@_line_box - { - \bool_if:NT \l_@@_attach_equation_bool - { \@@_build_block_attach: } - \box_use:N \l_@@_l_box - \tex_hfill:D - \box_use:N \l_@@_r_box - } - \@@_build_block_auxii: + \@@_put_line_box: + \@@_build_line: } } -\cs_new_protected_nopar:Npn \@@_build_block_auxii: +\cs_new_protected_nopar:Npn \@@_build_line_repack: { - \int_case:nnTF - { \tex_lastnodetype:D } + \vbox_set:Nn \l_@@_l_box + { \vbox_unpack_drop:N \l_@@_l_box } + \box_if_empty:NF \l_@@_r_box { - { \c_@@_none_node } { } - { \c_@@_whatsit_node } { } + \vbox_set:Nn \l_@@_r_box + { \vbox_unpack_drop:N \l_@@_r_box } } - { \@@_build_block_finalise: } - { \@@_build_block_auxiii: } + \@@_save_first_ht: } -\cs_new_protected_nopar:Npn \@@_build_block_auxiii: +\cs_new_protected_nopar:Npn \@@_put_last_line: { - \box_set_to_last:N \l_@@_r_box - \tex_unskip:D \tex_unpenalty:D - \box_set_to_last:N \l_@@_l_box - \tex_unskip:D \tex_unpenalty:D - \hbox_gset:Nn \g_@@_line_box - { - \box_use:N \l_@@_l_box - \tex_hfill:D - \box_use:N \l_@@_r_box - \tex_penalty:D \c_@@_break_int - \hbox_unpack_drop:N \g_@@_line_box - } - \@@_build_block_auxii: + \bool_if:NT \l_@@_attach_equation_bool + { \@@_attach_left:N \l_@@_l_box } + \@@_put_line_box: } -\cs_new_protected_nopar:Npn \@@_build_block_attach: +\cs_new_protected_nopar:Npn \@@_put_line_box: { - \box_set_eq:NN \l_@@_last_box \l_@@_l_box - \@@_attach_equation:N \l_@@_last_box - \dim_gset:Nn \g_@@_dp_dim { \box_dp:N \l_@@_last_box } - \hbox_set:Nn \l_@@_l_box + \hbox_to_wd:nn { \l_@@_line_dim } { - \box_move_down:nn - { \box_ht:N \l_@@_last_box - \box_ht:N \l_@@_l_box } - { \box_use_drop:N \l_@@_last_box } + \box_use_drop:N \l_@@_l_box + \tex_hfil:D + \box_use_drop:N \l_@@_r_box } } -\cs_new_protected_nopar:Npn \@@_build_block_finalise: +\cs_new_protected_nopar:Npn \@@_save_first_ht: { \dim_gset:Nn \g_@@_ht_dim { @@ -1696,16 +2044,11 @@ Copyright and Licence { \box_ht:N \l_@@_l_box } { \box_ht:N \l_@@_r_box } } + \cs_set_eq:NN \@@_save_first_ht: \@@_empty: } -\dim_new:N \g_@@_dp_dim \dim_new:N \g_@@_ht_dim \box_new:N \l_@@_l_box \box_new:N \l_@@_r_box -\box_new:N \g_@@_line_box -\box_new:N \l_@@_empty_box -\hbox_set:Nn \l_@@_empty_box { } -\int_const:Nn \c_@@_break_int { -10000 } -\int_const:Nn \c_@@_nobreak_int { 10000 } % \end{macrocode} % \end{macro} % @@ -1716,23 +2059,13 @@ Copyright and Licence \hbox_set_to_wd:Nnn \l_@@_window_box { \l_@@_line_dim } { - \skip_zero:N \tex_splittopskip:D - \dim_set_eq:NN \tex_vfuzz:D \c_max_dim - \int_set_eq:NN \tex_vbadness:D \c_max_int + \@@_split_parameter: \@@_build_column_aux: \box_if_empty:NT \l_@@_bottom_box { \@@_build_column_fuzzy_aux: } - \dim_gset:Nn \g_@@_ht_dim { \box_ht:N \l_@@_l_box } - \vbox_set:Nn \l_@@_l_box - { - \vbox_unpack_drop:N \l_@@_l_box - \bool_if:NT \l_@@_attach_equation_bool - { - \box_set_to_last:N \l_@@_last_box - \@@_attach_equation:N \l_@@_last_box - \vbox_unpack_drop:N \l_@@_last_box - } - } + \@@_repack_left_box: + \bool_if:NT \l_@@_attach_equation_bool + { \@@_attach_left:N \l_@@_l_box } \box_use:N \l_@@_l_box \tex_hfil:D \box_move_up:nn @@ -1743,7 +2076,7 @@ Copyright and Licence \cs_new_protected_nopar:Npn \@@_build_column_aux: { \vbox_set_split_to_ht:NNn \l_@@_l_box \l_@@_body_box - { \c_zero_dim } + { \box_ht:N \l_@@_body_box / 2 } \vbox_set_top:Nn \l_@@_l_box { \vbox_unpack_drop:N \l_@@_l_box } \box_set_eq_drop:NN \l_@@_r_box \l_@@_body_box @@ -1769,17 +2102,21 @@ Copyright and Licence \cs_new_protected_nopar:Npn \@@_rebuild_window: { \int_compare:nNnT \l_@@_window_int > { 2 } - { - \int_sub:Nn \l_@@_window_int { 2 } - \box_set_eq_drop:NN \l_@@_last_l_box \l_@@_l_box - \box_set_eq_drop:NN \l_@@_last_r_box \l_@@_r_box - \box_set_eq:NN \l_@@_bottom_box \l_@@_save_body_box - \int_set_eq:NN \l_@@_window_line_int \l_@@_window_int - \@@_build_window: - \@@_build_column_aux: - \@@_build_column_fuzzy_aux: - } + { \@@_rebuild_window_aux: } + } +\cs_new_protected_nopar:Npn \@@_rebuild_window_aux: + { + \int_sub:Nn \l_@@_window_int { 2 } + \box_set_eq_drop:NN \l_@@_last_l_box \l_@@_l_box + \box_set_eq_drop:NN \l_@@_last_r_box \l_@@_r_box + \box_set_eq:NN \l_@@_bottom_box \l_@@_save_body_box + \int_set_eq:NN \l_@@_window_line_int \l_@@_window_int + \@@_build_window: + \@@_build_column_aux: + \@@_build_column_fuzzy_aux: } +\box_new:N \l_@@_last_l_box +\box_new:N \l_@@_last_r_box % \end{macrocode} % \end{macro} % @@ -1788,9 +2125,7 @@ Copyright and Licence \cs_new_protected_nopar:Npn \@@_build_column_strict: { \group_begin: - \skip_zero:N \tex_splittopskip:D - \dim_set_eq:NN \tex_vfuzz:D \c_max_dim - \int_set_eq:NN \tex_vbadness:D \c_max_int + \@@_split_parameter: \@@_build_column_aux: \box_if_empty:NTF \l_@@_r_box { \@@_build_column_strict_auxi: } @@ -1798,7 +2133,7 @@ Copyright and Licence \box_if_empty:NTF \l_@@_bottom_box { \@@_build_column_strict_auxii: } { - \bool_if:NTF \g_@@_column_right_bool + \bool_if:NTF \g_@@_column_bool { \@@_build_column_strict_auxiii: } { \@@_build_column_strict_auxiv: } } @@ -1810,9 +2145,9 @@ Copyright and Licence { \@@_repack_left_box: \bool_if:NT \l_@@_attach_equation_bool - { \@@_column_attach:N \l_@@_l_box } + { \@@_attach_left:N \l_@@_l_box } \box_gset_eq_drop:NN \g_@@_window_box \l_@@_l_box - \bool_gset_true:N \g_@@_column_right_bool + \bool_gset_true:N \g_@@_column_bool \bool_if:NF \g_@@_first_save_bool { \bool_gset_true:N \g_@@_first_save_bool @@ -1837,12 +2172,12 @@ Copyright and Licence \dim_gsub:Nn \g_@@_first_sep_dim { \box_dp:N \l_@@_window_box } \bool_gset_false:N \g_@@_entire_bool - \dim_gzero:N \g_@@_column_right_ht_dim + \dim_gzero:N \g_@@_column_ht_dim \dim_gset_eq:NN \g_@@_prevdepth_dim \g_@@_first_dp_dim \@@_column_right_move_set:nn { \g_@@_stuff_ht_dim } { \g_@@_window_ht_dim } - \int_gset_eq:NN \g_@@_window_int \g_@@_column_window_int + \int_gset_eq:NN \g_@@_window_int \g_@@_column_int } \cs_new_protected:Npn \@@_column_right_move_set:nn #1#2 { @@ -1861,7 +2196,7 @@ Copyright and Licence \@@_make_next_stuff:nn { \l_@@_line_dim - \l_@@_r_dim - \l_@@_rightsep_dim } {#1} - \dim_gset:Nn \g_@@_column_left_dim {#2} + \dim_gset:Nn \g_@@_column_room_dim {#2} \int_gzero:N \g_@@_top_int } \cs_new_protected_nopar:Npn \@@_build_column_strict_auxii: @@ -1869,11 +2204,12 @@ Copyright and Licence \bool_gset_false:N \g_@@_entire_bool \@@_repack_left_box: \bool_if:NT \l_@@_attach_equation_bool - { \@@_column_attach:N \l_@@_r_box } + { \@@_attach_right:N \l_@@_r_box } \dim_gset:Nn \g_@@_hang_ht_dim { \g_@@_stuff_ht_dim - \tex_baselineskip:D * \@@_unit:n { \box_ht_plus_dp:N \l_@@_r_box } + - \box_ht_plus_dp:N \g_@@_equation_box - \g_@@_pos_skip } \dim_compare:nNnTF \g_@@_hang_ht_dim > \c_zero_dim @@ -1886,19 +2222,21 @@ Copyright and Licence { \int_compare:nNnTF \g_@@_window_int > \c_zero_int { - \dim_gset:Nn \g_@@_column_left_dim + \dim_gset:Nn \g_@@_column_room_dim { \g_@@_window_ht_dim - \g_@@_first_sep_dim - - \box_ht:N \l_@@_r_box + - \box_ht_plus_dp:N \l_@@_r_box + - \box_ht_plus_dp:N \g_@@_equation_box } \@@_next_hang_para: } { - \dim_gset:Nn \g_@@_column_left_dim + \dim_gset:Nn \g_@@_column_room_dim { \box_ht:N \l_@@_l_box - - \box_ht:N \l_@@_r_box + - \box_ht_plus_dp:N \l_@@_r_box + - \box_ht_plus_dp:N \g_@@_equation_box } \dim_gset:Nn \g_@@_first_sep_dim { \tex_baselineskip:D - \g_@@_ht_dim } @@ -1911,11 +2249,15 @@ Copyright and Licence \box_use:N \l_@@_l_box \tex_hfil:D \box_move_up:nn - { \g_@@_column_left_dim } + { \g_@@_column_room_dim } { \box_use:N \l_@@_r_box } } - \dim_gset:Nn \g_@@_column_right_ht_dim - { \box_ht:N \l_@@_r_box + \g_@@_pos_skip } + \dim_gset:Nn \g_@@_column_ht_dim + { + \box_ht_plus_dp:N \l_@@_r_box + + \box_ht_plus_dp:N \g_@@_equation_box + + \g_@@_pos_skip + } } \cs_new_protected_nopar:Npn \@@_column_put_right: { @@ -1942,14 +2284,14 @@ Copyright and Licence { \@@_column_right_move_set:nn { \g_@@_hang_ht_dim } - { \g_@@_column_left_dim } + { \g_@@_column_room_dim } \int_gzero:N \g_@@_window_int } \bool_gset_false:N \g_@@_next_hang_bool } \cs_new_protected_nopar:Npn \@@_build_column_strict_auxiii: { - \bool_gset_false:N \g_@@_column_right_bool + \bool_gset_false:N \g_@@_column_bool \@@_repack_left_box: \hbox_gset_to_wd:Nnn \g_@@_window_box { \l_@@_line_dim } @@ -1980,32 +2322,8 @@ Copyright and Licence \vbox_set:Nn \l_@@_l_box { \vbox_unpack_drop:N \l_@@_l_box } } -\cs_new_protected_nopar:Npn \@@_column_attach:N #1 - { - \vbox_set:Nn #1 - { - \vbox_unpack_drop:N #1 - \box_set_to_last:N \l_@@_last_box - \@@_attach_equation:N \l_@@_last_box - \vbox_unpack_drop:N \l_@@_last_box - } - } -\box_new:N \l_@@_last_l_box -\box_new:N \l_@@_last_r_box \box_new:N \g_@@_window_box -\dim_new:N \g_@@_fake_wd_dim -\dim_new:N \g_@@_first_dp_dim -\dim_new:N \g_@@_first_sep_dim -\dim_new:N \g_@@_column_left_dim -\dim_new:N \g_@@_column_right_ht_dim -\bool_new:N \g_@@_entire_bool -\bool_new:N \g_@@_next_hang_bool -\bool_new:N \g_@@_first_save_bool -\bool_new:N \g_@@_column_right_bool -\bool_new:N \l_@@_column_strict_bool -\bool_new:N \g_@@_first_set_bool \bool_new:N \l_@@_first_move_bool -\bool_new:N \g_@@_right_move_bool % \end{macrocode} % \end{macro} % @@ -2028,38 +2346,39 @@ Copyright and Licence { \vbox_unpack:N \l_@@_body_box } \dim_gset:Nn \g_@@_ht_dim { \box_ht:N \l_@@_window_box } } - \bool_if:NTF \l_@@_attach_equation_bool - { - \vbox_set:Nn \l_@@_window_box - { - \vbox_unpack_drop:N \l_@@_window_box - \box_set_to_last:N \l_@@_last_box - \@@_attach_equation:N \l_@@_last_box - \vbox_unpack_drop:N \l_@@_last_box - } - } - { \box_set_eq_drop:NN \l_@@_window_box \l_@@_body_box } - \dim_compare:nNnTF \g_@@_column_left_dim > \c_zero_dim - { \@@_build_hang_aux: } - { \bool_gset_false:N \g_@@_move_hang_bool } + \box_set_eq_drop:NN \l_@@_window_box \l_@@_body_box + \bool_if:NT \l_@@_attach_equation_bool + { \@@_build_hang_attach: } + \dim_compare:nNnT \g_@@_column_room_dim > \c_zero_dim + { \@@_build_hang_move: } + } +\cs_new_protected_nopar:Npn \@@_build_hang_attach: + { + \dim_compare:nNnTF \l_@@_r_dim = \c_zero_dim + { \@@_attach_left:N \l_@@_window_box } + { \@@_attach_right:N \l_@@_window_box } } -\cs_new_protected_nopar:Npn \@@_build_hang_aux: +\cs_new_protected_nopar:Npn \@@_build_hang_move: { \dim_set:Nn \l_@@_shift_dim { \dim_max:nn { \box_ht:N \l_@@_window_box } { \tex_baselineskip:D * \g_@@_line_int } + + \box_ht_plus_dp:N \g_@@_equation_box + \tex_parskip:D } - \dim_gsub:Nn \g_@@_column_left_dim { \l_@@_shift_dim } - \dim_compare:nNnTF \g_@@_column_left_dim > \c_zero_dim + \dim_gsub:Nn \g_@@_column_room_dim { \l_@@_shift_dim } + \dim_compare:nNnTF \g_@@_column_room_dim > \c_zero_dim { \box_if_empty:NTF \l_@@_bottom_box { \bool_if:NT \g_@@_right_move_bool { \@@_set_next_hang: } } - { \bool_gset_false:N \g_@@_move_hang_bool } } - { \bool_gset_false:N \g_@@_move_hang_bool } + { \use:n } + { + \bool_gset_false:N \g_@@_move_hang_bool + \bool_gset_false:N \g_@@_right_move_bool + } } \cs_new_protected_nopar:Npn \@@_set_next_hang: { @@ -2069,46 +2388,36 @@ Copyright and Licence \dim_gset_eq:NN \g_@@_hang_ht_dim \g_@@_remaining_dim } \dim_gsub:Nn \g_@@_hang_ht_dim { \l_@@_shift_dim } - \dim_gset:Nn \g_@@_dp_dim { \box_dp:N \l_@@_window_box } \@@_column_right_move_set:nn { \g_@@_hang_ht_dim } - { \g_@@_column_left_dim } + { \g_@@_column_room_dim } \int_gzero:N \g_@@_window_int } -\dim_new:N \g_@@_hang_ht_dim -\bool_new:N \g_@@_move_hang_bool % \end{macrocode} % \end{macro} % % \begin{macro}{\@@_build_hangfrom:} % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_build_hangfrom: - { - \dim_compare:nNnTF \g_@@_prevdepth_dim > \c_@@_ignore_depth_dim - { \@@_build_hangfrom_aux: } - { \dim_gzero:N \g_@@_ht_dim } - } -\cs_new_protected_nopar:Npn \@@_build_hangfrom_aux: { \group_begin: - \skip_zero:N \tex_splittopskip:D - \vbox_gset:Nn \g_@@_line_box + \vbox_gset:Nn \g_@@_window_box { - \tex_penalty:D \c_@@_break_int + \@@_break: \vbox_unpack:N \l_@@_body_box } - \vbox_set_split_to_ht:NNn \l_@@_last_box \g_@@_line_box + \@@_split_parameter: + \vbox_set_split_to_ht:NNn \l_@@_last_box \g_@@_window_box { \c_zero_dim } \dim_gset:Nn \g_@@_ht_dim { \g_@@_baseline_skip - \g_@@_prevdepth_dim - - \l_@@_shift_dim - \box_ht:N \l_@@_body_box - + \box_ht:N \g_@@_line_box + + \box_ht:N \g_@@_window_box } \group_end: - \box_set_eq_drop:NN \l_@@_body_box \g_@@_line_box + \box_set_eq_drop:NN \l_@@_body_box \g_@@_window_box } % \end{macrocode} % \end{macro} @@ -2117,37 +2426,39 @@ Copyright and Licence % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_put_box: { - \para_raw_end: + \@@_para_raw_end: \dim_compare:nNnTF \g_@@_prevdepth_dim > \c_@@_ignore_depth_dim { \@@_add_vskip: } - { \skip_gzero:N \g_@@_pre_skip } + { \@@_set_vskip: } \skip_set_eq:NN \l_@@_par_skip \tex_parskip:D \skip_zero:N \tex_parskip:D + \dim_set:Nn \l_@@_window_ht_dim + { \box_ht_plus_dp:N \l_@@_window_box } \bool_if:NTF \g_@@_right_move_bool { \@@_put_box_aux: } { \box_if_empty:NTF \l_@@_bottom_box - { - \dim_compare:nNnTF - { \g_@@_remaining_dim } - > - { \box_ht_plus_dp:N \l_@@_window_box } - { \@@_set_next: } - { \@@_put_box_aux: } - } + { \@@_put_next_test: } { \@@_put_box_aux: } } } +\dim_new:N \l_@@_window_ht_dim \skip_new:N \l_@@_par_skip -\cs_new_protected_nopar:Npn \@@_put_box_aux: +\cs_new_protected_nopar:Npn \@@_put_next_test: { - \int_gzero:N \g_@@_window_int - \@@_hbox:n + \box_if_empty:NF \g_@@_equation_box { - \@@_put_window_box: - \bool_if:NF \g_@@_next_bool - { \@@_put_stuff_box: } + \dim_add:Nn \l_@@_window_ht_dim + { \box_ht_plus_dp:N \g_@@_equation_box + \g_@@_pos_skip } } + \dim_compare:nNnTF + { \g_@@_remaining_dim + \g_@@_pos_skip } > \l_@@_window_ht_dim + { \@@_set_next: } + { \@@_put_box_aux: } + } +\cs_new_protected_nopar:Npn \@@_put_box_aux: + { + \@@_output_window_box: \box_if_empty:NTF \l_@@_bottom_box { \@@_put_trailer_box: } { \@@_put_bottom_box: } @@ -2163,31 +2474,48 @@ Copyright and Licence \bool_if:NTF \g_@@_right_move_bool { \@@_next_para_trailer: } { - \@@_add_pos_skip: - \box_if_empty:NF \g_@@_pos_box - { - \@@_newline: - \hbox_unpack_drop:N \g_@@_pos_box - } + \@@_add_pos_kludge: + \@@_put_pos_box: + \@@_clear_variable: } } } \cs_new_protected_nopar:Npn \@@_put_bottom_box: { - \@@_newline: + \@@_para_raw_end: + \para_raw_noindent: \hbox_unpack_drop:N \l_@@_bottom_box \box_if_empty:NF \g_@@_equation_box { \@@_insert_equation: } + \@@_put_pos_box: + \@@_clear_variable: + } +\cs_new_protected_nopar:Npn \@@_output_window_box: + { + \@@_hbox:n + { + \@@_put_window_box: + \bool_if:NF \g_@@_next_bool + { \@@_output_stuff_box: } + } + } +\cs_new_protected_nopar:Npn \@@_put_pos_box: + { \box_if_empty:NF \g_@@_pos_box - { \hbox_unpack_drop:N \g_@@_pos_box } - \bool_gset_false:N \g_@@_right_move_bool - \bool_gset_false:N \g_@@_first_save_bool + { \@@_output_pos_box: } + } +\cs_new_protected_nopar:Npn \@@_output_pos_box: + { + \@@_if_last_none:F + { \@@_output_pos_box_aux: } + \hbox_unpack_drop:N \g_@@_pos_box } -\cs_new_protected_nopar:Npn \@@_newline: +\cs_new_protected_nopar:Npn \@@_output_pos_box_aux: { - \tex_penalty:D \c_@@_nobreak_int - \tex_hfil:D - \tex_penalty:D \c_@@_break_int + \@@_para_raw_end: + \bool_if:NT \g_@@_equation_dp_bool + { \@@_set_equation_depth: } + \para_raw_noindent: } \cs_new_protected:Npn \@@_hbox:n #1 { @@ -2202,22 +2530,22 @@ Copyright and Licence { \skip_horizontal:n { \l_@@_line_dim - \l_@@_r_dim } } \box_use:N \l_@@_window_box } -\cs_new_protected_nopar:Npn \@@_put_stuff_box: +\cs_new_protected_nopar:Npn \@@_output_stuff_box: { - \@@_move_stuff_box:nn { up } + \hbox_gset:Nn \g_@@_stuff_box { - \l_@@_voffset_dim - + ( \box_dp:N \g_@@_stuff_box - - \box_dp:N \l_@@_window_box ) - + ( \box_ht_plus_dp:N \l_@@_window_box - - \g_@@_stuff_ht_dim ) / 2 - \box_if_empty:NT \l_@@_bottom_box - { - \g_@@_pos_skip / 2 } + \@@_parshape_kern: + \box_move_up:nn + { + + \box_ht:N \l_@@_window_box + - ( \l_@@_window_ht_dim + + \box_ht_plus_dp:N \g_@@_stuff_box ) / 2 + + \l_@@_voffset_dim + } + { \box_use_drop:N \g_@@_stuff_box } } - \@@_output_stuff_box: - } -\cs_new_protected_nopar:Npn \@@_output_stuff_box: - { + \box_gset_ht:Nn \g_@@_stuff_box { \c_zero_dim } + \box_gset_dp:Nn \g_@@_stuff_box { \c_zero_dim } \skip_horizontal:n { \dim_compare:nNnTF \l_@@_r_dim > \c_zero_dim @@ -2240,23 +2568,6 @@ Copyright and Licence % \end{macrocode} % \end{macro} % -% \begin{macro}{\@@_move_stuff_box:n} -% \begin{macrocode} -\cs_new_protected:Npn \@@_move_stuff_box:nn #1#2 - { - \hbox_gset:Nn \g_@@_stuff_box - { - \@@_parshape_kern: - \use:c { box_move_ #1 :nn } - {#2} - { \box_use_drop:N \g_@@_stuff_box } - } - \box_gset_ht:Nn \g_@@_stuff_box { \c_zero_dim } - \box_gset_dp:Nn \g_@@_stuff_box { \c_zero_dim } - } -% \end{macrocode} -% \end{macro} -% % \begin{macro}{\@@_add_vskip:} % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_add_vskip: @@ -2267,6 +2578,7 @@ Copyright and Licence } \cs_new_protected_nopar:Npn \@@_add_vskip_display: { + \bool_set_true:N \l_@@_display_pre_bool \vbox_unpack_drop:N \g_@@_display_box \@@_ignore_depth: } @@ -2274,18 +2586,15 @@ Copyright and Licence { \dim_compare:nNnTF \tex_pagegoal:D < \c_max_dim { \@@_add_vskip_auxii: } - { \@@_add_vskip_auxiii: } + { + \bool_if:NTF \g_@@_next_bool + { \@@_add_vskip_auxii: } + { \@@_add_vskip_auxiii: } + } } \cs_new_protected_nopar:Npn \@@_add_vskip_auxii: { - \skip_gset:Nn \g_@@_pre_skip - { - \g_@@_baseline_skip - - \g_@@_prevdepth_dim - - \g_@@_ht_dim - } - \dim_compare:nNnT \g_@@_pre_skip < \tex_lineskiplimit:D - { \skip_gset_eq:NN \g_@@_pre_skip \tex_lineskip:D } + \@@_add_vskip_auxiv: \bool_if:NTF \l_@@_first_move_bool { \@@_first_move_skip: } { \skip_vertical:N \g_@@_pre_skip } @@ -2293,14 +2602,25 @@ Copyright and Licence } \cs_new_protected_nopar:Npn \@@_add_vskip_auxiii: { + \@@_add_vskip_auxiv: + \skip_vertical:N \g_@@_pre_skip \dim_compare:nNnTF \tex_topskip:D > \g_@@_ht_dim { + \skip_sub:Nn \tex_topskip:D { \g_@@_ht_dim } \tex_hrule:D height \c_zero_dim \scan_stop: - \skip_gset:Nn \g_@@_pre_skip - { \tex_topskip:D - \g_@@_ht_dim } - \skip_vertical:n { \g_@@_pre_skip - \tex_topskip:D } } - { \skip_gzero:N \g_@@_pre_skip } + { \@@_ignore_depth: } + } +\cs_new_protected_nopar:Npn \@@_add_vskip_auxiv: + { + \skip_gset:Nn \g_@@_pre_skip + { + \g_@@_baseline_skip + - \g_@@_prevdepth_dim + - \g_@@_ht_dim + } + \dim_compare:nNnT \g_@@_pre_skip < \tex_lineskiplimit:D + { \skip_gset_eq:NN \g_@@_pre_skip \tex_lineskip:D } } \cs_new_protected_nopar:Npn \@@_first_move_skip: { @@ -2309,11 +2629,26 @@ Copyright and Licence \g_@@_first_sep_dim - \g_@@_window_ht_dim - \tex_parskip:D - \dim_compare:nNnT \g_@@_column_right_ht_dim > \c_zero_dim - { + \g_@@_column_right_ht_dim + \g_@@_pre_skip } + \dim_compare:nNnT \g_@@_column_ht_dim > \c_zero_dim + { + \g_@@_column_ht_dim + \g_@@_pre_skip } } } \skip_new:N \g_@@_pre_skip +\bool_new:N \l_@@_display_pre_bool +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@@_set_vskip:} +% \begin{macrocode} +\cs_new_protected_nopar:Npn \@@_set_vskip: + { + \box_if_empty:NTF \g_@@_display_box + { + \skip_gset:Nn \g_@@_pre_skip + { \g_@@_baseline_skip - \g_@@_ht_dim } + } + { \@@_add_vskip_display: } + } % \end{macrocode} % \end{macro} % @@ -2333,24 +2668,19 @@ Copyright and Licence { \dim_set:Nn \l_@@_height_dim { - \g_@@_pre_skip - + \g_@@_pos_skip - + \box_ht_plus_dp:N \l_@@_window_box + \bool_if:NT \g_@@_next_bool { \l_@@_par_skip } + + \g_@@_pre_skip + + \l_@@_window_ht_dim } \dim_gadd:Nn \g_@@_total_ht_dim { \l_@@_height_dim } \dim_set:Nn \l_@@_shift_dim { \g_@@_remaining_dim - \l_@@_height_dim } - \dim_compare:nNnTF \l_@@_shift_dim > \c_zero_dim - { \@@_set_next_auxi: } - { - \dim_compare:nNnTF - { - \l_@@_shift_dim } > \l_@@_min_dim - { \@@_set_next_auxii: } - { \@@_set_next_auxi: } - } + \dim_compare:nNnTF + { - \l_@@_shift_dim } < \l_@@_min_dim + { \@@_set_next_para: } + { \@@_set_next_output: } } -\dim_new:N \g_@@_total_ht_dim -\cs_new_protected_nopar:Npn \@@_set_next_auxi: +\cs_new_protected_nopar:Npn \@@_set_next_para: { \int_gset:Nn \g_@@_window_int { @@ -2359,64 +2689,34 @@ Copyright and Licence { \c_one_int } } \@@_set_next_verify: - \bool_if:NF \g_@@_next_bool - { \@@_move_next_stuff_box: } - \@@_set_next_output: + \@@_output_window_box: \@@_make_next_stuff:nn { \g_@@_stuff_wd_dim } { \l_@@_shift_dim } \int_gzero:N \g_@@_top_int \@@_next_para_trailer: } -\cs_new_protected_nopar:Npn \@@_move_next_stuff_box: - { - \@@_move_stuff_box:nn { down } - { - \box_ht:N \g_@@_stuff_box - - \box_ht:N \l_@@_window_box - + ( \g_@@_window_ht_dim - - \g_@@_stuff_ht_dim - - \g_@@_pre_skip - + \g_@@_pos_skip - + \l_@@_par_skip ) / 2 - - \l_@@_voffset_dim - } - } -\cs_new_protected_nopar:Npn \@@_set_next_auxii: - { - \int_gzero:N \g_@@_window_int - \bool_if:NF \g_@@_next_bool - { - \@@_move_stuff_box:nn { down } - { - \box_ht:N \g_@@_stuff_box - - \box_ht:N \l_@@_window_box - - \l_@@_voffset_dim - } - } - \@@_set_next_output: - \@@_add_pos_skip: - } \cs_new_protected_nopar:Npn \@@_set_next_output: { - \@@_hbox:n - { - \@@_put_window_box: - \bool_if:NF \g_@@_next_bool - { \@@_output_stuff_box: } - } + \@@_output_window_box: + \@@_add_pos_kludge: + \@@_put_pos_box: + \@@_clear_variable: } \cs_new_protected_nopar:Npn \@@_set_next_verify: { \dim_set:Nn \l_@@_height_dim - { \g_@@_window_ht_dim - \g_@@_total_ht_dim } - \dim_until_do:nNnn + { \g_@@_window_ht_dim - \g_@@_total_ht_dim - \l_@@_min_dim } + \dim_while_do:nNnn { \tex_baselineskip:D * \g_@@_window_int + \l_@@_par_skip } - > + < { \l_@@_height_dim } { \int_gincr:N \g_@@_window_int } - \dim_gadd:Nn \g_@@_total_ht_dim - { \tex_baselineskip:D * \g_@@_window_int + \l_@@_par_skip } + \bool_if:NF \g_@@_next_bool + { + \dim_add:Nn \l_@@_window_ht_dim + { \tex_baselineskip:D * \g_@@_window_int + \l_@@_par_skip } + } } % \end{macrocode} % \end{macro} @@ -2425,7 +2725,7 @@ Copyright and Licence % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_next_para_trailer: { - \@@_add_pos_skip: + \@@_add_pos_kludge: \box_if_empty:NTF \g_@@_pos_box { \@@_next_para: } { @@ -2445,7 +2745,6 @@ Copyright and Licence \dim_gset:Nn \g_@@_stuff_wd_dim {#1} \dim_gset:Nn \g_@@_remaining_dim {#2} } -\bool_new:N \g_@@_next_bool % \end{macrocode} % \end{macro} % @@ -2516,11 +2815,7 @@ Copyright and Licence % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_test_display_math: { - \@@_if_last_hlist:T - { - \box_gset_to_last:N \g_@@_pos_box - \tex_unskip:D - } + \@@_if_last_hlist:T { \@@_extract_pos_hbox: } \box_clear:N \l_@@_add_box \box_gclear:N \g_@@_display_box \skip_gzero:N \g_@@_last_skip @@ -2532,7 +2827,14 @@ Copyright and Licence \@@_add_last_skip:w \@@_add_last_skip:w \@@_add_last_penalty:w - \@@_add_last_finalise:w \q_stop + \@@_add_last_finalise:w \s_stop + } +\cs_new_protected_nopar:Npn \@@_extract_pos_hbox: + { + \box_gset_to_last:N \g_@@_last_box + \@@_repack_hbox:N \l_@@_last_box + \box_gset_eq_drop:NN \g_@@_pos_box \l_@@_last_box + \tex_unskip:D } \box_new:N \l_@@_add_box \box_new:N \g_@@_pos_box @@ -2544,7 +2846,7 @@ Copyright and Licence \cs_new_protected_nopar:Npn \@@_add_last_stop:w { \vbox_unpack_drop:N \l_@@_add_box - \use_none_delimit_by_q_stop:w + \use_none_delimit_by_s_stop:w } % \end{macrocode} % \end{macro} @@ -2630,7 +2932,7 @@ Copyright and Licence } { \box_gset_eq_drop:NN \g_@@_display_box \l_@@_add_box } { \vbox_unpack_drop:N \l_@@_add_box } - \use_none_delimit_by_q_stop:w + \use_none_delimit_by_s_stop:w } \int_new:N \g_@@_display_pre_int \skip_new:N \g_@@_display_pre_skip @@ -2690,7 +2992,8 @@ Copyright and Licence % \env{align} 等环境的开头 \tn{ifdt@p} 为真,会插入两个 \tn{vskip}, % 但是 \env{multline} 定义中的 \tn{mmeasure@} 没有重定义 \tn{everycr}, % 上述定义中的 \tn{dt@pfalse} 被执行,导致环境开头被加入了 \tn{penalty}, -% 不确定是有意为之还是疏忽。 +% 不确定是有意为之还是疏忽^^A +% \footnote{\url{https://github.com/latex3/latex2e/issues/793}}。 % \begin{macrocode} \cs_new_protected_nopar:Npn \@@_amsmath_multline:w { @@ -2963,11 +3266,11 @@ Copyright and Licence } \regex_const:Nn \c_@@_integer_regex { \A \d+ \Z } \cs_new_protected_nopar:Npn \@@_unknown_key_error:n - { \msg_error:nnn { wrapstuff } { unknown-key } } -\msg_new:nnnn { wrapstuff } { unknown-key } - { The~key~'#1'~is~unknown~and~is~being~ignored. } + { \msg_error:nnn { wstf } { unknown-key } } +\msg_new:nnnn { wstf } { unknown-key } + { The~key~"#1"~is~unknown~and~is~being~ignored. } { - The~package~wrapstuff~does~not~have~a~key~called~'#1'.\\ + The~package~wrapstuff~does~not~have~a~key~called~"#1".\\ Check~that~you~have~spelled~the~key~name~correctly. } % \end{macrocode} diff --git a/Master/texmf-dist/tex/latex/wrapstuff/wrapstuff.sty b/Master/texmf-dist/tex/latex/wrapstuff/wrapstuff.sty index 4262f9debe2..ad2e4ad87bc 100644 --- a/Master/texmf-dist/tex/latex/wrapstuff/wrapstuff.sty +++ b/Master/texmf-dist/tex/latex/wrapstuff/wrapstuff.sty @@ -25,12 +25,12 @@ %% %% ----------------------------------------------------------------- %% -\NeedsTeXFormat{LaTeX2e} +\NeedsTeXFormat{LaTeX2e}[2021-06-01] \@ifundefined{ExplLoaderFileDate}{\RequirePackage{expl3}}{} -\GetIdInfo$Id: wrapstuff.dtx 564fe9d 2022-07-20 19:55:58 +0800 Qing Lee $ +\GetIdInfo$Id: wrapstuff.dtx e891159 2022-07-26 19:00:31 +0800 Qing Lee $ {Wrapping text around stuff} \ProvidesExplPackage{\ExplFileName} - {\ExplFileDate}{0.1}{\ExplFileDescription} + {\ExplFileDate}{0.2}{\ExplFileDescription} \@ifl@t@r \fmtversion { 2021-06-01 } { } { @@ -53,6 +53,217 @@ \msg_critical:nn { wrapstuff } { latex3-too-old } } \prop_gput:Nnn \g_msg_module_name_prop { wstf } { wrapstuff } +\tl_const:Nn \c__wstf_global_tl_tl + { \g__wstf_main_setting_tl } +\tl_const:Nn \c__wstf_global_dim_tl + { + \g__wstf_hang_ht_dim + \g__wstf_total_ht_dim + \g__wstf_stuff_ht_dim + \g__wstf_stuff_wd_dim + \g__wstf_first_dp_dim + \g__wstf_first_sep_dim + \g__wstf_prevdepth_dim + \g__wstf_column_ht_dim + \g__wstf_window_ht_dim + \g__wstf_remaining_dim + \g__wstf_column_room_dim + \g__wstf_parshape_indent_dim + \g__wstf_parshape_length_dim + } +\tl_const:Nn \c__wstf_global_int_tl + { + \g__wstf_top_int + \g__wstf_column_int + \g__wstf_window_int + } +\tl_const:Nn \c__wstf_global_bool_tl + { + \g__wstf_next_bool + \g__wstf_leqno_bool + \g__wstf_column_bool + \g__wstf_entire_bool + \g__wstf_display_bool + \g__wstf_move_hang_bool + \g__wstf_next_hang_bool + \g__wstf_first_set_bool + \g__wstf_first_save_bool + \g__wstf_right_move_bool + } +\cs_new_protected:Npn \__wstf_tl_init:N #1 + { + \tl_new:N #1 + \tl_gput_right:Nn \g__wstf_var_clear_tl + { \tl_gclear:N #1 } + \tl_gput_right:Nn \g__wstf_var_push_tl + { \tl_gset:Nn \exp_not:N #1 { \exp_not:o {#1} } } + } +\cs_new_protected:Npn \__wstf_dim_init:N #1 + { + \dim_new:N #1 + \tl_gput_right:Nn \g__wstf_var_clear_tl + { \dim_gzero:N #1 } + \tl_gput_right:Nn \g__wstf_var_push_tl + { \dim_gset:Nn #1 { \dim_use:N #1 } } + } +\cs_new_protected:Npn \__wstf_int_init:N #1 + { + \int_new:N #1 + \tl_gput_right:Nn \g__wstf_var_clear_tl + { \int_gzero:N #1 } + \tl_gput_right:Nn \g__wstf_var_push_tl + { \int_gset:Nn #1 { \int_use:N #1 } } + } +\cs_new_protected:Npn \__wstf_bool_init:N #1 + { + \bool_new:N #1 + \tl_gput_right:Nn \g__wstf_var_clear_tl + { \bool_gset_false:N #1 } + \tl_gput_right:Nn \g__wstf_var_push_tl + { + \bool_if:NTF #1 + { \bool_gset_true:N #1 } + { \bool_gset_false:N #1 } + } + } +\tl_new:N \g__wstf_var_clear_tl +\tl_new:N \g__wstf_var_push_tl +\tl_map_function:NN \c__wstf_global_tl_tl \__wstf_tl_init:N +\tl_map_function:NN \c__wstf_global_dim_tl \__wstf_dim_init:N +\tl_map_function:NN \c__wstf_global_int_tl \__wstf_int_init:N +\tl_map_function:NN \c__wstf_global_bool_tl \__wstf_bool_init:N +\int_gdecr:N \g__wstf_top_int +\tl_gput_right:Nn \g__wstf_var_clear_tl + { \int_gdecr:N \g__wstf_top_int } +\cs_new_protected_nopar:Npn \__wstf_clear: + { + \__wstf_clear_para_hook: + \__wstf_clear_kludge: + \__wstf_clear_variable: + } +\cs_new_protected_nopar:Npn \__wstf_clear_variable: + { + \tl_use:N \g__wstf_var_clear_tl + \box_gclear:N \g__wstf_stuff_box + } +\cs_new_protected_nopar:Npn \__wstf_clear_kludge: + { + \bool_if:NTF \g__wstf_next_bool + { + \skip_vertical:n + { \tex_baselineskip:D * \g__wstf_window_int } + } + { + \box_if_empty:NF \g__wstf_stuff_box + { \__wstf_clear_stuff_box: } + } + } +\cs_new_protected_nopar:Npn \__wstf_clear_stuff_box: + { + \__wstf_ignore_depth: + \skip_set:Nn \l__wstf_last_skip + { \box_dp:N \strutbox } + \skip_vertical:N \l__wstf_last_skip + \box_use_drop:N \g__wstf_stuff_box + \skip_vertical:N \l__wstf_last_skip + \__wstf_ignore_depth: + } +\cs_new_protected_nopar:Npn \__wstf_status_push: + { + \tl_clear:N \l__wstf_status_tl + \int_gincr:N \g__wstf_status_int + \exp_args:Ne \__wstf_status_push_aux:n + { \int_use:N \g__wstf_status_int } + \seq_gpush:No \g__wstf_status_seq { \l__wstf_status_tl } + } +\cs_new_protected:Npn \__wstf_status_push_aux:n #1 + { + \__wstf_push_cs:nN {#1} \__wstf_para_before: + \__wstf_push_cs:nN {#1} \__wstf_para_begin: + \__wstf_push_cs:nN {#1} \__wstf_para_end: + \__wstf_push_cs:nN {#1} \__wstf_display_hook: + \__wstf_push_box:N \g__wstf_stuff_box + \__wstf_push_var: + } +\cs_new_protected:Npn \__wstf_push_cs:nN #1#2 + { + \exp_args:NNc \__wstf_push_cs_aux:NN #2 + { __wstf_ #1 _ \token_to_str:N #2 } + } +\cs_new_protected:Npn \__wstf_push_cs_aux:NN #1#2 + { + \cs_gset_eq:NN #2#1 + \tl_put_right:Nn \l__wstf_status_tl + { + \cs_gset_eq:NN #1#2 + \cs_undefine:N #2 + } + } +\cs_new_protected:Npn \__wstf_push_box:N #1 + { + \hbox_gset:Nn \g__wstf_stauts_box + { + \hbox_unpack_drop:N \g__wstf_stauts_box + \box_use:N #1 + } + \tl_put_right:Nn \l__wstf_status_tl + { \__wstf_pop_box:N #1 } + } +\cs_new_protected:Npn \__wstf_pop_box:N #1 + { + \hbox_gset:Nw \g__wstf_stauts_box + \hbox_unpack_drop:N \g__wstf_stauts_box + \box_gset_to_last:N #1 + \__wstf_if_last_hlist:TF + { \hbox_gset_end: } + { + \hbox_gset_end: + \box_gclear:N \g__wstf_stauts_box + } + } +\cs_new_protected_nopar:Npn \__wstf_push_var: + { + \tl_put_right:Nx \l__wstf_status_tl + { \g__wstf_var_push_tl } + } +\cs_new_protected_nopar:Npn \__wstf_status_pop: + { + \seq_gpop:NNT \g__wstf_status_seq \l__wstf_status_tl + { + \int_gdecr:N \g__wstf_status_int + \tl_use:N \l__wstf_status_tl + } + } +\cs_new_protected_nopar:Npn \__wstf_status_restore: + { + \__wstf_status_push: + \__wstf_clear_para_hook: + \__wstf_clear_display_hook: + \__wstf_clear_variable: + \group_insert_after:N \__wstf_status_pop: + } +\cs_new_protected_nopar:Npn \__wstf_status_clear: + { + \bool_if:NT \g__wstf_next_bool + { + \__wstf_clear_para_hook: + \__wstf_clear_variable: + } + } +\tl_new:N \l__wstf_status_tl +\box_new:N \g__wstf_stauts_box +\int_new:N \g__wstf_status_int +\seq_new:N \g__wstf_status_seq +\cs_new_protected_nopar:Npn \wrapstuff@parboxrestore + { \group_insert_after:N \__wstf_status_clear: } +\cs_new_protected_nopar:Npn \__wstf_parbox_restore: + { + \cs_set_eq:NN + \wrapstuff@parboxrestore + \__wstf_status_restore: + } +\g@addto@macro \@arrayparboxrestore + { \wrapstuff@parboxrestore } \group_begin: \cs_set:Npn \__wstf_tmp:nn #1 { @@ -82,6 +293,10 @@ { \hook_gput_code:nnn {#1} { wrapstuff } } \cs_new_protected:Npn \__wstf_package_hook:nn #1 { \hook_gput_code:nnn { package/#1/after } { wrapstuff } } +\cs_new_protected_nopar:Npn \__wstf_para_raw_end: + { \group_begin: \para_raw_end: \group_end: } +\cs_new_protected:Npn \__wstf_gadd_ht:Nn #1#2 + { \box_gset_ht:Nn #1 { \box_ht:N #1 + \dim_eval:n {#2} } } \NewDocumentEnvironment { wrapstuff } { O { } } { \__wstf_clear: @@ -179,15 +394,10 @@ \box_gset_dp:Nn \g__wstf_stuff_box { \c_zero_dim } } \tl_new:N \l__wstf_main_kv_tl -\tl_new:N \g__wstf_main_setting_tl \box_new:N \g__wstf_stuff_box -\dim_new:N \g__wstf_stuff_ht_dim -\dim_new:N \g__wstf_stuff_wd_dim \dim_new:N \l__wstf_shift_dim \dim_new:N \l__wstf_width_dim \dim_new:N \l__wstf_height_dim -\dim_new:N \g__wstf_prevdepth_dim -\dim_new:N \g__wstf_remaining_dim \cs_new_protected_nopar:Npn \__wstf_attach_label: { \stepcounter { wrapstuff } @@ -199,20 +409,26 @@ } \cs_new_protected_nopar:Npn \__wstf_write_label: { - \iow_shipout_x:Nx \@auxout + \exp_args:Nee \__wstf_write_label_aux:nn + { \__wstf_counter:n { wrapstuff } } + { \__wstf_counter:n { page } } + } +\cs_new_protected:Npx \__wstf_write_label_aux:nn #1#2 + { + \prop_gput_if_new:Nnn \exp_not:N \g__wstf_page_prop {#1} {#2} + \iow_shipout_x:Nn \exp_not:N \@auxout { \c_backslash_str wrapstuff@label - { \__wstf_counter:n { wrapstuff } } + {#1} { \exp_not:N \wrapstuff@counter { page } } } } +\newcounter { wrapstuff } \cs_new:Npn \__wstf_counter:n #1 { \int_value:w \value {#1} } \cs_new_eq:NN \wrapstuff@counter \__wstf_counter:n \cs_new_protected_nopar:Npn \wrapstuff@label - { \@newl@bel { wrapstuff@label } } -\tl_const:Nn \c__wstf_label_tl - { wrapstuff@label@ \int_value:w \value { wrapstuff } } + { \prop_gput:Nnn \g__wstf_page_prop } \__wstf_gadd_hook:nn { begindocument } { \legacy_if:nTF { @filesw } @@ -225,7 +441,35 @@ } { \cs_gset_eq:NN \__wstf_write_label: \__wstf_empty: } } -\newcounter { wrapstuff } +\__wstf_gadd_hook:nn { enddocument/afterlastpage } + { + \legacy_if:nT { @filesw } + { \prop_gclear:N \g__wstf_page_prop } + } +\__wstf_gadd_hook:nn { enddocument/info } + { + \prop_if_empty:NF \g__wstf_rerun_prop + { \__wstf_rerun_check: } + } +\cs_new_protected_nopar:Npn \__wstf_rerun_check: + { + \prop_map_inline:Nn \g__wstf_rerun_prop + { + \prop_get:NnN \g__wstf_page_prop { ##1 } \l__wstf_page_tl + \int_if_even:nF { \l__wstf_page_tl - ##2 } + { \prop_map_break:n { \__wstf_rerun_warning: } } + } + } +\cs_new_protected_nopar:Npn \__wstf_rerun_warning: + { \msg_warning:nn { wstf } { rerun-required } } +\msg_new:nnn { wstf } { rerun-required } + { + Page(s)~may~have~changed.\\ + Rerun~to~get~i/o~setting~right. + } +\tl_new:N \l__wstf_page_tl +\prop_new:N \g__wstf_page_prop +\prop_new:N \g__wstf_rerun_prop \cs_new_protected_nopar:Npn \__wstf_save_main_setting: { \exp_args:Nnno @@ -254,8 +498,10 @@ \keys_precompile:nnN { wrapstuff } { \l__wstf_main_kv_tl } \l__wstf_main_kv_tl - \tl_gconcat:NNN \g__wstf_main_setting_tl - \g__wstf_main_setting_tl \l__wstf_main_kv_tl + \tl_gconcat:NNN + \g__wstf_main_setting_tl + \g__wstf_main_setting_tl + \l__wstf_main_kv_tl } \cs_new_protected_nopar:Npn \__wstf_set_top_line: { @@ -269,72 +515,29 @@ } } \cs_new_protected_nopar:Npn \__wstf_swap_ratio: + { + \exp_args:Ne \__wstf_swap_ratio_aux:n + { \__wstf_counter:n { wrapstuff } } + } +\cs_new_protected:Npn \__wstf_swap_ratio_aux:n #1 { \fp_compare:nF { \c_zero_fp < \l__wstf_ratio_fp < \c_one_fp } { \fp_zero:N \l__wstf_ratio_fp } - \int_if_odd:nTF - { - \exp_args:Ne \cs_if_exist_use:cF - { \c__wstf_label_tl } - { \__wstf_counter:n { page } } - } + \prop_get:NnNF \g__wstf_page_prop {#1} \l__wstf_page_tl + { \tl_set:Nx \l__wstf_page_tl { \__wstf_counter:n { page } } } + \int_if_odd:nTF { \l__wstf_page_tl } { \bool_if:NTF \l__wstf_inner_bool } { \bool_if:NTF \l__wstf_outer_bool } { \__wstf_set_ratio:N \l__wstf_ratio_fp } { \__wstf_set_ratio:n { \c_one_fp - \l__wstf_ratio_fp } } + \prop_gput:Nno \g__wstf_rerun_prop {#1} { \l__wstf_page_tl } } \bool_new:N \l__wstf_swap_bool \bool_new:N \l__wstf_inner_bool \bool_new:N \l__wstf_outer_bool -\cs_new_protected:Npn \__wstf_gadd_ht:Nn #1#2 - { \box_gset_ht:Nn #1 { \box_ht:N #1 + \dim_eval:n {#2} } } -\cs_new_protected:Npn \__wstf_gsub_ht:Nn #1#2 - { \box_gset_ht:Nn #1 { \box_ht:N #1 - \dim_eval:n {#2} } } -\cs_new_protected_nopar:Npn \__wstf_clear: - { - \__wstf_clear_para_hook: - \__wstf_clear_kludge: - \__wstf_clear_variable: - } -\cs_new_protected_nopar:Npn \__wstf_clear_variable: - { - \int_gset:Nn \g__wstf_top_int { -1 } - \int_gzero:N \g__wstf_window_int - \dim_gzero:N \g__wstf_total_ht_dim - \dim_gzero:N \g__wstf_column_left_dim - \tl_gclear:N \g__wstf_main_setting_tl - \bool_gset_false:N \g__wstf_next_bool - \bool_gset_false:N \g__wstf_hoffset_bool - \bool_gset_false:N \g__wstf_next_hang_bool - \bool_gset_false:N \g__wstf_first_save_bool - \bool_gset_false:N \g__wstf_right_move_bool - \bool_gset_false:N \g__wstf_column_right_bool - } -\cs_new_protected_nopar:Npn \__wstf_clear_kludge: - { - \bool_if:NTF \g__wstf_next_bool - { - \box_gclear:N \g__wstf_stuff_box - \skip_vertical:n - { \tex_baselineskip:D * \g__wstf_window_int } - } - { - \box_if_empty:NF \g__wstf_stuff_box - { \__wstf_clear_stuff_box: } - } - } -\cs_new_protected_nopar:Npn \__wstf_clear_stuff_box: - { - \__wstf_ignore_depth: - \skip_set:Nn \l__wstf_last_skip - { \box_dp:N \strutbox } - \skip_vertical:N \l__wstf_last_skip - \box_use_drop:N \g__wstf_stuff_box - \skip_vertical:N \l__wstf_last_skip - \__wstf_ignore_depth: - } \__wstf_gadd_hook:nn { para/before } { \__wstf_para_before: } +\__wstf_gadd_hook:nn { para/after } { \__wstf_para_after: } \__wstf_gadd_hook:nn { para/begin } { \__wstf_para_begin: } \__wstf_gadd_hook:nn { para/end } { \__wstf_para_end: } \cs_new_protected_nopar:Npn \__wstf_next_para: @@ -352,12 +555,14 @@ \cs_new_protected_nopar:Npn \__wstf_clear_para_hook: { \cs_gset_eq:NN \__wstf_para_before: \__wstf_empty: + \cs_gset_eq:NN \__wstf_para_after: \__wstf_empty: \cs_gset_eq:NN \__wstf_para_begin: \__wstf_empty: \cs_gset_eq:NN \__wstf_para_end: \__wstf_empty: } \cs_new_protected_nopar:Npn \__wstf_empty: { } \cs_new_eq:NN \__wstf_para_before: \__wstf_empty: +\cs_new_eq:NN \__wstf_para_after: \__wstf_empty: \cs_new_eq:NN \__wstf_para_begin: \__wstf_empty: \cs_new_eq:NN \__wstf_para_end: \__wstf_empty: \NewDocumentEnvironment { wrapstuff@par } { } @@ -396,14 +601,15 @@ \int_set:Nn \l__wstf_window_int { \l__wstf_window_int * 2 } \int_set:Nn \l__wstf_window_line_int { - \bool_if:NTF \g__wstf_column_right_bool - { \l__wstf_window_int / 2 + \g__wstf_column_window_int } + \bool_if:NTF \g__wstf_column_bool + { \l__wstf_window_int / 2 + \g__wstf_column_int } { \l__wstf_window_int } } } \cs_gset_eq:NN \__wstf_para_before: \__wstf_empty: \cs_gset_eq:NN \__wstf_para_begin: \__wstf_empty: \__wstf_save_parshape: + \__wstf_parbox_restore: \vbox_set:Nw \l__wstf_body_box \__wstf_set_prevdepth:N \g__wstf_prevdepth_dim \__wstf_save_tex_skip: @@ -423,7 +629,8 @@ \int_gset_eq:NN \g__wstf_line_int \tex_prevgraf:D \vbox_set_end: \__wstf_adjust_tex_skip: - \cs_gset_eq:NN \__wstf_para_end: \__wstf_empty: + \cs_gset_eq:NN \__wstf_para_end: \__wstf_empty: + \cs_gset_eq:NN \__wstf_para_after: \__wstf_empty: \int_compare:nNnTF \g__wstf_line_int > \l__wstf_top_int { \__wstf_build_par: } { \__wstf_put_par: } @@ -431,10 +638,8 @@ \box_new:N \l__wstf_body_box \box_new:N \l__wstf_window_box \int_new:N \l__wstf_window_int -\int_new:N \g__wstf_window_int \int_new:N \g__wstf_line_int \int_new:N \l__wstf_window_line_int -\int_new:N \g__wstf_column_window_int \dim_new:N \l__wstf_l_dim \dim_new:N \l__wstf_r_dim \dim_new:N \l__wstf_min_dim @@ -444,17 +649,12 @@ \dim_new:N \l__wstf_voffset_dim \dim_new:N \l__wstf_leftsep_dim \dim_new:N \l__wstf_rightsep_dim -\dim_new:N \g__wstf_window_ht_dim \dim_new:N \l__wstf_main_width_dim -\int_new:N \g__wstf_top_int -\int_gdecr:N \g__wstf_top_int \bool_new:N \l__wstf_hang_bool \cs_new_protected_nopar:Npn \__wstf_set_hang_left: { \bool_set_true:N \l__wstf_hang_bool - \bool_if:NF \g__wstf_hoffset_bool - { \__wstf_set_hoffset:NN \l__wstf_rightsep_dim \use:nn } - \dim_sub:Nn \l__wstf_window_dim { \l__wstf_rightsep_dim } + \__wstf_set_hoffset:N \l__wstf_rightsep_dim \dim_zero:N \l__wstf_l_dim \dim_set_eq:NN \l__wstf_r_dim \l__wstf_window_dim \cs_set_eq:NN \__wstf_build_box: \__wstf_build_hang: @@ -462,9 +662,7 @@ \cs_new_protected_nopar:Npn \__wstf_set_hang_right: { \bool_set_true:N \l__wstf_hang_bool - \bool_if:NF \g__wstf_hoffset_bool - { \__wstf_set_hoffset:NN \l__wstf_leftsep_dim \use_ii_i:nn } - \dim_sub:Nn \l__wstf_window_dim { \l__wstf_leftsep_dim } + \__wstf_set_hoffset:N \l__wstf_leftsep_dim \dim_zero:N \l__wstf_r_dim \dim_set_eq:NN \l__wstf_l_dim \l__wstf_window_dim \cs_set_eq:NN \__wstf_build_box: \__wstf_build_hang: @@ -482,28 +680,16 @@ { \cs_set_eq:NN \__wstf_build_box: \__wstf_build_column: } { \cs_set_eq:NN \__wstf_build_box: \__wstf_build_block: } } -\cs_new_protected:Npn \__wstf_set_hoffset:NN #1#2 +\cs_new_protected:Npn \__wstf_set_hoffset:N #1 { - \bool_gset_true:N \g__wstf_hoffset_bool - \dim_set:Nn \l__wstf_hoffset_width_dim - { #1 + \g__wstf_stuff_wd_dim } + \dim_sub:Nn \l__wstf_window_dim {#1} \group_begin: - \cs_set_eq:NN \width \l__wstf_hoffset_width_dim - \dim_gset:Nn \g__wstf_hoffset_dim { \l__wstf_hoffset_tl } - \group_end: - \int_compare:nNnF \g__wstf_hoffset_dim = \c_zero_dim - { - \hbox_gset:Nn \g__wstf_stuff_box - { - #2 { \tex_kern:D - \g__wstf_hoffset_dim } - { \box_use_drop:N \g__wstf_stuff_box } - } - \dim_add:Nn \l__wstf_window_dim { \g__wstf_hoffset_dim } - } + \dim_set:Nn \l__wstf_width_dim { #1 + \g__wstf_stuff_wd_dim } + \cs_set_eq:NN \width \l__wstf_width_dim + \exp_args:NNNx \group_end: + \dim_add:Nn \l__wstf_window_dim + { \dim_eval:n { \l__wstf_hoffset_tl } } } -\dim_new:N \g__wstf_hoffset_dim -\dim_new:N \l__wstf_hoffset_width_dim -\bool_new:N \g__wstf_hoffset_bool \cs_new_protected_nopar:Npn \__wstf_set_lines: { \bool_if:NTF \g__wstf_next_bool @@ -526,9 +712,9 @@ } \cs_new_protected_nopar:Npn \__wstf_window_init: { - \int_gset_eq:NN \g__wstf_column_window_int \l__wstf_window_int + \int_gset_eq:NN \g__wstf_column_int \l__wstf_window_int \dim_gset:Nn \g__wstf_window_ht_dim - { \tex_baselineskip:D * \g__wstf_column_window_int } + { \tex_baselineskip:D * \g__wstf_column_int } \tl_if_empty:NF \l__wstf_lines_tl { \dim_gset:Nn \g__wstf_remaining_dim @@ -579,7 +765,8 @@ \int_compare:nNnTF \g__wstf_parshape_int = \c_one_int { \tex_parshape:D \g__wstf_parshape_int - \g__wstf_parshape_indent_dim \g__wstf_parshape_length_dim + \g__wstf_parshape_indent_dim + \g__wstf_parshape_length_dim } { \__wstf_restore_hangfrom: } } @@ -618,8 +805,6 @@ \int_new:N \g__wstf_parshape_int \int_new:N \g__wstf_hangafter_int \dim_new:N \g__wstf_hangindent_dim -\dim_new:N \g__wstf_parshape_indent_dim -\dim_new:N \g__wstf_parshape_length_dim \cs_new_protected_nopar:Npn \__wstf_group_kludge: { \scan_stop: @@ -644,16 +829,15 @@ { \fp_to_dim:n { #1 \dim_to_fp:n {#2} } } \cs_new:Npn \__wstf_unit:n #1 { - \fp_eval:n + \int_eval:n { - ceil - ( - \dim_to_decimal_in_unit:nn - {#1} - { \tex_baselineskip:D } - ) + \exp_last_unbraced:Ne \__wstf_unit_aux:w + { \dim_to_decimal_in_unit:nn {#1} { \tex_baselineskip:D } } + \s_stop } } +\cs_new:Npn \__wstf_unit_aux:w #1 . #2 \s_stop + { #1 + 1 } \cs_new_protected_nopar:Npn \__wstf_save_tex_skip: { \skip_gset_eq:NN \g__wstf_left_skip \tex_leftskip:D @@ -683,6 +867,7 @@ \skip_set_eq:NN \tex_leftskip:D \g__wstf_left_skip \skip_set_eq:NN \tex_rightskip:D \g__wstf_right_skip \skip_set_eq:NN \tex_parfillskip:D \g__wstf_parfill_skip + \skip_set_eq:NN \tex_baselineskip:D \g__wstf_baseline_skip } \skip_new:N \g__wstf_left_skip \skip_new:N \g__wstf_right_skip @@ -695,16 +880,27 @@ \tex_everydisplay:D \exp_after:wN { \tex_the:D \tex_everydisplay:D - \__wstf_test_leqno: - \dim_compare:nNnF \tex_displaywidth:D < \c_max_dim - { - \bool_gset_true:N \g__wstf_display_bool - \dim_set_eq:NN \tex_displaywidth:D \l__wstf_display_dim - } + \__wstf_display_hook: + } + } +\cs_new_protected_nopar:Npn \__wstf_display_hook: + { + \__wstf_test_leqno: + \dim_compare:nNnF \tex_displaywidth:D < \c_max_dim + { + \bool_gset_true:N \g__wstf_display_bool + \dim_set_eq:NN \tex_displaywidth:D \l__wstf_display_dim } } \cs_new_eq:NN \__wstf_test_leqno: \__wstf_empty: -\bool_new:N \g__wstf_display_bool +\cs_new_protected_nopar:Npn \__wstf_clear_display_hook: + { \cs_gset_eq:NN \__wstf_display_hook: \__wstf_empty: } +\cs_new_protected_nopar:Npn \__wstf_split_parameter: + { + \skip_zero:N \tex_splittopskip:D + \dim_set_eq:NN \tex_vfuzz:D \c_max_dim + \int_set_eq:NN \tex_vbadness:D \c_max_int + } \cs_new_protected_nopar:Npn \__wstf_build_par: { \bool_if:NTF \g__wstf_hangfrom_bool @@ -739,7 +935,7 @@ } \cs_new_protected_nopar:Npn \__wstf_put_body_box: { - \para_raw_end: + \__wstf_para_raw_end: \dim_compare:nNnTF { \box_wd:N \l__wstf_body_box } < \c_max_dim { \__wstf_put_body_aux:N \l__wstf_body_box } { @@ -747,14 +943,34 @@ \__wstf_put_body_aux:N \l__wstf_body_box \box_set_eq_drop:NN \l__wstf_body_box \l__wstf_bottom_box } - \para_raw_end: + \__wstf_para_raw_end: } \cs_new_protected_nopar:Npn \__wstf_put_body_aux:N #1 { \dim_gset:Nn \g__wstf_prevdepth_dim { \box_dp:N #1 } + \dim_compare:nNnT \g__wstf_prevdepth_dim = \c_zero_dim + { \__wstf_extract_depth:N #1 } \vbox_unpack_drop:N #1 \__wstf_set_prevdepth:N \g__wstf_prevdepth_dim } +\cs_new_protected_nopar:Npn \__wstf_extract_depth:N #1 + { + \vbox_set:Nn \l__wstf_last_box + { + \vbox_unpack:N #1 + \__wstf_if_last_hlist:F + { + \tex_unskip:D \tex_unpenalty:D + \tex_unskip:D \tex_unpenalty:D + } + \__wstf_if_last_hlist:T + { + \box_set_to_last:N \l__wstf_last_box + \dim_gset:Nn \g__wstf_prevdepth_dim + { \box_dp:N \l__wstf_last_box } + } + } + } \cs_new_protected_nopar:Npn \__wstf_put_next_par: { \int_gzero:N \g__wstf_top_int @@ -775,20 +991,24 @@ } \cs_new_protected_nopar:Npn \__wstf_build_display_amsmath: { - \vbox_gset:Nn \g__wstf_equation_box - { - \skip_vertical:n { - \g__wstf_display_pre_skip } - \vbox_unpack_drop:N \g__wstf_display_box - \skip_gset_eq:NN \g__wstf_pos_skip \tex_lastskip:D - \tex_unskip:D - \int_gset_eq:NN \g__wstf_pos_int \tex_lastpenalty:D - \tex_unpenalty:D - \skip_gadd:Nn \g__wstf_pos_skip { \tex_lastskip:D } - \tex_unskip:D - \tex_unpenalty:D - } - \box_gset_wd:Nn \g__wstf_equation_box - { \l__wstf_display_dim } + \group_begin: + \vbox_gset:Nn \g__wstf_equation_box + { + \__wstf_break: + \vbox_unpack_drop:N \g__wstf_display_box + \skip_gset_eq:NN \g__wstf_pos_skip \tex_lastskip:D + \tex_unskip:D + \int_gset_eq:NN \g__wstf_pos_int \tex_lastpenalty:D + \tex_unpenalty:D + \skip_gadd:Nn \g__wstf_pos_skip { \tex_lastskip:D } + \tex_unskip:D + \tex_unpenalty:D + } + \__wstf_split_parameter: + \vbox_set_split_to_ht:NNn \l__wstf_last_box \g__wstf_equation_box + { \c_zero_dim } + \group_end: + \box_gset_wd:Nn \g__wstf_equation_box { \l__wstf_display_dim } \vbox_gset:Nn \g__wstf_display_box { \tex_penalty:D \g__wstf_display_pre_int @@ -866,35 +1086,57 @@ \cs_new_protected_nopar:Npn \__wstf_build_display_auxiii: { \bool_set_true:N \l__wstf_attach_equation_bool - \bool_if:NTF \g__wstf_amsmath_bool - { \box_set_eq_drop:NN \l__wstf_display_box \g__wstf_display_box } + \box_gclear:N \g__wstf_display_box + \bool_if:NF \g__wstf_amsmath_bool + { \__wstf_adjust_equation: } + \__wstf_build_body_box: + } +\bool_new:N \l__wstf_display_bool +\bool_new:N \l__wstf_attach_equation_bool +\cs_new_protected:Npn \__wstf_attach_left:N #1 + { + \__wstf_attach_equation:Nn #1 + { \g__wstf_parshape_indent_dim } + } +\cs_new_protected:Npn \__wstf_attach_right:N #1 + { + \__wstf_attach_equation:Nn #1 { - \box_gclear:N \g__wstf_display_box - \__wstf_adjust_equation: + \l__wstf_line_dim + - \l__wstf_display_dim + + \g__wstf_parshape_indent_dim } - \__wstf_build_body_box: } -\cs_new_protected_nopar:Npn \__wstf_attach_equation:N +\cs_new_protected:Npn \__wstf_attach_equation:Nn #1#2 { - \bool_if:NTF \g__wstf_amsmath_bool - { \__wstf_attach_equation_amsmath:N } - { \__wstf_attach_equation_normal:N } + \vbox_set:Nn \l__wstf_last_box + { + \vbox_unpack:N #1 + \box_set_to_last:N \l__wstf_last_box + \bool_if:NTF \g__wstf_amsmath_bool + { \__wstf_attach_equation_amsmath:Nn } + { \__wstf_attach_equation_normal:Nn } + \l__wstf_last_box {#2} + } } -\cs_new_protected:Npn \__wstf_attach_equation_amsmath:N #1 +\cs_new_protected:Npn \__wstf_attach_equation_amsmath:Nn #1#2 { - \vbox_set:Nn #1 + \vbox_gset:Nn \g__wstf_equation_box { - \box_use:N #1 - \__wstf_ignore_depth: - \vbox_unpack_drop:N \l__wstf_display_box + \__wstf_nobreak: \skip_vertical:n - { \g__wstf_display_pre_dim - \box_dp:N #1 } - \box_use_drop:N \g__wstf_equation_box + { + \g__wstf_display_pre_skip + + \g__wstf_display_pre_dim + - \box_dp:N #1 + } + \box_move_right:nn {#2} + { \box_use_drop:N \g__wstf_equation_box } } } -\cs_new_protected:Npn \__wstf_attach_equation_normal:N #1 +\cs_new_protected:Npn \__wstf_attach_equation_normal:Nn #1#2 { - \vbox_set:Nn #1 + \vbox_set:Nn \l__wstf_last_box { \__wstf_tex_parameter: \dim_set_eq:NN \tex_hsize:D \l__wstf_display_dim @@ -906,6 +1148,25 @@ \tex_unskip:D \int_gset_eq:NN \g__wstf_pos_int \tex_lastpenalty:D \tex_unpenalty:D + \box_set_to_last:N \l__wstf_last_box + \skip_set_eq:NN \l__wstf_last_skip \tex_lastskip:D + \tex_unskip:D + \skip_add:Nn \l__wstf_last_skip { \tex_lastskip:D } + \vbox_gset:Nn \g__wstf_equation_box + { + \__wstf_nobreak: + \skip_vertical:N \l__wstf_last_skip + \box_move_right:nn {#2} + { + \hbox_to_wd:nn + { \l__wstf_display_dim } + { + \tex_hss:D + \box_use_drop:N \l__wstf_last_box + \tex_hss:D + } + } + } } } \cs_new_protected_nopar:Npn \__wstf_insert_equation: @@ -941,15 +1202,15 @@ { \bool_gset_false:N \g__wstf_eqnum_bool \hbox_unpack:N \g__wstf_equation_box - \__wstf_if_last_hlist:F { \use_none_delimit_by_q_stop:w } + \__wstf_if_last_hlist:F { \use_none_delimit_by_s_stop:w } \box_gset_to_last:N \g__wstf_eqnum_box - \__wstf_if_last_kern:F { \use_none_delimit_by_q_stop:w } + \__wstf_if_last_kern:F { \use_none_delimit_by_s_stop:w } \tex_unkern:D - \__wstf_if_last_hlist:F { \use_none_delimit_by_q_stop:w } + \__wstf_if_last_hlist:F { \use_none_delimit_by_s_stop:w } \box_gset_to_last:N \g__wstf_eqbody_box - \__wstf_if_last_none:F { \use_none_delimit_by_q_stop:w } + \__wstf_if_last_none:F { \use_none_delimit_by_s_stop:w } \bool_gset_true:N \g__wstf_eqnum_bool - \use_none_delimit_by_q_stop:w \q_stop + \use_none_delimit_by_s_stop:w \s_stop } } \cs_new_protected_nopar:Npn \__wstf_adjust_equation_width: @@ -979,22 +1240,21 @@ \box_new:N \g__wstf_eqbody_box \box_new:N \g__wstf_eqnum_box \box_new:N \g__wstf_equation_box -\box_new:N \l__wstf_display_box \int_new:N \g__wstf_pos_int \skip_new:N \g__wstf_pos_skip \bool_new:N \g__wstf_eqnum_bool -\bool_new:N \g__wstf_leqno_bool -\bool_new:N \l__wstf_display_bool -\bool_new:N \l__wstf_attach_equation_bool -\cs_new_protected_nopar:Npn \__wstf_add_pos_skip: +\cs_new_protected_nopar:Npn \__wstf_add_pos_kludge: { - \bool_lazy_or:nnTF - { \g__wstf_right_move_bool } - { \int_compare_p:nNn \g__wstf_window_int > \c_zero_int } + \dim_gset:Nn \g__wstf_prevdepth_dim + { \box_dp:N \l__wstf_window_box } + \bool_gset_false:N \g__wstf_equation_dp_bool + \bool_if:NTF \g__wstf_next_bool { \tex_vadjust:D { - \tex_penalty:D \c__wstf_nobreak_int + \box_if_empty:NF \g__wstf_equation_box + { \__wstf_output_equation_box: } + \__wstf_nobreak: \bool_if:NT \l__wstf_display_bool { \skip_vertical:N \g__wstf_pos_skip } } @@ -1004,6 +1264,8 @@ { \tex_vadjust:D { + \box_if_empty:NF \g__wstf_equation_box + { \__wstf_output_equation_box: } \tex_penalty:D \g__wstf_pos_int \skip_vertical:N \g__wstf_pos_skip } @@ -1012,6 +1274,23 @@ \int_gzero:N \g__wstf_pos_int \skip_gzero:N \g__wstf_pos_skip } +\cs_new_protected_nopar:Npn \__wstf_output_equation_box: + { + \cs_gset_eq:NN + \__wstf_para_after: + \__wstf_set_equation_depth: + \bool_gset_true:N \g__wstf_equation_dp_bool + \dim_gset:Nn \g__wstf_prevdepth_dim + { \box_dp:N \g__wstf_equation_box } + \vbox_unpack_drop:N \g__wstf_equation_box + } +\cs_new_protected_nopar:Npn \__wstf_set_equation_depth: + { + \cs_gset_eq:NN \__wstf_para_after: \__wstf_empty: + \bool_gset_false:N \g__wstf_equation_dp_bool + \__wstf_set_prevdepth:N \g__wstf_prevdepth_dim + } +\bool_new:N \g__wstf_equation_dp_bool \cs_new_protected_nopar:Npn \__wstf_build_body_box: { \box_set_eq:NN \l__wstf_save_body_box \l__wstf_bottom_box @@ -1029,9 +1308,6 @@ { \vbox_set:Nn \l__wstf_body_box { - \__wstf_tex_parameter: - \__wstf_make_parshape: - \__wstf_column_penalties: \dim_zero:N \tex_emergencystretch:D \dim_set_eq:NN \tex_hfuzz:D \c_max_dim \dim_set_eq:NN \tex_vfuzz:D \c_max_dim @@ -1040,6 +1316,9 @@ \int_set:Nn \tex_tolerance:D { 1000 } \para_raw_noindent: \hbox_unpack_drop:N \l__wstf_bottom_box + \__wstf_tex_parameter: + \__wstf_make_parshape: + \__wstf_interline_penalties: \para_raw_end: \int_gset_eq:NN \g__wstf_line_int \tex_prevgraf:D } @@ -1062,8 +1341,8 @@ { \c_zero_dim \l__wstf_l_dim } \prg_replicate:nn { - \bool_if:NTF \g__wstf_column_right_bool - { \g__wstf_column_window_int } + \bool_if:NTF \g__wstf_column_bool + { \g__wstf_column_int } { \l__wstf_window_int / 2 } } { \c_zero_dim \l__wstf_r_dim } @@ -1079,15 +1358,16 @@ } \c_zero_dim \c_max_dim } -\cs_new_protected_nopar:Npn \__wstf_column_penalties: +\cs_new_protected_nopar:Npn \__wstf_interline_penalties: { \bool_if:NF \l__wstf_hang_bool { - \bool_if:NT \l__wstf_column_bool - { \__wstf_column_penalties_aux: } + \bool_if:NTF \l__wstf_column_bool + { \__wstf_column_penalties: } + { \__wstf_block_penalties: } } } -\cs_new_protected_nopar:Npn \__wstf_column_penalties_aux: +\cs_new_protected_nopar:Npn \__wstf_column_penalties: { \tex_interlinepenalties:D \int_eval:n { \l__wstf_window_int / 2 + \c_one_int } ~ @@ -1097,90 +1377,70 @@ \c__wstf_break_int \c_zero_int } +\cs_new_protected_nopar:Npn \__wstf_block_penalties: + { + \tex_interlinepenalties:D \l__wstf_window_int + \prg_replicate:nn + { \l__wstf_window_int - \c_one_int } + { \c__wstf_break_int } + \c_zero_int + } +\cs_new_protected_nopar:Npn \__wstf_break: + { \tex_penalty:D \c__wstf_break_int } +\cs_new_protected_nopar:Npn \__wstf_nobreak: + { \tex_penalty:D \c__wstf_nobreak_int } +\int_const:Nn \c__wstf_break_int { -10000 } +\int_const:Nn \c__wstf_nobreak_int { 10000 } \cs_new_protected_nopar:Npn \__wstf_build_block: { - \__wstf_build_block_auxi: \vbox_set:Nn \l__wstf_window_box { - \__wstf_tex_parameter: - \dim_set_eq:NN \tex_hsize:D \l__wstf_line_dim - \para_raw_noindent: - \hbox_unpack_drop:N \g__wstf_line_box - \para_raw_end: - } - \bool_if:NT \l__wstf_attach_equation_bool - { - \box_set_ht:Nn \l__wstf_window_box - { \box_ht_plus_dp:N \l__wstf_window_box - \g__wstf_dp_dim } - \box_set_dp:Nn \l__wstf_window_box { \g__wstf_dp_dim } + \__wstf_split_parameter: + \skip_set_eq:NN \tex_baselineskip:D \g__wstf_baseline_skip + \__wstf_build_line: } } -\cs_new_protected_nopar:Npn \__wstf_build_block_auxi: +\cs_new_protected_nopar:Npn \__wstf_build_line: { - \vbox_set:Nn \l__wstf_body_box + \vbox_set_split_to_ht:NNn \l__wstf_l_box \l__wstf_body_box + { \g__wstf_baseline_skip } + \vbox_set_split_to_ht:NNn \l__wstf_r_box \l__wstf_body_box + { \g__wstf_baseline_skip } + \__wstf_build_line_repack: + \box_if_empty:NTF \l__wstf_body_box + { \__wstf_put_last_line: } { - \vbox_unpack_drop:N \l__wstf_body_box - \bool_lazy_and:nnTF - { \box_if_empty_p:N \l__wstf_bottom_box } - { \int_if_odd_p:n { \g__wstf_line_int } } - { \box_set_eq:NN \l__wstf_r_box \l__wstf_empty_box } - { - \box_set_to_last:N \l__wstf_r_box - \tex_unskip:D \tex_unpenalty:D - } - \box_set_to_last:N \l__wstf_l_box - \tex_unskip:D \tex_unpenalty:D - \hbox_gset:Nn \g__wstf_line_box - { - \bool_if:NT \l__wstf_attach_equation_bool - { \__wstf_build_block_attach: } - \box_use:N \l__wstf_l_box - \tex_hfill:D - \box_use:N \l__wstf_r_box - } - \__wstf_build_block_auxii: + \__wstf_put_line_box: + \__wstf_build_line: } } -\cs_new_protected_nopar:Npn \__wstf_build_block_auxii: +\cs_new_protected_nopar:Npn \__wstf_build_line_repack: { - \int_case:nnTF - { \tex_lastnodetype:D } + \vbox_set:Nn \l__wstf_l_box + { \vbox_unpack_drop:N \l__wstf_l_box } + \box_if_empty:NF \l__wstf_r_box { - { \c__wstf_none_node } { } - { \c__wstf_whatsit_node } { } + \vbox_set:Nn \l__wstf_r_box + { \vbox_unpack_drop:N \l__wstf_r_box } } - { \__wstf_build_block_finalise: } - { \__wstf_build_block_auxiii: } + \__wstf_save_first_ht: } -\cs_new_protected_nopar:Npn \__wstf_build_block_auxiii: +\cs_new_protected_nopar:Npn \__wstf_put_last_line: { - \box_set_to_last:N \l__wstf_r_box - \tex_unskip:D \tex_unpenalty:D - \box_set_to_last:N \l__wstf_l_box - \tex_unskip:D \tex_unpenalty:D - \hbox_gset:Nn \g__wstf_line_box - { - \box_use:N \l__wstf_l_box - \tex_hfill:D - \box_use:N \l__wstf_r_box - \tex_penalty:D \c__wstf_break_int - \hbox_unpack_drop:N \g__wstf_line_box - } - \__wstf_build_block_auxii: + \bool_if:NT \l__wstf_attach_equation_bool + { \__wstf_attach_left:N \l__wstf_l_box } + \__wstf_put_line_box: } -\cs_new_protected_nopar:Npn \__wstf_build_block_attach: +\cs_new_protected_nopar:Npn \__wstf_put_line_box: { - \box_set_eq:NN \l__wstf_last_box \l__wstf_l_box - \__wstf_attach_equation:N \l__wstf_last_box - \dim_gset:Nn \g__wstf_dp_dim { \box_dp:N \l__wstf_last_box } - \hbox_set:Nn \l__wstf_l_box + \hbox_to_wd:nn { \l__wstf_line_dim } { - \box_move_down:nn - { \box_ht:N \l__wstf_last_box - \box_ht:N \l__wstf_l_box } - { \box_use_drop:N \l__wstf_last_box } + \box_use_drop:N \l__wstf_l_box + \tex_hfil:D + \box_use_drop:N \l__wstf_r_box } } -\cs_new_protected_nopar:Npn \__wstf_build_block_finalise: +\cs_new_protected_nopar:Npn \__wstf_save_first_ht: { \dim_gset:Nn \g__wstf_ht_dim { @@ -1188,38 +1448,23 @@ { \box_ht:N \l__wstf_l_box } { \box_ht:N \l__wstf_r_box } } + \cs_set_eq:NN \__wstf_save_first_ht: \__wstf_empty: } -\dim_new:N \g__wstf_dp_dim \dim_new:N \g__wstf_ht_dim \box_new:N \l__wstf_l_box \box_new:N \l__wstf_r_box -\box_new:N \g__wstf_line_box -\box_new:N \l__wstf_empty_box -\hbox_set:Nn \l__wstf_empty_box { } -\int_const:Nn \c__wstf_break_int { -10000 } -\int_const:Nn \c__wstf_nobreak_int { 10000 } \cs_new_protected_nopar:Npn \__wstf_build_column_fuzzy: { \hbox_set_to_wd:Nnn \l__wstf_window_box { \l__wstf_line_dim } { - \skip_zero:N \tex_splittopskip:D - \dim_set_eq:NN \tex_vfuzz:D \c_max_dim - \int_set_eq:NN \tex_vbadness:D \c_max_int + \__wstf_split_parameter: \__wstf_build_column_aux: \box_if_empty:NT \l__wstf_bottom_box { \__wstf_build_column_fuzzy_aux: } - \dim_gset:Nn \g__wstf_ht_dim { \box_ht:N \l__wstf_l_box } - \vbox_set:Nn \l__wstf_l_box - { - \vbox_unpack_drop:N \l__wstf_l_box - \bool_if:NT \l__wstf_attach_equation_bool - { - \box_set_to_last:N \l__wstf_last_box - \__wstf_attach_equation:N \l__wstf_last_box - \vbox_unpack_drop:N \l__wstf_last_box - } - } + \__wstf_repack_left_box: + \bool_if:NT \l__wstf_attach_equation_bool + { \__wstf_attach_left:N \l__wstf_l_box } \box_use:N \l__wstf_l_box \tex_hfil:D \box_move_up:nn @@ -1230,7 +1475,7 @@ \cs_new_protected_nopar:Npn \__wstf_build_column_aux: { \vbox_set_split_to_ht:NNn \l__wstf_l_box \l__wstf_body_box - { \c_zero_dim } + { \box_ht:N \l__wstf_body_box / 2 } \vbox_set_top:Nn \l__wstf_l_box { \vbox_unpack_drop:N \l__wstf_l_box } \box_set_eq_drop:NN \l__wstf_r_box \l__wstf_body_box @@ -1256,23 +1501,25 @@ \cs_new_protected_nopar:Npn \__wstf_rebuild_window: { \int_compare:nNnT \l__wstf_window_int > { 2 } - { - \int_sub:Nn \l__wstf_window_int { 2 } - \box_set_eq_drop:NN \l__wstf_last_l_box \l__wstf_l_box - \box_set_eq_drop:NN \l__wstf_last_r_box \l__wstf_r_box - \box_set_eq:NN \l__wstf_bottom_box \l__wstf_save_body_box - \int_set_eq:NN \l__wstf_window_line_int \l__wstf_window_int - \__wstf_build_window: - \__wstf_build_column_aux: - \__wstf_build_column_fuzzy_aux: - } + { \__wstf_rebuild_window_aux: } } +\cs_new_protected_nopar:Npn \__wstf_rebuild_window_aux: + { + \int_sub:Nn \l__wstf_window_int { 2 } + \box_set_eq_drop:NN \l__wstf_last_l_box \l__wstf_l_box + \box_set_eq_drop:NN \l__wstf_last_r_box \l__wstf_r_box + \box_set_eq:NN \l__wstf_bottom_box \l__wstf_save_body_box + \int_set_eq:NN \l__wstf_window_line_int \l__wstf_window_int + \__wstf_build_window: + \__wstf_build_column_aux: + \__wstf_build_column_fuzzy_aux: + } +\box_new:N \l__wstf_last_l_box +\box_new:N \l__wstf_last_r_box \cs_new_protected_nopar:Npn \__wstf_build_column_strict: { \group_begin: - \skip_zero:N \tex_splittopskip:D - \dim_set_eq:NN \tex_vfuzz:D \c_max_dim - \int_set_eq:NN \tex_vbadness:D \c_max_int + \__wstf_split_parameter: \__wstf_build_column_aux: \box_if_empty:NTF \l__wstf_r_box { \__wstf_build_column_strict_auxi: } @@ -1280,7 +1527,7 @@ \box_if_empty:NTF \l__wstf_bottom_box { \__wstf_build_column_strict_auxii: } { - \bool_if:NTF \g__wstf_column_right_bool + \bool_if:NTF \g__wstf_column_bool { \__wstf_build_column_strict_auxiii: } { \__wstf_build_column_strict_auxiv: } } @@ -1292,9 +1539,9 @@ { \__wstf_repack_left_box: \bool_if:NT \l__wstf_attach_equation_bool - { \__wstf_column_attach:N \l__wstf_l_box } + { \__wstf_attach_left:N \l__wstf_l_box } \box_gset_eq_drop:NN \g__wstf_window_box \l__wstf_l_box - \bool_gset_true:N \g__wstf_column_right_bool + \bool_gset_true:N \g__wstf_column_bool \bool_if:NF \g__wstf_first_save_bool { \bool_gset_true:N \g__wstf_first_save_bool @@ -1319,12 +1566,12 @@ \dim_gsub:Nn \g__wstf_first_sep_dim { \box_dp:N \l__wstf_window_box } \bool_gset_false:N \g__wstf_entire_bool - \dim_gzero:N \g__wstf_column_right_ht_dim + \dim_gzero:N \g__wstf_column_ht_dim \dim_gset_eq:NN \g__wstf_prevdepth_dim \g__wstf_first_dp_dim \__wstf_column_right_move_set:nn { \g__wstf_stuff_ht_dim } { \g__wstf_window_ht_dim } - \int_gset_eq:NN \g__wstf_window_int \g__wstf_column_window_int + \int_gset_eq:NN \g__wstf_window_int \g__wstf_column_int } \cs_new_protected:Npn \__wstf_column_right_move_set:nn #1#2 { @@ -1343,7 +1590,7 @@ \__wstf_make_next_stuff:nn { \l__wstf_line_dim - \l__wstf_r_dim - \l__wstf_rightsep_dim } {#1} - \dim_gset:Nn \g__wstf_column_left_dim {#2} + \dim_gset:Nn \g__wstf_column_room_dim {#2} \int_gzero:N \g__wstf_top_int } \cs_new_protected_nopar:Npn \__wstf_build_column_strict_auxii: @@ -1351,11 +1598,12 @@ \bool_gset_false:N \g__wstf_entire_bool \__wstf_repack_left_box: \bool_if:NT \l__wstf_attach_equation_bool - { \__wstf_column_attach:N \l__wstf_r_box } + { \__wstf_attach_right:N \l__wstf_r_box } \dim_gset:Nn \g__wstf_hang_ht_dim { \g__wstf_stuff_ht_dim - \tex_baselineskip:D * \__wstf_unit:n { \box_ht_plus_dp:N \l__wstf_r_box } + - \box_ht_plus_dp:N \g__wstf_equation_box - \g__wstf_pos_skip } \dim_compare:nNnTF \g__wstf_hang_ht_dim > \c_zero_dim @@ -1368,19 +1616,21 @@ { \int_compare:nNnTF \g__wstf_window_int > \c_zero_int { - \dim_gset:Nn \g__wstf_column_left_dim + \dim_gset:Nn \g__wstf_column_room_dim { \g__wstf_window_ht_dim - \g__wstf_first_sep_dim - - \box_ht:N \l__wstf_r_box + - \box_ht_plus_dp:N \l__wstf_r_box + - \box_ht_plus_dp:N \g__wstf_equation_box } \__wstf_next_hang_para: } { - \dim_gset:Nn \g__wstf_column_left_dim + \dim_gset:Nn \g__wstf_column_room_dim { \box_ht:N \l__wstf_l_box - - \box_ht:N \l__wstf_r_box + - \box_ht_plus_dp:N \l__wstf_r_box + - \box_ht_plus_dp:N \g__wstf_equation_box } \dim_gset:Nn \g__wstf_first_sep_dim { \tex_baselineskip:D - \g__wstf_ht_dim } @@ -1393,11 +1643,15 @@ \box_use:N \l__wstf_l_box \tex_hfil:D \box_move_up:nn - { \g__wstf_column_left_dim } + { \g__wstf_column_room_dim } { \box_use:N \l__wstf_r_box } } - \dim_gset:Nn \g__wstf_column_right_ht_dim - { \box_ht:N \l__wstf_r_box + \g__wstf_pos_skip } + \dim_gset:Nn \g__wstf_column_ht_dim + { + \box_ht_plus_dp:N \l__wstf_r_box + + \box_ht_plus_dp:N \g__wstf_equation_box + + \g__wstf_pos_skip + } } \cs_new_protected_nopar:Npn \__wstf_column_put_right: { @@ -1424,14 +1678,14 @@ { \__wstf_column_right_move_set:nn { \g__wstf_hang_ht_dim } - { \g__wstf_column_left_dim } + { \g__wstf_column_room_dim } \int_gzero:N \g__wstf_window_int } \bool_gset_false:N \g__wstf_next_hang_bool } \cs_new_protected_nopar:Npn \__wstf_build_column_strict_auxiii: { - \bool_gset_false:N \g__wstf_column_right_bool + \bool_gset_false:N \g__wstf_column_bool \__wstf_repack_left_box: \hbox_gset_to_wd:Nnn \g__wstf_window_box { \l__wstf_line_dim } @@ -1462,32 +1716,8 @@ \vbox_set:Nn \l__wstf_l_box { \vbox_unpack_drop:N \l__wstf_l_box } } -\cs_new_protected_nopar:Npn \__wstf_column_attach:N #1 - { - \vbox_set:Nn #1 - { - \vbox_unpack_drop:N #1 - \box_set_to_last:N \l__wstf_last_box - \__wstf_attach_equation:N \l__wstf_last_box - \vbox_unpack_drop:N \l__wstf_last_box - } - } -\box_new:N \l__wstf_last_l_box -\box_new:N \l__wstf_last_r_box \box_new:N \g__wstf_window_box -\dim_new:N \g__wstf_fake_wd_dim -\dim_new:N \g__wstf_first_dp_dim -\dim_new:N \g__wstf_first_sep_dim -\dim_new:N \g__wstf_column_left_dim -\dim_new:N \g__wstf_column_right_ht_dim -\bool_new:N \g__wstf_entire_bool -\bool_new:N \g__wstf_next_hang_bool -\bool_new:N \g__wstf_first_save_bool -\bool_new:N \g__wstf_column_right_bool -\bool_new:N \l__wstf_column_strict_bool -\bool_new:N \g__wstf_first_set_bool \bool_new:N \l__wstf_first_move_bool -\bool_new:N \g__wstf_right_move_bool \bool_new:N \l__wstf_column_bool \cs_new_eq:NN \__wstf_build_column: \__wstf_build_column_strict: \cs_new_eq:NN \__wstf_build_box: \__wstf_build_column: @@ -1500,38 +1730,39 @@ { \vbox_unpack:N \l__wstf_body_box } \dim_gset:Nn \g__wstf_ht_dim { \box_ht:N \l__wstf_window_box } } - \bool_if:NTF \l__wstf_attach_equation_bool - { - \vbox_set:Nn \l__wstf_window_box - { - \vbox_unpack_drop:N \l__wstf_window_box - \box_set_to_last:N \l__wstf_last_box - \__wstf_attach_equation:N \l__wstf_last_box - \vbox_unpack_drop:N \l__wstf_last_box - } - } - { \box_set_eq_drop:NN \l__wstf_window_box \l__wstf_body_box } - \dim_compare:nNnTF \g__wstf_column_left_dim > \c_zero_dim - { \__wstf_build_hang_aux: } - { \bool_gset_false:N \g__wstf_move_hang_bool } + \box_set_eq_drop:NN \l__wstf_window_box \l__wstf_body_box + \bool_if:NT \l__wstf_attach_equation_bool + { \__wstf_build_hang_attach: } + \dim_compare:nNnT \g__wstf_column_room_dim > \c_zero_dim + { \__wstf_build_hang_move: } } -\cs_new_protected_nopar:Npn \__wstf_build_hang_aux: +\cs_new_protected_nopar:Npn \__wstf_build_hang_attach: + { + \dim_compare:nNnTF \l__wstf_r_dim = \c_zero_dim + { \__wstf_attach_left:N \l__wstf_window_box } + { \__wstf_attach_right:N \l__wstf_window_box } + } +\cs_new_protected_nopar:Npn \__wstf_build_hang_move: { \dim_set:Nn \l__wstf_shift_dim { \dim_max:nn { \box_ht:N \l__wstf_window_box } { \tex_baselineskip:D * \g__wstf_line_int } + + \box_ht_plus_dp:N \g__wstf_equation_box + \tex_parskip:D } - \dim_gsub:Nn \g__wstf_column_left_dim { \l__wstf_shift_dim } - \dim_compare:nNnTF \g__wstf_column_left_dim > \c_zero_dim + \dim_gsub:Nn \g__wstf_column_room_dim { \l__wstf_shift_dim } + \dim_compare:nNnTF \g__wstf_column_room_dim > \c_zero_dim { \box_if_empty:NTF \l__wstf_bottom_box { \bool_if:NT \g__wstf_right_move_bool { \__wstf_set_next_hang: } } - { \bool_gset_false:N \g__wstf_move_hang_bool } } - { \bool_gset_false:N \g__wstf_move_hang_bool } + { \use:n } + { + \bool_gset_false:N \g__wstf_move_hang_bool + \bool_gset_false:N \g__wstf_right_move_bool + } } \cs_new_protected_nopar:Npn \__wstf_set_next_hang: { @@ -1541,75 +1772,67 @@ \dim_gset_eq:NN \g__wstf_hang_ht_dim \g__wstf_remaining_dim } \dim_gsub:Nn \g__wstf_hang_ht_dim { \l__wstf_shift_dim } - \dim_gset:Nn \g__wstf_dp_dim { \box_dp:N \l__wstf_window_box } \__wstf_column_right_move_set:nn { \g__wstf_hang_ht_dim } - { \g__wstf_column_left_dim } + { \g__wstf_column_room_dim } \int_gzero:N \g__wstf_window_int } -\dim_new:N \g__wstf_hang_ht_dim -\bool_new:N \g__wstf_move_hang_bool \cs_new_protected_nopar:Npn \__wstf_build_hangfrom: - { - \dim_compare:nNnTF \g__wstf_prevdepth_dim > \c__wstf_ignore_depth_dim - { \__wstf_build_hangfrom_aux: } - { \dim_gzero:N \g__wstf_ht_dim } - } -\cs_new_protected_nopar:Npn \__wstf_build_hangfrom_aux: { \group_begin: - \skip_zero:N \tex_splittopskip:D - \vbox_gset:Nn \g__wstf_line_box + \vbox_gset:Nn \g__wstf_window_box { - \tex_penalty:D \c__wstf_break_int + \__wstf_break: \vbox_unpack:N \l__wstf_body_box } - \vbox_set_split_to_ht:NNn \l__wstf_last_box \g__wstf_line_box + \__wstf_split_parameter: + \vbox_set_split_to_ht:NNn \l__wstf_last_box \g__wstf_window_box { \c_zero_dim } \dim_gset:Nn \g__wstf_ht_dim { \g__wstf_baseline_skip - \g__wstf_prevdepth_dim - - \l__wstf_shift_dim - \box_ht:N \l__wstf_body_box - + \box_ht:N \g__wstf_line_box + + \box_ht:N \g__wstf_window_box } \group_end: - \box_set_eq_drop:NN \l__wstf_body_box \g__wstf_line_box + \box_set_eq_drop:NN \l__wstf_body_box \g__wstf_window_box } \cs_new_protected_nopar:Npn \__wstf_put_box: { - \para_raw_end: + \__wstf_para_raw_end: \dim_compare:nNnTF \g__wstf_prevdepth_dim > \c__wstf_ignore_depth_dim { \__wstf_add_vskip: } - { \skip_gzero:N \g__wstf_pre_skip } + { \__wstf_set_vskip: } \skip_set_eq:NN \l__wstf_par_skip \tex_parskip:D \skip_zero:N \tex_parskip:D + \dim_set:Nn \l__wstf_window_ht_dim + { \box_ht_plus_dp:N \l__wstf_window_box } \bool_if:NTF \g__wstf_right_move_bool { \__wstf_put_box_aux: } { \box_if_empty:NTF \l__wstf_bottom_box - { - \dim_compare:nNnTF - { \g__wstf_remaining_dim } - > - { \box_ht_plus_dp:N \l__wstf_window_box } - { \__wstf_set_next: } - { \__wstf_put_box_aux: } - } + { \__wstf_put_next_test: } { \__wstf_put_box_aux: } } } +\dim_new:N \l__wstf_window_ht_dim \skip_new:N \l__wstf_par_skip -\cs_new_protected_nopar:Npn \__wstf_put_box_aux: +\cs_new_protected_nopar:Npn \__wstf_put_next_test: { - \int_gzero:N \g__wstf_window_int - \__wstf_hbox:n + \box_if_empty:NF \g__wstf_equation_box { - \__wstf_put_window_box: - \bool_if:NF \g__wstf_next_bool - { \__wstf_put_stuff_box: } + \dim_add:Nn \l__wstf_window_ht_dim + { \box_ht_plus_dp:N \g__wstf_equation_box + \g__wstf_pos_skip } } + \dim_compare:nNnTF + { \g__wstf_remaining_dim + \g__wstf_pos_skip } > \l__wstf_window_ht_dim + { \__wstf_set_next: } + { \__wstf_put_box_aux: } + } +\cs_new_protected_nopar:Npn \__wstf_put_box_aux: + { + \__wstf_output_window_box: \box_if_empty:NTF \l__wstf_bottom_box { \__wstf_put_trailer_box: } { \__wstf_put_bottom_box: } @@ -1625,31 +1848,48 @@ \bool_if:NTF \g__wstf_right_move_bool { \__wstf_next_para_trailer: } { - \__wstf_add_pos_skip: - \box_if_empty:NF \g__wstf_pos_box - { - \__wstf_newline: - \hbox_unpack_drop:N \g__wstf_pos_box - } + \__wstf_add_pos_kludge: + \__wstf_put_pos_box: + \__wstf_clear_variable: } } } \cs_new_protected_nopar:Npn \__wstf_put_bottom_box: { - \__wstf_newline: + \__wstf_para_raw_end: + \para_raw_noindent: \hbox_unpack_drop:N \l__wstf_bottom_box \box_if_empty:NF \g__wstf_equation_box { \__wstf_insert_equation: } + \__wstf_put_pos_box: + \__wstf_clear_variable: + } +\cs_new_protected_nopar:Npn \__wstf_output_window_box: + { + \__wstf_hbox:n + { + \__wstf_put_window_box: + \bool_if:NF \g__wstf_next_bool + { \__wstf_output_stuff_box: } + } + } +\cs_new_protected_nopar:Npn \__wstf_put_pos_box: + { \box_if_empty:NF \g__wstf_pos_box - { \hbox_unpack_drop:N \g__wstf_pos_box } - \bool_gset_false:N \g__wstf_right_move_bool - \bool_gset_false:N \g__wstf_first_save_bool + { \__wstf_output_pos_box: } } -\cs_new_protected_nopar:Npn \__wstf_newline: +\cs_new_protected_nopar:Npn \__wstf_output_pos_box: { - \tex_penalty:D \c__wstf_nobreak_int - \tex_hfil:D - \tex_penalty:D \c__wstf_break_int + \__wstf_if_last_none:F + { \__wstf_output_pos_box_aux: } + \hbox_unpack_drop:N \g__wstf_pos_box + } +\cs_new_protected_nopar:Npn \__wstf_output_pos_box_aux: + { + \__wstf_para_raw_end: + \bool_if:NT \g__wstf_equation_dp_bool + { \__wstf_set_equation_depth: } + \para_raw_noindent: } \cs_new_protected:Npn \__wstf_hbox:n #1 { @@ -1664,22 +1904,22 @@ { \skip_horizontal:n { \l__wstf_line_dim - \l__wstf_r_dim } } \box_use:N \l__wstf_window_box } -\cs_new_protected_nopar:Npn \__wstf_put_stuff_box: +\cs_new_protected_nopar:Npn \__wstf_output_stuff_box: { - \__wstf_move_stuff_box:nn { up } + \hbox_gset:Nn \g__wstf_stuff_box { - \l__wstf_voffset_dim - + ( \box_dp:N \g__wstf_stuff_box - - \box_dp:N \l__wstf_window_box ) - + ( \box_ht_plus_dp:N \l__wstf_window_box - - \g__wstf_stuff_ht_dim ) / 2 - \box_if_empty:NT \l__wstf_bottom_box - { - \g__wstf_pos_skip / 2 } + \__wstf_parshape_kern: + \box_move_up:nn + { + + \box_ht:N \l__wstf_window_box + - ( \l__wstf_window_ht_dim + + \box_ht_plus_dp:N \g__wstf_stuff_box ) / 2 + + \l__wstf_voffset_dim + } + { \box_use_drop:N \g__wstf_stuff_box } } - \__wstf_output_stuff_box: - } -\cs_new_protected_nopar:Npn \__wstf_output_stuff_box: - { + \box_gset_ht:Nn \g__wstf_stuff_box { \c_zero_dim } + \box_gset_dp:Nn \g__wstf_stuff_box { \c_zero_dim } \skip_horizontal:n { \dim_compare:nNnTF \l__wstf_r_dim > \c_zero_dim @@ -1699,18 +1939,6 @@ } \box_use_drop:N \g__wstf_stuff_box } -\cs_new_protected:Npn \__wstf_move_stuff_box:nn #1#2 - { - \hbox_gset:Nn \g__wstf_stuff_box - { - \__wstf_parshape_kern: - \use:c { box_move_ #1 :nn } - {#2} - { \box_use_drop:N \g__wstf_stuff_box } - } - \box_gset_ht:Nn \g__wstf_stuff_box { \c_zero_dim } - \box_gset_dp:Nn \g__wstf_stuff_box { \c_zero_dim } - } \cs_new_protected_nopar:Npn \__wstf_add_vskip: { \box_if_empty:NTF \g__wstf_display_box @@ -1719,6 +1947,7 @@ } \cs_new_protected_nopar:Npn \__wstf_add_vskip_display: { + \bool_set_true:N \l__wstf_display_pre_bool \vbox_unpack_drop:N \g__wstf_display_box \__wstf_ignore_depth: } @@ -1726,18 +1955,15 @@ { \dim_compare:nNnTF \tex_pagegoal:D < \c_max_dim { \__wstf_add_vskip_auxii: } - { \__wstf_add_vskip_auxiii: } + { + \bool_if:NTF \g__wstf_next_bool + { \__wstf_add_vskip_auxii: } + { \__wstf_add_vskip_auxiii: } + } } \cs_new_protected_nopar:Npn \__wstf_add_vskip_auxii: { - \skip_gset:Nn \g__wstf_pre_skip - { - \g__wstf_baseline_skip - - \g__wstf_prevdepth_dim - - \g__wstf_ht_dim - } - \dim_compare:nNnT \g__wstf_pre_skip < \tex_lineskiplimit:D - { \skip_gset_eq:NN \g__wstf_pre_skip \tex_lineskip:D } + \__wstf_add_vskip_auxiv: \bool_if:NTF \l__wstf_first_move_bool { \__wstf_first_move_skip: } { \skip_vertical:N \g__wstf_pre_skip } @@ -1745,14 +1971,25 @@ } \cs_new_protected_nopar:Npn \__wstf_add_vskip_auxiii: { + \__wstf_add_vskip_auxiv: + \skip_vertical:N \g__wstf_pre_skip \dim_compare:nNnTF \tex_topskip:D > \g__wstf_ht_dim { + \skip_sub:Nn \tex_topskip:D { \g__wstf_ht_dim } \tex_hrule:D height \c_zero_dim \scan_stop: - \skip_gset:Nn \g__wstf_pre_skip - { \tex_topskip:D - \g__wstf_ht_dim } - \skip_vertical:n { \g__wstf_pre_skip - \tex_topskip:D } } - { \skip_gzero:N \g__wstf_pre_skip } + { \__wstf_ignore_depth: } + } +\cs_new_protected_nopar:Npn \__wstf_add_vskip_auxiv: + { + \skip_gset:Nn \g__wstf_pre_skip + { + \g__wstf_baseline_skip + - \g__wstf_prevdepth_dim + - \g__wstf_ht_dim + } + \dim_compare:nNnT \g__wstf_pre_skip < \tex_lineskiplimit:D + { \skip_gset_eq:NN \g__wstf_pre_skip \tex_lineskip:D } } \cs_new_protected_nopar:Npn \__wstf_first_move_skip: { @@ -1761,11 +1998,21 @@ \g__wstf_first_sep_dim - \g__wstf_window_ht_dim - \tex_parskip:D - \dim_compare:nNnT \g__wstf_column_right_ht_dim > \c_zero_dim - { + \g__wstf_column_right_ht_dim + \g__wstf_pre_skip } + \dim_compare:nNnT \g__wstf_column_ht_dim > \c_zero_dim + { + \g__wstf_column_ht_dim + \g__wstf_pre_skip } } } \skip_new:N \g__wstf_pre_skip +\bool_new:N \l__wstf_display_pre_bool +\cs_new_protected_nopar:Npn \__wstf_set_vskip: + { + \box_if_empty:NTF \g__wstf_display_box + { + \skip_gset:Nn \g__wstf_pre_skip + { \g__wstf_baseline_skip - \g__wstf_ht_dim } + } + { \__wstf_add_vskip_display: } + } \cs_new_protected_nopar:Npn \__wstf_ignore_depth: { \dim_set_eq:NN \tex_prevdepth:D \c__wstf_ignore_depth_dim } \cs_new_protected_nopar:Npn \__wstf_set_prevdepth:N @@ -1775,24 +2022,19 @@ { \dim_set:Nn \l__wstf_height_dim { - \g__wstf_pre_skip - + \g__wstf_pos_skip - + \box_ht_plus_dp:N \l__wstf_window_box + \bool_if:NT \g__wstf_next_bool { \l__wstf_par_skip } + + \g__wstf_pre_skip + + \l__wstf_window_ht_dim } \dim_gadd:Nn \g__wstf_total_ht_dim { \l__wstf_height_dim } \dim_set:Nn \l__wstf_shift_dim { \g__wstf_remaining_dim - \l__wstf_height_dim } - \dim_compare:nNnTF \l__wstf_shift_dim > \c_zero_dim - { \__wstf_set_next_auxi: } - { - \dim_compare:nNnTF - { - \l__wstf_shift_dim } > \l__wstf_min_dim - { \__wstf_set_next_auxii: } - { \__wstf_set_next_auxi: } - } + \dim_compare:nNnTF + { - \l__wstf_shift_dim } < \l__wstf_min_dim + { \__wstf_set_next_para: } + { \__wstf_set_next_output: } } -\dim_new:N \g__wstf_total_ht_dim -\cs_new_protected_nopar:Npn \__wstf_set_next_auxi: +\cs_new_protected_nopar:Npn \__wstf_set_next_para: { \int_gset:Nn \g__wstf_window_int { @@ -1801,68 +2043,38 @@ { \c_one_int } } \__wstf_set_next_verify: - \bool_if:NF \g__wstf_next_bool - { \__wstf_move_next_stuff_box: } - \__wstf_set_next_output: + \__wstf_output_window_box: \__wstf_make_next_stuff:nn { \g__wstf_stuff_wd_dim } { \l__wstf_shift_dim } \int_gzero:N \g__wstf_top_int \__wstf_next_para_trailer: } -\cs_new_protected_nopar:Npn \__wstf_move_next_stuff_box: - { - \__wstf_move_stuff_box:nn { down } - { - \box_ht:N \g__wstf_stuff_box - - \box_ht:N \l__wstf_window_box - + ( \g__wstf_window_ht_dim - - \g__wstf_stuff_ht_dim - - \g__wstf_pre_skip - + \g__wstf_pos_skip - + \l__wstf_par_skip ) / 2 - - \l__wstf_voffset_dim - } - } -\cs_new_protected_nopar:Npn \__wstf_set_next_auxii: - { - \int_gzero:N \g__wstf_window_int - \bool_if:NF \g__wstf_next_bool - { - \__wstf_move_stuff_box:nn { down } - { - \box_ht:N \g__wstf_stuff_box - - \box_ht:N \l__wstf_window_box - - \l__wstf_voffset_dim - } - } - \__wstf_set_next_output: - \__wstf_add_pos_skip: - } \cs_new_protected_nopar:Npn \__wstf_set_next_output: { - \__wstf_hbox:n - { - \__wstf_put_window_box: - \bool_if:NF \g__wstf_next_bool - { \__wstf_output_stuff_box: } - } + \__wstf_output_window_box: + \__wstf_add_pos_kludge: + \__wstf_put_pos_box: + \__wstf_clear_variable: } \cs_new_protected_nopar:Npn \__wstf_set_next_verify: { \dim_set:Nn \l__wstf_height_dim - { \g__wstf_window_ht_dim - \g__wstf_total_ht_dim } - \dim_until_do:nNnn + { \g__wstf_window_ht_dim - \g__wstf_total_ht_dim - \l__wstf_min_dim } + \dim_while_do:nNnn { \tex_baselineskip:D * \g__wstf_window_int + \l__wstf_par_skip } - > + < { \l__wstf_height_dim } { \int_gincr:N \g__wstf_window_int } - \dim_gadd:Nn \g__wstf_total_ht_dim - { \tex_baselineskip:D * \g__wstf_window_int + \l__wstf_par_skip } + \bool_if:NF \g__wstf_next_bool + { + \dim_add:Nn \l__wstf_window_ht_dim + { \tex_baselineskip:D * \g__wstf_window_int + \l__wstf_par_skip } + } } \cs_new_protected_nopar:Npn \__wstf_next_para_trailer: { - \__wstf_add_pos_skip: + \__wstf_add_pos_kludge: \box_if_empty:NTF \g__wstf_pos_box { \__wstf_next_para: } { @@ -1877,7 +2089,6 @@ \dim_gset:Nn \g__wstf_stuff_wd_dim {#1} \dim_gset:Nn \g__wstf_remaining_dim {#2} } -\bool_new:N \g__wstf_next_bool \cs_new_protected:Npn \__wstf_extract_display_hbox:NN #1 { \box_gclear:N \g__wstf_pos_box @@ -1938,11 +2149,7 @@ \dim_new:N \g__wstf_display_pre_dim \cs_new_protected_nopar:Npn \__wstf_test_display_math: { - \__wstf_if_last_hlist:T - { - \box_gset_to_last:N \g__wstf_pos_box - \tex_unskip:D - } + \__wstf_if_last_hlist:T { \__wstf_extract_pos_hbox: } \box_clear:N \l__wstf_add_box \box_gclear:N \g__wstf_display_box \skip_gzero:N \g__wstf_last_skip @@ -1954,14 +2161,21 @@ \__wstf_add_last_skip:w \__wstf_add_last_skip:w \__wstf_add_last_penalty:w - \__wstf_add_last_finalise:w \q_stop + \__wstf_add_last_finalise:w \s_stop + } +\cs_new_protected_nopar:Npn \__wstf_extract_pos_hbox: + { + \box_gset_to_last:N \g__wstf_last_box + \__wstf_repack_hbox:N \l__wstf_last_box + \box_gset_eq_drop:NN \g__wstf_pos_box \l__wstf_last_box + \tex_unskip:D } \box_new:N \l__wstf_add_box \box_new:N \g__wstf_pos_box \cs_new_protected_nopar:Npn \__wstf_add_last_stop:w { \vbox_unpack_drop:N \l__wstf_add_box - \use_none_delimit_by_q_stop:w + \use_none_delimit_by_s_stop:w } \cs_new_protected_nopar:Npn \__wstf_add_last_skip:w { @@ -2027,7 +2241,7 @@ } { \box_gset_eq_drop:NN \g__wstf_display_box \l__wstf_add_box } { \vbox_unpack_drop:N \l__wstf_add_box } - \use_none_delimit_by_q_stop:w + \use_none_delimit_by_s_stop:w } \int_new:N \g__wstf_display_pre_int \skip_new:N \g__wstf_display_pre_skip @@ -2293,11 +2507,11 @@ } \regex_const:Nn \c__wstf_integer_regex { \A \d+ \Z } \cs_new_protected_nopar:Npn \__wstf_unknown_key_error:n - { \msg_error:nnn { wrapstuff } { unknown-key } } -\msg_new:nnnn { wrapstuff } { unknown-key } - { The~key~'#1'~is~unknown~and~is~being~ignored. } + { \msg_error:nnn { wstf } { unknown-key } } +\msg_new:nnnn { wstf } { unknown-key } + { The~key~"#1"~is~unknown~and~is~being~ignored. } { - The~package~wrapstuff~does~not~have~a~key~called~'#1'.\\ + The~package~wrapstuff~does~not~have~a~key~called~"#1".\\ Check~that~you~have~spelled~the~key~name~correctly. } \NewDocumentCommand \wrapstuffset { m } -- cgit v1.2.3