From eb76e93af3b7c53f70f6fd840a6923541250b1ba Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 6 Sep 2019 21:14:35 +0000 Subject: l3 (6sep19) git-svn-id: svn://tug.org/texlive/trunk@52041 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/latex/l3backend/l3backend-dvipdfmx.def | 4 +- .../tex/latex/l3backend/l3backend-dvips.def | 36 +- .../tex/latex/l3backend/l3backend-dvisvgm.def | 31 +- .../tex/latex/l3backend/l3backend-pdfmode.def | 2 +- .../tex/latex/l3backend/l3backend-xdvipdfmx.def | 4 +- .../texmf-dist/tex/latex/l3kernel/expl3-code.tex | 529 +++++++++++++++------ .../tex/latex/l3kernel/expl3-generic.tex | 2 +- Master/texmf-dist/tex/latex/l3kernel/expl3.sty | 2 +- Master/texmf-dist/tex/latex/l3kernel/l3doc.cls | 5 +- 9 files changed, 430 insertions(+), 185 deletions(-) (limited to 'Master/texmf-dist/tex/latex') diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def index d69ffae6bf7..8b8ce109289 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvipdfmx.def @@ -26,7 +26,7 @@ %% File: l3backend-basics.dtx \ProvidesExplFile {l3backend-dvipdfmx.def}{2019-04-06}{} - {L3 Experimental backend support: dvipdfmx} + {L3 backend support: dvipdfmx} \cs_new_eq:NN \__kernel_backend_literal:e \tex_special:D \cs_new_protected:Npn \__kernel_backend_literal:n #1 { \__kernel_backend_literal:e { \exp_not:n {#1} } } @@ -543,7 +543,7 @@ width ~ \dim_eval:n {#1} ~ height ~ \dim_eval:n {#2} ~ depth ~ \dim_eval:n {#3} ~ - << #4 >> + <> } } \cs_new:Npn \__pdf_backend_annotation_last: diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def index d259a884fe8..cf837f7e101 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvips.def @@ -26,7 +26,7 @@ %% File: l3backend-basics.dtx \ProvidesExplFile {l3backend-dvips.def}{2019-04-06}{} - {L3 Experimental backend support: dvips} + {L3 backend support: dvips} \cs_new_eq:NN \__kernel_backend_literal:e \tex_special:D \cs_new_protected:Npn \__kernel_backend_literal:n #1 { \__kernel_backend_literal:e { \exp_not:n {#1} } } @@ -371,7 +371,7 @@ \cs_new_protected:Npn \__draw_backend_color_fill:n #1 { \__kernel_backend_postscript:n - { SDict ~ begin ~ /color.fc ~ { #1 } ~ def ~ end } + { /color.fc ~ { #1 } ~ def } } \cs_generate_variant:Nn \__draw_backend_color_fill:n { x } \cs_new_protected:Npn \__draw_backend_color_stroke:n #1 @@ -485,7 +485,7 @@ } \cs_new_protected:Npn \__pdf_backend_object_write_stream:nnn #1#2#3 { - \__pdf_postscript:n + \__kernel_backend_postscript:n { [nobreak] mark ~ #1 ~ ( #3 ) /PUT ~ pdfmark ~ @@ -936,14 +936,14 @@ \cs_new_protected:Npn \__pdf_backend_annotation_aux:nnnn #1#2#3#4 { \box_move_down:nn {#3} - { \hbox:n { \__pdf_postscript:n { pdf.save.ll } } } + { \hbox:n { \__kernel_backend_postscript:n { pdf.save.ll } } } \hbox:n {#4} \box_move_up:nn {#2} { \hbox:n { \tex_kern:D \dim_eval:n {#1} \scan_stop: - \__pdf_postscript:n { pdf.save.ur } + \__kernel_backend_postscript:n { pdf.save.ur } } } \int_gincr:N \g__pdf_backend_object_int @@ -978,7 +978,7 @@ \cs_new_protected:Npn \__pdf_backend_link_begin_aux:nw #1 { \bool_gset_true:N \g__pdf_backend_link_bool - \__pdf_postscript:n + \__kernel_backend_postscript:n { /pdf.link.dict ( #1 ) def } \tl_gset:Nn \g__pdf_backend_link_dict_tl {#1} \__pdf_backend_link_sf_save: @@ -1010,18 +1010,18 @@ { \evensidemargin } } \box_move_down:nn { \box_dp:N \l__pdf_backend_content_box } - { \hbox:n { \__pdf_postscript:n { pdf.save.linkll } } } + { \hbox:n { \__kernel_backend_postscript:n { pdf.save.linkll } } } \__pdf_breaklink_postscript:n { pdf.bordertracking.begin } \__pdf_breaklink_usebox:N \l__pdf_backend_content_box \__pdf_breaklink_postscript:n { pdf.bordertracking.end } \box_move_up:nn { \box_ht:N \l__pdf_backend_content_box } { \hbox:n - { \__pdf_postscript:n { pdf.save.linkur } } + { \__kernel_backend_postscript:n { pdf.save.linkur } } } \int_gincr:N \g__pdf_backend_object_int \int_gset_eq:NN \g__pdf_backend_link_int \g__pdf_backend_object_int - \__pdf_postscript:x + \__kernel_backend_postscript:x { mark /_objdef { pdf.obj \int_use:N \g__pdf_backend_link_int } @@ -1035,7 +1035,7 @@ \cs_new_protected:Npn \__pdf_backend_link_minima: { \hbox_set:Nn \l__pdf_backend_model_box { Gg } - \__pdf_postscript:x + \__kernel_backend_postscript:x { /pdf.linkdp.pad ~ \dim_to_decimal:n @@ -1063,7 +1063,7 @@ } \cs_new_protected:Npn \__pdf_backend_link_outerbox:n #1 { - \__pdf_postscript:x + \__kernel_backend_postscript:x { /pdf.outerbox [ @@ -1107,20 +1107,20 @@ { \vbox_set:Nn \@cclv { - \__pdf_postscript:n + \__kernel_backend_postscript:n { pdf.globaldict /pdf.brokenlink.rect ~ known { pdf.bordertracking.continue } if } \vbox_unpack_drop:N \@cclv - \__pdf_postscript:n + \__kernel_backend_postscript:n { pdf.bordertracking.endpage } } } } \tl_set:Nn \l__pdf_breaklink_pdfmark_tl { pdf.pdfmark } - \cs_set_eq:NN \__pdf_breaklink_postscript:n \__pdf_postscript:n + \cs_set_eq:NN \__pdf_breaklink_postscript:n \__kernel_backend_postscript:n \cs_set_eq:NN \__pdf_breaklink_usebox:N \hbox_unpack:N } } @@ -1128,14 +1128,14 @@ { { pdf.obj \int_use:N \g__pdf_backend_link_int } } \cs_new_protected:Npn \__pdf_backend_link_margin:n #1 { - \__pdf_postscript:x + \__kernel_backend_postscript:x { /pdf.linkmargin { \dim_to_decimal:n {#1} ~ pdf.pt.dvi } def } } \cs_new_protected:Npn \__pdf_backend_destination:nn #1#2 { - \__pdf_postscript:n { pdf.dest.anchor } + \__kernel_backend_postscript:n { pdf.dest.anchor } \__pdf_backend_pdfmark:x { /View @@ -1164,11 +1164,11 @@ \hbox_set:Nn \l__pdf_internal_box {#2} \box_move_down:nn { \box_dp:N \l__pdf_internal_box } - { \hbox:n { \__pdf_postscript:n { pdf.save.ll } } } + { \hbox:n { \__kernel_backend_postscript:n { pdf.save.ll } } } \box_use:N \l__pdf_internal_box \box_move_up:nn { \box_ht:N \l__pdf_internal_box } - { \hbox:n { \__pdf_postscript:n { pdf.save.ur } } } + { \hbox:n { \__kernel_backend_postscript:n { pdf.save.ur } } } \__pdf_backend_pdfmark:n { /View diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def index 254169a1c6d..62dbf732d82 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-dvisvgm.def @@ -26,7 +26,7 @@ %% File: l3backend-basics.dtx \ProvidesExplFile {l3backend-dvisvgm.def}{2019-04-06}{} - {L3 Experimental backend support: dvisvgm} + {L3 backend support: dvisvgm} \cs_new_eq:NN \__kernel_backend_literal:e \tex_special:D \cs_new_protected:Npn \__kernel_backend_literal:n #1 { \__kernel_backend_literal:e { \exp_not:n {#1} } } @@ -463,9 +463,34 @@ } %% File: l3backend-graphics.dtx \AtBeginDocument + { \cs_new_eq:NN \__graphics_backend_getbb_eps:n \graphics_read_bb:n } +\cs_new_protected:Npn \__graphics_backend_getbb_jpg:n #1 { - \cs_new_eq:NN \__graphics_backend_getbb_png:n \graphics_extract_bb:n - \cs_new_eq:NN \__graphics_backend_getbb_jpg:n \graphics_extract_bb:n + \int_zero:N \l_graphics_page_int + \tl_clear:N \l_graphics_pagebox_tl + \graphics_extract_bb:n {#1} + } +\cs_new_eq:NN \__graphics_backend_getbb_png:n \__graphics_backend_getbb_jpg:n +\cs_new_protected:Npn \__graphics_backend_getbb_pdf:n #1 + { + \tl_clear:N \l_graphics_decodearray_tl + \bool_set_false:N \l_graphics_interpolate_bool + \graphics_extract_bb:n {#1} + } +\cs_new_protected:Npn \__graphics_backend_include_eps:n #1 + { __graphics_backend_include:nn { PSfile } {#1} } +\cs_new_protected:Npn \__graphics_backend_include_pdf:n #1 + { __graphics_backend_include:nn { pdffile } {#1} } +\cs_new_protected:Npn \__graphics_backend_include:nn #1#2 + { + \__kernel_backend_literal:x + { + #1 = #2 \c_space_tl + llx = \dim_to_decimal_in_bp:n \l_graphics_llx_dim \c_space_tl + lly = \dim_to_decimal_in_bp:n \l_graphics_lly_dim \c_space_tl + urx = \dim_to_decimal_in_bp:n \l_graphics_urx_dim \c_space_tl + ury = \dim_to_decimal_in_bp:n \l_graphics_ury_dim + } } \cs_new_protected:Npn \__graphics_backend_include_png:n #1 { diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def index 111678846c4..f1900f32c0d 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-pdfmode.def @@ -26,7 +26,7 @@ %% File: l3backend-basics.dtx \ProvidesExplFile {l3backend-pdfmode.def}{2019-04-06}{} - {L3 Experimental backend support: PDF mode} + {L3 backend support: PDF mode} \cs_new_eq:NN \__kernel_backend_literal:e \tex_special:D \cs_new_protected:Npn \__kernel_backend_literal:n #1 { \__kernel_backend_literal:e { \exp_not:n {#1} } } diff --git a/Master/texmf-dist/tex/latex/l3backend/l3backend-xdvipdfmx.def b/Master/texmf-dist/tex/latex/l3backend/l3backend-xdvipdfmx.def index b89b0625e46..7dd12f6e434 100644 --- a/Master/texmf-dist/tex/latex/l3backend/l3backend-xdvipdfmx.def +++ b/Master/texmf-dist/tex/latex/l3backend/l3backend-xdvipdfmx.def @@ -26,7 +26,7 @@ %% File: l3backend-basics.dtx \ProvidesExplFile {l3backend-xdvipdfmx.def}{2019-04-06}{} - {L3 Experimental backend support: xdvipdfmx} + {L3 backend support: xdvipdfmx} \cs_new_eq:NN \__kernel_backend_literal:e \tex_special:D \cs_new_protected:Npn \__kernel_backend_literal:n #1 { \__kernel_backend_literal:e { \exp_not:n {#1} } } @@ -589,7 +589,7 @@ width ~ \dim_eval:n {#1} ~ height ~ \dim_eval:n {#2} ~ depth ~ \dim_eval:n {#3} ~ - << #4 >> + <> } } \cs_new:Npn \__pdf_backend_annotation_last: diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex index 85d7a37dc7f..56c156d337f 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-code.tex @@ -65,7 +65,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2019-08-25}% +\def\ExplFileDate{2019-09-05}% \begingroup \def\next{\endgroup}% \expandafter\ifx\csname PackageError\endcsname\relax @@ -4450,7 +4450,7 @@ \fi: } \prg_generate_conditional_variant:Nnn \tl_if_blank:n - { V , o } { p , T , F , TF } + { e , V , o } { p , T , F , TF } \prg_new_conditional:Npnn \tl_if_empty:N #1 { p , T , F , TF } { \if_meaning:w #1 \c_empty_tl @@ -4630,6 +4630,21 @@ \cs_new_protected:Npn \tl_map_inline:Nn { \exp_args:No \tl_map_inline:nn } \cs_generate_variant:Nn \tl_map_inline:Nn { c } +\cs_new:Npn \tl_map_tokens:nn #1#2 + { + \__tl_map_tokens:nn {#2} #1 + \q_recursion_tail + \prg_break_point:Nn \tl_map_break: { } + } +\cs_new:Npn \tl_map_tokens:Nn + { \exp_args:No \tl_map_tokens:nn } +\cs_generate_variant:Nn \tl_map_tokens:Nn { c } +\cs_new:Npn \__tl_map_tokens:nn #1#2 + { + \quark_if_recursion_tail_break:nN {#2} \tl_map_break: + \use:n {#1} {#2} + \__tl_map_tokens:nn {#1} + } \cs_new_protected:Npn \tl_map_variable:nNn #1#2#3 { \__tl_map_variable:Nnn #2 {#3} #1 @@ -6312,6 +6327,20 @@ \prg_break_point:Nn \seq_map_break: { \__seq_pop_item_def: } } \cs_generate_variant:Nn \seq_map_inline:Nn { c } +\cs_new:Npn \seq_map_tokens:Nn #1#2 + { + \exp_last_unbraced:Nno + \use_i:nn { \__seq_map_tokens:nw {#2} } #1 + \prg_break: \__seq_item:n { } \prg_break_point: + \prg_break_point:Nn \seq_map_break: { } + } +\cs_generate_variant:Nn \seq_map_tokens:Nn { c } +\cs_new:Npn \__seq_map_tokens:nw #1#2 \__seq_item:n #3 + { + #2 + \use:n {#1} {#3} + \__seq_map_tokens:nw {#1} + } \cs_new_protected:Npn \seq_map_variable:NNn #1#2#3 { \__seq_push_item_def:x @@ -9348,6 +9377,20 @@ } } \cs_generate_variant:Nn \prop_map_inline:Nn { c } +\cs_new:Npn \prop_map_tokens:Nn #1#2 + { + \exp_last_unbraced:Nno + \use_i:nn { \__prop_map_tokens:nwwn {#2} } #1 + \prg_break: \__prop_pair:wn \s__prop { } \prg_break_point: + \prg_break_point:Nn \prop_map_break: { } + } +\cs_new:Npn \__prop_map_tokens:nwwn #1#2 \__prop_pair:wn #3 \s__prop #4 + { + #2 + \use:n {#1} {#3} {#4} + \__prop_map_tokens:nwwn {#1} + } +\cs_generate_variant:Nn \prop_map_tokens:Nn { c } \cs_new:Npn \prop_map_break: { \prg_map_break:Nn \prop_map_break: { } } \cs_new:Npn \prop_map_break:n @@ -10536,7 +10579,11 @@ \tl_new:N \l__iow_file_name_tl \cs_new_protected:Npn \iow_open:Nn #1#2 { - \__kernel_file_name_sanitize:nN {#2} \l__iow_file_name_tl + \tl_set:Nx \l__iow_file_name_tl + { + \exp_args:Ne \__kernel_file_name_quote:n + { \__kernel_file_name_sanitize:n {#2} } + } \iow_close:N #1 \seq_gpop:NNTF \g__iow_streams_seq \l__iow_stream_tl { \__iow_open_stream:NV #1 \l__iow_file_name_tl } @@ -10934,7 +10981,6 @@ } \exp_args:NV \__iow_tmp:w \c_catcode_other_space_tl \tl_new:N \l__file_internal_tl -\ior_new:N \g__file_internal_ior \str_new:N \g_file_curr_dir_str \str_new:N \g_file_curr_ext_str \str_new:N \g_file_curr_name_str @@ -10970,33 +11016,83 @@ \str_new:N \l__file_name_str \seq_new:N \l_file_search_path_seq \seq_new:N \l__file_tmp_seq -\cs_new_protected:Npn \__kernel_file_name_sanitize:nN #1#2 +\cs_new:Npn \__kernel_file_name_sanitize:n #1 { - \group_begin: - \seq_map_inline:Nn \l_char_active_seq - { - \tl_set:Nx \l__file_internal_tl { \iow_char:N ##1 } - \char_set_active_eq:NN ##1 \l__file_internal_tl - } - \tl_set:Nx \l__file_internal_tl {#1} - \exp_args:NNNV \group_end: - \str_set:Nn #2 \l__file_internal_tl + \__kernel_file_name_expand_loop:w #1 + \q_recursion_tail \q_recursion_stop } -\cs_new_protected:Npn \__file_name_quote:nN #1#2 +\cs_new:Npn \__kernel_file_name_expand_loop:w #1 \q_recursion_stop { - \str_set:Nx #2 {#1} - \int_if_even:nF - { 0 \tl_map_function:NN #2 \__file_name_quote_aux:n } + \tl_if_head_is_N_type:nTF {#1} + { \__kernel_file_name_expand_N_type:Nw } { - \__kernel_msg_error:nnx - { kernel } { unbalanced-quote-in-filename } {#2} + \tl_if_head_is_group:nTF {#1} + { \__kernel_file_name_expand_group:nw } + { \__kernel_file_name_expand_space:w } + } + #1 \q_recursion_stop + } +\cs_new:Npn \__kernel_file_name_expand_N_type:Nw #1 + { + \quark_if_recursion_tail_stop:N #1 + \bool_lazy_and:nnTF + { \token_if_expandable_p:N #1 } + { + \bool_not_p:n + { + \bool_lazy_any_p:n + { + { \token_if_protected_macro_p:N #1 } + { \token_if_protected_long_macro_p:N #1 } + { \token_if_active_p:N #1 } + } + } + } + { \exp_after:wN \__kernel_file_name_expand_loop:w #1 } + { + \token_to_str:N #1 + \__kernel_file_name_expand_loop:w + } + } +\cs_new:Npx \__kernel_file_name_expand_group:nw #1 + { + \c_left_brace_str + \exp_not:N \__kernel_file_name_expand_loop:w + #1 + \c_right_brace_str + } +\exp_last_unbraced:NNo + \cs_new:Npx \__kernel_file_name_expand_space:w \c_space_tl + { + \c_space_tl + \exp_not:N \__kernel_file_name_expand_loop:w + } +\cs_new:Npn \__kernel_file_name_quote:n #1 + { + \__kernel_file_name_quote_auxi:nnnw {#1} { 0 } { } + #1 " \q_recursion_tail " \q_recursion_stop + } +\cs_new:Npn \__kernel_file_name_quote_auxi:nnnw #1#2#3#4 " + { + \quark_if_recursion_tail_stop_do:nn {#4} + { \__kernel_file_name_quote_auxii:nnn {#1} {#2} {#3} } + \__kernel_file_name_quote_auxi:nnnw {#1} { #2 + 1 } { #3#4 } + } +\cs_new:Npn \__kernel_file_name_quote_auxii:nnn #1#2#3 + { + \int_if_even:nT {#2} + { + \__kernel_msg_expandable_error:nnn + { kernel } { unbalanced-quote-in-filename } {#1} } - \tl_remove_all:Nn #2 { " } - \tl_if_in:NnT #2 { ~ } - { \str_set:Nx #2 { " \exp_not:V #2 " } } + \__kernel_file_name_quote_auxiii:nw {#3} #3 ~ \q_nil \q_stop + } +\cs_new:Npn \__kernel_file_name_quote_auxiii:nw #1 #2 ~ #3 \q_stop + { + \quark_if_nil:nTF {#3} + { #1 } + { "#1" } } -\cs_new:Npn \__file_name_quote_aux:n #1 - { \token_if_eq_charcode:NNT #1 " { + 1 } } \tl_const:Nx \c__file_marker_tl { : \token_to_str:N : } \cs_new_protected:Npn \file_get:nnN #1#2#3 { @@ -11034,56 +11130,195 @@ \group_end: \tl_set:No #1 {#2} } -\cs_new_protected:Npn \file_get_full_name:nN #1#2 - { - \file_get_full_name:nNF {#1} #2 - { \tl_set:Nn #2 { \q_no_value } } - } -\cs_generate_variant:Nn \file_get_full_name:nN { V } -\prg_new_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF } +\cs_new_eq:NN \__file_file_size:n \tex_filesize:D +\sys_if_engine_luatex:T { - \__kernel_file_name_sanitize:nN {#1} \l__file_base_name_tl - \__file_get_full_name_search:nN { } \use:n - \seq_map_inline:Nn \l_file_search_path_seq - { \__file_get_full_name_search:nN { ##1 / } \seq_map_break:n } - \cs_if_exist:NT \input@path + \cs_gset:Npn \__file_file_size:n #1 { - \tl_map_inline:Nn \input@path - { \__file_get_full_name_search:nN { ##1 } \tl_map_break:n } + \lua_now:e + { + l3kernel.filesize + ( " \lua_escape:e {#1} " ) + } } - \tl_set:Nn \l__file_full_name_tl { \q_no_value } - \prg_break_point: - \quark_if_no_value:NTF \l__file_full_name_tl + } +\cs_new:Npn \file_full_name:n #1 + { + \exp_args:Ne \__file_full_name:n + { \__kernel_file_name_sanitize:n {#1} } + } +\cs_new:Npn \__file_full_name:n #1 + { + \exp_args:Ne \__file_full_name:nn + { \__kernel_file_name_quote:n {#1} } {#1} + } +\cs_new:Npn \__file_full_name:nn #1#2 + { + \tl_if_blank:nF {#1} { - \ior_close:N \g__file_internal_ior - \prg_return_false: + \tl_if_blank:eTF { \__file_file_size:n {#1} } + { + \seq_map_tokens:Nn \l_file_search_path_seq + { \__file_full_name_aux:nn {#2} } + \cs_if_exist:NT \input@path + { + \tl_map_tokens:Nn \input@path + { \__file_full_name_aux:nn {#2} } + } + \__file_file_name_end: + } + { \__file_file_ext_check:n {#1} } } + } +\cs_new:Npn \__file_full_name_aux:nn #1#2 + { + \exp_args:Ne \__file_full_name_aux:n + { \__kernel_file_name_quote:e { \tl_to_str:n {#2} #1 } } + } +\cs_new:Npn \__file_full_name_aux:n #1 + { + \tl_if_blank:eF { \__file_file_size:n {#1} } { - \file_parse_full_name:VNNN \l__file_full_name_tl - \l__file_dir_str \l__file_name_str \l__file_ext_str - \str_if_empty:NT \l__file_ext_str + \seq_map_break:n { - \__kernel_ior_open:No \g__file_internal_ior - { \l__file_full_name_tl .tex } - \ior_if_eof:NF \g__file_internal_ior - { \tl_put_right:Nn \l__file_full_name_tl { .tex } } + \__file_file_ext_check:n {#1} + \__file_file_name_cleanup:w } - \ior_close:N \g__file_internal_ior - \tl_set_eq:NN #2 \l__file_full_name_tl - \prg_return_true: } } +\cs_new:Npn \__file_file_name_cleanup:w #1 \__file_file_name_end:n #2 { } +\cs_new:Npn \__file_file_name_end: { } +\cs_new:Npn \__file_file_ext_check:n #1 + { \__file_file_ext_check_auxi:nw {#1} #1 " #1 " \q_stop } +\cs_new:Npn \__file_file_ext_check_auxi:nw #1#2 " #3 " #4 \q_stop + { \__file_file_ext_check_auxii:nw {#1} #3 / \q_nil / \q_stop } +\cs_new:Npn \__file_file_ext_check_auxii:nw #1#2 / #3 / #4 \q_stop + { + \quark_if_nil:nTF {#3} + { \__file_file_ext_check_auxiii:nw {#1} #2 . \q_nil . \q_stop } + { \__file_file_ext_check_auxii:nw {#1} #3 / #4 \q_stop } + } +\cs_new:Npx \__file_file_ext_check_auxiii:nw #1#2 . #3 . #4 \q_stop + { + \exp_not:N \quark_if_nil:nTF {#3} + { \exp_not:N \__kernel_file_name_quote:n { #1 \tl_to_str:n { .tex } } } + {#1} + } +\bool_lazy_or:nnF + { \cs_if_exist_p:N \tex_filesize:D } + { \sys_if_engine_luatex_p: } + { + \cs_gset:Npn \file_full_name:n #1 + { + \__kernel_msg_expandable_error:nnn + { kernel } { primitive-not-available } + { \(pdf)filesize } + } + } +\__kernel_msg_new:nnnn { kernel } { primitive-not-available } + { Primitive~\token_to_str:N #1 not~available } + { + The~version~of~your~TeX~engine~does~not~provide~functionality~equivalent~to~ + the~#1~primitive. + } +\cs_new_protected:Npn \file_get_full_name:nN #1#2 + { + \file_get_full_name:nNF {#1} #2 + { \tl_set:Nn #2 { \q_no_value } } + } +\cs_generate_variant:Nn \file_get_full_name:nN { V } +\prg_new_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF } + { + \tl_set:Nx #2 + { \file_full_name:n {#1} } + \tl_if_empty:NTF #2 + { \prg_return_false: } + { \prg_return_true: } + } \cs_generate_variant:Nn \file_get_full_name:nNT { V } \cs_generate_variant:Nn \file_get_full_name:nNF { V } \cs_generate_variant:Nn \file_get_full_name:nNTF { V } +\bool_lazy_or:nnF + { \cs_if_exist_p:N \tex_filesize:D } + { \sys_if_engine_luatex_p: } + { + \prg_set_protected_conditional:Npnn \file_get_full_name:nN #1#2 { T , F , TF } + { + \__file_get_full_name_search:nN { } \use:n + \seq_map_inline:Nn \l_file_search_path_seq + { \__file_get_full_name_search:nN { ##1 / } \seq_map_break:n } + \cs_if_exist:NT \input@path + { + \tl_map_inline:Nn \input@path + { \__file_get_full_name_search:nN { ##1 } \tl_map_break:n } + } + \tl_set:Nn \l__file_full_name_tl { \q_no_value } + \prg_break_point: + \quark_if_no_value:NTF \l__file_full_name_tl + { + \ior_close:N \g__file_internal_ior + \prg_return_false: + } + { + \file_parse_full_name:VNNN \l__file_full_name_tl + \l__file_dir_str \l__file_name_str \l__file_ext_str + \str_if_empty:NT \l__file_ext_str + { + \__kernel_ior_open:No \g__file_internal_ior + { \l__file_full_name_tl .tex } + \ior_if_eof:NF \g__file_internal_ior + { \tl_put_right:Nn \l__file_full_name_tl { .tex } } + } + \ior_close:N \g__file_internal_ior + \tl_set_eq:NN #2 \l__file_full_name_tl + \prg_return_true: + } + } + } \cs_new_protected:Npn \__file_get_full_name_search:nN #1#2 { - \__file_name_quote:nN - { \tl_to_str:n {#1} \l__file_base_name_tl } - \l__file_full_name_tl + \tl_set:Nx \l__file_full_name_tl + { + \exp_args:Ne \__kernel_file_name_quote:n + { \tl_to_str:n {#1} \l__file_base_name_tl } + } \__kernel_ior_open:No \g__file_internal_ior \l__file_full_name_tl \ior_if_eof:NF \g__file_internal_ior { #2 { \prg_break: } } } +\bool_lazy_or:nnF + { \cs_if_exist_p:N \tex_filesize:D } + { \sys_if_engine_luatex_p: } + { \ior_new:N \g__file_internal_ior } +\cs_new:Npn \file_mdfive_hash:n #1 + { \__file_details:nn {#1} { mdfivesum } } +\cs_new:Npn \file_size:n #1 + { \__file_details:nn {#1} { size } } +\cs_new:Npn \file_timestamp:n #1 + { \__file_details:nn {#1} { moddate } } +\cs_new:Npn \__file_details:nn #1#2 + { + \exp_args:Ne \__file_details_aux:nn + { \file_full_name:n {#1} } {#2} + } +\cs_new:Npn \__file_details_aux:nn #1#2 + { + \tl_if_blank:nF {#1} + { \use:c { tex_file #2 :D } {#1} } + } +\sys_if_engine_luatex:TF + { + \cs_gset:Npn \__file_details_aux:nn #1#2 + { + \lua_now:e + { l3kernel.file#2 ( " \lua_escape:e { #1 } " ) } + } + } + { + \cs_gset:Npn \file_mdfive_hash:n #1 + { \exp_args:Ne \__file_mdfive_hash:n { \file_full_name:n {#1} } } + \cs_new:Npn \__file_mdfive_hash:n #1 + { \tex_mdfivesum:D file {#1} } + } \cs_new_protected:Npn \file_get_mdfive_hash:nN #1#2 { \file_get_mdfive_hash:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } } \cs_new_protected:Npn \file_get_size:nN #1#2 @@ -11091,76 +11326,40 @@ \cs_new_protected:Npn \file_get_timestamp:nN #1#2 { \file_get_timestamp:nNF {#1} #2 { \tl_set:Nn #2 { \q_no_value } } } \prg_new_protected_conditional:Npnn \file_get_mdfive_hash:nN #1#2 { T , F , TF } - { \__file_get_details:nnN {#1} { mdfivesum } {#2} } + { \__file_get_details:nnN {#1} { mdfive_hash } #2 } \prg_new_protected_conditional:Npnn \file_get_size:nN #1#2 { T , F , TF } - { \__file_get_details:nnN {#1} { size } {#2} } + { \__file_get_details:nnN {#1} { size } #2 } \prg_new_protected_conditional:Npnn \file_get_timestamp:nN #1#2 { T , F , TF } - { \__file_get_details:nnN {#1} { moddate } {#2} } + { \__file_get_details:nnN {#1} { timestamp } #2 } \cs_new_protected:Npn \__file_get_details:nnN #1#2#3 { - \file_get_full_name:nNTF {#1} \l__file_full_name_tl - { - \tl_set:Nx #3 - { - \use:c { tex_file #2 :D } \exp_after:wN - { \l__file_full_name_tl } - } - \prg_return_true: - } + \tl_set:Nx #3 + { \use:c { file_ #2 :n } {#1} } + \tl_if_empty:NTF #3 { \prg_return_false: } + { \prg_return_true: } } -\sys_if_engine_luatex:TF +\bool_lazy_or:nnF + { \cs_if_exist_p:N \tex_filesize:D } + { \sys_if_engine_luatex_p: } { \cs_set_protected:Npn \__file_get_details:nnN #1#2#3 - { - \file_get_full_name:nNTF {#1} \l__file_full_name_tl - { - \tl_set:Nx #3 - { - \lua_now:e - { - l3kernel.file#2 - ( " \lua_escape:e { \l__file_full_name_tl } " ) - } - } - \prg_return_true: - } - { \prg_return_false: } - } - } - { - \prg_set_protected_conditional:Npnn \file_get_mdfive_hash:nN #1#2 - { T , F , TF } - { - \file_get_full_name:nNTF {#1} \l__file_full_name_tl + { + \tl_clear:N #3 + \__kernel_msg_error:nnx + { kernel } { primitive-not-available } { - \tl_set:Nx #2 + \token_to_str:N \(pdf)file + \str_case:nn {#2} { - \tex_mdfivesum:D file \exp_after:wN - { \l__file_full_name_tl } + { mdfive_hash } { mdfivesum } + { timestamp } { moddate } + { size } { size } } - \prg_return_true: - } - { \prg_return_false: } - } - \cs_if_exist:NF \tex_filesize:D - { - \cs_set_protected:Npn \__file_get_details:nnN #1#2#3 - { - \tl_clear:N #3 - \__kernel_msg_error:nnx - { kernel } { primitive-not-available } - { \exp_not:c { (pdf)file #2 } } - \prg_return_false: } + \prg_return_false: } } -\__kernel_msg_new:nnnn { kernel } { primitive-not-available } - { Primitive~\token_to_str:N #1 not~available } - { - The~version~of~XeTeX~in~use~does~not~provide~functionality~equivalent~to~ - the~\token_to_str:N #1 primitive. - } \prg_new_protected_conditional:Npnn \file_if_exist:n #1 { T , F , TF } { \file_get_full_name:nNTF {#1} \l__file_full_name_tl @@ -11181,9 +11380,8 @@ \cs_new_protected:Npn \file_input_stop: { \tex_endinput:D } \cs_new_protected:Npn \__kernel_file_missing:n #1 { - \__kernel_file_name_sanitize:nN {#1} \l__file_base_name_tl \__kernel_msg_error:nnx { kernel } { file-not-found } - { \l__file_base_name_tl } + { \__kernel_file_name_sanitize:n {#1} } } \cs_new_protected:Npn \file_input:n #1 { @@ -11296,6 +11494,11 @@ } \cs_new_protected:Npn \GetIdInfo { + \tl_clear_new:N \ExplFileDescription + \tl_clear_new:N \ExplFileDate + \tl_clear_new:N \ExplFileName + \tl_clear_new:N \ExplFileExtension + \tl_clear_new:N \ExplFileVersion \group_begin: \char_set_catcode_space:n { 32 } \exp_after:wN @@ -27445,20 +27648,6 @@ \cs_new_protected:Npn \bool_gset_inverse:N #1 { \bool_if:NTF #1 { \bool_gset_false:N } { \bool_gset_true:N } #1 } \cs_generate_variant:Nn \bool_gset_inverse:N { c } -\cs_new:Npn \prop_map_tokens:Nn #1#2 - { - \exp_last_unbraced:Nno - \use_i:nn { \__prop_map_tokens:nwwn {#2} } #1 - \prg_break: \__prop_pair:wn \s__prop { } \prg_break_point: - \prg_break_point:Nn \prop_map_break: { } - } -\cs_new:Npn \__prop_map_tokens:nwwn #1#2 \__prop_pair:wn #3 \s__prop #4 - { - #2 - \use:n {#1} {#3} {#4} - \__prop_map_tokens:nwwn {#1} - } -\cs_generate_variant:Nn \prop_map_tokens:Nn { c } \cs_new:Npn \prop_rand_key_value:N #1 { \prop_if_empty:NF #1 @@ -27929,8 +28118,8 @@ { \tl_if_exist:cTF { c__char_mixed_case_ \token_to_str:N #1 _tl } { - \__char_change_case_multi:v - { c__char_mixed_case_ \token_to_str:N #1 _tl } + \__char_change_case_multi:vN + { c__char_mixed_case_ \token_to_str:N #1 _tl } #1 } { \char_upper_case:N #1 } } @@ -27940,48 +28129,76 @@ { \tl_if_exist:cTF { c__char_ #1 _case_ \token_to_str:N #3 _tl } { - \__char_change_case_multi:v - { c__char_ #1 _case_ \token_to_str:N #3 _tl } + \__char_change_case_multi:vN + { c__char_ #1 _case_ \token_to_str:N #3 _tl } #3 } { \exp_args:Nf \__char_change_case:nN { #2 { `#3 } } #3 } } \cs_new:Npn \__char_change_case:nN #1#2 { \int_compare:nNnTF {#1} = 0 - { \__char_change_case:N #2 } - { \char_generate:nn {#1} { \char_value_catcode:n {#1} } } + { #2 } + { \char_generate:nn {#1} { \__char_change_case_catcode:N #2 } } } -\cs_new:Npn \__char_change_case_multi:n #1 - { \__char_change_case_multi:NNNw #1 \q_no_value \q_no_value \q_stop } -\cs_new:Npn \__char_change_case_multi:NNNw #1#2#3#4 \q_stop +\cs_new:Npn \__char_change_case_multi:nN #1#2 + { \__char_change_case_multi:NNNNw #2 #1 \q_no_value \q_no_value \q_stop } +\cs_generate_variant:Nn \__char_change_case_multi:nN { v } +\cs_new:Npn \__char_change_case_multi:NNNNw #1#2#3#4#5 \q_stop { - \quark_if_no_value:NTF #3 + \quark_if_no_value:NTF #4 { - \quark_if_no_value:NTF #2 - { \__char_change_case:N #1 } - { \__char_change_case:NN #1#2 } + \quark_if_no_value:NTF #3 + { \__char_change_case:NN #1 #2 } + { \__char_change_case:NNN #1 #2#3 } } - { \__char_change_case:NNN #1#2#3 } + { \__char_change_case:NNNN #1 #2#3#4 } } -\cs_generate_variant:Nn \__char_change_case_multi:n { v } -\cs_new:Npn \__char_change_case:NN #1#2 +\cs_new:Npn \__char_change_case:NNN #1#2#3 { \exp_args:Nnf \use:nn - { \__char_change_case:N #1 } - { \__char_change_case:N #2 } + { \__char_change_case:NN #1 #2 } + { \__char_change_case:NN #1 #3 } } -\cs_new:Npn \__char_change_case:NNN #1#2#3 +\cs_new:Npn \__char_change_case:NNNN #1#2#3#4 { \exp_args:Nnff \use:nnn - { \__char_change_case:N #1 } - { \__char_change_case:N #2 } - { \__char_change_case:N #3 } + { \__char_change_case:NN #1 #2 } + { \__char_change_case:NN #1 #3 } + { \__char_change_case:NN #1 #4 } } -\cs_new:Npn \__char_change_case:N #1 - { \char_generate:nn { `#1 } { \char_value_catcode:n { `#1 } } } -\bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } +\cs_new:Npn \__char_change_case:NN #1#2 + { \char_generate:nn { `#2 } { \__char_change_case_catcode:N #1 } } +\cs_new:Npn \__char_change_case_catcode:N #1 { - \cs_set_eq:NN \__char_change_case:nN \use_ii:nn + \if_catcode:w \exp_not:N #1 \c_math_toggle_token + 3 + \else: + \if_catcode:w \exp_not:N #1 \c_alignment_token + 4 + \else: + \if_catcode:w \exp_not:N #1 \c_math_superscript_token + 7 + \else: + \if_catcode:w \exp_not:N #1 \c_math_subscript_token + 8 + \else: + \if_catcode:w \exp_not:N #1 \c_space_token + 10 + \else: + \if_catcode:w \exp_not:N #1 \c_catcode_letter_token + 11 + \else: + \if_catcode:w \exp_not:N #1 \c_catcode_other_token + 12 + \else: + 13 + \fi: + \fi: + \fi: + \fi: + \fi: + \fi: + \fi: } \cs_new:Npn \char_str_lower_case:N #1 { \__char_str_change_case:nNN { lower } \char_value_lccode:n #1 } @@ -28007,7 +28224,7 @@ { \tl_to_str:n {#2} } { \char_generate:nn {#1} { 12 } } } -\bool_lazy_or:nnF { \sys_if_engine_luatex_p: } { \sys_if_engine_xetex_p: } +\cs_if_exist:NF \tex_Uchar:D { \cs_set:Npn \__char_str_change_case:nN #1#2 { \tl_to_str:n {#2} } diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex index 0d3472387e4..1f53dd5e36d 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3-generic.tex @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2019-08-25}% +\def\ExplFileDate{2019-09-05}% \let\ExplLoaderFileDate\ExplFileDate \begingroup \def\tempa{LaTeX2e}% diff --git a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty index 70baa6b0d20..c01796c2f30 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/expl3.sty +++ b/Master/texmf-dist/tex/latex/l3kernel/expl3.sty @@ -19,7 +19,7 @@ %% and all files in that bundle must be distributed together. %% %% File: expl3.dtx -\def\ExplFileDate{2019-08-25}% +\def\ExplFileDate{2019-09-05}% \let\ExplLoaderFileDate\ExplFileDate \ProvidesPackage{expl3} [% diff --git a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls index 111e14befe9..f2db802a945 100644 --- a/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls +++ b/Master/texmf-dist/tex/latex/l3kernel/l3doc.cls @@ -227,6 +227,7 @@ { n } { n } { o } { n } { f } { n } + { e } { n } { x } { n } { V } { n } { v } { n } @@ -300,7 +301,9 @@ \bool_if:NT #3 { \token_to_str:N : - \str_if_eq:nnTF { #1 ~ } { \exp_args } + \bool_lazy_or:nnTF + { \str_if_eq_p:nn { #1 ~ } { \exp_args } } + { \str_if_eq_p:nn { #1 ~ } { \exp_last_unbraced } } { \exp_not:n {#2} } { \__codedoc_signature_base_form:n {#2} } } -- cgit v1.2.3