diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/xoptarg |
Initial commit
Diffstat (limited to 'macros/latex/contrib/xoptarg')
-rw-r--r-- | macros/latex/contrib/xoptarg/README | 8 | ||||
-rw-r--r-- | macros/latex/contrib/xoptarg/xoptarg.pdf | bin | 0 -> 383323 bytes | |||
-rw-r--r-- | macros/latex/contrib/xoptarg/xoptarg.sty | 225 | ||||
-rw-r--r-- | macros/latex/contrib/xoptarg/xoptarg.tex | 199 |
4 files changed, 432 insertions, 0 deletions
diff --git a/macros/latex/contrib/xoptarg/README b/macros/latex/contrib/xoptarg/README new file mode 100644 index 0000000000..78365c94bf --- /dev/null +++ b/macros/latex/contrib/xoptarg/README @@ -0,0 +1,8 @@ +Because they rely on the \futurelet primitive, the macros with +optional arguments cannot be expandable. However, it is possible to +make them expandable if there is at least one mandatory argument (see +`Limitations'). + +This material is subject to the LaTeX Project Public License. +See http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html +for the details of that license. diff --git a/macros/latex/contrib/xoptarg/xoptarg.pdf b/macros/latex/contrib/xoptarg/xoptarg.pdf Binary files differnew file mode 100644 index 0000000000..fa8e2ca0a3 --- /dev/null +++ b/macros/latex/contrib/xoptarg/xoptarg.pdf diff --git a/macros/latex/contrib/xoptarg/xoptarg.sty b/macros/latex/contrib/xoptarg/xoptarg.sty new file mode 100644 index 0000000000..d76cfe9f47 --- /dev/null +++ b/macros/latex/contrib/xoptarg/xoptarg.sty @@ -0,0 +1,225 @@ +% $Date: 2007-04-22 12:22:27 +0200 (Sun, 22 Apr 2007) $ +% $Revision: 39 $ +\def \filedate {2007/04/22} +\def \fileversion {v1.0} +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{xoptarg}% + [\filedate \space \fileversion \space Expandable optional-argument macros (JN)] + +\ifx \eTeXversion \@undefined + \PackageWarning{xoptarg}{% + This package works best with e-TeX\MessageBreak + for its \protect\protected \space feature% + }% + \let \XOA@protected = \relax +\else + \let \XOA@protected = \protected +\fi + +\RequirePackage{newcommand} + +%% \newcommand*{\xnewcommand}{% +%% \@ifstar {\XOA@xnewcommand[\def]}% +%% {\@testopt{\XOA@xnewcommand}{\long \def}}% +%% } + +\newcommand*{\xnewcommand}{\@star@or@long \XOA@xnewcommand} + +\newcommand*{\XOA@xnewcommand}{} +\newcommand*{\XOA@@xnewcommand}{} +\newcommand*{\XOA@@@xnewcommand}{} +\newcommand*{\XOA@@@@xnewcommand}{} +\newcommand*{\XOA@@@@ynewcommand}{} +\newcommand*{\XOA@@@ynewcommand}{} + +% [<prefix-def>] {<command>} +%% \long \def \XOA@xnewcommand [#1]#2{% +%% \@testopt {\XOA@@xnewcommand{#1}{#2}}{0}% +%% } + +% {<command>} +\long \def \XOA@xnewcommand #1{\@testopt {\XOA@@xnewcommand{#1}}{0}} + +% {<prefix-def>} {<command>} [<arg-num>] +%% \long \def \XOA@@xnewcommand #1#2[#3]{% +%% \ifnum #3>0 +%% \expandafter \@firstoftwo +%% \else +%% \expandafter \@secondoftwo +%% \fi +%% {\XOA@@@xnewcommand{#1}{#2}{#3}}% Possibly with optional +%% {\XOA@@@ynewcommand{#1}{#2}}% Certainly without optional +%% } + +% {<command>} [<arg-num>] +\long \def \XOA@@xnewcommand #1[#2]{% + \ifnum #2>0 + \expandafter \@firstoftwo + \else + \expandafter \@secondoftwo + \fi + {\XOA@@@xnewcommand{#1}{#2}}% Possibly with optional + {\XOA@@@ynewcommand{#1}}% Certainly without optional +} + + +% {<prefix-def>} {<command>} {<arg-num>} +%% \long \def \XOA@@@xnewcommand #1#2#3{% +%% \@ifnextchar [%] +%% {\XOA@@@@xnewcommand{#1}{#2}{#3}}% With optional +%% {\XOA@@@@ynewcommand{#1}{#2}{#3}}% Without optional +%% } + +% {<command>} {<arg-num>} +\long \def \XOA@@@xnewcommand #1#2{% + \@ifnextchar [%] + {\XOA@@@@xnewcommand{#1}{#2}}% With optional + {\XOA@@@@ynewcommand{#1}{#2}}% Without optional +} + +% {<prefix-def>} {<command>} {<arg-num>} [<default>] {<definition>} +%% \long \def \XOA@@@@xnewcommand #1#2#3[#4]#5{% +%% \ifnum #3<2 +%% \PackageWarning{xoptarg}{% +%% Without at least one mandatory argument {...}\MessageBreak +%% I cannot make the macro \protect#2\space expandible.\MessageBreak +%% I will make it robust instead% +%% }% +%% \def \@tempa ##1{% +%% \in@{\protected}{#1}% +%% \unless \ifin@ +%% \XOA@protected +%% \fi +%% #1#2{\@testopt {##1}{#4}}% +%% \def \@tempa {#1##1}% +%% \def \@tempb ####1#3####2\@nil {####1#3}% +%% \expandafter \@tempa \@tempb [####1]% +%% ####2####3####4####5####6####7####8####9\@nil +%% }% +%% \count@ = \escapechar +%% \escapechar = -1 +%% \expandafter \@tempa \csname \string #2 \endcsname {#5}% +%% \escapechar = \count@ +%% \else +%% \def \@tempa ##1{% +%% #1#2####1####{% +%% \XOA@ifempty{####1}% +%% {##1[{#4}]}% +%% {% +%% \XOA@ifbeginswithspace{####1}% +%% {\XOA@removespace \foo ####1}% +%% {\XOA@ifbracket {##1[}{##1[{#4}]}####1}%] +%% }% +%% }% +%% \def \@tempa {#1##1}% +%% \def \@tempb ####1#3####2\@nil {####1#3}% +%% \expandafter \@tempa \@tempb [####1]% +%% ####2####3####4####5####6####7####8####9\@nil +%% }% +%% \count@ = \escapechar +%% \escapechar = -1 +%% \expandafter \@tempa \csname \string #2 \endcsname {#5}% +%% \escapechar = \count@ +%% \fi +%% } + +% {<command>} {<arg-num>} [<default>] {<definition>} +\long \def \XOA@@@@xnewcommand #1#2[#3]#4{% + \ifnum #2<2 + \PackageWarning{xoptarg}{% + Without at least one mandatory argument {...}\MessageBreak + I cannot make the macro \protect#1\space expandible.\MessageBreak + I will make it robust instead% + }% + \def \@tempa ##1{% + \expandafter \in@ \expandafter \protected \expandafter {\l@ngrel@x}% + \unless \ifin@ + \XOA@protected + \fi + \l@ngrel@x \def #1{\@testopt {##1}{#3}}% + \def \@tempa {\l@ngrel@x \def ##1}% + \def \@tempb ####1#2####2\@nil {####1#2}% + \expandafter \@tempa \@tempb [####1]% + ####2####3####4####5####6####7####8####9\@nil + }% + \count@ = \escapechar + \escapechar = -1 + \expandafter \@tempa \csname \string #1 \endcsname {#4}% + \escapechar = \count@ + \else + \def \@tempa ##1{% + \l@ngrel@x \def #1####1####{% + \XOA@ifempty{####1}% + {##1[{#3}]}% + {% + \XOA@ifbeginswithspace{####1}% + {\XOA@removespace \foo ####1}% + {\XOA@ifbracket {##1[}{##1[{#3}]}####1}%] + }% + }% + \def \@tempa {\l@ngrel@x \def ##1}% + \def \@tempb ####1#2####2\@nil {####1#2}% + \expandafter \@tempa \@tempb [####1]% + ####2####3####4####5####6####7####8####9\@nil + }% + \count@ = \escapechar + \escapechar = -1 + \expandafter \@tempa \csname \string #1 \endcsname {#4}% + \escapechar = \count@ + \fi +} + +% {<prefix-def>} {<command>} {<arg-num>} {<definition>} +%% \long \def \XOA@@@@ynewcommand #1#2#3#4{% +%% \def \@tempa {#1#2}% +%% \def \@tempb ##1#3##2\@nil {##1#3}% +%% \expandafter \@tempa \@tempb ##1##2##3##4##5##6##7##8##9\@nil {#4}% +%% } + +% {<command>} {<arg-num>} {<definition>} +\long \def \XOA@@@@ynewcommand #1#2#3{% + \def \@tempa {\l@ngrel@x \def #1}% + \def \@tempb ##1#2##2\@nil {##1#2}% + \expandafter \@tempa \@tempb ##1##2##3##4##5##6##7##8##9\@nil {#3}% +} + +% {<prefix-def>} {<command>} {<definition>} +%% \long \def \XOA@@@ynewcommand #1#2#3{#1#2{#3}} + +% {<command>} {<definition>} +\long \def \XOA@@@ynewcommand #1#2{\l@ngrel@x \def #1{#2}} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newcommand*{\XOA@ifbeginswithspace}[1]{% + \XOA@@ifbeginswithspace #1 \@nil +} + +\newcommand*{\XOA@@ifbeginswithspace}{} +\def \XOA@@ifbeginswithspace #1 #2\@nil {% + \XOA@ifempty{#1}% + {\@firstoftwo}% + {\@secondoftwo}% +} + +\newcommand*{\XOA@removespace}{} +\def \XOA@removespace #1 {#1} + +\newcommand*{\XOA@ifbracket}[3]{% + \ifx [#3% + \expandafter \@firstoftwo + \else + \expandafter \@secondoftwo + \fi + {#1}{#2#3}% +} + +\newcommand*{\XOA@ifempty}[1]{% + \ifx \relax #1\relax + \expandafter \@firstoftwo + \else + \expandafter \@secondoftwo + \fi +} + +\empty diff --git a/macros/latex/contrib/xoptarg/xoptarg.tex b/macros/latex/contrib/xoptarg/xoptarg.tex new file mode 100644 index 0000000000..38111b7c86 --- /dev/null +++ b/macros/latex/contrib/xoptarg/xoptarg.tex @@ -0,0 +1,199 @@ +\documentclass{article} + +\usepackage{etex} +\usepackage{xifthen} +\usepackage[ascii]{inputenc} +\usepackage[T1]{fontenc} +\usepackage[warn]{textcomp} +\usepackage[a4paper, pdftex, margin=1.5in]{geometry} +\usepackage{lmodern} +\usepackage{typetex} +\usepackage{xoptarg} +\usepackage{microtype} +\usepackage{xcolor} +\usepackage{url} +\usepackage[bottom,hang]{footmisc} +\usepackage[babel]{csquotes} +\usepackage[british]{babel} +\usepackage{hyperref} + +\setcounter{secnumdepth}{-\maxdimen} + +\newcommand*{\pack}{\textsf} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\newenvironment*{display}{% + \list{}{}% + \item \relax +}{% + \endlist +} + +\newcommand*{\setdate}{} +\def \setdate #1/#2/#3#4{% + \year = #1 + \month = #2 + \day = #3#4 +} + +\makeatletter +\newcommand*{\getfileinfo}[1]{% + \def \filename {#1}% + \def \@tempb ##1 ##2 ##3\relax ##4\relax {% + \def \filedate {##1}% + \def \fileversion {##2}% + \def \fileinfo {##3}% + }% + \edef \@tempa {\csname ver@#1\endcsname}% + \expandafter \@tempb \@tempa \relax ? ? \relax \relax +} + +\newcommand*{\TypeOut}[1]{% + \texttt{% + \frenchspacing + \begingroup + \let \protect = \string + \xdef \@gtempa {#1}% + \endgroup + \let \@tempa = \@gtempa + \@onelevel@sanitize \@tempa \@tempa}% +} +\makeatother + +\title {The \pack{xoptarg} Package} +\author {Josselin Noirel\\\url{http://www.jnoirel.fr/}} +\date {% + \getfileinfo{xoptarg.sty} + \expandafter \setdate \filedate + \today\ (\fileversion)} + +\begin{document} + +\maketitle + +\begin{abstract} + Because they rely on the \cmd{futurelet} primitive, the macros with + optional arguments cannot be expandable. However, it is possible to + make them expandable if there is at least one mandatory argument + (see `Limitations'). +\end{abstract} + +\tableofcontents + +\section{Introduction} + +\newcommand*{\cmda}[1]{1. #1 2. #1 3. #1 4. #1} +\newcommand*{\cmdb}[3]{[#1#2#3 #1#3#2 #2#1#3 #2#3#1 #3#1#2 #3#2#1]} +\newcommand*{\cmdc}[2][X]{(#1,#2)} + +Normal macros are expandable: +% +\begin{texcode} +\cmd[3]{newcommand}*{\cmd{cmda}}[1]{1. \#1 2. \#1 3. \#1 4. \#1} \newline +\cmd[3]{newcommand}*{\cmd{cmdb}}[3]{[\#1\#2\#3 \#1\#3\#2 \#2\#1\#3 + \#2\#3\#1 \#3\#1\#2 \#3\#2\#1]} \newline +\end{texcode} +% +`Expandable' means that if you print them on the terminal with +\cmd{typeout} +% +\begin{texcode} +\cmd[1]{typeout}{\cmd[1]{cmda}{Test}...and \cmd[3]{cmdb}{T}{h}{e} rest} \par +\end{texcode} +% +it will result in the processed message which is printed during the +compilation: +% +\begin{display} +\TypeOut{\cmda{Test}...and \cmdb{T}{h}{e} rest} +\typeout{TEST>>> \cmda{Test}...and \cmdb{T}{h}{e} rest} +\end{display} + +But, commands defined to take an optional argument behave +differently. The code: +% +\begin{texcode} +\cmd[3]{newcommand}*{\cmd{cmdc}}[2][X]{(\#1,\#2)} \newline +\cmd[1]{typeout}{\cmd[2]{cmdc}[A]{B} \cmd[1]{cmdc}{C}} +\end{texcode} +% +prints the unprocessed +% +\begin{display} +\TypeOut{\cmdc[A]{B} \cmdc{C}} +\typeout{TEST>>> \cmdc[A]{B} \cmdc{C}} +\end{display} +% +and not \tex{(A,B)~(X,C)}! (Of course, in typesetting context, it +doesn't make any difference\dots\ the interest of the package lies +in the expandability in moving-argument contexts.) The \pack{xoptarg} +helps you to make your macros expandable even when they take an +optional argumen (see `Limitations' though). + +\section{Usage} + +\subsection{Defining commands} + +Your macros, including those that take an optional argument can be +expandable provided they also take at least one mandatory +argument\footnote{If your macros don't take any optional argument, the + standard behaviour prevails so that you don't to have to worry about + them. The `at least one mandatory argument' condition applies only + when the macro takes an optional argument.}. Practically spoken, +your command, when it takes an optional argument, must take at least +two arguments in total\footnote{A~second requirement is that the + mandatory arguments be surrounded by explicit braces \tex{\{\dots\}}.}. + +Load the package with +% +\begin{texcode} +\cmd[1]{usepackage}{xoptarg} +\end{texcode} +% +then, instead of using \cmd{newcommand}, use \cmd{xnewcommand} +% +\begin{texcode} +\cmd[4]{xnewcommand}*{\<command\>}[$n$][\<default\>]{\<definition\>} +\end{texcode} +% +This is the same syntax as \cmd{newcommand}'s and it works even if the +command does take any optional argument. A~normal, non-expandable, +macro is defined when you define a~macro that takes one optional argument +and no mandatory one. A~warning is issued to inform you that it won't +be possible to make it expandable\footnote{The command will be made + robust using \cmd{protected} if \eTeX\ is available.}. + +\subsection{Changing the prefix} + +This package uses \pack{newcommand} that allows a~more sophisticated +syntax: +% +\begin{texcode} +\cmd[5]{xnewcommand}[\<prefix\>]{\<command\>}[$n$][\<default\>]{\<definition\>} +\end{texcode} +% +For instance, to define a~macro globally, use +% +\begin{texcode} +\cmd[3]{xnewcommand}[\cmd{global}]{\<command\>}{\<definition\>} +\end{texcode} +% +(But \cmd{newcommand} would do the job as well, as \pack{newcommand} +improves it also.) + +\section{Limitations} + +The limitations of the package are the following: +% +\begin{itemize} +\item To be expandable, the macros with an optional argument must have + at least one mandatory argument. + +\item The mandatory arguments must be surrounded by braces in this + case. + +\item There is no \cmd{rexnewcommand} command. +\end{itemize} + +\end{document} |