diff options
author | Karl Berry <karl@freefriends.org> | 2009-06-09 23:31:15 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2009-06-09 23:31:15 +0000 |
commit | 215b9a864d5829070bdc66ba736986eb72e5143e (patch) | |
tree | fe0882c81fc4ec945cee4b512f72eaa21ea5f791 /Master/texmf-dist/tex/latex/expl3/l3expan.sty | |
parent | df90ec06321940c2f066b05e12f1b5ab099105da (diff) |
expl3 1407 (9jun09)
git-svn-id: svn://tug.org/texlive/trunk@13686 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/expl3/l3expan.sty')
-rw-r--r-- | Master/texmf-dist/tex/latex/expl3/l3expan.sty | 367 |
1 files changed, 221 insertions, 146 deletions
diff --git a/Master/texmf-dist/tex/latex/expl3/l3expan.sty b/Master/texmf-dist/tex/latex/expl3/l3expan.sty index 4e8ee86603e..c4929513b38 100644 --- a/Master/texmf-dist/tex/latex/expl3/l3expan.sty +++ b/Master/texmf-dist/tex/latex/expl3/l3expan.sty @@ -15,7 +15,7 @@ %% Do not distribute a modified version of this file. %% %% -%% File: l3expan.dtx Copyright (C) 1990-2006 LaTeX3 project +%% File: l3expan.dtx Copyright (C) 1990-2009 LaTeX3 project %% %% It may be distributed and/or modified under the conditions of the %% LaTeX Project Public License (LPPL), either version 1.3c of this @@ -33,7 +33,7 @@ %% %% The development version of the bundle can be found at %% -%% http://www.latex-project.org/cgi-bin/cvsweb.cgi/ +%% http://www.latex-project.org/svnroot/experimental/trunk/ %% %% for those people who are interested. %% @@ -48,171 +48,246 @@ %% %% ----------------------------------------------------------------------- \RequirePackage{l3names} -\GetIdInfo$Id: l3expan.dtx 735 2008-01-14 22:31:02Z morten $ +\GetIdInfo$Id: l3expan.dtx 1376 2009-06-01 17:01:30Z morten $ {L3 Experimental Argument Expansion module} \ProvidesExplPackage {\filename}{\filedate}{\fileversion}{\filedescription} -\RequirePackage{l3tlp} -\tlp_new:Nn\l_exp_tlp{} -\def_long_new:Npn\exp_arg_next:nnn#1#2#3{ +\package_check_loaded_expl: +\cs_new_nopar:Npn \l_exp_tl {} +\cs_new:Npn\exp_arg_next:nnn#1#2#3{ + #2\:::{#3{#1}} +} +\cs_new:Npn\exp_arg_next_nobrace:nnn#1#2#3{ #2\:::{#3#1} } -\def_long_new:Npn\::n#1\:::#2#3{ +\cs_new:Npn\:::#1{#1} +\cs_new:Npn\::n#1\:::#2#3{ #1\:::{#2{#3}} } -\def_long_new:Npn\::N#1\:::#2#3{ +\cs_new:Npn\::N#1\:::#2#3{ #1\:::{#2#3} } -\def_long_new:Npn\::c#1\:::#2#3{ - \exp_after:NN\exp_arg_next:nnn\cs:w #3\cs_end:{#1}{#2} +\cs_new:Npn\::c#1\:::#2#3{ + \exp_after:wN\exp_arg_next_nobrace:nnn\cs:w #3\cs_end:{#1}{#2} } -\def_long_new:Npn\::o#1\:::#2#3{ - \exp_after:NN\exp_arg_next:nnn\exp_after:NN{\exp_after:NN{#3}}{#1}{#2} +\cs_new:Npn\::o#1\:::#2#3{ + \exp_after:wN\exp_arg_next:nnn\exp_after:wN{#3}{#1}{#2} } -\def_long_new:Npn\::f#1\:::#2#3{ - \exp_after:NN\exp_arg_next:nnn - \exp_after:NN{\exp_after:NN{\int_to_roman:w -`0 #3}} +\cs_new:Npn\::f#1\:::#2#3{ + \exp_after:wN\exp_arg_next:nnn + \exp_after:wN{\tex_romannumeral:D -`0 #3} {#1}{#2} } -\def_new:Npn \exp_stop_f: {~} -\let_new:NN \exp_arg:x \expanded % Move eventually. +\cs_new_nopar:Npn \exp_stop_f: {~} +\cs_new_eq:NN \exp_arg:x \expanded % Move eventually. \cs_if_free:NTF\exp_arg:x{ - \def_long_new:Npn\::x#1\:::#2#3{ - % \tlp_set:Nx\l_exp_tlp{{{#3}}} - \def:Npx \l_exp_tlp{{{#3}}} - \exp_after:NN\exp_arg_next:nnn\l_exp_tlp{#1}{#2}} + \cs_new:Npn\::x#1\:::#2#3{ + \cs_set_nopar:Npx \l_exp_tl{{#3}} + \exp_after:wN\exp_arg_next:nnn\l_exp_tl{#1}{#2}} } { - \def_long_new:Npn\::x#1\:::#2#3{ - \exp_after:NN\exp_arg_next:nnn - \exp_after:NN{\exp_arg:x{{#3}}}{#1}{#2} + \cs_new:Npn\::x#1\:::#2#3{ + \exp_after:wN\exp_arg_next:nnn + \exp_after:wN{\exp_arg:x{{#3}}}{#1}{#2} } } -\def_long_new:Npn\:::#1{#1} -\def_long_new:Npn\::C#1\:::#2#3{ - \exp_after:NN\exp_C_aux:nnn\cs:w #3\cs_end:{#1}{#2}} -\def_long_new:Npn\exp_C_aux:nnn #1{ - \exp_after:NN - \exp_arg_next:nnn - \exp_after:NN - { - \exp_after:NN - {#1} - } -} -\def_long_new:Npn\::E#1\:::#2#3{ - \exp_after:NN\exp_arg_next:nnn \exp_after:NN{#3}{#1}{#2} -} -\def_long_new:Npn\::e#1\:::#2#3{ - \exp_after:NN\exp_arg_next:nnn \exp_after:NN{#3}{#1}{#2} -} -\def_long_new:Npn\::d#1\:::#2#3{ - \exp_after:NN\exp_after:NN\exp_after:NN\exp_arg_next:nnn - \exp_after:NN\exp_after:NN\exp_after:NN{ - \exp_after:NN\exp_after:NN\exp_after:NN{#3}}{#1}{#2} -} -\let:NN \exp_args:NE \exp_after:NN -\def:Npn \exp_args:NNE #1{\exp_args:NE#1\exp_args:NE} -\def:Npn \exp_args:NNNE #1#2{\exp_args:NE#1\exp_args:NE#2\exp_args:NE} -\def:Npn \exp_args:NEE #1{\exp_args:NE\exp_args:NE\exp_args:NE#1\exp_args:NE} -\def:Npn \exp_args:NcE #1#2{\exp_after:NN #1\cs:w #2\exp_after:NN\cs_end:} -\def:Npn \exp_args:Nd {\::d\:::} -\def:Npn \exp_args:NNd {\::N\::d\:::} - -\def:Npn \exp_args:NC {\::C\:::} -\def:Npn \exp_args:NNC {\::N\::C\:::} -\def:Npn \exp_args:NNf {\::N\::f\:::} -\def:Npn \exp_args:NNno {\::N\::n\::o\:::} -\def:Npn \exp_args:NNnx {\::N\::n\::x\:::} % new -\def:Npn \exp_args:NNoo {\::N\::o\::o\:::} % new -\def:Npn \exp_args:NNox {\::N\::o\::x\:::} % new -\def:Npn \exp_args:NNx {\::N\::x\:::} -\def:Npn \exp_args:NcNc {\::c\::N\::c\:::} -\def:Npn \exp_args:NcNo {\::c\::N\::o\:::} -\def:Npn \exp_args:Ncco {\::c\::c\::o\:::} -\def:Npn \exp_args:Ncco {\::c\::c\::o\:::} -\def:Npn \exp_args:Nccx {\::c\::c\::x\:::} -\def:Npn \exp_args:Ncnx {\::c\::n\::x\:::} -\def:Npn \exp_args:Ncx {\::c\::x\:::} -\def:Npn \exp_args:Nf {\::f\:::} -\def:Npn \exp_args:Nfo{\::f\::o\:::} -\def:Npn \exp_args:Nnf {\::n\::f\:::} -\def:Npn \exp_args:NnnN {\::n\::n\::N\:::} %% Strange one this one... -\def:Npn \exp_args:Nnnc {\::n\::n\::c\:::} -\def:Npn \exp_args:Nnno {\::n\::n\::o\:::} -\def:Npn \exp_args:Nnnx {\::n\::n\::x\:::} -\def:Npn \exp_args:Nno {\::n\::o\:::} -\def:Npn \exp_args:Nnox {\::n\::o\::x\:::} -\def:Npn \exp_args:Nnx {\::n\::x\:::} -\def:Npn \exp_args:Noo {\::o\::o\:::} -\def:Npn \exp_args:Noox {\::o\::o\::x\:::} -\def:Npn \exp_args:Nox {\::o\::x\:::} -\def:Npn \exp_args:Nx {\::x\:::} -\def:Npn \exp_args:Nxo {\::x\::o\:::} -\def:Npn \exp_args:Nxx {\::x\::x\:::} -\def_long_new:Npn\exp_not:o#1{\exp_not:n\exp_after:NN{#1}} -\def_long_new:Npn\exp_not:d#1{ - \exp_not:n\exp_after:NN\exp_after:NN\exp_after:NN{#1} -} -\def_long_new:Npn\exp_not:f#1{ - \exp_not:n\exp_after:NN{\int_to_roman:w -`0 #1} -} -\def_new:Npn\exp_not:E{\exp_after:NN\exp_not:N} -\def_long_new:Npn\exp_not:c#1{\exp_after:NN\exp_not:N\cs:w#1\cs_end:} -\def_long_new:Npn \exp_args:No #1#2{\exp_after:NN#1\exp_after:NN{#2}} -\def_long_new:Npn \exp_args:NOo #1#2#3{\exp_after:NN\exp_args:No \exp_after:NN#1 - \exp_after:NN#2\exp_after:NN{#3}} -\def_long_new:Npn \exp_args:NOOo #1#2#3#4{\exp_after:NN\exp_args:NOo - \exp_after:NN#1\exp_after:NN#2\exp_after:NN#3\exp_after:NN{#4}} -\def_long_new:Npn \exp_args:NNo #1#2#3{\exp_after:NN#1\exp_after:NN#2 - \exp_after:NN{#3}} -\def_long_new:Npn \exp_args:NNO #1#2#3 {\exp_after:NN#1 - \exp_after:NN#2 #3} -\def_long_new:Npn \exp_args:NNOo #1#2#3#4{\exp_after:NN\exp_args:NNo - \exp_after:NN#1\exp_after:NN#2\exp_after:NN#3\exp_after:NN{#4}} -\def_long_new:Npn \exp_args:NNNo #1#2#3#4{\exp_after:NN#1\exp_after:NN#2 - \exp_after:NN#3\exp_after:NN{#4}} -\def_long_new:Npn \exp_args:Nc #1#2{\exp_after:NN#1\cs:w#2\cs_end:} -\def_long_new:Npn \exp_args:NNc #1#2#3{\exp_after:NN#1\exp_after:NN#2 +\cs_new:Npn \::V#1\:::#2#3{ + \exp_after:wN\exp_arg_next:nnn + \exp_after:wN{ + \tex_romannumeral:D -`0 + \exp_eval_register:N #3 + } + {#1}{#2} +} +\cs_new:Npn \::v#1\:::#2#3{ + \exp_after:wN\exp_arg_next:nnn + \exp_after:wN{ + \tex_romannumeral:D -`0 + \exp_eval_register:c {#3} + } + {#1}{#2} +} +\cs_set_nopar:Npn \exp_eval_register:N #1{ + \exp_after:wN \if_meaning:w \exp_not:N #1#1 + \if_meaning:w \tex_relax:D #1 + \exp_eval_error_msg:w + \fi: + \else: + \exp_after:wN \use_i_ii:nnn + \fi: + \exp_after:wN \exp_stop_f: \tex_the:D #1 +} +\cs_set_nopar:Npn \exp_eval_register:c #1{ + \exp_after:wN\exp_eval_register:N\cs:w #1\cs_end: +} +\group_begin:% +\tex_catcode:D`\!=11\tex_relax:D% +\tex_catcode:D`\ =11\tex_relax:D% +\cs_gset:Npn\exp_eval_error_msg:w#1\tex_the:D#2{% +\fi:\fi:\erroneous variable used!}% +\group_end:% +\cs_new:Npn\::d#1\:::#2#3{ + \exp_after:wN\exp_after:wN\exp_after:wN\exp_arg_next:nnn + \exp_after:wN\exp_after:wN\exp_after:wN{#3}{#1}{#2} +} +\cs_new:Npn \exp_args:No #1#2{\exp_after:wN#1\exp_after:wN{#2}} +\cs_new:Npn \exp_args:NNo #1#2#3{\exp_after:wN#1\exp_after:wN#2 + \exp_after:wN{#3}} +\cs_new:Npn \exp_args:NNNo #1#2#3#4{\exp_after:wN#1\exp_after:wN#2 + \exp_after:wN#3\exp_after:wN{#4}} +\cs_set:Npn \exp_args:Nc #1#2{\exp_after:wN#1\cs:w#2\cs_end:} +\cs_new:Npn \exp_args:cc #1#2{\cs:w #1\exp_after:wN\cs_end:\cs:w #2\cs_end:} +\cs_new:Npn \exp_args:NNc #1#2#3{\exp_after:wN#1\exp_after:wN#2 \cs:w#3\cs_end:} -\def_long_new:Npn \exp_args:NOc#1#2#3{\exp_after:NN\exp_args:No\exp_after:NN - #1\exp_after:NN#2\cs:w#3\cs_end:} -\def_long_new:Npn \exp_args:Ncc #1#2#3{\exp_after:NN#1 - \cs:w#2\exp_after:NN\cs_end:\cs:w#3\cs_end:} -\def_long_new:Npn \exp_args:Nccc #1#2#3#4{\exp_after:NN#1 - \cs:w#2\exp_after:NN\cs_end:\cs:w#3\exp_after:NN +\cs_new:Npn \exp_args:Ncc #1#2#3{\exp_after:wN#1 + \cs:w#2\exp_after:wN\cs_end:\cs:w#3\cs_end:} +\cs_new:Npn \exp_args:Nccc #1#2#3#4{\exp_after:wN#1 + \cs:w#2\exp_after:wN\cs_end:\cs:w#3\exp_after:wN \cs_end:\cs:w #4\cs_end:} -\def_long_new:Npn \exp_args:Nco #1#2#3{\exp_after:NN#1\cs:w#2\exp_after:NN - \cs_end:\exp_after:NN{#3}} -\def:Npn\exp_def_form:nnn#1#2#3{ - \exp_after:NN - \def:Npn - \cs:w - #1:#3 - \exp_after:NN - \cs_end: - \exp_after:NN - { - \cs:w - exp_args:N#3 - \exp_after:NN - \cs_end: - \cs:w - #1:#2 - \cs_end: - } - \cs_if_free:cT - {exp_args:N#3} - {\def:cpx {exp_args:N#3} - {\exp_args_form_x:w #3 :} - } -} -\def_new:Npn\exp_args_form_x:w #1 { +\cs_new:Npn \exp_args:Nco #1#2#3{\exp_after:wN#1\cs:w#2\exp_after:wN + \cs_end:\exp_after:wN{#3}} +\cs_set_nopar:Npn \exp_args:Nd {\::d\:::} +\cs_set_nopar:Npn \exp_args:Nf {\::f\:::} +\cs_set_nopar:Npn \exp_args:Nv {\::v\:::} +\cs_set_nopar:Npn \exp_args:NV {\::V\:::} +\cs_set_nopar:Npn \exp_args:Nx {\::x\:::} +\cs_set_nopar:Npn \exp_args:NNd {\::N\::d\:::} +\cs_set_nopar:Npn \exp_args:NNf {\::N\::f\:::} +\cs_set_nopar:Npn \exp_args:NNv {\::N\::v\:::} +\cs_set_nopar:Npn \exp_args:NNV {\::N\::V\:::} +\cs_set_nopar:Npn \exp_args:NNx {\::N\::x\:::} + +\cs_set_nopar:Npn \exp_args:Ncx {\::c\::x\:::} +\cs_set_nopar:Npn \exp_args:Nfo {\::f\::o\:::} +\cs_set_nopar:Npn \exp_args:Nff {\::f\::f\:::} +\cs_set_nopar:Npn \exp_args:Ncf {\::c\::f\:::} +\cs_set_nopar:Npn \exp_args:Nnf {\::n\::f\:::} +\cs_set_nopar:Npn \exp_args:Nno {\::n\::o\:::} +\cs_set_nopar:Npn \exp_args:Nnx {\::n\::x\:::} + +\cs_set_nopar:Npn \exp_args:Noc {\::o\::c\:::} +\cs_set_nopar:Npn \exp_args:Noo {\::o\::o\:::} +\cs_set_nopar:Npn \exp_args:Nox {\::o\::x\:::} + +\cs_set_nopar:Npn \exp_args:NVV {\::V\::V\:::} + +\cs_set_nopar:Npn \exp_args:Nxo {\::x\::o\:::} +\cs_set_nopar:Npn \exp_args:Nxx {\::x\::x\:::} +\cs_set_nopar:Npn \exp_args:NNno {\::N\::n\::o\:::} +\cs_set_nopar:Npn \exp_args:NNnx {\::N\::n\::x\:::} +\cs_set_nopar:Npn \exp_args:NNoo {\::N\::o\::o\:::} +\cs_set_nopar:Npn \exp_args:NNox {\::N\::o\::x\:::} + +\cs_set_nopar:Npn \exp_args:Nnnc {\::n\::n\::c\:::} +\cs_set_nopar:Npn \exp_args:Nnno {\::n\::n\::o\:::} +\cs_set_nopar:Npn \exp_args:Nnnx {\::n\::n\::x\:::} +\cs_set_nopar:Npn \exp_args:Nnox {\::n\::o\::x\:::} + +\cs_set_nopar:Npn \exp_args:NcNc {\::c\::N\::c\:::} +\cs_set_nopar:Npn \exp_args:NcNo {\::c\::N\::o\:::} +\cs_set_nopar:Npn \exp_args:Ncco {\::c\::c\::o\:::} +\cs_set_nopar:Npn \exp_args:Ncco {\::c\::c\::o\:::} +\cs_set_nopar:Npn \exp_args:Nccx {\::c\::c\::x\:::} +\cs_set_nopar:Npn \exp_args:Ncnx {\::c\::n\::x\:::} + +\cs_set_nopar:Npn \exp_args:Noox {\::o\::o\::x\:::} +\cs_set_nopar:Npn \exp_args:Nooo {\::o\::o\::o\:::} +\cs_new:Npn\exp_not:o#1{\exp_not:n\exp_after:wN{#1}} +\cs_new:Npn\exp_not:d#1{ + \exp_not:n\exp_after:wN\exp_after:wN\exp_after:wN{#1} +} +\cs_new:Npn\exp_not:f#1{ + \exp_not:n\exp_after:wN{\tex_romannumeral:D -`0 #1} +} +\cs_new:Npn\exp_not:v#1{ + \exp_not:n\exp_after:wN{\tex_romannumeral:D -`0 \exp_eval_register:c {#1}} +} +\cs_new:Npn\exp_not:V#1{ + \exp_not:n\exp_after:wN{\tex_romannumeral:D -`0 \exp_eval_register:N #1} +} +\cs_new:Npn\exp_not:c#1{\exp_after:wN\exp_not:N\cs:w#1\cs_end:} +\cs_new:Npn \cs_generate_variant:Nn #1 { + \chk_if_exist_cs:N #1 + \cs_split_function:NN #1 \cs_generate_variant_aux:nnNn +} +\cs_set:Npn \cs_generate_variant_aux:nnNn #1#2#3#4{ + \cs_generate_variant_aux:nnw {#1}{#2} #4,?,\q_recursion_stop +} +\cs_set:Npn \cs_generate_variant_aux:nnw #1 #2 #3, { + \if:w ? #3 + \exp_after:wN \use_none_delimit_by_q_recursion_stop:w + \fi: + \cs_if_free:cTF { + #1:#3\use:c {use_none:\cs_generate_variant_aux:N #3 ?}#2 + } + { + \cs_new_nopar:cpx { + #1:#3 \use:c{use_none:\cs_generate_variant_aux:N #3 ?}#2 + } + { + \exp_not:c { exp_args:N #3} \exp_not:c {#1:#2} + } + \cs_generate_internal_variant:n {#3} + } + { + \iow_log:x{ + Variant~\token_to_str:c { + #1:#3\use:c {use_none:\cs_generate_variant_aux:N #3 ?}#2 + }~already~defined;~ not~ changing~ it~on~line~ + \tex_the:D \tex_inputlineno:D + } + } + \cs_generate_variant_aux:nnw{#1}{#2} +} +\cs_set:Npn \cs_generate_variant_aux:N #1{ + \if:w ?#1 \exp_after:wN\use_none:nn \fi: n \cs_generate_variant_aux:N +} +\cs_new:Npn \cs_generate_internal_variant:n #1 { + \cs_if_free:cT { exp_args:N #1 }{ + \cs_new:cpx { exp_args:N #1 } + { \cs_generate_internal_variant_aux:n #1 : } + } +} +\cs_new:Npn \cs_generate_internal_variant_aux:n #1 { \exp_not:c{::#1} - \if_meaning:NN #1 : - \else: - \exp_after:NN\exp_args_form_x:w - \fi:} + \if_meaning:w #1 : + \exp_after:wN \use_none:n + \fi: + \cs_generate_internal_variant_aux:n +} +\cs_new:Npn \exp_arg_last_unbraced:nn #1#2 { #2#1 } +\cs_new:Npn \::f_unbraced \:::#1#2 { + \exp_after:wN \exp_arg_last_unbraced:nn + \exp_after:wN { \tex_romannumeral:D -`0 #2 } {#1} +} +\cs_new:Npn \::o_unbraced \:::#1#2 { + \exp_after:wN \exp_arg_last_unbraced:nn \exp_after:wN {#2 }{#1} +} +\cs_new:Npn \::V_unbraced \:::#1#2 { + \exp_after:wN \exp_arg_last_unbraced:nn + \exp_after:wN { \tex_romannumeral:D -`0 \exp_eval_register:N #2 } {#1} +} +\cs_new:Npn \::v_unbraced \:::#1#2 { + \exp_after:wN \exp_arg_last_unbraced:nn + \exp_after:wN { + \tex_romannumeral:D -`0 \exp_eval_register:c {#2} + } {#1} +} +\cs_new_nopar:Npn \exp_last_unbraced:Nf { \::f_unbraced \::: } +\cs_new_nopar:Npn \exp_last_unbraced:NV { \::V_unbraced \::: } +\cs_new_nopar:Npn \exp_last_unbraced:Nv { \::v_unbraced \::: } +\cs_new_nopar:Npn \exp_last_unbraced:NcV { + \::c \::V_unbraced \::: +} +\cs_new:Npn \exp_last_unbraced:NNo #1#2#3 { + \exp_after:wN #1 \exp_after:wN #2 #3 +} +\cs_new_nopar:Npn \exp_last_unbraced:NNV { + \::N \::V_unbraced \::: +} +\cs_new:Npn \exp_last_unbraced:NNNo #1#2#3#4 { + \exp_after:wN #1 \exp_after:wN #2 \exp_after:wN #3 #4 +} %% %% %% End of file `l3expan.sty'. |