diff options
Diffstat (limited to 'Master/texmf-dist/doc')
-rw-r--r-- | Master/texmf-dist/doc/latex/options/README | 74 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/options/options.html | 1659 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/options/options.pdf | bin | 0 -> 114069 bytes |
3 files changed, 1733 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/options/README b/Master/texmf-dist/doc/latex/options/README new file mode 100644 index 00000000000..415a2f54a09 --- /dev/null +++ b/Master/texmf-dist/doc/latex/options/README @@ -0,0 +1,74 @@ +This is the README file for the options package. + +VERSION + +Version 1.0, December 2015 + +SUMMARY + +Provices convenient key-value options for LaTeX package writers. + +It has a similar interface as `pgfkeys` with path options but comes with more +built-in data types and more convenient support for families and searching. +The main features of the `options` pckage are: + +* Declare your options only once: in most packages you usually need to + declare both a new command, and the option that sets it. In the + `options` package you declare the option just once. For example, + + \options{/my/len/.new length} + + and then use it anywhere else as + + \option{/my/len} + +* _Use paths for keys_: just like `pgfkeys`, the `options` package uses + paths (instead of families) to declare options and prevent name clashes + between different packages. Paths are convenient for complex options, + like `border/left/width`, and are also convenient to specify searches. + +* _Many built-in data types_: the `options` library comes with many + useful data types like `choice`, `list`, `toggle`, `num`, `dim`, + `length`, `glue`, commands, and plain values, and it is easy to add + your own. Also you can hook into existing definitions like an `if` or `counter`. + +* _Value options_: You can define value-only options that start with a + special character, like `"Georgia"` for a font option, or + `!8080FF` for a color option. + +* _Convenient searches_: you can specify paths that should be searched + from other paths and redirect even from absolute paths. For complex + packages this is very useful to inherit common options. + +* _Easy filtering_: it is easy to collect unknown options and process + them later. Combined with the search mechanism this makes it easy to + do custom processing. + +* _It is fast_: for simple user options, the &options; package is a bit + faster than `pgfkeys` and if searches or filters are involved it is + usually about twice as fast as `pgfkeys` (and about six times faster + as `xkeyval`). + +* _Handles class and package options_: use the same option declarations + to handle the options passed to a class or package. + +LICENSE + +Copyright (c) 2015 Daan Leijen. + +This software is author-maintained. Permission is granted to copy, +distribute and/or modify this software under the terms of the +LaTeX Project Public License, version 1.3 or higher. This software +is provided 'as it is', without warranty of any kind, either +expressed or implied, including, but not limited to, the implied +warranties of merchantability and fitness for any particular purpose. + +RELATED PACKAGES + +keyval, xkeyval, pgfkeys, longfbox + +AUTHOR + +Daan Leijen (daan@microsoft.com) + + diff --git a/Master/texmf-dist/doc/latex/options/options.html b/Master/texmf-dist/doc/latex/options/options.html new file mode 100644 index 00000000000..4647dc672d6 --- /dev/null +++ b/Master/texmf-dist/doc/latex/options/options.html @@ -0,0 +1,1659 @@ +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="content-type" content="text/html; charset=UTF-8" /> + <meta name="generator" content="Madoko, version 0.9.20-beta" /> + <meta name="viewport" content="initial-scale=1.0" /> + <meta name="author" content="Daan Leijen" /> + <title>The options package</title> + <style type="text/css" class="link"> + /*# sourceURL=madoko.css */ + /* --------------------------------------------------- + Various settings to display madoko elements correctly. + For example, lines in tables or a table of contents. + + All rules use specific madoko classes and never just + a generic element. This means one can safely include + this CSS into any web page without affecting non-madoko + content. + ----------------------------------------------------*/ + + /* The table of contents */ + .madoko .toc>.tocblock .tocblock .tocblock { + margin-left: 2.25em; + } + + .madoko .toc>.tocblock .tocblock { + margin-left: 1.5em; + } + + .madoko .toc>.tocblock>.tocitem { + font-weight: bold; + } + + .madoko .toc { + margin-top: 1em; + } + + /* Paragraphs */ + .madoko p.para-continue { + margin-bottom: 0pt; + } + + .madoko .para-block+p { + margin-top: 0pt; + } + + .madoko ul.para-block, .madoko ol.para-block { + margin-top: 0pt; + margin-bottom: 0pt; + } + + .madoko ul.para-end, .madoko ol.para-end { + margin-bottom: 1em; + } + + .madoko dl { + margin-left: 0em; + } + + .madoko blockquote { + font-style: italic; + } + + /* Local page links do not get an underline unless hovering */ + .madoko a.localref { + text-decoration: none; + } + .madoko a.localref:hover { + text-decoration: underline; + } + + /* Footnotes */ + .madoko .footnotes { + font-size: smaller; + margin-top: 2em; + } + + .madoko .footnotes hr { + width: 50%; + text-align: left; + } + + .madoko .footnote { + margin-left: 1em; + } + .madoko .footnote-before { + margin-left: -1em; + width: 1em; + display: inline-block; + } + + /* Alignment */ + .madoko .align-center, .madoko .align-center>p { + text-align: center !important; + } + + .madoko .align-center pre { + text-align: left; + } + + .madoko .align-center>* { + margin-left: auto !important; + margin-right: auto !important; + } + + .madoko .align-left, .madoko .align-left>p { + text-align: left !important; + } + + .madoko .align-left>* { + margin-left: 0pt !important; + margin-right: auto !important; + } + + .madoko .align-right, .madoko .align-right>p { + text-align: right !important; + } + + .madoko .align-right>* { + margin-left: auto !important; + margin-right: 0pt !important; + } + + .madoko .align-center>table, + .madoko .align-left>table, + .madoko .align-right>table { + text-align: left !important; + } + + + /* Equations, Figure's etc. */ + .madoko .equation-before { + float: right; + } + + /* Bibliography */ + .madoko .bibitem { + font-size: smaller; + } + + .madoko .bib-numeric .bibitem { + margin-left: 3em; + text-indent: -3em; + } + + .madoko .bibitem-before { + display: none; + } + + .madoko .bib-numeric .bibitem-before { + display: inline-block; + width: 3em; + text-align: right; + } + + .madoko .bibsearch { + font-size: x-small; + text-decoration:none; + color: black; + font-family: "Segoe UI Symbol", Symbola, serif; + } + + /* General */ + .madoko .block, .madoko .figure, .madoko .bibitem, .madoko .equation, .madoko div.math { + margin-top: 1ex; + margin-bottom: 1ex; + } + + .madoko .figure { + padding: 0.5em; + margin-left: 0pt; + margin-right: 0pt; + } + + .madoko .hidden { + display: none; + } + + .madoko .invisible { + visibility: hidden; + } + + .madoko.preview .invisible { + visibility: visible; + opacity: 0.5; + } + + .madoko code.code, .madoko span.code { + white-space: pre-wrap; + } + + .madoko hr, hr.madoko { + border: none; + border-bottom: black solid 1px; + margin-bottom: 0.5ex; + } + + .madoko .framed>*:first-child { + margin-top: 0pt; + } + .madoko .framed>*:last-child { + margin-bottom: 0pt; + } + + /* Lists */ + + .madoko ul.list-star { + list-style-type: disc; + } + + .madoko ul.list-dash { + list-style-type: none !important; + } + + .madoko ul.list-dash > li:before { + content: "\2013"; + position: absolute; + margin-left: -1em; + } + + .madoko ul.list-plus { + list-style-type: square; + } + + /* Tables */ + .madoko table.madoko { + border-collapse: collapse; + } + .madoko td, .madoko th { + padding: 0ex 0.5ex; + margin: 0pt; + vertical-align: top; + } + + .madoko .cell-border-left { + border-left: 1px solid black; + } + .madoko .cell-border-right { + border-right: 1px solid black; + } + + + .madoko thead>tr:first-child>.cell-line, + .madoko tbody:first-child>tr:first-child>.cell-line { + border-top: 1px solid black; + border-bottom: none; + } + + .madoko .cell-line, .madoko .cell-double-line { + border-bottom: 1px solid black; + border-top: none; + } + + .madoko .cell-double-line { + border-top: 1px solid black; + padding-top: 1.5px !important; + } + + + /* Math Pre */ + .madoko .input-mathpre .MathJax_Display { + text-align: left !important; + } + + .madoko div.input-mathpre { + text-align: left; + margin-top: 1.5ex; + margin-bottom: 1ex; + } + + .madoko .math-rendering { + color: gray; + } + + /* Math */ + .madoko .mathdisplay { + text-align: center; + } + + + /*--------------------------------------------------------------------------- + Default style for syntax highlighting + ---------------------------------------------------------------------------*/ + + .madoko .pretty table { + border-collapse: collapse; + } + .madoko .pretty td { + padding: 0em; + } + .madoko .pretty td.empty { + min-width: 1.5ex; + } + .madoko .pretty td.expander { + width: 100em; + } + + /* --------------------------------------------------- + Styling for full documents + ----------------------------------------------------*/ + body.madoko, .madoko .serif { + font-family: Cambria,"Times New Roman","Liberation Serif","Times",serif; + } + .madoko .sans-serif { + font-family: "Calibri", "Optima", sans-serif; + } + .madoko .symbol { + font-family: "Segoe UI Symbol", Symbola, serif; + } + + + body.madoko { + -webkit-text-size-adjust: 100%; /* so math displays well on mobile devices */ + text-rendering: optimizeLegibility; + } + + body.madoko { + max-width: 88ex; /* about 88 characters */ + margin: 1em auto; + padding: 0em 2em; + } + + body.preview.madoko { + padding: 0em 1em; + } + + .madoko p, + .madoko li { + text-align: justify; + } + + /* style headings nicer, especially h5 and h6 */ + .madoko h1, .madoko h2, .madoko h3, .madoko h4 { + margin-top: 1.22em; + margin-bottom: 1ex; + } + .madoko h1+p, .madoko h2+p, .madoko h3+p, .madoko h4+p, .madoko h5+p { + margin-top: 1ex; + } + .madoko h5, .madoko h6 { + margin-top: 1ex; + font-size: 1em; + } + .madoko h5 { + margin-bottom: 0.5ex; + } + .madoko h5 + p { + margin-top: 0.5ex; + } + .madoko h6 { + margin-bottom: 0pt; + } + .madoko h6 + p { + margin-top: 0pt; + } + + + /* Fix monospace display (see http://code.stephenmorley.org/html-and-css/fixing-browsers-broken-monospace-font-handling/) */ + .madoko pre, .madoko code, .madoko kbd, .madoko samp, .madoko tt, + .madoko .monospace, .madoko .token-indent, .madoko .reveal pre, .madoko .reveal code, .madoko .email { + font-family: Consolas,"Andale Mono WT","Andale Mono",Lucida Console,Monaco,monospace,monospace; + font-size: 0.85em; + } + .madoko pre code, .madoko .token-indent { + font-size: 0.95em; + } + + .madoko pre code { + font-family: inherit !important; + } + + /* Code prettify */ + .madoko ol.linenums li { + background-color: white; + list-style-type: decimal; + } + + /* Merging */ + .madoko .remote { + background-color: #F0FFF0; + } + .madoko .remote + * { + margin-top: 0pt; + } + + /* --------------------------------------------------- + Print settings + ----------------------------------------------------*/ + + @media print { + body.madoko { + font-size: 10pt; + } + @page { + margin: 1in 1.5in; + } + } + + /* --------------------------------------------------- + Mobile device settings + ----------------------------------------------------*/ + + @media only screen and (max-device-width:1024px) { + body.madoko { + padding: 0em 1em; + } + } + + </style> + + <style> + body.madoko { + margin-left: 14em; + } + body.preview.madoko { + margin-right: 1em; + margin-left: 5em; + } + </style> + </head> +<body class="madoko"> + +<div class="body madoko" style="line-adjust:0"> +<div class="titleblock align-center para-block" style="text-align:center;line-adjust:0"> +<div class="titleheader align-center" style="text-align:center;line-adjust:0"> +<div class="title para-block sans-serif" style="font-size:xx-large;margin-bottom:0.5ex;font-weight:normal;line-adjust:0">The options package</div> +<div class="subtitle para-block sans-serif" style="font-size:x-large;margin-bottom:0.5ex;font-weight:normal;line-adjust:0">Convenient key-value options for <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAAAnCAYAAADn590lAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFP0lEQVR42u1by3HbOhQ916MCOEoFQTqQk0kDTAf0vApC7d5SHFXgkTqQUkFCdRB1EEsdWK+CWFq9LbLwhQMjAAiQIC07vjOYiW18eH/nfoAQgAwaSSlPsBARBc3juQLAREq5wV9KSl4+efpkaKMagIwctZQSrgHgO88TDfN2Lc5O+q2xA8As5nzHHovA9YVaMwLwGcA1gDEAwZvo3nPiv+8B3PHvDg3elPOPUwCVx0jMc7a890/++Y6/6x0LSKfKmJPxvDGAwnFGCtqwLASfV1rOOAFYA/jh2GPFPM4ta7ds6Af+9wOEmdouDa2WkRanW8uxYe6R560C9tW/6TZgfh06t6OHCY2PKJkBmGhrvgPInHMtiwuX+wUefmvsUTQIfxe4ry6MXcS3HPtUlENmod+XKSU1zb1IHEALAFtOIlSgnDckJ9c9xvRVD9D3BzG/W+1XEyKaBSxdsJyuQg5J5lHsvhMLBAoHZEifuyfwqKgzOnpVZkkGRADsBcn3IqE3Cf6wvWbN0JIKWyJxik1RIy1dJT3jAbzqZOGzbsi2t6ElTErom7IX6UJScFBa5gtf9piQTkPAH/O85oxQh8DSYtQL5v8qdO+UiioAfLPECADIOH7pNB5IUQcWylBkCn+lNwuIaMKlxjQGTZIoiohyAHvzYCOpMGHhjmNaH12BmogkEUmOBQ8/Jxi7ALitPBCoIG8dw9MokWwqHfYMWrMF5UQkVNzoub10DeCrViybRemevf3Os4dam7OydchugsAlEf2jrcsZUQSPyza42inrYwHcBmReEsCiQ1YVnfV52j5Fi6J252sLNRSzUvv+sg3/KaBvDkAQ0dE2mEF4kgoMFKc6ZY9Syku1D2e4TWv2AJZGlnuIhbyUMapkiHjrGZUnqXhONA2FP1ZWZRiJ4Hg+rKL40Bu2uJNnLBtqqmdBUsotJ0cxWWTlyIQH9agq4uCNFljFM/aqLSNITGiA4VWLwRTFtcH7iOxt9RK8iq8uRKCMZpxUXGplCgDMuJ4axKPmAG5awMZTJhWhRjjzWH1QAc2osQBQcWLxOaK91F1RRKRcV9VGhXlNz/OkUZHrzGVEtDhjCHzjaTttEdbxr7kJsNTqxo0BgTNEWHpwHYXfV+zm2Nk6yY5LP9sQPddRsbVhjYDLTM/60sYXy+UYy3t0HSWl/CSlJMswK+33OiY71ujjcEawl+HxVX404nA8Xpp8cYutagOBFz3xO1RnvJNCjKE63f913HrFhW3lMPY1/rxkbIzZo57kcHXmiqp7Un7JvcGmXt4U988EHpRLRN983fSLnqAjP3NFVQA+GWOK+wZyF74V5O2bWlKxENiHR6kC7+cZK+rA5YJN4Cs87k/GeKkT8izKWhLRVEv1cyIqXHVpH49bZlq98RzbRHs8vqUNLWxzuK96fCFCpy+2UselKNFSSQvDfVMrKuv6jRF0E8BvrvGtFPSuo1FkAL5YoY9bGYrxD5auwZyIbGvV69QPjnT21FLhQlOKer1rWl5GRDXuLwfVa1ng/rFMCgNxvrNg1PgI4F8i+t+YN2OPqF3QasRx/XJRUcG3yF/Z2E9qrzZvz1u9uW5xQRg7bhMVvOo/OTS92HWNY2QB3jSykZTy6szCxFtLkdiUbaWOUwfP34jhLpNSTlvuvwFAMWtGZ6YkxL7z6/NdoIcm6OlhztCdiZdOeWxm+Kqo4VtPxVOUH6+KiqdFUxx7VdTTe5N6ijx4MT/6S2QsOipIFaIK9vavikpj+SFF/BjtXsriKTyKuAB7aYqq0eHyL4CmbR9StqVfbocpgMXmWmMAAAAASUVORK5CYII=" alt="$\mbox{\LaTeX}$" class="math-inline math" style="vertical-align:-0.243em;height:1.015em"> package writers</div></div> +<div class="authors align-center" style="text-align:center;width:80%;line-adjust:0"><table class="authorrow columns block" style="margin-top:2ex;width:100%;line-adjust:0"> +<tbody><tr><td class="author column" style="text-align:center;line-adjust:0"> +<div class="authorname" style="font-size:large;line-adjust:0">Daan Leijen</div> +<div class="authornote" style="line-adjust:0">2015-12-05</div></td></tr></tbody></table></div></div><span data-line=""></span> +<nav class="toc toc-contents"><h2 id="sec-contents" class="clearnum h1 heading-contents sans-serif" data-heading-depth="1" style="display:block;font-weight:normal">Contents</h2> +<div class="tocblock tocblock1"> +<div class="tocitem tocitem1" data-toc-target="sec-introduction" data-toc-depth="1" data-toc-line="[1]{.heading-label}. Introduction" style="toctarget:sec-introduction"><a href="#sec-introduction" class="localref"><span class="heading-label">1</span>. Introduction</a></div> +<div class="tocitem tocitem1" data-toc-target="sec-overview" data-toc-depth="1" data-toc-line="[2]{.heading-label}. Overview" style="toctarget:sec-overview"><a href="#sec-overview" class="localref"><span class="heading-label">2</span>. Overview</a></div> +<div class="tocblock tocblock2"> +<div class="tocitem tocitem2" data-toc-target="sec-an-example" data-toc-depth="2" data-toc-line="[2.1]{.heading-label}. An example" style="toctarget:sec-an-example"><a href="#sec-an-example" class="localref"><span class="heading-label">2.1</span>. An example</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-searches" data-toc-depth="2" data-toc-line="[2.2]{.heading-label}. Paths and searches" style="toctarget:sec-searches"><a href="#sec-searches" class="localref"><span class="heading-label">2.2</span>. Paths and searches</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-handling-unknown-options" data-toc-depth="2" data-toc-line="[2.3]{.heading-label}. Handling unknown options" style="toctarget:sec-handling-unknown-options"><a href="#sec-handling-unknown-options" class="localref"><span class="heading-label">2.3</span>. Handling unknown options</a></div></div> +<div class="tocitem tocitem1" data-toc-target="sec-defining-options" data-toc-depth="1" data-toc-line="[3]{.heading-label}. Defining options" style="toctarget:sec-defining-options"><a href="#sec-defining-options" class="localref"><span class="heading-label">3</span>. Defining options</a></div> +<div class="tocblock tocblock2"> +<div class="tocitem tocitem2" data-toc-target="sec-datatypes" data-toc-depth="2" data-toc-line="[3.1]{.heading-label}. Basic data types" style="toctarget:sec-datatypes"><a href="#sec-datatypes" class="localref"><span class="heading-label">3.1</span>. Basic data types</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-command-options" data-toc-depth="2" data-toc-line="[3.2]{.heading-label}. Command options" style="toctarget:sec-command-options"><a href="#sec-command-options" class="localref"><span class="heading-label">3.2</span>. Command options</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-hooks" data-toc-depth="2" data-toc-line="[3.3]{.heading-label}. Using existing definitions" style="toctarget:sec-hooks"><a href="#sec-hooks" class="localref"><span class="heading-label">3.3</span>. Using existing definitions</a></div></div> +<div class="tocitem tocitem1" data-toc-target="sec-option-transformers" data-toc-depth="1" data-toc-line="[4]{.heading-label}. Option transformers" style="toctarget:sec-option-transformers"><a href="#sec-option-transformers" class="localref"><span class="heading-label">4</span>. Option transformers</a></div> +<div class="tocblock tocblock2"> +<div class="tocitem tocitem2" data-toc-target="sec-operations-on-option-paths" data-toc-depth="2" data-toc-line="[4.1]{.heading-label}. Operations on option paths" style="toctarget:sec-operations-on-option-paths"><a href="#sec-operations-on-option-paths" class="localref"><span class="heading-label">4.1</span>. Operations on option paths</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-operations-on-arguments" data-toc-depth="2" data-toc-line="[4.2]{.heading-label}. Operations on arguments" style="toctarget:sec-operations-on-arguments"><a href="#sec-operations-on-arguments" class="localref"><span class="heading-label">4.2</span>. Operations on arguments</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-predefined-options" data-toc-depth="2" data-toc-line="[4.3]{.heading-label}. Predefined options" style="toctarget:sec-predefined-options"><a href="#sec-predefined-options" class="localref"><span class="heading-label">4.3</span>. Predefined options</a></div></div> +<div class="tocitem tocitem1" data-toc-target="sec-options" data-toc-depth="1" data-toc-line="[5]{.heading-label}. Option commands" style="toctarget:sec-options"><a href="#sec-options" class="localref"><span class="heading-label">5</span>. Option commands</a></div> +<div class="tocblock tocblock2"> +<div class="tocitem tocitem2" data-toc-target="sec-process-options" data-toc-depth="2" data-toc-line="[5.1]{.heading-label}. Processing options" style="toctarget:sec-process-options"><a href="#sec-process-options" class="localref"><span class="heading-label">5.1</span>. Processing options</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-using-options" data-toc-depth="2" data-toc-line="[5.2]{.heading-label}. Using options" style="toctarget:sec-using-options"><a href="#sec-using-options" class="localref"><span class="heading-label">5.2</span>. Using options</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-testing-options" data-toc-depth="2" data-toc-line="[5.3]{.heading-label}. Testing options" style="toctarget:sec-testing-options"><a href="#sec-testing-options" class="localref"><span class="heading-label">5.3</span>. Testing options</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-list-options" data-toc-depth="2" data-toc-line="[5.4]{.heading-label}. List options" style="toctarget:sec-list-options"><a href="#sec-list-options" class="localref"><span class="heading-label">5.4</span>. List options</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-showing-options" data-toc-depth="2" data-toc-line="[5.5]{.heading-label}. Showing options" style="toctarget:sec-showing-options"><a href="#sec-showing-options" class="localref"><span class="heading-label">5.5</span>. Showing options</a></div></div> +<div class="tocitem tocitem1" data-toc-target="sec-advanced-topics" data-toc-depth="1" data-toc-line="[6]{.heading-label}. Advanced topics" style="toctarget:sec-advanced-topics"><a href="#sec-advanced-topics" class="localref"><span class="heading-label">6</span>. Advanced topics</a></div> +<div class="tocblock tocblock2"> +<div class="tocitem tocitem2" data-toc-target="sec-handlers" data-toc-depth="2" data-toc-line="[6.1]{.heading-label}. Handlers" style="toctarget:sec-handlers"><a href="#sec-handlers" class="localref"><span class="heading-label">6.1</span>. Handlers</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-defining-new-data-types" data-toc-depth="2" data-toc-line="[6.2]{.heading-label}. Defining new data types" style="toctarget:sec-defining-new-data-types"><a href="#sec-defining-new-data-types" class="localref"><span class="heading-label">6.2</span>. Defining new data types</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-special" data-toc-depth="2" data-toc-line="[6.3]{.heading-label}. Single option values" style="toctarget:sec-special"><a href="#sec-special" class="localref"><span class="heading-label">6.3</span>. Single option values</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-search-algorithm" data-toc-depth="2" data-toc-line="[6.4]{.heading-label}. Search algorithm" style="toctarget:sec-search-algorithm"><a href="#sec-search-algorithm" class="localref"><span class="heading-label">6.4</span>. Search algorithm</a></div></div> +<div class="tocitem tocitem1" data-toc-target="sec-advanced-options-and-commands" data-toc-depth="1" data-toc-line="[7]{.heading-label}. Advanced options and commands" style="toctarget:sec-advanced-options-and-commands"><a href="#sec-advanced-options-and-commands" class="localref"><span class="heading-label">7</span>. Advanced options and commands</a></div> +<div class="tocblock tocblock2"> +<div class="tocitem tocitem2" data-toc-target="sec-transforming-an-option" data-toc-depth="2" data-toc-line="[7.1]{.heading-label}. Transforming an option" style="toctarget:sec-transforming-an-option"><a href="#sec-transforming-an-option" class="localref"><span class="heading-label">7.1</span>. Transforming an option</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-compatibility" data-toc-depth="2" data-toc-line="[7.2]{.heading-label}. Compatibility" style="toctarget:sec-compatibility"><a href="#sec-compatibility" class="localref"><span class="heading-label">7.2</span>. Compatibility</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-special-paths" data-toc-depth="2" data-toc-line="[7.3]{.heading-label}. Special paths" style="toctarget:sec-special-paths"><a href="#sec-special-paths" class="localref"><span class="heading-label">7.3</span>. Special paths</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-miscellaneous-commands" data-toc-depth="2" data-toc-line="[7.4]{.heading-label}. Miscellaneous commands" style="toctarget:sec-miscellaneous-commands"><a href="#sec-miscellaneous-commands" class="localref"><span class="heading-label">7.4</span>. Miscellaneous commands</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-setting-options-directly" data-toc-depth="2" data-toc-line="[7.5]{.heading-label}. Setting options directly" style="toctarget:sec-setting-options-directly"><a href="#sec-setting-options-directly" class="localref"><span class="heading-label">7.5</span>. Setting options directly</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-invoking-an-option-directly" data-toc-depth="2" data-toc-line="[7.6]{.heading-label}. Invoking an option directly" style="toctarget:sec-invoking-an-option-directly"><a href="#sec-invoking-an-option-directly" class="localref"><span class="heading-label">7.6</span>. Invoking an option directly</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-defining-a-new-code-value" data-toc-depth="2" data-toc-line="[7.7]{.heading-label}. Defining a new code value" style="toctarget:sec-defining-a-new-code-value"><a href="#sec-defining-a-new-code-value" class="localref"><span class="heading-label">7.7</span>. Defining a new code value</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-defining-new-handlers" data-toc-depth="2" data-toc-line="[7.8]{.heading-label}. Defining new handlers" style="toctarget:sec-defining-new-handlers"><a href="#sec-defining-new-handlers" class="localref"><span class="heading-label">7.8</span>. Defining new handlers</a></div> +<div class="tocitem tocitem2" data-toc-target="sec-defining-options-directly" data-toc-depth="2" data-toc-line="[7.9]{.heading-label}. Defining options directly" style="toctarget:sec-defining-options-directly"><a href="#sec-defining-options-directly" class="localref"><span class="heading-label">7.9</span>. Defining options directly</a></div></div> +<div class="tocitem tocitem1" data-toc-target="sec-perf" data-toc-depth="1" data-toc-line="[8]{.heading-label}. Performance" style="toctarget:sec-perf"><a href="#sec-perf" class="localref"><span class="heading-label">8</span>. Performance</a></div></div></nav> +<div class="mathdefs input-mathdefs"></div><h2 id="sec-introduction" class="h1 sans-serif" data-heading-depth="1" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">1</span>. </span>Introduction</h2> +<p class="p noindent">The <code class="code code1 language-latex lang-latex latex colorized">options</code> package provides easy to use key-value options for +<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAAAnCAYAAADn590lAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFP0lEQVR42u1by3HbOhQ916MCOEoFQTqQk0kDTAf0vApC7d5SHFXgkTqQUkFCdRB1EEsdWK+CWFq9LbLwhQMjAAiQIC07vjOYiW18eH/nfoAQgAwaSSlPsBARBc3juQLAREq5wV9KSl4+efpkaKMagIwctZQSrgHgO88TDfN2Lc5O+q2xA8As5nzHHovA9YVaMwLwGcA1gDEAwZvo3nPiv+8B3PHvDg3elPOPUwCVx0jMc7a890/++Y6/6x0LSKfKmJPxvDGAwnFGCtqwLASfV1rOOAFYA/jh2GPFPM4ta7ds6Af+9wOEmdouDa2WkRanW8uxYe6R560C9tW/6TZgfh06t6OHCY2PKJkBmGhrvgPInHMtiwuX+wUefmvsUTQIfxe4ry6MXcS3HPtUlENmod+XKSU1zb1IHEALAFtOIlSgnDckJ9c9xvRVD9D3BzG/W+1XEyKaBSxdsJyuQg5J5lHsvhMLBAoHZEifuyfwqKgzOnpVZkkGRADsBcn3IqE3Cf6wvWbN0JIKWyJxik1RIy1dJT3jAbzqZOGzbsi2t6ElTErom7IX6UJScFBa5gtf9piQTkPAH/O85oxQh8DSYtQL5v8qdO+UiioAfLPECADIOH7pNB5IUQcWylBkCn+lNwuIaMKlxjQGTZIoiohyAHvzYCOpMGHhjmNaH12BmogkEUmOBQ8/Jxi7ALitPBCoIG8dw9MokWwqHfYMWrMF5UQkVNzoub10DeCrViybRemevf3Os4dam7OydchugsAlEf2jrcsZUQSPyza42inrYwHcBmReEsCiQ1YVnfV52j5Fi6J252sLNRSzUvv+sg3/KaBvDkAQ0dE2mEF4kgoMFKc6ZY9Syku1D2e4TWv2AJZGlnuIhbyUMapkiHjrGZUnqXhONA2FP1ZWZRiJ4Hg+rKL40Bu2uJNnLBtqqmdBUsotJ0cxWWTlyIQH9agq4uCNFljFM/aqLSNITGiA4VWLwRTFtcH7iOxt9RK8iq8uRKCMZpxUXGplCgDMuJ4axKPmAG5awMZTJhWhRjjzWH1QAc2osQBQcWLxOaK91F1RRKRcV9VGhXlNz/OkUZHrzGVEtDhjCHzjaTttEdbxr7kJsNTqxo0BgTNEWHpwHYXfV+zm2Nk6yY5LP9sQPddRsbVhjYDLTM/60sYXy+UYy3t0HSWl/CSlJMswK+33OiY71ujjcEawl+HxVX404nA8Xpp8cYutagOBFz3xO1RnvJNCjKE63f913HrFhW3lMPY1/rxkbIzZo57kcHXmiqp7Un7JvcGmXt4U988EHpRLRN983fSLnqAjP3NFVQA+GWOK+wZyF74V5O2bWlKxENiHR6kC7+cZK+rA5YJN4Cs87k/GeKkT8izKWhLRVEv1cyIqXHVpH49bZlq98RzbRHs8vqUNLWxzuK96fCFCpy+2UselKNFSSQvDfVMrKuv6jRF0E8BvrvGtFPSuo1FkAL5YoY9bGYrxD5auwZyIbGvV69QPjnT21FLhQlOKer1rWl5GRDXuLwfVa1ng/rFMCgNxvrNg1PgI4F8i+t+YN2OPqF3QasRx/XJRUcG3yF/Z2E9qrzZvz1u9uW5xQRg7bhMVvOo/OTS92HWNY2QB3jSykZTy6szCxFtLkdiUbaWOUwfP34jhLpNSTlvuvwFAMWtGZ6YkxL7z6/NdoIcm6OlhztCdiZdOeWxm+Kqo4VtPxVOUH6+KiqdFUxx7VdTTe5N6ijx4MT/6S2QsOipIFaIK9vavikpj+SFF/BjtXsriKTyKuAB7aYqq0eHyL4CmbR9StqVfbocpgMXmWmMAAAAASUVORK5CYII=" alt="$\mbox{\LaTeX}$" class="math-inline math" style="vertical-align:-0.243em;height:1.015em"> package writers. It has a similar interface as <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code> with +path options but comes with more built-in data types and more convenient +support for families and searching. +</p> +<p class="p indent">The main features of <code class="code code1 language-latex lang-latex latex colorized">options</code> are: +</p> +<ul class="ul list-star loose"> +<li class="li ul-li list-star-li loose-li"> +<p><em class="em-low1">Declare your options only once</em>: in most packages you usually need to +declare both a new command, and the option that sets it. In the +<code class="code code1 language-latex lang-latex latex colorized">options</code> package you declare the option just once. For example, +<code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span>{/my/len/.new length}</code> and then use it anywhere else as +<code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option</span>{/my/len}</code>. +</p></li> +<li class="li ul-li list-star-li loose-li"> +<p><em class="em-low1">Use paths for keys</em>: just like <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code>, the <code class="code code1 language-latex lang-latex latex colorized">options</code> package uses +paths (instead of families) to declare options and prevent name clashes +between different packages. Paths are convenient for complex options, +like <code class="code code1 language-latex lang-latex latex colorized">border/left/width</code>, and are also convenient to specify searches. +</p></li> +<li class="li ul-li list-star-li loose-li"> +<p><em class="em-low1">Many built-in data types</em>: the <code class="code code1 language-latex lang-latex latex colorized">options</code> library comes with many +useful data types like <code class="code code1 language-latex lang-latex latex colorized">choice</code>, <code class="code code1 language-latex lang-latex latex colorized">list</code>, <code class="code code1 language-latex lang-latex latex colorized">toggle</code>, <code class="code code1 language-latex lang-latex latex colorized">num</code>, <code class="code code1 language-latex lang-latex latex colorized">dim</code>, +<code class="code code1 language-latex lang-latex latex colorized">length</code>, <code class="code code1 language-latex lang-latex latex colorized">glue</code>, commands, and plain values, and it is easy to add +your own (Section <a href="#sec-datatypes" title="3.1. Basic data types" class="localref" style="target-element:h2"><span class="heading-label">3.1</span></a>. Also you can hook into existing +definitions like an <code class="code code1 language-latex lang-latex latex colorized">if</code> or <code class="code code1 language-latex lang-latex latex colorized">counter</code> (Section <a href="#sec-hooks" title="3.3. Using existing definitions" class="localref" style="target-element:h2"><span class="heading-label">3.3</span></a>). +</p></li> +<li class="li ul-li list-star-li loose-li"> +<p><em class="em-low1">Value options</em>: You can define value-only options that start with a +special character, like <code class="code code1 language-latex lang-latex latex colorized">"Georgia"</code> for a font option, or +<code class="code code1 language-latex lang-latex latex colorized">!8080FF</code> for a color option (Section <a href="#sec-special" title="6.3. Single option values" class="localref" style="target-element:h2"><span class="heading-label">6.3</span></a>). +</p></li> +<li class="li ul-li list-star-li loose-li"> +<p><em class="em-low1">Convenient searches</em>: you can specify paths that should be searched +from other paths and redirect even from absolute paths. For complex +packages this is very useful to inherit common options +(Section <a href="#sec-searches" title="2.2. Paths and searches" class="localref" style="target-element:h2"><span class="heading-label">2.2</span></a>). +</p></li> +<li class="li ul-li list-star-li loose-li"> +<p><em class="em-low1">Easy filtering</em>: it is easy to collect unknown options and process +them later. Combined with the search mechanism this makes it easy to +do custom processing (Section <a href="#sec-searches" title="2.2. Paths and searches" class="localref" style="target-element:h2"><span class="heading-label">2.2</span></a>). +</p></li> +<li class="li ul-li list-star-li loose-li"> +<p><em class="em-low1">It is fast</em>: for simple user options, the <code class="code code1 language-latex lang-latex latex colorized">options</code> package is a bit +faster than <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code> and if searches or filters are involved it is +usually about twice as fast as <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code> (and about six times faster +as <code class="code code1 language-latex lang-latex latex colorized">xkeyval</code>) (Section <a href="#sec-perf" title="8. Performance" class="localref" style="target-element:h1"><span class="heading-label">8</span></a>). +</p></li> +<li class="li ul-li list-star-li loose-li"> +<p><em class="em-low1">Handles class and package options</em>: use the same option declarations +to handle the options passed to a class or package +(Section <a href="#sec-process-options" title="5.1. Processing options" class="localref" style="target-element:h2"><span class="heading-label">5.1</span></a>). +</p></li></ul> +<h2 id="sec-overview" class="h1 sans-serif" data-heading-depth="1" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">2</span>. </span>Overview</h2> +<p class="p noindent">Defining options is very easy. As an example, we will make an <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\mybox</span></code> command +that takes named options. Our goal is that the user can invoke <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\mybox</span></code> like: +</p> +<pre class="para-block pre-indented language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\mybox</span>{padding=<span class="constant" style="color:navy">1ex</span>, border/width=<span class="constant" style="color:navy">0.4pt</span>, font/style=italic}{text}</code></pre><h3 id="sec-an-example" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">2.1</span>. </span>An example</h3> +<p class="p noindent">We can define the options for our <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\mybox</span></code> command as: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\options</span>{ + /mybox/.new family, + /mybox/padding/.new length = <span style="color:navy">\fboxsep</span>, + /mybox/border/width/.new length = <span style="color:navy">\fboxrule</span> * 2, + /mybox/border/color/.new color, + /mybox/font/style/.new choice = {normal,italic,small-caps}, +}</code></pre> +<p class="p noindent">The options are all specified as a <em class="em-low1">path</em> where names that start with a +dot, like <code class="code code1 language-latex lang-latex latex colorized">.new length</code> are called <em class="em-low1">handlers</em>. In this case, the handlers +create the options for our box command. To parse the options passed by +the user, we use the same <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span></code> command: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\newcommand</span><span style="color:navy">\mybox</span>[2]{<span style="color:darkgreen">%</span> + {<span style="color:navy">\options</span>{/mybox,<span class="constant" style="color:navy">#1</span>}<span style="color:darkgreen">%</span> + <span style="color:navy">\myboxdisplay</span>{<span class="constant" style="color:navy">#2</span>}<span style="color:darkgreen">%</span> + }<span style="color:darkgreen">%</span> +}</code></pre> +<p class="p noindent">Here we start the option list with <code class="code code1 language-latex lang-latex latex colorized">/mybox</code> which makes that the default +path (because it was declared with <code class="code code1 language-latex lang-latex latex colorized">.new family</code>) so the user can give +relative option names instead of prefixing all options with <code class="code code1 language-latex lang-latex latex colorized">/mybox/</code>. +Options are always set local to the current group. +</p> +<p class="p indent">Finally, we can use <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option</span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}</code> to get the value of an option. +This command expands directly to the command name (i.e. <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optk@</span><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code>) +and is very efficient. So, our implementation for displaying our box may +look like: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\newcommand</span><span style="color:navy">\myboxdisplay</span>[1]{<span style="color:darkgreen">%</span> + <span style="color:navy">\setlength</span><span style="color:navy">\fboxsep</span>{<span style="color:navy">\option</span>{/mybox/padding}}<span style="color:darkgreen">%</span> + <span style="color:navy">\setlength</span><span style="color:navy">\fboxrule</span>{<span style="color:navy">\option</span>{/mybox/border/width}}<span style="color:darkgreen">%</span> + <span style="color:navy">\colorlet</span>{currentcolor}{.}<span style="color:darkgreen">%</span> + <span style="color:navy">\color</span>{<span style="color:navy">\option</span>{/mybox/border/color}}<span style="color:darkgreen">%</span> + <span style="color:navy">\fbox</span>{<span style="color:darkgreen">%</span> + <span style="color:navy">\color</span>{currentcolor}<span style="color:darkgreen">%</span> + <span style="color:navy">\ifcase</span><span style="color:navy">\option</span>{/mybox/font/style/<span style="color:navy">@ord</span>}<span style="color:navy">\relax</span> + <span style="color:navy">\or</span><span style="color:navy">\itshape</span> + <span style="color:navy">\or</span><span style="color:navy">\scshape</span> + <span style="color:navy">\fi</span> + <span class="constant" style="color:navy">#1</span><span style="color:darkgreen">%</span> + }<span style="color:darkgreen">%</span> +}</code></pre> +<p class="p noindent">Here, instead of using the <code class="code code1 language-latex lang-latex latex colorized">font/style</code> directly, we use the automatically +generated <code class="code code1 language-latex lang-latex latex colorized">font/style/<span style="color:navy">@ord</span></code> that gives the ordinal of the choice on which we +can match more efficiently. Here is our new command in action: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code>Here is a <span style="color:navy">\mybox</span>{padding=<span class="constant" style="color:navy">1ex</span>, border/color=blue!70, font/style=italic}{boxed} text.</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="Here is a \mybox{padding=1ex, border/color=blue!70, font/style=italic}{boxed} text." class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.557em;height:1.873em"></div></div> +<p class="p noindent">There are many ways to refine our implementation, for example, we can +use styles to make it easier to set multiple options at once: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\options</span>{ /mybox/border/normal/.new style* = + {/mybox/border/width=<span class="constant" style="color:navy">0.4pt</span>, /mybox/border/color=black }}</code></pre> +<p class="p noindent">The <code class="code code1 language-latex lang-latex latex colorized">*</code> after the <code class="code code1 language-latex lang-latex latex colorized">style</code> signifies that this option does not expect +an argument, and we can use it as: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code>A <span style="color:navy">\mybox</span>{border/normal}{normal} border.</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="A \mybox{border/normal}{normal} border." class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.373em;height:1.509em"></div></div> +<p class="p noindent">Another improvement is in our choice definition for the font. Instead of using +a case over the choice ordinal, we can set the required font command directly +as the value of the choice options, we show this in Section <a href="#sec-datatypes" title="3.1. Basic data types" class="localref" style="target-element:h2"><span class="heading-label">3.1</span></a>. +</p><h3 id="sec-searches" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">2.2</span>. </span>Paths and searches</h3> +<p class="p noindent">The option paths are mainly used to prevent name clashes between different +packages but they can also be used for searches. In particular, we can +specify for any path that if a sub-path cannot be found, we should look +under another path. Suppose we define a new <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\fancymybox</span></code> command that +takes some extra options. In that case, we would like to re-use the +<code class="code code1 language-latex lang-latex latex colorized">/mybox</code> options and look for any undefined options under <code class="code code1 language-latex lang-latex latex colorized">/mybox</code> instead: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\options</span>{ + /fancymybox/.new family = {/mybox}, <span style="color:darkgreen">% search also /mybox</span> + /fancymybox/border/radius/.new length, + /fancymybox/rounded/.new style = [<span class="constant" style="color:navy">5pt</span>]{/fancymybox/border/radius = <span class="constant" style="color:navy">#1</span>}, +}</code></pre> +<p class="p noindent">Note how the <code class="code code1 language-latex lang-latex latex colorized">rounded</code> style takes an argument which is defaulted to <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">5pt</span></code>. +In the <code class="code code1 language-latex lang-latex latex colorized">.new family</code> declaration, we can provide a list of search paths: here we just +gave <code class="code code1 language-latex lang-latex latex colorized">/mybox</code> such that any options not found under <code class="code code1 language-latex lang-latex latex colorized">/fancymybox</code> will be looked up +under <code class="code code1 language-latex lang-latex latex colorized">/mybox</code>: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\options</span>{/fancymybox, rounded=<span class="constant" style="color:navy">10pt</span>, border/normal} </code></pre> +<p class="p noindent">In the previous sample, <code class="code code1 language-latex lang-latex latex colorized">/mybox/border/normal</code> is invoked. In general, we +can add comma separated search paths either in a <code class="code code1 language-latex lang-latex latex colorized">.new family</code> declaration +or using the <code class="code code1 language-latex lang-latex latex colorized">.search also</code> handler. Search paths can be added to any path +and will apply recursively. For example, if we set: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\options</span>{ + /a/foo/x/.new cmd* = x, + /b/bar/y/.new cmd* = y, + /c/a/.search also = {/a/foo}, + /c/b/.search also = {/b}, + /c/.new family = {/a,/b}, +}</code></pre> +<p class="p noindent">Then all of the following options are resolved: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{ /c/foo/x, /c/a/x, /c/b/bar/y, /c/bar/y}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFYAAAAbCAQAAABMmbDOAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJb0ZGcwAAAk8AAAIcAFZIlm0AAAAJcEhZcwAAASwAAAEsAHOI6VIAAAAHdElNRQffDAMWIC0wCeGgAAAACXZwQWcAAAn2AAAM5ABwic1SAAACHklEQVRYw72XwXmjMBBGH/ulAVpgS6CAvZAS1AItJCUoJZAScAn2PRdcAi5BLmH2gAIIIZAcE3SRxk8w0vwzkjNKNO7zLleATFPOrFdOsaS8Z8G3Lml5jWdfuHMFSipr+eBuezdqcuvohVsCiWUVBQAXriMLt/Edp0RWbKNBEM7C1NAIHdXclkTmGARxrYJAj6BS2bmxQ5D5BznTka9MjyeHhdWe/YxOZ/21GQo7rtcdSCJLPwoCOeLz+6z7Q4UgdHaqoVxzIJEcolAsRNM8wi7xNwRBk2NcTcmDJDWCuM7Rry9uj/UntAhC72vqUdJKZgw7aohIOrumx94PRkC5USQaYZY4tH4SxbHhCYGUSScphgiMIxPmt1kfrzDWiWbH1XjyjGBLHXpbNlusvzKD8sOxugeRpICaljQVvHR2qcKON9sfykigJMWTlhnUnVMv62gK6w4aWmfnhD5Q7KNJR92a83ZB3Gbn3Xoh5yEgKzsRT84WJAjmO3U2nQ2yU1i1/zl7WrsijyZTiX0WChR6uPFgnKpWW6vQUlPxL5pcSSF7QO9W7y32WyFjC8hZEL6iydX9o98rcXts5ORnNPrlfTeV/cMvPVkFcvkZ+2vOUvP5Y/awoCuaqU7u3Agi2aNcLWzHnms04aIVz74cFPR8PshKFH+fwB6Y+2bYIXK6nX8dkWwmB21tVtJy4Q4oPuTzGexhzgJkipIbJ7k/h/0P6CtlVfb9I0YAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTItMDNUMjI6MzI6NDUtMDg6MDDQUQw/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEyLTAzVDIyOjMyOjQ1LTA4OjAwoQy0gwAAABR0RVh0cGRmOlZlcnNpb24AUERGLTEuNSAFXAs5AAAAAElFTkSuQmCC" alt="\options{ /c/foo/x, /c/a/x, /c/b/bar/y, /c/bar/y}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.219em;height:0.702em"></div></div> +<p class="p noindent">Note that the <code class="code code1 language-latex lang-latex latex colorized">options</code> package will even search if an absolute path +is given, and always searches with the relative sub-path. +</p> +<p class="p indent">This is important for modularity since it allows us for example to combine +options of different sub packages. For example, if I want to handle options +under <code class="code code1 language-latex lang-latex latex colorized">/package A</code> and <code class="code code1 language-latex lang-latex latex colorized">/package B</code> together, I can just define a new +family: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\options</span>{ /packageAB/.new family = {/package A,/package B}}</code></pre> +<p class="p noindent para-continued">and start processing options using <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span>{/packageAB,..}</code>. Even +when the user now uses absolute paths like <code class="code code1 language-latex lang-latex latex colorized">/packageAB/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span></code> the +option search will route it automatically to the sub packages. +</p> +<p class="p indent">Also note that for efficiency, the basic <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option</span></code> command does <em class="em-low1">not</em> +search and always expands directly to the command name. Therefore, in +implementation code we still need to use <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option</span>{/a/foo/x}</code> and cannot +use <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option</span>{/c/foo/x}</code> for example. +</p><h3 id="sec-handling-unknown-options" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">2.3</span>. </span>Handling unknown options</h3> +<p class="p noindent">It is possible to handle only options under some path and ignore +any unknown options. For example, give our previous options, we can +only process the options under <code class="code code1 language-latex lang-latex latex colorized">/c/a</code> as: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{/options/collectunknown, /c/a/.cd, x, bar/y }<span style="color:navy">\\</span> +<span style="color:navy">\options</span>{/options/remaining/.show}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="\options{/options/collectunknown, /c/a/.cd, x, bar/y }\\ +\options{/options/remaining/.show}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.273em;height:2.055em"></div></div> +<p class="p noindent">Here we used the <code class="code code1 language-latex lang-latex latex colorized">/options/collectunknown</code> style to signify that we +want to collect unknown options into the <code class="code code1 language-latex lang-latex latex colorized">/options/remaining</code> list. +We used the <code class="code code1 language-latex lang-latex latex colorized">.cd</code> handler to change the default path to <code class="code code1 language-latex lang-latex latex colorized">/c/a</code> such +that only <code class="code code1 language-latex lang-latex latex colorized">x</code> is found (as <code class="code code1 language-latex lang-latex latex colorized">/a/foo/x</code>) but the <code class="code code1 language-latex lang-latex latex colorized">bar/y</code> option is put +in the remaining list. +</p> +<p class="p indent">Any remaining options can be processed eventually using the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionswithremaining</span></code> +command: +</p> +<div class="mathdefs input-mathdefs"></div> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\optionswithremaining</span>{/c/b/.cd}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAbCAQAAAA5FAxtAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJb0ZGcwAAAk8AAAIcAFZIlm0AAAAJcEhZcwAAASwAAAEsAHOI6VIAAAAHdElNRQffDAMWIC0wCeGgAAAACXZwQWcAAAn2AAAM5ABwic1SAAABKElEQVQ4y42T23WEMAxELznbgFsgJbgFWnALtJCUQEqAEpYS2BKgBCgBSph88PADb06sD2RJR6MZmQJLQ3y+Ne1O0WB9+MHGBDhKAF5MbFd2wVIB0LMghMCwIiRSY0Y4IXyoRYj6VjrQHN4VsggxJIUGYZJSwYgQZVTa0F5+EK4R8qljUpspFayI9QQUOEaf/YgU7QCDu+6OLshGXUuEmK9bgJAMIBgQojooNVEuKXWeGmuiRnY7wlCnGse09m0DfCWUUloBtfUk90dXLYdk/Q0v85aq+4KztA5q7T16pxWS+8cAcw4r17W+yXR2xdHuv0Ru8wHaoaPOd0kbb97bAxNiFBbH5xuqgpl174Rh9KOkVojC8uTFBjh+1L3pSaH947As9Np4e34BdHliFIRDoj8AAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTItMDNUMjI6MzI6NDUtMDg6MDDQUQw/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEyLTAzVDIyOjMyOjQ1LTA4OjAwoQy0gwAAABR0RVh0cGRmOlZlcnNpb24AUERGLTEuNSAFXAs5AAAAAElFTkSuQmCC" alt="\optionswithremaining{/c/b/.cd}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.219em;height:0.702em"></div></div> +<p class="p noindent">The command takes a list of options that are processed before the options +in the remaining list. It is allowed to pass in <code class="code code1 language-latex lang-latex latex colorized">/options/collectunknown</code> +right away again to collect any new remaining options. +</p> +<p class="p indent">The <code class="code code1 language-latex lang-latex latex colorized">/options/remaining</code> is list is only cleared when using the <code class="code code1 language-latex lang-latex latex colorized">/options/collectunknown</code> +style. This can be useful to collect unknown options using multiple passes +of <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionsalso</span></code>. +</p> +<p class="p indent">Besides using the remaining list, you can also define general <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">@unknown</span></code> +handlers on any path. When an option not found, the library looks +bottom-up for <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">@unknown</span></code> handlers and invokes it with the path and its +argument if found. The general handler <code class="code code1 language-latex lang-latex latex colorized">/<span style="color:navy">@unknown</span></code> will raise a package +error. +</p> +<p class="p indent">You can customize this behavior by installing an <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">@unknown</span></code> handler +yourself: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{ + /mybox/<span style="color:navy">@unknown</span>/.new cmd 2 = + {I don't know option ``<span class="constant" style="color:navy">#1</span>'' (=<span class="constant" style="color:navy">#2</span>).}, + /mybox/silly = hi +}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwMAAAAqCAQAAABFYE/LAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJb0ZGcwAAAt0AAAIPAGcJYLcAAAAJcEhZcwAAASwAAAEsAHOI6VIAAAAHdElNRQffDAMWIC0wCeGgAAAACXZwQWcAAAn2AAAM5ABwic1SAAAQ0UlEQVR42u2d/ZWqsBbFf+et10BeCdwSuCUwJTAlMCVgCVgClqAlaAlSgpSgJeT9ATJ8BEgQkZnrZq17R5YmJ/sc8p2NaN544w0XiM+Zvzp7tR1rxL/KjSQo/fVqK6Za9J9XG/vGGz8OEXB7tRErxT/JjaQEbF5tRRN6A3IWZWU/PuYv3qa16KLwCQDwOOndEgWWkIicjZ4l/MTHxwPAZ/Pv9Wv+HYiPX49Q8Qm1xcMsV3L991UWrzs25+BGfDz8dinNd53TTvDJvr0sMQEZ20fqDknx+Zin9pmvpABy5qY/bL55RBuvo2bKRVD7kExLwzFHv/zjPFN6dUaCJUrw+y8UCXvCV9vRsMnngt//ufd3IZr4RTavPDbduTFFhrmUc5SdqPwjMX+elGaCtombZ3q57/lCcbUp2/0/v8r6+HiR8EgfJdfRDcU1mzMIudo74X1Z+2g1fKLalT4Xy0duj0a90PIVx6Y7N32Rgc+5e998d0JupZXtzxNSDHhKPedW0v7nixA93v0q1wZ0xqEcHeweH2rqvEptCXznFRqGRZF4E0pw4LRgCX4JBri+eyZ4tY0VYg71SJeEk7bwuShCDvNNALhjvbE5iZueyNCZqZTmuw7Iq7+KSZes9dm9xCm5zUSiKxxL2vt86QMn0rEVgv92CPpxyzs6kw/CXrtTPmrOt8eU3/zr6Of6RFT+vxZE/Gl8DrGb0Q5XUIq1xuYUbhaNDL0TCMju66H6IF/lZ3+SBTEea9gfNMTiliPJsJX/5RdAnziBJK+2441ebLjhcbDpby8BafVaJSCz7MVG3BYd6/4kTOFm4cjQO3YgaetzwoQ5EFFE5MtsgxnBAIv6JBmRbPVA5+FXNAMVOgWV9UxC/HoMca1vK9tO57diJbCrBsTDZ/fKKaH1Yho3L4oMrzV7MHUsoFhDIzDG4o6UeGg88JvODQQGV76bgeXwk7j2WtW+suwNRrx+Smit+DHciMJvrYD6k0YjIayjGRjBAQiH1gd+TTMgARiGPeGEpN6Yhp/EtcKXVPZyXxj08CSV/ejoMSTX7ykhM34ON2Fz6kqiKdN8EuKR6bWu09Sgb5xQQ8/n75kUirvtsiRM2CX0xhT8MK5zipWkQP7oG5CRlp//9j/Y4uOxfbXp68TP4UYUMc0jVe3Pdgj4IaMf4ERA0D9ymbEZKHtSFkttogjKDVq9m/Qk+E5LVPHt/oGbxNBeqpGYeL7SWZTd2lpbDp5or40HinLcS1WcNs/NlaQN1+Kj+qLDjg13lntxnxK47xDJq8/ewD6cEPr6jTa2DXM4FfapPjXmhrkp6oYbB52LImw+q0OR8QQkHOpcSdr8bI0ApiwsT4NFHTjEYsbgpO0szYAERIRkZHh4chrqFYhHTMSBnByPVBS7+r5bScutTwAfnMQjLhfwAlHsTJIREhHXt/+JR0RY9U4TqX5hd7C6h+TmTqSNzqZZO8ZBJyfYQOteeRxeksZ+Z6uD52MeANnXBpAfnCQhBHI8PMnZ6W0jtRGuJSKtpzbBnkksD+JAjAfcigdZ7yTCB26DmzEjsjbDtrZJSFKWMJCczX36xOTtSj6h4d1u7IoiJqyluu3ftTLEcr8NrfjKBnbIG7iBsoNwICMHfFLJ8fGLfulYZNjAlT+J8etiFxLhTxkLiIfHQs2AKJL+eLdhUZ8ElAR9jcjDzYAoUkIy/txbVIk59g0/JCTlVlMg3EhMIkFNkSNji7o/WuKzZ1Po5IniSIQvXfUOxd/OvQOU1VM2y1mIG9/t6YG8THOCtaMcFFVTVO5t3nGjmLa437uxqyqrvFJwyjjZlNPCA3Air0ql5EzOR+FdCUhJJOSr8cgPc52zrZVnij1TYmIQ+iYfxKialswHMR4D2+okRBn6u1a2SYqqOIxI2ctXWWUX3r43pKcGg9/ePRiaJ4+E0z3yRZGQSsSnqQQjLBc2+FV8bysb8spvGSdcuUESIj6qXE9sG1XzYGRYwpU/1ar0vYlqQEXffIGVgdF4t2MxxxvYD9U4FO18TBvFmY7+UKXykxgONl/xWndjNNfmYe7ycHTIuaH6EqJx0CwpBTImHTwvLaj9Fg+NJm3b72atLQel2kmD2fJem9UUTWpZKmsPVOxdiVoev6C5toU7xrju8ulszywxMf0iRXd9b2MbcdM/nDveVoVAhCHlCx0xgEo6IDJYeO1KqljHXGqIuQTNeewZMnODh0FogWOznObI6I0Y810n/maJhoQB3TWCCVdfvF9s4r2PxTrr/aIXdcP1cEK9iV+7ehylUY1s8bh2Q7dK5Wj4/bET6J0wHbVuvmYg5moOKHtrnTi4orm2vnWlU+UTcrEsk0PuVak6DUwZKedWwz2hGZhkz4MxMfVCodmPlM5s27ktemjkoqiCO1xwNFSkhqertPFCR2LRKeY6OjYc256254YEU4UVzd8MuPE3Szzs+6OO/aQkzVFysYv30WYgZeApeWhSSCICMB4ZORmWDBMU5mWkAwGBRJ2ZTc841/mSHSmSENaGtybYWOvCwYEIJWFjE96JkLB1ECSw3u7m7gHDt/VJTgT4xA8f/Jliz6tiwkYowWyb33NwpzlE3xEBYXM6VRQBnz25dazRN9mR4EvSmMN3YfmDC4r9fb+URCiLSZMhbrqeec5Eijt/j0ENlGQ7qYw9dctM8T7ow8fWBoqq3mppRzxC+vYRncrUdsb7j1PwMCTFN6w/OFrryEGhE1Kr5KXY+6ta1aOlGs4kD5hxIACix5qBifa8KiZCC6GEk9P9xlyuziTDJxCvMd8cO57LLXKqecaNZX2TT44o9vwtl19tZs6HuInk1lLzz55xbngm/tzQk7LOZlw6njPee/cKPXB8TMoXYFhuPSv2nhiJKx3nSVvlbxWH9kXJmcDicbB5XBw40MWyVlQ7/ReWS101d0pkvQFxigfMKDyuHpTqmGbPS2JCPAIL7cy+asHOP0Vl3BxFh26nVMvRat0zjizrExvAl0QUx9ZWAFdu7iW6SCrx3SZ90885XzADfw54ZFnbBYvE+yOniN1Ojd73swxhktjrcyEeR3y8WfqbrhwUPayw9vtT52C4/ZTQbB6oqrXHmoGfFBEL6IrqHTcavpVwwjsAi2rj2zPOLOstByDmzM7qVHAvNzovp8MUEQlH0XKUyCLFV/Jni7VE5ix4XExizodjfedQfc5lCUc1u5/AQfEQlo900esqezdl01AovD8p9yEsdWxmLRERLSKUsIPGof8pfdkpnmmz/EUOeJa5D3Cjd3w25skDUtv3407AHPzZ4geISNjj12gKPQkxG71hC/jLnUm+QxeHbsLyZS4hB33TeXmCgOreKwJyFdN1S0F8vEXEpRvTGmWz/wLo+0z/frzCHuNGH/QfPtnWTrX4HJ9k+JL8/apm4PFTxG79teGwenLlIh6Bozr4h85Ab8QnIJZslh6hCwc7EiBkW/0LB3z8cinMfSwwjwdGp4OsuX5pRFhiQChhTuhcTgR45WnPaNLypnmywollCYjYEuOPva7Ejht9KL4hPiERCl/iZ6wPzMLfLJiyaraApExv0/VIM1AMP+2nEYLRbz97qsGbuOQGn1xQpHJ6KLDcOTjcmwHx8MpGaFe757IdbjYPVH3EocAd53oNEWGHHqGEJ2BHAIQU1Zjd+9CaKHzz7RlnlsVjz5c+CMREko005gPcSEJjOVhnZLLjiEfwJBm6x/lzQc/6QEOMxRqS6Wfb+4xmQB/khoLWFq0+HIjpCcey7czX8m4qQ1lv8sUexX6SFuFkDnQuWdH3J7pXqvomB0IitoRO/Z35PFDuPnnQXz8kIvqEEp4BfZAcj0g2hFNEjMs9P3XPOLIsij1bfQC9kQCfVAaawBFu/O5oTueyYf+sd1M8yp8DsoEyzHpuYCb4PGk0ADtiGBIw/YbOygGbqdEognfVWuX6IDsigkeGs5M42JECEWGt338ixBO/miZ6Xu5mhKVljzH6UyIiWNSSotqO7/JrE2xteMaZ5YS8ivBPzuVhsr7Oxhg3oajOb+uKrmvjzx6FVJ4Rs54bmAuFGlkLogjJdPbYEnEhQWVaOjUNiopDI51vSyHMNaReOBVtZ/gPhd+GG5BY7q3vS8OVg+Ihi2oTVPetcUk1TfS83A2rAKVscNZqgqZwvXxEOEMU0aLL8EXlFVn41tQbjeh6xoFliepn1MsNnx77B7jpbhBVPHPzrT1/jyED1EK7B+eAT4d1UVxIOUvyn8bXwGnJV9/44IbXfhm8RGUz0NyPnPEFRJ3lkwSP2+hS1BQ0Nlxi/cZZMw/6VoaYxf6JXsacOSh3bbSH3gdcTgxMzh2Ims2eKFLgxlerl2fHdevk7OIR4Y4FTgw0OMnLbY9jvs3bngFJC96anrFlWZQkpM3zxrrYoBy0n3AHbuLO0xJhGkH0PVOew10X/h6ELpRM13Z6oIfFMlLaT+RdlTQq5GUD4kKhD82FmICgq1PYI1nkc23KXBFzIS4/JM2UCLnW5aZQpOi6LiM+ARGXQmyJqPg9ioCgUlZMTIp8vSJPpeYikZ0EG36Nj/13TgSl8JbmSlzcnWLtOAddKS5a+o2lzqClj1q/tMy9tD/m8i1Yhc+5z9Y+rkuOzjWOlJs988aEI19H9FCqVrald9saXFzv326lGHT9bfBMiN/wzGAUDbOMR0hSRnxDUZaoqhf2RAStKBzj5ojmwrn+K0Kq2qIvMlr3wyJf811DrqP8zRQZe/STZOuc4n34+ar8aJKjC8s/zndlyCIAjpXTXXQ8FQlXLiQkJFxIUZVeaSclFClXruxJyjBpaBDW7Kn9vpHe/bJQDkWRoLmSsjdJ8PYGryEn091p1o5x0LHo2lYf1HCx1RU1cGKV+12zEI8jZxIS9kO29nHdx6e9PfPGhBNXHiMi3m62mb9t8O1wnknxK/zKMynX4SgaYrmqWsqr9qt2MvXu3jg3e84oQi7sy9rhXFfM7H3SjqZ8zXeN+V5shdcfig1j1TpLyo/GlFl/1RAdJGgu+KJnGo1IgI8i46RvpaBVMQQxilqV386X2IgnHj4+uYUmzKKw50BC8s5brwz35s1dEmLgQ5/KozjeuK3TuV4yIhysikn4XPpF63Lhy3aPlPj4Np4pvz0jy+PcSFC9lrNYT1rIuy78PZCL4gr8b121So+tV9T3i8EMeH6r+b5+5jWmYP4vXFzab3xYIM9g6jjv93OzLv5IMb7HYW0XIQPvytDot5jEG2/0QXxrXZ05Eb0gT2e8iBsbLMffDleBzdcgZGR797sZeOONPiwiIiGhpFJVJuLZncN5ORYS2BjH6/jTGTuCB+XWnw7xCDkNT5LNtjbwxm9DfW3g34RcQP95ch4eF4D76+Il5baG8xKjdi/AjZUdL+VPPM5k+hFlgefbmBLd2enD49Jyb/xWrEXk+UWQEO8Z78lqobHTW3xCVlC5jmEhbmzwUv50LluSUspulShkAscW5t/NwBsdiI/CK4+CxaK4Wb/h7DdhEREJnUmOYqez8mje10/YebKwwMYAXs2f3kpAKmMvqH0dEpvT+O9JoTc6kGNHqGD7EyYqZuVAcVlmuC8++1KNP2TrKIT+EizHjZU1L+ZPFEdy/ZwX3z9qW0rIn/Em6j0aeKODtTzgL8ViuqI644+E+OSst0/ZxIKaq+N4NX/6Jp+cJVlfR0kiQot3qPMeDbzxhhGSEv2Mo0HL481NG6I4slvXSE4iYj7tjuu9m4E33jBAPNSazjOvCW9uuhCFty5OxONm21T/H6wLsEm+IleDAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE1LTEyLTAzVDIyOjMyOjQ1LTA4OjAw0FEMPwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0xMi0wM1QyMjozMjo0NS0wODowMKEMtIMAAAAUdEVYdHBkZjpWZXJzaW9uAFBERi0xLjUgBVwLOQAAAABJRU5ErkJggg==" alt="\options{ + /mybox/@unknown/.new cmd 2 = + {I don't know option ``#1'' (=#2).}, + /mybox/silly = hi +}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.273em;height:1.093em"></div></div> +<p class="p noindent">As an aside, note that we needed to put braces around <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">@unknown</span></code> handler +since it uses the <code class="code code1 language-latex lang-latex latex colorized">=</code> character. +</p><h2 id="sec-defining-options" class="h1 sans-serif" data-heading-depth="1" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">3</span>. </span>Defining options</h2><h3 id="sec-datatypes" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">3.1</span>. </span>Basic data types</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new value</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">initial value</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Defines a new <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> that with an <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">initial value</em>〉</span></span></code>. A value option +just contains the value that was provided by the user. The <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span></code> +value is optional. If it is given, it is used when the user does not provide +an argument when using this option. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new toggle</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">bool</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued">Define a new <em class="em-low1">toggle</em>. These are boolean values and have the advantage +over the standard <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\newif</span></code> (see Section <a href="#sec-hooks" title="3.3. Using existing definitions" class="localref" style="target-element:h2"><span class="heading-label">3.3</span></a>) that they only +require one macro instead of three. The initial value (if not given) is +<code class="code code1 language-latex lang-latex latex colorized">false</code> and the default value is always <code class="code code1 language-latex lang-latex latex colorized">true</code>. A toggle can be tested +using <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\iftoggle</span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">toggle</em>〉</span></span>}</code>. +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{/test/condition/.new toggle} +<span style="color:navy">\options</span>{/test/condition}<span style="color:darkgreen">% default sets to true</span> +Toggle is <span style="color:navy">\iftoggle</span>{/test/condition}{true}{false}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPYAAAAmCAQAAABdJa5sAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJb0ZGcwAAAlAAAAIRABFmWG4AAAAJcEhZcwAAASwAAAEsAHOI6VIAAAAHdElNRQffDAMWIC0wCeGgAAAACXZwQWcAAAn2AAAM5ABwic1SAAAGjklEQVR42u2b3XWjPBCGH+WkAVpgS9CWoC2BrwSlBFKCtgS2BLsEXIIpwZSAS9B3IRnzI7DAJs7u8auLxDAajWY0+pkRwvJ3QUhSJACST1s9W56/ChZK7MKyW1rhcaUnrXow7wTDjux5vdu2vAMJADV7amo/BhS5/++jfSZJyEjbGs8ZnL9ASArv3Y9FTg5k4pc9PK+HG8KCxZKPRrn7U46eF6GnX+7fZhPPPvl/zMPl1aTP1pnlDYC9/R09OD44bOJV3wGHwd/HoSB9dufgXSTAflGdPerZYm+ET86k7P/RSZx3JNhlxv5HVQH2zOcWfMU3cY43YOHxxdYg/tWJfBt8G2MnnBfXOjxzP/4XInu2AA5vyKWe/cIyCPMdNmcA7/xZUevzOhuIBOV354f5jY1ISYHzJeolUjSSM7+HcbB4yomWJIoEqDnYOqZGr25CZUeznVB+Mj6zt7VIyGyU5kTeRiymKBIkON25/4ftCwXUw55060VqYPJkOHHO7tGkFFh2GDSGE83UCRVFiaWkdFQkGE5oNJZmOeX0OZuMEw0FGkOJpSCJPAlffwz4knuOCkVOScERe5NjimlP7pYj5aW0FLsrue9Vw44jjZOAosOu1SySpl8vVgN3GJuMhhOypxTLcaxcDJbjhZICS0PhTdsTOJZyyti+fhvAQGM5xQQ0UBiMV6Ma8Gy6vby0HmVs0xq88L9Mx2waczGohYKCxPXTDWs0xve0a+y0w3UkxZwGVhubDEszVCM5lqZvbnIstjcojliO7dtsBWXQ2JixTOyuHCJMPuJLSiCiRnnb2F1aZqJ9HN17l3HwOug6QNE3tn+ahIw9r4GVxialwaInulb2hGqG6vYd0iPxIynDxiYLKkWFOUQb2xAKJusHGtu16b2RhFO/F/79eMCNjH1LA2/Lti8tDFORtz2ghG5/Z36j0EXl3/QRTzklEzDccNoDZ+496Y530wu3fRHwGzB7tj+ssOuCOzc0sMrYIiWD0J6VS3ztugNNJ5UzNEA8ZUgml4+rA7vvintPuloY0Y8sVA+Ptd19AL6tgXWe7VQXDMb4ptKIGFu8d8RQyknKCu6I+Tk/yTmJQuSXwKc9x6eOInF/tOOmBt5XsVUR4l2CNXvyVpA+hifEeMrprqbCTLxZGfOztfigABI0gIAD+7gz9hfjpgbWGTsGfp2zlTigkCLpTPpusAzXlmjKGYTHdcUdnmP/iDPdKJhCCc2v4CL2fMxoYDtjX/FJSUJ+WeWEREMwGhZPOYVq5dZmFnbPXmRIJNLPEJKSn1+gu+WY0cA9xp6fGK/j3l12yoWbjlMM8BGcCOMpp7BZNs7u3dlDSDI0CVLk69ZtkaI2XAZmNLBug+Y8LY2gAdAc7E/+IyEnJ+M3PyY6G085195DIYzoxbZtZT/5Sc3641y6URbspgbWebbbSgWN7ferdSdAr6iunjGLeMopmSYMIDIOK9dYOT512Fp8svsuWep4DazybFu5aVaEzC19w18MLxMi4DUiobgjA5+Jcd0DWwRWwgi2M779clsDayNobhMwSt4Jd0AZbhJ09Ck3nnKMD86ADrzJqZamOvtSjZ4kxF/PGk6vcuEwCVOHloJbGrgRG59MIfiU4DAV4fJUMkBZdkqBQQeyY/GUJhhd18HYsBwnbG7EqTufCVAySu14usiLzMi+VJR9uX2ic4YbDdbl/jo8SxdzX6KBYcjcFdP57mJH7p/KAYuMhk6SgISCToJy1J1xKUZZs5uUSBTaZ4qOZKguDy+TuRqHvJ+GnTFJl69GOR6UWE7dpKFPOCy4W87u6gJoTr02c59WPfp8eSD77nL5114gOSG9jXZk3VpzGugz7bdR+q63v0dCJBQ0NOz88DiN80MWFDuanr+Wbfq9NwvEUAY+VjJBmUqM5xbl1QG+yhvqSELGiZ3PRx85xWbRWplc6rFg1zNa6MOroIej/YUEg2HnHGrqQ6hpDYj7P+wTCklCTRUKfghDzh8+h3thkaLRJNT2x1LKaJmqO9dqx8knfPzFpIl+3uSTIpHU7NdG3oQiJeXMwbUvNGfOhFMfYQ0sGaHLCxlz677seFA05ausLWt347HQzBzD/GFBLaR8YSW2NjY8OpX5wmpsbezZsKK/OHtYSPnCWmy8ZidTd9Us/lReLKV8ldXW2LyBlCOhE7XiSP9iXTTlq6wrDzh63YbQZCiqdhpOUCTsxx/HxlO+sBxfYmzwq+5lTa57WbHVlC8sw//OvgjIl9l9hAAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0xMi0wM1QyMjozMjo0NS0wODowMNBRDD8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMTItMDNUMjI6MzI6NDUtMDg6MDChDLSDAAAAFHRFWHRwZGY6VmVyc2lvbgBQREYtMS41IAVcCzkAAAAASUVORK5CYII=" alt="\options{/test/condition/.new toggle} +\options{/test/condition}% default sets to true +Toggle is \iftoggle{/test/condition}{true}{false}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.216em;height:0.989em"></div></div> +<p class="p noindent">Besides assigning a new value of <code class="code code1 language-latex lang-latex latex colorized">true</code> or <code class="code code1 language-latex lang-latex latex colorized">false</code>, you can +also flip a condition as: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\options</span>{/test/condition/.flip}</code></pre> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new choice</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">choice<sub>1</sub></em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>=<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value<sub>1</sub></em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span>,<span class="code-escaped">…</span>,<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">choice<sub>n</sub></em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>=<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value<sub>n</sub></em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span>}</code> +</div> +<p class="p noindent para-continued">Defines a new choice option where the user can provide <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">choice<sub>1</sub></em>〉</span></span></code> to <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">choice<sub>n</sub></em>〉</span></span></code> as +arguments. The initial value is always <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">choice<sub>1</sub></em>〉</span></span></code>. We always need to enclose the +choice list with braces to distinguish the comma used to separate the choices from the +comma used to separate the options. For convenience, the <code class="code code1 language-latex lang-latex latex colorized">new choice</code> handler also +defines <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@ord</span></code> that contain the ordinal of the current choice (starting +at 0), and the <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@name</span></code> that contains the current choice name. +The ordinal is a number and can be tested efficiently using +<code class="code code1 language-latex lang-latex latex colorized">ifcase</code> and <code class="code code1 language-latex lang-latex latex colorized">ifnum</code>. For example: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{/test/program/.new choice={latex,xelatex,luatex,pdftex}} +<span style="color:navy">\options</span>{/test/program = xelatex} +<span style="color:navy">\noindent</span><span style="color:navy">\options</span>{/test/program/.show} + +<span style="color:darkgreen">% case on ordinal</span> +<span style="color:navy">\ifcase</span><span style="color:navy">\option</span>{/test/program/<span style="color:navy">@ord</span>}<span style="color:darkgreen">%</span> + latex +<span style="color:navy">\or</span> + xelatex +<span style="color:navy">\else</span> + other +<span style="color:navy">\fi</span> + +<span style="color:darkgreen">% ifnum on ordinal</span> +<span style="color:navy">\ifnum</span><span style="color:navy">\option</span>{/test/program/<span style="color:navy">@ord</span>}<2<span style="color:navy">\relax</span> + latex or xelatex +<span style="color:navy">\else</span> + luatex or pdftex +<span style="color:navy">\fi</span></code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="\options{/test/program/.new choice={latex,xelatex,luatex,pdftex}} +\options{/test/program = xelatex} +\noindent\options{/test/program/.show} + +% case on ordinal +\ifcase\option{/test/program/@ord}% + latex +\or + xelatex +\else + other +\fi + +% ifnum on ordinal +\ifnum\option{/test/program/@ord}<2\relax + latex or xelatex +\else + luatex or pdftex +\fi" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.000em;height:3.434em"></div></div> +<p class="p noindent">Another powerful feature is to define the values that each choice +implies. By default this is the name of the choice but we can assign +anything else. For example, for our <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\mybox</span></code> command, we could have +specified the font style as: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\options</span>{/test/font/style/.new choice= + {normal={}, italic=<span style="color:navy">\itshape</span>, small-caps=<span style="color:navy">\scshape</span>}}</code></pre> +<p class="p noindent">The value of <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option</span>{/test/font/style}</code> is not the choice name now, but +the command that we assigned to it. We can now use the option directly +instead of doing a case on the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">@ord</span></code> value: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{/test/font/style=italic} +This is {<span style="color:navy">\option</span>{/test/font/style}in italics}.</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="\options{/test/font/style=italic} +This is {\option{/test/font/style}in italics}." class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.000em;height:0.781em"></div></div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new list</code></span><code class="code code1 language-latex lang-latex latex colorized"> [=[<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">elem<sub>1</sub></em>〉</span></span>,<span class="code-escaped">…</span>,<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">elem<sub>n</sub></em>〉</span></span>}]</code> +</div> +<p class="p noindent para-continued">Define a new comma separated list. The initial value if not given is the +empty list. There are various operations to work with lists: +</p> +<ul class="ul list-dash compact"> +<li class="li ul-li list-dash-li compact-li"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\letoptionlist</span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro</em>〉</span></span></code>: stores the list in <code class="code code1 language-latex lang-latex latex colorized">\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro</em>〉</span></span></code>. +</li> +<li class="li ul-li list-dash-li compact-li"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionlistdo</span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">cmd</em>〉</span></span>}</code>: invokes <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">cmd</em>〉</span></span></code> on each element. The iteration +can be stopped by ending <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">cmd</em>〉</span></span></code> with <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\listbreak</span></code>. +</li> +<li class="li ul-li list-dash-li compact-li"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptioncontains</span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">elem</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code>: test if <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">elem</em>〉</span></span></code> occurs +in the list and invokes either the <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span></code> or <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span></code> branch. +</li></ul> + +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{/test/list/.new list = {banana,milk,eggs}} +<span style="color:navy">\optionlistdo</span>{/test/list}{<span style="color:darkgreen">%</span> + Element ``<span style="color:navy">\textsf</span>{<span class="constant" style="color:navy">#1</span>}''. + <span style="color:navy">\ifstrequal</span>{<span class="constant" style="color:navy">#1</span>}{milk}{<span style="color:navy">\listbreak</span>}{}<span style="color:darkgreen">%</span> +}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAoMAAAAeCAQAAAD9ANyxAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJb0ZGcwAAAt0AAAIRALNIX2gAAAAJcEhZcwAAASwAAAEsAHOI6VIAAAAHdElNRQffDAMWIC0wCeGgAAAACXZwQWcAAAn2AAAM5ABwic1SAAAJN0lEQVR42u2d23mrOhCF/zlfGuCUwCmBXQIpgV0CKcEpgZRASrBLwCWYEuwS7BJ0HhCYi2wQlrCdePEQi8CMLosRkkaDEBEwHSdVVj8kIiQCIOKzPvtCBYmI1HcnnajPJpWSAJv2FT8fkhFRtmphRUzJlzo51PFiswdcZ/PN0mOg1RagudJ7QqY+NfN4VqAsjqL+0bkvthHx8w8i9kRX0hkKRXbvfC5aJ6n+kZnTjrS82Oy+5UbYfLP8Xlu02qPDjWlPzTyevfFJAASsdG+4YWhtAyJSAtDXAOodJCI/n3mhggSs+dt5o1jz8evfMEL9dyVVv9xPu8GLzY7xdGyexbO3ZlgQkAPwrbaG6zbyRabJ00CVsv2JxJGUrTrMvn3FpveCvzXW6e/CuT4jtkDZSzvBi81D/DI2z+LZm+F2I9SJDwmJJXrgnsAVct7H6uMKUv7rpBP+3LtA94f6Fogpa9OjNvKh0w7NYIMXm894dDZ/AaMtNhXzePY2VTwAn+yspqB/ISRh0375lpjS5SLA80J98w2S99IZ9zJELzaPYgk2u1ts0fJm8OwfKwUl5U8cNnShV67mIur1a/HdHvPHREj3Mbobn15snoDnZbMVz6zMILD9Bf3nbcQJe0QJnoY4C0AC+sPQ6I4zTS82j+FJ2WzLM1szeGpWXn4ukpvuDogkl7XUvU9IKLmsb+yVfwoSNu2kpN30wnixeQzPymZLno3ODUrWGb2XN/YuDw/Jbnw0DmQAxPKfOgGlXrOM5c8N63U/AhKw4r1zqp/2nYMXm+3wlGy255ndEgmUTJ7QlIiYADhcWrCXGOopVwmq0Xv/1VXvCzhcr/QxXVM0AciKlWWNDGuoQr0ydWjSoWk1TEISvZPnwGaYJwlIiHXp4MDG5A+vve4/VQkSE+uZkJLvYW24lzhVJhmb9t2Sd9OL4yHZ7EYTLMPmDk8ikiFPJCDVDD+xHe4BkZQQ5rrhSEgK0HHrsedZ430dm33oWV/zv9ae3QO/exL2HMlJyShQ5ASt/+atS2MFITl71qw5tq8lYU9BToFiT3IhD1d0TdWkICRj31y7o6gPS5/4QEs5NqXY6XTY94cnZN27vVfXrDgOVByHPvza6z4mGEhMfUucKpMVu56//67NCpfHs7LZjaYl2TzGE5IeNwZtbtwxMnEXCYHOT4tZc3g2QhwilD1xyFDsWo99imLfSWdNk8ZEZ1LoYu0IFOSsm8pOzxVro2uapoY4WUOeXKcy+81ehOSsz0aAgKydbmptxxHFkYKiRVkTHfZkZKRN7lomtXNdwg7FnoKiRb7Qr8SpMsm6ZOynXR7PyWY3mpZl81WeRLqkBYU2VwpFbmTPDDN4NoKdzmIGz4bEWRHrIyXjaE8cMsMjsEZ1bXRzb8KuYyISnYtVt7rY0eqT7HRd12RsFK/7SnV+FMfzo0DcmMKWbtYUnXTd8L1eXee601qsTLRzL3G6zOWOZ2SzG01Ls/kqT/aocy4JG1No6pitzaDZCM4sxYA4w8OKOLo5+oO7SnpquLcYDNuqou3GNE3XdVWT+fFfwgz2ho3NAKSVo/57V6udTFRSrDtnqzeHbpfgXOJ0mcsdz8dmR5oWZ/NVnihUx1SH+kdqkGBpBl0aQWVwmHlXUh38y98ZXkLVylJvIlRtOWH2YQqNgXMizOF0uk6QdrrMmu7nMlF2PZvUiQ8AYjlv+R9M7KqtnqY2O0J0p/y3wzpzL3GGzOXwPGx2o+l+bO7ypHZP+W5zXB10C9ycSwkoiICSdxe7Wq74DaqT2vCOlRJJCDGvhJWYH4pL60Pm8y13V2tdZokP5Dk20Xgc+jVx/k+vLqa2nXuJ12TeBY/NZmea7sXmS2vf/Y7HyUY810Zw1H1anSzdW6v+zVQlJYAMt7RcKMYERwpbXc+ws3fTKpk93DufPKxv2Bw8MJudaboTLpXPw56TxggeXBnBKX6DQ4+yQl12RayaK5Tswn9cvh0sqWspjDarBFfKNYt07iWOyLwnHpXNz87lCzzxEr+nqGtrsNVvNsbNYM/OSzyhScy9WomP3mFJXf5R5bnX90tEQtiEiXcA9xL9yHSOx2bzz+KyH1QO4ScCYC1/3LwPjprBwURsOGGgVLoOnvMguvyj3oXRQFJWbmd83Ev0I9MHHpzNP4vL/lDyTkFEyGr6PqBrsA2tMAy9Y75mOXjWJaGki5dG93ASSEFOCJR88bda97wlSKl7iX5kLobHYrN3TQuz2Q+qhZG/nICVOPFFsDeD1yOOLfnyvoyucFGnj7BTsoyYqtn/qE+1cRCSyr1EPzKXwqOweSlNy7LZB/TqsDroqNW5OJg3tTSDEo8MI6qVuAtxOyRxkeW76FoEUpO0Wh0MSIET764Mi3uJfmQuhQdi84/jsjd81rOB6ostUH915ibYvg2m11d/VFkNhkyvqhKQu1zxWlKXFwzzV60THlTbbeYwmASeXy73Ev3IBCSQVHwPEh+GzU/P5fugGhgn8wf6NcuszKCkJKNzKR+cAFPGVpSOwyr50NV/LKbMHs1DJJ0wSJLrd8HqZb8OnRR1jYGk82eQ3Ev0IxMkYE/OzuBA4gwPxmY/mpZj8x3Q7LvKZNby3JllZzMYjd0iGTnmRf1WJtSBTyDuE1giUp1pd9XgQ1d/eOLz6wtZFcdXQkllpx+BdkS2Ki+FZBKBBJJIfuMQwL1EPzLrj2fO7eefjs2eNC3J5jtAVd+hnjswblj2pgNBRg3hVtK/OCAibEJq1l+CjQgIdQWncuJUb6hR33IiZyWcQ2/KipT3JhBjdW/17hNLyoGTKnUASd1kkrMBSnXqaTpUV+tqGNE1SVNWfc+0ul+VsiEhlY0qq5CQyrwf9HZU26QS6Z7720p9kVB9fLzdKrd8SMi9RD8yD72/E/HMbHak6V5svhc+iQmJJZvhbNRiWWEZjCHtRZYwxu4gIOfIkYKMNUeKdqwRw73Fhagg8aWrp+my09TIq0Ie5axNAUkdROXImpxkrehsx2H0E9JO0Mo9GaEx/KQhIse5nH4lTpdpXUd729p/dja71LQMm214YhFN5nKEmWFQ3Lr8M8pWs0yUR0MtMREBpfM5Qe+6JCQi4tD9Squ3nMfA1vwFWAl0APzt2IcIJutzLtGPzEfDcmx2rWlJNj8n/gelbmM6sw7IcQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0xMi0wM1QyMjozMjo0NS0wODowMNBRDD8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMTItMDNUMjI6MzI6NDUtMDg6MDChDLSDAAAAFHRFWHRwZGY6VmVyc2lvbgBQREYtMS41IAVcCzkAAAAASUVORK5CYII=" alt="\options{/test/list/.new list = {banana,milk,eggs}} +\optionlistdo{/test/list}{% + Element ``\textsf{#1}''. + \ifstrequal{#1}{milk}{\listbreak}{}% +}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.000em;height:0.781em"></div></div> +<p class="p noindent">There are also two special handlers for manipulating lists in the options, +</p> +<ul class="ul list-dash compact"> +<li class="li ul-li list-dash-li compact-li"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list option</em>〉</span></span>/.push = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">elem</em>〉</span></span></code>: pushes <code class="code code1 language-latex lang-latex latex colorized"><elem</code> on the end of the list. +</li> +<li class="li ul-li list-dash-li compact-li"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list option</em>〉</span></span>/.concat = {<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list</em>〉</span></span>}</code>: concatenates <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list</em>〉</span></span></code> to the end of the list. +</li></ul> + +<p class="p noindent">For example, +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{/test/list 2/.new list = {banana}} +<span style="color:navy">\options</span>{/test/list 2/.push = milk, /test/list 2/.show}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="\options{/test/list 2/.new list = {banana}} +\options{/test/list 2/.push = milk, /test/list 2/.show}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.273em;height:1.093em"></div></div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new length</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">dimexpr</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Defines a new length option <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code>. This option stores its value in a +new length register, and its value be used directly where a length is +expected, e.g., <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\hspace</span>{<span style="color:navy">\option</span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}}</code>. If no initial value is +given, the initial length is <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">0pt</span></code>. The user can assign +any length expressions (<em class="em-low1">dimexpr</em>), e.g., <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span> = <span class="constant" style="color:navy">1pt</span> + <span style="color:navy">\fboxsep</span>}</code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new dim</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">dimexpr</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued">Defines a new dimension option <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code>. This option stores its value +as an unevaluated <code class="code code1 language-latex lang-latex latex colorized">dimexpr</code>, and its value be used directly where a +dimension is expected, e.g., <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\hspace</span>{<span style="color:navy">\option</span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}}</code>. The main +difference with a length option is that a dimension option is not +evaluated at the time the key is assigned, but rather when it is <em class="em-low1">used</em>. +This may be important when relying on the contents of other registers. +For example, if we declare: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\setlength</span><span style="color:navy">\fboxrule</span>{<span class="constant" style="color:navy">1pt</span>} +<span style="color:navy">\options</span>{/test/width/.new dim=<span style="color:navy">\fboxrule</span>,/test/length/.new length=<span style="color:navy">\fboxrule</span>} +<span style="color:navy">\setlength</span><span style="color:navy">\fboxrule</span>{<span class="constant" style="color:navy">10pt</span>}</code></pre> +<p class="p noindent">This will show <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">10pt</span></code> for the <code class="code code1 language-latex lang-latex latex colorized">width</code>, but <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">1pt</span></code> for the length: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{/test/width/.show}<span style="color:navy">\\</span><span style="color:navy">\options</span>{/test/length/.show}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="\options{/test/width/.show}\\\options{/test/length/.show}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.272em;height:2.394em"></div></div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new num</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">numexpr</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued">Defines a new number option <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code>. The assigned value +is evaluated as a <em class="em-low1">numexpr</em>. Can be used directly in any context +that expects a <em class="em-low1">numexpr</em>. For example: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{/test/num/.new num = 2+4} +Is it 6? <span style="color:navy">\ifnum</span><span style="color:navy">\option</span>{/test/num}=6<span style="color:navy">\relax</span> Yes.<span style="color:navy">\else</span> No!<span style="color:navy">\fi</span></code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="\options{/test/num/.new num = 2+4} +Is it 6? \ifnum\option{/test/num}=6\relax Yes.\else No!\fi" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.000em;height:0.807em"></div></div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new glue</code></span><code class="code code1 language-latex lang-latex latex colorized"> [=[<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">glueexpr</em>〉</span></span>]</code> +</div> +<p class="p noindent para-continued">Defines a new glue option. Can be assigned any valid glue expression and used +in any context that expects a glue expression. If no initial value is given, +<code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">0pt</span></code> is used. +</p><h3 id="sec-command-options" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">3.2</span>. </span>Command options</h3> +<p class="p noindent para-continue">The options in this section are not values by themselves but are +only invoked for their side effect. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new family</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">search list</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued">Defines a new family, this is a shorthand for +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.search also = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">search list</em>〉</span></span>, +<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new style* = {<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.cd}, +<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.type = family</code></pre> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new style</code></span><code class="code code1 language-latex lang-latex latex colorized"> = {<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span>}</code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new style*</code></span><code class="code code1 language-latex lang-latex latex colorized"> = {<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">Defines a new style; when invoked it will also set the specified +<code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span></code> using <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionsalso</span></code>. The <code class="code code1 language-latex lang-latex latex colorized">.new style*</code> variant does not +take an argument itself. The plain <code class="code code1 language-latex lang-latex latex colorized">.new style</code> can use <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#1</span></code> for the +argument value, e.g. +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code>/border/width/.new style = {/border/top/width=<span class="constant" style="color:navy">#1</span>,/border/bottom/width=<span class="constant" style="color:navy">#1</span>}</code></pre> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd*</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Define a new command that is invoked when the options is given. +<code class="code code1 language-latex lang-latex latex colorized">.new cmd*</code> takes no argument while <code class="code code1 language-latex lang-latex latex colorized">.new cmd</code> takes a single argument. +</p> +<p class="p indent">Use of these options is generally discouraged and if you can you should +try to use a data type directly together with <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option</span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}</code> commands. +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{ /test/cmd/.new cmd = You said ``<span class="constant" style="color:navy">#1</span>'', + /test/cmd = hi, +}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="\options{ /test/cmd/.new cmd = You said ``#1'', + /test/cmd = hi, +}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.000em;height:0.781em"></div></div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd 0</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd 1</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd 2</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd 3</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd 4</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Define commands with multiple arguments, where <code class="code code1 language-latex lang-latex latex colorized">.new cmd 0</code> +is equal to <code class="code code1 language-latex lang-latex latex colorized">.new cmd*</code> and <code class="code code1 language-latex lang-latex latex colorized">.new cmd 1</code> to <code class="code code1 language-latex lang-latex latex colorized">.new cmd</code>. +Each argument needs to be enclosed in braces and if not all +arguments are given, they will be empty. +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{ + /test/cmd2/.new cmd 2 = [{x}{y}]{I got (<span class="constant" style="color:navy">#1</span>,<span class="constant" style="color:navy">#2</span>)<span style="color:navy">\\</span>}, + /test/.cd, + cmd2, + cmd2 = hi, + cmd2 = {hi}, + cmd2 = {{hi}}, + cmd2 = {hi}{there}, +}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="\options{ + /test/cmd2/.new cmd 2 = [{x}{y}]{I got (#1,#2)\\}, + /test/.cd, + cmd2, + cmd2 = hi, + cmd2 = {hi}, + cmd2 = {{hi}}, + cmd2 = {hi}{there}, +}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.000em;height:6.296em"></div></div> +<p class="p noindent para-continue">Note how <code class="code code1 language-latex lang-latex latex colorized">{hi}</code> and <code class="code code1 language-latex lang-latex latex colorized">hi</code> had the same effect since the <code class="code code1 language-latex lang-latex latex colorized">options</code> processing +peels of a single layer of braces. If we want to preserve braces we need to double up. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd tuple</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd triple</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">These are variants of <code class="code code1 language-latex lang-latex latex colorized">.new cmd 2</code> and <code class="code code1 language-latex lang-latex latex colorized">.new cmd 3</code> that take +exactly 2 or 3 arguments separated by commas. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmdx</code></span><code class="code code1 language-latex lang-latex latex colorized"> = {<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">pattern</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">postfix</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">This defines a plain <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAnCAYAAABKZsWMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADw0lEQVRo3u1a3W3bMBD+zvAAjDtBlQ0UdANnA6WdIM5LnyVkgsLuBE7e+hbIG1gbpNYGVidorA3Yl1NKEBJ9lCXZcXIAgTjm8efj8b67o0lrjXMXIlIAoLUum75v+q5WGLQNAN1zS7XW6LIBiH3W0DDGXKgfVTpjxk4ZOJYAMgAFgL/8+QXABMAlL9SUxOqjuN8EQGT0Uz0Y0QpADiDgOWc185QAHgA8N4yx5H3e1+hmANaMRWZb2o7RXApO10R/K+ifSvt2YHmBsZeqzYS6oaGzBqAa+xpAbISDm4uS6mwB7PoGjeeKLNCka1QVYIK+r52jHkGLm3xKT8CtLeBigc6S96YkoAU8sOoRNK85OgBN1TjyQHA1RYYz4glKL8r1FK11wX9OhggxeC931r9Th0oKINNaryTjj9gKigH2UvbEoE3APTCzVhIS0awmRpszBjfSsUd8+kOAVvDihhQbiGUV6DJgIfvbO9+bFklp2denGeFGH23TMgBeW6y+9vWZ5JtGEdHOuGa51vrK0Tdk65o0BJ85s9aLY8pKd8oO+/W6a60vhGveWLo3vK45gAtvf96CmbzZ03HqUYvgdeNKiwSBqzb2MGvDzqOBfUxxoHMv2LILtqBAqJcDWFgpXcFk4S1Dg9aVVOFE4AF4Yh1aQETTdwOa1jrjEMaXjZOaZP3dWFpVgbj01Lm3Pgccp70b0J59LI2IYiaEK7bSSmJm+fMAjYhihyWIg2UmjDmAhEnh1iPFenOW9smRemUAfgjHSTmmXLBPXHEB07ym8bmAFriSckmCzflmWJNS3VrXdC4NYUYnfDWVVS5vM0bADLkwKi1mJSRpc01HpwCO1apqxJ8Ohl9yEJs4KiHZvkrIsdOoqEVivmxZiJyxfigskJrNWSwdH9nQEqvmVW3iijd9yNWurmW+LzUjooTZ1bym16dqaZEgyV62fCPYeupspWs7WSJgC8nbxHZcRvKN9G12fTQLlocSgZKEBB3JbwFIU6t0XYF1eeAhKQCPdX3He+haGYXAujq6IqIUwBP+v7JXBcIuSujOdwUi+g7gJxH9AvDV6huzpaSc4Lv83xTAN6tQCQARFzCfOAMptdaZ1Hf5tu2hPs1gtlD42t/Udh0zunKx5+eaYHAfY3Xt1/ZZ64LDg7sD5lgBIB+dsStN8Zy8xPASMlMOKm+5NAT2RfkHaPLQIjJKRB+gCWUu9HsfoBnxWHAMK3MSwdD1MY+c8tEoGeVnB5rxwg4AX2qS8HsimqDdCzuOZWl9/06sz99ytH4hP7T9AyKTc466woHYAAAAAElFTkSuQmCC" alt="$\mbox{\TeX}$" class="math-inline math" style="vertical-align:-0.243em;height:1.015em"> command with the specified <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">pattern</em>〉</span></span></code>. +Also, when invoking the command, it will append <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">postfix</em>〉</span></span></code> to the argument which +is often necessary to ensure the command pattern will always match. For example, +here is how we defined <code class="code code1 language-latex lang-latex latex colorized">.new cmd tuple</code> which matches with exactly 2 arguments: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code>/handlers/new cmd tuple/.new handler/.defaults = <span style="color:navy">\optionsalso</span>{ + <span class="constant" style="color:navy">#1</span>/.new cmdx = {<span class="constant" style="color:navy">##1</span>,<span class="constant" style="color:navy">##2</span>,<span class="constant" style="color:navy">##3</span>}{,,}<span style="color:darkgreen">% match comma separated</span> + {<span style="color:navy">\ifstrequal</span>{<span class="constant" style="color:navy">##3</span>}{,}<span style="color:darkgreen">%</span> + {<span class="constant" style="color:navy">#2</span>}<span style="color:darkgreen">%</span> + {<span style="color:navy">\optionerror</span>{<span class="constant" style="color:navy">#1</span>}{expecting a 2 argument tuple}}<span style="color:darkgreen">%</span> + }, + <span class="constant" style="color:navy">#1</span>/.type=cmd tuple, +}</code></pre><h3 id="sec-hooks" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">3.3</span>. </span>Using existing definitions</h3> +<p class="p noindent para-continue">Use these declarations if you need to work with existing +definitions and are not able to declare your own using the +data types in Section <a href="#sec-datatypes" title="3.1. Basic data types" class="localref" style="target-element:h2"><span class="heading-label">3.1</span></a>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.is if</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">if name</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Declare a new option that directly sets a defined <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAAAnCAYAAADn590lAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFP0lEQVR42u1by3HbOhQ916MCOEoFQTqQk0kDTAf0vApC7d5SHFXgkTqQUkFCdRB1EEsdWK+CWFq9LbLwhQMjAAiQIC07vjOYiW18eH/nfoAQgAwaSSlPsBARBc3juQLAREq5wV9KSl4+efpkaKMagIwctZQSrgHgO88TDfN2Lc5O+q2xA8As5nzHHovA9YVaMwLwGcA1gDEAwZvo3nPiv+8B3PHvDg3elPOPUwCVx0jMc7a890/++Y6/6x0LSKfKmJPxvDGAwnFGCtqwLASfV1rOOAFYA/jh2GPFPM4ta7ds6Af+9wOEmdouDa2WkRanW8uxYe6R560C9tW/6TZgfh06t6OHCY2PKJkBmGhrvgPInHMtiwuX+wUefmvsUTQIfxe4ry6MXcS3HPtUlENmod+XKSU1zb1IHEALAFtOIlSgnDckJ9c9xvRVD9D3BzG/W+1XEyKaBSxdsJyuQg5J5lHsvhMLBAoHZEifuyfwqKgzOnpVZkkGRADsBcn3IqE3Cf6wvWbN0JIKWyJxik1RIy1dJT3jAbzqZOGzbsi2t6ElTErom7IX6UJScFBa5gtf9piQTkPAH/O85oxQh8DSYtQL5v8qdO+UiioAfLPECADIOH7pNB5IUQcWylBkCn+lNwuIaMKlxjQGTZIoiohyAHvzYCOpMGHhjmNaH12BmogkEUmOBQ8/Jxi7ALitPBCoIG8dw9MokWwqHfYMWrMF5UQkVNzoub10DeCrViybRemevf3Os4dam7OydchugsAlEf2jrcsZUQSPyza42inrYwHcBmReEsCiQ1YVnfV52j5Fi6J252sLNRSzUvv+sg3/KaBvDkAQ0dE2mEF4kgoMFKc6ZY9Syku1D2e4TWv2AJZGlnuIhbyUMapkiHjrGZUnqXhONA2FP1ZWZRiJ4Hg+rKL40Bu2uJNnLBtqqmdBUsotJ0cxWWTlyIQH9agq4uCNFljFM/aqLSNITGiA4VWLwRTFtcH7iOxt9RK8iq8uRKCMZpxUXGplCgDMuJ4axKPmAG5awMZTJhWhRjjzWH1QAc2osQBQcWLxOaK91F1RRKRcV9VGhXlNz/OkUZHrzGVEtDhjCHzjaTttEdbxr7kJsNTqxo0BgTNEWHpwHYXfV+zm2Nk6yY5LP9sQPddRsbVhjYDLTM/60sYXy+UYy3t0HSWl/CSlJMswK+33OiY71ujjcEawl+HxVX404nA8Xpp8cYutagOBFz3xO1RnvJNCjKE63f913HrFhW3lMPY1/rxkbIzZo57kcHXmiqp7Un7JvcGmXt4U988EHpRLRN983fSLnqAjP3NFVQA+GWOK+wZyF74V5O2bWlKxENiHR6kC7+cZK+rA5YJN4Cs87k/GeKkT8izKWhLRVEv1cyIqXHVpH49bZlq98RzbRHs8vqUNLWxzuK96fCFCpy+2UselKNFSSQvDfVMrKuv6jRF0E8BvrvGtFPSuo1FkAL5YoY9bGYrxD5auwZyIbGvV69QPjnT21FLhQlOKer1rWl5GRDXuLwfVa1ng/rFMCgNxvrNg1PgI4F8i+t+YN2OPqF3QasRx/XJRUcG3yF/Z2E9qrzZvz1u9uW5xQRg7bhMVvOo/OTS92HWNY2QB3jSykZTy6szCxFtLkdiUbaWOUwfP34jhLpNSTlvuvwFAMWtGZ6YkxL7z6/NdoIcm6OlhztCdiZdOeWxm+Kqo4VtPxVOUH6+KiqdFUxx7VdTTe5N6ijx4MT/6S2QsOipIFaIK9vavikpj+SFF/BjtXsriKTyKuAB7aYqq0eHyL4CmbR9StqVfbocpgMXmWmMAAAAASUVORK5CYII=" alt="$\mbox{\LaTeX}$" class="math-inline math" style="vertical-align:-0.243em;height:1.015em"> <code class="code code1 language-latex lang-latex latex colorized">if</code> +declared with <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\newif</span></code>. The name should not start with the <code class="code code1 language-latex lang-latex latex colorized">if</code> part, e.g. +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\options</span>{ /twocolumn/.newif = <span style="color:navy">@twocolumn</span> }</code></pre> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.is counter</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">counter name</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Declare an option that directly sets or gets a <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGoAAAAnCAYAAADn590lAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAFP0lEQVR42u1by3HbOhQ916MCOEoFQTqQk0kDTAf0vApC7d5SHFXgkTqQUkFCdRB1EEsdWK+CWFq9LbLwhQMjAAiQIC07vjOYiW18eH/nfoAQgAwaSSlPsBARBc3juQLAREq5wV9KSl4+efpkaKMagIwctZQSrgHgO88TDfN2Lc5O+q2xA8As5nzHHovA9YVaMwLwGcA1gDEAwZvo3nPiv+8B3PHvDg3elPOPUwCVx0jMc7a890/++Y6/6x0LSKfKmJPxvDGAwnFGCtqwLASfV1rOOAFYA/jh2GPFPM4ta7ds6Af+9wOEmdouDa2WkRanW8uxYe6R560C9tW/6TZgfh06t6OHCY2PKJkBmGhrvgPInHMtiwuX+wUefmvsUTQIfxe4ry6MXcS3HPtUlENmod+XKSU1zb1IHEALAFtOIlSgnDckJ9c9xvRVD9D3BzG/W+1XEyKaBSxdsJyuQg5J5lHsvhMLBAoHZEifuyfwqKgzOnpVZkkGRADsBcn3IqE3Cf6wvWbN0JIKWyJxik1RIy1dJT3jAbzqZOGzbsi2t6ElTErom7IX6UJScFBa5gtf9piQTkPAH/O85oxQh8DSYtQL5v8qdO+UiioAfLPECADIOH7pNB5IUQcWylBkCn+lNwuIaMKlxjQGTZIoiohyAHvzYCOpMGHhjmNaH12BmogkEUmOBQ8/Jxi7ALitPBCoIG8dw9MokWwqHfYMWrMF5UQkVNzoub10DeCrViybRemevf3Os4dam7OydchugsAlEf2jrcsZUQSPyza42inrYwHcBmReEsCiQ1YVnfV52j5Fi6J252sLNRSzUvv+sg3/KaBvDkAQ0dE2mEF4kgoMFKc6ZY9Syku1D2e4TWv2AJZGlnuIhbyUMapkiHjrGZUnqXhONA2FP1ZWZRiJ4Hg+rKL40Bu2uJNnLBtqqmdBUsotJ0cxWWTlyIQH9agq4uCNFljFM/aqLSNITGiA4VWLwRTFtcH7iOxt9RK8iq8uRKCMZpxUXGplCgDMuJ4axKPmAG5awMZTJhWhRjjzWH1QAc2osQBQcWLxOaK91F1RRKRcV9VGhXlNz/OkUZHrzGVEtDhjCHzjaTttEdbxr7kJsNTqxo0BgTNEWHpwHYXfV+zm2Nk6yY5LP9sQPddRsbVhjYDLTM/60sYXy+UYy3t0HSWl/CSlJMswK+33OiY71ujjcEawl+HxVX404nA8Xpp8cYutagOBFz3xO1RnvJNCjKE63f913HrFhW3lMPY1/rxkbIzZo57kcHXmiqp7Un7JvcGmXt4U988EHpRLRN983fSLnqAjP3NFVQA+GWOK+wZyF74V5O2bWlKxENiHR6kC7+cZK+rA5YJN4Cs87k/GeKkT8izKWhLRVEv1cyIqXHVpH49bZlq98RzbRHs8vqUNLWxzuK96fCFCpy+2UselKNFSSQvDfVMrKuv6jRF0E8BvrvGtFPSuo1FkAL5YoY9bGYrxD5auwZyIbGvV69QPjnT21FLhQlOKer1rWl5GRDXuLwfVa1ng/rFMCgNxvrNg1PgI4F8i+t+YN2OPqF3QasRx/XJRUcG3yF/Z2E9qrzZvz1u9uW5xQRg7bhMVvOo/OTS92HWNY2QB3jSykZTy6szCxFtLkdiUbaWOUwfP34jhLpNSTlvuvwFAMWtGZ6YkxL7z6/NdoIcm6OlhztCdiZdOeWxm+Kqo4VtPxVOUH6+KiqdFUxx7VdTTe5N6ijx4MT/6S2QsOipIFaIK9vavikpj+SFF/BjtXsriKTyKuAB7aYqq0eHyL4CmbR9StqVfbocpgMXmWmMAAAAASUVORK5CYII=" alt="$\mbox{\LaTeX}$" class="math-inline math" style="vertical-align:-0.243em;height:1.015em"> counter +declared with <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\newcounter</span></code>. You can use <code class="code code1 language-latex lang-latex latex colorized">.inc</code>, <code class="code code1 language-latex lang-latex latex colorized">.step</code>, and <code class="code code1 language-latex lang-latex latex colorized">.refstep</code> +operations on counters. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.is def</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro name</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Declare an option that directly sets or gets a defined definition. +This is basically equivalent to the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\define@key</span></code> operation of the <code class="code code1 language-latex lang-latex latex colorized">keyval</code> +package. +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\def</span><span style="color:navy">\mytest</span>{} +<span style="color:navy">\options</span>{ + /mytest/.is def = <span style="color:navy">\mytest</span>, + /mytest = ``hi'', +} +<span style="color:navy">\mytest</span>{} there.</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALgAAAAeCAQAAAA1fxy/AAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJb0ZGcwAAAuIAAAIRAEZk6hAAAAAJcEhZcwAAASwAAAEsAHOI6VIAAAAHdElNRQffDAMWIC0wCeGgAAAACXZwQWcAAAn2AAAM5ABwic1SAAAEBklEQVRo3uWa0ZWqMBCGv9ljA2mBLSG3hNwSaIEtAUvILYEtAUvQEqQELAFLyH0gIER0Cequnp086MThd/jJkJkBcQCIRrtPehFN6tYgmgQNgGbtKhaKWDSVW/d6jqHinzsuRZz4jzv5+mBxONDUaEc3TjpbTtPGMWegsJSkg5nMf7HT+n3GEl+/f7QEjeh2UA8dRrOPItyGJ93PONSUfsfTifT1+8cbkLMZBqBYdm43iIGKXVTQpP7T9DOH/lsb8lWgR4pkklyI11hfv11WQMb7aC7lz02YOzL/2dHwKWCoUF7fyIfX9SKCCv4OLuJLyUpSNsOtSwzVjVvZmiMJm1GUfPIJUgS65Vm3tofJCh2sFXMrCe7I+sJPCeNLuWh9i4k/5nnkjSQgWD1q1YlCB8madktuKC9OuEJLIaV021dCIoWUD1hHKZuhKtlYj8B5YVlxwAJg5N0dgYrC63/cHTcmUeT8HU2F+jwcSxJ/1PPIqr+BdBnDodeT6UxAVJvMXbsdiEYFm69lM7yAUoz1eSI5eZT9DF9BNAYFHNid+9RitAgebzKtuI5yEkWNw9F0RYgvHRqSoHAxDhQFNSUlDY4iLFz6GjIoPsjZB3b7uKKHBOs9dTj2bLsxWXbN8NXbp9Q0FGRYtmM7ypOhx24o2dOEhdU1lPNKM6GgPNWavjTX5yeBpu5KdhR7XEgbBoulOSPcBnY2tsYkwWJ70guv2bA9MN/X3no/WFoZjrrTybAUHeEUFChMuxzno5wRPuNk25NIg45LisORX7R/SHntOyYXsWN8xTKK5H5Vj6PRNwsoHQ7y04qPQVlCeE02cfD2ov1PEj7DV38RwghpV3B2huhXsL8F21iUbrzFbEHDBm4vT5ozzPC1zc4CO7fjyFSuf2g3Qnd0705OjeZIlCjCp3f65yT8S18lJaGncSQVU7n+ZDkYjRJF+B0fFjxcvva1LfSm0rcKQPTU7M0orH6amR+TlopE7IVf1GNQfi/hrUyvzQqiOkoRKL+d8MFz1u9BicpSnlEkkeyGwxc9cboF5eUJJ1nYPbxPEzoa5fUJXypta/hCE1pSmbdpRqP8WsK7x80yER+iKOZlKfNRREkm+hUJD4NYL36c/MERmNoBcqrZreNZKKKoKdiLfSTh84IyVsIgXvwM1h1YAybMoUWT8TGYSO6Aknk2MtzVgcaQ+ZbongyDdqAwmP51HovB+Fd8Wvv9wP7Or/r4Tlzj3wzLqJf66ltPDW7YLCY/9RnRGHLfbG4RJ8/nOsqgxeU8M1/25oZj2/fCxsNcsL97zxDlG6IFZUf8El97tIKGhi2WkobtoK+9vX7sPJRBz7FGi3tI3D9aJEGjOYzfqbkBz6BRVBH37oUo/wF9Zu6JSGtEZQAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0xMi0wM1QyMjozMjo0NS0wODowMNBRDD8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMTItMDNUMjI6MzI6NDUtMDg6MDChDLSDAAAAFHRFWHRwZGY6VmVyc2lvbgBQREYtMS41IAVcCzkAAAAASUVORK5CYII=" alt="\def\mytest{} +\options{ + /mytest/.is def = \mytest, + /mytest = ``hi'', +} +\mytest{} there." class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.000em;height:0.781em"></div></div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.is edef</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro name</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Same as the <code class="code code1 language-latex lang-latex latex colorized">.is def</code> but will use <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\edef</span></code> to redefine the +macro definition. +</p><h2 id="sec-option-transformers" class="h1 sans-serif" data-heading-depth="1" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">4</span>. </span>Option transformers</h2><h3 id="sec-operations-on-option-paths" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">4.1</span>. </span>Operations on option paths</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">path</em>〉</span></span>/.cd</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued para-continue">Change the directory to make <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">path</em>〉</span></span></code> the default option prefix. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.show</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued para-continue">Show the current option (in the document) +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.typeout</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued">Show the current option in the console. +</p><h3 id="sec-operations-on-arguments" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">4.2</span>. </span>Operations on arguments</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.expand once</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Expand the argument once (using <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\expandafter</span></code>) +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.expand twice</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Expand the argument twice. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.expanded</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Fully expand the argument. Defined as: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code>/handlers/expanded/.new transformer = + <span style="color:navy">\protected@edef</span><span style="color:navy">\optionvalue</span>{<span style="color:navy">\optionvalue</span>}</code></pre> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list option</em>〉</span></span>/.push</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">element</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Push an element on the end a list option. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list option</em>〉</span></span>/.concat</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Concatenate a list to the end of a list option. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.inc</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">numexpr</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Increment a counter or number (<code class="code code1 language-latex lang-latex latex colorized">.new num</code>) with the given amount (or 1 if +no argument is given) +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">counter option</em>〉</span></span>/.step</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued para-continue">Step a counter option by 1. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">counter option</em>〉</span></span>/.refstep</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued">‘Ref step’ a counter option by 1. +</p><h3 id="sec-predefined-options" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">4.3</span>. </span>Predefined options</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/options/exec</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Directly execute the provided <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{ /options/exec=hi there}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAIsAAAAeCAQAAAC2uyWEAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJb0ZGcwAAAlAAAAIRABFmWG4AAAAJcEhZcwAAASwAAAEsAHOI6VIAAAAHdElNRQffDAMWIC0wCeGgAAAACXZwQWcAAAn2AAAM5ABwic1SAAAC9klEQVRo3u2Z4ZGjMAyFP+9cA26BK8EtuIW0wJaQlOAW2BLYEpISoARSAilB9wNCYsacbZIll5mTZ8JA5Cf7IcuSURgKDACGg7RsLOrF9pfkiEzNCvGGxlGzS9FNQMu2v0UbfgxNBi3u2ZPIs79F+wCQllOGf+3Gq81cLqUqwv9k2t9APlb0Oc2uqVJRZPZ4mfxa0efAhYJv+cfe8DNlBS1y4ZDfS2UuudfKmkW0Tv7TEpTd4xDbyUa0KPc+4RYWYovSQ965HFSVQdPKJZGUPfucQcXtj2OwaODMSc5LKAPGiBgY8QKKl6JZAU1FR01Nj1ChvcSrzMtJKXB0023D8dqCKWLU/qS/o6OnosRxnOtR31RH9J6aht4f8zLKbFgYumtaj6ZBaDyDFoejz6LFTdRU453DhWmJ2b/Tbii8l9V5947qSgsVFRqLIPRpKP6wdnQYj01B2C+k/xmp+lj5LPbIsY9D6G/TmfyjmemNBQW1ILC/eU8cxR9WRzmDFmTu8D9IS4L9kaq5tw2+UAYwR39A0936xVBmO5F8BWLbhntIgn0HwExPTlwI50bnIZDKRX6LkkMaik9LOPJvR0vUvtpR3KbqSUs4Nwqc4MRRfFoSN9wfk7j94cAqsB0P01cmhZY4yppS8ZUyTKhQbuEf/RyUd6NlkPB7bgn7xgqU96SllRU1fA7KdqWiJ6pQ5QPdzQN9k1BeRAvFyor6OV8GoiivomWtfAOLZzdqp9JCbhTlzWi5HoargK8pTZW2E8VRtqJl7rYmuA+kyCcXIBSZ9rSSihpBeYSWNIcdZO62dm2UkDMHwM5zDmUo+fQeFY+gGCzlWPg3lFiMgMZipw9lDotFy1W7udPWS+XfrAyrEfqhPqakm55n2Z8KvR7B3T3Z39feGCz78fhjwAyM828o/sdOuVasYy3pNysh7cQ6Gj2W8hX1lZ672jrR/h1aRU/PEUdNz/H+iCCAGRznMoqSB1ZRrqgCg+HMd+pxZwTPYtC0GTElEeUPW8xSEgUb8boAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTItMDNUMjI6MzI6NDUtMDg6MDDQUQw/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEyLTAzVDIyOjMyOjQ1LTA4OjAwoQy0gwAAABR0RVh0cGRmOlZlcnNpb24AUERGLTEuNSAFXAs5AAAAAElFTkSuQmCC" alt="\options{ /options/exec=hi there}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.000em;height:0.781em"></div></div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/options/ignoreunknown</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">bool</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued para-continue">If set to true, this will ignore any subsequent unknown options. Such +ignored options will be added to the <code class="code code1 language-latex lang-latex latex colorized">/options/remaining</code> list. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/options/allowsearch</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">bool</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued para-continue">If set to <code class="code code1 language-latex lang-latex latex colorized">false</code>, it will no longer search along search paths +provided by <code class="code code1 language-latex lang-latex latex colorized">.search also</code> or <code class="code code1 language-latex lang-latex latex colorized">.new family</code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/options/unknownwarnonly</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">bool</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued para-continue">If set to true, this only issues a warning when finding +an unknown option (instead of raising an error). +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/options/remaining</code></span><code class="code code1 language-latex lang-latex latex colorized"> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>= <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> +</div> +<p class="p noindent para-continued para-continue">A list of remaining options to be processed. This list should +not be used directly but mostly in conjunction with <code class="code code1 language-latex lang-latex latex colorized">/options/collectunknown</code> +and <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionswithremaining</span></code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/options/collectunknown</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued">A style. If given, it will clear the <code class="code code1 language-latex lang-latex latex colorized">/options/remaining</code> list and +set <code class="code code1 language-latex lang-latex latex colorized">/options/ignoreunknown</code> to true. +</p><h2 id="sec-options" class="h1 sans-serif" data-heading-depth="1" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">5</span>. </span>Option commands</h2> +<p class="p noindent">This section defines the command macros available on +option values. +</p><h3 id="sec-process-options" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">5.1</span>. </span>Processing options</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">Process the <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span></code> list. This is a comma separated list of +<code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span> <span class="code-escaped"><span class="opt serif" style="color:navy">[</span></span>=<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span></code> elements. Both the <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> and <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span></code> are trimmed +of whitespace (at the end and start). The list may have empty elements and also +end or start with commas. When extracting the <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span></code> a single layer of braces +is removed – this is done such that the user can specify values that contain +commas or equal signs themselves. Any option defines are always local to the +current group. +</p> +<p class="p indent para-continue">When invoking <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span></code> the initial path is always the root (<code class="code code1 language-latex lang-latex latex colorized">/</code>) and the +flag <code class="code code1 language-latex lang-latex latex colorized">/option/ignoreunknown</code> is false, and <code class="code code1 language-latex lang-latex latex colorized">/option/allowsearch</code> is true. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionsalso</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Just like <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span></code> except it will use the current default path and +option flags. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionswithremaining</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Like <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span></code> but also processes any options in the list <code class="code code1 language-latex lang-latex latex colorized">/options/remaining</code> +after processing <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span></code>. Will start by making a copy of the <code class="code code1 language-latex lang-latex latex colorized">/options/remaining</code> +list so you can call <code class="code code1 language-latex lang-latex latex colorized">/options/collectunknown</code> in <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">options</em>〉</span></span></code> to immediately start +collecting further remaining options. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options@ProcessOptions</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">family</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">Call this in a package (<code class="code code1 language-latex lang-latex latex colorized">.sty</code>) or class (<code class="code code1 language-latex lang-latex latex colorized">.cls</code>) file to handle the options +passed to it. In a package file it will also consider the known options that +are passed to the class besides the options passed to it directly. The +<code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">family</em>〉</span></span></code> should be the root path for your options. For example, +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\NeedsTeXFormat</span>{LaTeX2e}[1995/12/01] + +<span style="color:navy">\ProvidesPackage</span>{mypkg}[2015/01/01,By Me] +<span style="color:navy">\RequirePackage</span>{options} + +<span style="color:navy">\options</span>{ + /mypkg/.new family, + /mypkg/columns/.new num = [1]{2}, + /mypkg/<span class="constant" style="color:navy">10pt</span>/.new cmd* = <span style="color:navy">\typeout</span>{use <span class="constant" style="color:navy">10pt</span> font size}, +} +<span style="color:navy">\options@ProcessOptions</span>{/mypkg}</code></pre> +<p class="p noindent para-continued">Others can now pass options to your package as: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\usepackage</span>[<span class="constant" style="color:navy">10pt</span>,columns=2]{mypkg}</code></pre><h3 id="sec-using-options" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">5.2</span>. </span>Using options</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">This uses the current value of <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code>. It directly expands to the +command <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optk@</span><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> and is very efficient. Usually that command contains +the value of the option, but sometimes it expands to something different depending +on the type of the options. For example, it may be a length register. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\letoption</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">If you need to use an option in loop or need careful expansion control, +it is sometimes more efficient to <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\let</span></code> bind the option value into a +macro, e.g. +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\letoption</span>{/my/option}<span style="color:navy">\myoptionvalue</span></code></pre> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\edefoption</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Same as <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\letoption</span></code> but fully expands the current value. +</p><h3 id="sec-testing-options" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">5.3</span>. </span>Testing options</h3> +<p class="p noindent para-continue">All these test take true and false branch as final arguments. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptiondefined</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Is the option defined? +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptionvoid</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Is the option undefined or is its value blank (empty or spaces)? +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptionblank</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Is the option value blank (empty or spaces)? +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptionequal</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Is the option value equal to the provided value? +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptionanyof</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Does the option value occur in the comma separated value list <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list</em>〉</span></span></code>? +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptiontype</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">type</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Does the option have type <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">type</em>〉</span></span></code>? +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptionnil</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Is list option value empty? +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptioniscode</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">Is this option just an action? i.e. it has no associated value. +</p><h3 id="sec-list-options" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">5.4</span>. </span>List options</h3> +<p class="p noindent para-continue">These are utility functions for list options. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionlistdo</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">action</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Perform <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">action</em>〉</span></span></code> on every element of the current value of <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list option</em>〉</span></span></code>. +The element is available as <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#1</span></code> in <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">action</em>〉</span></span></code> and the iteration can be +stopped by ending with <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\listbreak</span></code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\letoptionlist</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list option</em>〉</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\let</span></code> bind the current list value as a list of comma separated values in <code class="code code1 language-latex lang-latex latex colorized">\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro</em>〉</span></span></code>. +This is sometimes needed since the internal representation of lists uses +another representation internally (in order to contain commas itself). +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptioncontains</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">list option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">true</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">false</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">Check if a list option contains a certain element. +</p><h3 id="sec-showing-options" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">5.5</span>. </span>Showing options</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionshow</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">Show the value of <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code>. +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code>Ignore unknown = <span style="color:navy">\optionshow</span>{/options/ignoreunknown}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,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" alt="Ignore unknown = \optionshow{/options/ignoreunknown}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.273em;height:1.093em"></div></div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionshowall</span></code></span><code class="code code1 language-latex lang-latex latex colorized">[<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">bool</em>〉</span></span>]</code> +</div> +<p class="p noindent para-continued para-continue">Show all the options that are defined. If you pass <code class="code code1 language-latex lang-latex latex colorized">true</code> in the optional +argument it also shows all the internal values under the <code class="code code1 language-latex lang-latex latex colorized">/handlers/</code> which +can be a big list. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionshowpath</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">Show all the options defined under a certain path. +Useful for debugging: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\optionshowpath</span>{/mybox}</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABZgAAAGHCAQAAACXa/8SAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAJb0ZGcwAAAhIAAAIEAGRDFR0AAAAJcEhZcwAAASwAAAEsAHOI6VIAAAAHdElNRQffDAMWIC0wCeGgAAAACXZwQWcAAAn2AAAM5ABwic1SAAByIElEQVR42u2d+5WqStOHn/rWmwAnBHYI7BCYENghMCE4IWAIGoKGoCFoCBrCGEJ/f9Aid1HxNvN7eq1z9mDTN7qhKKqrzNGNRWz467YINBpCCCGEEL+T/+v9NQUOz27iy6DREEIIIYT4hVivhvmbvfv7hEalJMDSzZ81LK80GkIIIYQQ4pn8r/snSwhYPqVVITHwUsYPTxwNIYQQQgjxRPpMMhLgpXS8T0WjIYQQQgjxK+kUmC0gYelkswtoNIQQQgghfi/dGuYEWD+7eS+DRkMIIYQQ4pfSLTCnHGSzW6DREEIIIYT4pXQIzBYSyQThiEZDCCGEEOL30qVhTpEJwgmNhhBCCCHEr6VLYE7YO5kgHNFoCCGEEEL8WloFZosIZbF7RKMhhBBCCPGbaQ9ckkCbiGgZEfDltmARCREAW+Zu73MEpEQEwIF1OVKfRSTAwU3bKrSUEFi7huGDhSS+xD1L12kYYSEpCaFv0ZL50ebY8na21mwBE4BTD4aPhhBCCCGE+BW4lsQ3m9bjKxyOmIBF7afU4SDhu3J0Q1CcG/h/xC3lBv680P+d4XBkhI16Mtfe4qxx6JukKH13amNrj2btpfaPhpKSkpKSkpKS0m9ILSYZZ4NAB6xI2LNmzdFzxMwiS1kQsGZdBLWOyArB/ODj5CUtJSYEwLKm5Y3ZkHBgzZrjLxPLmqfbzOuJt0yZMmUPBCws9TX/4wDMLK6dlxEDa/fZ3VmFxBZCCCGE+OU0ZWhmFLre2i+5PvabkqaXif/HDseGyB8N2fjjRUmE9SPFL3nepPj7qC/+PmmFib2euKGjZubrLx0vWnXUMke+vKiUJ8VR0YK39rlzNJSUlJSUlJSUlH5Dah4IcCw6Mq/8Pyq/e4HV4Sri6FE8Thvn18wqvDC7Kx3JBeaKeFsyrVhVjsY+b02o9eLw91EcrovHbSJ0S497RkNJSUlJSUlJSek3pKZJxpAg0F+Vv44GC3O3PR10e2+YEZZy5tvuUgsq56eVUk5sy+WBO5CbTsQWlQ7nJhpf9U17bs4SOG7qw835AiJWABbk/+ejWsdVoyGEEEIIIX4wbQLzuSDQ+w6PEnXRsxEZz629dXHVjjn/a85Z3NGWuTjfIu8Bo+3sZTWvmzIHIpsBKwLg84y4PGQ0hBBCCCHEj6YmMFtIfDYIdJcDtnPCJxQ65lKNaeuGvy5y4fWkYc7F4VYdsA81Ep700e6TJZDahgiYujNC+qDREEIIIYQQP5q6hnmICUKHYHxWWwuw5ABEVhd5B+iXgabWOjf46Bfhy0Yhn2zJBe65++IcMsgQQgghhPj11AXm9L5BoAvncl7HbCExsHdDxdJcBD6J20Fv7kMtd+5iLv/XJ+e582gIIYQQQojXpyIwPyQItPfG7Df+XaZfPgrIw8w32sXphe/r7NzJCokthBBCCCHqGuYHBIF2e+acNv5dKjDn2uKTYUYuOoe9uUvaa5vl1stA2hYC5dGjIYQQQgghXp2qwJzWXbndhVwIjcFCb008fFtdLhqf2rg9ltWksJMucltGCny5L6bAxFL6eMxoCCGEEEKIl6YkMD8qCLRbsyY3ysj1y4PrtNCfcRJjc+1x0Cr65sfWR3HcUibA3E3BfbGmJVj240dDCCGEEEK8NmUNc8yjTBCOHpL7N/w1LZBzI4rSRjxv4AGTWjAULPYCszf3sIgM2BZBV/6xBxaVIChlHjcaQgghhBDihSkEZgtIB3tDvhE3Zw9ExBw9M7cR2aT8p828frl6xhcHIGRVFpkt8pv7lrlwbSErAg58HvXN7sA/DgTV854xGkIIIYQQ4pU5aZgf63N46Wvsj6OX2cJisNBS2xQmFpUtgu7AR+7bmZ1lFltsic3YEADbPJi2BSyakf1crm1uF5nlgVkIIYQQQgDwv+Jfj/UJMeUY4a97w98WSEiseuxfPZvb2gcrAgImlHXSa/750r1vjLpPZTe3kAkRCz5qhcpDhhBCCCGEAAoNs4XEF3mruBF31Cz3OZQ7uL9MSy7kDkzd37Y2ui1/Kjlhz6f7yPN6U45tW2Q/v/kvrnplfvRoCCGEEEKI18Vc/r8JGf8eGdXOMiZs3d8BOWNiYM32nAhrMREB+1vdwT1+NIQQQgghxKtyFJh3BO6/h1b8TcCnGx6y5JFte/hoCCGEEEKIV+X/wAeBfqjoaikBhxcVlx8+GkIIIYQQ4nXJbZgfv8Ut4ZKA2I9FG/6EEEIIIUSBOcB24P48sNKYFfDnNf0cP3o0hBBCCCHEK/N/YMljTBAszgNRW8AMmL+ouPyg0RBCCCGEEO/B/3hcEOiQWeFT+dAT4e+5KCS2EEIIIYQo8X8WkLB+iLb3VMeBjxfVLz9uNIQQQgghxFvwPxKCB2lUt3wQAweWLyuSPm40hBBCCCHEW/A/Ih5kguAOrFk/u8NneNhoCCGEEEKI98AICW6Li/eTMI2GEEIIIYSo4CP9CSGEEEIIIdr4v2c3QAghhBBCiFdGArMQQgghhBA9SGAWQgghhBCiBwnMQgghhBBC9CCBWQghhBBCiB4kMAshhBBCCNGDBGYhhBBCCCF6kMD8YtjKFs9uw03tn9nm2W34rbz73PmJaD0IIcTPQALzS2ERMYdnt+ImDkSWPLsRv5EfMHd+IloPQgjxI3hJgdkiW9nKVtfmtdhiiy16dj+uIAXmz27ETcyB+NmNeBUsssQyyyyz1d3nY2XuWGALy57df6H1IIQQP4OXDI1tMSsAZ9fl9Z1au49n9+Tinn9zcH9ae5kQE+b9Ys3cXaRLtIAJMbnItmTt7iiU24qY/y5r34DWhyzd8hml3FK7rUrC0odbjzcmLXVV5o5lTIDPe15pMYTx14MQQogn4F4wEef/uDav/9/q2f24uN8pjknjaMCikfWb5IJyE75rh1YEj+3FTSVm/h/xM0q5tXYiNre3/tJRJ8Xh2N2zTqVrroySkpKS0jumlzTJ+LUkNAwyLGJHAhyY8sU/puyBgIWlwwq1mAUBsGfKlDkHIGZlwX064eYcGNdq81jabZ+2e0ux1ML71O623FWzXGplae64/DqHQ2dJbTRCSy2zzCZVQxJv7BRbfK/Z8/O4w3oQQgjxeJ4tsbelmzXMGRkZ6bP7cWGvQxyL2rHA64azytEZDsc34YBSjyXMSkdyjefitvb21DnDEY1cnuNWDXNvKd2l316711HfUcPcOnfyWi/+zkJY9DhPxdxjUjp6t9nz89LY60FJSUlJ6fHp6Q1obdSNAvN7JjJc3dDCCz010b9djO4ptSbeFOdfLwKmrFh1CQFEw9o2uLaAjMUlRiiXl9I9GrfX/gCBuW3uXHWVCRvmO8Xa8mYeeZKxx/AxHXk9KCkpKSk9Pj29Aa2N+p0C847vxrGA77ZHrbdqPqs9LISmmi7aiz5XawnPiYBsmn155UTMHQXaBwjMu7bxvkbHzCo/h6iYJaWSiYh/zop7XHq39aCkpKSkVE+yYX4RLCZsOpRzB/65r5bs+4HFxgTA0tXz5x4fkrtZoi4JrrOefRJv7firfe4A09xe3Qb3ziJiYO8+3BbcnClrPk+/u61b39fXxw/l3daDEEKIGhKYX4WWDX8AHeJJvhXrvKuqXFRqiNfu4Dei3UtQfDfvs++9Katr7hz80cngkvIXqMKBnvtyH7c58xPA+60HIYQQNSQwvwQWkLJ1A/XGFviH7/Zs1lywbhO6t6XfR8cdWJJ0+p14MSzjTVra2vq+uTMFLtExS6i7C++1HoQQQjT53yWZLSYG1m4NFpIQEQCH9qAOFpAQe6MA2LNk2u6+31Kf68CaZb+L/yF5LSU8trM4lhEBX27r+5GLilvmXWKqxSSEp5osICYiAratZhK30KEj7CDXGB4GnBH5se+i9AgfcnUtJC2Vm5wEscaILElIvMA2AhYRsG1eb4vheNyCvF3dRgNtpdjkvAa2s/awCCezdOdfX+5Dz9xxB5uTAslDXNv1kF+b8c05/Azc56vY4v4aLD7lfTAjrwchhBAP5hKDZ7+JKGs4nio5LSvyTpq77flu+lUg8NuMTnmyrm1FQ/P6XFnLsbglDEiL+7lGrl3l79E9BLDhe2gokcK519lgCATt4+hwkOCobAgbcnWPo91MLTXsxhinimeG0ra5Shtj7wxtx4IF3zhm1dFsL4WQjF1xfMPqmM7V7kd3xo6MCSkzHLtODxx33fTXP3cI/T86XRASsCh6no/G7jQSbRtDj1eckJlf5d8seryMTEqj3OJvhLhUn/e+UmnVilV966u/3qcD3yxY0XInKq7kppR3Vh0PompNw3p24XUaZT0oKSkpKT0nXZbZ77r3j5JN6RHUeFB5AXWXe0QuBJOa7+DCJ3Be3sqf5UXtWomD8/YIzAkbjgLBSaBvCBO+prz1x1p3TYFqpIsQ0vmgr+SLSIpXhiH5e/wZ+N82l13diwTmjBGERGIysqaDNFKyk4dkopO46ufJpixEtpdC6D1253Nz5v/KSp6HO2r3/kfKkfWiXFDvWTd3EZjPzx0/Sp15uq/pcXQbZ+T/yxo5Z03Bnagi1uZpUXudqZeUtbWqckZKV2tb1mYRa7GcvssvypUWrIb17OIrNcp6UFJSUlJ6TrrIJMMTA9PcvMICjh+0U1tXDDMOrJmePpDalBURATM+SrkW/uP+ki//UTUgo30/+SV5u5gRMD2aD9iEDIBJ2RNAYb4x58t/6k+ZAbiPenHD/Q+UaH7aTylttGrHXOXP6UhGIU0b5t6r69YYgK2IgY/eD+BzJrebArg1a7DGxjU3B7ADE3JPyf+OJhHuYFMWRKSnD+Dtpbg9XwAWEQLLZm+6agcyILTgeC3d1v6xIrXD0CvzsLkzJQVSm7abIri1TYt5EBIC+5IRz7bzGudjkkcUzL1rpET8rfQxYuWjTC5ZExKREJAQ2kepJ0tCAnKDmgNrlr5VueFU3pqS0Ykl+Xpky9r/GvsWtI3zsQ0HlmzZkxtkBczsUNyx5gSE5LM/9iX19uwKRlkPQgghnsQl0nWheakYVhTansoHxxat7VFnFDaO1LXTXnPYevaQvN0a5noIj/zsTeVY7ru48pnb56sHEKkbdwxLm/oBvs9/rK38sRgS42+Qhrn020VX1xu4nKl/NdzQZNDMizuOrxpXxtGia+ws5Uxv2s6jZTaywfX4Q66e/8i5c0bH3GjpmSAbxT9WlbXcCKZDUOjui1lA2B1n0rezmH/5eLZorfPjUWvba1e9aMOqsp5zs6ZG2UN7duUsHm09KCkpKSk9Ol2jYV5Xtze5uYVMgNCi0y9NbZZb254QSltfUl/eZy3rskVvfEnePqr6vzUpdT1r5H0Xl3V5y5Z8MB3sD7lMbXOYJQQDNgPlOQIiIhISG0vHXGfQ1R3Ikpjkgs2M1xK6tjoe4ZOgWseaiODcxjPPY+dOr475SrblLy5ubR+sCJjYaRvthBCYl9es29sHG0KSlnH6IiJiYX/dofjO869lY28EzBuzcdq6eXPivx78Kx90UwtJCcpfIS7q2XU8aj0IIYQYn0uk667IYUNDNVc1v8ctaa2bgByuov28IG+vhnk34OwWLRtRe8/HSCxwwzTGRZtzHd3mnLbqKg3zoKs7UMMc8D3OmJ3RMDe3nLb2e1QNc0ZDy3mmlXewXx06d7w++6yO9CIN89mr0fxSU5l7bTrmPDD3osjTurGVb1pnP5t62/19o60N+WbImsZ+aM+uvFqjrQclJSUlpUenUfwwu4O3orzMq6/PPSgwwiV5+xiiIWpzVXeviHi5A7flJZort+aDPRB5C+w7c+XVPZ4ZP8D77PkALuOPypcz91+rzv1h3nYvmDu5VjMdM7Jjix4919b6IDCWEADzpobYrdnTGizG7fkHJJaxAJauXXs+ByI2llXtwN1fZ7XvLnkdLe4n3d6voSt6dvWIPWo9CCGEGJ1rTDLaGCCyWFATO/OH3bBNMJfk7WOIUUGep/pYO/qSHp+Esxv+6riDTZkBqS1v9Gw77OzrBdI1KSn3MR55ESwi9hvW8jnzOIFo8Nxxa1sTEzC557Vwh7wWvxXy6Om8jTVpu9dkt7YvMibAls+OiqZExIRMmFi+KXDLlnWL8UZ+LQLrfLUcZkBT69n1/IL1IIQQP5OxBOY1E1r0NRaREBLeK6LcPfC21nHl4ZjbSd8jSPAaiC8ueen9BPTvuvfCSutj/hIfDR1XdwARY7zmvCgWkpISsGTLlD3pBUGox+CSuTPNvT3Y9EaRbwhR6Zq319bTBje1iAT47GqpO/BhKamfkSFhPpttybwm/voAO3fp2XXn/+D1IIQQP5mxQmO3aGAttR0bJiTvJC4D+SffgNXx46nNTjHwxsZt2V7+QHeHIaGtC4GjO9cw4el6/XrC/h6j9gpYxo4Ja/64f27q1o+PH3fJ3Mkd5BE8UKS/0vzDAq8X7n2lc3P3l//4x5RlocVOWNllZkqHQd+cxuMHrwchhPjZjKVhzkWyQvyygIV/4G1Zs+Xg1oX33iO5gDHssXpJ3ts5+D7tbA1FiOiWD8TX+NJtPDDnzCx1l+6dP7axn23JVKDKuaDZzbwXayYtJnzHYMAWEp+7HrbwWtCrfR48fO48Tsecz6rjDG0TEPvMVmZErInJrNMHdO6xxR1YHvXrFhOTEjCxbWmnw5YY+Hfz3odqz67kXdeDEEKI8QTmo3B8JCMGtnz16FPyh080yC7wkry3MwGWJJy0XGs+mxpELzRdiG1dNQTCktkVzqaGaX3PCcyXWJBfrotL4C2daIXnrodluf3wDeLyw+eOW9uWiGAsx2bNtWgBMXDwK6XvG0jnjLIJCXv+kZKxsL9tenvbEFndUdyatS1z928lI5W9r+0igflsz67lXdeDEEKIcQRmi6sbfCwgBQ589Im3bm0HAhjyAL8k7829iQjB/bOQhJCAPcsOD8Sj+NJ1B5uTWtgqGnRoDy3o3VJ1IvczndS3GZnXmg/5PFy/uoPHMSC9zP/HG5HbtPdoCy2DXk/Zd587LcyZAZOR1lBzLebmHkfhNJ9bSbN1lrZ4Os9/icnIrZenFhOzsI8OP8wt5bqtzZlURPQlGQGpNb02YxET9q3X6FzPruJHrwchhPjxXCMw1wwjLPDuzfbFh0//ub/xqKubVOThQCZWf3S2fay+JO9t+Fa6/bnPp247kgVkx955C5gZrSJzUpzZ38KlHQgIG4J39ybG81d3KElX+ywgYXtxGJSXweJ8lBo9uMBk6N5zp7XOuU0IW2bDddTWokXV14hcmAdmVELKFzOq0QYLWABT/xr3jx0RWaevjLZe166AO9icCTBrEbwzYrC2nQlnenYlnetBCCHE63PNpr/IShuHLGDmBeTiceIfQZFVPsda2hIpDyBkUfYPa+2+Bi7JexsHyDWEj8It2bd+oA+BWbMlJSG2JHRYZlndMy1HsWRSGbW4R2A+e3VPY3R6WbGoxbtsyqFNMLOAHTM2jxzhM9RF1+hKW9XxX97O0jl32smv4jhrJiQ7zSqLWREA5WiCXxyA2GalfJHP1+YQcUHA9qjzdQf+Aal1tXZS/8VSUuqzesqW3Gtz5epYbjTWvgXvfM+uoWM9CCGEeAsuiXLi4105HAtiBxETdv5IJYKVjyz2TUbkICBhVvyYtZS4IyV0EJfyuY7az+btifRXi2HWHgvv1KdKyppxBsdKZLRGgmNS9LiIVUbkI/3VY881RtfhIPC92RwjwhG3x2UcfnWLvN+kxP7aprUcER2R0XyfHO5cpMJGfUnH8UZkurar2lNKVC2FVbU3zfP8CFbHf1JuDatTfn88rdd737nTkXvXbAsTMp/yVbIq/m6PtHf6544JMalf7815EvmR2pEVMyWfjUElV0bmy1gc6yQk863N2xK01L8iIyYmIStWRVRrQ1D8svG5T/M6ubZnF1+lzvWgpKSkpPQO6bLM+YN/UzyATqkWqNaLIM1cjrogO2vJ5UWqRv0D894sME8a9RzT7h4Bjn2g3nbxMi3+uWLFrDT2dRHVtfWwJLQ4VixKwkNNXB1+dYvAwuW0aCktcjQTSfHPAWNJRExaBANPifO2+OO70vH81SwmLkT/XDwKukspallQBLomPQVQ76w98bOhCEvNhI2fZTtC4ryM2vkJ8SVB0G+dOz3zqRQi/rgGOlLba1zem+ZqnLWEoI4K4fSUVrXRX7XV2Sg/q9T/TVtrv9teSwgKsfdM3qIfA3p24VXqXA9KSkpKSu+QLsucCyIrB1npgfXdFNIcpJVH2o6MsF0fWClrR9Ylxg7Pe5vAXGt5M91FU8iKDo0rUUOgcGyaD1//v6y1hLrQ0ibaXHB1K/ro/OrWRepvNr3zaMeqveSWcammuOP4qkP4i7tLKWoJyHB8M2NxFJz7ancQeSF7RkZ2HIFCm7nzwnfz/AF9Hm/utObO58JJ/x22iLSnq98i4LPI+1G8sDj8V4nW+oJCU5zP3KaYmrXVWXqxyo8mlR4khMya95jOXscsqveOthHL/ze0Zxddo571oKSkpKT0+sncBeYbloesXbsP8N4Tgo6QtHhXTHlkq32/9Z/PeWB9fiPYJXmvwUI2ucUia7Z5zywiICAm8R6Z/4zv3M5SZt1efS0iISIkYMue9eV+ZS0lJiRky7bd68dlV9e3qePqWsqML9e7SeqsH4kHYyEREfs27w0dZwRE3n1iaZQsatkOeN+W986dRu7KdR5h1MIW/9Ad+Y4r6uY6g+MIe38vA1pQyt15P8pvh84u6dmgegesByGEEK/MDQLzz8T3cdomylnIipCbwlV01huwY1/zsvuMno9ydW1Bwn/9wpHNWjd+iYu5bO5YwI4A+Pu+fkruRVlgHrXcAetBCCHEKzNWaOyfQ+4TolUgdnu/Az8cXtxQ3IElbb4m3hALSZifFQ/i2+KmiSOXzR13UPCMxzJwPQghhHhhJDC386gg3GXmHP0jvzspZz3OWnRz3DRx4qK547745EP65YcxYD0IIYR4bSQw18nFiJm1iMxFAIO7aOjclv0PEZiTAWFOUuk5x+PSuePmMoZ5IEPWgxBCiJdGAnMN9+UDHewsKwdescRmx+2Ad9OMzglseBCKF8ViwnNBhC0mVhCHUfkRc+cnMmQ9CCGEeHUkMDf5YAkETNiYs52t7NscC6/B+7qjZ4c5XBC17VVJOKODt4AF/57dzB/Gz5g7T8Nii4+xAMv/HoGz60EIIcTr879nN+D1cAf+WUzqxY+w2OJ3YM78nna37mBLEgveeXuQBaSsz4zSjC9Z0I7LT5g7z8MmlAO1rwBsFF84g9aDEEKIl+cigdl98UJ+c++JW7MufBED7Nk+RMRbkpDyFH+tI13dBM59gHbSLt+DJ86dt6ftNWMcIXfAehBCCPH6XOSHWdwf+2b7zn6ubUV0j8Au4jzvPneeiYU1Z5H7cbTCWg9CCPEzkMD8YlgI7/wBtxyFTTyWd587PxGtByGE+BlIYBZCCCGEEKIHeckQQgghhBCiBwnMQgghhBBC9CCBWQghhBBCiB4kMAshhBBCCNGDBGYhhBBCCCF6kMAshBBCCCFEDxKYhRBCCCGE6EEC8wAsMmfRs1shhBBCCCGegQTmIaSAgtsKIYQQQvxKLor0ZykJsHTzpzY5IgNwHw+r8Zu9+/vMPgshhBBCiGfxv4tyh8TA9sltDogfWZ0lBCyf3GchhBBCCPEkZJJxngR4qk5dCCGEEEI8DwnMZ7CAhKWTBbMQQgghxC9FAvM5EmD97EYIIYQQQohnIYH5HCkHWTALIYQQQvxeJDD3YiGRDDKEEEIIIX4zEpj7SZFBhhBCCCHEr0YCcz8JeyeDDCGEEEKIX4wE5h4sIpT9shBCCCHE7+ZqgdlCm9jCVraymcW9+TLbmTNnzjY2saD2e2orW1nk/4ots5WltRx5PQtL62c3aott4evaWXZ5XTUSkMAshBBCCPG7uSzSn8dCMpLSgdSm7qs1Z8ak9GdExMQ+K0YOefTAwIe8zkXvIpagBSxKcf0SMpt32RRbwKzUqpAJqX247dC6WkjZumfHNRRCCCGEEE/lGoE5JiXgwBYICQGYGE2R2Wbk+tutF3ITQgIW9ukakfMsZdY4FrDC64PZcgBiJrTqhEt5l+yBmIiAVU1k7qyrpUSFxBZCCCGEEOAuSGT+H9+kxbGYnf9nXMs9w+HYlY8z8f9IamUeS56dfnGw8v9YEPojgS/V4Vpr2xAVRxK+cWwa7W+tq6W3M9yxXiUlJSUlJSUlpd+aLsuci5rfJ6HU4SDwIvOqcjT2eWsiJ6k/HlTKbCs39v+Y1UrwInNrbUHlaC6e14Xzlrpa+hrgWDz78igpKSkpKSkpKT07XbPpr2bX6w58AhAft9MBkAHw5fY1jfacJRBUbJsBDtSNJ3LTi7X7rOVsM5OY+NoqIUbclC3Q3JLYrKuJQmILIYQQQghGcivn1uRicbHlziIi4NC0VeYo8Ca1o9OqCGuBz9FWQg3LN/PtW2pb0iYwTwds5UsUElsIIYQQQlzpJaOFJRPgpGHOhd1WDa1bGkBoUUlsPbhpLVt0zD2g9jzvvsO9XVj7u1lXAwuJmSskthBCCCGEGEtgrouWuZC678i9JQLCkku3pmgddxxvI/JndPiDtrBiGDKkTBlkCCGEEEIIYLxIf7noe9Iw9wcYOdRyd4vW41DVMQ+pK1VIbCGEEEIIAeMJzLmAPFTsDQbmu4wvZx3pQl2xQmILIYQQQogjYwnMubb4ZJiRi85hb+5+MTYvYZhofUneISgkthBCCCGE8IwlMOei8ckmOf9Xq02xRZU8XeRCcGRDxOCe2q5CIbGFEEIIIYRnFIHZQu8Vo76JL7C2MNZH/8q9Pijc2uurE87ituyByEYRmRUSWwghhBBCnLhGYG7qfPMgJaVtcm7v/SdP6hpii73AfN6/8rK9hFZNcu4oLmvTRw/SUdfLl8AshBBCCCGA6wTmyCpR+mzmtcBV78ZfHICQVVlgtYgFAMsBPijy8kIWlRLSRoxAwM1ZAxGzqnhsgWW+xoFYQMrS3ddrhxBCCCGEeBuuM8nIbGExWGipbQoTi4rO2B344ABE7Cyz2GJLbMaGANjyeb4St/cic8zGUgvBYpsx68j+jwOQsLGJRWChJTZjx+RC22Z5YBZCCCGEECWuCVyyBRISqx77V8/mtvbBioCASUUrvObfsBh67ssCUiBkBnasaelNQKp5D/aXBREhWZE3Z0Bw7RLykCGEEEIIIUpco2E+uL9MSy7kDkzd3zYR2G35U8kJez7dx/CQ0+6zcv6eqfvb5V3D7d1fphVf0AfmfLgB2uwjCokthBBCCCGqmLv+1DwU9ZrtOQHTYiIC9tc5a7OAmIgD62FnW0RMwJ79pQFLwCZk/FOMPyGEEEIIceQGgfknYjsC99+zWyGEEEIIIV6HsQKX/AgsIrzQ4lkIIYQQQvxwJDCX0YY/IYQQQghRQyYZJWwH7s+zWyGEEEIIIV4JaZgLLJFBhhBCCCGEqCOB+YRCYgshhBBCiAYyyfBYwI6t+3h2O4QQQgghxGshDfORhED6ZSGEEEIIUUcC85EIGWQIIYQQQogGMsnwWEhwTRxCIYQQQgjxs5HALIQQQgghRA8yyRBCCCGEEKIHCcxCCCGEEEL0IIFZCCGEEEKIHiQwCyGEEEII0YMEZiGEEEIIIXqQwCyEEEIIIUQPEpiFEEIIIYToQQLzy2ErWzy7DTe1f2abZ7fht/Luc0c8G61eIYRoRwLzi2ERMYdnt+ImDkSWPLsRv5EfMHfEs9HqFUKIVt5WYLbYYostGpAzspWtbHVB2ZmtbGXpUzqWAvOn1DwWcyB+diNeBYssscwyy2w1ZLbeRGXuWGALy57df/FmaPUKIUQrbxsa2zd87T7O5oxZATgbXPaKGJi6ryf065uD+9M4GjAhJhe4lqzd1SK1Bb6UvdvfrQ8rYv5zI+o6LWBCyNItH1/KbXX7uZTz4dbjjUlLXZW5YxkT4PP6uSJ+I+OvXiGE+Am8rYb5Z2IpQVO/bAk7Jhz1kwkzW1lwZRULVqxYcU/9+RJGLn/ChISF3ab7uq6Um+p2H874y3bU0WilMXf2vvVCXML4q1cIIX4A/3t2A0SFhIZBhsXkG7n2LIGAhICYlX1crgWyhJgD1wrbA3Fzy0iYjjwuADG36Gh7SrGUdYfO/ea63dbW3NscozF33NwyAkJLL9cxW0hMCBxYu5KwX3pp2P48HWTjlejgHvCi89AeJkR+Jm7Ztn8zucPqFUKIn4B700RGRkY6IGec/+OCslc4HNnD+xTiWNSOBXzjcMxKRza4Zs4B5QfscI/oHTMc0cjlORzxvUrpLnuMuslub/0VcyevdXVxSbPKgWKmMCkdvXj2vXqq9O6YRpzDz05M/J3klL7b7wJjr14lJSWln5De1iTDfbkv93WDLW9qqwdsw7qMlPyDaJkJAbB0n0XPD3xwAJKLjQQmhOzHMQ84M35zTprZMfhiypJ/N9oAX1fKOHXfm7a5M+UAxJfMEwvZ1D7In4w6yjrl11o59+LO32Ieh83IfG/WrL25TsDENi3GXWOvXiGE+Ak8W2K/f2rXMPfp/J6mYd7xXTty1C+HteMpjgu1fIR5r3zPb+zdOZ0pm3pfXjkRc1/97/01zLu28b5cx+zn/oqomGWlcomIL/9i8y7J9y5Ps3tfsYf2LJ8H30wI/JGQzN9bNsdjpfxvtXqVlJSUHpHeVsP887CYsLHhL/b65bp1ba5LTC7a+jcDDg+zTVwSPMkx3zW8uSOt1rkDF+uYLSIG9u7DbcHNmbLm8/S727r1i2vabyDvXZ5ewZ+1BZaNsYYsYgIc+HDTo+W527svvxk1atkY+l6rVwghHoAE5tehZcOfF+Qam9HcwW9AGyzoWUIMzB+2Veu9/Lm++wfotrkDuIM/OtRXRv4CVph2uC/3cZsrP3EDKRNmI5iN5aLvvL6F0e35B8Ck8eL9XqtXCCEegATmF8ECUrYNTXL+sGzT6W1Lvw8pPeOR+mXcgSWJhY+q7xYs4y3a2dn+9rmTk1/xoTpmCUmvRFD67y2EXeW4vX+hqr0wvtPqFUKIx/BEt3IWkQB713SjFgONT78+v3eGZClhWy6w1BsyHFizrGtULfT6llzULG2caw9TYnERMGTL/H7BPjp0hD7ISOdZQx9pE0LO6JfL424hCZEfxUrIjgvGb0kypnsqiwjanJlZTOHk7BiWpdtsoFmKTc7rX7vqLjlgg+XTnJB16JcB3MHmpEByk0O+Ecivzc806LDckOV+d4cxaL9XbDt+G3n1CiHE2/M882m/Ca2xeYgFjpYNbX4bzsT/1boxj8AfP6ZvsuompeNfzVQqxZfdKM0NcWN35Whs+K5vviFoHyGHgwTHwO1cfqR9+V2b/o7HG27FSi7tho1fkXfHboSRSUt/lDZhVVoZe3doOxYs+MYxq45mWymEZOyKoxsf0mV1GtWuuovrM2NHxoSUGY4dSUcf7rrpr23uNK5+Y+NoqReLouf5aOxOI9G2sfR4vQmZ+Y1j3yx6NoAGTErjvGiOEnGpxpXfclhu14rVccaSVI4uihJmhdu0BZGDqHlu7eykq8XDrxipd/KYj8Ksa5QHX8vsNJLVNpCyuu7+42dx67l+PbdsAR5n9SopKSn9lPTcyvOHaO2xVfwjaM3tH0htAnPhodhxFH8c7vgY9XkuEZg3HIWHkwfTGx+IHSMRUhFLq21tPSP/bTOo9Lw/x1eNfoF5Veyd35R+nNXb1Dd+lRJvFhKJyYod/WWBOSU7+UgmOomrfh5Udv+3lULovXnnM2vm/8pK4lVH3b6W7+OYOhxEuaDe2oc7Csztc6eSY1a9hu2zrDM1XxTy/2WNnLM2sZ2oJCwf06L2OlMvK2trl8+7qLePoHHsu1ZmsU4qr8A9r5tDrhhRZY34mm95qSYqj+SpDcS+3VeKsARdL1Te+3SbwDzK6lVSUlL6Kem5kf6WTIC47D/WEnJ/rwFJ+TOzRYTQaamZs/CGAku+8nwWkFW9yro1BmArYuCj5xPxBJgeDQ1sQuaPfpYzXRUwuflxv82L7hAG2DD77X57N+zzagxMmboDWMDRXCG1dW6YccH4wZzJ7aYAbs0arLFxLTflsQMTICDj39Ekwh1syoKI9PRJua0Ut+cLirm1bPalq24AMiC0oPA7sLV/rEjt0G7c07gu48ycIXNnSgqkNm1bPW5t02IehYTAvmQEtO28wvmYzDmQO2SDlIi/tV5GrAjI41SuCYlICEgIK5Eql4QE5AY1B9Ysfbtyc6i8Pce7wZSjPW5uNBQxOxrFsCcgBQKLmRMQks/o0zr5YlLUdBNFzw4s2bInN94KmNnh2o2SbmtrP5KJHfsb2Ky4h11pItFjitW9S2KU1SuEED+GZ0rrXp9S0Zoww7FgRU0jVteLNjXMhUaqpkk7aiFrR/Pz+/ww18xCfDkVnW5DszUsNfTCfLfpjgZomM96w/XR/Uo9PaNhrsX4KowSau3rG79Krh5jgYvmSofGr9CL1/R6+dFhpZzrS8dZLbONDa7HH3JZPz7SzOmaO7U8vTrmRjvP+Ogu/rE6fW8h9nr4+jefo/a+mAWE3ZEqfTuLGZiPZ6d2tKwtXuRt8Z7LN/XW1s6M2+fH+fnW6Nmq8h0j19feNOcLbfIxnQxNRv+6dTTW6hzfkVavkpKS0vunp2qY3dYOBIQWlbZLJeSb3GKSii4318f1aW5yLczafdaOL7nWo2hVU7gmpa7TnXLNRp/a5jBLCO62vWbStTmyg3V165qbW8gEaldpKEvi6peCOxG2xnx8xC7/ah1rIgKLB4z2KDNn8Nzp1TFfydZ9nP5wa/tgRcDEyltjj5tNy76c9/bBhpCkZZy+iIhY2F93AMuIgH8DXCF+Hq+/O9gfogdsLZz4rxL/ygfd1EJSgvK3jUtxa9aW+vIh16avmd6lTzOgc8Pow1avEEK8A8+V171G6aQ3znXOx2hiJ61orgkpadLqGubjBrnWDUUOd4WGeTeknFFGYUGrbfTtGua2DV/nbJgbx4NW3eEwDXPA9yVx5npK6tcwN+2/W0dnVA1zhuO7po/vb+UdLEK75k5rvvO640s0zAOuBd+06lv97G3TMYd857/4PJOedrR+CRoyE27VMPu7TVvP8hU3aG9Bb6vj0r6J1X30vG3fzGq9HGn1KikpKb1/erYf5nr4jQQ4FNHETsfP65e95nfEMAsPchJlIUlLLL9xyDVIN+kV3cGP+xVWn+7AkvgB/lyfEJfNfTlz/7Vq3R/mv/aCuZPrCdOLYkP297+p8cy1qoVPX0sIaHVm6NbsaQ0X44NpJJaxAJaDLO8/B+QZl7zly5ae5fbWN1lIW2gzbx+dE7OzbLwr52vJLaMP3aP3sNUrhBBvwJMFZrfMtwwVN+WYoxC9pPxAzQXmvo+S53NcyqO86iZct+HvbH+P2/1uNve4RRxdw9UmMW+CRTaxzFa28jP2cSLG4LmTb18kGBzz7wp8/MmgEO2O/svbWEP7xke35guYELAdJAo/LnrlCR8KxLJmyjNctaWTPBw2O79i9sX4BUzYHcseg0Jc/ug1tPoFq1cIIYbxXC8ZAGsSIGYOFhJxFAK3JEe7WQuOmudnN/ZOI1DzFFLgH2UnTwwlhjyQj4/diZWP5mJM5B+/Q6yb10y4Vmt2uqI/EAtJSQlYsmXKnvSeAmkL3XOnyTT3v2DTuwuYUeWKt9fW0wY39UGKPge19BnhYnzYnrGLtYCd1yyv+SJhAnwRkBESMLGobDd+Qy2z/I56Rlz+4atXCCEu4aUEZv8AOmqYMyBmyxCDjDfGbW1b2+B4/OXgBd2o86E1RKCIW4Xr09HzD8T8EX6dWUfC/oe+6GAZE0pODMFuKu9yuudOS961rYkJmDDI7d0IXGlEYIHX4MaDhOFXjK93uFKMD7wLvqmbexebgFva2jt4HOHbhYXe/eb+5Iixkx+8eoUQ4jKeLzAvmXEUiSMKT8tub3tCYqYMM7fIH5sj2/md55pPr41H0JyZpa1+HrZEtD8mzwXNHpO8riv0khYTvl94XQuJ3VnfALbwWtArvQiMMnP65k6TR+mYj7Myr6X9da9P9JsRsSYms+2LimtbYuDfiDsmAO9BJGoambgDXzYnvd1jReE9esvHuVnwnqtXCCHuw9MFZnfI9V4WuS0JZbF4yYTYAne4QGCOWs0X7oYXmi49a+uq4R2WzDrcN50TmHvHpP3zrQ85Mh0WXgM4vrBcozNL4A3dUoXnnWlZltsPXy0ujzNz+uZOA7e2LVE9JNC1NFeaBcTAodiEmM+YdlOezjllExL2/CMlY2F/77Qd9jb2vg+jf/XytuZtv+xv/zJg6dGRnBvyVeI9V68QQtyFpwvMQB7bKvZbhZal4xMgtr33eNorCLu1HQjgwX5DR/Gm6w42J7WwRTTIfT8n9Uel5THOHmLVbXHv5q2+MwPSu/n/eDa5fXiP/s0y6HkpGckPc8/caWPODJiMskaaKy233y6vYICk2TpLCWhd0xaTkVsvTy0mZmFnNaFPYElGQGrzplGDRUzYX/A6+jC8CRF8DfE98qNXrxBCXMwrCMy5tfJRBCweQF4Ejrx+9bxomAcomVj9MXzlfvUhuO1IW47WpKRNDZJb+tAu9Y/uqe/x+NSMWizwIcH3V3x+rn4xqJaasL0iEMqLYHE+To0eDDYJGm3mdM6d1lrnNiFsmU/XUFtpFtVfInJhHphR+dZRzKlGGyxgAUWQjn/siMju4Dbuxu167mBzJsCsRZzPiMGGhwrqZg8cxjG7soDM+8X4V22ZpQStnkY6V68QQvxGnu2HGXB7v7EvpC4C5j4ABhgfAMcHdcii7LHUuvwW5A+IQpi26Jn+Rt2SfcdDPBcqJpU+xe0Cs3dsddsLQmSl8bKAmR//uk5qyPilHNoEMwvYMWMzppusm6iLrtHVQsodX8666Jk7beTXcQxfHiEl38AWe9vYqs/vLw5AbLNSzqMV7bJFpFwQsD1qZ92Bf0Bqt7V2D1C7J9zuKm3KFojYVNebZbkrxzG+/bg5fxnFJMUCVqTklstVcTlmRtY6HzpWrxBC/E5eQcPsAwrnIZxrx5OjOcD5x4bb2zQ34mBjU9ZubzFJ56MxLy+1PXsCYlI+n2qvt2TSGlJ5SkJIyMr+5WNgMYv8l0bu42Pvtod1ZhFzt7aImPSo3288Os+On0VEHSOaek3s5OLtZ+Ns6qyXsvTz5jhu7bappbOOBkDVK2YTX1JOs/f3eiXrmjsttOmYbULVc3JUvMocej/ep8Q2Z0tIfPRwUzVFcAcfMDsltiVrP1OAqo9l70YuzIVNm+S1WkjMviSYT93Bu/Irj2dSiKyHVk1pbta0sSVrICr5hwktA/b5SFjVR3VUK7s2Fr5nESEr27L2ZR/Xy0gGGeN8gyleUWBNYtWXq6DznEj2y0IIUeLZoQYdRUBs1whgGxT/bATIrYfG9kdnjcI3TFrLDhs5F2fKvlto7KI9s9ZfoiJI7ooFm6JfzbC8rq3dw0auCAa8KWooj2FXCODW8SuVF7W2ICn+OSBYNLngvvEtSYnz1vjju9LxyEFATOz74siI8/xdpfg6FhRhrklPQdG7z/J92J3CUjNh40d3R0icl1IrISEeEsh6rLnTmjvNW16f1x2p5Qr5vjTX2qwthDORv0blVAv2XAS5rtTaqCErrlVXapn7RWj3cqoeiUrz/4KxIGhtyzfp2Ff4xvmxOpul/W4Q3ac9SkpKSu+Ynt4A34z8kbpoHD8Kb41bd4/Yd3oY7si6Bd3KA3JHdnqEP0Ng9rUGrb80RY520cS1j8ngkXM4VrUx/O4qr3v8/O/fbDrbkOHYsTrX1lJ7yynuOL7qEP/i7lJ8HQEZjm9mLI6Cc1/d/qos/DkZ2XEECPyc3XkxrFnCgD6PN3dac+ezKfF/hS0C7enqt4j3LPJeFK8rDsei++WHgKyUc9MUKGvCqq+19GKVH00cjuMLcGtrk476Z5W7wqR0Z3Hs/AtY0llu31jELKp3nOHX4VHp7KtAy7j1rV4lJSWl35jMPVvFPToWEBNxYH3ug6b/ELxm/wp7wS1l1u3V11JiQkK2bFneY7uc30O/zp3RWUxEwJZ1t9FE3/hZyuzcbvwzfiQejIVEROzP+WOpnBMQEUN1nCwa62P64Hb0zp1G7sqVvnnUwlb/0B052T7L54X3LHOX+n3ZL3EfGaU/A1avEEL8Ln6gwPyuWMCOfcPP7uPqH1GM8n6G/+sXTmzWuvFLXMxlc6cIwPz3ff2UiHsyZPUKIcTv4gW8ZIgcd2DJU311jIeFJK0bsKrELxnW+A25bO64g7ZziW4Grl4hhPhVSGB+JeYwgsOrVyDlrK8Oi0ox4cStXDR33BeffEi/LFoZsHqFEOK3IZOMl8J2BO6/J9U9pmXrDtyfM3lmbOXndTyeOXfET2LI6hVCiN+GNMyvxZzAboxC9nwsJjwXhdBiYonLo/Ij5o54NkNWrxBC/D4kML8Wc24O2/sCJNBvJWsBC/49u5k/jJ8xd8SzObt6hRDiNyKB+aVwB5YkNk48uydhASnrM9bJM75kQTsuP2HuiGczaPUKIcQvRALzq7HkSRv/3JczZyNYMCe+F311/ZM5xh142twRP4YBq1cIIX4j2vT3ctg323F8IT+p/Ssi/sgp1TN497kjno1WrxBCtCOB+eWwEN75k6iFBDK3eA7vPnfEs9HqFUKIdiQwCyGEEEII0YNsmIUQQgghhOhBArMQQgghhBA9SGAWQgghhBCiBwnMQgghhBBC9CCBWQghhBBCiB4kMAshhBBCCNGDBGYhhBBCCCF6kMD8JGxli2e34cYezGzz7Db8Tt5/7gzsp2aYEEKIF0EC81OwiJh3Dz97ILLk2Y34ffyIuTMMzTAhhBAvwg8TmC2zla0sfXY7zpIC80rL06Etv3cfB7dkDsR3H6k3wSJLLLPMMltZdNeqGnPnx6IZJoQQ4kX437MbMDIRMbB9djPOkrB31VaGg1t+7z4ObInb25rUvtyI2k4LmBCydMvHl3Jj3VlJtAvGG5EWmnPnh3KPGSaEEEJcww/TML8HlhL8CB3hklzfOR4TJiQs7Da94nWl3FS3+3DG3/u/qv2YuTOM8WeYEEIIcQU/TcP8HiT8iI/qbm4ZCdMRizxarMas71OKpazd/j51u62tua85RmPulMT77XlNbONl4PBYXbWFhMNbe5cZJoQQQlyBBOaHYyExyx/ymXlJatGIQtfa6xNvEZf7S5nxwf7is16E+tyxCVnx45J/Z84u5z4e+/tQkXk3vLVFvnFnmBBCCHEFEpgfT0r+qfknMCclGdEQ4YsDIUt3m9B6XSnj1H1f6nOn/Np1nW77vvbWdQ5FfUNbO/YME0IIIa5AAvPjSTjctqntdXBb25LyNVp5hzHK6i6lzz55nLrvTG3uuLltCYAVFMYO3T2c2rokICdPsA7+S+hrPtta3+aRZ5gQQghxDRKYH4zFhD/KJnNJZql7F4vst3ZS1jZ3cmMFG1hC2bThxo2VV+H27C+u+b1mmBBCiB+JvGQ8mh+y4a/gvXzlvncYjJ82d4bxXjNMCCHEj0QC80OxgJRth5eGt8QdWJLYwA/sz8WyoYYAr8jPmzvDeKcZJoQQ4qfyIgKzhZbZxpxPG5s0H5AWWma7Uo6LtiudO9vHt/NbkSy27C7R9AbpCC20iS1sZSubDf18bYGltrBv38OdZd3jM2S0W8/JLGuJYrdkVM2tRRa3td3i03ELLLa4b2yapdiEybV1g4WWdo7AY3iSftmic2M9zjk9jDzDhBBCiItxL5CY8N1yOKvkyRq/f5M0Slo1zxx2ts8RO4h8KS3l3NzTDd8Erb/k9WeELPrGob2PrSP4TXTNaB9bUjknYIPDsWktccduhLFJS3/EpeOz6nFCZuxYsOAbx6w6nm2lEJKxK45uWB3TubqL3s/YkTEhZYZj15x59Vk0fuqeO84vYz823/7qL/rbcb6tJP6qn0Yu62pBMVKTxjlpe83+3/Hpavi0uNcMU1JSUlJSuja9wKY/m/nd+gfW7IGIiABITnvjizxb7yU3ISRgYZ9DNgNdcralzO7W05CIea8H5piUgANb4BjkYWK4c14CYgJgzxLYE/oeruxv/RP+kNFutDtgRQRs+WjNsGRi8c3u2PZMgbTh6GzLlODo0cEiFny5z6JdKZF9lMa0q5RcSxkCWw6D685r2TF1f4q/56xY2Dxvw6MYMHewrKRDD0hIbM7VgaUtZlE7FBGR2meXjxeLmTWMXiJmFvbM37hpn2xhw/BknBkmhBBCXMnTBWabeFFoWn6oWszkJNZ4IW/PZ/HI/PJBGGZ21kXbRWfHXuSYsy7/ctXH5WYss/MemCMOFGJ8IYBMbH1GWDiwZnrKY1NWRATMqiLukNFujF9JXO4QvuZMSG4N+OHWrMGoG07ko2EHJkBAxr+jrwd3sCkLItKT74i2Utw+fxmwiBDaPC131Q1ABoQWHPvutvaPFakdzr7GHEf3cq6ZOxRz9wBExEBKxN8rL8ix3V/F69vxRfOjbTYWr5oHlmz9y9iEgH6fy0tCAv9ymL8ottlpjzLDhBBCiKt5roKb0P8jbfvN/z/G4fg+/l38nvrjpY/ETXOFoWeXjDYapgwNI4lhqWG+wHf3h2Vff61uAm9KsCodazPJCBvlxf4fYTnX+dGum2ScjDH6Psaz6jYXuHBGdBgK+OOretvro9NXih+5+LK6/f9mlWMbHN9DSnjE3HGnZbwqXcfYG2d0GBadM8lgks/IyrHcPKalJUT+HxWjDd/7RVvNpb+PazHqasuYM0xJSUlJSeny9GwNc64TW7cZVhR6pjyc71dd7+TmFpMQMOkNa3Dp2Qc+GoF4p1zjm6BWiiUEZz0wb6t1u4N9sgLi/vDATZ2cW9veB4k41TlktKttPq9dzlkSkzxgS1rYaoLzCA8K1TrWRASDjAQeN3dg60rfE9zaPlgRMLH5Vb415gR1v8/u00JiQksa33XydTatad2nwJmAMF4z3bbuyjxqhgkhhBAtPFtgzve+9zwGLSICDq2C0pKEfuvby8+eNh/bbjtKaN6EK0JilwTfS9uQn1e2yj072rXRGyouw5LsIeJMu4B6X4F5yuSc0NfNQ+dOrY1ua3MmwIQr7K07Ih8uiYGo2hrLLZH3rtEC/vXX4sXlLf/OCPWPmmFCCCFEC091K2f5VjV6rZBzIa9VUPLnhT2Ovi49++DuFIXPQhKWV2n68nbe7Mxs0GiX8x/F5f1ZcTn3lRs/wFfulRvYbsF9OXP/tWo/H+QbeOjcadF357N5BJdsFlpsiWUd8zAp1XZJqRMvLn+c693DZpgQQgjRwnP9MOcP3/7P2vkjsutxui3lGePs+20rukq/DFwpJFrQ8PgwZLTLrPwZ4SDBcA2M77f6pbDIJpbZylZeQHyU+Hb13HEH1kBwmc/ySp9Dm9jKHDtWLJh0XON8plzYRpt5Q45/gzx5/IIZJoQQ4lV5rsA85DHenyd/0EajnX2/OGprrg3wuz3TxwKLLLNFHpKE78YZlwlNk9yYBYDFAIEr4p6vG0/GQsvsmw0RB6Z8Xvnqcy3Xz50jV32fsNBW7MgG1B0BXObArnBweLR/HlLHj51hQgghXpsXifR3NVdrzkY4+yLclu2Vn8bzVp4R5S21HRsmJLcbbxRs+eNdip2NkUfC/qf6ybWMHRPW/HH/3NStHx2e+oa5c0uvYzZeVN4z5ZMP/nPW4Yn7GlJgzhRIbIjI/INnmBBCiFfnuZv+zhlUwFFQ7MpzzszgtrMLrvGl23i4z5lZOiTQSmsre7R3FrDwos2WNVsObg22qmkGh4x2Nf+HO9g/NgRMbNtn+2xx3Z/CO2Ah8fnrYQsSYFCInNbznzl3jlws4lvIggCq/r072RLByVf1QObu01ton/U0/p4zTAghxE/hJQTmlshe9TytQkexXW97p7OPORfX6Pds66ohI5bMrtrnH55tZf7RfMtXr9AxZLTLuT/cAdzepj7Iy7pHHEq4wPvGyxCevx6W5RbEV4vLD5w7TYHVAmLgcIVOPI96ODSe4ZYILpzdx7I/iQhZ2J9ecfs9Z5gQQogfwlMFZre3/EGb9jjtykXAoFW/lttA9glyt519ZBRfuu5gc9KB4mqBhV7g6hSYLQ8bfTjny2LQaJ8oQiq7qcXEBMy6XIRZQHqlB5DXx0dG7M5gGX2hyx85d5oCa25Kc43F9WXb+NakQNoUaS0kY8+0OTePorg72D9WBKy6YxL+6BkmhBDiDXi2H+Y5MyBtC62Qiwdub3NSYGLL6kPXYi/M9Oidbju7KGUcX7q5WNEvrjatqnPrzn2PQUTkcxzOlnV2tDv4x46ApNMoIKHDsMUCknowlneicMVX78Fg6/cHzp3GLLfovLjfyb6jn60mPW5pe0IimzU00hM/O3q+fbitfTEjsqzzxaNzhgkhhBCP4Mmb/tw8d3vFouph1QLL2Pg/vjgAIauyrwaLWACwPONX+Lazx+3tkv2ZD/SRVbbX2ey8h1tvhhFVvVFb2tz8N2i022o4+MAXWYcf3LQ9NIwF7JixGbSl6xHURdfoaq8ot/msuIIBcwdCstMst5gVATC9SjObj1Xtilvc6dEi//qQ2qyyzlL/9ePMS4ObMwcm1tXDjhkmhBBCPIZna5iP2suIjc29DikkIiEodMwHH+I3YmdHke+oH96ei2F229mjs2RyJqByZhFzt7aQmKPQuz4jLOQxC1c2Z+m2FhAXPbx4tDtGcWlzUgJmTS8JFhF16OlTr6Gc2PTC7WDj+C+pl7JkAsSFrjJuNTkoneXWdiCA6jWziS8pp9n7+/hnPj93ICW2OVtC4mPQnpPW1oKKt5N8biWlTYmlsD1ubikRIRtbsuZAQERcvIQlFnAAlkfdu9vaZ/79gsTmbDmU2lCY91juwyWC3JQFcmMNS/2m1plFQG2Dac8ME0IIIR6De3oiZNP6w4qwyBPx3ZojqJW1wuHIakcHnE3WduYd+uqYtf6S179pGYtNtZfNPhK1VrZpHYuzo+1bEtfOC9i1jxAZjqi1T0nxz9hxLhERk/rWbUiJ837747vS8cjlrz2xb6sjI87zd5Xi61jg+M5bS8ruXN1FH3aluThh46/CjpA4L6VWQkJ8OuPec8fha501fpi1zPG+VLpOBK0z5buylha16922zrJaOxu/Nufv0BmmpKSkpKT0mPT0BvhmZF4gOqYFSS1HQFZ5HO9IW8ppFZiHnP0Ygdm3MGg5nte/clRa+t3Sl5Y+ktZ6lxF296h/tNsFZgex/0dNdOGbTc91zWPEDRhX369yijuOr0qtqeXvKqU0DxzfzFgcBee+uh0OIi9mz8jI2JERlMTJnRe/myWMPpe65o5/Ecjyl4DSVa2/9CRnKviuC/m1mbIhIyBkVhyd1PIHtTMW1dnSIoInpZex0vUdOsOUlJSUlJQekcw9W8VdYBExAfu+8AQWExGwv24j2W1nj9TLlNl5n74WEwNrtkNNGSzwH8zX7IfYrA4Z7cH9+XK928rO+JF4MBYSEbFnOdxMxHKDBNiWvapY1LId8J4tHzZ3QsIWT863jFcIl5RoQR4lcpyxGTLDhBBCiPvyQgLz78ACduzd39tLeg1sQcJ//aKnzVgqRtvt/LS5M7DXA2aYEEIIcV/ePTT22+EOLInsPtvCHo6FJMzPCjPx1d4oRImfNXeGMXCGCSGEEHdFAvPjmUOHD4v3I+Wsf1yLroo0J9r4SXNnGANmmBBCCHFvZJLxBGxH4P57ditG6gnuz5k8M7byoTsWP2fuDO7v2RkmhBBC3BtpmJ/BnMDOBaF4AywmPBc82WJiicsj8kPmzjCGzDAhhBDi/khgfgZzOBu17R1IOBNa3AIWPgacGIefMneGcXaGCSGEEI9AJhlP4Sfs/LeAb9buozfP4myUQnEhP2HuDOzpgBkmhBBCPAJpmJ/DkvffvJX4fvTg/klcHp2fMHeGMWCGCSGEEI9AGuYnYd9s31t3Zisi/vwGTeer8f5zZ2A/NcOEEEK8CBKYn4SF8N7O1iwkeF7ExN/M+8+dwf3UDBNCCPESSGAWQgghhBCiB9kwCyGEEEII0YMEZiGEEEIIIXqQwCyEEEIIIUQPEpiFEEIIIYToQQKzEEIIIYQQPUhgFkIIIYQQogcJzEIIIYQQQvQggVkIIYQQQoge/vfsBvxULCMClm7+7JZc2f6AiBiAkL37enZ7hBBCCCGehQTme5GLm+8b2HfCpPj39NmNEUIIIYR4HjLJEK24L2fOyPXj62e3RgghhBDieUhg/sFYajvLbioiAHASmIUQQgjxi5HA/JOZEBLdVEKM9MtCCCGE+OVIYP6xWEjITVbUFhHcVoIQQgghxPsjgfnnkvu4uEU/fHsJQgghhBBvjwTmn0sEN9of316CEEIIIcTbI4H553K7/bEsmIUQQgghJDD/VGTBLIQQQggxDk8PXOIj4n25LVhM7L06bJm7fWv+kJSE0OdaMneHWo6U5FhiUaaPuFepLSJp1mYBKbmoeGDdFqfPAhJi4tzlGnuWTOtteNDYeZG2tfZO+2MLiDi484LwGQvmo0j+nL4LIYQQQjwM9+TECocjJmBR+yltyZ01Dn2TtOaJHUS+dEc2rDYSvitHNwS10ie1HHkboo5+ZXcbtwk7NsxY8M3i2EpCVj7tcLjir2IsyfhmxjerRs8yVoSlvxc4XGvdARk7dixY8M2sXpKSkpKSkpKS0k9KT9cwewJWROzZg9fvwszWVS2zzUgB2Hq9Z0JIwMI+WzXBKbOLatsSMSPXqQZe9xyR8Vk5N9cs71kCe0LfhpX9bdeI3webkfAv345nARkr/gJwKEwoYmBf/LX052XE/HEHOzCp9swSJkDEqRcdFsyWMAOmbupr3zDj3+P6LoQQQgjxWF5FYJ4RMHVf+R82IY9PN6mIdLm4vOez8Nvw5XPO7OCWtRJjJgDMWTd+a69tQciWT2/KEbIgAlKbVkThA2umJ88RNmVFRMCMj3OdtPiKkWkxebCM9CgugzvYktRitwZ34Mu3fgIsj33050VM+FOUVw1pcjROOeVttWC2jAkHPo4mHe5gSyYWPvJ1QQghhBDioTxbxV0YTSwqR2c4HJvSkRiH47tsNOBwkPrjhVlAyWyjYSrRW5vDlfMT+n9UTEPq9Rctc9VfmiYZDSOQYWnTqC/EsSv9neBwxC2jEtfOXDArtaVSMptaqZPWEvKxTRrH4vMdUVJSUlJSUlJ6z/QqGmao6EJZk1LVgeZa4K+6JtPNLSYhYFIrgbIe9ExtS2/qMS/nd3vbEoHfYFgcbbxyrG1PCCRMe3s45RotbLMHCVRKyvXW1bJbPChbSJIbblhAUi3ZchOU9ZkScq19XWMfcJCvZiGEEEL8XF5FYN7XBNG654uICDi02SqzJAGShsA87RSX9x0GBPX8Q/0/5AJz0J/JbUdy0RYAkQWFacUXB2rW3q32xwl7PyIJ1H6PG/1vKyG3Ca+8FlhKeuZFQQghhBDirXkVP8zndK9NEa/A6ztDq9rkHly3GNdV2/v4HA7Y2CTvsTu4r4Yuuc0H87Z4pUiBqtV3PnYny+wWC2ZLCYF9yX47shkz5q7+qiKEEEII8YN4FQ3zOVE1N4voFnRz04lyKX1GAh21DfBN3IIF53TLI7NmAoRkYAeWfDW2BbZ6UD4KuhYSAfPGGWW9e1sJ+bGD5cYxESEBaz5kjiGEEEKIn82rCMzn6BdJc4ExoqwzvavXBotICAlrniYeglvb3NtcQ0BKYnVb7Rb74xK5tr40VsMsmP15eU171oOCnwghhBBCvD3vIjD381ANr6VMqhsBH437tCVpEWswYMGfSoYOD8qeBApr5lP+MxbMhcHLlyL7CSGEEOJ38S4Cc64v7hJTaxa498MCFoV4uWab+4ewFYM8LF/jh7ldT+zWrL2eewKEFp0E4A4L5lMP6trkQRbMXjhXIGwhhBBC/DreRWDOhbdWgbPQfT7CQCAjBrZ8XW65awtv1HDZWVv3t+s3t2VrBzKqOvaa/bGFBCV9clOb3GvBbGHFlZ7EZSGEEEL8Ot5FYM7Fv8DSFsdyuT3v+v66Twty/xJ8XFXXzX6YLWJVjlEIwJyMqiBbtz/OOJQiJkaNUvstmBesSw77ZLUshBBCiF/HmwjMbu83uk1sWRVWLT4GHXlAM3Jhc98QlwfZUI/gh3lC0KgtoM0iuaxfTppBu4daMFtAlHtZdmvraJQFrK7RuAshhBBCvAev4of5PF8cgJCVlQRGi1gAsKxFn7sLXiiMqh6fLX2Yr4wAONReDRIqHi+gZsE8YXlGmG26kDtZMMeFn+u8lraeZkjzLIQQQogfzNsIzO7ABwcgYmeZxRZbYjM2Xrj7vLX8geTC48oyi8ACS2zm4989gj1r95+rmlNM2HZH2rOkEQFx68875sg19F2xD5OSeD4HIqvoty2wFRGf2goohBBCiJ/L2wjM4LZeZA6YsGLF4mi9fKVN8TXkomnAhI05vn0bHqVfnRNZevrTIlbsG70vRFyLmfFZFYXdki1Hu28s9hr6qg56XZSfnLTXbs2UgKwoPbCMHQc+5I9ZCCGEED+ZN7FhznFb+8OEtGTFu2fqHmG9fGrBJ1ml/iVzHmSU4bb2wcxSL9BGRMyZNl4WvohIDQJi/rWYY3wyI7MACImYM6Eu8n+yIjFIq7bJ7ssgtTyiYkjMurV8IYQQQogfhblnt+CaRsdEBOzZPkO3aQGx9yvRZchw3/ojIkIObLuFVUuI2HbbdVtEAqzd2makwJ96TywlZNkcX9/7A1v5ZBZCCCHE7+AtBWYxHvZNwNp93F6SEEIIIcTP5I1smMWtWGATm1W8jOTmLdOrixRCCCGE+PG8lQ2zuJHMB145+c3whhnPbpgQQgghxOsiDfNvIve4XFgr24S4EgVQCCGEEEI0kA3zL8I2BMydN8CwiBXIKZwQQgghRD/SMP8m1qc4gRZLXBZCCCGEGII0zL8IC5gRsQRCEuZ8yTGcEEIIIcQ5JDD/MrwH5i1rCctCCCGEEEOQwCyEEEIIIUQPsmEWQgghhBCiBwnMQgghhBBC9CCBWQghhBBCiB4kMAshhBBCCNGDBGYhhBBCCCF6kMAshBBCCCFEDxKYhRBCCCGE6EECsxBCCCGEED1IYBZCCCGEEKKHHygwW2TOome3QgghhBBC/Az+d/2pFhGwdYdnd6FBCrxeq4QQQgghxFtylYbZYluYY8OKb/u29NmdqJGwdftnN0IIIYQQQvwMrtAwW8ak9GdA+OxOVFqXELB8diuEEEIIIcRP4WKB2SZMgANz9hyIXktcBhJg/uxGCCGEEEKIn4K5y7IH7AjY8/cFbZfz9n2zdP+e3Q4hhBBCCPFTuNSGOSUApq8pLpPrl9fPboQQQgghhPg5XCow5+7aHrSlzlJb2eoiF3EpB1kwCyGEEEKI8bjUhjl4aOtC4kvqtJCI+ctqv4UQQgghxBvyswKXpMggQwghhBBCjMrPEpgT9k4GGUIIIYQQYkR+kMBsEaHsl4UQQgghxLgMtmG2DMB7XU4sBmDvKh6PLSQl8Xm2LNvsiS0jAr7cFiwm9tsIt8xP0fksJI8eGFVqA9xXTxMTkMAshBBCCCHGZbAf5taMa/dRylGNAAhw4LNuImErYuCDLTOSyk+fR/HbYlbtrXDW08Jv9u7vg8dPCCGEEEL8cK4Ijd2OzbxWeOu33SWEBCzs07XF3QtYEbFnD0TeD8bM1u5qh3UKiS2EEEIIIe7BYBtmZ86ceWH4I//rpF/24vKeD/fXfbkv9+X+kJtPzCxpKW5GxNT9cR/uw/3H0dDCa6jdurU269MvEyODDCGEEEIIMTqjbPqzmBQ48OFKTt3clE8AZtb0pBywPNkjuym5FvqSECXVFgSkLK/XTwshhBBCCNHOOF4y8g2BX3WB1c1ZAkHDthmgun0vF7SvFpgVElsIIYQQQtyHEQRmi4iAQ6utcm4k0TTK2NeE61uj8yUKiS2EEEIIIe7BGBrmXBxu1e96Hxmh1XXHoxpPWEjMUiGxhRBCCCHE+IwhMOd+l7tE4G0pT/3oWMggQwghhBBC3IkxBOag99dc73u9dfIQUoXEFkIIIYQQ9+H+obGD24voRyGxhRBCCCHE/RhDYM6NMcKOX3Pd8j0NJhQSWwghhBBC3I0xBObcHjlu+6nY7DeuzXKVlK27Z/lCCCGEEOIXM4bAnGuPA0tbfsuPre/nwUIhsYUQQgghxD0ZQWB2ex+nb1KP6OcjAML80jIvQCGxhRBCCCHEHRln098XByBkVRaZLWIBwPJqDxa5Xrow9rDIapbSCokthBBCCCHuy//GKMQd7IMVARE7m7MGAo7a5S2fVxecC8Kp7dn7Ej9r2mp5YBZCCCGEEHdlFIEZ3NaLzAETJqUf1vy7wX55zgQImBVH4haBWQYZQgghhBDibozmh9lt+cOUsnC859N93LLdz+2ZVsqbVrXVFhIzV0hsIYQQQghxP8yNXWBMRMB+LFdvFnmzi33TUtkmZPxTjD8hhBBCCHE/RheYH9r4HYH779mtEEIIIYQQP5n7h8a+GxYR3tVhnRBCCCGEEO8sMGvDnxBCCCGEuD9vbJJhO3B/nt0KIYQQQgjxs3lbDbMlMsgQQgghhBD3520FZoXEFkIIIYQQj+BNTTIsYMfWfTy7HUIIIYQQ4qfzrhrmhED6ZSGEEEIIcX/eVWCOkEGGEEIIIYR4AO9qkhESjBNJUAghhBBCiD7eVGAWQgghhBDiMbyrSYYQQgghhBAPQQKzEEIIIYQQPUhgFkIIIYQQogcJzEIIIYQQQvQggVkIIYQQQogeJDALIYQQQgjRgwRmIYQQQgghepDA/EBsZYtnt+Ep/Z7ZZpRyMps9uy+visbmdfmt616I6xjriSGGo7tUnbZZKIH5YVhEzOHZrXgKByJLbi3EZsR8DcgXW2zBs7v8aNwX2Ob39fv1+cXrXojrGOWJIYaju1QLLbPwF0T6s4wIWLr5k9sxI+Xvzw/o3RxvC9kxd583lToj4sP1LGlLiEk4iox7lszd/oH9jsgA3Mfj6qy1YMPhEbVbREgEQMTXz5/Rt/F7131P3hiAw9ij0taGe9X1fFp7+yJPuxt7NsIT4/155H32t9ylLqF1Frofn1jhcGRPb8c3u2e34VnjzQpHcEOZGY6o5/eEXcvhb9IH9jvO/3Gn0gMSMjIy4p4834+Y5/4K5ykeueyAjAXJ467b3UfrF6/7zrz5/1aPaMO96np+6rzTvsDTbpS+3fDEKJU0yh3l2lJuqf2e99lGXb/kLnXFFajMQplkPAhLCXjrt/6bWALptSdbzIRp19uvBbZgQejrmfLJJ1MOQMDMrq71dbDAMnakHNgCM9u1f650Bz6Z3P9Tpvtwxl/uo42YMCFh4fWCb88vX/dCXMdNT4wK49xRri3lhtrvep+toLtUB41ZKIH5USTwe6ekm3PgSkHOAmbs3Vfnrytf8pQ/7p/7cnM3d1/8YQlAZuGze38bFrBiwpf7cFO3dF/8Zc2ifYufW7Jm9ghLZrdlfZeCj7PkhwjMv3vdC3EdtzwxaoxzR+kpxdKeZ8yNtd/tPtts5S+5S1lcS1F33uYslMD8ECwkZul+s1H9kqhvavYwIWTa/pMFrIiAA3/dV9li2R3cP7ZAwOTZXb+RBRHTk02iO7hPtqTW3q8pQW5L/aasa/9/a7TuO5gyZepfaX9SXWI8rn9iVBnnjtJXyozwqvNehN90l7IJq1ra9M6y2iz837M7cLaDKQm8/daiFH75LXtOSnL55yULSNl3bmGZEQF7/h6XuwUkxATAmikLILXpIzf/jYulxBwaLwxTFmS2bPbLrW371j3+4kDI0r3wA+YCtO5baf9edJ97vRvgWUe8IFc+MRqMc0e5tpR3uJ/99rtU3xfZ2ix8eYGZkPhMl96BhIP7zVMSt7Ut6RC3cDUm3dZV/gF74F8hLselt/2Tm5ykS0P9Bkyg+fbvlnYgYELbPvI5s45f3gB3uGKOvC6/ft1fxM+414tRuPqJUS9nlDtKdyn91slvcT/7RXcpN7V16Q6TnLOTr89CmWQ8AIsJf4uFUA9Lgiu24HVaV9nR9KDYDmgpK0LgwJo9p0fvGB/2noIlhECbtngLHTZ+SyCRR+bno3UvxA1c98R4NG++2+K33aXc1q2PaZDn6coslMD8CH6RSX0Pcy6+uVhCyLbDvCD3ubx3XntsETNfzx/34f6U3uzfVmD249X2WXILBG0eMdyBNcFIG2bELWjdC3E9VzwxnsC732l1l+qnMgslMN8dC0g7hb5fhDuwJLnQZ0VM93aJ/K3vZGyR65vn7jM3YHDTwizhff1knHtctL8KrAecKe6M1r0Qt3DVE+PBWPbGTxd0lzpPdRY+3YbZAlLi4vF+YMuauTtY6AWiXCRITpZC7sui3HbVtVqmWkoIrM+Z2VtM6t8O9yyZ3m2XaMcbnI/J9OW2YDGx7+m2Oz6dhaQkfoFuWTKvtrm6acaXWcR8qtQXkTTrs4CUiAA4sG5utPMb6mJv6nD5qC1JLrQnjmnXr2LHGEje9sryOVSxGHNzS/KZZVF9I9FtY+lzxMexutse47x93WW3C8xbRhKYLSjNy3VvnMUgz9e/6krl9axPiwjYttU2rD0W+SuzZ922lux4vzmwdHsLSO4SF22kdX9upvbP1dtX/Qjrvlli5R7dd6+/vQ3dzwMLSYvxz8d2eV506HpitV7flxnxM306MxLD2uPX1dqtwUKSoo/LpoXsuVH0XP7EaO9fxx3FYjgeP38Ha5ZikyE+mDprD4mP8QOe5tRgZP1yPorP2uJo+Ywbu/7yLHxyJJWoNUKbIzzGTWsmB4H/d0v0GwK+8xIq0Vrq8ZACFrUTv/siyd3Uxw3fbTGLfLvilra0xqcjaxz6rkYQ8jliB1ERJSgbWh+JH7lj2lRbzaT2e8eo9cWaYndJPCHC6pWs/JbmbSz+nrXVStI+U24ey6AShcnxTTZ+pL++En37Nh1ntvT54toDZjh2Pr7gim+y8owojVDAjB0LFnzjmLVH6CJkhmNBRkrGrhmV0F9T1976c+0prviOb2akZKyarWHif42JmbBixuY+0RnHWffnZ2r/XL111Y+z7vvz9t3rb29DV7tayzzb/u4n1tDre98RvybS37mRGNyefB5mfqWX0+zSUSxyXvTEaJzdcUeptC/296bOO1hbKYRkpT5sTm7KztfuKO6ZGRNSf1/riAZ4Wt33SM27FFHJ5VpW6+miN87spDQijeiGJBVnbgt/NGZWzK5FPqdY+DwRCRscjhWRg8ivqJaxKnKerkh2PlLk0LE9zcK7XISLLlc+ABkJKdlx8M7dRP2En7WUmE/SRelI4xZCUAzugozM/3UXkZmwvZ1Fu/ILvWPFqnRbat44jkt84wWG49QsPWSPl7+yULNB9UX+nBWr0sSbtbQ3F1jSogXf9bb2CszZkOlZ5E6O17tzqp96l7e6vkhbX61uHcvS/DneKvORcN3tvWrunBeYu0Znh2NyU91R/dFByKIsoBcjFJ1uYH5kNq2C7De78gpjUs9JTEbmxzG+tD1FmzYl4SXFsSv9ndVXed6L8a5ZqXUjrPshM/XMXL1x1Y+z7jvGYLjAfEMb2ttVjOy3fwYcx+WMeNb9xBp0fe8+4pcLzOdHYnB7Mt+3bz9nyyJM9VlydhQrZV4tLHbdUXyd+R9n72BtpRBWVuTM/5VV5IzO+xkB3+X78/Hu1tqHOwrMbXepyiv6qnJPyVO7Oq/tFWhRGcX662PbK+W3g+j0V+mXXa0llbnXcQf5PheSfLDAXMzCO1yECy6Xv3nUjiaVSbdq65LXPbYJlg3BqUVgzpfK5vTo9G/9lccv8RWpKSh0LviSmFV+l8//UZ/EMz9pyov+mDep1OWKCT+r6Uz76tuVx4OwuNWVxpcFq0r9R7Fx1dqvdoG5U4zonKarnt/KPemaD82b5c1jWWjxFsf6vPbT4eo3/Vtm0Q0C84oLtUy181tu4KR8UxLDfQuSmhic6/RrwjoJbQ/YCa6phW27iQ1pjz+zVgsLinVN2DYqrKqj+DrrfthMHTRXr17146z7jjHIWo+2fTe8oQ2tx44jUD0anzRfHe0e/sR60ohfKjAPGYnB7TmJWl67R1A6drq3DhjF4uhFT4yOPnaIRcUdbHP+DtZVSvec7TuPGd9VPba/12cDzx/lHtV+lyJkViiBjun4KpXP7ObdLjq+ZJERkxZa49KLB1GhOc5/m5T01qXXF0fppS0v8fQ94Lt4BZm1jJFjQkxceqk7IwwPFpiLWXjTRLw1HSdsb56OCdlxy83fTnZ9Of3U/G58qq20pfHuMyw1PpHz3aWzOIldlaOzZjlFi+sCR1rtSenm1P0Br70+h6vcNI4vJGWda1MYPb7XhS31dNyyWbV/qG7Nu6BbYK5fVYdr1VDU5s/tY1n0uv2lxjV6cPUsOj7MWvvfLzDPukduwLgH7GiukPx/q1oLdnWNQzWXn03ftBscrOh67MYXtydpm3f+aqVFyc0HYVrRD77Muh86U/vX/a2rfqx139qq4QLzDW1oUZi09rOrppa5OeSJ9aQRv0xgHjYSg9tznIfV++VRM7ir5UsGtvGCJ0bvVesSmFfn72DdpVwpMOf/a2rdv4ecP9Y9qu8uVRINy4rFvOa6OiQo9Ozl73/5S1XLC2hFGPdKJ29Ku6nl8QJ31QaAjLqMlz8pK6N3VDdcMzO6Z+HTN/1xraP6KTF5FLdD6WjqjbT7yM30v6pG+G5qCRFxce6Ua3aO1reWJQRntyxUHZuvSalv5sp8i2stcnOLSQiY1Mo48NGziaCad+nHbF4+w+1tS0TFv0RrVLk9IZcFBlkSkwzcZpBv3Grn0HbQgsbWivoe5tvHMh+vtauHBlm2OEG/bRZd70v5cPWZkAcjp7EF5+C38NRo3TBXHfWMgPZVuSQmtvTMprth7fFeUmqtW9uBgLg43tzTXr1Cr7PuL52p/ev+ylU/2rq/iZHbkD8BWrfbDfIXMGxdvsOIDxqJC9uzrs5BN7eQCRDWtl4Pvbtd8sS4hnDAHexONVf+WhMRWDxgw9oo96iBd6kDH6X77pykZWyO9+fSE9Ht7YMNIUlvjz6PY+8O9oeokfMopeWr5Lh29o02zAkIq31xn/mmSktGCcriZ+FzBeZ8MCa2vtytiV+yQW0p5V4vehaX5dGk2oItL4lOvgXcdoSgnHl7+i/Xvtb3hkBiERFwaF3WSxIgqd2cpz3i8r5jrOtnDBO58tvmJYLdkuyi219XO/aNfAEQNZzQHb0LjDSWFpyfYydGmkXXcb2fDP9KUDv6SUozblX7zbB0O7OQBNq9XvizJ2dGc0B7jiFeWmb3lrjkKzW1Q22H/7biWeVF1v0VM7Vv3Y+76q9Z9+NzfRsuWME1hj+x3mPErx+JS9ozJSWAIsTwZc/9S58Yl3L2DnYHpky4OgbgaE+V83ephmKxdWxSaPbGHeyTFZB2OoateJ1yh0a+fSFA52045m6+wLWP5ZIYiEYJ++1n4XP9MOcdCdnZzFK7NLxE/j5R0upZviz7XQPltewtrifflhGxkOSso6Lzt4z8ptY66fy7U1gZuw53e2fqe5Bg5w4siQf61uy7HedL6NTvde1voAhbui8W/e1jGVVy35enCNsWt7vmcUv34f655ovKOZLufL60sG/tD2yPX9ctBeTO1iKON9wJO5vZ5Oi8zPWvl2tGcIx1f+lM7V/3T171r0Qxn65ZwcOfWG8w4jeNxAW4gx+343hd9Ny/6IlxDbd9jbtuRL6cuf9aX28f5tV50F3qvECd66lpcQmIy+Ptdgd2+aSf6t1vP1StaqHFlnj3jiNxnIVP1TC7vX366GwpgMGy/fNQK0syAqLSh54h78v5IMZd+jcLR3TiPeQN7vwNNF9C3Tfg/JPeqZz+Tzod9V3jB9KCqzQea9JydPYeot5SqjnWJEBa+8SUz4jTNbh9LOOO4/fgCbdyxg950h2t8ETU8/uw9uQzIbSs45egdL8JivvNuqrlGIkx1v2lM7V/To646q9e96NyQxu8H/BrTr3gifUSI27tz7mjT+qrR+Li9lTNHy997g9/Yrwd3mf8ySzncWFQhtylGOD9++hnvI01KXQYZczPll39/byH9NB7C78Pa1LSJ9swu7kdLRxzEhJL+DfESbs72JwJkOZvKoWxxW3CTHiVfVA7ecS1W9/f+29NR03rqZa7Ru2xiISQ8Ia3t4ihN+l99+3DbXOTnKOFkpvbhJDQJic9m0VHu8HitJcay6G0WGZXW3wPHut6/vxjYuiMaZJ/wNwCuLkdKMfmioktrVjpjcEY6/7Smfr66/5V2nCTsH/LE+sJvY07AmusLx+Jm9qzZkJJvXHhKA5/YrwRFpKSErBky5Q96ZAgKCMyjnRy5HDB0ZxRv7VYyOzO0W0jYP30TX9ubktSjrG5IHdp83fQybnAnFhuZ3OJPdbX2J9hW/u2tS3J2Q8Pt/FAXY+l3rz/NpLBLzX73tqW/nXpuOS/WACZ7XMR2iJWAEwHfzN4ut6s0f+cqPNx8UIfeF+CrTujh3JLlpYQEfk4ZLmj/mH3m4E8YN0/dKaOtO7fvg05Nz2x3q63I7XnGCGw4KJRHP7EeBssYwIsT5t67cEtGO0ude29aMQXfItZlKJQ7tmzdQeLvQQwDgl793yBGdwh/4xuAQl5KOPo7L75/My9zUmLjX/DBOb8Mg24yHbF+0pjWc+ZDevL2RZ33a5u+MB4CRawKD6ur9lycGuw1aVvdRbXd7NeTf66FB8/+LilzUmBhS3ZHz+7s63UdvtYDp4/RX8v5jiL3P7sTXR/5W/nGfttfYjG9Pb2DNJ+uSXHV6qElICo8l3iNdb9S6z68db9C7Uhf8m8Qfy7/on16N66r15DhkEjMUp78vlaNcwYOIojPjEegIXE52eCLUgo+Yi4uJYx7lHjSCenr11td6OHvPRZ6MXlNdN7vVgdZ+ELCMxH3IE5c5uRwuBdsbmznpi5hd7xyLlHb36TODvh/JS+ENu66jvyktnNO3x7WlxsmLi/pjEjBrZ83TglL41d3ykCub1NmQAz+5tfdfdph/ybQ5FpXfvMd/tY5oJM1GMmUS7z1lm07pyp/Tau537rI/98yrAeDmBLzLlbZ9+YD2vPdsCazqob49yWrc1ZERIfH8kvs+5fY9WPt+5fpw1eTLx9t8pVT6xH9/b2kRijPT37GM6O4qVPjOcSnp8JluX2w1eLy+Pco8aRTo5Xtf05PWT/yu2kftvhPb/p+Vn4QgKz58uLwINwa1sTkxTOvs4bsee2r9FZf4ej+Dp0B5uT3nhr9vZmre+CR5/Ad94eZoF3HXOjtacFpAN25h45JwRNvVXdjH/5AfdlaxIS7/d33rjGN4+l9+s79AF56yzKBea45e0919h2zfeIqwXmooet9m0WlXyODCM3nWkVmAsvJj1rcWB78lq6tvImrN2BqMWL9N6+Cg0avM66f4FVP966f6U2FL6Px9pGdtET69G9vXUkxmiPxb0bw3I6RvHCJ8Z7kK/fHq25ZdBjXDaSH+ZRpJPjnSppllN4Lbv3TM5n1x19vZxm4esJzDnDL2Huay+5YMPflBmQWcst4KTFGs3X4c07fL3hCUysNvUsbmxquxfeaVdjxC61X0q45EPynt6P7O5g/1gRkNiCT69lXrPutssaZSyX7SW0PTJvnkVLMtpHOQa2nbe61hAjFpCwHbBP3xu7NG9BFrDhz2VbDd3W1sQdeqxht7oB7fG10Oam3gJm/OUAJC166jWl+82rrPuXWPXjrfvXasOcGZDavDkjrxYfxhLpHjvi50fi8vbUfrHAh+DZD3Bf1xzFzifG4LvZi1E486u3fPAVHtG7/wj+R3KxG5jxUeln0B5K6g50mUmOZxBSzMKn+mG2zBbW5gS7/DaUL9RCGLGoeoabe7EqhmGWTm7OGoiYWWWILbCMxdh9dEv213xAqfDFAQhZlVtskW/t8v4+gY9uiKo+My29eMd02hGKoZ0tEFjPjcRt+cgFITZtdl0W2MQyy0pl3D6W+SwLWVRKuMseZ7cvWeeX+3XOXr9lX7kF7JixaXG81uzhHkhbfJ9OuCLIkL8hN8bHa6/ObtQb2J5PDlT8spdynV4tmr8H3MEaeIR1//RVP8a6t8wyywbaXLbe60e795x6lT8BAmpPHwssY9PX+kFPrJsYv7e3jcQV7YlsUi6Jmc972iVwySh2PDEuuJvdl3qLo6tfnR64K+DIKNLJ8U4VW0misoiV1y/f35QrvwZZbQ7HjDc3iln4XA1zQEJiW9aFm5um9iSffqnt2fvfP2uCwpIJCXAYrJT/x46AhMjmrN3WQiJi/yF/fJZMBgW87MQd7IMVARE7O97i4uIWc18vHKdeJMDK5izd1gLiogWDsYjokvdNt7UDQY+PiDxPPjYhK9uyZOvWYLn7o8jPi5Id8+1jWdhOx2xsytrtLSa5dCwG80XS8mE+hW7Ppdb+ATT183tSCyff7OFRc7+ofoWxiLSqRRiG29onM1Kr3zwzQg4dY15ai8Pa4/b2xYzYsqoAbhFpaff9xOr7HFLu8znvxnX/Eqv+9nV/FJ6GjEPXvX6Ee0+N/AkQsfEjCyFR/gSo6JjrrR/yxHr2iI89Epe3J7OIuVtbREzq9Xzlu9XgUex5Ygy+m5VqHYN6KUdTsOMM6XLUVpx3NDGr3hts4kvKafb6XtvnGncpC8qqDcuAA3PyEc97kXu735fCWud3qpTYlqzb71MWFrMm70tSvIgeqnvPLCUkBCLLWLqtTXI/1Zaxd3PLrQmw7Hiem1tKRMjGlqzJZYa4eKVLLOAALN223jufJym90LeEf6rMQvfExKzjh1kpT9j4dVErJeC7flbl9xUOR1Y5FrI5V/NovQzby21rl4M4/0cjd+R7WU0rglKerK3EK+ur5SZqLXTTMrarrlaQ4YguGrtFd38qM2DW+eOC8A5j2axvw6R9JG+ePzGO7/K4keLYlFtbOyPFsWocTYp/xgNqjdjh2JxGj5hvUv9bTMrO9zslJnL5Yy/24+bIiIlPbSThG8ekds02lX7l5W5K5QZD2lPp4zeOrHTehN2xDlY4duUy/KicnWFXXbcR1v2Qmdo/V29b9bev++NsGNSqjnv9bW3orKv9CbCqzI5a6wc9sZ464t1335552jsSF7Qn879sWnKX760DRrFUYusTY9jdrOuOctkdrO++5J9R/v5Mym5A7Xnbd6V72YRNcX8KifNSaucnxM1n2a2peZcq+l9O6fHpVknVe/euZQbVx6krdc//1XHl+FS9R/j7P0HrHP6u3D0Xnb2rpsZ8Ks/CkYf/4ssVM6s9EnaNh2BW+TVrCgp+AXaIYl23ELLKJf5mNkSQuKqXK1xLqy+6sToIyCpj1TVSdxGYHaS12jPCthp7BOZvNheOXKvo15ozbMyknit661g6KufvyPqu3M3zJ2LHNxN/857REJlq+WeURNNan3ashj1OizFakTFjx6oieFbT6tT/Soor5c345psFmX801NrYUm48pD21Vue1rMhY8F0WgFiwISBhx4KMjIxN88qPeN1GWPfnZ+p9BeZb173/3yCBuftef0sbel/gqw/5Bcm51p9/Yj13xC8XmM+PxOD25MdWtbvjd8t1HvDcd/Q/MYbczbruKJfdwQbcl/KnzaKm2Og8j8iL2TMysuNML8Q+/4rfcv4dXu3rdymvdCinb0LixtFd7bU9qMyiTeOJOulswndltlWF34ywVPPGUfr1u/JyW53DGzICQmbF0YnvXf9wfLco2Eqz0NydNP2XYJGPH7RvN+K3yBtdd0QTt4wJTacpw2qOCdjf1zG6pcyu97lYKysmIugaqftigf/QsR4e1702ChcGjLGAb+C/oftsi5m0ZX9+fG4bSz8aB9aPuBKWEhMSsWZ/zi7Mvgn403WFzuzA7hqja2yX+8q7cv4Oa4/Pta1ui7SYbT6TfMjgO6+i8db9M1f9zeveAf+GWlx33etva0Nvfb1PgPbWn3ti3dyqO/X22pEY1h4fjGPtPqC0Bju9uZx97g94Ylx2N7vb2OUGgPtLPEJY4HdeVUbIomvDp1/d9hGlE28MyfE++2h87YwpzdVm4fhvLI9PfOPupycaoX3B5brVn5dY4Pr0oh1nzV772r5eIqFhtlQb0Tt9SVGqjbTWvTcoenYrfmfrHz5ahYZ5pPIGPDF0N7t5lHWX6h+fyix8qpeM0d4Agot8Lzwcd2BJZC8U6vTxWEgyIKxMk1YvEaKHc47+4zGDkoputO7Jt9U8wJ+HWv/TGPjE0N3sRnSX6qM+C3+AwPwWkYDyXaa/mZSrnHe5LXPia0KB/k4sJGHd/UnKIg4/LAzAK6N1H/KQEN5q/Y9jwBNDd7NR0F2qm9osfAkb5luwmBV0W2y+CrYjcP89uxVP7T/uz1VnhmzYuivcmf1GbEbK324rOJuxfeWvMT+NX7/uN4Tv2//3bv2jqdow31zagCeG7mbj8NvvUt3UZ+GbapjN6xwtYAbMX11cBuYE9mtNCywmvPbTptszlY55GBaTMu0Rl2NiPWAeyq9e98DXNZ67X4b3bv0bM+SJobvZaPz2u1QHzVn4pgIzIStzljs8OQyL8Pdkfrct7k1mM27Kuh6XUbSS9cXNs4AF/57dxF/G7173uIf4kFHrfxxnnxi6m43IL79LddKYhe8qMJ80ygc+3kC/nJvWJ79T6LOA9Ea3ZP84MHt2P14dmxH2asRmfEkAeCy/ed0LcR2Dnhi6m42G7lJttM3CdxWYt3wwZcpXn73mi7Hkt5rWJ9y419wd+Eds48WG/4FYSsJH365y908fMJ/A71334lfhvpw5G8WCecATQ3ezUdFdqknLLHz7TX/vhH3/zs1rtiLiz62uzC1gxVw3yXYsZcK/t3l5/FX81nUvxHWM88QQl6C7VJ22WSiB+YFYCO9gPnKHfgdjiHIWEEokbMdCDnrAvCa/dd0LcR1jPTHEcHSXqtM2C/8fz7w8trOOptUAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTItMDNUMjI6MzI6NDUtMDg6MDDQUQw/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEyLTAzVDIyOjMyOjQ1LTA4OjAwoQy0gwAAABR0RVh0cGRmOlZlcnNpb24AUERGLTEuNSAFXAs5AAAAAElFTkSuQmCC" alt="\optionshowpath{/mybox}" class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.000em;height:10.173em"></div></div><h2 id="sec-advanced-topics" class="h1 sans-serif" data-heading-depth="1" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">6</span>. </span>Advanced topics</h2> +<p class="p noindent">This section gives an overview of more advanced mechanisms, +like defining handlers and new data types. +</p><h3 id="sec-handlers" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">6.1</span>. </span>Handlers</h3> +<p class="p noindent">Names that start with a dot are <em class="em-low1">handlers</em>. These are commands that are +called with the current option path and argument, and are used for example to declare +new options (e.g. <code class="code code1 language-latex lang-latex latex colorized">.new choice</code>), to change the environment (e.g. <code class="code code1 language-latex lang-latex latex colorized">.cd</code>), or to +transform the argument (e.g. <code class="code code1 language-latex lang-latex latex colorized">.expanded</code>). +</p> +<p class="p indent">You can define your own handler <code class="code code1 language-latex lang-latex latex colorized">.<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span></code> by adding a command option under +<code class="code code1 language-latex lang-latex latex colorized">/handlers/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span></code>. For example, let's make a handler that transforms a +color argument from a HTML format <code class="code code1 language-latex lang-latex latex colorized">#XXXXXX</code> to a named color: +</p> +<div class="mathdefs input-mathdefs" style="line-adjust:0"></div> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block;line-adjust:0;text-indent:0pt"><code><span style="color:navy">\options</span>{<span style="color:darkgreen">%</span> + /handlers/htmlcolor/.new transformer = {<span style="color:darkgreen">%</span> + <span style="color:darkgreen">% we need to change the \optionvalue </span> + <span style="color:darkgreen">% #1 = current path, #2 = current \optionvalue</span> + <span style="color:navy">\definecolor</span>{<span class="constant" style="color:navy">#1</span>/<span style="color:navy">@color</span>}{HTML}{<span class="constant" style="color:navy">#2</span>}<span style="color:darkgreen">%</span> + <span style="color:navy">\def</span><span style="color:navy">\optionvalue</span>{<span class="constant" style="color:navy">#1</span>/<span style="color:navy">@color</span>}<span style="color:darkgreen">%</span> + } +}</code></pre> +<p class="p noindent">We can use our new handler directly with our previous box command: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code>A <span style="color:navy">\mybox</span>{border/color/.htmlcolor = 800080}{purple} box.</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAARMAAABCCAMAAABD0sJsAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAASFBMVEX///+BAIGAAICAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACBAIGAAICAAICAAIAAAAD///+vmTP8AAAAFXRSTlMAl8eIIpmIM1W7Zt3uRMyqEXenIkS4aVWkAAAAAWJLR0QAiAUdSAAAAAlvRkZzAAAC3QAAAgQAhP25fAAAAAlwSFlzAAABLAAAASwAc4jpUgAAAAd0SU1FB98MAxYgLTAJ4aAAAAAJdnBBZwAACfYAAAzkAHCJzVIAAAUzSURBVHja7ZrtlqMgDIa7MxLkS3B2x/u/1A2ICBaqtt1pztnml2VIeH0kGHAul+P265uW/Tqh/V/Zx6shbOzj1UDQPr8/Xy2BnBoaKmipoaGClhoaKmipoaGClhoaKmipoaGClhoaKmipoaGClhoaKmipoaHip9V0rCOg4pj9lBqY2KtV8B4ABL+DCZcHPc+ZmvSrmYjJm7mDyWHPU9ZjzP7FTPB5D/cxQf36+UwYMrmRPD+XwXcyudjnM0HMt5KHPpNjnmesnzDmJN9MMmO2Qyb2zSQzLS+4vE3uzSSZRBrjreT5D5lYzBp3K3n+PyYuTBB7I3kqKpwxvjc3ptwUZL+xS3kZfdremzvjI4C83nPcYHIlx4/l6+OzwGR4C8sbybNVYWPhCEoJNakxNrPQDOF2dLjOeqNubQdtmt5bJr3STIKYmNtRs3g6UIKJSRV30bHJggSlYcYsovmdAMyXULljG6o1nzzDQSYS/O33g/UPxahp4LEZFiYdgFqYzL0vjDkTqqCG94YJTEM3PyvV3VYTPeUAnp5j0XEGq9UcfZwGN+sKOwHowmTw9wyVmeBiVe8fX2NzXFGBkXUM5nCztNwWi0wi5KW3L9rtJSzkt7wzJjDpKMZuH1WDSZrlbA3Ypyg4tnZJo0jc60klYwHrk2es9qipgGwzgI9/cKk5TcWMCTb7h4f3DzveZrmZFMdsc7rBJI2Lo0SKnc5cxULikrZVYhl4a8OiTjeTp85kRSySojYTe8w7NqtszurNC3H3vTMuAW3+2pCJrdPz9JEtJF3aELNm8uwxkWm31GYyHvOem3GaqJzZOSY8BuyKh9ytMU34A9etI5cx7f36ZvLsMenS8UWbiTnmnS5E3rkQv1+fxIBjHiW0LnH8THK6eToy6OX15BdkVe2zx+SyvG7uYlJ4x0RHJbCY2DjvM9FzQJGJmYdJq4v1A7SQdBPkg0/V6bTLZHiIyVBjIiAzd46JaDHJ1+GpeQI9ZjODT2WQ40zEQ0xEjUnzKT6FSXgTusYAxQxSjeR5Re6IS8vO5E5+eJgvl0ZD82SRF8kCjeTZY+IeWmPdzhp7nkkMCFdr7NKnw/UVWnsZKCqSVvI8411sjnmbJCTr3rtTTJZ3MS+mvVl/ucFPmKGxeqry5dtInuM1myzqz2NMajWbyL8jOF0sh8drNpEvpOMqjYUiEKtctcJ2ki+6zTZ07ZtGnUmaEFl1brKBbzOpea/dUG9WoJR5tFfb45ONAXm2ZqwVP+5m5j/3WW45ve7oy1Qx9W8adSZLGZjv4nB5i/5cZPWnvWZS885SPJtwvJwmDSYq24emS7mOm1odJBLZjnUMXy64ZH6vzFKychP299hiNnlWZzKqMB4fst0+qpiH5oojE9sbh3FHv5WS6USp7s2NxAwf+ngq1OPzCv1Hta8GA/Z8DujPClYHjDLmrV0POu3Jw1mBlWHAPhyVzF8Us8U4NOhwGCR2Vfhp3okBwE7lmiSVZtiKCpZPlmmg/HDk2jt1i4/OMa0FWC22tVWVifAzEwMyXcrxUSxWo7EV4hjhRzEgzrRTX5yba2wnQV5FMhJG3yj7ykngrncRaYT+2NnjbLwaEKPIp39g36/ZztpD3jT+8+PN5M3kzeRpKh7754aHvGkywVICX9miN9090R7zpspkW0qcs8e8qTJ5q6GigpYaGipoqaGhgpYaGipoqaGhgpYaGipoqaGhgpYaGipoqaGhgpYaGipoqaGhgpaar++PTzr28f31aiCBCS2jwOT3H1r2+x/d51/SHqiOhzQ9gwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNS0xMi0wM1QyMjozMjo0NS0wODowMNBRDD8AAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTUtMTItMDNUMjI6MzI6NDUtMDg6MDChDLSDAAAAFHRFWHRwZGY6VmVyc2lvbgBQREYtMS41IAVcCzkAAAAASUVORK5CYII=" alt="A \mybox{border/color/.htmlcolor = 800080}{purple} box." class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.585em;height:1.717em"></div></div> +<p class="p noindent">There are various kinds of handlers: +</p> +<ul class="ul list-star compact"> +<li class="li ul-li list-star-li compact-li"><code class="code code1 language-latex lang-latex latex colorized">.new handler</code>: a general handler that does not chain nor invoke the original option. +</li> +<li class="li ul-li list-star-li compact-li"><code class="code code1 language-latex lang-latex latex colorized">.new operation</code>: chains with other handlers but does not invoke the original option. +</li> +<li class="li ul-li list-star-li compact-li"><code class="code code1 language-latex lang-latex latex colorized">.new transformer</code>: transforms the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> and chains with other handlers. +</li></ul> +<h3 id="sec-defining-new-data-types" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">6.2</span>. </span>Defining new data types</h3> +<p class="p noindent">Handlers are also used to define the standard data types and can be used +to define new data types yourself. Here is for example how the <code class="code code1 language-latex lang-latex latex colorized">value</code> +data type is defined: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\option</span>{ + /handlers/new value/.new handler = []<span style="color:navy">\optionsalso</span>{<span style="color:darkgreen">%</span> + <span class="constant" style="color:navy">#1</span>/.new cmd = <span style="color:navy">\option@set</span>{<span class="constant" style="color:navy">#1</span>}{<span class="constant" style="color:navy">##1</span>}, + <span class="constant" style="color:navy">#1</span>/.type = value, + <span class="constant" style="color:navy">#1</span>/.initial = {<span class="constant" style="color:navy">#2</span>}, + }, +}</code></pre> +<p class="p noindent para-continued">The <code class="code code1 language-latex lang-latex latex colorized">.new handler</code> receives the current path (<code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#1</span></code>) and the initial value (<code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#2</span></code>). +The default value provided at definition time is empty (<code class="code code1 language-latex lang-latex latex colorized">[]</code>). When a user +defines a new value, we simply set more options based on the path. When the +defined option is set, the <code class="code code1 language-latex lang-latex latex colorized">.new cmd</code> is called with the argument (<code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">##1</span></code>) and +we use that set the actual option value directly: <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@set</span>{<span class="constant" style="color:navy">#1</span>}{<span class="constant" style="color:navy">##1</span>}</code>. +Usually, we do some additional processing here, for example, for choice values +we would check if the choice is valid. +</p><h3 id="sec-special" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">6.3</span>. </span>Single option values</h3> +<p class="p noindent">Finally, we can also specify handlers that are invoked when the option name +starts with special character. This allows you to handle, say, a quoted value +like <code class="code code1 language-latex lang-latex latex colorized">"Georgia"</code> as a shorthand for <code class="code code1 language-latex lang-latex latex colorized">/font/family=Georgia</code>. As an example, we +will handle options that start with a bang (<code class="code code1 language-latex lang-latex latex colorized">!</code>) as an HTML color. +Handling a special character <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">char</em>〉</span></span></code> can be done simply by installing a handler +under <code class="code code1 language-latex lang-latex latex colorized">/handlers/special/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">char</em>〉</span></span></code>: +</p> +<div class="sampleshow" style="border:solid 1px black;padding:0em 1em 1em 1em;margin-bottom:1em;margin-top:1em;spellcheck:false"> + +<pre class="para-block pre-fenced pre-fenced5 language-latex lang-latex latex colorized" style="display:block;line-adjust:0"><code><span style="color:navy">\options</span>{<span style="color:darkgreen">%</span> + /handlers/special/!/.new handler = {<span style="color:darkgreen">%</span> + <span style="color:navy">\optionsalso</span>{ /mybox/border/color/.expanded/.htmlcolor = <span style="color:navy">\@gobble</span><span class="constant" style="color:navy">#2</span> }<span style="color:darkgreen">%</span> + }, +} +A <span style="color:navy">\mybox</span>{!008080}{teal} box.</code></pre> +<div class="snippet input-math" style="display:block;snippet-needpdf:true;line-adjust:0;text-indent:0pt"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAOIAAAA6CAMAAACao3WnAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAV1BMVEX///8AgYEAgIAAgIAAgIAAgIAAgIAAgIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgYEAgIAAgIAAgIAAgIAAAAD///8Ib1ChAAAAGnRSTlMAl8jH7IhEuyKZiDNVu2bd7kTMqhF3p9YiMz9dYlMAAAABYktHRACIBR1IAAAACW9GRnMAAAJQAAACBAAm0756AAAACXBIWXMAAAEsAAABLABziOlSAAAAB3RJTUUH3wwDFiAtMAnhoAAAAAl2cEFnAAAJ9gAADOQAcInNUgAABFdJREFUaN7tmet64yYQhr1tdxeGs4DdNtz/fXY4ScgG2bKjJ00qfiTWwTDvzMcw4Mvl8fbt7dD2xw5Tjmp/Hov410fzYfv+9uPA3t9+fjTfiXginogn4ol4Ip6IJ+InRCSUfHVECPR4RMYBQLC7iEx233uxqaCPRxQhNnMXcfDea41jl/xwRIzP9Agi2qPfHZEi4oZSu4hya/aOGjyGeLHvjohO21JqF/EpGx5FhPdG5AG7DPIrI1JLENHuQjSfC1HLC+aB4PYgwqdClAjnt5TaQ1SfCtGiRN2WUjuIT9rwQYguhc9uKPUW0XfWZuYBVisJiVXKukjZiciMuVmaXKyRdvJLnf5uKPUKkYCK5cckYqs3udJUggi0+slRBV7SoNqaYg+iAyWoCGplFaHBggSlIXlVlBYdCfkjdABsWvSjUqdHESFCUohttmki2VMq+91pn/4z3RYVOxDlBC55qvScHalVloUPk0uWpGoPSApVRIBOnFwp3aJSBwVLZy6Kta0QdPmuLY6iusTToAXPIM6aokFXtfN5GGTUrjwOYnZzX8BZp1mp/klEvmCYYttSEk5N4bQDcfaLU1VeRDdzSVSyue4V0yCZTFVHeqjUu4iqEYDOmTk0zl1efSqj+spr24woa5ydzrGVI0IybzHoUKn3EDGIqn2SjazyehmRlQKarGJA5kFNus/0aIfpdWPoQKn3EGGOWL64WShk8/mJdbGsUL4dJt0tA8UwOz3cDU66Jt6Ym1T3nXuIeKGgtvYJLpVCqGZePYeocw+iTVwJsbrORgNGhCRAa1zoBvsBRAFNy3OCAE5Lbwi8jChGiPXSqeFqgDFu4sbCuo89iLffQystKR+ORozvj5LNZRVfNVDqBiKR+UJcv2BnGb2OuAi1PZpoUofRMDy2YCtlwkCpG4hGXK7SzdyVXT6+iFjSDdykm/IOwVQDo/oTVivhSKn3EOP3mmfcJcdXZ2XEXOq9tGiwlcjMfOWmGM1pkEjUepUYKPUeYrxaUrbDhdg00PRVxHnpF21Sme9eaNILlj5qmY5OsuoJc91z77BxY7/oaem+WRjFZYWonkNc5KRqKmHNhFvKOlmKVd7o2JXpG3cBa12a/mFjB5GVLkSeAHIxiaVqajkI9dlcwYvpNzOmj6jmYqUpw+XioXrXwQxGFyN8OlJkksbdB+U1uszkfSDl5krUvYMNm4aQVdccvZU68nm3E2u6JCo/ob4UMSoOIHHCTPxqm9tH5EwlmriZWszBYXxzl3Bce4Mubo44Vqbeedoa5mP1Zveebuj43nV+7CGi9zS1S13oqNYCrBbFfoY+wB2lQnCHYBF8HnEtnS6iiPvdCYDqdbqIw1gsUvJdKB2mR6veIahdP4r0D/zRhXK13BoPvAmQMwBFImxruPEvU0yCvP0mDiPf+zedr/Hj24l4Ip6IJ+KJeCKeiCfi/wnx19uv78e1t98fzZcQD23/BcS/fxza/jnI7H8BiOeW4zZyz3MAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTUtMTItMDNUMjI6MzI6NDUtMDg6MDDQUQw/AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE1LTEyLTAzVDIyOjMyOjQ1LTA4OjAwoQy0gwAAABR0RVh0cGRmOlZlcnNpb24AUERGLTEuNSAFXAs5AAAAAElFTkSuQmCC" alt="\options{% + /handlers/special/!/.new handler = {% + \optionsalso{ /mybox/border/color/.expanded/.htmlcolor = \@gobble#2 }% + }, +} +A \mybox{!008080}{teal} box." class="snippet math-display math" style="snippet-needpdf:true;vertical-align:-0.373em;height:1.509em"></div></div> +<p class="p noindent">Here we used chaining to first expand the argument (<code class="code code1 language-latex lang-latex latex colorized">.expanded</code>) and then +invoking the <code class="code code1 language-latex lang-latex latex colorized">.htmlcolor</code> handler. We needed to use <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\@gobble</span></code> to remove +the exclamation mark from the provided argument (i.e. <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#2</span></code> will be +equal <code class="code code1 language-latex lang-latex latex colorized">!008080</code>). +</p><h3 id="sec-search-algorithm" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">6.4</span>. </span>Search algorithm</h3> +<p class="p noindent">When <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span></code> parses the options and finds an option and argument, it +will assign argument to <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> and search for the option: +</p> +<ol class="ol compact"> +<li class="li ol-li compact-li">If the option name is not absolute (i.e. does not start with <code class="code code1 language-latex lang-latex latex colorized">/</code>) +then prepend the default path (<code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\opt@defaultpath</span></code>). +</li> +<li class="li ol-li compact-li">If the option exist we are done; invoke <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code>. +</li> +<li class="li ol-li compact-li">Otherwise, if the option has handlers <code class="code code1 language-latex lang-latex latex colorized">.<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span></code> look for the first +handler and invoke <code class="code code1 language-latex lang-latex latex colorized">/handlers/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span>/<span style="color:navy">@code</span></code> if it exists with +<code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@handlerpath</span></code> set to the option path. +</li> +<li class="li ol-li compact-li">If there is no handler, perform a search bottom-up through the +sub-paths of the option path. If <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">path</em>〉</span></span>/<span style="color:navy">@searchalso</span></code> exists where +<code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> = <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">path</em>〉</span></span>/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">subpath</em>〉</span></span></code>, then invoke the search also handler +with <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">subpath</em>〉</span></span></code> as its argument, and keep searching recursively. +</li> +<li class="li ol-li compact-li">If we still don't find the option, search bottom-up through the +sub-paths of the option path for <code class="code code1 language-latex lang-latex latex colorized">/<span style="color:navy">@unknown</span></code> handlers and invoke +it the first one that is found. If none are defined, this will +invoke <code class="code code1 language-latex lang-latex latex colorized">/<span style="color:navy">@unknown</span></code> with <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> as its path which will raise +a package error. +</li></ol> + +<p class="p noindent">This may seem like quite a bit of work but there has been much attention +to efficiency. For example, we can match in a single <img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAE0AAAAnCAYAAABKZsWMAAAACXBIWXMAAA7EAAAOxAGVKw4bAAADw0lEQVRo3u1a3W3bMBD+zvAAjDtBlQ0UdANnA6WdIM5LnyVkgsLuBE7e+hbIG1gbpNYGVidorA3Yl1NKEBJ9lCXZcXIAgTjm8efj8b67o0lrjXMXIlIAoLUum75v+q5WGLQNAN1zS7XW6LIBiH3W0DDGXKgfVTpjxk4ZOJYAMgAFgL/8+QXABMAlL9SUxOqjuN8EQGT0Uz0Y0QpADiDgOWc185QAHgA8N4yx5H3e1+hmANaMRWZb2o7RXApO10R/K+ifSvt2YHmBsZeqzYS6oaGzBqAa+xpAbISDm4uS6mwB7PoGjeeKLNCka1QVYIK+r52jHkGLm3xKT8CtLeBigc6S96YkoAU8sOoRNK85OgBN1TjyQHA1RYYz4glKL8r1FK11wX9OhggxeC931r9Th0oKINNaryTjj9gKigH2UvbEoE3APTCzVhIS0awmRpszBjfSsUd8+kOAVvDihhQbiGUV6DJgIfvbO9+bFklp2denGeFGH23TMgBeW6y+9vWZ5JtGEdHOuGa51vrK0Tdk65o0BJ85s9aLY8pKd8oO+/W6a60vhGveWLo3vK45gAtvf96CmbzZ03HqUYvgdeNKiwSBqzb2MGvDzqOBfUxxoHMv2LILtqBAqJcDWFgpXcFk4S1Dg9aVVOFE4AF4Yh1aQETTdwOa1jrjEMaXjZOaZP3dWFpVgbj01Lm3Pgccp70b0J59LI2IYiaEK7bSSmJm+fMAjYhihyWIg2UmjDmAhEnh1iPFenOW9smRemUAfgjHSTmmXLBPXHEB07ym8bmAFriSckmCzflmWJNS3VrXdC4NYUYnfDWVVS5vM0bADLkwKi1mJSRpc01HpwCO1apqxJ8Ohl9yEJs4KiHZvkrIsdOoqEVivmxZiJyxfigskJrNWSwdH9nQEqvmVW3iijd9yNWurmW+LzUjooTZ1bym16dqaZEgyV62fCPYeupspWs7WSJgC8nbxHZcRvKN9G12fTQLlocSgZKEBB3JbwFIU6t0XYF1eeAhKQCPdX3He+haGYXAujq6IqIUwBP+v7JXBcIuSujOdwUi+g7gJxH9AvDV6huzpaSc4Lv83xTAN6tQCQARFzCfOAMptdaZ1Hf5tu2hPs1gtlD42t/Udh0zunKx5+eaYHAfY3Xt1/ZZ64LDg7sD5lgBIB+dsStN8Zy8xPASMlMOKm+5NAT2RfkHaPLQIjJKRB+gCWUu9HsfoBnxWHAMK3MSwdD1MY+c8tEoGeVnB5rxwg4AX2qS8HsimqDdCzuOZWl9/06sz99ytH4hP7T9AyKTc466woHYAAAAAElFTkSuQmCC" alt="$\mbox{\TeX}$" class="math-inline math" style="vertical-align:-0.243em;height:1.015em"> definition +for handlers since we evaluate chained handlers from left to right. Also, +we never search for handlers but just match directly etc. +</p><h2 id="sec-advanced-options-and-commands" class="h1 sans-serif" data-heading-depth="1" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7</span>. </span>Advanced options and commands</h2> +<p class="p noindent">This section introduces option handlers and commands +that are useful when extending the <code class="code code1 language-latex lang-latex latex colorized">options</code> package itself. +</p><h3 id="sec-transforming-an-option" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7.1</span>. </span>Transforming an option</h3> +<p class="p noindent para-continue">These operations transform an option itself. Usually +only used when defining new handlers but should not be +necessary in general. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.expands</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued para-continue">When applied to an option it ensures the option argument is +always fully expanded (as if using <code class="code code1 language-latex lang-latex latex colorized">.expanded</code> at every invocation). +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.default</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default value</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Set the default argument if the user does not provide one. +The default argument is stored in <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@def</span></code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.initial</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">initial</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Set the default argument (if provided) and the initial value +of an option. The initial value is stored in <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@ini</span></code> +and used when invoking <code class="code code1 language-latex lang-latex latex colorized">.reset</code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.reset</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued para-continue">Sets the option back to its original value. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.undef</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued para-continue">Undefine an option. This can be used to redefine existing options +of other packages. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.search also</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">search paths</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Specify additional search paths for the given <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> as +explained in Section <a href="#sec-searches" title="2.2. Paths and searches" class="localref" style="target-element:h2"><span class="heading-label">2.2</span></a>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.type</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">type</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Specify the type of an option. This is used for example by the +default <code class="code code1 language-latex lang-latex latex colorized">.show</code> function to display values correctly. The type +can be queried using <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\letoptiontype</span></code>, <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptiontype</span></code>, and +<code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\ifoptioniscode</span></code>. +</p><h3 id="sec-compatibility" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7.2</span>. </span>Compatibility</h3> +<p class="p noindent para-continue">Some compatibility functions for <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code> users. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.is family</code></span><code class="code code1 language-latex lang-latex latex colorized"></code> +</div> +<p class="p noindent para-continued para-continue">Equivalent to <code class="code code1 language-latex lang-latex latex colorized">.new family</code> (but without a search argument) +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.code</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Equivalent to <code class="code code1 language-latex lang-latex latex colorized">.new cmd</code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.style</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">style</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Equivalent to <code class="code code1 language-latex lang-latex latex colorized">.new style</code>. +</p><h3 id="sec-special-paths" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7.3</span>. </span>Special paths</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/handlers/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span></code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Define such path to install a new handler <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span></code>. The <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +takes two arguments (the current path and argument) and should be defined +using <code class="code code1 language-latex lang-latex latex colorized">.new handler</code>, <code class="code code1 language-latex lang-latex latex colorized">.new operation</code>, or <code class="code code1 language-latex lang-latex latex colorized">.new transformer</code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/handlers/show/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">type</em>〉</span></span></code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Provide custom show functions for options of type <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">type</em>〉</span></span></code>. The <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> takes +a single argument, namely the option name. For example: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code>/handlers/show/length/.new cmd = <span style="color:navy">\option@showvalue</span>{<span style="color:navy">\the</span><span style="color:navy">\option</span>{<span class="constant" style="color:navy">#1</span>}}</code></pre> +<p class="p noindent para-continued para-continue">Using <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@showvalue</span></code> ensures option values are shown consistently. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/handlers/special/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">char</em>〉</span></span></code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Provide handlers for options that start with a special character, see +Section <a href="#sec-special" title="6.3. Single option values" class="localref" style="target-element:h2"><span class="heading-label">6.3</span></a>. +</p><h3 id="sec-miscellaneous-commands" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7.4</span>. </span>Miscellaneous commands</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionerror</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">message</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Raise a package error for <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> with a certain message. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionwarning</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">message</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Output a package warning for <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> with a certain message. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionerror@expect</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">expecting</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Raise a package error for <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> with an <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">expecting</em>〉</span></span></code> message. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\letoptiontype</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">type</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Bind the type of an option to <code class="code code1 language-latex lang-latex latex colorized">\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">type</em>〉</span></span></code>. +Properly takes care of command options. +</p><h3 id="sec-setting-options-directly" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7.5</span>. </span>Setting options directly</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionname</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Expand to the internal name of an options, i.e. <code class="code code1 language-latex lang-latex latex colorized">optk@<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@set</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Set the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optk@</span><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> macro to <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span></code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@eset</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Set the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optk@</span><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> macro to a single expansion of <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span></code> +(using <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\expandafter</span></code>). +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@def</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">pattern</em>〉</span></span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Define the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optk@</span><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> as a macro that takes parameters +defined in <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">pattern</em>〉</span></span></code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@let</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro</em>〉</span></span></code> +</div> +<p class="p noindent para-continued"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\let</span></code> the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optk@</span><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> macro to <code class="code code1 language-latex lang-latex latex colorized">\<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">macro</em>〉</span></span></code>. This can be +more efficient than <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options@set</span></code> if the value happens to be +a macro itself. +</p><h3 id="sec-invoking-an-option-directly" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7.6</span>. </span>Invoking an option directly</h3> +<p class="p noindent">Internally, every option <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> comes with <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code> that +is invoked when an option is set with the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> containing +the current argument. The <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> will equal <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionnovalue</span></code> +when no argument is given. A single expansion of <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> will +yield the exact value provided by the user (minus one layer of outer braces). +</p> +<p class="p indent para-continue">The <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span><span style="color:navy">@code</span></code> usually starts with an argument check. If no argument +is expected (the <code class="code code1 language-latex lang-latex latex colorized">*</code> options on commands) and error is raised if there was +an argument. If an argument is expected, and there is no argument, the +<code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> is set to the default argument (in <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@def</span></code>). If there +is no default, an error is raised. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@invoke</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span>}</code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@xinvoke</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span>}</code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@einvoke</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">value</em>〉</span></span>}</code> +</div> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@invokedefault</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">Various ways to invoke a option handler directly. The <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@invoke</span></code> +macros directly call <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code>. The <code class="code code1 language-latex lang-latex latex colorized">einvoke</code> does a single +expansion of its argument, and <code class="code code1 language-latex lang-latex latex colorized">xinvoke</code> does a full expansion. The +<code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\option@invokedefault</span></code> call the <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code> with <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> set +to <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionnovalue</span></code>. +</p><h3 id="sec-defining-a-new-code-value" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7.7</span>. </span>Defining a new code value</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new code</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Define a new <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code> handler. This is invoked when the option +<code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> is set with the macro <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> set to the argument. +This will equal <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionnovalue</span></code> if no argument was provided. This is +the most primitive command handler and it is recommended to use +<code class="code code1 language-latex lang-latex latex colorized">.new cmd</code> instead. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new code*</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Just like <code class="code code1 language-latex lang-latex latex colorized">.new code</code> but checks that <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span></code> did not get an argument, +i.e. that <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> equals <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionnovalue</span></code>. +</p><h3 id="sec-defining-new-handlers" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7.8</span>. </span>Defining new handlers</h3> +<p class="p noindent para-continue">To define handlers, we cannot use <code class="code code1 language-latex lang-latex latex colorized">.new code</code> since the handler +needs access to the option path it is handling. The <code class="code code1 language-latex lang-latex latex colorized">.new handler</code> +gets also passed this path as an argument. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/handlers/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span>/.new handler</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">Define a new handler <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span></code>. If <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span></code> is provided, +this will be the default argument for the newly defined handler. +The <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> takes two arguments, the option path (<code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#1</span></code>) when <code class="code code1 language-latex lang-latex latex colorized">.<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span></code> is +invoked, and the provided argument (<code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#2</span></code>). For example: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code>/handlers/new style*/.new handler = <span style="color:navy">\optionsalso</span>{ + <span class="constant" style="color:navy">#1</span>/.new cmd* = <span style="color:navy">\optionsalso</span>{<span class="constant" style="color:navy">#2</span>}, + <span class="constant" style="color:navy">#1</span>/.type = style, +},</code></pre> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized">/handlers/<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">name</em>〉</span></span>/.new handler*</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Similar to <code class="code code1 language-latex lang-latex latex colorized">.new handler</code> but for handlers that take on argument. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new transformer</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">A form of handler that transforms a provided argument. Should redefine +<code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code> which will be passed to the next handler. +Takes the option path and current option argument as arguments. +For example: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code>/handlers/expanded/.new transformer=<span style="color:navy">\protected@edef</span><span style="color:navy">\optionvalue</span>{<span style="color:navy">\optionvalue</span>}</code></pre> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new operation</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">A form of handler that is invoked for its side effect. +Takes the option path and current option argument as arguments. +In contrast with a transformer after this handler, the original option +will not be set and it only chains with other handlers. +For example: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code>/handlers/concat/.new operation = <span style="color:navy">\option@concat</span>{<span class="constant" style="color:navy">#1</span>}{<span class="constant" style="color:navy">#2</span>}</code></pre> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new operation*</code></span><code class="code code1 language-latex lang-latex latex colorized"> = <span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued para-continue">Same as <code class="code code1 language-latex lang-latex latex colorized">.new operation</code> but for operations that take no argument. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/.new cmd transformer</code></span><code class="code code1 language-latex lang-latex latex colorized"> = [<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">default</em>〉</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> +</div> +<p class="p noindent para-continued">A transformer that changes the option value of a command. For example: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code>/handlers/expands/.new cmd transformer={<span style="color:navy">\protected@edef</span><span style="color:navy">\optionvalue</span>{<span style="color:navy">\optionvalue</span>}}</code></pre><h3 id="sec-defining-options-directly" class="h2 sans-serif" data-heading-depth="2" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">7.9</span>. </span>Defining options directly</h3> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionprependcode</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Add some code to <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code> right after the argument check. +This is used for example by the <code class="code code1 language-latex lang-latex latex colorized">.expands</code> handler to always +expand the <code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionvalue</span></code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionnewcode</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Define a new <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code> handler that expects an argument. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionnewcode</span>*</code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Define a new <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code> handler that expects no argument. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionnewhandler</span></code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued para-continue">Define a new <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code> handler for defining a handler that +will take an argument. +This will insert some code that calls <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> with the option +path that is handled in <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#1</span></code> and the argument in <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#2</span></code>. +</p> +<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">​<span class="defcmd" style="color:navy;display:inline-block;margin-left:-14em;display: inline-block; width:14em;display: inline-block; text-align:right"><code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\optionnewhandler</span>*</code></span><code class="code code1 language-latex lang-latex latex colorized">{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span>}</code> +</div> +<p class="p noindent para-continued">Define a new <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">option</em>〉</span></span>/<span style="color:navy">@code</span></code> handler for defining a handler that +takes no argument. +This will insert some code that calls <code class="code code1 language-latex lang-latex latex colorized"><span class="code-escaped"><span class="param serif" style="font-size:120%">〈<em class="em-star1">code</em>〉</span></span></code> with the option +path that is handled in <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#1</span></code> and the argument in <code class="code code1 language-latex lang-latex latex colorized"><span class="constant" style="color:navy">#2</span></code>. +</p><h2 id="sec-perf" class="h1 sans-serif" data-heading-depth="1" style="display:block;font-weight:normal"><span class="heading-before"><span class="heading-label">8</span>. </span>Performance</h2> +<p class="p noindent">There are some performance numbers of the <code class="code code1 language-latex lang-latex latex colorized">options</code>, <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code> and +<code class="code code1 language-latex lang-latex latex colorized">xkeyval</code> packages. +To test the performance, we performed 100.000 invocations of +<code class="code code1 language-latex lang-latex latex colorized"><span style="color:navy">\options</span></code>, <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code>, and <code class="code code1 language-latex lang-latex latex colorized">setkeys</code> respectively. For each library, +we defined two options in the family <code class="code code1 language-latex lang-latex latex colorized">bar</code> and <code class="code code1 language-latex lang-latex latex colorized">foo</code>, as: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\options</span>{ + /bar/bar-test/.new value = hi, + /foo/foo-test/.new value = world, + /foo/.new family={/bar}, +}</code></pre> +<p class="p noindent para-continued">We then tested two queries. The first one is <em class="em-low1">simple</em> and set an option +that can be directly found: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\options</span>{/foo,foo-test=a test}</code></pre> +<p class="p noindent para-continued">and a <em class="em-low1">complex</em> one that needs a one-level search: +</p> +<pre class="para-block pre-fenced pre-fenced3 language-latex lang-latex latex colorized" style="display:block"><code><span style="color:navy">\options</span>{/foo,bar-test=a test}</code></pre> +<p class="p noindent para-continued">We measured the time of a run without any testing (the <em class="em-low1">baseline</em>) and +then ran each benchmark 100.000 times and picked the best time out of +three runs, subtracting the baseline time. The benchmarks were run +on an Intel Core2 Quad CPU @ 3ghz with 4Gb memory running XeLaTeX 3.1415926 +from TeX Live 2013/W32TeX. The results were: +</p> +<div class="center align-center" style="text-align:center"><table class="booktable madoko block" style="rule-top-width:2px;rule-bottom-width:2px rule-mid-width : 1.35px;thead-tr-font-weight:normal;rule-top-sep:4pt;rule-bottom-sep:4pt;rule-mid-sep:3pt;thead-tr-1-padding-top:3pt;thead-tr-padding-bottom:3pt"> +<thead><tr><th class="thead tr-even col cell-line col-odd col-first" data-row="0" data-col="1" style="rule-width:2px;border-top-width:2px;border-bottom-width:2px"></th><th class="thead tr-even col cell-line col-even" data-row="0" data-col="2" style="text-align:right;rule-width:2px;border-top-width:2px;border-bottom-width:2px"></th><th class="thead tr-even col cell-line col-odd" data-row="0" data-col="3" style="text-align:right;rule-width:2px;border-top-width:2px;border-bottom-width:2px"></th><th class="thead tr-even col cell-line col-even col-last" data-row="0" data-col="4" style="text-align:right;rule-width:2px;border-top-width:2px;border-bottom-width:2px"></th></tr> +<tr><th class="col thead tr-odd tr-first col-odd col-last col-first" data-row="1" colspan="4" data-col="1" style="font-weight:normal;padding-top:3pt;padding-bottom:3pt;text-align:center"> <em class="em-low1">simple</em> </th></tr> +<tr><th class="col thead tr-even tr-last col-odd col-first" data-row="2" data-col="1" style="font-weight:normal;padding-bottom:3pt"> package </th><th class="col thead tr-even tr-last col-even" data-row="2" data-col="2" style="text-align:right;font-weight:normal;padding-bottom:3pt"> relative </th><th class="col thead tr-even tr-last col-odd" data-row="2" data-col="3" style="text-align:right;font-weight:normal;padding-bottom:3pt"> total </th><th class="col thead tr-even tr-last col-even col-last" data-row="2" data-col="4" style="text-align:right;font-weight:normal;padding-bottom:3pt"> 100.000 reps. </th></tr></thead> +<tbody><tr><td class="tbody tr-even col cell-line col-odd col-first" data-row="0" data-col="1"></td><td class="tbody tr-even col cell-line col-even" data-row="0" data-col="2" style="text-align:right"></td><td class="tbody tr-even col cell-line col-odd" data-row="0" data-col="3" style="text-align:right"></td><td class="tbody tr-even col cell-line col-even col-last" data-row="0" data-col="4" style="text-align:right"></td></tr> +<tr><td class="tbody tr-odd tr-first col col-odd col-first" data-row="1" data-col="1" style="padding-top:3pt"> <code class="code code1 language-latex lang-latex latex colorized">options</code> </td><td class="tbody tr-odd tr-first col col-even" data-row="1" data-col="2" style="text-align:right;padding-top:3pt"> 1.0x </td><td class="tbody tr-odd tr-first col col-odd" data-row="1" data-col="3" style="text-align:right;padding-top:3pt"> 3.41s </td><td class="tbody tr-odd tr-first col col-even col-last" data-row="1" data-col="4" style="text-align:right;padding-top:3pt"> 25ms per 1000 </td></tr> +<tr><td class="tbody tr-even col col-odd col-first" data-row="2" data-col="1"> <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code> </td><td class="tbody tr-even col col-even" data-row="2" data-col="2" style="text-align:right"> 1.3x slower </td><td class="tbody tr-even col col-odd" data-row="2" data-col="3" style="text-align:right"> 4.34s </td><td class="tbody tr-even col col-even col-last" data-row="2" data-col="4" style="text-align:right"> 34ms per 1000 </td></tr> +<tr><td class="tbody tr-odd tr-last col col-odd col-first" data-row="3" data-col="1" style="padding-bottom:4pt"> <code class="code code1 language-latex lang-latex latex colorized">xkeyval</code> </td><td class="tbody tr-odd tr-last col col-even" data-row="3" data-col="2" style="text-align:right;padding-bottom:4pt">  8.1x slower </td><td class="tbody tr-odd tr-last col col-odd" data-row="3" data-col="3" style="text-align:right;padding-bottom:4pt">  27.77s </td><td class="tbody tr-odd tr-last col col-even col-last" data-row="3" data-col="4" style="text-align:right;padding-bottom:4pt">  268ms per 1000 </td></tr> +<tr><td class="tbody tr-odd col cell-line col-odd col-first" data-row="3" data-col="1" style="rule-width:2px rule-mid-width : 1.35px;border-top-width:2px rule-mid-width : 1.35px;border-bottom-width:2px rule-mid-width : 1.35px"></td><td class="tbody tr-odd col cell-line col-even" data-row="3" data-col="2" style="text-align:right;rule-width:2px rule-mid-width : 1.35px;border-top-width:2px rule-mid-width : 1.35px;border-bottom-width:2px rule-mid-width : 1.35px"></td><td class="tbody tr-odd col cell-line col-odd" data-row="3" data-col="3" style="text-align:right;rule-width:2px rule-mid-width : 1.35px;border-top-width:2px rule-mid-width : 1.35px;border-bottom-width:2px rule-mid-width : 1.35px"></td><td class="tbody tr-odd col cell-line col-even col-last" data-row="3" data-col="4" style="text-align:right;rule-width:2px rule-mid-width : 1.35px;border-top-width:2px rule-mid-width : 1.35px;border-bottom-width:2px rule-mid-width : 1.35px"></td></tr></tbody></table><table class="booktable madoko block" style="rule-top-width:2px;rule-bottom-width:2px rule-mid-width : 1.35px;thead-tr-font-weight:normal;rule-top-sep:4pt;rule-bottom-sep:4pt;rule-mid-sep:3pt;thead-tr-1-padding-top:3pt;thead-tr-padding-bottom:3pt"> +<thead><tr><th class="thead tr-even col cell-line col-odd col-first" data-row="0" data-col="1" style="rule-width:2px;border-top-width:2px;border-bottom-width:2px"></th><th class="thead tr-even col cell-line col-even" data-row="0" data-col="2" style="text-align:right;rule-width:2px;border-top-width:2px;border-bottom-width:2px"></th><th class="thead tr-even col cell-line col-odd" data-row="0" data-col="3" style="text-align:right;rule-width:2px;border-top-width:2px;border-bottom-width:2px"></th><th class="thead tr-even col cell-line col-even col-last" data-row="0" data-col="4" style="text-align:right;rule-width:2px;border-top-width:2px;border-bottom-width:2px"></th></tr> +<tr><th class="col thead tr-odd tr-first col-odd col-last col-first" data-row="1" colspan="4" data-col="1" style="font-weight:normal;padding-top:3pt;padding-bottom:3pt;text-align:center"> <em class="em-low1">complex</em> (one level search) </th></tr> +<tr><th class="col thead tr-even tr-last col-odd col-first" data-row="2" data-col="1" style="font-weight:normal;padding-bottom:3pt"> package </th><th class="col thead tr-even tr-last col-even" data-row="2" data-col="2" style="text-align:right;font-weight:normal;padding-bottom:3pt"> relative </th><th class="col thead tr-even tr-last col-odd" data-row="2" data-col="3" style="text-align:right;font-weight:normal;padding-bottom:3pt"> total </th><th class="col thead tr-even tr-last col-even col-last" data-row="2" data-col="4" style="text-align:right;font-weight:normal;padding-bottom:3pt"> 100.000 reps. </th></tr></thead> +<tbody><tr><td class="tbody tr-even col cell-line col-odd col-first" data-row="0" data-col="1"></td><td class="tbody tr-even col cell-line col-even" data-row="0" data-col="2" style="text-align:right"></td><td class="tbody tr-even col cell-line col-odd" data-row="0" data-col="3" style="text-align:right"></td><td class="tbody tr-even col cell-line col-even col-last" data-row="0" data-col="4" style="text-align:right"></td></tr> +<tr><td class="tbody tr-odd tr-first col col-odd col-first" data-row="1" data-col="1" style="padding-top:3pt"> <code class="code code1 language-latex lang-latex latex colorized">options</code> </td><td class="tbody tr-odd tr-first col col-even" data-row="1" data-col="2" style="text-align:right;padding-top:3pt"> 1.0x </td><td class="tbody tr-odd tr-first col col-odd" data-row="1" data-col="3" style="text-align:right;padding-top:3pt"> 5.32s </td><td class="tbody tr-odd tr-first col col-even col-last" data-row="1" data-col="4" style="text-align:right;padding-top:3pt"> 44ms per 1000 </td></tr> +<tr><td class="tbody tr-even col col-odd col-first" data-row="2" data-col="1"> <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code> </td><td class="tbody tr-even col col-even" data-row="2" data-col="2" style="text-align:right"> 2.1x slower </td><td class="tbody tr-even col col-odd" data-row="2" data-col="3" style="text-align:right"> 11.10s </td><td class="tbody tr-even col col-even col-last" data-row="2" data-col="4" style="text-align:right"> 101ms per 1000 </td></tr> +<tr><td class="tbody tr-odd tr-last col col-odd col-first" data-row="3" data-col="1" style="padding-bottom:4pt"> <code class="code code1 language-latex lang-latex latex colorized">xkeyval</code> </td><td class="tbody tr-odd tr-last col col-even" data-row="3" data-col="2" style="text-align:right;padding-bottom:4pt">  5.7x slower </td><td class="tbody tr-odd tr-last col col-odd" data-row="3" data-col="3" style="text-align:right;padding-bottom:4pt">  30.34s </td><td class="tbody tr-odd tr-last col col-even col-last" data-row="3" data-col="4" style="text-align:right;padding-bottom:4pt">  294ms per 1000 </td></tr> +<tr><td class="tbody tr-odd col cell-line col-odd col-first" data-row="3" data-col="1" style="rule-width:2px rule-mid-width : 1.35px;border-top-width:2px rule-mid-width : 1.35px;border-bottom-width:2px rule-mid-width : 1.35px"></td><td class="tbody tr-odd col cell-line col-even" data-row="3" data-col="2" style="text-align:right;rule-width:2px rule-mid-width : 1.35px;border-top-width:2px rule-mid-width : 1.35px;border-bottom-width:2px rule-mid-width : 1.35px"></td><td class="tbody tr-odd col cell-line col-odd" data-row="3" data-col="3" style="text-align:right;rule-width:2px rule-mid-width : 1.35px;border-top-width:2px rule-mid-width : 1.35px;border-bottom-width:2px rule-mid-width : 1.35px"></td><td class="tbody tr-odd col cell-line col-even col-last" data-row="3" data-col="4" style="text-align:right;rule-width:2px rule-mid-width : 1.35px;border-top-width:2px rule-mid-width : 1.35px;border-bottom-width:2px rule-mid-width : 1.35px"></td></tr></tbody></table></div> +<p class="p noindent">So both <code class="code code1 language-latex lang-latex latex colorized">options</code> and <code class="code code1 language-latex lang-latex latex colorized">pgfkeys</code> are quite a bit faster than <code class="code code1 language-latex lang-latex latex colorized">xkeyval</code>, +and <code class="code code1 language-latex lang-latex latex colorized">options</code> performs quite well when searches are involved. We also +tested against the basic <code class="code code1 language-latex lang-latex latex colorized">keyval</code> package but this is a bit tricky since +<code class="code code1 language-latex lang-latex latex colorized">keyval</code> does not support features like searching in the first place. +It was about 1.5 times faster on simple queries though. +</p> +<div class="logomadoko" style="display:block;text-align:right;font-size:xx-small;margin-top:4em">Created with <a href="https://www.madoko.net">Madoko.net</a>.</div><span data-line=""></span></div> +</body> + +</html> diff --git a/Master/texmf-dist/doc/latex/options/options.pdf b/Master/texmf-dist/doc/latex/options/options.pdf Binary files differnew file mode 100644 index 00000000000..afd4c83d8ca --- /dev/null +++ b/Master/texmf-dist/doc/latex/options/options.pdf |