From e5bc967eb0517b8377d70914cc45484e5f4f2c7c Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Fri, 14 Aug 2009 23:52:07 +0000 Subject: etextools (11aug09) git-svn-id: svn://tug.org/texlive/trunk@14676 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/etextools/etextools.sty | 112 +++++++++++++++------ 1 file changed, 82 insertions(+), 30 deletions(-) (limited to 'Master/texmf-dist/tex/latex/etextools') diff --git a/Master/texmf-dist/tex/latex/etextools/etextools.sty b/Master/texmf-dist/tex/latex/etextools/etextools.sty index 0a2382ba988..e11696396a5 100644 --- a/Master/texmf-dist/tex/latex/etextools/etextools.sty +++ b/Master/texmf-dist/tex/latex/etextools/etextools.sty @@ -22,7 +22,6 @@ %% and etextools-examples.tex %% %%% etextools : more e-TeX useful tools for LaTeX package writers -%%% Florent CHERVET \NeedsTeXFormat{LaTeX2e}[1996/12/01] \ProvidesPackage{etextools} [2009/07/14 v2e e-TeX more useful tools for LaTeX package writers] @@ -32,34 +31,49 @@ \AtEndOfPackage{\ettl@restore@space@catcode \let\ettl@restore@space@catcode\ettl@undefined} \catcode`\ =10 + +% A few helper macros \long\def\ettl@afterelse#1\else#2\fi{\fi#1} \long\def\ettl@afterfi#1\fi{\fi#1} \long\def\ettl@afterfifi#1\fi\fi{\fi\fi#1} \long\def\ettl@afterelsefi#1\else#2\fi\fi{\fi#1} +\begingroup\catcode`\|=4 +\long\gdef\ettl@cdr#1#2|{#2} +\endgroup + \newcommand*\@gobblescape{\expandafter\@gobble\string} \newcommand\str@gobblescape[1]{\expandafter\deblank\expandafter{% \expandafter\@gobble\detokenize{#1}}} - \newcommand*\noexpandcs[1]{\expandafter\noexpand\csname #1\endcsname} \newcommand\noexpandafter{\noexpand\expandafter} + +% \expandnext : expansion control +% level 1 : \expandnext#1{...} <=> \expandafter#1\expandafter{...} +% level 2 : \expandnext\expandnext#1{...} etc. \newcommand\expandnext[2]{% \ifx#1\expandnext \ettl@afterelse\expandafter\expandafter\expandafter - \expandafter\@expandnext{#2}{\expandafter\expandafter\expandafter} - \else\ettl@afterfi\expandafter#1\expandafter{#2} + \expandafter\@expandnext{#2}{\expandafter\expandafter\expandafter}% + \else\ettl@afterfi\expandafter#1\expandafter{#2}% \fi} \long\def\@expandnext#1#2#3{% \ifx#1\expandnext \expandafter\ettl@afterelse\expandafter\expandafter\expandafter - \expandafter\@expandnext{#3}{\expandafter#2#2} + \expandafter\@expandnext{#3}{\expandafter#2#2}% \else - \expandafter\ettl@afterfi#2#1#2{#3} + \expandafter\ettl@afterfi#2#1#2{#3}% \fi} + \newcommand\deblank{} -\begingroup\catcode`\&=3% a & as a math shift -\long\gdef\deblank#1{\@deblank#1 &} -\long\gdef\@deblank#1 #2&{\ifblank{#2}{#1}{#1\@deblank#2 &}} -\endgroup +\newcommand\ifempty{} +\begingroup\catcode`\|=4% a | as a tab array +\long\gdef\deblank#1{\@deblank#1 |} +\long\gdef\@deblank#1 #2|{\ifblank{#2}{#1}{#1\@deblank#2 |}} + +% \ifempty{ text }{ true }{ false } +\long\gdef\ifempty#1{\csname @\ifx|#1|first\else second\fi oftwo\endcsname} +\endgroup% catcode group + \newrobustcmd\xifblank[1]{\begingroup \protected@edef\@xifblank{\endgroup \noexpand\ifblank{#1}% @@ -74,16 +88,31 @@ \ettl@afterelse\ifblank{#2}\@secondoftwo\@firstoftwo \else \expandafter\@secondoftwo \fi} -\newcommand\ifsinglechar[2]{% - \expandnext\expandnext\ifblank{\expandafter\@cdr\string#2 \@nil} +\newcommand\ifsinglechar{} +\begingroup\catcode`\|=4 +\long\gdef\ifsinglechar#1#2{% + \csname @\expandafter\expandafter\expandafter\ifx + \expandafter\expandafter\expandafter|% + \expandafter\ettl@cdr\string#2||first\else second\fi + oftwo\endcsname {\iffirstchar{#1}{#2}} \@secondoftwo} +\endgroup% catcode group + +%\FE@testopt{#1}{commands}{default option} \newcommand\FE@testopt[3]{\ifsinglechar [{#1}{#2#1}{#2[{#3}]{#1}}} + +%\FE@ifstar{#1}{\StarredMacro}{\NotStarredMacro} \newcommand\FE@ifstar[3]{\ifsinglechar *{#1}{#2}{#3{#1}}} + +%% \iffalse + +% \DeclareCmdListParser : general constructor for command-list parsers +% \DeclareCmdListParser\ParserName{separator} \newrobustcmd*\DeclareCmdListParser[2]{% \@ifdefinable#1 {\expandafter\etextools@defcmdparser\expandafter{#1}{#2}}} -\begingroup\catcode`\&=3 +\begingroup\catcode`\&=3\catcode`\`=3 \gdef\etextools@defcmdparser#1#2{% \begingroup \def\`##1`{\expandafter\noexpand\csname ##1\endcsname}% @@ -112,27 +141,46 @@ \long\gdef\ettl@lst@doitem#1#2{#1{#2}}% \long\gdef\ettl@listbreak#1&{}% \endgroup + + +% \csvloop[\command]\csvListMacro +% \csvloop*[\command]{item,item,item} \DeclareCmdListParser\csvloop{,} \begingroup\catcode`\|=3 - \gdef\do{\DeclareCmdListParser\listloop{|}\undef\do}\aftergroup\do -\endgroup -\newcommand\csvtolist{\@ifstar\star@csvtolist\nost@csvtolist} -\def\star@csvtolist#1{\let#1\@empty\csvloop*[{\unexpanded{\listadd#1}}]} -\def\nost@csvtolist#1{\let#1\@empty\csvloop[{\unexpanded{\listadd#1}}]} -\newcommand\csvtolistadd{\@ifstar\star@csvtolistadd\nost@csvtolistadd} + \def\do{\DeclareCmdListParser\listloop{|}}% +\expandafter\endgroup\do + +%\csvtolist\csvListMacro +%\csvtolist*{item,item,item} +\newcommand\csvtolist{\@ifstar\star@csvtolist\nost@csvtolist}% +\def\star@csvtolist#1{\let#1\@empty\csvloop*[{\unexpanded{\listadd#1}}]}% +\def\nost@csvtolist#1{\let#1\@empty\csvloop[{\unexpanded{\listadd#1}}]}% + +%\csvtolistadd\csvListMacro +%\csvtolistadd*{item,item,item} +\newcommand\csvtolistadd{\@ifstar\star@csvtolistadd\nost@csvtolistadd}% \def\star@csvtolistadd#1#2{\ifblank{#2} - {\let#1\@empty}{\csvloop*[{\unexpanded{\listadd#1}}]{#2}}} + {\let#1\@empty}{\csvloop*[{\unexpanded{\listadd#1}}]{#2}}}% \def\nost@csvtolistadd#1#2{\ifblank{#2} - {\let#1\@empty}{\csvloop[{\unexpanded{\listadd#1}}]{#2}}} -\newrobustcmd\listdel[2]{\@listdel\def{#1}{#2}} -\newrobustcmd\listgdel[2]{\@listdel\gdef{#2}{#2}} + {\let#1\@empty}{\csvloop[{\unexpanded{\listadd#1}}]{#2}}}% + +%\listdel\listMacro{item} +%\listgdel\listMacro{item} +%\listedel\listMacro{item} +%\listxdel\listMacro{item} +\newrobustcmd\listdel[2]{\@listdel\def{#1}{#2}}% +\newrobustcmd\listgdel[2]{\@listdel\gdef{#1}{#2}}% \newrobustcmd\listxdel[2]{\begingroup \protected@edef\@listxdel{\endgroup - \unexpanded{\@listdel\gdef#1}{#2}% - }\@listxdel} - \begingroup\catcode`\|=3\catcode`\&=3 - \long\gdef\@listdel#1#2#3{% - \begingroup + \unexpanded{\@listdel\gdef{#1}}{#2}% + }\@listxdel}% +\newrobustcmd\listedel[2]{\begingroup + \protected@edef\@listedel{\endgroup + \unexpanded{\@listdel\def{#1}}{#2}% + }\@listedel} +\begingroup\catcode`\|=3\catcode`\&=3 +\long\gdef\@listdel#1#2#3{% +\begingroup \def\@tempa##1|#3|##2&{##1|##2\@tempb}% \def\@tempb|##1|\@tempb##2|\@tempb{% \ifblank{##2}{\unexpanded{##1}} @@ -143,9 +191,10 @@ \expandafter\@tempx\unexpanded\expandafter{#2}&}% }\@redef}% end of \@listdel \endgroup + + +% \getlistindex (result in \indexinlist) \begingroup\catcode`\|=3\catcode`\&=3 -\gdef\ettl@list@first@item#1|#2&{#1} -\gdef\ettl@list@other@item#1|#2&{#2} \gdef\getlistindex#1{\FE@ifstar{#1}{\ettl@getlistindex{}} {\ettl@getlistindex\expandnext}} \gdef\xgetlistindex#1{\FE@ifstar{#1}{\ettl@xgetlistindex{}} @@ -159,6 +208,8 @@ {\expandnext\ifstrequal{\ettl@list@first@item#1&}{#2} {\endgroup\edef\indexinlist{\number#3\relax}} {\expandnext\ettl@get@list@idx{\ettl@list@other@item#1&}{#2}{#3+1}}}} +\gdef\ettl@list@first@item#1|#2&{#1} +\gdef\ettl@list@other@item#1|#2&{#2} \endgroup% catcode group \newcommand\getlistitem[1]{\FE@ifstar{#1}\ettl@getlistitem {\expandnext\ettl@getlistitem}} @@ -174,6 +225,7 @@ \fi\fi}} \endgroup + \endinput %% %% End of file `etextools.sty'. -- cgit v1.2.3