summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/options
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/options
Initial commit
Diffstat (limited to 'macros/latex/contrib/options')
-rw-r--r--macros/latex/contrib/options/README74
-rw-r--r--macros/latex/contrib/options/options.html1659
-rw-r--r--macros/latex/contrib/options/options.pdfbin0 -> 114069 bytes
-rw-r--r--macros/latex/contrib/options/options.sty1387
4 files changed, 3120 insertions, 0 deletions
diff --git a/macros/latex/contrib/options/README b/macros/latex/contrib/options/README
new file mode 100644
index 0000000000..415a2f54a0
--- /dev/null
+++ b/macros/latex/contrib/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/macros/latex/contrib/options/options.html b/macros/latex/contrib/options/options.html
new file mode 100644
index 0000000000..4647dc672d
--- /dev/null
+++ b/macros/latex/contrib/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}.&#8194;Introduction" style="toctarget:sec-introduction"><a href="#sec-introduction" class="localref"><span class="heading-label">1</span>.&#8194;Introduction</a></div>
+<div class="tocitem tocitem1" data-toc-target="sec-overview" data-toc-depth="1" data-toc-line="[2]{.heading-label}.&#8194;Overview" style="toctarget:sec-overview"><a href="#sec-overview" class="localref"><span class="heading-label">2</span>.&#8194;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}.&#8194;An example" style="toctarget:sec-an-example"><a href="#sec-an-example" class="localref"><span class="heading-label">2.1</span>.&#8194;An example</a></div>
+<div class="tocitem tocitem2" data-toc-target="sec-searches" data-toc-depth="2" data-toc-line="[2.2]{.heading-label}.&#8194;Paths and searches" style="toctarget:sec-searches"><a href="#sec-searches" class="localref"><span class="heading-label">2.2</span>.&#8194;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}.&#8194;Handling unknown options" style="toctarget:sec-handling-unknown-options"><a href="#sec-handling-unknown-options" class="localref"><span class="heading-label">2.3</span>.&#8194;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}.&#8194;Defining options" style="toctarget:sec-defining-options"><a href="#sec-defining-options" class="localref"><span class="heading-label">3</span>.&#8194;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}.&#8194;Basic data types" style="toctarget:sec-datatypes"><a href="#sec-datatypes" class="localref"><span class="heading-label">3.1</span>.&#8194;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}.&#8194;Command options" style="toctarget:sec-command-options"><a href="#sec-command-options" class="localref"><span class="heading-label">3.2</span>.&#8194;Command options</a></div>
+<div class="tocitem tocitem2" data-toc-target="sec-hooks" data-toc-depth="2" data-toc-line="[3.3]{.heading-label}.&#8194;Using existing definitions" style="toctarget:sec-hooks"><a href="#sec-hooks" class="localref"><span class="heading-label">3.3</span>.&#8194;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}.&#8194;Option transformers" style="toctarget:sec-option-transformers"><a href="#sec-option-transformers" class="localref"><span class="heading-label">4</span>.&#8194;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}.&#8194;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>.&#8194;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}.&#8194;Operations on arguments" style="toctarget:sec-operations-on-arguments"><a href="#sec-operations-on-arguments" class="localref"><span class="heading-label">4.2</span>.&#8194;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}.&#8194;Predefined options" style="toctarget:sec-predefined-options"><a href="#sec-predefined-options" class="localref"><span class="heading-label">4.3</span>.&#8194;Predefined options</a></div></div>
+<div class="tocitem tocitem1" data-toc-target="sec-options" data-toc-depth="1" data-toc-line="[5]{.heading-label}.&#8194;Option commands" style="toctarget:sec-options"><a href="#sec-options" class="localref"><span class="heading-label">5</span>.&#8194;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}.&#8194;Processing options" style="toctarget:sec-process-options"><a href="#sec-process-options" class="localref"><span class="heading-label">5.1</span>.&#8194;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}.&#8194;Using options" style="toctarget:sec-using-options"><a href="#sec-using-options" class="localref"><span class="heading-label">5.2</span>.&#8194;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}.&#8194;Testing options" style="toctarget:sec-testing-options"><a href="#sec-testing-options" class="localref"><span class="heading-label">5.3</span>.&#8194;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}.&#8194;List options" style="toctarget:sec-list-options"><a href="#sec-list-options" class="localref"><span class="heading-label">5.4</span>.&#8194;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}.&#8194;Showing options" style="toctarget:sec-showing-options"><a href="#sec-showing-options" class="localref"><span class="heading-label">5.5</span>.&#8194;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}.&#8194;Advanced topics" style="toctarget:sec-advanced-topics"><a href="#sec-advanced-topics" class="localref"><span class="heading-label">6</span>.&#8194;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}.&#8194;Handlers" style="toctarget:sec-handlers"><a href="#sec-handlers" class="localref"><span class="heading-label">6.1</span>.&#8194;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}.&#8194;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>.&#8194;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}.&#8194;Single option values" style="toctarget:sec-special"><a href="#sec-special" class="localref"><span class="heading-label">6.3</span>.&#8194;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}.&#8194;Search algorithm" style="toctarget:sec-search-algorithm"><a href="#sec-search-algorithm" class="localref"><span class="heading-label">6.4</span>.&#8194;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}.&#8194;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>.&#8194;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}.&#8194;Transforming an option" style="toctarget:sec-transforming-an-option"><a href="#sec-transforming-an-option" class="localref"><span class="heading-label">7.1</span>.&#8194;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}.&#8194;Compatibility" style="toctarget:sec-compatibility"><a href="#sec-compatibility" class="localref"><span class="heading-label">7.2</span>.&#8194;Compatibility</a></div>
+<div class="tocitem tocitem2" data-toc-target="sec-special-paths" data-toc-depth="2" data-toc-line="[7.3]{.heading-label}.&#8194;Special paths" style="toctarget:sec-special-paths"><a href="#sec-special-paths" class="localref"><span class="heading-label">7.3</span>.&#8194;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}.&#8194;Miscellaneous commands" style="toctarget:sec-miscellaneous-commands"><a href="#sec-miscellaneous-commands" class="localref"><span class="heading-label">7.4</span>.&#8194;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}.&#8194;Setting options directly" style="toctarget:sec-setting-options-directly"><a href="#sec-setting-options-directly" class="localref"><span class="heading-label">7.5</span>.&#8194;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}.&#8194;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>.&#8194;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}.&#8194;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>.&#8194;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}.&#8194;Defining new handlers" style="toctarget:sec-defining-new-handlers"><a href="#sec-defining-new-handlers" class="localref"><span class="heading-label">7.8</span>.&#8194;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}.&#8194;Defining options directly" style="toctarget:sec-defining-options-directly"><a href="#sec-defining-options-directly" class="localref"><span class="heading-label">7.9</span>.&#8194;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}.&#8194;Performance" style="toctarget:sec-perf"><a href="#sec-perf" class="localref"><span class="heading-label">8</span>.&#8194;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>.&#8194;</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&nbsp;<a href="#sec-datatypes" title="3.1.&#8194;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&nbsp;<a href="#sec-hooks" title="3.3.&#8194;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">&quot;Georgia&quot;</code> for a font option, or
+<code class="code code1 language-latex lang-latex latex colorized">!8080FF</code> for a color option (Section&nbsp;<a href="#sec-special" title="6.3.&#8194;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&nbsp;<a href="#sec-searches" title="2.2.&#8194;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&nbsp;<a href="#sec-searches" title="2.2.&#8194;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&nbsp;<a href="#sec-perf" title="8.&#8194;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&nbsp;<a href="#sec-process-options" title="5.1.&#8194;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>.&#8194;</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>.&#8194;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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&nbsp;<a href="#sec-datatypes" title="3.1.&#8194;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>.&#8194;</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%">&#9001;<em class="em-star1">name</em>&#9002;</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>.&#8194;</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&#39;t know option ``<span class="constant" style="color:navy">#1</span>&#39;&#39; (=<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,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" alt="\options{
+ /mybox/@unknown/.new cmd 2 =
+ {I don&#39;t know option ``#1&#39;&#39; (=#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>.&#8194;</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>.&#8194;</span>Basic data types</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">initial value</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">initial value</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">bool</em>&#9002;</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&nbsp;<a href="#sec-hooks" title="3.3.&#8194;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%">&#9001;<em class="em-star1">toggle</em>&#9002;</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,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" 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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">choice<sub>1</sub></em>&#9002;</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%">&#9001;<em class="em-star1">value<sub>1</sub></em>&#9002;</span></span><span class="code-escaped"><span class="opt serif" style="color:navy">]</span></span>,<span class="code-escaped">&#8230;</span>,<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">choice<sub>n</sub></em>&#9002;</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%">&#9001;<em class="em-star1">value<sub>n</sub></em>&#9002;</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%">&#9001;<em class="em-star1">choice<sub>1</sub></em>&#9002;</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%">&#9001;<em class="em-star1">choice<sub>n</sub></em>&#9002;</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%">&#9001;<em class="em-star1">choice<sub>1</sub></em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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>}&lt;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}&lt;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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">elem<sub>1</sub></em>&#9002;</span></span>,<span class="code-escaped">&#8230;</span>,<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">elem<sub>n</sub></em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">macro</em>&#9002;</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%">&#9001;<em class="em-star1">macro</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">cmd</em>&#9002;</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%">&#9001;<em class="em-star1">cmd</em>&#9002;</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%">&#9001;<em class="em-star1">cmd</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">elem</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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%">&#9001;<em class="em-star1">elem</em>&#9002;</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%">&#9001;<em class="em-star1">true</em>&#9002;</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%">&#9001;<em class="em-star1">false</em>&#9002;</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>}&#39;&#39;.
+ <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,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" alt="\options{/test/list/.new list = {banana,milk,eggs}}
+\optionlistdo{/test/list}{%
+ Element ``\textsf{#1}&#39;&#39;.
+ \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%">&#9001;<em class="em-star1">list option</em>&#9002;</span></span>/.push = <span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">elem</em>&#9002;</span></span></code>: pushes <code class="code code1 language-latex lang-latex latex colorized">&lt;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%">&#9001;<em class="em-star1">list option</em>&#9002;</span></span>/.concat = {<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">list</em>&#9002;</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%">&#9001;<em class="em-star1">list</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">dimexpr</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">dimexpr</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">numexpr</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">glueexpr</em>&#9002;</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>.&#8194;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">search list</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>/.search also = <span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">search list</em>&#9002;</span></span>,
+<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>/.new style* = {<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>/.cd},
+<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>/.type = family</code></pre>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">options</em>&#9002;</span></span>}</code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">options</em>&#9002;</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%">&#9001;<em class="em-star1">options</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</span></span></code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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>&#39;&#39;,
+ /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&#39;&#39;,
+ /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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</span></span></code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</span></span></code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</span></span></code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</span></span></code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</span></span></code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">pattern</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">postfix</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">pattern</em>&#9002;</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%">&#9001;<em class="em-star1">postfix</em>&#9002;</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>.&#8194;</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&nbsp;<a href="#sec-datatypes" title="3.1.&#8194;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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">if name</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">counter name</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">macro name</em>&#9002;</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&#39;&#39;,
+}
+<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&#39;&#39;,
+}
+\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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">macro name</em>&#9002;</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>.&#8194;</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>.&#8194;</span>Operations on option paths</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">path</em>&#9002;</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%">&#9001;<em class="em-star1">path</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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>.&#8194;</span>Operations on arguments</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">value</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">value</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">value</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">list option</em>&#9002;</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%">&#9001;<em class="em-star1">element</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">list option</em>&#9002;</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%">&#9001;<em class="em-star1">list</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">numexpr</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">counter option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">counter option</em>&#9002;</span></span>/.refstep</code></span><code class="code code1 language-latex lang-latex latex colorized"></code>
+</div>
+<p class="p noindent para-continued">&#8216;Ref step&#8217; 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>.&#8194;</span>Predefined options</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">bool</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">bool</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">bool</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">options</em>&#9002;</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">&#8203;<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>.&#8194;</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>.&#8194;</span>Processing options</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">options</em>&#9002;</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%">&#9001;<em class="em-star1">options</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">value</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">value</em>&#9002;</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%">&#9001;<em class="em-star1">value</em>&#9002;</span></span></code> a single layer of braces
+is removed &#8211; 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">&#8203;<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%">&#9001;<em class="em-star1">options</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">options</em>&#9002;</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%">&#9001;<em class="em-star1">options</em>&#9002;</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%">&#9001;<em class="em-star1">options</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">family</em>&#9002;</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%">&#9001;<em class="em-star1">family</em>&#9002;</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>.&#8194;</span>Using options</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">macro</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">macro</em>&#9002;</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>.&#8194;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">value</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">list</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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%">&#9001;<em class="em-star1">list</em>&#9002;</span></span></code>?
+</p>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">type</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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%">&#9001;<em class="em-star1">type</em>&#9002;</span></span></code>?
+</p>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">list option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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>.&#8194;</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">&#8203;<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%">&#9001;<em class="em-star1">list option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">action</em>&#9002;</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%">&#9001;<em class="em-star1">action</em>&#9002;</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%">&#9001;<em class="em-star1">list option</em>&#9002;</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%">&#9001;<em class="em-star1">action</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">list option</em>&#9002;</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">macro</em>&#9002;</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%">&#9001;<em class="em-star1">macro</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">list option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">true</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">false</em>&#9002;</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>.&#8194;</span>Showing options</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">bool</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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,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" 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>.&#8194;</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>.&#8194;</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%">&#9001;<em class="em-star1">name</em>&#9002;</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%">&#9001;<em class="em-star1">name</em>&#9002;</span></span></code>. For example, let&#39;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,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" 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>.&#8194;</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>.&#8194;</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">&quot;Georgia&quot;</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%">&#9001;<em class="em-star1">char</em>&#9002;</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%">&#9001;<em class="em-star1">char</em>&#9002;</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,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" 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>.&#8194;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">name</em>&#9002;</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%">&#9001;<em class="em-star1">name</em>&#9002;</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%">&#9001;<em class="em-star1">path</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">path</em>&#9002;</span></span>/<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">subpath</em>&#9002;</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%">&#9001;<em class="em-star1">subpath</em>&#9002;</span></span></code> as its argument, and keep searching recursively.
+</li>
+<li class="li ol-li compact-li">If we still don&#39;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%">&#9001;<em class="em-star1">option</em>&#9002;</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>.&#8194;</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>.&#8194;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default value</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">initial</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">search paths</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span></code> as
+explained in Section&nbsp;<a href="#sec-searches" title="2.2.&#8194;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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">type</em>&#9002;</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>.&#8194;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">style</em>&#9002;</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>.&#8194;</span>Special paths</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">name</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">name</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">type</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">type</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">char</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</span></span></code>
+</div>
+<p class="p noindent para-continued">Provide handlers for options that start with a special character, see
+Section&nbsp;<a href="#sec-special" title="6.3.&#8194;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>.&#8194;</span>Miscellaneous commands</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">message</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">message</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">expecting</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">expecting</em>&#9002;</span></span></code> message.
+</p>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">type</em>&#9002;</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%">&#9001;<em class="em-star1">type</em>&#9002;</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>.&#8194;</span>Setting options directly</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span></code>.
+</p>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">value</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">value</em>&#9002;</span></span></code>.
+</p>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">value</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">value</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">pattern</em>&#9002;</span></span>{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">pattern</em>&#9002;</span></span></code>.
+</p>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}\<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">macro</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">macro</em>&#9002;</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>.&#8194;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">value</em>&#9002;</span></span>}</code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">value</em>&#9002;</span></span>}</code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">value</em>&#9002;</span></span>}</code>
+</div>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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>.&#8194;</span>Defining a new code value</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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>.&#8194;</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">&#8203;<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%">&#9001;<em class="em-star1">name</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">name</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">name</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">name</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">default</em>&#9002;</span></span>]<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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>.&#8194;</span>Defining options directly</h3>
+<div class="pre-fenced pre-fenced4 para-block" style="display:block;margin-top:3ex;margin-bottom:1ex">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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">&#8203;<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%">&#9001;<em class="em-star1">option</em>&#9002;</span></span>}{<span class="code-escaped"><span class="param serif" style="font-size:120%">&#9001;<em class="em-star1">code</em>&#9002;</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%">&#9001;<em class="em-star1">option</em>&#9002;</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%">&#9001;<em class="em-star1">code</em>&#9002;</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>.&#8194;</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"> &#8194;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"> &#8195;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"> &#8195;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"> &#8194;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"> &#8195;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"> &#8195;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&nbsp;<a href="https://www.madoko.net">Madoko.net</a>.</div><span data-line=""></span></div>
+</body>
+
+</html>
diff --git a/macros/latex/contrib/options/options.pdf b/macros/latex/contrib/options/options.pdf
new file mode 100644
index 0000000000..afd4c83d8c
--- /dev/null
+++ b/macros/latex/contrib/options/options.pdf
Binary files differ
diff --git a/macros/latex/contrib/options/options.sty b/macros/latex/contrib/options/options.sty
new file mode 100644
index 0000000000..ebd0311e27
--- /dev/null
+++ b/macros/latex/contrib/options/options.sty
@@ -0,0 +1,1387 @@
+%---------------------------------------------------------------------------
+% Copyright 2015 Daan Leijen, Microsoft Corporation.
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of LaTeX
+% version 2005/12/01 or later.
+%---------------------------------------------------------------------------
+\NeedsTeXFormat{LaTeX2e}[1995/12/01]
+
+\ProvidesPackage{options}[2015/03/01, Daan Leijen, Provides convenient path-value (or key-value) options]
+\RequirePackage{etoolbox}
+\RequirePackage{xcolor}
+
+\newif\ifopt@debug
+\DeclareOption{debug}{\opt@debugtrue}
+\ProcessOptions\relax
+
+% --------------------------------------------------------
+% make the package robust agains catcode changes of = and ,
+% --------------------------------------------------------
+\edef\opt@restore@catcodes{%
+ \catcode`\noexpand\=\the\catcode`\=\relax
+ \catcode`\noexpand\,\the\catcode`\,\relax
+ \let\noexpand\opt@catcodes\relax
+}
+\catcode`\=12\relax
+\catcode`\,12\relax
+
+
+% --------------------------------------------------------
+% Extensions to etoolbox
+% --------------------------------------------------------
+
+\providecommand*\@swaparg[2]{#2{#1}}
+\providecommand*\expandnext[2]{\expandafter\@swaparg\expandafter{#2}{#1}}
+
+\providecommand*\@swaptwo[2]{#2#1}
+\providecommand*\expandnextcmds[2]{\expandafter\@swaptwo\expandafter{#2}{#1}}
+
+% unsafe expand next if the command is a single token..
+\providecommand*\expandnextsingle[2]{\expandafter#1\expandafter{#2}}
+
+\providecommand*\eifstrequal[1]{\expandnextsingle\ifstrequal{#1}}
+\providecommand*\eifblank[1]{\expandnextsingle\ifblank{#1}}
+
+\providecommand*\ontoggle[2]{\iftoggle{#1}{#2}{}}
+
+\providerobustcmd*\providelength[1]{\ifdef{#1}{}{\newlength#1}}
+\providerobustcmd*\csnewlength[1]{\expandafter\newlength\csname #1\endcsname}
+\providerobustcmd*\csprovidelength[1]{\ifcsdef{#1}{}{\expandafter\newlength\csname #1\endcsname}}
+\providerobustcmd*\cssetlength[2]{\expandafter\setlength\csname #1\endcsname{#2}}
+
+% --------------------------------------------------------
+% Basic option commands
+% \option{<path>} returns the value of a path
+% \letoption{<path>}\cmd let's \cmd to the value of <path>
+% --------------------------------------------------------
+
+\newcommand*\optionname[1]{optk@#1}
+\newcommand*\option[1]{\csname optk@#1\endcsname}
+\newcommand*\letoption[2]{\expandafter\let\expandafter#2\csname optk@#1\endcsname}
+
+% \letoption@ will not be redefined for debugging and can be used to test if an option exists
+\let\letoption@\letoption
+
+% --------------------------------------------------------
+% options, optionsalso
+% main path setting routine
+% --------------------------------------------------------
+
+\newif\ifopt@allowsearch % allow searching along search-also handlers
+\newif\ifopt@ignoreunknown % ignore unknown options?
+\newif\ifopt@unknownwarnonly % issue just a warning on an unknown option? (instead of an error)
+
+% process options together with remaining ones from a previous run
+\newrobustcmd*\optionswithremaining[1]{%
+ \letoptionlist{/options/remaining}\opt@savedremaining
+ \options{#1}%
+ %\typeout{now process: \meaning\opt@savedremaining, in default: \option@defaultpath}%
+ \expandnextsingle\optionsalso{\opt@savedremaining}%
+}
+
+% process options
+\newrobustcmd*\options{%
+ \def\option@defaultpath{}%
+ \opt@allowsearchtrue%
+ \opt@ignoreunknownfalse%
+ \opt@unknownwarnonlyfalse%
+ \optionsalso%
+}
+
+% track nesting level of options (due to calls to options in an argument)
+\newif\ifopt@nested
+\newcount\opt@nesting
+
+% Process options in the context of an other options call
+% For efficiency, only save state if nested
+\newrobustcmd*\optionsalso[1]{%
+ \ifopt@nested
+ \optionsalso@save{#1}% save state in a nested context for chained handlers
+ \else
+ \opt@nestedtrue
+ \opt@parse#1,\opt@stop,%
+ \opt@nestedfalse
+ \fi
+}
+
+% this saves and restores any nested state: for now only about chained handlers
+\newrobustcmd*\optionsalso@save[1]{%
+ \opt@savestate{\the\opt@nesting}%
+ \advance\opt@nesting 1\relax
+ \opt@parse#1,\opt@stop,%
+ \advance\opt@nesting -1\relax
+ \opt@restorestate{\the\opt@nesting}%
+}
+
+\newrobustcmd*\opt@savestate[1]{%
+ \cslet{option@handlernext#1}\option@handlernext%
+ \cslet{option@handlerpath#1}\option@handlerpath%
+ \cslet{optionvalue#1}\optionvalue%
+ \def\option@handlernext{}%
+ \def\option@handlerpath{}%
+}
+
+\newrobustcmd*\opt@restorestate[1]{%
+ \letcs\option@handlernext{option@handlernext#1}%
+ \letcs\option@handlerpath{option@handlerpath#1}%
+ \letcs\optionvalue{optionvalue#1}%
+}
+
+% Qualified options -- mostly for here for compatibility with pgfqkeys
+\newrobustcmd*\qoptions[2]{%
+ \def\option@defaultpath{#1}%
+ \opt@allowsearchtrue%
+ \opt@ignoreunknownfalse%
+ \optionsalso{#2}%
+}
+
+% Qualified optionsalso
+\newrobustcmd*\qoptionsalso[2]{%
+ \def\option@defaultpath{#1}%
+ \optionsalso{#2}%
+}
+
+%-----------------------------------------------------------------------
+% The main option processing
+%
+% For an option <option> we may have these values:
+% <option> : the value read by \option{<option>}
+% /@code : the code invoked on assignment (use option@invoke to invoke explicitly), gets \optionvalue
+% /@cmdN : command handlers invoked by code with arguments from \optionvalue
+% /@type : the type of value (not set for pure code values)
+% /@unknown : an unknown handler for this path
+% /@code : taking 2 arguments: path and value
+% /@searchalso: the other paths needed to be search for this path
+% /@code
+%
+% Handlers start with a "." in their name; the handlers are found in: /handlers/<handlername>
+% Special handlers are defined in: /handlers/special/<char>
+% If a path starts with <char> it is invoked; just like first-char-syntax in pgfkeys.
+%-----------------------------------------------------------------------
+
+% this is used if no argument is given
+% define as relax, this makes it unique but also safe against infinite expansion
+\def\optionnovalue{\relax}
+
+% opt@stop is used to stop argument processing in tex \def's with patterns
+\let\opt@stop\relax
+
+% The main parsing of options
+% This code is quite expanded to make it as efficient as possible.
+% It is based on the original code by David Carlisle in the standard latex "keyval" package.
+\def\opt@parse#1,{%
+ \ifx\opt@stop#1\@empty\else
+ \opt@parse@arg#1==\opt@stop
+ \expandafter\opt@parse\fi}
+
+\def\opt@parse@arg#1=#2=#3\opt@stop{%
+ \opt@trimdef\option@rawpath{#1}%
+ \ifx\@empty#3\@empty%
+ \let\optionvalue\optionnovalue
+ \else
+ \opt@trimdef\optionvalue{#2}%
+ \fi
+ \ifx\option@rawpath\@empty
+ \ifx\optionvalue\optionnovalue\else\optionerror@nopath{#2}\fi
+ \else
+ % try path directly
+ \expandafter\opt@setcodepath@\option@rawpath\opt@stop%
+ \ifx\opt@codepath\relax
+ \opt@handle{#1}{#2}% not directly found, try handlers, search etc.
+ \fi
+ % now \optionvalue is defined; invoke the /@code
+ \opt@codepath%
+ \ifx\option@handlernext\@empty\else\optionerror@handler\fi
+ \fi
+}
+
+% Phase 2: look for a handler or search along the path
+\newrobustcmd*\opt@handle[2]{%
+ % not directly found..
+ \opt@setoptionpath{\option@rawpath}% create full option@path applying the default path
+ \option@gethandler\option@path% defines option@handlerpath & option@handler
+ \ifx\option@handler\@empty
+ % search path
+ \ifopt@allowsearch
+ \opt@searchalso{\option@path}%
+ \fi
+ \else
+ % handler
+ \letoption@{/handlers/\option@handler/@code}\opt@codepath
+ \fi
+ \ifx\opt@codepath\relax
+ \opt@handle@specials{#1}{#2}%
+ \fi
+}
+
+% Set opt@codepath from a raw path taking the default path into account
+\newcommand\opt@setcodepath[1]{\expandafter\opt@setcodepath@#1\opt@stop}
+\def\opt@setcodepath@#1#2\opt@stop{\ifx#1/\relax\letoption@{#1#2/@code}\opt@codepath\else\letoption@{\option@defaultpath/#1#2/@code}\opt@codepath\fi}
+
+% Set option@path from a raw path taking the default path into account
+\newcommand\opt@setoptionpath[1]{\expandafter\opt@setoptionpath@#1\opt@stop}
+\def\opt@setoptionpath@#1#2\opt@stop{\ifx#1/\relax\edef\option@path{#1#2}\else\edef\option@path{\option@defaultpath/#1#2}\fi}
+
+
+% Phase 3: look for a special syntax handler, or invoke the unknown handlers
+\newrobustcmd*\opt@handle@specials[2]{%
+ % special handler?
+ \edef\opt@first{\expandafter\option@firstletterof@\option@rawpath\opt@stop}%
+ \letoption@{/handlers/special/\opt@first/@code}\opt@codepath
+ \ifx\opt@codepath\relax
+ % still not found: invoke unknown handler
+ \ifopt@ignoreunknown
+ \opt@collectunknown{#1}{#2}% expects \optionvalue to be defined
+ \else
+ \opt@unknown{\option@path}%
+ \fi
+ \else
+ % it is a special handler
+ \ifx\optionvalue\optionnovalue
+ \let\optionvalue\option@rawpath%
+ \else
+ \optionerror{\option@rawpath}{special options cannot take an argument ("\meaning\optionvalue")}%
+ \fi
+ \fi
+}
+
+% Space gobbling; basically unchanged from the original definition in the keyval package by David Carlisle
+% note: takes off one layer of braces
+\newrobustcmd\opt@define@trimdef[1]{%
+ \long\def\opt@trimdef##1##2{%
+ \futurelet\opt@firsttoken\opt@trim@##2\opt@stop\opt@stop#1\opt@stop\relax##1}%
+ \def\opt@trim@{%
+ \ifx\opt@firsttoken\opt@sptoken%
+ \expandafter\opt@trim@left%
+ \else%
+ \expandafter\opt@trim@left\expandafter#1% add space token since sp@b removes one
+ \fi}%
+ \long\def\opt@trim@left#1##1 \opt@stop{\opt@trim@right##1}%
+}
+\opt@define@trimdef{ }% define trimdef with a space as argument
+\long\def\opt@trim@right#1\opt@stop#2\relax#3{\edef#3{\unexpanded{#1}}}
+{\def\:{\global\let\opt@sptoken= } \: }
+
+
+% --------------------------------------------------------
+% Searching
+% --------------------------------------------------------
+
+% search a relative path: <default path><search path>
+\newrobustcmd*\opt@searchforpath[2]{%
+ \option@ifisabsolute{#2}%
+ {\letoption@{#2/@code}\opt@codepath}%
+ {\letoption@{#1#2/@code}\opt@codepath% use default path
+ \ifx\opt@codepath\relax
+ \ifopt@allowsearch\else
+ \opt@searchalso{#1#2}%
+ \fi
+ \fi}%
+}
+
+% search an absolute path
+% this is called by search-also handlers.
+\newrobustcmd*\opt@searchforabspath[1]{%
+ \letoption@{#1/@code}\opt@codepath
+ \ifx\opt@codepath\relax
+ \ifopt@allowsearch\else
+ \opt@searchalso{#1}%
+ \fi
+ \fi
+}
+
+% \opt@searchalso: invoked to search for a path: set \opt@codepath if a match is found
+%
+% note: we can nest searches without grouping
+% because they all use the same "\opt@do@search" (option@searchalsodo) and
+% all need to break once the inner one breaks
+\newrobustcmd*\opt@searchalso[1]{%
+ \option@foreachparent\opt@do@search{#1}%
+}
+\newrobustcmd*\opt@do@search[3]{% {<root>}{<subpath>}{<name>}
+ \letoption@{#1/@searchalso/@code}\opt@temp
+ \ifx\opt@temp\relax\else
+ \edef\option@searchpath{#2#3}% subpath
+ \opt@temp% invoke search routine
+ \ifx\opt@codepath\relax\else\opt@break\fi% on found: break loop
+ \fi
+}
+
+% --------------------------------------------------------
+% Unknown handler search
+% --------------------------------------------------------
+
+% invoked on unknown path: set \opt@codepath to the unknown handler (with option@unknownpath)
+\newrobustcmd*\opt@unknown[1]{%
+ %\typeout{found unknown: #1}%
+ \def\opt@do@unknown##1##2##3{%
+ \letoption@{##1/@unknown/@code}\opt@codepath
+ \ifx\opt@codepath\relax\else
+ \edef\option@unknownpath{#1}% full path
+ \edef\option@unknownsubpath{##2##3}% subpath
+ \expandnext{\opt@addarg{#1}}{\optionvalue}% set optionvalue to two arguments: the path and the original value
+ \opt@break%
+ \fi%
+ }%
+ \option@foreachparent\opt@do@unknown{#1}%
+}
+\newrobustcmd*\opt@addarg[2]{\edef\optionvalue{\unexpanded{{#1}{#2}}}}%
+
+% invoked when unknown option needs to be saved (and ignored)
+\newrobustcmd*\opt@collectunknown[2]{%
+ \ifx\optionvalue\optionnovalue
+ \option@push{/options/remaining}{#1}%
+ \else
+ \option@push{/options/remaining}{#1={#2}}%
+ \fi
+}
+
+% --------------------------------------------------------
+% Handlers' splitting and chaining
+% --------------------------------------------------------
+
+% \option@gethandler{path}: split off the part after the "/.", sets option@handlerpath and option@handler and option@handlernext
+\def\option@gethandler#1{\expandafter\option@gethandler@#1/././.\opt@stop}
+\def\option@gethandler@#1/.#2/.#3/.#4\opt@stop{%
+ \def\option@handler{#2}%
+ \ifx\option@handler\@empty\else
+ \def\option@handlerpath{#1}%
+ \def\option@handler{#2}%
+ \def\option@handlernext{#3}%
+ \fi
+}
+\def\option@handlerpath{}
+\def\option@handlernext{}
+
+\newrobustcmd*\option@chainempty{\let\optionvalue\optionnovalue\option@chainonly}
+\newrobustcmd*\option@chainonly{\ifx\option@handlernext\@empty\else\option@chain\fi}
+\newrobustcmd*\option@chain{%
+ \ifx\option@handlernext\@empty
+ % we are done, invoke the option itself
+ \letoption@{\option@handlerpath/@code}\opt@codepath
+ \ifx\opt@codepath\relax
+ \opt@unknown{\option@handlerpath}%
+ \fi
+ \else
+ % invoke the next handler
+ %\typeout{call next handler: \option@handlerpath, \option@handlernext, \optionvalue}%
+ \edef\opt@temp{\option@handlerpath/.\option@handlernext}%
+ \option@gethandler{\opt@temp}%
+ \letoption@{/handlers/\option@handler/@code}\opt@codepath
+ \ifx\opt@codepath\relax
+ \opt@unknown{/handlers/\option@handler}%
+ \fi
+ \fi
+ \opt@codepath
+}
+
+% --------------------------------------------------------
+% Path splitting
+% --------------------------------------------------------
+
+% \option@isabsolute{path}: check if path starts with /
+\def\ifoptionisabsolute#1{\expandafter\ifoptionisabsolute@#1\opt@stop}
+\def\ifoptionisabsolute@#1#2\opt@stop{\ifx#1/\relax\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi}%
+
+% \option@splitroot{path}: split off the first directory of a path into \option@root
+% option@splitroot{/foo/bar} -> foo
+% option@splitroot{/foo} -> foo
+\newrobustcmd*\option@splitroot[1]{\expandafter\option@splitroot@#1//\opt@stop}
+\def\option@splitroot@#1/#2/#3\opt@stop{%
+ \def\option@root{#1}%
+ \ifx\option@root\@empty
+ \def\option@root{#2}%
+ \fi
+}
+
+% \option@splitpath{path}: \option@path and \option@name
+% \option@splitpath{/foo/bar/baz} -> /foo/bar baz
+\newrobustcmd*\option@splitpath[1]{%
+ \let\option@path\@empty
+ \ifoptionisabsolute{#1}{%
+ \def\opt@do@split##1##2##3{%
+ \edef\option@path{##1/}%
+ \edef\option@name{##3}%
+ \opt@break
+ }%
+ \option@foreachparent\opt@do@split{#1}%
+ }{\edef\option@name{#1}}%
+}
+
+
+% \option@foreachparent\<do>{<path>} basic routine for iterating over path components
+% applies \<do> to each parent path. todo: can we optimize this routine more for the searchalso?
+% /foo/bar/baz -> \<do>{/foo/bar}{}{baz} \<do>{/foo}{bar/}{baz} \<do>{}{foo/bar/}{baz}
+\newrobustcmd*\option@foreachparent[2]{%
+ \let\opt@donext#1%
+ \expandafter\opt@foreachparent@#2/\opt@stop\opt@stop%
+ \opt@donext{}{\option@subpath}{\option@name}%
+}
+
+\newrobustcmd*\opt@break{\def\opt@donext##1##2##3{}}
+
+\def\opt@foreachparent@/#1/#2\opt@stop#3\opt@stop{% #3 is the current root
+ \def\opt@temp{#2}%
+ \ifx\opt@temp\@empty% final path
+ \def\option@name{#1}%
+ \def\option@subpath{}%
+ \else
+ \opt@foreachparent@/#2\opt@stop#3/#1\opt@stop% recurse first
+ \opt@donext{#3/#1}{\option@subpath}{\option@name}%
+ \edef\option@subpath{#1/\option@subpath}%
+ \fi
+}
+
+
+% --------------------------------------------------------
+% Errors
+% --------------------------------------------------------
+\newrobustcmd*\optionwarning[2]{%
+ \eifblank{\option@handler}{\def\opt@temp{}}{\def\opt@temp{(in ".\option@handler") }}%
+ \PackageWarning{options}{option "#1": \opt@temp #2}{}}
+
+\newrobustcmd*\optionerror[2]{%
+ \eifblank{\option@handler}{\def\opt@temp{}}{\def\opt@temp{(in ".\option@handler") }}%
+ \PackageError{options}{option "#1": \opt@temp #2}{}}
+
+\newrobustcmd*\optionerror@expect[2]{\optionerror{#1}{unexpected "\optionvalue" (expecting #2)}}
+\newrobustcmd*\optionerror@toomany[2]{\optionerror{#1}{too many arguments (expecting #2)}}
+\newrobustcmd*\optionerror@noarg[1]{\optionerror{#1}{does not take an argument}}
+\newrobustcmd*\optionerror@needarg[1]{\optionerror{#1}{requires an argument}}
+
+\newrobustcmd*\optionerror@nopath[1]{\optionerror{?}{value without option path: "#1"}}
+\newrobustcmd*\optionerror@handler[1]{\optionerror{\option@rawpath}{handler ".\option@handlernext" is not allowed to follow the previous handlers}}%
+
+\newrobustcmd*\option@ensurefree[1]{\ifoptiondefined{#1}{\optionerror{#1}{already defined}}{}}
+\newrobustcmd*\option@ensuredefined[1]{\ifoptiondefined{#1}{}{\optionerror{#1}{unknown option}}}
+
+
+% --------------------------------------------------------
+% Basic option setting
+% --------------------------------------------------------
+
+\newrobustcmd*\edefoption[2]{\protected@edef#2{\option{#1}}}%
+
+\newrobustcmd*\option@set[2]{\csdef{optk@#1}{#2}}
+\newrobustcmd*\option@let[2]{\cslet{optk@#1}#2}
+
+\newrobustcmd*\option@def[1]{\csdef{optk@#1}}
+\newrobustcmd*\option@undef[1]{\csundef{optk@#1}}
+
+\newrobustcmd*\option@eset[2]{\expandnext{\option@set{#1}}{#2}}
+\newrobustcmd*\option@xset[2]{\protected@edef\opt@temp{#2}\option@let{#1}\opt@temp}
+
+\newrobustcmd*\option@appto[2]{\csappto{optk@#1}{#2}}
+\newrobustcmd*\option@preto[2]{\cspreto{optk@#1}{#2}}
+
+\newcommand*\ifoptiondefined[1]{\ifcsdef{optk@#1}}
+\newcommand*\ifoptionvoid[1]{\ifcsvoid{optk@#1}}
+\newcommand*\ifoptioncmd[1]{\ifcsparam{optk@#1}}
+
+\newrobustcmd*\ifoptionequal[2]{%
+ \edefoption{#1}\opt@temp
+ \eifstrequal{\opt@temp}{#2}%
+}
+
+\newrobustcmd*\ifoptionblank[2]{%
+ \edefoption{#1}\opt@temp
+ \eifblank{\opt@temp}{#2}%
+}
+
+\newcommand*\ifoptiontype[2]{%
+ \letoptiontype{#1}\opt@type
+ \eifstrequal{\opt@type}{#2}%
+}
+\newcommand*\ifoptioniscode[1]{%
+ \let\opt@next\@secondoftwo%
+ \letoption@{#1/@code}\opt@code
+ \letoption@{#1}\opt@value
+ \ifx\opt@code\opt@value
+ \let\opt@next\@firstoftwo
+ \else
+ \letoptiontype{#1}\opt@type
+ \eifstrequal{\opt@type}{code}%
+ {\let\opt@next\@firstoftwo}{}%
+ \fi
+ \opt@next
+}
+
+\newcommand*\letoptiontype[2]{%
+ \letoption@{#1/@type}#2%
+ \ifx#2\relax\def#2{code}\fi
+}%
+
+\newcommand*\optionparamcount[1]{%
+ \ifoptiondefined{#1/@cmd1}{1}{%
+ \ifoptiondefined{#1/@cmd2}{2}{%
+ \ifoptiondefined{#1/@cmd3}{3}{%
+ \ifoptiondefined{#1/@cmd4}{4}{%
+ \ifoptiondefined{#1/@cmd5}{5}{%
+ \ifoptiondefined{#1/@cmdx}{x}{%
+ 0%
+ }}}}}}%
+}
+
+\newcommand*\optionshowtype[1]{%
+ \letoptiontype{#1}\opt@type%
+ \eifstrequal{\opt@type}{code}%
+ {\option@font@special{cmd}$_\optionparamcount{#1}$}%
+ {\option@font@special{\opt@type}}%
+}
+
+% Set the current color from a color options.
+% Keeps color unchanged if the color name was blank.
+\newcommand*\optioncolor[1]{\ifoptioncolortransparent{#1}{}{\color{#1}}}
+\newcommand*\optiontextcolor[2]{\ifoptioncolortransparent{#1}{#2}{\textcolor{#1}{#2}}}
+\newcommand*\optioncolorbox[2]{\ifoptioncolortransparent{#1}{#2}{\colorbox{#1}{#2}}}
+
+\newcommand*\ifoptioncolortransparent[3]{%
+ \ifoptionblank{#1}{#2}{%
+ \ifoptiontype{#1}{color expr}{%
+ \edefoption{#1}\opt@color
+ \expandnext{\opt@colorlet{#1}}{\opt@color}%
+ }{}%
+ #3
+ }%
+}
+
+
+% convert dimension option into number in pt for use in picture
+\newcommand*\opt@unit[1]{\strip@pt\dimexpr#1\relax}
+\newcommand*\optionunit[1]{\opt@unit{\option{#1}}}
+
+% --------------------------------------------------------
+% Comma seperated values
+% --------------------------------------------------------
+
+\newcommand\option@headof[1]{\option@headof@#1,\opt@stop}%
+\def\option@headof@#1,#2\opt@stop{#1}%
+
+\providerobustcmd*\option@ifanyof[2]{%
+ \let\opt@do@next\@secondoftwo
+ \edef\opt@temp{#1}%
+ \def\opt@do@anyof##1{\eifstrequal{\opt@temp}{##1}{\let\opt@do@next\@firstoftwo\listbreak}{}}%
+ \expandnext{\forcsvlist\opt@do@anyof}{#2}%
+ \opt@do@next
+}
+
+\newrobustcmd*\ifoptionanyof[2]{\option@ifanyof{\option{#1}}{#2}}
+
+\newcount\opt@idx
+\providerobustcmd*\option@findidx[3]{%
+ \opt@idx=0\relax
+ \def#3{-1}%
+ \edef\opt@temp{#1}%
+ \def\opt@do@findidx##1{\eifstrequal{\opt@temp}{##1}{\edef#3{\the\opt@idx}\listbreak}{\advance\opt@idx 1\relax}}%
+ \expandnext{\forcsvlist\opt@do@findidx}{#2}%
+}
+
+% return the first letter of the argument or ' ' (space) if the input was empty. Does not expand the argument.
+\providecommand*\option@firstletterof[1]{\eifblank{#1}{ }{\expandafter\option@firstletterof@#1\opt@stop}}
+\def\option@firstletterof@#1#2\opt@stop{#1}
+
+
+% --------------------------------------------------------
+% Lists
+% --------------------------------------------------------
+
+\newrobustcmd*\option@setnil[1]{\option@set{#1}{}}
+\newrobustcmd*\option@push[2]{\listcsadd{optk@#1}{#2}}
+\newrobustcmd*\option@epush[2]{\listcseadd{optk@#1}{#2}}%
+\newrobustcmd\optionlistdo[2]{\def\opt@@do##1{#2}\forlistcsloop{\opt@@do}{optk@#1}}
+
+\newrobustcmd*\option@setlist[2]{\option@setnil{#1}\option@concat{#1}{#2}}
+\newrobustcmd*\option@concat[2]{%
+ \def\opt@do@concat##1{\option@push{#1}{##1}}%
+ \expandnext{\forcsvlist\opt@do@concat}{#2}%
+}
+\newcommand*\letoptionlist[2]{%
+ \def#2{}%
+ \optionlistdo{#1}{%
+ \ifdefempty#2%
+ {\def#2{##1}}%
+ {\appto#2{,##1}}%
+ }%
+}
+\newcommand*\optionlist[1]{%
+ \let\opt@comma\@empty%
+ \optionlistdo{#1}{%
+ \opt@comma##1%
+ \ifx\opt@comma\@empty
+ \def\opt@comma{,}%
+ \fi
+ }%
+}
+
+\let\ifoptionnil\ifoptionvoid
+\newrobustcmd*\ifoptioncontains[2]{\xifinlistcs{#2}{optk@#1}}
+\newrobustcmd*\option@pushifnew[2]{\ifoptioncontains{#1}{#2}{}{\option@push{#1}{#2}}}
+
+
+% --------------------------------------------------------
+% Choices: these functions are used for the choice type
+% --------------------------------------------------------
+
+% find a choice: sets opt@choicename, opt@choicevalue, and opt@choiceord
+\newcount\opt@choiceord
+\newcommand*\opt@findchoice[2]{% {<name>}{<option>}
+ \opt@choiceord=0\relax
+ \def\opt@choicevalue{}%
+ \def\opt@choicename{}%
+ \def\opt@do@choice##1{\opt@do@choice@##1\opt@stop}%
+ \def\opt@do@choice@##1=##2\opt@stop{%
+ \ifstrequal{##1}{#1}{%
+ \def\opt@choicename{##1}%
+ \def\opt@choicevalue{##2}%
+ \listbreak
+ }%
+ {\advance\opt@choiceord 1\relax}%
+ }%
+ \forlistcsloop\opt@do@choice{\optionname{#2/@choices}}%
+ \ifx\opt@choicename\@empty%
+ \opt@choiceord=-1\relax
+ \fi
+}
+
+% get choice list as comma separated name list
+\newcommand\letoptionchoices[2]{% {<option>}{\<macro>}
+ \def#2{}%
+ \def\opt@do@choice##1{\opt@do@choice@##1\opt@stop}%
+ \def\opt@do@choice@##1=##2\opt@stop{%
+ \ifx#2\@empty
+ \def#2{##1}%
+ \else
+ \appto#2{,##1}%
+ \fi
+ }%
+ \forlistcsloop\opt@do@choice{\optionname{#1/@choices}}%
+}%
+
+% parse choices into a list of elements "choice=value". Set \opt@choices and \opt@firstchoicename
+\newcommand*\opt@choices@parse[2]{% {<option>}{<user list>}
+ \def\opt@choices{}%
+ \def\opt@firstchoicename{}%
+ \edef\opt@choicepath{#1}%
+ \opt@choice@foreach#2,\opt@stop,\relax
+ %\typeout{choice list: \opt@choices}%
+}
+
+\def\opt@choice@foreach#1,{%
+ \ifx\opt@stop#1\@empty\else
+ \opt@choice@item#1==\opt@stop
+ \expandafter\opt@choice@foreach\fi}
+
+\def\opt@choice@item#1=#2=#3\opt@stop{%
+ \opt@trimdef\opt@choicename{#1}%
+ \ifx\@empty#3\@empty%
+ \let\opt@choicevalue\opt@choicename% default is the name itself
+ \else
+ \opt@trimdef\opt@choicevalue{#2}%
+ \fi
+ \expandnext{\expandnextsingle\opt@choice@push{\opt@choicename}}{\opt@choicevalue}%
+}
+
+\newcommand*\opt@choice@push[2]{%
+ %\typeout{parse choice: #1={#2}}%
+ \listadd\opt@choices{#1={#2}}%
+ \ifx\opt@firstchoicename\@empty
+ \def\opt@firstchoicename{#1}%
+ \fi
+}
+
+
+% --------------------------------------------------------
+% Invoke
+% --------------------------------------------------------
+
+\newcommand*\option@xinvoke[2]{%
+ \protected@edef\opt@temp{#2}%
+ \expandnext{\option@invoke{#1}}{\opt@temp}%
+}%
+\newcommand*\option@einvoke[2]{%
+ \expandnext{\option@invoke{#1}}{#2}%
+}%
+\newcommand*\option@invoke[2]{%
+ \option@ensuredefined{#1}%
+ \def\optionvalue{#2}%
+ \option{#1/@code}%
+}%
+\newcommand*\option@invokedefault[1]{%
+ \option@ensuredefined{#1}%
+ \let\optionvalue\optionnovalue%
+ \option{#1/@code}%
+}%
+
+
+% --------------------------------------------------------
+% Record metadata
+% --------------------------------------------------------
+
+\newrobustcmd*\option@addpathinfo[1]{%
+ \def\opt@do@add##1##2##3{%
+ \ifoptiondefined{##1/@names}{}{%
+ \option@setnil{##1/@names}\option@setnil{##1/@paths}%
+ }%
+ \eifblank{##2}%
+ {\expandnext{\option@pushifnew{##1/@names}}{##3}%
+ %\typeout{path "##1/@names": add "##3": \option{##1/@names}}%
+ }%
+ {\option@splitroot{##2}%
+ \expandnext{\option@pushifnew{##1/@paths}}{\option@root}%
+ %\typeout{path "##1/@paths": add "\option@root"; \option{##1/@paths}}%
+ }%
+ }%
+ \option@foreachparent\opt@do@add{#1}%
+}
+
+% --------------------------------------------------------
+% Basic definitions of options
+% --------------------------------------------------------
+\def\option@patch@pre{}
+\def\option@patch@post{}
+
+\newrobustcmd*\optionnewcode{\@ifstar{\optionnewcode@{true}}{\optionnewcode@{false}}}
+\newrobustcmd*\optionnewcode@[3]{%*[]
+ %\typeout{define cmd: #2}%
+ \option@ensurefree{#2}%
+ \option@splitpath{#2}% sets option@path, and option@name
+ \eifblank{\option@path}{%
+ \optionerror{#2}{no valid option name specified. Option definitions must start with a forward slash (i.e. "/path/<name>")}%
+ }{}%
+ \option@addpathinfo{#2}%
+ \ifbool{#1}% noarg? expand out for efficiency
+ {\csdef{optk@#2/@code}{%
+ \ifx\optionvalue\optionnovalue\else\optionerror@noarg{#2}\fi
+ \option@patch@pre% hook to patch in extra checking code
+ #3%
+ \option@patch@post% hook for post code.. generally unsafe due to chained handlers
+ }}%
+ {\csdef{optk@#2/@code}{%
+ \ifx\optionvalue\optionnovalue
+ \letoption@{#2/@def}\optionvalue%
+ \ifx\optionvalue\relax\optionerror@needarg{#2}\fi
+ \fi
+ \option@patch@pre
+ #3%
+ \option@patch@post
+ }}%
+ \csletcs{optk@#2}{optk@#2/@code}% point at first to the cmd
+}
+
+% define handler code; such code takes the expanded option@handlerpath and optionvalue as arguments
+\newrobustcmd*\optionnewhandler{\@ifstar{\optionnewhandler@{true}}{\optionnewhandler@{false}}}
+\newrobustcmd*\optionnewhandler@[3]{%
+ \option@ensurefree{#2}%
+ \option@def{#2/@cmd2}##1##2{#3}%
+ \optionnewcode@{#1}{#2}{\expandnext{\expandnext{\option{#2/@cmd2}}{\option@handlerpath}}{\optionvalue}}\relax%
+}
+
+
+% --------------------------------------------------------
+% Add pre/post processing to an option
+% note: patchcmd leaves some spaces behind.. can we switch to appto?
+% --------------------------------------------------------
+
+\newrobustcmd*\optionprependcode[2]{%
+ \option@ensuredefined{#1}%
+ \expandafter\patchcmd\expandafter{\csname optk@#1/@code\endcsname}{\option@patch@pre}{#2\option@patch@pre}{}{\optionerror{#1}{unable to prepend code}}%
+}
+
+\newrobustcmd*\optionappendcode[2]{%
+ \option@ensuredefined{#1}%
+ \expandafter\patchcmd\expandafter{\csname optk@#1/@code\endcsname}{\option@patch@post}{\option@patch@post #2}{}{\optionerror{#2}{unable to append code}}%
+}
+
+
+% --------------------------------------------------------
+% Bootstrap and use our options themselves to define everything else
+% --------------------------------------------------------
+
+% start bootstrap with the 'new handler' handler
+\optionnewhandler{/handlers/new handler}{\optionnewhandler{#1}{#2\option@chainempty}\option@chainempty}
+
+\options{
+ %
+ /handlers/new transformer/.new handler =\optionnewhandler{#1}{#2\option@chain},
+ /handlers/new operation/.new handler =\optionnewhandler{#1}{#2\option@chainonly},
+ /handlers/new handler*/.new handler =\optionnewhandler*{#1}{#2\option@chainempty},
+ /handlers/new operation*/.new handler =\optionnewhandler*{#1}{#2\option@chainonly},
+ %
+ /handlers/new cmd transformer/.new handler=\optionsalso{%
+ #1/.new operation* = {\expandnextsingle\optionprependcode{##1}{#2}}% prepend code to the option it is handling (##1)
+ },
+ % command transformers
+ /handlers/expands/.new cmd transformer ={\protected@edef\optionvalue{\optionvalue}},
+ /handlers/defaults/.new cmd transformer ={\option@default@transform},
+ % the "new handler" can be provided with defaults.
+ /handlers/new handler/.defaults,
+ % value transformers
+ /handlers/expand once/.new transformer =\edef\optionvalue{\expandafter\expandafter\expandafter\noexpand\optionvalue},
+ /handlers/expand twice/.new transformer =\edef\optionvalue{\expandafter\expandafter\expandafter\noexpand\optionvalue}%
+ \edef\optionvalue{\expandafter\expandafter\expandafter\noexpand\optionvalue},
+ /handlers/expanded/.new transformer =\protected@edef\optionvalue{\optionvalue},
+}
+
+% For values of the form "[default]value" we assign "default" as the default, and continue with "value"
+\newrobustcmd\option@default@transform{\expandafter\option@default@transform@\optionvalue\opt@stop}
+\def\option@default@transform@{\@ifnextchar[{\option@default@transform@opt}{\option@default@transform@end}}
+\def\option@default@transform@end#1\opt@stop{}
+\def\option@default@transform@opt[#1]#2\opt@stop{%
+ \option@set{\option@handlerpath/@def}{#1}%
+ \edef\optionvalue{\unexpanded{#2}}% preserve # arguments in optionvalue
+}
+
+
+% --------------------------------------------------------
+% command actions take arguments
+% --------------------------------------------------------
+
+% provide command pattern; defined separately so we can expand the option@handler and pass as an argument
+\newrobustcmd*\optionnewcmdx[4]{%
+ \option@def{#1/@cmdx}#2\opt@stop{#4}%
+ \optionnewcode{#1}{\expandnextcmds{\option{#1/@cmdx}}{\optionvalue#3\opt@stop}\relax}%
+}
+
+\options{
+ /handlers/new code/.new handler/.defaults = \optionnewcode{#1}{#2}\option@chainempty,
+ /handlers/new cmd*/.new handler = \optionnewcode*{#1}{#2}\option@chainempty,
+ /options/exec/.new code =\optionvalue,
+ % commands
+ /handlers/new cmd/.new handler/.defaults=\optionsalso{%
+ /options/exec={\option@def{#1/@cmd1}##1{#2}},%
+ #1/.new code={\expandnext{\option{#1/@cmd1}}{\optionvalue}},%
+ },%
+ /handlers/new cmd 2/.new handler/.defaults = \optionsalso{
+ /options/exec = {\option@def{#1/@cmd2}##1##2##3{\ifblank{##3}{#2}{\optionerror@toomany{#1}{2 (but got: ##1,##2,##3)}}}},
+ #1/.new code = {\expandnextcmds{\option{#1/@cmd2}}{\optionvalue}{}{}{}\relax},
+ },
+ /handlers/new cmd 3/.new handler/.defaults = \optionsalso{
+ /options/exec = {\option@def{#1/@cmd3}##1##2##3##4{\ifblank{##4}{#2}{\option@toomany{#1}{3 (but got: ##1,##2,##3,##4)}}}},
+ #1/.new code = {\expandnextcmds{\option{#1/@cmd3}}{\optionvalue}{}{}{}{}\relax},
+ },
+ /handlers/new cmd 4/.new handler/.defaults = \optionsalso{
+ /options/exec = \option@def{#1/@cmd4}##1##2##3##4##5{\ifblank{##5}{#2}{\optionerror@toomany{#1}{4}}},
+ #1/.new code = \expandnextcmds{\option{#1/@cmd4}}{\optionvalue}{}{}{}{}{}\relax,
+ },
+ % tuples and triples take exactly 2 or 3 arguments
+ /handlers/new cmd tuple*/.new handler/.defaults = \optionsalso{
+ #1/.new cmdx = {##1,##2,##3}{,,}%
+ {\ifstrequal{##3}{,}{#2}{\optionerror{#1}{expecting a 2 argument tuple \{_,_\}, but got "\optionvalue"}}},
+ #1/.type=cmd tuple*,
+ },
+ /handlers/new cmd tuple/.new handler/.defaults = \optionsalso{
+ /options/exec = {\option@def{#1/@cmd2}##1##2{#2}},
+ #1/.new cmdx = {##1,##2}{,}%
+ {\ifblank{##2}{\option{#1/@cmd2}{##1}{##1}}{\option{#1/@cmd2}{##1}{##2}}},
+ #1/.type=cmd tuple,
+ },
+ /handlers/new cmd triple/.new handler/.defaults = \optionsalso{
+ #1/.new cmdx = {##1,##2,##3,##4}{,,,}%
+ {\ifstrequal{##4}{,,}{#2}{\optionerror{#1}{expecting a 3 argument triple \{_,_,_\}, but got "\optionvalue"}}},
+ #1/.type=cmd triple,
+ },
+ % aliases
+ /handlers/new cmdx/.new cmd 3/.defaults = \expandnextsingle\optionnewcmdx{\option@handlerpath}{#1}{#2}{#3},
+ /handlers/new code alias/.new handler = \option@set{#1/@code}{\option{#2/@code}},
+ /handlers/new cmd 0/.new code alias = /handlers/new cmd*,
+ /handlers/new cmd 1/.new code alias = /handlers/new cmd,
+}
+
+
+% --------------------------------------------------------
+% Provide unknown here so we get a proper error for unknown options
+% --------------------------------------------------------
+
+\options{
+ /@unknown/.new cmd 2 = {%
+ \ifopt@unknownwarnonly
+ \optionwarning{#1}{unknown option}%
+ \else
+ \optionerror{#1}{unknown option}%
+ \fi%
+ }%
+}
+
+
+% --------------------------------------------------------
+% Convenience handlers
+% --------------------------------------------------------
+
+% debugging
+\options{
+ /handlers/show/.new handler* = {\option@font@name{#1}=\optionshow{#1}},
+ /handlers/typeout/.new handler* = {\optiontypeout{#1}},
+}
+
+% family options
+\options{
+ /handlers/new style/.new handler/.defaults = \optionsalso{
+ #1/.new cmd = \optionsalso{#2},
+ #1/.type = style,
+ },
+ /handlers/new style*/.new handler = \optionsalso{
+ #1/.new cmd* = \optionsalso{#2},
+ #1/.type = style,
+ },
+ /handlers/new alias/.new handler ={%
+ \option@ensuredefined{#2}%
+ \optionsalso{%
+ #1/.new cmd = \optionsalso{#2={##1}},
+ #1/.type = alias,
+ }%
+ \option@xset{#1}{\option{#2}}%
+ %\option@xset{#1/@ini}{\option{#2/@ini}}%
+ },
+ /handlers/new alias*/.new handler = \optionsalso{
+ \option@ensuredefined{#2}%
+ \optionsalso{
+ #1/.new cmd = \optionsalso{#2},
+ #1/.type = alias,
+ }%
+ \option@xset{#1}{\option{#2}}%
+ %\option@xset{#1/@ini}{\option{#2/@ini}}%
+ },
+ /handlers/show/style/.new cmd = {\option@font@special{style}},
+ %
+ /handlers/search also/.new handler =\optionaddsearch{#1}{#2},
+ /handlers/cd/.new handler* =\edef\option@defaultpath{#1},
+ /handlers/new family/.new handler =[]{\optionsalso{
+ #1/.new cmd* = {\edef\option@defaultpath{#1}},
+ #1/.search also = {#2},
+ #1/.type = family,
+ #1/.cd
+ }},
+ /handlers/show/family/.new cmd = {\option@font@special{family}, searches: \option@showvalue{\optionlist{#1/@searchalso}}},
+}
+
+% compatibility
+\options{
+ /handlers/code/.new handler = \optionsalso{#1/.new cmd = {#2}},
+ /handlers/style/.new handler = \optionsalso{#1/.new style= {#2}},
+ /handlers/is family/.new handler* = \optionsalso{#1/.new family},
+}
+
+% defining new option types
+\options{%
+ /handlers/undef/.new handler = {%
+ \ifoptiondefined{#1}{%
+ \option@undef{#1}%
+ \option@undef{#1/@type}%
+ \option@undef{#1/@code}%
+ \option@undef{#1/@def}%
+ \option@undef{#1/@ini}%
+ % may leave other values but the above ones are surely required to be removed
+ }%
+ },
+ /handlers/type/.new handler = \option@ensuredefined{#1}\option@set{#1/@type}{#2},
+ /handlers/default/.new handler = \option@ensuredefined{#1}\option@set{#1/@def}{#2},
+ /handlers/defaulted/.new handler= {%
+ \option@ensuredefined{#1}%
+ \option@default@transform% changes optionvalue and sets /@def if provided
+ },
+ /handlers/initial/.new handler = {%
+ \option@ensuredefined{#1}%
+ \option@default@transform% changes optionvalue and sets /@def if provided
+ \option@eset{#1/@ini}{\optionvalue}%
+ \option@einvoke{#1}{\optionvalue}%
+ },
+ /handlers/reset/.new operation* = {%
+ \letoption@{#1/@ini}\opt@temp
+ \ifx\opt@temp\relax
+ \optionerror{#1}{cannot reset an option that has no initial value}%
+ \else
+ \option@einvoke{#1}{\opt@temp}%
+ \fi
+ },
+}
+
+% \optionaddsearch{<path>}{<search paths>}
+% add new search paths to a path.
+% for efficiency we expand out the search code inline instead of iterating
+\newrobustcmd*\optionaddsearch[2]{%
+ \ifoptiondefined{#1/@searchalso/@code}%
+ {\option@concat{#1/@searchalso}{#2}}%
+ {\option@setlist{#1/@searchalso}{#2}%
+ \option@set{#1/@searchalso/@type}{searchalso}%
+ \option@def{#1/@searchalso/@code}{}}%
+ \def\opt@do@addsearch##1{%
+ \edef\opt@temp{%
+ \noexpand\ifx\noexpand\opt@codepath\noexpand\relax
+ \noexpand\opt@searchforabspath{##1/\noexpand\option@searchpath}%
+ \noexpand\fi
+ }%
+ \expandnext{\option@appto{#1/@searchalso/@code}}{\opt@temp}%
+ }%
+ \forcsvlist\opt@do@addsearch{#2}%
+}
+
+
+% --------------------------------------------------------
+% Basic data type handlers
+% --------------------------------------------------------
+
+\options{
+ /handlers/new value/.new handler = []\optionsalso{%
+ #1/.new code = \option@let{#1}\optionvalue,
+ #1/.type = value,
+ #1/.initial = {#2},
+ },
+ %
+ /handlers/new num/.new handler = [0]\optionsalso{%
+ #1/.new code = \option@eset{#1}{\the\numexpr\optionvalue\relax},
+ #1/.type = num,
+ #1/.initial = {#2},
+ },
+ %
+ /handlers/new glue/.new handler = [0pt]\optionsalso{%
+ #1/.new code = \option@eset{#1}{\the\glueexpr\optionvalue\relax},
+ #1/.type = glue,
+ #1/.initial = {#2},
+ },
+ %
+ /handlers/new length/.new handler = [0pt]\optionsalso{%
+ #1/.new code = \cssetlength{#1}{\dimexpr\optionvalue\relax},
+ #1/.type = length,
+ /options/exec = \csnewlength{#1}\option@eset{#1}{\csname #1\endcsname},
+ #1/.initial = {#2},
+ },
+ /handlers/show/length/.new cmd = {\option@showvalue{\the\option{#1}}},
+ %
+ /handlers/new dim/.new handler = [0pt]\optionsalso{%
+ #1/.new code = {\option@eset{#1/@dimexpr}{\optionvalue}},
+ #1/.type = dim,
+ /options/exec = {\option@eset{#1}{\dimexpr\option{#1/@dimexpr}\relax}},% read as dimexpr
+ #1/.initial = {#2},
+ },
+ /handlers/show/dim/.new cmd ={\option@showvalue{\the\option{#1}}\ (=\optionshowliteral{#1/@dimexpr})},
+ %
+ /handlers/new toggle/.new handler = [false]\optionsalso{%
+ #1/.new code = {[true]{%
+ \ifcsdef{toggle\optionvalue}%
+ {\csuse{toggle\optionvalue}{#1}}%
+ {\eifstrequal\optionvalue{True}%
+ {\toggletrue{#1}}%
+ {\eifstrequal\optionvalue{False}%
+ {\togglefalse{#1}}%
+ {\optionerror@expect{#1}{true or false}}}}%
+ }},
+ #1/.type = toggle,
+ /options/exec = {\newtoggle{#1}\option@set{#1}{\iftoggle{#1}{true}{false}}},
+ #1/.initial = {#2},
+ },
+ /handlers/flip/.new operation = \iftoggle{#1}{\togglefalse{#1}}{\toggletrue{#1}},
+ %
+ /handlers/new list/.new handler = []\optionsalso{%
+ #1/.new code = \expandnext{\option@setlist{#1}}{\optionvalue},
+ #1/.type = list,
+ #1/.initial = {#2},
+ },
+ /handlers/show/list/.new cmd = \letoptionlist{#1}\opt@list\option@showvalue{\opt@list},
+ /handlers/push/.new operation = \option@push{#1}{#2},
+ /handlers/concat/.new operation = \option@concat{#1}{#2},
+ %
+ /handlers/new choice/.new handler={%
+ \opt@choices@parse{#1}{#2}% sets \opt@choices & opt@firstchoicename
+ \option@let{#1/@choices}{\opt@choices}%
+ \optionsalso{%
+ #1/.new cmd/.expands = {%
+ \opt@findchoice{##1}{#1}%
+ \ifnum\opt@choiceord<0%
+ \letoptionchoices{#1}\opt@choices
+ \optionerror@expect{#1}{one of "\opt@choices"}%
+ \else
+ \option@eset{#1}{\opt@choicevalue}%
+ \option@eset{#1/@ord}{\the\opt@choiceord}%
+ \option@eset{#1/@name}{\opt@choicename}%
+ \fi
+ },
+ #1/.type = choice,
+ #1/.expanded/.initial = \opt@firstchoicename,%
+ }%
+ },
+ /handlers/show/choice/.new cmd = {%
+ \option@showvalue{\option{#1}} %
+ (\option@font@name{@ord}=\option{#1/@ord}), %
+ \letoptionchoices{#1}\opt@choices
+ choices=\option@showvalue{\opt@choices}%
+ },
+ %
+ /handlers/new color/.new handler=[black]{%
+ %\opt@ensurexcolor{#1}%
+ \optionsalso{%
+ #1/.new cmd/.expands = {%
+ \option@set{#1}{##1}%
+ \eifblank{##1}{}{\opt@colorlet{#1}{##1}}%
+ },
+ #1/.type = color,
+ #1/.initial = {#2},
+ }%
+ },
+ /handlers/new color expr/.new handler=[black]{%
+ %\opt@ensurexcolor{#1}%
+ \optionsalso{%
+ #1/.new value,
+ #1/.type = color expr,
+ #1/.initial = {#2},
+ }%
+ },
+}
+
+\providecommand\colorlet[2]{\optionerror{#1}{color options require package "xcolor"; please include this package}}%
+\providecommand\definecolor[3]{\optionerror{#1}{color options require package "xcolor"; please include this package}}%
+
+% opt@colorlet{<color name>}{<color>} lets color be a color name or \#XXXXXX HTML color
+\def\opt@colorlet@html#1\opt@stop#2\opt@stop{\definecolor{#2}{HTML}{#1}}
+\def\opt@colorlet@name#1\opt@stop#2\opt@stop{\colorlet{#2}{#1}}
+\def\opt@colorlet@{\@ifnextchar \#{\@firstoftwo{\opt@colorlet@html}}{\opt@colorlet@name}}
+\newrobustcmd*\opt@colorlet[2]{%
+ \ifdef{\colorlet}%
+ {\opt@colorlet@#2\opt@stop#1\opt@stop}%
+ {\definecolor{#1}{named}{#2}}% if no xcolor, only support named colors
+}
+
+
+
+
+% --------------------------------------------------------
+% Hook into existing definitions
+% --------------------------------------------------------
+
+\options{
+ /handlers/is if/.new handler = \optionsalso{%
+ /options/exec = {\ifcsdef{if#2}{}{\optionerror{#1}{no `if` with name "#2" is defined}}},
+ #1/.new code = {[true]\ifcsdef{#2\optionvalue}{\csuse{#2\optionvalue}}{\optionerror@expect{#1}{true or false}}},
+ #1/.type = if,
+ /options/exec = {\option@set{#1}{#2}},% read name of the if
+ },
+ /handlers/show/if/.new cmd = {\option@showvalue{\option{#1}} (=\option@showvalue{\ifbool{\option{#1}}{true}{false})}},
+ %
+ /handlers/is def/.new handler = \optionsalso{%
+ /options/exec = \ifdef{#2}{}{\optionerror{#1}{no definition "\detokenize{#2}" is found}},
+ #1/.new code = \expandafter\def\expandafter#2\expandafter{\optionvalue},
+ #1/.type = def,
+ /options/exec =\option@set{#1}{#2},% read returns definition
+ %#1/.initial = {#2},
+ },
+ %
+ /handlers/is edef/.new handler = \optionsalso{%
+ /options/exec = \ifdef{#2}{}{\optionerror{#1}{no definition "\detokenize{#2}" is found}},
+ #1/.new code = \protected@edef#2{\optionvalue},
+ #1/.type = edef,
+ /options/exec =\option@set{#1}{#2},% read returns definition
+ %#1/.initial = {#2},
+ },
+ %
+ /handlers/is counter/.new handler = \optionsalso{%
+ /options/exec = \ifltxcounter{#2}{}{\optionerror{#1}{no definition "\detokenize{#2}" is found}},
+ #1/.new code = \setcounter{#2}{\optionvalue},
+ #1/.type = counter,
+ /options/exec =\option@set{#1}{#2},% read returns definition
+ %#1/.initial = {#2},
+ },
+ /handlers/show/counter/.new cmd = {\option@showvalue{\option{#1}} (=\option@font@value{\arabic{\option{#1}}})},
+ /handlers/inc/.new operation = [1]{%
+ \ifoptiontype{#1}{counter}% check if this is a counter or a number
+ {\addtocounter{\option{#1}}{#2}}%
+ {\option@xinvoke{#1}{\option{#1} + #2}}%
+ },
+ /handlers/step/.new operation* = {%
+ \ifoptiontype{#1}{counter}% check if this is a counter
+ {\stepcounter{\option{#1}}}%
+ {\optionerror{#1}{cannot "step" a non-counter}}%
+ },
+ /handlers/refstep/.new operation* = {%
+ \ifoptiontype{#1}{counter}% check if this is a counter
+ {\refstepcounter{\option{#1}}}%
+ {\optionerror{#1}{cannot "refstep" a non-counter}}%
+ },
+}
+
+
+% --------------------------------------------------------
+% Initial options for our library
+% --------------------------------------------------------
+\options{
+ /options/ignoreunknown/.is if = opt@ignoreunknown,
+ /options/unknownwarnonly/.is if = opt@unknownwarnonly,
+ /options/allowsearch/.is if = opt@allowsearch,
+ /options/collectunknown/.new style* = {/options/ignoreunknown,/options/remaining={}},
+ /options/showbuiltin/.new toggle,
+}
+
+\csundef{optk@/options/remaining}% tricksy, but we want to define it officially here :-)
+\optionsalso{
+ /options/remaining/.new list,
+}
+
+
+% --------------------------------------------------------
+% Show definitions
+% --------------------------------------------------------
+
+\newrobustcmd*\optionshowall[1][false]{\options{/options/showbuiltin=#1}\optionshowpath{}}
+
+\newcommand*\option@font@name[1]{\textsf{#1}}
+\newcommand*\option@font@path[1]{\textsf{#1}}
+\newcommand*\option@font@value[1]{\textsf{#1}}
+\newcommand*\option@font@special[1]{\textit{#1}}
+
+\newcommand*\option@showvalue[1]{$\langle$\option@font@value{#1}$\rangle$}
+
+\newrobustcmd*\optionshowpath[2][]{\option@showpath{#1#2}{#2}}
+\newrobustcmd*\option@showpath[2]{%
+ \noindent\option@font@path{#2/}%
+ \option@showitems{/@names}{\option@showname}{#1}%
+ \option@showitems{/@paths}{\option@showpath}{#1}%
+}
+
+\newrobustcmd*\option@showitems[3]{%
+ \ifoptionvoid{#3#1}{}{%
+ \begin{opt@marginlr}{1em}{0em}%
+ \optionlistdo{#3#1}{%
+ \iftoggle{/options/showbuiltin}{}%
+ {\option@ifanyof{#3/##1}{/handlers,/options}{\@gobble}%
+ {\if\option@firstletterof{##1}.\relax\expandafter\@gobble\fi}}%
+ {%
+ \noindent\hspace*{-0.5em}#2{#3/##1}{##1}%
+ \par%
+ }%
+ }%
+ \end{opt@marginlr}%
+ }%
+}
+
+\newrobustcmd*\option@showname[2]{%
+ \option@font@name{#2}%
+ =\optionshow{#1}%
+ \ifoptiondefined{#1/@ini}{%
+ , initial=\optionshowliteral{#1/@ini}%
+ }{}%
+ \ifoptiondefined{#1/@def}{%
+ , default=\optionshowliteral{#1/@def}%
+ }{}%
+}
+
+\newrobustcmd*\optionshowliteral[1]{\letoption{#1}\opt@temp\option@showvalue{\texttt{\expandnextsingle\detokenize{\opt@temp}}}}
+
+\newcommand*\optiontypeout[1]{%
+ \def\option@font@special##1{##1}%
+ \def\option@font@name##1{##1}%
+ \def\option@font@path##1{##1}%
+ \def\option@font@value##1{##1}%
+ \def\option@showvalue##1{##1}%
+ \typeout{#1=\optionshow{#1}}%
+}
+
+\newcommand*\optionshow[1]{%
+ \ifoptiondefined{#1/@type}%
+ {\ifoptiondefined{/handlers/show/\option{#1/@type}}{\@firstoftwo}{\@secondoftwo}}%
+ {\@secondoftwo}%
+ {\option@invoke{/handlers/show/\option{#1/@type}}{#1}}%
+ {\ifoptiondefined{#1}%
+ {\ifoptioniscode{#1}%
+ {\optionshowtype{#1}}%
+ {\option@showvalue{\option{#1}}}}%
+ {\option@font@special{undefined}}%
+ }%
+}
+
+\newenvironment{opt@marginlr}[2]{%
+ \topsep\z@
+ \partopsep\z@
+ \trivlist
+ \rightmargin=\dimexpr#2\relax%
+ \leftmargin=\dimexpr#1\relax%
+ \advance\linewidth -\rightmargin
+ \advance\linewidth -\leftmargin
+ \advance\@totalleftmargin \leftmargin
+ \parshape \@ne \@totalleftmargin \linewidth
+ \item[]%
+}%
+{\endtrivlist}
+
+
+% --------------------------------------------------------
+% Handling Package and Class options
+% --------------------------------------------------------
+
+% Process the 'global' class options in a package file
+% Just take care of known options and adjust the unusedoptionslist accordingly
+\newrobustcmd*\option@ProcessGlobalOptions[1]{%
+ \ifdefvoid{\@classoptionslist}{}{%
+ % process known options, and collect the rest in the remaining list
+ \options{/options/collectunknown,#1}\expandnext\optionsalso{\@classoptionslist}%
+ % remove processed options from the latex @unusedoptionlist
+ \ifx\@unusedoptionlist\@empty\relax\else
+ \def\opt@do##1{%
+ \ifoptioncontains{/options/remaining}{##1}{}{%
+ \expandnext{\@removeelement{##1}}{\@unusedoptionlist}{\@unusedoptionlist}%
+ }%
+ }%
+ \expandnext{\forcsvlist\opt@do}{\@classoptionslist}%
+ \fi
+ }%
+}
+
+% Process the local option in a .sty file, raise an error on unknown flags
+\newrobustcmd*\option@ProcessPackageOptions[1]{%
+ \letcs\opt@localoptions{opt@\@currname.\@currext}%
+ \ifdefvoid{\opt@localoptions}{}{%
+ \options{#1}\expandnext\optionsalso{\opt@localoptions}%
+ }%
+ \let\CurrentOption\@empty
+ \AtEndOfPackage{\let\@unprocessedoptions\relax}%
+}
+
+% Process the local options in a .cls file
+\newrobustcmd*\option@ProcessClassOptions[1]{%
+ \letcs\opt@localoptions{opt@\@currname.\@currext}%
+ \ifdefvoid{\opt@localoptions}{}{%
+ \options{/options/collectunknown,#1}\expandnext\optionsalso{\opt@localoptions}%
+ \letoptionlist{/options/remaining}\@unusedoptionlist% set the unused option list
+ }%
+ \let\CurrentOption\@empty
+ \AtEndOfPackage{\let\@unprocessedoptions\relax}%
+}
+
+% Process class- or package options.
+% A package will take global class options into account
+\newrobustcmd*\options@ProcessOptions[1]{%
+ \ifx\@currext\@clsextension
+ \option@ProcessClassOptions{#1}%
+ \else
+ \option@ProcessGlobalOptions{#1}%
+ \option@ProcessPackageOptions{#1}%
+ \fi
+}
+\@onlypreamble\options@ProcessOptions
+\@onlypreamble\options@ProcessPackageOptions
+\@onlypreamble\options@ProcessClassOptions
+\@onlypreamble\options@ProcessGlobalOptions
+
+
+% --------------------------------------------------------
+% Enable debugging
+% --------------------------------------------------------
+\ifopt@debug
+ \let\option@fast\option
+ \renewcommand*\option[1]{%
+ \ifcsdef{optk@#1}{}{\z@\optionerror{#1}{debug option: undefined option}}%
+ \option@fast{#1}%
+ }
+ \let\letoption@fast\letoption
+ \renewcommand*\letoption[2]{%
+ \ifcsdef{optk@#1}{}{\z@\optionerror{#1}{debug letoption: undefined option}}%
+ \letoption@fast{#1}#2%
+ }
+\fi
+
+% --------------------------------------------------------
+% restore cat codes
+% --------------------------------------------------------
+\opt@restore@catcodes