diff options
author | Karl Berry <karl@freefriends.org> | 2010-04-19 22:51:25 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2010-04-19 22:51:25 +0000 |
commit | e381628d4f928231935fdce7a37ae90e3a2a1131 (patch) | |
tree | 929af4cafd86661c260dfa56592f03114fb8e496 | |
parent | 6f50f6bd304c69abef2c051ee1aa83b602027143 (diff) |
etextools update (18apr10)
git-svn-id: svn://tug.org/texlive/trunk@17928 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r-- | Master/texmf-dist/doc/latex/etextools/README | 15 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/etextools/etextools-examples.pdf | bin | 0 -> 105622 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/etextools/etextools-examples.tex | 304 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/etextools/etextools.pdf | bin | 1060019 -> 1093008 bytes | |||
-rw-r--r-- | Master/texmf-dist/source/latex/etextools/etextools.drv | 8 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/etextools/etextools.dtx | 448 | ||||
-rw-r--r-- | Master/texmf-dist/source/latex/etextools/etextools.ins | 5 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/etextools/etextools.sty | 75 |
8 files changed, 774 insertions, 81 deletions
diff --git a/Master/texmf-dist/doc/latex/etextools/README b/Master/texmf-dist/doc/latex/etextools/README index 5974e936ff6..7274a965d8b 100644 --- a/Master/texmf-dist/doc/latex/etextools/README +++ b/Master/texmf-dist/doc/latex/etextools/README @@ -1,8 +1,8 @@ -% etextools v3.1 - (pretty stable ;) - 2009/09/30 +% etextools v3.14159 (stable) - 2010/04/20 % This work consists of the main source file etextools.dtx % and the derived files % etextools.sty, etextools.pdf, etextools.ins, -% examples will be uploaded later... +% etextools-examples.tex % Unpacking: % (a) If etextools.ins is present: % etex etextools.ins @@ -13,13 +13,14 @@ % (quote the arguments according to the demands of your shell) % Documentation: (pdf)latex etextools.dtx; ... % ----------------------------------------------------------------------------------------- - *** The List of Commands is in page 3 of the documentation. *** -etextools provides many (purely expandable) tools for LaTeX ------------------------------- +etextools provides many (purely expandable) tools for LaTeX: - Extensive list management (csv lists, lists of single tokens/characters, etoolbox lists): . purely expandable loops (csvloop, forcsvloop etc.) . conversion (csvtolist etc.)) . addition/deletion (csvadd, listdel etc.) -- Tests on strings (among them \ifstrnum to check if a string could be parsed by eTeX's \number) -- Selective detokenization (\detokenizeChars) and character-test -- Purely expandable macros with options (\FE@testopt) or modifiers (\FE@modifiers) +- Expansion and groups control : \expandnext, \ExpandAfterCmds, \AfterGroup... +- Tests on tokens, characters and control sequences (\iffirstchar, \ifiscs, \ifdefcount, \@ifchar...) +- Tests on strings (\ifstrnum, \ifuppercase, \DeclareStringFilter...) +- Purely expandable macros with options (\FE@testopt, \FE@ifstar) or modifiers (\FE@modifiers) +- Some purely expandable numerics (\interval, \locinterplin) % ----------------------------------------------------------------------------------------- diff --git a/Master/texmf-dist/doc/latex/etextools/etextools-examples.pdf b/Master/texmf-dist/doc/latex/etextools/etextools-examples.pdf Binary files differnew file mode 100644 index 00000000000..1a30dfb35ac --- /dev/null +++ b/Master/texmf-dist/doc/latex/etextools/etextools-examples.pdf diff --git a/Master/texmf-dist/doc/latex/etextools/etextools-examples.tex b/Master/texmf-dist/doc/latex/etextools/etextools-examples.tex new file mode 100644 index 00000000000..2308477a1f2 --- /dev/null +++ b/Master/texmf-dist/doc/latex/etextools/etextools-examples.tex @@ -0,0 +1,304 @@ +%% +%% This is file `etextools-examples.tex', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% etextools.dtx (with options: `example') +%% +%% This is a generated file. +%% +%% This work may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in +%% http://www.latex-project.org/lppl.txt +%% +%% This work consists of the main source file etextools.dtx +%% and the derived files +%% etextools.sty, etextools.pdf, etextools.ins, +%% and etextools-examples.tex +%% +%%% etextools : e-TeX tools for LaTeX Users and package Writers (v.3.14159 - 2010/04/20) +\documentclass[11pt,french,a4paper,oneside]{scrartcl} +\usepackage[latin1]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[american]{babel} +\usepackage{geometry,doc,ltxdockit,txfonts,fancyhdr,stmaryrd,graphicx,enumitem} +\usepackage{etextools} +\usepackage{fancyvrb} +\makeatletter +\let\org@newif\newif +\def\newif#1{\ifx#1\ifnotempty\else\expandafter\org@newif\fi} +\usepackage{umrand} +\renewcommand\ifne[1]{\csname @\if\relax\detokenize{#1}\relax first\else second\fi oftwo\endcsname\iffalse\iftrue} +\let\newif\org@newif +\font\umranda=umranda \def\Ch{\char'} +\def\textvb#1{{\usefont{T1}{txtt}{m}{n}#1}} +\newrobustcmd\thispackage{\xpackage{\spot etextools}\xspace} +\newrobustcmd\xpackage[1]{{\usefont{T1}{lmss}{bx}{n}\db\mbox{#1}}} +\hypersetup{colorlinks,pdfstartview={FitH}} +\geometry{top=1.5cm,bottom=1.2cm,left=2.5cm,right=1cm} +\fancyhf{} +\fancyhead[L]{Examples for the \thispackage package} +\pagestyle{fancy} +\DefineShortVerb{\|} +\catcode`\^^a7 \active\def^^a7{\par\nobreak\vskip-\parskip} +\DefineVerbatimEnvironment{VerbLines}{Verbatim} + {gobble=1,commandchars=!(),frame=lines,framesep=6pt,fontfamily=txtt,fontseries=m} +\apptocmd\@list@extra{\parsep\parskip\topsep\z@\itemsep\z@}{}{} +\def\smex{\leavevmode\hb@xt@2em{\hfil$\longrightarrow$\hfil}} +\def\FE{\setbox8\hbox{$\m@th\bindnasrepma$}% + \textcolor{fecc}{\scalebox{2}{$\copy8\mkern-13.5mu\copy8\mkern-13.5mu\copy8$}}} +\def\pdfFE{\setbox8\hbox{$\m@th\bindnasrepma$}% + \textcolor{fecc}{\llap{\textsf{pdf}\TeX{}\,}\scalebox{2}{$\copy8\mkern-13.5mu\copy8\mkern-13.5mu\copy8$}}} +\definecolor{fecc}{rgb}{.2,.6,.2} +\definecolor{dg}{rgb}{0.00,0.37,0.00} \newrobustcmd\dg{\color{dg}} \newrobustcmd\dgbf{\dg\bfseries} +\definecolor{spot}{rgb}{1.00,0.33,0.00} \newrobustcmd\spot{\color{spot}} +\definecolor{db}{rgb}{0.00,0.00,0.25} \newrobustcmd\db{\color{db}} +\newrobustcmd\blue{\color{blue}} +\newrobustcmd\nnn{\normalfont\mdseries\upshape} +\newrobustcmd\ClearPage{\@ifstar\clearpage{}} +\def\make@macro#1{\string\def\string#1\parameters@meaning#1\string{\strip@meaning#1\string}} +\newcommand\preline{\@ifstar{\@preline}{\hrulefill\par\@preline}} +\newcommand\@preline[2][1.5ex]{\noindent\hskip6pt\textvb{\make@macro#2}\par\ifblank{#1}{}{\vskip#1}} +\ifdef\pdfstrcmp{\let\ifpdfTeX\iffalse}{\let\ifpdfTeX\iftrue} +\newcommand*\test{\@ifstar{\let\fe\pdfFE\testi}{\let\fe\FE\testi}} +\newcommand\testi[1]{% + \csname test#1\endcsname + \edef\usercmd{\strip@meaningcs{test#1}}\edef\result{\meaningcs{#1Test}}\noindent + \begin{tabular}{lp{15cm}} + \multicolumn{2}{l}{\textcolor{blue}{\llap{\fe\,\smex}\tt \usercmd}} \\[1.5ex] + \cmd{#1Test}= & \tt\bfseries\result + \end{tabular}\par\nobreak\hrulefill\null\goodbreak} +\begin{document} +\title{\vskip-2cm\thispackage\ examples} +\subtitle{Examples for some macros provided by the \thispackage package} +\author{\small<FC -- April 20, 2010>} +\date{} +\newsavebox\helpbox \newsavebox\helpboxx +\newrobustcmd*\mydotleader[2][\z@]{\leavevmode\xleaders\hbox to\dimexpr1.7pt+#1{\hss\raise#2\hbox{$\scriptscriptstyle\cdotp$}\hss}} +\begingroup\let\clearpage\@empty +\setbox\helpbox\hbox to13cm{\hss\lower3cm\vbox to1.8cm{\maketitle\vss}\hss} +\fboxsep\z@ +\newrobustcmd\corner[2][\spot\umranda]{\hbox{#1\rlap{\char'115}\char'#2}} +\null\vskip-1cm\hskip-1cm\null\hfil\RandBox {\fbox{\copy\helpbox}} + font {\umranda} [0pt] + (\corner{17}) ([\Ch111]) (\corner{14}) + ([\Ch112]) ([\Ch112]) + (\corner{21}) ([\Ch111]) (\corner{11}) +\endgroup +\tableofcontents\hyperdef{ettlex}{toc}{} +\section{\cmd{expandnext} examples} +\subsection{Test if the replacement text of macro is really empty} +\def\xx{ } +\def\testexpandnext{% + \edef\expandnextTest{\string\xx\ is \expandnext\ifempty{\xx}{}{not} empty} +} +\preline\xx +\test{expandnext} +\def\xx{} +\preline\xx +\test{expandnext} +\ClearPage* +\subsection{Test if the replacement text of a macro is blank (empty or spaces)} +\def\xx{something} +\def\testexpandnext{% + \edef\expandnextTest{\string\xx\ is \expandnext\ifblank{\xx}{}{not} blank} +} +\preline\xx +\test{expandnext} +\def\xx{ } +\preline\xx +\test{expandnext} +\section{\cmd{ExpandNext} examples} +Example of the main documentation file to reverse the order of the characters in a string: +\def\swap#1#2{{#2#1}} \def\do[#1]#2{\swap #2}% \do{abcdef} -> \swap ab + cdef -> {ba}cdef + % \do{{ba}cdef} -> \swap {ba}c + def -> {cba}def +\edef\result{\naturalloop[\do]{4}{12345}} +\ExpandNext{\def\RESULT}{\naturalloop[\do]{4}{12345}} +\begin{VerbLines} +\def\swap#1#2{{#2#1}} \def\do[#1]#2{\swap #2} +\edef\result{\naturalloop[\do]{4}{12345}} +\meaning\result = !bfseries!meaning!result +\ExpandNext{\def\RESULT}{\naturalloop[\do]{4}{12345}} +\meaning\RESULT = !bfseries!meaning!RESULT +\end{VerbLines} +\subsection{Test the parameter string of a macro} +The following commands create the filter for the string: "\textvb{[\#1]\#2"}":^^a7 +\begin{VerbLines}[commandchars=!()] +\ExpandNext{(!blue\DeclareStringFilter\ParaFilt)} + {\ExpandAftercmds\@gobblescape{\expandafter\string\csname(!blue[#1]#2)\endcsname}} +\end{VerbLines} +\ExpandNext{\DeclareStringFilter\ParaFilt} + {\ExpandAftercmds\@gobblescape{\expandafter\string\csname[#1]#2\endcsname}} +\begin{enumerate}[label=\arabic*)~,noitemsep,nolistsep] +\item |\csname[#1]#2\endcsname| is expanded first +\item Immediately after: |\string| +\item At this stage: |\[#1]#2| (everything in category code other) is no more expandable +\item Then |\ExpandAftercmds| expands |\@gobblescape| +\item |[#1]#2| is no more expandable +\item Then |\ExpandNext| expands its first argument: |\DeclareStringFilter\ParaFilt{[#1]#2}| +\end{enumerate} +Remark: |\detokenize| would have doubled the \# characters. Another possibility is to temporarily change the +category code of \# to 12 (other): +\begin{VerbLines}[commandchars=!()] +\begingroup\catcode`\#=12 + (!blue\DeclareStringFilter\ParaFilt{[#1]#2}) !nnn global declaration +\endgroup +\end{VerbLines} +\def\macroA#1#2{Something to do with #1 and #2} +\def\macroB[#1]#2{Something to do with #1 and #2} +\preline[]\macroA +\preline*[]\macroB +\begin{Verbatim}[commandchars=!()] + !blue\ExpandNext{\ParaFilt=.}{\parameters@meaning\macroA}{macro complies with [\#1]\#2} + !blue{macro does not comply } +\end{Verbatim} +\hfill\textvb{\dgbf\ExpandNext{\ParaFilt=.}{\parameters@meaning\macroA}{macro complies with [\#1]\#2} + {macro does not comply }} +\begin{Verbatim}[commandchars=!()] + !blue\ExpandNext{\ParaFilt=.}{\parameters@meaning\macroB}{macro complies with [\#1]\#2} + !blue{macro does not comply } +\end{Verbatim} +\hfill\textvb{\dgbf\ExpandNext{\ParaFilt=.}{\parameters@meaning\macroB}{macro complies with [\#1]\#2} + {macro does not comply }} +\par\hrulefill\par +\ClearPage* +\section{Testing characters} +\subsection{\cmd{ifsinglechar} versus \cmd{iffirstchar}} +\def\testifsinglechar{% + \edef\ifsinglecharTest{\ifsinglechar *{*hello*}{ single star }{ something else }} +}\hrulefill\par +\test{ifsinglechar} +\def\testifsinglechar{% + \edef\ifsinglecharTest{\ifsinglechar *{ *}{ single star }{ something else }} +}\hrulefill\par +\test{ifsinglechar} +\def\testifsinglechar{% + \edef\ifsinglecharTest{\ifsinglechar *{ * }{ single star }{ something else }} +}\hrulefill\par +\test{ifsinglechar} +{\small Note the space \textbf{after} the star $\uparrow$.} +\def\testiffirstchar{% + \edef\iffirstcharTest{\iffirstchar *{*hello*}{ first char is star }{ something else }} +}\hrulefill\par +\test{iffirstchar} +\subsection{Fully Expandable starred macros} +\def\starmacro#1{\FE@ifstar{#1}\starred\notstarred} +\def\starred#1{your "#1" will be processed by the STAR form} +\def\notstarred#1{your "#1" will be processed by the NORMAL form} +\def\testFE@ifstar{% + \edef\FE@ifstarTest{\starmacro{sample text}}} +\preline\starmacro +\preline*\starred +\preline*\notstarred +\test{FE@ifstar} +\def\testFE@ifstar{% + \edef\FE@ifstarTest{\starmacro*{sample text}}} +\hrulefill\par +\test{FE@ifstar} +\subsection{Fully Expandable macros with options} +\def\optmacro#1{\FE@testopt{#1}\OPTmacro{Mr.}} +\def\OPTmacro[#1]#2{#1 #2} +\def\testFE@testopt{% + \edef\FE@testoptTest{\optmacro{Woody Allen}}} +\preline\optmacro +\preline*\OPTmacro +\test{FE@testopt} +\def\testFE@testopt{% + \edef\FE@testoptTest{\optmacro[Ms.]{Vanessa Paradis}}} +\hrulefill\par +\test{FE@testopt} +\ClearPage* +\section{Lists management} +\subsection{\cmd{csvloop} and \cmd{csvloop*} examples} +\subsubsection{\cmd{makequotes}} +\def\makequotes#1{"#1"\space} +\def\testcsvloop{% + \edef\csvloopTest{\csvloop*[\makequotes]{hello,world}} +} +\preline\makequotes +\test{csvloop} +\subsubsection{\cmd{detokenize}} +\def\testcsvloop{% + \edef\csvloopTest{\csvloop*[\detokenize]{\un,\deux}} +}\hrulefill\par +\test{csvloop} +\subsubsection{\cmd{numexpr}} +\def\mylist{1,2,3,4,5}\def\BySeven#1{$#1\times 7 = \number\numexpr#1*7\relax$\par} +\def\testcsvloop{% + \edef\csvloopTest{\csvloop[\BySeven]\mylist}} +\preline\mylist +\preline*\BySeven +\test{csvloop} +\subsubsection{protected \cmd{textbf}} +\def\testcsvloop{% + \protected@edef\csvloopTest{\csvloop*[\textbf]{hello ,my ,friends}} +}\hrulefill\par +\test{csvloop} +\subsection{Index in lists and items by index} +\subsubsection{\cmd{listloop}: getting specific item} +\csvtolist*[\mylist]{one,two,three,four,five,alpha,beta,gamma} +\def\testgetlistitem{% + \edef\getlistitemTest{\listloop[4]\mylist} +}\hrulefill\par +\noindent\hskip6pt|\csvtolist*[\mylist]{one,two,three,four,five,alpha,beta,gamma}|\par\vskip1.5ex +\test{getlistitem} +\ClearPage* +\subsubsection{\cmd{getlistindex}} +\ifpdfTeX +\leavevmode\vadjust{\textsl{Require the }\string\pdfstrcmp\ \textsl{primitive (pdf\TeX{}) :}} +\def\testgetlistindex{% + \edef\getlistindexTest{\getlistindex{alpha}\mylist} +}\hrulefill\par +\noindent\hskip6pt|\csvtolist*[\mylist]{one,two,three,four,five,alpha,beta,gamma}|\par\vskip1.5ex +\test*{getlistindex} +\leavevmode\vadjust{\textsl{Require the }\string\pdfstrcmp\ \textsl{primitive (pdf\TeX{}) :}} +\def\testgetlistindex{% + \edef\getlistindexTest{\getcsvlistindex*{alpha}{one,two,three,four,five,alpha,beta}} +}\hrulefill\par +\test*{getlistindex} +\fi +\hrulefill\par +\getlistindex[\myindex]{alpha}\mylist +{\color{blue}\noindent\hskip6pt\llap\smex|\getlistindex[\myindex]{alpha}\mylist|\par\vskip1.5ex} +{\tt\string\myindex=\quad\textbf{\meaning\myindex}} +\par\hrulefill\par\vskip.5ex +\hrulefill\par +\newcount\myindex +\getcsvlistindex*[\myindex]{alpha}{one,two,three,four,five,alpha,beta} +\noindent\hskip6pt|\newcount\myindex|\par +{\color{blue}\noindent\hskip6pt\llap\smex|\getcsvlistindex*[\myindex]{alpha}{one,two,three,four,five,alpha,beta}|}\par\vskip.5ex +{\tt\string\the\string\myindex=\qquad\textbf{\the\myindex}} +\par\hrulefill\par\vskip.5ex +\ClearPage +\subsubsection{\cmd{gettokslistindex} with \cmd{ifcase}} +\hrulefill\par\vskip2ex\noindent +\llap{\FE\,\smex}\par\vskip-2.5\baselineskip\strut +\leavevmode\vadjust{Always purely expandable (no need of |\pdfstrcmp|, comparison done by |\ifx|):} +\begin{Verbatim} + \ifcase \gettokslistindex{D}{LRDF\relax O} + What do to if L + \or What do to if R + \or What do to if D + \or What do to if F + \or What do to if \relax + \or What do to if O + \else Problem + \fi +\end{Verbatim} +{\tt Result=\qquad\bfseries +\ifcase\gettokslistindex{D}{LRDF} + What do to if L +\or What do to if R +\or What do to if D +\or What do to if F +\else Problem +\fi}\par +\hrulefill\par\vskip.5ex +\end{document}\endinput + +\endinput +%% +%% End of file `etextools-examples.tex'. diff --git a/Master/texmf-dist/doc/latex/etextools/etextools.pdf b/Master/texmf-dist/doc/latex/etextools/etextools.pdf Binary files differindex 1a1207830a4..aad64e09dce 100644 --- a/Master/texmf-dist/doc/latex/etextools/etextools.pdf +++ b/Master/texmf-dist/doc/latex/etextools/etextools.pdf diff --git a/Master/texmf-dist/source/latex/etextools/etextools.drv b/Master/texmf-dist/source/latex/etextools/etextools.drv index 16f7d00391f..9df2cae29be 100644 --- a/Master/texmf-dist/source/latex/etextools/etextools.drv +++ b/Master/texmf-dist/source/latex/etextools/etextools.drv @@ -19,11 +19,11 @@ %% etextools.sty, etextools.pdf, etextools.ins, %% and etextools-examples.tex %% -%%% etextools : e-TeX tools for LaTeX Users and package Writers (v.3.1415 - 2009/10/14) +%%% etextools : e-TeX tools for LaTeX Users and package Writers (v.3.14159 - 2010/04/20) \edef\thisfile{\jobname} \def\thisinfo{The \thispackage\ package -- an \eTeX{} package for \LaTeX{}} -\def\thisrevision{3.1415} -\def\thisdate{14 October 2009} +\def\thisrevision{3.14159} +\def\thisdate{20 April 2010} \newcommand\makebookmark[1]{} \documentclass[a4paper,oneside]{ltxdockit} \usepackage[latin1]{inputenc} @@ -40,7 +40,7 @@ \geometry{left=4.5cm,marginparwidth=14pt,right=1.5cm,top=3mm,headsep=3mm,bottom=3mm,footskip=8mm,includeheadfoot} \csdef{ltd@email}#1{\href{mailto:#1}{\footnotesize\mdseries#1}} \titlepage{% - title={The \Thispackage macros}, + title={The \thispackage\footnotemark macros}, subtitle={An \etex package providing useful (purely expandable) tools \\ for LaTeX Users and package Writers}, url={http://www.ctan.org/tex-archive/macros/latex/contrib/etextools/}, author={\footnotesize Florent CHERVET}, diff --git a/Master/texmf-dist/source/latex/etextools/etextools.dtx b/Master/texmf-dist/source/latex/etextools/etextools.dtx index 01ed377c72f..162490638c1 100644 --- a/Master/texmf-dist/source/latex/etextools/etextools.dtx +++ b/Master/texmf-dist/source/latex/etextools/etextools.dtx @@ -1,5 +1,5 @@ % \iffalse meta-comment -%%% etextools : e-TeX tools for LaTeX Users and package Writers (v.3.1415 - 2009/10/14) +%%% etextools : e-TeX tools for LaTeX Users and package Writers (v.3.14159 - 2010/04/20) % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either @@ -38,7 +38,7 @@ \input docstrip.tex \Msg{************************************************************************} \Msg{* Installation *} -\Msg{* Package: etextools 2009/10/14 v.3.1415 e-TeX tools for LaTeX Users and package Writers *} +\Msg{* Package: etextools 2010/04/20 v.3.14159 e-TeX tools for LaTeX Users and package Writers *} \Msg{************************************************************************} \keepsilent @@ -70,6 +70,7 @@ and etextools-examples.tex \askforoverwritefalse \generate{% \file{etextools.drv}{\from{etextools.dtx}{driver}}% + \file{etextools-examples.tex}{\from{etextools.dtx}{example}}% } \obeyspaces @@ -95,8 +96,8 @@ and etextools-examples.tex %<*driver> \edef\thisfile{\jobname} \def\thisinfo{The \thispackage\ package -- an \eTeX{} package for \LaTeX{}} -\def\thisrevision{3.1415} -\def\thisdate{14 October 2009} +\def\thisrevision{3.14159} +\def\thisdate{20 April 2010} \newcommand\makebookmark[1]{} %-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= \documentclass[a4paper,oneside]{ltxdockit} @@ -114,7 +115,7 @@ and etextools-examples.tex \geometry{left=4.5cm,marginparwidth=14pt,right=1.5cm,top=3mm,headsep=3mm,bottom=3mm,footskip=8mm,includeheadfoot} \csdef{ltd@email}#1{\href{mailto:#1}{\footnotesize\mdseries#1}} \titlepage{% - title={The \Thispackage macros}, + title={The \thispackage\footnotemark macros}, subtitle={An \etex package providing useful (purely expandable) tools \\ for LaTeX Users and package Writers}, url={http://www.ctan.org/tex-archive/macros/latex/contrib/etextools/}, author={\footnotesize Florent CHERVET}, @@ -135,7 +136,7 @@ and etextools-examples.tex %</driver> % \fi % -% \CheckSum{2899} +% \CheckSum{3752} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z @@ -512,7 +513,7 @@ and etextools-examples.tex % \rlap{\Large\leftmoon\corner[\spot\umrandasmall]{21}}\vss} % \newsavebox\myb \setbox\myb\vtop to\z@{\hbox{\rlap{\lower1.9ex\hbox{\spot\umranda\char'111}}\lower17.2ex\hbox{\lower1.9ex\hbox{\spot\umranda\char'111}}}\vss} % \setbox\helpboxx\vbox{\hbox to\z@{\hbox to\hsize{\hfil\copy\helpbox\cleaders\copy\myb\hskip14cm\reflectbox{\copy\helpbox}\hfil}\hss}\printtitlepage} -% \box\helpboxx +% \box\helpboxx \footnotetext {\noindent \thispackage: \CTAN{macros/latex/contrib/\thisfile}} % ^^A\printtitlepage % \AddBookMark{attr{/F 2}goto page 1{/FitH 1000}{etextools}} % @@ -2364,9 +2365,9 @@ and etextools-examples.tex % \begin{ltxsyntax} % % \cmditem{getlistindex}[result-index(counter or macro)]{item}{Listmacro} -% \cmditem-{xgetlistindex}[result-index(counter or macro)]{item}{Listmacro} +% ^^A\cmditem-{xgetlistindex}[result-index(counter or macro)]{item}{Listmacro} % \cmditem-{getlistindex*}[result-index(counter or macro)]{item}{list} -% \cmditem-{xgetlistindex*}[result-index(counter or macro)]{item}{list} +% ^^A\cmditem-{xgetlistindex*}[result-index(counter or macro)]{item}{list} % % \end{ltxsyntax} % @@ -2388,9 +2389,9 @@ and etextools-examples.tex % % \begin{ltxsyntax} % \cmditem{getcsvlistindex}[result-index(counter or macro)]{item}{csvlistmacro} -% \cmditem-{xgetcsvlistindex}[result-index(counter or macro)]{item}{csvlistmacro} +% ^^A\cmditem-{xgetcsvlistindex}[result-index(counter or macro)]{item}{csvlistmacro} % \cmditem-{getcsvlistindex*}[result-index(counter or macro)]{item}{item,item,item,...} -% \cmditem-{xgetcsvlistindex*}[result-index(counter or macro)]{item}{item,item,item,...} +% ^^A\cmditem-{xgetcsvlistindex*}[result-index(counter or macro)]{item}{item,item,item,...} % \end{ltxsyntax} % % This\notFE\ is the same as \cmdref{getlistindex} but for comma-separated lists. @@ -2449,7 +2450,7 @@ and etextools-examples.tex %<*package> \NeedsTeXFormat{LaTeX2e}[1996/12/01] \ProvidesPackage{etextools} - [2009/10/14 v3.1415 e-TeX more useful tools for LaTeX package writers] + [2010/04/20 v3.14159 e-TeX more useful tools for LaTeX package writers] \csname ettl@onlyonce\endcsname\let\ettl@onlyonce\endinput % \end{macrocode} % @@ -2856,8 +2857,16 @@ and etextools-examples.tex % %\begin{Macro}{thefontname} % \begin{macrocode} -\newcommand\thefontname{{\expandafter\ettl@thefontname\expandafter\strip@meaning\the\font}} -\font\ettl@thefontname=ecrm1000 +\newcommand\thefontname{{\expandafter\expandafter\expandafter\ettl@thefontname + \expandafter\expandafter\expandafter\meaning + \expandafter\the\expandafter\font + \expandafter\string\expandafter(% + \expandafter\string\the\font\string)}} +\ifcsname T1/cmr/m/n/10\endcsname + \letcs\ettl@thefontname{T1/cmr/m/n/10}% +\else + \font\ettl@thefontname=ecrm1000 +\fi % \end{macrocode} %\end{Macro} % @@ -2977,7 +2986,7 @@ and etextools-examples.tex % \begin{macrocode} \def\ettl@ifdef[#1]{\expandafter\ettl@ifd@f\expandafter{#1}} \def\ettl@ifd@f#1#2{% - \csdef{ettl@ifdef#2}##1#1##2/End§Meaning/{\ettl@nbk##2//{\rmn@firstoftwo}{\rmn@secondoftwo}//} + \csdef{ettl@ifdef#2}##1#1##2/End§Meaning/{\ettl@nbk##2//\rmn@firstoftwo\rmn@secondoftwo//} \csedef{ifdef#2}##1{\noexpand\romannumeral\noexpandafter% \noexpandcs{ettl@ifdef#2}\noexpand\meaning##1#1/End§Meaning/}%//{##2}{##3}//} } @@ -4267,9 +4276,12 @@ and etextools-examples.tex % Then \cs{ettl@setresult} finishes the job: % \begin{macrocode} \def\ettl@setresult#1of#2>#3<{\ettl@nbk #3//% - {\ifdefcount{#3}{#3=\csname ettl@#1of#2\endcsname} - {\edef#3{\csname ettl@#1of#2\endcsname}}}% + {\ettl@set@result#1of#2>#3<} {\csname ettl@#1of#2\endcsname}//} +\def\ettl@set@result#1of#2>#3<#4{\ifdefcount{#3} + {#3=\csname ettl@#1of#2\endcsname#4} + {\expandafter\edef\noexpand#3{\csname ettl@#1of#2\endcsname{#4}}}% +} % \end{macrocode} % \end{Macro} % \end{Macro*} @@ -4558,9 +4570,9 @@ and etextools-examples.tex \long\def#3[##1]##2#5#8#5##3##4/##5##6##7/End§List/{##6[##1+1]##2#5##3##4//##6##7/End§List/}% \ifnotempty{#5}%% special case if no separator {\long\def#4[##1]#5##2#5#5##3//##4/End§List/{\unexpanded{#1\def#7{##2#5}}% - \ettl@nbk#6//\ettl@setresult 1of1>#6<{\number\numexpr##1-1\relax}{}//}}% + \ettl@nbk#6//{\ettl@setresult 1of1>#6<{\number\numexpr##1-1\relax}}{}//}}% {\long\def#4[##1]##2//##3/End§List/{\unexpanded{#1\def#7{##2}}% - \ettl@nbk#6//\ettl@setresult 1of1>#6<{\number\numexpr##1-1\relax}{}//}}% + \ettl@nbk#6//{\ettl@setresult 1of1>#6<{\number\numexpr##1-1\relax}}{}//}}% \long\def#2##1{#3[0]#5##1#5#5#8#5//#3#4/End§List/}% \edef#7{\endgroup\expandafter#2\expandafter{#7}}#7} \def\ettl@gobble@relax#1\relax{} @@ -4583,16 +4595,13 @@ and etextools-examples.tex % \cs{listgdel} make the assignment to the (shorter-)list global and \cs{listxdel} both expands the \prm{item} and % makes the assignment global: % \begin{macrocode} -\begingroup\catcode`\|=3 +\edef\ettl@restore@catcode{\catcode124 \the\catcode124}% |=124 +\catcode`\|=3 \newrobustcmd\listdel[1][]{\ettl@RemoveInList{}\listdel|{#1}} \newrobustcmd\listgdel[1][]{\ettl@RemoveInList\global\listdel|{#1}} \newrobustcmd\listedel[1][]{\ettl@listedel{}\listdel|{#1}} \newrobustcmd\listxdel[1][]{\ettl@listedel\global\listdel|{#1}} -\aftergroup@def\listdel -\aftergroup@def\listgdel -\aftergroup@def\listedel -\aftergroup@def\listxdel -\endgroup% \catcode group +\ettl@restore@catcode\undef\ettl@restore@catcode \newrobustcmd\ettl@listedel[6]{\begingroup\protected@edef#5{#6}\expandafter\endgroup \expandafter\@swaparg\expandafter{#5}{\ettl@RemoveInList#1#2{#3}{#4}#5}} % \end{macrocode} @@ -4667,16 +4676,21 @@ and etextools-examples.tex % % We first need to get into a group where delimiter \CH{\textbar} and \CH{\&} have catcode 3: % \begin{macrocode} -\newrobustcmd\ettl@getlistindex[6][]{% #1=result, #2=\expandafter, #3=loop macro, #4=separator, #5=list of list macro, #6=item - \begingroup\def\ettl@getlistindex##1#4#6#4##2/End§List/{\endgroup - \romannumeral-`\q\ettl@setresult 1of1>#1<{\ettl@nbk##2//{#3*!{##1}}{-1}//}% - }#2\ettl@getlistindex#2#5#4#6#4/End§List/} -\begingroup\catcode`\|=3% etb catcode -\newrobustcmd\getlistindex[3][]{\@ifstar% - {\ettl@getlistindex{}\listloop{|}{#1}{#2}{#3}} - {\ifiscs{#1}{\ettl@getlistindex\expandafter\listloop|{#1}{#2}{#3}} - {\ettl@getlistindex{}\listloop|{#1}{#2}{#3}}}} -\aftergroup@def\getlistindex +\newrobustcmd\ettl@getlistindex[6]{% #1=result, #2=\expandafter, #3=loop macro, #4=separator, #5=list of list macro, #6=item + \begingroup\long\def\ettl@getlistindex##1#4#6#4##2/End§List/{\endgroup + \ExpandAftercmds{\ettl@setresult 1of1>#1<}{\ettl@nbk##2//{#3*!{##1}}{-1}//}% + }#2\ettl@getlistindex#5#4#6#4/End§List/} +\newrobustcmd\getlistindex{\@ifstar + {\@testopt{\ettl@get@listindex\relax}{}} + {\@testopt{\ettl@get@listindex\expandafter}{}}} +\begingroup\catcode`\|=3% etb catcode +\protected\long\gdef\ettl@get@listindex#1[#2]#3#4{% + \ifx#1\relax + \ettl@getlistindex{#2}{}\listloop|{#4}{#3}% + \else \ifiscs{#4} + {\ettl@getlistindex{#2}#1\listloop|{#4}{#3}} + {\ettl@getlistindex{#2}\listloop|{#4}{#3}}% + \fi} \endgroup%\catcode group % \end{macrocode} % \end{Macro} @@ -4689,10 +4703,16 @@ and etextools-examples.tex % \begin{Macro}{getcsvlistindex} % The command is robust, not purely expandable: % \begin{macrocode} -\newrobustcmd\getcsvlistindex[3][]{\@ifstar% - {\ettl@getlistindex{}\csvloop{,}{#1}{#2}} - {\ifiscs{#1}{\ettl@getlistindex\expandafter\csvloop,{#1}{#2}} - {\ettl@getlistindex{}\csvloop,{#1}{#2}}}} +\newrobustcmd\getcsvlistindex{\@ifstar + {\@testopt{\ettl@get@csvlistindex\relax}{}} + {\@testopt{\ettl@get@csvlistindex\expandafter}{}}} +\protected\long\gdef\ettl@get@csvlistindex#1[#2]#3#4{% + \ifx#1\relax + \ettl@getlistindex{#2}{}\csvloop,{#4}{#3}% + \else \ifiscs{#4} + {\ettl@getlistindex{#2}#1\csvloop,{#4}{#3}} + {\ettl@getlistindex{#2}\csvloop,{#4}{#3}}% + \fi} % \end{macrocode} % \end{Macro} % @@ -4811,11 +4831,359 @@ and etextools-examples.tex % \begin{macrocode} %</package> % \end{macrocode} +% +% \section{Examples} +% \label{sec:examples} % +% \begin{macrocode} +%<*example> +\documentclass[11pt,french,a4paper,oneside]{scrartcl} +\usepackage[latin1]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[american]{babel} +\usepackage{geometry,doc,ltxdockit,txfonts,fancyhdr,stmaryrd,graphicx,enumitem} +\usepackage{etextools} +% +\usepackage{fancyvrb} +% +\makeatletter +\let\org@newif\newif +\def\newif#1{\ifx#1\ifnotempty\else\expandafter\org@newif\fi} +\usepackage{umrand} +\renewcommand\ifne[1]{\csname @\if\relax\detokenize{#1}\relax first\else second\fi oftwo\endcsname\iffalse\iftrue} +\let\newif\org@newif +\font\umranda=umranda \def\Ch{\char'} +% +\def\textvb#1{{\usefont{T1}{txtt}{m}{n}#1}} +\newrobustcmd\thispackage{\xpackage{\spot etextools}\xspace} +\newrobustcmd\xpackage[1]{{\usefont{T1}{lmss}{bx}{n}\db\mbox{#1}}} +\hypersetup{colorlinks,pdfstartview={FitH}} +\geometry{top=1.5cm,bottom=1.2cm,left=2.5cm,right=1cm} +\fancyhf{} +\fancyhead[L]{Examples for the \thispackage package} +\pagestyle{fancy} +\DefineShortVerb{\|} +\catcode`\^^a7 \active\def^^a7{\par\nobreak\vskip-\parskip} +\DefineVerbatimEnvironment{VerbLines}{Verbatim} + {gobble=1,commandchars=!(),frame=lines,framesep=6pt,fontfamily=txtt,fontseries=m} +\apptocmd\@list@extra{\parsep\parskip\topsep\z@\itemsep\z@}{}{} +% +\def\smex{\leavevmode\hb@xt@2em{\hfil$\longrightarrow$\hfil}} +\def\FE{\setbox8\hbox{$\m@th\bindnasrepma$}% + \textcolor{fecc}{\scalebox{2}{$\copy8\mkern-13.5mu\copy8\mkern-13.5mu\copy8$}}} +\def\pdfFE{\setbox8\hbox{$\m@th\bindnasrepma$}% + \textcolor{fecc}{\llap{\textsf{pdf}\TeX{}\,}\scalebox{2}{$\copy8\mkern-13.5mu\copy8\mkern-13.5mu\copy8$}}} +\definecolor{fecc}{rgb}{.2,.6,.2} +\definecolor{dg}{rgb}{0.00,0.37,0.00} \newrobustcmd\dg{\color{dg}} \newrobustcmd\dgbf{\dg\bfseries} +\definecolor{spot}{rgb}{1.00,0.33,0.00} \newrobustcmd\spot{\color{spot}} +\definecolor{db}{rgb}{0.00,0.00,0.25} \newrobustcmd\db{\color{db}} +\newrobustcmd\blue{\color{blue}} +\newrobustcmd\nnn{\normalfont\mdseries\upshape} +% +\newrobustcmd\ClearPage{\@ifstar\clearpage{}} +\def\make@macro#1{\string\def\string#1\parameters@meaning#1\string{\strip@meaning#1\string}} +\newcommand\preline{\@ifstar{\@preline}{\hrulefill\par\@preline}} +\newcommand\@preline[2][1.5ex]{\noindent\hskip6pt\textvb{\make@macro#2}\par\ifblank{#1}{}{\vskip#1}} +% +\ifdef\pdfstrcmp{\let\ifpdfTeX\iffalse}{\let\ifpdfTeX\iftrue} +% +\newcommand*\test{\@ifstar{\let\fe\pdfFE\testi}{\let\fe\FE\testi}} +\newcommand\testi[1]{% + \csname test#1\endcsname + \edef\usercmd{\strip@meaningcs{test#1}}\edef\result{\meaningcs{#1Test}}\noindent + \begin{tabular}{lp{15cm}} + \multicolumn{2}{l}{\textcolor{blue}{\llap{\fe\,\smex}\tt \usercmd}} \\[1.5ex] + \cmd{#1Test}= & \tt\bfseries\result + \end{tabular}\par\nobreak\hrulefill\null\goodbreak} +% +\begin{document} +\title{\vskip-2cm\thispackage\ examples} +\subtitle{Examples for some macros provided by the \thispackage package} +\author{\small<FC -- April 20, 2010>} +\date{} +% +\newsavebox\helpbox \newsavebox\helpboxx +\newrobustcmd*\mydotleader[2][\z@]{\leavevmode\xleaders\hbox to\dimexpr1.7pt+#1{\hss\raise#2\hbox{$\scriptscriptstyle\cdotp$}\hss}} +\begingroup\let\clearpage\@empty +\setbox\helpbox\hbox to13cm{\hss\lower3cm\vbox to1.8cm{\maketitle\vss}\hss} +\fboxsep\z@ +\newrobustcmd\corner[2][\spot\umranda]{\hbox{#1\rlap{\char'115}\char'#2}} +\null\vskip-1cm\hskip-1cm\null\hfil\RandBox {\fbox{\copy\helpbox}} + font {\umranda} [0pt] + (\corner{17}) ([\Ch111]) (\corner{14}) + ([\Ch112]) ([\Ch112]) + (\corner{21}) ([\Ch111]) (\corner{11}) +\endgroup +% +\tableofcontents\hyperdef{ettlex}{toc}{} +% +\section{\cmd{expandnext} examples} +% +\subsection{Test if the replacement text of macro is really empty} +% +\def\xx{ } +\def\testexpandnext{% + \edef\expandnextTest{\string\xx\ is \expandnext\ifempty{\xx}{}{not} empty} +} +\preline\xx +\test{expandnext} +% +\def\xx{} +\preline\xx +\test{expandnext} +% +\ClearPage* +\subsection{Test if the replacement text of a macro is blank (empty or spaces)} +% +\def\xx{something} +\def\testexpandnext{% + \edef\expandnextTest{\string\xx\ is \expandnext\ifblank{\xx}{}{not} blank} +} +\preline\xx +\test{expandnext} +% +\def\xx{ } +\preline\xx +\test{expandnext} +% +\section{\cmd{ExpandNext} examples} +% +Example of the main documentation file to reverse the order of the characters in a string: +% +\def\swap#1#2{{#2#1}} \def\do[#1]#2{\swap #2}% \do{abcdef} -> \swap ab + cdef -> {ba}cdef + % \do{{ba}cdef} -> \swap {ba}c + def -> {cba}def +% +\edef\result{\naturalloop[\do]{4}{12345}} +\ExpandNext{\def\RESULT}{\naturalloop[\do]{4}{12345}} +% +\begin{VerbLines} +\def\swap#1#2{{#2#1}} \def\do[#1]#2{\swap #2} +\edef\result{\naturalloop[\do]{4}{12345}} +\meaning\result = !bfseries!meaning!result +\ExpandNext{\def\RESULT}{\naturalloop[\do]{4}{12345}} +\meaning\RESULT = !bfseries!meaning!RESULT +\end{VerbLines} +% +\subsection{Test the parameter string of a macro} +% +The following commands create the filter for the string: "\textvb{[\#1]\#2"}":^^a7 +\begin{VerbLines}[commandchars=!()] +\ExpandNext{(!blue\DeclareStringFilter\ParaFilt)} + {\ExpandAftercmds\@gobblescape{\expandafter\string\csname(!blue[#1]#2)\endcsname}} +\end{VerbLines} +% +\ExpandNext{\DeclareStringFilter\ParaFilt} + {\ExpandAftercmds\@gobblescape{\expandafter\string\csname[#1]#2\endcsname}} +% +\begin{enumerate}[label=\arabic*)~,noitemsep,nolistsep] +\item |\csname[#1]#2\endcsname| is expanded first +\item Immediately after: |\string| +\item At this stage: |\[#1]#2| (everything in category code other) is no more expandable +\item Then |\ExpandAftercmds| expands |\@gobblescape| +\item |[#1]#2| is no more expandable +\item Then |\ExpandNext| expands its first argument: |\DeclareStringFilter\ParaFilt{[#1]#2}| +\end{enumerate} +% +Remark: |\detokenize| would have doubled the \# characters. Another possibility is to temporarily change the +category code of \# to 12 (other): +\begin{VerbLines}[commandchars=!()] +\begingroup\catcode`\#=12 + (!blue\DeclareStringFilter\ParaFilt{[#1]#2}) !nnn global declaration +\endgroup +\end{VerbLines} +% +\def\macroA#1#2{Something to do with #1 and #2} +\def\macroB[#1]#2{Something to do with #1 and #2} +% +\preline[]\macroA +\preline*[]\macroB +\begin{Verbatim}[commandchars=!()] + !blue\ExpandNext{\ParaFilt=.}{\parameters@meaning\macroA}{macro complies with [\#1]\#2} + !blue{macro does not comply } +\end{Verbatim} +% +\hfill\textvb{\dgbf\ExpandNext{\ParaFilt=.}{\parameters@meaning\macroA}{macro complies with [\#1]\#2} + {macro does not comply }} +\begin{Verbatim}[commandchars=!()] + !blue\ExpandNext{\ParaFilt=.}{\parameters@meaning\macroB}{macro complies with [\#1]\#2} + !blue{macro does not comply } +\end{Verbatim} +\hfill\textvb{\dgbf\ExpandNext{\ParaFilt=.}{\parameters@meaning\macroB}{macro complies with [\#1]\#2} + {macro does not comply }} +\par\hrulefill\par +% +\ClearPage* +\section{Testing characters} +\subsection{\cmd{ifsinglechar} versus \cmd{iffirstchar}} +\def\testifsinglechar{% + \edef\ifsinglecharTest{\ifsinglechar *{*hello*}{ single star }{ something else }} +}\hrulefill\par +\test{ifsinglechar} +% +\def\testifsinglechar{% + \edef\ifsinglecharTest{\ifsinglechar *{ *}{ single star }{ something else }} +}\hrulefill\par +\test{ifsinglechar} +% +\def\testifsinglechar{% + \edef\ifsinglecharTest{\ifsinglechar *{ * }{ single star }{ something else }} +}\hrulefill\par +\test{ifsinglechar} +{\small Note the space \textbf{after} the star $\uparrow$.} +% +\def\testiffirstchar{% + \edef\iffirstcharTest{\iffirstchar *{*hello*}{ first char is star }{ something else }} +}\hrulefill\par +\test{iffirstchar} +% +\subsection{Fully Expandable starred macros} +\def\starmacro#1{\FE@ifstar{#1}\starred\notstarred} +\def\starred#1{your "#1" will be processed by the STAR form} +\def\notstarred#1{your "#1" will be processed by the NORMAL form} +\def\testFE@ifstar{% + \edef\FE@ifstarTest{\starmacro{sample text}}} +\preline\starmacro +\preline*\starred +\preline*\notstarred +\test{FE@ifstar} +% +\def\testFE@ifstar{% + \edef\FE@ifstarTest{\starmacro*{sample text}}} +\hrulefill\par +\test{FE@ifstar} +% +\subsection{Fully Expandable macros with options} +\def\optmacro#1{\FE@testopt{#1}\OPTmacro{Mr.}} +\def\OPTmacro[#1]#2{#1 #2} +\def\testFE@testopt{% + \edef\FE@testoptTest{\optmacro{Woody Allen}}} +\preline\optmacro +\preline*\OPTmacro +\test{FE@testopt} +% +\def\testFE@testopt{% + \edef\FE@testoptTest{\optmacro[Ms.]{Vanessa Paradis}}} +\hrulefill\par +\test{FE@testopt} +% +\ClearPage* +\section{Lists management} +% +\subsection{\cmd{csvloop} and \cmd{csvloop*} examples} +% +\subsubsection{\cmd{makequotes}} +\def\makequotes#1{"#1"\space} +\def\testcsvloop{% + \edef\csvloopTest{\csvloop*[\makequotes]{hello,world}} +} +\preline\makequotes +\test{csvloop} +% +\subsubsection{\cmd{detokenize}} +\def\testcsvloop{% + \edef\csvloopTest{\csvloop*[\detokenize]{\un,\deux}} +}\hrulefill\par +\test{csvloop} +% +\subsubsection{\cmd{numexpr}} +\def\mylist{1,2,3,4,5}\def\BySeven#1{$#1\times 7 = \number\numexpr#1*7\relax$\par} +\def\testcsvloop{% + \edef\csvloopTest{\csvloop[\BySeven]\mylist}} +\preline\mylist +\preline*\BySeven +\test{csvloop} +% +\subsubsection{protected \cmd{textbf}} +\def\testcsvloop{% + \protected@edef\csvloopTest{\csvloop*[\textbf]{hello ,my ,friends}} +}\hrulefill\par +\test{csvloop} +% +\subsection{Index in lists and items by index} +% +\subsubsection{\cmd{listloop}: getting specific item} +\csvtolist*[\mylist]{one,two,three,four,five,alpha,beta,gamma} +\def\testgetlistitem{% + \edef\getlistitemTest{\listloop[4]\mylist} +}\hrulefill\par +\noindent\hskip6pt|\csvtolist*[\mylist]{one,two,three,four,five,alpha,beta,gamma}|\par\vskip1.5ex +\test{getlistitem} +% +\ClearPage* +\subsubsection{\cmd{getlistindex}} +\ifpdfTeX +\leavevmode\vadjust{\textsl{Require the }\string\pdfstrcmp\ \textsl{primitive (pdf\TeX{}) :}} +\def\testgetlistindex{% + \edef\getlistindexTest{\getlistindex{alpha}\mylist} +}\hrulefill\par +\noindent\hskip6pt|\csvtolist*[\mylist]{one,two,three,four,five,alpha,beta,gamma}|\par\vskip1.5ex +\test*{getlistindex} +% +\leavevmode\vadjust{\textsl{Require the }\string\pdfstrcmp\ \textsl{primitive (pdf\TeX{}) :}} +\def\testgetlistindex{% + \edef\getlistindexTest{\getcsvlistindex*{alpha}{one,two,three,four,five,alpha,beta}} +}\hrulefill\par +\test*{getlistindex} +\fi +\hrulefill\par +% +\getlistindex[\myindex]{alpha}\mylist +{\color{blue}\noindent\hskip6pt\llap\smex|\getlistindex[\myindex]{alpha}\mylist|\par\vskip1.5ex} +{\tt\string\myindex=\quad\textbf{\meaning\myindex}} +\par\hrulefill\par\vskip.5ex +% +\hrulefill\par +\newcount\myindex +\getcsvlistindex*[\myindex]{alpha}{one,two,three,four,five,alpha,beta} +\noindent\hskip6pt|\newcount\myindex|\par +{\color{blue}\noindent\hskip6pt\llap\smex|\getcsvlistindex*[\myindex]{alpha}{one,two,three,four,five,alpha,beta}|}\par\vskip.5ex +{\tt\string\the\string\myindex=\qquad\textbf{\the\myindex}} +\par\hrulefill\par\vskip.5ex +% +\ClearPage +\subsubsection{\cmd{gettokslistindex} with \cmd{ifcase}} +% +\hrulefill\par\vskip2ex\noindent +\llap{\FE\,\smex}\par\vskip-2.5\baselineskip\strut +\leavevmode\vadjust{Always purely expandable (no need of |\pdfstrcmp|, comparison done by |\ifx|):} +\begin{Verbatim} + \ifcase \gettokslistindex{D}{LRDF\relax O} + What do to if L + \or What do to if R + \or What do to if D + \or What do to if F + \or What do to if \relax + \or What do to if O + \else Problem + \fi +\end{Verbatim} +% +{\tt Result=\qquad\bfseries +\ifcase\gettokslistindex{D}{LRDF} + What do to if L +\or What do to if R +\or What do to if D +\or What do to if F +\else Problem +\fi}\par +\hrulefill\par\vskip.5ex +% +\end{document}\endinput +%</example> +% \end{macrocode} +% +% \phantomsection % \Section*{Revision history} % \addcontentsline{toc}{section}{\texorpdfstring\dr{}\hskip\dimexpr\cftsecnumwidth-4pt Revision history}^^A not in .cmd file % % \begin{changelog}\footnotesize +% +% \begin{release}{3.14159}{2010-04-20} +% \item \cs{ettl@thefontname} overwrote \cs{T1/cmr/m/n/10} on the log file when the font \sty{ecmr1000} was used.\\ +% Fixed + modification of \cmdref{thefontname} in order to get both \TeX{} and \LaTeX{} font names. +% \item Correction of bugs into \cmdref{listdel} +% \item Joining the example file \sty{etextools-examples.tex} to this \sty{.dtx} file. +% \end{release} % % \begin{release}{3.1415}{2009-10-14} % \item Correction of a bug in \cmdref{locinterplin}. @@ -4888,7 +5256,7 @@ and etextools-examples.tex % \cmdref{ifempty}, \cmdref{toksloop}, \cmdref{tokstolist} and \cmdref{tokstolistadd} % \item % Modification of \cmdref{ifsinglechar}\\ -% |\ifsinglechar| now works with |\ifempty| so that:\\ +% \cmdref{ifsinglechar} now works with \cmdref{ifempty} so that:\\ % \begin{tabbing} % \quad\=|\macro{ * }|\quad\= is no more considered as a starred form \\ % \>\>because of the spaces following the |*| \\ diff --git a/Master/texmf-dist/source/latex/etextools/etextools.ins b/Master/texmf-dist/source/latex/etextools/etextools.ins index 400c7eb666d..4026cb2ada4 100644 --- a/Master/texmf-dist/source/latex/etextools/etextools.ins +++ b/Master/texmf-dist/source/latex/etextools/etextools.ins @@ -19,11 +19,11 @@ %% etextools.sty, etextools.pdf, etextools.ins, %% and etextools-examples.tex %% -%%% etextools : e-TeX tools for LaTeX Users and package Writers (v.3.1415 - 2009/10/14) +%%% etextools : e-TeX tools for LaTeX Users and package Writers (v.3.14159 - 2010/04/20) \input docstrip.tex \Msg{************************************************************************} \Msg{* Installation *} -\Msg{* Package: etextools 2009/10/14 v.3.1415 e-TeX tools for LaTeX Users and package Writers *} +\Msg{* Package: etextools 2010/04/20 v.3.14159 e-TeX tools for LaTeX Users and package Writers *} \Msg{************************************************************************} \keepsilent @@ -55,6 +55,7 @@ and etextools-examples.tex \askforoverwritefalse \generate{% \file{etextools.drv}{\from{etextools.dtx}{driver}}% + \file{etextools-examples.tex}{\from{etextools.dtx}{example}}% } \obeyspaces diff --git a/Master/texmf-dist/tex/latex/etextools/etextools.sty b/Master/texmf-dist/tex/latex/etextools/etextools.sty index f6d54d4572d..485d402da68 100644 --- a/Master/texmf-dist/tex/latex/etextools/etextools.sty +++ b/Master/texmf-dist/tex/latex/etextools/etextools.sty @@ -19,10 +19,10 @@ %% etextools.sty, etextools.pdf, etextools.ins, %% and etextools-examples.tex %% -%%% etextools : e-TeX tools for LaTeX Users and package Writers (v.3.1415 - 2009/10/14) +%%% etextools : e-TeX tools for LaTeX Users and package Writers (v.3.14159 - 2010/04/20) \NeedsTeXFormat{LaTeX2e}[1996/12/01] \ProvidesPackage{etextools} - [2009/10/14 v3.1415 e-TeX more useful tools for LaTeX package writers] + [2010/04/20 v3.14159 e-TeX more useful tools for LaTeX package writers] \csname ettl@onlyonce\endcsname\let\ettl@onlyonce\endinput \RequirePackage{etex,etoolbox,letltxmacro} \let\ettl@AtEnd\@empty @@ -172,8 +172,16 @@ \newcommand*\noexpandafter{\noexpand\expandafter} %% \thefontname -\newcommand\thefontname{{\expandafter\ettl@thefontname\expandafter\strip@meaning\the\font}} -\font\ettl@thefontname=ecrm1000 +\newcommand\thefontname{{\expandafter\expandafter\expandafter\ettl@thefontname + \expandafter\expandafter\expandafter\meaning + \expandafter\the\expandafter\font + \expandafter\string\expandafter(% + \expandafter\string\the\font\string)}} +\ifcsname T1/cmr/m/n/10\endcsname + \letcs\ettl@thefontname{T1/cmr/m/n/10}% +\else + \font\ettl@thefontname=ecrm1000 +\fi %% \showcs { csname } \providecommand*\showcs[1]{\expandafter\show\csname#1\endcsname} @@ -223,7 +231,7 @@ %% \ifdefmathchar { cs-token }{ true }{ false } \FEII \def\ettl@ifdef[#1]{\expandafter\ettl@ifd@f\expandafter{#1}} \def\ettl@ifd@f#1#2{% - \csdef{ettl@ifdef#2}##1#1##2/End^^a7Meaning/{\ettl@nbk##2//{\rmn@firstoftwo}{\rmn@secondoftwo}//} + \csdef{ettl@ifdef#2}##1#1##2/End^^a7Meaning/{\ettl@nbk##2//\rmn@firstoftwo\rmn@secondoftwo//} \csedef{ifdef#2}##1{\noexpand\romannumeral\noexpandafter% \noexpandcs{ettl@ifdef#2}\noexpand\meaning##1#1/End^^a7Meaning/}%//{##2}{##3}//} } @@ -821,9 +829,12 @@ \def\ettl@singlelist@result#1#2#3#4/End^^a7List/{\ExpandNextTwo\@swaptwo% {\number\numexpr\ifempty{#3}{-1}{#2)}}{\number\numexpr#1}{#3}} \def\ettl@setresult#1of#2>#3<{\ettl@nbk #3//% - {\ifdefcount{#3}{#3=\csname ettl@#1of#2\endcsname} - {\edef#3{\csname ettl@#1of#2\endcsname}}}% + {\ettl@set@result#1of#2>#3<} {\csname ettl@#1of#2\endcsname}//} +\def\ettl@set@result#1of#2>#3<#4{\ifdefcount{#3} + {#3=\csname ettl@#1of#2\endcsname#4} + {\expandafter\edef\noexpand#3{\csname ettl@#1of#2\endcsname{#4}}}% +} %% \DeclareCmdListParser : general constructor for command-list parsers %% \DeclareCmdListParser\ParserName{separator} @@ -954,9 +965,9 @@ \long\def#3[##1]##2#5#8#5##3##4/##5##6##7/End^^a7List/{##6[##1+1]##2#5##3##4//##6##7/End^^a7List/}% \ifnotempty{#5}%% special case if no separator {\long\def#4[##1]#5##2#5#5##3//##4/End^^a7List/{\unexpanded{#1\def#7{##2#5}}% - \ettl@nbk#6//\ettl@setresult 1of1>#6<{\number\numexpr##1-1\relax}{}//}}% + \ettl@nbk#6//{\ettl@setresult 1of1>#6<{\number\numexpr##1-1\relax}}{}//}}% {\long\def#4[##1]##2//##3/End^^a7List/{\unexpanded{#1\def#7{##2}}% - \ettl@nbk#6//\ettl@setresult 1of1>#6<{\number\numexpr##1-1\relax}{}//}}% + \ettl@nbk#6//{\ettl@setresult 1of1>#6<{\number\numexpr##1-1\relax}}{}//}}% \long\def#2##1{#3[0]#5##1#5#5#8#5//#3#4/End^^a7List/}% \edef#7{\endgroup\expandafter#2\expandafter{#7}}#7} \def\ettl@gobble@relax#1\relax{} @@ -965,16 +976,13 @@ %% \listgdel \listMacro { item } %% \listedel \listMacro { item } %% \listxdel \listMacro { item } -\begingroup\catcode`\|=3 +\edef\ettl@restore@catcode{\catcode124 \the\catcode124}% |=124 +\catcode`\|=3 \newrobustcmd\listdel[1][]{\ettl@RemoveInList{}\listdel|{#1}} \newrobustcmd\listgdel[1][]{\ettl@RemoveInList\global\listdel|{#1}} \newrobustcmd\listedel[1][]{\ettl@listedel{}\listdel|{#1}} \newrobustcmd\listxdel[1][]{\ettl@listedel\global\listdel|{#1}} -\aftergroup@def\listdel -\aftergroup@def\listgdel -\aftergroup@def\listedel -\aftergroup@def\listxdel -\endgroup% \catcode group +\ettl@restore@catcode\undef\ettl@restore@catcode \newrobustcmd\ettl@listedel[6]{\begingroup\protected@edef#5{#6}\expandafter\endgroup \expandafter\@swaparg\expandafter{#5}{\ettl@RemoveInList#1#2{#3}{#4}#5}} @@ -999,24 +1007,35 @@ %% \getlistindex[\indexmacro]{ \Listmacro } %% \getlistindex*[\indexmacro]{ expanded List } -\newrobustcmd\ettl@getlistindex[6][]{% #1=result, #2=\expandafter, #3=loop macro, #4=separator, #5=list of list macro, #6=item - \begingroup\def\ettl@getlistindex##1#4#6#4##2/End^^a7List/{\endgroup - \romannumeral-`\q\ettl@setresult 1of1>#1<{\ettl@nbk##2//{#3*!{##1}}{-1}//}% - }#2\ettl@getlistindex#2#5#4#6#4/End^^a7List/} +\newrobustcmd\ettl@getlistindex[6]{% #1=result, #2=\expandafter, #3=loop macro, #4=separator, #5=list of list macro, #6=item + \begingroup\long\def\ettl@getlistindex##1#4#6#4##2/End^^a7List/{\endgroup + \ExpandAftercmds{\ettl@setresult 1of1>#1<}{\ettl@nbk##2//{#3*!{##1}}{-1}//}% + }#2\ettl@getlistindex#5#4#6#4/End^^a7List/} +\newrobustcmd\getlistindex{\@ifstar + {\@testopt{\ettl@get@listindex\relax}{}} + {\@testopt{\ettl@get@listindex\expandafter}{}}} \begingroup\catcode`\|=3% etb catcode -\newrobustcmd\getlistindex[3][]{\@ifstar% - {\ettl@getlistindex{}\listloop{|}{#1}{#2}{#3}} - {\ifiscs{#1}{\ettl@getlistindex\expandafter\listloop|{#1}{#2}{#3}} - {\ettl@getlistindex{}\listloop|{#1}{#2}{#3}}}} -\aftergroup@def\getlistindex +\protected\long\gdef\ettl@get@listindex#1[#2]#3#4{% + \ifx#1\relax + \ettl@getlistindex{#2}{}\listloop|{#4}{#3}% + \else \ifiscs{#4} + {\ettl@getlistindex{#2}#1\listloop|{#4}{#3}} + {\ettl@getlistindex{#2}\listloop|{#4}{#3}}% + \fi} \endgroup%\catcode group %\getcsvlistindex [\result]{ item }{ csvlistmacro } %\getcsvlistindex*[\result]{ item }{ item,item,item } -\newrobustcmd\getcsvlistindex[3][]{\@ifstar% - {\ettl@getlistindex{}\csvloop{,}{#1}{#2}} - {\ifiscs{#1}{\ettl@getlistindex\expandafter\csvloop,{#1}{#2}} - {\ettl@getlistindex{}\csvloop,{#1}{#2}}}} +\newrobustcmd\getcsvlistindex{\@ifstar + {\@testopt{\ettl@get@csvlistindex\relax}{}} + {\@testopt{\ettl@get@csvlistindex\expandafter}{}}} +\protected\long\gdef\ettl@get@csvlistindex#1[#2]#3#4{% + \ifx#1\relax + \ettl@getlistindex{#2}{}\csvloop,{#4}{#3}% + \else \ifiscs{#4} + {\ettl@getlistindex{#2}#1\csvloop,{#4}{#3}} + {\ettl@getlistindex{#2}\csvloop,{#4}{#3}}% + \fi} \def\ettl@if@inlist#1#2{%#1=macro,#2=separator \newrobustcmd*#1{\@ifstar{\ettl@ifinlist{#2}{}}{\ettl@ifinlist{#2}\expandafter}}} \def\ettl@xif@inlist#1#2{% |