summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/expl3/l3expan.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/expl3/l3expan.sty')
-rw-r--r--Master/texmf-dist/tex/latex/expl3/l3expan.sty367
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'.