summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/generic/FAQ-en/html/FAQ-twooptarg.html
diff options
context:
space:
mode:
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.html78
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&rsquo;ve already read
+&ldquo;<a href="FAQ-moren9.html">breaking the 9-argument limit</a>&rdquo;.
+you can probably guess the &ldquo;simple&rdquo; 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 &mdash; 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&rsquo;s probably better to learn to write the commands
+yourself, just to see why they&rsquo;re not even a good idea from the
+programming point of view.
+<p/>A command with two optional arguments strains the limit of what&rsquo;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
+&ldquo;<a href="FAQ-moren9.html">breaking the 9-argument limit</a>&rdquo;,
+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&rsquo;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>