From c15aab665004d0395cdf322d9bcb64b36a9a3902 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 28 Dec 2018 21:32:14 +0000 Subject: unravel (28dec18) git-svn-id: svn://tug.org/texlive/trunk@49515 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/tex/latex/unravel/unravel.sty | 1002 +++++++++++++++-------- 1 file changed, 641 insertions(+), 361 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 941ccfb4109..7051a79b324 100644 --- a/Master/texmf-dist/tex/latex/unravel/unravel.sty +++ b/Master/texmf-dist/tex/latex/unravel/unravel.sty @@ -9,7 +9,7 @@ %% Do not distribute a modified version of this file. %% %% Communicate any suggestions for changing this package -%% to Bruno Le Floch (blflatex@gmail.com). +%% to Bruno Le Floch (blflatex+unravel@gmail.com). %% %% File: unravel.dtx Copyright (C) 2013, 2015, 2018 Bruno Le Floch %% @@ -147,34 +147,35 @@ } \expandafter \endgroup \__unravel_setup_latexe: \RequirePackage{expl3,xparse}[2018/02/21] -\RequirePackage{gtl}[2018/04/04] +\RequirePackage{gtl}[2018/12/28] \csname cs_if_exist:cF\endcsname{str_range:nnn}{\RequirePackage{l3str}} \csname use:n\endcsname {% \csname __unravel_setup_restore:\endcsname \ProvidesExplPackage - {unravel} {2018/04/04} {0.2e} {Watching TeX digest tokens}% + {unravel} {2018/12/28} {0.2f} {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 +\cs_new_eq:NN \__unravel_currentgrouptype: \tex_currentgrouptype:D +\cs_new_protected: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_everyeof:w \tex_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 \__unravel_number:w \tex_number:D -\cs_new_eq:NN \c__unravel_prompt_ior \c_sixteen -\cs_new_eq:NN \c__unravel_noprompt_ior \c_minus_one +\exp_after:wN \cs_new_eq:NN + \exp_after:wN \__unravel_special_relax: + \exp_not:N \__unravel_special_relax: +\int_const:Nn \c__unravel_prompt_ior { 16 } +\int_const:Nn \c__unravel_noprompt_ior { -1 } \cs_generate_variant:Nn \seq_push:Nn { Nf } \cs_generate_variant:Nn \str_head:n { f } \cs_generate_variant:Nn \tl_to_str:n { o } +\cs_generate_variant:Nn \tl_if_eq:nnTF { o } \cs_generate_variant:Nn \tl_if_head_eq_meaning:nNT { V } -\cs_generate_variant:Nn \tl_if_in:nnF { nV } -\cs_generate_variant:Nn \tl_if_in:nnTF { nV } -\cs_generate_variant:Nn \tl_if_in:NnTF { No , NV } \cs_generate_variant:Nn \tl_if_single_token:nT { V } \cs_generate_variant:Nn \gtl_gput_right:Nn { NV } \cs_generate_variant:Nn \ior_str_get:NN { Nc } @@ -186,6 +187,12 @@ \cs_generate_variant:Nn \gtl_gconcat:NNN { ccc , cNc } \cs_generate_variant:Nn \gtl_gclear:N { c } \cs_generate_variant:Nn \gtl_gclear_new:N { c } +\cs_new_protected:Npn \__unravel_tl_if_in:ooTF #1#2#3#4 + { + \group_begin: + \exp_args:Noo \tl_if_in:nnTF {#1} {#2} + { \group_end: #3 } { \group_end: #4 } + } \tl_new:N \l__unravel_exp_tl \cs_new_protected:Npn \__unravel_exp_args:Nx #1#2 { @@ -197,7 +204,7 @@ \cs_set_nopar:Npx \l__unravel_exp_tl { \exp_not:N #1 \exp_not:N #2 {#3} } \l__unravel_exp_tl } -\cs_new_protected_nopar:Npn \__unravel_tmp:w { } +\cs_new_protected:Npn \__unravel_tmp:w { } \cs_set_protected:Npn \__unravel_tmp:w #1 { \cs_new_protected:Npn \__unravel_file_get:nN ##1##2 @@ -241,7 +248,7 @@ } #1 } -\cs_new_protected_nopar:Npn \__unravel_prepare_mag: +\cs_new_protected:Npn \__unravel_prepare_mag: { \int_compare:nNnT { \g__unravel_mag_set_int } > { 0 } { @@ -258,15 +265,15 @@ } \int_gset_eq:NN \g__unravel_mag_set_int \__unravel_mag: } -\cs_new_nopar:Npn \__unravel_strip_escape:w +\cs_new:Npn \__unravel_strip_escape:w { \tex_romannumeral:D \if_charcode:w \token_to_str:N \ \__unravel_strip_escape_aux:w \fi: \__unravel_strip_escape_aux:N } -\cs_new:Npn \__unravel_strip_escape_aux:N #1 { \c_zero } +\cs_new:Npn \__unravel_strip_escape_aux:N #1 { \c_zero_int } \cs_new:Npn \__unravel_strip_escape_aux:w #1#2 - { - \__unravel_number:w #1 \c_zero } + { - \__unravel_number:w #1 \c_zero_int } \cs_new:Npn \__unravel_to_str:n #1 { \tl_if_head_eq_meaning:nNTF {#1} \scan_stop: @@ -364,6 +371,20 @@ } { \prg_return_true: } } +\group_begin: + \char_set_catcode_active:n { `Z } + \prg_new_protected_conditional:Npnn \__unravel_token_if_active_char:N #1 + { TF } + { + \group_begin: + \__unravel_exp_args:Nx \char_set_lccode:nn + { ` \exp_args:No \str_head:n { \token_to_str:N #1 } } + { ` Z } + \tex_lowercase:D { \tl_if_eq:nnTF {#1} } { Z } + { \group_end: \prg_return_true: } + { \group_end: \prg_return_false: } + } +\group_end: \group_begin: \char_set_catcode_active:n { `Z } \prg_new_protected_conditional:Npnn \__unravel_token_if_definable:N #1 @@ -375,9 +396,7 @@ { \exp_args:No \str_tail:n { \token_to_str:N #1 } } \tl_if_empty:NTF \l__unravel_tmpa_tl { - \exp_args:Nx \char_set_lccode:nn - { ` \str_head:n {#1} } { `Z } - \tex_lowercase:D { \tl_if_eq:nnTF {#1} } { Z } + \__unravel_token_if_active_char:NTF #1 { \group_end: \prg_return_true: } { \group_end: \prg_return_false: } } @@ -399,7 +418,7 @@ } { \prg_return_false: } } -\cs_new_nopar:Npn \__unravel_prev_input_count: +\cs_new:Npn \__unravel_prev_input_count: { \int_eval:n { @@ -410,19 +429,19 @@ } \cs_new:Npn \__unravel_prev_input_count_aux:n #1 { \tl_if_empty:nF {#1} { + 1 } } -\cs_new_protected_nopar:Npn \__unravel_prev_input_get:N +\cs_new_protected:Npn \__unravel_prev_input_get:N { \seq_get_right:NN \g__unravel_prev_input_seq } -\cs_new_protected_nopar:Npn \__unravel_prev_input_gpush: +\cs_new_protected:Npn \__unravel_prev_input_gpush: { \seq_gput_right:Nn \g__unravel_prev_input_seq { } } -\cs_new_protected_nopar:Npn \__unravel_prev_input_gpush:N +\cs_new_protected:Npn \__unravel_prev_input_gpush:N { \seq_gput_right:NV \g__unravel_prev_input_seq } -\cs_new_protected_nopar:Npn \__unravel_prev_input_gpop:N +\cs_new_protected:Npn \__unravel_prev_input_gpop:N { \seq_gpop_right:NN \g__unravel_prev_input_seq } -\cs_new_protected_nopar:Npn \__unravel_prev_input_gpush_gtl: +\cs_new_protected:Npn \__unravel_prev_input_gpush_gtl: { \seq_gput_right:NV \g__unravel_prev_input_seq \c_empty_gtl } -\cs_new_protected_nopar:Npn \__unravel_prev_input_gpush_gtl:N +\cs_new_protected:Npn \__unravel_prev_input_gpush_gtl:N { \seq_gput_right:NV \g__unravel_prev_input_seq } -\cs_new_protected_nopar:Npn \__unravel_prev_input_gpop_gtl:N +\cs_new_protected:Npn \__unravel_prev_input_gpop_gtl:N { \seq_gpop_right:NN \g__unravel_prev_input_seq } \cs_new_protected:Npn \__unravel_prev_input_silent:n #1 { @@ -451,8 +470,8 @@ { \int_case:nnF {#1} { - { 2 } { \__unravel_join_get_aux:NNN \skip_eval:n \etex_glueexpr:D } - { 3 } { \__unravel_join_get_aux:NNN \muskip_eval:n \etex_muexpr:D } + { 2 } { \__unravel_join_get_aux:NNN \skip_eval:n \tex_glueexpr:D } + { 3 } { \__unravel_join_get_aux:NNN \muskip_eval:n \tex_muexpr:D } } { \__unravel_error:nnnnn { internal } { join-factor } { } { } { } @@ -469,17 +488,27 @@ \tl_new:N \g__unravel_before_prompt_tl \int_new:N \l__unravel_prompt_tmpa_int \int_new:N \g__unravel_nonstop_int -\int_new:N \g__unravel_noise_int -\int_gset_eq:NN \g__unravel_noise_int \c_one \bool_new:N \g__unravel_default_explicit_prompt_bool \bool_new:N \g__unravel_default_internal_debug_bool \bool_new:N \g__unravel_default_number_steps_bool -\bool_gset_true:N \g__unravel_default_number_steps_bool +\int_new:N \g__unravel_default_online_int +\bool_new:N \g__unravel_default_trace_assigns_bool +\bool_new:N \g__unravel_default_trace_expansion_bool +\bool_new:N \g__unravel_default_trace_other_bool \bool_new:N \g__unravel_default_welcome_message_bool +\bool_gset_true:N \g__unravel_default_number_steps_bool +\int_gset:Nn \g__unravel_default_online_int { 1 } +\bool_gset_true:N \g__unravel_default_trace_assigns_bool +\bool_gset_true:N \g__unravel_default_trace_expansion_bool +\bool_gset_true:N \g__unravel_default_trace_other_bool \bool_gset_true:N \g__unravel_default_welcome_message_bool \bool_new:N \g__unravel_explicit_prompt_bool \bool_new:N \g__unravel_internal_debug_bool \bool_new:N \g__unravel_number_steps_bool +\int_new:N \g__unravel_online_int +\bool_new:N \g__unravel_trace_assigns_bool +\bool_new:N \g__unravel_trace_expansion_bool +\bool_new:N \g__unravel_trace_other_bool \bool_new:N \g__unravel_welcome_message_bool \int_new:N \g__unravel_step_int \str_new:N \g__unravel_action_text_str @@ -508,11 +537,14 @@ \int_new:N \l__unravel_head_cmd_int \int_new:N \l__unravel_head_char_int \tl_new:N \l__unravel_head_meaning_tl +\tl_new:N \l__unravel_argi_tl +\tl_new:N \l__unravel_argii_tl \tl_new:N \l__unravel_tmpa_tl \gtl_new:N \l__unravel_unused_gtl \gtl_new:N \l__unravel_tmpb_gtl \tl_new:N \g__unravel_tmpc_tl \seq_new:N \l__unravel_tmpa_seq +\cs_new_eq:NN \l__unravel_tmpb_token ? \tl_new:N \l__unravel_defined_tl \tl_new:N \l__unravel_defining_tl \cs_new_eq:NN \__unravel_inaccessible:w ? @@ -557,7 +589,7 @@ } \cs_new_protected:Npn \__unravel_new_tex_cmd:nn #1#2 { - \cs_new_protected_nopar:cpn + \cs_new_protected:cpn { __unravel_cmd_ \__unravel_tex_use:n {#1} : } {#2} } \cs_new_protected:Npn \__unravel_new_eq_tex_cmd:nn #1#2 @@ -568,7 +600,7 @@ } \cs_new_protected:Npn \__unravel_new_tex_expandable:nn #1#2 { - \cs_new_protected_nopar:cpn + \cs_new_protected:cpn { __unravel_expandable_ \__unravel_tex_use:n {#1} : } {#2} } \__unravel_tex_const:nn { relax } { 0 } @@ -692,6 +724,12 @@ \__unravel_tex_const:nn { top_bot_mark } { 112 } \__unravel_tex_const:nn { call } { 113 } \__unravel_tex_const:nn { end_template } { 117 } +\sys_if_engine_luatex:T + { + \__unravel_tex_primitive:nnn + { \exp_after:wN \use_none:n \token_to_meaning:N \__unravel_special_relax: } + { relax } { 1 } + } \__unravel_tex_primitive:nnn { relax } { relax } { 256 } \__unravel_tex_primitive:nnn { span } { tab_mark } { 256 } \__unravel_tex_primitive:nnn { cr } { car_ret } { 257 } @@ -1200,7 +1238,8 @@ \__unravel_tex_primitive:nnn { pdfescapename } { convert } { 14 } \__unravel_tex_primitive:nnn { leftmarginkern } { convert } { 15 } \__unravel_tex_primitive:nnn { rightmarginkern } { convert } { 16 } -\__unravel_tex_primitive:nnn { pdfstrcmp } { convert } { 17 } +\__unravel_tex_primitive:nnn + { \sys_if_engine_xetex:F { pdf } strcmp } { convert } { 17 } \__unravel_tex_primitive:nnn { pdfcolorstackinit } { convert } { 18 } \__unravel_tex_primitive:nnn { pdfescapehex } { convert } { 19 } \__unravel_tex_primitive:nnn { pdfunescapehex } { convert } { 20 } @@ -1216,6 +1255,16 @@ \__unravel_tex_primitive:nnn { pdfinsertht } { convert } { 30 } \__unravel_tex_primitive:nnn { pdfximagebbox } { convert } { 31 } \__unravel_tex_primitive:nnn { jobname } { convert } { 32 } +\sys_if_engine_luatex:T + { + \__unravel_tex_primitive:nnn { directlua } { convert } { 33 } + \__unravel_tex_primitive:nnn { expanded } { convert } { 34 } + \__unravel_tex_primitive:nnn { luaescapestring } { convert } { 35 } + } +\sys_if_engine_xetex:T + { + \__unravel_tex_primitive:nnn { Ucharcat } { convert } { 40 } + } \__unravel_tex_primitive:nnn { the } { the } { 0 } \__unravel_tex_primitive:nnn { unexpanded } { the } { 1 } \__unravel_tex_primitive:nnn { detokenize } { the } { 5 } @@ -1229,7 +1278,7 @@ \__unravel_tex_primitive:nnn { botmarks } { top_bot_mark } { 7 } \__unravel_tex_primitive:nnn { splitfirstmarks } { top_bot_mark } { 8 } \__unravel_tex_primitive:nnn { splitbotmarks } { top_bot_mark } { 9 } -\cs_new_protected_nopar:Npn \__unravel_get_next: +\cs_new_protected:Npn \__unravel_get_next: { \__unravel_input_if_empty:TF { \__unravel_exit:w } @@ -1240,18 +1289,81 @@ { \tl_set:Nx \l__unravel_head_tl { \gtl_head:N \l__unravel_head_gtl } + \token_if_eq_meaning:NNT + \l__unravel_head_token \__unravel_special_relax: + \__unravel_get_next_notexpanded: } { \tl_clear:N \l__unravel_head_tl } } } -\cs_new_protected_nopar:Npn \__unravel_get_next_aux:w +\cs_new_protected:Npn \__unravel_get_next_aux:w { \cs_set_eq:NN \l__unravel_head_token } -\cs_new_protected_nopar:Npn \__unravel_get_token: +\cs_set_protected:Npn \__unravel_tmp:w #1 + { + \cs_new_protected:Npn \__unravel_get_next_notexpanded: + { + \tl_if_eq:onTF { \l__unravel_head_tl } { \__unravel_unravel_marker: } + { \__unravel_get_next_marker: } + { + \__unravel_exp_args:NNx \use:nn \__unravel_notexpanded_test:w + { \scan_stop: \exp_after:wN \cs_to_str:N \l__unravel_head_tl Z } + \q_mark \__unravel_notexpanded_expand:n + #1 Z \q_mark \use_none:n + \q_stop + } + } + \cs_new_protected:Npn \__unravel_notexpanded_test:w + ##1 #1 ##2 Z \q_mark ##3##4 \q_stop + { ##3 {##2} } + } +\exp_args:Nx \__unravel_tmp:w { \scan_stop: \tl_to_str:n { notexpanded: } } +\group_begin: + \char_set_catcode_active:n { 0 } + \cs_new_protected:Npn \__unravel_notexpanded_expand:n #1 + { + \__unravel_exp_args:Nx \tl_if_empty:nTF { \str_tail:n {#1} } + { + \group_begin: + \char_set_lccode:nn { 0 } { `#1 } + \tex_lowercase:D + { + \group_end: + \__unravel_notexpanded_expand:N ^^@ + } + } + { + \group_begin: \exp_args:NNc \group_end: + \__unravel_notexpanded_expand:N { \use_none:n #1 } + } + } +\group_end: +\cs_new_protected:Npn \__unravel_notexpanded_expand:N #1 + { + \gtl_set:Nn \l__unravel_head_gtl {#1} + \tl_set:Nn \l__unravel_head_tl {#1} + \cs_set_eq:NN \l__unravel_head_token \__unravel_special_relax: + } +\cs_new_protected:Npn \__unravel_get_next_marker: + { + \__unravel_get_next: + \tl_if_eq:onTF \l__unravel_head_tl { \__unravel:nn } + { \__unravel_error:nxxxx { nested-unravel } { } { } { } { } } + { \__unravel_error:nxxxx { internal } { marker~unknown } { } { } { } } + \__unravel_input_gpop_item:NF \l__unravel_argi_tl + { \__unravel_error:nxxxx { internal } { marker~1 } { } { } { } } + \__unravel_input_gpop_item:NF \l__unravel_argii_tl + { \__unravel_error:nxxxx { internal } { marker~2 } { } { } { } } + \exp_args:Nno \keys_set:nn { unravel } \l__unravel_argi_tl + \__unravel_exp_args:Nx \__unravel_back_input:n + { \exp_not:N \exp_not:n { \exp_not:o \l__unravel_argii_tl } } + \__unravel_get_next: + } +\cs_new_protected:Npn \__unravel_get_token: { \__unravel_get_next: \__unravel_set_cmd: } -\cs_new_protected_nopar:Npn \__unravel_set_cmd: +\cs_new_protected:Npn \__unravel_set_cmd: { \__unravel_set_cmd_aux_meaning: \__unravel_set_cmd_aux_primitive:oTF { \l__unravel_head_meaning_tl } @@ -1270,7 +1382,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_set_cmd_aux_meaning: +\cs_new_protected:Npn \__unravel_set_cmd_aux_meaning: { \tl_set:Nx \l__unravel_head_meaning_tl { @@ -1304,21 +1416,21 @@ \int_set:Nn \l__unravel_head_cmd_int {#1} \int_set:Nn \l__unravel_head_char_int {#2} } -\cs_new_protected_nopar:Npn \__unravel_set_cmd_aux_macro: +\cs_new_protected:Npn \__unravel_set_cmd_aux_macro: { \int_set:Nn \l__unravel_head_cmd_int { \__unravel_tex_use:n { call } } \int_zero:N \l__unravel_head_char_int } -\cs_new_protected_nopar:Npn \__unravel_set_cmd_aux_unknown: +\cs_new_protected:Npn \__unravel_set_cmd_aux_unknown: { \exp_last_unbraced:NV \__unravel_set_cmd_aux_primitive:nn \c__unravel_tex_relax_tl \__unravel_error:nxxxx { unknown-primitive } { \l__unravel_head_meaning_tl } { } { } { } } -\cs_new_protected_nopar:Npn \__unravel_set_cmd_aux_cs: +\cs_new_protected:Npn \__unravel_set_cmd_aux_cs: { - \tl_if_in:NoTF \l__unravel_head_meaning_tl + \__unravel_tl_if_in:ooTF \l__unravel_head_meaning_tl { \tl_to_str:n { elect~font } } { \exp_last_unbraced:NV \__unravel_set_cmd_aux_primitive:nn @@ -1326,7 +1438,7 @@ } { \__unravel_set_cmd_aux_numeric: } } -\cs_new_protected_nopar:Npn \__unravel_set_cmd_aux_numeric: +\cs_new_protected:Npn \__unravel_set_cmd_aux_numeric: { \tl_set:Nx \l__unravel_tmpa_tl { @@ -1349,6 +1461,7 @@ \str_case:nnF {#1} { { char } { \__unravel_set_cmd_aux_given:n { char_given } } + { kchar } { \__unravel_set_cmd_aux_given:n { char_given } } { mathchar } { \__unravel_set_cmd_aux_given:n { math_given } } } { @@ -1364,7 +1477,7 @@ \int_set:Nn \l__unravel_head_cmd_int { \__unravel_tex_use:n {#1} } \int_zero:N \l__unravel_head_char_int } -\cs_new_protected_nopar:Npn \__unravel_set_cmd_aux_char: +\cs_new_protected:Npn \__unravel_set_cmd_aux_char: { \tl_set:Nx \l__unravel_head_meaning_tl { \token_to_meaning:N \l__unravel_head_token } @@ -1380,7 +1493,7 @@ \int_set:Nn \l__unravel_head_cmd_int { \__unravel_tex_use:n { #1_char } } } -\cs_new_nopar:Npn \__unravel_input_to_str: +\cs_new:Npn \__unravel_input_to_str: { \int_step_function:nnnN \g__unravel_input_int { -1 } { 1 } \__unravel_input_to_str_aux:n @@ -1389,7 +1502,7 @@ { \gtl_to_str:c { g__unravel_input_#1_gtl } } \cs_new_protected:Npn \__unravel_input_if_empty:TF { - \int_compare:nNnTF \g__unravel_input_int = \c_zero + \int_compare:nNnTF \g__unravel_input_int = 0 { \use_i:nn } { \gtl_if_empty:cTF @@ -1404,9 +1517,9 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_input_split: +\cs_new_protected:Npn \__unravel_input_split: { - \int_compare:nNnT \g__unravel_input_int = \c_one + \int_compare:nNnT \g__unravel_input_int = 1 { \exp_args:Nc \__unravel_input_split_aux:N { g__unravel_input_1_gtl } @@ -1441,7 +1554,7 @@ \l__unravel_input_tmpa_tl \__unravel_input_split_end: } } -\cs_new_nopar:Npn \__unravel_input_split_end: { } +\cs_new:Npn \__unravel_input_split_end: { } \cs_new_protected:Npn \__unravel_input_split_auxiii:w #1 \__unravel_input_split_end: { @@ -1451,7 +1564,7 @@ { g__unravel_input_ \int_use:N \g__unravel_input_tmpa_int _gtl } {#1} \int_gdecr:N \g__unravel_input_tmpa_int } -\cs_new_protected_nopar:Npn \__unravel_input_gset:n +\cs_new_protected:Npn \__unravel_input_gset:n { \int_gzero:N \g__unravel_input_int \__unravel_back_input:n @@ -1474,7 +1587,7 @@ { g__unravel_input_ \int_use:N \g__unravel_input_int _gtl } #1 } } -\cs_new_protected_nopar:Npn \__unravel_input_merge: +\cs_new_protected:Npn \__unravel_input_merge: { \int_gdecr:N \g__unravel_input_int \gtl_gconcat:ccc @@ -1486,7 +1599,7 @@ } \prg_new_protected_conditional:Npnn \__unravel_input_gpop_item:N #1 { F } { - \int_compare:nNnTF \g__unravel_input_int = \c_zero + \int_compare:nNnTF \g__unravel_input_int = 0 { \prg_return_false: } { \exp_args:Nc \__unravel_input_gpop_item_aux:NN @@ -1498,10 +1611,10 @@ \gtl_gpop_left_item:NNTF #1#2 { \prg_return_true: } { - \int_compare:nNnTF { \gtl_extra_end:N #1 } > \c_zero + \int_compare:nNnTF { \gtl_extra_end:N #1 } > 0 { \prg_return_false: } { - \int_compare:nNnTF \g__unravel_input_int = \c_one + \int_compare:nNnTF \g__unravel_input_int = 1 { \prg_return_false: } { \__unravel_input_merge: @@ -1519,7 +1632,7 @@ { \tl_clear:N #1 \__unravel_input_gpop_tl_aux:N #1 } \cs_new_protected:Npn \__unravel_input_gpop_tl_aux:N #1 { - \int_compare:nNnF \g__unravel_input_int = \c_zero + \int_compare:nNnF \g__unravel_input_int = 0 { \exp_args:Nc \__unravel_input_gpop_tl_aux:NN { g__unravel_input_ \int_use:N \g__unravel_input_int _gtl } #1 @@ -1535,8 +1648,8 @@ \__unravel_input_gpop_tl_aux:N #2 } { - \int_compare:nNnTF \g__unravel_input_int > \c_one - { \int_compare:nNnTF { \gtl_extra_end:N #1 } > \c_zero } + \int_compare:nNnTF \g__unravel_input_int > 1 + { \int_compare:nNnTF { \gtl_extra_end:N #1 } > 0 } { \use_i:nn } { \tl_put_right:Nx #2 { \gtl_left_tl:N #1 } @@ -1548,7 +1661,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_back_input:n +\cs_new_protected:Npn \__unravel_back_input:n { \int_gincr:N \g__unravel_input_int \gtl_gclear_new:c { g__unravel_input_ \int_use:N \g__unravel_input_int _gtl } @@ -1568,24 +1681,24 @@ { g__unravel_input_ \int_use:N \g__unravel_input_int _gtl } } } -\cs_new_protected_nopar:Npn \__unravel_back_input: +\cs_new_protected:Npn \__unravel_back_input: { \__unravel_back_input_gtl:N \l__unravel_head_gtl } -\cs_new_protected_nopar:Npn \__unravel_back_input_tl_o: +\cs_new_protected:Npn \__unravel_back_input_tl_o: { \tl_set:Nx \l__unravel_tmpa_tl { \exp_args:NV \exp_not:o \l__unravel_head_tl } \__unravel_back_input:V \l__unravel_tmpa_tl - \__unravel_print_done:x + \__unravel_print_expansion:x { \tl_to_str:N \l__unravel_head_tl = \tl_to_str:N \l__unravel_tmpa_tl } } -\cs_new_protected_nopar:Npn \__unravel_insert_relax: +\cs_new_protected:Npn \__unravel_insert_relax: { \__unravel_back_input: \gtl_set_eq:NN \l__unravel_head_gtl \c__unravel_frozen_relax_gtl \__unravel_back_input: \__unravel_print_action: } -\cs_new_protected_nopar:Npn \__unravel_insert_group_begin_error: +\cs_new_protected:Npn \__unravel_insert_group_begin_error: { \tl_set_eq:NN \l__unravel_tmpa_tl \l__unravel_head_tl \__unravel_back_input: @@ -1594,7 +1707,7 @@ \__unravel_tex_error:nV { missing-lbrace } \l__unravel_tmpa_tl \__unravel_print_action: } -\cs_new_protected_nopar:Npn \__unravel_insert_dollar_error: +\cs_new_protected:Npn \__unravel_insert_dollar_error: { \__unravel_back_input: \__unravel_back_input:n { $ } % $ @@ -1621,25 +1734,25 @@ { \__unravel_macro_split_do:NN #1 \use_ii:nnn } \cs_new:Npn \__unravel_macro_replacement:N #1 { \__unravel_macro_split_do:NN #1 \use_iii:nnn } -\cs_new_protected_nopar:Npn \__unravel_macro_call: +\cs_new_protected:Npn \__unravel_macro_call: { \bool_if:NTF \g__unravel_speedup_macros_bool { \tl_set:Nx \l__unravel_tmpa_tl {^ \exp_after:wN \__unravel_macro_parameter:N \l__unravel_head_tl } - \tl_if_in:NVTF \c__unravel_parameters_tl \l__unravel_tmpa_tl + \__unravel_tl_if_in:ooTF \c__unravel_parameters_tl \l__unravel_tmpa_tl { \__unravel_macro_call_quick: } { \__unravel_macro_call_safe: } } { \__unravel_macro_call_safe: } \exp_args:NV \__unravel_back_input:o \l__unravel_head_tl - \__unravel_print_done:x { \g__unravel_action_text_str } + \__unravel_print_expansion: } -\cs_new_protected_nopar:Npn \__unravel_macro_call_safe: +\cs_new_protected:Npn \__unravel_macro_call_safe: { \__unravel_input_gpop_tl:N \l__unravel_tmpa_tl \tl_put_right:NV \l__unravel_head_tl \l__unravel_tmpa_tl } -\cs_new_protected_nopar:Npn \__unravel_macro_call_quick: +\cs_new_protected:Npn \__unravel_macro_call_quick: { \exp_after:wN \__unravel_macro_call_quick_loop:NNN \l__unravel_tmpa_tl { ? \use_none_delimit_by_q_stop:w } \q_stop @@ -1659,7 +1772,7 @@ \__unravel_error:nxxxx { runaway-macro-parameter } { \tl_to_str:N \l__unravel_head_tl } { \tl_to_str:n {#1} } { } { } } -\cs_new_protected_nopar:Npn \__unravel_expand: +\cs_new_protected:Npn \__unravel_expand_do:N { \__unravel_set_action_text: \bool_if:NT \g__unravel_internal_debug_bool @@ -1671,7 +1784,7 @@ { \__unravel_macro_call: } { \__unravel_expand_nonmacro: } } -\cs_new_protected_nopar:Npn \__unravel_expand_nonmacro: +\cs_new_protected:Npn \__unravel_expand_nonmacro: { \__unravel_set_cmd_aux_meaning: \__unravel_set_cmd_aux_primitive:oTF { \l__unravel_head_meaning_tl } @@ -1683,51 +1796,63 @@ { \__unravel_error:nxxxx { unknown-primitive } { \l__unravel_head_meaning_tl } { } { } { } - \gtl_gput_right:NV \g__unravel_output_gtl \l__unravel_head_tl - \__unravel_print_action: + \__unravel_input_gpop_tl:N \l__unravel_tmpa_tl + \tl_put_right:NV \l__unravel_head_tl \l__unravel_tmpa_tl + \exp_args:NV \__unravel_back_input:o \l__unravel_head_tl + \__unravel_print_expansion: } } -\cs_new_protected_nopar:Npn \__unravel_get_x_next: +\cs_new_protected:Npn \__unravel_get_x_next: { \__unravel_get_next: \__unravel_token_if_expandable:NT \l__unravel_head_token - { - \__unravel_expand: - \__unravel_get_x_next: - } + { \__unravel_expand_do:N \__unravel_get_x_next: } } -\cs_new_protected_nopar:Npn \__unravel_get_x_or_protected: +\cs_new_protected:Npn \__unravel_get_x_or_protected: { \__unravel_get_next: \__unravel_token_if_protected:NF \l__unravel_head_token - { - \__unravel_expand: - \__unravel_get_x_or_protected: - } + { \__unravel_expand_do:N \__unravel_get_x_or_protected: } + } +\cs_new_protected:Npn \__unravel_get_token_xdef: + { + \__unravel_get_next: + \__unravel_token_if_protected:NF \l__unravel_head_token + { \__unravel_expand_do:N \__unravel_get_token_xdef: } + } +\cs_new_protected:Npn \__unravel_get_token_x: + { + \__unravel_get_next: + \__unravel_token_if_protected:NF \l__unravel_head_token + { \__unravel_expand_do:N \__unravel_get_token_x: } } -\cs_new_protected_nopar:Npn \__unravel_get_x_non_blank: +\cs_new_protected:Npn \__unravel_get_x_non_blank: { \__unravel_get_x_next: \token_if_eq_catcode:NNT \l__unravel_head_token \c_space_token { \__unravel_get_x_non_blank: } } -\cs_new_protected_nopar:Npn \__unravel_get_x_non_relax: +\cs_new_protected:Npn \__unravel_get_x_non_relax: { \__unravel_get_x_next: - \token_if_eq_meaning:NNT \l__unravel_head_token \scan_stop: + \token_if_eq_meaning:NNTF \l__unravel_head_token \scan_stop: { \__unravel_get_x_non_relax: } { - \token_if_eq_catcode:NNT \l__unravel_head_token \c_space_token + \token_if_eq_meaning:NNTF \l__unravel_head_token \__unravel_special_relax: { \__unravel_get_x_non_relax: } + { + \token_if_eq_catcode:NNT \l__unravel_head_token \c_space_token + { \__unravel_get_x_non_relax: } + } } } -\cs_new_protected_nopar:Npn \__unravel_skip_optional_space: +\cs_new_protected:Npn \__unravel_skip_optional_space: { \__unravel_get_x_next: \token_if_eq_catcode:NNF \l__unravel_head_token \c_space_token { \__unravel_back_input: } } -\cs_new_protected_nopar:Npn \__unravel_scan_optional_equals: +\cs_new_protected:Npn \__unravel_scan_optional_equals: { \__unravel_get_x_non_blank: \tl_if_eq:NNTF \l__unravel_head_tl \c__unravel_eq_tl @@ -1737,7 +1862,7 @@ \__unravel_back_input: } } -\cs_new_protected_nopar:Npn \__unravel_scan_left_brace: +\cs_new_protected:Npn \__unravel_scan_left_brace: { \__unravel_get_x_non_relax: \token_if_eq_catcode:NNF \l__unravel_head_token \c_group_begin_token @@ -1781,24 +1906,24 @@ \__unravel_gtl_if_head_is_definable:NTF \l__unravel_head_gtl { \prg_return_false: } { - \str_if_eq_x:nnTF + \str_if_eq:eeTF { \str_head:f { \gtl_to_str:N \l__unravel_head_gtl } } {#1} { \prg_return_true: } { - \str_if_eq_x:nnTF + \str_if_eq:eeTF { \str_head:f { \gtl_to_str:N \l__unravel_head_gtl } } {#2} { \prg_return_true: } { \prg_return_false: } } } } -\cs_new_protected_nopar:Npn \__unravel_scan_keyword_true: +\cs_new_protected:Npn \__unravel_scan_keyword_true: { \__unravel_prev_input_gpop_gtl:N \l__unravel_tmpb_gtl \__unravel_prev_input:x { \gtl_to_str:N \l__unravel_tmpb_gtl } \prg_return_true: } -\cs_new_protected_nopar:Npn \__unravel_scan_keyword_false:w +\cs_new_protected:Npn \__unravel_scan_keyword_false:w #1 \q_recursion_stop { \__unravel_back_input: @@ -1806,7 +1931,7 @@ \__unravel_back_input_gtl:N \l__unravel_tmpb_gtl \prg_return_false: } -\cs_new_protected_nopar:Npn \__unravel_scan_to: +\cs_new_protected:Npn \__unravel_scan_to: { \__unravel_scan_keyword:nF { tToO } { @@ -1814,7 +1939,7 @@ \__unravel_prev_input:n { to } } } -\cs_new_protected_nopar:Npn \__unravel_scan_font_ident: +\cs_new_protected:Npn \__unravel_scan_font_ident: { \__unravel_get_x_non_blank: \__unravel_set_cmd: @@ -1840,7 +1965,7 @@ \__unravel_prev_input:n { \__unravel_nullfont: } } } -\cs_new_protected_nopar:Npn \__unravel_scan_font_int: +\cs_new_protected:Npn \__unravel_scan_font_int: { \int_case:nnF \l__unravel_head_char_int { @@ -1850,7 +1975,7 @@ } { \__unravel_scan_font_ident: \__unravel_scan_int: } } -\cs_new_protected_nopar:Npn \__unravel_scan_font_dimen: +\cs_new_protected:Npn \__unravel_scan_font_dimen: { \__unravel_scan_int: \__unravel_scan_font_ident: @@ -1876,7 +2001,7 @@ \int_compare:nNnT {#1} = { 8 } { \__unravel_tex_error:nV { the-cannot } \l__unravel_head_tl - \__unravel_scan_something_internal_auxii:Vn \c_zero { 0 } + \__unravel_scan_something_internal_auxii:nn 0 { 0 } \__unravel_break:w } \tl_if_empty:nF {#2} @@ -1902,7 +2027,7 @@ \int_gset:Nn \g__unravel_val_level_int {#2} } \cs_generate_variant:Nn \__unravel_scan_something_internal_auxii:nn { V } -\cs_new_nopar:Npn \__unravel_thing_case: +\cs_new:Npn \__unravel_thing_case: { \int_case:nnF \l__unravel_head_cmd_int { @@ -1933,9 +2058,9 @@ } { 8 } } -\cs_new_nopar:Npn \__unravel_thing_set_aux: +\cs_new:Npn \__unravel_thing_set_aux: { \int_compare:nNnTF \l__unravel_head_char_int = { 1 } { 1 } { 0 } } -\cs_new_nopar:Npn \__unravel_thing_last_item: +\cs_new:Npn \__unravel_thing_last_item: { \int_compare:nNnTF \l__unravel_head_char_int < { 26 } { @@ -1978,15 +2103,15 @@ { } } } -\cs_new_nopar:Npn \__unravel_thing_register: +\cs_new:Npn \__unravel_thing_register: { \int_eval:n { \l__unravel_head_char_int / 1 000 000 - 1 } - \int_compare:nNnT { \tl_tail:V \l__unravel_head_char_int } = \c_zero + \int_compare:nNnT { \tl_tail:V \l__unravel_head_char_int } = 0 { \__unravel_scan_int: } } \cs_new_protected:Npn \__unravel_scan_toks_register: { - \int_compare:nNnT \l__unravel_head_char_int = \c_zero + \int_compare:nNnT \l__unravel_head_char_int = 0 { \__unravel_scan_int: } } \cs_new_protected:Npn \__unravel_thing_use_get:nnNN #1#2#3#4 @@ -2003,7 +2128,7 @@ { 1 } \dim_eval:n { 2 } \skip_eval:n } - { \int_compare:nNnT {#1} = { 3 } \etex_mutoglue:D #3 } + { \int_compare:nNnT {#1} = { 3 } \tex_mutoglue:D #3 } } } { @@ -2014,7 +2139,7 @@ } { \__unravel_tex_error:nV { incompatible-units } #3 - \tl_set:Nx #4 { \muskip_eval:n { \etex_gluetomu:D #3 } } + \tl_set:Nx #4 { \muskip_eval:n { \tex_gluetomu:D #3 } } } } } @@ -2087,7 +2212,7 @@ #1 } } -\cs_new_protected_nopar:Npn \__unravel_scan_signs: +\cs_new_protected:Npn \__unravel_scan_signs: { \__unravel_get_x_non_blank: \tl_if_eq:NNTF \l__unravel_head_tl \c__unravel_plus_tl @@ -2103,7 +2228,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_scan_int: +\cs_new_protected:Npn \__unravel_scan_int: { \__unravel_scan_signs: \__unravel_set_cmd: @@ -2111,7 +2236,7 @@ { \__unravel_scan_something_internal:n { 0 } } { \__unravel_scan_int_char: } } -\cs_new_protected_nopar:Npn \__unravel_scan_int_char: +\cs_new_protected:Npn \__unravel_scan_int_char: { \tl_case:NnF \l__unravel_head_tl { @@ -2131,7 +2256,7 @@ } { \__unravel_scan_int_explicit:Nn \c_false_bool { } } } -\cs_new_protected_nopar:Npn \__unravel_scan_int_lq: +\cs_new_protected:Npn \__unravel_scan_int_lq: { \__unravel_get_next: \__unravel_gtl_if_head_is_definable:NF \l__unravel_head_gtl @@ -2148,7 +2273,7 @@ } \cs_new_protected:Npn \__unravel_scan_int_explicit:Nn #1#2 { - \if_int_compare:w \c_one + \if_int_compare:w 1 < #2 1 \exp_after:wN \exp_not:N \l__unravel_head_tl \exp_stop_f: \exp_after:wN \use_i:nn \else: @@ -2169,7 +2294,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_scan_normal_dimen: +\cs_new_protected:Npn \__unravel_scan_normal_dimen: { \__unravel_scan_dimen:nN { 2 } \c_false_bool } \cs_new_protected:Npn \__unravel_scan_dimen:nN #1#2 { @@ -2198,7 +2323,7 @@ \__unravel_scan_decimal_loop: } { - \tl_if_in:nVTF { 0123456789 } \l__unravel_head_tl + \__unravel_tl_if_in:ooTF { 0123456789 } \l__unravel_head_tl { \__unravel_back_input: \__unravel_scan_int: @@ -2266,14 +2391,14 @@ \__unravel_prev_input:n { pt } \__unravel_break_point: } -\cs_new_protected_nopar:Npn \__unravel_scan_inf_unit_loop: +\cs_new_protected:Npn \__unravel_scan_inf_unit_loop: { \__unravel_scan_keyword:nT { lL } { \__unravel_scan_inf_unit_loop: } } -\cs_new_protected_nopar:Npn \__unravel_scan_decimal_loop: +\cs_new_protected:Npn \__unravel_scan_decimal_loop: { \__unravel_get_x_next: \tl_if_empty:NTF \l__unravel_head_tl { \use_ii:nn } - { \tl_if_in:nVTF { 0123456789 } \l__unravel_head_tl } + { \__unravel_tl_if_in:ooTF { 0123456789 } \l__unravel_head_tl } { \__unravel_prev_input:V \l__unravel_head_tl \__unravel_scan_decimal_loop: @@ -2284,9 +2409,9 @@ \__unravel_prev_input_silent:n { ~ } } } -\cs_new_protected_nopar:Npn \__unravel_scan_normal_glue: +\cs_new_protected:Npn \__unravel_scan_normal_glue: { \__unravel_scan_glue:n { 2 } } -\cs_new_protected_nopar:Npn \__unravel_scan_mu_glue: +\cs_new_protected:Npn \__unravel_scan_mu_glue: { \__unravel_scan_glue:n { 3 } } \cs_new_protected:Npn \__unravel_scan_glue:n #1 { @@ -2316,7 +2441,7 @@ \__unravel_prev_input_join_get:nN {#1} \l__unravel_tmpa_tl \__unravel_prev_input_silent:V \l__unravel_tmpa_tl } -\cs_new_protected_nopar:Npn \__unravel_scan_file_name: +\cs_new_protected:Npn \__unravel_scan_file_name: { \bool_gset_true:N \g__unravel_name_in_progress_bool \__unravel_get_x_non_blank: @@ -2324,7 +2449,7 @@ \bool_gset_false:N \g__unravel_name_in_progress_bool \__unravel_prev_input_silent:n { ~ } } -\cs_new_protected_nopar:Npn \__unravel_scan_file_name_loop: +\cs_new_protected:Npn \__unravel_scan_file_name_loop: { \__unravel_gtl_if_head_is_definable:NTF \l__unravel_head_gtl { \__unravel_back_input: } @@ -2339,7 +2464,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_scan_r_token: +\cs_new_protected:Npn \__unravel_scan_r_token: { \bool_do_while:nn { \tl_if_eq_p:NN \l__unravel_head_tl \c_space_tl } @@ -2361,6 +2486,14 @@ \__unravel_prev_input_silent:x { { \exp_after:wN \tl_to_str:n \l__unravel_tmpa_tl } } } +\cs_new_protected:Npn \__unravel_scan_pdf_ext_toks: + { + \__unravel_prev_input_gpush: + \__unravel_scan_toks:NN \c_false_bool \c_true_bool + \__unravel_prev_input_gpop:N \l__unravel_tmpa_tl + \__unravel_prev_input_silent:x + { { \exp_not:N \exp_not:n \exp_not:V \l__unravel_tmpa_tl } } + } \cs_new_protected:Npn \__unravel_scan_toks:NN #1#2 { \bool_if:NT #1 { \__unravel_scan_param: } @@ -2369,14 +2502,14 @@ { \__unravel_scan_group_x:N #1 } { \__unravel_scan_group_n:N #1 } } -\cs_new_protected_nopar:Npn \__unravel_scan_param: +\cs_new_protected:Npn \__unravel_scan_param: { \tl_clear:N \l__unravel_tmpa_tl \__unravel_scan_param_aux: \tl_put_right:NV \l__unravel_defining_tl \l__unravel_tmpa_tl \__unravel_prev_input_silent:V \l__unravel_tmpa_tl } -\cs_new_protected_nopar:Npn \__unravel_scan_param_aux: +\cs_new_protected:Npn \__unravel_scan_param_aux: { \__unravel_get_next: \tl_concat:NNN \l__unravel_tmpa_tl @@ -2386,6 +2519,7 @@ } \cs_new_protected:Npn \__unravel_scan_group_n:N #1 { + \gtl_set_eq:NN \l__unravel_head_gtl \c_group_begin_gtl \__unravel_back_input: \__unravel_input_gpop_item:NF \l__unravel_head_tl { @@ -2418,7 +2552,7 @@ } \cs_new_protected:Npn \__unravel_scan_group_xdef:n #1 { - \__unravel_get_token_x:N \c_true_bool + \__unravel_get_token_xdef: \tl_if_empty:NTF \l__unravel_head_tl { \gtl_if_head_is_group_begin:NTF \l__unravel_head_gtl @@ -2430,7 +2564,7 @@ { \__unravel_prev_input_silent:V \c_right_brace_str \tl_put_right:Nn \l__unravel_defining_tl { \if_false: { \fi: } } - \int_compare:nNnF {#1} = \c_one + \int_compare:nNnF {#1} = 1 { \__unravel_scan_group_xdef:f { \int_eval:n { #1 - 1 } } } } } @@ -2444,46 +2578,21 @@ \cs_generate_variant:Nn \__unravel_scan_group_xdef:n { f } \cs_new_protected:Npn \__unravel_scan_group_x:n #1 { - \__unravel_get_token_x:N \c_false_bool + \__unravel_get_token_x: \__unravel_prev_input_gtl:N \l__unravel_head_gtl \tl_if_empty:NTF \l__unravel_head_tl { \gtl_if_head_is_group_begin:NTF \l__unravel_head_gtl { \__unravel_scan_group_x:f { \int_eval:n { #1 + 1 } } } { - \int_compare:nNnF {#1} = \c_one + \int_compare:nNnF {#1} = 1 { \__unravel_scan_group_x:f { \int_eval:n { #1 - 1 } } } } } { \__unravel_scan_group_x:n {#1} } } \cs_generate_variant:Nn \__unravel_scan_group_x:n { f } -\cs_new_protected:Npn \__unravel_get_token_x:N #1 - { - \__unravel_get_next: - \__unravel_token_if_protected:NF \l__unravel_head_token - { - \__unravel_set_cmd: - \int_compare:nNnTF - \l__unravel_head_cmd_int = { \__unravel_tex_use:n { the } } - { - \__unravel_get_the: - \bool_if:NTF #1 - { - \tl_put_right:NV \l__unravel_defining_tl \l__unravel_head_tl - \__unravel_prev_input:V \l__unravel_head_tl - } - { - \__unravel_exp_args:NNx \gtl_set:Nn \l__unravel_tmpb_gtl { \l__unravel_head_tl } - \__unravel_prev_input_gtl:N \l__unravel_tmpb_gtl - \__unravel_print_action: - } - } - { \__unravel_expand: } - \__unravel_get_token_x:N #1 - } - } -\cs_new_protected_nopar:Npn \__unravel_scan_alt_rule: +\cs_new_protected:Npn \__unravel_scan_alt_rule: { \__unravel_scan_keyword:nTF { wWiIdDtThH } { @@ -2505,7 +2614,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_scan_spec: +\cs_new_protected:Npn \__unravel_scan_spec: { \__unravel_scan_keyword:nTF { tToO } { \__unravel_scan_normal_dimen: } { @@ -2535,7 +2644,7 @@ { \__unravel_do_box_error: } } } -\cs_new_protected_nopar:Npn \__unravel_do_box_error: +\cs_new_protected:Npn \__unravel_do_box_error: { \__unravel_back_input: \__unravel_error:nnnnn { missing-box } { } { } { } { } @@ -2572,7 +2681,7 @@ \__unravel_print_action:x { \tl_to_str:N \l__unravel_head_tl } } } -\cs_new_protected_nopar:Npn \__unravel_do_leaders_fetch_skip: +\cs_new_protected:Npn \__unravel_do_leaders_fetch_skip: { \__unravel_get_x_non_relax: \__unravel_set_cmd: @@ -2611,7 +2720,7 @@ \cs_new_protected:Npn \__unravel_box_hook:N #1 { \tl_set:NV \l__unravel_tmpa_tl #1 - \str_if_eq_x:nnF + \str_if_eq:eeF { \tl_head:N \l__unravel_tmpa_tl } { \exp_not:N \__unravel_box_hook:w } { \__unravel_exp_args:Nx #1 @@ -2634,7 +2743,7 @@ } \cs_new_eq:NN \__unravel_box_hook:w \prg_do_nothing: \cs_new_eq:NN \__unravel_box_hook_end: \prg_do_nothing: -\cs_new_protected_nopar:Npn \__unravel_do_leaders_rule: +\cs_new_protected:Npn \__unravel_do_leaders_rule: { \__unravel_prev_input:V \l__unravel_head_tl \__unravel_scan_alt_rule: @@ -2703,18 +2812,18 @@ \token_to_str:N \everypar = { \tl_to_str:N \l__unravel_tmpa_tl } } } -\cs_new_protected_nopar:Npn \__unravel_end_graf: +\cs_new_protected:Npn \__unravel_end_graf: { \mode_if_horizontal:T { \__unravel_normal_paragraph: } } -\cs_new_protected_nopar:Npn \__unravel_normal_paragraph: +\cs_new_protected:Npn \__unravel_normal_paragraph: { \tex_par:D \gtl_gput_right:Nn \g__unravel_output_gtl { \par } \__unravel_print_action:x { Paragraph~end. } } -\cs_new_protected_nopar:Npn \__unravel_build_page: +\cs_new_protected:Npn \__unravel_build_page: { } -\cs_new_protected_nopar:Npn \__unravel_handle_right_brace: +\cs_new_protected:Npn \__unravel_handle_right_brace: { \int_compare:nTF { 1 <= \__unravel_currentgrouptype: <= 13 } { @@ -2743,19 +2852,19 @@ \__unravel_print_action: } } -\cs_new_protected_nopar:Npn \__unravel_end_simple_group: +\cs_new_protected:Npn \__unravel_end_simple_group: { \l__unravel_head_token \__unravel_print_action: } -\cs_new_protected_nopar:Npn \__unravel_end_box_group: +\cs_new_protected:Npn \__unravel_end_box_group: { \seq_pop:NN \l__unravel_leaders_box_seq \l__unravel_tmpa_tl \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 } + \str_if_eq:eeTF {#1} { Z } { \__unravel_end_simple_group: } { \__unravel_get_x_non_relax: @@ -2773,7 +2882,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_off_save: +\cs_new_protected:Npn \__unravel_off_save: { \int_compare:nNnTF \__unravel_currentgrouptype: = { 0 } { % bottom-level @@ -2813,7 +2922,7 @@ { \__unravel_back_input: \__unravel_new_graf:N \c_true_bool } {#1} } -\cs_new_protected_nopar:Npn \__unravel_head_for_vmode: +\cs_new_protected:Npn \__unravel_head_for_vmode: { \mode_if_inner:TF { @@ -2830,19 +2939,19 @@ \__unravel_back_input: } } -\cs_new_protected_nopar:Npn \__unravel_goto_inner_math: +\cs_new_protected:Npn \__unravel_goto_inner_math: { \__unravel_box_hook:N \tex_everymath:D $ % $ \__unravel_box_hook_end: } -\cs_new_protected_nopar:Npn \__unravel_goto_display_math: +\cs_new_protected:Npn \__unravel_goto_display_math: { \__unravel_box_hook:N \tex_everydisplay:D $ $ \__unravel_box_hook_end: } -\cs_new_protected_nopar:Npn \__unravel_after_math: +\cs_new_protected:Npn \__unravel_after_math: { \mode_if_inner:TF { @@ -2866,7 +2975,7 @@ } \__unravel_print_action: } -\cs_new_protected_nopar:Npn \__unravel_do_step: +\cs_new_protected:Npn \__unravel_do_step: { \__unravel_set_action_text: \bool_if:NT \g__unravel_internal_debug_bool @@ -2876,7 +2985,18 @@ { \__unravel_error:nxxxx { internal } { unknown-command } { } { } { } } } \__unravel_new_tex_cmd:nn { relax } % 0 - { \__unravel_print_action: } + { + \token_if_eq_meaning:NNT \l__unravel_head_token \__unravel_special_relax: + { + \exp_after:wN \__unravel_token_if_expandable:NTF \l__unravel_head_tl + { + \__unravel_set_action_text:x + { \iow_char:N \\notexpanded: \g__unravel_action_text_str } + } + { } + } + \__unravel_print_action: + } \__unravel_new_tex_cmd:nn { begin-group_char } % 1 { \gtl_gconcat:NNN \g__unravel_output_gtl @@ -2926,7 +3046,7 @@ { \__unravel_mode_math:n { \__unravel_sub_sup: } } \__unravel_new_tex_cmd:nn { subscript_char } % 8 { \__unravel_mode_math:n { \__unravel_sub_sup: } } -\cs_new_protected_nopar:Npn \__unravel_sub_sup: +\cs_new_protected:Npn \__unravel_sub_sup: { \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_print_action: @@ -3017,7 +3137,7 @@ { % ^^A todo: unless its_all_over \int_gdecr:N \g__unravel_ends_int - \int_compare:nNnTF \g__unravel_ends_int > \c_zero + \int_compare:nNnTF \g__unravel_ends_int > 0 { \__unravel_back_input: \__unravel_back_input:n @@ -3076,7 +3196,7 @@ { \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_print_action: - \int_compare:nNnF \l__unravel_head_char_int = \c_zero + \int_compare:nNnF \l__unravel_head_char_int = 0 { \__unravel_scan_int: } \__unravel_prev_input_gpush: \__unravel_scan_toks:NN \c_false_bool \c_true_bool @@ -3098,7 +3218,13 @@ { % show \__unravel_get_next: \__unravel_prev_input_gpop:N \l__unravel_tmpa_tl - \gtl_head_do:NN \l__unravel_head_gtl \l__unravel_tmpa_tl + \token_if_eq_meaning:NNTF + \l__unravel_head_token \__unravel_special_relax: + { + \exp_after:wN \exp_after:wN \exp_after:wN \l__unravel_tmpa_tl + \exp_after:wN \exp_not:N \l__unravel_head_tl + } + { \gtl_head_do:NN \l__unravel_head_gtl \l__unravel_tmpa_tl } } { 2 } { % showthe @@ -3106,13 +3232,13 @@ \__unravel_scan_something_internal:n { 5 } \__unravel_prev_input_gpop:N \l__unravel_head_tl \__unravel_exp_args:Nx \use:n - { \etex_showtokens:D { \tl_tail:N \l__unravel_head_tl } } + { \tex_showtokens:D { \tl_tail:N \l__unravel_head_tl } } } } { % no operand for showlists, showgroups, showifs - \int_compare:nNnT \l__unravel_head_char_int = \c_one % showbox + \int_compare:nNnT \l__unravel_head_char_int = 1 % showbox { \__unravel_scan_int: } - \int_compare:nNnT \l__unravel_head_char_int = \c_five % showtokens + \int_compare:nNnT \l__unravel_head_char_int = 5 % showtokens { \__unravel_scan_toks:NN \c_false_bool \c_false_bool } \__unravel_prev_input_gpop:N \l__unravel_head_tl \tl_use:N \l__unravel_head_tl \scan_stop: @@ -3124,7 +3250,7 @@ \__unravel_back_input: \__unravel_do_box:N \c_false_bool } -\cs_new_protected_nopar:Npn \__unravel_do_move: +\cs_new_protected:Npn \__unravel_do_move: { \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_print_action: @@ -3141,7 +3267,7 @@ \mode_if_vertical:TF { \__unravel_forbidden_case: } { \__unravel_do_move: } } -\cs_new_protected_nopar:Npn \__unravel_do_unpackage: +\cs_new_protected:Npn \__unravel_do_unpackage: { \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_print_action: @@ -3163,7 +3289,7 @@ } \__unravel_new_tex_cmd:nn { remove_item } % 25 { \l__unravel_head_token \__unravel_print_action: } -\cs_new_protected_nopar:Npn \__unravel_do_append_glue: +\cs_new_protected:Npn \__unravel_do_append_glue: { \int_compare:nNnTF \l__unravel_head_char_int < { 4 } { \tl_use:N \l__unravel_head_tl \__unravel_print_action: } @@ -3183,7 +3309,7 @@ { \__unravel_mode_vertical:n { \__unravel_do_append_glue: } } \__unravel_new_tex_cmd:nn { mskip } % 28 { \__unravel_mode_math:n { \__unravel_do_append_glue: } } -\cs_new_protected_nopar:Npn \__unravel_do_append_kern: +\cs_new_protected:Npn \__unravel_do_append_kern: { \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_print_action: @@ -3214,7 +3340,7 @@ { \__unravel_mode_non_vertical:n { \__unravel_do_rule: } } \__unravel_new_tex_cmd:nn { hrule } % 36 { \__unravel_mode_vertical:n { \__unravel_do_rule: } } -\cs_new_protected_nopar:Npn \__unravel_do_rule: +\cs_new_protected:Npn \__unravel_do_rule: { \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_print_action: @@ -3256,7 +3382,7 @@ { \tl_set_eq:NN \l__unravel_tmpa_tl \l__unravel_head_tl \__unravel_get_next: - \int_compare:nNnTF \__unravel_currentgrouptype: = \c_zero + \int_compare:nNnTF \__unravel_currentgrouptype: = 0 { \__unravel_print_action:x { @@ -3306,7 +3432,7 @@ \mode_if_vertical:TF { \__unravel_forbidden_case: } { \l__unravel_head_token \__unravel_print_action: } } -\cs_new_protected_nopar:Npn \__unravel_do_accent: +\cs_new_protected:Npn \__unravel_do_accent: { \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_print_action: @@ -3338,7 +3464,7 @@ \__unravel_print_action:x { \tl_to_str:N \l__unravel_head_tl } \__unravel_break_point: } -\cs_new_protected_nopar:Npn \__unravel_do_math_accent: +\cs_new_protected:Npn \__unravel_do_math_accent: { \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_print_action: @@ -3486,7 +3612,7 @@ } \__unravel_new_tex_cmd:nn { last_item } % 70 { \__unravel_forbidden_case: } -\cs_new_protected_nopar:Npn \__unravel_scan_extension_operands: +\cs_new_protected:Npn \__unravel_scan_extension_operands: { \int_case:nnF \l__unravel_head_char_int { @@ -3661,7 +3787,7 @@ } { } % no other cases. } -\cs_new_protected_nopar:Npn \__unravel_scan_pdfcolorstack_operands: +\cs_new_protected:Npn \__unravel_scan_pdfcolorstack_operands: { \__unravel_scan_int: \__unravel_scan_keyword:nF { sSeEtT } @@ -3679,13 +3805,13 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_scan_rule_attr: +\cs_new_protected:Npn \__unravel_scan_rule_attr: { \__unravel_scan_alt_rule: \__unravel_scan_keyword:nT { aAtTtTrR } { \__unravel_scan_pdf_ext_toks: } } -\cs_new_protected_nopar:Npn \__unravel_scan_action: +\cs_new_protected:Npn \__unravel_scan_action: { \__unravel_scan_keyword:nTF { uUsSeErR } { \__unravel_scan_pdf_ext_toks: } @@ -3719,7 +3845,7 @@ { \__unravel_skip_optional_space: } } } -\cs_new_protected_nopar:Npn \__unravel_scan_image: +\cs_new_protected:Npn \__unravel_scan_image: { \__unravel_scan_rule_attr: \__unravel_scan_keyword:nTF { nNaAmMeEdD } @@ -3732,7 +3858,7 @@ { \__unravel_scan_int: } \__unravel_scan_pdf_ext_toks: } -\cs_new_protected_nopar:Npn \__unravel_scan_immediate_operands: +\cs_new_protected:Npn \__unravel_scan_immediate_operands: { \__unravel_get_x_next: \__unravel_set_cmd: @@ -3754,12 +3880,12 @@ } { \__unravel_scan_immediate_operands_bad: } } -\cs_new_protected_nopar:Npn \__unravel_scan_immediate_operands_aux: +\cs_new_protected:Npn \__unravel_scan_immediate_operands_aux: { \__unravel_prev_input:V \l__unravel_head_tl \__unravel_scan_extension_operands: } -\cs_new_protected_nopar:Npn \__unravel_scan_immediate_operands_bad: +\cs_new_protected:Npn \__unravel_scan_immediate_operands_bad: { \__unravel_back_input: \__unravel_prev_input_gpop:N \l__unravel_head_tl @@ -3767,7 +3893,7 @@ \__unravel_prev_input_gpush: } -\cs_new_protected_nopar:Npn \__unravel_scan_pdfdest_operands: +\cs_new_protected:Npn \__unravel_scan_pdfdest_operands: { \__unravel_scan_keyword:nTF { nNuUmM } { \__unravel_scan_int: } @@ -3815,7 +3941,7 @@ } \__unravel_skip_optional_space: } -\cs_set_protected_nopar:Npn \__unravel_tmp:w +\cs_set_protected:Npn \__unravel_tmp:w { \__unravel_prev_input_gpush: \__unravel_prefixed_command: @@ -3825,7 +3951,7 @@ { 1 } { \__unravel_tex_use:n { max_command } } { \cs_new_eq:cN { __unravel_cmd_#1: } \__unravel_tmp:w } -\cs_new_protected_nopar:Npn \__unravel_prefixed_command: +\cs_new_protected:Npn \__unravel_prefixed_command: { \int_while_do:nNnn \l__unravel_head_cmd_int = { \__unravel_tex_use:n { prefix } } @@ -3855,16 +3981,16 @@ } \__unravel_after_assignment: } -\cs_new_protected_nopar:Npn \__unravel_after_assignment: +\cs_new_protected:Npn \__unravel_after_assignment: { \__unravel_back_input_gtl:N \g__unravel_after_assignment_gtl \gtl_gclear:N \g__unravel_after_assignment_gtl } -\cs_new_protected_nopar:Npn \__unravel_omit_after_assignment:w +\cs_new_protected:Npn \__unravel_omit_after_assignment:w #1 \__unravel_after_assignment: { } \cs_new_protected:Npn \__unravel_prefixed_new:nn #1#2 { - \cs_new_protected_nopar:cpn + \cs_new_protected:cpn { __unravel_prefixed_ \__unravel_tex_use:n {#1} : } {#2} } \cs_new_protected:Npn \__unravel_assign_token:n #1 @@ -3874,7 +4000,7 @@ \tl_use:N \l__unravel_head_tl \scan_stop: \__unravel_print_assigned_token: } -\cs_new_protected_nopar:Npn \__unravel_assign_register: +\cs_new_protected:Npn \__unravel_assign_register: { \__unravel_prev_input_gpop:N \l__unravel_head_tl \tl_use:N \l__unravel_head_tl \scan_stop: @@ -3897,7 +4023,7 @@ } \__unravel_prefixed_new:nn { toks_register } % 71 { - \int_compare:nNnT \l__unravel_head_char_int = \c_zero + \int_compare:nNnT \l__unravel_head_char_int = 0 { % \toks \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_print_action: @@ -3908,7 +4034,7 @@ } \__unravel_prefixed_new:nn { assign_toks } % 72 { \__unravel_assign_toks: } -\cs_new_protected_nopar:Npn \__unravel_assign_toks: +\cs_new_protected:Npn \__unravel_assign_toks: { \__unravel_prev_input_silent:V \l__unravel_head_tl \__unravel_print_action: @@ -3920,7 +4046,7 @@ \l__unravel_head_cmd_int = { \__unravel_tex_use:n { toks_register } } { \__unravel_prev_input:V \l__unravel_head_tl - \int_compare:nNnT \l__unravel_head_char_int = \c_zero + \int_compare:nNnT \l__unravel_head_char_int = 0 { \__unravel_scan_int: } } { @@ -3955,7 +4081,7 @@ } \__unravel_prefixed_new:nn { set_aux } % 79 { % prevdepth = 1, spacefactor = 102 - \int_compare:nNnTF \l__unravel_head_char_int = \c_one + \int_compare:nNnTF \l__unravel_head_char_int = 1 { \__unravel_assign_value:nn { } { \__unravel_scan_normal_dimen: } } { \__unravel_assign_value:nn { } { \__unravel_scan_int: } } } @@ -3977,7 +4103,7 @@ \prg_replicate:nn { \tl_if_head_eq_meaning:VNT - \l__unravel_defined_tl \tex_parshape:D { \c_two * } + \l__unravel_defined_tl \tex_parshape:D { 2 * } \tl_tail:N \l__unravel_defined_tl } { \__unravel_scan_int: } @@ -4089,7 +4215,7 @@ } \prg_new_conditional:Npnn \__unravel_read_to_cs_safe:n #1 { TF } { - \int_compare:nNnTF { \etex_interactionmode:D } > { 1 } + \int_compare:nNnTF { \tex_interactionmode:D } > { 1 } { \prg_return_true: } { \int_compare:nNnTF {#1} < { 0 } @@ -4114,7 +4240,7 @@ \tl_set:NV \l__unravel_defining_tl \l__unravel_tmpa_tl \tl_put_right:NV \l__unravel_defining_tl \l__unravel_head_tl \__unravel_prev_input_gpush:N \l__unravel_head_tl - \int_compare:nNnTF \l__unravel_head_char_int < \c_two + \int_compare:nNnTF \l__unravel_head_char_int < 2 { % def/gdef \__unravel_scan_r_token: \tl_put_right:NV \l__unravel_defining_tl \l__unravel_defined_tl @@ -4154,7 +4280,7 @@ \__unravel_prev_input_gpop:N \l__unravel_tmpa_tl \tl_put_left:NV \l__unravel_head_tl \l__unravel_tmpa_tl \tl_use:N \l__unravel_head_tl \scan_stop: - \__unravel_print_action:x { \tl_to_str:N \l__unravel_head_tl } + \__unravel_print_assignment:x { \tl_to_str:N \l__unravel_head_tl } } \__unravel_prefixed_new:nn { letterspace_font } % 101 { @@ -4182,13 +4308,13 @@ \__unravel_assign_token:n { } } \__unravel_prefixed_new:nn { register } % 89 - { \__unravel_do_register:N \c_zero } + { \__unravel_do_register:N 0 } \__unravel_prefixed_new:nn { advance } % 90 - { \__unravel_do_operation:N \c_one } + { \__unravel_do_operation:N 1 } \__unravel_prefixed_new:nn { multiply } % 91 - { \__unravel_do_operation:N \c_two } + { \__unravel_do_operation:N 2 } \__unravel_prefixed_new:nn { divide } % 92 - { \__unravel_do_operation:N \c_three } + { \__unravel_do_operation:N 3 } \cs_new_protected:Npn \__unravel_do_operation:N #1 { \__unravel_prev_input_silent:V \l__unravel_head_tl @@ -4220,7 +4346,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_do_operation_fail:w +\cs_new_protected:Npn \__unravel_do_operation_fail:w { \__unravel_error:nnnnn { after-advance } { } { } { } { } \__unravel_prev_input_gpop:N \l__unravel_tmpa_tl @@ -4233,17 +4359,17 @@ } \cs_new_protected:Npn \__unravel_do_register_aux:Nn #1#2 { - \int_compare:nNnTF { \tl_tail:n {#2} } = \c_zero + \int_compare:nNnTF { \tl_tail:n {#2} } = 0 { \__unravel_prev_input_gpush:N \l__unravel_head_tl - \__unravel_print_action: + \__unravel_print_assignment: \__unravel_scan_int: \__unravel_prev_input_gpop:N \l__unravel_head_tl \__unravel_prev_input_silent:V \l__unravel_head_tl } { \__unravel_prev_input_silent:V \l__unravel_head_tl - \__unravel_print_action: + \__unravel_print_assignment: } \tl_set_eq:NN \l__unravel_defined_tl \l__unravel_head_tl \exp_args:NNf \__unravel_do_register_set:Nn #1 @@ -4251,7 +4377,7 @@ } \cs_new_protected:Npn \__unravel_do_register_set:Nn #1#2 { - \int_compare:nNnTF {#1} = \c_zero + \int_compare:nNnTF {#1} = 0 { % truly register command \__unravel_scan_optional_equals: } @@ -4259,7 +4385,7 @@ \__unravel_scan_keyword:nF { bByY } { \__unravel_prev_input_silent:n { by } } } - \int_compare:nNnTF {#1} < \c_two + \int_compare:nNnTF {#1} < 2 { \int_case:nnF {#2} { @@ -4273,7 +4399,7 @@ { \__unravel_scan_int: } \__unravel_assign_register: } -\cs_new_protected_nopar:Npn \__unravel_do_assignments: +\cs_new_protected:Npn \__unravel_do_assignments: { \__unravel_get_x_non_relax: \__unravel_set_cmd: @@ -4289,32 +4415,32 @@ } } \__unravel_new_tex_expandable:nn { undefined_cs } % 103 - { \tl_use:N \l__unravel_head_tl \__unravel_print_action: } + { \tl_use:N \l__unravel_head_tl \__unravel_print_expansion: } \__unravel_new_tex_expandable:nn { expand_after } % 104 { \token_if_eq_meaning:NNTF \l__unravel_head_token \tex_expandafter:D { \__unravel_expandafter: } { \__unravel_unless: } } -\cs_new_protected_nopar:Npn \__unravel_expandafter: +\cs_new_protected:Npn \__unravel_expandafter: { \gtl_set_eq:NN \l__unravel_tmpb_gtl \l__unravel_head_gtl \__unravel_get_next: \gtl_concat:NNN \l__unravel_head_gtl \l__unravel_tmpb_gtl \l__unravel_head_gtl \__unravel_prev_input_gpush_gtl:N \l__unravel_head_gtl - \__unravel_print_action:x { \gtl_to_str:N \l__unravel_head_gtl } + \__unravel_print_expansion:x { \gtl_to_str:N \l__unravel_head_gtl } \__unravel_get_next: \__unravel_token_if_expandable:NTF \l__unravel_head_token - { \__unravel_expand: } + { \__unravel_expand_do:N \prg_do_nothing: } { \__unravel_back_input: } \__unravel_prev_input_gpop:N \l__unravel_head_gtl \__unravel_set_action_text:x { back_input: ~ \gtl_to_str:N \l__unravel_head_gtl } \gtl_pop_left:N \l__unravel_head_gtl \__unravel_back_input: - \__unravel_print_action: + \__unravel_print_expansion: } -\cs_new_protected_nopar:Npn \__unravel_unless: +\cs_new_protected:Npn \__unravel_unless: { \__unravel_get_token: \int_compare:nNnTF @@ -4330,7 +4456,7 @@ } { \__unravel_unless_bad: } } -\cs_new_protected_nopar:Npn \__unravel_unless_bad: +\cs_new_protected:Npn \__unravel_unless_bad: { \__unravel_error:nnnnn { bad-unless } { } { } { } { } \__unravel_back_input: @@ -4338,25 +4464,44 @@ \__unravel_new_tex_expandable:nn { no_expand } % 105 { \token_if_eq_meaning:NNTF \l__unravel_head_token \tex_noexpand:D - { \__unravel_noexpand: } + { \__unravel_noexpand:N } { \__unravel_pdfprimitive: } } -\cs_new_protected_nopar:Npn \__unravel_noexpand: +\cs_new_protected:Npn \__unravel_noexpand:N #1 { \__unravel_get_token: - \__unravel_back_input: - \__unravel_token_if_expandable:NT \l__unravel_head_token + \cs_if_eq:NNTF #1 \prg_do_nothing: { - \cs_gset_protected_nopar:Npx \__unravel_get_next: + \tl_if_empty:NTF \l__unravel_head_tl + { \__unravel_back_input: } { - \cs_gset_protected_nopar:Npn \__unravel_get_next: - { \exp_not:o { \__unravel_get_next: } } - \exp_not:o { \__unravel_get_next: } - \exp_not:n { \cs_set_eq:NN \l__unravel_head_token \tex_relax:D } + \exp_after:wN \__unravel_token_if_definable:NTF \l__unravel_head_tl + { \__unravel_noexpand_after: } + { \__unravel_back_input: } } } + { + \__unravel_back_input: + \__unravel_get_next: + \__unravel_token_if_expandable:NT \l__unravel_head_token + { \cs_set_eq:NN \l__unravel_head_token \__unravel_special_relax: } + } } -\cs_new_protected_nopar:Npn \__unravel_pdfprimitive: +\cs_new_protected:Npn \__unravel_noexpand_after: + { + \group_begin: + \__unravel_set_escapechar:n { 92 } + \exp_args:NNc + \group_end: + \__unravel_noexpand_after:N + { notexpanded: \exp_after:wN \token_to_str:N \l__unravel_head_tl } + } +\cs_new_protected:Npn \__unravel_noexpand_after:N #1 + { + \cs_gset_eq:NN #1 \__unravel_special_relax: + \__unravel_back_input:n {#1} + } +\cs_new_protected:Npn \__unravel_pdfprimitive: { \__unravel_not_implemented:n { pdfprimitive } } \__unravel_new_tex_expandable:nn { input } % 106 { @@ -4370,23 +4515,23 @@ { \__unravel_insert_relax: } { \__unravel_input: } } } -\cs_new_protected_nopar:Npn \__unravel_endinput: +\cs_new_protected:Npn \__unravel_endinput: { \group_begin: \msg_warning:nn { unravel } { endinput-ignored } \group_end: - \__unravel_print_action: + \__unravel_print_expansion: } -\cs_new_protected_nopar:Npn \__unravel_scantokens: +\cs_new_protected:Npn \__unravel_scantokens: { \__unravel_prev_input_gpush: \__unravel_scan_toks:NN \c_false_bool \c_false_bool \__unravel_prev_input_gpop:N \l__unravel_tmpa_tl \tl_set_rescan:Nno \l__unravel_head_tl { } \l__unravel_tmpa_tl \__unravel_back_input:V \l__unravel_head_tl - \__unravel_print_action:x { \tl_to_str:N \l__unravel_tmpa_tl } + \__unravel_print_expansion:x { \tl_to_str:N \l__unravel_tmpa_tl } } -\cs_new_protected_nopar:Npn \__unravel_input: +\cs_new_protected:Npn \__unravel_input: { \__unravel_prev_input_gpush:N \l__unravel_head_tl \__unravel_scan_file_name: @@ -4394,18 +4539,18 @@ \tl_set:Nx \l__unravel_tmpa_tl { \tl_tail:N \l__unravel_head_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_print_expansion:x { \tl_to_str:N \l__unravel_head_tl } } \__unravel_new_tex_expandable:nn { cs_name } % 109 { \__unravel_prev_input_gpush:N \l__unravel_head_tl - \__unravel_print_action: + \__unravel_print_expansion: \__unravel_csname_loop: \__unravel_prev_input_silent:V \l__unravel_head_tl \__unravel_prev_input_gpop:N \l__unravel_head_tl \__unravel_back_input_tl_o: } -\cs_new_protected_nopar:Npn \__unravel_csname_loop: +\cs_new_protected:Npn \__unravel_csname_loop: { \__unravel_get_x_next: \__unravel_gtl_if_head_is_definable:NTF \l__unravel_head_gtl @@ -4426,13 +4571,13 @@ \__unravel_new_tex_expandable:nn { convert } % 110 { \__unravel_prev_input_gpush:N \l__unravel_head_tl - \__unravel_print_action: + \__unravel_print_expansion: \int_case:nn \l__unravel_head_char_int { 0 \__unravel_scan_int: 1 \__unravel_scan_int: - 2 { \__unravel_get_next: \__unravel_prev_input:V \l__unravel_head_tl } - 3 { \__unravel_get_next: \__unravel_prev_input:V \l__unravel_head_tl } + 2 \__unravel_convert_string: + 3 \__unravel_convert_meaning: 4 \__unravel_scan_font_ident: 8 \__unravel_scan_font_ident: 9 \__unravel_scan_font_ident: @@ -4460,18 +4605,41 @@ { 28 } \__unravel_scan_int: { 30 } \__unravel_scan_int: { 31 } \__unravel_scan_pdfximagebbox: + { 33 } \__unravel_scan_directlua: + { 34 } \__unravel_scan_pdf_ext_toks: + { 35 } \__unravel_scan_pdf_ext_toks: + { 40 } + { + \__unravel_scan_int: + \__unravel_prev_input_silent:n { ~ } + \__unravel_scan_int: + } } \__unravel_prev_input_gpop:N \l__unravel_head_tl \__unravel_back_input_tl_o: } -\cs_new_protected_nopar:Npn \__unravel_scan_pdfstrcmp: +\cs_new_protected:Npn \__unravel_convert_string: + { + \__unravel_get_next: + \tl_if_empty:NTF \l__unravel_head_tl + { \__unravel_prev_input:x { \gtl_to_str:N \l__unravel_head_gtl } } + { \__unravel_prev_input:V \l__unravel_head_tl } + } +\cs_new_protected:Npn \__unravel_convert_meaning: + { + \__unravel_get_next: + \tl_if_empty:NTF \l__unravel_head_tl + { \__unravel_prev_input:n { \l__unravel_head_token } } + { \__unravel_prev_input:V \l__unravel_head_tl } + } +\cs_new_protected:Npn \__unravel_scan_pdfstrcmp: { \__unravel_scan_toks_to_str: \__unravel_scan_toks_to_str: } -\cs_new_protected_nopar:Npn \__unravel_scan_pdfximagebbox: +\cs_new_protected:Npn \__unravel_scan_pdfximagebbox: { \__unravel_scan_int: \__unravel_scan_int: } -\cs_new_protected_nopar:Npn \__unravel_scan_pdfcolorstackinit: +\cs_new_protected:Npn \__unravel_scan_pdfcolorstackinit: { \__unravel_scan_keyword:nTF { pPaAgGeE } { \bool_set_true:N \l__unravel_tmpa_bool } @@ -4480,13 +4648,13 @@ { \__unravel_scan_keyword:n { pPaAgGeE } } \__unravel_scan_toks_to_str: } -\cs_new_protected_nopar:Npn \__unravel_scan_pdffiledump: +\cs_new_protected:Npn \__unravel_scan_pdffiledump: { \__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: +\cs_new_protected:Npn \__unravel_scan_pdfmatch: { \__unravel_scan_keyword:n { iIcCaAsSeE } \__unravel_scan_keyword:nT { sSuUbBcCoOuUnNtT } @@ -4494,17 +4662,26 @@ \__unravel_scan_pdf_ext_toks: \__unravel_scan_pdf_ext_toks: } -\__unravel_new_tex_expandable:nn { the } % 111 +\sys_if_engine_luatex:T { - \__unravel_get_the: - \tl_set:Nx \l__unravel_tmpa_tl { \exp_args:NV \exp_not:o \l__unravel_head_tl } - \__unravel_back_input:V \l__unravel_tmpa_tl - \__unravel_print_action: + \cs_new_protected:Npn \__unravel_scan_directlua: + { + \__unravel_get_x_non_relax: + \token_if_eq_catcode:NNTF \l__unravel_head_token \c_group_begin_token + { \__unravel_back_input: } + { + \__unravel_scan_int: + \__unravel_get_x_non_relax: + } + \__unravel_scan_pdf_ext_toks: + } } -\cs_new_protected_nopar:Npn \__unravel_get_the: +\__unravel_new_tex_expandable:nn { the } % 111 + { \__unravel_get_the:N } +\cs_new_protected:Npn \__unravel_get_the:N #1 { \__unravel_prev_input_gpush:N \l__unravel_head_tl - \__unravel_print_action: + \__unravel_print_expansion: \int_if_odd:nTF \l__unravel_head_char_int { % \unexpanded, \detokenize \__unravel_scan_toks:NN \c_false_bool \c_false_bool @@ -4523,6 +4700,24 @@ \tl_set:Nx \l__unravel_head_tl { \exp_not:N \exp_not:n { \tl_tail:N \l__unravel_head_tl } } } + \cs_if_eq:NNTF #1 \__unravel_get_token_xdef: + { + \tl_put_right:NV \l__unravel_defining_tl \l__unravel_head_tl + \__unravel_prev_input:V \l__unravel_head_tl + } + { + \cs_if_eq:NNTF #1 \__unravel_get_token_x: + { + \__unravel_exp_args:NNx \gtl_set:Nn \l__unravel_tmpb_gtl { \l__unravel_head_tl } + \__unravel_prev_input_gtl:N \l__unravel_tmpb_gtl + } + { + \tl_set:Nx \l__unravel_tmpa_tl { \exp_args:NV \exp_not:o \l__unravel_head_tl } + \__unravel_back_input:V \l__unravel_tmpa_tl + } + \__unravel_print_expansion: + } + #1 } \__unravel_new_tex_expandable:nn { top_bot_mark } % 112 { \__unravel_back_input_tl_o: } @@ -4531,33 +4726,33 @@ \__unravel_not_implemented:n { end-template } { } { } { } \__unravel_back_input_tl_o: } -\cs_new_protected_nopar:Npn \__unravel_pass_text: +\cs_new_protected:Npn \__unravel_pass_text: { \__unravel_input_if_empty:TF { \__unravel_pass_text_empty: } { \__unravel_input_get:N \l__unravel_tmpb_gtl \if_true: - \if_case:w \gtl_head_do:NN \l__unravel_tmpb_gtl \c_one + \if_case:w \gtl_head_do:NN \l__unravel_tmpb_gtl \c_one_int \exp_after:wN \__unravel_pass_text_done:w \fi: \__unravel_input_gpop:N \l__unravel_tmpb_gtl \exp_after:wN \__unravel_pass_text: \else: \use:c { fi: } - \int_set_eq:NN \l__unravel_if_nesting_int \c_one + \int_set:Nn \l__unravel_if_nesting_int { 1 } \__unravel_input_gpop:N \l__unravel_tmpb_gtl \exp_after:wN \__unravel_pass_text_nested: \fi: } } -\cs_new_protected_nopar:Npn \__unravel_pass_text_done:w +\cs_new_protected:Npn \__unravel_pass_text_done:w { \__unravel_get_next: \token_if_eq_meaning:NNT \l__unravel_head_token \fi: { \if_true: } \else: } -\cs_new_protected_nopar:Npn \__unravel_pass_text_nested: +\cs_new_protected:Npn \__unravel_pass_text_nested: { \__unravel_input_if_empty:TF { \__unravel_pass_text_empty: } @@ -4574,12 +4769,12 @@ \int_incr:N \l__unravel_if_nesting_int \fi: \__unravel_input_gpop:N \l__unravel_unused_gtl - \int_compare:nNnTF \l__unravel_if_nesting_int = \c_zero + \int_compare:nNnTF \l__unravel_if_nesting_int = 0 { \__unravel_pass_text: } { \__unravel_pass_text_nested: } } } -\cs_new_protected_nopar:Npn \__unravel_pass_text_empty: +\cs_new_protected:Npn \__unravel_pass_text_empty: { \__unravel_error:nnnnn { runaway-if } { } { } { } { } \__unravel_exit:w @@ -4591,7 +4786,7 @@ \int_gincr:N \g__unravel_if_depth_int \int_gzero:N \g__unravel_if_limit_int } -\cs_new_protected_nopar:Npn \__unravel_cond_pop: +\cs_new_protected:Npn \__unravel_cond_pop: { \int_gset:Nn \g__unravel_if_limit_int { \tl_head:N \g__unravel_if_limit_tl } @@ -4605,7 +4800,7 @@ { \int_gset:Nn \g__unravel_if_limit_int {#1} } { \tl_clear:N \l__unravel_tmpa_tl - \prg_replicate:nn { \g__unravel_if_depth_int - #2 - \c_one } + \prg_replicate:nn { \g__unravel_if_depth_int - #2 - 1 } { \tl_put_right:Nx \l__unravel_tmpa_tl { { \tl_head:N \g__unravel_if_limit_tl } } @@ -4631,7 +4826,7 @@ } { \__unravel_prev_input_gpush:N \l__unravel_head_tl - \__unravel_print_action: + \__unravel_print_expansion: \int_case:nn \l__unravel_head_char_int { { 0 } { \__unravel_test_two_chars: } % if @@ -4674,13 +4869,17 @@ \cs_new_protected:Npn \__unravel_cond_true:n #1 { \__unravel_change_if_limit:nn { 3 } {#1} % wait for else/fi - \__unravel_print_action:x { \g__unravel_action_text_str = true } + \__unravel_print_expansion:x { \g__unravel_action_text_str = true } } \cs_new_protected:Npn \__unravel_cond_false:n #1 { \__unravel_cond_false_loop:n {#1} \__unravel_cond_false_common: - \__unravel_print_action:x { \g__unravel_action_text_str = false } + \__unravel_print_expansion:x + { + \g__unravel_action_text_str = false ~ + => ~ skipped ~ to ~ \iow_char:N\\fi + } } \cs_new_protected:Npn \__unravel_cond_false_loop:n #1 { @@ -4699,7 +4898,7 @@ \__unravel_cond_false_loop:n {#1} } } -\cs_new_protected_nopar:Npn \__unravel_cond_false_common: +\cs_new_protected:Npn \__unravel_cond_false_common: { \token_if_eq_meaning:NNTF \l__unravel_head_token \fi: { \__unravel_cond_pop: } @@ -4709,7 +4908,7 @@ { #1 \__unravel_get_x_non_blank: - \tl_if_in:nVF { < = > } \l__unravel_head_tl + \__unravel_tl_if_in:ooTF { < = > } \l__unravel_head_tl { } { \__unravel_error:nnnnn { missing-equals } { } { } { } { } \__unravel_back_input: @@ -4718,14 +4917,14 @@ \__unravel_prev_input:V \l__unravel_head_tl #1 } -\cs_new_protected_nopar:Npn \__unravel_test_two_chars: +\cs_new_protected:Npn \__unravel_test_two_chars: { \__unravel_test_two_chars_aux: \__unravel_prev_input:V \l__unravel_head_tl \__unravel_test_two_chars_aux: \__unravel_prev_input:V \l__unravel_head_tl } -\cs_new_protected_nopar:Npn \__unravel_test_two_chars_aux: +\cs_new_protected:Npn \__unravel_test_two_chars_aux: { \__unravel_get_x_next: \gtl_if_tl:NF \l__unravel_head_gtl @@ -4741,30 +4940,50 @@ \cs_new_protected:Npn \__unravel_test_ifx:n #1 { \__unravel_prev_input_gpush:N \l__unravel_head_tl - \__unravel_print_action: + \__unravel_print_expansion: \__unravel_get_next: \gtl_set_eq:NN \l__unravel_tmpb_gtl \l__unravel_head_gtl + \cs_set_eq:NN \l__unravel_tmpb_token \l__unravel_head_token \__unravel_get_next: \__unravel_prev_input_gpop:N \l__unravel_tmpa_tl \__unravel_set_action_text:x { Compare:~ \tl_to_str:N \l__unravel_tmpa_tl - \gtl_to_str:N \l__unravel_tmpb_gtl - \gtl_to_str:N \l__unravel_head_gtl + \__unravel_test_ifx_str:NN \l__unravel_tmpb_token \l__unravel_tmpb_gtl + \__unravel_test_ifx_str:NN \l__unravel_head_token \l__unravel_head_gtl } - \gtl_head_do:NN \l__unravel_tmpb_gtl \__unravel_test_ifx_aux:w + \__unravel_test_ifx_aux:NNN \l__unravel_tmpb_token \l__unravel_tmpb_gtl + \__unravel_test_ifx_aux:w \exp_after:wN \__unravel_cond_true:n \else: \exp_after:wN \__unravel_cond_false:n \fi: {#1} } -\cs_new_nopar:Npn \__unravel_test_ifx_aux:w - { \gtl_head_do:NN \l__unravel_head_gtl \l__unravel_tmpa_tl } +\cs_new:Npn \__unravel_test_ifx_str:NN #1#2 + { + \token_if_eq_meaning:NNT #1 \__unravel_special_relax: + { \iow_char:N \\notexpanded: } + \gtl_to_str:N #2 + } +\cs_new_protected:Npn \__unravel_test_ifx_aux:NNN #1#2#3 + { + \token_if_eq_meaning:NNTF #1 \__unravel_special_relax: + { + \gtl_head_do:NN #2 \__unravel_token_if_expandable:NTF + { #3 #1 } { \gtl_head_do:NN #2 #3 } + } + { \gtl_head_do:NN #2 #3 } + } +\cs_new:Npn \__unravel_test_ifx_aux:w + { + \__unravel_test_ifx_aux:NNN \l__unravel_head_token \l__unravel_head_gtl + \l__unravel_tmpa_tl + } \cs_new_protected:Npn \__unravel_test_case:n #1 { \__unravel_prev_input_gpush:N \l__unravel_head_tl - \__unravel_print_action: + \__unravel_print_expansion: \bool_if:NT \g__unravel_internal_debug_bool { \iow_term:n { {\ifcase level~#1} } } \__unravel_scan_int: \__unravel_prev_input_get:N \l__unravel_head_tl @@ -4772,11 +4991,11 @@ % ^^A does text_case_aux use prev_input_seq? \exp_args:No \__unravel_test_case_aux:nn { \l__unravel_head_tl } {#1} \__unravel_prev_input_gpop:N \l__unravel_head_tl - \__unravel_print_action:x { \tl_to_str:N \l__unravel_head_tl } + \__unravel_print_expansion:x { \tl_to_str:N \l__unravel_head_tl } } \cs_new_protected:Npn \__unravel_test_case_aux:nn #1#2 { - \int_compare:nNnTF {#1} = \c_zero + \int_compare:nNnTF {#1} = 0 { \__unravel_change_if_limit:nn { 4 } {#2} } { \__unravel_pass_text: @@ -4796,7 +5015,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_test_ifdefined: +\cs_new_protected:Npn \__unravel_test_ifdefined: { \__unravel_input_if_empty:TF { \__unravel_pass_text_empty: } @@ -4815,7 +5034,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_test_ifcsname: +\cs_new_protected:Npn \__unravel_test_ifcsname: { \__unravel_csname_loop: \__unravel_prev_input:V \l__unravel_head_tl @@ -4824,9 +5043,9 @@ { \int_compare:nNnTF \l__unravel_head_char_int > \g__unravel_if_limit_int { - \int_compare:nNnTF \g__unravel_if_limit_int = \c_zero + \int_compare:nNnTF \g__unravel_if_limit_int = 0 { - \int_compare:nNnTF \g__unravel_if_depth_int = \c_zero + \int_compare:nNnTF \g__unravel_if_depth_int = 0 { \__unravel_error:nnnnn { extra-fi-or-else } { } { } { } { } } { \__unravel_insert_relax: } } @@ -4834,7 +5053,7 @@ } { \__unravel_set_action_text: - \int_compare:nNnF \l__unravel_head_char_int = \c_two + \int_compare:nNnF \l__unravel_head_char_int = 2 { \__unravel_fi_or_else_loop: \__unravel_set_action_text:x @@ -4843,14 +5062,14 @@ => ~ skipped ~ to ~ \tl_to_str:N \l__unravel_head_tl } } - % ^^A todo: in this print_action the token itself is missing. - \__unravel_print_action: + % ^^A todo: in the terminal output the token itself is missing. + \__unravel_print_expansion: \__unravel_cond_pop: } } -\cs_new_protected_nopar:Npn \__unravel_fi_or_else_loop: +\cs_new_protected:Npn \__unravel_fi_or_else_loop: { - \int_compare:nNnF \l__unravel_head_char_int = \c_two + \int_compare:nNnF \l__unravel_head_char_int = 2 { \__unravel_pass_text: \__unravel_set_cmd: @@ -4876,8 +5095,21 @@ } \cs_new_protected:Npn \__unravel_print:x { \__unravel_exp_args:Nx \__unravel_print:n } +\cs_new_protected:Npn \__unravel_log:n #1 + { + \tl_set:Nn \l__unravel_print_tl {#1} + \__unravel_print_normalize_null: + \__unravel_exp_args:Nx \iow_log:n { \l__unravel_print_tl } + } \cs_new_protected:Npn \__unravel_print_message:nn #1 #2 - { \iow_wrap:nnnN { #1 #2 } { #1 } { } \__unravel_print:n } + { + \int_compare:nNnF \g__unravel_online_int < 0 + { + \int_compare:nNnTF \g__unravel_online_int = 0 + { \iow_wrap:nnnN { #1 #2 } { #1 } { } \__unravel_log:n } + { \iow_wrap:nnnN { #1 #2 } { #1 } { } \__unravel_print:n } + } + } \cs_new_protected:Npn \__unravel_set_action_text:x #1 { \group_begin: @@ -4885,13 +5117,13 @@ \str_gset:Nx \g__unravel_action_text_str {#1} \group_end: } -\cs_new_protected_nopar:Npn \__unravel_set_action_text: +\cs_new_protected:Npn \__unravel_set_action_text: { \__unravel_set_action_text:x { \tl_to_str:N \l__unravel_head_tl \tl_if_single_token:VT \l__unravel_head_tl - { = ~ \exp_after:wN \token_to_meaning:N \l__unravel_head_tl } + { = ~ \token_to_meaning:N \l__unravel_head_token } } } \cs_new_protected:Npn \__unravel_print_state: @@ -4899,16 +5131,15 @@ \group_begin: \__unravel_set_escapechar:n { 92 } \tl_use:N \g__unravel_before_print_state_tl - \int_compare:nNnT \g__unravel_noise_int > \c_zero + \int_compare:nNnT \g__unravel_online_int > 0 { \__unravel_print_state_output: \__unravel_print_state_prev: \__unravel_print_state_input: } \group_end: - \__unravel_prompt: } -\cs_new_protected_nopar:Npn \__unravel_print_state_output: +\cs_new_protected:Npn \__unravel_print_state_output: { \__unravel_exp_args:Nx \__unravel_print_state_output:n { \gtl_to_str:N \g__unravel_output_gtl } @@ -4921,7 +5152,7 @@ { \__unravel_str_truncate_left:nn {#1} { \g__unravel_max_output_int } } } } -\cs_new_protected_nopar:Npn \__unravel_print_state_prev: +\cs_new_protected:Npn \__unravel_print_state_prev: { \seq_set_map:NNn \l__unravel_tmpa_seq \g__unravel_prev_input_seq { \__unravel_to_str:n {##1} } @@ -4935,7 +5166,7 @@ } } } -\cs_new_protected_nopar:Npn \__unravel_print_state_input: +\cs_new_protected:Npn \__unravel_print_state_input: { \__unravel_exp_args:Nx \__unravel_print_state_input:n { \__unravel_input_to_str: } @@ -4959,49 +5190,65 @@ } } \cs_new_protected:Npn \__unravel_print_action: - { - \int_gincr:N \g__unravel_step_int - \__unravel_print:x - { - [===== - \bool_if:NT \g__unravel_number_steps_bool - { ~ Step ~ \int_to_arabic:n { \g__unravel_step_int } ~ } - =====]~ - \int_compare:nNnTF - { \str_count:N \g__unravel_action_text_str } - > { \g__unravel_max_action_int } - { - \str_range:Nnn \g__unravel_action_text_str - { 1 } { \g__unravel_max_action_int - 3 } ... - } - { \g__unravel_action_text_str } - } - \__unravel_print_state: - } + { \__unravel_print_action_aux:N \g__unravel_trace_other_bool } \cs_new_protected:Npn \__unravel_print_action:x #1 { \__unravel_set_action_text:x {#1} \__unravel_print_action: } -\cs_new_protected:Npn \__unravel_print_gtl_action:N #1 +\cs_new_protected:Npn \__unravel_print_assignment: + { \__unravel_print_action_aux:N \g__unravel_trace_assigns_bool } +\cs_new_protected:Npn \__unravel_print_assignment:x #1 + { + \__unravel_set_action_text:x {#1} + \__unravel_print_assignment: + } +\cs_new_protected:Npn \__unravel_print_expansion: + { \__unravel_print_action_aux:N \g__unravel_trace_expansion_bool } +\cs_new_protected:Npn \__unravel_print_expansion:x #1 + { + \__unravel_set_action_text:x {#1} + \__unravel_print_expansion: + } +\cs_new_protected:Npn \__unravel_print_action_aux:N #1 { - \__unravel_print_action:x { \gtl_to_str:N #1 } + \int_gdecr:N \g__unravel_nonstop_int + \int_gincr:N \g__unravel_step_int + \bool_if:NT #1 + { + \__unravel_print:x + { + [===== + \bool_if:NT \g__unravel_number_steps_bool + { ~ Step ~ \int_to_arabic:n { \g__unravel_step_int } ~ } + =====]~ + \int_compare:nNnTF + { \str_count:N \g__unravel_action_text_str } + > { \g__unravel_max_action_int } + { + \str_range:Nnn \g__unravel_action_text_str + { 1 } { \g__unravel_max_action_int - 3 } ... + } + { \g__unravel_action_text_str } + } + \__unravel_print_state: + \__unravel_prompt: + } } -\cs_new_eq:NN \__unravel_print_done:x \__unravel_print_action:x -\cs_new_protected_nopar:Npn \__unravel_print_assigned_token: +\cs_new_protected:Npn \__unravel_print_assigned_token: { \__unravel_after_assignment: % ^^A todo: simplify - \__unravel_print_action:x + \__unravel_print_assignment:x { Set~ \exp_after:wN \token_to_str:N \l__unravel_defined_tl = \exp_after:wN \token_to_meaning:N \l__unravel_defined_tl } \__unravel_omit_after_assignment:w } -\cs_new_protected_nopar:Npn \__unravel_print_assigned_register: +\cs_new_protected:Npn \__unravel_print_assigned_register: { \__unravel_after_assignment: % ^^A todo: simplify - \__unravel_exp_args:Nx \__unravel_print_action:x + \__unravel_exp_args:Nx \__unravel_print_assignment:x { \exp_not:n { @@ -5013,7 +5260,7 @@ } \__unravel_omit_after_assignment:w } -\cs_new_protected_nopar:Npn \__unravel_print_welcome: +\cs_new_protected:Npn \__unravel_print_welcome: { \__unravel_print_message:nn { } { @@ -5032,25 +5279,25 @@ { [=====~Start~=====] } } \__unravel_print_state: + \__unravel_prompt: } -\cs_new_protected_nopar:Npn \__unravel_print_outcome: - { \__unravel_print:n { [=====~End~=====] } } -\cs_new_protected_nopar:Npn \__unravel_prompt: +\cs_new_protected:Npn \__unravel_print_outcome: + { \__unravel_print_message:nn { } { [=====~End~=====] } } +\cs_new_protected:Npn \__unravel_prompt: { - \int_gdecr:N \g__unravel_nonstop_int - \int_compare:nNnF \g__unravel_nonstop_int > \c_zero + \int_compare:nNnF \g__unravel_nonstop_int > 0 { \group_begin: \__unravel_set_escapechar:n { -1 } - \int_set_eq:NN \tex_endlinechar:D \c_minus_one + \int_set:Nn \tex_endlinechar:D { -1 } \tl_use:N \g__unravel_before_prompt_tl \__unravel_prompt_aux: \group_end: } } -\cs_new_protected_nopar:Npn \__unravel_prompt_aux: +\cs_new_protected:Npn \__unravel_prompt_aux: { - \int_compare:nNnT { \etex_interactionmode:D } = { 3 } + \int_compare:nNnT { \tex_interactionmode:D } = { 3 } { \bool_if:NTF \g__unravel_explicit_prompt_bool { \ior_str_get:Nc \c__unravel_prompt_ior } @@ -5068,7 +5315,7 @@ { m } { \__unravel_print_meaning: \__unravel_prompt_aux: } { q } { - \int_gset_eq:NN \g__unravel_noise_int \c_minus_one + \int_gset:Nn \g__unravel_online_int { -1 } \int_gzero:N \g__unravel_nonstop_int } { x } @@ -5080,7 +5327,7 @@ { s } { \__unravel_prompt_scan_int:nn {#1} \__unravel_prompt_silent_steps:n } { o } { \__unravel_prompt_scan_int:nn {#1} - { \int_gset:Nn \g__unravel_noise_int } } + { \int_gset:Nn \g__unravel_online_int } } { C } { \__unravel_exp_args:Nx \use:n @@ -5114,7 +5361,7 @@ \cs_new_protected:Npn \__unravel_prompt_help: { \__unravel_print:n { "m":~meaning~of~first~token } - \__unravel_print:n { "q":~semi-quiet~(same~as~"o1") } + \__unravel_print:n { "q":~semi-quiet~(same~as~"o-1") } \__unravel_print:n { "x"/"X":~exit~this~instance~of~unravel/TeX } \__unravel_print:n { "s":~do~~steps~silently } \__unravel_print:n @@ -5126,12 +5373,12 @@ } \cs_new_protected:Npn \__unravel_prompt_silent_steps:n #1 { - \int_compare:nNnF {#1} < \c_zero + \int_compare:nNnF {#1} < 0 { - \int_gset_eq:NN \g__unravel_noise_int \c_minus_one + \int_gset:Nn \g__unravel_online_int { -1 } \tl_gset:Nn \g__unravel_before_prompt_tl { - \int_gset_eq:NN \g__unravel_noise_int \c_one + \int_gset:Nn \g__unravel_online_int { 1 } \tl_gclear:N \g__unravel_before_prompt_tl } \int_gset:Nn \g__unravel_nonstop_int {#1} @@ -5145,7 +5392,7 @@ } \cs_new_protected:Npn \__unravel_prompt_vert:Nn #1#2 { - \int_gset_eq:NN \g__unravel_noise_int \c_minus_one + \int_gset:Nn \g__unravel_online_int { -1 } \tl_gset:Nf \g__unravel_before_print_state_tl { \exp_args:NNf \exp_stop_f: \int_compare:nNnTF @@ -5156,12 +5403,12 @@ { \int_max:nn { \g__unravel_nonstop_int } { 2 } } } { - \int_gset_eq:NN \g__unravel_noise_int \c_one + \int_gset:Nn \g__unravel_online_int { 1 } \tl_gclear:N \g__unravel_before_print_state_tl } } } -\cs_new_protected_nopar:Npn \__unravel_prompt_all: +\cs_new_protected:Npn \__unravel_prompt_all: { \tl_gset:Nx \g__unravel_tmpc_tl { @@ -5171,6 +5418,8 @@ \int_gset_eq:NN \g__unravel_max_output_int \c_max_int \int_gset_eq:NN \g__unravel_max_input_int \c_max_int \__unravel_print_state: + \int_gdecr:N \g__unravel_nonstop_int + \__unravel_prompt: } \__unravel_prompt_all_aux:N \g__unravel_max_output_int \__unravel_prompt_all_aux:N \g__unravel_max_input_int @@ -5195,8 +5444,8 @@ } \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:cpn { __unravel_tex_msg_error_#1: } {#2} + \cs_new:cpn { __unravel_tex_msg_help_#1: } {#3} } \cs_new_protected:Npn \__unravel_tex_error:nn #1#2 { @@ -5225,6 +5474,10 @@ max-output .int_gset:N = \g__unravel_default_max_output_int , max-input .int_gset:N = \g__unravel_default_max_input_int , number-steps .bool_gset:N = \g__unravel_default_number_steps_bool , + online .int_gset:N = \g__unravel_default_online_int , + trace-assigns .bool_gset:N = \g__unravel_default_trace_assign_bool , + trace-expansion .bool_gset:N = \g__unravel_default_trace_expansion_bool , + trace-other .bool_gset:N = \g__unravel_default_trace_other_bool , welcome-message .bool_gset:N = \g__unravel_default_welcome_message_bool , } \keys_define:nn { unravel } @@ -5235,6 +5488,10 @@ max-output .int_gset:N = \g__unravel_max_output_int , max-input .int_gset:N = \g__unravel_max_input_int , number-steps .bool_gset:N = \g__unravel_number_steps_bool , + online .int_gset:N = \g__unravel_online_int , + trace-assigns .bool_gset:N = \g__unravel_trace_assigns_bool , + trace-expansion .bool_gset:N = \g__unravel_trace_expansion_bool , + trace-other .bool_gset:N = \g__unravel_trace_other_bool , welcome-message .bool_gset:N = \g__unravel_welcome_message_bool , } \tl_map_inline:nn { { /defaults } { } } @@ -5252,16 +5509,27 @@ number-steps = false , welcome-message = false , } , + mute .meta:nn = + { unravel #1 } + { + trace-assigns = false , + trace-expansion = false , + trace-other = false , + welcome-message = false , + online = -1 , + } } } -\NewDocumentCommand \unravel { O { } m } { \unravel:nn {#1} {#2} } +\NewDocumentCommand \unravel { O { } +m } { \unravel:nn {#1} {#2} } \NewDocumentCommand \unravelsetup { m } { \unravel_setup:n {#1} } \cs_new_protected:Npn \unravel_setup:n #1 { \keys_set:nn { unravel/defaults } {#1} \keys_set:nn { unravel } {#1} } -\cs_new_protected:Npn \unravel:nn #1#2 +\cs_new_protected:Npn \unravel:nn { \__unravel_unravel_marker: \__unravel:nn } +\cs_new_eq:NN \__unravel_unravel_marker: \__unravel_special_relax: +\cs_new_protected:Npn \__unravel:nn #1#2 { \__unravel_init_key_vars: \keys_set:nn { unravel } {#1} @@ -5274,17 +5542,27 @@ \__unravel_final_test: \__unravel_exit_point: } -\cs_new_protected_nopar:Npn \__unravel_init_key_vars: +\cs_new_protected:Npn \unravel_get:nnN #1#2#3 + { + \unravel:nn {#1} {#2} + \tl_set:Nx #3 { \gtl_left_tl:N \g__unravel_output_gtl } + } +\cs_new_protected:Npn \__unravel_init_key_vars: { \bool_gset_eq:NN \g__unravel_explicit_prompt_bool \g__unravel_default_explicit_prompt_bool \bool_gset_eq:NN \g__unravel_internal_debug_bool \g__unravel_default_internal_debug_bool \bool_gset_eq:NN \g__unravel_number_steps_bool \g__unravel_default_number_steps_bool + \int_gset_eq:NN \g__unravel_online_int \g__unravel_default_online_int + \bool_gset_eq:NN \g__unravel_trace_assigns_bool \g__unravel_default_trace_assigns_bool + \bool_gset_eq:NN \g__unravel_trace_expansion_bool \g__unravel_default_trace_expansion_bool + \bool_gset_eq:NN \g__unravel_trace_other_bool \g__unravel_default_trace_other_bool \bool_gset_eq:NN \g__unravel_welcome_message_bool \g__unravel_default_welcome_message_bool \int_gset_eq:NN \g__unravel_max_action_int \g__unravel_default_max_action_int \int_gset_eq:NN \g__unravel_max_output_int \g__unravel_default_max_output_int \int_gset_eq:NN \g__unravel_max_input_int \g__unravel_default_max_input_int + \int_gzero:N \g__unravel_nonstop_int } -\cs_new_protected_nopar:Npn \__unravel_init_vars: +\cs_new_protected:Npn \__unravel_init_vars: { \seq_gclear:N \g__unravel_prev_input_seq \gtl_gclear:N \g__unravel_output_gtl @@ -5297,26 +5575,26 @@ \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: +\cs_new_protected:Npn \__unravel_main_loop: { \__unravel_get_x_next: \__unravel_set_cmd: \__unravel_do_step: \__unravel_main_loop: } -\cs_new_protected_nopar:Npn \__unravel_final_test: +\cs_new_protected:Npn \__unravel_final_test: { \bool_if:nTF { \tl_if_empty_p:N \g__unravel_if_limit_tl - && \int_compare_p:nNn \g__unravel_if_limit_int = \c_zero - && \int_compare_p:nNn \g__unravel_if_depth_int = \c_zero + && \int_compare_p:nNn \g__unravel_if_limit_int = 0 + && \int_compare_p:nNn \g__unravel_if_depth_int = 0 && \seq_if_empty_p:N \g__unravel_prev_input_seq } { \__unravel_input_if_empty:TF { } { \__unravel_final_bad: } } { \__unravel_final_bad: } } -\cs_new_protected_nopar:Npn \__unravel_final_bad: +\cs_new_protected:Npn \__unravel_final_bad: { \__unravel_error:nnnnn { internal } { the-last-unravel-finished-badly } { } { } { } @@ -5387,6 +5665,8 @@ { The~primitive~\iow_char:N\\endinput~was~ignored. } \msg_new:nnn { unravel } { missing-something } { Something~is~missing,~sorry! } +\msg_new:nnn { unravel } { nested-unravel } + { The~\iow_char:N\\unravel~command~may~not~be~nested. } \msg_new:nnnn { unravel } { tex-error } { TeX~sees~"#1"~and~throws~an~error:\\\\ \iow_indent:n {#2} } { -- cgit v1.2.3