diff options
Diffstat (limited to 'Master/texmf-dist/doc/generic/FAQ-en/html/FAQ-twooptarg.html')
-rw-r--r-- | Master/texmf-dist/doc/generic/FAQ-en/html/FAQ-twooptarg.html | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/generic/FAQ-en/html/FAQ-twooptarg.html b/Master/texmf-dist/doc/generic/FAQ-en/html/FAQ-twooptarg.html new file mode 100644 index 00000000000..bb7b1a8208c --- /dev/null +++ b/Master/texmf-dist/doc/generic/FAQ-en/html/FAQ-twooptarg.html @@ -0,0 +1,78 @@ +<head> +<title>UK TeX FAQ -- question label twooptarg</title> +</head><body> +<h3>More than one optional argument</h3> +<p/>If you’ve already read +“<a href="FAQ-moren9.html">breaking the 9-argument limit</a>”. +you can probably guess the “simple” solution to this problem: +command relaying. +<p/>LaTeX allows commands with a single optional argument thus: +<pre> + \newcommand{\blah}[1][Default]{...} +</pre> +<p/>You may legally call such a command either with its optional argument +present, as +<code>\</code><code>blah[nonDefault]</code> or without, as <code>\</code><code>blah</code>; in the latter +case, the code of <code>\</code><code>blah</code> will have an argument of <code>Default</code>. +<p/>To define a command with two optional arguments, we use the relaying +technique, as follows: +<pre> + \newcommand{\blah}[1][Default1]{% + \def\ArgI{{#1}}% + \BlahRelay + } + \newcommand\BlahRelay[1][Default2]{% + % the first optional argument is now in + % \ArgI + % the second is in #1 + ...% + } +</pre> +Of course, <code>\</code><code>BlahRelay</code> may have as many mandatory arguments as are +allowed, after allowance for the one taken up with its own +optional argument — that is, 8. +<p/>Variants of <code>\</code><code>newcommand</code> (and friends), with names like +<code>\</code><code>newcommandtwoopt</code>, are available in the <i>twoopt</i> package. +However, if you can, it’s probably better to learn to write the commands +yourself, just to see why they’re not even a good idea from the +programming point of view. +<p/>A command with two optional arguments strains the limit of what’s +sensible: obviously you can extend the technique to provide as many +optional arguments as your fevered imagination can summon. However, +see the comments on the use of the <i>keyval</i> package, in +“<a href="FAQ-moren9.html">breaking the 9-argument limit</a>”, +which offers an alternative way forward. +<p/>If you must, however, consider the <i>optparams</i> or +<i>xargs</i> packages. <i>Optparams</i> +provides a <code>\</code><code>optparams</code> command that you use as an intermediate in +defining commands with up to nine optional arguments. The +documentation shows examples of commands with four optional arguments +(and this from an author who has his own key-value package!). +<p/>The <i>xargs</i> package uses a key-value package +(<i>xkeyval</i>) to <em>define</em> the layout of the optional +arguments. Thus +<blockquote> +<pre> +\usepackage{xargs} +... +\newcommandx{\foo}[3][1=1, 3=n]{...} +</pre> +</blockquote><p> +defines a command <code>\</code><code>foo</code> that has an optional first argument +(default 1), a mandatory second argument, and an optional third +argument (default n). +<p/>An alternative approach is offered by Scott Pakin’s +<i>newcommand</i> program, which takes a command name and a +definition of a set of command arguments (in a fairly +readily-understood language), and emits (La)TeX macros which enable +the command to be defined. The command requires that a +<i>Python</i> interpreter (etc.) be installed on your computer. +<dl> +<dt><tt><i>newcommand.py</i></tt><dd><a href="ftp://cam.ctan.org/tex-archive/support/newcommand.zip">support/newcommand</a> (<a href="ftp://cam.ctan.org/tex-archive/support/newcommand.tar.gz">gzipped tar</a>, <a href="http://www.tex.ac.uk/tex-archive/support/newcommand/">browse</a>) +<dt><tt><i>optparams.sty</i></tt><dd>Distributed as part of <a href="ftp://cam.ctan.org/tex-archive/macros/latex/contrib/sauerj.zip">macros/latex/contrib/sauerj</a> (<a href="ftp://cam.ctan.org/tex-archive/macros/latex/contrib/sauerj.tar.gz">gzipped tar</a>, <a href="http://www.tex.ac.uk/tex-archive/macros/latex/contrib/sauerj/">browse</a>) +<dt><tt><i>twoopt.sty</i></tt><dd>Distributed as part of <a href="ftp://cam.ctan.org/tex-archive/macros/latex/contrib/oberdiek.zip">macros/latex/contrib/oberdiek</a> (<a href="ftp://cam.ctan.org/tex-archive/macros/latex/contrib/oberdiek.tar.gz">gzipped tar</a>, <a href="http://www.tex.ac.uk/tex-archive/macros/latex/contrib/oberdiek/">browse</a>) +<dt><tt><i>xargs.sty</i></tt><dd><a href="ftp://cam.ctan.org/tex-archive/macros/latex/contrib/xargs.zip">macros/latex/contrib/xargs</a> (<a href="ftp://cam.ctan.org/tex-archive/macros/latex/contrib/xargs.tar.gz">gzipped tar</a>, <a href="http://www.tex.ac.uk/tex-archive/macros/latex/contrib/xargs/">browse</a>) +<dt><tt><i>xkeyval.sty</i></tt><dd><a href="ftp://cam.ctan.org/tex-archive/macros/latex/contrib/xkeyval.zip">macros/latex/contrib/xkeyval</a> (<a href="ftp://cam.ctan.org/tex-archive/macros/latex/contrib/xkeyval.tar.gz">gzipped tar</a>, <a href="http://www.tex.ac.uk/tex-archive/macros/latex/contrib/xkeyval/">browse</a>) +</dl> +<p/><p>This question on the Web: <a href="http://www.tex.ac.uk/cgi-bin/texfaq2html?label=twooptarg">http://www.tex.ac.uk/cgi-bin/texfaq2html?label=twooptarg</a> +</body> |