From b9f09946a8fe2f81468fb7bf624e3f8ce2d26888 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Wed, 30 Sep 2015 21:17:21 +0000 Subject: unravel (30sep15) git-svn-id: svn://tug.org/texlive/trunk@38506 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/unravel/unravel.sty | 627 ++++++++++++++++++------ 1 file changed, 465 insertions(+), 162 deletions(-) (limited to 'Master/texmf-dist/tex/latex/unravel') diff --git a/Master/texmf-dist/tex/latex/unravel/unravel.sty b/Master/texmf-dist/tex/latex/unravel/unravel.sty index 630584380a7..9d051e10e64 100644 --- a/Master/texmf-dist/tex/latex/unravel/unravel.sty +++ b/Master/texmf-dist/tex/latex/unravel/unravel.sty @@ -21,39 +21,161 @@ %% http://www.latex-project.org/lppl.txt %% %% ----------------------------------------------------------------------- +\begingroup\let\c\catcode\fam32\c\fam10\advance\fam5\c\fam14\c45 12 % +\c54 12\c55 12\c56 12\c57 12\c58 11\c95 11\c104 11\c106 11\c107 11 % +\c113 11\c115 11\c119 11\c120 11\c121 11\c122 11\endlinechar-1 % +\expandafter\ifx\csname unravel\endcsname\relax +\else\endinput\expandafter\endgroup\fi +\c84 11\c88 11\c35 6\c123 1\c125 2\c62 12\c61 12\c43 12 % +\expandafter\ifx\csname numexpr\endcsname\relax +\errmessage{unravel requires \numexpr from eTeX} +\endinput\expandafter\endgroup\fi +\expandafter\ifx\csname protected\endcsname\relax +\errmessage{unravel requires \protected from eTeX} +\endinput\expandafter\endgroup\fi +\expandafter\ifx\csname currentgrouplevel\endcsname\relax\else +\ifnum\currentgrouplevel>1 \errmessage{unravel loaded in a group} +\endinput\expandafter\expandafter\expandafter\endgroup\fi\fi +\catcode 32 = 9 \relax +\catcode 126 = 10 \relax +\gdef \l__unravel_setup_restore_tl { } +\protected \gdef \__unravel_setup_restore: + { + \l__unravel_setup_restore_tl + \def \l__unravel_setup_restore_tl { } + } +\protected \gdef \__unravel_setup_save: + { + \edef \l__unravel_setup_restore_tl + { + \__unravel_setup_save_aux:w 0 = + \endlinechar = \the \endlinechar + \escapechar = \the \escapechar + \newlinechar = \the \newlinechar + \relax + } + } +\long \gdef \__unravel_setup_save_aux:w #1 = + { + \catcode #1 = \the \catcode #1 ~ + \ifnum 255 > #1 ~ + \expandafter \__unravel_setup_save_aux:w + \the \numexpr #1 + 1 \expandafter = + \fi + } +\protected \long \gdef \__unravel_setup_catcodes:nnn #1 #2 #3 + { + \ifnum #1 > #2 ~ \else + \catcode #1 = #3 ~ + \expandafter \__unravel_setup_catcodes:nnn \expandafter + { \the \numexpr #1 + 1 } {#2} {#3} + \fi + } +\protected \gdef \__unravel_setup_latexe: + { + \__unravel_setup_save: + \__unravel_setup_catcodes:nnn {0} {8} {15} + \catcode 9 = 10 ~ + \catcode 10 = 12 ~ + \catcode 11 = 15 ~ + \catcode 12 = 13 ~ + \catcode 13 = 5 ~ + \__unravel_setup_catcodes:nnn {14} {31} {15} + \catcode 32 = 10 ~ + \catcode 33 = 12 ~ + \catcode 34 = 12 ~ + \catcode 35 = 6 ~ + \catcode 36 = 3 ~ + \catcode 37 = 14 ~ + \catcode 38 = 4 ~ + \__unravel_setup_catcodes:nnn {39} {63} {12} + \__unravel_setup_catcodes:nnn {64} {90} {11} + \catcode 91 = 12 ~ + \catcode 92 = 0 ~ + \catcode 93 = 12 ~ + \catcode 94 = 7 ~ + \catcode 95 = 8 ~ + \catcode 96 = 12 ~ + \__unravel_setup_catcodes:nnn {97} {122} {11} + \catcode 123 = 1 ~ + \catcode 124 = 12 ~ + \catcode 125 = 2 ~ + \catcode 126 = 13 ~ + \catcode 127 = 15 ~ + \__unravel_setup_catcodes:nnn {128} {255} {12} + \endlinechar = 13 ~ + \escapechar = 92 ~ + \newlinechar = 10 ~ + } +\protected \gdef \__unravel_setup_unravel: + { + \__unravel_setup_save: + \__unravel_setup_catcodes:nnn {0} {8} {15} + \catcode 9 = 9 ~ + \catcode 10 = 12 ~ + \catcode 11 = 15 ~ + \catcode 12 = 13 ~ + \catcode 13 = 5 ~ + \__unravel_setup_catcodes:nnn {14} {31} {15} + \catcode 32 = 9 ~ + \catcode 33 = 12 ~ + \catcode 34 = 12 ~ + \catcode 35 = 6 ~ + \catcode 36 = 3 ~ + \catcode 37 = 14 ~ + \catcode 38 = 4 ~ + \__unravel_setup_catcodes:nnn {39} {57} {12} + \catcode 58 = 11 ~ + \__unravel_setup_catcodes:nnn {59} {64} {12} + \__unravel_setup_catcodes:nnn {65} {90} {11} + \catcode 91 = 12 ~ + \catcode 92 = 0 ~ + \catcode 93 = 12 ~ + \catcode 94 = 7 ~ + \catcode 95 = 11 ~ + \catcode 96 = 12 ~ + \__unravel_setup_catcodes:nnn {97} {122} {11} + \catcode 123 = 1 ~ + \catcode 124 = 12 ~ + \catcode 125 = 2 ~ + \catcode 126 = 10 ~ + \catcode 127 = 15 ~ + \__unravel_setup_catcodes:nnn {128} {255} {12} + \escapechar = 92 ~ + \endlinechar = 32 ~ + \newlinechar = 10 ~ + } +\expandafter \endgroup \__unravel_setup_latexe: \RequirePackage{expl3,xparse}[2015/09/11] \RequirePackage{gtl}[2015/09/21] -\ProvidesExplPackage - {unravel} {2015/09/22} {0.1} {Watching TeX digest tokens} -\cs_if_exist:NF \str_range:nnn { \RequirePackage{l3str} } +\csname cs_if_exist:cF\endcsname{str_range:nnn}{\RequirePackage{l3str}} +\csname use:n\endcsname + {% + \csname __unravel_setup_restore:\endcsname + \ProvidesExplPackage + {unravel} {2015/09/30} {0.2} {Watching TeX digest tokens}% + \csname __unravel_setup_unravel:\endcsname + }% \cs_new_eq:NN \__unravel_currentgrouptype: \etex_currentgrouptype:D \cs_new_protected_nopar:Npn \__unravel_set_escapechar:n { \int_set:Nn \tex_escapechar:D } \cs_new_eq:NN \__unravel_everyeof:w \etex_everyeof:D \cs_new_eq:NN \__unravel_everypar:w \tex_everypar:D \cs_new_eq:NN \__unravel_hbox:w \tex_hbox:D +\cs_new_eq:NN \__unravel_mag: \tex_mag:D \cs_new_eq:NN \__unravel_nullfont: \tex_nullfont:D \cs_new_eq:NN \__unravel_the:w \tex_the:D \cs_new_eq:NN \c__unravel_prompt_ior \c_sixteen \cs_new_eq:NN \c__unravel_noprompt_ior \c_minus_one -\cs_if_exist:NF \exp_last_unbraced:NNn - { \cs_new_eq:NN \exp_last_unbraced:NNn \use:nnn } -\cs_generate_variant:Nn \exp_last_unbraced:NNn { NNv } \cs_generate_variant:Nn \str_head:n { f } \cs_generate_variant:Nn \tl_to_str:n { o } \cs_generate_variant:Nn \tl_if_head_eq_meaning:nNT { V } -\cs_generate_variant:Nn \tl_if_head_is_space:nTF { o } -\cs_generate_variant:Nn \tl_if_head_is_space:nT { V } -\cs_generate_variant:Nn \tl_if_head_is_N_type:nTF { o } \cs_generate_variant:Nn \tl_if_in:nnF { nV } \cs_generate_variant:Nn \tl_if_in:nnTF { nV } -\cs_generate_variant:Nn \tl_if_eq:nnT { V } \cs_generate_variant:Nn \tl_if_in:NnTF { No , NV } \cs_generate_variant:Nn \tl_if_single_token:nT { V } \cs_generate_variant:Nn \tl_gset_rescan:Nnn { Nnx } -\cs_generate_variant:Nn \gtl_gput_left:Nn { Nx , NV , No } -\cs_generate_variant:Nn \gtl_gput_right:Nn { Nx , NV } -\cs_generate_variant:Nn \gtl_put_right:Nn { NV } +\cs_generate_variant:Nn \gtl_gput_right:Nn { NV } \cs_generate_variant:Nn \ior_get_str:NN { Nc } \cs_generate_variant:Nn \gtl_if_empty:NTF { c } \cs_generate_variant:Nn \gtl_to_str:N { c } @@ -64,24 +186,66 @@ \cs_generate_variant:Nn \gtl_gclear:N { c } \cs_generate_variant:Nn \gtl_gclear_new:N { c } \cs_new_protected_nopar:Npn \__unravel_tmp:w { } -\cs_new_protected:Npn \__unravel_tl_gset_input:Nnn #1#2#3 +\cs_set_protected:Npn \__unravel_tmp:w #1 { - \group_begin: - \__unravel_everyeof:w \exp_after:wN { \token_to_str:N @ @ #1 } - #2 - \tl_gclear:N #1 - \exp_after:wN \__unravel_tl_gset_input_aux:wN - \exp_after:wN \prg_do_nothing: - \tex_input:D \tl_to_str:n {#3} \scan_stop: - \group_end: - \tl_gput_right:NV #1 \__unravel_everyeof:w + \cs_new_protected:Npn \__unravel_file_get:nN ##1##2 + { + \group_begin: + \__unravel_everyeof:w { #1 ##2 } + \exp_after:wN \__unravel_file_get_aux:wN + \exp_after:wN \prg_do_nothing: + \tex_input:D ##1 \scan_stop: + } + \cs_new_protected:Npn \__unravel_file_get_aux:wN ##1 #1 ##2 + { + \group_end: + \tl_set:Nx ##2 + { \exp_not:o {##1} \exp_not:V \__unravel_everyeof:w } + } } -\cs_generate_variant:Nn \__unravel_tl_gset_input:Nnn { Nno } -\use:x +\exp_args:No \__unravel_tmp:w { \token_to_str:N : : } +\cs_new:Npn \__unravel_tl_first_int:N #1 + { + \int_eval:n + { + \exp_after:wN \__unravel_tl_first_int_aux:Nn + \exp_after:wN \__unravel_tl_first_int_aux:Nn + #1 ? 0 ? \q_stop + } + } +\cs_new:Npn \__unravel_tl_first_int_aux:Nn #1#2 + { + \tl_if_single:nT {#2} + { + \token_if_eq_catcode:NNT + #2 + { + \if_int_compare:w 1 < 1 #2 \exp_stop_f: + #2 + \exp_after:wN \use_i_ii:nnn + \exp_after:wN \__unravel_tl_first_int_aux:Nn + \exp_after:wN \use_none_delimit_by_q_stop:w + \fi: + } + } + #1 + } +\cs_new_protected_nopar:Npn \__unravel_prepare_mag: { - \cs_new_protected:Npn \exp_not:N \__unravel_tl_gset_input_aux:wN - ##1 \token_to_str:N @ @ ##2 - } { \tl_gset:No #2 {#1} } + \int_compare:nNnT { \g__unravel_mag_set_int } > { 0 } + { + \int_compare:nNnF { \__unravel_mag: } = { \g__unravel_mag_set_int } + { + \__unravel_tex_error:nn { incompatible-mag } { } + \int_gset_eq:NN \__unravel_mag: \g__unravel_mag_set_int + } + } + \int_compare:nF { 1 <= \__unravel_mag: <= 32768 } + { + \__unravel_tex_error:nV { illegal-mag } \l__unravel_head_tl + \int_gset:Nn \__unravel_mag: { 1000 } + } + \int_gset_eq:NN \g__unravel_mag_set_int \__unravel_mag: + } \cs_new_nopar:Npn \__unravel_strip_escape:w { \tex_romannumeral:D @@ -315,6 +479,7 @@ \gtl_new:N \g__unravel_after_assignment_gtl \bool_new:N \g__unravel_set_box_allowed_bool \bool_new:N \g__unravel_name_in_progress_bool +\gtl_new:N \l__unravel_after_group_gtl \group_begin: \cs_set:Npx \__unravel_tmp:w #1 { \c_hash_str #1 } \tl_const:Nx \c__unravel_parameters_tl @@ -341,6 +506,7 @@ \tl_const:Nn \c__unravel_comma_tl { , } \tl_const:Nn \c__unravel_point_tl { . } \gtl_const:Nx \c__unravel_frozen_relax_gtl { \if_int_compare:w 0 = 0 \fi: } +\int_new:N \g__unravel_mag_set_int \cs_new_protected:Npn \__unravel_tex_const:nn #1#2 { \int_const:cn { c__unravel_tex_#1_int } {#2} } \cs_new:Npn \__unravel_tex_use:n #1 { \int_use:c { c__unravel_tex_#1_int } } @@ -1455,7 +1621,7 @@ \bool_if:NT \g__unravel_internal_debug_bool { \__unravel_set_cmd: - \iow_term:x { Exp:~\int_use:N \l__unravel_head_cmd_int } + \iow_term:x { Exp:~\int_to_arabic:n { \l__unravel_head_cmd_int } } } \token_if_macro:NTF \l__unravel_head_token { \__unravel_macro_call: } @@ -1593,6 +1759,14 @@ \__unravel_back_input_gtl:N \l__unravel_tmpb_gtl \prg_return_false: } +\cs_new_protected_nopar:Npn \__unravel_scan_to: + { + \__unravel_scan_keyword:nF { tToO } + { + \msg_error:nn { unravel } { missing-to } + \__unravel_prev_input:n { to } + } + } \cs_new_protected_nopar:Npn \__unravel_scan_font_ident: { \__unravel_get_x_non_blank: @@ -1615,8 +1789,8 @@ } { \msg_error:nn { unravel } { missing-font-id } + \__unravel_back_input: \__unravel_prev_input:n { \__unravel_nullfont: } - \__unravel_back_error: } } \cs_new_protected_nopar:Npn \__unravel_scan_font_int: @@ -1646,7 +1820,11 @@ { \int_compare:nNnTF { ( #1 + \c_two ) / \c_four } > { ( #3 + \c_two ) / \c_four } - { \__unravel_back_input: } + { + \__unravel_back_input: + \msg_error:nn { unravel } { missing-something } + \tl_clear:N \l__unravel_tmpa_tl + } { \tl_if_empty:nF {#2} { @@ -1655,9 +1833,8 @@ #2 \seq_gpop_right:NN \g__unravel_prev_input_seq \l__unravel_head_tl } + \__unravel_thing_use_get:nnNN {#1} {#3} \l__unravel_head_tl \l__unravel_tmpa_tl } - \tl_set:Nx \l__unravel_tmpa_tl - { \__unravel_thing_use:nnN {#1} {#3} \l__unravel_head_tl } \__unravel_prev_input_silent:V \l__unravel_tmpa_tl \__unravel_set_action_text: \__unravel_set_action_text:x @@ -1687,9 +1864,9 @@ { 83 } { 1 \__unravel_scan_int: } % set_box_dimen { 84 } { 0 \__unravel_scan_int: } % set_shape { 85 } { 0 \__unravel_scan_int: } % def_code - { 86 } { 4 \__unravel_scan_font_ident: } % def_family - { 87 } { 4 \__unravel_scan_font_ident: } % set_font - { 88 } { 4 \__unravel_scan_font_ident: } % def_font + { 86 } { 4 \__unravel_scan_int: } % def_family + { 87 } { 4 } % set_font + { 88 } { 4 } % def_font { 89 } { \__unravel_thing_register: } % register } { 8 } @@ -1750,16 +1927,38 @@ \int_compare:nNnT \l__unravel_head_char_int = \c_zero { \__unravel_scan_int: } } -\cs_new:Npn \__unravel_thing_use:nnN #1#2 +\cs_new_protected:Npn \__unravel_thing_use_get:nnNN #1#2#3#4 { - \int_case:nnF { \int_min:nn {#1} {#2} } + \int_compare:nNnTF {#2} < { 3 } + { + \int_compare:nNnT {#1} = { 3 } + { \__unravel_tex_error:nV { incompatible-units } #3 } + \tl_set:Nx #4 + { + \int_case:nn { \int_min:nn {#1} {#2} } + { + { 0 } \int_eval:n + { 1 } \dim_eval:n + { 2 } \skip_eval:n + } + { \int_compare:nNnT {#1} = { 3 } \etex_mutoglue:D #3 } + } + } { - { 0 } \int_eval:n - { 1 } \dim_eval:n - { 2 } \skip_eval:n - { 3 } \muskip_eval:n + \int_compare:nNnTF {#2} = { 3 } + { + \int_case:nnF {#1} + { + { 0 } { \tl_set:Nx #4 { \int_eval:n {#3} } } + { 3 } { \tl_set:Nx #4 { \muskip_eval:n {#3} } } + } + { + \__unravel_tex_error:nV { incompatible-units } #3 + \tl_set:Nx #4 { \muskip_eval:n { \etex_gluetomu:D #3 } } + } + } + { \tl_set:Nx #4 { \__unravel_the:w #3 } } } - { \__unravel_the:w } } \cs_new_protected:Npn \__unravel_scan_expr:N #1 { \__unravel_scan_expr_aux:NN #1 \c_false_bool } @@ -1917,28 +2116,10 @@ \__unravel_cmd_if_internal:TF { \int_compare:nNnTF {#1} = { 3 } - { - \__unravel_scan_something_internal:n { 3 } - \int_case:nnF \g__unravel_val_level_int - { - { 0 } { \__unravel_scan_dim_unit:nN {#1} #2 } - { 3 } { } - } - { - \msg_error:nn { unravel } { incompatible-units } - % ^^A todo: error recovery - } - } - { - \__unravel_scan_something_internal:n { 1 } - \int_case:nnF \g__unravel_val_level_int - { - { 0 } { \__unravel_scan_dim_unit:nN {#1} #2 } - { 3 } % ^^A todo: error recovery - { \msg_error:nn { unravel } { incompatible-units } } - } - { } - } + { \__unravel_scan_something_internal:n { 3 } } + { \__unravel_scan_something_internal:n { 1 } } + \int_compare:nNnT \g__unravel_val_level_int = { 0 } + { \__unravel_scan_dim_unit:nN {#1} #2 } } { \__unravel_scan_dimen_char:nN {#1} #2 } \seq_gpop_right:NN \g__unravel_prev_input_seq \l__unravel_head_tl @@ -1978,7 +2159,7 @@ { \bool_if:NT #2 { - \__unravel_scan_keyword:nT { fF iI lL } + \__unravel_scan_keyword:nT { fFiIlL } { \__unravel_scan_inf_unit_loop: \__unravel_break:w @@ -1997,25 +2178,26 @@ { \__unravel_back_input: } \int_compare:nNnT {#1} = { 3 } { - \__unravel_scan_keyword:nT { mM uU } { \__unravel_break:w } + \__unravel_scan_keyword:nT { mMuU } { \__unravel_break:w } \msg_error:nn { unravel } { missing-mudim } \__unravel_break:w } - \__unravel_scan_keyword:nT { eE mM } { \__unravel_break:w } - \__unravel_scan_keyword:nT { eE xX } { \__unravel_break:w } - \__unravel_scan_keyword:nT { pP xX } { \__unravel_break:w } - \__unravel_scan_keyword:n { tT rR uU eE } - \__unravel_scan_keyword:nT { pP tT } { \__unravel_break:w } - \__unravel_scan_keyword:nT { iI nN } { \__unravel_break:w } - \__unravel_scan_keyword:nT { pP cC } { \__unravel_break:w } - \__unravel_scan_keyword:nT { cC mM } { \__unravel_break:w } - \__unravel_scan_keyword:nT { mM mM } { \__unravel_break:w } - \__unravel_scan_keyword:nT { bB pP } { \__unravel_break:w } - \__unravel_scan_keyword:nT { dD dD } { \__unravel_break:w } - \__unravel_scan_keyword:nT { cC cC } { \__unravel_break:w } - \__unravel_scan_keyword:nT { nN dD } { \__unravel_break:w } - \__unravel_scan_keyword:nT { nN cC } { \__unravel_break:w } - \__unravel_scan_keyword:nT { sS pP } { \__unravel_break:w } + \__unravel_scan_keyword:nT { eEmM } { \__unravel_break:w } + \__unravel_scan_keyword:nT { eExX } { \__unravel_break:w } + \__unravel_scan_keyword:nT { pPxX } { \__unravel_break:w } + \__unravel_scan_keyword:nT { tTrRuUeE } + { \__unravel_prepare_mag: } + \__unravel_scan_keyword:nT { pPtT } { \__unravel_break:w } + \__unravel_scan_keyword:nT { iInN } { \__unravel_break:w } + \__unravel_scan_keyword:nT { pPcC } { \__unravel_break:w } + \__unravel_scan_keyword:nT { cCmM } { \__unravel_break:w } + \__unravel_scan_keyword:nT { mMmM } { \__unravel_break:w } + \__unravel_scan_keyword:nT { bBpP } { \__unravel_break:w } + \__unravel_scan_keyword:nT { dDdD } { \__unravel_break:w } + \__unravel_scan_keyword:nT { cCcC } { \__unravel_break:w } + \__unravel_scan_keyword:nT { nNdD } { \__unravel_break:w } + \__unravel_scan_keyword:nT { nNcC } { \__unravel_break:w } + \__unravel_scan_keyword:nT { sSpP } { \__unravel_break:w } \__unravel_break_point: } \cs_new_protected_nopar:Npn \__unravel_scan_inf_unit_loop: @@ -2052,20 +2234,17 @@ \int_case:nnF \g__unravel_val_level_int { { 0 } { \__unravel_scan_dimen:nN {#1} \c_false_bool } - {#1} { \__unravel_break:w } - } - { - \int_compare:nNnF { \g__unravel_val_level_int + #1 } = 3 - { \msg_error:nn { unravel } { incompatible-units } } + { 1 } { } } + { \__unravel_break:w } } { \__unravel_back_input: \__unravel_scan_dimen:nN {#1} \c_false_bool } \__unravel_prev_input_join_get:nN {#1} \l__unravel_tmpa_tl \seq_gput_right:Nn \g__unravel_prev_input_seq { } \seq_gput_right:NV \g__unravel_prev_input_seq \l__unravel_tmpa_tl - \__unravel_scan_keyword:nT { pP lL uU sS } + \__unravel_scan_keyword:nT { pPlLuUsS } { \__unravel_scan_dimen:nN {#1} \c_true_bool } - \__unravel_scan_keyword:nT { mM iI nN uU sS } + \__unravel_scan_keyword:nT { mMiInNuUsS } { \__unravel_scan_dimen:nN {#1} \c_true_bool } \__unravel_break_point: \__unravel_prev_input_join_get:nN {#1} \l__unravel_tmpa_tl @@ -2262,9 +2441,9 @@ } \cs_new_protected_nopar:Npn \__unravel_scan_spec: { - \__unravel_scan_keyword:nTF { tT oO } { \__unravel_scan_normal_dimen: } + \__unravel_scan_keyword:nTF { tToO } { \__unravel_scan_normal_dimen: } { - \__unravel_scan_keyword:nT { sS pP rR eE aA dD } + \__unravel_scan_keyword:nT { sSpPrReEaAdD } { \__unravel_scan_normal_dimen: } } \__unravel_scan_left_brace: @@ -2308,11 +2487,7 @@ { 3 } % vsplit { \__unravel_scan_int: - \__unravel_scan_keyword:nF { tT oO } - { - \msg_error:nn { unravel } { missing-to } - \__unravel_prev_input:n { to } - } + \__unravel_scan_to: \__unravel_scan_normal_dimen: } } @@ -2324,8 +2499,10 @@ \bool_if:NTF #1 { \__unravel_do_leaders_fetch_skip: } { \seq_gpop_right:NN \g__unravel_prev_input_seq \l__unravel_head_tl + \tl_if_head_eq_meaning:VNT \l__unravel_head_tl \tex_shipout:D + { \__unravel_prepare_mag: } \tl_use:N \l__unravel_head_tl \scan_stop: - \gtl_put_right:NV \g__unravel_output_gtl \l__unravel_head_tl + \gtl_gput_right:NV \g__unravel_output_gtl \l__unravel_head_tl \__unravel_print_action:x { \tl_to_str:N \l__unravel_head_tl } } } @@ -2381,6 +2558,7 @@ { \exp_args:No #1 {##1} \cs_gset_eq:NN \__unravel_box_hook:w \prg_do_nothing: + \gtl_clear:N \l__unravel_after_group_gtl \__unravel_print_action: \__unravel_back_input:o {##1} \__unravel_set_action_text:x @@ -2465,26 +2643,31 @@ \cs_new_protected_nopar:Npn \__unravel_build_page: { } -\cs_new_protected_nopar:Npn \__unravel_handle_left_brace: +\cs_new_protected_nopar:Npn \__unravel_handle_right_brace: { - \int_case:nnF \__unravel_currentgrouptype: + \int_compare:nTF { 1 <= \__unravel_currentgrouptype: <= 13 } { - { 1 } { \__unravel_end_simple_group: } % simple - { 2 } { \__unravel_end_box_group: } % hbox - { 3 } { \__unravel_end_box_group: } % adjusted_hbox - { 4 } { \__unravel_end_graf: \__unravel_end_box_group: } % vbox - { 5 } { \__unravel_end_graf: \__unravel_end_box_group: } % vtop - { 6 } { \__unravel_end_align_group: } % align - { 7 } { \__unravel_end_no_align_group: } % no_align - { 8 } { \__unravel_end_output_group: } % output - { 9 } { \__unravel_end_simple_group: } % math - { 10 } { \__unravel_end_disc_group: } % disc - { 11 } { \__unravel_end_graf: \__unravel_end_simple_group: } % insert - { 12 } { \__unravel_end_graf: \__unravel_end_simple_group: } % vcenter - { 13 } { \__unravel_end_math_choice_group: } % math_choice + \gtl_gconcat:NNN \g__unravel_output_gtl + \g__unravel_output_gtl \c_group_end_gtl + \__unravel_back_input_gtl:N \l__unravel_after_group_gtl + \int_case:nn \__unravel_currentgrouptype: + { + { 1 } { \__unravel_end_simple_group: } % simple + { 2 } { \__unravel_end_box_group: } % hbox + { 3 } { \__unravel_end_box_group: } % adjusted_hbox + { 4 } { \__unravel_end_graf: \__unravel_end_box_group: } % vbox + { 5 } { \__unravel_end_graf: \__unravel_end_box_group: } % vtop + { 6 } { \__unravel_end_align_group: } % align + { 7 } { \__unravel_end_no_align_group: } % no_align + { 8 } { \__unravel_end_output_group: } % output + { 9 } { \__unravel_end_simple_group: } % math + { 10 } { \__unravel_end_disc_group: } % disc + { 11 } { \__unravel_end_graf: \__unravel_end_simple_group: } % insert + { 12 } { \__unravel_end_graf: \__unravel_end_simple_group: } % vcenter + { 13 } { \__unravel_end_math_choice_group: } % math_choice + } } { % bottom_level, semi_simple, math_shift, math_left - \__unravel_back_input: \l__unravel_head_token \__unravel_print_action: } @@ -2492,20 +2675,22 @@ \cs_new_protected_nopar:Npn \__unravel_end_simple_group: { \l__unravel_head_token - \gtl_gconcat:NNN \g__unravel_output_gtl - \g__unravel_output_gtl \c_group_end_gtl \__unravel_print_action: } \cs_new_protected_nopar:Npn \__unravel_end_box_group: { \seq_pop:NN \l__unravel_leaders_box_seq \l__unravel_tmpa_tl - \str_if_eq_x:nnTF \l__unravel_tmpa_tl { Z } + \exp_args:No \__unravel_end_box_group_aux:n { \l__unravel_tmpa_tl } + } +\cs_new_protected:Npn \__unravel_end_box_group_aux:n #1 + { + \str_if_eq_x:nnTF {#1} { Z } { \__unravel_end_simple_group: } { \__unravel_get_x_non_relax: \__unravel_set_cmd: \int_compare:nNnTF \l__unravel_head_cmd_int - = { \__unravel_tex_use:n { \l__unravel_tmpa_tl skip } } + = { \__unravel_tex_use:n { #1 skip } } { \tl_put_left:Nn \l__unravel_head_tl { \c_group_end_token } \__unravel_do_append_glue: @@ -2591,6 +2776,7 @@ \mode_if_inner:TF { \gtl_gput_right:NV \g__unravel_output_gtl \l__unravel_head_tl + \__unravel_back_input_gtl:N \l__unravel_after_group_gtl $ % $ } { @@ -2604,6 +2790,7 @@ \msg_error:nn { unravel } { missing-dollar } } \gtl_gput_right:NV \g__unravel_output_gtl \l__unravel_head_tl + \__unravel_back_input_gtl:N \l__unravel_after_group_gtl $ $ } \__unravel_print_action: @@ -2612,7 +2799,7 @@ { \__unravel_set_action_text: \bool_if:NT \g__unravel_internal_debug_bool - { \iow_term:x { Cmd:~\int_use:N \l__unravel_head_cmd_int } } + { \iow_term:x { Cmd:~\int_to_arabic:n { \l__unravel_head_cmd_int } } } \cs_if_exist_use:cF { __unravel_cmd_ \int_use:N \l__unravel_head_cmd_int : } { \msg_error:nnx { unravel } { internal } { unknown-command } } @@ -2625,9 +2812,10 @@ \g__unravel_output_gtl \c_group_begin_gtl \__unravel_print_action: \l__unravel_head_token + \gtl_clear:N \l__unravel_after_group_gtl } \__unravel_new_tex_cmd:nn { end-group_char } % 2 - { \__unravel_handle_left_brace: } + { \__unravel_handle_right_brace: } \__unravel_new_tex_cmd:nn { math_char } % 3 { \__unravel_mode_non_vertical:n @@ -2993,7 +3181,28 @@ } } \__unravel_new_tex_cmd:nn { after_group } % 41 - { \msg_error:nnx { unravel } { not-implemented } { aftergroup } } + { + \tl_set_eq:NN \l__unravel_tmpa_tl \l__unravel_head_tl + \__unravel_get_next: + \int_compare:nNnTF \__unravel_currentgrouptype: = \c_zero + { + \__unravel_print_action:x + { + Aftergroup~(level~0~=>~dropped):~ + \tl_to_str:N \l__unravel_tmpa_tl + \gtl_to_str:N \l__unravel_head_gtl + } + } + { + \gtl_concat:NNN \l__unravel_after_group_gtl + \l__unravel_after_group_gtl \l__unravel_head_gtl + \__unravel_print_action:x + { + Aftergroup:~\tl_to_str:N \l__unravel_tmpa_tl + \gtl_to_str:N \l__unravel_head_gtl + } + } + } \__unravel_new_tex_cmd:nn { break_penalty } % 42 { \seq_gput_right:NV \g__unravel_prev_input_seq \l__unravel_head_tl @@ -3147,14 +3356,16 @@ \__unravel_new_tex_cmd:nn { begin_group } % 61 { \gtl_gput_right:NV \g__unravel_output_gtl \l__unravel_head_tl - \__unravel_print_action: \l__unravel_head_token + \gtl_clear:N \l__unravel_after_group_gtl + \__unravel_print_action: } \__unravel_new_tex_cmd:nn { end_group } % 62 { \gtl_gput_right:NV \g__unravel_output_gtl \l__unravel_head_tl - \__unravel_print_action: + \__unravel_back_input_gtl:N \l__unravel_after_group_gtl \l__unravel_head_token + \__unravel_print_action: } \__unravel_new_tex_cmd:nn { omit } % 63 { \msg_error:nn { unravel } { not-implemented } { omit } } @@ -3229,24 +3440,24 @@ } { 6 } % pdfliteral { - \__unravel_scan_keyword:nF { dD iI rR eE cC tT } - { \__unravel_scan_keyword:n { pP aA gG eE } } + \__unravel_scan_keyword:nF { dDiIrReEcCtT } + { \__unravel_scan_keyword:n { pPaAgGeE } } \__unravel_scan_pdf_ext_toks: } { 7 } % pdfobj { \__unravel_scan_keyword:nTF - { rR eE sS eE rR vV eE oO bB jJ nN uU mM } + { rReEsSeErRvVeEoObBjJnNuUmM } { \__unravel_skip_optional_space: } { - \__unravel_scan_keyword:nF { uU sS eE oO bB jJ nN uU mM } + \__unravel_scan_keyword:nF { uUsSeEoObBjJnNuUmM } { \__unravel_scan_int: } - \__unravel_scan_keyword:nT { sS tT rR eE aA mM } + \__unravel_scan_keyword:nT { sStTrReEaAmM } { - \__unravel_scan_keyword:nT { aA tT tT rR } + \__unravel_scan_keyword:nT { aAtTtTrR } { \__unravel_scan_pdf_ext_toks: } } - \__unravel_scan_keyword:n { fF iI lL eE } + \__unravel_scan_keyword:n { fFiIlLeE } \__unravel_scan_pdf_ext_toks: } } @@ -3254,9 +3465,9 @@ { \__unravel_scan_int: } { 9 } % pdfxform { - \__unravel_scan_keyword:nT { aA tT tT rR } + \__unravel_scan_keyword:nT { aAtTtTrR } { \__unravel_scan_pdf_ext_toks: } - \__unravel_scan_keyword:nTF { rR eE sS oO uU rR cC eE sS } + \__unravel_scan_keyword:nTF { rReEsSoOuUrRcCeEsS } { \__unravel_scan_pdf_ext_toks: } \__unravel_scan_int: } @@ -3269,10 +3480,10 @@ { 13 } % pdfannot { \__unravel_scan_keyword:nTF - { rR eE sS eE rR vV eE oO bB jJ nN uU mM } + { rReEsSeErRvVeEoObBjJnNuUmM } { \__unravel_scan_optional_space: } { - \__unravel_scan_keyword:nT { uU sS eE oO bB jJ nN uU mM } + \__unravel_scan_keyword:nT { uUsSeEoObBjJnNuUmM } { \__unravel_scan_int: } \__unravel_scan_alt_rule: \__unravel_scan_pdf_ext_toks: @@ -3294,10 +3505,10 @@ } { 16 } % pdfoutline { - \__unravel_scan_keyword:nT { aA tT tT rR } + \__unravel_scan_keyword:nT { aAtTtTrR } { \__unravel_scan_pdf_ext_toks: } \__unravel_scan_action: - \__unravel_scan_keyword:nT { cC oO uU nN tT } + \__unravel_scan_keyword:nT { cCoOuUnNtT } { \__unravel_scan_int: } \__unravel_scan_pdf_ext_toks: } @@ -3316,7 +3527,7 @@ { 23 } % pdfcatalog { \__unravel_scan_pdf_ext_toks: - \__unravel_scan_keyword:n { oO pP eE nN aA cC tT iI oO nN } + \__unravel_scan_keyword:n { oOpPeEnNaAcCtTiIoOnN } { \__unravel_scan_action: } } { 24 } % pdfnames @@ -3396,7 +3607,7 @@ \cs_new_protected_nopar:Npn \__unravel_scan_rule_attr: { \__unravel_scan_alt_rule: - \__unravel_scan_keyword:nT { aA tT tT rR } + \__unravel_scan_keyword:nT { aAtTtTrR } { \__unravel_scan_pdf_ext_toks: } } \cs_new_protected_nopar:Npn \__unravel_scan_action: @@ -3729,7 +3940,7 @@ \__unravel_scan_keyword:nTF { aAtT } { \__unravel_scan_normal_dimen: } { - \__unravel_scan_keyword:nT { sS cC aA lL eE dD } + \__unravel_scan_keyword:nT { sScCaAlLeEdD } { \__unravel_scan_int: } } \bool_gset_false:N \g__unravel_name_in_progress_bool @@ -3788,17 +3999,41 @@ } \__unravel_prefixed_new:nn { read_to_cs } % 96 { - \__unravel_prev_input:V \l__unravel_head_tl + \__unravel_prev_input_silent:V \l__unravel_head_tl \__unravel_print_action:x { \tl_to_str:N \l__unravel_head_tl } \__unravel_scan_int: - \__unravel_scan_keyword:nF { tToO } + \__unravel_scan_to: + \__unravel_scan_r_token: + \seq_get_right:NN \g__unravel_prev_input_seq \l__unravel_tmpa_tl + \__unravel_read_to_cs_safe:fTF + { \__unravel_tl_first_int:N \l__unravel_tmpa_tl } + { \__unravel_assign_token:n { } } { - \msg_error:nn { unravel } { missing-to } - \__unravel_prev_input:n { to } + \seq_gpop_right:NN \g__unravel_prev_input_seq \l__unravel_head_tl + \__unravel_tex_fatal_error:nV { cannot-read } \l__unravel_head_tl + } + } +\prg_new_conditional:Npnn \__unravel_read_to_cs_safe:n #1 { TF } + { + \int_compare:nNnTF { \etex_interactionmode:D } > { 1 } + { \prg_return_true: } + { + \int_compare:nNnTF {#1} < { 0 } + { \prg_return_false: } + { + \int_compare:nNnTF {#1} > { 15 } + { \prg_return_false: } + { + \tex_ifeof:D #1 \exp_stop_f: + \prg_return_false: + \else: + \prg_return_true: + \fi: + } + } } - \__unravel_scan_r_token: - \__unravel_assign_token:n { } } +\cs_generate_variant:Nn \__unravel_read_to_cs_safe:nTF { f } \__unravel_prefixed_new:nn { def } % 97 { \seq_get_right:NN \g__unravel_prev_input_seq \l__unravel_tmpa_tl @@ -4081,8 +4316,8 @@ \__unravel_scan_file_name: \seq_gpop_right:NN \g__unravel_prev_input_seq \l__unravel_head_tl \tl_set:Nx \l__unravel_tmpa_tl { \tl_tail:N \l__unravel_head_tl } - \__unravel_tl_gset_input:Nno \g__unravel_tmpc_tl { } \l__unravel_tmpa_tl - \__unravel_back_input:V \g__unravel_tmpc_tl + \__unravel_file_get:nN \l__unravel_tmpa_tl \l__unravel_tmpa_tl + \__unravel_back_input:V \l__unravel_tmpa_tl \__unravel_print_action:x { \tl_to_str:N \l__unravel_head_tl } } \__unravel_new_tex_expandable:nn { cs_name } % 109 @@ -4140,7 +4375,7 @@ { 23 } \__unravel_scan_pdf_ext_toks: { 24 } { - \__unravel_scan_keyword:n { fF iI lL eE } + \__unravel_scan_keyword:n { fFiIlLeE } \__unravel_scan_pdf_ext_toks: } { 25 } \__unravel_scan_pdffiledump: @@ -4162,23 +4397,23 @@ { \__unravel_scan_int: \__unravel_scan_int: } \cs_new_protected_nopar:Npn \__unravel_scan_pdfcolorstackinit: { - \__unravel_scan_keyword:nTF { pP aA gG eE } + \__unravel_scan_keyword:nTF { pPaAgGeE } { \bool_set_true:N \l__unravel_tmpa_bool } { \bool_set_false:N \l__unravel_tmpb_bool } - \__unravel_scan_keyword:nF { dD iI rR eE cC tT } - { \__unravel_scan_keyword:n { pP aA gG eE } } + \__unravel_scan_keyword:nF { dDiIrReEcCtT } + { \__unravel_scan_keyword:n { pPaAgGeE } } \__unravel_scan_toks_to_str: } \cs_new_protected_nopar:Npn \__unravel_scan_pdffiledump: { - \__unravel_scan_keyword:nT { oO fF fF sS eE tT } \__unravel_scan_int: - \__unravel_scan_keyword:nT { lL eE nN gG tT hH } \__unravel_scan_int: + \__unravel_scan_keyword:nT { oOfFfFsSeEtT } \__unravel_scan_int: + \__unravel_scan_keyword:nT { lLeEnNgGtThH } \__unravel_scan_int: \__unravel_scan_pdf_ext_toks: } \cs_new_protected_nopar:Npn \__unravel_scan_pdfmatch: { - \__unravel_scan_keyword:n { iI cC aA sS eE } - \__unravel_scan_keyword:nT { sS uU bB cC oO uU nN tT } + \__unravel_scan_keyword:n { iIcCaAsSeE } + \__unravel_scan_keyword:nT { sSuUbBcCoOuUnNtT } { \__unravel_scan_int: } \__unravel_scan_pdf_ext_toks: \__unravel_scan_pdf_ext_toks: @@ -4621,7 +4856,7 @@ { [===== \bool_if:NT \g__unravel_number_steps_bool - { ~ Step ~ \int_use:N \g__unravel_step_int \ } + { ~ Step ~ \int_to_arabic:n { \g__unravel_step_int } ~ } =====]~ \int_compare:nNnTF { \str_count:N \g__unravel_action_text_str } @@ -4657,12 +4892,15 @@ \cs_new_protected_nopar:Npn \__unravel_print_assigned_register: { \__unravel_after_assignment: % ^^A todo: simplify - \__unravel_print_action:x + \exp_args:Nx \__unravel_print_action:x { - Set~ \exp_after:wN \token_to_str:N \l__unravel_defined_tl - \tl_if_single:NT \l__unravel_defined_tl - { ( \exp_after:wN \token_to_meaning:N \l__unravel_defined_tl ) } - = \exp_after:wN \__unravel_the:w \l__unravel_defined_tl + \exp_not:n + { + Set~ \exp_after:wN \token_to_str:N \l__unravel_defined_tl + \tl_if_single:NT \l__unravel_defined_tl + { ( \exp_after:wN \token_to_meaning:N \l__unravel_defined_tl ) } + } + = \exp_not:N \tl_to_str:n { \__unravel_the:w \l__unravel_defined_tl } } \__unravel_omit_after_assignment:w } @@ -4829,6 +5067,27 @@ } \cs_new:Npn \__unravel_prompt_all_aux:N #1 { \exp_not:n { \int_gset:Nn #1 } { \int_use:N #1 } } +\cs_new_protected:Npn \__unravel_tex_msg_new:nnn #1#2#3 + { + \cs_new_nopar:cpn { __unravel_tex_msg_error_#1: } {#2} + \cs_new_nopar:cpn { __unravel_tex_msg_help_#1: } {#3} + } +\cs_new_protected:Npn \__unravel_tex_error:nn #1#2 + { + \msg_error:nnxxx { unravel } { tex-error } + { \tl_to_str:n {#2} } + { \use:c { __unravel_tex_msg_error_#1: } } + { \use:c { __unravel_tex_msg_help_#1: } } + } +\cs_generate_variant:Nn \__unravel_tex_error:nn { nV } +\cs_new_protected:Npn \__unravel_tex_fatal_error:nn #1#2 + { + \msg_error:nnxxx { unravel } { tex-fatal } + { \tl_to_str:n {#2} } + { \use:c { __unravel_tex_msg_error_#1: } } + { \use:c { __unravel_tex_msg_help_#1: } } + } +\cs_generate_variant:Nn \__unravel_tex_fatal_error:nn { nV } \keys_define:nn { unravel/defaults } { explicit-prompt .bool_gset:N = \g__unravel_default_explicit_prompt_bool , @@ -4907,6 +5166,7 @@ \gtl_gclear:N \g__unravel_after_assignment_gtl \bool_gset_true:N \g__unravel_set_box_allowed_bool \bool_gset_false:N \g__unravel_name_in_progress_bool + \gtl_clear:N \l__unravel_after_group_gtl } \cs_new_protected_nopar:Npn \__unravel_main_loop: { @@ -4946,8 +5206,6 @@ { Missing~font~identifier.~\iow_char:N\\nullfont~inserted. } \msg_new:nnn { unravel } { missing-rparen } { Missing~right~parenthesis~inserted~for~expression. } -\msg_new:nnn { unravel } { incompatible-units } - { Mu~glue/dimen~used~as~a~normal~glue/dimen~or~vice-versa. } \msg_new:nnn { unravel } { missing-mudim } { Missing~mu~unit. } \msg_new:nnn { unravel } { missing-cs } @@ -5004,6 +5262,51 @@ { The~following~feature~is~not~implemented:~'#1'. } \msg_new:nnn { unravel } { endinput-ignored } { The~primitive~\iow_char:N\\endinput~was~ignored. } +\msg_new:nnn { unravel } { missing-something } + { Something~is~missing,~sorry! } +\msg_new:nnnn { unravel } { tex-error } + { TeX~sees~"#1"~and~throws~an~error:\\\\ \iow_indent:n {#2} } + { + \tl_if_empty:nTF {#3} + { TeX~provides~no~further~help~for~this~error. } + { TeX's~advice~is:\\\\ \iow_indent:n {#3} } + } +\msg_new:nnnn { unravel } { tex-fatal } + { TeX~sees~"#1"~and~throws~a~fatal~error:\\\\ \iow_indent:n {#2} } + { + \tl_if_empty:nTF {#3} + { TeX~provides~no~further~help~for~this~error. } + { TeX's~advice~is:\\\\ \iow_indent:n {#3} } + } +\__unravel_tex_msg_new:nnn { incompatible-mag } + { + Incompatible~magnification~ + ( \int_to_arabic:n { \__unravel_mag: } ); \\ + \ the~previous~value~will~be~retained + } + { + I~can~handle~only~one~magnification~ratio~per~job.~So~I've\\ + reverted~to~the~magnification~you~used~earlier~on~this~run. + } +\__unravel_tex_msg_new:nnn { illegal-mag } + { + Illegal~magnification~has~been~changed~to~1000~ + ( \int_to_arabic:n { \__unravel_mag: } ) + } + { The~magnification~ratio~must~be~between~1~and~32768. } +\__unravel_tex_msg_new:nnn { incompatible-units } + { Incompatible~glue~units } + { I'm~going~to~assume~that~1mu=1pt~when~they're~mixed. } +\__unravel_tex_msg_new:nnn { cannot-read } + { ***~(cannot~\iow_char:N\\read~from~terminal~in~nonstop~modes) } + { } +\__unravel_tex_msg_new:nnn { file-error } + { ***~(job~aborted,~file~error~in~nonstop~mode) } + { } +\__unravel_tex_msg_new:nnn { interwoven-preambles } + { (interwoven~alignment~preambles~are~not~allowed) } + { } +\__unravel_setup_restore: %% %% %% End of file `unravel.sty'. -- cgit v1.2.3