summaryrefslogtreecommitdiff
path: root/macros/optex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2021-04-20 03:00:55 +0000
committerNorbert Preining <norbert@preining.info>2021-04-20 03:00:55 +0000
commitd65c208b161ffee9ce5343fdfdb17d00523cecae (patch)
tree6829c46d8881891365b9be3fb660dba3ca79e6f5 /macros/optex
parent272d21375e83d59014b6591075291d172bbfa007 (diff)
CTAN sync 202104200300
Diffstat (limited to 'macros/optex')
-rw-r--r--macros/optex/README120
-rw-r--r--macros/optex/base/alloc.opm173
-rw-r--r--macros/optex/base/basic-macros.opm130
-rw-r--r--macros/optex/base/bib-iso690.opm906
-rw-r--r--macros/optex/base/bib-simple.opm164
-rw-r--r--macros/optex/base/cite-bib.opm271
-rw-r--r--macros/optex/base/colors.opm394
-rw-r--r--macros/optex/base/doc.opm276
-rw-r--r--macros/optex/base/f-adventor.opm22
-rw-r--r--macros/optex/base/f-antt.opm32
-rw-r--r--macros/optex/base/f-baskerville.opm22
-rw-r--r--macros/optex/base/f-bonum.opm24
-rw-r--r--macros/optex/base/f-comicneue.opm23
-rw-r--r--macros/optex/base/f-cursor.opm22
-rw-r--r--macros/optex/base/f-dejavu.opm31
-rw-r--r--macros/optex/base/f-ebgaramond.opm37
-rw-r--r--macros/optex/base/f-garamondl.opm26
-rw-r--r--macros/optex/base/f-gfsbodoni.opm22
-rw-r--r--macros/optex/base/f-heros.opm244
-rw-r--r--macros/optex/base/f-kerkis.opm32
-rw-r--r--macros/optex/base/f-kpfonts.opm45
-rw-r--r--macros/optex/base/f-libertine-s.opm50
-rw-r--r--macros/optex/base/f-libertine.opm60
-rw-r--r--macros/optex/base/f-libertinus.opm36
-rw-r--r--macros/optex/base/f-librecaslon.opm22
-rw-r--r--macros/optex/base/f-lido.opm48
-rw-r--r--macros/optex/base/f-lmfonts.opm186
-rw-r--r--macros/optex/base/f-merriweather.opm33
-rw-r--r--macros/optex/base/f-pagella.opm24
-rw-r--r--macros/optex/base/f-poltawski.opm34
-rw-r--r--macros/optex/base/f-roboto.opm59
-rw-r--r--macros/optex/base/f-schola.opm24
-rw-r--r--macros/optex/base/f-sourcepro.opm39
-rw-r--r--macros/optex/base/f-technika.opm31
-rw-r--r--macros/optex/base/f-termes.opm24
-rw-r--r--macros/optex/base/f-xcharter.opm24
-rw-r--r--macros/optex/base/fams-ini.opm214
-rw-r--r--macros/optex/base/fnotes.opm191
-rw-r--r--macros/optex/base/fonts-catalog.opm136
-rw-r--r--macros/optex/base/fonts-opmac.opm226
-rw-r--r--macros/optex/base/fonts-preload.opm36
-rw-r--r--macros/optex/base/fonts-resize.opm354
-rw-r--r--macros/optex/base/fonts-select.opm846
-rw-r--r--macros/optex/base/graphics.opm445
-rw-r--r--macros/optex/base/hi-syntax.opm223
-rw-r--r--macros/optex/base/hisyntax-c.opm66
-rw-r--r--macros/optex/base/hisyntax-html.opm31
-rw-r--r--macros/optex/base/hisyntax-python.opm82
-rw-r--r--macros/optex/base/hisyntax-tex.opm38
-rw-r--r--macros/optex/base/hyperlinks.opm157
-rw-r--r--macros/optex/base/hyphen-lan.opm245
-rw-r--r--macros/optex/base/if-macros.opm313
-rw-r--r--macros/optex/base/keyval.opm82
-rw-r--r--macros/optex/base/languages.opm188
-rw-r--r--macros/optex/base/lists.opm128
-rw-r--r--macros/optex/base/logos.opm61
-rw-r--r--macros/optex/base/luatex-ini.opm136
-rw-r--r--macros/optex/base/makeindex.opm463
-rw-r--r--macros/optex/base/maketoc.opm154
-rw-r--r--macros/optex/base/margins.opm80
-rw-r--r--macros/optex/base/math-macros.opm1079
-rw-r--r--macros/optex/base/math-preload.opm227
-rw-r--r--macros/optex/base/math-unicode.opm266
-rw-r--r--macros/optex/base/mathclass.opm1591
-rw-r--r--macros/optex/base/more-macros.opm284
-rw-r--r--macros/optex/base/multicolumns.opm114
-rw-r--r--macros/optex/base/optex.ini107
-rw-r--r--macros/optex/base/optex.lua356
-rw-r--r--macros/optex/base/others.opm106
-rw-r--r--macros/optex/base/outlines.opm108
-rw-r--r--macros/optex/base/output.opm267
-rw-r--r--macros/optex/base/parameters.opm588
-rw-r--r--macros/optex/base/pdfuni-string.opm127
-rw-r--r--macros/optex/base/plain-macros.opm346
-rw-r--r--macros/optex/base/prefixed.opm298
-rw-r--r--macros/optex/base/print-unimath.opm56
-rw-r--r--macros/optex/base/ref-file.opm141
-rw-r--r--macros/optex/base/references.opm94
-rw-r--r--macros/optex/base/sections.opm469
-rw-r--r--macros/optex/base/slides.opm247
-rw-r--r--macros/optex/base/styles.opm120
-rw-r--r--macros/optex/base/table.opm526
-rw-r--r--macros/optex/base/uni-lcuc.opm15944
-rw-r--r--macros/optex/base/unimath-codes.opm439
-rw-r--r--macros/optex/base/unimath-table.opm2471
-rw-r--r--macros/optex/base/usebib.opm398
-rw-r--r--macros/optex/base/verbatim.opm372
-rw-r--r--macros/optex/demo/op-biblist.bib298
-rw-r--r--macros/optex/demo/op-demo.tex127
-rw-r--r--macros/optex/demo/op-letter-cs.tex41
-rw-r--r--macros/optex/demo/op-letter-en.tex38
-rw-r--r--macros/optex/demo/op-ring.pngbin0 -> 512984 bytes
-rw-r--r--macros/optex/demo/op-slides-bg.pngbin0 -> 62385 bytes
-rw-r--r--macros/optex/demo/op-slides.tex322
-rw-r--r--macros/optex/doc/omls.tex832
-rw-r--r--macros/optex/doc/optex-doc.pdfbin0 -> 1380041 bytes
-rw-r--r--macros/optex/doc/optex-doc.tex114
-rw-r--r--macros/optex/doc/optex-math.tex1662
-rw-r--r--macros/optex/doc/optex-techdoc.tex290
-rw-r--r--macros/optex/doc/optex-userdoc.tex2019
-rw-r--r--macros/optex/doc/optex.142
-rw-r--r--macros/optex/pkg/emoji.opm55
-rw-r--r--macros/optex/pkg/plain-at.opm43
-rw-r--r--macros/optex/pkg/qrcode.opm2707
-rw-r--r--macros/optex/pkg/vlna.opm193
105 files changed, 44529 insertions, 0 deletions
diff --git a/macros/optex/README b/macros/optex/README
new file mode 100644
index 0000000000..b8f925e47c
--- /dev/null
+++ b/macros/optex/README
@@ -0,0 +1,120 @@
+OpTeX: the LuaTeX format based on Plain TeX and OPmac
+
+Author: Petr Olsak, <petr@olsak.net>
+
+This software is in public domain.
+
+See http://petr.olsak.net/optex
+
+Files:
+
+base/ ... basic set of macro files used when optex.fmt is generated
+ and more basic macros loaded on demand during document processing.
+demo/ ... examples: short document: op-demo.tex, short letter: op-letter.tex,
+ presentation slides: op-slides.tex.
+pkg/ ... external macros. Maybe, they can be created by other authors if
+ the macro file conforms to the rules given in the section 2.2.5
+ in the OpTeX documentation.
+doc/ ... PDF version of the OpTeX documentation and sources.
+
+History:
+
+<1.01> Mar. 2021
+ Minor code fixes (thanks to reports from users).
+ LibreCaslon font file added.
+ two new callbacks from new LuaTeX 1.13 added to optex.lua
+ active * (in lists) works as normal in math mode.
+ f-heros(\slides): additional font XITSMath loaded (to the base FiraMath font).
+ \_xhsize seting added to \margins.
+<1.00> Feb. 2021
+ The OMLS (OpTeX Markup Language Standard) was developed. It helps to create
+ convertors from/to OpTeX documents and similar applications.
+ \pdfunidef re-imeplemted.
+ \thisoutline introduced.
+ \verbchar introduced instead \activettchar.
+ Bugs fixing.
+<0.19> Jan. 2021
+ emoji support as pkg/emoji.opm.
+ non-braakable places generated by luavlna, suported as pkg/vlna.opm.
+ \begblock...\endblock introduced.
+ comment character allowed after \begtt.
+ more robust macros: \replstring, \table.
+ complete revision of documentation, spelling corrections.
+ Several bugs fixed.
+<0.18> Dec. 2020
+ Font support for next 9 families added.
+ Font selection system improved.
+ Documentation (especially about font selection system) corrected.
+ Macros supporting key=value included to the format.
+ \foreach macro improved.
+ Concept of multilang in bib rewritten.
+ \opwarning format changed (line numbers are printed too).
+ Several bugs fixed.
+<0.17> Nov. 2020
+ optex.lua introduced (instead external ltluatex.lua)
+ hyph.patterns are loaded directly by \patterns, not using lua code
+ \commentchars introduced (comments which are able to interrupt verbatim mode)
+<0.16> Oct. 2020
+ callback.register_x introduced, namespaces for packages corrected
+ kerkis and EBGaramond fontfiles added
+ little corrections
+ optex-math manual: Index added
+<0.15> Jun. 2020
+ Release for Overleaf - TL2020.
+ More vertical space above in \chap and \secc.
+<0.14> Jun. 2020
+ Typeseting Math with OpTeX: new document added.
+ Math macros corrected.
+ In-line verbatim in section titles allowed.
+ \eqbox implemented.
+ "\mnote up", "\displaylines to" (new features implemented)
+<0.13> May 2020
+ \table have more features: \tabskip, \table to, \table pxto, \vspan
+ The \eqalign reimplemented to be more flexible.
+ The boundary character ":" introduced in the \table.
+ \| undefined in 8bit math: bug fixed.
+ \isnextchar: \let\tmp=#1 -> \let\tmp= #1
+<0.12> May 2020
+ The external macro qrcode.opm introduced
+ New directory structure: base/, demo/, pkg/, doc/ introduced.
+ \load macro introduced
+ \newif: bug fixed, other bug fixed.
+<0.11> Apr. 2020
+ \phi, \varpi in Unicode: bug fixed
+ \mathstyles introduced.
+<0.10> Apr. 2020
+ Technical documentation added
+ \_famdecl instedad \_fontdecl in font family files (incompatible change).
+<0.09> Syntax highlighting implemented.
+<0.08> \numberedpar implmented. \emergencystretch=20pt added as default.
+ \inoval, \incircle, \clipinoval, \clipincircle imlemented.
+ \puttext, \putpic x,y instead -y,x (incompatible change!)
+ footnotes have separated color stack now.
+ \fnotelinks implemented.
+ Lists by \begitems...\enditems improved (\novspaces \_vspacehalf, \ilevel).
+<0.07> demos: op-letter.tex and op-slides.tex added.
+ \inkinspic, \transformbox, \slides added.
+ documentation improved and updated.
+<0.06> tables re-implemented, opmac-rest removed.
+ footnotes, marginal notes reimplemented.
+ sections.opm, graphics.opm, colors.opm, languages re-implemented
+ Cite-bib re-implemented.
+ Index, sorting re-implemented.
+<0.05> \boldmath reimplemented
+ \fontcolor, \letterspacing implemented
+ font catalogue improved
+<0.04> references.opl, hyperlinks.opl re-implemented.
+ \fontfam, f-* rewritten: no usage of boundary "..." in \_fontnamegen
+ \fnote{...} corrected: (parameter is not really parameter)
+ verbatim.opl re-implemented + doc added
+ file-ref.opl implemented (new \_Xrefversion{3})
+ bugfixing
+<0.03> optex-doc optex.1 included,
+ verbatim.opm re-implmented,
+ math-unicode implemented,
+ usebib.opm + bib-style.opm included
+ \catcodetable stack implemented
+ bugfixing of macros.
+ catcodes.opl: removed, one can use \catcodetable, ... primitives,
+ pdfuni-string: lua code for lua5.3 fixed.
+<0.02> Released.
diff --git a/macros/optex/base/alloc.opm b/macros/optex/base/alloc.opm
new file mode 100644
index 0000000000..5d874134d4
--- /dev/null
+++ b/macros/optex/base/alloc.opm
@@ -0,0 +1,173 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \newdimen {Allocators for registers <2021-02-15>} % loaded in format
+
+ \_doc -----------------------------
+ The limits are set first.
+ \_cod -----------------------------
+
+\_chardef\_maicount = 65535 % Max Allocation Index for counts registers in LuaTeX
+\_let\_maidimen = \_maicount
+\_let\_maiskip = \_maicount
+\_let\_maimuskip = \_maicount
+\_let\_maibox = \_maicount
+\_let\_maitoks = \_maicount
+\_chardef\_mairead = 15
+\_chardef\_maiwrite = 15
+\_chardef\_maifam = 255
+
+ \_doc -----------------------------
+ Each allocation macro needs its own counter.
+ \_cod -----------------------------
+
+\_countdef\_countalloc=10 \_countalloc=255
+\_countdef\_dimenalloc=11 \_dimenalloc=255
+\_countdef\_skipalloc=12 \_skipalloc=255
+\_countdef\_muskipalloc=13 \_muskipalloc=255
+\_countdef\_boxalloc=14 \_boxalloc=255
+\_countdef\_toksalloc=15 \_toksalloc=255
+\_countdef\_readalloc=16 \_readalloc=-1
+\_countdef\_writealloc=17 \_writealloc=-1
+\_countdef\_famalloc=18 \_famalloc=3
+
+ \_doc -----------------------------
+ The common allocation macro
+ \`\_allocator` `\<sequence> {<type>} \<primitive declarator>`
+ is defined. This idea was used in classical plain \TeX/ by
+ Donald Knuth too but the macro from plain \TeX/ seems to be
+ more complicated:).
+ \_cod -----------------------------
+
+\_def\_allocator #1#2#3{%
+ \_incr{\_cs{_#2alloc}}%
+ \_ifnum\_cs{_#2alloc}>\_cs{_mai#2}%
+ \_errmessage{No room for a new \_ea\_string\_csname #2\_endcsname}%
+ \_else
+ \_global#3#1=\_cs{_#2alloc}%
+ \_wlog{\_string#1=\_ea\_string\_csname #2\_endcsname\_the\_cs{_#2alloc}}%
+ \_fi
+}
+
+ \_doc -----------------------------
+ The allocation macros
+ \`\newcount`, \`\newdimen`, \`\newskip`, \`\newmuskip`, \`\newbox`,
+ \`\newtoks`, \`\newread`, \`\newwrite` and \`\newfam`
+ are defined here.
+ \_cod -----------------------------
+
+\_def\_newcount #1{\_allocator #1{count}\_countdef}
+\_def\_newdimen #1{\_allocator #1{dimen}\_dimendef}
+\_def\_newskip #1{\_allocator #1{skip}\_skipdef}
+\_def\_newmuskip #1{\_allocator #1{muskip}\_muskipdef}
+\_def\_newbox #1{\_allocator #1{box}\_chardef}
+\_def\_newtoks #1{\_allocator #1{toks}\_toksdef}
+\_def\_newread #1{\_allocator #1{read}\_chardef}
+\_def\_newwrite #1{\_allocator #1{write}\_chardef}
+\_def\_newfam #1{\_allocator #1{fam}\_chardef}
+
+\_public \newcount \newdimen \newskip \newmuskip \newbox \newtoks \newread \newwrite \newfam ;
+
+ \_doc -----------------------------
+ The \`\newinsert` macro is defined differently than others.
+ \_cod -----------------------------
+
+\_newcount\_insertalloc \_insertalloc=255
+\_chardef\_insertmin = 201
+
+\_def\_newinsert #1{%
+ \_decr\_insertalloc
+ \_ifnum\_insertalloc <\_insertmin
+ \_errmessage {No room for a new \_string\insert}%
+ \_else
+ \_global\_chardef#1=\_insertalloc
+ \_wlog {\_string#1=\_string\_insert\_the\_insertalloc}%
+ \_fi
+}
+\_public \newinsert ;
+
+ \_doc -----------------------------
+ Other allocation macros \`\newattribute` and \`\newcatcodetable`
+ have their counter allocated by the `\newcount` macro.
+ \_cod -----------------------------
+
+\_newcount \_attributealloc \_attributealloc=0
+\_chardef\_maiattribute=\_maicount
+\_def\_newattribute #1{\_allocator #1{attribute}\_attributedef}
+
+\_newcount \_catcodetablealloc \_catcodetablealloc=10
+\_chardef\_maicatcodetable=32767
+\_def\_newcatcodetable #1{\_allocator #1{catcodetable}\_chardef}
+
+\_public \newattribute \newcatcodetable ;
+
+ \_doc -----------------------------
+ We declare public and private versions of `\tmpnum` and `\tmpdim`
+ registers separately. They are independent registers.
+ \_cod -----------------------------
+
+\_newcount \tmpnum \_newcount \_tmpnum
+\_newdimen \tmpdim \_newdimen \_tmpdim
+
+ \_doc -----------------------------
+ A few registers are initialized like in plain\TeX/. We absolutely
+ don't support the `@`category dance, so `\z@skip`
+ `\z@`, `\p@` etc. are not defined in \OpTeX/. If you need such
+ control sequences then you can initialize them by `\load[plain-at]`.
+
+ Only the \`\_zo` and \`\_zoskip` (equivalents to `\z@` and `\z@skip`)
+ are declared here and used in some internal macros of \OpTeX/
+ for improving speed.
+ \_cod -----------------------------
+
+\_newdimen\_maxdimen \_maxdimen=16383.99999pt % the largest legal <dimen>
+\_newdimen\_zo \_zo=0pt
+\_newskip\_hideskip \_hideskip=-1000pt plus 1fill % negative but can grow
+\_newskip\_centering \_centering=0pt plus 1000pt minus 1000pt
+\_newskip\_zoskip \_zoskip=0pt plus0pt minus0pt
+\_newbox\_voidbox % permanently void box register
+
+\_public \maxdimen \hideskip \centering \voidbox ;
+
+\_endcode %---------------------------------------------------
+
+Like plain\TeX, the allocators `\newcount`, `\newwrite`, etc. are defined.
+The registers are allocated from 256 to the `\_mai<type>` which is 65535 in
+\LuaTeX/.
+
+Unlike in Plain\TeX/, the mentioned allocators are not `\outer`.
+
+User can use `\dimen0` to `\dimen200` and similarly for `\skip`,
+`\muskip`, `\box`, and `\toks` directly. User can use
+`\count20` to `\count200` directly too. This is the same
+philosophy as in old plain\TeX/, but the range of directly used registers
+is wider.
+
+Inserts are allocated from 254 to 201 using `\newinsert`.
+
+You can define your own allocation concept (for example for allocation of
+arrays) from the top of the registers array. The example shows a definition of
+the array-like declarator of counters.
+
+\nobreak
+\begtt
+\newcount \_maicount % redefine maximal allocation index as variable
+\_maicount = \maicount % first value is top of the array
+
+\def\newcountarray #1[#2]{% \newcountarray \foo[100]
+ \global\advance\_maicount by -#2\relax
+ \ifnum \_countalloc > \_maicount
+ \errmessage{No room for a new array of \string\count}%
+ \else
+ \global\chardef#1=\_maicount
+ \fi
+}
+\def\usecount #1[#2]{% \usecount \foo[2]
+ \count\numexpr#1+#2\relax
+}
+\endtt
+
+\_endinput
+
+2021-02-15 \_advance -> \_incr, \_decr
+2020-05-12 \newmath -> \newfam bug fixing
+2020-01-23 released
diff --git a/macros/optex/base/basic-macros.opm b/macros/optex/base/basic-macros.opm
new file mode 100644
index 0000000000..4d465c3010
--- /dev/null
+++ b/macros/optex/base/basic-macros.opm
@@ -0,0 +1,130 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \sdef {Basic macros for OpTeX <2021-02-03>} % loaded in format
+
+ \_doc ------------------------------
+ \`\bgroup`, \`\egroup`, \`\empty`, \`\space`, \`\null` and \`\wlog`
+ are classical macros from plain \TeX/.
+ \_cod ------------------------------
+
+\_let\_bgroup={ \_let\_egroup=}
+\_def \_empty {}
+\_def \_space { }
+\_def \_null {\_hbox{}}
+\_def \_wlog {\_immediate\_write-1 } % write on log file (only)
+\_public \bgroup \egroup \empty \space \null \wlog ;
+
+ \_doc ------------------------------
+ \`\ignoreit` ignores next token or `{<text>}`,
+ \`\useit``{<text>}` expands to `<text>` (removes outer braces),
+ \`\ignoresecond` uses first, ignores second parameter and
+ \`\usesecond` ignores first, uses second parameter.
+ \_cod ------------------------------
+
+\_long\_def \_ignoreit #1{}
+\_long\_def \_useit #1{#1}
+\_long\_def \_ignoresecond #1#2{#1}
+\_long\_def \_usesecond #1#2{#2}
+\_public \ignoreit \useit \ignoresecond \usesecond ;
+
+ \_doc ------------------------------
+ \`\bslash` is \"normal backslash" with category code 12.
+ \`\nbb` is double backslash
+ and \`\pcent` is normal~`%`.
+ They can be used in Lua codes, for example.
+ \_cod ------------------------------
+
+\_edef \_bslash {\_csstring\\}
+\_edef \_nbb {\_bslash\_bslash}
+\_edef \_pcent{\_csstring\%}
+\_public \bslash \nbb \pcent ;
+
+ \_doc ------------------------------
+ \`\sdef` `{<text>}` is equivalent to `\def\<text>`, where `\<text>` is a control
+ sequence. You can use arbitrary parameter mask after `\sdef{<text>}`, don't
+ put the (unwanted) space immediately after closing brace \code{\}}.
+ \nl
+ \`\sxdef` `{<text>}` is equivalent to `\xdef\<text>`.
+ \nl
+ \`\slet` `{<textA>}{<textB>}` is equivalent to `\let \<textA> = \<textB>`.
+ \_cod ------------------------------
+
+\_def \_sdef #1{\_ea\_def \_csname#1\_endcsname}
+\_def \_sxdef #1{\_ea\_xdef \_csname#1\_endcsname}
+\_def \_slet #1#2{\_ea\_let \_csname#1\_ea\_endcsname \_csname#2\_endcsname}
+\_public \sdef \sxdef \slet ;
+
+ \_doc ------------------------------
+ \`\adef` `{<char>}{<body>}` puts the <char> as active character and defines it
+ as `{<body>}`. You can declare a macro with parameters too. For example
+ `\adef @#1{...#1...}`.
+ \_cod ------------------------------
+
+\_def \_adef #1{\_catcode`#1=13 \_begingroup \_lccode`\~=`#1\_lowercase{\_endgroup\_def~}}
+\_public \adef ;
+
+ \_doc ------------------------------
+ \`\cs` `{<text>}` is only a shortcut to `\csname <text>\endcsname`, but you need
+ one more `\_ea` if you need to get the real control sequence `\<text>`.
+ \nl
+ \`\trycs` `{<csname>}{<text>}` expands to `\<csname>`
+ if it is defined else to the `<text>`.
+ \_cod ------------------------------
+
+\_def \_cs #1{\_csname#1\_endcsname}
+\_def \_trycs#1#2{\_ifcsname #1\_endcsname \_csname #1\_ea\_endcsname \_else #2\_fi}
+\_public \cs \trycs ;
+
+ \_doc ------------------------------
+ \`\addto` `\macro{<text>}` adds `<text>` to your `\macro`, which must be defined.
+ \_cod ------------------------------
+
+\_long\_def \_addto #1#2{\_ea\_def\_ea#1\_ea{#1#2}}
+\_public \addto ;
+
+ \_doc -----------------------------
+ \`\incr``<counter>` increases `<counter>` by one globally.
+ \`\decr``<counter>` decreases `<counter>` by one globally.
+ \_cod -----------------------------
+
+\_def\_incr #1{\_global\_advance#1by1 }
+\_def\_decr #1{\_global\_advance#1by-1 }
+\_public \incr \decr ;
+
+ \_doc ------------------------------
+ \`\opwarning` `{<text>}` prints warning on the terminal and to the log file.
+ \_cod ------------------------------
+
+\_def \_opwarning #1{\_wterm{WARNING l.\_the\_inputlineno: #1.}}
+\_public \opwarning ;
+
+ \_doc ------------------------------
+ \`\loggingall` and \`\tracingall` are defined similarly as in
+ plain \TeX/, but they print
+ more logging information to the log file and the terminal.
+ \_cod ------------------------------
+
+\_def\_loggingall{\_tracingcommands=3 \_tracingstats=2 \_tracingpages=1
+ \_tracingoutput=1 \_tracinglostchars=1 \_tracingmacros=2
+ \_tracingparagraphs=1 \_tracingrestores=1 \_tracingscantokens=1
+ \_tracingifs=1 \_tracinggroups=1 \_tracingassigns=1 }
+\_def\_tracingall{\_tracingonline=1 \_loggingall}
+\_public \loggingall \tracingall ;
+
+ \_doc ------------------------------
+ Write a warning if the user did not load a Unicode Font {\em or}
+ if there were unresolved references. \`\_byehook` is used in the \^`\bye` macro.
+ \_cod ------------------------------
+
+\_def\_byehook{%
+ \_ifx\_initunifonts\_relax \_relax\_else \_opwarning{Unicode font was not loaded}\_fi
+ \_ifnum\_unresolvedrefs>0 \_opwarning{Try to rerun to get references right}\_fi
+}
+
+\_endcode % -------------------------------------
+
+2021-02-03: \useit defined.
+2021-01-22: \trycs: \ea added in order to be able to use cs with parameters
+2021-01-08: \opwarning format changed (secondly, hope that conclusively)
+2020-10-12: \opwarning: line numbers added
+2020-02-14: introduced
diff --git a/macros/optex/base/bib-iso690.opm b/macros/optex/base/bib-iso690.opm
new file mode 100644
index 0000000000..c58709ce83
--- /dev/null
+++ b/macros/optex/base/bib-iso690.opm
@@ -0,0 +1,906 @@
+% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+% bibliography style (iso690), version <2020-03-10>, loaded on demand by \usebib
+
+\_ifx\_optexbibstyle\_undefined \_errmessage
+ {This file can be read by: \_string\usebib/? (iso690) bibfiles command only}
+ \_endinput \_fi
+
+ \_doc -----------------------------
+ \`\_maybetod` (alias `\.` in the style file group) does not put the second dot.
+ \_cod -----------------------------
+
+\_def\_maybedot{\_ifnum\_spacefactor=\_sfcode`\.\_relax\_else.\_fi}
+\_tmpnum=\_sfcode`\. \_advance\_tmpnum by-2 \_sfcode`\.=\_tmpnum
+\_sfcode`\?=\_tmpnum \_sfcode`\!=\_tmpnum
+\_let\.=\_maybedot % prevents from double periods
+
+ \_doc -----------------------------
+ Option field.
+ \_cod -----------------------------
+
+\_CreateField {option}
+\_def\_isbiboption#1#2{\_edef\_tmp{\_noexpand\_isbiboptionA{#1}}\_tmp}
+\_def\_isbiboptionA#1{\_def\_tmp##1 #1 ##2\_relax{%
+ \_if^##2^\_csname iffalse\_ea\_endcsname \_else\_csname iftrue\_ea\_endcsname \_fi}%
+ \_ea\_tmp\_biboptionsi #1 \_relax}
+\_def\_bibopt[#1]#2#3{\_isbiboption{#1}\_iftrue\_def\_tmp{#2}\_else\_def\_tmp{#3}\_fi\_tmp}
+\_def\_biboptionvalue#1#2{\_def\_tmp##1 #1:##2 ##3\_relax{\_def#2{##2}}%
+ \_ea\_tmp\_biboptionsi #1: \_relax}
+
+\_def\_readbiboptions{%
+ \_RetrieveFieldIn{option}\_biboptionsi
+ \_toks1=\_ea{\_biboptionsi}%
+ \_edef\_biboptionsi{\_space \_the\_toks1 \_space \_the\_biboptions \_space}%
+}
+\_newtoks\_biboptions
+\_public \biboptions ;
+
+ \_doc -----------------------------
+ Formating of Author/Editor lists.
+ \_cod -----------------------------
+
+\_def\_firstauthorformat{%
+ \_upper{\_Lastname}\_bprintc\_Firstname{, *}\_bprintc\_Von{ *}\_bprintc\_Junior{, *}%
+}
+\_def\_otherauthorformat{%
+ \_bprintc\_Firstname{* }\_bprintc\_Von{* }\_upper{\_Lastname}\_bprintc\_Junior{, *}%
+}
+\_def\_commonname{%
+ \_ifnum\_NameCount=1
+ \_firstauthorformat
+ \_ifx\_dobibmark\_undefined \_edef\_dobibmark{\_Lastname}\_fi
+ \_else
+ \_ifnum0\_namecount=\_NameCount
+ \_ifx\_maybeetal\_empty \_bibconjunctionand\_else , \_fi
+ \_else , \_fi
+ \_otherauthorformat
+ \_fi
+}
+\_def\_authorname{%
+ \_ifnum\_NameCount>0\_namecount\_relax\_else \_commonname \_fi
+ \_ifnum\_NameCount=0\_namecount\_relax \_maybeetal \_fi
+}
+\_let\_editorname=\_authorname
+
+\_def\_prepareauedoptions#1{%
+ \_def\_mabyetal{}\_csname lb@abbreviatefalse\_endcsname
+ \_biboptionvalue{#1max}\_authormax
+ \_biboptionvalue{#1min}\_authormin
+ \_biboptionvalue{#1pre}\_authorpre
+ \_biboptionvalue{#1print}\_authorprint
+ \_isbiboption{#1etal}\_iftrue \_def\_maybeetal{\_Mtext{bib.etal}}\_fi
+ \_biboptionvalue{#1trim}\_autrim
+ \_let\_namecountraw=\_namecount
+ \_ifx\_authormax\_empty \_else
+ \_ifnum 0\_authormax<0\_namecount
+ \_edef\_namecount{\_ifx\_authormin\_empty\_authormax\_else\_authormin\_fi}%
+ \_def\_maybeetal{\_Mtext{bib.etal}}%
+ \_fi\_fi
+ \_ifx\_autrim\_empty \_def\_autrim{10000}\_fi
+ \_ifnum\_autrim=0 \_def\_autrim{10000}\_fi
+ \_ifnum 0\_namecount<\_autrim\_relax \_else \_AbbreviateFirstname \_fi
+}
+\_def\_maybeetal{}
+
+\_ifx\upper\_undefined
+ \_ifx\caps \_undefined \_def\upper{\_uppercase\_ea}\_else
+ \_def\upper#1{{\caps\_rm #1}}\_fi
+\_fi
+\_let\_upper=\upper
+
+ \_doc -----------------------------
+ Preparing bib-mark (used when `\nonumcitations` is set).
+ \_cod -----------------------------
+
+\_def\_setbibmark{%
+ \_ifx\_dobibmark\_undefined \_def\_dobibmark{}\_fi
+ \_RetrieveFieldIn{bibmark}\_tmp
+ \_ifx\_tmp\_empty \_RetrieveFieldIn{year}\_tmp \_edef\_tmp{\_dobibmark, \_tmp}\_fi
+ \_bibmark=\_ea{\_tmp}%
+}
+
+ \_doc -----------------------------
+ Setting phrases.
+ \_cod -----------------------------
+
+\_def\_bibconjunctionand{\_Mtext{bib.and}}
+\_def\_preurl{\_Mtext{bib.available}}
+\_let\_predoi=\_preurl
+\_def\_postedition{\_mtext{bib.edition}}
+\_def\_Inclause{In:~}
+\_def\_prevolume{\_mtext{bib.volume}}
+\_def\_prenumber{\_mtext{bib.number}}
+\_def\_prepages{\_mtext{bib.prepages}}
+\_def\_posteditor{\_ifnum0\_namecountraw>1 \_Mtext{bib.editors}\_else\_Mtext{bib.editor}\_fi}
+
+ \_doc ----------------------------
+ \`\_Mtext``{<identifier>}` expands to a
+ phrase by outer document language (no entry language).
+ \_cod -----------------------------
+
+\_chardef\_documentlanguage=\_language
+\_def\_Mtext#1{\_csname _mt:#1:\_csname _lan:\_the\_documentlanguage\_endcsname\_endcsname}
+
+\_CreateField {lang}
+\_def\_setlang#1{\_ifx#1\_empty \_else
+ \_ifcsname _mt:bib.and:#1\_endcsname \_language=\_csname _#1Patt\_endcsname \_relax
+ \_else \_opwarning{No phrases for "#1" used by [\EntryKey] in .bib}%
+ \_fi\_fi
+}
+
+ \_doc -----------------------------
+ Non-standard field names.
+ \_cod -----------------------------
+
+\_CreateField {ednote}
+\_CreateField {citedate}
+\_CreateField {numbering}
+\_CreateField {isbn}
+\_CreateField {issn}
+\_CreateField {doi}
+\_CreateField {url}
+\_CreateField {bibmark}
+
+ \_doc -----------------------------
+ Sorting.
+ \_cod -----------------------------
+
+\_SortingOrder{name,year}{lfvj}
+\_SpecialSort {key}
+
+ \_doc -----------------------------
+ Supporting macros.
+ \_cod -----------------------------
+
+\_def\_bibwarninga{\_bibwarning}
+\_def\_bibwarningb{\_bibwarning}
+
+\_def\_docitedate #1/#2/#3/#4\_relax{[\_Mtext{bib.citedate}%
+ \_if^#2^#1\_else
+ \_if^#3^#1/#2\_else
+ \_cs{_\_cs{_lan:\_the\_documentlanguage}dateformat}#1/#2/#3\relax
+ \_fi\_fi ]%
+}
+\_def\_doyear#1{
+ \_biboptionvalue{yearprint}\_yearprint
+ \_ifx\_yearprint\_empty#1\_else\_def\YEAR{#1}\_yearprint\_fi
+}
+\_def\_preparenumbering{%
+ \_def\VOL{\_RetrieveField{volume}}%
+ \_def\NO{\_RetrieveField{number}}%
+ \_def\PP{\_RetrieveField{pages}}%
+}
+\_def\_prepareednote{%
+ \_def\EDN{\_RetrieveField{edition}}%
+ \_def\ADDR{\_RetrieveField{address}}%
+ \_def\PUBL{\_RetrieveField{publisher}}%
+ \_def\YEAR{\_RetrieveField{year}}%
+ \_def\AU{\_bprintb[!author]{\_doauthor0{####1}}{}}%
+ \_def\ED{\_bprintb[!editor]{\_doeditor0{####1}}{}}%
+ \_preparenumbering
+}
+\_def\_doedition#1{%
+ \_biboptionvalue{editionprint}\_editionprint
+ \_ifx\_editionprint\_empty#1\_postedition\_else\_def\ED{#1}\_editionprint\_fi
+}
+\_def\_doauthor#1#2{\_prepareauedoptions{au}\_let\_iseditorlist=\_undefined
+ \_if1#1\_def\AU{#2}\_else\_let\_authorprint=\_empty\_fi
+ \_ifx\_authorprint\_empty #2\_else \_authorprint\_fi
+}
+\_def\_doeditor#1#2{\_prepareauedoptions{ed}\_let\_firstauthorformat=\_otherauthorformat
+ \_if1#1\_def\ED{#2}\_else\_let\_authorprint=\_empty\_fi
+ \_ifx\_authorprint\_empty #2\_posteditor\_else \_authorprint\_fi
+}
+
+ \_doc -----------------------------
+ Entry types.
+ \_cod -----------------------------
+
+\_sdef{_print:BEGIN}{%
+ \_readbiboptions
+ \_biboptionvalue{titlepost}\_titlepost
+ \_isbiboption{unpublished}\_iftrue \_let\_bibwarninga=\_relax \_let\_bibwarningb=\_relax \_fi
+ \_isbiboption{nowarn}\_iftrue \_let\_bibwarning=\_relax \_fi
+ \_isbiboption{urlalso}\_iftrue \_def\_preurl{\_Mtext{bib.availablealso}}\_fi
+ \_RetrieveFieldIn{lang}\_langentry \_setlang\_langentry
+}
+\_sdef{_print:END}{%
+ \_bprinta [note] {*.}{}%
+ \_setbibmark
+}
+\_def\_bookgeneric#1{%
+ \_bprinta [howpublished] {[*].\ }{}%
+ \_bprintb [edition] {\_doedition{##1}\.\ }{}%
+ \_bprinta [ednote] {*.\ }{}%
+ \_bprinta [address] {*\_bprintv[publisher]{:}{\_bprintv[year]{,}{.}}\ }{\_bibwarninga}%
+ \_bprinta [publisher] {*\_bprintv[year]{,}{.}\ }{\_bibwarninga}%
+ \_bprintb [year] {\_doyear{##1}\_bprintv[citedate]{\_bprintv[numbering]{.}{}}{.}\ }%
+ {\_bibwarning}%
+ \_bprinta [numbering] {\_preparenumbering*\_bprintv[citedate]{}{\.}\ }{}%
+ \_bprinta [citedate] {\_docitedate*///\_relax.\ }{}%
+ #1%
+ \_bprinta [series] {*.\ }{}%
+ \_bprinta [isbn] {ISBN~*.\ }{\_bibwarningb}%
+ \_bprinta [issn] {ISSN~*.\ }{}%
+ \_bprintb [doi] {\_predoi DOI \_ulink[http://dx.doi.org/##1]{##1}.\ }{}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+\_sdef{_print:book}{%
+ \_bprintb [!author] {\_doauthor1{##1}\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}\_bprintc\_titlepost{\.\ *}\_bprintv[howpublished]{}{\.}\ }%
+ {\_bibwarning}%
+ \_bookgeneric{}%
+}
+\_sdef{_print:article}{%
+ \_biboptionvalue{journalpost}\_journalpost
+ \_bprintb [!author] {\_doauthor1{##1}\.\ }{\_bibwarning}%
+ \_bprinta [title] {*.\ \_bprintc\_titlepost{*.\ }}{\_bibwarning}%
+ \_bprintb [journal] {{\_em##1}\_bprintc\_journalpost{\.\ *}\_bprintv[howpublished]{}{\.}\ }%
+ {\_bibwarninga}%
+ \_bprinta [howpublished] {[*].\ }{}%
+ \_bprinta [address] {*\_bprintb[publisher]{:}{,}\ }{}%
+ \_bprinta [publisher] {*, }{}%
+ \_bprinta [month] {*, }{}%
+ \_bprintb [year] {\_doyear{##1}\_bprintv[volume,number,pages]{,}{\.}\ }{}%
+ \_bprinta [numbering] {\_preparenumbering*\_bprintv[citedate]{}{\.}\ }
+ {\_bprinta [volume] {\_prevolume*\_bprintv[number,pages]{,}{\.}\ }{}%
+ \_bprinta [number] {\_prenumber*\_bprintv[pages]{,}{\.}\ }{}%
+ \_bprintb [pages] {\_prepages\_hbox{##1}\_bprintv[citedate]{}{\.}\ }%
+ {\_bibwarninga}}%
+ \_bprinta [citedate] {\_docitedate*///\_relax.\ }{}%
+ \_bprinta [issn] {ISSN~*.\ }{}%
+ \_bprintb [doi] {\_predoi DOI \_ulink[http://dx.doi.org/##1]{##1}.\ }{}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+\_sdef{_print:inbook}{%
+ \_let\_bibwarningb=\_relax
+ \_bprintb [!author] {\_doauthor1{##1}\.\ }{\_bibwarning}%
+ \_bprinta [title] {*.\ }{\_bibwarning}%
+ \_Inclause
+ \_bprintb [!editor] {\_doeditor1{##1}\.\ }{}%
+ \_bprintb [booktitle] {{\_em##1}\_bprintc\_titlepost{\.\ *}\_bprintv[howpublished]{}{\.}\ }%
+ {\_bibwarning}%
+ \_bookgeneric{\_bprintb [pages] {\_prepages\_hbox{##1}. }{}}%
+}
+\_slet{_print:inproceedings}{_print:inbook}
+\_slet{_print:conference}{_print:inbook}
+
+\_sdef{_print:thesis}{%
+ \_bprintb [!author] {\_doauthor1{##1}\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}\_bprintc\_titlepost{\.\ *}\_bprintv[howpublished]{}{\.}\ }%
+ {\_bibwarning}%
+ \_bprinta [howpublished] {[*].\ }{}%
+ \_bprinta [address] {*\_bprintv[school]{:}{\_bprintv[year]{,}{.}}\ }{\_bibwarning}%
+ \_bprinta [school] {*\_bprintv[year]{,}{.}\ }{\_bibwarning}%
+ \_bprinta [month] {*, }{}%
+ \_bprintb [year] {\_doyear{##1}\_bprintv[citedate]{}{.}\ }{\_bibwarninga}%
+ \_bprinta [citedate] {\_docitedate*///\_relax.\ }{}%
+ \_bprinta [type] {*\_bprintv[ednote]{,}{.}\ }%
+ {\_ifx\_thesistype\_undefined\_bibwarning
+ \_else\_thesistype\_bprintv[ednote]{,}{.}\ \_fi}%
+ \_bprinta [ednote] {*.\ }{}%
+ \_bprintb [doi] {\_predoi DOI \_ulink[http://dx.doi.org/##1]{##1}.\ }{}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+\_sdef{_print:phdthesis}{\_def\_thesistype{\_Mtext{bib.phdthesis}}\_cs{_print:thesis}}
+\_sdef{_print:mastershesis}{\_def\_thesistype{\_Mtext{bib.masthesis}}\_cs{_print:thesis}}
+\_sdef{_print:bachelorsthesis}{\_def\_thesistype{\_Mtext{bib.bachthesis}}\_cs{_print:thesis}}
+
+\_sdef{_print:generic}{%
+ \_bprintb [!author] {\_doauthor1{##1}\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}\_bprintc\_titlepost{\.\ *}\_bprintv[howpublished]{}{\.}\ }%
+ {\_bibwarning}%
+ \_bprinta [howpublished] {[*].\ }{}%
+ \_bprinta [ednote] {\_prepareednote*\_bprintv[citedate]{}{.}\ }{\_bibwarning}%
+ \_bprinta [year] {}{\_bibwarning}%
+ \_bprinta [citedate] {\_docitedate*///\_relax.\ }{}%
+ \_bprintb [doi] {\_predoi DOI \_ulink[http://dx.doi.org/##1]{##1}.\ }{}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+\_slet{_print:booklet}{_print:generic}
+\_slet{_print:incolleciton}{_print:generic}
+\_slet{_print:manual}{_print:generic}
+\_slet{_print:proceedings}{_print:generic}
+\_slet{_print:techreport}{_print:generic}
+\_slet{_print:unpublished}{_print:generic}
+
+\_sdef{_print:misc}{\_let\_bibwarning=\_relax \_cs{_print:generic}}
+
+\_endcode
+
+
+This is the iso690 bibliographic style used by \OpTeX/.
+
+See `op-biblist.bib` for an example of the `.bib` input. You can try it by:
+
+\begtt
+\fontfam[LMfonts]
+\nocite[*]
+\usebib/s (iso690) op-biblist
+\end
+\endtt
+
+\seccc Common rules in \code{.bib} files
+
+There are entries of type `@FOO{...}` in the `.bib` file. Each entry consists of
+fields in the form `name = "value"`, or `name = {value}`. No matter which form is
+used. If the value is pure numeric then you can say simply `name = value`.
+Warning: the comma after each field value is mandatory! If it is missing then the
+next field is ignored or badly interpreted.
+
+The entry names and field names are case insensitive. If there exists a data
+field no mentioned here then it is simply ignored. You can use it to store
+more information (abstract, for example).
+
+There are \"standard fields" used in ancient bib\TeX/ (author, title, editor, edition,
+etc., see \url{http://en.wikipedia.org/wiki/BibTeX}). The `iso690` style introduces
+several \"non-standard" fields: ednote, numbering, isbn, issn, doi, url,
+citedate, key, bibmark. They are documented here.
+
+Moreover, there are two optional special fields:
+
+\begitems
+* lang = language of the entry. The hyphenation plus autogenerated phrases and
+ abbreviations will be typeset by this language.
+* option = options by which you can control a special printing of various fields.
+\enditems
+
+There can be only one option field per each entry with (maybe) more options
+separated by spaces. You can declare the global option(s) in your document
+applied for each entry by `\biboptions={...}`.
+
+
+\seccc The author field
+
+All names in the author list have to be separated by \"\code{ and }".
+Each author can be written in various formats (the `von` part is typically missing):
+
+\begtt
+Firstname(s) von Lastname
+or
+von Lastname, Firstname(s)
+or
+von Lastname, After, Firstname(s)
+\endtt
+Only the Lastname part is mandatory. Examples:
+\begtt
+Petr Olšák
+or
+Olšák, Petr
+
+Leonardo Piero da Vinci
+or
+da Vinci, Leonardo Piero
+or
+da Vinci, painter, Leonardo Piero
+\endtt
+The separator \"\code{ and }" between authors
+will be converted to comma during
+printing, but between the semifinal and final author the word \"and" (or something
+different depending on the current language) is printed.
+
+The first author is printed in reverse order: \"LASTNAME, Firstname(s) von,
+After" and the other authors are printed in normal order: \"Firstname(s)
+von LASTNAME, After". This feature follows the ISO 690 norm. The Lastname
+is capitalized using uppercase letters. But if the `\caps` font modifier is defined,
+then it is used and printed `{\caps\_rm Lastname}`.
+
+You can specify the option `aumax:<number>`. The `<number>` denotes the
+maximum authors to be printed. The rest of the authors are ignored and the
+`et~al.` is appended to the list of printed authors. This text is
+printed only if the `aumax` value is less than the real number of authors.
+If you have the same number of authors in the .bib file as you need to print
+but you want to append `et~al.` then you can use `auetal` option.
+
+There is an `aumin:<number>` option which denotes the definitive number of
+printed authors if the author list is not fully printed due to `aumax`.
+If `aumin` is unused then `aumax` authors are printed in this case.
+
+All authors are printed if `aumax:<number>` option isn't given.
+There is no internal limit. But you can set the global options in
+your document by setting the `\biboptions` tokens list. For example:
+
+\begtt
+\biboptions={aumax:7 aumin:1}
+% if there are 8 or more authors then only the first author is printed.
+\entdd
+
+Examples:
+\begtt
+author = "John Green and Bob Brown and Alice Black",
+\endtt
+output: GREEN, John, Bob BROWN, and Alice BLACK.
+
+\begtt
+author = "John Green and Bob Brown and Alice Black",
+option = "aumax:1",
+\endtt
+output: GREEN, John~et~al.
+
+\begtt
+author = "John Green and Bob Brown and Alice Black",
+option = "aumax:2",
+\endtt
+output: GREEN, John, Bob BROWN~et~al.
+
+\begtt
+author = "John Green and Bob Brown and Alice Black",
+option = "aumax:3",
+\endtt
+output: GREEN, John, Bob BROWN, and Alice BLACK.
+
+\begtt
+author = "John Green and Bob Brown and Alice Black",
+option = "auetal",
+\endtt
+output: GREEN, John, Bob BROWN, Alice BLACK~et~al.
+
+If you need to add a text before or after the author's list, you can use
+the `auprint:{<value>}` option. The <value> will be printed instead of the
+authors list. The <value> can include `\AU` macro which expands to the authors
+list. Example:
+
+\begtt
+author = "Robert Calbraith",
+option = "auprint:{\AU\space [pseudonym of J. K. Rowling]}",
+\endtt
+output: CALBRAITH Robert [pseudonym of J. K. Rowling].
+
+You can use the `autrim:<number>` option. All Firstnames of all authors
+are trimmed (i. e. reduced to initials) iff the number of authors in the
+author field is greater than or equal to `<number>`. There is an exception:
+`autrim:0` means that no Firstnames are trimmed. This is the default behavior.
+Another example: `autrim:1` means that all Firstnames are trimmed.
+
+\begtt
+author = "John Green and Bob Brown and Alice Black",
+option = "auetal autrim:1",
+\endtt
+output: GREEN, J., B. BROWN, A. BLACK~et~al.
+
+If you need to write a team name or institution instead of authors, replace all
+spaces by `\ ` in this name. Such text is interpreted as Lastname. You
+can add the secondary name (interpreted as Firstname) after the comma. Example:
+
+\begtt
+ author = "Czech\ Technical\ University\ in\ Prague,
+ Faculty\ of\ Electrical\ Engeneering",
+\endtt
+output: CZECH TECHNICAL UNIVERSITY IN PRAGUE, Faculty of Electrical Engeneering.
+
+
+\seccc The editor field
+
+The editor field is used for the list of the authors of the collection. The
+analogous rules as in author field are used here. It means that the
+authors are separated by \"\code{ and }", the Firstnames, Lastnames, etc. are
+interpreted and you can use the options `edmax:<number>`, `edmin:<number>`,
+`edetal`, `edtrim:<number>` and `edprint:{<value>}` (with `\ED` macro).
+Example:
+\begtt
+editor = "Jan Tomek and Petr Karas",
+option = "edprint:{\ED, editors.} edtrim:1",
+\endtt
+Output: J. TOMEK and P. KARAS, editors.
+
+If `edprint` option is not set then `{\ED, eds.}` or `{\ED, ed.}` is used
+depending on the entry language and on the singular or plural of
+the editor(s).
+
+
+\seccc The ednote field
+
+The ednote field is used as the secondary authors and more editional info. The
+value is read as raw data without any interpretation of Lastname, Firstname
+etc.
+\begtt
+ednote = "Illustrations by Robert \upper{Agarwal}, edited by Tom \upper{Nowak}",
+\endtt
+output: Illustrations by Robert AGARWAL, edited by Tom NOWAK.
+
+The `\upper` command has to be used for Lastnames in the ednote field.
+
+
+\seccc The title field
+
+This is the title of the work. It will be printed (in common entry types) by
+italics. The ISO 690 norm declares, that the title plus optional subtitle
+are in italics and they are separated by a colon. Next, the optional secondary
+title has to be printed in an upright font. This can be added by
+`titlepost:{<value>}`. Example:
+
+\begtt
+title = "The Simple Title of The Work",
+or
+title = "Main Title: Subtitle",
+or
+title = "Main Title: Subtitle",
+option = "titlepost:{Secondary title}",
+\endtt
+The output of the last example:
+{\it Main Title: Subtitle}. Secondary title.
+
+
+\seccc The edition field
+
+This field is used only for second or more edition of cited work. Write
+only the number without the word "edition". The shortcut "ed." (or something
+else depending on the current language) is added automatically. Examples:
+
+\begtt
+edition = "Second",
+edition = "2nd",
+edition = "2$^{\rm nd}$",
+edition = "2.",
+\endtt
+Output of the last example: 2. ed.
+
+\begtt
+edition = "2."
+lang = "cs",
+\endtt
+Output: 2. vyd.
+
+Note, that the example `edition = "Second"` may cause problems. If you are
+using language "cs" then the output is bad: Second vyd.
+But you can use `editionprint:{<value>}` option. The the <value> is printed
+instead of edition field and shortcut. The edition field must be set. Example:
+
+\begtt
+edition = "whatever",
+option = "editionprint:{Second full revised edition}",
+\endtt
+Output: Second full revised edition.
+
+You can use `\EDN` macro in `editionprint` value. This macro is expanded
+to the edition value. Example:
+
+\begtt
+edition = "Second",
+option = "editionprint:{\EDN\space full revised edition}",
+or
+edition = "Second full revised edition",
+option = "editionprint:{\EDN}",
+\endtt
+
+
+\seccc The address, publisher, year fields
+
+This is an anachronism from ancient Bib\TeX/ (unfortunately no exclusive) that
+the address field includes only the city of the publisher's residence. No more
+data are here. The publisher field includes the name of the publisher.
+
+\begtt
+address = "Berlin",
+publisher = "Springer Verlag",
+year = 2012,
+\endtt
+Output: Berlin: Springer Verlag, 2012.
+
+Note, that the year needn't to be inserted into quotes because it is pure
+numeric.
+
+The letter a, b, etc. are appended to the year automatically if two or more
+subsequent entries in the bibliography list are not distinct by the first
+author and year fields. If you needn't this feature, you can use the
+`noautoletters` option.
+
+You can use "yearprint:{<value>}" option. If it is set then the <value>
+is used for printing year instead the real field value. The reason: year is
+sort sensitive, maybe you need to print something else than only sorting key.
+Example:
+
+\begtt
+year = 2000,
+option = "yearpint:{© 2000}",
+\endtt
+Output: © 2000, sorted by: 2000.
+
+\begtt
+year = "2012a",
+option = "yearprint:{2012}",
+\endtt
+Output: 2012, sorted by: 2012a.
+
+The address, publisher, and year are typically mandatory fields. If they are
+missing then the warning occurs. But you can set `unpublished`
+option. Then this warning is suppressed. There is no difference in the
+printed output.
+
+
+\seccc The url field
+
+Use it without `\url` macro, but with `http://` prefix. Example:
+
+\begtt
+url = "http://petr.olsak.net/opmac.html",
+\endtt
+
+The ISO 690 norm recommends to add the text \"Available from" (or
+something else if a different current language is used) before URL.
+It means, that the output of the previous example is:
+
+Available from \url{http://petr.olsak.net/opmac.html}.
+
+If the `cs` language is the current one than the output is:
+
+Dostupné z: \url{http://petr.olsak.net/opmac.html}.
+
+If the `urlalso` option is used, then the added text has the form
+\"Available also from" or \"Dostupné také z:" (if `cs` language is
+current).
+
+
+\seccc The citedate field
+
+This is the citation date. The field must be in the form year/month/day. It
+means, that the two slashes must be written here. The output depends on the
+current language. Example:
+
+\begtt
+citedate = "2004/05/21",
+\endtt
+Output when `en` is current: [cit. 2004-05-21].\nl
+Output when `cs` is current: [vid. 21.~5.~2004].
+
+
+\seccc The howpublished field
+
+This declares the available medium for the cited document if it is not in printed
+form. Alternatives: online, CD, DVD, etc. Example:
+
+\begtt
+howpublished = "online",
+\endtt
+Output: [online].
+
+
+\seccc The volume, number, pages and numbering fields
+
+The volume is the \"big mark" of the journal issue and the number is the
+\"small mark" of the journal issue and pages includes the page range of
+the cited article in the journal. The volume is prefixed by Vol.~,
+the number by No.~, and the pages by pp.~. But these prefixes depends on the
+language of the entry.
+
+Example:
+
+\begtt
+volume = 31,
+number = 3,
+pages = "37--42",
+\endtt
+Output: Vol.~31, No.~3, pp.~37--42.
+
+\begtt
+volume = 31,
+number = 3,
+pages = "37--42",
+lang = "cs",
+\endtt
+Output: ročník~31, č.~3, s.~37--42.
+
+If you disagree with the default prefixes, you can use the numbering field.
+When it is set then it is used instead of volume, number, pages fields
+and instead of any mentioned prefixes. The numbering can include macros
+`\VOL`, `\NO`, `\PP`, which are expanded to the respective values of fields. Example:
+
+\begtt
+volume = 31,
+number = 3,
+pages = "37--42"
+numbering = "Issue~\VOL/\NO, pages~\PP",
+\endtt
+Output: Issue~31/3, pages~37--42
+
+Note: The volume, numbers, and pages fields are printed without numbering
+filed only in the `@ARTICLE` entry. It means, that if you need to visible them
+in the `@INBOOK`, `@INPROCEEDINGS` etc. entries, then you must use the numbering field.
+
+
+\seccc Common notes about entries
+
+The order of the fields in the entry is irrelevant. We use the printed order
+in this manual. The exclamation mark (!) denotes the mandatory field. If
+the field is missing then a warning occurs during processing.
+
+If the `unpublished` option is set then the fields address, publisher, year,
+isbn, and pages are not mandatory. If the `nowarn` option is set then no
+warnings about missing mandatory fields occur.
+
+If the field is used but not mentioned in the entry documentation below then
+it is silently ignored.
+
+\secccc The `@BOOK` entry
+
+This is used for book-like entries.
+
+Fields: author(!), title(!), howpublished, edition, ednote, address(!),
+publisher(!), year(!), citedate, series, isbn(!), doi, url, note.
+
+The ednote field here means the secondary authors (illustrator, cover design
+etc.).
+
+\secccc The `@ARTICLE` entry
+
+This is used for articles published in a journal.
+
+Fields: author(!), title(!), journal(!), howpublished, address, publisher,
+month, year, [numbering or volume, number, pages(!)], citedate, issn,
+doi, url, note.
+
+If the numbering is used then it is used instead volume, number, pages.
+
+
+\secccc The `@INBOOK` entry
+
+This is used for the part of a book.
+
+Fields: author(!), title(!), booktitle(!), howpublished, edition, ednote,
+address(!), publisher(!), year(!), numbering, citedate, series, isbn or
+issn, doi, url, note.
+
+The author field is used for author(s) of the part, the editor field
+includes author(s) or editor(s) of the whole document. The pages field specifies
+the page range of the part. The series field can include more information
+about the part (chapter numbers etc.).
+
+The `@INPROCEEDINGS` and `@CONFERENCE` entries are equivalent to `@INBOOK` entry.
+
+\secccc The `@THESIS` entry
+
+This is used for the student's thesis.
+
+Fields: author(!), title(!), howpublished, address(!), school(!),
+month, year(!), citedate, type(!), ednote, doi, url, note.
+
+The type field must include the text \"Master's Thesis" or something
+similar (depending on the language of the outer document).
+
+There are nearly equivalent entries: `@BACHELORSTHESIS`, `@MASTERSTHESIS` and
+`@PHDTHESIS`. These entries set the type field to an appropriate value
+automatically. The type field is optional in this case. If it is used then
+it has precedence before the default setting.
+
+\secccc The @MISC entry
+
+It is intended for various usage.
+
+Fields: author, title, howpublished, ednote, citedate, doi, url, note.
+
+You can use `\AU`, `\ED`, `\EDN`, `\VOL`, `\NO`, `\PP`, `\ADDR`, `\PUBL`,
+`\YEAR` macros in ednote field. These macros print authors list, editors list,
+edition, volume, number, pages, address, publisher, and year field values
+respectively.
+
+The reason for this entry is to give to you the possibility to set the format of
+entry by your own decision. The most of data are concentrated in the ednote field.
+
+\secccc The `@BOOKLET`, `@INCOLLECION`, `@MANUAL`, `@PROCEEDINGS`, `@TECHREPORT`, `@UNPUBLISHED` entries
+
+These entries are equivalent to `@MICS` entry because we need to save the
+simplicity. They are implemented only for (almost) backward compatibility
+with the ancient Bib\TeX/. But the ednote is mandatory field here, so you
+cannot use these entries from the old databases without warnings and without
+some additional work with the `.bib` file.
+
+\seccc The cite-marks (bibmark) used when \code{\\nonumcitations} is set
+
+When `\nonumcitations` is set then `\cite` prints text-oriented
+bib-marks instead of numbers. This style file auto-generates these marks in the
+form \"Lastname of the first author, comma, space, the year" if the bibmark field
+isn't declared. If you need to set an exception from this common format,
+then you can use bibmark field.
+
+The OPmac trick \url{http://petr.olsak.net/opmac-tricks-e.html\#bibmark}
+describes how to redefine the algorithm for bibmark auto-generating when you
+need the short form of the type [Au13].
+
+
+\seccc Sorting
+
+If `\usebib/c` is used then entries are sorted by citation order in the text.
+If `\usebib/s` is used then entries are sorted by \"Lastname, Firstname(s)" of
+the first author and if more entries have this value equal, then the year is
+used (from older to newer). This feature follows the recommendation of the
+ISO 690 norm.
+
+If you have the same authors and the same year, you can control the sorting
+by setting years like 2013, 2013a, 2013b, etc. You can print something
+different to the list using `yearprint{<value>}` option, see the section about
+address, publisher, and year above. The real value of year field (i.e.\ not
+yearprint value) is also used in the text-oriented bib-marks when
+`\nonumcitations` is set.
+
+If you have some problems with name sorting, you can use the hidden field
+`key`, which is used for sorting instead of the \"Lastname Firstname(s)"
+of authors. If the `key` field is unset then the \"Lastname Firstname(s)"
+is used for sorting normally. Example:
+
+\begtt
+author = "Světla Čmejrková",
+key = "Czzmejrkova Svetla",
+\endtt
+
+This entry is now sorted between C and D.
+
+The norm recommends placing the auto-citations at the top of the list of
+references. You can do this by setting `key = "@"`, to each entry with your
+name because the `@` character is sorted before `A`.
+
+
+\seccc Languages
+
+There is the language of the outer document and the languages of each entry.
+The ISO 690 norm recommends that the technical notes (the prefix before URL,
+the media type, the \"and" conjunction between the semifinal and final author)
+maybe printed in the language of the outer document. The data of the entry
+have to be printed in the entry language (edition ed./vyd., Vol./ročník,
+No./č. etc.). Finally, there are the phrases independent of the language
+(for example In:). Unfortunately, the bib\TeX/ supposes that the entry data
+are not fully included in the fields so the automaton has to add some
+text during processing (\"ed.", \"Vol.", \"see also", etc.).
+But what language has to be chosen?
+
+The current value of the `\language` register at the start of the `.bib`
+processing is described as the language of the outer document. This language
+is used for technical notes regardless of the entry language. Moreover,
+each entry can have the `lang` field (short name of the language). This
+language is used for ed./vyd., vol./ročník, etc. and it is used for
+hyphenation too. If the `lang` is not set then the outer document
+language is used.
+
+You can use \^`\_Mtext{bib.<identifier>}` if you want to use a phrase
+dependent on outer document language (no on entry language).
+Example:
+
+\begtt
+howpublished = "\_Mtext{bib.blue-ray}"
+\endtt
+
+Now, you can set the variants of `bib.blue-ray` phrase for various
+languages:
+
+\begtt
+\_sdef{_mt:bib.blue-ray:en} {Blue-ray disc}
+\_sdef{_mt:bib.blue-ray:cs} {Blue-ray disk}
+\endtt
+
+
+\seccc Summary of non-standard fields
+
+This style uses the following fields unknown by bib\TeX/:
+
+\begtt
+option ... options separated by spaces
+lang ... the language two-letter code of one entry
+ednote ... edition info (secondary authors etc.) or
+ global data in @MISC-like entries
+citedate ... the date of the citation in year/month/day format
+numbering ... format for volume, number, pages
+isbn ... ISBN
+issn ... ISSN
+doi ... DOI
+url ... URL
+\endtt
+
+
+\seccc Summary of options
+
+\begtt \catcode`\<=13
+aumax:<number> ... maximum number of printed authors
+aumin:<number> ... number of printed authors if aumax exceeds
+autrim:<number> ... full Firstnames iff number of authors are less than this
+auprint:{<value>} ... text instead authors list (\AU macro may be used)
+edmax, edmin, edtrim ... similar as above for editors list
+edprint:{<value>} ... text instead editors list (\ED macro may be used)
+titlepost:{<value>} ... text after title
+yearprint:{<value>} ... text instead real year (\YEAR macro may be used)
+editionprint:{<value>} .. text instead of real edition (\EDN macro may be used)
+urlalso ... the ``available also from'' is used instead ``available from''
+unpublished ... the publisher etc. fields are not mandatory
+nowarn ... no mandatory fields
+\endtt
+
+Other options in the option field are silently ignored.
diff --git a/macros/optex/base/bib-simple.opm b/macros/optex/base/bib-simple.opm
new file mode 100644
index 0000000000..dff747bd57
--- /dev/null
+++ b/macros/optex/base/bib-simple.opm
@@ -0,0 +1,164 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+% bibliography style (simple), version <2020-03-10>, loaded on demand by \usebib
+
+\_ifx\_optexbibstyle\_undefined \_errmessage
+ {This file can be read by: \_string\usebib/? (simple) bibfiles command only}
+ \_endinput \_fi
+
+% misc:
+
+\_def\_maybedot{\_ifnum\_spacefactor=\_sfcode`\.\_relax\_else.\_fi}
+\_tmpnum=\_sfcode`\. \_advance\_tmpnum by-2 \_sfcode`\.=\_tmpnum
+\_sfcode`\?=\_tmpnum \_sfcode`\!=\_tmpnum
+\_let\.=\_maybedot % prevents from double periods
+
+% Formatting of Author/Editor lists:
+
+\_def\_authorname{%
+ \_ifnum\_NameCount>1
+ \_ifnum0\_namecount=\_NameCount \_mtext{bib.and}\_else , \_fi
+ \_else
+ \_ifx\_dobibmark\_undefined \_edef\_dobibmark{\_Lastname}\_fi
+ \_fi
+ \_bprintc\_Firstname{* }\_bprintc\_Von{* }\_Lastname\_bprintc\_Junior{, *}%
+}
+\_let\_editorname=\_authorname
+
+% Preparing bib-mark (used when \nonumcitations is set):
+
+\_def\_setbibmark{%
+ \_ifx\_dobibmark\_undefined \_def\_dobibmark{}\_fi
+ \_RetrieveFieldIn{bibmark}\_tmp
+ \_ifx\_tmp\_empty \_RetrieveFieldIn{year}\_tmp \_edef\_tmp{\_dobibmark, \_tmp}\_fi
+ \_bibmark=\_ea{\_tmp}%
+}
+
+\_def\_preurl{\_hfil\_break}
+
+% Non-standard fieldnames:
+
+\_CreateField {isbn}
+\_CreateField {doi}
+\_CreateField {url}
+\_CreateField {bibmark}
+
+% Sorting:
+
+\_SortingOrder{name,year}{lfvj}
+\_SpecialSort {key}
+
+% Entry types:
+
+\_sdef{_print:END}{%
+ \_bprinta [note] {*.}{}%
+ \_setbibmark
+}
+\_sdef{_print:book}{%
+ \_bprinta [!author] {*\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}.\ }{\_bibwarning}%
+ \_bprinta [edition] {*~\_mtext{bib.edition}.\ }{}%
+ \_bprinta [address] {*: }{\_bibwarning}%
+ \_bprinta [publisher] {*, }{\_bibwarning}%
+ \_bprinta [year] {*.\ }{\_bibwarning}%
+ \_bprinta [isbn] {ISBN~*.\ }{\_bibwarning}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+\_sdef{_print:article}{%
+ \_bprinta [!author] {*\.\ }{\_bibwarning}%
+ \_bprinta [title] {*.\ }{\_bibwarning}%
+ \_bprintb [journal] {{\_em##1}.\ }{\_bibwarning}%
+ \_bprinta [year] {*, }{}%
+ \_bprinta [volume] {* }{}%
+ \_bprinta [number] {(*), }{}%
+ \_bprinta [pages] {*.\ }{}%
+ \_bprintb [doi] {DOI~\_ulink[http://dx.doi.org/##1]{##1}.\ }{}%
+}
+\_sdef{_print:inbook}{%
+ \_bprinta [!author] {*\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1.}\ }{\_bibwarning}%
+ In:~%
+ \_bprinta [!editor] {*,~eds.\ }{}%
+ \_bprintb [booktitle] {{\_em##1}.\ }{\_bibwarning}%
+ \_bprinta [address] {*: }{\_bibwarning}%
+ \_bprinta [publisher] {*, }{\_bibwarning}%
+ \_bprinta [year] {*.\ }{\_bibwarning}%
+ \_bprinta [chapter] {*.\ }{%
+ \_bprinta [pages] {*.\ }{}}%
+ \_bprinta [isbn] {ISBN~*.\ }{}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+\_slet{_print:inproceedings}{_print:inbook}
+
+\_sdef{_print:incolection}{%
+ \_bprinta [!author] {*\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}.\ }{\_bibwarning}%
+ \_bprinta [crossreff] {In~\_cite[*]. }{%
+ \_bprinta [booktitle] {*. }{\_bibwarning}%
+ \_bprinta [!editor] {*,~eds.\ }{\_bibwarning}%
+ \_bprinta [edition] {*~\_mtext{bib.edition}.\ }{\_bibwarning}%
+ \_bprinta [address] {*: }{\_bibwarning}%
+ \_bprinta [publisher] {*, }{\_bibwarning}%
+ \_bprinta [year] {*.\ }{\_bibwarning}%
+ \_bprinta [pages] {*.\ }{}%
+ \_bprintb [url] {\_preurl\_url{####1}. }{}}%
+}
+\_sdef{_print:conference}{%
+ \_bprinta [!author] {*\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}\.\ }{\_bibwarning}%
+ \_bprinta [edition] {*~\_mtext{bib.edition}.\ }{}%
+ \_bprinta [address] {*: }{\_bibwarning}%
+ \_bprinta [publisher] {*, }{\_bibwarning}%
+ \_bprinta [year] {*.\ }{\_bibwarning}%
+ \_bprinta [isbn] {ISBN~*.\ }{}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+\_sdef{_print:thesis}{%
+ \_bprinta [!author] {*\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}\.\ }{\_bibwarning}%
+ \_bprinta [type] {*,\ }{\_bibwarning}%
+ \_bprinta [school] {*.\ }{}%
+ \_bprinta [address] {*, }{}%
+ \_bprinta [year] {*.\ }{}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+\_sdef{_print:proceedings}{%
+ \_bprinta [!author] {*\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}\.\ }{\_bibwarning}%
+ \_bprinta [publisher] {*.\ }{%
+ \_bprinta [organization] {*.\ }{\_bibwarning}}%
+}
+\_sdef{_print:techreport}{%
+ \_bprinta [!author] {*\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}\.\ }{\_bibwarning}%
+ \_mtext{bib.techreport}.
+ \_bprinta [institution] {*.\ }{}%
+}
+\_sdef{_print:booklet}{%
+ \_bprinta [!author] {*\.\ }{\_bibwarning}%
+ \_bprintb [title] {{\_em##1}\.\ }{\_bibwarning}%
+ \_bprinta [howpublished] {*.\ }{\_bibwarning}%
+}
+\_sdef{_print:manual}{%
+ \_bprinta [!author] {*\.\ }{}%
+ \_bprintb [title] {{\_em##1}\.\ }{\_bibwarning}%
+ \_bprinta [year] {*.\ }{}%
+ \_bprinta [institution] {*.\ }{}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+\_sdef{_print:misc}{%
+ \_bprinta [!author] {*\.\ }{}%
+ \_bprintb [title] {{\_em##1}\.\ }{}%
+ \_bprinta [howpublished] {*.\ }{}%
+ \_bprinta [institution] {*.\ }{}%
+ \_bprinta [series] {*.\ }{}%
+ \_bprinta [year] {*.\ }{}%
+ \_bprintb [url] {\_preurl\_url{##1}. }{}%
+}
+
+%%% end of the style file
+
+\_endcode
+
+You can copy this file to bib-yourname.opm and modify it by your
+needs...
diff --git a/macros/optex/base/cite-bib.opm b/macros/optex/base/cite-bib.opm
new file mode 100644
index 0000000000..26a5b17bd4
--- /dev/null
+++ b/macros/optex/base/cite-bib.opm
@@ -0,0 +1,271 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \cite {Cite, Biblioraphy <2020-03-09>} % loaded in format
+
+ \_doc -----------------------------
+ Registers used by `\cite`, `\bib` macros are declared here.
+ The \`\bibnum` counts the bibliography items from one.
+ The \`\bibmark` is used when `\nonumcitations` is set.
+ \_cod -----------------------------
+
+\_newcount\_bibnum % the bibitem counter
+\_newtoks\_bibmark % the bibmark used if \nonumcitations
+\_newcount\_lastcitenum \_lastcitenum=0 % for \shortcitations
+\_public \bibnum \bibmark ;
+
+ \_doc -----------------------------
+ \`\cite` `[<label>,<label>,...,<label>]` manages <labes> using `\_citeA`
+ and prints `[<bib-marks>]` using `\_printsavedcites`.
+ \nl
+ \`\nocite` `[<label>,<label>,...,<label>]` only manages <labels> but prints nothing.
+ \nl
+ \`\rcite` `[<label>,<label>,...,<label>]` behaves like `\cite` but prints
+ <bib-marks> without brackets.
+ \nl
+ \`\ecite` `[<label>]{<text>}` behaves like `\rcite [<label>]` but prints
+ <text> instead <bib-mark>. The <text> is hyperlinked like <bib-marks>
+ when `\cite` or `\rcite` is used.
+ The empty internal macro \`\_savedcites` will include the `<bib-marks>` list to
+ be printed. This list is set by `\_citeA` inside a group and it is used by
+ `\_printsavedcites` in the same group. Each `\cite`/`\rcite`/`\ecite` macro
+ starts from empty list of <bib-marks> because new group is opened.
+ \_cod -----------------------------
+
+\_def\_cite[#1]{{\_citeA#1,,,[\_printsavedcites]}}
+\_def\_nocite[#1]{{\_citeA#1,,,}}
+\_def\_rcite[#1]{{\_citeA#1,,,\_printsavedcites}}
+\_def\_ecite[#1]{\_bgroup\_citeA#1,,,\_ea\_eciteB\_savedcites;}
+\_def\_eciteB#1,#2;#3{\_if?#1\_relax #3\_else \_ilink[cite:#1]{#3}\_fi\_egroup}
+\_def\_savedcites{}
+
+\_public \cite \nocite \rcite \ecite ;
+
+ \_doc -----------------------------
+ `<bib-marks>` may be numbers or a special text related to cited bib-entry.
+ It depends on \`\nonumcitations` and on used bib-style. The mapping from
+ <label> to <bib-mark> is done when `\bib` or `\usebib` is processed.
+ These macros store the information to
+ \`\_Xbib``{<label>}{<number>}{<nonumber>}` where <number> and <nonumber> are
+ two variants of <bib-mark> (numbered or text-like). This information is
+ read from `.ref` file and it is saved to macros
+ `\_bib:<label>` and `\_bibm:<number>`. First one includes number and second
+ one includes <nonumber>. The `\_lastbibnum` macro includes last number of
+ bib-entry used in the document. A designer can use it to set appropriate
+ indentation when printing the list of all bib-entries.
+ \_cod -----------------------------
+
+\_def\_Xbib#1#2#3{\_sdef{_bib:#1}{\_bibnn{#2}&}%
+ \_if^#3^\_else\_sdef{_bim:#2}{#3}\_fi\_def\_lastbibnum{#2}}
+
+ \_doc -----------------------------
+ \`\_citeA` `<label>,` processes one label from the list of labels given in the
+ parameter of `\cite`, `\nocite`, `\rcite` or `\ecite` macros. It adds the
+ <label> to global list `\_citelist` which will be used by `\usebib` (it
+ must know what <labels> are used in the document to pick-up
+ only relevant bib-entries from the database. Because we want to save
+ space and not to save the same <label> to `\_citelist` twice, we
+ distinguish four cases:
+ \begitems
+ * `<label>` was not declared by \^`\_Xbib` and it is first such <label> in the
+ document: Then `\_bib:<label>` is undefined and we save label using
+ `\_addcitlist`, write warning on the terminal and define
+ `\_bib:<label>` as empty.
+ * `<label>` was not declared by \^`\_Xbib` but it was used previously in the
+ document: Then `\_bib:<label>` is empty and we do nothing (only data to
+ `\_savedcites` are saved).
+ * `<label>` was declared by \^`\_Xbib` and it is first such <label> in the
+ document: Then `\_bin:<label>` includes `\_bibnn{<number>}&` and we
+ test this case by `\if &\_bibnn{<number>}&`. This is true when `\_bibnn{<number>}`
+ expands to empty. The <label> is saved by `\_addcitelist` and
+ `\_bib:<label>` is re-defined directly as <number>.
+ * `<label>` was declared by \^`\_Xbib` and it was used previously in the
+ document. Then we do nothing (only data to `\_savedcites` are saved.
+ \enditems
+ The `\_citeA` macro runs repeatedly over the whole list of <labels>.
+ \_cod -----------------------------
+
+\_def\_citeA #1#2,{\_if#1,\_else
+ \_if *#1\_addcitelist{*}\_ea\_skiptorelax \_fi
+ \_ifcsname _bib:#1#2\_endcsname \_else
+ \_addcitelist{#1#2}%
+ \_opwarning{\_noexpand\cite [#1#2] unknown. Try to TeX me again}\_openref
+ \_incr\_unresolvedrefs
+ \_addto\_savedcites{?,}\_def\_sortcitesA{}\_lastcitenum=0
+ \_ea\_gdef \_csname _bib:#1#2\_endcsname {}%
+ \_ea\_skiptorelax \_fi
+ \_ea\_ifx \_csname _bib:#1#2\_endcsname \_empty
+ \_addto\_savedcites{?,}\_def\_sortcitesA{}\_lastcitenum=0
+ \_ea\_skiptorelax \_fi
+ \_def\_bibnn##1{}%
+ \_if &\_csname _bib:#1#2\_endcsname
+ \_def\_bibnn##1##2{##1}%
+ \_addcitelist{#1#2}%
+ \_sxdef{_bib:#1#2}{\_csname _bib:#1#2\_endcsname}%
+ \_fi
+ \_edef\_savedcites{\_savedcites \_csname _bib:#1#2\_endcsname,}%
+ \_relax
+ \_ea\_citeA\_fi
+}
+\_def\_addcitelist#1{\_global\_addto\_citelist{\_citeI[#1]}}
+\_def\_citelist{}
+
+ \_doc -----------------------------
+ The `<bib-marks>` (in numeric or text form) are saved in \^`\_savedcites`
+ macro separated by commas.
+ The \`\_printsavedcites` prints them by normal order or sorted if
+ \`\sortcitations` is specified or condensed if \`\shordcitations` is
+ specified.\nl
+ The `\sortcitations` appends the dummy number 300000 and we suppose that normal
+ numbers of bib-entries are less than this constant.
+ This constant is removed after the sorting algorithm.
+ The \`\shortcitations` sets simply `\_lastcitenum=1`.
+ The macros for <bib-marks> printing follows (sorry, without detail
+ documentation). They are documented in `opmac-d.pdf` (but only in Czech).
+ \_cod -----------------------------
+
+\_def\_printsavedcites{\_sortcitesA
+ \_chardef\_tmpb=0 \_ea\_citeB\_savedcites,%
+ \_ifnum\_tmpb>0 \_printdashcite{\_the\_tmpb}\_fi
+}
+\_def\_sortcitesA{}
+\_def\_sortcitations{%
+ \_def\_sortcitesA{\_edef\_savedcites{300000,\_ea}\_ea\_sortcitesB\_savedcites,%
+ \_def\_tmpa####1300000,{\_def\_savedcites{####1}}\_ea\_tmpa\_savedcites}%
+}
+\_def\_sortcitesB #1,{\_if $#1$%
+ \_else
+ \_mathchardef\_tmpa=#1
+ \_edef\_savedcites{\_ea}\_ea\_sortcitesC \_savedcites\_end
+ \_ea\_sortcitesB
+ \_fi
+}
+\_def\_sortcitesC#1,{\_ifnum\_tmpa<#1\_edef\_tmpa{\_the\_tmpa,#1}\_ea\_sortcitesD
+ \_else\_edef\_savedcites{\_savedcites#1,}\_ea\_sortcitesC\_fi}
+\_def\_sortcitesD#1\_end{\_edef\_savedcites{\_savedcites\_tmpa,#1}}
+
+\_def\_citeB#1,{\_if$#1$\_else
+ \_if?#1\_relax??%
+ \_else
+ \_ifnum\_lastcitenum=0 % only comma separated list
+ \_printcite{#1}%
+ \_else
+ \_ifx\_citesep\_empty % first cite item
+ \_lastcitenum=#1\_relax
+ \_printcite{#1}%
+ \_else % next cite item
+ \_advance\_lastcitenum by1
+ \_ifnum\_lastcitenum=#1\_relax % cosecutive cite item
+ \_mathchardef\_tmpb=\_lastcitenum
+ \_else % there is a gap between cite items
+ \_lastcitenum=#1\_relax
+ \_ifnum\_tmpb=0 % previous items were printed
+ \_printcite{#1}%
+ \_else
+ \_printdashcite{\_the\_tmpb}\_printcite{#1}\_chardef\_tmpb=0
+ \_fi\_fi\_fi\_fi\_fi
+ \_ea\_citeB\_fi
+}
+\_def\_shortcitations{\_lastcitenum=1 }
+
+\_def\_printcite#1{\_citesep\_ilink[cite:#1]{\_citelinkA{#1}}\_def\_citesep{,\_hskip.2em\_relax}}
+\_def\_printdashcite#1{\_ifmmode-\_else\_hbox{--}\_fi\_ilink[cite:#1]{\_citelinkA{#1}}}
+\_def\_citesep{}
+
+\_def\_nonumcitations{\_lastcitenum=0\_def\_sortcitesA{}\_def\_etalchar##1{$^{##1}$}%
+ \_def\_citelinkA##1{\_isdefined{_bim:##1}\_iftrue \_csname _bim:##1\_endcsname
+ \_else ##1\_opwarning{\_noexpand\nonumcitations + empty bibmark. Maybe bad bib-style}\_fi}%
+}
+\_def\_citelinkA{}
+
+\_public \nonumcitations \sortcitations \shortcitations ;
+
+ \_doc -----------------------------
+ The \`\bib` `[<label>] {<optional bib-mark>}` prints one bib-entry
+ without reading any database. The bib-enty follows after this command.
+ This command counts the used `\bib`s from one by `\bibnum` counter and
+ saves \^`\_Xbib``{<label>}{\_the\_bibnum}{\_the\_bibmark}` into `.ref` file
+ immediately using `\_wbib`. This is the core of creation of mapping from
+ `<labels>` to `<bib-marks>`.
+ \_cod -----------------------------
+
+\_def\_bib[#1]{\_def\_tmp{\_isnextchar={\_bibA[#1]}{\_bibmark={}\_bibB[#1]}}%
+ \_ea\_tmp\_romannumeral-`\.} % ignore optional space
+\_def\_bibA[#1]=#2{\_bibmark={#2}\_bibB[#1]}
+\_def\_bibB[#1]{\_par \_bibskip
+ \_advance\_bibnum by1
+ \_noindent \_def\_tmpb{#1}\_wbib{#1}{\_the\_bibnum}{\_the\_bibmark}%
+ \_printlabel{#1}%
+ \_printbib \_ignorespaces
+}
+\_def\_wbib#1#2#3{\_dest[cite:\_the\_bibnum]%
+ \_ifx\_wref\_wrefrelax\_else \_immediate\_wref\_Xbib{{#1}{#2}{#3}}\_fi}
+
+\_public \bib ;
+
+ \_doc -----------------------------
+ The \`\_printbib` prints the bib-entry itself. You can re-define it if you
+ want a different design. The `\_pritbib` starts in horizontal mode after
+ `\noindent` and after the eventual hyperlink destination is inserted.
+ By default, the `\_printbib` sets the indentation
+ by `\hangindent` and prints numeric <bib-marks> by
+ `\llap{[\the\bibnum]}` If `\nonumcitations` then the `\_citelinkA` is not
+ empty and <bib-marks> (`\the\bibnum` nor `\the\bibmark`) are not printed.
+ The text of bib-entry follows. User can create this text manually
+ using `\bib` command or it is generated automatically from a `.bib` database
+ by `\usebib` command.
+
+ The vertical space between bib-entries is controlled by \`\_bibskip` macro.
+ \_cod -----------------------------
+
+\_def \_printbib {\_hangindent=\_iindent
+ \_ifx\_citelinkA\_empty \_hskip\_iindent \_llap{[\_the\_bibnum] }\_fi
+}
+\_def \_bibskip {\_ifnum\_bibnum>0 \_smallskip \_fi}
+
+ \_doc -----------------------------
+ The \`\usebib` command is implemented in `usebib.opm` file which is loaded
+ when the `\usebib` command is used first.
+ The `usebib.opm` file loads the `librarian.tex` for scanning the `.bib`
+ files. See the section~\ref[usebib], where the file `usebib.opm` is
+ documented.
+ \_cod -----------------------------
+
+\_def\_usebib{\_par \_opinput {usebib.opm} \_usebib}
+\_def\usebib{\_usebib}
+
+ \_doc ------------------------------
+ \_forwardlink\`\nobibwarning` `[<list of bib-labels>]`
+ declares a list of bib labels
+ which are not fully declared in `.bib` file but we want to suppress the
+ warning about it. List of bib labels are comma-separated case sensitive
+ list without spaces.
+ \_cod ------------------------------
+
+\_def\_nobibwarnlist{,}
+\_def\_nobibwarning[#1]{\_global\_addto\_nobibwarnlist{#1,}}
+\_public \nobibwarning ;
+
+ \_doc -----------------------------
+ The macros above works if all `\cite` (or similar) commands are used
+ before the `\usebib` command is used because `\usebib` prints only such
+ bib-entries their <labels> are saved in the `\_citelist`. But if some
+ `\cite` is used after `\usebib`, then `\usebib` sets `\_addcitelist` to
+ \`\_writeXcite`, so such `\cite` saves the information to the
+ `.ref`file in the format \`\_Xcite``{<label>}`. Such information are copied
+ to `\_citelistB` during reading `.ref` file and `\usebib` concats two
+ lists of <labels> from `\_citelist` and `\_citelistB` and
+ uses this concatenated list.
+ \_cod -----------------------------
+
+\_def\_Xcite#1{\_addto\_citelistB{\_citeI[#1]}}
+\_def\_writeXcite#1{\_openref\_immediate\_wref\_Xcite{{#1}}}
+\_def\_citelistB{}
+
+\_endcode % -------------------------------------
+
+See end of the `usebib.opm` file for documentation about creating style
+files `bib-<style>.opm`.
+
+See end of the `bib-iso690.opm` file for large documentation about `.bib` files
+structure and about the usage of `iso690` bib-style.
+
diff --git a/macros/optex/base/colors.opm b/macros/optex/base/colors.opm
new file mode 100644
index 0000000000..bbda496761
--- /dev/null
+++ b/macros/optex/base/colors.opm
@@ -0,0 +1,394 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \colordef {Colors <2020-03-18>} % loaded in format
+
+ \_doc -----------------------------
+ We declare internal boolean value \`\_iflocalcolor` ad do
+ \`\localcolor` as default.
+ \_cod -----------------------------
+
+\_newifi \_iflocalcolor \_localcolortrue
+\_protected\_def \_localcolor {\_localcolortrue}
+\_protected\_def \_nolocalcolor {\_localcolorfalse}
+\_public \localcolor \nolocalcolor ;
+
+ \_doc -----------------------------
+ The basic colors in CMYK
+ \`\Blue` \`\Red` \`\Brown` \`\Green` \`\Yellow` \`\Cyan` \`\Magenta`
+ \`\Grey` \`\LightGrey` \`\White` and \`\Black`
+ are declared here.
+ \_cod -----------------------------
+
+\_def\Blue {\_setcmykcolor{1 1 0 0}}
+\_def\Red {\_setcmykcolor{0 1 1 0}}
+\_def\Brown {\_setcmykcolor{0 0.67 0.67 0.5}}
+\_def\Green {\_setcmykcolor{1 0 1 0}}
+\_def\Yellow {\_setcmykcolor{0 0 1 0}}
+\_def\Cyan {\_setcmykcolor{1 0 0 0}}
+\_def\Magenta {\_setcmykcolor{0 1 0 0}}
+\_def\Grey {\_setcmykcolor{0 0 0 0.5}}
+\_def\LightGrey {\_setcmykcolor{0 0 0 0.2}}
+\_def\White {\_setgreycolor{1}}
+\_def\Black {\_setgreycolor{0}}
+
+ \_doc -----------------------------
+ By default, the \`\setcmykcolor` \`\setrgbcolor` and \`\setgreycolor`
+ macros with `{<componetns>}` parameter
+ expand to `\_setcolor{<pdf-primitive>}` using \`\_formatcmyk`
+ or \`\_formatrgb` or \`\_formatgrey` expandable macros.
+ For example `\setrgbcolor{1 0 0}` expands to `\_setcolor{1 0 0 rg 1 0 0 RG}`.\nl
+ We set both types of colors (for lines (`K` or `RG` or `G`) and for fills
+ (`r` or `rg` or `g`) together in the <pdf-primitive> command.
+ This is the reason why the \`\_fillstroke` uses both its parameters.
+ If only fills are needed you can do `\def\_fillstroke#1#2{#1}`.
+ If only strokes are needed you can do `\def\_fillstroke#1#2{#2}`.
+ \_cod -----------------------------
+
+\_def\_setcmykcolor#1{\_setcolor{\_formatcmyk{#1}}}
+\_def\_setrgbcolor#1{\_setcolor{\_formatrgb{#1}}}
+\_def\_setgreycolor#1{\_setcolor{\_formatgrey{#1}}}
+\_def\_formatcmyk#1{\_fillstroke{#1 k}{#1 K}}
+\_def\_formatrgb#1{\_fillstroke{#1 rg}{#1 RG}}
+\_def\_formatgrey#1{\_fillstroke{#1 g}{#1 G}}
+\_def\_fillstroke#1#2{#1 #2}
+\_public \setcmykcolor \setrgbcolor \setgreycolor ;
+
+ \_doc -----------------------------
+ The \`\onlyrgb` declaration redefines \^`\_formatcmyk` in order it expands
+ to its conversion to RGB <pdf-primitive>. This conversion is done by
+ the \^`\_cmyktorgb` macro. Moreover, `\onlyrgb` re-defines three basic RGB
+ colors for RGB color space and re-declares \^`\colordef` as \^`\rgbcolordef`.
+ The \hbox{\`\onlycmyk`} macro does similar work, it re-defines \^`\_formatrgb`
+ macro. The Grey color space is unchanged and works in both main
+ settings (RGB or CMYK) without collisions.
+ \_cod -----------------------------
+
+\_def\_onlyrgb{\_def\Red{\_setrgbcolor{1 0 0}}%
+ \_def\Green{\_setrgbcolor{0 1 0}}\_def\Blue{\_setrgbcolor{0 0 1}}%
+ \_let\_colordef=\_rgbcolordef
+ \_def\_formatrgb##1{\_fillstroke{##1 rg}{##1 RG}}%
+ \_def\_formatcmyk##1{\_fillstroke{\_cmyktorgb ##1 ; rg}{\_cmyktorgb ##1 ; RG}}}
+\_def\_onlycmyk{\_def\_formatcmyk##1{\_fillstroke{##1 k}{##1 K}}%
+ \_def\_formatrgb##1{\_fillstroke{\_rgbtocmyk ##1 ; k}{\_rgbtocmyk ##1 ; K}}}
+\_public \onlyrgb \onlycmyk ;
+
+ \_doc -----------------------------
+ The \`\_setcolor` macro redefines empty `\_ensureblack` macro (used in
+ output routine for headers and footers) to `\_ensureblackA` which sets
+ Black at the start of its parameter and returns to the current color at the
+ end of its parameter.
+
+ The current color is saved into `\_currentcolor` macro and colorstack is pushed.
+ Finally, the `\_colorstackpop` is initialized by `\aftergroup` if
+ `\localcolor` is declared.
+
+ You can save the current color to your macro by `\let\yourmacro=\_currentcolor`
+ and you can return to this color by the command `\_setcolor\yourmacro`.
+ \_cod -----------------------------
+
+\_protected\_def \_setcolor #1{\_global\_let\_ensureblack=\_ensureblackA
+ \_iflocalcolor \_edef\_currentcolor{#1}\_colorstackpush\_currentcolor
+ \_aftergroup\_colorstackpop
+ \_else \_xdef\_currentcolor{#1}\_colorstackset\_currentcolor \_fi
+}
+\_def\_pdfblackcolor{0 g 0 G}
+\_edef\_currentcolor{\_pdfblackcolor}
+\_def\_ensureblackA#1{\_global\_let\_openfnotestack=\_openfnotestackA
+ \_colorstackpush\_pdfblackcolor #1\_colorstackpop}
+
+ \_doc -----------------------------
+ The colorstack is initialized here and the basic macros
+ \`\_colorstackpush`, \`\_colorstackpop` and \`\_colorstackset`
+ are defined here.
+ \_cod -----------------------------
+
+\_mathchardef\_colorstackcnt=0 % Implicit stack usage
+\_def\_colorstackpush#1{\_pdfcolorstack\_colorstackcnt push{#1}}
+\_def\_colorstackpop{\_pdfcolorstack\_colorstackcnt pop}
+\_def\_colorstackset#1{\_pdfcolorstack\_colorstackcnt set{#1}}
+
+ \_doc -----------------------------
+ We need to open a special color stack for footnotes because footnotes
+ can follow on the next pages and their colors are independent of colors
+ used in the main page-body. The \`\_openfnotestack` is defined as
+ \`\_openfnotestackA` when the \^`\_setcolor` is used first.
+ The \`\_fnotestack` is initialized in in `\everyjob` because the
+ initialization is not saved to the format.
+ \_cod -----------------------------
+
+%\_mathchardef\_fnotestack=\_pdfcolorstackinit page {0 g 0 G} % must be in \everyjob
+\_def \_openfnotestackA {\_pdfcolorstack\_fnotestack current}
+
+ \_doc -----------------------------
+ We use Lua codes for RGB to CMYK or CMYK to RGB conversions and for
+ addition color components in the \^`\colordef` macro.
+ The \`\_rgbtocmyk` `<R> <G> <B> ;` expands to `<C> <M> <Y> <K>` and
+ the \`\_cmyktorgb` `<C> <M> <Y> <K> ;` expands to `<R> <G> <B>`.
+ The \`\_colorcrop`, \`\_colordefFin` and \`\_douseK` are auxiliary macros
+ used in the \^`\colordef`. The `\_colorcrop` rescales color components in order
+ to they are in $[0,1]$ interval. The `\colordefFin` expands to the values
+ accumulated in Lua code `color_C`, `color_M`, `color_Y` and `color_K`.
+ The `\_douseK` applies \^`\useK` to CMYK components.
+ \_cod -----------------------------
+
+\_def\_rgbtocmyk #1 #2 #3 ;{%
+ \_ea \_stripzeros \_detokenize \_ea{\_directlua{
+ local kr = math.max(#1,#2,#3)
+ if (kr==0) then
+ tex.print('0. 0. 0. 1 ;')
+ else
+ tex.print(string.format('\_pcent.3f \_pcent.3f \_pcent.3f \_pcent.3f ;',
+ (kr-#1)/kr, (kr-#2)/kr, (kr-#3)/kr, 1-kr))
+ end
+}}}
+\_def\_cmyktorgb #1 #2 #3 #4 ;{%
+ \_ea \_stripzeros \_detokenize \_ea{\_directlua{
+ local kr = 1-#4
+ tex.print(string.format('\_pcent.3f \_pcent.3f \_pcent.3f ;',
+ (1-#1)*kr, (1-#2)*kr, (1-#3)*kr))
+}}}
+\_def\_colorcrop{\_directlua{
+ local m=math.max(color_C, color_M, color_Y, color_K)
+ if (m>1) then
+ color_C=color_C/m color_M=color_M/m color_Y=color_Y/m color_K=color_K/m
+ end
+}}
+\_def\_colordefFin{\_colorcrop \_ea \_stripzeros \_detokenize \_ea{\_directlua{
+ tex.print(string.format('\_pcent.3f \_pcent.3f \_pcent.3f \_pcent.3f ;',
+ color_C, color_M, color_Y, color_K))
+}}}
+\_def\_douseK{\_colorcrop \_directlua{
+ kr=math.min(color_C, color_M, color_Y)
+ if (kr>=1) then
+ color_C=0 color_M=0 color_Y=0 color_K=1
+ else
+ color_C=(color_C-kr)/(1-kr) color_M=(color_M-kr)/(1-kr)
+ color_Y=(color_Y-kr)/(1-kr) color_K=math.min(color_K+kr,1)
+ end
+}}
+
+ \_doc -----------------------------
+ We have a problem with the `%.3f` directive in Lua code. It prints trailed
+ zeros: (0.300 instead desired 0.3) but we want to save PDF file space. The macro
+ \`\_stripzeros` removes these trailing zeros at the expand processor
+ level. So `\_stripzeros 0.300 0.400 0.560 ;` expands to `.3 .4 .56`.
+ \_cod -----------------------------
+
+\_def\_stripzeros #1.#2 #3{\_ifx0#1\_else#1\_fi.\_stripzeroA #2 0 :%
+ \_ifx;#3\_else \_space \_ea\_stripzeros\_ea#3\_fi}
+\_def\_stripzeroA #10 #2:{\_ifx^#2^\_stripzeroC#1:\_else \_stripzeroB#1 0 :\_fi}
+\_def\_stripzeroB #10 #2:{\_ifx^#2^\_stripzeroC#1:\_else #1\_fi}
+\_def\_stripzeroC #1 #2:{#1}
+
+ \_doc -----------------------------
+ The \`\rgbcolordef` and \`\cmykcolordef` use common macro
+ \`\_commoncolordef` with different first four parameters.
+ The `\_commoncolordef <selector><K><R><G><what-define>{<data>}` does the
+ real work. It initializes the Lua variables for summation.
+ It expands <data> in the group where color selectors have
+ special meaning, then it adjusts the resulting string by \^`\replstring`
+ and runs it. Example shows how the <data> are processed:
+ \begtt \catcode`\<=13
+ input <data>: ".3\Blue + .6^\KhakiC \useK -\Black"
+ expanded to: ".3 !=K 1 1 0 0 +.6^!=R .804 .776 .45 \_useK -!=G 0"
+ adjusted to: "\_addcolor .3!=K 1 1 0 0 \_addcolor .6!^R .804 .776 .45
+ \_useK \_addcolor -1!=G 0"
+ and this is processed.
+ \endtt
+ \`\_addcolor` `<coef.>!<mod><type>` expands to `\_addcolor:<mod><type> <coef>`
+ for example it expands to `\_addcolor:=K <coef>` followed by one or three or four
+ numbers (depending on <type>). <mod> is `=` (use as is) or `^` (use
+ complementary color). <type> is `K` for CMYK, `R` for RGB and `G` for
+ GREY color space. Uppercase <type> informs that `\cmykcolordef` is
+ processed and lowercase <type> informs that `\rgbcolordef` is processed.
+ All variants of commands `\_addcolor:<mod><type>` are defined. All of
+ them expand to `\_addcolorA <v1> <v2> <v3> <v4>` which adds the values of Lua
+ variables. The `\rgbcolordef` uses `\_addcolorA <R> <G> <B> 0` and
+ `\cmkykcolordef` uses `\_addcolorA <C> <M> <Y> <K>`. So the Lua variable
+ names are a little confusing when `\rgbcolordef` is processed.
+
+ Next, `\_commoncolordef` saves resulting values from Lua to `\_tmpb`
+ using `\_colordefFin`. If `\rgbcolordef` is processed, then we must to
+ remove the last <K> component which is in the format `.0` in such case.
+ The `\_stripK` macro does it.
+ Finally, the `<what-define>` is defined as `<selector>{<expanded _tmpb>}`,
+ for example `\_setcmykclor{1 0 .5 .3}`.
+ \_cod -----------------------------
+
+\_def\_rgbcolordef {\_commoncolordef \_setrgbcolor krg}
+\_def\_cmykcolordef {\_commoncolordef \_setcmykcolor KRG}
+\_def\_commoncolordef#1#2#3#4#5#6{%
+ \_begingroup
+ \_directlua{color_C=0 color_M=0 color_Y=0 color_K=0}%
+ \_def\_setcmykcolor##1{!=#2 ##1 }%
+ \_def\_setrgbcolor ##1{!=#3 ##1 }%
+ \_def\_setgreycolor##1{!=#4 ##1 }%
+ \_let\_useK=\_relax
+ \_edef\_tmpb{+#6}%
+ \_replstring\_tmpb{+ }{+}\_replstring\_tmpb{- }{-}%
+ \_replstring\_tmpb{+}{\_addcolor}\_replstring\_tmpb{-}{\_addcolor-}%
+ \_replstring\_tmpb{^!=}{!^}\_replstring\_tmpb{-!}{-1!}%
+ \_ifx K#2\_let\_useK=\_douseK \_fi
+ \_tmpb
+ \_edef\_tmpb{\_colordefFin}%
+ \_ifx k#2\_edef\_tmpb{\_ea\_stripK \_tmpb;}\_fi
+ \_ea\_endgroup
+ \_ea\_def\_ea#5\_ea{\_ea#1\_ea{\_tmpb}}%
+}
+\_def\_addcolor#1!#2#3{\_cs{addcolor:#2#3}#1}
+\_def\_addcolorA #1 #2 #3 #4 #5 {%
+ \_def\_tmpa{#1}\_ifx\_tmpa\_empty \_else \_edef\_tmpa{\_tmpa*}\_fi
+ \_directlua{color_C=math.max(color_C+\_tmpa#2,0)
+ color_M=math.max(color_M+\_tmpa#3,0)
+ color_Y=math.max(color_Y+\_tmpa#4,0)
+ color_K=math.max(color_K+\_tmpa#5,0)
+}}
+\_sdef{addcolor:=K}#1 #2 #3 #4 #5 {\_addcolorA #1 #2 #3 #4 #5 }
+\_sdef{addcolor:^K}#1 #2 #3 #4 #5 {\_addcolorA #1 (1-#2) (1-#3) (1-#4) #5 }
+\_sdef{addcolor:^G}#1 #2 {\_addcolorA #1 0 0 0 #2 }
+\_sdef{addcolor:=G}#1 #2 {\_addcolorA #1 0 0 0 (1-#2) }
+\_sdef{addcolor:=R}#1 #2 #3 #4 {%
+ \_edef\_tmpa{\_noexpand\_addcolorA #1 \_rgbtocmyk #2 #3 #4 ; }\_tmpa
+}
+\_sdef{addcolor:^R}#1 #2 #3 #4 {\_cs{addcolor:=R}#1 (1-#2) (1-#3) (1-#4) }
+
+\_sdef{addcolor:=k}#1 #2 #3 #4 #5 {%
+ \_edef\_tmpa{\_noexpand\_addcolorA #1 \_cmyktorgb #2 #3 #4 #5 ; 0 }\_tmpa
+}
+\_sdef{addcolor:^k}#1 #2 #3 #4 #5 {\_cs{addcolor:=k}#1 (1-#2) (1-#3) (1-#4) #5 }
+\_sdef{addcolor:^g}#1 #2 {\_addcolorA #1 (1-#2) (1-#2) (1-#2) 0 }
+\_sdef{addcolor:=g}#1 #2 {\_addcolorA #1 #2 #2 #2 0 }
+\_sdef{addcolor:=r}#1 #2 #3 #4 {\_addcolorA #1 #2 #3 #4 0 }
+\_sdef{addcolor:^r}#1 #2 #3 #4 {\_addcolorA #1 (1-#2) (1-#3) (1-#4) 0 }
+\_def\_stripK#1 .0;{#1}
+\_let\_colordef=\_cmykcolordef % default \_colordef is \_cmykcolordef
+
+ \_doc -----------------------------
+ Public versions of \`\colordef` and \`\useK` macros are declared using
+ `\_def`, because the internal versions `\_colordef` and `\_useK` are
+ changed during processing.
+ \_cod -----------------------------
+
+\_def \useK{\_useK}
+\_def \colordef {\_colordef}
+\_public \cmykcolordef \rgbcolordef ;
+
+ \_doc -----------------------------
+ The \LaTeX/ file `x11nam.def` is read by \`\morecolors`. The numbers
+ 0,1,2,3,4 are transformed to letters O, <none>, B, C, D in the name of the
+ color. Colors defined already are not re-defined. The empty \`\_showcolor`
+ macro should be re-defined for color catalog printing. For example:
+ \begtt
+ \def\vr{\vrule height10pt depth2pt width20pt}
+ \def\_showcolor{\hbox{\tt\_bslash\_tmpb: \csname\_tmpb\endcsname \vr}\space\space}
+ \begmulti 4 \typosize[11/14]
+ \morecolors
+ \endmulti
+ \endtt
+ \_cod -----------------------------
+
+\_def\_morecolors{%
+ \_long\_def\_tmp##1\preparecolorset##2##3##4##5{\_tmpa ##5;,,,;}
+ \_def\_tmpa##1,##2,##3,##4;{\_ifx,##1,\_else
+ \_def\_tmpb{##1}\_replstring\_tmpb{1}{}\_replstring\_tmpb{2}{B}%
+ \_replstring\_tmpb{3}{C}\_replstring\_tmpb{4}{D}\_replstring\_tmpb{0}{O}%
+ \_ifcsname \_tmpb\_endcsname \_else
+ \_sdef{\_tmpb}{\_setrgbcolor{##2 ##3 ##4}}\_showcolor\_fi
+ \_ea\_tmpa\_fi
+ }
+ \_ea\_tmp\_input x11nam.def
+}
+\_let\_showcolor=\_relax % re-define it if you want to print a color catalog
+\_public \morecolors ;
+
+\_endcode % -------------------------------------
+
+The colors have different behavior than fonts. Marks (whatsits) with color
+information are stored into PDF output and \TeX/ doesn't interpret them.
+The PDF viewer (or PDF interpreter in a printer) reads these marks
+and switches colors according to them. This
+is independent of \TeX/ group mechanism. You can declare
+`\nolocalcolor` at the beginning of the document, if you want this behavior.
+In this case, if you set a color then you must return to the black color
+using `\Black` manually.
+
+By default, \OpTeX/ sets `\localcolor`. It means that the typesetting
+returns to a previous color at the end of the current group, so you cannot
+write `\Black` explicitly. This is implemented using the `\aftergroup` feature.
+There is a limitation of this feature: when a color selector is used in a
+group of a box, which is saved by `\setbox`, then the activity or
+reconstruction of the previous color is processed at `\setbox` time, no in the
+box itself. You must correct it by double group:
+\begtt
+\setbox0=\hbox{\Red text} % bad: \Black is done after \setbox
+\setbox0=\hbox{{\Red text}} % good: \Black is done after group inside the box
+\endtt
+
+The implementation of colors is based on colorstack, so the current color
+can follow across more pages. It is not so obvious because PDF viewer (or PDF
+interpreter) manipulates with colors locally at each PDF page and it
+initializes each PDF page with black on white color.
+
+Macros \^`\setcmykcolor``{<C> <M> <Y> <K>}` or \^`\setrgbcolor``{<R> <G> <B>}`
+or\nl \^`\setgreycolor``{<Grey>}` should be used in color selectors or user can
+specify these macros explicitly.
+
+The color mixing processed by the \^`\colordef` is done in the subtractive color
+model CMYK. If the result has a component greater than 1 then all
+components are multiplied by a coefficient in order to the maximal component is
+equal to 1.
+
+You can move a shared amount of CMY components (i.e. their minimum) to the
+$K$ component. This saves the color tonners and the result is more true.
+This should be done by \^`\useK` command at the end of a linear combination
+used in `\colordef`. For example
+\begtt
+\colordef \myColor {.3\Green + .4\Blue \useK}
+\endtt
+The `\useK` command exactly does:
+$$
+ \displaylines{
+ k' =\min(C,M,Y), \cr \ C=(C-k')/(1-k'), \ M=(M-k')/(1-k'), \ Y=(Y-k')/(1-k'), \cr
+ K = \min(1,K+k').
+}
+$$
+
+You can use minus instead of plus in the linear combination in `\colordef`. The
+given color is substracted in such case and the negative components are
+rounded to zero immediately. For example
+\begtt
+\colordef \Color {\Brown-\Black}
+\endtt
+can be used for removing the black component from the color. You can use
+the `-\Black` trick after `\useK` command to remove grey components
+occurred during color mixing.
+
+Finally, you can use `^` immediately preceded before the macro name of the
+color. Then the complementary color is used here.
+\begtt
+\colordef\mycolor{\Grey+.6^\Blue} % the same as \colordef\mycolor{\Grey+.6\Yellow}
+\endtt
+
+The \^`\rgbcolordef` can be used to mix colors in additive color model RGB.
+If \^`\onlyrgb` is declared, then \^`\colordef` works as \^`\rgbcolordef`.
+
+If a CMYK to RGB or RGB to CMYK conversion is needed then
+the following simple formulae are used
+(ICC profiles are not supported):
+$$
+\displaylines{
+ \hbox{CMYK to RGB:}\cr
+ R = (1-C)(1-K), \ G = (1-M)(1-K), \ B = (1-Y)(1-K). \cr
+ \hbox{RGB to CMYK:}\cr
+ K'=\max(R,G,B), \ C=(K'-R)/K', \ M=(K'-G)/K', \ Y=(K'-B)/K', \ K=1-K'.
+}
+$$
+The RGB to CMYK conversion is invoked when a color is declared using `\setrgbcolor`
+and it is used in \^`\colordef` or if it is printed when \^`\onlycmyk` is declared.
+The CMYK to RGB conversion is invoked when a color is declared using \^`\setcmykcolor`
+and it is used in \^`\rgbcolordef` or if it is printed when \^`\onlyrgb` is declared.
+
+\_endinput
+
+2020-04-22 \replstring\tmpb{+ }{+}, {- }{-} added in \colordef, bug fixed
+2020-03-18 introduced
diff --git a/macros/optex/base/doc.opm b/macros/optex/base/doc.opm
new file mode 100644
index 0000000000..ce571a9e81
--- /dev/null
+++ b/macros/optex/base/doc.opm
@@ -0,0 +1,276 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \printdoc {Macros for documentation printing <2020-04-28>}
+
+ \_doc -----------------------------
+ General decalarations.
+ \_cod -----------------------------
+
+\_fontfam[lmfonts]
+\_hyperlinks \Green \Green
+\_enlang
+\_enquotes
+
+ \_doc -----------------------------
+ Maybe, somebody needs `\seccc` or `\secccc`?
+ \_cod -----------------------------
+
+\_eoldef\seccc#1{\_medskip \_noindent{\_bf#1}\_par\_nobreak\_firstnoindent}
+\_def\secccc{\_medskip\_noindent $\_bullet$ }
+
+ \_doc -----------------------------
+ `\enddocument` can be redefined.
+ \_cod -----------------------------
+
+\_let\enddocument=\_bye
+
+ \_doc -----------------------------
+ A full page of listing causes underfull `\vbox` in output routine.
+ We need to add a small tolerance.
+ \_cod -----------------------------
+
+\_pgbottomskip=0pt plus10pt minus2pt
+
+ \_doc -----------------------------
+ The listing mode is implemented here. The \`\maxlines`
+ is maximal lines of code printed in the listing mode.
+ \_cod -----------------------------
+
+\_newcount \_maxlines \_maxlines=100000
+\_public \maxlines ;
+
+\_eoldef\_cod#1{\_par \_wipeepar
+ \_vskip\_parskip \_medskip \_ttskip
+ \_begingroup
+ \_typosize[8/10]
+ \_let\_printverbline=\_printcodeline
+ \_ttline=\_inputlineno
+ \_setverb
+ \_ifnum\_ttline<0 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi
+ \_adef{ }{\ }\_adef\^^I{\t}\_parindent=\_ttindent \_parskip=0pt
+ \_relax \_ttfont
+ \_endlinechar=`^^J
+ \_def\_tmpb{\_start}%
+ \_readverbline
+}
+\_def\_readverbline #1^^J{%
+ \_def\_tmpa{\_empty#1}%
+ \_let\_next=\_readverbline
+ \_ea\_isinlist\_ea\_tmpa\_ea{\_Doc}\_iftrue \_let\_next=\_processinput \_fi
+ \_ea\_isinlist\_ea\_tmpa\_ea{\_Endcode}\_iftrue \_endinput \_let\_next=\_processinput \_fi
+ \_ifx\_next\_readverbline \_addto\_tmpb{#1^^J}\_fi
+ \_next
+}
+{\_catcode`\ =13 \_gdef\_aspace{ }}\_def\_asp{\_ea\_noexpand\_aspace}
+\_edef\_Doc{\_asp\_asp\_bslash _doc}
+\_edef\_Endcode{\_noexpand\_empty\_bslash _endcode}
+
+ \_doc -----------------------------
+ The scanner of the control sequences in the listing mode.
+ \_cod -----------------------------
+
+\_def\_makecs{\_def\_tmp{}\_futurelet\_next\_makecsA}
+\_def\_makecsA{\_ifcat a\_noexpand\_next \_ea\_makecsB \_else \_ea\_makecsF \_fi}
+\_def\_makecsB#1{\_addto\_tmp{#1}\_futurelet\_next\_makecsA}
+\_def\_makecsF{\_ifx\_tmp\_empty \_csstring\\%
+ \_else \_ifcsname ,\_tmp\_endcsname \_link[cs:\_tmp]{\Blue}{\_csstring\\\_tmp}%
+ \_else \_let\_next=\_tmp \_remfirstunderscore\_next
+ \_ifx\_next\_empty \_let\_next=\_tmp \_fi
+ \_ifcsname ,\_next\_endcsname \_link[cs:\_next]{\Blue}{\_csstring\\\_tmp}%
+ \_else \_csstring\\\_tmp \_fi\_fi\_fi
+}
+\_def\_processinput{%
+ \_let\_start=\_relax
+ \_ea\_replstring\_ea\_tmpb\_ea{\_aspace^^J}{^^J}
+ \_addto\_tmpb{\_end}%
+ \_isinlist\_tmpb{\_start^^J}\_iftrue \_advance\_ttline by1\_fi
+ \_replstring\_tmpb{\_start^^J}{\_start}%
+ \_replstring\_tmpb{\_start}{}%
+ \_replstring\_tmpb{^^J\_end}{\_end}%
+ \_replstring\_tmpb{^^J\_end}{}%
+ \_replstring\_tmpb{\_end}{}%
+ \_ea\_prepareverbdata\_ea\_tmpb\_ea{\_tmpb^^J}%
+ \_replthis{\_csstring\\}{\_noexpand\_makecs}%
+ \_ea\_printverb \_tmpb\_end
+ \_par
+ \_endgroup \_ttskip
+ \_isnextchar\_par{}{\_noindent}%
+}
+\_def\_remfirstunderscore#1{\_ea\_remfirstunderscoreA#1\_relax#1}
+\_def\_remfirstunderscoreA#1#2\_relax#3{\_if _#1\_def#3{#2}\_fi}
+
+ \_doc -----------------------------
+ The lines in the listing mode have a yellow background.
+ \_cod -----------------------------
+
+\_def\Yellow{\_setcmykcolor{0.0 0.0 0.3 0.03}}
+
+\_def\_printcodeline#1{\_advance \_maxlines by-1
+ \_ifnum \_maxlines<0 \_ea \_endverbprinting \_fi
+ \_ifx\_printfilename\_relax \_penalty \_ttpenalty \_fi \_vskip-4pt
+ \_noindent\_rlap{\Yellow \_vrule height8pt depth5pt width\_hsize}%
+ \_printfilename
+ \_indent \_printverblinenum #1\par}
+
+\_def\_printfilename{\_hbox to0pt{%
+ \_hskip\_hsize\vbox to0pt{\_vss\_llap{\Brown\docfile}\_kern7.5pt}\_hss}%
+ \_let\_printfilename=\_relax
+}
+\_everytt={\_let\_printverblinenum=\_relax}
+
+\_long\_def\_endverbprinting#1\_end#2\_end{\_fi\_fi \_global\_maxlines=100000
+ \_noindent\_typosize[8/]\_dots etc. (see {\_tt\Brown\docfile})}
+
+ \_doc -----------------------------
+ `\docfile` is currently documented file.\nl
+ \`\printdoc` and \`\printdoctail` macros are defined here.
+ \_cod -----------------------------
+
+\_def\docfile{}
+\_def\_printdoc #1 {\_par \_def\docfile{#1}%
+ \_everytt={\_ttshift=-15pt \_let\_printverblinenum=\_relax}%
+ \_ea\_cod \input #1
+ \_everytt={\_let\_printverblinenum=\_relax}%
+ \_def\docfile{}%
+}
+\_def\_printdoctail #1 {\_bgroup
+ \_everytt={}\_ttline=-1 \_ea\_printdoctailA \_input #1 \_egroup}
+{\_long\_gdef\_printdoctailA#1\_endcode{}}
+
+\_public \printdoc \printdoctail ;
+
+ \_doc -----------------------------
+ You can do `\verbinuput \vitt{<filename>} (<from>-<to>) <filename>`
+ if you need analogical design like in listing mode.
+ \_cod -----------------------------
+
+\_def\_vitt#1{\_def\docfile{#1}\_ttline=-1
+ \_everytt={\_typosize[8/10]\_let\_printverbline=\_printcodeline \_medskip}}
+
+\_public \vitt ;
+
+ \_doc -----------------------------
+ The Index entries are without the trailing backslash. We must add it
+ when printing Index.
+ \_cod -----------------------------
+
+\_addto \_ignoredcharsen {_} % \foo, \_foo is the same in the fist pass of sorting
+\_def\_printii #1#2&{%
+ \_ismacro\_lastii{#1}\_iffalse \_newiiletter{#1}{#2}\_def\_lastii{#1}\_fi
+ \_gdef\_currii{#1#2}\_the\_everyii\_noindent
+ \_hskip-\_iindent \_ignorespaces\_printiiA\bslash#1#2//}
+
+\_def\_printiipages#1&{\_let\_pgtype=\_undefined \_tmpnum=0
+ {\_rm\_printpages #1,:,\_par}}
+
+\_sdef{_tocl:1}#1#2#3{\_nofirst\_bigskip
+ \_bf\_llaptoclink{#1}{#2}\_hfill \_pgn{#3}\_tocpar\_medskip}
+
+ \_doc -----------------------------
+ The \code{<something>} will be print as <something>.
+ \_cod -----------------------------
+
+\_let\lt=<
+\_catcode`\<=13
+
+\_def<#1>{$\langle\hbox{\it#1\/}\rangle$}
+\_everyintt{\_catcode`\<=13 }
+
+ \_doc -----------------------------
+ If this macro is loaded by \^`\load` then we need to initialize
+ catcodes using the `\_afteroad` macro.
+ \_cod -----------------------------
+
+\_def\_afterload{\_catcode`\<=13 \_catcode`\`=13 }
+
+ \_doc -----------------------------
+ Main documentation points and hyperlinks to/from it.
+ Main documentation point: \code{\\`\\foo`}.
+ User-level documentation point: \code{\\^`\\foo}, first occurence only.
+ The next occurrences are only links to the main documentation point.
+ Link to user-level documentation point: \code{\\~`\\foo}.
+ If user-level documentation point follows the main documentation point
+ then use \code{\\_forwardlink\\`\\foo`}.
+ \_cod -----------------------------
+
+\_verbchar`
+
+\_def\`#1`{\_leavevmode\_edef\_tmp{\_csstring#1}\_iindex{\_tmp}%
+ \_ifcsname cs:\_tmp\_endcsname\_else \_dest[cs:\_tmp]\_fi
+ \_sxdef{cs:\_tmp}{}%
+ \_hbox{\_ifcsname cs:^\_tmp\_endcsname
+ \_link[cs:^\_tmp]{\Red}{\_tt\_csstring\\\_tmp}\_else
+ {\_tt\Red\_csstring\\\_tmp}\_fi}%
+}
+\_def\_forwardlink\`#1`{{\_slet{cs:^\_csstring#1}{relax}\`#1`}}
+
+\_def\^`#1{\_leavevmode\_edef\_tmp{\_csstring#1}\_iindex{\_tmp}%
+ \_hbox{\_ifcsname cs:^\_tmp\_endcsname \_else \_dest[cs:^\_tmp]\_sxdef{cs:^\_tmp}{}\_fi
+ \_link[cs:\_tmp]{\Blue}{\_tt\_string#1}}%
+ \_futurelet\_next\_cslinkA
+}
+\_def\_cslinkA{\_ifx\_next`\_ea\_ignoreit \_else \_ea\_ea\_ea`\_ea\_string\_fi}
+
+\_def\~`#1{\_leavevmode\_edef\_tmp{\_csstring#1}\_iindex{\_tmp}%
+ \_hbox{\_link[cs:^\_tmp]{\Blue}{\_tt\_string#1}}%
+ \_futurelet\_next\_cslinkA
+}
+
+\_endcode %-------------------------------------------
+
+\noindent
+The \^`\printdoc` `<filename><space>` and \^`\printdoctail` `<filename><space>`
+commands are defined after the file `doc.opm` is load by \^`\load`~`[doc]`.
+
+The `\printcoc` starts reading of given `<filename>` from the second line.
+The file is read in {\em the listing mode}.
+The `\prindoctail` starts reading given `<filename>` from the
+first occurrence of the `\_encode`. The file is read
+in normal mode (like `\input <filename>`).
+
+The {\em listing mode} prints the lines as a listing of a code. This mode is
+finished when first {\visiblesp` \_doc`} occurs or first `\_endcode`
+occurs. At least two spaces must precede before such `\_doc`. On the other
+hand, the `\_encode` must be at the left edge of the line without spaces.
+If this rule is not met then the listing mode continues.
+
+If the first line or the last line of the listing mode is empty then such
+lines are not printed. The maximal number of printed lines in the listing
+mode is \^`\maxlines`. It is set to almost infinity (100000). You can set it
+to a more sensible value. Such a setting is valid only for the first following
+listing mode.
+
+When the listing mode is finished by `\_doc` then the next lines are read in the
+normal way, but the material between `\begtt` ... `\endtt` pair
+is shifted by three letters left. The reason is that the three spaces of
+indentation is recommended in the `\_doc` ... `\_cod` pair and this shifting
+is compensation for this indentation.
+
+The `\_cod` macro ignores the rest of the current line and starts the listing
+mode again.
+
+When the listing mode is finished by the `\_endcode` then the `\endinput` is
+applied, the reading of the file opened by `\printdoc` is finished.
+
+You cannot reach the end of the file (without `\_endcode`) in the listing
+mode.
+
+The listing mode creates all control sequences which are listed in the
+index as an active link to the main documentation point of such control sequence
+and prints them in blue. Another text is printed in black.
+
+The main documentation point is denoted by \code{\\`\\}`<sequence>`\code{`}
+in red, for example \code{\\`\\foo`}.
+The user documentation point is the first occurrence of
+\code{\\^`\\}`<sequence>`\code{`}, for example \code{\\^`\\foo`}.
+There can be more such markups, all of them are hyperlinks to the main
+documentation point.
+And main documentation point is a hyperlink to the user documentation point
+if this point exists. Finally, the
+\code{\\~`\\}`<sequence>`\code{`} (for example \code{\\~`\\foo`}) are
+hyperlinks to the user documentation point.
+
+\endinput
+
+2020-04-28 \levevmode in \^ macros added (bug fixed)
+2020-04-22 released \ No newline at end of file
diff --git a/macros/optex/base/f-adventor.opm b/macros/optex/base/f-adventor.opm
new file mode 100644
index 0000000000..df22be1130
--- /dev/null
+++ b/macros/optex/base/f-adventor.opm
@@ -0,0 +1,22 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Adventor] \Adventor {TeX Gyre Adventor based on Avantgarde Book}
+ {\caps} {\rm \bf \it \bi} {}
+ {[texgyreadventor-regular]}
+ {\_def\_fontnamegen {[texgyreadventor-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \caps ...... caps & small caps^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-antt.opm b/macros/optex/base/f-antt.opm
new file mode 100644
index 0000000000..39d3d011ea
--- /dev/null
+++ b/macros/optex/base/f-antt.opm
@@ -0,0 +1,32 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Antykwa Torunska] \Antt {Traditional Polish font family}
+ {\cond \medium \light \caps} {\rm \bf \it \bi} {Pagella}
+ {[AntykwaTorunska-Regular]}
+ {\_def\_fontnamegen {[AntykwaTorunska\_sfamxV\_sfamyV-\_currV]:script=latn;\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \caps ...... caps & small caps^^J
+ \cond ...... condensed^^J
+ \medium .... medium weight^^J
+ \light ..... light weight^^J
+ \cond ...... condensed^^J
+}}
+
+\_moddef \resetmod {\_fsetV sfamx={},sfamy={},caps={} \_fvars Regular Bold Italic BoldItalic }
+\_moddef \cond {\_fsetV sfamx=Cond \_fvars Regular . Italic .
+ \_onlyif sfamy={}: {\_fvars Regular Bold Italic BoldItalic }}
+\_moddef \medium {\_fsetV sfamy=Med \_fvars Regular . Italic . }
+\_moddef \light {\_fsetV sfamy=Light \_fvars Regular . Italic . }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath{[texgyrepagella-math]}
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-baskerville.opm b/macros/optex/base/f-baskerville.opm
new file mode 100644
index 0000000000..4e6027d703
--- /dev/null
+++ b/macros/optex/base/f-baskerville.opm
@@ -0,0 +1,22 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Baskerville] \Baskerville {Free vaiants of classical Baskerville}
+ {\caps} {\rm \bf \it \bi} {}
+ {[BaskervilleF-Regular]}
+ {\_def \_fontnamegen {[BaskervilleF-\_currV]:script=latn;\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \caps ...... caps & small caps^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars Regular Bold Italic BoldItalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-bonum.opm b/macros/optex/base/f-bonum.opm
new file mode 100644
index 0000000000..a285021b2e
--- /dev/null
+++ b/macros/optex/base/f-bonum.opm
@@ -0,0 +1,24 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Bonum] \Bonum {TeX Gyre Bonum fonts based on Bookman}
+ {\caps} {\rm \bf \it \bi} {Bonum}
+ {[texgyrebonum-regular]}
+ {\_def\_fontnamegen {[texgyrebonum-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \caps ...... caps & small caps^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[texgyrebonum-math]}
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-comicneue.opm b/macros/optex/base/f-comicneue.opm
new file mode 100644
index 0000000000..a7b9f8e002
--- /dev/null
+++ b/macros/optex/base/f-comicneue.opm
@@ -0,0 +1,23 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [ComicNeue] \Comicneue {Comic Neue sans serif}
+ {\angular} {\lf \li \rm \it \bf \bi} {}
+ {[ComicNeue-Regular]}
+ {\_def\_fontnamegen {[ComicNeue\_anguV-\_currV]:\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \angular ...... Angular ends of curves^^J
+Variants:^^J
+ \lf (Light) \rm \bf \li (LightItalic) \it \bi^^J
+}}
+
+\_moddef \resetmod {\_fsetV angu={} \_fvars Regular Bold RegularItalic Bolditalic }
+\_moddef \angular {\_fsetV angu=Angular }
+\_famvardef \lf {\_fsetV curr=Light \_rm}
+\_famvardef \li {\_fsetV curr=LightItalic \_rm}
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
diff --git a/macros/optex/base/f-cursor.opm b/macros/optex/base/f-cursor.opm
new file mode 100644
index 0000000000..80b2a29457
--- /dev/null
+++ b/macros/optex/base/f-cursor.opm
@@ -0,0 +1,22 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Cursor] \Cursor {TeX Gyre Cursor fonts based on Courier}
+ {\caps} {\rm \bf \it \bi} {}
+ {[texgyrecursor-regular]}
+ {\_def \_fontnamegen {[texgyrecursor-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \caps ...... caps & small caps^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-dejavu.opm b/macros/optex/base/f-dejavu.opm
new file mode 100644
index 0000000000..76fd90c0db
--- /dev/null
+++ b/macros/optex/base/f-dejavu.opm
@@ -0,0 +1,31 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [DejaVu] \Dejavu {Derived from the Vera fonts}
+ {\sans \mono \cond \light \caps} {\rm \bf \it \bi} {TG-DejavuMath}
+ {[DejaVuSerif]}
+ {\_def\_fontnamegen {[DejaVu\_subfamV\_typfamV\_currV]:\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \sans ...... sans serif^^J
+ \serif ..... serif (default)^^J
+ \mono ...... non-proportional, only \sans^^J
+ \light ..... extra-light, only \sans, only \rm, others (\bf\it\bi) unchanged^^J
+ \cond ...... condensed (\sans or \serif, not \mono)
+}}
+
+\_def\_BIfvars{\_fvars {} -Bold -Italic -BoldItalic }
+\_def\_BOfvars{\_fvars {} -Bold -Oblique -BoldOblique }
+\_moddef \resetmod {\_fsetV subfam=Serif,typfam={} \_BIfvars }
+\_moddef \sans {\_fsetV subfam=Sans \_BOfvars }
+\_moddef \serif {\_fsetV subfam=Serif,typfam={} \_BOfvars }
+\_moddef \mono {\_fsetV subfam=Sans,typfam=Mono \_BOfvars }
+\_moddef \light {\_fsetV subfam=Sans,typfam={} \_fvars -ExtraLight -Bold -Oblique -BoldOblique }
+\_moddef \cond {\_fsetV typfam=Condensed }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[texgyredejavu-math]}
+
+\_endcode
+
diff --git a/macros/optex/base/f-ebgaramond.opm b/macros/optex/base/f-ebgaramond.opm
new file mode 100644
index 0000000000..63502c9b08
--- /dev/null
+++ b/macros/optex/base/f-ebgaramond.opm
@@ -0,0 +1,37 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [EB Garamond] \EBGaramond {Based on Garamond}
+ {\medium \semibold \caps \swash} {\rm \bf \it \bi \initials} {Garamond-Math}
+ {[EBGaramond-Regular]}
+ {\_def\_fontnamegen {[EBGaramond-\_currV]:\_capsV\_swaV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \caps ...... caps & small caps^^J
+ \swash ..... alternative capitals for \it, \bi, only non-accented letters^^J
+ \medium .... medium weight^^J
+ \semibold .. semibold weight (only \bf, \bi are changed)^^J
+Variant:^^J
+ \initials .. Initials, only letters ADFGLNOQT^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={},swa={} \_fvars Regular Bold Italic BoldItalic }
+\_moddef \medium {\_fvars Medium ExtraBold MediumItalic ExtraBoldItalic }
+\_moddef \semibold {\_fvars Regular SemiBold Italic SemiBoldItalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+\_moddef \nocaps {\_fsetV caps={} }
+\_moddef \swash {\_fsetV swa=+swsh; }
+\_moddef \noswash {\_fsetV swa={} }
+
+\_famvardef \initials {\_fvars Initials . . . \rm}
+
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[Garamond-Math]}
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-garamondl.opm b/macros/optex/base/f-garamondl.opm
new file mode 100644
index 0000000000..d642aac98c
--- /dev/null
+++ b/macros/optex/base/f-garamondl.opm
@@ -0,0 +1,26 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Garamond Libre] \Garamondl {Free, derived from old style font family}
+ {\caps \swash} {\rm \bf \it \bi} {Garamond-Math}
+ {[GaramondLibre-Regular]}
+ {\_def\_fontnamegen
+ {[GaramondLibre-\_currV]:script=latn;\_capsV\_swaV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \caps ...... caps & small caps, only non-accented letters^^J
+ \swash ..... alternative capitals for \it, \bi, only non-accented letters^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={},swa={} \_fvars Regular Bold Italic Bolditalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum;-liga; }
+\_moddef \nocaps {\_fsetV caps={} }
+\_moddef \swash {\_fsetV swa=+swsh; }
+\_moddef \noswash {\_fsetV swa={} }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[Garamond-Math]}
+
+\_endcode
+
diff --git a/macros/optex/base/f-gfsbodoni.opm b/macros/optex/base/f-gfsbodoni.opm
new file mode 100644
index 0000000000..d7d3494a9d
--- /dev/null
+++ b/macros/optex/base/f-gfsbodoni.opm
@@ -0,0 +1,22 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [GFS Bodoni] \GFSBodoni {Based on Bodoni with greek letters}
+ {} {\rm \bf \it \bi} {}
+ {[GFSBodoni]}
+ {\_def\_fontnamegen{[GFSBodoni\_currV]:script=latn;\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \caps ...... Caps & Small caps (only \rm)^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars {} Bold It BoldIt }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-heros.opm b/macros/optex/base/f-heros.opm
new file mode 100644
index 0000000000..767052cc45
--- /dev/null
+++ b/macros/optex/base/f-heros.opm
@@ -0,0 +1,244 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Heros] \Heros {TeX Gyre Heros fonts based on Helvetica}
+ {\caps \cond} {\rm \bf \it \bi} {FiraMath}
+ {[texgyreheros-regular]}
+ {\_def\_fontnamegen{[texgyreheros\_condV-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \caps ...... caps & small caps^^J
+ \cond ...... condensed variants^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={},cond={} \_fvars regular bold italic bolditalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+\_moddef \nocaps {\_fsetV caps={} }
+\_moddef \cond {\_fsetV cond=cn }
+\_moddef \nocond {\_fsetV cond={} }
+
+\_initfontfamily % new font family must be initialized
+
+\_ifmathloading
+ \_loadmath {[FiraMath-Regular]}
+ \_addto\_normalmath{\_loadumathfamily 5 {xitsmath-regular}{} }
+ \_addto\_boldmath {\_loadumathfamily 5 {xitsmath-bold}{} }
+ \_addto\frak{\_fam5 }\_addto\cal{\_fam5 }
+ \_normalmath
+ \_wterm{MATH-FONT(5): "[XITSMath-Regular/Bold]" -- used for \_string\cal, \_string\frak}
+ % \bf, \bi from FiraMath:
+ \_let\_bsansvariables=\_bfvariables
+ \_let\_bsansGreek=\_bfGreek
+ \_let\_bsansgreek=\_bfgreek
+ \_let\_bsansdigits=\_bfdigits
+ \_let\_bisansvariables=\_bivariables
+ \_let\_bisansgreek=\_bigreek
+\_fi
+
+\_endcode
+
+The font family file declares the font family for selecting fonts from this
+family at the arbitrary size and with various shapes. Unicode fonts (OTF)
+are preferred. The following example declares the Heros family:
+
+\printdoc f-heros.opm
+
+If you want to write such a font family file, you need to keep the following rules.
+
+\begitems
+* Use the \^`\_famdecl` command first. It has the following syntax:
+\begtt \catcode`\<=13
+\_famdecl [<Name of family>] \<Familyselector> {<comments>}
+ {<modifiers>} {<variant selectors>} {<comments about math fonts>}
+ {<font-for-testing>}
+ {\_def\_fontnamegen{<font name or font file name generated>}}
+\endtt
+ This writes information about font family at the
+ terminal and prevents loading such file twice. Moreover, it probes
+ existence of `<font-for-testing>` in your system. If it doesn't exist, the
+ file loading is skipped with a warning on the terminal.
+ The \^`\_ifexistfam` macro returns false in this case.
+ The \^`\_fontnamegen` macro must be defined in the last parameter of the
+ \^`\_famdecl`. More about it is documented below.
+* You can use `\_wlog{\_detokenize{...` to write additional information into a log file.
+* You can declare optical sizes using \~`\_regoptsizes` if there are more font files
+ with different optical sizes (like in Latin Modern). See `f-lmfonts.opm`
+ file for more information about this special feature.
+* Declare font modifiers using \~`\moddef` if they are present. The \`\resetmod`
+ must be declared in each font family.
+* Check if all your declared modifiers do not produce any space in
+ horizontal mode. For example check: `X\caps Y`, the letters `XY` must
+ be printed without any space.
+* Optionally, declare new variants by the \^`\famvardef` macro.
+* Run `\_initfontfamily` to start the family (it is mandatory).
+* If math font should be loaded, use `\_loadmath{<math font>}`.
+\enditems
+
+{\noindent \bf The \`\_fontnamegen` macro}
+(declared in the last parameter of the \^`\_famdecl`)
+must expand (at the expand processor level only) to a file name of the loaded font (or to its font
+name) and to optional font features appended. The Font Selection
+System uses this macro at the primitive level in the following sense:
+
+\begtt \catcode`\<=13
+\font \<selector> {\_fontnamegen} \_sizespec
+\endtt
+%
+Note that the extended `\font` syntax
+`\font\<selector> {<font name>:<font features>} <size spec.>` or
+`\font\<selector> {[<font file name>]:<font features>} <size spec.>`
+is expected here.
+
+\seccc Example 1
+
+Assume an abstract font family with fonts `xx-Regular.otf`,
+`xx-Bold.otf`, `xx-Italic.otf` and `xx-BoldItalic.otf`. Then you can declare
+the \^`\resetmod` (for initializing the family) by:
+\begtt
+\_moddef\resetmod{\_fvars Regular Bold Italic BoldItalic }
+\endtt
+and define the \^`\_fontnamegen` in the last parameter of the \^`\_famdecl` by:
+\begtt
+\_famdecl ...
+ {\def\_fontnamegen{[xx-\_currV]}}
+\endtt
+The following auxiliary macros are used here:
+\begitems
+* \^`\moddef` declares the family dependent modifier. The \^`\resetmod` saves
+ initial values for the family.
+* \^`\_fvars` saves four names to the memory, they are used by the \^`\_currV` macro.
+* \^`\_currV` expands to one of the four names dependent on `\rm` or `\bf` or
+ `\it` or `\bi` variant is required.
+\enditems
+Assume that the user needs `\it` variant in this family. Then the
+`\_fontnamegen` macro expands to `[xx-\_currV]` and it expands to
+`[xx-Italic]`. The Font Selection System uses `\font {[xx-Italic]}`.
+This command loads the `xx-Italic.otf` font file.
+
+See more advanced examples are in `f-<family>.opm` files.
+
+\seccc Example 2
+
+The `f-heros.opm` is listed here. Look at it.
+When Heros family is selected and `\bf` is asked then
+`\font {[texgyreheros-bold]:+tlig;} at10pt`
+is processed.
+
+You can use any expandable macros or expandable primitives in the `\_fontnamegen`
+macro. The simple macros in our example with names `\_<word>V` are preferred. They
+expand typically to their content. The macro \^`\_fsetV` `<word>=<content>`
+(terminated by a space) is equivalent to `\def\_<word>V{<content>}` and you
+can use it in font modifiers. You can use the \^`\_fsetV` macro in more
+general form:
+
+\begtt \catcode`\<=13
+ \_fsetV <word-a>=<value-a>,<word-b>=<value-b> ...etc. terminated by a space
+\endtt
+%
+with obvious result `\def\_<word-a>V {<value-a>}\def\_<word-b>V {<value-b>}` etc.
+
+\seccc Example 3
+
+If both font modifiers `\caps`, `\cond` were applied in Heros
+family, then `\def\_capsV{+smcp;+onum}` and `\def\_condV{cn}` were processed
+by these font modifiers. If a user needs the `\bf` variant at 11\,pt now then
+the
+
+\begtt
+ \font {[texgyreheroscn-bold]:+smcp;+onum;+tlig;} at11pt
+\endtt
+%
+is processed. We assume that a font file `texgyreheroscn-bold.otf` is present
+in your \TeX/ system.
+
+\seccc The \code{\\_onlyif} macro
+
+has the syntax \^`\_onlyif` `<word>=<value-a>,<value-b>,...<value-n>: {<what>}`. It can
+be used inside `\moddef` as simple IF statement: the `<what>` is processed only
+if `<word>` has `<value-a>` or `<value-b>` \dots or `<value-n>`. See
+`f-roboto.opm` for examples of usage of many `\_onlyif`'s.
+
+Recommendation: use the \^`\_fontfeatures` macro at the end of the `\_fontnamegen`
+macro in order to the \^`\setff`, \^`\setfontcolor`, \^`\setletterspace`
+macros can work.
+
+\seccc The \code{\\moddef} macro
+
+has the syntax \^`\moddef\<modifier>{<what to do>}`. It does more things than simple `\_def`:
+
+\begitems
+* The modifier macros are defined as `\_protected`.
+* The modifier macros are defined as family-dependent.
+* If the declared control sequence is defined already (and it is not a font
+ modifier) then it is re-defined with a warning.
+\enditems
+\noindent
+The \^`\famvardef` macro has the same features.
+
+\bigskip
+{\noindent\bf The `\<Familyselector>`}
+is defined by the \^`\_famdecl` macro as:
+\begtt \catcode`<=13
+\protected\def\<Familyselector> {%
+ \_def\_currfamily {<Familyselector>}%
+ \_def\_fontnamegen {...}% this is copied from 7-th parameter of \_famdecl
+ \resetmod
+ <run all family-dependent font modifiers used before Familyselector without warnings>
+\endtt
+
+{\noindent\bf The \^`\_initfontfamily`}\nl
+must be run after modifier's decaration.
+It runs the `\<Familyselector>` and it runs `\_rm`,
+so the first font from the new family is loaded and it is ready to use it.
+
+\seccc Name conventions
+
+Create font modifiers, new variants, and the `\<Familyselector>` only as public, i.e.
+in user namespace without `_` prefix. We assume that if a user re-defines them then he/she needs
+not them, so we have no problems. If the user's definition was done before loading
+the font family file then it is re-defined and \OpTeX/ warns about it. See the end of
+section~\ref[fontcommands].
+
+The name of `\<Familyselector>` should begin with an uppercase letter.
+
+Please, look at
+\ulink[http://petr.olsak.net/ftp/olsak/optex/op-catalog.pdf]{\OpTeX/ font catalogue}
+before you will create your font family file and use the same names for
+analogical font modifiers (like `\cond`, `\caps`, `\sans`, `\mono` etc.)\
+and for extra variant selectors (like `\lf`, `\li`, `\kf`, `\ki` etc.\ used in
+Roboto font family).
+
+If you are using the same font modifier names to analogical font shapes then
+such modifiers are kept when the family is changed. For example:
+
+\begtt
+\fontfam [Termes] \fontfam[Heros]
+\caps\cond\it Caps+Cond italic in Heros \Termes\currvar Caps italic in Termes.
+\endtt
+%
+The family selector first resets all modifiers data by
+\^`\resetmod` and then it tries to run all currently used family-dependent modifiers
+before the family switching (without warnings if such modifier is
+unavailable in the new family).
+In this example, `\Termes` does `\resetmod` followed by `\caps\cond`.
+The `\caps` is applied and `\cond` is silently ignored in Termes family.
+
+If you need to declare your private modifier (because it is used in other
+modifiers or macros, for example), use the name `\_wordM`. You can be
+sure that such a name does not influence the private namespace used by \OpTeX/.
+
+\seccc Additional notes
+
+See the font family file `f-libertine-s.opm` which is another example where no
+font files but font names are used.
+
+See the font family file `f-lmfonts.opm` or `f-poltawski.opm` where you can find the
+the example of the optical sizes declaration including documentation about
+it.
+
+If you need to create a font family file with a non-Unicode font, you can do it.
+The `\_fontnamegen` must expand to the name of TFM file in this case. But we
+don't prefer such font family files, because they are usable only with
+languages with alphabet subset to ISO-8859-1 (Unicodes are equal to letter's
+codes of such alphabets), but middle or east Europe use languages where
+such a condition is not true.
diff --git a/macros/optex/base/f-kerkis.opm b/macros/optex/base/f-kerkis.opm
new file mode 100644
index 0000000000..4bc31ead65
--- /dev/null
+++ b/macros/optex/base/f-kerkis.opm
@@ -0,0 +1,32 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Kerkis] \Kerkis {Free Bookman alternative with Greek letters}
+ {\semibold \sans \sanssemi \caps} {\rm \bf \it \bi \calli} {}
+ {[Kerkis]}
+ {\_def\_fontnamegen {[Kerkis\_currV]:script=latn;\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \semibold .. semibold weight (changed only \bf, \bi)^^J
+ \caps ...... caps & small caps (only \rm \bf, bad accents in \bf)^^J
+ \sans ...... sans serif^^J
+ \sanssemi .. semibold sans serif (only \rm, accented letters not available)^^J
+Variant:^^J
+ \calli ..... Calligraphic (only upercase, lowercase letters equal to Italic)^^J
+}}
+
+\_moddef \resetmod {\_fvars {} -Bold -Italic -BoldItalic }
+\_moddef \semibold {\_fvars {} -SemiBold -Italic -SemiBold-Italic }
+\_moddef \caps {\_fvars -SmallCaps.otf -BoldSmallCaps . . }
+\_moddef \sans {\_fvars Sans Sans-Bold Sans-Italic Sans-BoldItalic }
+\_moddef \sanssemi {\_fvars Sans-SmallCaps . . . }
+
+\_famvardef \calli {\_fvars -Calligraphic . . . \rm}
+
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
diff --git a/macros/optex/base/f-kpfonts.opm b/macros/optex/base/f-kpfonts.opm
new file mode 100644
index 0000000000..c030bea8e8
--- /dev/null
+++ b/macros/optex/base/f-kpfonts.opm
@@ -0,0 +1,45 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [KP Fonts] \Kpfonts {KP fonts -- Johannes Kepler project}
+ {\sans \mono \light \caps \swash} {\rm \bf \it \bi} {KpMath}
+ {[KpRoman-Regular]}
+ {\_def\_fontnamegen {[Kp\_subfamV-\_currV]:\_capsV\_swaV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \sans ...... sans serif^^J
+ \mono ...... non-proportional^^J
+ \light ..... light (\rm, \it) + semibold (\bf, \bi) variants^^J
+ \caps ...... caps & small caps^^J
+ \swash ..... alternative Q letter^^J
+}}
+
+\_def\_RBIfvars{\_fvars Regular Bold Italic BoldItalic }
+\_moddef \resetmod {\_fsetV subfam=Roman,caps={},swa={} \_RBIfvars }
+\_moddef \sans {\_fsetV subfam=Sans \_RBIfvars }
+\_moddef \mono {\_fsetV subfam=Mono \_RBIfvars }
+\_moddef \light {\_fsetV subfam=Roman \_fvars Light Semibold LightItalic SemiboldItalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+\_moddef \nocaps {\_fsetV caps={} }
+\_moddef \swash {\_fsetV swa=+swsh; }
+\_moddef \noswash {\_fsetV swa={} }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[KpMath-Regular]}
+\_loadboldmath {[KpMath-Bold]} \to {[KpMath-Regular]}
+
+\_endcode
+
+The KP fonts family includes more variants of Math fonts.
+Only Regular / Bold pair is loaded as default.
+
+There are alternatives:
+
+\doloadmath \loadmath {KpMath-Light}
+\loadboldmath {[KpMath-Semibold]} \to {[KpMath-Light]}
+
+or
+
+\doloadmath \loadmath {KpMath-Sans}
+
diff --git a/macros/optex/base/f-libertine-s.opm b/macros/optex/base/f-libertine-s.opm
new file mode 100644
index 0000000000..3cdc089312
--- /dev/null
+++ b/macros/optex/base/f-libertine-s.opm
@@ -0,0 +1,50 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Linux Libertine] \Libertine {Free Linux Libertine fonts}
+ {\sans \mono \caps} {\rm \bf \it \bi \initials \displ \keybr} {}
+ {Linux Libertine O}
+ {\_def\_fontnamegen {Linux \_mainfamV\_V\_subfamV O/\_currV:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers^^J
+ \sans ...... smaller serifs^^J
+ \caps ...... caps & small caps^^J
+Special variants:^^J
+ \initials .. special initials (only uppercase letters)^^J
+ \displ ..... display variant, suitable at big sizes^^J
+ \mono ...... non-proportional^^J
+ \keybr ..... keyboard, emulates keyboard buttons^^J
+}}
+
+\_moddef \resetmod {\_fsetV mainfam=Libertine,subfam={},caps={} \_fvars {} B I BI }
+\_moddef \sans {\_fsetV mainfam=Biolinum,subfam={} }
+\_moddef \mono {\_fsetV mainfam=Libertine,subfam={Mono } \_fvars {} . . . }
+\_moddef \caps {\_fsetV caps=+smcp; }
+\_moddef \nocaps {\_fsetV caps={} }
+
+\_famvardef \initials {\_fsetV mainfam=Libertine,subfam={Initials } \_fvars {} . . . \rm}
+\_famvardef \displ {\_fsetV mainfam=Libertine,subfam={Display } \_fvars {} . . . \rm}
+\_famvardef \keybr {\_fsetV mainfam=Biolinum,subfam={Keyboard } \_fvars {} . . . \rm}
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
+This is another example where the font names (no font files) are declared.
+Linux Libertine font is typically installed on Linux systems.
+The \_V macro generates a space. We provide following fonts:
+
+normal: "Linux Libertine O:\_fontfeatures"
+ "Linux Libertine O/B:\_fontfeatures"
+ "Linux Libertine O/I:\_fontfeatures"
+ "Linux Libertine O/BI:\_fontfeatures"
+mono : "Linux Libertine Mono O:\_fontfeatures"
+sans: "Linux Biolinum O:\_fontfeatures"
+ "Linux Biolinum O/B:\_fontfeatures"
+ "Linux Biolinum O/I:\_fontfeatures"
+ "Linux Biolinum O/BI:\_fontfeatures"
+special: "Linux Libertine Initials O:\_fontfeatures"
+ "Linux Libertine Display O:\_fontfeatures"
+ "Linux Biolinum Keyboard O:\_fontfeatures"
+
+Another file f-libertine.opm declares Linux Libertine family from font files. \ No newline at end of file
diff --git a/macros/optex/base/f-libertine.opm b/macros/optex/base/f-libertine.opm
new file mode 100644
index 0000000000..b25c2fc4f9
--- /dev/null
+++ b/macros/optex/base/f-libertine.opm
@@ -0,0 +1,60 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Linux Libertine] \Libertine {Free Linux Libertine fonts}
+ {\sans \mono \caps \semibold} {\rm \bf \it \bi \initials \displ \keybr} {Libertinus}
+ {[LinLibertine_R]}
+ {\_def\_fontnamegen {[Lin\_subfamV _\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \sans ...... smaller serifs^^J
+ \mono ...... non-proportional^^J
+ \semibold .. semi-bold variants (changed only \bf, \bi)^^J
+ \caps ...... caps & small caps^^J%
+Special variants:^^J
+ \initials .. special initials (only uppercase letters)^^J
+ \displ ..... display variant, suitable at big sizes^^J
+ \keybr ..... keyboard, emulates keyboard buttons^^J
+}}
+
+\_moddef \resetmod {\_fsetV subfam=Libertine,caps={} \_fvars R RB RI RBI }
+\_moddef \sans {\_fsetV subfam=Biolinum \_fvars R RB RI RBO }
+\_moddef \mono {\_fsetV subfam=Libertine \_fvars M MB MO MBO }
+\_moddef \semibold {\_fsetV subfam=Libertine \_fvars R RZ RI RZI }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+\_moddef \nocaps {\_fsetV caps={} }
+
+\_famvardef \initials {\_fsetV subfam=Libertine \_fvars I . . . \rm}
+\_famvardef \displ {\_fsetV subfam=Libertine \_fvars DR . . . \rm}
+\_famvardef \keybr {\_fsetV subfam=Biolinum \_fvars K . . . \rm}
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[LibertinusMath-Regular]}
+
+\_endcode
+
+This file declares Linux Libertine font family from font files. The
+following fonts are provided:
+
+normal: "[LinLibertine_R]:\_fontfeatures"
+ "[LinLibertine_RB]:\_fontfeatures"
+ "[LinLibertine_RI]:\_fontfeatures"
+ "[LinLibertine_RBI ]:\_fontfeatures"
+ "[LinLibertine_RZI]:\_fontfeatures"
+ "[LinLibertine_RZ]:\_fontfeatures"
+mono: "[LinLibertine_M]:\_fontfeatures"
+ "[LinLibertine_MB]:\_fontfeatures"
+ "[LinLibertine_MO]:\_fontfeatures"
+ "[LinLibertine_MBO]:\_fontfeatures"
+sans: "[LinBiolinum_RB]:\_fontfeatures"
+ "[LinBiolinum_RBO]:\_fontfeatures"
+ "[LinBiolinum_R]:\_fontfeatures"
+ "[LinBiolinum_RI]:\_fontfeatures"
+special: "[LinLibertine_I]:\_fontfeatures"
+ "[LinLibertine_DR]:\_fontfeatures"
+ "[LinBiolinum_K]:\_fontfeatures"
+
+See an alternative `f-libertine-s.opm` where the same font family is
+declared using font names used in operating system.
+
diff --git a/macros/optex/base/f-libertinus.opm b/macros/optex/base/f-libertinus.opm
new file mode 100644
index 0000000000..5f1329d286
--- /dev/null
+++ b/macros/optex/base/f-libertinus.opm
@@ -0,0 +1,36 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Libertinus] \Libertinus {Free fonts derived from Linux Libertine}
+ {\semibold \sans \caps} {\rm \bf \it \bi \mono \initials \displ \keybr} {Libertinus}
+ {[LibertinusSerif-Regular]}
+ {\_def\_fontnamegen {[Libertinus\_subfamV-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \semibold .. semi-bold variants, changed only \bf, \bi^^J
+ \sans ...... smaller serifs, only \rm, \bf \it^^J
+ \caps ...... caps & small caps^^J%
+Special variants:^^J
+ \mono ..... non-proportional
+ \initials .. special initials (only uppercase letters)^^J
+ \displ ..... display variant, suitable at big sizes^^J
+ \keybr ..... keyboard, emulates keyboard buttons^^J
+}}
+
+\_moddef \resetmod {\_fsetV subfam=Serif,caps={} \_fvars Regular Bold Italic BoldItalic }
+\_moddef \semibold {\_fsetV subfam=Serif \_fvars Regular Semibold Italic SemiboldItalic }
+\_moddef \sans {\_fsetV subfam=Sans \_fvars Regular Bold Italic . }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+\_moddef \nocaps {\_fsetV caps={} }
+
+\_famvardef \mono {\_fsetV subfam=Mono \_fvars Regular . . . \_rm}
+\_famvardef \initials {\_fsetV subfam=SerifInitials \_fvars Regular . . . \_rm}
+\_famvardef \displ {\_fsetV subfam=SerifDisplay \_fvars Regular . . . \_rm}
+\_famvardef \keybr {\_fsetV subfam=Keyboard \_fvars Regular . . . \_rm}
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[LibertinusMath-Regular]}
+
+\_endcode
+
diff --git a/macros/optex/base/f-librecaslon.opm b/macros/optex/base/f-librecaslon.opm
new file mode 100644
index 0000000000..53f61834f1
--- /dev/null
+++ b/macros/optex/base/f-librecaslon.opm
@@ -0,0 +1,22 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [LibreCaslon] \Librecaslon {Libre Caslon Text, inspired by Caslon}
+ {\onum} {\rm \bf \it \bi} {Termes}
+ {[LibreCaslonText-Regular]}
+ {\_def\_fontnamegen {[Libre\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \onum ...... oldstyle figures^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={},csl={CaslonText}
+ \_fvars \_cslV-Regular \_cslV-Bold \_cslV-Italic Csln-Bolditalic }
+\_moddef \onum {\_fsetV caps=+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[texgyretermes-math]}
+
+\_endcode
+
diff --git a/macros/optex/base/f-lido.opm b/macros/optex/base/f-lido.opm
new file mode 100644
index 0000000000..13b4cb7628
--- /dev/null
+++ b/macros/optex/base/f-lido.opm
@@ -0,0 +1,48 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Lido] \Lido {by StormType Foundry designed for "lidove noviny"}
+ {\cond} {\rm \bf \mf \mi \it \bi} {Termes}
+ {[LidoSTF]}
+ {\_def\_fontnamegen {[LidoSTF\_condV\_currV]:script=latn;\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Variants:^^J
+ \rm \bf \it \bi ... classical variants^^J
+ \mf \mi .... medium regular and medium italics (between normal and bold)^^J
+Modifiers:^^J
+ \cond ...... condensed (italic is not avalable for \cond variants)^^J
+ \medium .... sets \mf \bf \mi \bi family
+}}
+
+\_moddef \resetmod {\_fsetV caps={},cond={},ital=Italic \_fvars {} Bold {\_italV} {Bold\_italV} }
+\_moddef \medium {\_fvars Medium Bold {Medium\_italV} {Bold\_italV} }
+\_moddef \cond {\_fsetV cond=Condensed,ital={} }
+
+\_famvardef \mf {\_fvars Medium . . . \_rm}
+\_famvardef \mi {\_fvars . . {Medium\_italV} . \_it}
+
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[texgyretermes-math]}
+
+\_endcode
+
+This font family Lido by Storm Type Foundry was designed for Lidove noviny
+newspaper. It is similar to Times but it is not Times.
+
+The Lido font family supports 6 standard selectors
+
+\rm Regular \it Italics
+\mf Medium-Regular \mi Medium-Italics
+\bf Bold-Regular \bi Bold-Italics
+
+and three Condensed variants:
+
+\cond \rm Condensed
+ \mf Condensed-Medium
+ \bf Condensed-Bold
+
+The italic variants are missing when \cond is selected. This means that
+\cond\it does the same as \cond\rm etc.
+
diff --git a/macros/optex/base/f-lmfonts.opm b/macros/optex/base/f-lmfonts.opm
new file mode 100644
index 0000000000..13865890e2
--- /dev/null
+++ b/macros/optex/base/f-lmfonts.opm
@@ -0,0 +1,186 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Latin Modern] \LMfonts {TeX Gyre fonts based on Coputer Modern}
+ {\roman \sans \quotset \ttset \ttprop \ttlight \ttcond \upital
+ \dunhill submods:\caps \slant \nbold \bolder} {\rm \bf \it \bi \tt} {LM}
+ {[lmroman10-regular]}
+ {\_def\_fontnamegen {[\_optname{lm\_subfamV.\_currV}]:\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers (selects subfamily):^^J
+ \modreset .. implicit values (serif, bold extended, nocaps)^^J
+ \sans ...... sans serif subfamily^^J
+ \quotset ... quotation subfamily^^J
+ \ttset ..... typewriter subfamily^^J
+ \ttprop .... proportional typewriter-like subfamily^^J
+ \ttlight ... light typewriter subfamily^^J
+ \ttcond .... condensed typewriter subfamily^^J
+ \upital .... upright italic (only \rm)^^J
+ \dunhill ... dunhill roman subfamily (only \rm, \it)^^J%
+Sub-modifiers (selects special variants of given subfamily):^^J
+ \caps ...... caps & small caps (available only at limited shapes)^^J
+ \slant ..... slanted (default in some subfamilies)^^J
+ \nbold ..... normal bold (extended bold is default)^^J
+ \bolder .... extended bold^^J
+}}
+
+\_def\_LMregfont #1 #2 #3{%
+ \_edef\_tmp {\_noexpand\_regoptsizes #1 #2 \_ea\_detokenize\_ea{#3}}%
+ \_lowercase\_ea{\_tmp}% OTF file names are lowercase
+}
+\_def \_regoptFS {5 <5.5 6 <6.5 7 <7.5 8 <8.5 9 <9.5 10 <11.1 12 <15 17 <*}
+\_def \_regoptFT {5 <5.5 6 <6.5 7 <7.5 8 <8.5 9 <9.5 10 <11.1 12 <*}
+\_def \_regoptST {7 <7.5 8 <8.5 9 <9.5 10 <11.1 12 <*}
+\_def \_regoptES {8 <8.5 9 <9.5 10 <11.1 12 <15 17 <*}
+\_def \_regoptET {8 <8.5 9 <9.5 10 <11.1 12 <*}
+\_def \_regoptT {10 <*}
+\_def \_regoptE {8 <*}
+
+\_LMregfont lmrm.r LMRoman?-Regular \_regoptFS % 5-17
+\_LMregfont lmrm.bx LMRoman?-Bold \_regoptFT % 5-12
+\_LMregfont lmrm.i LMRoman?-Italic \_regoptST % 7-12
+\_LMregfont lmrm.bxi LMRoman?-BoldItalic \_regoptT % 10
+\_LMregfont lmrm.isl LMRomanSlant?-Regular \_regoptES % 8-17
+\_LMregfont lmrm.bxisl LMRomanSlant?-Bold \_regoptT % 10
+\_LMregfont lmrm.b LMRomanDemi?-Regular \_regoptT % 10
+\_LMregfont lmrm.bi LMRomanDemi?-Oblique \_regoptT % 10
+
+\_LMregfont lmss.r LMSans?-Regular \_regoptES % 8-17
+\_LMregfont lmss.bx LMSans?-Bold \_regoptT % 10
+\_LMregfont lmss.i LMSans?-Oblique \_regoptES % 8-17
+\_LMregfont lmss.bxi LMSans?-BoldOblique \_regoptT % 10
+\_LMregfont lmss.b LMSansDemiCond?-Regular \_regoptT % 10
+\_LMregfont lmss.bi LMSansDemiCond?-Oblique \_regoptT % 10
+
+\_LMregfont lmsq.r LMSansQuot?-Regular \_regoptE % 8
+\_LMregfont lmsq.b LMSansQuot?-Bold \_regoptE % 8
+\_LMregfont lmsq.i LMSansQuot?-Oblique \_regoptE % 8
+\_LMregfont lmsq.bi LMSansQuot?-BoldOblique \_regoptE % 8
+
+\_LMregfont lmtt.r LMMono?-Regular \_regoptET % 8-12
+\_LMregfont lmtt.b LMMonoLt?-Bold \_regoptT % 10
+\_LMregfont lmtt.i LMMono?-Italic \_regoptT % 10
+\_LMregfont lmtt.bi LMMonoLt?-BoldOblique \_regoptT % 10
+\_LMregfont lmtt.isl LMMonoSlant?-Regular \_regoptT % 10
+\_optfontalias {lmtt.bisl} {lmtt.bi}
+
+\_LMregfont lmtp.r LMMonoPropLt?-Regular \_regoptT % 10
+\_LMregfont lmtp.bx LMMonoPropLt?-Bold \_regoptT % 10
+\_LMregfont lmtp.i LMMonoPropLt?-Oblique \_regoptT % 10
+\_LMregfont lmtp.bxi LMMonoPropLt?-BoldOblique \_regoptT % 10
+\_LMregfont lmtp.b LMMonoProp?-Regular \_regoptT % 10
+\_LMregfont lmtp.bi LMMonoProp?-Oblique \_regoptT % 10
+
+\_LMregfont lmtl.r LMMonoLt?-Regular \_regoptT % 10
+\_LMregfont lmtl.i LMMonoLt?-Oblique \_regoptT % 10
+
+\_LMregfont lmtc.r LMMonoLtCond?-Regular \_regoptT % 10
+\_LMregfont lmtc.i LMMonoLtCond?-Oblique \_regoptT % 10
+
+\_LMregfont lmrm.rc LMRomanCaps?-Regular \_regoptT % 10
+\_LMregfont lmrm.ic LMRomanCaps?-Oblique \_regoptT % 10
+\_LMregfont lmtt.rc LMMonoCaps?-Regular \_regoptT % 10
+\_LMregfont lmtt.ic LMMonoCaps?-Oblique \_regoptT % 10
+
+\_LMregfont lmmu.r LMRomanUnsl?-Regular \_regoptT % 10
+\_LMregfont lmdu.r LMRomanDunh?-Regular \_regoptT % 10
+\_LMregfont lmdu.sl LMRomanDunh?-Oblique \_regoptT % 10
+
+% main modifiers (they select a subfamily)
+\_moddef \resetmod {\_fsetV subfam=rm \_fvars r bx i bxi }
+\_moddef \sans {\_fsetV subfam=ss \_fvars r bx i bxi }
+\_moddef \quotset {\_fsetV subfam=sq \_fvars r b i bi }
+\_moddef \ttset {\_fsetV subfam=tt \_fvars r b i bi }
+\_moddef \ttprop {\_fsetV subfam=tp \_fvars r b i bi }
+\_moddef \ttlight {\_fsetV subfam=tl \_fvars r . i . }
+\_moddef \ttcond {\_fsetV subfam=tc \_fvars r . i . }
+\_moddef \upital {\_fsetV subfam=mu \_fvars r . . . }
+\_moddef \dunhill {\_fsetV subfam=du \_fvars r . sl . }
+
+% submodifiers (they select special vaiants in a subfamily)
+\_moddef \nbold {\_onlyif subfam=rm,ss,tp: {\_fvars r b i bi }}
+\_moddef \bolder {\_onlyif subfam=rm,ss,tp: {\_fvars r bx i bxi }}
+\_moddef \slant {\_onlyif subfam=rm: {\_fvars r bx isl bxisl }%
+ \_onlyif subfam=tt: {\_fvars r b isl bisl }}
+\_moddef \caps {\_onlyif subfam=rm,tt: {\_fvars rc . ic . }}
+
+\_def \_tryloadtt {\_fontdef\_tentt{\_LMfonts \_addto\_fontfeatures{-tlig;}\_ttset \_rm}}
+\_private \LMfonts \ttset ; % used in \_tryloadtt
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[latinmodern-math]}
+
+\_endcode
+
+\secc How to write the font family file with optical sizes
+
+You can use \^`\_optname` macro when `\_fontnamegen` in expanded. This macro is fully
+expandable and its input is `<internal-template>` and its output is a
+part of the font file name `<size-dependent-template>` with respect to given
+optical size.
+
+You can declare a collection of `<size-dependent-template>`s for one
+given `<internal-template>` by the \^`\_regoptsizes` macro.
+The syntax is shown for one real case:
+
+\begtt
+\_regoptsizes lmr.r lmroman?-regular
+ 5 <5.5 6 <6.5 7 <7.5 8 <8.5 9 <9.5 10 <11.1 12 <15 17 <*
+\endtt
+
+In general:
+
+\begtt \catcode`\<=13
+\_regoptsizes <internal-template> <general-ouput-template> <resizing-data>
+\endtt
+
+Suppose our example above. Then `\_optname{lmr.r}` expands to
+lmroman?-regular where the question mark is substituted by a number
+depending on current `\_optsize`. If the `\_optsize` lies between two boundary
+values (they are prefixed by \code{<} character) then the number written between
+them is used. For example if $11.1 \lt `\_optsize` \le 15$ then 12 is
+substituted instead question mark. The <resizing-data> virtually begins
+with zero \code{<0}, but it is not explicitly written. The right part of
+<resizing-data> must be terminated by \code{<*} which means "less than infinity".
+
+If `\_optname` gets an argument which is not registered <internal-template>
+then it expands to `\_failedoptname` which typically ends with an error message
+about missing font. You can redefine `\_failedoptname` macro to some
+existing font if you find it useful.
+
+We are using a special macro `\_LMregfont` in `f-lmfonts.opm`.
+It sets the file names to
+lowercase and enables us to use shortcuts instead of real <resizing-data>.
+There are shortcuts `\_regoptFS`, `\_regoptT`, etc. here. The collection of
+`<internal-templates>` are declared, each of them covers a collection of real
+file names.
+
+The \^`\_optfontalias` `{<new-template>} {<internal-template>}` declares
+`<new-template>` with the same meaning as previously declared
+`<internal-template>`.
+
+The `\_optname` macro can be used even if no otical sizes are provided by
+a font family. Suppose that font file names are much more chaotic (because
+artists are very creative people), so you need to declare more systematic
+`<internal-templates>` and do an alias from each `<internal-template>` to
+`<real-font-name>`. For example, you can do it as follows:
+
+\begtt
+\def\fontalias #1 #2 {\_regoptsizes #1 ?#2 {} <*}
+% alias name real font name
+\fontalias crea-a-regular {Creative Font}
+\fontalias crea-a-bold {Creative FontBold}
+\fontalias crea-a-italic {Creative olique}
+\fontalias crea-a-bolditalic {Creative Bold plus italic}
+\fontalias crea-b-regular {Creative Regular subfam}
+\fontalias crea-b-bold {Creative subfam bold}
+\fontalias crea-b-italic {Creative-subfam Oblique}
+\fontalias crea-b-bolditalic {Creative Bold subfam Oblique}
+\endtt
+
+Another example of a font family with optical sizes is Antykwa Półtawskiego.
+The optical sizes feature is deactivated by default and it is switched on by
+`\osize` font modifier:
+
+\printdoc f-poltawski.opm
diff --git a/macros/optex/base/f-merriweather.opm b/macros/optex/base/f-merriweather.opm
new file mode 100644
index 0000000000..f2972aaafd
--- /dev/null
+++ b/macros/optex/base/f-merriweather.opm
@@ -0,0 +1,33 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Merriweather] \Merriweather {Modern shapes, sharp serifs}
+ {\caps \sans \serif} {\lf \li \rm \bf \it \bi \kr \ki} {}
+ {[Merriweather-Regular]}
+ {\_def\_fontnamegen {[Merriweather\_sansV-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \sans ...... sans serif^^J
+ \serif ..... variants with serifs (default)^^J
+ \caps ...... caps & small caps^^J
+ \nocaps .... no \caps^^J%
+Extended variants:^^J
+ \lf \li .... Light, LightItalic^^J
+ \kf \ki .... Black, BlackItalic^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={},sans={} \_fvars Regular Bold Italic BoldItalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+\_moddef \nocaps {\_fsetV caps={} }
+\_moddef \sans {\_fsetV sans=Sans }
+\_moddef \serif {\_fsetV sans={} }
+
+\_famvardef \lf {\_fsetV curr=Light \_rm}
+\_famvardef \li {\_fsetV curr=LightItalic \_rm}
+\_famvardef \kf {\_fsetV curr=ExtraBold \_onlyif sans={}: {\_fsetV curr=Black }\_rm}
+\_famvardef \ki {\_fsetV curr=ExtraBoldItalic \_onlyif sans={}: {\_fsetV curr=BlackItalic }\_rm}
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
diff --git a/macros/optex/base/f-pagella.opm b/macros/optex/base/f-pagella.opm
new file mode 100644
index 0000000000..a0e4eb8e30
--- /dev/null
+++ b/macros/optex/base/f-pagella.opm
@@ -0,0 +1,24 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Pagella] \Pagella {TeX Gyre Pagella fonts based on Palatino}
+ {\caps} {\rm \bf \it \bi} {Pagella}
+ {[texgyrepagella-regular]}
+ {\_def\_fontnamegen {[texgyrepagella-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \caps ...... caps & small caps^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[texgyrepagella-math]}
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-poltawski.opm b/macros/optex/base/f-poltawski.opm
new file mode 100644
index 0000000000..ffc7e8474d
--- /dev/null
+++ b/macros/optex/base/f-poltawski.opm
@@ -0,0 +1,34 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Poltawski] \Poltawski {Antykwa Poltawskiego, Polish traditional font family}
+ {\light \noexpd \expd \eexpd \cond \ccond \osize \caps} {\rm \bf \it \bi} {}
+ {[antpolt-regular]}
+ {\_def\_fontnamegen {[antpolt\_liV\_condV-\_currV]\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \light ..... light weight, \bf,\bi=semibold^^J
+ \noexpd .... no expanded, no condensed, designed for 10pt size (default)^^J
+ \eexpd ..... expanded, designed for 6pt size^^J
+ \expd ...... semi expanded, designed for 8pt size^^J
+ \cond ...... semi condensed, designed for 12pt size^^J
+ \ccond ..... condensed, designed for 17pt size^^J
+ \osize ..... auto-sitches between \ccond \cond \noexpd \expd \eexpd by size^^J
+ \caps ...... caps & small caps^^J
+}}
+
+\_moddef \resetmod {\_fsetV li={},cond={},caps={} \_fvars regular bold italic bolditalic }
+\_moddef \light {\_fsetV li=lt }
+\_moddef \noexpd {\_fsetV cond={} }
+\_moddef \eexpd {\_fsetV cond=expd }
+\_moddef \expd {\_fsetV cond=semiexpd }
+\_moddef \cond {\_fsetV cond=semicond }
+\_moddef \ccond {\_fsetV cond=cond }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+\_moddef \nocaps {\_fsetV caps={} }
+\_moddef \osize {\_def\_fontnamegen{[antpolt\_liV\_optname{x}-\_currV]:\_capsV\_fontfeatures}%
+ \_regoptsizes x ? expd <7 semiexpd <9 {} <11.1 semicond <15 cond <*}
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
diff --git a/macros/optex/base/f-roboto.opm b/macros/optex/base/f-roboto.opm
new file mode 100644
index 0000000000..51dfffff25
--- /dev/null
+++ b/macros/optex/base/f-roboto.opm
@@ -0,0 +1,59 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Roboto] \Roboto {Geometric grotesk, thin variants included}
+ {\cond \mono \ttset \thin \light \normal \bolder \caps}
+ {\tf \ti \lf \li \rm \it \mf \mi \bf \bi \kf \ki} {}
+ {[Roboto-Regular]}
+ {\_def\_fontnamegen {[Roboto\_subV-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers (subfamilies):^^J
+ \cond ...... Condensed variants (no Thin, Medium, Black)^^J
+ \mono ...... Monospaced variants [Mono] (no Black)^^J
+ \ttset ..... Typewriter-like variants [Slab] (no Italic, no Medium, Black)^^J%
+Modifiers (face weight):^^J
+ \thin ...... \rm, \it = Thin, \bf, \bi = Normal^^J
+ \light ..... \rm, \it = Light, \bf, \bi = Medium^^J
+ \normal .... \rm, \it = Normal, \bf, \bi = Bold^^J
+ \bolder .... \rm, \it = Medium, \bf, \bi = Black^^J%
+Modifiers (Caps):^^J
+ \caps ...... Caps & small Caps^^J
+ \nocaps .... no \caps^^J%
+Extended variants:^^J
+ \tf \ti .... Thin, ThinItalic^^J
+ \lf \li .... Light, LightItalic^^J
+ \mf \mi .... Medium, MediumItalic^^J
+ \kf \ki .... Black, BlackItalic^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={},sub={},w=n \_fvars Regular Bold Italic BoldItalic }
+\_moddef \mono {\_fsetV sub=Mono \_onlyif w=b: {\normal}}
+\_moddef \cond {\_fsetV sub=Condensed \_onlyif w=b: {\normal}\_onlyif w=t: {\light}}
+\_moddef \ttset {\_fsetV sub=Slab \_fvars Regular Bold . . }
+
+\_moddef \thin {\_onlyif sub={},Mono: {\_fsetV w=t \_fvars Thin Regular ThinItalic Italic }%
+ \_onlyif sub=Slab: {\_fsetV w=t \_fvars Thin Regular . . }}
+\_moddef \light {\_onlyif sub={},Mono: {\_fsetV w=l \_fvars Light Medium LightItalic MediumItalic }%
+ \_onlyif sub=Condensed: {\_fsetV w=l \_fvars Light Regular LightItalic Italic }%
+ \_onlyif sub=Slab: {\_fsetV w=l \_fvars Light Bold . . }}
+\_moddef \normal {\_fsetV w=n \_fvars Regular Bold Italic BoldItalic
+ \_onlyif sub=Slab: {\_fvars Regular Bold . . }}
+\_moddef \bolder {\_onlyif sub={}: {\_fsetV w=b \_fvars Medium Black MediumItalic BlackItalic }}
+
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+\_moddef \nocaps {\_fsetV caps={} }
+
+\_famvardef \tf {\_thinM \_rm}
+\_famvardef \ti {\_thinM \_it}
+\_famvardef \lf {\_lightM \_rm}
+\_famvardef \li {\_lightM \_it}
+\_famvardef \mf {\_bolderM \_rm}
+\_famvardef \mi {\_bolderM \_it}
+\_famvardef \kf {\_bolderM \_bf}
+\_famvardef \ki {\_bolderM \_bi}
+\_let\_thinM=\thin \_let\_lightM=\light \_let\_bolderM=\bolder
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
diff --git a/macros/optex/base/f-schola.opm b/macros/optex/base/f-schola.opm
new file mode 100644
index 0000000000..067a6d0ce2
--- /dev/null
+++ b/macros/optex/base/f-schola.opm
@@ -0,0 +1,24 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Schola] \Schola {TeX Gyre Schola fonts based on New Century}
+ {\caps} {\rm \bf \it \bi} {Schola}
+ {[texgyreschola-regular]}
+ {\_def\_fontnamegen {[texgyreschola-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \caps ...... caps & small caps^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[texgyreschola-math]}
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-sourcepro.opm b/macros/optex/base/f-sourcepro.opm
new file mode 100644
index 0000000000..a8e847104e
--- /dev/null
+++ b/macros/optex/base/f-sourcepro.opm
@@ -0,0 +1,39 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Source Pro] \Sourcepro {SourceSerifPro,SourceSansPro,SourceCodePro}
+ {\serif \sans \mono \light \elight \bolder \medium \caps} {\rm \bf \it \bi} {Termes}
+ {[SourceSerifPro-Regular]}
+ {\_def\_fontnamegen {[Source\_typfV Pro-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \serif ..... Serif family (default)^^J
+ \sans ...... Sans family^^J
+ \mono ...... Code family^^J
+ \light ..... \rm=Light, \bf=Semibold^^J
+ \elight .... \rm=Extra light, \bf=Regular^^J
+ \bolder .... \rm=Semibold, \bf=Black^^J
+ \medium .... \rm=Medium, \bf=Bold (only for \mono family)^^J
+ \caps ...... caps & small caps, only for \sans (\serif: only \rm,\bf)^^J
+}}
+
+\_moddef \resetmod {\_fsetV typf=Serif,caps={} \_fvars Regular Bold RegularIt BoldIt }
+\_moddef \serif {\_fsetV typf=Serif }
+\_moddef \sans {\_fsetV typf=Sans }
+\_moddef \mono {\_fsetV typf=Code }
+\_moddef \light {\_fvars Light Semibold LightIt SemiboldIt }
+\_moddef \elight {\_fvars ExtraLight Regular ExtraLightIt RegularIt }
+\_moddef \bolder {\_fvars Semibold Black SemiboldIt BlackIt }
+\_moddef \medium {\_fsetV typf=Code \_fvars Medium Bold MediumIt BoldIt }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+\_moddef \nocaps {\_fsetV caps={} }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[texgyretermes-math]}
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-technika.opm b/macros/optex/base/f-technika.opm
new file mode 100644
index 0000000000..77b894e53b
--- /dev/null
+++ b/macros/optex/base/f-technika.opm
@@ -0,0 +1,31 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Technika] \Technika {Fonts from visual style of CTU in Prague}
+ {\caps \light} {\rm \bf \it \bi \stencil} {}
+ {[Technika-Regular]}
+ {\_def\_fontnamegen {[Technika\_stencilV-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \light ..... ligher variants: \rm\bf=light \bf\bi=normal^^J
+ \book ...... semi-ligher variants: \rm\bf=book \bf\bi=bold^^J
+ \caps ...... caps & small caps^^J%
+Special variant:^^J
+ \stencil ... dashed leters (only uppercase)^^J
+}}
+
+\_moddef \resetmod {\_fsetV stencil={},caps={} \_fvars Regular Bold Italic BoldItalic }
+\_moddef \light {\_fsetV stencil={} \_fvars Light Regular LightItalic Italic }
+\_moddef \book {\_fsetV stencil={} \_fvars Book Bold BookItalic BoldItalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_famvardef \stencil {\_fsetV stencil=Stencil \_fvars Bold . Bold . \rm}
+
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-termes.opm b/macros/optex/base/f-termes.opm
new file mode 100644
index 0000000000..8cd6ee6d8a
--- /dev/null
+++ b/macros/optex/base/f-termes.opm
@@ -0,0 +1,24 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Termes] \Termes {TeX Gyre Termes fonts based on Times}
+ {\caps} {\rm \bf \it \bi} {Termes}
+ {[texgyretermes-regular]}
+ {\_def\_fontnamegen {[texgyretermes-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifier:^^J
+ \caps ...... caps & small caps^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[texgyretermes-math]}
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/f-xcharter.opm b/macros/optex/base/f-xcharter.opm
new file mode 100644
index 0000000000..9ad886d47f
--- /dev/null
+++ b/macros/optex/base/f-xcharter.opm
@@ -0,0 +1,24 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [XCharter] \XCharter {An extension of Bitstream Charter}
+ {\caps \slant} {\rm \bf \it \bi} {}
+ {[XCharter-Roman]}
+ {\_def\_fontnamegen {[XCharter-\_currV]:script=latn;\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \caps ...... caps & small caps^^J
+ \slant ..... slanted variants used in \it, \bi^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars Roman Bold Italic BoldItalic }
+\_moddef \slant {\_fvars Roman Bold Slanted BoldSlanted }
+\_moddef \caps {\_fsetV caps=+smcp;+onum; }
+
+\_initfontfamily % new font family must be initialized
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+
diff --git a/macros/optex/base/fams-ini.opm b/macros/optex/base/fams-ini.opm
new file mode 100644
index 0000000000..3c8ded975e
--- /dev/null
+++ b/macros/optex/base/fams-ini.opm
@@ -0,0 +1,214 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+% Version <2020-02-28>. Loaded in format and secondly on demand by \fontfam[catalog]
+
+\_famtext {Special name for printing a catalog :}
+
+\_faminfo [Catalogue] {Catalogue of all registered font families} {fonts-catalog} {}
+\_famalias [Catalog]
+
+\_famtext {Computer Modern like family:}
+
+\_famfrom {GUST}
+\_faminfo [Latin Modern] {TeX Gyre fonts based on Coputer Modern} {f-lmfonts}
+ { -,\nbold,\sans,\sans\nbold,\slant,\ttset,\ttset\slant,\ttset\caps,%
+ \ttprop,\ttprop\bolder,\quotset: {\rm\bf\it\bi}
+ \caps: {\rm\it}
+ \ttlight,\ttcond,\dunhill: {\rm\it} \upital: {\rm} }
+\_famalias [LMfonts] \_famalias [Latin Modern Fonts] \_famalias [lm]
+
+\_famtext {TeX Gyre fonts based on Adobe 35:}
+
+\_faminfo [Termes] {TeX Gyre Termes fonts based on Times} {f-termes}
+ { -,\caps: {\rm\bf\it\bi} }
+\_famalias [Times]
+
+\_faminfo [Heros] {TeX Gyre Heros fonts based on Helvetica} {f-heros}
+ { -,\caps,\cond,\caps\cond: {\rm\bf\it\bi} }
+\_famalias [Helvetica]
+
+\_faminfo [Adventor] {TeX Gyre Adventor based on Avantgarde Book} {f-adventor}
+ { -,\caps: {\rm\bf\it\bi} }
+\_famalias [Avantgarde Book]
+
+\_faminfo [Bonum] {TeX Gyre Bonum fonts based on Bookman} {f-bonum}
+ { -,\caps: {\rm\bf\it\bi} }
+\_famalias [Bookman]
+
+\_faminfo [Pagella] {TeX Gyre Pagella fonts based on Palatino} {f-pagella}
+ { -,\caps: {\rm\bf\it\bi} }
+\_famalias [Palatino]
+
+\_faminfo [Schola] {TeX Gyre Schola fonts based on New Century} {f-schola}
+ { -,\caps: {\rm\bf\it\bi} }
+\_famalias [New Century]
+
+\_faminfo [Cursor] {TeX Gyre Cursor fonts based on Courier} {f-cursor}
+ { -,\caps: {\rm\bf\it\bi} }
+\_famalias [Courier]
+
+\_famtext {Other fonts:}
+
+\_famfrom {Philipp H. Poll}
+\_faminfo [Linux Libertine] {Free fonts typically installed on systems} {f-libertine}
+ { -: {\rm\bf\it\bi} \semibold: {\bf\bi}
+ \caps,\sans,\mono,\caps\sans: {\rm\bf\it\bi} -: {\initials\displ\keybr} }
+\_famalias [Libertine] \_famalias [LinLibertine]
+
+\_famfrom {Philipp H. Poll, Khaled Hosny}
+\_faminfo [Libertinus] {Free fonts derived from Linux Libertine} {f-libertinus}
+ { -: {\rm\bf\it\bi} \semibold: {\bf\bi} \sans: {\rm\bf\it}
+ \caps: {\rm\bf\it\bi} \caps\semibold: {\bf\bi} \caps\sans: {\rm\bf\it}
+ -: {\mono\initials\displ\keybr} }
+
+\_famfrom {Daniel Flipo}
+\_faminfo [KP fonts] {KP fonts -- Johannes Kepler project} {f-kpfonts}
+ { -,\light,\sans,\mono, \caps, \caps\light, \caps\sans,\caps\mono,\swash: {\rm\bf\it\bi} }
+\_famalias [KP]
+
+\_famfrom {DejaVu fonts team}
+\_faminfo [DejaVu] {Derived from the Vera fonts} {f-dejavu}
+ { -,\cond,\sans,\sans\cond,\mono: {\rm\bf\it\bi} \light: {\rm} }
+
+\_famfrom {Zygfryd Gardzielewski, Janusz M. Nowacki}
+\_faminfo [Antykwa Torunska] {Traditional Polish font family} {f-antt}
+ { -,\cond,\caps, \caps\cond: {\rm\bf\it\bi}
+ \medium,\cond\medium, \light, \cond\light:{\rm\it} }
+\_famalias [Antt]
+
+\_famfrom {Adam Półtawski, Janusz M. Nowacki, Bogusław Jackowski and Piotr Strzelczyk}
+\_faminfo [Poltawski] {Antykwa Poltawskiego, Polish traditional font family} {f-poltawski}
+ { \ccond,\cond,-,\expd,\eexpd,
+ \light\ccond,\light\cond,\light,\light\expd,\light\eexpd,
+ \caps: {\rm\bf\it\bi} }
+\_famalias [Antykwa Poltawskiego] \_famalias [Poltawskiego] \_famalias [APoltawskiego]
+
+\_famfrom {Michael Sharpe}
+\_faminfo [Baskerville] {Free variants of classical Baskerville} {f-baskerville}
+ { -,\caps: {\rm\bf\it\bi} }
+\_famalias [BaskervilleF]
+
+\_famfrom {Georg Duffner, Octavio Pardo}
+\_faminfo [EB Garamond] {Free variants of classical Garamond} {f-ebgaramond}
+ { -,\caps,\medium,\medium\caps,\semibold,\semibold\caps: {\rm\bf\it\bi}
+ \swash: {\it\bi} -: {\initials} }
+\_famalias [Garamond]
+
+\_famfrom {George Douros, Benjamin Miller}
+\_faminfo [Garamond Libre] {Free, derived from old style font family} {f-garamondl}
+ { -,\caps: {\rm\bf\it\bi} \swash: {\it\bi} }
+\_famalias [GaramondL]
+
+\_famfrom {Pablo Impallari, Rodrigo Fuenzalida}
+\_faminfo [LibreCaslon] {Libre Caslon Text, inspired by Caslon} {f-librecaslon}
+ { -,\onum: {\rm\bf\it\bi} }
+\_famalias [Caslon]
+
+\_famfrom {Adobe, Paul D. Hunt}
+\_faminfo [Source Pro] {Adobe SourceSerifPro, SourceSansPro, SourceCodePro} {f-sourcepro}
+ { \elight,\light,-,\bolder: {\rm\it} -,\bolder: {\bf\bi}
+ \sans\elight,\sans\light,\sans,\sans\bolder: {\rm\it} \sans,\sans\bolder: {\bf\bi}
+ \elight\caps,\light\caps,\caps,\bolder\caps: {\rm} \caps,\bolder\caps: {\bf}
+ \sans\elight\caps,\sans\light\caps,\sans\caps,\sans\bolder\caps: {\rm\it}
+ \sans\caps,\sans\bolder\caps: {\bf\bi}
+ \mono\elight,\mono\light,\mono,\mono\medium,\mono\bolder: {\rm\it} \mono,\mono\bolder: {\bf\bi}
+ }
+\_famalias [AdobeSource] \_famalias [AdobeSourcePro]
+
+\_famfrom {Uni. of the Aegean}
+\_faminfo [Kerkis] {Free Bookman alternative with Greek letters} {f-kerkis}
+ { -,\sans: {\rm\bf\it\bi} \caps: {\rm\bf} \semibold: {\bf\bi}
+ \sanssemi: {\rm} -:{\calli} }
+
+\_famfrom {Craig Rozynski}
+\_faminfo [ComicNeue] {Comic Neue sans serif} {f-comicneue}
+ { -,\angular: {\lf\li\rm\it\bf\bi} }
+
+\_famfrom {Eben Sorkin}
+\_faminfo [Merriweather] {Modern shapes, sharp serifs} {f-merriweather}
+ { -,\sans: {\lf\li\rm\it\bf\bi\kf\ki} \caps,\sans\caps: {\rm\it} }
+
+\_famfrom {Google, Christian Robertson}
+\_faminfo [Roboto] {Geometric grotesk, thin variants included} {f-roboto}
+ { -: {\tf\ti\lf\li\rm\it\mf\mi\bf\bi\kf\ki}
+ \cond: {\lf\li\rm\it\bf\bi}
+ \mono: {\tf\ti\lf\li\rm\it\mf\mi\bf\bi}
+ \ttset: {\tf\lf\rm\bf}
+ \caps, \caps\cond: {\rm\bf\it\bi} \caps\ttset: {\rm\bf}
+ }
+
+\_famfrom {CTU in Prague, Roman Cernohous}
+\_faminfo [Technika] {Fonts from visual style of CTU in Prague} {f-technika}
+ { -,\light,\book, \caps, \caps\book: {\rm\bf\it\bi} -:{\stencil} }
+\_famalias [CTU Technika]
+
+\_famfrom {Bitstream, Andrey V. Panov, Michael Sharpe}
+\_faminfo [XCharter] {An extension of Bitstream Charter} {f-xcharter}
+ { -,\slant,\caps,\caps\slant: {\rm\bf\it\bi} }
+
+\_famfrom {George Matthiopoulos, Greek Font Society}
+\_faminfo [GFSBodoni] {Based on Bodoni with greek letters} {f-gfsbodoni}
+ { -: {\rm\bf\it\bi} \caps: {\rm} }
+
+\_endcode
+
+Once you have prepared a font family file with the name `f-<famname>.opm` and
+\TeX/can see it in your filesystem then you can type \^`\fontfam``[<famname>]` and
+the file is read, so the information about the font family is loaded. The name
+`<famname>` must be lowercase and without spaces in the file name
+`f-<famname>.opm`. On the other hand, the `\fontfam` command is more tolerant:
+you can write uppercase letters and spaces here. The spaces are ignored and
+uppercase letters are converted to lowercase.
+For example `\fontfam [LM Fonts]` is equivalent to `\fontfam [LMfonts]` and both
+commands load the file `f-lmfonts.opm`.
+
+You can use your font file in sense of the previous paragraph without
+registering it. But problem is that such families are not listed when
+`\fontfam[?]` is used and it is not included in the font catalog when
+`\fontfam[catalog]` is printed. The list of families taken in the catalog and
+listed on the terminal is declared in two files: `fams-ini.opm` and
+`fams-local.opm`. The second file is optional. Users can create it and write to
+it the information about user-defined families using the same syntax as in
+existed file `fams-ini.opm`.
+
+The information from the user's `fams-local.opm` file has precedence.
+For example `fams-ini.opm` declares aliases Times$\to$Termes etc. If you
+have the original Times purchased from Adobe then you can register your
+declaration of Adobe's Times family in `fams-local.opm`. When a user writes
+`\fontfam[Times]` then the original Times (not Termes) is used.
+
+The `fams-ini.opm` and `fams-local.opm` files use the macros
+`\_famifo`, `\_famalias` and `\_famtext`. See the example from
+`fams-ini.tex`:
+
+{\everytt={\typosize[8/10]\_let\_printverbline=\_printcodeline \medskip}
+ \def\docfile{fams-ini.opm}
+\verbinput (3-28) fams-ini.opm
+... etc.
+}
+\medskip
+
+The \^`\_faminfo` commad has the syntax:
+\begtt \catcode`\<=13
+\_faminfo [<Family Name>] {<comments>} {<file-name>}
+ { <mod-plus-vars> }
+\endtt
+%
+The `<mod-plus-vars>` data is used only when printing the catalog. It consists of
+one or more pairs `<mods>: {<vars>}`.
+For each pair: each modifier (separated by comma) is applied to each
+variant selector in <vars>
+and prepared samples are printed. The `-` character means no modifiers
+should be applied.
+
+The \^`\_famalias` declares an alias to the last
+declared family.
+
+The \^`\_famtext` writes a line to the terminal and the log file when all
+families are listed.
+
+The \^`\_famfrom` saves the information about font type foundry or
+manufacturer or designer or license owner. You can use it before `\_faminfo`
+to print `\_famfrom` info into the catalog.
+The `\_famfrom` data is applied to each following declared families until new
+`\_famfrom` is given. Use `\_famfrom {}` if the information is not known.
diff --git a/macros/optex/base/fnotes.opm b/macros/optex/base/fnotes.opm
new file mode 100644
index 0000000000..612b32a17d
--- /dev/null
+++ b/macros/optex/base/fnotes.opm
@@ -0,0 +1,191 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \fnote {Footnotes, marginal notes OpTeX <2020-05-26>} % loaded in format
+
+ \_doc -----------------------------
+ \`\_gfnotenum` is a counter which counts footnotes globally in the whole document.\nl
+ \`\_lfnotenum` is a counter which counts footnotes at each chapter from one.
+ It is used for local page footnote counters too.\nl
+ \`\_ifpgfnote` says that footnote numbers are counted on each page from
+ one. We need to run `\openref` in this case.\nl
+ \`\fnotenum` is a macro that expands to footnote number counted in declared part.\nl
+ \`\fnotenumchapters` declares footnotes numbered in each chapter from one
+ (default), \`\fnotenumglobal` declares footnotes numbered in whole
+ document from one and \`\fnotenumpages` declares footnotes numbered
+ at each page from one.
+ \_cod -----------------------------
+
+\_newcount\_gfnotenum \_gfnotenum=0
+\_newcount\_lfnotenum
+
+\_newifi \_ifpgfnote
+\_def \_fnotenumglobal {\_def\_fnotenum{\_the\_gfnotenum}\_pgfnotefalse}
+\_def \_fnotenumchapters {\_def\_fnotenum{\_the\_lfnotenum}\_pgfnotefalse}
+\_def \_fnotenumpages {\_def\_fnotenum{\_trycs{_fn:\_the\_gfnotenum}{?}}\_pgfnotetrue}
+\_fnotenumchapters % default are footnotes counted from one in each chapter
+\_def \fnotenum{\_fnotenum}
+\_public \fnotenumglobal \fnotenumchapters \fnotenumpages ;
+\_let \runningfnotes = \fnotenumglobal % for backward compatibility
+
+ \_doc -----------------------------
+ The \`\_printfnotemark` prints the footnote mark. You can re-define this
+ macro if you want another design of footnotes. For example
+ \begtt
+ \fnotenumpages
+ \def \_printfnotemark {\ifcase 0\fnotenum\or
+ *\or**\or***\or$^\mathbox{†}$\or$^\mathbox{‡}$\or$^\mathbox{††}$\fi}
+ \endtt
+ This code gives footnotes* and ** and*** and$^\mathbox{†}$ etc.\
+ and it supposes that there are no more than 6 footnotes at one page.
+
+ If you want to distinguish between footnote marks in the text and in the front of
+ the footnote itself, then you can define `\_printfnotemarkA` and `\_printfnotemarkB`.
+
+ The \`\fnotelinks``<colorA><colorB>` implements the hyperlinked footnotes
+ (from text to footnote and backward).
+ \_cod -----------------------------
+
+\_def \_printfnotemark {$^{\_fnotenum}$} % default footnote mark
+\_def \_printfnotemarkA {\_printfnotemark} % footnote marks used in text
+\_def \_printfnotemarkB {\_printfnotemark} % footnote marks used in front of footnotes
+
+\_def \_fnotelinks#1#2{% <inText color> <inFootnote color>
+ \_def\_printfnotemarkA{\_link[fnt:\_the\_gfnotenum]{\_localcolor#1}{\_printfnotemark}%
+ \_dest[fnf:\_the\_gfnotenum]}%
+ \_def\_printfnotemarkB{\_link[fnf:\_the\_gfnotenum]{\_localcolor#2}{\_printfnotemark}%
+ \_dest[fnt:\_the\_gfnotenum]}%
+}
+\public \fnotelinks ;
+
+ \_doc ----------------------------
+ Each footnote saves the \`\_Xfnote` (without parameter) to the `.ref`
+ file (if `\openref`). We can create the mapping from `<gfnotenum>` to`<pgfnotenum>`
+ in the macro `\_fn:<fnotenum>`. Each \^`\_Xpage` macro sets the
+ `\_lfnotenum` to zero.
+ \_cod ----------------------------
+
+\_def \_Xfnote {\_incr\_lfnotenum \_incr\_gfnotenum
+ \_sxdef{_fn:\_the\_gfnotenum}{\_the\_lfnotenum}}
+
+ \_doc ----------------------------
+ The \`\fnote` `{<text>}` macro is simple, \`\fnotemark` and \^`\fnotetext`
+ does the real work.
+ \_cod ----------------------------
+
+\_def\_fnote{\_fnotemark1\_fnotetext}
+\_def\_fnotemark#1{{\_advance\_gfnotenum by#1\_advance\_lfnotenum by#1\_relax \_printfnotemarkA}}
+
+ \_doc ----------------------------
+ The \`\fnotetext` calls \^`\_opfootnote` which is equivalent to plain \TeX/
+ \^`\vfootnote`. It creates new data to Insert \^`\footins`. The only
+ difference is that we can propagate a macro parameter into the Insert group
+ before the text is printed (see section \ref[output]).
+ This propagated macro is \`\_fnset` which sets smaller fonts.
+
+ Note that \^`\vfootnote` and \^`\_opfootnote` don't read the text as a
+ parameter but during the normal horizontal mode. This is the reason why catcode
+ changes (for example in-line verbatim) can be used here.
+ \_cod ----------------------------
+
+\_def\_fnotetext{\_incr\_gfnotenum \_incr\_lfnotenum % global increment
+ \_ifpgfnote \_openref \_fi
+ \_wref \_Xfnote{}%
+ \_ifpgfnote \_ifcsname _fn:\_the\_gfnotenum \_endcsname \_else
+ \_opwarning{unknown \_noexpand\fnote mark. TeX me again}%
+ \_incr\_unresolvedrefs
+ \_fi\_fi
+ \_opfootnote\_fnset\_printfnotemarkB
+}
+\_def\_fnset{\_everypar={}\_scalemain \_typoscale[800/800]}
+
+\_public \fnote \fnotemark \fnotetext ;
+
+ \_doc -----------------------------
+ By default \`\mnote``{<text>}` are in right margin at odd pages and they are in left
+ margin at even pages. The `\mnote` macro saves its position to `.ref`
+ file as \`\_Xmnote` without parameter. We define `\_mn:<mnotenum>` as
+ `\right` or `\left` when the `.ref` file is read.
+ The `\ifnum 0`$\le$`0#2` trick returns true if `<pageno>` has a numeric type and false
+ if it is a non-numeric type (Roman numeral, for example). We prefer to use
+ `<pageno>`, but only if it has the numeric type. We use `<gpageno>` in other cases.
+ \_cod -----------------------------
+
+\_newcount\_mnotenum \_mnotenum=0 % global counter of mnotes
+\_def \_Xmnote {\_incr\_mnotenum \_ea \_XmnoteA \_currpage}
+\_def \_XmnoteA #1#2{% #1=<gpageno> #2=<pageno>
+ \_sxdef{_mn:\_the\_mnotenum}{\_ifodd\_numtype{#2}{#1} \_right \_else \_left \_fi}}
+\_def \_numtype #1#2{\_ifnum 0<0#1 #1\_else #2\_fi}
+
+ \_doc -----------------------------
+ User can declare \`\fixmnotes``\left` or \^`\fixmnotes``\right`. It defines
+ \`\_mnotesfixed` as `\_left` or `\_right` which declares the placement
+ of all marginal notes and such declaration has a precedence.
+ \_cod -----------------------------
+
+\_def \_fixmnotes #1{\_edef\_mnotesfixed{\_cs{_\_csstring #1}}}
+\_public \fixmnotes ;
+
+ \_doc -----------------------------
+ The \`\_mnoteD``{<text>}` macro sets the position of the marginal note.
+ The outer box of marginal note has zero width and zero depth and it is appended
+ after current line using `\vadjust` primitive or it is inverted to vertical mode
+ as a box with `\vskip-\baselineskip` followed.
+ \_cod -----------------------------
+
+\_def\_mnote #1#{\_ifx^#1^\_else \_mnoteC#1\_end \_fi \_mnoteD}
+\_def\_mnoteC up#1\_end{\_mnoteskip=#1\_relax} % \mnote up<dimen> {<text>} syntax
+\_long\_def\_mnoteD#1{\_ifvmode {\_mnoteA{#1}}\_nobreak\_vskip-\_baselineskip \_else
+ \_lower\_dp\_strutbox\_hbox{}\_vadjust{\_kern-\_dp\_strutbox \_mnoteA{#1}\_kern\_dp\_strutbox}%
+ \_fi
+}
+\_public \mnote ;
+
+ \_doc -----------------------------
+ The \`\mnoteskip` is a dimen value that denotes the vertical shift of marginal
+ note from its normal position. A positive value means shift up, negative
+ down. The `\mnoteskip` register is set to zero
+ after the marginal note is printed. The new syntax `\mnote up<dimen>{<text>}`
+ is possible too, but public `\mnoteskip` is kept for backward compatibility.
+ \_cod -----------------------------
+
+\_newdimen\_mnoteskip
+\_public \mnoteskip ;
+
+ \_doc -----------------------------
+ The \`\_mnoteA` macro does the real work. The \`\_lrmnote``{<left>}{<right>}`
+ uses only first or only second parameter depending on the left or right
+ marginal note.
+ \_cod -----------------------------
+
+\_long\_def\_mnoteA #1{\_incr\_mnotenum
+ \_ifx\_mnotesfixed\_undefined
+ \_ifcsname _mn:\_the\_mnotenum \_endcsname
+ \_edef\_mnotesfixed{\_cs{_mn:\_the\_mnotenum}}%
+ \_else
+ \_opwarning{unknown \_noexpand\mnote side. TeX me again}\_openref
+ \_incr\_unresolvedrefs
+ \_def\_mnotesfixed{\_right}%
+ \_fi\_fi
+ \_hbox to0pt{\_wref\_Xmnote{}\_everypar={}%
+ \_lrmnote{\_kern-\_mnotesize \_kern-\_mnoteindent}{\_kern\_hsize \_kern\_mnoteindent}%
+ \_vbox to0pt{\_vss \_setbox0=\_vtop{\_hsize=\_mnotesize
+ \_lrmnote{\_leftskip=0pt plus 1fill \_rightskip=0pt}
+ {\_rightskip=0pt plus 1fil \_leftskip=0pt}%
+ {\_the\_everymnote\_noindent#1\_endgraf}}%
+ \_dp0=0pt \_box0 \_kern\_mnoteskip \_global\_mnoteskip=0pt}\_hss}%
+}
+\_def \_lrmnote#1#2{\_ea\_ifx\_mnotesfixed\_left #1\_else #2\_fi}
+
+ \_doc -----------------------------
+ We don't want to process `\fnote`, `\fnotemark`, `\mnote` in TOC, headlines
+ nor outlines.
+ \_cod -----------------------------
+
+\_regmacro {\_def\fnote#1{}} {\_def\fnote#1{}} {\_def\fnote#1{}}
+\_regmacro {\_def\fnotemark#1{}} {\_def\fnotemark#1{}} {\_def\fnotemark#1{}}
+\_regmacro {\_def\mnote#1{}} {\_def\mnote#1{}} {\_def\mnote#1{}}
+
+\_endcode % -------------------------------------
+
+2020-05-26 \mnote up<dimen> implemented
+2020-03-20 released
diff --git a/macros/optex/base/fonts-catalog.opm b/macros/optex/base/fonts-catalog.opm
new file mode 100644
index 0000000000..3cd02e7b27
--- /dev/null
+++ b/macros/optex/base/fonts-catalog.opm
@@ -0,0 +1,136 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \_undefined {Font catalogue <2020-02-26>} % loaded on demand by \fontfam[catalog]
+
+\_tracinglostchars=1 % only to log file
+\_initunifonts
+\_begingroup
+
+\_istoksempty\_catalogmathsample \_iftrue \_noloadmath \_fi
+\_font\_ttfixed=[LMMono10-Regular]\_relax
+\_fontlet\_smalltt=\_ttfixed at7pt
+\_suppressfontnotfounderror=1
+
+\_lowercase\_ea{\_ea\_def\_ea\_cataloglist\_ea{\_the\_catalogonly}}
+\_lowercase\_ea{\_ea\_def\_ea\_catalognolist\_ea{\_the\_catalogexclude}}
+
+\_ifx\_cataloglist\_empty \_else
+ \_addto\_cataloglist{ }
+ \_edef\_cataloglist{\_ea\_removespaces\_cataloglist{} }
+\_fi
+\_ifx\_catalognolist\_empty \_else
+ \_addto\_catalognolist{ }
+ \_edef\_catalognolist{\_ea\_removespaces\_catalognolist{} }
+\_fi
+
+\_def\_faminfo [#1]#2#3#4{%
+ \_bgroup
+ \_lowercase{\_edef\_famname{\_ea\_removespaces #1 {} }}%
+ \_edef\_act{\_noexpand\_isinlist{,\_cataloglist,}{,\_famname,}}\_act
+ \_iftrue \def\_cataloglist{}\_fi
+ \_edef\_act{\_noexpand\_isinlist{,\_catalognolist,}{,\_famname,}}\_act
+ \_iftrue \def\_cataloglist{.}\_fi
+ \_ifx\_cataloglist\_empty
+ \_ifx^#4^\_else
+ \_bigskip {\_ttfixed\_string\fontfam [#1] -- (#2)\_par}
+ \_input #3.opm
+ \_ifexistfam \_nobreak\_medskip \_dosamples #4:{}
+ \_ifx\_mathfaminfo\_empty
+ \_else \_istoksempty\_catalogmathsample
+ \_iftrue {\_ttfixed \$Default math font\$: \_mathfaminfo \_par}
+ \_else Default math font (\_mathfaminfo): \_the\_catalogmathsample \_par
+ \_fi\_fi
+ \_else {\_qquad\_ttfixed ... family skipped, fonts not found in your system.}
+ \_fi\_fi\_fi
+ \_egroup
+}
+\_def\_dosamples #1:#2{\_ifx^#2^\_else
+ \_def\_printvars{#2}%
+ \_ea\_dosamplesA\_romannumeral-`\.#1,,%
+ \_ea\_dosamples\_fi
+}
+\_def\_dosamplesA#1,{%
+ \_ifx^#1^\_else
+ \_ifx-#1\_def\_usemodifiers{}\_else \_def\_usemodifiers{#1}\_fi
+ \_ea \_dosamplesB \_printvars \_relax
+ \_ea \_dosamplesA \_fi
+}
+\_def\_dosamplesB#1{%
+ \_ifx\_relax#1 \_else
+ {\_ttfixed \_detokenize\_ea{\_usemodifiers}\_detokenize{#1}\_unskip:}
+ {\_usemodifiers #1\_ea\_ifx\_the\_font \_nullfont
+ \_ttfixed ... This font isn't available in your system.%
+ \_else \_the\_catalogsample \_fi }\_par
+ \_ea \_dosamplesB \_fi
+}
+
+\_def\_wlog#1{\_nobreak\_smallskip
+ \_hbox to\_hsize{\_hskip25pt
+ \_edef\_tmp{#1}\_replstring\_tmp{^^J}{\_par}%
+ \_smalltt \_noindent \_ea \string \_csname \_currfamily\_endcsname
+ \_vtop{\leftskip=1em \_baselineskip=9pt \_tmp \_par}\_hss
+ \_if\_relax\_the\_famfrom\_relax \_else from: \_the\_famfrom \_fi
+ }
+}
+
+\_def\0#1{\_ifnum#1<10 0\_fi\_the#1}
+\_footline={\_hfil\_ttfixed\_the\_pageno\_hfil}
+\_headline={\_ttfixed Font Catalogue generated by \_OpTeX/ \_hfill \_the\_year-\0\_month-\0\_day}
+\_parindent=0pt
+\_ttfixed
+
+\_input fams-ini.opm
+
+\_isfile {fams-local.opm}\_iftrue \_famfrom{}\_input fams-local.opm \_fi
+
+\_endgroup
+
+\parindent=0pt
+
+\nonum\sec Customization of the catalog
+
+
+You can redeclare the printed sample of each font by:
+
+\begtt
+\catalogsample={Hello world!}
+\endtt
+
+before \code{\\fontfam[catalog]} command is used. You can specify
+\code{\\catalogmathsample} if you want to show default math fonts too, for example
+
+\begtt
+\catalogmathsample={Gamma function is defined as
+ $$
+ \Gamma(z) = \int_0^\infty x^{z-1} e^{-x}{\rm d}x, \quad \Re(z)>0.
+ $$}
+\endtt
+%
+The \code{\\catalogmathsample} is empty by default, so math fonts are not loaded,
+only the family of default math font is listed.
+
+\bigskip
+You can restrict the families to be printed in the catalog by:
+
+\begtt
+\catalogonly={Termes, Latin Modern, Heros}
+\endtt
+
+If the \code{\\catalogonly} is empty (this is default value) then all families are
+printed but families listed in the \code{\\catalogexclude} are excluded. For example
+
+\begtt
+\catalogexclude={Latin Modern, XCharter}
+\endtt
+
+The \code{\\cataogexclude} is empty by default.
+
+\bigskip The font families printed in the catalogue must be declared by the
+\code{\\_faminfo} command in the file \code{fams-ini.opm} (declarations used
+as default for \OpTeX/) or in the file \code{fams-local.opm}. The second file
+does not exist by default but users can create it. The syntax rules are
+described in the \code{fams-ini.opm} file.
+
+
+\_endcode % -------------------------------------
+
diff --git a/macros/optex/base/fonts-opmac.opm b/macros/optex/base/fonts-opmac.opm
new file mode 100644
index 0000000000..3ae2f0c5e1
--- /dev/null
+++ b/macros/optex/base/fonts-opmac.opm
@@ -0,0 +1,226 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \typosize {Font managing macros from OPmac <2021-03-10>} % loaded in format
+
+ \_doc -----------------------------
+ \`\typosize` `[<font-size>/<baselineskip>]` sets given parameters.
+ It sets text font size by the \^`\setfontsize` macro and math font sizes
+ by setting internal macros \^`\_sizemtext`, \^`\_sizemscript` and
+ \^`\_sizemsscript`. It uses common concept font sizes: 100\,\%,
+ 70\,\% and 50\,\%.
+ The \^`\_setmainvalues` sets the parameters as main values when
+ the `\_typosize` is called first.
+ \_cod -----------------------------
+
+\_protected\_def \_typosize [#1/#2]{%
+ \_textfontsize{#1}\_mathfontsize{#1}\_setbaselineskip{#2}%
+ \_setmainvalues \_ignorespaces
+}
+\_protected\_def \_textfontsize #1{\_if$#1$\_else \_setfontsize{at#1\_ptunit}\_fi}
+
+\_def \_mathfontsize #1{\_if$#1$\_else
+ \_tmpdim=#1\_ptunit
+ \_edef\_sizemtext{\_ea\_ignorept \_the\_tmpdim \_ptmunit}%
+ \_tmpdim=0.7\_tmpdim
+ \_edef\_sizemscript{\_ea\_ignorept \_the\_tmpdim \_ptmunit}%
+ \_tmpdim=#1\_ptunit \_tmpdim=0.5\_tmpdim
+ \_edef\_sizemsscript{\_ea\_ignorept \_the\_tmpdim \_ptmunit}%
+ \_fi
+}
+\_public \typosize ;
+
+ \_doc -----------------------------
+ \`\typoscale` `[<font-factor>/<baseline-factor>]` scales
+ font size and baselineskip by given factors in respect to current values.
+ It calculates the \^`\typosize` parameters and runs the \^`\typosize`.
+ \_cod -----------------------------
+
+\_protected\_def \_typoscale [#1/#2]{%
+ \_ifx$#1$\_def\_tmp{[/}\_else
+ \_settmpdim{#1}\_optsize
+ \_edef\_tmp{[\_ea\_ignorept\_the\_tmpdim/}\_fi
+ \_ifx$#2$\_edef\_tmp{\_tmp]}\_else
+ \_settmpdim{#2}\_baselineskip
+ \_edef\_tmp{\_tmp \_ea\_ignorept\_the\_tmpdim]}\_fi
+ \_ea\_typosize\_tmp
+}
+\_def\_settmpdim#1#2{%
+ \_tmpdim=#1pt \_divide\_tmpdim by1000
+ \_tmpdim=\_ea\_ignorept \_the#2\_tmpdim
+}
+\_public \typoscale ;
+
+ \_doc -----------------------------
+ \`\_setbaselineskip` `{<baselineskip>}` sets new `\baselineskip` and
+ more values of registers which are dependent on the `<baselineskip>`
+ including the \^`\strutbox`.
+ \_cod -----------------------------
+
+\_def \_setbaselineskip #1{\_if$#1$\_else
+ \_tmpdim=#1\_ptunit
+ \_baselineskip=\_tmpdim \_relax
+ \_bigskipamount=\_tmpdim plus.33333\_tmpdim minus.33333\_tmpdim
+ \_medskipamount=.5\_tmpdim plus.16666\_tmpdim minus.16666\_tmpdim
+ \_smallskipamount=.25\_tmpdim plus.08333\_tmpdim minus.08333\_tmpdim
+ \_normalbaselineskip=\_tmpdim
+ \_jot=.25\_tmpdim
+ \_maxdepth=.33333\_tmpdim
+ \_setbox\_strutbox=\_hbox{\_vrule height.709\_tmpdim depth.291\_tmpdim width0pt}%
+ \_fi
+}
+
+ \_doc -----------------------------
+ \`\_setmainvalues` sets the current font size and `\baselineskip`
+ values to the \`\mainfosize` and \hbox{\`\mainbaselineskip`} registers
+ and loads fonts at given sizes.
+ It redefines itself as \`\_setmainvaluesL`
+ to set the main values only first. The \^`\_setmainvaluesL` does only
+ fonts loading.
+ \nl
+ \`\scalemain` returns to these values if they were set. Else they are set
+ to 10/12\,pt.
+ \nl
+ \`\mfontsrule` gives the rule how math fonts are loaded when \^`\typosize`
+ or \^`\typoscale` are used. The value of \^`\mfontsrule` can be:
+ \begitems
+ * 0: no math fonts are loaded. User must use \^`\normalmath` or \^`\boldmath` explicitly.
+ * 1: `\_normalmath` is run if \^`\typosize`/\^`\typoscale` are used
+ first or they are run at outer group level. No
+ `\everymath`/`\everydisplay` are set in this case. If
+ \^`\typosize`/\^`\typoscale` are run repeatedly in a group then `\_normalmath` is
+ run only when math formula occurs. This is done using
+ `\everymath`/`\everydisplay` and \^`\_setmathfonts`.
+ \^`\mfontsrule=1` is default.
+ * 2: `\_normalmath` is run whenever \^`\typosize`/\^`\typoscale` are used.
+ `\everymath`/`\everydisplay` registers are untouched.
+ \enditems
+ \_cod -----------------------------
+
+\_newskip \_mainbaselineskip \_mainbaselineskip=0pt \_relax
+\_newdimen \_mainfosize \_mainfosize=0pt
+\_newcount \_mfontsrule \_mfontsrule=1
+
+\_def\_setmainvalues {%
+ \_mainbaselineskip=\_baselineskip
+ \_mainfosize=\_optsize
+ \_topskip=\_mainfosize \_splittopskip=\_topskip
+ \_ifmmode \_else \_bf \_it \_bi \_rm \_fi % load all basic variants of the family
+ \_ifnum \_mfontsrule>0 \_normalmath \_fi % load math fonts first
+ \_let \_setmainvalues =\_setmainvaluesL
+}
+\_def\_setmainvaluesL {\_relax \_ifmmode \_else \_rm \_fi % load text font
+ \_ifcase \_mfontsrule % load math fonts
+ \_or \_ifnum\_currentgrouplevel=0 \_normalmath
+ \_else \_everymath={\_setmathfonts}\_everydisplay={\_normalmath}%
+ \_let\_runboldmath=\_relax \_fi
+ \_or \_normalmath \_fi}
+\_def\_scalemain {%
+ \_ifdim \_mainfosize=\_zo
+ \_mainfosize=10pt \_mainbaselineskip=12pt
+ \_let \_setmainvalues=\_setmainvaluesL
+ \_fi
+ \_optsize=\_mainfosize \_baselineskip=\_mainbaselineskip
+}
+\_public \scalemain \mainfosize \mainbaselineskip \mfontsrule ;
+
+ \_doc -----------------------------
+ Suppose following example:
+ `{\typosize[13/15] Let $M$ be a subset of $R$ and $x\in M$...}`
+ If \^`\mfontsrule=1` then \^`\typosize` does not load math fonts
+ immediatelly but at the first math formula. It is done by `\everymath`
+ register, but the contents of this register is processed inside the math
+ group. If we do `\everymath={\_normalmath}` then this complicated macro
+ will be processed three times in your example above. We want only one
+ pocessing, so we do `\everymath={`\`\_setmathfonts``}` and
+ this macro closes math mode first, loads fonts and opens math mode again.
+ \_cod -----------------------------
+
+\_def\_setmathfonts{$\_normalmath\_everymath{}\_everydisplay{}$}
+
+ \_doc -----------------------------
+ \`\thefontsize` `[<size>]` and \`\thefontscale` `[<factor>]`
+ do modification of the size of the current font. They are implemented by the
+ \^`\newcurrfontsize` macro.
+ \_cod -----------------------------
+
+\_protected\_def\_thefontsize[#1]{\_if$#1$\_else
+ \_tmpdim=#1\_ptunit
+ \_newcurrfontsize{at\_tmpdim}%
+ \_fi
+ \_ignorespaces
+}
+\_protected\_def\_thefontscale[#1]{\_ifx$#1$\_else
+ \_tmpdim=#1pt \_divide\_tmpdim by1000
+ \_tmpdim=\_ea\_ea\_ea\_ignorept \_pdffontsize\_font \_tmpdim
+ \_newcurrfontsize{at\_tmpdim}%
+ \_fi
+ \_ignorespaces
+}
+\_public \thefontsize \thefontscale ;
+
+ \_doc -----------------------------
+ \`\em` keeps the weight of the current variant and switches
+ roman $\leftrightarrow$ italic. It adds the italic correction by
+ the \`\_additcorr` and \`\_afteritcorr` macros. The second does not
+ add italic correction if the next character is dot or comma.
+ \_cod -----------------------------
+
+\_protected\_def\_em {%
+ \_ea\_ifx \_the\_font \_tenit \_additcorr \_rm \_else
+ \_ea\_ifx \_the\_font \_tenbf \_bi\_aftergroup\_afteritcorr\_else
+ \_ea\_ifx \_the\_font \_tenbi \_additcorr \_bf \_else
+ \_it \_aftergroup\_afteritcorr\_fi\_fi\_fi
+}
+\_def\_additcorr{\_ifdim\_lastskip>\_zo
+ \_skip0=\_lastskip \_unskip\_italcorr \_hskip\_skip0 \_else\_italcorr \_fi}
+\_def\_afteritcorr{\_futurelet\_next\_afteritcorrA}
+\_def\_afteritcorrA{\_ifx\_next.\_else\_ifx\_next,\_else \_italcorr \_fi\_fi}
+\_let\_italcorr=\/
+
+ \_doc -----------------------------
+ The \`\boldify` macro does `\let\rm\bf`, `\let\it\bi` and
+ `\let\normalmath=\boldmath`. All following text will be in bold.
+ If should be used after \^`\typosize` or \^`\typoscale` macros.\nl
+ The internal \`\_runboldmath` macro runs `\_boldmath` immediatelly
+ if no delay of the math font loading is set by \^`\_setmainvaluesL`.\nl
+ The `\rm`, `\it` in math mode must keep its original meaning.
+ \_cod -----------------------------
+
+\_protected\_def \_boldify {%
+ \_let \_setmainvalues=\_setmainvaluesL
+ \_let\it =\_bi \_let\rm =\_bf \_let\_normalmath=\_boldmath \_bf
+ \_runboldmath
+ \_ifx\_ncharrmA\_undefined \_protected\_addto\rm{\_fam0 }\_protected\_addto\it{\_fam1 }%
+ \_else \_protected\_def\rm {\_tryloadbf \_tenbf \_inmath{\_rmvariables \_rmdigits}}%
+ \_protected\_def\it {\_tryloadbi \_tenbi \_inmath{\_itvariables}}%
+ \_fi
+}
+\_def\_runboldmath{\_boldmath}
+
+\_public \em \boldify ;
+
+ \_doc -----------------------------
+ We need to use a font selector for default pagination. Because we don't
+ know what default font size will be selected by the user, we use this
+ \`\_rmfixed` macro. It sets the `\rm` font from the default font size
+ (declared by first \^`\typosize` command and redefines itself be only
+ the font switch for the next pages.
+ \_cod -----------------------------
+
+\_def \_rmfixed {% used in default \footline
+ {\_ifdim\_mainfosize=0pt \_mainfosize=10pt \_fi
+ \_fontdef\_tenrm{\_setfontsize{at\mainfosize}\_resetmod\_rm}%
+ \_global\_let\_rmfixed=\_tenrm}% next use will be font switch only
+ \_rmfixed
+}
+\_let \rmfixed = \_tenrm % user can redefine it
+
+\_endcode % -------------------------------------
+
+History:
+2021-03-10 \boldify corrected
+2021-03-09 \mfontsrule and \_setmathfonts introduced
+2020-12-12 \_rmfixed fixed
+2020-04-28 \boldify: removed \let\_rm=\_bf
+2020-04-14 \_setmainvaluesL: \_ifmmode test added
+2020-03-27 \_setmainvalues: \_splittopskip=\_topskip added
diff --git a/macros/optex/base/fonts-preload.opm b/macros/optex/base/fonts-preload.opm
new file mode 100644
index 0000000000..712730436c
--- /dev/null
+++ b/macros/optex/base/fonts-preload.opm
@@ -0,0 +1,36 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \tenrm {Latin Modern fonts (EC) preloaded <2020-01-23>} % loaded in format
+
+% Only few text fonts are preloaded:
+
+\_font\_tenrm=ec-lmr10 % roman text
+\_font\_tenbf=ec-lmbx10 % boldface extended
+\_font\_tenit=ec-lmri10 % text italic
+\_font\_tenbi=ec-lmbxi10 % bold italic
+\_font\_tentt=ec-lmtt10 % typewriter
+\_tenrm
+
+\_public \tenrm \tenbf \tenit \tenbi \tentt ;
+
+\_endcode %---------------------------------------------------
+
+The format in lua\TeX/ can download only non-Unicode fonts. Latin Modern EC is
+loaded here. These fonts are totally unusable in LuaTeX when languages with out
+of ASCII or ISO-8859-1 alphabets are used (for example Czech). We load only
+a few 8bit fonts here especially for simple testing the format.
+But, if the user needs to do more serious work, he/she can
+use `\fontfam` macro to load a selected font family of Unicode fonts.
+
+We have a dilemma: when the Unicode fonts cannot be preloaded in the format then the basic
+font set can be loaded by `\everyjob`. But why to load a set of fonts at the
+beginning of every job when it is highly likely that the user will
+load something completely different. Our decision is: there is a basic 8bit
+font set in the format (for testing purposes only) and the user should load
+a Unicode font family at beginning of the document.
+
+The fonts selectors \`\tenrm`, \`\tenbf`, \`\tenit`, \`\tenbi`, \`\tentt`
+are declared as `\public` here but only for backward compatibility. We don't
+use them in the Font Selection System. But the protected versions of these
+control sequences are used in the Font Selection System.
+
diff --git a/macros/optex/base/fonts-resize.opm b/macros/optex/base/fonts-resize.opm
new file mode 100644
index 0000000000..ac0064df10
--- /dev/null
+++ b/macros/optex/base/fonts-resize.opm
@@ -0,0 +1,354 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \setfontsize {Font resizing macros <2020-04-17>} % preloaded in format
+
+ \_doc -----------------------------
+ The \`\setfontsize` `{<sizespec>}` saves the `<sizespec>` to the \`\_sizespec` macro.
+ The \`\_optsize` value is calculated from the `<sizespec>`.
+ If the `<sizepec>` is in the `mag<number>` format then the contents of
+ the `\_sizespec` macro is re-calculated to the `at<dimen>` format using
+ previous `\_optsize` value.
+ \par \goodbreak
+ \_cod -----------------------------
+
+\_newdimen \_optsize \_optsize=10pt
+\_newdimen \_defaultoptsize \_defaultoptsize=10pt
+\_newdimen\_lastmagsize
+
+\_def\_setfontsize #1{%
+ \_edef\_sizespec{#1}%
+ \_ea \_setoptsize \_sizespec\_relax
+ \_reloading
+}
+\_def\_setoptsize {\_isnextchar a{\_setoptsizeA}
+ {\_isnextchar m{\_setoptsizeC}{\_setoptsizeB}}}
+\_def\_setoptsizeA at#1\_relax{\_optsize=#1\_relax\_lastmagsize=\_optsize} % at<dimen>
+\_def\_setoptsizeB scaled#1\_relax{\_optsize=\_defaultoptsize\_relax} % scaled<scalenum>
+\_def\_setoptsizeC mag#1\_relax{%
+ \_ifdim\_lastmagsize>\_zo \_optsize=\_lastmagsize \_else \_optsize=\_pdffontsize\_font \_fi
+ \_optsize=#1\_optsize
+ \_lastmagsize=\_optsize
+ \_edef\_sizespec{at\_the\_optsize}%
+}
+\_public \setfontsize \defaultoptsize ;
+
+ \_doc -----------------------------
+ \`\_resizefont` `{<variant-name>}\<font switch>`,
+ for example `\resizefont{bf}\_tenbf` resizes the font given by the
+ variant. The variant `XX` have its font switch `\_tenXX`.
+ The \`\_doresizefont``\fontswitch` is used. It works in
+ TFM mode (\`\_doresizetfmfont`) or OTF mode (\^`\_doresizeunifont`).
+ In both modes, it does
+ \begtt \catcode`\<=13
+ \_font \_tenXX = <fontname> \_sizespec
+ \endtt
+ The `<fontname>` is generated by the `\fontname` \TeX/ primitive where
+ \`\_rfontskipat` removes the `at<dimen>` part of the `\_fontname` output.
+ The `<fontname>` is generated differently in OTF mode, see
+ \^`\_doresizeunifont` macro.\nl
+ The \`\_whatresize` is defined as `<variant-name>`.
+ \_cod -----------------------------
+
+\_def\_resizefont#1#2{%
+ \_edef\_whatresize{#1}%
+ \_ifx \_fontselector \_undefined \_doresizefont#2%
+ \_else \_ea \_doresizefont \_fontselector \_fi
+ \_lastmagsize=\_zo
+ \_slet{_tryload#1}{_relax}%
+}
+\_def\_doresizetfmfont#1{\_logfont{#1}%
+ \_ea\_font\_ea#1\_ea\_rfontskipat
+ \_fontname \_cs{_ten\_whatresize} \_relax\_space \_sizespec \_relax
+}
+\_let\_doresizefont=\_doresizetfmfont
+\_def\_logfont#1{} % default is no logging of used fonts
+
+\_def\_rfontskipat#1{\_ifx#1"\_ea\_rfskipatX \_else\_ea\_rfskipatN\_ea#1\_fi}
+\_def\_rfskipatX #1" #2\_relax{"\_whichtfm{#1}"}
+\_def\_rfskipatN #1 #2\_relax{\_whichtfm{#1}}
+
+ \_doc -----------------------------
+ \`\fontdef` `<font switch>{<modifiers><variant selector>}`
+ opens group, runs `<modifiers><variant selector>` (i.e.\ it runs `#2` parameter).
+ The font switch `#1` saved in the \`\_fontselector` macro is re-declared
+ because the variant selector runs the \^`\_resizefont`. Now, we need to
+ keep the current meaning of the font switch `#1` but we must leave the
+ opened group. This is done by the \`\_keepmeaning` macro.
+ \nl
+ \`\fontlet` `<font switch A> <font switch B> <size spec>` does
+ \begtt \catcode`\<=13
+ \font <font switch A> = <fontname> <sizespec>
+ \endtt
+ The `<fontname>` is extracted using the primitive command `\_fontname <font switch B>`.
+ \_cod -----------------------------
+
+\_def \_fontdef #1#2{\_begingroup
+ \_ifx\_fontselector\_undefined \_def\_fontselector{#1}\_fi
+ \_reloading #2%
+ \_ea \_keepmeaning \_fontselector \_endgroup
+}
+\_def\_fontlet#1#2{\_ifx #2=\_ea\_fontlet \_ea#1\_else
+ \_ea\_font\_ea#1\_ea\_rfontskipat\_fontname#2 \_relax\_space \_fi
+}
+\_def \_keepmeaning #1#2{\_global\_let\_keepmeaningdata=#1%
+ #2\_let#1=\_keepmeaningdata \_global\_let\_keepmeaningdata=\_undefined
+}
+\_public \fontdef \fontlet ;
+
+ \_doc -----------------------------
+ \`\newcurrfontsize` `<size spec>` sets current font size to the `<size spec>`
+ It is implemented by \^`\fontlet`.
+ The font switch of the current font is extracted by `\_the\_font`.
+ We must re-create the control sequence `\_the\_font` because
+ its original meaning is set to \"inaccessible" by \TeX/ when `\font`
+ primitive is started.
+ \nl
+ \`\resizethefont` is implemented by `\newcurrfontsize` using data from
+ the \^`\_sizespec` macro.
+ \_cod -----------------------------
+
+\_def \_newcurrfontsize #1{% \newcurrfontsize{at25pt}
+ \_edef\_tmp{\_ea\_csstring \_the\_font}%
+ \_ea \_fontlet \_csname \_tmp\_ea\_endcsname \_the\_font \_space #1\_relax
+ \_csname \_tmp\_endcsname
+}
+\_protected\_def \_resizethefont{\_newcurrfontsize\_sizespec}
+
+ \_public \newcurrfontsize \resizethefont ;
+
+ \_doc -----------------------------
+ The variant selector is defined by `\protected\def\XX{\_tryloadXX \_tenXX}`
+ The `\_tryloadXX` can be in `\_relax` state if no font modifiers were
+ declared. But normally it does \^`\_resizefont``{XX}\tenXX`. This meaning
+ is activated by the \`\_reloading` macro.
+ \_cod -----------------------------
+
+\_def\_reloading{\_loadf{rm}\_tenrm \_loadf{bf}\_tenbf
+ \_loadf{it}\_tenit \_loadf{bi}\_tenbi
+}
+\_def\_loadf#1#2{\_sdef{_tryload#1}{\_ifmmode \_else \_resizefont{#1}#2\_fi}}
+\_def\_tryloadtt{\_resizefont{tt}\_tentt}
+
+\_let\_tryloadrm=\_relax
+\_let\_tryloadbf=\_relax
+\_let\_tryloadit=\_relax
+\_let\_tryloadbi=\_relax
+
+ \_doc ----------------------------
+ The font selection system allows to use \`\currvar`
+ instead explicitly specified variant selector. The current variant
+ is extracted from `\the\font` output which could be `\_tenXX` control
+ sequence. Then `\currvar` expands to `\_rm` or `\_it` etc.
+ \_cod ----------------------------
+
+\_protected \_def \_currvar{\_cs{_currvar:\_ea \_csstring \_the\_font}}
+\_sdef{_currvar:_tenrm}{\_rm}
+\_sdef{_currvar:_tenbf}{\_bf}
+\_sdef{_currvar:_tenit}{\_it}
+\_sdef{_currvar:_tenbi}{\_bi}
+\_sdef{_currvar:_tentt}{\_tt}
+\_public \currvar ;
+
+ \_doc -----------------------------
+ The \`\_regtfm` `<font id> <optical size data>`
+ saves the <optical size data> concerned to `<font id>`.
+ The `<optical size data>` is in the form as shown below in the code where
+ `\_regtfm` is used.
+ \nl
+ The \`\_wichtfm` `<fontname>` expands to the `<fontname>` or to the corrected
+ `<fontname>` read from the `<optical size data>`. It is used in the
+ \^`\_rfontskipat` macro and it is used in \^`\fontlet` macro.
+ It means that each `<fontname>` generated by the `\fontname` primitive in the
+ `\fontlet` macro is processed by the `\_whichtfm`. The real `<fontname>` or
+ corrected `<fontname>` (depending on the optical data does not exist or exist)
+ is the output of the expansion before `\font` primitive takes this output
+ as its parameter.
+
+ The implementation detail: The `\_<font id>:reg` is defined as the
+ `<optical size data>` and all control sequences `\_<fontname>:reg`
+ from this data line have the same meaning because of the
+ \`\_reversetfm` macro. The `\_whichtfm` expands this data line and apply
+ \`\_dowhichtfm`. This macro selects the right result from the data line
+ by testing with the current `\_optsize` value.
+ \_cod -----------------------------
+
+\_def\_regtfm #1 0 #2 *{\_ea\_def \_csname _#1:reg\_endcsname{#2 16380 \_relax}%
+ \_def\_tmpa{#1}\_reversetfm #2 * %
+}
+\_def\_reversetfm #1 #2 {% we need this data for \_setmathfamily
+ \_ea\_let\_csname _#1:reg\_ea\_endcsname
+ \_csname _\_tmpa:reg\_endcsname
+ \_if*#2\_else \_ea\_reversetfm \_fi
+}
+\_def\_whichtfm #1{%
+ \_ifcsname _#1:reg\_endcsname
+ \_ea\_ea\_ea \_dowhichtfm
+ \_csname _#1:reg\_ea\_endcsname
+ \_else
+ #1%
+ \_fi
+}
+\_def\_dowhichtfm #1 #2 {%
+ \_ifdim\_optsize<#2pt #1\_ea\_ignoretfm\_else \_ea\_dowhichtfm
+\_fi
+}
+\_def\_ignoretfm #1\_relax{}
+
+ \_doc -----------------------------
+ Optical sizes data for preloaded 8bit Latin Modern fonts:
+ \_cod -----------------------------
+
+\_regtfm lmr 0 ec-lmr5 5.5 ec-lmr6 6.5 ec-lmr7 7.5 ec-lmr8 8.5 ec-lmr9 9.5
+ ec-lmr10 11.1 ec-lmr12 15 ec-lmr17 *
+\_regtfm lmbx 0 ec-lmbx5 5.5 ec-lmbx6 6.5 ec-lmbx7 7.5 ec-lmbx8 8.5 ec-lmbx9 9.5
+ ec-lmbx10 11.1 ec-lmbx12 *
+\_regtfm lmri 0 ec-lmri7 7.5 ec-lmri8 8.5 ec-lmri9 9.5 ec-lmri10 11.1 ec-lmri12 *
+\_regtfm lmtt 0 ec-lmtt8 8.5 ec-lmtt9 9.5 ec-lmtt10 11.1 ec-lmtt12 *
+
+\_setfontsize {at10pt} % default font size
+
+\_endcode %---------------------------------------------------
+
+
+\sec[setfontsize] Scaling fonts in text mode (low-level macros)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\secc The `\setfontsize` macro
+
+The \^`\setfontsize` `{<size spec>}`
+saves the information about `<size spec>`. This information is taken into
+account when a variant selector (for example `\rm`, `\bf`, `\it`, `\bi`)
+or `\resizethefont` is used. The `<size spec>` can be:
+\begitems
+* `at<dimen>`, for example `\setfontsize{at12pt}`. It gives the desired font size directly.
+* `scaled<scale factor>`, for example `\setfontsize{scaled1200}`. The font is
+ scaled in respect to its native size (which is typically 10\,pt). It
+ behaves like `\font\... scaled<number>`.
+* `mag<decimal number>`, for example `\setfontsize{mag1.2}`. The font is
+ scaled in respect to the current size of the fonts given by the previous
+ \^`\setfontsize` command.
+\enditems
+The initialization value in \OpTeX/ is given by `\setfontsize{at10pt}`.
+
+The \^`\resizethefont` resizes the currently selected font to the size given by previous
+\^`\setfontsize`. For example
+
+\begtt
+ The 10 pt text is here,
+\setfontsize{at12pt} the 10 pt text is here unchanged...
+\resizethefont and the 12 pt text is here.
+\endtt
+%
+The \^`\setfontsize` command acts like {\em font modifier}. It means that it
+saves information about fonts but does not change the font actually until
+variant selector or \^`\resizethefont` is used.
+
+The following example demonstrates the `mag` format of \^`\setfontsize`
+parameter. It is only a curious example probably not used in practical
+typography.
+
+\begtt
+\def\smaller{\setfontsize{mag.9}\resizethefont}
+Text \smaller text \smaller text \smaller text.
+\endtt
+
+\secc[fontprimitive] The `\font` primitive
+
+If you load a font directly by `\font` primitive and you want to
+create a size-dependent selector for such font then you can use
+\~`\resizethefont`:
+
+\begtt
+\font\tencomfortaa=Comfortaa-Regular-T1 at10pt
+\def\comfortaa{\tencomfortaa\resizethefont}
+
+\comfortaa The 10 pt text is here
+\setfontsize{at12pt}
+\comfortaa The 12 pt text is here
+\endtt
+%
+The example above uses the 8\,bit `tfm` font. You can use Unicode font too, of
+course. The \^`\fontfam` macro initializes the extended `\font` primitive
+features for \LuaTeX/ (see section \ref[exfont]).
+If you didn't use this command, you must initialize
+these features by the \^`\initunifonts` command explicitly, for example:
+
+\begtt
+\initunifonts
+\font\tencyklop=[cyklop-regular] at10pt % the font cyklop-regular.otf is loaded
+\def\cyklop{\tencyklop\resizethefont}
+
+\cyklop The 10 pt text is here
+\setfontsize{at12pt}
+\cyklop The 12 pt text is here
+\endtt
+
+\secc[fontdef] The \code{\\fontdef} declarator
+
+You can declare `\<newfont>` by the \~`\fontdef` command.
+
+\begtt \catcode`\<=13
+ \fontdef \<newfont> {<font modifiers> \<variant-selector>}
+ example:
+ \fontdef \bigfont {\setfontsize{at15pt}\bf}
+\endtt
+%
+This command runs `<font modifiers> \<variant-selector>` in an internal group and sets the
+resulting selected font as `\<newfont>`.
+
+The resulting `\<newfont>` declared by \~`\fontdef` is \"fixed font switch"
+independent of \^`\setfontsize` and other font modifiers. More exactly, it is
+a fixed font switch when it is used but it can depend on the current font
+modifiers and font family and given font modifiers when it is declared.
+
+The parameter of the \~`\fontdef` macro must be exactly finished by the
+variant selector. More information about font modifiers
+and variant selectors are in the section~\ref[fontsystem].
+
+\secc[fontlet] The \code{\\fontlet} declarator
+
+We have another command for scaling: \^`\fontlet` which can resize
+arbitrary font given by its font switch.
+This font switch was declared by the
+`\font` primitive or the \~`\fontdef` macro.
+
+\begtt \catcode`\<=13
+ \fontlet \<newfont> = \<fontswitch> <sizespec>
+ example:
+ \fontlet \bigfont = \_tenbf at15pt
+\endtt
+
+The resulted `\bigfont` is the same as in the previous example where \~`\fontdef`
+was used. The advantage of \~`\fontdef` macro will be more clear when you load
+font families by `\fontfam` and you are using more font modifiers declared
+in such families.
+
+Summary: you can declare font switches:
+\begitems
+* by the `\font` primitive if you know the font file,
+* by the \^`\fontlet` command if you know the font switch and the size, or
+* by the \~`\fontdef` command if you know the variant and modifiers.
+\enditems
+
+\secc Optical sizes
+
+There are font families with more font files where almost the same font is
+implemented in various design sizes: `cmr5`, `cmr6`, `cmr7`, `cmr8`, `cmr9`,
+`cmr10`, `cmr12`, `cmr17` for example. This feature is called \"optical
+sizes". \OpTeX/ chooses a font with an optical size closest to desired size
+specified by the \^`\setfontsize`, when `at<dimen>` or `mag<coefficient>` is used.
+When `scaled<scale factor>` is used then optical size is chosen using the value
+of the `\defaultoptsize` register and such font is scaled by the specified
+`<scale factor>`. There is `\defaultoptsize=10pt` by default.
+
+Font collections with optical sizes must be registered by the
+\^`\_regtfm` for `tfm` files or \^`\_regoptsizes` for Unicode fonts.
+\OpTeX/ registers 8bit Latin Moder fonts in the format (`fonts-resize.opm` file)
+and OTF Latin Modern fonts in the `f-lmfonts.opm` file.
+
+\secc Implementation notes
+
+\_endinput
+
+2020-04-17 \resizethefont introduced
+2020-03-17 released
diff --git a/macros/optex/base/fonts-select.opm b/macros/optex/base/fonts-select.opm
new file mode 100644
index 0000000000..740b311a67
--- /dev/null
+++ b/macros/optex/base/fonts-select.opm
@@ -0,0 +1,846 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \fontfam {Fonts selection system <2021-02-25>} % preloaded in format
+
+ \_doc -----------------------------
+ \`\initunifonts` macro extends \LuaTeX's font capabalities,
+ in order to be able to load Unicode fonts. Unfortunately, this part of
+ \OpTeX/ depends on `luaotfload` package, which adapts Con\TeX/t's generic
+ font loader for plain \TeX/ and \LaTeX. `luaotfload` uses Lua functions
+ from \LaTeX's `luatexbase` namespace, we provide our own replacements.
+ Moreover, `\initunifont` switches with
+ the \^`\_doresizefont` macro to OTF mode which is represented by the
+ macro \`\_doresizeunifont`. This mode includes
+ a fallback to TFM mode if \^`\_fontnamegen` is not defined.
+ Finally, `\initunifonts` sets itself to relax because we don't want to do
+ this work twice.\nl
+ \`\_ttunifont` is default font for `\tt` variant if
+ `f-lmfonts.opm` (or another font file where `\tt` is declared) is not loaded.
+ \_cod -----------------------------
+
+\_def\_initunifonts {%
+ \directlua{%
+ require('luaotfload-main')
+ luaotfload.main()
+ }%
+ \_gdef\_rfskipatX ##1" ##2\_relax{"##1"}%
+ \_global\_let \_doresizefont=\_doresizeunifont
+ \_gdef\_tryloadtt {\_fontdef\_tentt{\_let\_fontnamegen=\_ttunifont\_rm}}%
+ \_global\_let \_initunifonts=\_relax % we need not to do this work twice
+ \_global\_let \initunifonts=\_relax
+}
+\_gdef\_doresizeunifont #1{\_logfont{#1}%
+ \_ifx\_fontnamegen\_undefined \_doresizetfmfont#1\_else
+ \_font#1={\_fontnamegen} \_sizespec \_relax \_setwsp#1\_relax
+ \_fi
+}
+\_def\_ttunifont{[lmmono10-regular]:\_fontfeatures-tlig;}
+
+\_public \initunifonts ;
+
+ \_doc -----------------------------
+ The \`\_famdecl` `[<Family Name>] \<Famselector> {<comment>} {<modifiers>} {<variants>} {<math>}`\nl
+ `{<font for testing>} {\def`\^`\_fontnamegen``{<data>}}` runs \^`\initunifonts`, then
+ checks if `\<Famselector>` is defined. If it is true, then closes the file by
+ `\endinput`. Else it defines `\<Famselector>` and saves it to the
+ internal `\_f:<currfamily>:main.fam` command.
+ The macro \`\_initfontfamily` needs it. The \`\_currfamily` is set
+ to the `<Famselector>` because the following \^`\moddef` commands need to
+ be in the right font family context. The `\_currfamily` is set to the
+ `<Famselector>` by the `\<Famselector>` too, because `\<Famselector>`
+ must set the right font family context. The font family context is given by the current
+ `\_currfamily` value and by the actual meaning of the \^`\_fontnamegen` macro.
+ The \`\_mathfaminfo` is saved for usage in the catalog.
+ \_cod -----------------------------
+
+\_def\_famdecl [#1]#2#3#4#5#6#7#8{%
+ \_initunifonts \_uniaccents
+ \_unless\_ifcsname _f:\_csstring#2:main.fam\_endcsname
+ \_isfont{#7}\_iffalse
+ \_opwarning{Family [#1] skipped, font "#7" not found}\_ea\_ea\_ea\_endinput \_else
+ \_edef\_currfamily {\_csstring #2}\_def\_mathfaminfo{#6}%
+ \_wterm {FONT: [#1] -- \_string#2 \_detokenize{(#3)^^J mods:{#4} vars:{#5} math:{#6}}}%
+ \_unless \_ifx #2\_undefined
+ \_opwarning{\_string#2 is redefined by \_string\_famdecl\_space[#1]}\_fi
+ \_protected\_edef#2{\_def\_noexpand\_currfamily{\_csstring #2}\_unexpanded{#8\_resetfam}}%
+ \_ea \_let \_csname _f:\_currfamily:main.fam\_endcsname =#2%
+ \_fi
+ \_else \_csname _f:\_csstring#2:main.fam\_endcsname \_reloading \_rm \_ea \_endinput \_fi
+}
+\_def\_initfontfamily{%
+ \_csname _f:\_currfamily:main.fam\_endcsname \_reloading \_rm
+}
+
+ \_doc -----------------------------
+ \`\_regoptsizes` `<internal-template> <left-output>?<right-output> <resizing-data>`
+ prepares data for using by the \`\_optname` `<internal-template>` macro.
+ The data are saved to the `\_oz:<internal-template>` macro.
+ When the `\_optname` is expanded then the data are scanned by the macro
+ \`\_optnameA` `<left-output>?<right-output> <mid-output> `\code{<}`<size>`
+ in the loop.\nl
+ \`\_optfontalias` `{<template A>}{<template B>}` is defined as
+ `\let\_oz:<templateA>=\_oz:<templateB>`.
+ \_cod -----------------------------
+
+\_def\_regoptsizes #1 #2?#3 #4*{\_sdef{_oz:#1}{#2?#3 #4* }}
+\_def\_optname #1{\_ifcsname _oz:#1\_endcsname
+ \_ea\_ea\_ea \_optnameA \_csname _oz:#1\_ea\_endcsname
+ \_else \_failedoptname{#1}\_fi
+}
+\_def\_failedoptname #1{optname-fails:(#1)}
+\_def\_optnameA #1?#2 #3 <#4 {\_ifx*#4#1#3#2\_else
+ \_ifdim\_optsize<#4pt #1#3#2\_optnameC
+ \_else \_afterfifi \_optnameA #1?#2 \_fi\_fi
+}
+\_def\_optnameC #1* {\_fi\_fi}
+\_def\_afterfifi #1\_fi\_fi{\_fi\_fi #1}
+\_def\_optfontalias #1#2{\_slet{_oz:#1}{_oz:#2}}
+
+ \_doc -----------------------------
+ \`\_fvars` `<rm-template> <bf-template> <it-template> <bi-template>`
+ saves data for usage by the `\_currV` macro. If a template is only dot
+ then previous template is used (it can be used if the font family doesn't
+ dispose with all standard variants).
+ \nl
+ \`\_currV` expands to a template declared by `\_fvars` depending on the
+ `<variant name>`. Usable only of standard four variants. Next variants
+ can be declared by the \^`\famvardef` macro.
+ \nl
+ \`\_fsetV` `<key>=<value>,...,<key>=<value>` expands to
+ `\def\_<key>V{<value>}` in the loop.
+ \nl
+ \`\_onlyif` `<key>=<value-a>,<value-b>...,<value-z>: {<what>}`
+ runs <what> only if the `\_<key>V` is defined as `<value-a>` or
+ `<value-b>` or ... or `<value-z>`.
+ \nl
+ \`\_prepcommalist` `ab,{},cd,\_end,` expands to `ab,,cd,` (auxiliary macro
+ used in `\_onlyif`).
+ \_cod -----------------------------
+
+\_def\_fvars #1 #2 #3 #4 {%
+ \_sdef{_fvar:rm}{#1}%
+ \_sdef{_fvar:bf}{#2}%
+ \_ifx.#2\_slet{_fvar:bf}{_fvar:rm}\_fi
+ \_sdef{_fvar:it}{#3}%
+ \_ifx.#3\_slet{_fvar:it}{_fvar:rm}\_fi
+ \_sdef{_fvar:bi}{#4}%
+ \_ifx.#4\_slet{_fvar:bi}{_fvar:it}\_fi
+}
+\_def\_currV{\_cs{_fvar:\_whatresize}}
+\_def\_V{ }
+\_def \_fsetV #1 {\_fsetVa #1,=,}
+\_def \_fsetVa #1=#2,{\_isempty{#1}\_iffalse
+ \_ifx,#1\_else\_sdef{_#1V}{#2}\_ea\_ea\_ea\_fsetVa\_fi\_fi
+}
+\_def \_onlyif #1=#2:#3{%
+ \_edef\_act{\_noexpand\_isinlist{,\_prepcommalist #2,\_end,}{,\_cs{_#1V},}}\_act
+ \_iftrue #3\_fi
+}
+\_def\_prepcommalist#1,{\_ifx\_end#1\_empty\_else #1,\_ea\_prepcommalist\_fi}
+
+ \_doc -----------------------------
+ The \`\moddef` `\<modifier> {<data>}` simply speaking does
+ `\def\<modifier>{<data>}`, but we need to respect
+ the family context. In fact, `\protected\def\_f:<current family>:<modifier>{<data>}` is
+ performed and the `\<modifier>` is defined as
+ \`\_famdepend``\<modifier>{_f:\_currfamily:<modifier>}`. It expands to
+ `\_f:\_currfamily:<modifier>` value if it is defined or it prints
+ the warning. When the `\_currfamily` value is
+ changed then we can declare the same `\<modifier>` with a different meaning.
+
+ When a user declares a prefixed variant of the `\<modifier>` then unprefixed
+ modifier name is used in internal macros, this is the reason why we are using
+ the \`\_remifirstunderscore``\_tmp` (where `\_tmp` expands to
+ `_<something>` or to `<something>`. The `\_remifirstunderscore`
+ redefines `\_tmp` in the way that it
+ expands only to `<something>` without the first `_`.
+
+ \`\_setnewmeaning` `<cs-name>=\_tmpa <by-what>` does exactly `\_let <csname>=\_tmpa`
+ but warning is printed if <cs-name> is defined already and it is not a variant
+ selector or font modifier.
+
+ \`\_addtomodlist` `<font modifier>` adds given modifier to \`\_modlist`
+ macro. This list is used after `\resetmod` when a new family is selected by
+ a family selector, see \`\_resetfam` macro.
+ This allows reinitializing the same current modifiers in the font context
+ after the family is changed.
+ \_cod -----------------------------
+
+\_def \_moddef #1#2{\_edef\_tmp{\_csstring#1}%
+ \_sdef{_f:\_currfamily:\_tmp}{\_addtomodlist#1#2\_reloading}%
+ \_protected \_edef \_tmpa{\_noexpand\_famdepend\_noexpand#1{_f:\_noexpand\_currfamily:\_tmp}}%
+ \_setnewmeaning #1=\_tmpa \moddef
+}
+\_protected \_def\_resetmod {\_cs{_f:\_currfamily:resetmod}} % private variant of \resetmod
+\_def \_resetfam{\_def\_addtomodlist##1{}\_resetmod
+ \_edef \_modlist{\_ea}\_modlist
+ \_let\_addtomodlist=\_addtomodlistb
+}
+\_def \_currfamily{} % default current family is empty
+\_def \_modlist{} % list of currently used modifiers
+
+\_def \_addtomodlist#1{\_addto\_modlist#1}
+\_let \_addtomodlistb=\_addtomodlist
+
+\_def\_famdepend#1#2{\_ifcsname#2\_endcsname \_csname#2\_ea\_endcsname \_else
+ \_ifx\_addtomodlist\_addtomodlistb
+ \_opwarning{\_string#1 is undeclared in family "\_currfamily", ignored}\_fi\_fi
+}
+\_def\_setnewmeaning #1=\_tmpa#2{%
+ \_ifx #1\_undefined \_else \_ifx #1\_tmpa \_else
+ \_opwarning{\_string#1 is redefined by \_string#2}%
+ \_fi\_fi
+ \_let#1=\_tmpa
+}
+\_public \moddef ;
+
+ \_doc -----------------------------
+ The \`\famvardef` `\<XX> {<data>}`
+ uses analogical trick like \^`\moddef` with
+ the \^`\_famdepend` macro. The auxiliary
+ \`\_famvardefA` `\<XX> \_ten<XX> \_tryload<XX> {<data>}` is used.
+ It does:
+ \begitems
+ * `\def \_tryload:<currfam>:<XX> {`\^`\fontdef`` \_ten<XX> {<data>}}` loads font `\_ten<XX>`,
+ * `\protected\def \<XX> {\_famdepend \<XX> {_f:<currfam>:<XX>}}`,
+ * `\def \_f:<currfam>:<XX> {\_tryload:<currfam>:<XX>\_ten<XX>}` keeps family dependent definition,
+ * `\def \_currvar:_ten<XX> {\<XX>}` in order to the \^`\currvar` macro work correctly.
+ \enditems
+ `\famvardef\tt` behaves somewhat differently: it doesn't re-define the
+ `\tt` macro which is defined as `\_tryloadtt \_tentt` in sections~\ref[math-preload]
+ and~\ref[unimath-codes]. It only re-defines the internal `\_tryloadtt` macro.
+ \_cod -----------------------------
+
+\_def\_famvardef#1{\_edef\_tmp{\_csstring#1}%
+ \_ea\_famvardefA \_ea#1\_csname _ten\_tmp\_ea\_endcsname
+ \_csname _tryload:\_currfamily:\_tmp\_endcsname
+}
+\_def\_famvardefA #1#2#3#4{% #1=\XX #2=\_tenXX #3=\_tryload:currfam:XX #4=data
+ \_isinlist{.\_rm\_bf\_it\_bi\currvar\_currvar}#1\_iftrue
+ \_opwarning{\_string\famvardef:
+ You cannot re-declare standard variant selector \_string#1}%
+ \_else
+ \_def#3{\_fontdef#2{#4}}%
+ \_protected\_edef\_tmpa{\_noexpand\_famdepend\_noexpand#1{_f:\_noexpand\_currfamily:\_tmp}}%
+ \_ifx #1\_tt \_let\_tryloadtt=#3\_else \_setnewmeaning #1=\_tmpa \famvardef \_fi
+ \_sdef{_f:\_currfamily:\_tmp}{#3#2}%
+ \_sdef{_currvar:\_csstring#2}{#1}%
+ \_fi
+}
+\_public \famvardef ;
+
+ \_doc -----------------------------
+ The \`\fontfam` `[<Font Family>]` does:
+ \begitems
+ * Convert its parameter to lower case and without spaces, e.g.\ `<fontfamily>`.
+ * If the file `f-<fontfamily>.opm` exists read it and finish.
+ * Try to load user defined `fams-local.opm`.
+ * If the `<fontfamily>` is declared in `fams-local.opm` or `fams-ini.opm`
+ read relevant file and finish.
+ * Print the list of declared families.
+ \enditems
+ The `fams-local.opm` is read by the \`\_tryloadfamslocal` macro. It sets
+ itself to `\_relax` because we need not load this file twice.
+ The \`\_listfamnames` macro prints registered font families to the
+ terminal and to the log file.
+ \_cod -----------------------------
+
+\_def\_fontfam[#1]{%
+ \_lowercase{\_edef\_famname{\_ea\_removespaces #1 {} }}%
+ \_isfile {f-\_famname.opm}\_iftrue \_opinput {f-\_famname.opm}%
+ \_else
+ \_tryloadfamslocal
+ \_edef\_famfile{\_trycs{_famf:\_famname}{}}%
+ \_ifx\_famfile\_empty \_listfamnames
+ \_else \_opinput {\_famfile.opm}%
+ \_fi\_fi
+}
+\_def\_tryloadfamslocal{%
+ \_isfile {fams-local.opm}\_iftrue
+ \_opinput {fams-local.opm}\_famfrom={}%
+ \_fi
+ \_let \_tryloadfamslocal=\_relax % need not to load fams-local.opm twice
+}
+\_def\_listfamnames {%
+ \_wterm{===== List of font families ======}
+ \_begingroup
+ \_let\_famtext=\_wterm
+ \_def\_faminfo [##1]##2##3##4{%
+ \_wterm{ \_space\_noexpand\fontfam [##1] -- ##2}%
+ \_let\_famalias=\_famaliasA}%
+ \_opinput {fams-ini.opm}%
+ \_isfile {fams-local.opm}\_iftrue \_opinput {fams-local.opm}\_fi
+ \_message{^^J}%
+ \_endgroup
+}
+\_def\_famaliasA{\_message{ \_space\_space\_space\_space -- alias:}
+ \_def\_famalias[##1]{\_message{[##1]}}\_famalias
+}
+\_public \fontfam ;
+
+ \_doc -----------------------------
+ When the `fams-ini.opm` or `fams-local.opm` files are read then we need
+ to save only a mapping from family names or alias names to the font family file
+ names. All other information is ignored in this case. But if these files
+ are read by the `\_listfamnames` macro or when printing a catalog then more
+ information is used and printed.\nl
+ \`\_famtext` does nothing or prints the text on the terminal.
+ \nl
+ \`\_faminfo` `[<Family Name>] {<comments>} {<file-name>} {<mod-plus-vars>}`
+ does\nl `\_def \_famf:<familyname> {<file-name>}` or prints information on
+ the terminal.
+ \nl
+ \`\_famalias` `[<Family Alias>]` does `\def \_famf:<familyalias> {<file-name>}`
+ where `<file-name>` is stored from the previous `\_faminfo` command. Or
+ prints information on the terminal.
+ \nl
+ \`\_famfrom` declares type foundry or owner or designer of the font family.
+ It can be used in `fams-ini.opm` or `fams-local.opm` and it is printed
+ in the font catalog.
+ \_cod -----------------------------
+
+\_def\_famtext #1{}
+\_def\_faminfo [#1]#2#3#4{%
+ \_lowercase{\_edef\_tmp{\_ea\_removespaces #1 {} }}%
+ \_sdef{_famf:\_tmp}{#3}%
+ \_def\_famfile{#3}%
+}
+\_def\_famalias [#1]{%
+ \_lowercase{\_edef\_tmpa{\_ea\_removespaces #1 {} }}%
+ \_sdef{_famf:\_tmpa\_ea}\_ea{\_famfile}%
+}
+\_newtoks\_famfrom
+\_input fams-ini.opm
+\_let\_famfile=\_undefined
+\_famfrom={}
+
+ \_doc -----------------------------
+ When the \^`\fontfam``[catalog]` is used then the file
+ `fonts-catalog.opm` is read. The macro \^`\_faminfo` is redefined here
+ in order to print catalog samples of all declared modifiers/variant
+ pairs. The user can declare different samples and different behavior of
+ the catalog, see the end of catalog listing for more information.
+ The default parameters
+ \`\catalogsample`, \`\catalogmathsample`, \`\catalogonly` and
+ \`\catalogexclude` of the catalog are declared here.
+ \_cod -----------------------------
+
+\_newtoks \_catalogsample
+\_newtoks \_catalogmathsample
+\_newtoks \_catalogonly
+\_newtoks \_catalogexclude
+\_catalogsample={ABCDabcd Qsty fi fl áéíóúüů řžč ÁÉÍÓÚ ŘŽČ 0123456789}
+
+\_public \catalogonly \catalogexclude \catalogsample \catalogmathsample ;
+
+ \_doc -----------------------------
+ The font features are managed in the \`\_fontfeatures` macro.
+ They have their implicit values saved in the \`\_defaultfontfeatures`
+ and the \`\setff` `{<features>}`
+ can add next font features. If there is the same font feature as the newly
+ added one then the old value is removed from the `\_fontfeatures` list.
+ \_cod -----------------------------
+
+\_def \_defaultfontfeatures {+tlig;}
+\_def \_setff #1{%
+ \_ifx^#1^\_let \_fontfeatures=\_defaultfontfeatures
+ \_else \_edef\_fontfeatures{\_fontfeatures #1;}\_fi
+ \_reloading
+}
+\_setff {} % default font features: +tlig;
+\_def\_removefeature #1{%
+ \_isinlist\_fontfeatures{#1}\_iftrue
+ \_def\_tmp ##1#1##2;##3\_relax{\_def\_fontfeatures{##1##3}}%
+ \_ea \_tmp \_fontfeatures \_relax
+ \_fi
+}
+\_public \setff ;
+
+ \_doc -----------------------------
+ The \`\setfontcolor` and \`\setletterspace` are macros based on the
+ special font features provided by \LuaTeX/ (and by \XeTeX/ too but it is not
+ our business). The \`\setwordspace` recalulates the `\fontdimen2,3,4`
+ of the font using the \`\setwsp` macro which is used by the
+ \^`\_doresizeunifont` macro. It activates a dummy font feature `+Ws` too in
+ order the font is reloded by the `\font` primitive (with independent
+ `\fontdimen` registers).
+ \_cod -----------------------------
+
+\_def\_savedfontcolor{}
+\_def\_savedletterspace{}
+\_def\_savedwsp{}
+
+\_def \_setfontcolor #1{\_removefeature{color=}%
+ \_edef\_tmp{\_calculatefontcolor{#1}}%
+ \_ifx\_tmp\_empty \_else \_edef\_fontfeatures{\_fontfeatures color=\_tmp;}\_fi
+ \_reloading
+}
+\_def \_setletterspace #1{\_removefeature{letterspace=}%
+ \_if^#1^\_else \_edef\_fontfeatures{\_fontfeatures letterspace=#1;}\_fi
+ \_reloading
+}
+\_def \_setwordspace #1{%
+ \_if^#1^\_def\_setwsp##1{}\_removefeature{+Ws}%
+ \_else \_def\_setwsp{\_setwspA{#1}}\_setff{+Ws}\_fi
+ \_reloading
+}
+\_def\_setwsp #1{}
+\_def\_setwspA #1#2{\_fontdimen2#2=#1\_fontdimen2#2%
+ \_fontdimen3#2=#1\_fontdimen3#2\_fontdimen4#2=#1\_fontdimen4#2}
+
+\_def\_calculatefontcolor#1{\_trycs{_fc:#1}{#1}} % you can define more smart macro ...
+\_sdef{_fc:red}{FF0000FF} \_sdef{_fc:green}{00FF00FF} \_sdef{_fc:blue}{0000FFFF}
+\_sdef{_fc:yellow}{FFFF00FF} \_sdef{_fc:cyan}{00FFFFFF} \_sdef{_fc:magenta}{FF00FFFF}
+\_sdef{_fc:white}{FFFFFFFF} \_sdef{_fc:grey}{00000080} \_sdef{_fc:lgrey}{00000025}
+\_sdef{_fc:black}{} % ... you can declare more colors...
+
+\_public \setfontcolor \setletterspace \setwordspace ;
+
+\_endcode %---------------------------------------------------
+
+
+\sec[fontsystem] The Font Selection System
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The basic principles of the Font Selection System used in \OpTeX/
+was documented in the section~\ref[fontfam].
+
+\secc Terminology
+
+We distinguish between
+\begitems
+* {\em font switchers}, they are declared by the `\font` primitive or by
+ \^`\fontlet` or \~`\fontdef` macros, they select given font.
+* {\em variant selectors}, there are four basic variant selectors
+ \^`\rm`, \^`\bf`, \^`\it`, \^`\bi`, there is a special selector \^`\currvar`.
+ More variant selectors can be declared by the \~`\famvardef` macro.
+ They select the font depending on the given variant and on the {\em font context}
+ (i.e.\ on current family and on more features given by font modifiers).
+ In addition, \OpTeX/ defines \~`\tt` as variant selector
+ independent of chosen font family. It selects typewriter-like font.
+* {\em font modifiers} are declared in a family (`\cond`, `\caps`) or are
+ \"build in" (\^`\setfontsize``{<size spec>}`, \~`\setff{<features>}`).
+ They do appropriate change in the {\em font context} but do not select
+ the font.
+* {\em family selectors} (for example `\Termes`, `\LMfonts`),
+ they are declared typically in the {\em font family files}.
+ They enable to switch between font families, they do appropriate
+ change in the {\em font context} but do not select
+ the font.
+\enditems
+
+These commands set their values locally. When the \TeX/ group is
+left then the selected font and the {\em font context} are returned back to the values
+used when the group was opened. They have the following features:
+
+The {\em font context} is a set of macro values that will affect the
+selection of real font when the variant selector is processed. It includes the
+value of {\em current family}, current font size, and
+more values stored by font modifiers.
+
+The {\em family context} is the current family value stored in the font
+context. The variant selectors declared by \~`\famvardef` and
+font modifiers declared by \~`\moddef` are dependent on the {\em family context}.
+They can have the same names but different behavior in different families.
+
+The fonts registered in \OpTeX/ have their macros in the {\em font family files},
+each family is declared in one font family file with the name `f-famname.opm`.
+All families are collected in `fams-ini.opm` and users can give more
+declarations in the file `fams-local.opm`.
+
+\secc Font families, selecting fonts
+
+The \^`\fontfam` `[<Font Family>]` opens the relevant font family file where
+the `<Font Family>` is declared. The family selector is defined here by rules
+described in the section~\ref[fontfamfiles]. Font modifiers and variant
+selectors may be declared here.
+The loaded family is set as current and `\rm` variant selector is processed.
+
+The available declared font modifiers and declared variant selectors are
+listed in the log file when the font family is load. Or you can print
+`\fontfam[catalog]` to show available font modifiers and variant selectors.
+
+The font modifiers can be independent, like `\cond` and `\light`. They can
+be arbitrarily combined (in arbitrary order) and if the font family disposes
+of all such sub-variants then the desired font is selected (after variant
+selector is used). On the other hand, there are font modifiers that negates
+the previous font modifier, for example: `\cond`, `\extend`. You can reset
+all modifiers to their initial value by the \^`\resetmod` command.
+
+You can open more font families by more \^`\fontfam` commands. Then the
+general method to selecting the individual font is:
+
+\begtt \catcode`\<=13
+<family selector> <font modifiers> <variant selector>
+\endtt
+For example:
+\begtt
+\fontfam [Heros] % Heros family is active here, default \rm variant.
+\fontfam [Termes] % Termes family is active here, default \rm variant.
+{\Heros \caps \cond \it The caps+condensed italics in Heros family is here.}
+The Termes roman is here.
+\endtt
+
+There is one special command \^`\currvar` which acts as a variant selector.
+It keeps the current variant and the font of such variant is
+reloaded with respect to the current font context by the previously given family
+selector and font modifiers.
+
+You can use the \^`\setfontsize` `{<sizespec>}` command in the same sense as
+other font modifiers. It saves information about font size to the font
+context. See section~\ref[setfontsize]. Example:
+
+\begtt
+\rm default size \setfontsize{at14pt}\rm here is 14pt size \it italic is
+in 14pt size too \bf bold too.
+\endtt
+
+A much more comfortable way to resize fonts is using OPmac-like commands
+\~`\typosize` and \~`\typoscale`.
+These commands prepare the right sizes for math
+fonts too and they re-calculate many internal parameters like `\baselineskip`.
+See section~\ref[opmac-fonts] for more information.
+
+
+\secc Math Fonts
+%---------------
+
+Most font families are connected with a preferred Unicode-math font. This
+Unicode-math is activated when the font family is loaded. If you don't prefer
+this and you are satisfied with 8bit math CM+AMS fonts preloaded in the
+\OpTeX/ format then you can use command \^`\noloadmath` before you load a first
+font family.
+
+If you want to use your specially selected Unicode-math font then use
+\^`\loadmath` `{[<font_file>]}` or \^`\loadmath` `{<font_name>}` before first
+`\fontfam` is used.
+
+
+\secc[fontcommands] Declaring font commands
+%----------------------------
+
+Font commands can be font switches, variant selectors, font modifiers,
+family selectors and defined font macros doing something with fonts.
+
+\begitems
+* Font switches can be decared by `\font` primitive (see
+ section~\ref[fontprimitive]) or by \^`\fontlet` command (see
+ section~\ref[fontlet]) or by \~`\fontdef` command (see
+ sections~\ref[fontdef2] and~\ref[fontdef]).
+ When the font switches are used then they select the given font independently
+ of the current font context. They can be used
+ in `\output` routine (for example) because we need to set fixed fonts
+ in headers and footers.
+* Variant selectors are \^`\rm`, \^`\bf`, \^`\it`, \^`\bi`, \~`\tt` and \^`\currvar`. More
+ variant selectors can be declared by \~`\famvardef` command. They select a
+ font dependent on the current font context, see section~\ref[famvardef].
+ The `\tt` selector is documented in section~\ref[tt].
+* Font modifiers are \"build in" or declared by \~`\moddef` command.
+ They do modifications in the font context but don't select any font.
+ \begitems
+ * \"build-in" font modifiers are \^`\setfontsize` (see
+ section~\ref[setfontsize]), \~`\setff` (see section~\ref[setff]),
+ \~`\setfontcolor`, \~`\setletterspace` and \~`\setwordspace`
+ (see section~\ref[specff]). They are independent of font family.
+ * Font modifiers declared by \~`\moddef` depend on the font family and they
+ are typically declared in font family files, see
+ section~\ref[fontfamfiles].
+ \enditems
+* Family selectors set the given
+ font family as current and re-set data used by the family-dependent font
+ modifiers to initial values and to the currently used modifiers.
+ They are declared in font family files
+ by \~`\_famdecl` macro, see section~\ref[fontfamfiles].
+* Font macros can be defined arbitrarily by `\def` primitive by users.
+ See an example in section~\ref[fontmacros].
+\enditems
+
+All declaration commands mentioned here: `\font`, `\fontlet`, `\fontdef`, `\famvardef`,
+`\moddef`, `\_famdecl` and `\def` make local assignment.
+
+\secc[fontdef2] The `\fontdef` declarator in detail
+
+The general format for \^`\fontdef` usage is
+\begtt \catcode`\<=13
+\fontdef\<font switch> {\<family selector> <font modifiers> \<variant selector>}
+\endtt
+%
+where `\<family selector>` and `<font modifiers>` are optional and
+`\<variant selector>` is mandatory.
+
+The \^`\fontdef` does the following steps.
+It pushes the current font context to a stack, it does modifications of the font
+context by given `\<family selector>` and/or `<font modifiers>` and it
+finds the real font by `\<variant selector>`. This font is not selected but
+it is assigned to the declared `\<font switch>` (like `\font` primitive does
+it). Finally, `\fontdef` pops the font context stack, so the current
+font context is the same as it was before `\fontdef` is used.
+
+More about `\fontdef` command including examples is written in
+section~\ref[fontdef].
+
+
+\secc[famvardef] The `\famvardef` declarator
+
+You can declare a new variant selector by the \^`\famvardef` macro. This
+macro has similar syntax as \^`\fontdef`:
+\begtt \catcode`\<=13
+\famvardef\<new variant selector> {\<family selector> <font modifiers> \<variant selector>}
+\endtt
+%
+where `\<family selector>` and `<font modifiers>` are optional and
+`\<variant selector>` is mandatory.
+The `\<new variant selector>` should be used in the same sense as `\rm`,
+`\bf` etc. It can be used as the final command in next
+\^`\fontdef` or \^`\famvardef` declarators
+too. When the `\<new variant selector>` is used in the normal text then it does
+the following steps: pushes current font context to a stack, modifies font
+context by declared `\<family selector>` and/or `<font modifiers>`,
+runs following `\<variant selector>`.
+This last one selects a real font. Then pops the font context stack.
+The new font is selected but the font context has its original values.
+This is main difference between `\famvardef\foo{...}` and `\def\foo{...}`.
+
+Moreover, the \^`\famvardef` creates the `\<new variant selector>` family dependent.
+When the selector is used in another family context than it is defined then a warning is
+printed on the terminal \"<var selector> is undeclared in the current family"
+and nothing happens. But you can declare the same variant selector by
+\^`\famvardef` macro in the context of a new family. Then the same command
+may do different work depending on the current font family.
+
+Suppose that the selected font family provides the font modifier `\medium` for
+mediate weight of fonts. Then you can declare:
+\begtt
+\famvardef \mf {\medium\rm}
+\famvardef \mi {\medium\it}
+\endtt
+Now, you can use six independent variant selectors `\rm`, `\bf`, `\it`,
+`\bi`, `\mf` and `\mi` in the selected font family.
+
+A `\<family selector>` can be written before `<font modifiers>` in the
+`\famvardef` parameter. Then the `\<new variant selector>` is declared in
+the current family but it can use fonts from another family represented by
+the `\<family selector>`.
+
+When you are mixing fonts from more families then you probably run
+into a problem with incompatible ex-heights. This problem can be solved using
+\^`\setfontsize` and \^`\famvardef` macros:
+\begtt
+\fontfam[Heros] \fontfam[Termes]
+
+\def\exhcorr{\setfontsize{mag.88}}
+\famvardef\rmsans{\Heros\exhcorr\rm}
+\famvardef\itsans{\Heros\exhcorr\it}
+
+Compare ex-height of Termes \rmsans with Heros \rm and Termes.
+\endtt
+
+The variant selectors (declared by \~`\famvardef`) or font
+modifiers (declared by \~`\moddef`) are (typically) control sequences in user name
+space (`\mf`, `\caps`). They are most often declared in font family files and
+they are loaded by \^`\fontfam`. A conflict with such names in
+user namespace can be here. For example: if `\mf` is defined by a user and then
+`\fontfam[Roboto]` is used then `\famvardef\mf` is performed for Roboto
+family and the original meaning of `\mf` is lost. But \OpTeX/ prints warning
+about it. There are two cases:
+
+\begtt
+\def\mf{Metafont}
+\fontfam[Roboto] % warning: "The \mf is redefined by \famvardef" is printed
+ or
+\fontfam[Roboto]
+\def\mf{Metafont} % \mf variant selector redefined by user, we suppose that \mf
+ % is used only in the meaning of "Metafont" in the document.
+\endtt
+
+\secc[tt] The `\tt` variant selector
+
+\^`\tt` is an additional special variant selector which is defined as \"select typewriter
+font independently of the current font family". By default, the typewriter font-face
+from LatinModern font family is used.
+
+The \^`\tt` variant selector is used in \OpTeX/ internal macros
+\^`\_ttfont` (verbatim texts) and \^`\_urlfont` (printing URL's).
+
+You can redefine the behavior of `\tt` by \^`\famvardef`. For example:
+
+\begtt
+\fontfam[Cursor]
+\fontfam[Heros]
+\fontfam[Termes]
+\famvardef\tt{\Cursor\setff{-liga;-tlig}\rm}
+
+Test in Termes: {\tt text}. {\Heros\rm Test in Heros: {\tt text}}.
+Test in URL \url{http://something.org}.
+\endtt
+%
+You can see that `\tt` stay family independent. This is a special feature only
+for `\tt` selector. New definition is used in \^`\_ttfont` and \^`\_urlfont` too.
+It is recommended to use `\setff{-liga;-tlig}` to suppress the
+ligatures in typewriter fonts.
+
+If Unicode math font is loaded then the `\tt` macro selects typewriter
+font-face in math mode too. This face
+is selected from used Unicode math font and it is independent of
+`\famvardef\tt` declaration.
+
+
+\secc[fontmacros] Font commands defined by `\def`
+
+Such font commands can be used as fonts selectors for titles, footnotes,
+citations, etc. Users can define them.
+
+The following example shows how to define a \"title-font selector".
+Titles are not only bigger but they are typically in the bold variant. When a user puts
+`{\it...}` into the title text then he/she expects bold italic here, no normal
+italic. You can remember the great song by John Lennon \"Let It Be" and
+define:
+
+\begtt
+\def\titlefont{\setfontsize{at14pt}\bf \let\it\bi}
+...
+{\titlefont Title in bold 14pt font and {\it bold 14pt italics} too}
+\endtt
+
+\OpTeX/ defines similar internal commands \^`\_titfont`, \^`\_chapfont`, \^`\_secfont` and
+\^`\_seccfont`, see section~\ref[sections]. The commands \^`\typosize` and
+\^`\boldify` are used in these macros. They set the math fonts to given size too and they
+are defined in section~\ref[opmac-fonts].
+
+
+\secc[setff] Modifying font features
+%----------------------------
+
+Each OTF font provides \"font features". You can list these font features
+by `otfinfo -f font.otf`. For example, LinLibertine fonts provide `frac` font
+feature. If it is active then fractions like 1/2 are printed in a special
+form.
+
+The font features are part of the font context data.
+The macro \^`\setff` `{<feature>}` acts like family independent font modifier and
+prepares a new <feature>. You must use a variant selector in order to
+reinitialize the font with the new font feature. For example
+\^`\setff``{+frac}\rm` or \^`\setff``{+frac}`\^`\currvar`. You can declare a new variant
+selector too:
+
+\begtt
+\fontfam[LinLibertine]
+\famvardef \fraclig {\setff{+frac}\currvar}
+Compare 1/2 or 1/10 \fraclig to 1/2 or 1/10.
+\endtt
+
+If the used font does not support the given font feature then the font is reloaded
+without warning nor error, silently. The font feature is not activated.
+
+The `onum` font feature (old-style digits) is connected to `\caps` macro for
+Caps+SmallCaps variant in \OpTeX/ font family files. So you need not
+create a new modifier, just use `{\caps`\^`\currvar`` 012345}`.
+
+
+\secc[specff] Special font modifiers
+%---------------------------
+
+Despite the font modifiers declared in the font family file (and dependent on
+the font family), we have following font modifiers (independent of font
+family):
+
+\begtt \catcode`\<=13
+\setfontsize{<sizespec>} % sets the font size
+\setff{<font feature>} % adds the font feature
+\setfontcolor{<color>} % sets font color
+\setletterspace{<number>} % sets letter spacing
+\setwordspace{<scaling>} % modifies word spacing
+\endtt
+
+The \^`\setfontsize` command is described in the section \ref[setfontsize].
+The \^`\setff` command was described in previous subsection.
+
+\^`\setfontcolor` `{<color>}` specifies the color and the opacity of the text.
+The <color> parameter should be in the hexadecimal format of four bytes
+`<red><green><blue><opacity>`, for example `FF0080FF` means full red, zero
+green, half blue and full opacity. You can use names `red`, `green`, `blue`,
+`yellow`, `cyan`, `magenta`, `white`, `grey`, `lgrey` (without the backslash)
+instead of the hexadecimal specification.
+The empty parameter `<color>` means default black color.
+
+These colors of fonts are implemented using \LuaTeX/ internal font feature. This
+is different approach than using colors in section \ref[colors].
+
+\^`\setletterspace` `{<number>}` specifies the letter spacing of the font. The
+`<number>` is a decimal number without unit. The unit is supposed as 1/100 of
+the font size. I.e. `2.5` means 0.25 pt when the font is at 10 pt size. The
+empty parameter `<number>` means no letter spacing which is the default.
+
+\^`\setwordspace` `{<scaling>}` scales the default interword space (defined in the
+font) and its stretching and shrinking parameters by given `<scaling>`
+factor. For example `\setwordspace{2.5}` multiplies interword space by 2.5.
+
+If you need another font transformations, you can use `\setff`
+with following font features provided by Lua\TeX/:
+
+\begtt
+\setff{embolden=1.5}\rm % font is bolder because outline has nonzero width
+\setff{slant=0.2}\rm % font is slanted by a linear transformation
+\setff{extend=1.2}\rm % font is extended by a linear transformation.
+\setff{colr=yes}\rm % if the font includes colored characters, use colors
+\setff{upper}\rm % to uppercase (lower=lowecase) conversion at font level
+\endtt
+
+Use font transformations mentioned above and \^`\setletterspace`,
+\^`\setwordspace` with care. The best setting of these values is the default
+setting in every font, of course. If you really need to set a different
+letter spacing then it is strongly recommended to add `\setff{-liga}`
+to disable ligatures. And setting a positive letter spacing probably
+needs to scale interword spacing too.
+
+All mentioned font modifiers (except for `\setfontsize`) work only
+with Unicode fonts loaded by \^`\fontfam`.
+
+\secc[fontfamfiles] How to create the font family file
+%------------------------------------------------------
+
+\printdoctail f-heros.opm
+
+\printdoctail f-lmfonts.opm
+
+\secc How to register the font family in the Font Selection System
+%---------------------------------------------------------------
+
+\printdoctail fams-ini.opm
+
+\secc[exfont] Notices about extension of `\font` primitive
+%---------------------------------------------------------
+
+Unicode fonts are loaded by extended `\font` primitive. This extension is
+not activated in \OpTeX/ by default, \^`\initunifonts` macro activates it.
+You need not use \^`\initunifonts` explicitly if \^`\fontfam` macro is
+used because \^`\fontfam` runs it internally.
+
+The \^`\initunifonts` loads the Lua code from the Luaotfload package which
+implements the `\font` primitive extension. See its
+documentation `luaotfload-latex.pdf` for information about
+all possibilities of extended `\font` primitive.
+
+The \OpTeX/ format is initialized by `luatex` engine by default but
+you can initialize it by `luahbtex` engine too. Then the harfbuzz library is
+ready to use for font rendering as an alternative to build-in font renderer
+from Luaotfload. The harfbuzz library gives more features for rendering
+Indic and Arabic scripts. But it is not used as default, you need to specify
+`mode=harf` in the fontfeatures field when `\font` is used. Moreover, when
+`mode=harf` is used, then you must specify `script` too. For example
+
+\begtt
+\font\devafont=[NotoSansDevanagari-Regular]:mode=harf;script=dev2
+\endtt
+%
+If the `luahbtex` engine is not used then `mode=harf` is ignored. See
+Luaotfload documentation for more information.
+
+\endinput
+
+2021-02-25 \_ttunifont introduced
+2021-01-27 lua hack (print function) removed because luaotfload 3.17 removes bug.
+2020-12-12 \_modlist added, doc improved
+2020-04-18 \_tryloadfamslocal introduced
+ \_fontdecl -> \_famdecl with different concept
+2020-03-18 released
diff --git a/macros/optex/base/graphics.opm b/macros/optex/base/graphics.opm
new file mode 100644
index 0000000000..afff1c1284
--- /dev/null
+++ b/macros/optex/base/graphics.opm
@@ -0,0 +1,445 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \inspic {Graphics <2020-04-12>} % preloaded in format
+
+ \_doc -----------------------------
+ \`\inspic` accepts old syntax `\inspic <filename><space>`
+ or new syntax `\inspic{<filename>}`. So, we need to define
+ two auxiliary macros \`\_inspicA` and \`\_inspicB`.
+
+ You can include more `\pdfximage` parameters (like `page<number>`)
+ in the \`\_picparams` macro.
+
+ All `\inspic` macros are surrounded in `\hbox` in order user can
+ write `\moveright\inspic ...` or something similar.
+ \_cod -----------------------------
+
+\_def\_inspic{\_hbox\_bgroup\_isnextchar\_bgroup\_inspicB\_inspicA}
+\_def\_inspicA #1 {\_inspicB {#1}}
+\_def\_inspicB #1{%
+ \_pdfximage \_ifdim\_picwidth=\_zo \_else width\_picwidth\_fi
+ \_ifdim\_picheight=\_zo \_else height\_picheight\_fi
+ \_picparams {\_the\_picdir#1}%
+ \_pdfrefximage\_pdflastximage\_egroup}
+
+\_def\_picparams{}
+
+\_public \inspic ;
+
+ \_doc -----------------------------
+ Inkscape can save a picture to `*.pdf` file and labels for the picture
+ to `*.pdf_tex` file. The second file is in \LaTeX/ format (unfortunately)
+ and it is intended to read immediately after `*.pdf` is included
+ in order to place labels of this picture in the same font as the document is printed.
+ We need to read this \LaTeX/ file by plain \TeX/ macros when \`\inkinspic` is used.
+ These macros are stored in the \`\_inkdefs` tokens list and it is used
+ locally in the group. The solution is borrowed from OPmac trick 0032.
+ \_cod -----------------------------
+
+\_def\_inkinspic{\_hbox\_bgroup\_isnextchar\_bgroup\_inkinspicB\_inkinspicA}
+\_def\_inkinspicA #1 {\_inkinspicB {#1}}
+\_def\_inkinspicB #1{%
+ \_ifdim\_picwidth=0pt \_setbox0=\_hbox{\_inspic{#1}}\_picwidth=\_wd0 \_fi
+ \_the\_inkdefs
+ \_opinput {\_the\_picdir #1_tex}% file with labels
+ \_egroup}
+
+\_newtoks\_inkdefs \_inkdefs={%
+ \_def\makeatletter#1\makeatother{}%
+ \_def\includegraphics[#1]#2{\_inkscanpage#1,page=,\_end \_inspic{#2}\_hss}%
+ \_def\_inkscanpage#1page=#2,#3\_end{\_ifx,#2,\_else\_def\_picparams{page#2}\_fi}%
+ \_def\put(#1,#2)#3{\_nointerlineskip\_vbox to\_zo{\_vss\_hbox to\_zo{\_kern#1\_picwidth
+ \_pdfsave\_hbox to\_zo{#3}\_pdfrestore\_hss}\_kern#2\_picwidth}}%
+ \_def\begin#1{\_csname _begin#1\_endcsname}%
+ \_def\_beginpicture(#1,#2){\_vbox\_bgroup
+ \_hbox to\_picwidth{}\_kern#2\_picwidth \_def\end##1{\_egroup}}%
+ \_def\_begintabular[#1]#2#3\end#4{%
+ \_vtop{\_def\\{\_cr}\_tabiteml{}\_tabitemr{}\_table{#2}{#3}}}%
+ \_def\color[#1]#2{\_scancolor #2,}%
+ \_def\_scancolor#1,#2,#3,{\_pdfliteral{#1 #2 #3 rg}}%
+ \_def\makebox(#1)[#2]#3{\_hbox to\_zo{\_csname _mbx:#2\_endcsname{#3}}}%
+ \_sdef{_mbx:lb}#1{#1\_hss}\_sdef{_mbx:rb}#1{\_hss#1}\_sdef{_mbx:b}#1{\_hss#1\_hss}%
+ \_sdef{_mbx:lt}#1{#1\_hss}\_sdef{_mbx:rt}#1{\_hss#1}\_sdef{_mbx:t}#1{\_hss#1\_hss}%
+ \_def\rotatebox#1#2{\_pdfrotate{#1}#2}%
+ \_def\lineheight#1{}%
+ \_def\setlength#1#2{}%
+}
+\_public \inkinspic ;
+
+ \_doc ----------------------------
+ \`\pdfscale``{<x-scale>}{<y-scale>}` and \`\pdfrotate``{<degrees>}`
+ macros are implemented by `\pdfsetmatrix`
+ primitive. We need to know the values of sin, cos function in
+ the `\pdfrotate`. We use Lua code for this.
+ \_cod ----------------------------
+
+\_def\_pdfscale#1#2{\_pdfsetmatrix{#1 0 0 #2}}
+
+\_def\_gonfunc#1#2{%
+ \_directlua{tex.print(string.format('\_pcent.4f',math.#1(3.14159265*(#2)/180)))}%
+}
+\_def\_sin{\_gonfunc{sin}}
+\_def\_cos{\_gonfunc{cos}}
+
+\_def\_pdfrotate#1{\_pdfsetmatrix{\_cos{#1} \_sin{#1} \_sin{(#1)-180} \_cos{#1}}}
+
+\_public \pdfscale \pdfrotate ;
+
+ \_doc -----------------------------
+ The \`\transformbox``{<transformation>}{<text>}`
+ is copied from OPmac trick 0046.\nl
+ The \`\rotbox``{<degrees>}{<text>}` is a combination of
+ `\rotsimple` from OPmac trick 0101 and the `\transformbox`.
+ Note, that `\rotbox{-90}` puts the rotated text to the height of the outer
+ box (depth is zero) because code from `\rotsimple` is processed.
+ But `\rotbox{-90.0}` puts the rotated text to
+ the depth of the outer box (height is zero) because `\transformbox` is
+ processed.
+ \_cod -----------------------------
+
+\_def\_multiplyMxV #1 #2 #3 #4 {% matrix * (vvalX, vvalY)
+ \_tmpdim = #1\_vvalX \_advance\_tmpdim by #3\_vvalY
+ \_vvalY = #4\_vvalY \_advance\_vvalY by #2\_vvalX
+ \_vvalX = \_tmpdim
+}
+\_def\_multiplyMxM #1 #2 #3 #4 {% currmatrix := currmatrix * matrix
+ \_vvalX=#1pt \_vvalY=#2pt \_ea\_multiplyMxV \_currmatrix
+ \_edef\_tmpb{\_ea\_ignorept\_the\_vvalX\_space \_ea\_ignorept\_the\_vvalY}%
+ \_vvalX=#3pt \_vvalY=#4pt \_ea\_multiplyMxV \_currmatrix
+ \_edef\_currmatrix{\_tmpb\_space
+ \_ea\_ignorept\_the\_vvalX\_space \_ea\_ignorept\_the\_vvalY\_space}%
+}
+\_def\_transformbox#1#2{\_hbox{\_setbox0=\_hbox{{#2}}%
+ \_dimendef\_vvalX 11 \_dimendef\_vvalY 12 % we use these variables
+ \_dimendef\_newHt 13 \_dimendef\_newDp 14 % only in this group
+ \_dimendef\_newLt 15 \_dimendef\_newRt 16
+ \_preptransform{#1}%
+ \_kern-\_newLt \_vrule height\_newHt depth\_newDp width\_zo
+ \_setbox0=\_hbox{\_box0}\_ht0=\_zo \_dp0=\_zo
+ \_pdfsave#1\_rlap{\_box0}\_pdfrestore \_kern\_newRt}%
+}
+\_def\_preptransform #1{\_def\_currmatrix{1 0 0 1 }%
+ \_def\_pdfsetmatrix##1{\_edef\_tmpb{##1 }\_ea\_multiplyMxM \_tmpb\_unskip}%
+ \_let\pdfsetmatrix=\_pdfsetmatrix #1%
+ \_setnewHtDp 0pt \_ht0 \_setnewHtDp 0pt -\_dp0
+ \_setnewHtDp \_wd0 \_ht0 \_setnewHtDp \_wd0 -\_dp0
+ \_protected\_def \_pdfsetmatrix {\_pdfextension setmatrix}%
+ \_let\pdfsetmatrix=\_pdfsetmatrix
+}
+\_def\_setnewHtDp #1 #2 {%
+ \_vvalX=#1\_relax \_vvalY=#2\_relax \_ea\_multiplyMxV \_currmatrix
+ \_ifdim\_vvalX<\_newLt \_newLt=\_vvalX \_fi \_ifdim\_vvalX>\_newRt \_newRt=\_vvalX \_fi
+ \_ifdim\_vvalY>\_newHt \_newHt=\_vvalY \_fi \_ifdim-\_vvalY>\_newDp \_newDp=-\_vvalY \_fi
+}
+
+\_def\_rotbox#1#2{%
+ \_isequal{90}{#1}\_iftrue \_rotboxA{#1}{\_kern\_ht0 \_tmpdim=\_dp0}{\_vfill}{#2}%
+ \_else \_isequal{-90}{#1}\_iftrue \_rotboxA{#1}{\_kern\_dp0 \_tmpdim=\_ht0}{}{#2}%
+ \_else \_transformbox{\_pdfrotate{#1}}{#2}%
+ \_fi \_fi
+}
+\_def\_rotboxA #1#2#3#4{\_hbox{\_setbox0=\_hbox{{#4}}#2%
+ \_vbox to\_wd0{#3\_wd0=\_zo \_dp0=\_zo \_ht0=\_zo
+ \_pdfsave\_pdfrotate{#1}\_box0\_pdfrestore\vfil}%
+ \_kern\_tmpdim
+}}
+\_public \transformbox \rotbox ;
+
+ \_doc ---------------------------
+ \`\_scantwodimens` scans two objects with the syntactic rule `<dimen>`
+ and returns `{<number>}{<number>}` in `sp` unit.
+ \nl
+ \`\puttext` `<right> <up>{<text>}` puts the `<text>` to desired place:
+ From current point moves <down> and <right>, puts the <text> and returns
+ back. The current point is unchanged after this macro ends.
+ \nl
+ \`\putpic` `<right> <up> <width> <height> {<image-file>}`
+ does `\puttext` with the image scaled to desired <width> and <height>.
+ If <with> or <height> is zero, natural dimension is used.
+ The \`\nospec` is a shortcut to such a natural dimension.
+ \nl
+ \`\backgroundpic``{<image-file>}` puts the image to
+ the background of each page. It is used in the \~`\slides` style, for example.
+ \_cod ---------------------------
+
+\_def\_scantwodimens{%
+ \_directlua{tex.print(string.format('{\_pcent d}{\_pcent d}',
+ token.scan_dimen(),token.scan_dimen()))}%
+}
+
+\_def\_puttext{\_ea\_ea\_ea\_puttextA\_scantwodimens}
+\_def\_puttextA#1#2#3{{\_setbox0=\_hbox{{#3}}\_dimen1=#1sp \_dimen2=#2sp \_puttextB}}
+\_def\_puttextB{%
+ \_ifvmode
+ \_ifdim\_prevdepth>\_zo \_vskip-\_prevdepth \_relax \_fi
+ \_nointerlineskip
+ \_fi
+ \_wd0=\_zo \_ht0=\_zo \_dp0=\_zo
+ \_vbox to\_zo{\_kern-\_dimen2 \_hbox to\_zo{\_kern\_dimen1 \_box0\_hss}\_vss}}
+
+\_def\_putpic{\_ea\_ea\_ea\_putpicA\_scantwodimens}
+\_def\_putpicA#1#2{\_dimen1=#1sp \_dimen2=#2sp \_ea\_ea\_ea\_putpicB\_scantwodimens}
+\_def\_putpicB#1#2#3{{\_setbox0=\_hbox{\_picwidth=#1sp \_picheight=#2sp \_inspic{#3}}\_puttextB}}
+
+\_newbox\_bgbox
+\_def\_backgroundpic#1{%
+ \_setbox\_bgbox=\_hbox{\_picwidth=\_pdfpagewidth \_picheight=\_pdfpageheight \_inspic{#1}}%
+ \_pgbackground={\_copy\_bgbox}
+}
+\_def\nospec{0pt}
+\_public \puttext \putpic \backgroundpic ;
+
+ \_doc -----------------------------
+ \`\_circle``{<x>}{<y>}` creates an ellipse with `<x>` axis and `<y>` axis.
+ The origin is in the center.
+ \nl
+ \`\_oval``{<x>}{<y>}{<roundness>}` creates an oval with `<x>`, `<y>` size and with
+ the given `<roundness>`. The real size is bigger by 2`<roundness>`. The
+ origin is at the left bottom corner.
+ \nl
+ \`\_mv``{<x>}{<y>}{<curve>}` moves current point to `<x>`, `<y>`, creates the
+ `<curve>` and returns the current point back.
+ All these macros are fully expandable and they can be used in the
+ `\pdfliteral` argument.
+ \_cod -----------------------------
+
+\def\_circle#1#2{\_expr{.5*(#1)} 0 m
+ \_expr{.5*(#1)} \_expr{.276*(#2)} \_expr{.276*(#1)} \_expr{.5*(#2)} 0 \_expr{.5*(#2)} c
+ \_expr{-.276*(#1)} \_expr{.5*(#2)} \_expr{-.5*(#1)} \_expr{.276*(#2)} \_expr{-.5*(#1)} 0 c
+ \_expr{-.5*(#1)} \_expr{-.276*(#2)} \_expr{-.276*(#1)} \_expr{-.5*(#2)} 0 \_expr{-.5*(#2)} c
+ \_expr{.276*(#1)} \_expr{-.5*(#2)} \_expr{.5*(#1)} \_expr{-.276*(#2)} \_expr{.5*(#1)} 0 c h}
+
+\def\_oval#1#2#3{0 \_expr{-(#3)} m \_expr{#1} \_expr{-(#3)} l
+ \_expr{(#1)+.552*(#3)} \_expr{-(#3)} \_expr{(#1)+(#3)} \_expr{-.552*(#3)}
+ \_expr{(#1)+(#3)} 0 c
+ \_expr{(#1)+(#3)} \_expr{#2} l
+ \_expr{(#1)+(#3)} \_expr{(#2)+.552*(#3)} \_expr{(#1)+.552*(#3)} \_expr{(#2)+(#3)}
+ \_expr{#1} \_expr{(#2)+(#3)} c
+ 0 \_expr{(#2)+(#3)} l
+ \_expr{-.552*(#3)} \_expr{(#2)+(#3)} \_expr{-(#3)} \_expr{(#2)+.552*(#3)}
+ \_expr{-(#3)} \_expr{#2} c
+ \_expr{-(#3)} 0 l
+ \_expr{-(#3)} \_expr{-.552*(#3)} \_expr{-.552*(#3)} \_expr{-(#3)} 0 \_expr{-(#3)} c h}
+
+\def\_mv#1#2#3{1 0 0 1 \_expr{#1} \_expr{#2} cm #3 1 0 0 1 \_expr{-(#1)} \_expr{-(#2)} cm}
+
+ \_doc -----------------------------
+ The \`\inoval``{<text>}` is an example of \^`\_oval` usage.\nl
+ The \`\incircle``{<text>}` is an example of \^`\_circle` usage.\nl
+ The \`\ratio`, \`\lwidth`, \`\fcolor`, \`\lcolor`, \`\shadow` and \`\overlapmargins`
+ are parameters, they can be set by user in optional brackets `[...]`.
+ For example `\fcolor=\Red` does `\_let\_fcolorvalue=\Red` and it means
+ filling color.\nl
+ The \`\_setflcolor` uses the \^`\_fillstroke` macro to separate filling
+ color and drawing color.
+ \_cod -----------------------------
+
+\_newdimen \_lwidth
+\_def\_fcolor{\_let\_fcolorvalue}
+\_def\_lcolor{\_let\_lcolorvalue}
+\_def\_shadow{\_let\_shadowvalue}
+\_def\_overlapmargins{\_let\_overlapmarginsvalue}
+\_def\_ratio{\_isnextchar ={\_ratioA}{\_ratioA=}}
+\_def\_ratioA =#1 {\_def\_ratiovalue{#1}}
+\_def\_touppervalue#1{\_ifx#1n\_let#1=N\_fi}
+
+\_def\_setflcolors#1{% use only in a group
+ \_def\_setcolor##1{##1}%
+ \_def\_fillstroke##1##2{##1}%
+ \_edef#1{\_fcolorvalue}%
+ \_def\_fillstroke##1##2{##2}%
+ \_edef#1{#1\_space\_lcolorvalue\_space}%
+}
+\_optdef\_inoval[]{\_vbox\_bgroup
+ \_roundness=2pt \_fcolor=\Yellow \_lcolor=\Red \_lwidth=.5bp
+ \_shadow=N \_overlapmargins=N \_hhkern=0pt \_vvkern=0pt
+ \_the\_ovalparams \_relax \_the\_opt \_relax
+ \_touppervalue\_overlapmarginsvalue \_touppervalue\_shadowvalue
+ \_ifx\_overlapmarginsvalue N%
+ \_advance\_hsize by-2\_hhkern \_advance\_hsize by-2\_roundness \_fi
+ \_setbox0=\_hbox\_bgroup\_bgroup \_aftergroup\_inovalA \_kern\_hhkern \_let\_next=%
+}
+\_def\_inovalA{\_isnextchar\_colorstackpop\_inovalB\_inovalC}
+\_def\_inovalB#1{#1\_isnextchar\_colorstackpop\_inovalB\_inovalC}
+\_def\_inovalC{\_egroup % of \setbox0=\hbox\bgroup
+ \_ifdim\_vvkern=\_zo \_else \_ht0=\_dimexpr\_ht0+\_vvkern \_relax
+ \_dp0=\_dimexpr\_dp0+\_vvkern \_relax \_fi
+ \_ifdim\_hhkern=\_zo \_else \_wd0=\_dimexpr\_wd0+\_hhkern \_relax \_fi
+ \_ifx\_overlapmarginsvalue N\_dimen0=\_roundness \_dimen1=\_roundness
+ \_else \_dimen0=-\_hhkern \_dimen1=-\_vvkern \_fi
+ \_setflcolors\_tmp
+ \_hbox{\_kern\_dimen0
+ \_vbox to\_zo{\_kern\_dp0
+ \_ifx\_shadowvalue N\_else
+ \_edef\_tmpb{{\_bp{\_wd0+\_lwidth}}{\_bp{\_ht0+\_dp0+\_lwidth}}{\_bp{\_roundness}}}%
+ \_doshadow\_oval
+ \_fi
+ \_pdfliteral{q \_bp{\_lwidth} w \_tmp
+ \_oval{\_bp{\_wd0}}{\_bp{\_ht0+\_dp0}}{\_bp{\_roundness}} B Q}\_vss}%
+ \_ht0=\_dimexpr\_ht0+\_dimen1 \_relax \_dp0=\_dimexpr\_dp0+\_dimen1 \_relax
+ \_box0
+ \_kern\_dimen0}%
+ \_egroup % of \vbox\bgroup
+}
+\_optdef\_incircle[]{\_vbox\_bgroup
+ \_ratio=1 \_fcolor=\Yellow \_lcolor=\Red \_lwidth=.5bp
+ \_shadow=N \_overlapmargins=N \_hhkern=3pt \_vvkern=3pt
+ \_ea\_the \_ea\_circleparams \_space \_relax
+ \_ea\_the \_ea\_opt \_space \_relax
+ \_touppervalue\_overlapmarginsvalue \_touppervalue\_shadowvalue
+ \_setbox0=\_hbox\_bgroup\_bgroup \_aftergroup\_incircleA \_kern\_hhkern \_let\_next=%
+}
+\_def\_incircleA {\_isnextchar\_colorstackpop\_incircleB\_incircleC}
+\_def\_incircleB #1{#1\_isnextchar\_colorstackpop\_incircleB\_incircleC}
+\_def\_incircleC {\_egroup % of \setbox0=\hbox\bgroup
+ \_wd0=\_dimexpr \_wd0+\_hhkern \_relax
+ \_ht0=\_dimexpr \_ht0+\_vvkern \_relax \_dp0=\_dimexpr \_dp0+\_vvkern \_relax
+ \_ifdim \_ratiovalue\_dimexpr \_ht0+\_dp0 > \_wd0
+ \_dimen3=\_dimexpr \_ht0+\_dp0 \_relax \_dimen2=\_ratiovalue\_dimen3
+ \_else \_dimen2=\_wd0 \_dimen3=\_expr{1/\_ratiovalue}\_dimen2 \_fi
+ \_setflcolors\_tmp
+ \_ifx\_overlapmarginsvalue N\_dimen0=\_zo \_dimen1=\_zo
+ \_else \_dimen0=-\_hhkern \_dimen1=-\_vvkern \_fi
+ \_hbox{\_kern\_dimen0
+ \_ifx\_shadowvalue N\_else
+ \_edef\_tmpb{{\_bp{\_dimen2+\_lwidth}}{\_bp{\_dimen3+\_lwidth}}{}}%
+ \_doshadow\_circlet
+ \_fi
+ \_pdfliteral{q \_bp{\_lwidth} w \_tmp \_mv{\_bp{.5\_wd0}}{\_bp{(\_ht0-\_dp0)/2}}
+ {\_circle{\_bp{\_dimen2}}{\_bp{\_dimen3}} B} Q}%
+ \_ifdim\_dimen1=\_zo \_else
+ \_ht0=\_dimexpr \_ht0+\_dimen1 \_relax \_dp0=\_dimexpr \_dp0+\_dimen1 \_relax \_fi
+ \_box0
+ \_kern\_dimen0}
+ \_egroup % of \vbox\bgroup
+}
+\_def\_circlet#1#2#3{\_circle{#1}{#2}}
+
+\_public \inoval \incircle \ratio \lwidth \fcolor \lcolor \shadow \overlapmargins ;
+
+ \_doc -----------------------------
+ A shadow effect is implemented here. The shadow is equal to the
+ silhouette of the given path in a gray-transparent color shifted by
+ \`\_shadowmoveto` vector and with blurred boundary.
+ A waistline with the width 2*\`\_shadowb` around the boundary is blurred.
+ The \`\shadowlevels` levels of transparent shapes is used for creating
+ this effect. The `\shadowlevels+1/2` level is equal to the shifted given path.
+ \_cod -----------------------------
+
+\_def\_shadowlevels{9} % number of layers for blurr effect
+\_def\_shadowdarknessA{0.025} % transparency of first shadowlevels/2 layers
+\_def\_shadowdarknessB{0.07} % transparency of second half of layers
+\_def\_shadowmoveto{1.8 -2.5} % vector defines shifting layer (in bp)
+\_def\_shadowb{1} % 2*shadowb = blurring area thickness
+
+ \_doc -----------------------------
+ The `\_pdfpageresources` primitive is used to define transparency.
+ It does not work when used in a box. So, we use it at the beginning of
+ the output routine. The modification of the output routine is done
+ using \`\_insertshadowresources` only once when the shadow effect is used first.
+ \_cod -----------------------------
+
+\_def\_insertshadowresources{%
+ \_global\_addto\_begoutput{\_setshadowresources}%
+ \_xdef\_setshadowresources{%
+ \_pdfpageresources{/ExtGState
+ <<
+ /op1 <</Type /ExtGState /ca \_shadowdarknessA>>
+ /op2 <</Type /ExtGState /ca \_shadowdarknessB>>
+ \_morepgresources
+ >>
+ }%
+ }%
+ \_global\_let\_insertshadowresources=\_relax
+}
+\_def\_morepgresources{}
+
+ \_doc -----------------------------
+ The \`\_doshadow``{<curve>}` does the shadow effect.
+ \_cod -----------------------------
+
+\_def\_doshadow#1{\_vbox{%
+ \_insertshadowresources
+ \_tmpnum=\_numexpr (\_shadowlevels-1)/2 \_relax
+ \_edef\_tmpfin{\_the\_tmpnum}%
+ \_ifnum\_tmpfin=0 \_def\_shadowb{0}\_def\_shadowstep{0}%
+ \_else \_edef\_shadowstep{\_expr{\_shadowb/\_tmpfin}}\_fi
+ \_def\_tmpa##1##2##3{\_def\_tmpb
+ {#1{##1+2*\_the\_tmpnum*\_shadowstep}{##2+2*\_the\_tmpnum*\_shadowstep}{##3}}}%
+ \_ea \_tmpa \_tmpb
+ \_def\_shadowlayer{%
+ \_ifnum\_tmpnum=0 /op2 gs \_fi
+ \_tmpb\_space f
+ \_immediateassignment\_advance\_tmpnum by-1
+ \_ifnum-\_tmpfin<\_tmpnum
+ \_ifx#1\_oval 1 0 0 1 \_shadowstep\_space \_shadowstep\_space cm \_fi
+ \_ea \_shadowlayer \_fi
+ }%
+ \_pdfliteral{q /op1 gs 0 g 1 0 0 1 \_shadowmoveto\_space cm
+ \_ifx#1\_circlet 1 0 0 1 \_expr{\_bp{.5\_wd0}} \_expr{\_bp{(\_ht0-\_dp0)/2}} cm
+ \_else 1 0 0 1 -\_shadowb\_space -\_shadowb\_space cm \_fi
+ \_shadowlayer Q}
+}}
+
+ \_doc -----------------------------
+ A generic macro \`\_clipinpath``<x> <y> <curve> <text>` declares
+ a clipping path by the `<curve>` shifted by the `<x>`, `<y>`. The `<text>` is typeset
+ when such clipping path is active. Dimensions are given by bp without the unit here.
+ The macros \`\clipinoval` `<x> <y> <width> <height> {<text>}` and
+ \`\clipincircle` `<x> <y> <width> <height> {<text>}` are defined here.
+ These macros read normal \TeX/ dimensions in their parameters.
+ \_cod -----------------------------
+
+\_def\_clipinpath#1#2#3#4{% #1=x-pos[bp], #2=y-pos[bp], #3=curve, #4=text
+ \_hbox{\_setbox0=\_hbox{{#4}}%
+ \_tmpdim=\_wd0 \_wd0=\_zo
+ \_pdfliteral{q \_mv{#1}{#2}{#3 W n}}%
+ \_box0\_pdfliteral{Q}\_kern\_tmpdim
+ }%
+}
+
+\_def\_clipinoval {\_ea\_ea\_ea\_clipinovalA\_scantwodimens}
+\_def\_clipinovalA #1#2{%
+ \_def\_tmp{{#1/65781.76}{#2/65781.76}}%
+ \_ea\_ea\_ea\_clipinovalB\_scantwodimens
+}
+\_def\_clipinovalB{\_ea\_clipinovalC\_tmp}
+\_def\_clipinovalC#1#2#3#4{%
+ \_ea\_clipinpath{#1-(#3/131563.52)+(\_bp{\_roundness})}{#2-(#4/131563.52)+(\_bp{\_roundness})}%
+ {\_oval{#3/65781.76-(\_bp{2\_roundness})}{#4/65781.76-(\_bp{2\_roundness})}{\_bp{\_roundness}}}%
+}
+\_def\_clipincircle {\_ea\_ea\_ea\_clipincircleA\_scantwodimens}
+\_def\_clipincircleA #1#2{%
+ \_def\_tmp{{#1/65781.76}{#2/65781.76}}%
+ \_ea\_ea\_ea\_clipincircleB\_scantwodimens
+}
+\_def\_clipincircleB#1#2{%
+ \_ea\_clipinpath\_tmp{\_circle{#1/65781.76}{#2/65781.76}}%
+}
+\_public \clipinoval \clipincircle ;
+
+
+\_endcode % -------------------------------------
+
+The \^`\inspic` is defined by `\pdfximage` and `\pdfrefximage` primitives.
+If you want to use one picture more than once in your document, then the
+following code is recommended:
+\begtt \catcode`\<=13
+\newbox\mypic
+\setbox\mypic = \hbox{\picw=3cm \inspic{<picture>}}
+
+My picture: \copy\mypic, again my picture: \copy\mypic, etc.
+\endtt
+This code downloads the picture data to the PFD output only once (when
+`\setbox` is processed). Each usage of `\copy\mypic` puts only a pointer to
+the picture data in the PDF.
+
+If you want to copy the same picture in different sizes, then choose
+a \"basic size" used in `\setbox` and all different sizes can be realized by
+the \^`\transformbox{<transformation>}{\copy\mypic}`.
+
+\_endinput
+
+2020-12-21: \puttext: \box0 in goup, bugfix
+2020-04-12: \_public \clipinoval \clipincircle ; added, bug fixed
+
diff --git a/macros/optex/base/hi-syntax.opm b/macros/optex/base/hi-syntax.opm
new file mode 100644
index 0000000000..eb6d747914
--- /dev/null
+++ b/macros/optex/base/hi-syntax.opm
@@ -0,0 +1,223 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \hisyntax {Syntax highlithing of verbatim listings <2020-04-04>} % preloaded in format
+
+ \_doc -----------------------------
+ The following macros `\replfromto` and `\replthis` manipulate with the
+ verbatim text which has been read already and stored in the `\_tmpb` macro.
+
+ The \`\replfromto` `{<from>}{<to>}{<what>}` finds first `<from>` then the
+ first `<to>` following by `<from>` pattern and the
+ `<text>` between them is packed to `#1`.
+ Then `<from><text><to>` is replaced by `<what>`. The `<what>` parameter
+ can use `#1` which is replaced by the `<text>`.
+
+ The `\replfromto` continues by finding next `<from>`, then, next `<to>`
+ repeatedly over the whole verbatim text. If the verbatim text is ended by
+ opened `<from>` but not closing by `<to>` then `<to>` is appended to the
+ verbatim text automatically and the last part of the verbatim text is replaced too.
+
+ First two parameters are expanded before usage of `\replfromto`. You can
+ use `\csstring\%` or something else here.
+ \_cod -----------------------------
+
+\_def\_replfromto #1#2{\_edef\_tmpa{{#1}{#2}}\_ea\_replfromtoE\_tmpa}
+\_def\_replfromtoE#1#2#3{% #1=from #2=to #3=what to replace
+ \_def\_replfrom##1#1##2{\_addto\_tmpb{##1}%
+ \_ifx\_end##2\_ea\_replstop \_else \_afterfi{\_replto##2}\_fi}%
+ \_def\_replto##1#2##2{%
+ \_ifx\_end##2\_afterfi{\_replfin##1}\_else
+ \_addto\_tmpb{#3}%
+ \_afterfi{\_replfrom##2}\_fi}%
+ \_def\_replfin##1#1\_end{\_addto\_tmpb{#3}\_replstop}%
+ \_edef\_tmpb{\_ea}\_ea\_replfrom\_tmpb#1\_end#2\_end\_end\_relax
+}
+\_def\_replstop#1\_end\_relax{}
+\_def\_finrepl{}
+
+ \_doc -----------------------------
+ The \`\replthis` `{<pattern>}{<what>}` replaces each `<pattern>` by `<what>`.
+ Both parameters of `\replthis` are expanded first.
+ \_cod -----------------------------
+
+\_def\_replthis#1#2{\_edef\_tmpa{{#1}{#2}}\_ea\_replstring\_ea\_tmpb \_tmpa}
+
+\_public \replfromto \replthis ;
+
+ \_doc -----------------------------
+ The patterns `<from>`, `<to>` and `<pattern>` are not found when they are
+ hidden in braces `{...}`. Example:
+ \begtt
+ \replfromto{/*}{*/}{\x C{/*#1/*}}
+ \endtt
+ replaces all C comments by `\x C{...}`. The patterns inside `{...}` are
+ not used by next usage of `\replfromto` or `\replthis` macros.
+
+ The \`\_xscan` macro does replacing `\x` by `\z` in the post-processing
+ phase. The `\x <letter>{<text>}` expands to `\_xscan {<letter>}<text>^^J^`.
+ If `#3` is `\_end` then it signals that something wrong happens, the
+ `<from>` was not terminated by legal `<to>` when `\replfromto` did work.
+ We must to fix it by the \`\_xscanR` macro.
+ \_cod -----------------------------
+
+\_def\_xscan#1#2^^J#3{\_ifx\_end#3 \_ea\_xscanR\_fi
+ \z{#1}{#2}%
+ \_ifx^#3\_else ^^J\_afterfi{\_xscan{#1}#3}\_fi}
+\_def\_xscanR#1\_fi#2^{^^J}
+
+ \_doc -----------------------------
+ The \`\hicolor` `<letter> <color>` defines `\_z<letter>{<text>}`
+ as `{<color><text>}`. It should be used in the context of
+ `\x <letter>{<text>}` macros.
+ \_cod -----------------------------
+
+\_def\_hicolor #1#2{\_sdef{_z:#1}##1{{#2##1}}}
+
+ \_doc -----------------------------
+ The \`\hisyntax``{<name>}` re-defines default \^`\_prepareverbdata``<macro><verbtext>`
+ in order to it does more things:
+ It saves `<verbtext>` to `\_tmpb`, appends `\n` around spaces and
+ `^^J` characters in pre-processing phase, it opens `hisyntax-<name>.opm`
+ file if `\_hisyntax<name>` is not defined. Then `\_the\_isyntax<name>`
+ is processed. Finally, the post-processing phase is realized by setting
+ appropriate values to `\x` and `\y` macros and doing
+ `\_edef\_tmpb{\_tmpb}`.
+ \_cod -----------------------------
+
+\_def\_hisyntax#1{\_def\_prepareverbdata##1##2{%
+ \_let\n=\_relax \_let\b=\_relax \_def\t{\n\_noexpand\t\n}\_let\_start=\_relax
+ \_adef{ }{\n\_noexpand\ \n}\_edef\_tmpb{\_start^^J##2\_end}%
+ \_replthis{^^J}{\n^^J\b\n}\_replthis{\b\n\_end}{\_end}%
+ \_let\x=\_relax \_let\y=\_relax \_let\z=\_relax \_let\t=\_relax
+ \_hicomments % keeps comments declared by \commentchars
+ \_endlinechar=`\^^M
+ \_lowercase{\_def\_tmpa{#1}}%
+ \_ifcsname _hialias:\_tmpa\_endcsname \_edef\_tmpa{\_cs{_hialias:\_tmpa}}\_fi
+ \_ifx\_tmpa\_empty \_else
+ \_unless \_ifcsname _hisyntax\_tmpa\_endcsname
+ \_isfile{hisyntax-\_tmpa.opm}\_iftrue \_opinput {hisyntax-\_tmpa.opm} \_fi\_fi
+ \_ifcsname _hisyntax\_tmpa\_endcsname
+ \_ifcsname hicolors\_tmpa\_endcsname
+ \_cs{_hicolors\_tmpa}=\_cs{hicolors\_tmpa}%
+ \_else
+ \_if^\_the\_hicolors^\_else
+ \_ifcsname _hicolors\_tmpa\_endcsname
+ \_global\_cs{_hicolors\_tmpa}=\_hicolors \_global\_hicolors={}%
+ \_fi\_fi\_fi
+ \_ea\_the \_csname _hisyntax\_tmpa\_endcsname % \_the\_hisyntax<name>
+ \_else\_opwarning{Syntax "\_tmpa" undeclared (no file hisyntax-\_tmpa.opm)}
+ \_fi\_fi
+ \_replthis{\_start\n^^J}{}\_replthis{^^J\_end}{^^J}%
+ \_def\n{}\_def\b{}\_adef{ }{\_dsp}%
+ \_bgroup \_lccode`\~=`\ \_lowercase{\_egroup\_def\ {\_noexpand~}}%
+ \_def\w####1{####1}\_def\x####1####2{\_xscan{####1}####2^^J^}%
+ \_def\y####1{\_ea \_noexpand \_csname ####1\_endcsname}%
+ \_edef\_tmpb{\_tmpb}%
+ \_def\z####1{\_cs{_z:####1}}%
+ \_def\t{\_hskip \_dimexpr\_tabspaces em/2\_relax}%
+ \_localcolor
+}}
+\_public \hisyntax \hicolor ;
+
+ \_doc -----------------------------
+ Aliases for languages can be declared like this.
+ When `\hisyntax{xml}` is used then this is the same as `\hisyntax{html}`.
+ \_cod -----------------------------
+
+\_sdef{_hialias:xml}{html}
+\_sdef{_hialias:json}{c}
+
+\_endcode % -------------------------------------------
+
+The user can write
+
+\begtt \adef/{\_csstring\\}
+\begtt \hisytnax{C}
+...
+/endtt
+\endtt
+and the code is colorized by C syntax.
+The user can write `\everytt={\hisyntax{C}}` and all verbatim listings are
+colorized.
+
+The \^`\hisyntax``{<name>}` reads the file `hisyntax-<name>.opm` where the
+colorization is declared. The parameter `<name>` is case insensitive and the
+file name must include it in lowercase letters. For example, the file
+`hisyntax-c.opm` looks like this:
+
+\printdoc hisyntax-c.opm
+
+\OpTeX/ provides `hisyntax-{c,python,tex,html}.opm` files.
+You can take inspiration from these files and declare more languages.
+
+User can re-declare colors by `\hicolors={...}` This value has precedence
+before `\_hicolors<name>` values declared in the `hicolors-<name>.opm` file.
+What exactly to do: copy `\_hicolors<name>={...}`
+from `hicolors-<name>.opm` to your document,
+rename it as `\hicolors={...}` and do you own colors modifications.
+
+Another way to set non-default colors is to declare
+`\newtoks\hicolors<name>` (without the `_` prefix) and set the colors palette here.
+It has precedence before `\_hicolors<name>` (with the `_` prefix) declared in
+the `hicolors-<name>.opm` file.
+This is useful when there are more hi-syntax languages used in one document.
+
+\secl4 Notes for hi-syntax macro writers
+The file `hisyntax-<name>.opm` is read only once in the \TeX/ group.
+If there are definitions then they must be declared as global.
+
+The `hisyntax-<name>.opm` file must (globally) declare `\_hisyntax<name>` tokens string
+where the action over verbatim text is declared typically by `\replfromto` or
+`\replthis` macros.
+
+The verbatim text is prepared by {\em pre-processing phase}, then the
+`\_hisyntax<name>` is applied and then {\em post-processing phase} does final
+corrections. Finally, the verbatim text is printed line by line.
+
+The pre-processing phase does:
+
+\begitems
+* Each space is replaced by {\visiblesp`\n\ \n`}, so `\n<word>\n` should be a pattern to
+ finding whole words (no subwords). The `\n` control sequence is removed in
+ the post-processing phase.
+* Each end of line is represented by `\n^^J\n`.
+* The `\_start` control sequence is added before the verbatim text and the `\_end` control
+ sequence is appended to the end of the verbatim text. These control
+ sequences are removed in the post-processing phase.
+\enditems
+
+Special macros are working only in a group when processing the verbatim
+text.
+
+
+\begitems
+* `\n` means noting but it should be used as a boundary of words as mentioned above.
+* `\t` means a tabulator. It is prepared as `\n\t\n` because it can be at
+ the boundary of a word.
+* `\x <letter>{<text>}` can be used as replacing text. Suppose the example
+ \begtt
+ \replfromto{/*}{*/}{\x C{/*#1*/}}
+ \endtt
+ This replaces all C comments `/*...*/` by `\x C{/*...*/}`. But the
+ C comments may span more lines, i.e. the `^^J` should be inside it.
+
+ The macro `\x <letter>{<text>}` is replaced by one or more
+ `\z <letter>{<text>}` in post-processing phase where each parameter `<text>` of
+ `\z` keeps inside one line. Inside-line parameters are represented
+ by `\x C{<text>}` and they are replaced to `\z C{<text>}` without any change.
+ But:
+ \begtt \catcode`\<=13
+ \x C{<text1>^^J<text3>^^J<text3>}
+ is replaced by
+ \z C{<text1>}^^J\z C{<text2>}^^J\z C{<text3>}
+ \endtt
+ The `\z <letter>{<text>}` is expanded to `\_z:<letter>{<text>}` and if
+ `\hicolor <letter> <color>` is declared then
+ `\_z:<letter>{<text>}` expands to `{<color><text>}`. So, required color is
+ activated at all lines (separately) where C comment spans.
+* `\y {<text>}` is replaced by `\<text>` in the post processing phase. It should
+ be used for macros without a parameter. You cannot use unprotected macros
+ as replacement text before the post-processing phase, because the post-processing
+ phase is based on expansion whole verbatim text.
+\enditems
+
diff --git a/macros/optex/base/hisyntax-c.opm b/macros/optex/base/hisyntax-c.opm
new file mode 100644
index 0000000000..3c1f228f88
--- /dev/null
+++ b/macros/optex/base/hisyntax-c.opm
@@ -0,0 +1,66 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \_hisyntaxc {Syntax highlighting for C sources <2020-04-03>}
+
+\_newtoks \_hisyntaxc \_newtoks \_hicolorsc
+
+\_global\_hicolorsc={% colors for C language
+ \_hicolor K \Red % Keywords
+ \_hicolor S \Magenta % Strings
+ \_hicolor C \Green % Comments
+ \_hicolor N \Cyan % Numbers
+ \_hicolor P \Blue % Preprocessor
+ \_hicolor O \Blue % Non-letters
+}
+\_global\_hisyntaxc={%
+ \_the\_hicolorsc
+ \_let\c=\_relax \_let\e=\_relax \_let\o=\_relax
+ \_replfromto {/*}{*/} {\x C{/*#1*/}}% /*...*/
+ \_replfromto {//}{^^J} {\z C{//#1}^^J}% //...
+ \_replfromto {\_string#}{^^J} {\z P{\##1}^^J}% #include ...
+ \_replthis {\_string\"} {{\_string\"}}% \" protected inside strings
+ \_replfromto {"}{"} {\x S{"#1"}}% "..."
+ %
+ \_edef\_tmpa {()\_string{\_string}+-*/=[]<>,:;\_pcent\_string&\_string^|!?}% non-letters
+ \_ea \_foreach \_tmpa
+ \_do {\_replthis{#1}{\n\o#1\n}}
+ \_foreach % keywords
+ {auto}{break}{case}{char}{continue}{default}{do}{double}%
+ {else}{entry}{enum}{extern}{float}{for}{goto}{if}{int}{long}{register}%
+ {return}{short}{sizeof}{static}{struct}{switch}{typedef}{union}%
+ {unsigned}{void}{while}
+ \_do {\_replthis{\n#1\n}{\z K{#1}}}
+ \_replthis{.}{\n.\n} % numbers
+ \_foreach 0123456789
+ \_do {\_replfromto{\n#1}{\n}{\c#1##1\e}}
+ \_replthis{\e.\c}{.}
+ \_replthis{\e.\n}{.\e}
+ \_replthis{\n.\c}{\c.}
+ \_replthis{e\e\o+\c}{e+}\_replthis{e\e\o-\c}{e-}
+ \_replthis{E\e\o+\c}{E+}\_replthis{E\e\o-\c}{E-}
+ \_def\o#1{\z O{#1}}
+ \_def\c#1\e{\z N{#1}}
+}
+
+\_endcode %------------------------------------------------
+
+
+Each `hisyntax-<name>.opm` file must declare the token list
+`\_hisyntax<name>` using `\newtoks` and must declare the syntax declaration
+in it. The second token list `\_hicolors<name>` is optional but recommended.
+User can re-declare his/her own colors by `\hicolors` which has precedence
+before `\_hicolors<name>`.
+
+The public variants can be declared if you want to give these token lists to
+the user namespace. But it is not explicitly needed.
+
+All settings must be global here because the file is typically read inside
+a group and we need not read it repeatedly before each code chunk
+again and again.
+
+Note that `\foreach` is used for each non-letters (expanded via \string
+because we needn't treat with active or special TeX characters). The
+keyword is applied in the `\foreach` loop too.
+
+See `hi-sytax.opm` for more information about `\hicolor`, `\replfromto` and
+`\replthis` macros.
diff --git a/macros/optex/base/hisyntax-html.opm b/macros/optex/base/hisyntax-html.opm
new file mode 100644
index 0000000000..3f0be6a23e
--- /dev/null
+++ b/macros/optex/base/hisyntax-html.opm
@@ -0,0 +1,31 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl\_hisyntaxhtml {Syntax highlighting for html or xml sources <2020-04-03>}
+
+\_newtoks\_hisyntaxhtml \_newtoks\_hicolorshtml
+
+\_global\_hicolorshtml={% colors in html codes
+ \_hicolor A \Cyan % <, > and parameters
+ \_hicolor T \Red % tag names
+ \_hicolor C \Green % comments
+ \_hicolor E \Blue % HTML entities
+ \_hicolor S \Magenta % strings in parameters
+}
+\_global\_hisyntaxhtml={
+ \_the\_hicolorshtml
+ \_replfromto{<!--}{-->}{\x C{<!--#1-->}}
+ \_replthis{<}{\y{_hitaghtml}}
+ \_replthis{\_string&}{\y{_hientityhtml}}
+}
+\_gdef\_hitaghtml#1>{\_hitaghtmlA#1\ >}
+\_gdef\_hitaghtmlA#1\ #2>{\z A{<}\z T{#1}\_def\_tmpb{#2^}%
+ \_if^\_tmpb
+ \_else \_space
+ \_replthis{\ ^}{}\_replfromto{"}{"}{\_histringhtml{"##1"}}\z A{\_tmpb}\_fi
+ \z A{>}%
+}
+\_gdef\_histringhtml#1{\_visiblesp \z S{#1}}
+\_gdef\_hientityhtml#1;{\z E{\&#1;}}
+
+\_endcode %------------------------------------------------
+
diff --git a/macros/optex/base/hisyntax-python.opm b/macros/optex/base/hisyntax-python.opm
new file mode 100644
index 0000000000..6250eed0e3
--- /dev/null
+++ b/macros/optex/base/hisyntax-python.opm
@@ -0,0 +1,82 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \_hisyntaxpython {Syntax highlighting for Python sources <2020-04-04>}
+
+\_newtoks \_hisyntaxpython \_newtoks \_hicolorspython
+
+\_global\_hicolorspython={% colors for Python language
+ \_hicolor M \Orange % Multi line strings
+ \_hicolor S {\_visiblesp \Grey} % Single line strings
+ \_hicolor C \Green % Comments
+ \_hicolor K \LightBlue % Keywords
+ \_hicolor O \Blue % Operators
+ \_hicolor N \Red % Numbers
+ \_hicolor D \Magenta % def names
+ \_hicolor L \Black % class names
+ \_hicolor R \Magenta % Decorators
+}
+\_global\_hisyntaxpython={%
+ \_the\_hicolorspython
+ \_let\s=\_relax \_let\c=\_relax \_let\e=\_relax \_let\o=\_relax
+ \_replthis{\_string\"}{{\_string\"}} % protect \", \'
+ \_replthis{\_string\'}{{\_string\'}}
+ %
+ \_replfromto{\_string#}{^^J}{\z C{\##1}^^J} % comments
+ %
+ \_replthis{'''}{\_noexpand\_hipystr0{'''}M} % search string marks
+ \_replthis{"""}{\_noexpand\_hipystr1{"""}M}
+ \_replthis{"}{\_noexpand\_hipystr2{"}S}
+ \_replthis{'}{\_noexpand\_hipystr3{'}S}
+ \_edef\_tmpb{\_tmpb} % realize string marks
+ %
+ \_foreach {br}{Br}{bR}{BR}{rb}{rB}{Rb}{RB}uUrRbB % string prefixes
+ \_do {\_replthis{#1\s}{\_noexpand\_hipystrpre#1}}
+ \_def\s{}
+ \_edef\_tmpb{\_tmpb}
+ %
+ \_edef \_tmpa {+-*./=<>()[]:,;!|\_pcent % operators
+ \_string{\_string}@\_string&\_string~\_string^}
+ \_ea\_foreach \_tmpa
+ \_do {\_replthis{#1}{\n\o#1\n}}
+ %
+ \_foreach % keywords
+ {and}{as}{assert}{async}{await}{break}{continue}{del}{elif}{else}{except}%
+ {exec}{False}{finally}{for}{from}{global}{if}{import}{in}{is}{lambda}{None}%
+ {nonlocal}{not}{or}{pass}{print}{raise}{return}{True}{try}{while}{with}{yield}%
+ \_do {\_replthis{\n#1\n}{\z K{#1}}}
+ \_replfromto{\n def\n}{\n\o(\n}{\z K{def}\x D{#1}\n\o(\n}
+ \_replfromto{\n class\n}{\n\o(\n}{\z K{class}\x L{#1}\n\o(\n}
+ %
+ \_foreach 0123456789 % numbers
+ \_do {\_replfromto{\n#1}{\n}{\c#1##1\e}}
+ %
+ \_replthis{\e\o.\c}{.}
+ \_replthis{\e\o.\n}{.\e}
+ \_replthis{\n\o.\c}{\c.}
+ \_replthis{e\e\o+\c}{e+}\_replthis{e\e\o-\c}{e-}
+ \_replthis{E\e\o+\c}{E+}\_replthis{E\e\o-\c}{E-}
+ \_replthis{\e j}{j\e}
+ %
+ \_replfromto{\n\o@\n}{^^J}{\z R{#1}^^J} % decorators
+ %
+ \_def\o#1{\z O{#1}}
+ \_def\c#1\e{\z N{#1}}
+}
+
+\_gdef\_hipystr#1#2#3#4\_hipystr#5#6#7{%
+ \_ifx#1#5\s\x#3{#2#4#2}%
+ \_else \_afterfi{\_hipystr#1{#2}#3#4#6}\_fi
+}
+\_gdef\_hipystrpre#1\x#2{\x#2{#1}\x#2}
+
+\_ifx\LightBlue\_undefined \_gdef\LightBlue {\_setcmykcolor{1 0.43 0 0}}\_fi
+\_ifx\Orange\_undefined \_gdef\Orange {\_setcmykcolor{0 0.64 1 0}}\_fi
+
+\_endcode %------------------------------------------------
+
+This code was greatly inspired by the OPMac hisyntax macros for Python:
+
+ https://gitlab.fit.cvut.cz/krajnpet/PySyntax
+
+created by Petr Krajnik.
+
diff --git a/macros/optex/base/hisyntax-tex.opm b/macros/optex/base/hisyntax-tex.opm
new file mode 100644
index 0000000000..583676a2ca
--- /dev/null
+++ b/macros/optex/base/hisyntax-tex.opm
@@ -0,0 +1,38 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl\_hisyntaxtex {Syntax highlighting for TeX sources <2020-04-03>}
+
+\_newtoks\_hisyntaxtex \_newtoks\_hicolorstex
+
+\_global\_hicolorstex={% colors in TeX codes
+ \_hicolor S \Blue % control sequences
+ \_hicolor B \Magenta % {, }, $
+ \_hicolor C \Green % comments
+}
+\_global\_hisyntaxtex={
+ \_the\_hicolorstex
+ \_replthis{\_string\%}{\y{_createcs}{\_csstring\%}}
+ \_replfromto{\_csstring\%}{^^J}{\x C{\_csstring\%#1}^^J}
+ \_replthis{\_string\\}{\y{_createcs}{\_csstring\\}}
+ \_replthis{\_string\{}{\y{_createcs}{\_csstring\{}}
+ \_replthis{\_string\}}{\y{_createcs}{\_csstring\}}}
+ \_replthis{\_string\$}{\y{_createcs}{\_csstring\$}}
+ \_replthis{\_csstring\\}{\y{_createcs}}
+ \_replthis{\_csstring\{}{\x B{\_csstring\{}}
+ \_replthis{\_csstring\}}{\x B{\_csstring\}}}
+ \_replthis{\_csstring\$}{\x B{\_csstring\$}}
+}
+\_gdef\_createcs#1{\_def\_csletters{#1}%
+ \_ifcat a\_noexpand#1\_afterfi{\_futurelet\_next\_createcsA}%
+ \_else \_ea\_createcsF \_fi
+}
+\_gdef\_createcsA{\_ifcat a\_noexpand\_next \_ea\_createcsB \_else \_ea\_createcsF \_fi}
+\_gdef\_createcsB#1{\_addto\_csletters{#1}\_futurelet\_next\_createcsA}
+\_gdef\_createcsF{\z S{\_csstring\\\_csletters}}
+\_gdef\_createbb{\_ea\_createcs\_csstring\\}
+
+\_endcode %------------------------------------------------
+
+The `\_createcs` reads next tokens as the tokenizer does it until the name
+of a control sequence is read. It is saved to the `\_csletters` macro and
+the macro \_createcsF prints it.
diff --git a/macros/optex/base/hyperlinks.opm b/macros/optex/base/hyperlinks.opm
new file mode 100644
index 0000000000..5fc8a32233
--- /dev/null
+++ b/macros/optex/base/hyperlinks.opm
@@ -0,0 +1,157 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \ulink {Hyperlinks <2021-01-27>} % preloaded in format
+
+ \_doc ----------------------------
+ \`\dest``[<type>:<spec>]` creates a destination of internal links. The
+ destination is declared in the format `<type>:<spec>`. If the \^`\hyperlinks`
+ command in not used, then `\dest` does nothing else it is set to `\_destactive`.
+ The \`\_destactive` is implemented by `\_pdfdest` primitive. It creates a box
+ in which the destination is shifted by \`\_destheight`. The reason is that
+ the destination is exactly at the top border of the PDF viewer but we want to see
+ the line where the destination is. The destination box is positioned by a
+ different way dependent on the current vertical or horizontal mode.
+ \_cod ----------------------------
+
+\_def\_destheight{1.4em}
+\_def\_destactive[#1:#2]{\_if$#2$\_else\_ifvmode
+ \_tmpdim=\_prevdepth \_prevdepth=-1000pt
+ \_destbox[#1:#2]\_prevdepth=\_tmpdim
+ \_else \_destbox[#1:#2]%
+ \_fi\_fi
+}
+\_def\_destbox[#1]{\_vbox to\_zo{\_kern-\_destheight \_pdfdest name{#1} xyz\_vss}}
+\_def\_dest[#1]{}
+\_public \dest ;
+
+ \_doc ----------------------------
+ \`\link``[<type>:<spec>]{<color>}{<text>}` creates an internal link to \^`\dest`
+ with the same `<type>:<spec>`. You can have more links with the same
+ `<type>:<spec>` but only one `\dest` in the document. If \^`\hyperlinks`
+ command is not used, then `\link` only prints `<text>` else it is set to
+ `\_linkactive`.
+ The \`\_linkactive` is implemented by `\_pdfstartlink...\_pdfendlink`
+ primitives.
+ \nl
+ \`\ilink``[<type>:<spec>]{<text>}` is equivalent to `\_link` but
+ the `<color>` is used from \^`\hyperlinks` declaration.
+ \_cod ----------------------------
+
+\_protected\_def\_linkactive[#1:#2]#3#4{\_leavevmode\_pdfstartlink height.9em depth.3em
+ \_pdfborder{#1} goto name{#1:#2}\_relax {#3#4}\_pdfendlink
+}
+\_protected\_def\_link[#1]#2#3{\_leavevmode{#3}}
+\_protected\_def\_ilink[#1]#2{\_leavevmode{#2}}
+\_public \ilink \link ;
+
+ \_doc ----------------------------
+ \`\ulink``[<url>]{<text>}` creates external link. It prints only the `<text>` by default but
+ the \^`\hyperlinks` declaration defines it as \`\_urlactive``[url:<url>]{<text>}`.
+ The external link is created by the `\_pdfstartlink...\pdfendlink` primitives.
+ The `<url>` is detokenized with `\escapechar=-1` before it is used, so
+ `\%`, `\#` etc. can be used in the `<url>`.
+ \_cod ----------------------------
+
+\_protected\_def\_urlactive[#1:#2]#3#4{\_leavevmode{\_escapechar=-1
+ \_pdfstartlink height.9em depth.3em \_pdfborder{#1}%
+ user{/Subtype/Link/A <</Type/Action/S/URI/URI(\_detokenize{#2})>>}\_relax
+ {#3#4}\_pdfendlink}%
+}
+\_def\_ulink[#1]#2{\_leavevmode{#2}}
+\_def\_urlcolor{}
+\_public \ulink ;
+
+ \_doc ----------------------------
+ The `\_pdfstartlink` primitive uses `\_pdfborder{<type>}` in its parameter
+ (see \^`\_linkactive` or \^`\_urlactive` macros). The \`\_pdfborder``{<type>}`
+ expands to `attr{/C[? ? ?] /Border[0 0 .6]}` if the
+ `\_<type>border` (i.e.\ \`\_refborder`, \`\_citeborder`, \`\_tocborder`,
+ \`\_pgborder`, \`\_urlborder`, \`\_fntborder` or \`\_fnfborder`)
+ is defined. Users can define it in
+ order to create colored frames around active links. For example
+ `\def\_tocborder{1 0 0}` causes red frames in TOC (not printed, only visible
+ in PDF viewers).
+ \_cod ----------------------------
+
+\_def\_pdfborder#1{\_ifcsname _#1border\_endcsname
+ attr{/C[\_csname _#1border\_endcsname] /Border[0 0 .6]}%
+ \_else attr{/Border[0 0 0]}\_fi
+}
+
+ \_doc ----------------------------
+ \`\hyperlinks``{<ilink_color>}{<ulink_color>}` activates `\dest`, `\link`,
+ `\ilink`, `\ulink` in order they create links. These macros are redefined
+ here to their \"active" version.
+ \_cod ----------------------------
+
+\_def\_hyperlinks#1#2{%
+ \_let\_dest=\_destactive \_let\_link=\_linkactive
+ \_def\_ilink[##1]##2{\_link[##1]{\_localcolor#1}{##2}}%
+ \_def\_ulink[##1]##2{\_urlactive[url:##1]{\_localcolor#2}{##2}}%
+ \_public \dest \ilink \ulink \link ;%
+}
+\_public \hyperlinks ;
+
+ \_doc ----------------------------
+ \`\url``{<url>}` does approximately the same as \^`\ulink``[<url>]{<url>}`, but
+ more work is done before the `\ulink` is processed. The link-version of <url>
+ is saved to `\_tmpa` and the printed version in `\_tmpb`. The printed
+ version is modified in order to set breakpoints to special places of the
+ `<url>`. For example `//` is replaced by `\_urlskip/\_urlskip/\_urlbskip`
+ where `\urlskip` adds a small nonbreakable glue between these two slashes and
+ before them and `\_urlbskip` adds a breakable glue after them.
+ \nl
+ The text version of the `<url>` is printed in \`\_urlfont`.
+ \_cod ----------------------------
+
+\_def\_url#1{{%
+ \_def\_tmpa{#1}\_replstring\_tmpa {\|}{}%
+ {\_escapechar=-1 \_ea}\_ea\_edef\_ea\_tmpa\_ea{\_detokenize\_ea{\_tmpa}}%
+ \_def\_tmpb{#1}\_replstring\_tmpb {\|}{\_urlbskip}%
+ \_replstring\_tmpb {//} {{\_urlskip\_urlslashslash\_urlbskip}}%
+ \_replstring\_tmpb {/} {{\_urlskip/\_urlbskip}}%
+ \_replstring\_tmpb {.} {{\_urlskip.\_urlbskip}}%
+ \_replstring\_tmpb {?} {{\_urlskip?\_urlbskip}}%
+ \_replstring\_tmpb {=} {{\_urlskip=\_urlbskip}}%
+ \_ea\_replstring\_ea\_tmpb \_ea{\_string &} {{\_urlbskip\_char`\& \_urlskip}}%
+ \_ea\_replstring\_ea\_tmpb \_ea{\_bslash|} {{\_penalty0}}%
+ \_ea\_ulink \_ea[\_tmpa] {\_urlfont\_tmpb\_null}%
+}}
+\_def\_urlfont{\_tt}
+\_def\_urlskip{\_null\_nobreak\_hskip0pt plus0.05em\_relax}
+\_def\_urlbskip{\_penalty100 \_hskip0pt plus0.05em\_relax}
+\_def\_urlslashslash{/\_urlskip/}
+
+\_public \url ;
+
+\_endcode % ----------------------------------------
+
+
+There are four types of internal links and one type of external link:
+
+\begitems
+* `ref:<label>` -- the destination is created when `\label[<label>]` is used,
+ see also the section \ref[references].
+* `toc:<tocrefnum>` -- the destination is created at chap/sec/secc titles,
+ see also the section \ref[maketoc].
+* `pg:<gpageno>` -- the destination is created at beginning of each page,
+ see also the section \ref[output].
+* `cite:<bibnum>` -- the destination is created in bibliography reference,
+ see also the section \ref[bib].
+* `url:<url>` -- used by `\url` or `\ulink`,
+ see also the end of this section.
+\enditems
+
+The `<tocrefnum>`, `<gpageno>`, and `<bibnum>` are numbers starting from one and
+globally incremented by one in the whole document. The registers \^`\tocrefnum`,
+\^`\gpageno` and \^`\bibnum` are used for these numbers.
+
+When a chap/sec/secc title is prefixed by `\label[<label>]`, then both types
+of internal links are created at the same destination place:
+`toc:<tocrefnum>` and `ref:<label>`.
+
+\_endinput
+
+2021-01-27 \public \link added to \hyperlinks, bug fixed.
+2020-04-22 \| in \url: bug fixed
+2020-03-15 introduced \ No newline at end of file
diff --git a/macros/optex/base/hyphen-lan.opm b/macros/optex/base/hyphen-lan.opm
new file mode 100644
index 0000000000..dad0b26657
--- /dev/null
+++ b/macros/optex/base/hyphen-lan.opm
@@ -0,0 +1,245 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \langlist {Initialization of hypenation patterns <2020-03-10>} % preloaded in format
+
+ \_doc -----------------------------
+ The <iso-code> means a shortcut of language name (mostly by ISO 639-1).
+ The following control sequences are used for language switching:
+ \begitems
+ * `\_lan:<number>` expands to `<iso-code>` of the language.
+ The <number> is an internal number of languages used as a value of
+ `\language` register.
+ * `\_ulan:<long-lang>` expands to `<iso-code>` too. This is transformation
+ from long name of language (lowercase letters) to <iso-code>.
+ * `\_<iso-code>Patt` (for example `\_csPatt`) is the language `<number>` declared by `\chardef`.
+ * `\<iso-code>lang`
+ (for example \`\enlang`, \`\cslang`, \`\sklang`, \`\delang`, \`\pllang`)
+ is language selector. It exists in two states
+ \begitems
+ * Initialization state: when `\<iso-code>lang` is used first then it
+ must load the patterns into memory using Lua code. If it is done then
+ the `\<iso-code>lang` re-defines itself to the processing state.
+ * Processing state: it only sets `\language=\_<iso-code>Patt`, i.e it
+ selects the hyphenation patterns. It does a little more
+ language-dependent work, as mentioned below.
+ \enditems
+ * `\_langspecific:<isocode>` is processed by `\<iso-code>lang` and it
+ should include language-specific macros declared by the user or macro designer.
+ \enditems
+ The USenglish patters are preloaded first:
+ \_cod -----------------------------
+
+\_chardef\_enPatt=0
+\_def\_pattlist{\_enPatt=0}
+\_def\_langlist{en(USenglish)}
+\_sdef{_lan:0}{en}
+\_sdef{_ulan:usenglish}{en}
+\_def\_enlang{\_uselang{en}\_enPatt23} % \lefthyph=2 \righthyph=3
+\_def\enlang{\_enlang}
+\_sdef{_langspecific:en}{\_nonfrenchspacing}
+
+\_lefthyphenmin=2 \_righthyphenmin=3 % disallow x- or -xx breaks
+\_input hyphen % en(USenglish) patterns from TeX82
+
+ \_doc -----------------------------
+ \`\_preplang` `<iso-code> <long-lang> <hyph-file-spec> <number> <pre-hyph><post-hyph>`
+ prepares the\nl `\<iso-code>lang` to its initialization state. Roughly
+ speaking, it does:
+ \begtt \catcode`\<=13
+ \chardef\_<iso-code>Patt = <number>
+ \def\_lan:<number> {<iso-code>}
+ \def\_ulan:<long-lang> {<iso-code>}
+ \def\_<iso-code>lang {%
+ \_loadpattrs <hyph-file-spec> <number> <long-lang> % loads patterns using Lua code
+ \gdef\_<iso-code>lang {\_uselang{<iso-code>}\_<iso-code>Patt <pre-hyph><post-hyph>}
+ \_<iso-code>lang % runs itself in processing state
+ }
+ \def\<iso-code>lang {\_<iso-code>lang} % public version \<iso-code>lang
+ \endtt
+ You can see that `\<iso-code>lang` runs \^`\_loadpattrs` and
+ \^`\_uselang` first (in initialization state) and it runs
+ only \^`\_uselang` when it is called again (in processing state).
+ \_cod -----------------------------
+
+\_def\_preplang #1 #2 #3 #4 #5 {%
+ \_ea\_chardef \_csname _#1Patt\_endcsname=#4
+ \_sdef{_lan:#4}{#1}\_lowercase{\_sdef{_ulan:#2}}{#1}%
+ \_def\_next{\_ea\_noexpand\_csname _#1lang\_endcsname}%
+ \_ea\_edef \_csname _#1lang\_endcsname {%
+ \_noexpand\_loadpattrs #3 #4 #2 % loads patterns
+ \_gdef\_next{\_noexpand\_uselang{#1}\_csname _#1Patt\_endcsname #5}% re-defines itself
+ \_next % runs itself in processing state
+ }
+ \_addto\_langlist{ #1(#2)}%
+ \_sdef{#1lang\_ea}\_ea{\_csname _#1lang\_endcsname}% unprefixed \<isocode>lang
+}
+
+ \_doc -----------------------------
+ \`\_loadpattrs` `<hyph-file-spec> <number> <long-lang>`
+ loads hyphenation patterns and hyphenation exceptions for given language
+ and registers them as `\language=<number>`.
+
+ The <hyph-file-spec> is a part of full file name wich is read:
+ `hyph-<hyph-file-spec>.tex`. The patterns and hyphenation exceptions
+ are saved here in UTF-8 encoding.
+ The <hyph-file-spec> should be a list of individual <hyph-file-spec>'s
+ separated by commas, see the language Serbian below for an example.
+ \_cod -----------------------------
+
+\_def\_loadpattrs#1 #2 #3 {%
+ \_wlog{Loading hyphenation #3: (#1) \_string\language=#2}%
+ \_begingroup\_setbox0=\_vbox{% we don't want spaces in horizontal mode
+ \_language=#2\_def\\{#3}%
+ \_let\patterns=\_patterns \_let\hyphenation=\_hyphenation \_def\message##1{}%
+ \_loadpattrsA #1,,%
+ }\_endgroup
+}
+\_def\_loadpattrsA #1,{\_ifx,#1,\_else
+ \_isfile {hyph-#1}\_iftrue \_opinput{hyph-#1}%
+ \_else \_opwarning{No hyph. patterns #1 for \\, missing package?}%
+ \_def\_opwarning##1{}\_fi
+ \_ea \_loadpattrsA \_fi
+}
+
+ \_doc -----------------------------
+ \`\_uselang``{<iso-code>}\_<iso-code>Patt <pre-hyph><post-hyph>`\nl
+ sets `\language`, `\lefthyphenmin`, `\righthyphenmin` and runs
+ `\frenchspacing`. This default language-dependent settings
+ should be re-declared by `\_langspecific:<iso-code>` which is run
+ finally (it is `\relax` by default, only `\_langspecific:en` runs
+ \^`\nonfrenchspacing`).
+ \_cod -----------------------------
+
+\_def\_uselang#1#2#3#4{\_language=#2\_lefthyphenmin=#3\_righthyphenmin=#4\_relax
+ \_frenchspacing % \nonfrenchspacing can be set in \cs{_langspecific:lan}
+ \_cs{_langspecific:#1}%
+}
+ \_doc -----------------------------
+ The \`\uselanguage` `{<long-lang>}` is defined here
+ (for compatibility with e-plain users).
+ \_cod -----------------------------
+
+\_def\_uselanguage#1{\_lowercase{\_cs{_\_cs{_ulan:#1}lang}}}
+\_public \uselanguage ;
+
+ \_doc -----------------------------
+ The numbers for languages are declared as fixed constants (no
+ auto-generated). This concept is inspired by CSplain.
+ There are typical numbers of languages in CSplain: 5=Czech in IL2,
+ 15=Czech in T1 and 115=Czech in Unicode. We keep these constants
+ but we load only Unicode patterns (greater than 100), of course.
+ \_cod -----------------------------
+
+\_preplang enus USenglishmax en-us 100 23
+\_preplang engb UKenglish en-gb 101 23
+\_preplang it Italian it 102 22
+\_preplang ia Interlingua ia 103 22
+\_preplang id Indonesian id 104 22
+
+\_preplang cs Czech cs 115 23
+\_preplang sk Slovak sk 116 23
+\_preplang de nGerman de-1996 121 22
+\_preplang fr French fr 122 22
+\_preplang pl Polish pl 123 22
+\_preplang cy Welsh cy 124 23
+\_preplang da Danish da 125 22
+\_preplang es Spanish es 126 22
+\_preplang sl Slovenian sl 128 22
+\_preplang fi Finnish fi 129 22
+\_preplang hu Hungarian hu 130 22
+\_preplang tr Turkish tr 131 22
+\_preplang et Estonian et 132 23
+\_preplang eu Basque eu 133 22
+\_preplang ga Irish ga 134 23
+\_preplang nb Bokmal nb 135 22
+\_preplang nn Nynorsk nn 136 22
+\_preplang nl Dutch nl 137 22
+\_preplang pt Portuguese pt 138 23
+\_preplang ro Romanian ro 139 22
+\_preplang hr Croatian hr 140 22
+\_preplang zh Pinyin zh-latn-pinyin 141 11
+\_preplang is Icelandic is 142 22
+\_preplang hsb Uppersorbian hsb 143 22
+\_preplang af Afrikaans af 144 12
+\_preplang gl Galician gl 145 22
+\_preplang kmr Kurmanji kmr 146 22
+\_preplang tk Turkmen tk 147 22
+\_preplang la Latin la 148 22
+\_preplang lac classicLatin la-x-classic 149 22
+\_preplang lal liturgicalLatin la-x-liturgic 150 22
+\_preplang elm monoGreek el-monoton 201 11
+\_preplang elp Greek el-polyton 202 11
+\_preplang grc ancientGreek grc 203 11
+\_preplang ca Catalan ca 204 22
+\_preplang cop Coptic cop 205 11
+\_preplang mn Mongolian mn-cyrl 206 22
+\_preplang sa Sanskrit sa 207 13
+\_preplang ru Russian ru 208 22
+\_preplang uk Ukrainian uk 209 22
+\_preplang hy Armenian hy 210 12
+\_preplang as Assamese as 211 11
+\_preplang hi Hindi hi 212 11
+\_preplang kn Kannada kn 213 11
+\_preplang lv Latvian lv 215 22
+\_preplang lt Lithuanian lt 216 22
+\_preplang ml Malayalam ml 217 11
+\_preplang mr Marathi mr 218 11
+\_preplang or Oriya or 219 11
+\_preplang pa Panjabi pa 220 11
+\_preplang ta Tamil ta 221 11
+\_preplang te Telugu te 222 11
+
+\_preplang be Belarusian be 223 22
+\_preplang bg Bulgarian bg 224 22
+\_preplang bn Bengali bn 225 11
+\_preplang cu churchslavonic cu 226 12
+\_preplang deo oldGerman de-1901 227 22
+\_preplang gsw swissGerman de-ch-1901 228 22
+\_preplang eo Esperanto eo 229 22
+\_preplang fur Friulan fur 230 22
+\_preplang gu Gujarati gu 231 11
+\_preplang ka Georgian ka 232 12
+\_preplang mk Macedonian mk 233 22
+\_preplang oc Occitan oc 234 22
+\_preplang pi Pali pi 235 12
+\_preplang pms Piedmontese pms 236 22
+\_preplang rm Romansh rm 237 22
+\_preplang sr Serbian sh-cyrl,sh-latn 238 22
+\_preplang sv Swedish sv 239 22
+\_preplang th Thai th 240 23
+\_preplang ethi Ethiopic mul-ethi 241 11
+
+ \_doc -----------------------------
+ The \`\langlist` includes names of all languages which are ready to load
+ and use their hyphenation patterns. This list is printed to the terminal and
+ to log at ini\TeX/ state here. It can be used when processing documents too.
+ \_cod -----------------------------
+
+\_message{Language hyph.patterns ready to load: \_langlist.
+ Use \_string\<shortname>lang to initialize language,
+ \_string\cslang\_space for example}
+
+\_public \langlist ;
+
+\_endcode % ---------------------------------------------
+
+
+Maybe, you need to do more language-specific actions than just switching
+hyphenation patterns. For example, you need to load a specific font with a
+specific script used in the selected language, you can define macros for
+quotation marks depending on the language, etc.
+
+The example shows how to declare such language-specific things.
+
+\begtt
+\def\langset #1 #2{\sdef{_langspecific:#1}{#2}}
+
+\langset fr {... declare French quotation marks}
+\langset de {... declare German quotation marks}
+\langset gr {... switch to Greek fonts family}
+... etc.
+\endtt
+
+Note that you need not set language-specific phrases (like `\today`)
+by this code. Another concept is used for such tasks. See the
+section~\ref[langphrases] for more details.
diff --git a/macros/optex/base/if-macros.opm b/macros/optex/base/if-macros.opm
new file mode 100644
index 0000000000..462e496017
--- /dev/null
+++ b/macros/optex/base/if-macros.opm
@@ -0,0 +1,313 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \newif {Special if-macros, is-macros and loops <2021-02-03>} % preloaded in format
+
+ \_doc ----------------------------
+ \secc Classical \code{\\newif}
+ The \`\newif` macro implements boolean value.
+ It works as in plain \TeX. It means that
+ after `\newif\ifxxx` you can use `\xxxtrue` or
+ `\xxxfalse` to set the boolean value and use `\ifxxx true\else false\fi`
+ to test this value. The default value is false.
+
+ The macro \`\_newifi` enables to declare `\_ifxxx` and to use `\_xxxtrue` and
+ `\_xxxfalse`. This means that it is usable for the internal namespace
+ (`_`prefixed macros).
+ \_cod ----------------------------
+
+\_def\_newif #1{\_ea\_newifA \_string #1\_relax#1}
+\_ea\_def \_ea\_newifA \_string\if #1\_relax#2{%
+ \_sdef{#1true}{\_let#2=\_iftrue}%
+ \_sdef{#1false}{\_let#2=\_iffalse}%
+ \_let#2=\_iffalse
+}
+\_def\_newifi #1{\_ea\_newifiA \string#1\_relax#1}
+\_ea\_def \_ea\_newifiA \_string\_if #1\_relax#2{%
+ \_sdef{_#1true}{\_let#2=\_iftrue}%
+ \_sdef{_#1false}{\_let#2=\_iffalse}%
+ \_let#2=\_iffalse
+}
+\_public \newif ;
+
+ \_doc ----------------------------
+ \`\afterfi` `{<what to do>}<ignored>\fi` closes condition by `\fi` and processes
+ <what to do>. Usage:
+ \begtt
+ \if<something> \afterfi{<result is true>} \else \afterfi{<resut is false>} \fi
+ \endtt
+ \_cod ----------------------------
+
+\_def\_afterfi#1#2\_fi{\_fi#1}
+\_def\afterfi#1#2\fi{\_fi#1}
+
+ \_doc ----------------------------
+ \secc Loops
+ The \`\loop` `<codeA> \ifsomething <codeB>` \`\repeat` loops `<codeA><codeB>`
+ until `\ifsomething` is false. Then `<codeB>` is not executed and loop is
+ finished. This works like in plain \TeX, but implementation is somewhat
+ better (you can use `\else` clause after the `\ifsomething`).
+
+ There are public version `\loop...\repeat` and private version
+ \`\_loop` ...\`\_repeat`. You cannot mix both versions in one loop.
+
+ The `\loop` macro keeps its original plain TeX meaning. It is not
+ expandable and nested `\loop`s are possible only in a \TeX/ group.
+ \_cod ----------------------------
+
+\_long\_def \_loop #1\_repeat{\_def\_body{#1}\_iterate}
+\_long\_def \loop #1\repeat{\_def\_body{#1}\_iterate}
+\_let \_repeat=\_fi % this makes \loop...\if...\repeat skippable
+\_let \repeat=\_fi
+\_def \_iterate {\_body \_ea \_iterate \_fi}
+
+ \_doc -----------------------------
+ \`\foreach` `<list>`\`\do` `{<what>}`
+ repeats `<what>` for each element of the
+ `<list>`. The `<what>` can include `#1` which is substituted by each
+ element of the `<list>`. The macro is expandable.
+ \nl
+ \`\foreach` `<list>`\`\do` `<parameter-mask>{<what>}`
+ reads parameters from <list> repeatedly and does <what> for each such reading.
+ The parameters are declared by <parameter-mask>. Examples:
+ \begtt
+ \foreach (a,1)(b,2)(c,3)\do (#1,#2){#1=#2 }
+ \foreach word1,word2,word3,\do #1,{Word is #1.}
+ \foreach A=word1 B=word2 \do #1=#2 {"#1 is set as #2".}
+ \endtt
+ Note that `\foreach <list>\do {<what>}` is equivalent to `\foreach <list>\do #1{<what>}`.
+
+ Recommendation: it is better to use private variants of \`\_foreach`.
+ When the user writes `\input tikz` then `\foreach` macro is redefined! The
+ private variants use \`\_do` separator instead `\do` separator.
+ \_cod -----------------------------
+
+\_newcount\_frnum % the numeric variable used in \fornum
+\_def\_do{\_doundefined} % we need to ask \_ifx#1\_do ...
+
+\_long\_def\_foreach #1\_do #2#{\_isempty{#2}\_iftrue
+ \_afterfi{\_foreachA{#1}{##1}}\_else\_afterfi{\_foreachA{#1}{#2}}\_fi}
+\_long\_def\_foreachA #1#2#3{\_putforstack
+ \_immediateassignment \_long\_gdef\_fbody#2{\_testparam##1..\_iftrue #3\_ea\_fbody\_fi}%
+ \_fbody #1#2\_finbody\_getforstack
+}
+\_def\_testparam#1#2#3\_iftrue{\_ifx###1\_empty\_ea\_finbody\_else}
+\_def\_finbody#1\_finbody{}
+
+\_long\_def\foreach #1\do#2#{\_isempty{#2}\_iftrue
+ \_afterfi{\_foreachA{#1}{##1}}\_else\_afterfi{\_foreachA{#1}{#2}}\_fi}
+
+ \_doc -----------------------------
+ \`\fornum` `<from>..<to>` \`\do` `{<what>}` or
+ \`\fornumstep` `<num>: <from>..<to>` \`\do` `{<what>}`
+ repeats `<what>` for each number from `<from>` to `<to>` (with step `<num>`
+ or with step one). The `<what>` can include `#1` which is substituted by
+ current number. The <from>, <to>, <step> parameters can be numeric expressions.
+ The macro is expandable.\nl
+ The test in the \`\_fornumB` says: if (<to> $\string<$ <current number>
+ AND <step> is positive) or if (<to> $>$ <current number> AND <step> is
+ negative) then close loop by `\_getforstack`. Sorry, the condition is
+ writen by somewhat cryptoid \TeX/ language.
+ \_cod -----------------------------
+
+\_def\_fornum#1..#2\_do{\_fornumstep 1:#1..#2\_do}
+\_long\_def\_fornumstep#1:#2..#3\_do#4{\_putforstack
+ \_immediateassigned{%
+ \_gdef\_fbody##1{#4}%
+ \_global\_frnum=\_numexpr#2\_relax
+ }%
+ \_ea\_fornumB\_ea{\_the\_numexpr#3\_ea}\_ea{\_the\_numexpr#1}%
+}
+\_def\_fornumB #1#2{\_ifnum#1\_ifnum#2>0<\_else>\_fi \_frnum \_getforstack
+ \_else \_ea\_fbody\_ea{\_the\_frnum}%
+ \_immediateassignment\_global\_advance\_frnum by#2
+ \_afterfi{\_fornumB{#1}{#2}}\_fi
+}
+\_def\fornum#1..#2\do{\_fornumstep 1:#1..#2\_do}
+\_def\fornumstep#1:#2..#3\do{\_fornumstep #1:#2..#3\_do}
+
+ \_doc ----------------------------
+ The `\foreach` and `\fornum` macros can be nested and arbitrary combined.
+ When they are nested then use `##1` for the variable of nested level,
+ `####1` for the variable of second nested level etc. Example:
+ \begtt
+ \foreach ABC \do {\fornum 1..5 \do {letter:#1, number: ##1. }}
+ \endtt
+ Implementation note:
+ we cannot use \TeX/-groups for nesting levels because we want to do the
+ macros expandable. We must implement a special for-stack which saves the
+ data needed by `\foreach` and `\fornum`. The \`\_putforstack` is used
+ when `\for*` is initialized and \`\_getforstack` is used when the
+ `\for*` macro ends. The \`\_forlevel` variable keeps the current nesting
+ level. If it is zero, then we need not save nor restore any data.
+ \_cod ----------------------------
+
+\_newcount\_forlevel
+\_def\_putforstack{\_immediateassigned{%
+ \_ifnum\_forlevel>0
+ \_sxdef{_frnum:\_the\_forlevel\_ea}{\_the\_frnum}%
+ \_global\_slet{_fbody:\_the\_forlevel}{_fbody}%
+ \_fi
+ \_incr\_forlevel
+}}
+\_def\_getforstack{\_immediateassigned{%
+ \_decr\_forlevel
+ \_ifnum\_forlevel>0
+ \_global\_slet{_fbody}{_fbody:\_the\_forlevel}%
+ \_global\_frnum=\_cs{_frnum:\_the\_forlevel}\_space
+ \_fi
+}}
+\_ifx\_immediateassignment\_undefined % for compatibility with older LuaTeX
+ \_let\_immediateassigned=\_useit \_let\_immediateassignment=\_empty
+\_fi
+
+ \_doc ----------------------------
+ User can define own expandable \"foreach" macro by
+ \`\foreachdef` `\macro <parameter-mask>{<what>}`
+ which can be used by `\macro {<list>}`. The macro reads repeatedly parameters from <list>
+ using <parameter-mask> and does <what> for each such reading. For example
+ \begtt
+ \foreachdef\mymacro #1,{[#1]}
+ \mymacro{a,b,cd,efg,}
+ \endtt
+ expands to [a][b][cd][efg]. Such user defined macros are more effecive during processing
+ than `\foreach` itself because they need not to operate with the for-stack.
+ \_cod ----------------------------
+
+\_def\_foreachdef#1#2#{\_toks0{#2}%
+ \_long\_edef#1##1{\_ea\_noexpand\_csname _body:\_csstring#1\_endcsname
+ ##1\_the\_toks0 \_noexpand\_finbody}%
+ \_foreachdefA#1{#2}}
+\_def\_foreachdefA#1#2#3{%
+ \_long\_sdef{_body:\_csstring#1}#2{\_testparam##1..\_iftrue #3\_cs{_body:\_csstring#1\_ea}\_fi}}
+
+\_public \foreachdef ;
+
+ \_doc ----------------------------
+ \secc Is-macros
+ There are a collection of macros
+ \^`\isempty`, \^`\istoksempty`, \^`\isequal`, \^`\ismacro`,
+ \^`\isdefined`, \^`\isinlist`, \^`\isfile` and \^`\isfont`
+ with common syntax:
+ \begtt \catcode`\<=13
+ \issomething <params> \iftrue <codeA> \else <codeB> \fi
+ or
+ \issomething <params> \iffalse <codeB> \else <codeA> \fi
+ \endtt
+ The `\else` part is optional. The `<codeA>` is processed if
+ `\issomething<params>` generates true condition. The `<codeB>`
+ is processed if `\issomething<params>` generates false condition.
+
+ The `\iftrue` or `\iffalse` is an integral part of this syntax
+ because we need to keep skippable nested `\if` conditions.
+
+ Implementation note:
+ we read this `\iftrue` or `\iffalse` into unseparated parameter and repeat
+ it because we need to remove an optional space before this command.
+
+ \medskip\noindent
+ \`\isempty` `{<text>}\iftrue`
+ is true if the `<text>` is empty. This macro is expandable.\nl
+ \`\istoksempty` `<tokens variable>\iftrue`
+ is true if the `<tokens variable>` is empty. It is expandable.
+ \_cod ----------------------------
+
+\_long\_def \_isempty #1#2{\_if\_relax\_detokenize{#1}\_relax \_else \_ea\_unless \_fi#2}
+\_def \_istoksempty #1#2{\_ea\_isempty\_ea{\_the#1}#2}
+\_public \isempty \istoksempty ;
+
+ \_doc ----------------------------
+ \`\isequal` `{<textA>}{<textB>}\iftrue`
+ is true if the <textA> and <textB> are
+ equal, only from strings point of view, category codes are ignored.
+ The macro is expandable.
+ \_cod ----------------------------
+
+\_def\_isequal#1#2#3{\_directlua{%
+ if "\_luaescapestring{\_detokenize{#1}}"=="\_luaescapestring{\_detokenize{#2}}"
+ then else tex.print("\_nbb unless") end}#3}
+\_public \isequal ;
+
+ \_doc ----------------------------
+ \`\ismacro` `\macro{text}\iftrue` is true if macro is defined as {<text>}.
+ Category codes are ignored in this testing. The macro is expandable.
+ \_cod ----------------------------
+
+\_def\_ismacro#1{\_ea\_isequal\_ea{#1}}
+\_public \ismacro ;
+
+ \_doc ----------------------------
+ \`\isdefined` `{<csname>}\iftrue` is true if `\<csname>` is defined.
+ The macro is expandable.
+ \_cod ----------------------------
+
+\_def\_isdefined #1#2{\_ifcsname #1\_endcsname \_else \_ea\_unless \_fi #2}
+\_public \isdefined ;
+
+ \_doc ----------------------------
+ \`\isinlist` `\list{<text>}\iftrue` is true if the
+ `<text>` is included the macro body of the `\list`.
+ The category codes are relevant here. The macro is not expandable.
+ \_cod ----------------------------
+
+\_long\_def\_isinlist#1#2{\_begingroup
+ \_long\_def\_tmp##1#2##2\_end/_%
+ {\_endgroup\_if\_relax\_detokenize{##2}\_relax \_ea\_unless\_fi}%
+ \_ea\_tmp#1\_endlistsep#2\_end/_%
+}
+\_public \isinlist ;
+
+ \_doc -----------------------------
+ \`\isfile` `{<filename>}\iftrue` is true if the file <filename> exists and are
+ readable by \TeX.
+ \_cod -----------------------------
+
+\_newread \_testin
+\_def\_isfile #1{%
+ \_openin\_testin ={#1}\_relax
+ \_ifeof\_testin \_ea\_unless
+ \_else \_closein\_testin
+ \_fi
+}
+\_public \isfile ;
+
+ \_doc -----------------------------
+ \`\isfont` `{<fontname or [fontfile]>}\iftrue`
+ is true if a given font exists. The result of this testing
+ is saved to the \`\_ifexistfam`.
+ \_cod -----------------------------
+
+\_newifi \_ifexistfam
+\_def\_isfont#1#2{%
+ \_begingroup
+ \_suppressfontnotfounderror=1
+ \_font\_testfont={#1}\_relax
+ \_ifx\_testfont\_nullfont \_def\_tmp{\_existfamfalse \_unless}
+ \_else \_def\_tmp{\_existfamtrue}\_fi
+ \_ea \_endgroup \_tmp #2%
+}
+\_public \isfont ;
+
+ \_doc ----------------------------
+ The last macro \`\isnextchar` `<char>{<codeA>}{<codeB>}`
+ has a different syntax than all other is-macros.
+ It executes `<codeA>` if next character is equal to <char>.
+ Else the `<codeB>` is executed. The macro is not expandable.
+ \_cod ----------------------------
+
+\_long\_def\_isnextchar#1#2#3{\_begingroup\_toks0={\_endgroup#2}\_toks1={\_endgroup#3}%
+ \_let\_tmp= #1\_futurelet\_next\_isnextcharA
+}
+\_def\_isnextcharA{\_the\_toks\_ifx\_tmp\_next0\_else1\_fi\_space}
+
+\_public \isnextchar ;
+
+
+\_endcode
+
+2021-02-03 public version of \loop and \foreach are \long
+2020-05-22 \foreach, \fornum: all settings are global, independent on TeX group
+2020-05-06 \isnextchar: \let\tmp=#1 -> \let\tmp= #1 (bug fix, #1 should be space)
+2020-05-02 \newif bug fix
+2020-04-15 \fornumstep 3: 1..12 instead \fornum 1..12\step 3
+2020-04-15 \fornum, \foreach can be nested without groups
+2020-04-01 implemented
diff --git a/macros/optex/base/keyval.opm b/macros/optex/base/keyval.opm
new file mode 100644
index 0000000000..b0462296b3
--- /dev/null
+++ b/macros/optex/base/keyval.opm
@@ -0,0 +1,82 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \readkv {Key-value dictionaries <2020-12-21>} % preloaded in format
+
+ \_doc ----------------------------
+ {\bf Implementation.}
+ The \`\readkv` expands its parameter and does replace-strings in order to
+ remove spaces around equal signs and after commas. Double commas are
+ removed. Then \`\_kvscan` reads the parameters list finished by the double
+ comma and saves values to `\_kv:<key>` macros.\nl
+ The \`\kv``{<key>}` expands the `\_kv:<key>` macro. If this macro isn't
+ defined then \`\_kvunknown` is processed. You can re-define it if you want.
+ \_cod ----------------------------
+
+\_def\_readkv#1{\_ea\_def\_ea\_tmpb\_ea{#1}%
+ \_replstring\_tmpb{= }{=}\_replstring\_tmpb{ =}{=}%
+ \_replstring\_tmpb{, }{,}\_replstring\_tmpb{,,}{,}%
+ \_ea \_kvscan \_tmpb,,=,}
+\_def\_kvscan #1#2=#3,{\_ifx#1,\_else \_sdef{_kv:#1#2}{#3}\_ea\_kvscan\_fi}
+\_def\_kv#1{\_trycs{_kv:#1}{\_kvunknown}}
+\_def\_kvunknown{???}
+
+\public \readkv \kv ;
+
+\_endcode
+
+Users or macro programmers can define macros with options in key=value format.
+It means a comma-separated list of equations key=value. First, we give an
+example.
+
+Suppose that you want to define a macro `\myframe` with options: color of
+rules, color of text inside the frame, rule-width, space between text and
+rules. You want to use this macro as:
+
+\begtt
+\myframe [margins=5pt,rule-width=2pt,frame-color=\Red,text-color=\Blue] {text1}
+or
+\myframe [frame-color=\Blue] {text2} % other parameters are default
+\endtt
+%
+You can define `\myframe` as follows:
+
+\begtt
+\def\myframedefaults{% defaults:
+ frame-color=\Black, % color of frame rules
+ text-color=\Black, % color ot text nside the frame
+ rule-width=0.4pt, % width of rules used in the frame
+ margins=2pt, % space between text inside and rules.
+}
+\optdef\myframe [] #1{\bgroup
+ \ea\addto\ea\myframedefaults\ea{\ea,\the\opt}%
+ \readkv\myframedefaults
+ \rulewidth=\kv{rule-width}
+ \hhkern=\kv{margins}\vvkern=\kv{margins}\relax
+ \kv{frame-color}\frame{\kv{text-color}\strut #1}%
+ \egroup}
+\endtt
+%
+We recommend using \^`\optdef` for defining macros with optional parameters
+written in `[]`. Then the optional parameters are saved in the \^`\opt` tokens
+register. First: we append the \^`\opt` (actual optional parameters) to
+`\myframedefault` by \^`\addto` macro.
+Second: we read the parameters by
+\^`\readkv{<pramaters list>}` macro.
+Third: the values can be used by expandable \^`\kv{<key>}` macro.
+The \^`\kv{<key>}` returns `???` if such key is not declared.
+
+You can use keys without values in the parameters list too, but with
+additional care. For example, suppose `draft` option without parameter.
+If a user writes `\myframe [..., draft, ...]{text}` then `\myframe` should behave differently.
+We have to add `DRAFTv=0,` in `\myframedefault` macro.
+Moreover, `\myframe` macro must include preprocessing of `\myframedefault` using
+\^`\replstring` which replaces the occurrence of `draft` by `DRAFTv=1`.
+\begtt
+\optdef\myframe [] #1{...
+ \ea\addto\ea\myframedefaults\ea{\the\opt}%
+ \replstring\myframedefaults{draft}{DRAFTv=1}%
+ \readkv\myframedefaults
+ ...
+ \ifnum\kv{DRAFTv}=1 draft mode\else normal mode\fi
+ ...}
+\endtt
diff --git a/macros/optex/base/languages.opm b/macros/optex/base/languages.opm
new file mode 100644
index 0000000000..ff9373b720
--- /dev/null
+++ b/macros/optex/base/languages.opm
@@ -0,0 +1,188 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \_mtext {Languages <2021-01-21>} % preloaded in format
+
+ \_doc -----------------------------
+ Only four words are generated by \OpTeX/ macros: \"Chapter",
+ \"Table", \"Figure" and \"Subject". These phrases can be generated depending
+ on the current value of `\language` register, if you use \`\_mtext``{<phrase-id>}`,
+ specially `\_mtext{chap}`, `\_mtext{t}`, `\_mtext{f}` or `\_mtext{subj}`.
+ If your macros generate more words then
+ you can define such words by `\sdef{_mt:<phrase-id>:<lang>}` where
+ `<phrase-id>` is a label for the declared word and `<lang>` is a language shortcut
+ (iso code).
+ \_cod -----------------------------
+
+\_def\_mtext#1{\_trycs{_mt:#1:\_trycs{_lan:\_the\_language}{en}}
+ {\_csname _mt:#1:en\_endcsname}}
+
+\_sdef{_mt:chap:en}{Chapter} \_sdef{_mt:chap:cs}{Kapitola} \_sdef{_mt:chap:sk}{Kapitola}
+\_sdef{_mt:t:en}{Table} \_sdef{_mt:t:cs}{Tabulka} \_sdef{_mt:t:sk}{Tabuľka}
+\_sdef{_mt:f:en}{Figure} \_sdef{_mt:f:cs}{Obrázek} \_sdef{_mt:f:sk}{Obrázok}
+\_sdef{_mt:subj:en}{Subject} \_sdef{_mt:subj:cs}{Věc} \_sdef{_mt:subj:sk}{Vec}
+
+ \_doc -----------------------------
+ Using \`\_langw` `<lang> <chapter> <table> <figure> <subject>` you can
+ declare these words more effectively:
+ \maxlines=13
+ \_cod -----------------------------
+
+\_def \_langw #1 #2 #3 #4 #5 {%
+ \_sdef{_mt:chap:#1}{#2}\_sdef{_mt:t:#1}{#3}\_sdef{_mt:f:#1}{#4}%
+ \_sdef{_mt:subj:#1}{#5}%
+}
+
+\_langw en Chapter Table Figure Subject
+%--------------------------------------------------------------
+\_langw cs Kapitola Tabulka Obrázek Věc
+\_langw de Kapitel Tabelle Abbildung Betreff
+\_langw es Capítulo Tabla Figura Sujeto
+\_langw fr Chaptire Tableau Figure Matière
+\_langw it Capitolo Tabella Fig. Oggetto
+\_langw pl Rozdział Tabela Ilustracja Temat
+\_langw gr Κεφάλαιο Πίνακας Σχήμα θέμα
+\_langw ru Глава Таблица Рисунок Предмет
+\_langw sk Kapitola Tabuľka Obrázok Vec
+
+ \_doc -----------------------------
+ You can add more words as you wish. For example \`\today` macro:
+ \_cod -----------------------------
+
+\_def \_monthw #1 #2 #3 #4 #5 #6 #7 {%
+ \_sdef{_mt:m1:#1}{#2}\_sdef{_mt:m2:#1}{#3}\_sdef{_mt:m3:#1}{#4}%
+ \_sdef{_mt:m4:#1}{#5}\_sdef{_mt:m5:#1}{#5}\_sdef{_mt:m6:#1}{#5}%
+ \_monthwB #1
+}
+\_def \_monthwB #1 #2 #3 #4 #5 #6 #7 {%
+ \_sdef{_mt:m7:#1}{#2}\_sdef{_mt:m8:#1}{#3}\_sdef{_mt:m9:#1}{#4}%
+ \_sdef{_mt:m10:#1}{#5}\_sdef{_mt:m11:#1}{#5}\_sdef{_mt:m12:#1}{#5}%
+}
+
+\_monthw en January February March April May June
+ July August September October November December
+\_monthw cs ledna února března dubna května června
+ července srpna září října listopadu prosince
+\_monthw sk januára februára marca apríla mája júna
+ júla augusta septembra októbra novembra decembra
+\_monthw it gennaio febbraio marzo aprile maggio giugno
+ luglio agosto settembre ottobre novembre dicembre
+
+
+\_sdef{_mt:today:en}{\_mtext{m\_the\_month} \_the\_day, \_the\_year}
+\_sdef{_mt:today:cs}{\_the\_day.~\_mtext{m\_the\_month} \_the\_year}
+\_slet{_mt:today:sk}{_mt:today:cs}
+
+\_def\_today{\_mtext{today}}
+\_public \today ;
+
+ \_doc -----------------------------
+ Quotes should be tagged by `\"<text>"` and `\'<text>'` if `\<iso-code>quotes`
+ is declared at beginning of the document (for example `\enquotes`).
+ If not, then the control
+ sequences `\"` and `\'` are undefined. Remember, that they are used in
+ another meaning when the `\oldaccents` command is used.
+ The macros `\"` and `\'` are not defined as `\protected` because we need
+ their expansion when `\outlines` are created.
+ User can declare quotes by \^`\quoteschars``<clqq><crqq><clq><crq>`, where
+ `<clqq>...<crqq>` are normal quotes and `<clq>...<crq>` are alternative quotes.
+ or use \`\altquotes` to swap between the meaning of these two types of quotes.
+ \nl
+ \`\enquotes`, \`\csquotes`, \`\dequotes`, \`\frquotes` etc. are defined here.
+ \_cod -----------------------------
+
+\_def \_enquotes {\_quoteschars “”‘’}
+\_def \_csquotes {\_quoteschars „“‚‘}
+\_def \_frquotes {\_quoteschars “”«»}
+\_let \_plquotes = \_frquotes
+\_let \_esquotes = \_frquotes
+\_let \_grquotes = \_frquotes
+\_let \_ruquotes = \_frquotes
+\_let \_itquotes = \_frquotes
+\_let \_skquotes = \_csquotes
+\_let \_dequotes = \_csquotes
+
+ \_doc -----------------------------
+ The \`\quoteschars``<lqq><rqq><lq><rq>` defines `\"` and `\"` as `\_qqA`
+ in in normal mode and as expadable macros in outline mode.
+ We want to well process the common cases: \code{\\"`&`"} or \code{\\"`\{`"}.
+ This is the reason why the quotes parameter is read in verbatim mode and retokenized
+ again by `\scantextokens`. We want to allow to quote the quotes mark
+ itself by \code{\\"{`"`}"}. This is the reason why the sub-verbatim mode is
+ used when the first character is \code{\{} in the parameter.\nl
+ The `\"` is defined as `\_qqA\_qqB<lqq><rqq>` and `\'` as `\_qqA\_qqC<lq><rq>`.
+ The \`\_qqA``\_qqB<clqq><crqq>` runs \`\_qqB``<lqq><rqq><text>"`.\nl
+ The \`\_regquotes``\""<L><R>` does `\def\"#1"{<L>#1<R>}` for outlines but the `"`
+ separator is active (because `"` and `'` are active in \^`\pdfunidef`).
+ \_cod -----------------------------
+
+\_def \_quoteschars #1#2#3#4{\_def\_altquotes{\_quoteschars#3#4#1#2}\_public\altquotes;%
+ \_protected\_def \"{\_qqA\_qqB#1#2}\_protected\_def \'{\_qqA\_qqC#3#4}%
+ \_regmacro{}{}{\_regquotes\""#1#2\_regquotes\''#3#4}}
+
+\_def\_qqA#1#2#3{\_bgroup\_setverb \_catcode`\ =10
+ \_isnextchar\_bgroup{\_catcode`\{=1 \_catcode`\}=2 #1#2#3}{#1#2#3}}
+\_long\_def\_qqB#1#2#3"{\_egroup#1\_scantextokens{#3}#2}
+\_long\_def\_qqC#1#2#3'{\_egroup#1\_scantextokens{#3}#2}
+\_def\_regquotes#1#2#3#4{\_bgroup \_lccode`~=`#2\_lowercase{\_egroup \_def#1##1~}{#3##1#4}}
+
+ \_doc -----------------------------
+ Sometimes should be usable to leave the markup `"such"` or `'such'` i.e.~without
+ the first backslash. Then you can make the characters `"` and `'` active
+ by the \`\activequotes` macro and leave quotes without the first backslash.
+ First, declare `\<iso-code>quotes`, then \^`\altquotes` (if needed) and finally
+ \^`\activequotes`.
+ \_cod -----------------------------
+
+\_def\_activequotes{\_let\_actqq=\"\_adef"{\_actqq}\_let\_actq=\'\_adef'{\_actq}%
+ \_regmacro{}{}{\_adef"{\"}\_adef'{\'}}}
+
+\_public \quoteschars \activequotes \enquotes \csquotes \skquotes \frquotes \plquotes
+ \esquotes \grquotes \ruquotes \itquotes \dequotes ;
+
+ \_doc -----------------------------
+ Bibliography references generated by \^`\usebib` uses more
+ language-dependent phrases. They are declared here. We don't want to save
+ all these phrases into the format, so the trick with {`\_endinput`}
+ is used here. When \^`\usebib` is processed then the following part of the file
+ `languages.opm` is read again.
+
+ Only phrases of few languages are declared here now. If you want to declare
+ phrases of your language, please create an \"issue" or a \"request" at
+ \url{https://github.com/olsak/OpTeX} or send me an email with new
+ phrases for your language (or language you know:). I am ready to put them here.
+ Temporarily, you can put your definitions into `\bibtexhook` token list.
+ \_cod -----------------------------
+
+\_endinput % don't save these \def's to the format
+
+\_def\_langb#1 #2#3#4#5#6#7#8#9{\_def\_mbib##1##2{\_sdef{_mt:bib.##2:#1}{##1}}%
+ \_mbib{#2}{and}\_mbib{#3}{etal}\_mbib{#4}{edition}\_mbib{#5}{citedate}\_mbib{#6}{volume}%
+ \_mbib{#7}{number}\_mbib{#8}{prepages}\_mbib{#9}{postpages}\_langbA}
+\_def\_langbA#1#2#3#4#5#6#7{\_mbib{#1}{editor}\_mbib{#2}{editors}\_mbib{#3}{available}%
+ \_mbib{#4}{availablealso}\_mbib{#5}{bachthesis}\_mbib{#6}{masthesis}\_mbib{#7}{phdthesis}}
+
+\_langb en {, and } { et al.} { ed.} {cit.~} {Vol.~} {No.~} {pp.~} {~p.} {,~ed.} {,~eds.}
+ {Available from } {Available also from }
+ {Bachelor's Thesis} {Master's Thesis} {Ph.D. Thesis}
+%------------------------------------------------------------------------------------------
+\_langb cs { a } { a~kol.} { vyd.} {vid.~} {ročník~} {č.~} {s.~} {~s.} {,~editor} {,~editoři}
+ {Dostupné na } {Dostupné též na }
+ {Bakalářská práce} {Diplomová práce} {Disertační práce}
+\_langb sk { a } { a~kol.} { vyd.} {vid.~} {ročník~} {č.~} {s.~} {~s.} {,~editor} {,~editoři}
+ {Dostupné na } {Dostupné tiež na }
+ {Bakalárska práca} {Diplomová práca} {Dizertačná práca}
+
+% \_<lang>dateformat year/month/day\relax, for example: \_csdateformat 2020/05/21\relax
+% This is used in iso690 bib-style when the field "citedate" is used.
+
+\_def\_endateformat #1/#2/#3\relax{#1-#2-#3}
+% \_csdateformat 2020/05/21\relax -> \hbox{21. 5. 2020}
+\_def\_csdateformat #1/#2/#3\relax{\hbox{\_tmpnum=#3 \_the\_tmpnum. \_tmpnum=#2 \_the\_tmpnum. #1}}
+\_let\_skdateformat =\_csdateformat
+
+\_endcode % -------------------------------------
+
+2021-01-21 more robust quotes in outlines
+2020-12-05 bib phrases moved here
+2020-04-29 Obrazek -> Abbildung: bug fixed
+2020-03-15 introduced
diff --git a/macros/optex/base/lists.opm b/macros/optex/base/lists.opm
new file mode 100644
index 0000000000..189719302d
--- /dev/null
+++ b/macros/optex/base/lists.opm
@@ -0,0 +1,128 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \begitems {Lists: begitems, enditems <2021-03-10>} % preloaded in format
+
+ \_doc -----------------------------
+ \`\_aboveliskip` is used above the list of items,\nl
+ \`\_belowliskip` is used below the list of items and\nl
+ \`\_interliskip` is used between items.\nl
+ \`\_listskipA` is used as `\listskipamount` at level 1 of items.\nl
+ \`\_listskipB` is used as `\listskipamount` at other levels.\nl
+ \`\_setlistskip` sets the skip dependent on the current level of items
+ \_cod -----------------------------
+
+\_def\_aboveliskip {\_removelastskip \_penalty-100 \_vskip\_listskipamount}
+\_def\_belowliskip {\_penalty-200 \_vskip\_listskipamount}
+\_def\_interliskip {}
+\_def\_listskipA {\_medskipamount}
+\_def\_listskipB {0pt plus.5\_smallskipamount}
+
+\_def\_setlistskip {%
+ \_ifnum \_ilevel = 1 \_listskipamount = \_listskipA \_relax
+ \_else \_listskipamount = \_listskipB \_relax
+ \_fi}
+
+ \_doc -----------------------------
+ The \`\itemnum` is locally reset to zero in each group declared by
+ `\begitems`. So nested lists are numbered independently. Users can set
+ initial value of `\itemnum` to another value after `\beitems` if they want.
+ \nl
+ Each level of nested lists is indented by the new `\iindent` from left.
+ The default item mark is `\_printitem`.
+ \nl
+ The \`\begitems` runs `\_aboveliskip` only if we are not near below a title,
+ where a vertical skip is placed already and where the `\penalty` 11333 is.
+ It activates `*` and defines it as \`\_startitem`.
+ \nl
+ The \`\enditems` runs `\_isnextchar\_par{}{\_noindent}` thus the next
+ paragraph is without indentation if there is no empty line between
+ the list and this paragraph (it is similar behavior as after display math).
+ \_cod -----------------------------
+
+\_newcount\_itemnum \_itemnum=0
+\_newtoks\_printitem
+
+\_def\_begitems{\_par
+ \_bgroup
+ \_advance \_ilevel by1
+ \_setlistskip
+ \_ifnum\_lastpenalty<10000 \_aboveliskip \_fi
+ \_itemnum=0 \_adef*{\_relax\_ifmmode*\_else\_ea\_startitem\_fi}
+ \_advance\_leftskip by\_iindent
+ \_printitem=\_defaultitem
+ \_the\_everylist \_relax
+}
+\_def\_enditems{\_par\_belowliskip\_egroup \_isnextchar\_par{}{\_noindent}}
+
+\_def\_startitem{\_par \_ifnum\_itemnum>0 \_interliskip \_fi
+ \_advance\_itemnum by1
+ \_the\_everyitem \_noindent\_llap{\_the\_printitem}\_ignorespaces
+}
+\_public \begitems \enditems \itemnum ;
+
+ \_doc ----------------------------
+ \`\novspaces` sets \`\listskipamount` to 0pt.
+ \_cod ----------------------------
+
+\_def\_novspaces {\_removelastskip \_listskipamount=0pt \_relax}
+\_public \novspaces ;
+
+ \_doc -----------------------------
+ Various item marks are saved in `\_item:<letter>` macros.
+ You can re-define then or define more such macros.
+ The \`\style` `<letter>` does \`\_printitem``={\_item:<letter>}`.
+ More exactly: \^`\begitems` does `\_printitem=`\^`\defaultitem` first,
+ then \`\style` `<letter>` does \`\_printitem``={\_item:<letter>}`
+ when it is used and finally, `\_startitem` alias `*` uses `\_printitem`.
+ \_cod -----------------------------
+
+\_def\_style#1{%
+ \_ifcsname _item:#1\_endcsname \_printitem=\ea{\_csname _item:#1\_endcsname}%
+ \_else \_printitem=\_defaultitem \_fi
+}
+\_sdef{_item:o}{\_raise.4ex\_hbox{$\_scriptscriptstyle\_bullet$} }
+\_sdef{_item:-}{- }
+\_sdef{_item:n}{\_the\_itemnum. }
+\_sdef{_item:N}{\_the\_itemnum) }
+\_sdef{_item:i}{(\_romannumeral\_itemnum) }
+\_sdef{_item:I}{\_uppercase\_ea{\_romannumeral\_itemnum}\_kern.5em}
+\_sdef{_item:a}{\_athe\_itemnum) }
+\_sdef{_item:A}{\_uppercase\_ea{\_athe\_itemnum}) }
+\_sdef{_item:x}{\_raise.3ex\_fullrectangle{.6ex}\_kern.4em}
+\_sdef{_item:X}{\_raise.2ex\_fullrectangle{1ex}\_kern.5em}
+
+ \_doc -----------------------------
+ \`\_athe``{<num>}` returns the `<num>`s lowercase letter from the alphabet.\nl
+ \`\_fullrectangle``{<dimen>}` prints full rectangle with given `<dimen>`.
+ \_cod -----------------------------
+
+\_def\_fullrectangle#1{\_hbox{\_vrule height#1 width#1}}
+
+\_def\_athe#1{\_ifcase#1?\_or a\_or b\_or c\_or d\_or e\_or f\_or g\_or h\_or
+ i\_or j\_or k\_or l\_or m\_or n\_or o\_or p\_or q\_or r\_or s\_or t\_or
+ u\_or v\_or w\_or x\_or y\_or z\_else ?\_fi
+}
+\_public \style ;
+
+ \_doc -----------------------------
+ The \`\begblock` macro selects fonts from footnotes \^`\_fnset`
+ and opens new indentation in a group.
+ \`\endblock` closes the group.
+ This is implemented as an counterpart
+ of Markdown's Blockquotes. Redefine these macros if you want to declare
+ different design.
+ The \ulink[http://petr.olsak.net/optex/optex-tricks.html\#greyblock]{\OpTeX/ trick 0031}
+ shows how to create blocks with grey background splittable to more pages.
+ \_cod -----------------------------
+
+\_def\_begblock{\_bgroup\_fnset \_medskip \_advance\_leftskip by\_iindent \_firstnoindent}
+\_def\_endblock{\_par\_medskip\_egroup\_isnextchar\_par{}{\_noindent}}
+
+\_public \begblock \endblock ;
+
+
+\_endcode % -------------------------------------
+
+2021-03-10 \_ifmmode*\_else\_ea\_startitem\_fi added to * defintition
+2020-04-21 \isnextchar\par added to \enditems
+2020-03-18 introduced
diff --git a/macros/optex/base/logos.opm b/macros/optex/base/logos.opm
new file mode 100644
index 0000000000..a510a74a30
--- /dev/null
+++ b/macros/optex/base/logos.opm
@@ -0,0 +1,61 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \TeX {Logos TeX, LuaTeX, etc. <2020-02-28>} % preloaded in format
+
+ \_doc ----------------------------
+ Despite plain \TeX/ each macro for logos ends by \`\ignoreslash`.
+ This macro ignores the next slash if it is present.
+ You can `use \TeX/ like this` for protecting the space following the logo.
+ This is visually more comfortable.
+ The macros \`\TeX`, \`\OpTeX`, \`\LuaTeX`, \`\XeTeX` are defined.
+ \_cod ----------------------------
+
+\_protected\_def \_TeX {T\_kern-.1667em\_lower.5ex\_hbox{E}\_kern-.125emX\_ignoreslash}
+\_protected\_def \_OpTeX {Op\_kern-.1em\_TeX}
+\_protected\_def \_LuaTeX {Lua\_TeX}
+\_protected\_def \_XeTeX {X\_kern-.125em\_phantom E%
+ \_pdfsave\_rlap{\_pdfscale{-1}{1}\_lower.5ex\_hbox{E}}\_pdfrestore \_kern-.1667em \_TeX}
+
+\_def\_ignoreslash {\_isnextchar/\_ignoreit{}}
+
+\_public \TeX \OpTeX \LuaTeX \XeTeX \ignoreslash ;
+
+ \_doc -----------------------------
+ The \`\_slantcorr` macro expands to the slant-correction of the current font. It is
+ used to shifting A if the \`\LaTeX` logo is in italic.
+ \_cod -----------------------------
+
+\_protected\_def \_LaTeX{\_tmpdim=.42ex L\_kern-.36em \_kern \_slantcorr % slant correction
+ \_raise \_tmpdim \_hbox{\_thefontscale[710]A}%
+ \_kern-.15em \_kern-\_slantcorr \_TeX}
+\_def\_slantcorr{\_ea\_ignorept \_the\_fontdimen1\_font\_tmpdim}
+
+\_public \LaTeX ;
+
+ \_doc -----------------------------
+ \`\OPmac`, \`\CS` and \`\csplain` logos.
+ \_cod -----------------------------
+
+\_def\_OPmac{\_leavevmode
+ \_lower.2ex\_hbox{\_thefontscale[1400]O}\_kern-.86em P{\_em mac}\_ignoreslash}
+\_def\_CS{$\_cal C$\_kern-.1667em\_lower.5ex\_hbox{$\_cal S$}\_ignoreslash}
+\_def\_csplain{\_CS plain\_ignoreslash}
+
+\_public \OPmac \CS \csplain ;
+
+ \_doc ----------------------------
+ The expandable versions of logos used in Outlines need the expandable
+ \`\ingnslash` (instead of the \^`\ignoreslash`).
+ \_cod \_fin ----------------------
+
+\_def\_ignslash#1{\_ifx/#1\_else #1\_fi}
+\_regmacro {}{}{% conversion for PDF outlines
+ \_def\TeX{TeX\_ignslash}\_def\OpTeX{OpTeX\_ignslash}%
+ \_def\LuaTeX{LuaTeX\_ignslash}\_def\XeTeX{XeTeX\_ignslash}%
+ \_def\LaTeX{LaTeX\_ignslash}\_def\OPmac{OPmac\_ignslash}%
+ \_def\CS{CS}\_def\csplain{csplain\_ignslash}%
+}
+\_public \ignslash ;
+
+\_endcode
+
diff --git a/macros/optex/base/luatex-ini.opm b/macros/optex/base/luatex-ini.opm
new file mode 100644
index 0000000000..e0526a48d6
--- /dev/null
+++ b/macros/optex/base/luatex-ini.opm
@@ -0,0 +1,136 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \pdfprimitive {LuaTeX initialization code <2020-02-21>} % preloaded in format
+
+\_let\_pdfpagewidth \pagewidth
+\_let\_pdfpageheight \pageheight
+\_let\_pdfadjustspacing \adjustspacing
+\_let\_pdfprotrudechars \protrudechars
+\_let\_pdfnoligatures \ignoreligaturesinfont
+\_let\_pdffontexpand \expandglyphsinfont
+\_let\_pdfcopyfont \copyfont
+\_let\_pdfxform \saveboxresource
+\_let\_pdflastxform \lastsavedboxresourceindex
+\_let\_pdfrefxform \useboxresource
+\_let\_pdfximage \saveimageresource
+\_let\_pdflastximage \lastsavedimageresourceindex
+\_let\_pdflastximagepages \lastsavedimageresourcepages
+\_let\_pdfrefximage \useimageresource
+\_let\_pdfsavepos \savepos
+\_let\_pdflastxpos \lastxpos
+\_let\_pdflastypos \lastypos
+\_let\_pdfoutput \outputmode
+\_let\_pdfdraftmode \draftmode
+\_let\_pdfpxdimen \pxdimen
+\_let\_pdfinsertht \insertht
+\_let\_pdfnormaldeviate \normaldeviate
+\_let\_pdfuniformdeviate \uniformdeviate
+\_let\_pdfsetrandomseed \setrandomseed
+\_let\_pdfrandomseed \randomseed
+\_let\_pdfprimitive \primitive
+\_let\_ifpdfprimitive \ifprimitive
+\_let\_ifpdfabsnum \ifabsnum
+\_let\_ifpdfabsdim \ifabsdim
+
+\_public
+ \pdfpagewidth \pdfpageheight \pdfadjustspacing \pdfprotrudechars
+ \pdfnoligatures \pdffontexpand \pdfcopyfont \pdfxform \pdflastxform
+ \pdfrefxform \pdfximage \pdflastximage \pdflastximagepages \pdfrefximage
+ \pdfsavepos \pdflastxpos \pdflastypos \pdfoutput \pdfdraftmode \pdfpxdimen
+ \pdfinsertht \pdfnormaldeviate \pdfuniformdeviate \pdfsetrandomseed
+ \pdfrandomseed \pdfprimitive \ifpdfprimitive \ifpdfabsnum \ifpdfabsdim ;
+
+\_directlua {tex.enableprimitives('pdf',{'tracingfonts'})}
+
+\_protected\_def \_pdftexversion {\_numexpr 140\_relax}
+ \_def \_pdftexrevision {7}
+\_protected\_def \_pdflastlink {\_numexpr\_pdffeedback lastlink\_relax}
+\_protected\_def \_pdfretval {\_numexpr\_pdffeedback retval\_relax}
+\_protected\_def \_pdflastobj {\_numexpr\_pdffeedback lastobj\_relax}
+\_protected\_def \_pdflastannot {\_numexpr\_pdffeedback lastannot\_relax}
+ \_def \_pdfxformname {\_pdffeedback xformname}
+{\_outputmode=1
+ \_xdef\_pdfcreationdate {\_pdffeedback creationdate}
+}
+ \_def \_pdffontname {\_pdffeedback fontname}
+ \_def \_pdffontobjnum {\_pdffeedback fontobjnum}
+ \_def \_pdffontsize {\_pdffeedback fontsize}
+ \_def \_pdfpageref {\_pdffeedback pageref}
+ \_def \_pdfcolorstackinit {\_pdffeedback colorstackinit}
+\_protected\_def \_pdfliteral {\_pdfextension literal}
+\_protected\_def \_pdfcolorstack {\_pdfextension colorstack}
+\_protected\_def \_pdfsetmatrix {\_pdfextension setmatrix}
+\_protected\_def \_pdfsave {\_pdfextension save\_relax}
+\_protected\_def \_pdfrestore {\_pdfextension restore\_relax}
+\_protected\_def \_pdfobj {\_pdfextension obj }
+\_protected\_def \_pdfrefobj {\_pdfextension refobj }
+\_protected\_def \_pdfannot {\_pdfextension annot }
+\_protected\_def \_pdfstartlink {\_pdfextension startlink }
+\_protected\_def \_pdfendlink {\_pdfextension endlink\_relax}
+\_protected\_def \_pdfoutline {\_pdfextension outline }
+\_protected\_def \_pdfdest {\_pdfextension dest }
+\_protected\_def \_pdfthread {\_pdfextension thread }
+\_protected\_def \_pdfstartthread {\_pdfextension startthread }
+\_protected\_def \_pdfendthread {\_pdfextension endthread\_relax}
+\_protected\_def \_pdfinfo {\_pdfextension info }
+\_protected\_def \_pdfcatalog {\_pdfextension catalog }
+\_protected\_def \_pdfnames {\_pdfextension names }
+\_protected\_def \_pdfincludechars {\_pdfextension includechars }
+\_protected\_def \_pdffontattr {\_pdfextension fontattr }
+\_protected\_def \_pdfmapfile {\_pdfextension mapfile }
+\_protected\_def \_pdfmapline {\_pdfextension mapline }
+\_protected\_def \_pdftrailer {\_pdfextension trailer }
+\_protected\_def \_pdfglyphtounicode {\_pdfextension glyphtounicode }
+
+\_protected\_edef\_pdfcompresslevel {\_pdfvariable compresslevel}
+\_protected\_edef\_pdfobjcompresslevel {\_pdfvariable objcompresslevel}
+\_protected\_edef\_pdfdecimaldigits {\_pdfvariable decimaldigits}
+\_protected\_edef\_pdfgamma {\_pdfvariable gamma}
+\_protected\_edef\_pdfimageresolution {\_pdfvariable imageresolution}
+\_protected\_edef\_pdfimageapplygamma {\_pdfvariable imageapplygamma}
+\_protected\_edef\_pdfimagegamma {\_pdfvariable imagegamma}
+\_protected\_edef\_pdfimagehicolor {\_pdfvariable imagehicolor}
+\_protected\_edef\_pdfimageaddfilename {\_pdfvariable imageaddfilename}
+\_protected\_edef\_pdfpkresolution {\_pdfvariable pkresolution}
+\_protected\_edef\_pdfinclusioncopyfonts {\_pdfvariable inclusioncopyfonts}
+\_protected\_edef\_pdfinclusionerrorlevel {\_pdfvariable inclusionerrorlevel}
+\_protected\_edef\_pdfgentounicode {\_pdfvariable gentounicode}
+\_protected\_edef\_pdfpagebox {\_pdfvariable pagebox}
+\_protected\_edef\_pdfminorversion {\_pdfvariable minorversion}
+\_protected\_edef\_pdfuniqueresname {\_pdfvariable uniqueresname}
+\_protected\_edef\_pdfhorigin {\_pdfvariable horigin}
+\_protected\_edef\_pdfvorigin {\_pdfvariable vorigin}
+\_protected\_edef\_pdflinkmargin {\_pdfvariable linkmargin}
+\_protected\_edef\_pdfdestmargin {\_pdfvariable destmargin}
+\_protected\_edef\_pdfthreadmargin {\_pdfvariable threadmargin}
+\_protected\_edef\_pdfpagesattr {\_pdfvariable pagesattr}
+\_protected\_edef\_pdfpageattr {\_pdfvariable pageattr}
+\_protected\_edef\_pdfpageresources {\_pdfvariable pageresources}
+\_protected\_edef\_pdfxformattr {\_pdfvariable xformattr}
+\_protected\_edef\_pdfxformresources {\_pdfvariable xformresources}
+\_protected\_edef\_pdfpkmode {\_pdfvariable pkmode}
+
+\_public
+ \pdftexversion \pdftexrevision \pdflastlink \pdfretval \pdflastobj
+ \pdflastannot \pdfxformname \pdfcreationdate \pdffontname \pdffontobjnum
+ \pdffontsize \pdfpageref \pdfcolorstackinit \pdfliteral \pdfcolorstack
+ \pdfsetmatrix \pdfsave \pdfrestore \pdfobj \pdfrefobj \pdfannot
+ \pdfstartlink \pdfendlink \pdfoutline \pdfdest \pdfthread \pdfstartthread
+ \pdfendthread \pdfinfo \pdfcatalog \pdfnames \pdfincludechars \pdffontattr
+ \pdfmapfile \pdfmapline \pdftrailer \pdfglyphtounicode \pdfcompresslevel
+ \pdfobjcompresslevel \pdfdecimaldigits \pdfgamma \pdfimageresolution
+ \pdfimageapplygamma \pdfimagegamma \pdfimagehicolor \pdfimageaddfilename
+ \pdfpkresolution \pdfinclusioncopyfonts \pdfinclusionerrorlevel
+ \pdfgentounicode \pdfpagebox \pdfminorversion \pdfuniqueresname \pdfhorigin
+ \pdfvorigin \pdflinkmargin \pdfdestmargin \pdfthreadmargin \pdfpagesattr
+ \pdfpageattr \pdfpageresources \pdfxformattr \pdfxformresources \pdfpkmode ;
+
+\_pdfminorversion = 5
+\_pdfobjcompresslevel = 2
+\_pdfcompresslevel = 9
+\_pdfdecimaldigits = 3
+\_pdfpkresolution = 600
+
+\_endcode
+
+Common pdf\TeX/ primitives equivalents are declared here. Initial values are set.
diff --git a/macros/optex/base/makeindex.opm b/macros/optex/base/makeindex.opm
new file mode 100644
index 0000000000..e5f7b4032e
--- /dev/null
+++ b/macros/optex/base/makeindex.opm
@@ -0,0 +1,463 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \makeindex {Makeindex and sorting <2021-02-15>} % loaded in format
+
+ \_doc -----------------------------
+ \^`\makeindex` implements sorting algorithm at \TeX/ macro-language level.
+ You need not any external program.
+
+ There are two passes in the sorting algorithm. The primary pass does not
+ distinguish between a group of letters (typically non-accented and
+ accented). If the result of comparing two string is equal in primary pass
+ then the secondary pass is started. It distinguishes between variously accented
+ letters. Czech rules, for example, says: not accented before dieresis
+ before acute before circumflex before ring. At less priority: lowercase
+ letters must be before uppercase letters.
+
+ The \`\_sortingdata``<iso-code>` implements these rules for the language
+ <iso-code>. The groups between commas are not distinguished in the first
+ pass. The second pass distinguishes all characters mentioned in the
+ `\_sortingdata<iso-code>` (commas are ignored). The order of letters
+ in the `\_sortingdata<iso-code>` macro is significant for the sorting algorithm.
+ The Czech rules (`cs`) are implemented here:
+ \_cod -----------------------------
+
+\_def \_sortingdatacs {%
+ /,{ },-,&,@,%
+ aAäÄáÁ,%
+ bB,%
+ cC,%
+ čČ,%
+ dDďĎ,%
+ eEéÉěĚ,%
+ fF,%
+ gG,%
+ hH,%
+ ^^T^^U^^V,% ch Ch CH
+ iIíÍ,%
+ jJ,%
+ kK,%
+ lLĺĹľĽ,%
+ mM,%
+ nNňŇ,%
+ oOöÖóÓôÔ,%
+ pP,%
+ qQ,%
+ rRŕŔ,%
+ řŘ,%
+ sS,%
+ šŠ,%
+ tTťŤ,%
+ uUüÜúÚůŮ,%
+ vV,%
+ wW,%
+ xX,%
+ yYýÝ,%
+ zZ,%
+ žŽ,%
+ 0,1,2,3,4,5,6,7,8,9,'%
+}
+
+ \_doc -----------------------------
+ Characters ignored by the sorting algorithm are declared in \`\_ignoredchars``<iso-code>`.
+ The compound characters (two or more characters interpreted as one
+ character in the sorting algorithm) are mapped to single invisible characters
+ in \`\_compoundchars``<iso-code>`. Czech rules declare ch or Ch or CH as
+ a single letter sorted between H and I. See \`\_sortingdatacs` above where
+ these declared characters are used.
+
+ The characters declared in `\_ignoredchars` are ignored in the first pass
+ without additional condition. All characters are taken into account in
+ second pass: ASCII characters with code $\string<65$ are sorted first if they
+ are not mentioned in the `\_sortingdata<iso-code>` macro.
+ Others not mentioned characters have undefined behavior during sorting.
+ \_cod -----------------------------
+
+\_def \_ignoredcharscs {.,;?!:'"|()[]<>=+}
+\_def \_compoundcharscs {ch:^^T Ch:^^U CH:^^V} % DZ etc. are sorted normally
+
+ \_doc -----------------------------
+ Slovak sorting rules are the same as Czech. The macro `\_sortingdatacs`
+ includes Slovak letters too. Compound characters are the same.
+ English sorting rules can be defined by `\_sortingdatacs` too because
+ English alphabet is a subset of the Czech and Slovak alphabets. Only
+ difference: \`\_compoundcharsen` is empty in English rules.
+
+ You can declare these macros for more languages if you wish to use
+ `\makeindex` with sorting rules with respect to your language.
+ Note: if you need to map compound characters to a character, don't use
+ `^^I` or `^^M` because these characters have very specific category codes.
+ And use space to separate more mappings, like in \`\_compoundcharscs` above.
+ \_cod -----------------------------
+
+\_let \_sortingdatask = \_sortingdatacs
+\_let \_compoundcharssk = \_compoundcharscs
+\_let \_ignoredcharssk = \_ignoredcharscs
+\_let \_sortingdataen = \_sortingdatacs
+\_def \_compoundcharsen {}
+\_let \_ignoredcharsen = \_ignoredcharscs
+
+ \_doc -----------------------------
+ Preparing to primary pass is implemented by the \`\_setprimarysorting` macro.
+ It is called from `\makeindex` macro and all processing of sorting is in a group.
+ \_cod -----------------------------
+
+\_def\_setprimarysorting {%
+ \_ea\_let \_ea\_sortingdata \_csname _sortingdata\_sortinglang\_endcsname
+ \_ea\_let \_ea\_compoundchars \_csname _compoundchars\_sortinglang\_endcsname
+ \_ea\_let \_ea\_ignoredchars \_csname _ignoredchars\_sortinglang\_endcsname
+ \_ifx \_sortingdata\_relax \_addto\_nold{ sortingdata}%
+ \_let \_sortingdata = \_sortingdataen \_fi
+ \_ifx \_compoundchars\_relax \_addto\_nold{ compoundchars}%
+ \_let \_compoundchars = \_compoundcharsen \_fi
+ \_ifx \_ignoredchars\_relax \_addto\_nold{ ignoredchars}%
+ \_let \_ignoredchars = \_ignoredcharsen \_fi
+ \_ifx \_compoundchars\_empty \_else
+ \_edef \_compoundchars {\_detokenize\_ea{\_compoundchars} }\_fi % all must be catcode 12
+ \_def \_act ##1{\_ifx##1\_relax \_else
+ \_ifx##1,\_advance\_tmpnum by1
+ \_else \_lccode`##1=\_tmpnum \_fi
+ \_ea\_act \_fi}%
+ \_tmpnum=65 \_ea\_act \_sortingdata \_relax
+ \_def \_act ##1{\_ifx##1\_relax \_else
+ \_lccode`##1=`\^^I
+ \_ea\_act \_fi}%
+ \_ea\_act \_ignoredchars \_relax
+}
+
+ \_doc -----------------------------
+ Preparing to secondary pass is implemented by the \`\_setsecondarysorting` macro.
+ \_cod -----------------------------
+
+\_def\_setsecondarysorting {%
+ \_def \_act ##1{\_ifx##1\_relax \_else
+ \_ifx##1,\_else \_advance\_tmpnum by1 \_lccode`##1=\_tmpnum \_fi
+ \_ea\_act \_fi}%
+ \_tmpnum=64 \_ea\_act \_sortingdata \_relax
+}
+
+ \_doc -----------------------------
+ Strings to be sorted are prepared in `\,<string>` control sequences
+ (to save `\TeX` memory).
+ The \`\_preparesorting` `\,<string>` converts `<string>` to `\_tmpb`
+ with respect to the data initialized in \^`\_setprimarysorting` or
+ \^`\_setsecondarysorting`.\nl
+ The compoud characters are converted to single characters by the
+ \`\_docompound` macro.
+ \_cod -----------------------------
+
+\_def \_preparesorting #1{%
+ \_edef \_tmpb {\_ea\_ignorefirst\_csstring #1}% \,<string> -> <string>
+ \_ea \_docompound \_compoundchars \_relax:{} % replace compound characters
+ \_lowercase \_ea{\_ea\_def \_ea\_tmpb \_ea{\_tmpb}}% convert in respect to \_sortingdata
+ \_ea\_replstring \_ea\_tmpb \_ea{\_csstring\^^I}{}% remove ignored characters
+}
+\_def \_docompound #1:#2 {%
+ \_ifx\_relax#1\_else \_replstring\_tmpb {#1}{#2}\_ea\_docompound \_fi
+}
+\_def \_ignorefirst#1{}
+
+ \_doc -----------------------------
+ Macro \`\_isAleB` `\,<string1> \,<string2>` returns the result of comparison
+ of given two strings to \`\_ifAleB` control sequence. Usage:
+ `\isAleB \,<string1> \,<string2> \_ifAleB ... \_else ... \_fi`
+ The converted strings (in respect of the data prepared for first pass)
+ must be saved as values of `\,<string1>` and `\,<string2>` macros.
+ The reason is speed: we don't want to convert them repeatedly in each
+ comparison.
+ \nl
+ The macro
+ \`\_testAleB` `<converted string1>&\_relax<converted-string2>\_relax \,<string1>\,<string2>`\nl
+ does the real work. It reads the first character from both converted strings, compares them
+ and if it is equal then calls itself recursively else gives the result.
+ \_cod -----------------------------
+
+\_newifi \_ifAleB
+
+\_def\_isAleB #1#2{%
+ \_edef\_tmpb {#1&\_relax#2&\_relax}%
+ \_ea \_testAleB \_tmpb #1#2%
+}
+\_def\_testAleB #1#2\_relax #3#4\_relax #5#6{%
+ \_if #1#3\_if #1&\_testAleBsecondary #5#6% goto to the second pass::
+ \_else \_testAleB #2\_relax #4\_relax #5#6%
+ \_fi
+ \_else \_ifnum `#1<`#3 \_AleBtrue \_else \_AleBfalse \_fi
+ \_fi
+}
+\_def\_testAleBsecondary#1#2{%
+ \_bgroup
+ \_setsecondarysorting
+ \_preparesorting#1\_let\_tmpa=\_tmpb \_preparesorting#2%
+ \_edef\_tmpb{\_tmpa0\_relax\_tmpb1\_relax}%
+ \_ea\_testAleBsecondaryX \_tmpb
+ \_egroup
+}
+\_def\_testAleBsecondaryX #1#2\_relax #3#4\_relax {%
+ \_if #1#3\_testAleBsecondaryX #2\_relax #4\_relax
+ \_else \_ifnum `#1<`#3 \_global\_AleBtrue \_else \_global \_AleBfalse \_fi
+ \_fi
+}
+
+ \_doc -----------------------------
+ Merge sort is very effectively implemented by \TeX/ macros. The following
+ code is created by my son Miroslav.
+ The \`\_mergesort` macro expects that all items in `\_iilist` are separated
+ by a comma when it starts. It ends with sorted items in `\_iilist` without commas.
+ So `\_dosorting` macro must prepare commas between items.
+ \_cod -----------------------------
+
+\_def\_mergesort #1#2,#3{% by Miroslav Olsak
+ \_ifx,#1% % prazdna-skupina,neco, (#2=neco #3=pokracovani)
+ \_addto\_iilist{#2,}% % dvojice skupin vyresena
+ \_sortreturn{\_fif\_mergesort#3}% % \mergesort pokracovani
+ \_fi
+ \_ifx,#3% % neco,prazna-skupina, (#1#2=neco #3=,)
+ \_addto\_iilist{#1#2,}% % dvojice skupin vyresena
+ \_sortreturn{\_fif\_mergesort}% % \mergesort dalsi
+ \_fi
+ \_ifx\_end#3% % neco,konec (#1#2=neco)
+ \_ifx\_empty\_iilist % neco=kompletni setrideny seznam
+ \_def\_iilist{#1#2}%
+ \_sortreturn{\_fif\_fif\_gobbletoend}% % koncim
+ \_else % neco=posledni skupina nebo \end
+ \_sortreturn{\_fif\_fif % spojim \indexbuffer+necoa cele znova
+ \_edef\_iilist{\_ea}\_ea\_mergesort\_iilist#1#2,#3}%
+ \_fi\_fi % zatriduji: p1+neco1,p2+neco2, (#1#2=p1+neco1 #3=p2)
+ \_isAleB #1#3\_ifAleB % p1<p2
+ \_addto\_iilist{#1}% % p1 do bufferu
+ \_sortreturn{\_fif\_mergesort#2,#3}% % \mergesort neco1,p2+neco2,
+ \_else % p1>p2
+ \_addto\_iilist{#3}% % p2 do bufferu
+ \_sortreturn{\_fif\_mergesort#1#2,}% % \mergesort p1+neco1,neco2,
+ \_fi
+ \_relax % zarazka, na ktere se zastavi \sortreturn
+}
+\_def\_sortreturn#1#2\_fi\_relax{#1} \_def\_fif{\_fi}
+\_def\_gobbletoend #1\_end{}
+
+ \_doc -----------------------------
+ The \`\_dosorting` `\list` macro redefines `\list` as sorted `\list`.
+ The `\list` have to include control sequences in the form `\<c><string>`.
+ These control sequences will be sorted with respect to <strings> without
+ change of meanings of these control sequences. Their meanings are
+ irrelevant when sorting. The first character <c> in `\<c><string>` should
+ be whatever. It does not influence the sorting. \OpTeX/ uses comma at
+ this place for sorting indexes: `\,<word1> \,<word2> \,<word3> ...`.
+
+ The actual language (chosen for hyphenation patterns) is used for
+ sorting data. If the `\_sortinglang` macro
+ is defined as `<iso-code>`(for example `\def\sortinglang{de}`)
+ then this has precedence and actual language is not used.
+ Moreover, if you specify \`\_asciisortingtrue` then ASCII
+ sorting will be processed and all language sorting data will be ignored.
+ \_cod -----------------------------
+
+\_newifi \_ifasciisorting \_asciisortingfalse
+\_def\_dosorting #1{%
+ \_begingroup
+ \_def\_nold{}%
+ \_ifx\_sotringlang\_undefined \_edef\_sortinglang{\_cs{_lan:\_the\_language}}\_fi
+ \_ifasciisorting
+ \_edef\_sortinglang{ASCII}%
+ \_def \_preparesorting##1{\_edef\_tmpb{\_ea\_ignorefirst\_csstring##1}}%
+ \_let \_setsecondarysorting=\_relax
+ \_else
+ \_setprimarysorting
+ \_fi
+ \_message{OpTeX: Sorting \_string#1 (\_sortinglang) ...^^J}%
+ \_ifx\_nold\_empty\_else \_opwarning{Missing\_nold\_space for language (\_sortinglang)}\_fi
+ \_def \_act##1{\_preparesorting ##1\_edef##1{\_tmpb}}%
+ \_ea\_xargs \_ea\_act #1;%
+ \_def \_act##1{\_addto #1{##1,}}%
+ \_edef #1{\_ea}\_ea\_xargs \_ea\_act #1;%
+ \_edef \_iilist{\_ea}\_ea\_mergesort #1\_end,\_end
+ \_ea\_endgroup
+ \_ea\_def\_ea#1\_ea{\_iilist}%
+}
+
+ \_doc -----------------------------
+ The \`\makeindex` prints the index. First, it sorts the `\_iilist`
+ second, it prints the sorted `\_iilist`, each item is printed
+ using \^`\_printindexitem`.
+ \_cod -----------------------------
+
+\_def\_makeindex{\_par
+ \_ifx\_iilist\_empty \_opwarning{index data-buffer is empty. TeX me again}%
+ \_incr\_unresolvedrefs
+ \_else
+ \_dosorting \_iilist % sorting \_iilist
+ \_bgroup
+ \_rightskip=0pt plus1fil \_exhyphenpenalty=10000 \_leftskip=\_iindent
+ \_ea\_xargs \_ea\_printindexitem \_iilist ;\_par
+ \_egroup
+ \_fi
+}
+\_public \makeindex ;
+
+ \_doc -----------------------------
+ The \`\_printindexitem` `\,<word>` prints one item to the index.
+ If `\_,<word>` is defined then this is used instead real <word>
+ (this exception is declared by `\iis` macro). Else <word> is printed by
+ \^`\_printii`. Finally, \^`\_printiipages` prints the value of `\,<word>`,
+ i.e. the list of pages.
+ \_cod -----------------------------
+
+\_def\_printindexitem #1{%
+ \_ifcsname _\_csstring #1\_endcsname
+ \_ea\_ea\_ea \_printii \_csname _\_csstring #1\_endcsname &%
+ \_else
+ \_ea\_ea\_ea\_printii \_ea\_ignorefirst \_csstring #1&%
+ \_fi
+ \_ea\_printiipages #1&
+}
+
+ \_doc -----------------------------
+ \`\_printii` `<word>&` does more intelligent work because we are working with
+ words in the form `<main-word>/<sub-word>/<sub-sub-word>`.
+ The \^`\everyii` tokens register is applied before `\noindent`. User can
+ declare something special here.
+
+ The \`\_newiiletter``{<letter>}` macro is empty by default. It is invoked if first
+ letter of index entries is changed. You can declare a design between
+ index entries here. You can try, for example:
+ \begtt
+ \def\_newiiletter#1#2{%
+ \bigskip \hbox{\setfontsize{at15pt}\bf\uppercase{#1}}\medskip}
+ \endtt
+ \_cod -----------------------------
+
+\_def\_printii #1#2&{%
+ \_ismacro\_lastii{#1}\_iffalse \_newiiletter{#1}{#2}\_def\_lastii{#1}\_fi
+ \_gdef\_currii{#1#2}\_the\_everyii\_noindent
+ \_hskip-\_iindent \_ignorespaces\_printiiA#1#2//}
+\_def\_printiiA #1/{\_if^#1^\_let\_previi=\_currii \_else
+ \_ea\_scanprevii\_previi/&\_edef\_tmpb{\_detokenize{#1}}%
+ \_ifx\_tmpa\_tmpb \_iiemdash \_else#1 \_gdef\_previi{}\_fi
+ \_ea\_printiiA\_fi
+}
+\_def\_iiemdash{\_kern.1em---\_space}
+\_def\_lastii{}
+\_def\_newiiletter#1#2{}
+
+\_def\_scanprevii#1/#2&{\_def\_previi{#2}\_edef\_tmpa{\_detokenize{#1}}}
+\_def\_previi{} % previous index item
+
+ \_doc -----------------------------
+ \`\_printiipages` `<pglist>&` gets `<pglist>` in the form
+ `<pg>:<type>,<pg>:<type>,...<pg>:<type>` and it converts them to
+ `<pg>, <pg>, <from>--<to>, <pg>` etc. The same pages must be printed only once
+ and continuous consequences of pages must be compressed to the form <from>-<to>.
+ Moreover, the consequence is continuous only if all pages have the same <type>.
+ Empty <type> is most common, pages with `b` <type> must be printed as bold
+ and with `i` `<type>` as italics.
+ Moreover, the `<pg>` mentioned here are <gpageno>, but we have to print
+ <pageno>. The following macros solve these tasks.
+ \_cod -----------------------------
+
+\_def\_printiipages#1&{\_let\_pgtype=\_undefined \_tmpnum=0 \_printpages #1,:,\_par}
+\_def\_printpages#1:#2,{% state automaton for compriming pages
+ \_ifx,#1,\_uselastpgnum
+ \_else \_def\_tmpa{#2}%
+ \_ifx\_pgtype\_tmpa \_else
+ \_let\_pgtype=\_tmpa
+ \_uselastpgnum \_usepgcomma \_pgprint#1:{#2}%
+ \_tmpnum=#1 \_returnfi \_fi
+ \_ifnum\_tmpnum=#1 \_returnfi \_fi
+ \_advance\_tmpnum by1
+ \_ifnum\_tmpnum=#1 \_ifx\_lastpgnum\_undefined \_usepgdash\_fi
+ \_edef\_lastpgnum{\_the\_tmpnum:{\_pgtype}}%
+ \_returnfi \_fi
+ \_uselastpgnum \_usepgcomma \_pgprint#1:{#2}%
+ \_tmpnum=#1
+ \_relax
+ \_ea\_printpages \_fi
+}
+\_def\_returnfi #1\_relax{\_fi}
+\_def\_uselastpgnum{\_ifx\_lastpgnum\_undefined
+ \_else \_ea\_pgprint\_lastpgnum \_let\_lastpgnum=\_undefined \_fi
+}
+\_def\_usepgcomma{\_ifnum\_tmpnum>0, \_fi} % comma+space between page numbers
+\_def\_usepgdash{\_hbox{--}} % dash in the <from>--<to> form
+
+ \_doc -----------------------------
+ You can re-define \`\_pgprint` `<gpageno>:{<iitype>}`
+ if you need to implement more <iitypes>.
+ \_cod -----------------------------
+
+\_def\_pgprint #1:#2{%
+ \_ifx ,#2,\_pgprintA{#1}\_returnfi \_fi
+ \_ifx b#2{\_bf \_pgprintA{#1}}\_returnfi \_fi
+ \_ifx i#2{\_it \_pgprintA{#1}}\_returnfi \_fi
+ \_ifx u#2\_pgu{\_pgprintA{#1}}\_returnfi \_fi
+ \_pgprintA{#1}\_relax
+}
+\_def\_pgprintA #1{\_ilink[pg:#1]{\_cs{_pgi:#1}}} % \ilink[pg:<gpageno>]{<pageno>}
+\_def\_pgu#1{\_leavevmode\_vtop{\_hbox{#1}\kern.3ex\_hrule}}
+
+ \_doc -----------------------------
+ The \`\iindex``{<word>}` puts one <word> to the index. It writes
+ \^`\_Xindex``{<word>}{<iitype>}` to the `.ref` file.
+ All other variants of indexing macros expand internally to `\iindex`.
+ \_cod -----------------------------
+
+\_def\_iindex#1{\_isempty{#1}\_iffalse
+ \_openref{\_def~{ }\_ewref\_Xindex{{#1}{\_iitypesaved}}}\_fi}
+\_public \iindex ;
+
+ \_doc -----------------------------
+ The \`\_Xindex``{<word>}{<iitype>}` stores `\,<word>` to the `\_iilist` if
+ there is the first occurrence of the <word>. The list of pages where `<word>`
+ occurs, is the value of the macro `\,<word>`, so the `<gpageno>:<iitype>`
+ is appended to this list.
+ Moreover, we need a mapping from <gpageno> to `<pageno>`, because we print
+ `<pageno>` in the index, but hyperlinks are implemented by `<gpageno>`.
+ So, the macro `\_pgi:<gpageno>` is defined as `<pageno>`.
+ \_cod -----------------------------
+
+\_def \_iilist {}
+\_def \_Xindex #1#2{\_ea\_XindexA \_csname ,#1\_ea\_endcsname \_currpage {#2}}
+\_def \_XindexA #1#2#3#4{% #1=\,<word> #2=<gpageno> #3=<pageno> #4=<iitype>
+ \_ifx#1\_relax \_global\_addto \_iilist {#1}%
+ \_gdef #1{#2:#4}%
+ \_else \_global\_addto #1{,#2:#4}%
+ \_fi
+ \_sxdef{_pgi:#2}{#3}%
+}
+
+ \_doc -----------------------------
+ The implementation of macros \`\ii`, \`\iid`, \`\iis` follows.
+ Note that `\ii` works in the horizontal mode in order to the `\write` whatsit
+ is not broken from the following word. If you need to keep vertical mode,
+ use \^`\iindex``{<word>}` directly.
+ \nl
+ The \`\iitype` `{<type>}` saves the `<type>` to the \`\_iitypesaved` macro. It is
+ used in the \^`\iindex` macro.
+ \_cod -----------------------------
+
+\_def\_ii #1 {\_leavevmode\_def\_tmp{#1}\_iiA #1,,\_def\_iitypesaved{}}
+
+\_def\_iiA #1,{\_if$#1$\_else\_def\_tmpa{#1}%
+ \_ifx\_tmpa\_iiatsign \_ea\_iiB\_tmp,,\_else\_iindex{#1}\_fi
+ \_ea\_iiA\_fi}
+\_def\_iiatsign{@}
+
+\_def\_iiB #1,{\_if$#1$\_else \_iiC#1/\_relax \_ea\_iiB\_fi}
+\_def\_iiC #1/#2\_relax{\_if$#2$\_else\_iindex{#2#1}\_fi}
+
+\_def\_iid #1 {\_leavevmode\_iindex{#1}#1\_futurelet\_tmp\_iiD\_def\_iitypesaved{}}
+\_def\_iiD{\_ifx\_tmp,\_else\_ifx\_tmp.\_else\_space\_fi\_fi}
+
+\_def\_iis #1 #2{{\_def~{ }\_global\_sdef{_,#1}{#2}}\_ignorespaces}
+
+\_def\_iitypesaved{}
+\_def\_iitype #1{\_def\_iitypesaved{#1}\_ignorespaces}
+
+\_public \ii \iid \iis \iitype ;
+
+\_endcode % -------------------------------------
+
+2021-02-15 \_expandafter -> \_ea
+2021-02-01 secodary sorting: start from code 65
+2020-04-21 \isempty \iffalse ... \fi added to \iindex
+2020-03-26 introduced
diff --git a/macros/optex/base/maketoc.opm b/macros/optex/base/maketoc.opm
new file mode 100644
index 0000000000..8dfd821640
--- /dev/null
+++ b/macros/optex/base/maketoc.opm
@@ -0,0 +1,154 @@
+% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \maketoc {Macros for maketoc <2020-02-09>} % preloaded in format
+
+ \_doc ------------------------------------
+ \`\_Xtoc` `{<level>}{<type>}{<number>}{<o-title>}<title>` (in `.ref` file) reads
+ given data and appends them to the \`\_toclist` as
+ \^`\_tocline``{<level>}{<type>}{<number>}{<o-title>}{<title>}{<gpageno>}{<pageno>}`
+ where:
+ \begitems
+ * `<level>`: 0 reserved, 1: chapter, 2: section, 3: subsection
+ * `<type>`: the type of the level, i.e. chap, sec, secc
+ * `<number>`: the number of the chapter/section/subsection in the format 1.2.3
+ * `<o-title>`: outlines title, if differs from `<title>`.
+ * `<title>`: the title text
+ * `<gpageno>`: the page number numbered from 1 independently of pagination
+ * `<pageno>`: the page number used in the pagination
+ \enditems
+ The last two parameters are restored from previous
+ \^`\_Xpage``{<pageno>}{<gpageno>}`, data were saved in the \^`\_currpage` macro.
+
+ We read the <title> parameter by \^`\scantoeol` from `.ref` file
+ because the <title> can include something like \code{`\{`}.
+ \_cod ------------------------------------
+
+\_def\_toclist{}
+\_newifi \_ifischap \_ischapfalse
+
+\_def\_Xtoc#1#2#3#4{\_ifnum#1=0 \_ischaptrue\_fi
+ \_addto\_toclist{\_tocline{#1}{#2}{#3}{#4}}\_scantoeol\_XtocA}
+\_def\_XtocA#1{\_addto\_toclist{{#1}}\_ea\_addto\_ea\_toclist\_ea{\_currpage}}
+
+ \_doc ------------------------------------
+ \`\_tocline``{<level>}{<type>}{<number>}{<o-title>}{<title>}{<gpageno>}{<pageno>}`
+ prints the record to the table of contents. It opens group, reduces `\_leftskip`,
+ `\_rightskip`, runs the \^`\everytocline` (user can customise the design of TOC
+ here) and runs `\_tocl:<level> {<number>}{<title>}{<pageno>}` macro.
+ This macro starts with vertical mode,
+ inserts one record with given `<level>` and it should end by \^`\_tocpar`
+ which returns to horizontal mode. The `\_tocpar`
+ appends `\_nobreak \_hskip-2\_iindent\_null \_par`. This causes
+ that the last line of the record is shifted outside the margin given by
+ `\_rightskip`. A typical record (with long `<title>`) looks like this:
+ \begtt \catcode`\<=13
+ | |
+ \llap{<number>} text text text text text
+ text text text text text
+ text text .................... <pageno>
+ \endtt
+ Margins given by `\leftskip` and `\rightskip` are denoted by `|` in the
+ examle above.
+ \nl
+ \`\tocrefnum` is the global counter of all TOC records (used by hyperlinks).
+ \_cod ------------------------------------
+
+\_newcount \_tocrefnum
+\_def\_tocline#1#2#3#4#5#6#7{%
+ \_advance\_tocrefnum by1
+ \_bgroup
+ \_leftskip=\_iindent \_rightskip=2\_iindent
+ \_ifischap \_advance\_leftskip by \_iindent \_fi
+ \_def\_pgn{\_ilink[pg:#6]}%
+ \_the\_everytocline
+ \_ifcsname _tocl:#1\_endcsname
+ \_cs{_tocl:#1}{#3}{\_scantextokens{#5}}{#7}\_par
+ \_fi
+ \_egroup
+}
+\_public \tocrefnum ;
+
+ \_doc -----------------------------------
+ You can re-define default macros for each level of tocline if you want.\nl
+ Parameters are `{<number>}{<title>}{<pageno>}`.
+ \_cod -----------------------------------
+
+\_sdef{_tocl:1}#1#2#3{\_nofirst\_bigskip \_bf\_llaptoclink{#1}{#2}\_hfill \_pgn{#3}\_tocpar}
+\_sdef{_tocl:2}#1#2#3{\_llaptoclink{#1}{#2}\_tocdotfill \_pgn{#3}\_tocpar}
+\_sdef{_tocl:3}#1#2#3{\_advance\_leftskip by\_iindent \_cs{_tocl:2}{#1}{#2}{#3}}
+
+ \_doc -----------------------------------
+ The auxiliary macros are:
+ \begitems
+ * \`\_llaptoclink``<text>` does `\_noindent\_llap{<linked text>}`.
+ * \`\_tocdotfill` creates dots in the TOC.
+ * \`\_nofirst``\macro` applies the `\macro` only if we don't print the first
+ record of the TOC.
+ * \`\_tocpar` finalizes one TOC recors whith rlapped `<pageno>`.
+ * \`\_pgn``{<pageno>}` creates <pageno> as link to real `<gpage>` saved in `#6`
+ of \^`\_tocline`. This is temporarily defined in the \^`\_tocline`.
+ \enditems
+ \_cod ----------------------------------
+
+\_def\_llaptoclink#1{\_noindent
+ \_llap{\_ilink[toc:\_the\_tocrefnum]{\_enspace#1\_kern.4em}\_kern.1em}}
+\_def\_tocdotfill{\_nobreak\_leaders\_hbox to.8em{\_hss.\_hss}\_hskip 1em plus1fill\_relax}
+\_def\_nofirst #1{\_ifnum \_lastpenalty=11333 \_else #1\_fi}
+\_def\_tocpar{\_nobreak \_hskip-2\_iindent\_null \_par}
+
+ \_doc -----------------------------------
+ If you want a special formating of TOC with adding more
+ special lines (no generated as titles from `\chap`, `\sec`, `\secc`), you
+ can define `\addtotoc{<level>}{<type>}{<number>}{<o-title>}{<title>}` macro:
+ \begtt
+ \def\addtotoc#1#2#3#4#5{%
+ \incr\_tocrefnum
+ \_dest[toc:\_the\_tocrefnum]%
+ \_ewref\_Xtoc{{#1}{#2}{#3}{#4}#5}%
+ }
+ \endtt
+ and you can declare special lines (or something else)
+ as an unused level (10 in the following example):
+ \begtt
+ \sdef{_tocl:10}#1#2#3{\medskip\hbox{\Blue #2}\medskip}
+ \endtt
+ Now, users can add a blue line into TOC by
+ \begtt \catcode`\<=13
+ \addtotoc{10}{blue-line}{}{\relax}{<blue text to be added in the TOC>}
+ \endtt
+ anywhere in the document. Note that `\relax` in the fourth parameter
+ means that outline will be not generated. And second parameter
+ `blue-line` is only a comment (unused in macros).
+
+ \`\maketoc` prints warning if TOC data is empty, else it creates TOC by
+ running \^`\_toclist`
+ \_cod ----------------------------------
+
+\_def\_maketoc{\_par \_ifx\_toclist\_empty
+ \_opwarning{\_noexpand\maketoc -- data unavailable, TeX me again}\_openref
+ \_incr\_unresolvedrefs
+ \_else \_begingroup
+ \_tocrefnum=0 \_penalty11333
+ \_the\_regtoc \_toclist
+ \_endgroup \_fi
+}
+
+ \_doc -----------------------------------
+ \`\regmacro` appends its parameters to \`\_regtoc`, \`\_regmark` and
+ \`\_regoul`. These token lists are used in \^`\maketoc`, \^`\_begoutput` and
+ \^`\pdfunidef`.
+ \_cod \_fin -----------------------------
+
+\_newtoks \_regtoc \_newtoks \_regmark \_newtoks \_regoul
+
+\_def\_regmacro #1#2#3{%
+ \_toksapp\_regtoc{#1}\_toksapp\_regmark{#2}\_toksapp\_regoul{#3}%
+}
+\_public \maketoc \regmacro ;
+
+\_endcode
+
+2021-02-09 \thisoutline implemented
+2020-04-23 \_tocpar introduced (incompatible change)
+2020-04-22 \_pg -> \_pgn (incompatible change)
+2020-03-12 introduced
diff --git a/macros/optex/base/margins.opm b/macros/optex/base/margins.opm
new file mode 100644
index 0000000000..d88cc04237
--- /dev/null
+++ b/macros/optex/base/margins.opm
@@ -0,0 +1,80 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \margins {Macros for margins setting <2021-03-15>} % preloaded in format
+
+ \_doc ----------------------------
+ \`\margins``/<pg> <fmt> (<left>,<right>,<top>,<bot>)<unit>`
+ takes its parameters, does calculation and sets `\hoffset`, `\voffset`,
+ `\hsize` and `\vsize` registers. Note that \OpTeX/ sets the page origin at
+ the top left corner of the paper, no at the obscure position 1\,in, 1\,in.
+ It is much more comfortable for macro writers.
+ \_cod ----------------------------
+
+\_newdimen\_pgwidth \_newdimen\_pgheight \_pgwidth=0pt
+\_newdimen\_shiftoffset
+
+\_def\_margins/#1 #2 (#3,#4,#5,#6)#7 {\_def\_tmp{#7}%
+ \_ifx\_tmp\_empty
+ \_opwarning{\_string\_margins: missing unit, mm inserted}\_def\_tmp{mm}\_fi
+ \_setpagedimens #2 % setting \_pgwidth, \_pgheight
+ \_ifdim\_pgwidth=0pt \_else
+ \_hoffset=0pt \_voffset=0pt
+ \_if$#3$\_if$#4$\_hoffset =\_dimexpr (\_pgwidth -\_hsize)/2 \_relax
+ \_else \_hoffset =\_dimexpr \_pgwidth -\_hsize - #4\_tmp \_relax % only right margin
+ \_fi
+ \_else \_if$#4$\_hoffset = #3\_tmp \_relax % only left margin
+ \_else \_hsize =\_dimexpr \_pgwidth - #3\_tmp - #4\_tmp \_relax % left+right margin
+ \_hoffset = #3\_tmp \_relax
+ \_xhsize =\_hsize \_setxhsize % \_xhsize used by \output routine
+ \_fi\_fi
+ \_if$#5$\_if$#6$\_voffset =\_dimexpr (\_pgheight -\_vsize)/2 \_relax
+ \_else \_voffset =\_dimexpr \_pgheight -\_vsize - #6\_tmp \_relax % only bottom margin
+ \_fi
+ \_else \_if$#6$\_voffset = #5\_tmp \_relax % only top margin
+ \_else \_vsize=\_dimexpr \_pgheight - #5\_tmp - #6\_tmp \_relax % top+bottom margin
+ \_voffset = #5\_tmp \_relax
+ \_fi\_fi
+ \_if 1#1\_shiftoffset=0pt \_def\_prepoffsets{}\_else \_if 2#1% double-page layout
+ \_shiftoffset = \_dimexpr \_pgwidth -\_hsize -2\_hoffset \_relax
+ \_def\_prepoffsets{\_ifodd\_pageno \_else \_advance\_hoffset \_shiftoffset \_fi}%
+ \_else \_opwarning{use \_string\_margins/1 or \_string\_margins/2}%
+ \_fi\_fi\_fi
+}
+\_def\_setpagedimens{\_isnextchar({\_setpagedimensB}{\_setpagedimensA}}
+\_def\_setpagedimensA#1 {\_ifcsname _pgs:#1\_endcsname
+ \_ea\_ea\_ea\_setpagedimensB \_csname _pgs:#1\_ea\_endcsname\_space
+ \_else \_opwarning{page specification "#1" is undefined}\_fi}
+\_def\_setpagedimensB (#1,#2)#3 {\_setpagedimensC\_pgwidth=#1:#3
+ \_setpagedimensC\_pgheight=#2:#3
+ \_pdfpagewidth=\_pgwidth \_pdfpageheight=\_pgheight
+}
+\_def\_setpagedimensC #1=#2:#3 {#1=#2\_ifx^#3^\_tmp\_else#3\_fi\_relax\_truedimen#1}
+
+\_public \margins ;
+
+ \_doc ----------------------------
+ The common page dimensions are defined here.
+ \_cod ----------------------------
+
+\_sdef{_pgs:a3}{(297,420)mm} \_sdef{_pgs:a4}{(210,297)mm} \_sdef{_pgs:a5}{(148,210)mm}
+\_sdef{_pgs:a3l}{(420,297)mm} \_sdef{_pgs:a4l}{(297,210)mm} \_sdef{_pgs:a5l}{(210,148)mm}
+\_sdef{_pgs:b5}{(176,250)mm} \_sdef{_pgs:letter}{(8.5,11)in}
+
+ \_doc ----------------------------
+ \`\magscale` `[<factor>]` does `\mag=<factor>` and recalculates page
+ dimensions to their true values.
+ \_cod ----------------------------
+
+\_def\_trueunit{}
+\_def\_magscale[#1]{\_mag=#1\_def\_trueunit{true}%
+ \_ifdim\_pgwidth=0pt \_else \_truedimen\_pgwidth \_truedimen\_pgheight \_fi
+ \_truedimen\_pdfpagewidth \_truedimen\_pdfpageheight
+}
+\_def\_truedimen#1{\_ifx\_trueunit\_empty \_else#1=\_ea\_ignorept\_the#1truept \_fi}
+
+\_public \magscale ;
+
+\_endcode % -----------------------------------------
+
+2021-03-15 \_setxhsize added
+2020-03-14 released
diff --git a/macros/optex/base/math-macros.opm b/macros/optex/base/math-macros.opm
new file mode 100644
index 0000000000..2b090ee1b8
--- /dev/null
+++ b/macros/optex/base/math-macros.opm
@@ -0,0 +1,1079 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \sin {Math macros plus mathchardefs <2021-02-15>} % preloaded in format
+
+ \_doc -----------------------------
+ The category code of the character `_` remains as the letter (11) and the mathocode
+ of it is `"8000`.
+ It means that it is an active character in math mode. It is defined as the subscript prefix.
+
+ There is a problem: The `x_n` is tokenized as `x`, `_`, `n` and it works
+ without problems. But `\int``_a^b` is tokenized as `\int``_a`, `^`, `b`. The
+ control sequence `\int``_a` isn't defined. We must write `\int _a^b`.
+
+ The Lua code presented here solves this problem. But you cannot set your own
+ control sequence in the form `\<word>_` or `\<word>_<one-letter>` (where
+ <word> is a sequence of letters) because such control sequences are
+ inaccessible: preprocessor rewrites it.
+
+ The \`\mathsbon` macro activates the rewriting rule `\<word>_<nonleter>` to
+ `\<word> _<nonletter>` and
+ `\<word>``_<letter><nonletter>` to `\<word> _<letter><nonletter>` at input
+ processor level. The \`\mathsboff` deactivates it.
+ You can ask by \`\_ifmathsb` if this feature is activated or deactivated.
+ By default, it is activated in the `\everyjob`, see section~\ref[init].
+ Note, that the `\everyjob` is processed after the first line of the document is
+ read, so the \^`\mathsbon` is activated from the second line of the document.
+ \_cod -----------------------------
+
+\catcode`\_ = 8 \let\sb = _
+\catcode`\_ = 13 \let _ = \sb
+\catcode`\_ = 11
+\_private \sb ;
+
+\_newifi\_ifmathsb \_mathsbfalse
+\_def \_mathsbon {%
+ \_directlua{
+ callback.add_to_callback("process_input_buffer",
+ function (str)
+ return string.gsub(str.." ", "(\_nbb[a-zA-Z]+)_([a-zA-Z]?[^_a-zA-Z])", "\_pcent 1 _\_pcent 2")
+ end, "_mathsb") }%
+ \_global\_mathsbtrue
+}
+\_def \_mathsboff {%
+ \_directlua{ callback.remove_from_callback("process_input_buffer", "_mathsb") }%
+ \_global \_mathsbfalse
+}
+\_public \mathsboff \mathsbon ;
+
+ \_doc -----------------------------
+ All mathcodes are set to equal values as in plain\TeX/.
+ But all encoding-dependent declarations (like these) will be set
+ to different values when a Unicode-math font is used.
+ \_cod -----------------------------
+
+\_mathcode`\^^@="2201 % \cdot
+\_mathcode`\^^A="3223 % \downarrow
+\_mathcode`\^^B="010B % \alpha
+\_mathcode`\^^C="010C % \beta
+\_mathcode`\^^D="225E % \land
+\_mathcode`\^^E="023A % \lnot
+\_mathcode`\^^F="3232 % \in
+\_mathcode`\^^G="0119 % \pi
+\_mathcode`\^^H="0115 % \lambda
+\_mathcode`\^^I="010D % \gamma
+\_mathcode`\^^J="010E % \delta
+\_mathcode`\^^K="3222 % \uparrow
+\_mathcode`\^^L="2206 % \pm
+\_mathcode`\^^M="2208 % \oplus
+\_mathcode`\^^N="0231 % \infty
+\_mathcode`\^^O="0140 % \partial
+\_mathcode`\^^P="321A % \subset
+\_mathcode`\^^Q="321B % \supset
+\_mathcode`\^^R="225C % \cap
+\_mathcode`\^^S="225B % \cup
+\_mathcode`\^^T="0238 % \forall
+\_mathcode`\^^U="0239 % \exists
+\_mathcode`\^^V="220A % \otimes
+\_mathcode`\^^W="3224 % \leftrightarrow
+\_mathcode`\^^X="3220 % \leftarrow
+\_mathcode`\^^Y="3221 % \rightarrow
+\_mathcode`\^^Z="8000 % \ne
+\_mathcode`\^^[="2205 % \diamond
+\_mathcode`\^^\="3214 % \le
+\_mathcode`\^^]="3215 % \ge
+\_mathcode`\^^^="3211 % \equiv
+\_mathcode`\^^_="225F % \lor
+\_mathcode`\ ="8000 % \space
+\_mathcode`\!="5021
+\_mathcode`\'="8000 % ^\prime
+\_mathcode`\(="4028
+\_mathcode`\)="5029
+\_mathcode`\*="2203 % \ast
+\_mathcode`\+="202B
+\_mathcode`\,="613B
+\_mathcode`\-="2200
+\_mathcode`\.="013A
+\_mathcode`\/="013D
+\_mathcode`\:="303A
+\_mathcode`\;="603B
+\_mathcode`\<="313C
+\_mathcode`\=="303D
+\_mathcode`\>="313E
+\_mathcode`\?="503F
+\_mathcode`\[="405B
+\_mathcode`\\="026E % \backslash
+\_mathcode`\]="505D
+\_mathcode`\_="8000 % math-active subscript
+\_mathcode`\{="4266
+\_mathcode`\|="026A
+\_mathcode`\}="5267
+\_mathcode`\^^?="1273 % \smallint
+
+\_delcode`\(="028300
+\_delcode`\)="029301
+\_delcode`\[="05B302
+\_delcode`\]="05D303
+\_delcode`\<="26830A
+\_delcode`\>="26930B
+\_delcode`\/="02F30E
+\_delcode`\|="26A30C
+\_delcode`\\="26E30F
+
+ \_doc -----------------------------
+ All control sequences declared by `\mathchardef` are supposed (by default)
+ only for public usage. It means that they are declared without `_` prefix.
+ If such sequences are used in internal \OpTeX/ macro then their internal
+ prefixed form is declared using `\_private` macro.\nl
+ These encoding dependent declarations will be set to different values
+ when Unicode-math font is loaded.\nl
+ The declared sequences for math symbols are not hyperlinked in this documentation.
+ \maxlines=15
+ \_cod -----------------------------
+
+\_mathchardef\alpha="010B
+\_mathchardef\beta="010C
+\_mathchardef\gamma="010D
+\_mathchardef\delta="010E
+\_mathchardef\epsilon="010F
+\_mathchardef\zeta="0110
+\_mathchardef\eta="0111
+\_mathchardef\theta="0112
+\_mathchardef\iota="0113
+\_mathchardef\kappa="0114
+\_mathchardef\lambda="0115
+\_mathchardef\mu="0116
+\_mathchardef\nu="0117
+\_mathchardef\xi="0118
+\_mathchardef\pi="0119
+\_mathchardef\rho="011A
+\_mathchardef\sigma="011B
+\_mathchardef\tau="011C
+\_mathchardef\upsilon="011D
+\_mathchardef\phi="011E
+\_mathchardef\chi="011F
+\_mathchardef\psi="0120
+\_mathchardef\omega="0121
+\_mathchardef\varepsilon="0122
+\_mathchardef\vartheta="0123
+\_mathchardef\varpi="0124
+\_mathchardef\varrho="0125
+\_mathchardef\varsigma="0126
+\_mathchardef\varphi="0127
+\_mathchardef\Gamma="7000
+\_mathchardef\Delta="7001
+\_mathchardef\Theta="7002
+\_mathchardef\Lambda="7003
+\_mathchardef\Xi="7004
+\_mathchardef\Pi="7005
+\_mathchardef\Sigma="7006
+\_mathchardef\Upsilon="7007
+\_mathchardef\Phi="7008
+\_mathchardef\Psi="7009
+\_mathchardef\Omega="700A
+
+\_mathchardef\aleph="0240
+\_mathchardef\imath="017B
+\_mathchardef\jmath="017C
+\_mathchardef\ell="0160
+\_mathchardef\wp="017D
+\_mathchardef\Re="023C
+\_mathchardef\Im="023D
+\_mathchardef\partial="0140
+\_mathchardef\infty="0231
+\_mathchardef\prime="0230
+\_mathchardef\emptyset="023B
+\_mathchardef\nabla="0272
+\_protected\_def \surd{{\_mathchar"1270}}
+\_mathchardef\top="023E
+\_mathchardef\bot="023F
+\_mathchardef\triangle="0234
+\_mathchardef\forall="0238
+\_mathchardef\exists="0239
+\_mathchardef\neg="023A \_let\lnot=\neg
+\_mathchardef\flat="015B
+\_mathchardef\natural="015C
+\_mathchardef\sharp="015D
+\_mathchardef\clubsuit="027C
+\_mathchardef\diamondsuit="027D
+\_mathchardef\heartsuit="027E
+\_mathchardef\spadesuit="027F
+
+\_mathchardef\coprod="1360
+\_mathchardef\bigvee="1357
+\_mathchardef\bigwedge="1356
+\_mathchardef\biguplus="1355
+\_mathchardef\bigcap="1354
+\_mathchardef\bigcup="1353
+\_mathchardef\intop="1352
+\_protected\_def \int{\_intop\_nolimits} \_private \intop;
+\_mathchardef\prod="1351
+\_mathchardef\sum="1350
+\_mathchardef\bigotimes="134E
+\_mathchardef\bigoplus="134C
+\_mathchardef\bigodot="134A
+\_mathchardef\ointop="1348
+\_protected\_def\_oint {\_ointop\_nolimits} \_private \ointop;
+\_mathchardef\bigsqcup="1346
+\_mathchardef\smallint="1273
+
+\_mathchardef\triangleleft="212F \_private \triangleleft;
+\_mathchardef\triangleright="212E \_private \trianglerigt;
+\_mathchardef\bigtriangleup="2234
+\_mathchardef\bigtriangledown="2235
+\_mathchardef\wedge="225E \let\land=\wedge
+\_mathchardef\vee="225F \let\lor=\vee
+\_mathchardef\cap="225C
+\_mathchardef\cup="225B
+\_mathchardef\ddagger="227A
+\_mathchardef\dagger="2279
+\_mathchardef\sqcap="2275
+\_mathchardef\sqcup="2274
+\_mathchardef\uplus="225D
+\_mathchardef\amalg="2271
+\_mathchardef\diamond="2205
+\_mathchardef\bullet="220F \_private \bullet;
+\_mathchardef\wr="226F
+\_mathchardef\div="2204
+\_mathchardef\odot="220C
+\_mathchardef\oslash="220B
+\_mathchardef\otimes="220A
+\_mathchardef\ominus="2209
+\_mathchardef\oplus="2208
+\_mathchardef\mp="2207
+\_mathchardef\pm="2206
+\_mathchardef\circ="220E
+\_mathchardef\bigcirc="220D
+\_mathchardef\setminus="226E % for set difference A\setminus B
+\_mathchardef\cdot="2201
+\_mathchardef\ast="2203
+\_mathchardef\times="2202
+\_mathchardef\star="213F
+
+\_mathchardef\propto="322F
+\_mathchardef\sqsubseteq="3276
+\_mathchardef\sqsupseteq="3277
+\_mathchardef\parallel="326B
+\_mathchardef\mid="326A
+\_mathchardef\dashv="3261
+\_mathchardef\vdash="3260
+\_mathchardef\nearrow="3225
+\_mathchardef\searrow="3226
+\_mathchardef\nwarrow="322D
+\_mathchardef\swarrow="322E
+\_mathchardef\Leftrightarrow="322C
+\_mathchardef\Leftarrow="3228
+\_mathchardef\Rightarrow="3229
+\_protected\_def \neq{\_not=} \_let\ne=\neq
+\_mathchardef\leq="3214 \let\le=\leq
+\_mathchardef\geq="3215 \let\ge=\geq
+\_mathchardef\succ="321F
+\_mathchardef\prec="321E
+\_mathchardef\approx="3219
+\_mathchardef\succeq="3217
+\_mathchardef\preceq="3216
+\_mathchardef\supset="321B
+\_mathchardef\subset="321A
+\_mathchardef\supseteq="3213
+\_mathchardef\subseteq="3212
+\_mathchardef\in="3232
+\_mathchardef\ni="3233 \let\owns=\ni
+\_mathchardef\gg="321D
+\_mathchardef\ll="321C
+% \_mathchardef\not="3236 % defined below
+\_mathchardef\leftrightarrow="3224
+\_mathchardef\leftarrow="3220 \_let\gets=\leftarrow
+\_mathchardef\rightarrow="3221 \_let\to=\rightarrow
+\_mathchardef\mapstochar="3237
+\_protected\_def\mapsto{\_mapstochar\_rightarrow} \_private \mapstochar \rightarrow ;
+\_mathchardef\sim="3218
+\_mathchardef\simeq="3227
+\_mathchardef\perp="323F
+\_mathchardef\equiv="3211
+\_mathchardef\asymp="3210
+\_mathchardef\smile="315E
+\_mathchardef\frown="315F
+\_mathchardef\leftharpoonup="3128
+\_mathchardef\leftharpoondown="3129
+\_mathchardef\rightharpoonup="312A
+\_mathchardef\rightharpoondown="312B
+
+ \_doc -----------------------------
+ The math functions like log, sin, cos are declared in the same way as in
+ plain\TeX/, but they are `\protected` in \OpTeX/.
+ \_cod -----------------------------
+
+\_protected\_def\log {\_mathop{\_rm log}\_nolimits}
+\_protected\_def\lg {\_mathop{\_rm lg}\_nolimits}
+\_protected\_def\ln {\_mathop{\_rm ln}\_nolimits}
+\_protected\_def\lim {\_mathop{\_rm lim}}
+\_protected\_def\limsup {\_mathop{\_rm lim\_thinsk sup}}
+\_protected\_def\liminf {\_mathop{\_rm lim\_thinsk inf}}
+\_protected\_def\sin {\_mathop{\_rm sin}\_nolimits}
+\_protected\_def\arcsin {\_mathop{\_rm arcsin}\_nolimits}
+\_protected\_def\sinh {\_mathop{\_rm sinh}\_nolimits}
+\_protected\_def\cos {\_mathop{\_rm cos}\_nolimits}
+\_protected\_def\arccos {\_mathop{\_rm arccos}\_nolimits}
+\_protected\_def\cosh {\_mathop{\_rm cosh}\_nolimits}
+\_protected\_def\tan {\_mathop{\_rm tan}\_nolimits}
+\_protected\_def\arctan {\_mathop{\_rm arctan}\_nolimits}
+\_protected\_def\tanh {\_mathop{\_rm tanh}\_nolimits}
+\_protected\_def\cot {\_mathop{\_rm cot}\_nolimits}
+\_protected\_def\coth {\_mathop{\_rm coth}\_nolimits}
+%\_protected\_def\sec {\_mathop{\_rm sec}\_nolimits} % \sec is section
+\_protected\_def\csc {\_mathop{\_rm csc}\_nolimits}
+\_protected\_def\max {\_mathop{\_rm max}}
+\_protected\_def\min {\_mathop{\_rm min}}
+\_protected\_def\sup {\_mathop{\_rm sup}}
+\_protected\_def\inf {\_mathop{\_rm inf}}
+\_protected\_def\arg {\_mathop{\_rm arg}\_nolimits}
+\_protected\_def\ker {\_mathop{\_rm ker}\_nolimits}
+\_protected\_def\dim {\_mathop{\_rm dim}\_nolimits}
+\_protected\_def\hom {\_mathop{\_rm hom}\_nolimits}
+\_protected\_def\det {\_mathop{\_rm det}}
+\_protected\_def\exp {\_mathop{\_rm exp}\_nolimits}
+\_protected\_def\Pr {\_mathop{\_rm Pr}}
+\_protected\_def\gcd {\_mathop{\_rm gcd}}
+\_protected\_def\deg {\_mathop{\_rm deg}\_nolimits}
+
+ \_doc -----------------------------
+ These macros are defined similarly as in plain\TeX. Only internal macro
+ names from plain\TeX/ with `@` character are re-written in a more readable
+ form.\nl
+ \`\sp` is an alternative for `^`. The \`\sb` alternative for `_` was defined
+ at line 27 of the file `math-macros.opm`.
+ \_cod -----------------------------
+
+\_let\_sp=^ \public \sp ;
+% \sb=_ , defined at beginning of this file
+
+\_def\_thinsk {\_mskip\_thinmuskip}
+\_protected\_def\,{\_relax\_ifmmode \_thinsk \_else \_thinspace \_fi}
+\_protected\_def\>{\_mskip\_medmuskip} \let\_medsk = \>
+\_protected\_def\;{\_mskip\_thickmuskip} \let\_thicksk = \;
+\_protected\_def\!{\_mskip-\_thinmuskip} \let\_thinneg = \!
+%\_def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} % obsolete
+
+ \_doc -----------------------------
+ Active \`\prime` character is defined here.
+ \_cod -----------------------------
+
+{\_catcode`\'=\active \_gdef'{^\_bgroup\_primes}} % primes dance
+\_def\_primes{\_prime\_isnextchar'{\_primesA}%
+ {\_isnextchar^{\_primesB}{\_egroup}}}
+\_def\_primesA #1{\_primes}
+\_def\_primesB #1#2{#2\egroup}
+\_private \prime ;
+
+ \_doc -----------------------------
+ \`\big`, \`\Big`, \`\bigg`, \`\Bigg`, \`\bigl`, \`\bigm`, \`\bigr`, \`\Bigl`, \`\Bigm`,
+ \`\Bigr`, \`\biggl`, \`\biggm`, \`\biggr`, \`\Biggl`, \`\Biggm`, \`\Bigg`, \`\Biggr`
+ are based on the \`\_scalebig` macro because we need the dependency on
+ the various sizes of the fonts.
+ \_cod -----------------------------
+
+%{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math %obsolete
+
+\_def\_scalebig#1#2{{\_left#1\_vbox to#2\_fontdimen6\_textfont1{}%
+ \_kern-\_nulldelimiterspace\_right.}}
+\_protected\_def\_big#1{\_scalebig{#1}{.85}}
+\_protected\_def\_Big#1{\_scalebig{#1}{1.15}}
+\_protected\_def\_bigg#1{\_scalebig{#1}{1.45}}
+\_protected\_def\_Bigg#1{\_scalebig{#1}{1.75}}
+\_public \big \Big \bigg \Bigg ;
+
+\_protected\_def\_bigl{\_mathopen\_big}
+\_protected\_def\_bigm{\_mathrel\_big}
+\_protected\_def\_bigr{\_mathclose\_big}
+\_protected\_def\_Bigl{\_mathopen\_Big}
+\_protected\_def\_Bigm{\_mathrel\_Big}
+\_protected\_def\_Bigr{\_mathclose\_Big}
+\_protected\_def\_biggl{\_mathopen\_bigg}
+\_protected\_def\_biggm{\_mathrel\_bigg}
+\_protected\_def\_biggr{\_mathclose\_bigg}
+\_protected\_def\_Biggl{\_mathopen\_Bigg}
+\_protected\_def\_Biggm{\_mathrel\_Bigg}
+\_protected\_def\_Biggr{\_mathclose\_Bigg}
+\_public \bigl \bigm \bigr \Bigl \Bigm \Bigr \biggl \biggm \biggr \Biggl \Biggm \Biggr ;
+
+ \_doc -----------------------------
+ Math relations defined by the \`\jointrel` plain \TeX/ macro:
+ \_cod -----------------------------
+
+\_protected\_def\_joinrel{\_mathrel{\_mkern-2.5mu}} % -3mu in plainTeX
+\_protected\_def\relbar{\_mathrel{\_smash-}} % \_smash, because - has the same height as +
+\_protected\_def\Relbar{\_mathrel=}
+\_mathchardef\lhook="312C
+\_protected\_def\hookrightarrow{\_lhook\_joinrel\_rightarrow}
+\_mathchardef\rhook="312D
+\_protected\_def\hookleftarrow{\_leftarrow\_joinrel\_rhook}
+\_protected\_def\bowtie{\_mathrel\_triangleright\_joinrel\_mathrel\_triangleleft}
+\_protected\_def\models{\_mathrel|\_joinrel=}
+\_protected\_def\Longrightarrow{\_Relbar\_joinrel\_Rightarrow}
+\_protected\_def\longrightarrow{\_relbar\_joinrel\_rightarrow}
+\_protected\_def\longleftarrow{\_leftarrow\_joinrel\_relbar}
+\_protected\_def\Longleftarrow{\_Leftarrow\_joinrel\_Relbar}
+\_protected\_def\longmapsto{\_mapstochar\_longrightarrow}
+\_protected\_def\longleftrightarrow{\_leftarrow\_joinrel\_rightarrow}
+\_protected\_def\Longleftrightarrow{\_Leftarrow\_joinrel\_Rightarrow}
+\_protected\_def\iff{\_thicksk\_Longleftrightarrow\_thicksk}
+\_private \lhook \rightarrow \leftarrow \rhook \triangleright \triangleleft
+ \Relbar \Rightarrow \relbar \rightarrow \Leftarrow \mapstochar
+ \longrightarrow \Longleftrightarrow ;
+\_public \joinrel ;
+
+ \_doc -----------------------------
+ \`\ldots`, \`\cdots`, \`\vdots`, \`\ddots` from plain \TeX/
+ \_cod -----------------------------
+
+\_mathchardef\_ldotp="613A % ldot as a punctuation mark
+\_mathchardef\_cdotp="6201 % cdot as a punctuation mark
+\_mathchardef\_colon="603A % colon as a punctuation mark
+\_public \ldotp \cdotp \colon ;
+
+\_protected\_def\_ldots{\_mathinner{\_ldotp\_ldotp\_ldotp}}
+\_protected\_def\_cdots{\_mathinner{\_cdotp\_cdotp\_cdotp}}
+\_protected\_def\_vdots{\_vbox{\_baselineskip=.4em \_lineskiplimit=\_zo
+ \_kern.6em \_hbox{.}\_hbox{.}\_hbox{.}}}
+\_protected\_def\_ddots{\_mathinner{%
+ \_mkern1mu\_raise.7em\_vbox{\_kern.7em\_hbox{.}}\_mkern2mu
+ \_raise.4em\_hbox{.}\_mkern2mu\_raise.1em\_hbox{.}\_mkern1mu}}
+
+\_public \ldots \cdots \vdots \ddots ;
+
+ \_doc -----------------------------
+ \`\adots` inspired by plain \TeX/
+ \_cod -----------------------------
+
+\_protected\_def\_adots{\_mathinner{%
+ \_mkern1mu\_raise.1em\_hbox{.}\_mkern2mu
+ \_raise.4em\_hbox{.}\_mkern2mu\_raise.7em\_vbox{\_kern.7em\_hbox{.}}\_mkern1mu}}
+
+\_public \adots ;
+
+ \_doc -----------------------------
+ Math accents (encoding dependent declarations).
+ \_cod -----------------------------
+
+\_protected\_def\acute{\_mathaccent"7013 }
+\_protected\_def\grave{\_mathaccent"7012 }
+\_protected\_def\ddot{\_mathaccent"707F }
+\_protected\_def\tilde{\_mathaccent"707E }
+\_protected\_def\bar{\_mathaccent"7016 }
+\_protected\_def\breve{\_mathaccent"7015 }
+\_protected\_def\check{\_mathaccent"7014 }
+\_protected\_def\hat{\_mathaccent"705E }
+\_protected\_def\vec{\_mathaccent"017E }
+\_protected\_def\dot{\_mathaccent"705F }
+\_protected\_def\widetilde{\_mathaccent"0365 }
+\_protected\_def\widehat{\_mathaccent"0362 }
+
+ \_doc -----------------------------
+ \`\_math`, \`\skew`,
+ \`\overrightarrow`, \`\overleftarrow`, \`\overbrace`, \`\underbrace` macros.
+ The last four are redefined when Unicode math is loaded.
+ \_cod -----------------------------
+
+\_def\_math{\_mathsurround\_zo}
+\_protected\_def\_skew #1#2#3{{\_muskip0=#1mu\_divide\_muskip0=by2 \_mkern\_muskip0
+ #2{\_mkern-\_muskip0{#3}\_mkern\_muskip0}\_mkern-\_muskip0}{}}
+\_protected\_def\_overrightarrow #1{\_vbox{\_math\_ialign{##\_crcr
+ \_rightarrowfill\_crcr\_noalign{\_kern-.1em \_nointerlineskip}
+ $\_hfil\_displaystyle{#1}\_hfil$\_crcr}}}
+\_protected\_def\_overleftarrow #1{\_vbox{\_math\_ialign{##\_crcr
+ \_leftarrowfill\_crcr\_noalign{\_kern-.1em \_nointerlineskip}
+ $\_hfil\_displaystyle{#1}\_hfil$\_crcr}}}
+\_protected\_def\_overbrace #1{\_mathop{%
+ \_vbox{\_math\_ialign{##\_crcr\_noalign{\_kern.3em}
+ \_downbracefill\_crcr\_noalign{\_kern.3em \_nointerlineskip}
+ $\_hfil\_displaystyle{#1}\_hfil$\_crcr}}}\_limits}
+\_protected\_def\_underbrace #1{\_mathop{\_vtop{\_math\_ialign{##\_crcr
+ $\_hfil\_displaystyle{#1}\_hfil$\_crcr\_noalign{\_kern.3em \_nointerlineskip}
+ \_upbracefill\_crcr\_noalign{\_kern.3em}}}}\_limits}
+
+\_public \overrightarrow \overleftarrow \overbrace \underbrace \skew ;
+
+ \_doc -----------------------------
+ Macros based on `\delimiter`, `\*witdelims` and `\radical` primitives.
+ \_cod -----------------------------
+
+\_protected\_def\lmoustache{\_delimiter"437A340 } % top from (, bottom from )
+\_protected\_def\rmoustache{\_delimiter"537B341 } % top from ), bottom from (
+\_protected\_def\lgroup{\_delimiter"462833A } % extensible ( with sharper tips
+\_protected\_def\rgroup{\_delimiter"562933B } % extensible ) with sharper tips
+\_protected\_def\arrowvert{\_delimiter"26A33C } % arrow without arrowheads
+\_protected\_def\Arrowvert{\_delimiter"26B33D } % double arrow without arrowheads
+\_protected\_def\bracevert{\_delimiter"77C33E } % the vertical bar that extends braces
+\_protected\_def\Vert{\_delimiter"26B30D } \_let\|=\Vert
+\_protected\_def\vert{\_delimiter"26A30C }
+\_protected\_def\uparrow{\_delimiter"3222378 }
+\_protected\_def\downarrow{\_delimiter"3223379 }
+\_protected\_def\updownarrow{\_delimiter"326C33F }
+\_protected\_def\Uparrow{\_delimiter"322A37E }
+\_protected\_def\Downarrow{\_delimiter"322B37F }
+\_protected\_def\Updownarrow{\_delimiter"326D377 }
+\_protected\_def\backslash{\_delimiter"26E30F } % for double coset G\_backslash H
+\_protected\_def\rangle{\_delimiter"526930B }
+\_protected\_def\langle{\_delimiter"426830A }
+\_protected\_def\rbrace{\_delimiter"5267309 } \_let\}=\rbrace \_let\_rbrace=\rbrace
+\_protected\_def\lbrace{\_delimiter"4266308 } \_let\{=\lbrace \_let\_lbrace=\lbrace
+\_protected\_def\rceil{\_delimiter"5265307 }
+\_protected\_def\lceil{\_delimiter"4264306 }
+\_protected\_def\rfloor{\_delimiter"5263305 }
+\_protected\_def\lfloor{\_delimiter"4262304 }
+
+\_protected\_def\choose{\_atopwithdelims()}
+\_protected\_def\brack{\_atopwithdelims[]}
+\_protected\_def\brace{\_atopwithdelims\_lbrace\_rbrace}
+
+\_protected\_def\_sqrt{\_radical"270370 } \_public \sqrt ;
+
+ \_doc -----------------------------
+ \`\mathpalette`, \`\vphantom`, \`\hphantom`, \`\phantom`, \`\mathstrut`, and
+ \`\smash` macros from plain \TeX.
+ \_cod -----------------------------
+
+\_def\_mathpalette#1#2{\_mathchoice{#1\_displaystyle{#2}}%
+ {#1\_textstyle{#2}}{#1\_scriptstyle{#2}}{#1\_scriptscriptstyle{#2}}}
+\_newbox\_rootbox
+\_protected\_def\root#1\of{\_setbox\_rootbox
+ \_hbox{$\_math\_scriptscriptstyle{#1}$}\_mathpalette\_rootA}
+\_def\_rootA#1#2{\_setbox0=\_hbox{$\_math#1\_sqrt{#2}$}\_dimen0=\_ht0
+ \_advance\_dimen0by-\_dp0
+ \_mkern5mu\_raise.6\_dimen0\_copy\_rootbox \_mkern-10mu\_box0 }
+\_newifi\_ifvp \_newifi\_ifhp
+\_protected\_def\_vphantom{\_vptrue\_hpfalse\_phant}
+\_protected\_def\_hphantom{\_vpfalse\_hptrue\_phant}
+\_protected\_def\_phantom{\_vptrue\_hptrue\_phant}
+\_def\_phant{\_ifmmode\_def\_next{\_mathpalette\_mathphant}%
+ \_else\_let\_next=\_makephant\_fi\_next}
+\_def\_makephant#1{\_setbox0\_hbox{#1}\_finphant}
+\_def\_mathphant#1#2{\_setbox0=\_hbox{$\_math#1{#2}$}\_finphant}
+\_def\_finphant{\_setbox2=\_null
+ \_ifvp \_ht2=\_ht0 \_dp2=\_dp0 \_fi
+ \_ifhp \_wd2=\_wd0 \_fi \_hbox{\_box2}}
+\_def\_mathstrut{\_vphantom(}
+\_protected\_def\_smash{\_relax % \_relax, in case this comes first in \halign
+ \_ifmmode\_def\_next{\_mathpalette\_mathsmash}\_else\_let\_next\_makesmash
+ \_fi\_next}
+\_def\_makesmash#1{\_setbox0=\_hbox{#1}\_finsmash}
+\_def\_mathsmash#1#2{\_setbox0=\_hbox{$\_math#1{#2}$}\_finsmash}
+\_def\_finsmash{\_ht0=\_zo \_dp0=\_zo \_hbox{\_box0}}
+\_public \mathpalette \vphantom \hphantom \phantom \mathstrut \smash ;
+
+ \_doc -----------------------------
+ \`\cong`, \`\notin`, \`\rightleftharpoons`, \`\buildrel`, \`\doteq`, \`\bmod`
+ and \`\pmod` macros from plain \TeX/.
+ \_cod -----------------------------
+
+\_protected\_def\_cong{\_mathrel{\_mathpalette\_overeq\_sim}} % congruence sign
+\_def\_overeq#1#2{\_lower.05em\_vbox{\_lineskiplimit\_maxdimen\_lineskip=-.05em
+ \_ialign{$\_math#1\_hfil##\_hfil$\_crcr#2\_crcr=\_crcr}}}
+\_protected\_def\_notin{\_mathrel{\_mathpalette\_cancel\_in}}
+\_def\_cancel#1#2{\_math\_ooalign{$\_hfil#1\_mkern1mu/\_hfil$\_crcr$#1#2$}}
+\_protected\_def\_rightleftharpoons{\_mathrel{\_mathpalette\_rlhp{}}}
+\_def\_rlhp#1{\_vcenter{\_math\_hbox{\_ooalign{\_raise.2em
+ \_hbox{$#1\_rightharpoonup$}\_crcr
+ $#1\_leftharpoondown$}}}}
+\_protected\_def\_buildrel#1\over#2{\_mathrel{\_mathop{\_kern\_zo #2}\_limits^{#1}}}
+\_protected\_def\_doteq{\_buildrel\_textstyle.\over=}
+\_private \in \sim ;
+\_public \cong \notin \rightleftharpoons \buildrel \doteq ;
+
+\_protected\_def\_bmod{\_nonscript\_mskip-\_medmuskip\_mkern5mu
+ \_mathbin{\_rm mod}\_penalty900\_mkern5mu\_nonscript\_mskip-\_medmuskip}
+\_protected\_def\_pmod#1{\_allowbreak\_mkern18mu({\_rm mod}\_thinsk\_thinsk#1)}
+\_public \bmod \pmod ;
+
+ \_doc -----------------------------
+ \`\matrix` and \`\pmatrix`
+ behave as in Plain \TeX/, if it is used in the
+ `\displaystyle`. On the other hand, it is printed in smaller size
+ (by appropriate amount) in `\textstyle` = `\scriptstyle` and `\scriptscriptstyle`.
+ This feature is new in \OpTeX/.
+ \_cod -----------------------------
+
+\_protected\_def\_matrix#1{\_null\_thinsk
+ \_edef\_tmpa{\_the\_numexpr \_mathstyle/4\_relax}% 0 0 1 1 1 1 2 2
+ \_vcenter{\_matrixbaselines\_math
+ \_ialign{\_the\_lmfil$\_matrixstyle##$\_hfil&&\_quad\_the\_lmfil$\_matrixstyle##$\_hfil\_crcr
+ \_mathstrut\_crcr\_noalign{\_kern-\_baselineskip}
+ #1\_crcr\_mathstrut\_crcr\_noalign{\_kern-\_baselineskip}}}\_thinsk}
+
+\_def\_matrixbaselines{\_normalbaselines \_def\_matrixstyle{}%
+ \_let\_matrixbaselines=\_relax % \matrix inside matrix does not change size again
+ \_ifcase\_tmpa \_or
+ \_baselineskip=.7\_baselineskip \_def\_quad {\_hskip.7em\_relax}%
+ \_let\_matrixstyle=\_scriptstyle
+ \_or
+ \_baselineskip=.5\_baselineskip \_def\_quad {\_hskip.5em\_relax}%
+ \_let\_matrixstyle=\_scriptscriptstyle
+ \_fi
+}
+\_protected\_def\_pmatrix#1{\_left(\_matrix{#1}\_right)}
+
+\_public \matrix \pmatrix ;
+
+ \_doc -----------------------------
+ The \`\cases` and \`\bordermatrix` macros are almost identical as in plain \TeX/.
+ You can simply re-define `\bordermatrix` with other delimiters
+ using the common \`\_bordermatrixwithdelims` macro.
+ \_cod -----------------------------
+
+\_protected\_long\_def\_cases#1{\_left\{\_thinsk\_vcenter{\_normalbaselines\_math
+ \_ialign{$##\_hfil$&\_quad{##\_unsskip}\_hfil\_crcr#1\_crcr}}\_right.}
+
+\_newdimen\_ptrenwd
+\_ptrenwd=8.75pt % width of the big left (
+\_protected\_def\_bordermatrix{\_bordermatrixwithdelims()}
+\_def\_bordermatrixwithdelims#1#2#3{\_begingroup \_math
+ \_setbox0=\_vbox{\_bordermatrixA #3\_stopbmatrix}%
+ \_setbox2=\_vbox{\_unvcopy0 \_global\_setbox1=\_lastbox}%
+ \_setbox2=\_hbox{\_unhbox1 \_unskip\_global\_setbox1=\_lastbox}%
+ \_setbox2=\_hbox{$\_kern\_wd1 \_kern-\_ptrenwd\_left#1\_kern-\_wd1
+ \_global\_setbox1=\_vbox{\_box1 \_kern.2em}%
+ \_vcenter{\_kern-\_ht1 \_unvbox0 \_kern-\_baselineskip}\_thinsk\_right#2$}%
+ \_null\_thicksk\_vbox{\_kern\_ht1 \_box2}\_endgroup}
+\_def\_bordermatrixA #1\cr#2\_stopbmatrix{%
+ \_ialign{$##$\_hfil\_kern.2em\_kern\_ptrenwd&\_thinspace\_hfil$##$\_hfil
+ &&\_quad\_hfil$##$\_hfil\_crcr
+ \_omit\_strut\_hfil\_crcr\_noalign{\_kern-\_baselineskip}%
+ #1\_crcr\_noalign{\_kern.2em}#2\_crcr\_omit\_strut\_cr}}
+
+\_public \cases \bordermatrix ;
+
+ \_doc -----------------------------
+ The \`\eqalign` macro behaves like in Plain \TeX/ by default.
+ It creates the `\vcenter` in the math mode. The content is two column
+ `\halign` with right-aligned left column and left-aligned right column.
+ The table items are in `\displaystyle` and the `\baselineskip` is
+ advanced by `\jot` (3pt in plain \TeX). It follows from the default
+ settings of \^`\eqlines` and \^`\eqstyle` parameters.
+
+ In \OpTeX/, this macro is more flexible. See section 4.4 in the
+ \ulink[http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf]
+ {Typesetting Math with \OpTeX/}.
+ The `\baselineskip` value is set by the \^`\eqlines` parameter and math style
+ by the \^`\eqstyle` parameter.
+
+ There are more possible columns than two (used in classical Plain TeX):
+ `rlcrlcrlc` etc.\ where `r` and `l` columns are without spaces and `c` column
+ (if used) has space \^`\eqspace`/2 at its both sides.
+ \_cod -----------------------------
+
+\_long\_def\_eqalign#1{\_null\_thinsk\_vcenter{\_the\_eqlines\_math
+ \_ialign{&\_hfil$\_the\_eqstyle{##}$&$\_the\_eqstyle{{}##}$\_hfil
+ &\_hskip.5\_eqspace\_hfil$\_the\_eqstyle{##}$\_hskip.5\_eqspace\_hfil
+ \_crcr#1\_crcr}}\_thinsk}
+
+\_public \eqalign ;
+
+ \_doc -----------------------------
+ The \`\displaylines``{<formula>\cr<formula>\cr...<formula>}`
+ creates horizontally centered formulae.
+ It behaves exactly as in Plain \TeX/. The `\halign` is applied directly
+ in the outer display environment with lines of type `\hbox to\displaywidth`.
+ This enables to break lines inside such display to more pages but it is
+ impossible to use `\eqno` or `\leqno` or \^`\eqmark`.
+
+ \OpTeX/ offers
+ `\dislaylines to<dimen>{<formula>\cr<formula>\cr...<formula>}`
+ as an alternative case of usage `\displaylines`. See section 4.3 in the
+ \ulink[http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf]
+ {Typesetting Math with \OpTeX/}.
+ The centered formulas are in `\vcenter` in this case,
+ so lines cannot be broken into more pages, but this case
+ enables to use `\eqno` or `\leqno` or \^`\eqmark`.
+ \_cod -----------------------------
+
+\_def\_displaylines #1#{\_ifx&#1&\_ea\_displaylinesD
+ \_else \_def\_tmp to##1\_end{\_def\_tmp{\_dimexpr ##1}}\_tmp #1\_end
+ \_ea\_displaylinesto \_fi}
+\_long\_def\_displaylinesD #1{\_display \_tabskip=\_zoskip
+ \_halign{\_hbox to\_displaywidth{$\_elign\_hfil\_displaystyle##\_hfil$}\_crcr
+ #1\_crcr}}
+\_long\_def\_displaylinesto #1{\_vcenter{\_openup\_jot \_math \_tabskip=\_zoskip
+ \_halign{\_strut\_hbox to\_span\_tmp{$\_hss\_displaystyle##\_hss$}\_crcr
+ #1\_crcr}}}
+
+\_public\displaylines ;
+
+ \_doc -----------------------------
+ \`\openup`, \`\eqalignno` and `\leqalignno` macros are copied from
+ Plain \TeX/ unchanged.
+ \_cod -----------------------------
+
+\_def\_openup{\_afterassignment\_openupA\_dimen0=}
+\_def\_openupA{\_advance\_lineskip by\_dimen0
+ \_advance\_baselineskip by\_dimen0
+ \_advance\_lineskiplimit by\_dimen0 }
+\_newifi\_ifdtop
+\_def\_display{\_global\_dtoptrue\_openup\_jot\_math
+ \_everycr{\_noalign{\_ifdtop \_global\_dtopfalse \_ifdim\_prevdepth>-1000pt
+ \_vskip-\_lineskiplimit \_vskip\_normallineskiplimit \_fi
+ \_else \_penalty\_interdisplaylinepenalty \_fi}}}
+\_def\_elign{\_tabskip=\_zoskip\_everycr{}} % restore inside \_display
+\_long\_def\_eqalignno#1{\_display \_tabskip=\_centering
+ \_halign to\_displaywidth{\_hfil$\_elign\_displaystyle{##}$\_tabskip=\_zoskip
+ &$\_elign\_displaystyle{{}##}$\_hfil\_tabskip\_centering
+ &\_llap{$\_elign##$}\_tabskip\_zoskip\_crcr
+ #1\_crcr}}
+\_long\_def\_leqalignno#1{\_display \_tabskip=\_centering
+ \_halign to\_displaywidth{\_hfil$\_elign\_displaystyle{##}$\_tabskip=\_zoskip
+ &$\_elign\_displaystyle{{}##}$\_hfil\_tabskip=\_centering
+ &\_kern-\_displaywidth\_rlap{$\_elign##$}\_tabskip\_displaywidth\_crcr
+ #1\_crcr}}
+\_public \openup \eqalignno \leqalignno ;
+
+ \_doc -----------------------------
+ These macros are inspired by `ams-math.tex` file.
+ \maxlines=15
+ \_cod -----------------------------
+
+\_def\_amsafam{4} \_def\_amsbfam{5}
+
+\_mathchardef \boxdot "2\_amsafam 00
+\_mathchardef \boxplus "2\_amsafam 01
+\_mathchardef \boxtimes "2\_amsafam 02
+\_mathchardef \square "0\_amsafam 03
+\_mathchardef \blacksquare "0\_amsafam 04
+\_mathchardef \centerdot "2\_amsafam 05
+\_mathchardef \lozenge "0\_amsafam 06
+\_mathchardef \blacklozenge "0\_amsafam 07
+\_mathchardef \circlearrowright "3\_amsafam 08
+\_mathchardef \circlearrowleft "3\_amsafam 09
+\_mathchardef \rightleftharpoons "3\_amsafam 0A
+\_mathchardef \leftrightharpoons "3\_amsafam 0B
+\_mathchardef \boxminus "2\_amsafam 0C
+\_mathchardef \Vdash "3\_amsafam 0D
+\_mathchardef \Vvdash "3\_amsafam 0E
+\_mathchardef \vDash "3\_amsafam 0F
+\_mathchardef \twoheadrightarrow "3\_amsafam 10
+\_mathchardef \twoheadleftarrow "3\_amsafam 11
+\_mathchardef \leftleftarrows "3\_amsafam 12
+\_mathchardef \rightrightarrows "3\_amsafam 13
+\_mathchardef \upuparrows "3\_amsafam 14
+\_mathchardef \downdownarrows "3\_amsafam 15
+\_mathchardef \upharpoonright "3\_amsafam 16
+\_mathchardef \downharpoonright "3\_amsafam 17
+\_mathchardef \upharpoonleft "3\_amsafam 18
+\_mathchardef \downharpoonleft "3\_amsafam 19
+\_mathchardef \rightarrowtail "3\_amsafam 1A
+\_mathchardef \leftarrowtail "3\_amsafam 1B
+\_mathchardef \leftrightarrows "3\_amsafam 1C
+\_mathchardef \rightleftarrows "3\_amsafam 1D
+\_mathchardef \Lsh "3\_amsafam 1E
+\_mathchardef \Rsh "3\_amsafam 1F
+\_mathchardef \rightsquigarrow "3\_amsafam 20
+\_mathchardef \leftrightsquigarrow "3\_amsafam 21
+\_mathchardef \looparrowleft "3\_amsafam 22
+\_mathchardef \looparrowright "3\_amsafam 23
+\_mathchardef \circeq "3\_amsafam 24
+\_mathchardef \succsim "3\_amsafam 25
+\_mathchardef \gtrsim "3\_amsafam 26
+\_mathchardef \gtrapprox "3\_amsafam 27
+\_mathchardef \multimap "3\_amsafam 28
+\_mathchardef \therefore "3\_amsafam 29
+\_mathchardef \because "3\_amsafam 2A
+\_mathchardef \doteqdot "3\_amsafam 2B
+\_mathchardef \triangleq "3\_amsafam 2C
+\_mathchardef \precsim "3\_amsafam 2D
+\_mathchardef \lesssim "3\_amsafam 2E
+\_mathchardef \lessapprox "3\_amsafam 2F
+\_mathchardef \eqslantless "3\_amsafam 30
+\_mathchardef \eqslantgtr "3\_amsafam 31
+\_mathchardef \curlyeqprec "3\_amsafam 32
+\_mathchardef \curlyeqsucc "3\_amsafam 33
+\_mathchardef \preccurlyeq "3\_amsafam 34
+\_mathchardef \leqq "3\_amsafam 35
+\_mathchardef \leqslant "3\_amsafam 36
+\_mathchardef \lessgtr "3\_amsafam 37
+\_mathchardef \backprime "0\_amsafam 38
+\_mathchardef \risingdotseq "3\_amsafam 3A
+\_mathchardef \fallingdotseq "3\_amsafam 3B
+\_mathchardef \succcurlyeq "3\_amsafam 3C
+\_mathchardef \geqq "3\_amsafam 3D
+\_mathchardef \geqslant "3\_amsafam 3E
+\_mathchardef \gtrless "3\_amsafam 3F
+\_mathchardef \sqsubset "3\_amsafam 40
+\_mathchardef \sqsupset "3\_amsafam 41
+\_mathchardef \vartriangleright "3\_amsafam 42
+\_mathchardef \vartriangleleft "3\_amsafam 43
+\_mathchardef \trianglerighteq "3\_amsafam 44
+\_mathchardef \trianglelefteq "3\_amsafam 45
+\_mathchardef \bigstar "0\_amsafam 46
+\_mathchardef \between "3\_amsafam 47
+\_mathchardef \blacktriangledown "0\_amsafam 48
+\_mathchardef \blacktriangleright "3\_amsafam 49
+\_mathchardef \blacktriangleleft "3\_amsafam 4A
+\_mathchardef \vartriangle "3\_amsafam 4D
+\_mathchardef \blacktriangle "0\_amsafam 4E
+\_mathchardef \triangledown "0\_amsafam 4F
+\_mathchardef \eqcirc "3\_amsafam 50
+\_mathchardef \lesseqgtr "3\_amsafam 51
+\_mathchardef \gtreqless "3\_amsafam 52
+\_mathchardef \lesseqqgtr "3\_amsafam 53
+\_mathchardef \gtreqqless "3\_amsafam 54
+\_mathchardef \Rrightarrow "3\_amsafam 56
+\_mathchardef \Lleftarrow "3\_amsafam 57
+\_mathchardef \veebar "2\_amsafam 59
+\_mathchardef \barwedge "2\_amsafam 5A
+\_mathchardef \doublebarwedge "2\_amsafam 5B
+\_mathchardef \angle "0\_amsafam 5C
+\_mathchardef \measuredangle "0\_amsafam 5D
+\_mathchardef \sphericalangle "0\_amsafam 5E
+\_mathchardef \varpropto "3\_amsafam 5F
+\_mathchardef \smallsmile "3\_amsafam 60
+\_mathchardef \smallfrown "3\_amsafam 61
+\_mathchardef \Subset "3\_amsafam 62
+\_mathchardef \Supset "3\_amsafam 63
+\_mathchardef \Cup "2\_amsafam 64
+\_mathchardef \Cap "2\_amsafam 65
+\_mathchardef \curlywedge "2\_amsafam 66
+\_mathchardef \curlyvee "2\_amsafam 67
+\_mathchardef \leftthreetimes "2\_amsafam 68
+\_mathchardef \rightthreetimes "2\_amsafam 69
+\_mathchardef \subseteqq "3\_amsafam 6A
+\_mathchardef \supseteqq "3\_amsafam 6B
+\_mathchardef \bumpeq "3\_amsafam 6C
+\_mathchardef \Bumpeq "3\_amsafam 6D
+\_mathchardef \lll "3\_amsafam 6E
+\_mathchardef \ggg "3\_amsafam 6F
+\_protected\_def \ulcorner {\_delimiter"4\_amsafam 70\_amsafam 70 }
+\_protected\_def \urcorner {\_delimiter"5\_amsafam 71\_amsafam 71 }
+\_mathchardef \circledS "0\_amsafam 73
+\_mathchardef \pitchfork "3\_amsafam 74
+\_mathchardef \dotplus "2\_amsafam 75
+\_mathchardef \backsim "3\_amsafam 76
+\_mathchardef \backsimeq "3\_amsafam 77
+\_protected\_def \llcorner {\_delimiter"4\_amsafam 78\_amsafam 78 }
+\_protected\_def \lrcorner {\_delimiter"5\_amsafam 79\_amsafam 79 }
+\_mathchardef \complement "0\_amsafam 7B
+\_mathchardef \intercal "2\_amsafam 7C
+\_mathchardef \circledcirc "2\_amsafam 7D
+\_mathchardef \circledast "2\_amsafam 7E
+\_mathchardef \circleddash "2\_amsafam 7F
+\_mathchardef \rhd "2\_amsafam 42
+\_mathchardef \lhd "2\_amsafam 43
+\_mathchardef \unrhd "2\_amsafam 44
+\_mathchardef \unlhd "2\_amsafam 45
+
+ \_let\restriction\upharpoonright
+ \_let\Doteq\doteqdot
+ \_let\doublecup\Cup
+ \_let\doublecap\Cap
+ \_let\llless\lll
+ \_let\gggtr\ggg
+ \_let\Box=\square % LaTeX symbol
+ \_let\Box=\square % LaTeX symbol
+
+\_mathchardef \lvertneqq "3\_amsbfam 00
+\_mathchardef \gvertneqq "3\_amsbfam 01
+\_mathchardef \nleq "3\_amsbfam 02
+\_mathchardef \ngeq "3\_amsbfam 03
+\_mathchardef \nless "3\_amsbfam 04
+\_mathchardef \ngtr "3\_amsbfam 05
+\_mathchardef \nprec "3\_amsbfam 06
+\_mathchardef \nsucc "3\_amsbfam 07
+\_mathchardef \lneqq "3\_amsbfam 08
+\_mathchardef \gneqq "3\_amsbfam 09
+\_mathchardef \nleqslant "3\_amsbfam 0A
+\_mathchardef \ngeqslant "3\_amsbfam 0B
+\_mathchardef \lneq "3\_amsbfam 0C
+\_mathchardef \gneq "3\_amsbfam 0D
+\_mathchardef \npreceq "3\_amsbfam 0E
+\_mathchardef \nsucceq "3\_amsbfam 0F
+\_mathchardef \precnsim "3\_amsbfam 10
+\_mathchardef \succnsim "3\_amsbfam 11
+\_mathchardef \lnsim "3\_amsbfam 12
+\_mathchardef \gnsim "3\_amsbfam 13
+\_mathchardef \nleqq "3\_amsbfam 14
+\_mathchardef \ngeqq "3\_amsbfam 15
+\_mathchardef \precneqq "3\_amsbfam 16
+\_mathchardef \succneqq "3\_amsbfam 17
+\_mathchardef \precnapprox "3\_amsbfam 18
+\_mathchardef \succnapprox "3\_amsbfam 19
+\_mathchardef \lnapprox "3\_amsbfam 1A
+\_mathchardef \gnapprox "3\_amsbfam 1B
+\_mathchardef \nsim "3\_amsbfam 1C
+\_mathchardef \ncong "3\_amsbfam 1D
+\_mathchardef \diagup "0\_amsbfam 1E
+\_mathchardef \diagdown "0\_amsbfam 1F
+\_mathchardef \varsubsetneq "3\_amsbfam 20
+\_mathchardef \varsupsetneq "3\_amsbfam 21
+\_mathchardef \nsubseteqq "3\_amsbfam 22
+\_mathchardef \nsupseteqq "3\_amsbfam 23
+\_mathchardef \subsetneqq "3\_amsbfam 24
+\_mathchardef \supsetneqq "3\_amsbfam 25
+\_mathchardef \varsubsetneqq "3\_amsbfam 26
+\_mathchardef \varsupsetneqq "3\_amsbfam 27
+\_mathchardef \subsetneq "3\_amsbfam 28
+\_mathchardef \supsetneq "3\_amsbfam 29
+\_mathchardef \nsubseteq "3\_amsbfam 2A
+\_mathchardef \nsupseteq "3\_amsbfam 2B
+\_mathchardef \nparallel "3\_amsbfam 2C
+\_mathchardef \nmid "3\_amsbfam 2D
+\_mathchardef \nshortmid "3\_amsbfam 2E
+\_mathchardef \nshortparallel "3\_amsbfam 2F
+\_mathchardef \nvdash "3\_amsbfam 30
+\_mathchardef \nVdash "3\_amsbfam 31
+\_mathchardef \nvDash "3\_amsbfam 32
+\_mathchardef \nVDash "3\_amsbfam 33
+\_mathchardef \ntrianglerighteq "3\_amsbfam 34
+\_mathchardef \ntrianglelefteq "3\_amsbfam 35
+\_mathchardef \ntriangleleft "3\_amsbfam 36
+\_mathchardef \ntriangleright "3\_amsbfam 37
+\_mathchardef \nleftarrow "3\_amsbfam 38
+\_mathchardef \nrightarrow "3\_amsbfam 39
+\_mathchardef \nLeftarrow "3\_amsbfam 3A
+\_mathchardef \nRightarrow "3\_amsbfam 3B
+\_mathchardef \nLeftrightarrow "3\_amsbfam 3C
+\_mathchardef \nleftrightarrow "3\_amsbfam 3D
+\_mathchardef \divideontimes "2\_amsbfam 3E
+\_mathchardef \varnothing "0\_amsbfam 3F
+\_mathchardef \nexists "0\_amsbfam 40
+\_mathchardef \Finv "0\_amsbfam 60
+\_mathchardef \Game "0\_amsbfam 61
+\_mathchardef \mho "0\_amsbfam 66
+\_mathchardef \eth "0\_amsbfam 67
+\_mathchardef \eqsim "3\_amsbfam 68
+\_mathchardef \beth "0\_amsbfam 69
+\_mathchardef \gimel "0\_amsbfam 6A
+\_mathchardef \daleth "0\_amsbfam 6B
+\_mathchardef \lessdot "2\_amsbfam 6C
+\_mathchardef \gtrdot "2\_amsbfam 6D
+\_mathchardef \ltimes "2\_amsbfam 6E
+\_mathchardef \rtimes "2\_amsbfam 6F
+\_mathchardef \shortmid "3\_amsbfam 70
+\_mathchardef \shortparallel "3\_amsbfam 71
+\_mathchardef \smallsetminus "2\_amsbfam 72
+\_mathchardef \thicksim "3\_amsbfam 73
+\_mathchardef \thickapprox "3\_amsbfam 74
+\_mathchardef \approxeq "3\_amsbfam 75
+\_mathchardef \precapprox "3\_amsbfam 76
+\_mathchardef \succapprox "3\_amsbfam 77
+\_mathchardef \curvearrowleft "3\_amsbfam 78
+\_mathchardef \curvearrowright "3\_amsbfam 79
+\_mathchardef \digamma "0\_amsbfam 7A
+\_mathchardef \varkappa "0\_amsbfam 7B
+\_mathchardef \Bbbk "0\_amsbfam 7C
+\_mathchardef \hslash "0\_amsbfam 7D
+\_mathchardef \hbar "0\_amsbfam 7E
+\_mathchardef \backepsilon "3\_amsbfam 7F
+
+\_let\circledplus\oplus
+\_let\circledminus\ominus
+\_let\circledtimes\otimes
+\_let\circledslash\oslash
+\_let\circleddot\odot
+
+ \_doc -----------------------------
+ The \^`\not` macro is re-defined to be smarter than in plain
+ \TeX/. The macro follows this rule:
+ \begtt
+ \not< becomes \_nless
+ \not> becomes \_ngtr
+ if \_notXXX is defined, \not\XXX becomes \_notXXX;
+ if \_nXXX is defined, \not\XXX becomes \_nXXX;
+ otherwise, \not\XXX is done in the usual way.
+ \endtt
+ \_cod -----------------------------
+
+\_mathchardef \_notchar "3236
+
+\_protected\_def \_not#1{%
+ \_ifx #1<\_nless \_else
+ \_ifx #1>\_ngtr \_else
+ \_edef\_tmpn{\_csstring#1}%
+ \_ifcsname _not\_tmpn\_endcsname \_csname _not\_tmpn\_endcsname
+ \_else \_ifcsname _n\_tmpn\_endcsname \_csname _n\_tmpn\_endcsname
+ \_else \_mathrel{\_mathord{\_notchar}\_mathord{#1}}%
+ \_fi \_fi \_fi \_fi}
+\_private
+ \nleq \ngeq \nless \ngtr \nprec \nsucc \nleqslant \ngeqslant \npreceq
+ \nsucceq \nleqq \ngeqq \nsim \ncong \nsubseteqq \nsupseteqq \nsubseteq
+ \nsupseteq \nparallel \nmid \nshortmid \nshortparallel \nvdash \nVdash
+ \nvDash \nVDash \ntrianglerighteq \ntrianglelefteq \ntriangleleft
+ \ntriangleright \nleftarrow \nrightarrow \nLeftarrow \nRightarrow
+ \nLeftrightarrow \nleftrightarrow \nexists ;
+\_public \not ;
+
+ \_doc -----------------------------
+ \`\mathstyles``{<math list>}`
+ behaves like `{<math list>}`, but you can use the following commands in the
+ `<math list>`:
+ \begitems
+ * \`\currstyle` which expands to `\displaystyle`, `\textstyle`,
+ `\scriptstyle` or `\scriptscriptstyle` depending on the current math style
+ when \^`\mathstyles` was opened.
+ * \`\dobystyle``{<D>}{<T>}{<S>}{<SS>}` is expandable macro. It expands to
+ `<D>`, `<T>`, `<S>` or `<SS>` depending on the current math style
+ when \^`\mathstyles` was opened.
+ * The value of the \`\stylenum` is 0, 1, 2 or 3
+ depending on the current math style when \^`\mathstyles` was opened.
+ \enditems
+ Example of usage of \^`\mathstyles`:
+ `\def\mathframe#1{\mathstyles{\frame{$\currstyle{#1}$}}}`.
+ \_cod -----------------------------
+
+\_newcount\_stylenum
+\_def\_mathstyles#1{{\_mathchoice{\_stylenum0 #1}{\_stylenum1 #1}%
+ {\_stylenum2 #1}{\_stylenum3 #1}}}
+\_def\_dobystyle#1#2#3#4{\_ifcase\_stylenum#1\_or#2\_or#3\_or#4\_fi}
+\_def\_currstyle{\_dobystyle\_displaystyle\_textstyle\_scriptstyle\_scriptscriptstyle}
+\_public \mathstyles \dobystyle \currstyle \stylenum ;
+
+ \_doc -----------------------------
+ The \`\cramped` macro
+ sets the cramped variant of the current style.
+ Note that \^`\currstyle` initializes non-cramped variants.
+ The example `\mathframe` above should be:\nl
+ `\def\mathframe#1{\mathstyles{\frame{$\currstyle\cramped #1$}}}`.\nl
+ Second note: `\cramped` macro reads the current math style from
+ the `\mathstyle` LuaTeX primitive, so it does not work in numerators of
+ generalized fractions but you can use it before the fraction is opened:
+ `$\cramped {x^2\over y^2}$`.
+ \_cod -----------------------------
+
+\_def\_cramped{\_ifcase\_numexpr(\_mathstyle+1)/2\_relax\_or
+ \_crampeddisplaystyle \_or \_crampedtextstyle \_or
+ \_crampedscriptstyle \_or \_crampedscriptscriptstyle \_fi
+}
+\_public \cramped ;
+
+ \_doc -----------------------------
+ The \`\mathbox``{<text>}` macro is copied from OPmac trick 078.
+ It behaves like `\hbox{<text>}` but the `<text>` is scaled to a smaller
+ size if it is used in scriptstyle or scriptscript style.\nl
+ The \^`\_textmff` and \^`\_scriptmff` are redefined in order to
+ respect optical sizes. If we are in script style then the math mode
+ starts in text style, but optical size is given to script style.
+ The `\mathbox` in non-Unicode math respects optical sizes
+ using different principle.
+ \_cod -----------------------------
+
+\_def\_mathbox#1{{\_mathstyles{\_hbox{%
+ \_ifnum\_stylenum<2 \_everymath{\_currstyle}%
+ \_else
+ \_ifnum\_stylenum=2 \_def\_textmff{+ssty=0;}\_fi
+ \_ifnum\_stylenum=3 \_def\_textmff{+ssty=1;}\_def\_scriptmff{+ssty=1;}\_fi
+ \_typoscale[\_dobystyle{}{}{700}{500}/]\_fi #1}}}%
+}
+\_public \mathbox ;
+
+\_endcode %---------------------------------------------------
+
+2021-02-15 \_mathbox redefines \_textmff etc. in order to respect optical sizes
+2021-02-04 \_bordermatrixwithdelims introduced.
+2021-01-23 better expession for math styles in \matrix
+2021-01-22 bad use of \_stylenum in \matrix + bad value (bug fix: \_stylenum->\_mtstylenum)
+2020-12-17 \box0->\hbox{\box0} in \_finphant and \_finsmash, see https://tex.stackexchange.com/questions/574997/
+2020-06-14 \borermatrix, \cases corrected
+2020-06-13 \adots introduced, \matrix smaller in T mode too.
+2020-06-03 \notin corrected
+2020-06-02 $$\par$$ error is supressed, so we define \(l)eqalign(no), \displayines as \long
+2020-05-30 \cases: group added in the second column.
+ "\displaylines to<size>" implemented and documented.
+2020-05-11 \let\|=\Vert, bug fixed
+2020-04-27 \mathstyles introduced
+2020-03-14 implemented
diff --git a/macros/optex/base/math-preload.opm b/macros/optex/base/math-preload.opm
new file mode 100644
index 0000000000..0ec9abae2f
--- /dev/null
+++ b/macros/optex/base/math-preload.opm
@@ -0,0 +1,227 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \normalmath {Math fonts CM + AMS preloaded <2020-05-06>} % preloaded in format
+
+ \_doc ------------------------------
+ We have two math macros \`\normalmath` for the normal shape of all math
+ symbols and \`\boldmath` for the bold shape of all math symbols. The second one
+ can be used in bold titles, for example.
+ These macros load all fonts from all given math font families.
+ \_cod ------------------------------
+
+\_def\_normalmath{%
+ \_loadmathfamily 0 cmr % CM Roman
+ \_loadmathfamily 1 cmmi % CM Math Italic
+ \_loadmathfamily 2 cmsy % CM Standard symbols
+ \_loadmathfamily 3 cmex % CM extra symbols
+ \_loadmathfamily 4 msam % AMS symbols A
+ \_loadmathfamily 5 msbm % AMS symbols B
+ \_loadmathfamily 6 rsfs % script
+ \_loadmathfamily 7 eufm % fractur
+ \_loadmathfamily 8 bfsans % sans serif bold
+ \_loadmathfamily 9 bisans % sans serif bold slanted (for vectors)
+% \_setmathfamily 10 \_tentt
+% \_setmathfamily 11 \_tenit
+ \_setmathdimens
+}
+\_def\_boldmath{%
+ \_loadmathfamily 0 cmbx % CM Roman Bold Extended
+ \_loadmathfamily 1 cmmib % CM Math Italic Bold
+ \_loadmathfamily 2 cmbsy % CM Standard symbols Bold
+ \_loadmathfamily 3 cmexb % CM extra symbols Bold
+ \_loadmathfamily 4 msam % AMS symbols A (bold not available?)
+ \_loadmathfamily 5 msbm % AMS symbols B (bold not available?)
+ \_loadmathfamily 6 rsfs % script (bold not available?)
+ \_loadmathfamily 7 eufb % fractur bold
+ \_loadmathfamily 8 bbfsans % sans serif extra bold
+ \_loadmathfamily 9 bbisans % sans serif extra bold slanted (for vectors)
+% \_setmathfamily 10 \_tentt
+% \_setmathfamily 11 \_tenbi
+ \_setmathdimens
+}
+\_count18=9 % families declared by \newfam are 12, 13, ...
+
+\_def \normalmath {\_normalmath} \_def\boldmath {\_boldmath}
+
+ \_doc -----------------------------
+ The classical math family selectors
+ \`\mit`, \^`\cal`, \^`\bbchar`, \^`\frak` and \^`\script`
+ are defined here.
+ The \^`\rm`, \^`\bf`, \^`\it`, \^`\bi` and \^`\tt` does two things:
+ they are variant selectors for text fonts and math family selectors for math fonts.
+ The idea was adapted from plain \TeX/.\nl
+ These macros are redefined when `unimat-codes.opm` is loaded,
+ see the section~\ref[unimath-codes].
+ \_cod -----------------------------
+
+\_chardef\_bffam = 8
+\_chardef\_bifam = 9
+%\_chardef\_ttfam = 10
+%\_chardef\_itfam = 11
+
+\_protected\_def \_rm {\_tryloadrm \_tenrm \_fam0 }
+\_protected\_def \_bf {\_tryloadbf \_tenbf \_fam\_bffam}
+\_protected\_def \_it {\_tryloadit \_tenit \_fam1 }
+\_protected\_def \_bi {\_tryloadbi \_tenbi \_fam\_bifam}
+\_protected\_def \_tt {\_tryloadtt \_tentt}
+
+\_protected\_def \_mit {\_fam1 }
+\_protected\_def \_cal {\_fam2 }
+\_protected\_def \_bbchar {\_fam5 } % double stroked letters
+\_protected\_def \_frak {\_fam7 } % fraktur
+\_protected\_def \_script {\_fam6 } % more extensive script than \cal
+
+\_public \rm \bf \it \bi \tt \mit \cal \bbchar \frak \script ;
+
+ \_doc -----------------------------
+ The optical sizes of Computer Modern fonts, AMS, and other fonts
+ are declared here.
+ \_cod -----------------------------
+
+%% CM math fonts, optical sizes:
+
+\_regtfm cmmi 0 cmmi5 5.5 cmmi6 6.5 cmmi7 7.5 cmmi8 8.5 cmmi9 9.5
+ cmmi10 11.1 cmmi12 *
+\_regtfm cmmib 0 cmmib5 5.5 cmmib6 6.5 cmmib7 7.5 cmmib8 8.5 cmmib9 9.5 cmmib10 *
+\_regtfm cmtex 0 cstex8 8.5 cstex9 9.5 cstex10 *
+\_regtfm cmsy 0 cmsy5 5.5 cmsy6 6.5 cmsy7 7.5 cmsy8 8.5 cmsy9 9.5 cmsy10 *
+\_regtfm cmbsy 0 cmbsy5 5.5 cmbsy6 6.5 cmbsy7 7.5 cmbsy8 8.5 cmbsy9 9.5 cmbsy10 *
+\_regtfm cmex 0 cmex7 7.5 cmex8 8.5 cmex9 9.5 cmex10 *
+\_regtfm cmexb 0 cmexb10 *
+
+\_regtfm cmr 0 cmr5 5.5 cmr6 6.5 cmr7 7.5 cmr8 8.5 cmr9 9.5
+ cmr10 11.1 cmr12 15 cmr17 *
+\_regtfm cmbx 0 cmbx5 5.5 cmbx6 6.5 cmbx7 7.5 cmbx8 8.5 cmbx9 9.5
+ cmbx10 11.1 cmbx12 *
+\_regtfm cmti 0 cmti7 7.5 cmti8 8.5 cmti9 9.5 cmti10 11.1 cmti12 *
+\_regtfm cmtt 0 cmtt8 8.5 cmtt9 9.5 cmtt10 11.1 cmtt12 *
+
+%% AMS math fonts, optical sizes:
+
+\_regtfm msam 0 msam5 5.5 msam6 6.5 msam7 7.5 msam8 8.5 msam9 9.5 msam10 *
+\_regtfm msbm 0 msbm5 5.5 msbm6 6.5 msbm7 7.5 msbm8 8.5 msbm9 9.5 msbm10 *
+
+%% fraktur, rsfs, optical sizes:
+
+\_regtfm eufm 0 eufm5 6 eufm7 8.5 eufm10 *
+\_regtfm eufb 0 eufb5 6 eufb7 8.5 eufb10 *
+\_regtfm rsfs 0 rsfs5 6 rsfs7 8.5 rsfs10 *
+
+%% bf and bi sansserif math alternatives:
+
+\_regtfm bfsans 0 ecsx0500 5.5 ecsx0600 6.5 ecsx0700 7.5 ecsx0800
+ 8.5 ecsx0900 9.5 ecsx1000 11.1 ecsx1200 *
+\_regtfm bisans 0 ecso0500 5.5 ecso0600 6.5 ecso0700 7.5 ecso0800
+ 8.5 ecso0900 9.5 ecso1000 11.1 ecso1200 *
+\_regtfm bbfsans 0 ecsx0500 5.5 ecsx0600 6.5 ecsx0700 7.5 ecsx0800
+ 8.5 ecsx0900 9.5 ecsx1000 11.1 ecsx1200 *
+\_regtfm bbisans 0 ecso0500 5.5 ecso0600 6.5 ecso0700 7.5 ecso0800
+ 8.5 ecso0900 9.5 ecso1000 11.1 ecso1200 *
+
+ \_doc -----------------------------
+ \`\_loadmathfamily` `<number> <font>` loads one math family, i.\,e.\
+ the triple of fonts in the text size, script size and script-script size.
+ The `<font>` is `<font-id>` used in the `\_regtfm` parameter or
+ the real TFM name. The family is saved as `\fam<number>`.
+ \nl
+ \`\_setmathfamily` `<number> \<font-switch>` loads one math family
+ like `\_loadmathfamily` does it. But the second parameter is a
+ `\<font-switch>` declared previously by the `\font` primitive.
+ \nl
+ The font family is loaded at \`\_sizemtext`, \`\_sizemscript` and
+ \`\_sizemsscript` sizes. These sizes are set by the
+ \`\setmathsizes` `[<text-size>/<script-size>/<scriptscript-size>]` macro.
+ These parameters are given in the \`\ptmunit` unit, it is set to
+ 1\`\ptunit` and it is set to 1\,pt by default.
+ \nl
+ \`\_corrmsize` `<factor><space>` can be used just before
+ `\_loadmathfamily` or `\_setmathfamily`.
+ The `<factor>` is decimal number, it denotes
+ scale-factor \"size of loaded math font in `\textstyle` : size of text font".
+ You can use it in `\_normalmath` or `\_boldmath` macros if you want to do a
+ corrections (for example due to different ex-height in text and math
+ font). The `\_corrmsize` is applied only to one following
+ `\_loadmathfamily` or `\_setmathfamily`. If it is missing
+ then the `<factor>` is 1 for such math family (i.e.\ no size corrections).
+ \_cod -----------------------------
+
+\_def\_corrmsize#1 {\_ptmunit=#1\_ptunit} % for corrections of sizes in diferent fonts
+
+\_def\_loadmathfamily #1 #2 {%
+ \_edef\_optsizesave{\_the\_optsize}%
+ \_optsize=\_sizemtext \_font\_mF=\_whichtfm{#2} at\_optsize \_textfont#1=\_mF
+ \_optsize=\_sizemscript \_font\_mF=\_whichtfm{#2} at\_optsize \_scriptfont#1=\_mF
+ \_optsize=\_sizemsscript \_font\_mF=\_whichtfm{#2} at\_optsize \_scriptscriptfont#1=\_mF
+ \_optsize=\_optsizesave \_ptmunit=\_ptunit
+}
+\_def\_setmathfamily #1 #2{\_let\_mF=#2%
+ \_edef\_optsizesave{\_the\_optsize}%
+ \_optsize=\_sizemtext \_fontlet#2=#2 at\_optsize \_textfont#1=#2%
+ \_optsize=\_sizemscript \_fontlet#2=#2 at\_optsize \_scriptfont#1=#2%
+ \_optsize=\_sizemsscript \_fontlet#2=#2 at\_optsize \_scriptscriptfont#1=#2%
+ \_optsize=\_optsizesave \_ptmunit=\_ptunit \_let#2=\_mF
+}
+\_def\_setmathsizes[#1/#2/#3]{\_ptmunit=\_ptunit
+ \_def\_sizemtext{#1\_ptmunit}\_def\_sizemscript{#2\_ptmunit}%
+ \_def\_sizemsscript{#3\_ptmunit}%
+}
+\_newdimen\_ptunit \_ptunit=1pt
+\_newdimen\_ptmunit \_ptmunit=1\_ptunit
+
+\_public \setmathsizes \ptunit \ptmunit ;
+
+ \_doc -----------------------------
+ The \`\_setmathdimens` macro is used in \^`\normalmath` or \^`\boldmath`
+ macros. It makes math dimensions dependent on the font size (plain \TeX/ sets
+ them only for 10\,pt typesetting). The `\skewchar` of some math families are
+ set here too.
+ \_cod -----------------------------
+
+\_def\_setmathdimens{% PlainTeX sets these dimens for 10pt size only:
+ \_delimitershortfall=0.5\_fontdimen6\_textfont3
+ \_nulldelimiterspace=0.12\_fontdimen6\_textfont3
+ \_scriptspace=0.05\_fontdimen6\_textfont3
+ \_skewchar\_textfont1=127 \_skewchar\_scriptfont1=127
+ \_skewchar\_scriptscriptfont1=127
+ \_skewchar\_textfont2=48 \_skewchar\_scriptfont2=48
+ \_skewchar\_scriptscriptfont2=48
+ \_skewchar\_textfont6=127 \_skewchar\_scriptfont6=127
+ \_skewchar\_scriptscriptfont6=127
+}
+
+ \_doc -----------------------------
+ Finally, we preload a math fonts collection in [10/7/5] sizes
+ when the format is generated. This is done when
+ `\_suppressfontnotfounderror=1` because we need not errors when the format is
+ generated. Maybe there are not all fonts in the \TeX/ distribution
+ installed.
+ \_cod -----------------------------
+
+\_suppressfontnotfounderror=1
+\_setmathsizes[10/7/5]\_normalmath
+\_suppressfontnotfounderror=0
+
+
+\_endcode %---------------------------------------------------
+
+The Computer Modern and AMS fonts are preloaded here in classical math-fam
+concept, where each math family includes three fonts with max 256 characters
+(typically 128 characters).
+
+On the other hand, when \^`\fontfam` macro is used in the document then text
+font family and appropriate math family is loaded with Unicode fonts, i.e.
+Unicode-math is used. It re-defines all settings given here.
+
+The general rule of usage the math fonts in different sizes in \OpTeX/ says: set three
+sizes by the macro
+\^`\setmathsizes` `[<text-size>/<script-size>/<scriptscript-size>]` and then
+load all math fonts in given sizes by \^`\normalmath` or \^`\boldmath` macros.
+For example
+\begtt
+\setmathsizes[12/8.4/6]\normalmath ... math typesetting at 12 pt is ready.
+\endtt
+
+\_endinput
+
+2020-05-06: \itfam, \ttfam removed, (Unicode math preferred)
+2020-04-14: \skewchar\fam6 added
diff --git a/macros/optex/base/math-unicode.opm b/macros/optex/base/math-unicode.opm
new file mode 100644
index 0000000000..96f9983380
--- /dev/null
+++ b/macros/optex/base/math-unicode.opm
@@ -0,0 +1,266 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \loadmath {Unicode Math fonts <2021-03-09>} % preloaded in format
+
+ \_doc -----------------------------
+ \`\loadmath` `{<Unicode-math font>}` loads the given font. It does:
+ \begitems
+ * define \`\_unimathfont` as `<Unicode-math font>`,
+ * redefine `\normalmath` and `\boldmath` macros to their Unicode counterparts,
+ * load the `\_unimathfont` by `\normalmath`,
+ * print information about the loaded font on the terminal,
+ * redefine all encoding dependent setting by `\input unimath-codes.opm`,
+ * protect new loading by setting \`\_ifmathloading` to false.
+ \enditems
+ \`\noloadmath` disallows Unicode-math loading by \`\_mathloadingfalse`.\nl
+ \`\doloadmath` allows Unicode-math loading by \`\_mathloadingtrue`.
+ \_cod -----------------------------
+
+\_newifi \_ifmathloading \_mathloadingtrue
+
+\_def\_noloadmath{\_mathloadingfalse}
+\_def\_doloadmath{\_mathloadingtrue}
+
+\_def\_loadmath#1{%
+ \_ifmathloading
+ \_initunifonts
+ \_isfont{#1}\_iffalse
+ \_opwarning{Math font "#1" not found, skipped...}%
+ \_else
+ \_def\_unimathfont{#1}%
+ \_let\_normalmath = \_normalunimath \_let\_boldmath = \_boldunimath
+ \_normalmath
+ \_wterm {MATH-FONT: "#1" -- unicode math prepared.}%
+ \_ifx\_ncharrmA\_undefined \_opinput {unimath-codes.opm}\_fi
+ \_mathloadingfalse
+ \_fi\_fi}
+
+\_public \loadmath \noloadmath \doloadmath ;
+
+ \_doc -----------------------------
+ \`\loadboldmath` `{<bold-font>} \to {<normal-font>}`
+ defines \`\_unimathboldfont` as `<bold-font>` only if `\_unimathfont` is
+ defined as `<normal-font>`. It is used when \^`\boldmath` macro is run.
+ When no `\_unimathboldfont` is defined then the `\boldmath` macro
+ use \"fake bold" generated by `embolden` \LuaTeX/ font feature.
+ \_cod -----------------------------
+
+\_def\_loadboldmath#1#2\to #3{%
+ \_def\_tmp{#3}\_ifx\_unimathfont\_tmp % do work only if #3 is loaded as normal Math
+ \_isfont{#1}\_iffalse
+ \_opwarning{Bold-Math font "#1" not found, skipped...}
+ \_else
+ \_def\_unimathboldfont{#1}%
+ \_wterm {MATH-FONT: "#1" -- unicode math bold prepared.}%
+ \_fi\_fi}
+
+\_public \loadboldmath ;
+
+ \_doc -----------------------------
+ The Unicode version of the \^`\normalmath` and \^`\boldmath` macros
+ are defined here as \`\_normalunimath` and \`\_boldunimath` macros.
+ They are using \`\_setunimathdimens` in a similar sense as
+ \^`\_setmathdimens`.
+ \nl
+ You can combine more fonts if you register them to another
+ math families (5, 6, 7, etc.) in the \^`\normalmath` macro.
+ \nl
+ The default value of \^`\_normalunimath` shows a combination of base Unicode-math
+ font with 8bit Math font at family 4. See definition of `\script` macro where
+ `\fam4` is used.
+ \_cod -----------------------------
+
+\_def\_normalunimath{%
+ \_loadumathfamily 1 {\_unimathfont}{} % Base font
+ \_loadmathfamily 4 rsfs % script
+ \_setunimathdimens
+}%
+\_def\_boldunimath{%
+ \_ifx\_unimathboldfont \_undefined
+ \_loadumathfamily 1 {\_unimathfont}{embolden=1.7;} % Base faked bold
+ \_else
+ \_loadumathfamily 1 {\_unimathboldfont}{} % Base real bold font
+ \_fi
+ \_loadmathfamily 4 rsfs % script
+ \_setunimathdimens
+}%
+\_def\_setunimathdimens{% PlainTeX sets these dimens for 10pt size only:
+ \_delimitershortfall=0.5\_fontdimen6\_textfont3
+ \_nulldelimiterspace=0.12\_fontdimen6\_textfont3
+ \_scriptspace=0.05\_fontdimen6\_textfont3
+ \_begingroup % correction for \choose
+ \_everymath{}\_global\_setbox0=\_hbox{$\_fam1\_displaystyle{0\_atop0}$}\_endgroup
+ \_Umathfractiondelsize\_displaystyle = \_dimexpr(\_ht0-\_Umathaxis\_displaystyle)*2\_relax
+}
+
+ \_doc -----------------------------
+ If you try the example above about
+ \~`\loadboldmath``{[xitsmath-bold]} \to {[xitsmath-regular]}`
+ then you can find a bug in XITSMath-Bold font: the symbols for norm
+ $\|x\|$ are missing. So, we have to define `\_boldmath` macro manually.
+ The missing symbol is loaded from family 5 as no-bold variant in our example:
+ \begtt
+ \loadmath{[xitsmath-regular]}
+ \def\_boldmath{%
+ \_loadumathfamily 1 {[xitsmath-bold]}{} % Base font
+ \_loadmathfamily 4 rsfs % script
+ \_loadumathfamily 5 {[xitsmath-regular]}{}
+ \_def\|{\_Udelimiter 0 5 "02016 }% % norm delimiter from family 5
+ \_setmathdimens
+ }
+ \endtt
+
+ \`\_loadumathfamily` `<number> {<font>}{<font features>}`
+ loads the given Unicode-math fonts in three sizes given by the
+ \^`\setmathsizes` macro and sets it as the math family `<number>`.
+ The `<font features>` are added to the default
+ \`\_mfontfeatures` and to the size-dependent features `+ssty=0`
+ if script size is asked or `+ssty=1` if scriptscriptsize is asked.
+ If the math family 1 is loaded then the family 2 and 3 are set by the same
+ font because \TeX/ needs to read dimension information about generating
+ math formulae from these three math families. All information needed by
+ \TeX/ is collected in single Unicode-math font.\nl
+ The \^`\_corrmsize` `<factor><space>` can be used just before
+ `\_loadumathfamily`, see section~\ref[math-preload] for more information.\nl
+ The \`\_textmff`, \`\_scriptmff` and \`\_sscriptmff` are additional font
+ features for text, script and sscript sizes respectively. They are
+ locally re-defined in \^`\mathbox` macro.
+ \_cod -----------------------------
+
+\_def\_umathname#1#2{"#1:\_mfontfeatures#2"}
+\_def\_mfontfeatures{mode=base;script=math;}
+
+\_def\_loadumathfamily #1 #2#3 {%
+ \_edef\_optsizesave{\_the\_optsize}%
+ \_optsize=\_sizemtext \_font\_mF=\_umathname{#2}{\_textmff #3} at\_optsize
+ \_textfont#1=\_mF \_ifnum#1=1 \_textfont2=\_mF \_textfont3=\_mF \_fi
+ \_optsize=\_sizemscript \_font\_mF=\_umathname{#2}{\_scriptmff #3} at\_optsize
+ \_scriptfont#1=\_mF \_ifnum#1=1 \_scriptfont2=\_mF \_scriptfont3=\_mF \_fi
+ \_optsize=\_sizemsscript \_font\_mF=\_umathname{#2}{\_sscriptmff #3} at\_optsize
+ \_scriptscriptfont#1=\_mF \_ifnum#1=1 \_scriptscriptfont2=\_mF \_scriptscriptfont3=\_mF \_fi
+ \_optsize=\_optsizesave \_ptmunit=\_ptunit
+}
+\_def\_textmff{} \_def\_scriptmff{+ssty=0;} \_def\_sscriptmff{+ssty=1;}
+
+ \_doc -----------------------------
+ Unicode math font includes all typical math alphabets together, user needs not to
+ load more \TeX/ math families. These math alphabets are encoded by
+ different parts of Unicode table. We need auxiliary macros for setting
+ mathcodes by selected math alphabet.
+ \nl
+ \`\_umathrange` `{<from->-<to>}<class><family>\<first>` sets `\Umathcode`s
+ of the characters in the interval `<from>-<to>` to `\<first>`,
+ `\<first>+1`, `\<first>+2`
+ etc., but \`\_umathcharholes` are skipped
+ (`\_umathcharholes` are parts of the Unicode table not designed for math
+ alphabets but they cause that the math alphabets are
+ not continuously spread out in the table; I mean that the
+ designers were under the influence of drugs when they created
+ this part of the Unicode table).
+ The `<from>-<to>` clause includes normal letters like `A-Z`.
+ \nl
+ \`\_umahrangegreek` `\<first>` is the same as
+ `\_umathrange {<alpha>-<omega>}\<first>`.
+ \nl
+ \`\_umahrangeGREEK` `\<first>` is the same as
+ `\_umathrange {<Alpha>-<Omega>}\<first>`.
+ \nl
+ \`\_greekdef` `<control sequences> \_relax` defines each control sequence
+ as a normal character with codes `\_umathnumB`, `\_umathnumB+1`,
+ `\_umathnumB+2` etc. It is used for redefinig the contol sequences for
+ math Greek `\alpha`, `\beta`, `\gamma` etc.
+ \_cod -----------------------------
+
+\_newcount\_umathnumA \_newcount\_umathnumB
+
+\_def\_umathcorr#1#2{\_ea#1\_ea{\_the#2}}
+\_def\_umathprepare#1{\_def\_umathscanholes##1[#1]##2##3\_relax{##2}}
+\_def\_umathvalue#1{\_ea\_umathscanholes\_umathcharholes[#1]{#1}\_relax}
+
+\_def\_umathcharholes{% holes in math alphabets:
+ [119893]{"210E}[119965]{"212C}[119968]{"2130}[119969]{"2131}%
+ [119971]{"210B}[119972]{"2110}[119975]{"2112}[119976]{"2133}[119981]{"211B}%
+ [119994]{"212F}[119996]{"210A}[120004]{"2134}%
+ [120070]{"212D}[120075]{"210C}[120076]{"2111}[120085]{"211C}[120093]{"2128}%
+ [120122]{"2102}[120127]{"210D}[120133]{"2115}[120135]{"2119}
+ [120136]{"211A}[120137]{"211D}[120145]{"2124}%
+}
+\_def\_umathrange#1#2#3#4{\_umathnumB=#4\_def\_tmp{#2 #3 }\_umathrangeA#1}
+\_def\_umathrangeA#1-#2{\_umathnumA=`#1\_relax
+ \_loop
+ \_umathcorr\_umathprepare\_umathnumB
+ \_Umathcode \_umathnumA = \_tmp \_umathcorr\_umathvalue{\_umathnumB}
+ \_ifnum\_umathnumA<`#2\_relax
+ \_advance\_umathnumA by1 \_advance\_umathnumB by1
+ \_repeat
+}
+\_def\_umathrangeGREEK{\_umathrange{^^^^0391-^^^^03a9}}
+\_def\_umathrangegreek{\_umathrange{^^^^03b1-^^^^03d6}}
+\_def\_greekdef#1{\_ifx#1\_relax \_else
+ \_begingroup \_lccode`X=\_umathnumB \_lowercase{\_endgroup \_def#1{X}}%
+ \_advance\_umathnumB by 1
+ \_ea\_greekdef \_fi
+}
+
+\_endcode
+
+
+The \^`\loadmath` `{<Unicode-math font>}` macro loads math fonts and
+redefines all default math-codes using `\input unimath-codes.opm`.
+If Unicode-math font is loaded then \^`\_mathloadingfalse`
+is set, so the new Unicode-math font isn't loaded until \^`\doloadmath` is used.
+
+\^`\loadboldmath` `{<bold-font>} \to {<normal-font>}` loads bold variant only
+if `<normal-font>` was sucessully loaded by the previous `\loadmath`. For example:
+
+\begtt
+\loadmath {[xitsmath-regular]}
+\loadboldmath {[xitsmath-bold]} \to {[xitsmath-regular]}
+\endtt
+There are very few Unicode-math fonts with full \^`\boldmath` support.
+I know only XITSMath-Bold and KpMath-Bold. If \^`\loadboldmath` is not used
+then \"faked bold" created from \^`\normalmath` is used by default.
+
+The \^`\loadmath` macro was succesfully tested on:
+
+\begtt
+\loadmath{[XITSMath-Regular]} ... XITS MATH
+\loadmath{[latinmodern-math]} ... Latin Modern Math
+\loadmath{[texgyretermes-math]} ... TeXGyre Termes Math
+\loadmath{[texgyrebonum-math]} ... TeXGyre Bonum Math
+\loadmath{[texgyrepagella-math]} ... TeXGyre Pagella Math
+\loadmath{[texgyreschola-math]} ... TeXGyre Schola Math
+\loadmath{[texgyredejavu-math]} ... TeXGyre DeJaVu Math
+\loadmath{[LibertinusMath-Regular]} ... Libertinus Math
+\loadmath{[FiraMath-Regular]} ... Fira Math
+\loadmath{[Asana-Math]} ... Asana Math
+\loadmath{[KpMath-Regular]} ... KP fonts Math
+\endtt
+
+\secc Unicode-math macros preloaded in the format
+
+\printdoc math-unicode.opm
+
+
+\secc[unimath-codes] Macros and codes set when \code{\\loadmatfont} is processed
+
+The file `unimath-codes.opm` is loaded when the \^`\loadmath` is used. The
+macros here redefines globally all encoding dependent settings declared in
+the section~\ref[math-macros].
+
+\printdoc unimath-codes.opm
+\printdoctail unimath-codes.opm
+
+\secc Printing all Unicode math slots in used math font
+
+\printdoctail print-unimath.opm
+\printdoc print-unimath.opm
+
+\_endinput
+
+2021-03-09 \_setunimathdimes: \_begin/end/group instead {}, bug fixed
+2021-02-15 \_textmff, \_scriptmff and \_sscriptmff introduced
+2021-02-15 \_expandafter -> \_ea
+2020-06-07 \Umathfractiondelsize (for \choose brackets) corrected, see https://tug.org/pipermail/luatex/2020-June/007365.html
+2020-04-15 \_setmathdimens -> \_setuniathdimens
+2020-02-25 implemented
diff --git a/macros/optex/base/mathclass.opm b/macros/optex/base/mathclass.opm
new file mode 100644
index 0000000000..458431abca
--- /dev/null
+++ b/macros/optex/base/mathclass.opm
@@ -0,0 +1,1591 @@
+# File: MathClass.txt
+# Revision: 15
+# Date: 2017-06-01, 12:35:00 GMT
+#
+# © 2017 Unicode®, Inc.
+# Unicode and the Unicode Logo are registered trademarks of Unicode, Inc. in the U.S. and other countries.
+# For terms of use, see http://www.unicode.org/terms_of_use.html
+# For documentation, see http://www.unicode.org/reports/tr25/
+#
+# ------------------------------------------------
+# This file is a classification of characters based on their usage in
+# mathematical notation.
+#
+# While the contents of this file represent the best information
+# available to the authors and the Unicode Technical Committee as
+# of the date referenced above, it is likely that the information
+# in this file will change from time to time.
+#
+# This file is *NOT* formally part of the Unicode Character Database
+# at this time.
+#
+# The character encoding of this plain-text file is UTF-8.
+#
+# The data consists of 2 fields.
+#
+# 1: code point or range
+#
+# 2: class, one of:
+#
+# N - Normal - includes all digits and symbols requiring only one form
+# A - Alphabetic
+# B - Binary
+# C - Closing - usually paired with opening delimiter
+# D - Diacritic
+# F - Fence - unpaired delimiter (often used as opening or closing)
+# G - Glyph_Part - piece of large operator
+# L - Large - n-ary or large operator, often takes limits
+# O - Opening - usually paired with closing delimiter
+# P - Punctuation
+# R - Relation - includes arrows
+# S - Space
+# U - Unary - operators that are only unary
+# V - Vary - operators that can be unary or binary depending on context
+# X - Special - characters not covered by other classes
+#
+# Fields are delimited by ';'. Spaces adjacent to the delimiter or the '#' are
+# not significant. Future versions of this file may use different amounts of
+# whitespace.
+#
+# Some character positions in the Mathematical Alphanumeric Symbols block are
+# reserved and have been mapped to the Letterlike Symbols block in Unicode.
+# This is indicated in 24 special purpose comments.
+#
+# The character repertoire of this revision is the repertoire of Unicode
+# Version 9.0. For more information see Revision 15 or later of UTR #25.
+# ------------------------------------------------
+
+0020;S
+0021;N
+0023;N
+0024;N
+0025;N
+0026;N
+0028;O
+0029;C
+002A;N
+002B;V
+002C;P
+002D;N
+002E;P
+002F;B
+0030..0039;N
+003A;P
+003B;P
+003C;R
+003D;R
+003E;R
+003F;P
+0040;N
+0041..005A;A
+005B;O
+005C;B
+005D;C
+005E;N
+005F;N
+0060;D
+0061..007A;A
+007B;O
+007C;F
+007D;C
+007E;N
+00A0;S
+00A1;P
+00A2;N
+00A3;N
+00A4;N
+00A5;N
+00A6;N
+00A7;N
+00A8;D
+00AC;U
+00AF;D
+00B0;N
+00B1;V
+00B2;N
+00B3;N
+00B4;N
+00B5;N
+00B6;N
+00B7;B
+00B9;N
+00BC;N
+00BD;N
+00BE;N
+00BF;P
+00D7;B
+00F7;B
+0131;A
+0237;A
+02C6;D
+02C7;D
+02D8;D
+02D9;D
+02DA;D
+02DC;D
+0300;D
+0301;D
+0302;D
+0303;D
+0304;D
+0305;D
+0306;D
+0307;D
+0308;D
+030A;D
+030C;D
+0311;D
+0323;D
+032C;D
+032D;D
+032E;D
+032F;D
+0330;D
+0331;D
+0332;D
+0333;D
+0338;D
+033A;D
+033F;D
+0346;D
+0391;A
+0392;A
+0393;A
+0394;A
+0395;A
+0396;A
+0397;A
+0398;A
+0399;A
+039A;A
+039B;A
+039C;A
+039D;A
+039E;A
+039F;A
+03A0;A
+03A1;A
+03A3;A
+03A4;A
+03A6;A
+03A7;A
+03A8;A
+03A9;A
+03B1;A
+03B2;A
+03B3;A
+03B4;A
+03B5;A
+03B6;A
+03B7;A
+03B8;A
+03B9;A
+03BA;A
+03BB;A
+03BC;A
+03BD;A
+03BE;A
+03BF;A
+03C0;A
+03C1;A
+03C3;A
+03C4;A
+03C5;A
+03C6;A
+03C7;A
+03C8;A
+03C9;A
+03D0;A
+03D1;A
+03D2;A
+03D5;A
+03D6;A
+03D8;N
+03D9;N
+03DA;A
+03DB;A
+03DC;A
+03DD;A
+03E0;A
+03E1;A
+03F0;A
+03F1;A
+03F4;A
+03F5;A
+03F6;N
+0428;A
+0606;L
+0607;L
+0608;A
+2000;S
+2001;S
+2002;S
+2003;S
+2004;S
+2005;S
+2006;S
+2007;S
+2009;S
+200A;S
+200B;S
+2010;P
+2012;P
+2013;P
+2014;P
+2016;F
+2020;R
+2021;R
+2022;B
+2026;N
+2032;N
+2033;N
+2034;N
+2035;N
+2036;N
+2037;N
+203B;N
+203C;N
+2040;B
+2044;B
+204E;B
+204F;R
+2050;R
+2051;N
+2052;N
+2057;N
+205F;S
+2061;B
+2062;B
+2063;P
+2064;X
+207A..207E;N
+208A..208E;N
+20D0;D
+20D1;D
+20D2;D
+20D3;X
+20D4;D
+20D5;D
+20D6;D
+20D7;D
+20D8;D
+20D9;D
+20DA;D
+20DB;D
+20DC;D
+20DD;D
+20DE;D
+20DF;D
+20E1;D
+20E4;D
+20E5;D
+20E6;D
+20E7;D
+20E8;D
+20E9;D
+20EA;D
+20EB;D
+20EC;D
+20ED;D
+20EE;D
+20EF;D
+2102;A
+2107;N
+210A;A
+210B;A
+210C;A
+210D;A
+210E;N
+210F;N
+2110;A
+2111;A
+2112;A
+2113;A
+2115;A
+2118;A
+2119;A
+211A;A
+211B;A
+211C;A
+211D;A
+2124;A
+2126;N
+2127;N
+2128;A
+2129;N
+212B;A
+212C;A
+212D;A
+212F;A
+2130;A
+2131;A
+2132;N
+2133;A
+2134;A
+2135;A
+2136;A
+2137;A
+2138;A
+213C;A
+213D;A
+213E;N
+213F;A
+2140;L
+2141;N
+2142;N
+2143;N
+2144;N
+2145;N
+2146;N
+2147;N
+2148;N
+2149;N
+214B;N
+2190..21B3;R
+21B6;R
+21B7;R
+21BA..21FF;R
+2200;U
+2201;U
+2202;N
+2203;U
+2204;U
+2205;N
+2206;U
+2207;U
+2208;R
+2209;R
+220A;R
+220B;R
+220C;R
+220D;R
+220E;N
+220F;L
+2210;L
+2211;L
+2212;V
+2213;V
+2214;B
+2215;B
+2216;B
+2217;B
+2218;B
+2219;B
+221A;L
+221B;L
+221C;L
+221D;R
+221E;N
+221F;N
+2220;N
+2221;N
+2222;N
+2223;R
+2224;R
+2225;R
+2226;R
+2227;B
+2228;B
+2229;B
+222A;B
+222B;L
+222C;L
+222D;L
+222E;L
+222F;L
+2230;L
+2231;L
+2232;L
+2233;L
+2234;R
+2235;R
+2236;R
+2237;R
+2238;B
+2239;R
+223A;R
+223B;R
+223C;R
+223D;R
+223E;B
+223F;N
+2240;B
+2241;R
+2242;R
+2243;R
+2244;R
+2245;R
+2246;R
+2247;R
+2248;R
+2249;R
+224A;R
+224B;R
+224C;R
+224D;R
+224E;R
+224F;R
+2250;R
+2251;R
+2252;R
+2253;R
+2254;R
+2255;R
+2256;R
+2257;R
+2258;R
+2259;R
+225A;R
+225B;R
+225C;R
+225D;R
+225E;R
+225F;R
+2260;R
+2261;R
+2262;R
+2263;R
+2264;R
+2265;R
+2266;R
+2267;R
+2268;R
+2269;R
+226A;R
+226B;R
+226C;R
+226D;R
+226E;R
+226F;R
+2270;R
+2271;R
+2272;R
+2273;R
+2274;R
+2275;R
+2276;R
+2277;R
+2278;R
+2279;R
+227A;R
+227B;R
+227C;R
+227D;R
+227E;R
+227F;R
+2280;R
+2281;R
+2282;R
+2283;R
+2284;R
+2285;R
+2286;R
+2287;R
+2288;R
+2289;R
+228A;R
+228B;R
+228C;B
+228D;B
+228E;B
+228F;R
+2290;R
+2291;R
+2292;R
+2293;B
+2294;B
+2295;B
+2296;B
+2297;B
+2298;B
+2299;B
+229A;B
+229B;B
+229C;B
+229D;B
+229E;B
+229F;B
+22A0;B
+22A1;B
+22A2;R
+22A3;R
+22A4;N
+22A5;R
+22A6;R
+22A7;R
+22A8;R
+22A9;R
+22AA;R
+22AB;R
+22AC;R
+22AD;R
+22AE;R
+22AF;R
+22B0;R
+22B1;R
+22B2;R
+22B3;R
+22B4;R
+22B5;R
+22B6;R
+22B7;R
+22B8;R
+22B9;B
+22BA;B
+22BB;B
+22BC;B
+22BD;B
+22BE;N
+22BF;N
+22C0;L
+22C1;L
+22C2;L
+22C3;L
+22C4;B
+22C5;B
+22C6;B
+22C7;B
+22C8;R
+22C9;B
+22CA;B
+22CB;B
+22CC;B
+22CD;R
+22CE;B
+22CF;B
+22D0;R
+22D1;R
+22D2;B
+22D3;B
+22D4;R
+22D5;R
+22D6;R
+22D7;R
+22D8;R
+22D9;R
+22DA;R
+22DB;R
+22DC;R
+22DD;R
+22DE;R
+22DF;R
+22E0;R
+22E1;R
+22E2;R
+22E3;R
+22E4;R
+22E5;R
+22E6;R
+22E7;R
+22E8;R
+22E9;R
+22EA;R
+22EB;R
+22EC;R
+22ED;R
+22EE;R
+22EF;R
+22F0;R
+22F1;R
+22F2;R
+22F3;R
+22F4;R
+22F5;R
+22F6;R
+22F7;R
+22F8;R
+22F9;R
+22FA;R
+22FB;R
+22FC;R
+22FD;R
+22FE;R
+22FF;R
+2300;N
+2302;N
+2305;B
+2306;B
+2308;O
+2309;C
+230A;O
+230B;C
+2310;N
+2311;N
+2319;N
+231C;O
+231D;C
+231E;O
+231F;C
+2320..2321;G
+2322;R
+2323;R
+#2329;O
+#232A;C
+2336;N
+233D;B
+233F;R
+237C;R
+2394;N
+239B..23AF;G
+23B0;R
+23B1;R
+23B2..23B3;G
+23B4;N
+23B5;N
+23B6;N
+23B7;G
+23D0;G
+23DC;N
+23DD;N
+23DE;N
+23DF;N
+23E0;N
+23E1;N
+23E2;N
+23E3;N
+23E4;N
+23E5;N
+23E6;N
+23E7;N
+24C8;N
+25A0;N
+25A1;N
+25AA;N
+25AB;N
+25AD;N
+25AE;N
+25AF;N
+25B0;N
+25B1;N
+25B2;B
+25B3;B
+25B4;B
+25B5;B
+25B6;B
+25B7;B
+25B8;B
+25B9;B
+25BC;B
+25BD;B
+25BE;B
+25BF;B
+25C0;B
+25C1;B
+25C2;B
+25C3;B
+25C4;B
+25C5;B
+25C6;N
+25C7;N
+25C8;N
+25C9;N
+25CA;B
+25CB;B
+25CE;N
+25CF;N
+25D0..25D3;N
+25D6;N
+25D7;N
+25E2;N
+25E3;N
+25E4;N
+25E5;N
+25E6;B
+25E7..25EA;N
+25EB;B
+25EC;B
+25EF;N
+25F8;B
+25F9;B
+25FA;B
+25FB;B
+25FC;B
+25FD;B
+25FE;B
+25FF;B
+2605;B
+2606;B
+2609;N
+260C;N
+263D;N
+263E;N
+263F;N
+2640;N
+2641;N
+2642;N
+2643;N
+2644;N
+2646;N
+2647;N
+2648;N
+2649;N
+2660;N
+2661;N
+2662;N
+2663;N
+2664;N
+2665;N
+2666;N
+2667;N
+2669;N
+266D;N
+266E;N
+266F;N
+2680;N
+2681;N
+2682;N
+2683;N
+2684;N
+2685;N
+2686;N
+2687;N
+2688;N
+2689;N
+26AA;N
+26AB;N
+26AC;N
+26B2;N
+2713;N
+2717;N
+2720;N
+272A;N
+2736;N
+2772;O
+2773;C
+27C0;N
+27C1;N
+27C2;R
+27C3;R
+27C4;R
+27C5;R
+27C6;R
+27C7;R
+27C8;R
+27C9;R
+27CA;R
+27CB;R
+27CC;L
+27CD;R
+27CE;B
+27CF;B
+27D0;N
+27D1;B
+27D2;R
+27D3;R
+27D4;R
+27D5;L
+27D6;L
+27D7;L
+27D8;L
+27D9;L
+27DA;R
+27DB;R
+27DC;R
+27DD;R
+27DE;R
+27DF;R
+27E0;B
+27E1;B
+27E2;B
+27E3;B
+27E4;B
+27E5;B
+27E6;O
+27E7;C
+27E8;O
+27E9;C
+27EA;O
+27EB;C
+27EC;O
+27ED;C
+27EE;O
+27EF;C
+27F0;R
+27F1;R
+27F2;R
+27F3;R
+27F4;R
+27F5;R
+27F6;R
+27F7;R
+27F8;R
+27F9;R
+27FA;R
+27FB;R
+27FC;R
+27FD;R
+27FE;R
+27FF;R
+2900;R
+2901;R
+2902;R
+2903;R
+2904;R
+2905;R
+2906;R
+2907;R
+2908;R
+2909;R
+290A;R
+290B;R
+290C;R
+290D;R
+290E;R
+290F;R
+2910;R
+2911;R
+2912;R
+2913;R
+2914;R
+2915;R
+2916;R
+2917;R
+2918;R
+2919;R
+291A;R
+291B;R
+291C;R
+291D;R
+291E;R
+291F;R
+2920;R
+2921;R
+2922;R
+2923;R
+2924;R
+2925;R
+2926;R
+2927;R
+2928;R
+2929;R
+292A;R
+292B;R
+292C;R
+292D;R
+292E;R
+292F;R
+2930;R
+2931;R
+2932;R
+2933;R
+2934;R
+2935;R
+2936;R
+2937;R
+2938;R
+2939;R
+293A;R
+293B;R
+293C;R
+293D;R
+293E;R
+293F;R
+2940;R
+2941;R
+2942;R
+2943;R
+2944;R
+2945;R
+2946;R
+2947;R
+2948;R
+2949;R
+294A;R
+294B;R
+294C;R
+294D;R
+294E;R
+294F;R
+2950;R
+2951;R
+2952;R
+2953;R
+2954;R
+2955;R
+2956;R
+2957;R
+2958;R
+2959;R
+295A;R
+295B;R
+295C;R
+295D;R
+295E;R
+295F;R
+2960;R
+2961;R
+2962;R
+2963;R
+2964;R
+2965;R
+2966;R
+2967;R
+2968;R
+2969;R
+296A;R
+296B;R
+296C;R
+296D;R
+296E;R
+296F;R
+2970;R
+2971;R
+2972;R
+2973;R
+2974;R
+2975;R
+2976;R
+2977;R
+2978;R
+2979;R
+297A;R
+297B;R
+297C;R
+297D;R
+297E;R
+297F;R
+2980;F
+2981;N
+2982;F
+2983;O
+2984;C
+2985;O
+2986;C
+2987;O
+2988;C
+2989;O
+298A;C
+298B;O
+298C;C
+298D;O
+298E;C
+298F;O
+2990;C
+2991;O
+2992;C
+2993;O
+2994;C
+2995;O
+2996;C
+2997;O
+2998;C
+2999;F
+299A;F
+299B;N
+299C;N
+299D;N
+299E;N
+299F;N
+29A0;N
+29A1;N
+29A2;N
+29A3;N
+29A4;N
+29A5;N
+29A6;N
+29A7;N
+29A8;N
+29A9;N
+29AA;N
+29AB;N
+29AC;N
+29AD;N
+29AE;N
+29AF;N
+29B0;N
+29B1;N
+29B2;N
+29B3;N
+29B4;N
+29B5;N
+29B6;B
+29B7;B
+29B8;B
+29B9;B
+29BA;N
+29BB;N
+29BC;N
+29BD;N
+29BE;N
+29BF;N
+29C0;B
+29C1;B
+29C2;N
+29C3;N
+29C4;B
+29C5;B
+29C6;B
+29C7;B
+29C8;B
+29C9;N
+29CA;N
+29CB;N
+29CC;N
+29CD;N
+29CE;R
+29CF;R
+29D0;R
+29D1;R
+29D2;R
+29D3;R
+29D4;R
+29D5;R
+29D6;B
+29D7;B
+29D8;O
+29D9;C
+29DA;O
+29DB;C
+29DC;N
+29DD;N
+29DE;N
+29DF;R
+29E0;N
+29E1;R
+29E2;B
+29E3;R
+29E4;R
+29E5;R
+29E6;R
+29E7;N
+29E8;N
+29E9;N
+29EA;N
+29EB;B
+29EC;N
+29ED;N
+29EE;N
+29EF;N
+29F0;N
+29F1;N
+29F2;N
+29F3;N
+29F4;R
+29F5;B
+29F6;B
+29F7;B
+29F8;L
+29F9;L
+29FA;B
+29FB;B
+29FC;O
+29FD;C
+29FE;B
+29FF;B
+2A00;L
+2A01;L
+2A02;L
+2A03;L
+2A04;L
+2A05;L
+2A06;L
+2A07;L
+2A08;L
+2A09;L
+2A0A;L
+2A0B;L
+2A0C;L
+2A0D;L
+2A0E;L
+2A0F;L
+2A10;L
+2A11;L
+2A12;L
+2A13;L
+2A14;L
+2A15;L
+2A16;L
+2A17;L
+2A18;L
+2A19;L
+2A1A;L
+2A1B;L
+2A1C;L
+2A1D;L
+2A1E;L
+2A1F;L
+2A20;L
+2A21;L
+2A22;B
+2A23;B
+2A24;B
+2A25;B
+2A26;B
+2A27;B
+2A28;B
+2A29;B
+2A2A;B
+2A2B;B
+2A2C;B
+2A2D;B
+2A2E;B
+2A2F;B
+2A30;B
+2A31;B
+2A32;B
+2A33;B
+2A34;B
+2A35;B
+2A36;B
+2A37;B
+2A38;B
+2A39;B
+2A3A;B
+2A3B;B
+2A3C;B
+2A3D;B
+2A3E;B
+2A3F;B
+2A40;B
+2A41;B
+2A42;B
+2A43;B
+2A44;B
+2A45;B
+2A46;B
+2A47;B
+2A48;B
+2A49;B
+2A4A;B
+2A4B;B
+2A4C;B
+2A4D;B
+2A4E;B
+2A4F;B
+2A50;B
+2A51;B
+2A52;B
+2A53;B
+2A54;B
+2A55;B
+2A56;B
+2A57;B
+2A58;B
+2A59;R
+2A5A;B
+2A5B;B
+2A5C;B
+2A5D;B
+2A5E;B
+2A5F;B
+2A60;B
+2A61;B
+2A62;B
+2A63;B
+2A64;B
+2A65;B
+2A66;R
+2A67;R
+2A68;R
+2A69;R
+2A6A;R
+2A6B;R
+2A6C;R
+2A6D;R
+2A6E;R
+2A6F;R
+2A70;R
+2A71;B
+2A72;B
+2A73;R
+2A74;R
+2A75;R
+2A76;R
+2A77;R
+2A78;R
+2A79;R
+2A7A;R
+2A7B;R
+2A7C;R
+2A7D;R
+2A7E;R
+2A7F;R
+2A80;R
+2A81;R
+2A82;R
+2A83;R
+2A84;R
+2A85;R
+2A86;R
+2A87;R
+2A88;R
+2A89;R
+2A8A;R
+2A8B;R
+2A8C;R
+2A8D;R
+2A8E;R
+2A8F;R
+2A90;R
+2A91;R
+2A92;R
+2A93;R
+2A94;R
+2A95;R
+2A96;R
+2A97;R
+2A98;R
+2A99;R
+2A9A;R
+2A9B;R
+2A9C;R
+2A9D;R
+2A9E;R
+2A9F;R
+2AA0;R
+2AA1;R
+2AA2;R
+2AA3;R
+2AA4;R
+2AA5;R
+2AA6;R
+2AA7;R
+2AA8;R
+2AA9;R
+2AAA;R
+2AAB;R
+2AAC;R
+2AAD;R
+2AAE;R
+2AAF;R
+2AB0;R
+2AB1;R
+2AB2;R
+2AB3;R
+2AB4;R
+2AB5;R
+2AB6;R
+2AB7;R
+2AB8;R
+2AB9;R
+2ABA;R
+2ABB;R
+2ABC;R
+2ABD;R
+2ABE;R
+2ABF;R
+2AC0;R
+2AC1;R
+2AC2;R
+2AC3;R
+2AC4;R
+2AC5;R
+2AC6;R
+2AC7;R
+2AC8;R
+2AC9;R
+2ACA;R
+2ACB;R
+2ACC;R
+2ACD;R
+2ACE;R
+2ACF;R
+2AD0;R
+2AD1;R
+2AD2;R
+2AD3;R
+2AD4;R
+2AD5;R
+2AD6;R
+2AD7;R
+2AD8;R
+2AD9;R
+2ADA;R
+2ADB;R
+2ADC;R
+2ADD;R
+2ADE;R
+2ADF;R
+2AE0;R
+2AE1;N
+2AE2;R
+2AE3;R
+2AE4;R
+2AE5;R
+2AE6;R
+2AE7;R
+2AE8;R
+2AE9;R
+2AEA;R
+2AEB;R
+2AEC;R
+2AED;R
+2AEE;R
+2AEF;R
+2AF0;R
+2AF1;N
+2AF2;R
+2AF3;R
+2AF4;B
+2AF5;B
+2AF6;B
+2AF7;R
+2AF8;R
+2AF9;R
+2AFA;R
+2AFB;B
+2AFC;L
+2AFD;B
+2AFE;B
+2AFF;L
+2B00..2B11;R
+2B12;N
+2B13;N
+2B14;N
+2B15;N
+2B16;N
+2B17;N
+2B18;N
+2B19;N
+2B1B..2B1F;N
+2B20;N
+2B21;N
+2B22;N
+2B23;N
+2B24..2B2F;N
+2B30..2B44;R
+2B45;R
+2B46;R
+2B47..2B4C;R
+2B50..2B54;N
+2B95;R
+2BC2..2BC8;N
+2BCA;N
+2BCB;N
+3008;X
+3009;X
+#3014;O
+#3015;C
+#3018;O
+#3019;C
+301A;X
+301B;X
+306E;N
+FB29;X
+FE00;D
+#deprecFE35;
+#deprecFE36;
+#deprecFE37;
+#deprecFE38;
+FE61..FE66;X
+FE68;X
+FF0B;X
+FF1C..FF1E;X
+FF3C;X
+FF3E;X
+FF5C;X
+FF5E;X
+FFE2;X
+FFE9..FFEC;X
+1D400..1D454;A
+#1D455=210E;N
+1D456..1D49B;A
+1D49C;A
+#1D49D=212C;A
+1D49E;A
+1D49F;A
+#1D4A0=2130;A
+#1D4A1=2131;A
+1D4A2;A
+#1D4A3=210B;A
+#1D4A4=2110;A
+1D4A5;A
+1D4A6;A
+#1D4A7=2112;A
+#1D4A8=2133;A
+1D4A9;A
+1D4AA;A
+1D4AB;A
+1D4AC;A
+#1D4AD=211B;A
+1D4AE;A
+1D4AF;A
+1D4B0;A
+1D4B1;A
+1D4B2;A
+1D4B3;A
+1D4B4;A
+1D4B5;A
+1D4B6;A
+1D4B7;A
+1D4B8;A
+1D4B9;A
+#1D4BA=212F;A
+1D4BB;A
+#1D4BC=210A;A
+1D4BD;A
+1D4BE;A
+1D4BF;A
+1D4C0;A
+1D4C1;A
+1D4C2;A
+1D4C3;A
+#1D4C4=2134;A
+1D4C5;A
+1D4C6;A
+1D4C7;A
+1D4C8;A
+1D4C9;A
+1D4CA;A
+1D4CB;A
+1D4CC;A
+1D4CD;A
+1D4CE;A
+1D4CF;A
+1D4D0..1D503;A
+1D504;A
+1D505;A
+#1D506=212D;A
+1D507;A
+1D508;A
+1D509;A
+1D50A;A
+#1D50B=210C;A
+#1D50C=2111;A
+1D50D;A
+1D50E;A
+1D50F;A
+1D510;A
+1D511;A
+1D512;A
+1D513;A
+1D514;A
+#1D515=211C;A
+1D516;A
+1D517;A
+1D518;A
+1D519;A
+1D51A;A
+1D51B;A
+1D51C;A
+#1D51D=2128;A
+1D51E;A
+1D51F;A
+1D520;A
+1D521;A
+1D522;A
+1D523;A
+1D524;A
+1D525;A
+1D526;A
+1D527;A
+1D528;A
+1D529;A
+1D52A;A
+1D52B;A
+1D52C;A
+1D52D;A
+1D52E;A
+1D52F;A
+1D530;A
+1D531;A
+1D532;A
+1D533;A
+1D534;A
+1D535;A
+1D536;A
+1D537;A
+1D538;A
+1D539;A
+#1D53A=2102;A
+1D53B;A
+1D53C;A
+1D53D;A
+1D53E;A
+#1D53F=210D;A
+1D540;A
+1D541;A
+1D542;A
+1D543;A
+1D544;A
+#1D545=2115;A
+1D546;A
+#1D547=2119;A
+#1D548=211A;A
+#1D549=211D;A
+1D54A;A
+1D54B;A
+1D54C;A
+1D54D;A
+1D54E;A
+1D54F;A
+1D550;A
+#1D551=2124;A
+1D552;A
+1D553;A
+1D554;A
+1D555;A
+1D556;A
+1D557;A
+1D558;A
+1D559;A
+1D55A;A
+1D55B;A
+1D55C;A
+1D55D;A
+1D55E;A
+1D55F;A
+1D560;A
+1D561;A
+1D562;A
+1D563;A
+1D564;A
+1D565;A
+1D566;A
+1D567;A
+1D568;A
+1D569;A
+1D56A;A
+1D56B;A
+1D56C..1D6A3;A
+1D6A4;A
+1D6A5;A
+1D6A8..1D7C9;A
+1D7CA;A
+1D7CB;A
+1D7CE..1D7FF;N
+1EE00..1EE03;A
+1EE05..1EE1F;A
+1EE21;A
+1EE22;A
+1EE24;A
+1EE27;A
+1EE29..1EE32;A
+1EE34..1EE37;A
+1EE39;A
+1EE3B;A
+1EE42;A
+1EE47;A
+1EE49;A
+1EE4B;A
+1EE4D..1EE4F;A
+1EE51;A
+1EE52;A
+1EE54;A
+1EE57;A
+1EE59;A
+1EE5B;A
+1EE5D;A
+1EE5F;A
+1EE61;A
+1EE62;A
+1EE64;A
+1EE67..1EE6A;A
+1EE6C..1EE72;A
+1EE74..1EE77;A
+1EE79..1EE7C;A
+1EE7E;A
+1EE80..1EE89;A
+1EE8B..1EE9B;A
+1EEA1..1EEA3;A
+1EEA5..1EEA9;A
+1EEAB..1EEBB;A
+1EEF0;L
+1EEF1;L
+1F784;N
+1F78C;N
+1F78D;N
+1F797..1F799;N
+1F79D..1F79F;N
+
+# EOF
diff --git a/macros/optex/base/more-macros.opm b/macros/optex/base/more-macros.opm
new file mode 100644
index 0000000000..d5ce88c1a6
--- /dev/null
+++ b/macros/optex/base/more-macros.opm
@@ -0,0 +1,284 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \eoldef {OpTeX useful macos <2020-05-22>} % preloaded in format
+
+ \_doc -----------------------------
+ We define \`\opinput` `{<file name>}` macro which
+ does `\input {<file name>}` but the catcodes are set to normal catcodes
+ (like \OpTeX/ initializes them) and the catcodes setting is returned back to
+ the current values when the file is read. You can use `\opinput`
+ in any situation inside the document and you will be sure that the file
+ is read correctly with correct catcode settings.
+
+ To achieve this, we declare \`\optexcatcodes` catcode table
+ and \`\plaintexcatcodes`. They save the commonly used catcode tables.
+ Note that `\catcodetable` is a part of \LuaTeX/ extension.
+ The catcodetable stack is implemented by \OpTeX/ macros.
+ The \`\setctable` `<catcode table>` pushes
+ current catcode table to the stack and activates catcodes from
+ the `<catcode table>`. The \`\restorectable` returns to the saved catcodes
+ from the catcode table stack.
+
+ The `\opinput` works inside the catcode table stack. It reads `\optexcatcodes`
+ table and stores it to \`\_tmpcatcodes` table.
+ This table is actually used during `\input` (maybe catcodes are
+ changed here). Finally, `\_restoretable` pops the stacks and returns
+ to the catcodes used before `\opinput` is run.
+ \_cod -----------------------------
+
+\_def\_opinput #1{\_setctable\_optexcatcodes
+ \_savecatcodetable\_tmpcatcodes \_catcodetable\_tmpcatcodes
+ \_input {#1}\_relax\_restorectable}
+
+\_newcatcodetable \_optexcatcodes
+\_newcatcodetable \_plaintexcatcodes
+\_newcatcodetable \_tmpcatcodes
+
+\_public \optexcatcodes \plaintexcatcodes \opinput ;
+
+\_savecatcodetable\_optexcatcodes
+{\_catcode`_=8 \savecatcodetable\plaintexcatcodes}
+
+ \_doc -----------------------------
+ The implementation of the catcodetable stack follows.
+
+ The current catcodes are
+ managed in the `\catcodetable0`. If the `\setctable` is used first (or at
+ the outer level of the stack), then the `\catcodetable0` is pushed to the
+ stack and the current table is re-set to the given `<catcode table>`.
+ The numbers of these tables are stacked to the \`\_ctablelist` macro.
+ The `\restorectable` reads the last saved catcode table number from the
+ `\_ctablelist` and uses it.
+ \_cod -----------------------------
+
+\_newcount\_currctable \_currctable=0
+\_catcodetable0
+
+\_def\_setctable#1{\_edef\_ctablelist{{\_the\_currctable}\_ctablelist}%
+ \_catcodetable#1\_relax \_currctable=#1\_relax
+}
+\_def\_restorectable{\_ea\_restorectableA\_ctablelist\_relax}
+\_def\_restorectableA#1#2\_relax{%
+ \_ifx^#2^\_opwarning
+ {You can't use \_noindent\restorectable without previous \_string\setctable}%
+ \_else \_def\_ctablelist{#2}\_catcodetable#1\_relax \_currctable=#1\_relax \_fi
+}
+\_def\_ctablelist{.}
+
+\_public \setctable \restorectable ;
+
+ \_doc -----------------------------
+ When a special macro is defined with different catcodes then
+ \`\normalcatcodes` can be used at the end of such definition.
+ The normal catcodes are restored.
+ The macro reads
+ catcodes from `\optecatodes` table and sets it to the main catcode table 0.
+ \_cod -----------------------------
+
+\_def\_normalcatcodes {\_catcodetable\_optexcatcodes \_savecatcodetable0 \_catcodetable0 }
+\_public \normalcatodes ;
+
+ \_doc -----------------------------
+ The \`\load` `[<filename-list>]` loads files specfied in
+ comma separated `<filename-list>`. The first space (after comma)
+ is ignored using the trick `#1#2,`: first parameter is unseparated.
+ The `\load` macro saves information about loaded files by setting
+ `\_load:<filename>` as a defined macro.
+
+ If the \`\_afterload` macro is defined then it is run after `\_opinput`.
+ The catcode setting should be here. Note that catcode setting done in the
+ loaded file is forgotten after the `\opinput`.
+ \_cod -----------------------------
+
+\_def \_load [#1]{\_loadA #1,,,\_end}
+\_def \_loadA #1#2,{\_ifx,#1 \_ea \_loadE \_else \_loadB{#1#2}\_ea\_loadA\_fi}
+\_def \_loadB #1{%
+ \_ifcsname _load:#1\_endcsname \_else
+ \_isfile {#1.opm}\_iftrue \_opinput {#1.opm}\_else \_opinput {#1}\_fi
+ \_sxdef{_load:#1}{}%
+ \_trycs{_afterload}{}\_let\_afterload=\_undefined
+ \_fi
+}
+\_def \_loadE #1\_end{}
+\_public \load ;
+
+ \_doc -----------------------------
+ The declarator \`\optdef``\macro [<opt default>] <params>{<replacement text>}`
+ defines the `\macro` with the optional parameter followed by normal parameters
+ declared in `<params>`. The optional parameter must be used as the first
+ first parameter in brackets `[...]`. If it isn't used then <opt default>
+ is taken into account. The `<replacement text>` can use `\the\opt`
+ because optional parameter is saved to the \`\opt` tokens register.
+ Note the difference from \LaTeX/ concept where the optional parameter is
+ in `#1`. \OpTeX/ uses `#1` as the first normal parameter (if declared).
+
+ The \`\_nospaceafter` ignores the following optional space at expand
+ processor level using the negative `\romannumeral` trick.
+ \_cod -----------------------------
+
+\_def\_optdef#1[#2]{%
+ \_def#1{\_opt={#2}\_isnextchar[{\_cs{_oA:\_string#1}}{\_cs{_oB:\_string#1}}}%
+ \_sdef{_oA:\_string#1}[##1]{\_opt={##1}\_cs{_oB:\_string#1\_nospaceafter}}%
+ \_sdef{_oB:\_string#1\_nospaceafter}%
+}
+\_def\_nospaceafter#1{\_ea#1\_romannumeral-`\.}
+\_newtoks\_opt
+
+\_public \opt \optdef ;
+
+ \_doc -----------------------------
+ The declarator \`\eoldef``\macro #1{<replacement text>}` defines a `\macro`
+ which scans its parameter to the end of the current line.
+ This is the parameter `#1` which can be used in the `<replacement text>`.
+ The catcode of the `\endlinechar` is reset temporarily when the parameter is scanned.
+
+ The macro defined by `\eoldef` cannot be used with its parameter inside
+ other macros because the catcode dancing is not possible here. But the
+ \`\bracedparam``\macro{<parameter>}` can be used here. The `\bracedparam`
+ is a prefix that re-sets temporarily the `\macro` to a `\macro` with
+ normal one parameter.
+
+ The \`\skiptoeol` macro reads the text to the end of the current line
+ and ignores it.
+ \_cod -----------------------------
+
+\_def\_eoldef #1{\_def #1{\_begingroup \_catcode`\^^M=12 \_eoldefA #1}%
+ \_ea\_def\_csname _\_csstring #1:M\_endcsname}
+\_catcode`\^^M=12 %
+\_def\_eoldefA #1#2^^M{\_endgroup\_csname _\_csstring #1:M\_endcsname{#2}}%
+\_normalcatcodes %
+
+\_eoldef\_skiptoeol#1{}
+\_def\_bracedparam#1{\_ifcsname _\_csstring #1:M\_endcsname
+ \_csname _\_csstring #1:M\_ea \_endcsname
+ \_else \_csname __in\_csstring #1:M\_ea \_endcsname \_fi
+}
+\_public \eoldef \skiptoeol \bracedparam ;
+
+ \_doc -----------------------------
+ \`\scantoeol``\macro <text to end of line>` scans the
+ `<text to end of line>` in verbatim mode and runs the
+ `\macro{<text to end of line>}`. The `\macro`
+ can be defined `\def\macro#1{...\scantextokens{#1}...}`.
+ The new tokenization of the parameter is processed when the parameter is used,
+ no when the parameter is scanned. This principle is used in definition
+ of \^`\chap`, \^`\sec`, \^`\secc` and \^`\_Xtoc` macros.
+ It means that user can write \code{\\sec text `&` text} for example.
+ Inline verbatim works in title sections.
+
+ The verbatim scanner of `\scatoeol` keeps category 7 for `^` in
+ order to be able to use `^^J` as comment character which means that
+ the next line continues.
+ \_cod -----------------------------
+
+\_def\_scantoeol#1{\def\_tmp{#1}\_begingroup \_setscancatcodes \_scantoeolA}
+\_def\_setscancatcodes{\_setverb \_catcode`\^^M=12\_catcode`\^=7\_catcode`\ =10\_catcode`\^^J=14 }
+\_catcode`\^^M=12 %
+\_def\_scantoeolA#1^^M{\_endgroup \_tmp{#1}}%
+\_normalcatcodes %
+
+\_public \scantoeol ;
+
+ \_doc -----------------------------
+ The \`\replstring``\macro{<textA>}{<textB>}`
+ replaces all occurrences of `<textA>` by `<textB>` in the `\macro` body.
+ The `\macro` must be defined without parameters. The occurrences of
+ `<textA>` are not replaced if they are \"hidden" in braces, for example
+ `...{...<textA>...}...`. The category codes in the `<textA>` must exactly
+ match.
+
+ How it works: `\replstring\foo{<textA>}{<textB>}` prepares
+ `\_replacestringsA#1<textA>{...}` and runs
+ `\_replacestringsA<foo-body>?<textA>!<textA>`.
+ So, `#1` includes the first part of <foo-body> before first <textA>.
+ It is saved to \`\_tmptoks` and `\_replacestringsB` is run in a loop.
+ It finishes processing or appends the next part to `\_tmptoks` separated by
+ <textB> and continues loop. The final part of the macro removes the last `?`
+ from resulting `\_tmptoks` and defines a new version of the `\foo`.
+ \_cod -----------------------------
+
+\_newtoks\_tmptoks
+\_catcode`!=3 \_catcode`?=3
+\_def\_replstring #1#2#3{% \replstring #1{stringA}{stringB}
+ \_long\_def\_replacestringsA##1#2{\_tmptoks{##1}\_replacestringsB}%
+ \_long\_def\_replacestringsB##1#2{\_ifx!##1\_relax \_else \_toksapp\_tmptoks{#3##1}%
+ \_ea\_replacestringsB\_fi}%
+ \_ea\_replacestringsA #1?#2!#2%
+ \_long\_def\_replacestringsA##1?{\_tmptoks{##1}\_edef#1{\_the\_tmptoks}}%
+ \_ea\_replacestringsA \_the\_tmptoks}
+\_normalcatcodes
+
+\_public \replstring ;
+
+ \_doc -----------------------------
+ The \`\catcode` primitive is redefined here. Why?
+ There is very common cases like \code{\\catcode`}`<something>`
+ or `\catcode"<number>` but these characters
+ \code{\`} or \code{"} can be set as active (typically by `\verbchar` macro).
+ Nothing problematic happens if re-defined `\catcode` is used in this case.
+
+ If you really need primitive `\catcode` then you can use `\_catcode`.
+ \_cod -----------------------------
+
+\_def\catcode#1{\_catcode \_if`\_noexpand#1\_ea`\_else\_if"\_noexpand#1"\_else
+ \_if'\_noexpand#1'\_else \_ea\_ea\_ea\_ea\_ea\_ea\_ea#1\_fi\_fi\_fi}
+
+ \_doc -----------------------------
+ The \`\removespaces` `<text with spaces >{}` expands to <textwithoutspaces>.
+ \nl
+ The `\_ea`\`\ignorept``\the<dimen>` expands to a decimal
+ number `\the<dimen>` but without `pt` unit.
+ \_cod -----------------------------
+
+\_def\_removespaces #1 {\_isempty{#1}\_iffalse #1\_ea\_removespaces\_fi}
+\_ea\_def \_ea\_ignorept \_ea#\_ea1\_detokenize{pt}{#1}
+
+\public \removespaces \ignorept ;
+
+ \_doc -----------------------------
+ You can use expandable \`\bp``{<dimen>}` convertor from
+ \TeX/ `<dimen>` (or from an expression accepted by
+ `\dimexpr` primitive) to a decimal value in big points
+ (used as natural unit in the PDF format). So, you can write, for example:
+ \begtt
+ \pdfliteral{q \_bp{.3\hsize-2mm} \_bp{2mm} m 0 \_bp{-4mm} l S Q}
+ \endtt
+ You can use expandable \`\expr``{<expression>}` for analogical purposes.
+ It expands to the value of the `<expression>` at expand processor level
+ with \`\_decdigits` digits after the decimal point.
+ The `<expression>` can include `+-*/()` and decimal numbers in common syntax.
+
+ The usage of prefixed versions \`\_expr` or \`\_bp` is more recommended
+ because a user can re-define the control sequences `\expr` or `\bp`.
+ \_cod -----------------------------
+
+\_def\_decdigits{3} % digits after decimal point in \_bp and \_expr outputs.
+\_def\_pttopb{%
+ \_directlua{tex.print(string.format('\_pcent.\_decdigits f',
+ token.scan_dimen()/65781.76))}% pt to bp conversion
+}
+\def\_bp#1{\_ea\_pttopb\_dimexpr#1\_relax}
+\def\_expr#1{\_directlua{tex.print(string.format('\_pcent.\_decdigits f',#1))}}
+
+\_public \expr \bp ;
+
+ \_doc ------------------
+ The pair {\`\_doc` ... \`\_cod`} is used for documenting macros and to
+ printing the technical documentation of the \OpTeX/. The syntax is:
+ {\begtt \catcode`\<=13
+ \_doc <ignored text>
+ <documentation>
+ \_cod <ignored text>
+ \endtt
+ }
+ The `<documentation>` (and `<ignored text>` too) must be `<balanced text>`.
+ It means that you cannot document only the `{` but you must document the `}` too.
+ \_cod ------------------
+
+\_long\_def\_doc #1\_cod {\_skiptoeol}
+
+\_endcode % -------------------------------------
+
+2020-05-22 robust \catcode newly defined in order \catcode\string.... be possible
+2020-05-03 \load macro introduced
+2020-03-15 released
diff --git a/macros/optex/base/multicolumns.opm b/macros/optex/base/multicolumns.opm
new file mode 100644
index 0000000000..bf5b05f7db
--- /dev/null
+++ b/macros/optex/base/multicolumns.opm
@@ -0,0 +1,114 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \begmulti {Balanced columns <2020-03-26>} % preloaded in format
+
+ \_doc -----------------------------
+ This code is documented in detail in the \"\TeX/book naruby", pages 244--246,
+ free available, \url{http://petr.olsak.net/tbn.html}, but in Czech.
+ Roughly speaking, macros complete all material between
+ \`\begmulti``<num-columns>` and \`\endmulti`
+ into one `\vbox 6`. Then the macro measures the amount of free space at the current
+ page using `\pagegoal` and `\pagtotal` and does `\vsplit` of `\vbox 6` to
+ columns with a height of such free space. This is done only if we have
+ enough amount of material in `\vbox 6` to fill the full page by columns.
+ This is repeated in a loop until we have less amount of material in `\vbox 6`.
+ Then we run `\_balancecolumns` which balances the last part of the columns.
+ Each part of printed material is distributed to the main vertical list as
+ `\hbox{<columns>}` and we need not do any change in the output routine.
+
+ If you have paragraphs in `\begmulti`... `\endmulti` environment then
+ you may say `\raggedright` inside this environment and you can re-assign
+ `\widowpenalty` and `\clubppenalty` (they are set to 10000 in \OpTeX/).
+ \_cod -----------------------------
+
+\_def\_multiskip{\_medskip} % space above and below \begmulti...\endmulti
+
+\_newcount\_mullines
+
+\_def\_begmulti #1 {\_par\_bgroup\_wipeepar\_multiskip\_penalty0 \_def\_Ncols{#1}
+ \_setbox6=\_vbox\_bgroup \_let\_setxhsize=\_relax \_penalty0
+ %% \hsize := column width = (\hsize+\colsep) / n - \colsep
+ \_advance\_hsize by\_colsep
+ \_divide\_hsize by\_Ncols \_advance\_hsize by-\_colsep
+ \_mullines=0
+ \_def\par{\_ifhmode\_endgraf\_global\_advance\_mullines by\_prevgraf\_fi}%
+}
+\_def\_endmulti{\_vskip-\_prevdepth\_vfil
+ \_ea\_egroup\_ea\_baselineskip\_the\_baselineskip\_relax
+ \_dimen0=.8\_maxdimen \_tmpnum=\_dimen0 \_divide\_tmpnum by\_baselineskip
+ \_splittopskip=\_baselineskip
+ \_setbox1=\_vsplit6 to0pt
+ %% \dimen1 := the free space on the page
+ \_ifdim\_pagegoal=\_maxdimen \_dimen1=\_vsize \_corrsize{\_dimen1}
+ \_else \_dimen1=\_pagegoal \_advance\_dimen1 by-\_pagetotal \_fi
+ \_ifdim \_dimen1<2\_baselineskip
+ \_vfil\_break \_dimen1=\_vsize \_corrsize{\_dimen1} \_fi
+ \_ifnum\_mullines<\_tmpnum \_dimen0=\_ht6 \_else \_dimen0=.8\_maxdimen \_fi
+ \_divide\_dimen0 by\_Ncols \_relax
+ %% split the material to more pages?
+ \_ifdim \_dimen0>\_dimen1 \_splitpart
+ \_else \_balancecolumns \_fi % only balancing
+ \_multiskip\_egroup
+}
+
+ \_doc -----------------------------
+ Splitting columns...
+ \_cod -----------------------------
+
+\_def\_makecolumns{\_bgroup % full page, destination height: \dimen1
+ \_vbadness=20000 \_setbox1=\_hbox{}\_tmpnum=0
+ \_loop \_ifnum\_Ncols>\_tmpnum
+ \_advance\_tmpnum by1
+ \_setbox1=\_hbox{\_unhbox1 \_vsplit6 to\_dimen1 \_hss}
+ \_repeat
+ \_hbox{}\_nobreak\_vskip-\_splittopskip \_nointerlineskip
+ \_line{\_unhbox1\_unskip}
+ \_dimen0=\_dimen1 \_divide\_dimen0 by\_baselineskip \_multiply\_dimen0 by\_Ncols
+ \_global\_advance\_mullines by-\_dimen0
+ \_egroup
+}
+\_def\_splitpart{%
+ \_makecolumns % full page
+ \_vskip 0pt plus 1fil minus\_baselineskip \_break
+ \_ifnum\_mullines<\_tmpnum \_dimen0=\_ht6 \_else \_dimen0=.8\_maxdimen \_fi
+ \_divide\_dimen0 by\_Ncols \_relax
+ \_ifx\_balancecolumns\_flushcolumns \_advance\_dimen0 by-.5\_vsize \_fi
+ \_dimen1=\_vsize \_corrsize{\_dimen1}\_dimen2=\_dimen1
+ \_advance\_dimen2 by-\_baselineskip
+ %% split the material to more pages?
+ \_ifvoid6 \_else
+ \_ifdim \_dimen0>\_dimen2 \_ea\_ea\_ea \_splitpart
+ \_else \_balancecolumns % last balancing
+ \_fi \_fi
+}
+
+ \_doc -----------------------------
+ Final balancing of the columns.
+ \_cod -----------------------------
+
+\_def\_balancecolumns{\_bgroup \_setbox7=\_copy6 % destination height: \dimen0
+ \_ifdim\_dimen0>\_baselineskip \_else \_dimen0=\_baselineskip \_fi
+ \_vbadness=20000
+ \_def\_tmp{%
+ \_setbox1=\_hbox{}\_tmpnum=0
+ \_loop \_ifnum\_Ncols>\_tmpnum
+ \_advance\_tmpnum by1
+ \_setbox1=\_hbox{\_unhbox1
+ \_ifvoid6 \_hbox to\_wd6{\_hss}\_else \_vsplit6 to\_dimen0 \_fi\_hss}
+ \_repeat
+ \_ifvoid6 \_else
+ \_advance \_dimen0 by.2\_baselineskip
+ \_setbox6=\_copy7
+ \_ea \_tmp \_fi}\_tmp
+ \_hbox{}\_nobreak\_vskip-\_splittopskip \_nointerlineskip
+ \_hbox to\_hsize{\_unhbox1\_unskip}%
+ \_egroup
+}
+\_def\_corrsize #1{%% #1 := #1 + \splittopskip - \topskip
+ \_advance #1 by \_splittopskip \_advance #1 by-\_topskip
+}
+\_public \begmulti \endmulti ;
+
+\_endcode % -------------------------------------
+
+
diff --git a/macros/optex/base/optex.ini b/macros/optex/base/optex.ini
new file mode 100644
index 0000000000..c695b7d809
--- /dev/null
+++ b/macros/optex/base/optex.ini
@@ -0,0 +1,107 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+%% OpTeX ini file
+%% Petr Olsak <project started from: Jan. 2020>
+
+% Catcodes:
+
+\catcode `\{=1 % left brace is begin-group character
+\catcode `\}=2 % right brace is end-group character
+\catcode `\$=3 % dollar sign is math shift
+\catcode `\&=4 % ampersand is alignment tab
+\catcode `\#=6 % hash mark is macro parameter character
+\catcode `\^=7 %
+\catcode `\^^K=7 % circumflex and uparrow are for superscripts
+\catcode `\^^A=8 % downarrow is for subscripts
+\catcode `\^^I=10 % ascii tab is a blank space
+\catcode `\_=11 % underline can be used in control sequences
+\catcode `\~=13 % tilde is active
+\catcode `\^^a0=13 % non breaking space in Unicode
+\catcode 127=12 % normal character
+
+% OpTeX version
+
+\def\optexversion{1.01 Mar.2021}
+\def\fmtname{OpTeX}
+\let\fmtversion=\optexversion
+
+% Engine testing:
+
+\newlinechar=`\^^J
+\ifx\directlua\undefined
+ \message{This format is based only on LuaTeX, use luatex -ini optex.ini^^J}
+ \endinput \fi
+
+\ifx\bgroup\undefined \else
+ \message{This file can be used only for format initialisation, use luatex -ini^^J}
+ \endinput \fi
+
+% Basic .opm syntax:
+
+\let\_endcode =\endinput
+\def \_codedecl #1#2{\message{#2^^J}}% information about .opm file
+\long\def\_doc#1\_cod#2 {} % skip documentation
+
+% Initialization:
+
+\message{OpTeX (Olsak's Plain TeX) initialization <\optexversion>^^J}
+
+\input prefixed.opm % prefixed primitives and code syntax
+\input luatex-ini.opm % luaTeX initialization
+\input basic-macros.opm % basic macros
+\input alloc.opm % allocators for registers
+\input if-macros.opm % special \if-macros, \is-macros and loops
+\input parameters.opm % parameters setting
+\input more-macros.opm % OpTeX useful macros (todo: doc)
+\input keyval.opm % key=value dictionaries
+\input plain-macros.opm % plainTeX macros
+\input fonts-preload.opm % preloaded Latin Modern fonts
+\input fonts-resize.opm % font resizing (low-level macros)
+\input fonts-select.opm % font selection system
+\input math-preload.opm % math fams CM + AMS preloaded
+\input math-macros.opm % basic macros for math plus mathchardefs
+\input math-unicode.opm % macros for loading UnicodeMath fonts
+\input fonts-opmac.opm % font managing macros from OPmac
+\input output.opm % output routine
+\input margins.opm % macros for margins setting
+\input colors.opm % colors
+\input ref-file.opm % ref file
+\input references.opm % references
+\input hyperlinks.opm % hyperlinks
+\input maketoc.opm % maketoc
+\input outlines.opm % PDF outlines
+\input pdfuni-string.opm % PDFunicode strings for outlines
+\input sections.opm % titles, chapters, sections
+\input lists.opm % lists, \begitems, \enditems
+\input verbatim.opm % verbatim
+\input hi-syntax.opm % syntax highlighting of verbatim listimgs
+\input graphics.opm % graphics
+\input table.opm % table macro
+\input multicolumns.opm % more columns by \begmulti ...\endmulti
+\input cite-bib.opm % Bibliography, \cite
+\input makeindex.opm % Make index and sorting
+\input fnotes.opm % \fnotes, \mnotes
+\input styles.opm % styles \report, \letter
+\input logos.opm % standard logos
+\input uni-lcuc.opm % Setting lccodes and uccodes for Unicode characters
+\input hyphen-lan.opm % initialization of hyphenation patterns
+\input languages.opm % languages
+\input others.opm % miscenaleous
+
+\_directlua{
+ % preload OpTeX's lua code into format as bytecode
+ lua.bytecode[1] = assert(loadfile(kpse.find_file("optex", "lua")))
+}
+
+\_everyjob = {%
+ \_message{This is OpTeX (Olsak's Plain TeX), version <\optexversion>^^J}%
+ \_mathchardef\_fnotestack=\_pdfcolorstackinit page {0 g 0 G}%
+ \_directlua{lua.bytecode[1]()}% load OpTeX's Lua code
+ \_mathsbon % replaces \int_a^b to \int _a^b
+ \_inputref % inputs \jobname.ref if exists
+}
+
+\_dump
+
+\_endcode % ------------------------------
+
diff --git a/macros/optex/base/optex.lua b/macros/optex/base/optex.lua
new file mode 100644
index 0000000000..2d83f38ed6
--- /dev/null
+++ b/macros/optex/base/optex.lua
@@ -0,0 +1,356 @@
+-- This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+-- The basic lua functions and declarations used in \OpTeX/ are here
+
+-- GENERAL
+
+-- Error function used by following functions for critical errors.
+local function err(message)
+ error("\nerror: "..message.."\n")
+end
+--
+-- For a `\chardef`'d, `\countdef`'d, etc., csname return corresponding register
+-- number. The responsibility of providing a `\XXdef`'d name is on the caller.
+function registernumber(name)
+ return token.create(name).index
+end
+--
+-- ALLOCATORS
+alloc = alloc or {}
+--
+-- An attribute allocator in Lua that cooperates with normal \OpTeX/ allocator.
+local attributes = {}
+function alloc.new_attribute(name)
+ local cnt = tex.count["_attributealloc"] + 1
+ if cnt > 65534 then
+ tex.error("No room for a new attribute")
+ else
+ tex.setcount("global", "_attributealloc", cnt)
+ texio.write_nl("log", '"'..name..'"=\\attribute'..tostring(cnt))
+ attributes[name] = cnt
+ return cnt
+ end
+end
+--
+-- `provides_module` is needed by older version of luaotfload
+provides_module = function() end
+--
+-- CALLBACKS
+callback = callback or {}
+--
+-- Save `callback.register` function for internal use.
+local callback_register = callback.register
+function callback.register(name, fn)
+ err("direct registering of callbacks is forbidden, use 'callback.add_to_callback'")
+end
+--
+-- Table with lists of functions for different callbacks.
+local callback_functions = {}
+-- Table that maps callback name to a list of descriptions of its added
+-- functions. The order corresponds with `callback_functions`.
+local callback_description = {}
+--
+-- Table used to differentiate user callbacks from standard callbacks. Contains
+-- user callbacks as keys.
+local user_callbacks = {}
+-- Table containing default functions for callbacks, which are called if either
+-- a user created callback is defined, but doesn't have added functions or for
+-- standard callbacks that are \"extended" (see `mlist_to_hlist` and its pre/post
+-- filters below).
+local default_functions = {}
+--
+-- Table that maps standard (and later user) callback names to their types.
+local callback_types = {
+ -- file discovery
+ find_read_file = "exclusive",
+ find_write_file = "exclusive",
+ find_font_file = "data",
+ find_output_file = "data",
+ find_format_file = "data",
+ find_vf_file = "data",
+ find_map_file = "data",
+ find_enc_file = "data",
+ find_pk_file = "data",
+ find_data_file = "data",
+ find_opentype_file = "data",
+ find_truetype_file = "data",
+ find_type1_file = "data",
+ find_image_file = "data",
+
+ open_read_file = "exclusive",
+ read_font_file = "exclusive",
+ read_vf_file = "exclusive",
+ read_map_file = "exclusive",
+ read_enc_file = "exclusive",
+ read_pk_file = "exclusive",
+ read_data_file = "exclusive",
+ read_truetype_file = "exclusive",
+ read_type1_file = "exclusive",
+ read_opentype_file = "exclusive",
+
+ -- data processing
+ process_input_buffer = "data",
+ process_output_buffer = "data",
+ process_jobname = "data",
+ input_level_string = "data",
+
+ -- node list processing
+ contribute_filter = "simple",
+ buildpage_filter = "simple",
+ build_page_insert = "exclusive",
+ pre_linebreak_filter = "list",
+ linebreak_filter = "exclusive",
+ append_to_vlist_filter = "exclusive",
+ post_linebreak_filter = "reverselist",
+ hpack_filter = "list",
+ vpack_filter = "list",
+ hpack_quality = "list",
+ vpack_quality = "list",
+ process_rule = "exclusive",
+ pre_output_filter = "list",
+ hyphenate = "simple",
+ ligaturing = "simple",
+ kerning = "simple",
+ insert_local_par = "simple",
+ mlist_to_hlist = "exclusive",
+
+ -- information reporting
+ pre_dump = "simple",
+ start_run = "simple",
+ stop_run = "simple",
+ start_page_number = "simple",
+ stop_page_number = "simple",
+ show_error_hook = "simple",
+ show_error_message = "simple",
+ show_lua_error_hook = "simple",
+ start_file = "simple",
+ stop_file = "simple",
+ call_edit = "simple",
+ finish_synctex = "simple",
+ wrapup_run = "simple",
+
+ -- pdf related
+ finish_pdffile = "data",
+ finish_pdfpage = "data",
+ page_order_index = "data",
+ process_pdf_image_content = "data",
+
+ -- font related
+ define_font = "exclusive",
+ glyph_not_found = "exclusive",
+ glyph_info = "exclusive",
+
+ -- undocumented
+ glyph_stream_provider = "exclusive",
+ provide_charproc_data = "exclusive",
+}
+--
+-- Return a list containing descriptions of added callback functions for
+-- specific callback.
+function callback.callback_descriptions(name)
+ return callback_description[name] or {}
+end
+
+local valid_callback_types = {
+ exclusive = true,
+ simple = true,
+ data = true,
+ list = true,
+ reverselist = true,
+}
+--
+-- Create a user callback that can only be called manually using
+-- `call_callback`. A default function is only needed by "exclusive" callbacks.
+function callback.create_callback(name, cbtype, default)
+ if callback_types[name] then
+ err("cannot create callback '"..name.."' - it already exists")
+ elseif not valid_callback_types[cbtype] then
+ err("cannot create callback '"..name.. "' with invalid callback type '"..cbtype.."'")
+ elseif ctype == "exclusive" and not default then
+ err("unable to create exclusive callback '"..name.."', default function is required")
+ end
+
+ callback_types[name] = cbtype
+ default_functions[name] = default or nil
+ user_callbacks[name] = true
+end
+--
+-- Add a function to the list of functions executed when callback is called.
+-- For standard luatex callback a proxy function that calls our machinery is
+-- registered as the real callback function. This doesn't happen for user
+-- callbacks, that are called manually by user using `call_callback` or for
+-- standard callbacks that have default functions -- like `mlist_to_hlist` (see
+-- below).
+function callback.add_to_callback(name, fn, description)
+ if user_callbacks[name] or callback_functions[name] or default_functions[name] then
+ -- either:
+ -- a) user callback - no need to register anything
+ -- b) standard callback that has already been registered
+ -- c) standard callback with default function registered separately
+ -- (mlist_to_hlist)
+ elseif callback_types[name] then
+ -- This is a standard luatex callback with first function being added,
+ -- register a proxy function as a real callback. Assert, so we know
+ -- when things break, like when callbacks get redefined by future
+ -- luatex.
+ assert(callback_register(name, function(...)
+ return callback.call_callback(name, ...)
+ end))
+ else
+ err("cannot add to callback '"..name.."' - no such callback exists")
+ end
+
+ -- add function to callback list for this callback
+ callback_functions[name] = callback_functions[name] or {}
+ table.insert(callback_functions[name], fn)
+
+ -- add description to description list
+ callback_description[name] = callback_description[name] or {}
+ table.insert(callback_description[name], description)
+end
+--
+-- Remove a function from the list of functions executed when callback is
+-- called. If last function in the list is removed delete the list entirely.
+function callback.remove_from_callback(name, description)
+ local descriptions = callback_description[name]
+ local index
+ for i, desc in ipairs(descriptions) do
+ if desc == description then
+ index = i
+ break
+ end
+ end
+
+ table.remove(descriptions, index)
+ local fn = table.remove(callback_functions[name], index)
+
+ if #descriptions == 0 then
+ -- Delete the list entirely to allow easy checking of "truthiness".
+ callback_functions[name] = nil
+
+ if not user_callbacks[name] and not default_functions[name] then
+ -- this is a standard callback with no added functions and no
+ -- default function (i.e. not mlist_to_hlist), restore standard
+ -- behaviour by unregistering.
+ callback_register(name, nil)
+ end
+ end
+
+ return fn, description
+end
+--
+-- helper iterator generator for iterating over reverselist callback functions
+local function reverse_ipairs(t)
+ local i, n = #t + 1, 1
+ return function()
+ i = i - 1
+ if i >= n then
+ return i, t[i]
+ end
+ end
+end
+--
+-- Call all functions added to callback. This function handles standard
+-- callbacks as well as user created callbacks. It can happen that this
+-- function is called when no functions were added to callback -- like for user
+-- created callbacks or `mlist_to_hlist` (see below), these are handled either
+-- by a default function (like for `mlist_to_hlist` and those user created
+-- callbacks that set a default function) or by doing nothing for empty
+-- function list.
+function callback.call_callback(name, ...)
+ local cbtype = callback_types[name]
+ -- either take added functions or the default function if there is one
+ local functions = callback_functions[name] or {default_functions[name]}
+
+ if cbtype == nil then
+ err("cannot call callback '"..name.."' - no such callback exists")
+ elseif cbtype == "exclusive" then
+ -- only one function, atleast default function is guaranteed by
+ -- create_callback
+ return functions[1](...)
+ elseif cbtype == "simple" then
+ -- call all functions one after another, no passing of data
+ for _, fn in ipairs(functions) do
+ fn(...)
+ end
+ return
+ elseif cbtype == "data" then
+ -- pass data (first argument) from one function to other, while keeping
+ -- other arguments
+ local data = (...)
+ for _, fn in ipairs(functions) do
+ data = fn(data, select(2, ...))
+ end
+ return data
+ end
+
+ -- list and reverselist are like data, but "true" keeps data (head node)
+ -- unchanged and "false" ends the chain immediately
+ local iter
+ if cbtype == "list" then
+ iter = ipairs
+ elseif cbtype == "reverselist" then
+ iter = reverse_ipairs
+ end
+
+ local head = (...)
+ local new_head
+ local changed = false
+ for _, fn in iter(functions) do
+ new_head = fn(head, select(2, ...))
+ if new_head == false then
+ return false
+ elseif new_head ~= true then
+ head = new_head
+ changed = true
+ end
+ end
+ return not changed or head
+end
+--
+-- Create \"virtual" callbacks `pre/post_mlist_to_hlist_filter` by setting
+-- `mlist_to_hlist` callback. The default behaviour of `mlist_to_hlist` is kept by
+-- using a default function, but it can still be overriden by using
+-- `add_to_callback`.
+default_functions["mlist_to_hlist"] = node.mlist_to_hlist
+callback.create_callback("pre_mlist_to_hlist_filter", "list")
+callback.create_callback("post_mlist_to_hlist_filter", "reverselist")
+callback_register("mlist_to_hlist", function(head, ...)
+ -- pre_mlist_to_hlist_filter
+ local new_head = callback.call_callback("pre_mlist_to_hlist_filter", head, ...)
+ if new_head == false then
+ node.flush_list(head)
+ return nil
+ elseif new_head ~= true then
+ head = new_head
+ end
+
+ -- mlist_to_hlist means either added functions or standard luatex behavior
+ -- of node.mlist_to_hlist (handled by default function)
+ head = callback.call_callback("mlist_to_hlist", head, ...)
+
+ -- post_mlist_to_hlist_filter
+ new_head = callback.call_callback("post_mlist_to_hlist_filter", head, ...)
+ if new_head == false then
+ node.flush_list(head)
+ return nil
+ elseif new_head ~= true then
+ head = new_head
+ end
+ return head
+end)
+--
+-- Compatibility with \LaTeX/ through luatexbase namespace. Needed for
+-- luaotfload.
+luatexbase = {
+ registernumber = registernumber,
+ attributes = attributes,
+ provides_module = provides_module,
+ new_attribute = alloc.new_attribute,
+ callback_descriptions = callback.callback_descriptions,
+ create_callback = callback.create_callback,
+ add_to_callback = callback.add_to_callback,
+ remove_from_callback = callback.remove_from_callback,
+ call_callback = callback.call_callback,
+ callbacktypes = {}
+}
diff --git a/macros/optex/base/others.opm b/macros/optex/base/others.opm
new file mode 100644
index 0000000000..6ff15d4332
--- /dev/null
+++ b/macros/optex/base/others.opm
@@ -0,0 +1,106 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \uv {Miscenaleous <2020-05-22>} % preloaded in format
+
+ \_doc ----------------------------
+ \`\useOpTeX` and \`\useoptex` are declared as `\relax`.
+ \_cod ----------------------------
+
+\_let \useOpTeX = \_relax \_let \useoptex = \_relax
+
+ \_doc ----------------------------
+ The \`\lastpage` and \`\totalpages` get the information from the
+ \^`\_currpage`. The \^`\_Xpage` from `.ref` file sets the \^`\_currpage`.
+ \_cod ----------------------------
+
+\_def\_totalpages {\_openref\_ea\_ignoresecond\_currpage}
+\_def\_lastpage {\_openref\_ea\_usesecond\_currpage}
+\_def\_currpage {{0}{?}}
+\_public \lastpage \totalpages ;
+
+ \_doc ----------------------------
+ We need \`\uv`, \`\clqq`, \`\crqq`, \`\flqq`, \`\frqq`, \`\uslang`, \`\ehyph`
+ \`\chyph`, \`\shyph`, for backward compatibility with \csplain.
+ Codes are set according to Unicode because we are using Czech only in Unicode
+ when \LuaTeX/ is used.
+ \_cod ----------------------------
+
+
+% for compatibility with csplain:
+
+\_chardef\clqq=8222 \_chardef\crqq=8220
+\_chardef\flqq=171 \_chardef\frqq=187
+\_chardef\promile=8240
+
+\_def\uv#1{\clqq#1\crqq}
+
+\_let\uslang=\enlang \_let\ehyph=\enlang
+\_let\chyph=\cslang \_let\shyph=\sklang
+\_let\csUnicode=\csPatt \_let\czUnicode=\csPatt \_let\skUnicode=\skPatt
+
+ \_doc ----------------------------
+ The \`\letfont` was used in \csplain/ instead of `\fontlet`.
+ \_cod ----------------------------
+
+\_let \letfont = \_fontlet
+
+ \_doc ----------------------------
+ Non-breaking space in Unicode.
+ \_cod ----------------------------
+
+\let ^^a0=~
+
+ \_doc ----------------------------
+ TikZ needs these funny control sequences.
+ \_cod ----------------------------
+
+\_ea\_toksdef \_csname toks@\_endcsname=0
+\_ea\_let \_csname voidb@x\_endcsname=\_voidbox
+
+ \_doc ----------------------------
+ We don't want to read `opmac.tex` unless `\input opmac` is specified.
+ \_cod ----------------------------
+
+\_def\OPmacversion{OpTeX}
+
+ \_doc ----------------------------
+ We allow empty lines in math formulae. It is more comfortable.
+ \_cod ----------------------------
+
+\_suppressmathparerror = 1
+
+ \_doc ----------------------------
+ Lorem ipsum can be printed by \`\lipsum``[<range>]` or \`\lorem``[<range>]`,
+ for example `\lipsum[3]` or `\lipsum[112-121]`, max=150.
+
+ First usage of `\lipsum` reads the \LaTeX/ file `lipsum.ltd.tex`
+ by \`\_lipsumload`
+ and prints the selected paragraph(s). Next usages of `\lipsum`
+ prints the selected paragraph(s) from memory. This second and more
+ usages of `\lipsum` are fully expandable. If you want to have all
+ printings of `\lipsum` expandable, use dummy `\lipsum[0]` first.
+
+ `\lipsum` adds `\par` after each printed paragraph. If you don't need
+ such `\par` here, use \`\lipsumtext``[<number>]`.
+ This macro prints only one selected paragraph <number> and does not add `\par`.
+ \_cod ----------------------------
+
+\_def\_lipsumtext[#1]{\_lipsumload\_cs{_lip:#1}}
+\_def\_lipsum[#1]{\_lipsumA #1\_empty-\_empty\_end}
+\_def\_lipsumA #1-#2\_empty#3\_end{%
+ \_fornum #1..\_ifx^#2^#1\_else#2\_fi \_do {\_lipsumtext[##1]\par}}
+\_def\_lipsumload{{%
+ \_setbox0=\_vbox{\_tmpnum=0 % vertical mode during \input lipsum.ltd.tex
+ \_def\ProvidesFile##1[##2]{}%
+ \_def\NewLipsumPar{\_incr\_tmpnum \_sxdef{_lip:\_the\_tmpnum}}%
+ \_opinput {lipsum.ltd.tex}%
+ \_global\_let\_lipsumload=\_empty
+ }}}
+\_public \lipsum \lipsumtext ;
+\_let \lorem=\lipsum
+
+\_endcode
+
+2021-01-04 \lipsumtext introduced
+2020-05-22 \lipsum uses \fornum (expandable after first usage)
+2020-04-02 released
diff --git a/macros/optex/base/outlines.opm b/macros/optex/base/outlines.opm
new file mode 100644
index 0000000000..6230d8988b
--- /dev/null
+++ b/macros/optex/base/outlines.opm
@@ -0,0 +1,108 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \outlines {PDF outlines <2021-02-09>} % preloaded in format
+
+\_def\_outlines#1{\_pdfcatalog{/PageMode/UseOutlines}\_openref
+ \_ifx\_toclist\_empty
+ \_opwarning{\_noexpand\outlines -- data unavailable. TeX me again}%
+ \_incr\_unresolvedrefs
+ \_else
+ \_ifx\_dest\_destactive \_else
+ \_opwarning{\_noexpand\outlines doesn't work when \_noexpand\hyperlinks isn't declared}\_fi
+ {\_let\_tocline=\_outlinesA
+ \_count0=0 \_count1=0 \_count2=0 \_count3=0 \_toclist % calculate numbers o childs
+ \_def\_outlinelevel{#1}\_let\_tocline=\_outlinesB
+ \_tocrefnum=0 \_count0=0 \_count1=0 \_count2=0 \_count3=0
+ \_toclist}% create outlines
+ \_fi
+}
+\_def\_outlinesA#1#2#3#4#5#6#7{%
+ \_isequal{\relax}{#4}\_iffalse
+ \_advance\_count#1 by1
+ \_ifcase#1\_or
+ \_addoneol{_ol:\_the\_count0}\_or
+ \_addoneol{_ol:\_the\_count0:\_the\_count1}\_or
+ \_addoneol{_ol:\_the\_count0:\_the\_count1:\_the\_count2}\_or
+ \_addoneol{_ol:\_the\_count0:\_the\_count1:\_the\_count2:\_the\_count3}\_fi
+ \_fi
+}
+\_def\_addoneol#1{%
+ \_ifcsname #1\_endcsname
+ \_tmpnum=\_csname#1\_endcsname\_relax
+ \_advance\_tmpnum by1 \_sxdef{#1}{\_the\_tmpnum}%
+ \_else \_sxdef{#1}{1}%
+ \_fi
+}
+\_def\_outlinesB#1#2#3#4#5#6#7{%
+ \_advance\_tocrefnum by1
+ \_isequal{\relax}{#4}\_iffalse
+ \_advance\_count#1 by1
+ \_ifcase#1%
+ \_tmpnum=\_trycs{_ol:\_the\_count0}{0}\_or
+ \_tmpnum=\_trycs{_ol:\_the\_count0:\_the\_count1}{0}\_relax\_or
+ \_tmpnum=\_trycs{_ol:\_the\_count0:\_the\_count1:\_the\_count2}{0}\_relax\_or
+ \_tmpnum=\_trycs{_ol:\_the\_count0:\_the\_count1:\_the\_count2:\_the\_count3}{0}\_relax\_or
+ \_tmpnum = 0\_relax\_fi
+ \_isempty{#4}\_iftrue \_pdfunidef\_tmp{#5}\_else \_pdfunidef\_tmp{#4}\_fi
+ \_outlinesC{toc:\_the\_tocrefnum}{\_ifnum#1<\_outlinelevel\_space\_else-\_fi}{\_tmpnum}{\_tmp}%
+ \_fi
+}
+\_def\_outlinesC#1#2#3#4{\_pdfoutline goto name{#1} count #2#3{#4}\_relax}
+
+\_newcount\_oulnum
+\_def\_insertoutline#1{\_incr\_oulnum
+ \_pdfdest name{oul:\_the\_oulnum} xyz\_relax
+ \_pdfunidef\_tmp{#1}%
+ \_pdfoutline goto name{oul:\_the\_oulnum} count0 {\_tmp}\_relax
+}
+\_public \outlines \insertoutline ;
+
+\_endcode % ----------------------------
+
+The problem is that PDF format needs to know the number of direct
+descendants of each outline if we need to create the tree of structured
+outlines. But we know only the level of each outline. The required data
+should be calculated from TOC data. We use two steps over TOC data saved in
+the `\_toclist` where each record is represented by one `\_tocline`.
+
+The first step, the \`\outlines` macro sets `\_tocline` to \`\_outlinesA` and
+calculates the number of direct descendants of each record. The second step,
+the `\outlines` macro sets `\_tocline` to \`\_outlinesB` and it uses prepared
+data and creates outlines.
+
+Each outline is mapped to the control sequence of the type
+`\_ol:<num>` or `\_ol:<num>:<num>` or `\_ol:<num>:<num>:<num>` or etc.
+The first one is reserved for level 0, the second one for level 1 (chapters), the third
+one for level 2 (sections) etc. The number of direct descendants will be stored
+in these macros after the first step is finished. Each new outline of a given level
+increases the `<num>` at the given level. When the first step is processed then
+(above that) the `\_ol:..` sequence of the parent increases its value too. The
+`_ol:...` sequences are implemented by `\_ol:\_count0:\_count1:\count2` etc.
+For example, when section (level 2) is processed in the first step then we do:
+
+\begtt
+ \advance \count2 by 1
+ % increases the mapping pointer of the type
+ % \_ol:\_count0:\_count1:\_count2 of this section
+ \advance \_ol:\_count0:\_count1 by 1
+ % increases the number of descendants connected
+ % to the parent of this section.
+\endtt
+
+When the second step is processed, then we only read the stored data about the
+number of descendants. And we use it in `count` parameter of `\_pdfoutline`
+primitive.
+
+For linking, we use the same links as in TOC, i.e. the `toc:\_the\_tocrefnum`
+labels are used.
+
+\`\insertoutline` `{<text>}` inserts one outline with zero direct descendants.
+It creates a link destination of the type `oul:<num>` into the document
+(where \^`\insertoutline` is used) and the link itself is created too in the
+outline.
+
+\endinput
+
+2021-02-15 \_advance -> \_incr
+2021-02-09 \thisoutline implemented
+2020-03-12 released
diff --git a/macros/optex/base/output.opm b/macros/optex/base/output.opm
new file mode 100644
index 0000000000..5bb93c2477
--- /dev/null
+++ b/macros/optex/base/output.opm
@@ -0,0 +1,267 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \nopagenumbers {Output routine <2021-02-25>} % preloaded in format
+
+ \_doc -----------------------------
+ \`\_optexoutput` is the default output routine. You can create another...
+ \_cod -----------------------------
+
+\_output={\_optexoutput}
+\_def \_optexoutput{\_begoutput \_shipout\_completepage \_endoutput}
+
+ \_doc -----------------------------
+ Default \`\_begoutput` and \`\_endoutput` is defined.
+ If you need another functionality implemented in the output routine, you can
+ \^`\addto``\_begoutput{...}` or \^`\addto``\_endoutput{...}`. The settings
+ here are local in the `\output` group.
+
+ The \`\_prepoffsets` can set `\hoffset` differently for the left or right
+ page. It is re-defined by the \^`\margins` macro..
+
+ The \^`\_regmark` tokens list includes accumulated `#2` from the \^`\regmacro`.
+ Logos and other macros are re-defined here (locally) for their usage
+ in headlines or footlines.
+ \_cod -----------------------------
+
+\_def \_begoutput{\_incr\_gpageno
+ \_immediate\_wref\_Xpage{{\_the\_gpageno}{\_folio}}%
+ \_setxhsize \_prepoffsets \_the\_regmark}
+\_def \_endoutput{\_advancepageno
+ {\_globaldefs=1 \_the\_nextpages \_nextpages={}}%
+ \_ifnum\_outputpenalty>-20000 \_else\_dosupereject\_fi
+}
+\_def \_prepoffsets {}
+
+ \_doc -----------------------------
+ The `\hsize` value can be changed at various places in the document but
+ we need to have a constant value \`\_xhsize` in the output routine
+ (for headlines and footlines, for instance). This value is set
+ from the current value of `\hsize` when \`\_setxhsize` macro is called.
+ This macro destroys itself, so the value is set only once. Typically it is
+ done in \^`\margins` macro or
+ when first \^`\_optexoutput` routine is called (see \^`\_begoutput`).
+ Or it is called at the begining of the \^`\begtt`...`\endtt` environment before
+ `\hsize` value is eventually changed by the user in this environment.
+ \_cod -----------------------------
+
+\_newdimen \_xhsize
+\_def\_setxhsize {\_global\_xhsize=\_hsize \_global\_let\_setxhsize=\_relax}
+
+ \_doc -----------------------------
+ \`\gpageno` counts pages from one in the whole document
+ \_cod -----------------------------
+
+\_newcount\_gpageno
+\_public \gpageno ;
+
+ \_doc -----------------------------
+ The \`\_completepage` is similar to what plain \TeX/ does in its output routine.
+ New is only \`\_backgroundbox`. It is `\vbox` with zero height with its
+ contents (from \^`\pgbackground`) extended down. It is shifted directly to the
+ left-upper corner of the paper.
+
+ The \`\_ensureblack` sets the typesetting of its parameter locally to `\Black`
+ color. We needn't do this if colors are never used in the document. So,
+ the default value of the `\_ensureblack` macro is empty. But the first usage of
+ color macros in the document re-defines `\_ensureblack`.
+ See the section~\ref[colors] for more details.
+ \_cod -----------------------------
+
+\_def\_completepage{\_vbox{%
+ \_istoksempty \_pgbackground
+ \_iffalse \_ensureblack{\_backgroundbox{\_the\_pgbackground}}\_nointerlineskip \_fi
+ \_ensureblack{\_makeheadline}%
+ \_vbox to\_vsize {\_boxmaxdepth=\_maxdepth \_pagecontents}% \pagebody in plainTeX
+ \_ensureblack{\_makefootline}}%
+}
+\_def \_ensureblack #1{#1} % will be re-defined by color macros
+\_let \_openfnotestack = \_relax % will be re-defined by color macros
+\_def \_backgroundbox #1{\_moveleft\_hoffset\_vbox to\_zo{\_kern-\_voffset #1\_vss}}
+
+ \_doc -----------------------------
+ \`\_makeheadline` creates `\vbox to0pt` with its contents (the \^`\headline`)
+ shifted by \^`\headlinedist` up.
+ \_cod -----------------------------
+
+\_def\_makeheadline {\_istoksempty \_headline \_iffalse
+ \_vbox to\_zo{\_vss
+ \_baselineskip=\_headlinedist \_lineskiplimit=-\_maxdimen
+ \_hbox to\_xhsize{\_the\_headline}\_hbox{}}\_nointerlineskip
+ \_fi
+}
+
+ \_doc -----------------------------
+ The \`\_makefootline` appends the \^`\footline` to the page-body box.
+ \_cod -----------------------------
+
+\_def\_makefootline{\_istoksempty \_footline \_iffalse
+ \_baselineskip=\_footlinedist
+ \_lineskiplimit=-\_maxdimen \_hbox to\_xhsize{\_the\_footline}
+ \_fi
+}
+
+ \_doc -----------------------------
+ The \`\_pagecontents` is similar as in plain \TeX/. The only differnece is
+ that the \`\_pagedest` is inserted at the top of `\_pagecontents` and
+ \^`\_ensureblack` is applied to the \^`\topins` and \^`\footins` material.\nl
+ The \`\_footnoterule` is defined here.
+ \_cod -----------------------------
+
+\_def\_pagecontents{\_pagedest % destination of the page
+ \_ifvoid\_topins \_else \_ensureblack{\_unvbox\_topins}\_fi
+ \_dimen0=\_dp255 \_unvbox255 % open up \box255
+ \_ifvoid\_footins \_else % footnote info is present
+ \_vskip\_skip\_footins
+ \_ensureblack{\_footnoterule \_openfnotestack \_unvbox\_footins}\_fi
+ \_kern-\_dimen0 \_vskip \_pgbottomskip
+}
+\_def \_pagedest {{\_def\_destheight{25pt}\_dest[pg:\_the\_gpageno]}}
+\_def \_footnoterule {\_kern-3pt \_hrule width 2truein \_kern 2.6pt }
+
+ \_doc -----------------------------
+ \`\pageno`, \`\folio`, \`\nopagenumbers`, \`\advancepageno`
+ and \`\normalbottom`
+ used in the context of the output routine
+ from plain \TeX/ is defined here.
+ Only the \`\raggedbottom` macro is defined differently. We use the
+ \^`\pgbottomskip` register here which is set to 0\,pt by default.
+ \_cod -----------------------------
+
+\_countdef\_pageno=0 \_pageno=1 % first page is number 1
+\_def \_folio {\_ifnum\_pageno<0 \_romannumeral-\_pageno \_else \_number\_pageno \_fi}
+\_def \_nopagenumbers {\_footline={}}
+\_def \_advancepageno {%
+ \_ifnum\_pageno<0 \_decr\_pageno \_else \_incr\_pageno \_fi
+} % increase |pageno|
+\_def \_raggedbottom {\_topskip=\_dimexpr\_topskip plus60pt \_pgbottomskip=0pt plus1fil\_relax}
+\_def \_normalbottom {\_topskip=\_dimexpr\_topskip \_pgbottomskip=0pt\_relax}
+
+\_public \pageno \folio \nopagenumbers \advancepageno \raggedbottom \normalbottom ;
+
+ \_doc -----------------------------
+ Macros for footnotes are the same as in plain \TeX. There is only one
+ difference: \`\vfootnote` is implemented as \`\_opfootnote` with empty
+ parameter `#1`. This parameter should do local settings inside
+ the \`\footins` group and it does it when `\fnote` macro is used.\nl
+ The `\_opfootnote` nor `\vfootnote` don't take the footnote text
+ as a parameter. This is due to a user can do catcode settings (like inline
+ verbatim) in the footnote text. This idea is adapted from plain \TeX.\nl
+ The \`\footnote` and \`\footstrut` is defined as in plain \TeX/.
+ \_cod -----------------------------
+
+\_newinsert\_footins
+\_def \_footnote #1{\_let\_osf=\_empty % parameter #2 (the text) is read later
+ \_ifhmode \_edef\_osf{\_spacefactor\_the\_spacefactor}\/\_fi
+ #1\_osf\_vfootnote{#1}}
+\_def\_vfootnote{\_opfootnote{}}
+\_def \_opfootnote #1#2{\_insert\_footins\_bgroup
+ \_interlinepenalty=\_interfootnotelinepenalty
+ \_leftskip=\_zo \_rightskip=\_zo \_spaceskip=\_zo \_xspaceskip=\_zo \_relax
+ \_let\_colorstackcnt=\_fnotestack % special color stack for footnotes
+ #1\_relax % local settings used by \fnote macro
+ \_splittopskip=\_ht\_strutbox % top baseline for broken footnotes
+ \_splitmaxdepth=\_dp\_strutbox \_floatingpenalty=20000
+ \_textindent{#2}\_footstrut
+ \_isnextchar \_bgroup
+ {\_bgroup \_aftergroup\_vfootA \_afterassignment\_ignorespaces \_let\_next=}{\_vfootB}%
+}
+\_def\_vfootA{\_unskip\_strut\_isnextchar\_colorstackpop\_closefncolor\_vfootF}
+\_def\_vfootB #1{#1\_unskip\_strut\_vfootF}
+\_def\_vfootF{\_egroup} % close \_insert\_footins\_bgroup
+\_def\_closefncolor#1{#1\_isnextchar\_colorstackpop\_closefncolor\_vfootF}
+\_def \_footstrut {\_vbox to\_splittopskip{}}
+\_skip\_footins=\_bigskipamount % space added when footnote is present
+\_count\_footins=1000 % footnote magnification factor (1 to 1)
+\_dimen\_footins=8in % maximum footnotes per page
+\_public
+ \footins \footnote \vfootnote \footstrut ;
+
+ \_doc -----------------------------
+ The \`\topins` macros
+ \`\topinsert`, \`\midinsert`, \`\pageinsert`, \`\endinsert`
+ are the same as in plain \TeX/.
+ \_cod -----------------------------
+
+\_newinsert\_topins
+\_newifi\_ifupage \_newifi\_ifumid
+\_def \_topinsert {\_umidfalse \_upagefalse \_oins}
+\_def \_midinsert {\_umidtrue \_oins}
+\_def \_pageinsert {\_umidfalse \_upagetrue \_oins}
+\_skip\_topins=\_zoskip % no space added when a topinsert is present
+\_count\_topins=1000 % magnification factor (1 to 1)
+\_dimen\_topins=\_maxdimen % no limit per page
+\_def \_oins {\_par \_begingroup\_setbox0=\_vbox\_bgroup} % start a \_vbox
+\_def \_endinsert {\_par\_egroup % finish the \_vbox
+ \_ifumid \_dimen0=\_ht0 \_advance\_dimen0 by\_dp0 \_advance\_dimen0 by\_baselineskip
+ \_advance\_dimen0 by\_pagetotal \_advance\_dimen0 by-\_pageshrink
+ \_ifdim\_dimen0>\_pagegoal \_umidfalse \_upagefalse \_fi \_fi
+ \_ifumid \_bigskip \_box0 \_bigbreak
+ \_else \_insert \_topins {\_penalty100 % floating insertion
+ \_splittopskip=0pt
+ \_splitmaxdepth=\_maxdimen \_floatingpenalty=0
+ \_ifupage \_dimen0=\_dp0
+ \_vbox to\_vsize {\_unvbox0 \_kern-\_dimen0}% depth is zero
+ \_else \_box0 \_nobreak \_bigskip \_fi}\_fi\_endgroup}
+
+\_public \topins \topinsert \midinsert \pageinsert \endinsert ;
+
+ \_doc -----------------------------
+ The \`\draft` macro is an example of usage `\_pgbackground` to create
+ watercolor marks.
+ \_cod -----------------------------
+
+\_def \_draft {\_pgbackground={\_draftbox{\_draftfont DRAFT}}%
+ \_fontdef\_draftfont{\_setfontsize{at10pt}\_bf}%
+ \_global\_let\_draftfont=\_draftfont
+}
+\_def \_draftbox #1{\_setbox0=\_hbox{#1}%
+ \_kern.5\_vsize \_kern\_voffset \_kern4.5\_wd0
+ \_hbox to0pt{\_kern.5\_xhsize \_kern\_hoffset \_kern-2\_wd0
+ \_pdfsave \_pdfrotate{55}\_pdfscale{10}{10}%
+ \_hbox to0pt{\_localcolor\_setgreycolor{.8}\_box0\_hss}%
+ \_pdfrestore
+ \_hss}%
+}
+\_public \draft ;
+
+\_endcode % -------------------------------------
+
+
+The output routine \^`\_optexoutput` is similar as in plain \TeX. It does:
+
+\begitems
+* \^`\_begoutput` which does:
+ \begitems
+ * increments \^`\gpageno`,
+ * prints `\_Xpage{<gpageno>}{<pageno>}` to the `.ref` file
+ (if \^`\openref` is active),
+ * calculates `\hoffset`,
+ * sets local meaning of macros used in headlines/footlines (see \^`\regmacro`).
+ \enditems
+* `\shipout`\^`\_completepage`, which is `\vbox` of --
+ \begitems
+ * backrground box, if \^`\pgbackground` is non-empty,
+ * headline box by \^`\_makeheadline`, if the \^`\headline` is nonempty,
+ * `\vbox to\vsize` of \^`\_pagecontents` which cosnists of --
+ \begitems
+ * \^`\_pagedest`, the page destination `pg:<gpageno>` for hyperlinks is created here,
+ * \^`\topins` box if non-empty (from \^`\topinsert`s),
+ * `\box255` with completed vertical material from main vertical mode,
+ * \^`\_footnoterule` and \^`\footins` box if nonempty (from \^`\fnote`, \^`\footnote`),
+ * \^`\pgbottomskip` (default is 0\,pt).
+ \enditems
+ * footline box by `\_makefootline`, if the \^`\footline` is nonempty
+ \enditems
+* \^`\_endoutput` which does:
+ \begitems
+ * increments \^`\pageno` using \^`\advancepageno`
+ * runs output routine repeatedly if \^`\dosupereject` is activated.
+ \enditems
+\enditems
+
+\_endinput
+
+2021-02-25 \_draftbox improved
+2021-02-15 \_advance -> \_decr
+2020-05-12 \vfootB: \uskip -> \unskip bug fixed
+2020-03-28 Released
diff --git a/macros/optex/base/parameters.opm b/macros/optex/base/parameters.opm
new file mode 100644
index 0000000000..c8df6eec49
--- /dev/null
+++ b/macros/optex/base/parameters.opm
@@ -0,0 +1,588 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \normalbaselineskip {Parameter settings <2020-03-17>} % preloaded in format
+
+ \_doc -----------------------------
+ \secc Primitive registers
+ The primitive registers with the same default value as in plain \TeX/ follow:
+ \_cod -----------------------------
+
+\_parindent=20pt % indentation of paragraphs
+\_pretolerance=100 % parameters used in paragraph breaking algorithm
+\_tolerance=200
+\_hbadness=1000
+\_vbadness=1000
+\_doublehyphendemerits=10000
+\_finalhyphendemerits=5000
+\_adjdemerits=10000
+\_uchyph=1
+\_defaulthyphenchar=`\-
+\_defaultskewchar=-1
+\_hfuzz=0.1pt
+\_vfuzz=0.1pt
+\_overfullrule=5pt
+\_linepenalty=10 % penalty between lines inside the paragraph
+\_hyphenpenalty=50 % when a word is bro-ken
+\_exhyphenpenalty=50 % when the hyphenmark is used explicitly
+\_binoppenalty=700 % between binary operators in math
+\_relpenalty=500 % between relations in math
+\_brokenpenalty=100 % after lines if they end by a broken word.
+\_displaywidowpenalty=50 % before last line of paragraph if display math follows
+\_predisplaypenalty=10000 % above display math
+\_postdisplaypenalty=0 % below display math
+\_delimiterfactor=901 % parameter for scaling delimiters
+\_delimitershortfall=5pt
+\_nulldelimiterspace=1.2pt
+\_scriptspace=0.5pt
+\_maxdepth=4pt
+\_splitmaxdepth=\_maxdimen
+\_boxmaxdepth=\_maxdimen
+\_parskip=0pt plus 1pt
+\_abovedisplayskip=12pt plus 3pt minus 9pt
+\_abovedisplayshortskip=0pt plus 3pt
+\_belowdisplayskip=12pt plus 3pt minus 9pt
+\_belowdisplayshortskip=7pt plus 3pt minus 4pt
+\_parfillskip=0pt plus 1fil
+\_thinmuskip=3mu
+\_medmuskip=4mu plus 2mu minus 4mu
+\_thickmuskip=5mu plus 5mu
+
+ \_doc -----------------------------
+ Note that `\topskip` and `\splittopskip` are changed when first
+ `\typosize` sets the main values (default font size and default
+ `\baselineskip`).
+ \_cod -----------------------------
+
+\_topskip=10pt % top edge of page-box to first baseline distance
+\_splittopskip=10pt
+
+ \_doc -----------------------------
+ \secc Plain \TeX/ registers
+ Declared registers used in plain \TeX/
+ \_cod -----------------------------
+
+% We also define special registers that function like parameters:
+\_newskip\_smallskipamount \_smallskipamount=3pt plus 1pt minus 1pt
+\_newskip\_medskipamount \_medskipamount=6pt plus 2pt minus 2pt
+\_newskip\_bigskipamount \_bigskipamount=12pt plus 4pt minus 4pt
+\_newskip\_normalbaselineskip \_normalbaselineskip=12pt
+\_newskip\_normallineskip \_normallineskip=1pt
+\_newdimen\_normallineskiplimit \_normallineskiplimit=0pt
+\_newdimen\_jot \_jot=3pt
+\_newcount\_interdisplaylinepenalty \_interdisplaylinepenalty=100
+\_newcount\_interfootnotelinepenalty \_interfootnotelinepenalty=100
+
+\_def\_normalbaselines{\_lineskip=\_normallineskip
+ \_baselineskip=\_normalbaselineskip \_lineskiplimit=\_normallineskiplimit}
+
+\_def\_frenchspacing{\_sfcode`\.=1000 \_sfcode`\?=1000 \_sfcode`\!=1000
+ \_sfcode`\:=1000 \_sfcode`\;=1000 \_sfcode`\,=1000 }
+\_def\_nonfrenchspacing{\_sfcode`\.=3000 \_sfcode`\?=3000 \_sfcode`\!=3000
+ \_sfcode`\:=2000 \_sfcode`\;=1500 \_sfcode`\,=1250 }
+
+\_public \normalbaselines \frenchspacing \nonfrenchspacing
+ \smallskipamount \medskipamount \bigskipamount
+ \normalbaselineskip \normallineskip \normallineskiplimit
+ \jot \interdisplaylinepenalty \interfootnotelinepenalty ;
+
+ \_doc -----------------------------
+ \secc Different settings than in plain \TeX/
+
+ Default \"baseline setting" is for 10\,pt fonts (like in plain \TeX/).
+ But `\typosize` and `\typoscale` macros re-declare it if another font size is used.
+
+ The \`\nonfrenchspacing` is not set by default because
+ the author of \OpTeX/ is living in Europe.
+ If you set `\enlang` hyphenation patterns then `\nonfrenchspacing`
+ is set.
+ \_cod -----------------------------
+
+\_normalbaselines % baseline setting, 10 pt font size
+
+ \_doc -----------------------------
+ Different values than in plain \TeX/ have the following primitive registers.
+ We prohibit orphans, set more information for tracing boxes, set page origin
+ to the upper left corner of the paper (no at 1\,in, 1\,in coordinates)
+ and set default page dimensions as A4, no letter.
+ \_cod -----------------------------
+
+\_emergencystretch=20pt % we want to use third pass of paragraph building algoritmh
+ % we need not keep the compatibility with old documents
+
+\_clubpenalty=10000 % after first line of paragraph
+\_widowpenalty=10000 % before last line of paragraph
+
+\_showboxbreadth=150 % for tracing boxes
+\_showboxdepth=7
+\_errorcontextlines=15
+\_tracinglostchars=2 % missing chracter warnings on terminal too
+
+\_outputmode=1 % PDF ouput
+\_pdfvorigin=0pt % orgin is exatly at left upper corner
+\_pdfhorigin=0pt
+\_hoffset=25mm % margins are 2.5cm, no 1in
+\_voffset=25mm
+\_hsize=160mm % 210mm (from A4 size) - 2*25mm (default margins)
+\_vsize=244mm % 297mm (from A4 size) - 2*25mm (default margins) -3mm baseline correction
+\_pagewidth=210 true mm
+\_pageheight=297 true mm
+
+ \_doc -----------------------------
+ If you insist on plain \TeX/ values of these parameters then you can
+ call the `\plaintexsetting` macro.
+ \_cod -----------------------------
+
+\_def\_plaintexsetting{%
+ \_emergencystretch=0pt
+ \_clubpenalty=150
+ \_widowpenalty=150
+ \_pdfvorigin=1in
+ \_pdfhorigin=1in
+ \_hoffset=0pt
+ \_voffset=0pt
+ \_hsize=6.5in
+ \_vsize=8.9in
+ \_pagewidth=8.5 true in
+ \_pageheight=11 true in
+ \_nonfrenchspacing
+}
+\_public \plaintexsetting ;
+
+ \_doc -----------------------------
+ \secc[oparams] \OpTeX/ parameters
+
+ The main principle of how to configure \OpTeX/ is not to use only parameters.
+ A designer can copy macros from \OpTeX/ and re-define them as required.
+ This is a reason why we don't implement dozens of parameters,
+ but we keep \OpTeX/ macros relatively simple. Example: do you want
+ another design of section titles? Copy macros `\_printsec` and
+ `\_printsecc` from `sections.opm` file to your macro file and re-define them.
+
+ Notice for OPmac users: there is an important difference: all "string-like"
+ parameters are token lists in \OpTeX/ (OPmac uses macros for them). The reason of
+ this difference: if a user sets parameter by unprefixed (public) control sequence,
+ an \OpTeX/ macro can read {\em the same data} using a prefixed (private) control sequence.
+
+ The \`\picdir` tokens list can include a directory where image files
+ (loaded by `\inspic`) are saved. Empty `\picdir` (default value) means
+ that image files are in the current directory (or somewhere in the \TeX/
+ system where \LuaTeX/ can find them). If you set a non-empty value to
+ the `\picdir`, then it must end by `/` character, for example
+ `\picdir={img/}` means that there exists a directory `img` in your
+ current directory and the image files are stored here.
+ \_cod -----------------------------
+
+\_newtoks\_picdir
+\_public \picdir ;
+
+ \_doc -----------------------------
+ You can control the dimensions of included images by
+ the parameters \`\picwidth` (which is equivalent to \`\picw`) and
+ \`\picheight`. By default these parameters are set to zero: the native
+ dimension of the image is used. If only `\picwidth` has a nonzero value,
+ then this is the width of the image (height is calculated automatically in
+ order to respect the aspect of the image). If only `\picheight` has
+ a nonzero value then the height is given, the width is calculated. If both
+ parameters are non-zero, the height and width are given and the aspect
+ ratio of the image is (probably) broken. We recommend setting these
+ parameters locally in the group where \^`\inspic` is used in order to not
+ influence the dimensions of other images. But there exist many
+ situations you need to put the same dimensions to more images,
+ so you can set this parameter only once before more \^`\inspic` macros.
+ \_cod -----------------------------
+
+\_newdimen\_picwidth \_picwidth=0pt \_let\picw=\_picwidth
+\_newdimen\_picheight \_picheight=0pt
+\_public \picwidth \picheight ;
+
+ \_doc -----------------------------
+ The \`\everytt` is the token list used in
+ \^`\begtt`...\^`\endtt` environment and
+ in the verbatim group opened by \^`\verbinput` macro. You can include a
+ code which is processed inside the group after basic settings were done
+ On the other hand, it is processed before the scanner of verbatim text is started.
+ Your macros should influence scanner (catcode settings) or printing
+ process of the verbatim code or both.
+
+ The code from the line immediately after \^`\begtt` is processed after
+ the \^`\everytt`. This code should overwrite \^`\everytt` settings. Use
+ \^`\everytt` for all verbatim environments in your document and use a code
+ after \^`\begtt` locally only for this environment.
+
+ The \`\everyintt` token list does similar work
+ but acts in the in-line verbatim
+ text processed by a pair of \^`\verbchar` characters or by \^`\code``{<text>}`.
+ You can set `\everyintt={\Red}` for example if you want in-line verbatim
+ in red color.
+ \_cod -----------------------------
+
+\_newtoks\_everytt
+\_newtoks\_everyintt
+\_public \everytt \everyintt ;
+
+ \_doc -----------------------------
+ The \`\ttline` is used
+ in \^`\begtt`...\^`\endtt` environment or in the code
+ printed by \^`\verbinput`. If `\ttline` is positive or zero, then the
+ verbatim code has numbered lines from `\ttline+1`. The `\ttline`
+ register is re-set to a new value after a code piece is printed, so next
+ code pieces have numbered lines continuously. If `\ttline=-1`, then
+ \^`\begtt`...\^`\endtt` lines are without numbers and \^`\verbinput` lines
+ show the line numbers of inputted file. If `\ttline`\code{<-1}
+ then no line numbers are printed.
+ \_cod -----------------------------
+
+\_newcount\_ttline \_ttline=-1 % last line number in \begtt...\endtt
+\_public \ttline ;
+
+ \_doc -----------------------------
+ The \`\ttindent` gives default indentation
+ of verbatim lines printed by \^`\begtt`...\^`\endtt` pair or by
+ \^`\verbinput`.
+ \nl
+ The \`\ttshift` gives the amount of shift of all verbatim lines to the right.
+ Despite the \^`\ttindent`, it does not shift the line numbers, only
+ the text.
+ \nl
+ The \`\iindent` gives default indentations used in the table of contents,
+ captions, lists, bib references,
+ \nl
+ It is strongly recommended to re-set this value if you set `\parindent`
+ to another value than plain \TeX/ default 20pt. A well-typeset
+ document should have the same dimension for all indentations, so
+ you should say `\ttindent=\parindent` and `\iindent=\parindent`.
+ \_cod -----------------------------
+
+\_newdimen\_ttindent \_ttindent=\_parindent % indentation in verbatim
+\_newdimen\_ttshift
+\_newdimen\_iindent \_iindent=\_parindent
+\_public \ttindent \ttshift \iindent ;
+
+ \_doc -----------------------------
+ The tabulator `^^I` has its category code like space: it behaves as a
+ space in normal text. This is a common plain \TeX/ setting.
+ But in the multiline verbatim environment it
+ is active and expands to the `\hskip<dimen>` where `<dimen>`
+ is the width of \`\tabspaces` spaces.
+ Default `\tabspaces=3` means
+ that tabulator behaves like three spaces in multiline verbatim.
+ \_cod -----------------------------
+
+\_newcount \_tabspaces \_tabspaces=3
+\_public \tabspaces ;
+
+ \_doc -----------------------------
+ If \`\hicolors` is non-empty then its contents is used instead
+ `\_hicolors<name>` declared in the file `hisyntax-<name>.opm`.
+ The user can give his/her preferences about colors for
+ syntax highlighting by this tokens list.
+ The full color set must be declared here.
+ \_cod -----------------------------
+
+\_newtoks\_hicolors
+\_public \hicolors ;
+
+ \_doc -----------------------------
+ The default item mark used between \^`\begitems` and \^`\enditems` is the bullet.
+ The \`\defaultitem` tokens list declares this default item mark.
+ \nl
+ The \`\everyitem` tokens list is applied in vertical mode
+ at the start of each item.
+ \nl
+ The \`\everylist` tokens list is applied after the group is opened by \^`\begitems`
+ \nl
+ The \`\ilevel` keeps the value of the current nesting level of the items list.
+ \nl
+ The \`\listskipamount` gives vertical skip above and below the items list
+ if `\ilevel=1`.
+ \_cod -----------------------------
+
+\_newtoks\_defaultitem \_defaultitem={$\_bullet$\_enspace}
+\_newtoks\_everyitem
+\_newtoks\_everylist
+\_newskip \_listskipamount \_listskipamount=\_medskipamount
+\_newcount \_ilevel
+\_public \defaultitem \everyitem \everylist \listskipamount \ilevel ;
+
+ \_doc -----------------------------
+ The \^`\tit` macro includes `\vglue`\`\titskip` above the title of the document.
+ \_cod -----------------------------
+
+\_newskip\_titskip \_titskip=40pt \_relax % \vglue above title printed by \tit
+\_public \titskip ;
+
+ \_doc ----------------------------
+ The \^`\begmulti` and \^`\endmulti` pair creates more columns. The parameter
+ \`\colsep` declares the space between columns. If $n$ columns are specified
+ then we have $n-1$ `\colseps` and $n$ columns in total `\hsize`. This
+ gives the definite result of the width of the columns.
+ \_cod ----------------------------
+
+\_newdimen\_colsep \_colsep=20pt % space between columns
+\_public \colsep ;
+
+ \_doc -----------------------------
+ Each line in the Table of contents is printed in a group.
+ The \`\everytocline` tokens list is processed here before
+ the internal `\_tocl:<num>` macro which starts printing the line.
+ \_cod -----------------------------
+
+\_newtoks \_everytocline
+\_public \everytocline ;
+
+ \_doc -----------------------------
+ The \`\bibtexhook` tokens list is used inside the group when `\usebib` command is
+ processed after style file is loaded and before printing bib-entries.
+ You can re-define a behavior of the style file here or you can modify the
+ more declaration for printing (fonts, baselineskip, etc.) or you can
+ define specific macros used in your `.bib` file.
+ \_cod -----------------------------
+
+\_newtoks\_bibtexhook
+\_public \bibtexhook ;
+
+ \_doc -----------------------------
+ \`\everycapitonf` is used before printing caption in figures and
+ \`\everycapitont` is used before printing caption in tables.
+ \_cod -----------------------------
+
+\_newtoks\_everycaptiont \_newtoks\_everycaptionf
+\_public \everycaptiont \everycaptionf ;
+
+ \_doc -----------------------------
+ The \`\everyii` tokens list is used before `\noindent` for each
+ Index item when printing the Index.
+ \_cod -----------------------------
+
+\_newtoks\_everyii
+\_public \everyii ;
+
+ \_doc -----------------------------
+ The \`\everymnote` is used in the \^`\mnote` group before `\noindent` which
+ immediately precedes marginal note text.
+ \nl
+ The \`\mnotesize` is the horizontal size of the marginal notes.
+ \nl
+ The \`\mnoteindent` is horizontal space between body-text and marginal note.
+ \_cod -----------------------------
+
+\_newtoks\_everymnote
+\_newdimen\_mnotesize \_mnotesize=20mm % the width of the mnote paragraph
+\_newdimen\_mnoteindent \_mnoteindent=10pt % ditance between mnote and text
+\_public \everymnote \mnotesize \mnoteindent ;
+
+ \_doc -----------------------------
+ The \^`\table` parameters follow. The \`\thistable` tokens list
+ register should be used for giving an exception for only one `\table`
+ which follows. It should change locally other parameters of the `\table`.
+ It is reset to an empty list after the table is printed.
+ \nl
+ The \`\everytable` tokens list register is applied in every table.
+ There is another difference between these two registers.
+ The `\thistable` is used first, then strut and baselineskip settings are
+ done, then `\everytable` is applied and then the table is printed.
+ \nl
+ \`\tabstrut` configures the height and depth of lines in the table.
+ You can declare `\tabstrut={}`, then normal baselineskip is used in the
+ table. This can be used when you don't use horizontal nor vertical
+ lines in tables.
+ \nl
+ \`\tabiteml` is applied before each item,
+ \`\tabitemr` is applied after each item of the table.
+ \nl
+ \`\tablinespace` is additional vertical space between horizontal rules
+ and the lines of the table.
+ \nl
+ \`\hhkern` gives the space between horizontal lines if they are doubled and
+ \`\vvkern` gives the space between such vertical lines.
+ \nl
+ \`\tabskipl` is `\tabskip` used before first column,
+ \`\tabskipr` is `\tabskip` used after the last column.
+ \nl
+ \`\tsize` is virtual unit of the width of paragraph-like table items when
+ `\table pxto<size>` is used.
+ \_cod -----------------------------
+
+\_newtoks\_everytable \_newtoks\_thistable
+\_newtoks\_tabiteml \_newtoks\_tabitemr \_newtoks\_tabstrut
+\_newdimen\_tablinespace \_newdimen\_vvkern \_newdimen\_hhkern \_newdimen\_tsize
+\_newskip\_tabskipl \_newskip\_tabskipr
+\_everytable={} % code used after settings in \vbox before table processing
+\_thistable={} % code used when \vbox starts, is is removed after using it
+\_tabstrut={\_strut}
+\_tabiteml={\_enspace} % left material in each column
+\_tabitemr={\_enspace} % right material in each column
+\_tablinespace=2pt % additional vertical space before/after horizontal rules
+\_vvkern=1pt % space between double vertical line and used in \frame
+\_hhkern=1pt % space between double horizontal line and used in \frame
+\_tabskipl=0pt\_relax % \tabskip used before first column
+\_tabskipr=0pt\_relax % \tabskip used after the last column
+\_public \everytable \thistable \tabiteml \tabitemr \tabstrut \tablinespace
+ \vvkern \hhkern \tsize \tabskipl \tabskipr ;
+
+ \_doc -----------------------------
+ The \^`\eqalign` macro can be configured by \`\eqlines` and \`\eqstyle`
+ tokens lists. The default values are set in order these macro beahaves
+ as in Plain \TeX. The \`\eqspace` is horizontal space put
+ between equation systems if more columns in \^`\eqalign` are used.
+ \_cod -----------------------------
+
+\_newtoks \_eqlines \_eqlines={\_openup\_jot}
+\_newtoks \_eqstyle \_eqstyle={\_strut\_displaystyle}
+\_newdimen \_eqspace \_eqspace=20pt
+\_public \eqlines \eqstyle \eqspace ;
+
+ \_doc -----------------------------
+ \`\lmfil` is \"left matrix filler" (for `\matrix` columns). The default
+ value does centering because the right matrix filler is directly set to `\hfil`.
+ \_cod -----------------------------
+
+\_newtoks \_lmfil \_lmfil={\_hfil}
+\_public \lmfil ;
+
+ \_doc -----------------------------
+ The output routine uses token list \`\headline` and \`\footline` in the
+ same sense as in plain \TeX/. If they are non-empty then `\hfil` or `\hss`
+ must be here because they are used inside `\hbox to\hsize`.
+
+ Assume that page-body text can be typeset in different sizes and
+ different fonts and we don't know in what font context the output routine
+ is invoked. So, it is strongly recommended to declare fixed variants of
+ fonts at the beginning of your document. For example `\fontdef\rmfixed{\rm}`,
+ `\fontdef\itfixed{\it}`. Then use them in headline and footline:
+ \begtt
+ \headline={\itfixed Text of headline, section: \fistmark \hss}
+ \footline={\rmfixed \ifodd\pageno \hfill\fi \folio \hfil}
+ \endtt
+ \_cod -----------------------------
+
+\_newtoks\_headline \_headline={}
+\_newtoks\_footline \_footline={\_hss\_rmfixed \_folio \_hss}
+\_public \headline \footline ;
+
+ \_doc -----------------------------
+ The distance between the `\headline` and the top of the page text
+ is controlled by the \`\headlinedist` register.
+ The distance between the bottom of
+ page-text and `\footline` is \`\footlinedist`.
+ More precisely: baseline of
+ headline and baseline of the first line in page-text have distance
+ `\headlinedist+\topskip`. The baseline of the last line in page-text and
+ the baseline of the footline have distance `\footlinedist`.
+ Default values are inspired by plain \TeX/.
+ \_cod -----------------------------
+
+\_newdimen \_headlinedist \_headlinedist=14pt
+\_newdimen \_footlinedist \_footlinedist=24pt
+\_public \headlinedist \footlinedist ;
+
+ \_doc -----------------------------
+ The \`\pgbottomskip` is inserted to the page bottom
+ in the output routine. You can set less tolerance here than
+ `\raggedbotom` does. By default, no tolerance is given.
+ \_cod -----------------------------
+
+\_newskip \_pgbottomskip \_pgbottomskip=0pt \_relax
+\_public \pgbottomskip ;
+
+ \_doc -----------------------------
+ The \`\nextpages` tokens list can include settings which will be used at
+ next pages. It is processed at the end of output routine with
+ `\globaldefs=1` prefix. The `\nextpages` is reset to empty after
+ processing. Example of usage:
+ \begtt
+ \headline={} \nexptages={\headline={\rmfixed \firstmark \hfil}}
+ \endtt
+ This example sets current page with empty headline, but next pages have
+ non-empty headlines.
+ \_cod -----------------------------
+
+\_newtoks \_nextpages
+\_public \nextpages ;
+
+ \_doc -----------------------------
+ The \`\pgbackground` token list can include macros which generate a
+ vertical list. It is used as page background. The top-left corner of such
+ `\vbox` is at the top-left corner of the paper. Example creates the
+ background of all pages yellow:
+ \begtt
+ \pgbackground={\Yellow \hrule height 0pt depth\pdfpageheight width\pdfpagewidth}
+ \endtt
+ \_cod -----------------------------
+
+\_newtoks \_pgbackground \_pgbackground={} % for page background
+\_public \pgbackground ;
+
+ \_doc -----------------------------
+ The parameters used in \^`\inoval` and \^`\incircle` macros
+ can be re-set by \`\ovalparams`, \`\circleparams` tokens lists.
+ The default values (documented in the user manual) are set in the macros.
+ \_cod -----------------------------
+
+\_newtoks \_ovalparams
+\_newtoks \_circleparams
+%\_ovalparams={\_roundness=2pt \_fcolor=\Yellow \_lcolor=\Red \_lwidth=.5bp
+% \_shadow=N \_overlapmargins=N \_hhkern=0pt \_vvkern=0pt }
+%\_circleparams={\_ratio=1 \_fcolor=\Yellow \_lcolor=\Red \_lwidth=.5bp
+% \_shadow=N \_overlapmargins=N \_hhkern=3pt \_vvkern=3pt}
+
+\_newdimen \_roundness \_roundness=5mm % used in \clippingoval macro
+
+\_public \ovalparams \circleparams \roundness ;
+
+ \_doc -----------------------------
+ \OpTeX/ defines \"Standard \OpTeX/ markup language"%
+ \fnote{Will be developed in 2021.}
+ which lists selected commands from chapter~1 and gives their behavior when a
+ converter from \OpTeX/ document to HTML or Markdown or \LaTeX/ is used.
+ The structure-oriented commands are selected here, but the commands which
+ declare typographical appearance (page layout, dimensions, selected font
+ family) are omitted. More information for such a converter should be
+ given in \`\cnvinfo``{<data>}`.
+ \OpTeX/ simply ignores this but the converter can read its configuration
+ from here. For example, a user can write:
+ \begtt \catcode`\<=13
+ \cnvinfo {type=html, <cnv-to-html-data>}
+ \cnvinfo {type=markdown, <cnv-to-markdown-data>}
+ \endtt
+ and the document can be processed by \OpTeX/ to create PDF, or by a
+ converter to create HTML, or by another converter to create Markdown.
+ \_cod -----------------------------
+
+\_let\cnvinfo=\_ignoreit
+
+
+\_endcode %----------------------------------------------------
+
+The behavior of document processing by \OpTeX/ is
+controlled by {\em parameters}. The parameters are
+\begitems
+* primitive registers used in build-in algorithms of \TeX/,
+* registers declared and used by \OpTeX/ macros.
+\enditems
+Both groups of registers have their type: number, dimension, skip, token
+list.
+
+The registers are represented by their names (control sequences). If the user
+re-defines this control sequence then the appropriate register exists
+steadily and build-in algorithms are using it without change. But user
+cannot access its value in this case. \OpTeX/ declares two control sequences
+for each register: prefixed (private) and unprefixed (public). \OpTeX/ macros use only
+prefixed variants of control sequences. The user should use the unprefixed variant
+with the same meaning and set or read the values of registers using the
+unprefixed variant. If the user re-defines the unprefixed control sequence of
+a register then \OpTeX/ macros still work without change.
+
+%There are only a few parameters declared by \OpTeX/ macros. All of them
+%are listed in this section. This is the desired feature of the \OpTeX/.
+%If you want to do more
+%changes which cannot be controlled by parameters listed here then you
+%can copy the appropriate \OpTeX/ macro to your macro file and you
+%can completely re-define it. The typical examples are `\_printsomething`
+%macros which declare the design of the document.
+
+\_endinput
+
+History:
+2020-04-04 ... \tabspaces added
+2020-04-03 ... \hicolors added
diff --git a/macros/optex/base/pdfuni-string.opm b/macros/optex/base/pdfuni-string.opm
new file mode 100644
index 0000000000..25781ddfb4
--- /dev/null
+++ b/macros/optex/base/pdfuni-string.opm
@@ -0,0 +1,127 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \pdfunidef {PDFunicode strings for outlines <2021-02-08>} % preloaded in format
+
+ \_doc -----------------------------
+ \`\_hexprint` is a command defined in Lua, that scans a number and expands
+ to its UTF-16 Big Endian encoded form for use in PDF hexadecimal strings.
+ \_cod -----------------------------
+
+\bgroup
+\_catcode`\%=12
+\_gdef\_hexprint{\_directlua{
+ local num = token.scan_int()
+ if num < 0x10000 then
+ tex.print(string.format("%04X", num))
+ else
+ num = num - 0x10000
+ local high = bit32.rshift(num, 10) + 0xD800
+ local low = bit32.band(num, 0x3FF) + 0xDC00
+ tex.print(string.format("%04X%04X", high, low))
+ end
+}}
+\egroup
+
+ \_doc -----------------------------
+ \`\pdfunidef``\macro{<text>}` does more things than only converting to hexadecimal PDF string.
+ The <text> can be scanned in verbatim mode (it is true becuase \^`\_Xtoc`
+ reads the <text> in verbatim mode). First `\edef` do
+ `\_scantextokens\unexpanded` and second `\edef` expands the parameter
+ according to current values on selected macros from `\_regoul`. Then
+ \`\_removeoutmath` converts `..$x^2$..` to `..x^2..`, i.e removes dollars.
+ Then \`\_removeoutbraces` converts `..{x}..` to `..x..`.
+ Finally, the <text> is detokenized, spaces are preprocessed using \^`\replstring`
+ and then the \`\_pdfunidefB` is repeated on each character. It calls the
+ `\directlua` chunk to print hexadecimal numbers in the macro \^`\_hexprint`.\nl
+ Characters for quotes (and separators for quotes) are activated by first
+ `\_scatextokens` and they are defined as the same non-active characters.
+ But `\_regoul` can change this definition.
+ \_cod -----------------------------
+
+\_def\_pdfunidef#1#2{%
+ \_begingroup
+ \_catcodetable\_optexcatcodes \_adef"{"}\_adef'{'}%
+ \_the\_regoul \_relax % \_regmacro alternatives of logos etc.
+ \_ifx\_savedttchar\_undefined \_def#1{\_scantextokens{\_unexpanded{#2}}}%
+ \_else \_lccode`\;=\_savedttchar \_lowercase{\_prepinverb#1;}{#2}\fi
+ \_edef#1{#1}%
+ \_escapechar=-1
+ \_edef#1{#1\_empty}%
+ \_escapechar=`\\
+ \_ea\_edef \_ea#1\_ea{\_ea\_removeoutmath #1$\_end$}% $x$ -> x
+ \_ea\_edef \_ea#1\_ea{\_ea\_removeoutbraces #1{\_end}}% {x} -> x
+ \_edef#1{\_detokenize\_ea{#1}}%
+ \_replstring#1{ }{{ }}% text text -> text{ }text
+ \_catcode`\\=12 \_let\\=\_bslash
+ \_edef\_out{<FEFF}
+ \_ea\_pdfunidefB#1^% text -> \_out in octal
+ \_ea
+ \_endgroup
+ \_ea\_def\_ea#1\_ea{\_out>}
+}
+\_def\_pdfunidefB#1{%
+ \_ifx^#1\_else
+ \_edef\_out{\_out \_hexprint `#1}
+ \_ea\_pdfunidefB \_fi
+}
+
+\_def\_removeoutbraces #1#{#1\_removeoutbracesA}
+\_def\_removeoutbracesA #1{\_ifx\_end#1\_else #1\_ea\_removeoutbraces\_fi}
+\_def\_removeoutmath #1$#2${#1\_ifx\_end#2\_else #2\_ea\_removeoutmath\_fi}
+
+ \_doc -----------------------------
+ The \`\_prepinverb``<macro><separator>{<text>}`,
+ e.g.\ `\_prepinverb\tmpb|{aaa |bbb| cccc |dd| ee}`
+ does `\def\tmpb{<su>{aaa }bbb<su>{ cccc }dd<su>{ ee}}` where
+ <su> is `\scantextokens\unexpanded`. It means that in-line verbatim
+ are not argument of `\scantextoken`. First `\edef\tmpb` tokenizes again
+ the <text> but not the parts which were in the the in-line verbatim.
+ \_cod -----------------------------
+
+\_def\_prepinverb#1#2#3{\_def#1{}%
+ \_def\_dotmpb ##1#2##2{\_addto#1{\_scantextokens{\_unexpanded{##1}}}%
+ \_ifx\_end##2\_else\_ea\_dotmpbA\_ea##2\_fi}%
+ \_def\_dotmpbA ##1#2{\_addto#1{##1}\_dotmpb}%
+ \_dotmpb#3#2\_end
+}
+
+ \_doc -----------------------------
+ The \^`\regmacro` is used in order to sed the values of macros
+ `\em`, `\rm`, `\bf`, `\it`, `\bi`, `\tt`, `\/` and `~` to values usable in
+ PDF outlines.
+ \_cod -----------------------------
+
+\_regmacro {}{}{\_let\em=\_empty \_let\rm=\_empty \_let\bf=\_empty
+ \_let\it=\_empty \_let\bi=\_empty \_let\tt=\_empty \_let\/=\_empty
+ \_let~=\_space
+}
+\public \pdfunidef ;
+
+\_endcode % --------------------------------
+
+There are only two encodings for PDF strings (used in PDFoutlines, PDFinfo,
+etc.). The first one is PDFDocEncoding which is single-byte encoding, but it
+misses most international characters.
+
+The second encoding is Big Endian UTF-16 which is implemented in this file. It
+encodes a single character in either two or four bytes.
+This encoding is \TeX/-discomfortable because it looks like
+
+\begtt
+<FEFF 0043 0076 0069 010D 0065 006E 00ED 0020 006A 0065 0020 007A 00E1 0074
+011B 017E 0020 0061 0020 0078 2208 D835DD44>
+\endtt
+
+This example shows a hexadecimal PDF string (enclosed in \code{<>} as opposed
+to the literal PDF string enclosed in `()`). In these strings each byte is
+represented by two hexadecimal characters (`0-9`, `A-F`). You can tell the
+encoding is UTF-16BE, becuase it starts with \"Byte order mark" `FEFF`. Each
+unicode character is then encoded in one or two byte pairs. The example string
+corresponds to the text \"Cvičení je zátěž a ${\rm x} ∈ 𝕄$". Notice the 4 bytes
+for the last character, $𝕄$. (Even the whitespace would be OK in a PDF file,
+because it should be ignored by PDF viewers, but \LuaTeX\ doesn't allow it.)
+
+\_endinput
+
+2021-02-08 \_octalprint -> \_hexprint
+2020-03-12 Released
diff --git a/macros/optex/base/plain-macros.opm b/macros/optex/base/plain-macros.opm
new file mode 100644
index 0000000000..b4569ee969
--- /dev/null
+++ b/macros/optex/base/plain-macros.opm
@@ -0,0 +1,346 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \magstep {Macros from plain TeX <2020-02-14>} % preloaded in format
+
+ \_doc -----------------------------
+ The \`\dospecials` works like in plain TeX but does nothing with `_`.
+ If you need to do the same with this character, you can re-define:
+ \begtt
+ \addto \dospecials{\do\_}
+ \endtt
+ \_cod -----------------------------
+
+\_def\_dospecials {\do\ \do\\\do\{\do\}\do\$\do\&%
+ \do\#\do\^\do\^^K\do\^^A\do\%\do\~}
+\_chardef\_active = 13
+
+\_public \dospecials \active ;
+
+ \_doc -----------------------------
+ The shortcuts `\chardef\@one` is not defined in \OpTeX/. Use normal
+ numbers instead of such obscurities.
+ \nl
+ The \`\magstep` and \`\magstephalf` are
+ defined with `\space`, (no `\relax`), in order to be expandable.
+ \_cod -----------------------------
+
+\_def \_magstephalf{1095 }
+\_def \_magstep#1{\_ifcase#1 1000\_or 1200\_or 1440\_or 1728\_or 2074\_or 2488\_fi\_space}
+\_public \magstephalf \magstep ;
+
+ \_doc -----------------------------
+ Plain \TeX/ basic macros and control sequences.
+ \`\endgraf`, \`\endline`.
+ The `^^L` is not defined in \OpTeX/ because it is obsolete.
+ \_cod -----------------------------
+
+\_def\^^M{\ } % control <return> = control <space>
+\_def\^^I{\ } % same for <tab>
+
+\_def\lq{`} \def\rq{'}
+\_def\lbrack{[} \_def\rbrack{]} % They are only public versions.
+% \catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par" % obsolete
+
+\_let\_endgraf=\_par \_let\_endline=\_cr
+\_public \endgraf \endline ;
+
+ \_doc -----------------------------
+ Plain \TeX/ classical \`\obeylines` and \`\obeyspaces`.
+ \_cod -----------------------------
+
+% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}'
+% since this allows, for example, `\let\par=\cr \obeylines \halign{...'
+{\_catcode`\^^M=13 % these lines must end with %
+ \_gdef\_obeylines{\_catcode`\^^M=13\_let^^M\_par}%
+ \_global\_let^^M=\par} % this is in case ^^M appears in a \write
+\_def\_obeyspaces{\_catcode`\ =13 }
+{\_obeyspaces\_global\_let =\_space}
+\_public \obeylines \obeyspaces ;
+
+ \_doc -----------------------------
+ Spaces.
+ \`\thinspace`, \`\negthinspace`, \`\enspace`, \`\enskip`,
+ \`\quad`, \`\qquad`, \`\smallskip`,
+ \`\medskip`, \`\bigskip`, \`\nointerlineskip`, \`\offinterlineskip`,
+ \`\topglue`, \`\vglue`, \`\hglue`, \`\slash`.
+ \_cod -----------------------------
+
+\_protected\_def\_thinspace {\_kern .16667em }
+\_protected\_def\_negthinspace {\_kern-.16667em }
+\_protected\_def\_enspace {\_kern.5em }
+\_protected\_def\_enskip {\_hskip.5em\_relax}
+\_protected\_def\_quad {\_hskip1em\_relax}
+\_protected\_def\_qquad {\_hskip2em\_relax}
+\_protected\_def\_smallskip {\_vskip\_smallskipamount}
+\_protected\_def\_medskip {\_vskip\_medskipamount}
+\_protected\_def\_bigskip {\_vskip\_bigskipamount}
+\_def\_nointerlineskip {\_prevdepth=-1000pt }
+\_def\_offinterlineskip {\_baselineskip=-1000pt \_lineskip=0pt \_lineskiplimit=\_maxdimen}
+
+\_public \thinspace \negthinspace \enspace \enskip \quad \qquad \smallskip
+ \medskip \bigskip \nointerlineskip \offinterlineskip ;
+
+\_def\_topglue {\_nointerlineskip\_vglue-\_topskip\_vglue} % for top of page
+\_def\_vglue {\_afterassignment\_vglA \_skip0=}
+\_def\_vglA {\_par \_dimen0=\_prevdepth \_hrule height0pt
+ \_nobreak\_vskip\_skip0 \_prevdepth=\_dimen0 }
+\_def\_hglue {\_afterassignment\_hglA \_skip0=}
+\_def\_hglA {\_leavevmode \_count255=\_spacefactor \_vrule width0pt
+ \_nobreak\_hskip\_skip0 \_spacefactor=\_count255 }
+\_protected\_def~{\_penalty10000 \ } % tie
+\_protected\_def\_slash {/\_penalty\_exhyphenpenalty} % a `/' that acts like a `-'
+
+\_public \topglue \vglue \hglue \slash ;
+
+ \_doc -----------------------------
+ Penalties macros:
+ \`\break`, \`\nobreak`, \`\allowbreak`, \`\filbreak`, \`\goodbreak`,
+ \`\eject`, \`\supereject`, \`\dosupereject`,
+ \`\removelastskip`, \`\smallbreak`, \`\medbreak`, \`\bigbreak`.
+ \_cod -----------------------------
+
+\_protected\_def \_break {\_penalty-10000 }
+\_protected\_def \_nobreak {\_penalty10000 }
+\_protected\_def \_allowbreak {\_penalty0 }
+\_protected\_def \_filbreak {\_par\_vfil\_penalty-200\_vfilneg}
+\_protected\_def \_goodbreak {\_par\_penalty-500 }
+\_protected\_def \_eject {\_par\_break}
+\_protected\_def \_supereject {\_par\_penalty-20000 }
+\_protected\_def \_dosupereject {\_ifnum \_insertpenalties>0 % something is being held over
+ \_line{}\_kern-\_topskip \_nobreak \_vfill \_supereject \_fi}
+\_def \_removelastskip {\_ifdim\_lastskip=\_zo \_else \_vskip-\_lastskip \_fi}
+\_def \_smallbreak {\_par\_ifdim\_lastskip<\_smallskipamount
+ \_removelastskip \_penalty-50 \_smallskip \_fi}
+\_def \_medbreak {\_par\_ifdim\_lastskip<\_medskipamount
+ \_removelastskip \_penalty-100 \_medskip \_fi}
+\_def \_bigbreak {\_par\_ifdim\_lastskip<\_bigskipamount
+ \_removelastskip \_penalty-200 \_bigskip \_fi}
+
+\_public \break \nobreak \allowbreak \filbreak \goodbreak \eject \supereject \dosupereject
+ \removelastskip \smallbreak \medbreak \bigbreak ;
+
+ \_doc -----------------------------
+ Boxes.
+ \`\line`, \`\leftline`, \`\rightline`, \`\centerline`, \`\rlap`, \`\llap`,
+ \`\underbar`.
+ \_cod -----------------------------
+
+\_def \_line {\_hbox to\_hsize}
+\_def \_leftline #1{\_line{#1\_hss}}
+\_def \_rightline #1{\_line{\_hss#1}}
+\_def \_centerline #1{\_line{\_hss#1\_hss}}
+\_def \_rlap #1{\_hbox to\_zo{#1\_hss}}
+\_def \_llap #1{\_hbox to\_zo{\_hss#1}}
+\_def\_underbar #1{$\_setbox0=\_hbox{#1}\_dp0=\_zo \_math \_underline{\_box0}$}
+
+\_public \line \leftline \rightline \centerline \rlap \llap \underbar ;
+
+ \_doc -----------------------------
+ The \`\strutbox` is declared as 10pt size dependent (like in plain \TeX), but
+ the macro `\_setbaselineskip` (from `fonts-opmac.opm`) redefines it.
+ \_cod -----------------------------
+
+\_newbox\_strutbox
+\_setbox\_strutbox=\_hbox{\_vrule height8.5pt depth3.5pt width0pt}
+\_def \_strut {\_relax\_ifmmode\_copy\_strutbox\_else\_unhcopy\_strutbox\_fi}
+
+\_public \strutbox \strut ;
+
+ \_doc -----------------------------
+ Alignment. \`\hidewidth` \`\ialign` \`\multispan`.
+ \_cod -----------------------------
+
+\_def \_hidewidth {\_hskip\_hideskip} % for alignment entries that can stick out
+\_def \_ialign{\_everycr={}\_tabskip=\_zoskip \_halign} % initialized \halign
+\_newcount\_mscount
+\_def \_multispan #1{\_omit \_mscount=#1\_relax
+ \_loop \_ifnum\_mscount>1 \_spanA \_repeat}
+\_def \_spanA {\_span\_omit \_advance\_mscount by-1 }
+
+\_public \hidewidth \ialign \multispan ;
+
+ \_doc -----------------------------
+ Tabbing macros are omitted because they are obsolete.
+ \nl
+ Indentation and others. \`\textindent`, \`\item`, \`\itemitem`,
+ \`\narrower`, \`\raggedright`, \`\ttraggedright`, \`\leavevmode`.
+ \_cod -----------------------------
+
+\_def \_hang {\_hangindent\_parindent}
+\_def \_textindent #1{\_indent\_llap{#1\_enspace}\_ignorespaces}
+\_def \_item {\_par\_hang\_textindent}
+\_def \_itemitem {\_par\_indent \_hangindent2\_parindent \_textindent}
+\_def \_narrower {\_advance\_leftskip\_parindent
+ \_advance\_rightskip\_parindent}
+\_def \_raggedright {\_rightskip=0pt plus2em
+ \_spaceskip=.3333em \_xspaceskip=.5em\_relax}
+\_def \_ttraggedright {\_tt \_rightskip=0pt plus2em\_relax} % for use with \tt only
+\_def \_leavevmode {\_unhbox\_voidbox} % begins a paragraph, if necessary
+
+\_public \hang \textindent \item \itemitem \narrower \raggedright \ttraggedright \leavevmode ;
+
+ \_doc -----------------------------
+ Few character codes are set for backward compatibility. But old obscurities
+ (from plain TeX) based on \`\mathhexbox`
+ are not supported -- an error message and recommendation
+ to directly using the desired character is implemented by the
+ \`\_usedirectly` macro).
+ The user can re-define these control sequences of course.
+ \_cod -----------------------------
+
+%\chardef\%=`\%
+\_let\% = \_pcent % more natural, can be used in lua codes.
+\_chardef\&=`\&
+\_chardef\#=`\#
+\_chardef\$=`\$
+\_chardef\ss="FF
+\_chardef\ae="E6
+\_chardef\oe="F7
+\_chardef\o="F8
+\_chardef\AE="C6
+\_chardef\OE="D7
+\_chardef\O="D8
+\_chardef\i="11 \chardef\j="12 % dotless letters
+\_chardef\aa="E5
+\_chardef\AA="C5
+\_chardef\S="9F
+\_def\l{\_errmessage{\_usedirectly ł}}
+\_def\L{\_errmessage{\_usedirectly Ł}}
+%\def\_{\_ifmmode \kern.06em \vbox{\hrule width.3em}\else _\fi} % obsolete
+\_def\_{\_hbox{_}}
+\_def\dag{\_errmessage{\_usedirectly †}}
+\_def\ddag{\_errmessage{\_usedirectly ‡}}
+%\_def\copyright{\_errmessage{\_usedirectly ©}}
+\_def\copyright{©} % << example, what to do
+%\_def\Orb{\_mathhexbox20D} % obsolete (part of Copyright)
+%\_def\P{\_mathhexbox27B} % obsolete
+
+\_def \_usedirectly #1{Load Unicoded font by \string\fontfam\space and use directly #1}
+\_def \_mathhexbox #1#2#3{\_leavevmode \_hbox{$\_math \_mathchar"#1#2#3$}}
+\_public \mathhexbox ;
+
+ \_doc -----------------------------
+ Accents.
+ The macros \`\ooalign`, \`\d`, \`\b`, \`\c`, \`\dots`,
+ are defined for backward compatibility.
+ \_cod -----------------------------
+
+\_def \_oalign #1{\_leavevmode\_vtop{\_baselineskip=\_zo \_lineskip=.25ex
+ \_ialign{##\_crcr#1\_crcr}}}
+\_def \_oalignA {\_lineskiplimit=\_zo \_oalign}
+\_def \_ooalign {\_lineskiplimit=-\_maxdimen \_oalign} % chars over each other
+\_def \_shiftx #1{\_dimen0=#1\_kern\_ea\_ignorept \_the\_fontdimen1\_font
+ \_dimen0 } % kern by #1 times the current slant
+\_def \_d #1{{\_oalignA{\_relax#1\_crcr\_hidewidth\_shiftx{-1ex}.\_hidewidth}}}
+\_def \_b #1{{\_oalignA{\_relax#1\_crcr\_hidewidth\_shiftx{-3ex}%
+ \_vbox to.2ex{\_hbox{\_char\_macron}\_vss}\_hidewidth}}}
+\_def \_c #1{{\_setbox0=\_hbox{#1}\_ifdim\_ht0=1ex\_accent\_cedilla #1%
+ \_else\_ooalign{\_unhbox0\_crcr\_hidewidth\_cedilla\_hidewidth}\_fi}}
+\_def\_dots{\_relax\_ifmmode\_ldots\_else$\_math\_ldots\_thinsk$\_fi}
+\_public \oalign \ooalign \d \b \c \dots ;
+
+ \_doc -----------------------------
+ The accent commands like `\v`, `\.`, `\H`, etc. are not defined. Use the
+ accented characters directly -- it is the best solution. But you can use the
+ macro \`\oldaccents` which defines accented macros.
+ \nl
+ Much more usable is to define these control sequences for other purposes.
+ \_cod -----------------------------
+
+\_def \_oldaccents {%
+ \_def\`##1{{\_accent\_tgrave ##1}}%
+ \_def\'##1{{\_accent\_tacute ##1}}%
+ \_def\v##1{{\_accent\_caron ##1}}%
+ \_def\u##1{{\_accent\_tbreve ##1}}%
+ \_def\=##1{{\_accent\_macron ##1}}%
+ \_def\^##1{{\_accent\_circumflex ##1}}%
+ \_def\.##1{{\_accent\_dotaccent ##1}}%
+ \_def\H##1{{\_accent\_hungarumlaut ##1}}%
+ \_def\~##1{{\_accent\_ttilde ##1}}%
+ \_def\"##1{{\_accent\_dieresis ##1}}%
+ \_def\r##1{{\_accent\_ring ##1}}%
+}
+\_public \oldaccents ;
+
+% ec-lmr encoding (will be changed after \fontfam macro):
+\_chardef\_tgrave=0
+\_chardef\_tacute=1
+\_chardef\_circumflex=2
+\_chardef\_ttilde=3
+\_chardef\_dieresis=4
+\_chardef\_hungarumlaut=5
+\_chardef\_ring=6
+\_chardef\_caron=7
+\_chardef\_tbreve=8
+\_chardef\_macron=9
+\_chardef\_dotaccent=10
+\_chardef\_cedilla=11
+
+\_def \_uniaccents {% accents with Unicode
+ \_chardef\_tgrave="0060
+ \_chardef\_tacute="00B4
+ \_chardef\_circumflex="005E
+ \_chardef\_ttilde="02DC
+ \_chardef\_dieresis="00A8
+ \_chardef\_hungarumlaut="02DD
+ \_chardef\_ring="02DA
+ \_chardef\_caron="02C7
+ \_chardef\_tbreve="02D8
+ \_chardef\_macron="00AF
+ \_chardef\_dotaccent="02D9
+ \_chardef\_cedilla="00B8
+ \_chardef\_ogonek="02DB
+ \_let \_uniaccents=\_relax
+}
+
+ \_doc -----------------------------
+ The plain \TeX/ macros
+ \`\hrulefill`, \`\dotfill`, \`\rightarrowfill`, \`\leftarrowfill`,
+ \`\downbracefill`, \`\upbracefill`.
+ The last four are used in non-Unicode variants of `\overrightarrow`,
+ `\overleftarrow`, `\overbrace` and `\underbrace` macros, see
+ section~\ref[math-macros].
+ \_cod -----------------------------
+
+\_def \_hrulefill {\_leaders\_hrule\_hfill}
+\_def \_dotfill {\_cleaders\_hbox{$\_math \_mkern1.5mu.\_mkern1.5mu$}\_hfill}
+\_def \_rightarrowfill {$\_math\_smash-\_mkern-7mu%
+ \_cleaders\_hbox{$\_mkern-2mu\_smash-\_mkern-2mu$}\_hfill
+ \_mkern-7mu\_mathord\_rightarrow$}
+\_def \_leftarrowfill {$\_math\_mathord\_leftarrow\_mkern-7mu%
+ \_cleaders\_hbox{$\_mkern-2mu\_smash-\_mkern-2mu$}\_hfill
+ \_mkern-7mu\_smash-$}
+
+\_mathchardef \_braceld="37A \_mathchardef \_bracerd="37B
+\_mathchardef \_bracelu="37C \_mathchardef \_braceru="37D
+\_def \_downbracefill {$\_math \_setbox0=\_hbox{$\_braceld$}%
+ \_braceld \_leaders\_vrule height\_ht0 depth\_zo \_hfill \_braceru
+ \_bracelu \_leaders\_vrule height\_ht0 depth\_zo \_hfill \_bracerd$}
+\_def \_upbracefill {$\_math \_setbox0=\_hbox{$\_braceld$}%
+ \_bracelu \_leaders\_vrule height\_ht0 depth\_zo \_hfill \_bracerd
+ \_braceld \_leaders\_vrule height\_ht0 depth\_zo \_hfill \_braceru$}
+
+\_public \hrulefill \dotfill
+ \rightarrowfill \leftarrowfill \downbracefill \upbracefill ;
+
+ \_doc -----------------------------
+ The last part of plain \TeX/ macros: \`\magnification`, \`\bye`.
+ Note that math macros are defined in the `math-macros.opm` file
+ (section~\ref[math-macros]).
+ \_cod -----------------------------
+
+\_def \_magnification {\_afterassignment \_magA \_count255 }
+\_def \_magA {\_mag=\_count255 \_truedimen\_hsize \_truedimen\_vsize
+ \_dimen\_footins=8truein
+}
+% only for backward compatibility, but \margins macro is preferred.
+\_public \magnification ;
+
+\_def \_showhyphens #1{\_setbox0=\_vbox{\_parfillskip=0pt \_hsize=\_maxdimen \_tenrm
+ \_pretolerance=-1 \tolerance=-1 \hbadness=0 \showboxdepth=0 \ #1}}
+
+\_def \_bye {\_par \_vfill \_supereject \_byehook \_end}
+\_public \bye ;
+
+\_endcode % -------------------------------------
+
diff --git a/macros/optex/base/prefixed.opm b/macros/optex/base/prefixed.opm
new file mode 100644
index 0000000000..61df791ddb
--- /dev/null
+++ b/macros/optex/base/prefixed.opm
@@ -0,0 +1,298 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \public {Prefixing and code syntax <2020-02-14>} % preloaded in format
+
+ \_doc ---------
+ All \TeX/ primitives have alternative control sequence `\_hbox` `\_string`, ...
+ \_cod ---------
+
+\let\_directlua = \directlua
+\_directlua {
+ % enable all TeX primitives with _ prefix
+ tex.enableprimitives('_', tex.extraprimitives('tex'))
+ % enable all primitives without prefixing
+ tex.enableprimitives('', tex.extraprimitives())
+ % enable all primitives with _ prefix
+ tex.enableprimitives('_', tex.extraprimitives())
+}
+
+ \_doc ------------------
+ \`\ea` is useful shortcut for `\expandafter`. We recommend to use always the
+ private form of \`\_ea`
+ because there is high probability that `\ea` will be redefined by the user.
+ \nl
+ \`\public` `<sequence> <sequence> ... ;` does
+ `\let \<sequence> = \_<sequence>` for all sequences.
+ \nl
+ \`\private` `<sequence> <sequence> ...;` does
+ `\let \_<sequence> = \<sequence>` for all sequences.
+ \nl
+ \`\xargs` `<what> <sequence> <sequence> ... ;`
+ does `<what><sequence>` for each sequences.
+ \_cod -----------------
+
+\_let\_ea =\_expandafter % usefull shortcut
+
+\_long\_def \_xargs #1#2{\_ifx #2;\_else \_ea#1\_ea#2\_ea\_xargs \_ea #1\_fi}
+
+\_def \_pkglabel{}
+\_def \_public {\_xargs \_publicA}
+\_def \_publicA #1{\_ea\_let \_ea#1\_csname _\_csstring #1\_endcsname}
+
+\_def \_private {\_xargs \_privateA}
+\_def \_privateA #1{\_ea\_let \_csname _\_csstring #1\_endcsname =#1}
+
+\_public \public \private \xargs \ea ;
+
+ \_doc -----------------------
+ Each macro file should begin with \`\_codedecl` `\macro {<info>}`.
+ If the `\macro` is defined already then the `\endpinput` protects to read
+ such file more than once. Else the <info> is printed to the terminal
+ and the file is read.\nl
+ The {\`\_endcode`} is defined as `\endinput` in the `optex.ini` file.
+ \`\wterm` `{<text>}` prints `<text>`
+ to the terminal and to the `.log` file (as in plain \TeX/).
+ \_cod -----------------------
+
+\_def \_codedecl #1#2{%
+ \_ifx #1\_undefined \_wterm{#2}%
+ \_else \_ea \_endinput \_fi
+}
+\_def \_wterm {\_immediate \_write16 }
+
+\_public \wterm ;
+
+ \_doc ------------------------
+ The `\optexversion` and `\fmtname` are defined in the `optex.ini` file.
+ Maybe, somebody will need a private version of these macros.
+ \_cod ------------------------
+
+\_private \optexversion \fmtname ;
+
+ \_doc -----------------------------
+ The `\_mathsbon` and `\_mathsboff` are defined in `math-macros.opm` file.
+ Now, we define the macros
+ \`\_namespace` `{<pkg label>}`, \`\_resetnamespace` `{<pkg label>}`, \`\_endnamespace`,
+ \`\_nspublic` and \`\_nsprivate`
+ for package writers, see section~\ref[pkg-namespace].{\hbadness=2200\par}
+ \_cod -----------------------------
+
+\_def \_pkglabel{}
+\_def\_namespace #1{%
+ \_ifcsname namesp:#1\_endcsname \_errmessage
+ {The name space "#1" is used already, it cannot be used twice}%
+ \_endinput
+ \_else \_resetnamespace{#1}\_fi
+}
+\_def\_resetnamespace #1{%
+ \_ea \_gdef \_csname namesp:#1\_endcsname {}%
+ \_gdef \_pkglabel{_#1}%
+ \_directlua{
+ callback.add_to_callback("process_input_buffer",
+ function (str)
+ return string.gsub(str, "\_nbb[.]([a-zA-Z])", "\_nbb _#1_\_pcent 1")
+ end, "_namespace")
+ }%
+}
+\_def\_endnamespace {%
+ \_directlua{ callback.remove_from_callback("process_input_buffer", "_namespace") }%
+ \_gdef \_pkglabel{}%
+}
+
+\_def \_nspublic {\_xargs \_nspublicA}
+\_def \_nspublicA #1{%
+ \_unless\_ifx #1\_undefined
+ \_opwarning{\_ea\_ignoreit\_pkglabel\_space redefines the meaning of \_string#1}\_fi
+ \_ea\_let \_ea#1\_csname \_pkglabel _\_csstring #1\_endcsname}
+
+\_def \_nsprivate {\_xargs \_nsprivateA}
+\_def \_nsprivateA #1{\_ea\_let \_csname \_pkglabel _\_csstring #1\_endcsname =#1}
+
+
+\_endcode %----------------------------------------------------
+
+
+\sec[prefixed] Concept of namespaces of control sequences
+
+\secc Prefixing internal control sequences
+
+All control sequences used in \OpTeX/ are used and defined with `_` prefix.
+The user can be sure that when he/she does `\def\foo` then internal macros of
+\OpTeX/ nor \TeX/ primitives will be not damaged. For example
+`\def\if{...}` will not damage macros because \OpTeX/'s macros
+are using `\_if` instead of `\if`.
+
+All \TeX/ primitives are initialized with two representative control
+sequences: `\word` and `\_word`, for example `\hbox` and `\_hbox`.
+The first alternative is reserved for users or such control sequences
+can be re-defined by a user.
+
+\OpTeX/ sets the character `_` as the letter, so it can be used in
+control sequences. When a control sequence begins with this character
+then it means that it is a primitive or it is used in \OpTeX/ macros as
+internal. User can redefine such prefixed control sequence only
+if he/she explicitly know what happens.
+
+We never change catcode of `_`, so internal macros can be
+redefined by user without problems if it is desired. We need not
+something like `\makealetter` from \LaTeX/.
+
+\OpTeX/ defines all new macros as prefixed. For public usage of such macros,
+we need to set non-prefixed version. This is done by
+
+\begtt \catcode`\<=13
+\public <list of control sequences> ;
+\endtt
+
+For example \^`\public`` \foo \bar ;` does `\let\foo=\_foo`, `\let\bar=\_bar`.
+
+At the end of each code segment in \OpTeX/, the `\_public` macro is used. You
+can see, what macros are defined for public usage in this code segment.
+
+The macro \^`\private` does a reverse job to `\public` with the same syntax.
+For example `\private \foo \bar ;` does `\let\_foo=\foo`, `\let\_bar=\bar`.
+This should be used when an unprefixed variant of a control sequence is declared
+already but we need the prefixed variant too.
+
+In this documentation: if both variants of a control sequence are declared
+(prefixed and unprefixed), then the accompanying text mentions only
+the unprefixed variant. The code typically defines the prefixed variant
+and then the \^`\public` (or `\_public`) macro is used.
+
+\secc Namespace of control sequences for users
+
+Users can define or declare any control sequence with a name without any `_`.
+This does not make any problem. Only one exception is the reserved control
+sequence `\par`. It is generated by tokenizer (at empty lines)
+and used as internal in \TeX/.
+
+User can define or declare control sequences with `_` character, for
+example `\my_control_sequence`, but with the following exceptions:
+
+\begitems
+* Control sequences which begin with `_` are reserved for \TeX/ primitives,
+ \OpTeX/ internal macros and packages internal macros.
+* Control sequences (terminated by non-letter) in the form
+ `\<word>_` or `\<word>_<one-letter>`, where
+ <word> is a sequence of letters, are inaccessible, because they
+ are interpreted as `\<word>` followed by `_` or as `\<word>` followed by
+ `_<one-letter>`. This is important for writing math, for example:
+\begtt \adef-{_}
+ \int-a^b ... is interpreted as \int _a^b
+ \max-M ... is interpreted as \max _M
+ \alpha-{ij} ... is interpreted as \alpha _{ij}
+\endtt
+ This feature is implemented using lua code at input processor level, see
+ the section~\ref[math-macros] for more details. You can deactivate this feature by
+ \^`\mathsboff`. After this, you can still write
+ `$`$\int$`_a^b$` (Unicode) or `$\int _a^b$` % $∫_a^b$ (Unicode) or $\int _a^b$
+ without problems but `\int``_a^b` yields to undefined control sequence
+ `\int``_a`. You can activate this feature again by \^`\mathsbon`. The
+ effect will take shape from next line read from input file.
+* Control sequences in the form `\_<pkg>_<word>` is intended for package
+ writers as internal macros for a package with `<pkg>` identifier,
+ see section~\ref[pkg-namespace].
+\enditems
+
+The single-letter control sequences like `\%`, `\$`, `\^` etc. are not used
+in internal macros. Users can redefine them, but (of course) some classical
+features can be lost (printing percent character by `\%` for example).
+
+\secc Macro files syntax
+
+Each segment of \OpTeX/ macros is stored in one file with `.opm` extension
+(means OPtex Macros). Your local macros should be in a normal `*.tex` file.
+
+The code in macro files starts by \^`\_codedecl` and ends by \^`\_endcode`.
+The \^`\_endcode` is equivalent for `\endinput`, so documentation can follow.
+The \^`\_codedecl` has syntax:
+
+\begtt
+\_codedecl \sequence {Name <version>}
+\endtt
+
+If the mentioned `\sequence` is defined, then \^`\_codedecl` does the same as
+`\endinput`: this protects from reading the file twice. We suppose, that
+`\sequence` is defined in the macro file.
+
+It is possible to use the \^`\_doc` ... \^`\_cod` pair between the macro lines.
+The documentation text should be here. It is ignored when macros are read
+but it can be printed using `doc.opm` macros like in this documentation.
+
+
+\secc[pkg-namespace] Name spaces for package writers
+
+Package writer should use internal names in the form `\_<pgk>_<sequence>`,
+where `<pkg>` is a package label. For example:
+`\_qr_utfstring` from `qrcode.opm` package.
+
+The package writer needs not to write repeatedly `\_pkg_foo` `\_pkg_bar`
+etc.\ again and again in the macro file.\fnote
+{We have not adopted the idea from expl3 language:)}
+When the \^`\_namespace` `{<pkg>}`
+is declared at the beginning of the macro file then all occurrences of
+`\.foo` will be replaced by `\_<pkg>_foo` at the input processor level.
+The macro writer can write (and backward can read his/her code) simply with
+`\.foo`, `\.bar` control sequences and `\_<pkg>_foo`, `\_<pkg>_bar`
+control sequences are processed internally.
+The scope of the \^`\_namespace` command ends at the \^`\_endnamespace` command
+or when another \^`\_namespace` is used. This command checks
+if the same package label is not declared by the \^`\_namespace` twice.
+
+The \^`\_nspublic` macro does `\let\foo = \_<pkg>_foo` when
+\^`\_namespace{<pkg>}` is declared. Moreover, it prints a warning if `\foo` is
+defined already. The \^`\_nsprivate` macro does reverse
+operation to it without warnings. Example: you can define `\def\.macro{...}` and then
+set it to the user name space by `\_nspublic \macro;`.
+
+Don't load other packages (which are using their own namespace) inside your
+namespace. Do load them before your \^`\_namespace`~`{<pkg>}` is
+initialized. Or close your namespace by \^`\_endnamespace` and open it again
+(after other packages are loaded) by \^`\_resetnamespace`~`{<pkg>}`.
+
+If the package writer needs to declare a control
+sequence by \^`\newif`, then there is an exception of the rule described above. Use
+\^`\_newifi\_if<pkg>_bar`, for example `\_newifi\_ifqr_incorner`.
+Then the control sequences `\_qr_incornertrue` and
+`\_qr_incornerfalse` can be used (or the sequences `\.incornertrue`
+and `\.incornerfalse` when `\_namespace{qr}` is used).
+
+
+\secc Summary about rules for external macro files published for \OpTeX/
+
+If you are writing a macro file that is intended to be published for
+\OpTeX/, then you are greatly welcome. You should follow these rules:
+
+\begitems
+* Don't use control sequences from the user namespace in the macro
+ bodies if there is not explicit and documented reason to do this.
+* Don't declare control sequences in the user namespace if there are not
+ explicit and documented reasons to do this.
+* Use control sequences from \OpTeX/ and primitive namespace
+ in read-only mode, if there is not an explicit and documented reason to
+ redefine them.
+* Use `\_<pkg>_<name>` for your internal macros or `\.<name>` if the
+ \^`\_namespace{<pkg>}` is declared. See section~\ref[pkg-namespace].
+* Use \^`\load` (or better: `\_load`) for loading more external macros
+ if you need them. Don't use `\_input` explicitly in such cases.
+ The reason is: the external macro file is not loaded
+ twice if another macro or the user needs it explicitly too.
+* Use \^`\_codedecl` as your first command in the macro file and
+ \^`\_endcode` to close the text of macros.
+* Use \^`\_doc` ... \^`\_cod` pairs for documenting the code pieces and/or write
+ more documentation after the \^`\_endcode` command.
+\enditems
+
+If the macro file accepts these recommendations then it should be
+named by `<filename>.opm` where `<filename>` differs from file names
+used directly in \OpTeX/ and from other published macros.
+This extension `opm` has precedence before `.tex` when
+the \^`\load` macro is used.
+
+The `qrcode.opm` is the first example of how an external macro file for \OpTeX/
+can look like.
+
+\endinput
+
+2021-02-15 \_expandafter -> \_ea in \_codedecl
+2020-02-14 released
diff --git a/macros/optex/base/print-unimath.opm b/macros/optex/base/print-unimath.opm
new file mode 100644
index 0000000000..2b1a07f30a
--- /dev/null
+++ b/macros/optex/base/print-unimath.opm
@@ -0,0 +1,56 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \_undefined {Printing Unicode-math table \string<2020-06-08>}
+
+\_begingroup
+ \_def\UnicodeMathSymbol#1#2#3#4{%
+ \_ifnum#1>"10000 \_endinput \_else \_printmathsymbol{#1}{#2}{#3}{#4}\_fi
+ }
+ \_def\UnicodeMathSymbolA#1#2#3#4{%
+ \_ifnum#1>"10000 \_printmathsymbol{#1}{#2}{#3}{#4}\_fi
+ }
+ \_def\_printmathsymbol#1#2#3#4{%
+ \_hbox{\_hbox to2em{$#2{}$\_hss}\_hbox to3em
+ {\small\_printop#3\_hss}{\_tt\_string#2\_trycs{_eq:\_string#2}{}}}
+ }
+ \_def\_eq#1#2{\_sdef{_eq:\_string#2}{=\_string#1}}
+ \_eq \diamond\smwhtdiamond \_eq \bullet\smblkcircle \_eq \circ\vysmwhtcircle
+ \_eq \bigcirc\mdlgwhtcircle \_eq \to\rightarrow \_eq \le\leq
+ \_eq \ge\geq \_eq \neq\ne \_eq \emptyset\varnothing \_eq \hbar\hslash
+ \_eq \land\wedge \_eq \lor\vee \_eq \owns\ni \_eq \gets\leftarrow
+ \_eq \mathring\ocirc \_eq \lnot\neg \_eq \backepsilon\upbackepsilon
+ \_eq \eth\matheth \_eq \dbkarow\dbkarrow \_eq \drbkarow\drbkarrow
+ \_eq \hksearow\hksearrow \_eq \hkswarow\hkswarrow
+
+ \_tracinglostchars=0
+ \_fontdef\small{\_setfontsize{at5pt}\_rm}
+ \_def\_printop{\_def\mathop{Op}}
+ \_def\mathalpha{Alph}\_def\mathord{Ord}\_def\mathbin{Bin}\_def\mathrel{Rel}
+ \_def\mathopen{Open}\_def\mathclose{Close}\_def\mathpunct{Punct}\_def\mathfence{Fence}
+ \_def\mathaccent{Acc}\_def\mathaccentwide{Accw}\_def\mathbotaccentwide{AccBw}
+ \_def\mathbotaccent{AccB}\_def\mathaccentoverlay{AccO}
+ \_def\mathover{Over}\_def\mathunder{Under}
+ \_typosize[7.5/9]\_normalmath \_everymath={}
+
+ Codes U+00000 \_dots\ U+10000
+ \_begmulti 3
+ \_input unimath-table.opm
+ \_endmulti
+
+ \_medskip\_goodbreak
+ Codes U+10001 \_dots\ U+1EEF1 \_let\UnicodeMathSymbol=\UnicodeMathSymbolA
+ \_begmulti 4
+ \_input unimath-table.opm
+ \_endmulti
+\_endgroup
+
+\_endcode
+
+This file can be used for testing your Unicode-math font
+and/or for printing \TeX/ sequences which can be used in math.
+
+Load Unicode math font first (for example by `\fontfam[termes]` or by
+`\loadmath{<math-font>}`) and then you
+can do `\input print-unimath.opm`. The big table with all math symbols is printed.
+
+\_endinput
diff --git a/macros/optex/base/ref-file.opm b/macros/optex/base/ref-file.opm
new file mode 100644
index 0000000000..d594bf88c0
--- /dev/null
+++ b/macros/optex/base/ref-file.opm
@@ -0,0 +1,141 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \openref {File for references <2021-02-05>} % preloaded in format
+
+ \_doc --------------------------
+ The \`\_inputref` macro is used in `\everyjob`. It reads `\jobname.ref` file
+ if it exists. After the file is read then it is removed and opened to write
+ a new contents to this file.
+ \_cod --------------------------
+
+\_newwrite\_reffile
+
+\_def\_inputref {%
+ \_isfile{\_jobname.ref}\_iftrue
+ \_input {\_jobname.ref}
+ \_gfnotenum=0 \_lfnotenum=0 \_mnotenum=0
+ \_openrefA{\_string\_inputref}%
+ \_fi
+}
+
+ \_doc --------------------------
+ If the file does not exist then it is not created by default. It means that if you
+ process a document without any forward references then no `\jobname.ref`
+ file is created because it is unusable. The \^`\_wref` macro is a dummy in
+ this case.
+ \_cod --------------------------
+
+\_def\_wrefrelax#1#2{}
+\_let\_wref=\_wrefrelax
+
+ \_doc ---------------------
+ If a macro needs to create and to use `.ref` file then such macro must use
+ \`\openref`. When the file is created (using internal \`\_openrefA`) then
+ the \`\_wref` `\<macro>{<data>}` is redefined in order to
+ save the line `\<macro><data>` to the `.ref` file using asynchronous
+ `\write` primitive. Finally, the `\_openref` destroys itself, because we
+ need not open the file again.\nl
+ The `\_wref``<csname>{<params>}` does exactly `\write\_reffile{\string<csname><params>}`
+ in this case and \`\_ewref``<csname>{<params>}` does
+ `\write\_reffile{\string<csname><expanded-params>}`.
+ \_cod ---------------------
+
+\_def\_openref {%
+ \_ifx \_wref\_wrefrelax \_openrefA{\_string\openref}\_fi
+ \_gdef\_openref{}%
+}
+\_def\_openrefA #1{%
+ \_immediate\_openout\_reffile="\_jobname.ref"\_relax
+ \_gdef\_wref ##1##2{\_write\_reffile{\_bslash\_csstring##1##2}}%
+ \_immediate\_write\_reffile {\_pcent\_pcent\_space OPTeX <\_optexversion> - REF file (#1)}%
+ \_immediate\_wref \Xrefversion{{\_REFversion}}%
+}
+\_def\_ewref #1#2{\_edef\_ewrefA{#2}\_ea\_wref\_ea#1\_ea{\_ewrefA}}
+\_def\openref{\_openref}
+
+ \_doc ----------------------
+ We are using the convention that the macros used in `.ref` file are named
+ `\_X<foo>`. If there is a new version of \OpTeX/ with a different collection
+ of such macros then we don't want to read the `.ref` files produced by an
+ old version of \OpTeX/ or by OPmac. So the first line of `.ref` file is in
+ the form
+ \begtt \catcode`\<=13
+ \Xrefversion{<version>}
+ \endtt
+ We can check the version compatibility by this macro.
+ Because OPmac does not understand `\_Xrefversion` we use
+ \`\Xrefversion` (with a different number of `<version>` form OPmac) here.
+ The result: OPmac skips the `.ref` files produced by \OpTeX/ and vice
+ versa.
+ \_cod ----------------------
+
+\_def\_REFversion{5} % actual version of .ref files in OpTeX
+\_def\_Xrefversion#1{\_ifnum #1=\_REFversion\_relax \_else \_endinput \_fi}
+\_public \Xrefversion ; % we want to ignore .ref files generated by OPmac
+
+ \_doc -----------------------
+ You cannot define your special `.ref` macros before `.ref` file is read
+ because it is read in `\everyjob`. But you can define such macros using
+ \`\refdecl``{<definitions of your ref macros>}`.
+ This command sends to `.ref` file your `<definitions of your ref macros>`
+ immediately. Next lines in `.ref` file should include our macros. Example
+ from CTUstyle2:
+ \begtt
+ \refdecl{%
+ \def\totlist{} \def\toflist{}^^J
+ \def\Xtab#1#2#3{\addto\totlist{\totline{#1}{#2}{#3}}}^^J
+ \def\Xfig#1#2#3{\addto\toflist{\tofline{#1}{#2}{#3}}}
+ }
+ \endtt
+ We must read `<definition of your ref macros>` when the catcode of `#` is 12
+ because we needn't duplicate each `#` in the `.ref` file.
+ \_cod \_fin -----------------
+
+\_def\_refdecl{\_bgroup \_catcode`\#=12 \_refdeclA}
+\_def\_refdeclA #1{\egroup\_openref
+ \_immediate\_write\_reffile {\_pcent\_space \_string \refdecl:}%
+ \_immediate\_write\_reffile {\_detokenize{#1}}%
+}
+\_public \refdecl ;
+
+\_endcode % ================================================
+
+
+The `.ref` file has the name `\jobname.ref` and
+it saves information about references, TOC lines, etc.
+All data needed in next \TeX/ run are saved here.
+\OpTeX/ reads this file at the beginning of the document
+(using `\everyjob`) if such file exists.
+The `.ref` file looks like:
+
+\begtt \catcode`\<=13
+\Xrefversion{<ref-version>}
+\_Xpage{<gpageno>}{<pageno>}
+\_Xtoc{<level>}{<type>}{<text>}{}<title>
+\_Xlabel{<label>}{<text>}
+\_Xlabel{<label>}{<text>}
+...
+\_Xpage{<gpageno>}{<pageno>}
+\_Xlabel{<label>}{<text>}
+...
+\endtt
+%
+where <gpageno> is internal page number globally numbered from one and
+`<pageno>` is a page number (`\the\pageno`) used in pagination (they may differ).
+Each page begins with \^`\_Xpage`.
+The `<label>` is a label used by user in `\label[<label>]` and `<text>` is a
+text which should be referenced (the number of section or table, for
+example `2.3.14`). The `<title>` is the title of the chapter (`<level>`=1,
+`<type>`=`chap`), section (`<level>`=2, `<type>`=`sec`), subsection
+(`<level>`=3, `<type>`=`secc`). The \^`\_Xpage` is written at the beginning of each
+page, the `\_Xtoc` is written when chapter or section or subsection title
+exists on the page and `\_Xlabel` when labeled object prefixed by
+`\label[<label>]` exists on the page.
+
+The `.ref` file is read when the processing of the document starts using
+`\everyjob`. It is read, removed, and opened to writing immediately.
+But the `.ref` file should be missing. If none forward references are needed
+in the document then `.ref` file is not created. For example, you only want
+to test a simple plain \TeX/ macro, you create `test.tex` file, you do
+`optex test` and you don't need to see an empty `test.ref` file in your directory.
+
diff --git a/macros/optex/base/references.opm b/macros/optex/base/references.opm
new file mode 100644
index 0000000000..03c8f6955c
--- /dev/null
+++ b/macros/optex/base/references.opm
@@ -0,0 +1,94 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \ref {References <2020-03-03>} % preloaded in format
+
+ \_doc ----------------------------
+ \`\_Xpage` `{<gpageno>}{<pageno>}` saves the parameter pair into \`\_currpage`.
+ Resets `\_lfnotenum`; it is used if footnotes are numbered from one at each page.
+ \_cod ----------------------------
+
+\_def\_Xpage#1#2{\_def\_currpage{{#1}{#2}}\_lfnotenum=0 }
+
+ \_doc ----------------------------
+ Counter for the number of unresolved references \`\_unresolvedrefs`.
+ \_cod ----------------------------
+
+\_newcount\_unresolvedrefs
+\_unresolvedrefs=0
+
+ \_doc ----------------------------
+ \`\_Xlabel` `{<label>}{<text>}` saves the <text> to `\_lab:<label>` and saves
+ `[pg:<gpageno>]{<pageno>}` to `\_pgref:<label>`.
+ \_cod ----------------------------
+
+\_def\_Xlabel#1#2{\_sdef{_lab:#1}{#2}\_sxdef{_pgref:#1}{\_ea\_bracketspg\_currpage}}
+\_def\_bracketspg#1#2{[pg:#1]{#2}}
+
+ \_doc ----------------------------
+ \`\label``[<label>]` saves the decalred label to `\_lastlabel` and
+ \`\wlabel``{<text>}` uses the `\_lastlabel` and activates
+ `\_wref\_Xlabel{<label>}{<text>}`.
+ \_cod ----------------------------
+
+\_def\_label[#1]{\_isempty{#1}\_iftrue \_global\_let \_lastlabel=\_undefined
+ \_else \_isdefined{l0:#1}%
+ \_iftrue \_opwarning{duplicated label [#1], ignored}\_else \_xdef\_lastlabel{#1}\_fi
+ \_fi \_ignorespaces
+}
+\_def\_wlabel#1{%
+ \_ifx\_lastlabel\_undefined \_else
+ \_dest[ref:\_lastlabel]%
+ \_printlabel\_lastlabel
+ \_ewref \_Xlabel {{\_lastlabel}{#1}}%
+ \_sxdef{_lab:\_lastlabel}{#1}\_sxdef{l0:\_lastlabel}{}%
+ \_global\_let\_lastlabel=\_undefined
+ \_fi
+}
+\_public \label \wlabel ;
+
+ \_doc ----------------------------
+ \`\ref``[<label>]` uses saved `\_lab:<label>` and prints (linked) `<text>`.
+ If the reference is backward then we know `\lab:<label>` without any need
+ to read REF file. On the other hand, if the reference is forwarded, then we
+ doesn't know `\_lab:<label>` in the first run of \TeX/ and we print a warning and
+ do `\_openref`.
+ \nl
+ \`\pgref``[<label>]` uses `{<gpageno>}{<pageno>}` from `\_pgref:<label>` and
+ prints (linked) `<pageno>` using `\_ilink` macro.
+ \_cod ----------------------------
+
+\_def\_ref[#1]{\_isdefined{_lab:#1}%
+ \_iftrue \_ilink[ref:#1]{\_csname _lab:#1\_endcsname}%
+ \_else ??\_opwarning{label [#1] unknown. Try to TeX me again}%
+ \_incr\_unresolvedrefs \_openref
+ \_fi
+}
+\_def\_pgref[#1]{\_isdefined{_pgref:#1}%
+ \_iftrue \_ea\_ea\_ea\_ilink \_csname _pgref:#1\_endcsname
+ \_else ??\_opwarning{pg-label [#1] unknown. Try to TeX me again}%
+ \_incr\_unresolvedrefs \_openref
+ \_fi
+}
+\_public \ref \pgref ;
+
+ \_doc -----------------------------
+ Default \`\_printlabel` is empty macro (labels are not printed).
+ The \`\showlabels` redefines it as box with zero dimensions and
+ with left lapped `[<label>]` in blue 10pt `\tt` font shifted up by 1.7ex.
+ \_cod -----------------------------
+
+\_def\_printlabel#1{}
+\_def\_showlabels {%
+ \_def\_printlabel##1{\_vbox to\_zo{\_vss\_llap{\_labelfont[##1]}\_kern1.7ex}}%
+ \_fontdef\_labelfont{\_setfontsize{at10pt}\setfontcolor{blue}\_tt}
+}
+\_public \showlabels ;
+
+\_endcode %------------------------------------------
+
+
+If the references are \"forward" (i.~e. the `\ref` is used first, the destination
+is created later) or if the reference text is page number then we must read
+`.ref` file first in order to get appropriate information.
+See section \ref[ref-file] for more information about `.ref` file concept.
+
diff --git a/macros/optex/base/sections.opm b/macros/optex/base/sections.opm
new file mode 100644
index 0000000000..39759962bf
--- /dev/null
+++ b/macros/optex/base/sections.opm
@@ -0,0 +1,469 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \chap {Titles, chapters, sections, subsections <2021-03-03>} % preloaded in format
+
+ \_doc ---------------------------
+ We are using scaled fonts for titles
+ \`\_titfont`, \`\_chapfont`, \`\_secfont` and \`\_seccfont`.
+ They are scaled from main fonts size
+ of the document, which is declared by first `\typosize[<fo-size>/<b-size>]`
+ command.
+ \_cod ---------------------------
+
+\_def \_titfont {\_scalemain\_typoscale[\_magstep4/\_magstep5]\_boldify}
+\_def \_chapfont {\_scalemain\_typoscale[\_magstep3/\_magstep3]\_boldify}
+\_def \_secfont {\_scalemain\_typoscale[\_magstep2/\_magstep2]\_boldify}
+\_def \_seccfont {\_scalemain\_typoscale[\_magstep1/\_magstep1]\_boldify}
+
+ \_doc ---------------------------
+ The \`\tit` macro is defined using \^`\scantoeol` and \`\_printtit`.
+ It means that the parameter is
+ separated by end of line and inline verbatim is allowed. The same
+ principle is used in the \^`\chap`, \^`\sec`, and \^`\secc` macros.
+ \_cod ---------------------------
+
+\_def\_printtit #1{\_vglue\_titskip
+ {\_leftskip=0pt plus1fill \_rightskip=\_leftskip % centering
+ \_titfont \_noindent \_scantextokens{#1}\_par}%
+ \_nobreak\_bigskip
+}
+\_def\_tit{\_scantoeol\_printtit}
+
+\_public \tit ;
+
+ \_doc ---------------------------
+ You can re-define \`\_printchap`, \`\_printsec` or \`\_printsecc` macros if
+ another design of section titles is needed. These macros get the
+ `<title>` text in its parameter. The common recommendations for these macros are:
+ \begitems
+ * Use \^`\_abovetitle``{<penaltyA>}{<skipA>}` and \^`\_belowtitle``{<skipB>}`
+ for inserting vertical material above and below the section title.
+ The arguments of these macros are normally used, i.\,e.\ \^`\_abovetitle`
+ inserts `<penaltyA><skipA>` and \^`\_belowtitle` inserts `<skipB>`.
+ But there is an
+ exception: if \^`\_belowtitle``{<skipB>}` is immediately followed by
+ \^`\_abovetitle``{<penaltyA>}{<skipA>}` (for example section title is
+ immediately followed by subsection title), then only `<skipA>` is generated,
+ i.\,e.\ `<skipB><penaltyA><skipA>` is reduced only to `<skipA>`.
+ The reason for such behavior: we don't want to duplicate vertical skip
+ and we don't want to use the negative penalty in such cases.
+ Moreover, \^`\_abovetitle``{<penaltyA>}{<skipA>}` takes previous whatever
+ vertical skip (other than from `\_belowtitle`) and generates only
+ greater from this pair of skips. It means that `<whatever-skip><penaltyA><skipA>`
+ is transformed to `<penaltyA>`max(`<whatever-skip><skipA>`).
+ The reason for such behavior: we don't want to
+ duplicate vertical skips (from `\_belowlistskip`, for example) above the title.
+ * Use \^`\_printrefnum``[<pre>@<post>]` in horizontal mode. It prints
+ `<pre><ref-num><post>`. The `<ref-num>` is \^`\_thechapnum` or \^`\_thesecnum`
+ or \^`\_theseccnum` depending on what type o title is processed.
+ If \^`\nonum` prefix is used then \^`\_printrefnum` prints nothing.
+ The macro \^`\_printrefnum` does more work: it creates destination of hyperlinks
+ (if \^`\hyperlinks``{}{}` is used) and saves references from the label (if
+ \^`\label``[<label>]` precedes) and saves references for the table of contents
+ (if \^`\maketoc` is used).
+ * Use \^`\nbpar` for closing the paragraph for printing title. This
+ command inserts `\_nobreak` between each line of such paragraph, so
+ the title cannot be broken into more pages.
+ * You can use \^`\_firstnoindent` in order to the first paragraph after
+ the title is not indented.
+ \enditems
+ \_cod ---------------------------
+
+\_def\_printchap #1{\_vfill\_supereject
+ \_vglue\_medskipamount % shifted by topkip+\medskipamount
+ {\_chapfont \_noindent \_mtext{chap} \_printrefnum[@]\_par
+ \_nobreak\_smallskip
+ \_noindent \_raggedright #1\_nbpar}\_mark{}%
+ \_nobreak \_belowtitle{\_bigskip}%
+ \_firstnoindent
+}
+\_def\_printsec#1{\_par
+ \_abovetitle{\_penalty-400}\_bigskip
+ {\_secfont \_noindent \_raggedright \_printrefnum[@\_quad]#1\_nbpar}\_insertmark{#1}%
+ \_nobreak \_belowtitle{\_medskip}%
+ \_firstnoindent
+}
+\_def\_printsecc#1{\_par
+ \_abovetitle{\_penalty-200}{\_medskip\_smallskip}
+ {\_seccfont \_noindent \_raggedright \_printrefnum[@\_quad]#1\_nbpar}%
+ \_nobreak \_belowtitle{\_medskip}%
+ \_firstnoindent
+}
+
+ \_doc --------------------------
+ The \`\_sectionlevel` is the level of the printed section:
+ \begitems
+ * `\_sectionlevel=0` -- reserved for parts of the book (unused by default)
+ * `\_sectionlevel=1` -- chapters (used in `\chap`)
+ * `\_sectionlevel=2` -- sections (used in `\sec`)
+ * `\_sectionlevel=3` -- subsections (used in `\secc`)
+ * `\_sectionlevel=4` -- subsubsections (unused by default, see the
+ \ulink[http://petr.olsak.net/optex/optex-tricks.html\#seccc]{\OpTeX/ trick 0033})
+ \enditems
+ \_cod --------------------------
+
+\_newcount\_sectionlevel
+\_def \_secinfo {\_ifcase \_sectionlevel
+ part\_or chap\_or sec\_or secc\_or seccc\_fi
+}
+
+ \_doc --------------------------
+ The \`\_chapx` initializes counters used in chapters,
+ the \`\_secx` initializes counters in sections
+ and \`\_seccx` initializes counters in subsections.
+ If you have more types of numbered objects in your document then you can
+ declare appropriate counters and do `\addto\_chapx{\yourcounter=0 }`
+ for example. If you have another concept of numbering objects used in your
+ document, you can re-define these macros. All settings here are global
+ because it is used by `{\_globaldefs=1 \_chapx}`.
+
+ Default concept: Tables, figures, and display maths are numbered
+ from one in each section -- subsections don't reset these counters.
+ Footnotes declared by \^`\fnotenumchapters` are numbered in each chapter
+ from one.
+
+ The `\_the*` macros
+ \`\_thechapnum`, \`\_thesecnum`, \`\_theseccnum`,
+ \`\_thetnum`, \`\_thefnum` and \`\_thednum`
+ include the format of numbers used when the object
+ is printing. If chapter is never used in the document then `\_chapnum=0`
+ and \`\_othe``\_chapnum.` expands to empty. Sections have numbers <num> and
+ subsections <num>.<num>. On the other hand, if chapter is used in the
+ document then `\_chapnum>0` and sections have numbers` <num>.<num>`
+ and subsections have numbers `<num>.<num>.<num>`.
+ \_cod --------------------------
+
+\_newcount \_chapnum % chapters
+\_newcount \_secnum % sections
+\_newcount \_seccnum % subsections
+\_newcount \_tnum % table numbers
+\_newcount \_fnum % figure numbers
+\_newcount \_dnum % numbered display maths
+
+\_def \_chapx {\_secx \_secnum=0 \_lfnotenum=0 }
+\_def \_secx {\_seccx \_seccnum=0 \_tnum=0 \_fnum=0 \_dnum=0 \_resetABCDE }
+\_def \_seccx {}
+
+\_def \_thechapnum {\_the\_chapnum}
+\_def \_thesecnum {\_othe\_chapnum.\_the\_secnum}
+\_def \_theseccnum {\_othe\_chapnum.\_the\_secnum.\_the\_seccnum}
+\_def \_thetnum {\_othe\_chapnum.\_othe\_secnum.\_the\_tnum}
+\_def \_thefnum {\_othe\_chapnum.\_othe\_secnum.\_the\_fnum}
+\_def \_thednum {(\_the\_dnum)}
+
+\_def\_othe #1.{\_ifnum#1>0 \_the#1.\_fi}
+
+ \_doc ----------------------------
+ The \`\notoc` and \`\nonum` prefixes are implemented by
+ internal `\_ifnotoc` and `\_ifnonum`. They are reset
+ after each chapter/section/subsection by the \`\_resetnonumnotoc` macro.
+ \_cod ----------------------------
+
+\_newifi \_ifnotoc \_notocfalse \_def\_notoc {\_global\_notoctrue}
+\_newifi \_ifnonum \_nonumfalse \_def\_nonum {\_global\_nonumtrue}
+\_def \_resetnonumnotoc{\_global\_notocfalse \_global\_nonumfalse}
+\_public \notoc \nonum ;
+
+ \_doc ----------------------------
+ The \`\chap`, \`\sec`, and \`\secc` macros are implemented here.
+ The \`\_inchap`, \`\_insec` and \`\_insecc` macros do the real work,
+ First, we read the optional parameter `[<label>]`, if it exists.
+ The `\chap`, `\sec` and `\secc` macro reads its parameter using
+ \^`\scantoeol`. This causes that they cannot be used inside other macros.
+ Use \`\_inchap`, \`\_insec`, and \`\_insecc` macros directly in such case.
+ \_cod ----------------------------
+
+\_optdef\_chap[]{\_trylabel \_scantoeol\_inchap}
+\_optdef\_sec []{\_trylabel \_scantoeol\_insec}
+\_optdef\_secc[]{\_trylabel \_scantoeol\_insecc}
+\_def\_trylabel{\_istoksempty\_opt\_iffalse \_label[\_the\_opt]\_fi}
+
+\_def\_inchap #1{\_par \_sectionlevel=1
+ \_def \_savedtitle {#1}% saved to .ref file
+ \_ifnonum \_else {\_globaldefs=1 \_incr\_chapnum \_chapx}\_fi
+ \_edef \_therefnum {\_ifnonum \_space \_else \_thechapnum \_fi}%
+ \_printchap{\_scantextokens{#1}}%
+ \_resetnonumnotoc
+}
+\_def\_insec #1{\_par \_sectionlevel=2
+ \_def \_savedtitle {#1}% saved to .ref file
+ \_ifnonum \_else {\_globaldefs=1 \_incr\_secnum \_secx}\_fi
+ \_edef \_therefnum {\_ifnonum \_space \_else \_thesecnum \_fi}%
+ \_printsec{\_scantextokens{#1}}%
+ \_resetnonumnotoc
+}
+\_def\_insecc #1{\_par \_sectionlevel=3
+ \_def \_savedtitle {#1}% saved to .ref file
+ \_ifnonum \_else {\_globaldefs=1 \_incr\_seccnum \_seccx}\_fi
+ \_edef \_therefnum {\_ifnonum \_space \_else \_theseccnum \_fi}%
+ \_printsecc{\_scantextokens{#1}}%
+ \_resetnonumnotoc
+}
+\_public \chap \sec \secc ;
+
+ \_doc ----------------------------
+ The \`\_printrefnum``[<pre>@<post>]` macro is used in `\_print*` macros.
+
+ Note that the `<tite-text>` is `\detokenize`d before `\_wref`, so the
+ problem of \"fragile macros" from old \LaTeX/ never occurs.
+ This fourth parameter is not delimited by `{...}` but by end of line.
+ This gives possibility to have unbalanced braces in inline verbatim in titles.
+ \_cod ----------------------------
+
+\_def \_printrefnum [#1@#2]{\_leavevmode % we must be in horizontal mode
+ \_ifnonum \_else #1\_therefnum #2\_fi
+ \_wlabel \_therefnum % references, if `\label[<label>]` is declared
+ \_ifnotoc \_else \_incr \_tocrefnum
+ \_dest[toc:\_the\_tocrefnum]%
+ \_ewref\_Xtoc{{\_the\_sectionlevel}{\_secinfo}%
+ {\_therefnum}{\_theoutline}\_detokenize\_ea{\_savedtitle}}%
+ \_fi
+ \_gdef\_theoutline{}%
+}
+
+ \_doc -----------------------------
+ \`\thisoutline``{<text>}` saves text to the \`\_theoutline` macro.
+ \^`\_printrefnum` uses it and removes it.
+ \_cod -----------------------------
+
+\_def\_theoutline{}
+\_def\_thisoutline#1{\_gdef\_theoutline{#1}}
+\_public \thisoutline ;
+
+ \_doc -----------------------------
+ The \`\_abovetitle``{<penaltyA>}{<skipA>}` and \`\_belowtitle``{<skipB>}` pair
+ communicates using a special penalty 11333 in vertical mode.
+ The `\_belowtitle` puts the vertical skip (its value is saved in
+ `\_savedtitleskip`) followed by this special penalty.
+ The `\_abovetitle` reads `\lastpenalty` and if it has this special value
+ then it removes the skip used before and doesn't use the parameter.
+ The `\abovetitle` creates `<skipA>` only if whatever previous skip is less
+ or equal than `<skipA>`. We must save `<whatever-skip>`, remove it,
+ create `<penaltyA>` (if `\_belowtitle` does not precede) and create
+ <whatever-skip> or `<skipA>` depending on what is greater.
+ The amount of `<skipA>` is measured using `\setbox0=\vbox`.
+ \_cod -----------------------------
+
+\_newskip \_savedtitleskip
+\_newskip \_savedlastskip
+\_def\_abovetitle #1#2{\_savedlastskip=\_lastskip % <whatever-skip>
+ \_ifdim\_lastskip>\_zo \_vskip-\_lastskip \_fi
+ \_ifnum\_lastpenalty=11333 \_vskip-\_savedtitleskip \_else #1\_fi
+ \_ifdim\_savedlastskip>\_zo \_setbox0=\_vbox{#2\_global\_tmpdim=\_lastskip}%
+ \_else \_tmpdim=\_maxdimen \_fi
+ \_ifdim\_savedlastskip>\_tmpdim \vskip\_savedlastskip \_else #2\_fi
+}
+\_def\_belowtitle #1{#1\_global\_savedtitleskip=\_lastskip \_penalty11333 }
+
+ \_doc -----------------------------
+ \`\nbpar` sets `\interlinepenaty` value.
+ \`\nl` is \"new line" in the text (or titles), but space in toc or headlines or outlines.
+ \_cod -----------------------------
+
+\_def\_nbpar{{\_interlinepenalty=10000\_endgraf}}
+
+\_protected\_def\_nl{\_unskip\_hfil\_break}
+\_regmacro {\_def\_nl{\_unskip\_space}} {\_def\_nl{\_unskip\_space}} {\_def\_nl{ }}
+\_regmacro {\_def\nl{\_unskip\_space}} {\_def\nl{\_unskip\_space}} {\_def\nl{ }}
+
+\_public \nbpar \nl ;
+
+ \_doc -----------------------------
+ \`\_firstnoindent` puts a material to `\everypar` in order to next
+ paragraph will be without indentation. It is useful after titles.
+ If you dislike this feature then you can say `\let\_firtnoindent=\relax`.
+ The \`\_wipeepar` removes the material from `\everypar`.
+ \_cod -----------------------------
+
+\_def \_firstnoindent {\_global\_everypar={\_wipeepar \_setbox7=\_lastbox}}
+\_def \_wipeepar {\_global\_everypar={}}
+
+ \_doc -----------------------------
+ The `\mark` (for running heads) is used in `\_printsection` only. We
+ suppose that chapters will be printed after `\vfil\break`, so users can
+ implement chapter titles for running headers directly by macros, no
+ `\mark` mechanism is needed. But sections need `\mark`s. And they can be
+ mixed with chapter's running heads, of course.
+
+ The \`\_insertmark``{<title text>}` saves `\mark` in the format
+ `{<title-num>} {<title-text>}`, so it can be printed \"as is" in
+ `\headline` (see the space between them), or you can define a formating
+ macro with two parameters for processing these data, if you need it.
+ \_cod -----------------------------
+
+\_def\_insertmark#1{\_mark{{\_ifnonum\_else\_therefnum\_fi} {\_unexpanded{#1}}}}
+
+ \_doc -----------------------------
+ \OpTeX/ sets `\headline={}` by default, so no running headings are printed.
+ You can activate the running headings by following code, for example:
+ \begtt
+ \addto\_chapx {\_edef\_runningchap {\_thechapnum: \_unexpanded\_ea{\_savedtitle}}}
+ \def \formathead #1#2{\isempty{#1}\iffalse #1: #2\fi}
+ \headline = {%
+ \ifodd \pageno
+ \hfil \ea\formathead\firstmark{}{}%
+ \else
+ Chapter: \runningchap \hfil
+ \fi
+ }
+ \endtt
+
+ The \`\secl``<number> <title-text><eol>`
+ should be used for various levels of sections (for example, when
+ converting from Markdown to \OpTeX/). `\secl1` is `\chap`, `\secl2` is `\sec`,
+ `\secl3` is `\secc` and all more levels (for <number>$>3$)
+ are printed by the common \`\_seclp` macro. It declares only a simple design.
+ If there is a requirement to use such more levels then the book designer can
+ define something different here.
+ \_cod -----------------------------
+
+\_def\_secl{\_afterassignment\_secla \_sectionlevel=}
+\_def\_secla{\_ifcase\_sectionlevel
+ \_or\_ea\_chap\_or\_ea\_sec\_or\_ea\_secc\_else\_ea\_seclp\_fi}
+\_eoldef\_seclp#1{\_par \_ifnum\_lastpenalty=0 \_removelastskip\_medskip\_fi
+ \_noindent{\_bf #1}\_vadjust{\_nobreak}\_nl\_ignorepars}
+\_def\_ignorepars{\_isnextchar\_par{\_ignoresecond\_ignorepars}{}}
+
+\_public \secl ;
+
+ \_doc -----------------------------
+ The \`\caption``/<letter>` increases `\_<letter>num` counter,
+ edefines \`\_thecapnum` as `\_the<letter>num` and
+ defines \`\_thecaptitle` as language-dependent word using \^`\_mtext`,
+ runs the `\_everycaption<letter>` tokens register.
+ The group opened by `\caption` is finalized by first `\par` from
+ an empty line or from `\vskip` or from `\endinsert`.
+ The `\_printcaption<letter>` is called, it starts with
+ printing of the caption.\nl
+ The \`\cskip` macro inserts nonbreakable vertical space between the caption and
+ the object.
+ \_cod -----------------------------
+
+\_def\_caption/#1{\_def\_tmpa{#1}\_nospaceafter \_capA}
+\_optdef\_capA []{\_trylabel \_incaption}
+\_def\_incaption {\_bgroup
+ \_ifcsname _\_tmpa num\_endcsname \_ea\_incr \_csname _\_tmpa num\_endcsname
+ \_else \_opwarning{Unknown caption /\_tmpa}\_fi
+ \_edef\_thecapnum {\_csname _the\_tmpa num\_endcsname}%
+ \_edef\_thecaptitle{\_mtext{\_tmpa}}%
+ \_ea\_the \_csname _everycaption\_tmpa\_endcsname
+ \_def\_par{\_nbpar\_egroup}\_let\par=\_par
+ \_cs{_printcaption\_tmpa}%
+}
+\_def \_cskip {\_par\_nobreak\_medskip} % space between caption and the object
+
+\_public \caption \cskip ;
+
+ \_doc -----------------------------
+ The \`\_printcaptiont` and \`\_printcaptionf` macros start in vertical mode.
+ They switch to horizontal mode and use `\_wlabel\_thecapnum` (in order to
+ make reference and hyperlink destination) a they can use:
+ \begitems
+ * \^`\_thecaptitle` ... expands to the word Table or Figure (depending on
+ the current language).
+ * \^`\_thecapnum` ... expands to `\the<letter>num` (caption number).
+ \enditems
+ The \`\_captionsep` inserts a separator between auto-generated
+ caption number and the following caption text. Default separator
+ is `\_enspace` but if the caption text starts with dot or colon, then
+ the space is not inserted. A user can wite `\caption/t: My table`
+ and \"{\bf Table 1.1:} My table" is printed. You can re-define
+ the \^`\_captionsep` macro if you want to use another separator.
+ \_cod -----------------------------
+
+\_def \_printcaptiont {%
+ \_noindent \_wlabel\_thecapnum {\_bf\_thecaptitle~\_thecapnum}%
+ \_narrowlastlinecentered\_iindent \_futurelet\_next\_captionsep
+}
+\_def\_captionsep{\_ifx\_next.\_ea\_bfnext \_else\_ifx\_next:\_ea\_ea\_ea\_bfnext
+ \_else \_enspace \_fi\_fi}
+\_def\_bfnext#1{{\_bf#1}}
+\_let \_printcaptionf = \_printcaptiont % caption of figures = caption of tables
+
+ \_doc -----------------------------
+ If you want to declare a new type of `\caption` with independent counter,
+ you can use following lines, where `\caption/a` for Algorithms are
+ declared:
+ \begtt
+ \let\_printcaptiona = \_printcaptionf \let\_everycaptiona = \_everycaptionf
+ \newcount\_anum \addto\_secx {\_anum=0 }
+ \def\_theanum {\_othe\_chapnum.\_the\_secnum.\_the\_anum}
+ \sdef{_mt:a:en}{Algorithm} \sdef{_mt:a:cs}{Algoritmus} % + your language...
+ \endtt
+ The default format of `\caption` text is a paragraph in block narrower by
+ `\_iindent` and with the last line is centered. This setting is done by
+ the \`\_narrowlastlinecentered` macro.
+ \_cod -----------------------------
+
+\_def\_narrowlastlinecentered#1{%
+ \_leftskip=#1plus1fil
+ \_rightskip=#1plus-1fil
+ \_parfillskip=0pt plus2fil\_relax
+}
+
+ \_doc -----------------------------
+ \`\eqmark` is processed in display mode (we add `\eqno` primitive)
+ or in internal mode when `\eqaligno` is used (we don't add `\eqno`).
+ \_cod -----------------------------
+
+\_optdef\_eqmark []{\_trylabel \_ineqmark}
+\_def\_ineqmark{\_incr\_dnum
+ \_ifinner\_else\_eqno \_fi
+ \_wlabel\_thednum \_hbox{\_thednum}%
+}
+\_public \eqmark ;
+
+ \_doc -----------------------------
+ The \`\numberedpar` `<letter>{<name>}` is implemented here.
+ \_cod -----------------------------
+
+\_newcount\_counterA \_newcount\_counterB \_newcount\_counterC
+\_newcount\_counterD \_newcount\_counterE
+
+\_def\_resetABCDE {\_counterA=0 \_counterB=0 \_counterC=0 \_counterD=0 \_counterE=0 }
+
+\_def \_theAnum {\_othe\_chapnum.\_othe\_secnum.\_the\_counterA}
+\_def \_theBnum {\_othe\_chapnum.\_othe\_secnum.\_the\_counterB}
+\_def \_theCnum {\_othe\_chapnum.\_othe\_secnum.\_the\_counterC}
+\_def \_theDnum {\_othe\_chapnum.\_othe\_secnum.\_the\_counterD}
+\_def \_theEnum {\_othe\_chapnum.\_othe\_secnum.\_the\_counterE}
+
+\_def\_numberedpar#1#2{\_ea \_incr \_csname _counter#1\_endcsname
+ \_def\_tmpa{#1}\_def\_tmpb{#2}\_numberedparparam}
+\_optdef\_numberedparparam[]{%
+ \_ea \_printnumberedpar \_csname _the\_tmpa num\_ea\_endcsname\_ea{\_tmpb}}
+
+\_public \numberedpar ;
+
+ \_doc -----------------------------
+ The \`\_printnumberedpar` `\theXnum {<name>}` opens numbered paragraph and
+ prints it. The optional parameter is in `\_the\_opt`. You can re-define
+ it if you need another design.
+
+ `\_printnumberedpar` needs not to be re-defined if you only want to print
+ Theorems in italic and to insert vertical skips (for example). You can do this
+ by the following code:
+ \begtt
+ \def\theorem {\medskip\bgroup\it \numberedpar A{Theorem}}
+ \def\endtheorem {\par\egroup\medskip}
+
+ \theorem Let $M$ be... \endtheorem
+ \endtt
+ \_cod -----------------------------
+
+\_def \_printnumberedpar #1#2{\_par
+ \_noindent\_wlabel #1%
+ {\_bf #2 #1\_istoksempty\_opt\_iffalse \_space \_the\_opt \_fi.}\_space
+ \_ignorespaces
+}
+
+\_endcode % -------------------------------------
+
+2021-03-03 \_captionsep introduced, \_othe used in \_thetnum, \_thefnum.
+2021-02-09 \thisoutline implemented
+2021-01-26 \_nl: \unskip added
+2021-01-11 \secl introduced
+2021-01-05 \_thednum printed in text mode in its both occurences.
+2020-04-28 \_secfonts etc: \_boldify is last.
+2020-04-22 \_chapx, \_secx, \_seccx rewritten
+2020-03-14 introduced
diff --git a/macros/optex/base/slides.opm b/macros/optex/base/slides.opm
new file mode 100644
index 0000000000..94fa3afac8
--- /dev/null
+++ b/macros/optex/base/slides.opm
@@ -0,0 +1,247 @@
+% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \slideshow {Slides style for OpTeX <2021-03-10>} % loaded on demand by \slides
+
+ \_doc -----------------------------
+ Default margins and design is declared here.
+ The `\_ttfont` is scaled by `mag1.15` in order to balance the
+ ex height of Helvetica (Heros) and LM fonts Typewriter.
+ The `\begtt`...`\endtt` verbatim is printed by smaller text.
+ \_cod -----------------------------
+
+\_margins/1 a5l (14,14,10,3)mm % landscape A5 format
+\_def\_wideformat{\_margins/1 (263,148) (16,16,10,3)mm } % 16:9 format
+
+\_ifx\_fontnamegen\_undefined \_fontfam[Heros]
+ \_let\_ttfont=\_undefined \_famvardef\_ttfont{\_setfontsize{mag1.15}\_tt}
+\_fi
+\_typosize[16/19]
+\_def\_urlfont{}
+\_everytt={\_typosize[13/16] \_advance\_hsize by10mm}
+\_fontdef\_fixbf{\_bf}
+
+\_nopagenumbers
+\_parindent=0pt
+\_ttindent=5mm
+\_parskip=5pt plus 4pt minus2pt
+\_rightskip=0pt plus 1fil
+\_ttindent=10pt
+\_def\_ttskip{\_smallskip}
+
+\_onlyrgb % RGB color space is better for presentations
+
+ \_doc -----------------------------
+ The bottom margin is set to 3\,mm. If we use 1\,mm, then the baseline of
+ `\footline` is 2\,mm from the bottom page. This is the depth of the `\Grey`
+ rectangle used for page numbers. It is r-lapped to `\hoffset` width because left
+ margin = `\hoffset` = right margin. It is 14\,mm for narrow pages or
+ 16\,mm for wide pages.
+ \_cod -----------------------------
+
+\_footlinedist=1mm
+\_footline={\_hss \_rlap{%
+ \_rlap{\Grey\_kern.2\_hoffset\_vrule height6mm depth2mm width.8\_hoffset}%
+ \_hbox to\_hoffset{\White\_hss\_folio\_kern3mm}}}
+
+ \_doc -----------------------------
+ The \`\subtit` is defined analogically like `\tit`.
+ \_cod -----------------------------
+
+\_eoldef\_subtit#1{\_vskip20pt {\_leftskip=0pt plus1fill \_rightskip=\_leftskip
+ \_subtitfont #1\_nbpar}}
+
+ \_doc -----------------------------
+ The \`\pshow``<num>` prints the text in invisible
+ (transparent) font when \^`\layernum`\code{<}`<num>`.
+ The transparency is set by `\pdfpageresoyrces` primitive.
+ \_cod -----------------------------
+
+\pdfpageresources{/ExtGState << /Invisible << /Type /ExtGState /ca 0 /CA 0 >>
+ /Visible << /Type /ExtGState /ca 1 /CA 1 >> >>}
+\addto\_morepgresources{/Invisible << /Type /ExtGState /ca 0 /CA 0 >>
+ /Visible << /Type /ExtGState /ca 1 /CA 1 >>}
+\def\Invisible {\_pdfliteral{/Invisible gs}}
+\def\Visible {\_pdfliteral{/Visible gs}}
+\def\Transparent {\Invisible \_aftergroup \Visible}
+
+\_def\_use#1#2{\_ifnum\_layernum#1\_relax#2\_fi}
+\_def\_pshow#1{\_use{=#1}\Red \_use{<#1}\Transparent \_ignorespaces}
+
+ \_doc -----------------------------
+ The main level list of items is activated here. The `\_item:X` and
+ `\_item:x` are used and are re-defined here.
+ If we are in a nested level of items and `\pg+` is used then
+ `\egroups` macro expands to the right number of `\egroup`s
+ to close the page correctly. The level of nested item lists
+ is saved to the `\_ilevel` register and used when we start again
+ the next text after `\pg+`.
+ \_cod -----------------------------
+
+\_newcount\_gilevel
+\_def\*{*}
+\_adef*{\_relax\_ifmmode*\_else\_ea\_startitem\_fi}
+\_sdef{_item:X}{\Blue\_raise.2ex\_fullrectangle{.8ex}\_kern.5em}
+\_sdef{_item:x}{\Blue\_raise.3ex\_fullrectangle{.6ex}\_kern.4em}
+\_style X
+\_def\_egroups{\_par\_global\_gilevel=\_ilevel \_egroup}
+\_everylist={\_novspaces \_ifcase\_ilevel \_or \_style x \_else \_style - \_fi
+ \_addto\_egroups{\_egroup}}
+
+ \_doc -----------------------------
+ The default values of \`\pg`, i.\,e.\ `\pg;`, `\pg+` and `\pg.` are very simple.
+ They are used when `\showslides` is not specified.
+ \_cod -----------------------------
+
+\_def\_pg#1{\_cs{_spg:#1}}
+\_sdef{_spg:;}{\_vfil\_break \_lfnotenumreset}
+\_sdef{_spg:.}{\_endslides}
+\_sdef{_spg:+}{\_par}
+
+ \_doc -----------------------------
+ The \`\_endslides` is defined as `\_end` primitive, but
+ slide-designer can redefine it. For example,
+ \ulink[http://petr.olsak.net/optex/optex-tricks.html\#slider]{OpTeX trick 0029}
+ shows how to define clickable navigation to the pages and how to check
+ the data integrity at the end of the document using `\_endslides`.
+
+ The `\bye` macro is redefined here as an alternative to `\pg.`.
+ \_cod -----------------------------
+
+\_def\_endslides{\_end}
+\_def\bye{\_pg.}
+
+ \_doc -----------------------------
+ We need no numbers and no table of contents when using slides.
+ The \^`\_printsec` macro is redefined in order the title is centered
+ and typeset in `\Blue`.
+ \_cod -----------------------------
+
+\_def\_titfont{\_typosize[42/60]\_bf \Blue}
+\_def\_subtitfont{\_typosize[20/30]\_bf}
+\_def\_secfont{\_typosize[25/30]\_bf \Blue}
+
+\_nonum \_notoc \_let\_resetnonumnotoc=\_relax
+\_def\_printsec#1{\_par
+ \_abovetitle{\_penalty-400}\_bigskip
+ {\_secfont \_noindent \_leftskip=0pt plus1fill \_rightskip=\_leftskip
+ \_printrefnum[@\_quad]#1\_nbpar}\_insertmark{#1}%
+ \_nobreak \_belowtitle{\_medskip}%
+}
+
+ \_doc -----------------------------
+ When \`\slideshow` is active then each page is opened
+ by `\setbox\_slidepage=\vbox\bgroup` (roughly speaking)
+ and closed by `\egroup`. The material is
+ `\unvbox`ed and saved for the usage in the next usage if `\pg+` is in process.
+ The \`\_slidelayer` is incremented instead `\pageno` if `\pg+`.
+ This counter is equal to `\count1`, so it is printed to the terminal and
+ log file next to `\pageno`.
+
+ The code is somewhat more complicated when \^`\layers` is used. Then
+ `<layered-text>` is saved to the \`\_layertext` macro, the material before
+ it is in \`\_slidepage` box and the material after it is in `\_slidepageB`
+ box. The pages are completed in the `\loop` which increments the
+ \`\layernum` register.
+ \_cod -----------------------------
+
+\_newbox\_slidepage \_newbox\_slidepageB
+\_countdef\_slidelayer=1
+
+\_def\_slideshow{\_slidelayer=1 \_slideshowactive
+ \_let\slideopen=\_relax % first wins
+ \_setbox\_slidepage=\_vbox\_bgroup\_bgroup}
+
+\_def\_slideshowactive{%
+ \_sdef{_spg:;}{\_closepage \_global\_slidelayer=1 \_resetpage \_openslide}
+ \_sdef{_spg:.}{\_closepage \_endslides}
+ \_sdef{_spg:+}{\_closepage \_incr\_slidelayer \_decr\_pageno \_openslide}
+ \_let\_layers=\_layersactive
+ \_destboxslide % to prevent hyperlink-dests duplication
+}
+\_def\_destboxslide{\_def\_destbox[##1:##2]{\_isequal{##1}{ref}\_iffalse \_destboxori[##1:##2]\_fi}}
+
+\_def\_openslide{\_setbox\_slidepage=\_vbox\_bgroup\_bgroup \_setilevel
+ \_ifvoid\_slidepage \_else \_unvbox\_slidepage \_nointerlineskip\_lastbox \_fi}
+\_def\_setilevel{\_loop \_decr\_gilevel \_ifnum\_gilevel<0 \_else \_begitems \_repeat}
+
+\_def\_closepage{\_egroups \_egroup
+ \_ifnum \_maxlayers=0 \_unvcopy\_slidepage \_vfil\_break
+ \_else \_begingroup \_setwarnslides \_layernum=0
+ \_loop
+ \_ifnum\_layernum<\_maxlayers \_advance\_layernum by1
+ \_printlayers \_vfil\_break
+ \_ifnum\_layernum<\_maxlayers \_incr\_slidelayer \_decr\_pageno \_fi
+ \_repeat
+ \_global\_maxlayers=0
+ \_incr\_layernum \_global\_setbox\_slidepage=\_vbox{\_printlayers}%
+ \_endgroup
+ \_fi}
+\_def\_resetpage{%
+ \_global\_setbox\_slidepage=\_box\_voidbox \_global\_setbox\_slidepageB=\_box\_voidbox
+ \_lfnotenumreset
+}
+\_def\_setwarnslides{%
+ \_def\pg##1{\_opwarning{\_string\pg##1 \_layersenv}\_def\pg####1{}}%
+ \_def\layers##1 {\_opwarning{\_string\layers\_space \_layersenv}\_def\layers####1{}}%
+}
+\_def\_layersenv{cannot be inside \_string\layers...\_string\endlayers, ignored}
+
+\_def\_printlayers{\_unvcopy\_slidepage \_nointerlineskip\_lastbox
+ \_layertext \_endgraf
+ \_ifdim\_prevdepth>-1000pt \_kern-\_prevdepth \_kern\_dp\_strutbox \_fi
+ \_vskip\_parskip
+ \_unvcopy\_slidepageB
+}
+\_let\_destboxori=\_destbox
+
+\_newcount\_layernum \_newcount\_maxlayers
+\_maxlayers=0
+
+\_long\_def\_layersactive #1 #2\endlayers{%
+ \_par\_penalty0\_egroup
+ \_gdef\_layertext{#2}%
+ \_global\_maxlayers=#1
+ \_setbox\_slidepageB=\_vbox\_bgroup
+}
+\_def\_slideopen{\_let\slideshow=\_relax % first wins
+ \_sdef{_spg:;}{\_egroups\_vfil\_break \_lfnotenumreset\_bgroup \_setilevel}
+ \_sdef{_spg:.}{\_egroups\_endslides}
+ \_sdef{_spg:+}{\_egroups\_bgroup \_setilevel}
+ \_bgroup
+}
+
+\_public \subtit \slideshow \slideopen \pg \wideformat \use \pshow \layernum ;
+
+ \_doc -----------------------------
+ Default \`\layers` `<num>` macro (when \^`\slideshow` is not activated) is simple.
+ It prints the `<layered-text>` with `\layernum=<num>+1` because we need the
+ result after last layer is processed.
+ \_cod -----------------------------
+
+\_def\_layers #1 {\_par\_layernum=\_numexpr#1+1\_relax}
+\_let\endlayers=\_relax
+
+\_def\layers{\_layers}
+
+ \_doc -----------------------------
+ We must to redefine \`\fnotenumpages` because the data from `.ref` file
+ are less usable for implementing such a feature: the
+ footnote should be in more layers repeatedly. But we can suppose that
+ each page starts by `\pg;` macro, so we can reset the footnote counter by
+ this macro.
+ \_cod -----------------------------
+
+\_def \_fnotenumpages {\_def\_fnotenum{\_the\_lfnotenum}\_pgfnotefalse
+ \_def\_lfnotenumreset{\_global\_lfnotenum=0 }}
+\_let \_lfnotenumreset=\_relax
+\_public \fnotenumpages ;
+
+\_endcode % ----------------------------------------------
+
+The user manual of \OpTeX/ slides are in `op-slides.tex` file.
+
+2021-03-10 \slideopen introduced, bug with colors in \setbox fixed
+2021-03-10 \ifmmode* added to \adef*
+2021-02-15 \_def\_decr removed
+2021-01-16 \layers at empty page raises error: problem fixed
+2020-03-19 slides introduced
diff --git a/macros/optex/base/styles.opm b/macros/optex/base/styles.opm
new file mode 100644
index 0000000000..534eb13663
--- /dev/null
+++ b/macros/optex/base/styles.opm
@@ -0,0 +1,120 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \report {Basic styles of OpTeX <2021-03-10>} % preloaded in format
+
+ \_doc -----------------------------
+ We define auxiliary macro first (used by the \^`\address` macro)
+ \nl
+ The `{`\`\boxlines` `<line-1><eol><line-2><eol>...<line-n><eol>}`
+ returns to the outer vertical mode a box with `<line-1>`, next box with
+ `<line-2>` etc. Each box has its natural width. This is reason why we cannot
+ use paragraph mode where each resulting box has the width `\hsize`.
+ The `<eol>` is set active and `\everypar` starts `\hbox{` and acive <eol>
+ closes this `\hbox` by `}`.
+ \_cod -----------------------------
+
+\_def\_boxlines{%
+ \_def\_boxlinesE{\_ifhmode\_egroup\_empty\_fi}%
+ \_def\_nl{\_boxlinesE}%
+ \_bgroup \_lccode`\~=`\^^M\_lowercase{\_egroup\_let~}\_boxlinesE
+ \_everypar{\_setbox0=\_lastbox\_endgraf
+ \_hbox\_bgroup \_catcode`\^^M=13 \_let\par=\_nl \_aftergroup\_boxlinesC}%
+}
+\_def\_boxlinesC{\_futurelet\_next\_boxlinesD}
+\_def\_boxlinesD{\_ifx\_next\_empty\_else\_ea\_egroup\_fi}
+
+\_public \boxlines ;
+
+ \_doc -----------------------------
+ The \`\report` and \`\letter` style initialization macros are defined here.
+ \nl
+ The `\letter` defines \`\address` and \`\subject` macros.
+ \_cod -----------------------------
+
+\_def\_report{
+ \_typosize[11/13.2]
+ \_vsize=\_dimexpr \_topskip + 52\_baselineskip \_relax % added 2020-03-28
+ \_let\_titfont=\_chapfont
+ \_titskip=3ex
+ \_eoldef\_author##1{\_removelastskip\_bigskip
+ {\_leftskip=0pt plus1fill \_rightskip=\_leftskip \_it \_noindent ##1\_par}\_nobreak\_bigskip
+ }
+ \_public \author ;
+ \_parindent=1.2em \_iindent=\_parindent \_ttindent=\_parindent
+ \_footline={\_global\_footline={\_hss\_rmfixed\_folio\_hss}}
+}
+\_def\_letter{
+ \_def\_address{\_vtop\_bgroup\_boxlines \_parskip=0pt \_let\par=\_egroup}
+ \_def\_subject{{\_bf \_mtext{subj}: }}
+ \_public \address \subject ;
+ \_typosize[11/14]
+ \_vsize=\_dimexpr \_topskip + 49\_baselineskip \_relax % added 2020-03-28
+ \_parindent=0pt
+ \_parskip=\_medskipamount
+ \_nopagenumbers
+}
+\_public \letter \report ;
+
+ \_doc -----------------------------
+ The \`\slides` macro reads macro file `slides.opm`, see the section~\ref[slides].
+ \_cod -----------------------------
+
+\_def\_slides{\_par
+ \_opinput{slides.opm}
+ \_adef*{\_relax\_ifmmode*\_else\_ea\_startitem\_fi}
+}
+\_public \slides ;
+
+
+\_endcode % -------------------------------------
+
+The example of `\letter` style document follows:
+
+\begtt %-----------------------------------------------------------------
+
+\letter
+\fontfam[bonum]
+\chyph
+
+\address
+ Vážený pan
+ Mgr. Bořek Byrokrat
+ ředitel Ústavu pro další možnosti
+ Úřední 789
+ 123 45 Praha 1
+
+\hfill V Praze dne \today
+
+\subject Žádost o možnost další možnosti
+
+Vážený pane řediteli
+
+na základě Vašeho dopisu č.j.~123456/78-dat a elektronické výzvy si dovoluji
+Vás požádat o prozkoumání mé možnosti další možnosti.
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
+eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
+commodo consequat.
+
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
+eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
+commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit
+esse cillum dolore eu fugiat nulla pariatur.
+
+S úctou
+
+\hfill \address
+ {\it Petr Olšák}
+ specialista na \TeX{}
+ Ulice 12345
+ Praha 13
+
+\bye
+
+\endtt %---------------------------------------------------------------------
+
+\endinput
+
+2021-03-10 \ifmmode* added to \adef*
+2020-03-28 released
diff --git a/macros/optex/base/table.opm b/macros/optex/base/table.opm
new file mode 100644
index 0000000000..a4a6511958
--- /dev/null
+++ b/macros/optex/base/table.opm
@@ -0,0 +1,526 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \table {Basic macros for OpTeX <2021-03-09>} % preloaded in format
+
+ \_doc -----------------------------
+ The result of the \`\table``{<declaration>}{<data>}` macro is inserted into
+ \`\_tablebox`. You can change default value if you want by
+ `\let\_tablebox=\vtop` or `\let\_tablebox=\relax`.
+ \_cod -----------------------------
+
+\_let\_tablebox=\_vbox
+
+ \_doc -----------------------------
+ We save the `to<size>` or `pxto<size>` to `#1` and \`\_tableW` sets the
+ `to<size>` to the \`\_tablew` macro.
+ If `pxto<size>` is used then `\_tablew` is empty and `\_tmpdim` includes
+ given <size>. The `\_ifpxto` returns true in this case.
+
+ The `\table` continues by reading `{<declaration>}` in the \^`\_tableA` macro.
+ Catcodes (for example the `|` character) have to be normal when reading
+ `\table` parameters. This is the reason why we use `\catcodetable` here.
+ \_cod -----------------------------
+
+\_newifi \_ifpxto
+\_def\_table#1#{\_tablebox\_bgroup \_tableW#1\_empty\_end
+ \_bgroup \_catcodetable\_optexcatcodes \_tableA}
+\_def\_tableW#1#2\_end{\_pxtofalse
+ \_ifx#1\_empty \_def\_tablew{}\_else
+ \_ifx#1p \_def\_tablew{}\_tableWx#2\_end \_else \_def\_tablew{#1#2}\_fi\_fi}
+\_def\_tableWx xto#1\_end{\_tmpdim=#1\_relax \_pxtotrue}
+\_public \table ;
+
+ \_doc -----------------------------
+ The \^`\tablinespace` is implemented by enlarging given \^`\tabstrut`
+ by desired dimension (height and depth too) and by setting
+ `\_lineskip=-2\_tablinespace`. Normal table rows (where no `\hrule` is
+ between them) have normal baseline distance.\nl
+ The \`\_tableA``{<declaration>}` macro scans the `<declaration>` by
+ `\_scantabdata#1\_relax` and continues by processing `{<data>}` by \^`\_tableB`.
+ The trick `\_tmptoks={<data>}\_edef\_tmpb{\_the\_tmptoks}`
+ is used here in order to keep the hash marks in the <data> unchanged.
+ \_cod -----------------------------
+
+\_def\_tableA#1{\_egroup
+ \_the\_thistable \_global\_thistable={}%
+ \_ea\_ifx\_ea^\_the\_tabstrut^\_setbox\_tstrutbox=\_null
+ \_else \_setbox\_tstrutbox=\_hbox{\_the\_tabstrut}%
+ \_setbox\_tstrutbox=\_hbox{\_vrule width\_zo
+ height\_dimexpr\_ht\_tstrutbox+\_tablinespace
+ depth\_dimexpr\_dp\_tstrutbox+\_tablinespace}%
+ \_offinterlineskip
+ \_lineskip=-2\_tablinespace
+ \_fi
+ \_colnum=0 \_let\_addtabitem=\_addtabitemx
+ \_def\_tmpa{}\_tabdata={\_colnum1\_relax}\_scantabdata#1\_relax
+ \_the\_everytable \_bgroup \_catcode`\#=12 \_tableB
+}
+
+ \_doc -----------------------------
+ The \`\_tableB` saves `<data>` to `\_tmpb`
+ and does four \^`\replstring`s to prefix each macro \^`\crl` (etc.)
+ by `\_crcr`. The reason is: we want to use macros that scan its parameter
+ to the delimiter written in the right part of the table item declaration.
+ See \^`\fS` for example. The `\crcr` cannot be hidden in another macro in this case.
+
+ The `\tabskip` value is saved for places between columns
+ into the \`\_tabskipmid` macro. Then it runs
+ \begtt \catcode`\<=13
+ \tabskip=\tabskipl \halign{<converted declaration>\tabskip=\tabskipr \cr <data>\crcr}
+ \endtt
+ This sets the desired boundary values of `\tabskip`. The
+ \"between-columns" values are set as `\tabskip=`\^`\_tabskipmid` in the
+ `<converted declaration>` immediately after each column declarator.
+
+ If `pxto` keyword was used, then we set the virtual unit \^`\tsize` to
+ `\hsize` first. Then the first attempt of the table is created in box 0.
+ Then the \^`\tsize` is re-calculated using `\wd0` and the real table is
+ printed by `\halign` in the second pass.
+
+ If no `pxto` keyword was used, then we print the table using `\halign`
+ directly. The \^`\_tablew` macro is nonempty if the `to` keyword was used.
+
+ Because the color selector with `\aftergroup` can be used inside the
+ table item, we must create the second real group for each table item.
+ This is reason why we start `<converted declaration>` by `\bgroup` and we
+ end it by `\egroup` in the \`\_tableC` macro. Each `&` character
+ is stored as `\egroup&\bgroup` in `<converted declaration>`. The
+ `\halign\_tablew\_tableC` really does:
+ \begtt \catcode`\<=13
+ \halign\_tablew{\bgroup<converted declaration>\egroup\tabskip=\tabskipr \cr<data>\crcr}
+ \endtt
+ \relax
+ The <data> are re-tokenized by `\_scantextokens` in order to be more
+ robust to catcode changing inside the <data>. But inline verbatim cannot
+ work in special cases here like \code{`\{`} for example.
+ \_cod -----------------------------
+
+\_long\_def\_tableB #1{\_egroup \_def\_tmpb{#1}%
+ \_replstring\_tmpb{\crl}{\_crcr\crl}\_replstring\_tmpb{\crll}{\_crcr\crll}%
+ \_replstring\_tmpb{\crli}{\_crcr\crli}\_replstring\_tmpb{\crlli}{\_crcr\crlli}%
+ \_replstring\_tmpb{\crlp}{\_crcr\crlp}%
+ \_edef\_tabskipmid{\_the\_tabskip}\_tabskip=\_tabskipl
+ \_ifpxto
+ \_tsize=\_hsize \_setbox0 = \_vbox{\_tablepxpreset \_halign \_tableC}%
+ \_tsize=\_dimexpr\_hsize-(\_wd0-\_tmpdim)\_relax
+ \_setbox0=\_null \_halign \_tableC
+ \_else
+ \_halign\_tablew \_tableC
+ \_fi \_egroup
+}
+\_def\_tableC{\_ea{\_ea\_bgroup\_the\_tabdata\_egroup\_tabskip=\_tabskipr\_cr
+ \_scantextokens\_ea{\_tmpb\_crcr}}}
+
+\_def\_tablepxpreset{} % can be used to de-activate references to .ref file
+\_newbox\_tstrutbox % strut used in table rows
+\_newtoks\_tabdata % the \halign declaration line
+
+ \_doc -----------------------------
+ The \`\_scantabdata` macro converts `\table`'s `<declaration>` to
+ `\halign` `<converted declaration>`.
+ The result is stored into \`\_tabdata` tokens list.
+ For example, the
+ following result is generated when `<declaration>=|cr||cl|`.
+ \begtt
+ tabdata: \_vrule\_the\_tabiteml\_hfil#\_unsskip\_hfil\_the\_tabitemr\_tabstrutA
+ &\_the\_tabiteml\_hfil#\_unsskip\_the\_tabitemr
+ \_vrule\_kern\_vvkern\_vrule\_tabstrutA
+ &\_the\_tabiteml\_hfil#\_unsskip\_hfil\_the\_tabitemr\_tabstrutA
+ &\_the\_tabiteml#\_unsskip\_hfil\_the\_tabitemr\_vrule\_tabstrutA
+ ddlinedata: &\_dditem &\_dditem\_vvitem &\_dditem &\_dditem
+ \endtt
+ The second result in the \`\_ddlinedata` macro is a template of one row of the table
+ used by \^`\crli` macro.
+ \_cod -----------------------------
+
+\_def\_scantabdata#1{\_let\_next=\_scantabdata
+ \_ifx\_relax#1\_let\_next=\_relax
+ \_else\_ifx|#1\_addtabvrule
+ \_else\_ifx(#1\_def\_next{\_scantabdataE}%
+ \_else\_ifx:#1\_def\_next{\_scantabdataF}%
+ \_else\_isinlist{123456789}#1\_iftrue \_def\_next{\_scantabdataC#1}%
+ \_else \_ea\_ifx\_csname _tabdeclare#1\_endcsname \_relax
+ \_ea\_ifx\_csname _paramtabdeclare#1\_endcsname \_relax
+ \_opwarning{tab-declarator "#1" unknown, ignored}%
+ \_else
+ \_def\_next{\_ea\_scantabdataB\_csname _paramtabdeclare#1\_endcsname}\_fi
+ \_else \_def\_next{\_ea\_scantabdataA\_csname _tabdeclare#1\_endcsname}%
+ \_fi\_fi\_fi\_fi\_fi\_fi \_next
+}
+\_def\_scantabdataA#1{\_addtabitem
+ \_ea\_addtabdata\_ea{#1\_tabstrutA \_tabskip\_tabskipmid\_relax}\_scantabdata}
+\_def\_scantabdataB#1#2{\_addtabitem
+ \_ea\_addtabdata\_ea{#1{#2}\_tabstrutA \_tabskip\_tabskipmid\_relax}\_scantabdata}
+\_def\_scantabdataC {\_def\_tmpb{}\_afterassignment\_scantabdataD \_tmpnum=}
+\_def\_scantabdataD#1{\_loop \_ifnum\_tmpnum>0 \_advance\_tmpnum by-1 \_addto\_tmpb{#1}\_repeat
+ \_ea\_scantabdata\_tmpb}
+\_def\_scantabdataE#1){\_addtabdata{#1}\_scantabdata}
+\_def\_scantabdataF {\_addtabitem\_def\_addtabitem{\_let\_addtabitem=\_addtabitemx}\_scantabdata}
+
+ \_doc -----------------------------
+ The \`\_addtabitemx` adds the boundary code (used between columns)
+ to the <converted declaration>. This code is
+ `\egroup &\bgroup \colnum=<value>\relax`. You can get the current number of
+ column from the \`\colnum` register, but you cannot write
+ `\the\colnum` as the first object in a <data> item because `\halign`
+ first expands the front of the item and the left part of the declaration
+ is processed after this. Use `\relax\the\colnum` instead. Or you can
+ write:
+ \begtt
+ \def\showcolnum{\ea\def\ea\totcolnum\ea{\the\colnum}\the\colnum/\totcolnum}
+ \table{ccc}{\showcolnum & \showcolnum & \showcolnum}
+ \endtt
+ This example prints 1/3 \ 2/3 \ 3/3, because the value of the `\colnum` is
+ equal to the total number of columns before left part of the column declaration
+ is processed.
+ \_cod -----------------------------
+
+\_newcount\_colnum % number of current column in the table
+\_public \colnum ;
+
+\_def\_addtabitemx{\_ifnum\_colnum>0
+ \_addtabdata{\_egroup &\_bgroup}\_addto\_ddlinedata{&\_dditem}\_fi
+ \_advance\_colnum by1 \_let\_tmpa=\_relax
+ \_ifnum\_colnum>1 \_ea\_addtabdata\_ea{\_ea\_colnum\_the\_colnum\_relax}\_fi}
+\_def\_addtabdata#1{\_tabdata\_ea{\_the\_tabdata#1}}
+
+ \_doc -----------------------------
+ This code converts `||` or `|` from `\table` <declaration> to the <converted declaration>.
+ \_cod -----------------------------
+
+\_def\_addtabvrule{%
+ \_ifx\_tmpa\_vrule \_addtabdata{\_kern\_vvkern}%
+ \_ifnum\_colnum=0 \_addto\_vvleft{\_vvitem}\_else\_addto\_ddlinedata{\_vvitem}\_fi
+ \_else \_ifnum\_colnum=0 \_addto\_vvleft{\_vvitemA}\_else\_addto\_ddlinedata{\_vvitemA}\_fi\_fi
+ \_let\_tmpa=\_vrule \_addtabdata{\_vrule}%
+}
+\_def\_tabstrutA{\_copy\_tstrutbox}
+\_def\_vvleft{}
+\_def\_ddlinedata{}
+
+ \_doc -----------------------------
+ The default \"declaration letters" `c`, `l`, `r` and `p` are declared
+ by setting \`\_tabdeclarec`, \`\_tabdeclarel`, \`\_tabdeclarer` and
+ \`\_paramtabdeclarep` macros. In general, define
+ `\def\_tabdeclare<letter>{...}` for a non-parametric
+ letter and `\def\_paramtabdeclare<letter>{...}` for a letter with a parameter.
+ The double hash `##` must be in the definition, it is replaced by a real table item data.
+ You can declare more such \"declaration letters" if you want.
+ \_cod -----------------------------
+
+\_def\_tabdeclarec{\_the\_tabiteml\_hfil##\_unsskip\_hfil\_the\_tabitemr}
+\_def\_tabdeclarel{\_the\_tabiteml\_relax##\_unsskip\_hfil\_the\_tabitemr}
+\_def\_tabdeclarer{\_the\_tabiteml\_hfil##\_unsskip\_the\_tabitemr}
+\_def\_paramtabdeclarep#1{\_the\_tabiteml
+ \_vtop{\_hsize=#1\_relax \_baselineskip=\_normalbaselineskip
+ \_lineskiplimit=\_zo \_noindent##\_unsskip
+ \_ifvmode\_vskip\_dp\_tstrutbox \_else\_lower\_dp\_tstrutbox\_hbox{}\_fi}\_the\_tabitemr}
+
+ \_doc -----------------------------
+ Users put optional spaces around the table item typically, i.e.\ they write
+ `& text &` instead `&text&`. The left space is ignored by the internal \TeX/ algorithm but
+ the right space must be removed by macros. This is a reason why we recommend to
+ use \`\_unsskip` after each `##` in your definition of \"declaration letters".
+ This macro isn't only the primitive `\unskip` because we allow usage of plain \TeX/
+ `\hideskip` macro: `&\hideskip text\hideskip&`.
+ \_cod -----------------------------
+
+\_def\_unsskip{\_ifmmode\_else\_ifdim\_lastskip>\_zo \_unskip\_fi\_fi}
+
+ \_doc -----------------------------
+ The \`\fL`, \`\fR`, \`\fC` and \`\fX` macros only do special parameters settings
+ for paragraph building algorithm. The \`\fS` prints the paragraph into
+ box 0 first, measures the number of lines by the `\prevgraf` primitive
+ and use (or don't use) `\hfil` (for centering) before the first line.
+ \_cod -----------------------------
+
+\_let\_fL=\_raggedright
+\_def\_fR{\_leftskip=0pt plus 1fill \_relax}
+\_def\_fC{\_leftskip=0pt plus1fill \_rightskip=0pt plus 1fill \_relax}
+\_def\_fX{\_leftskip=0pt plus1fil \_rightskip=0pt plus-1fil \_parfillskip=0pt plus2fil \_relax}
+\_long\_def\_fS #1\_unsskip{\_noindent \_setbox0 =\_vbox{\_noindent #1\_endgraf \_ea}%
+ \_ifnum\_prevgraf=1 \_hfil \_fi #1\_unsskip
+}
+\_public \fL \fR \fC \fX \fS ;
+
+ \_doc -----------------------------
+ The family of `\_cr*` macros
+ \`\crl`, \`\crll`, \`\crli`, \`\crlli`, \`\crlp` and
+ \`\tskip` `<dimen>` is implemented here.
+ The \`\_zerotabrule` is used to suppress the negative `\lineskip`
+ declared by \^`\tablinespace`.
+ \_cod -----------------------------
+
+\_def\_crl{\_crcr\_noalign{\_hrule}}
+\_def\_crll{\_crcr\_noalign{\_hrule\_kern\_hhkern\_hrule}}
+\_def\_zerotabrule {\_noalign{\_hrule height\_zo width\_zo depth\_zo}}
+
+\_def\_crli{\_crcr \_zerotabrule \_omit
+ \_gdef\_dditem{\_omit\_tablinefil}\_gdef\_vvitem{\_kern\_vvkern\_vrule}\_gdef\_vvitemA{\_vrule}%
+ \_vvleft\_tablinefil\_ddlinedata\_crcr \_zerotabrule}
+\_def\_crlli{\_crli\_noalign{\_kern\_hhkern}\_crli}
+\_def\_tablinefil{\_leaders\_hrule\_hfil}
+
+\_def\_crlp#1{\_crcr \_zerotabrule \_noalign{\_kern-\_drulewidth}%
+ \_omit \_xdef\_crlplist{#1}\_xdef\_crlplist{,\_ea}\_ea\_crlpA\_crlplist,\_end,%
+ \_global\_tmpnum=0 \_gdef\_dditem{\_omit\_crlpD}%
+ \_gdef\_vvitem{\_kern\_vvkern\_kern\_drulewidth}\_gdef\_vvitemA{\_kern\_drulewidth}%
+ \_vvleft\_crlpD\_ddlinedata \_global\_tmpnum=0 \_crcr \_zerotabrule}
+\_def\_crlpA#1,{\_ifx\_end#1\_else \_crlpB#1-\_end,\_ea\_crlpA\_fi}
+\_def\_crlpB#1#2-#3,{\_ifx\_end#3\_xdef\_crlplist{\_crlplist#1#2,}\_else\_crlpC#1#2-#3,\_fi}
+\_def\_crlpC#1-#2-#3,{\_tmpnum=#1\_relax
+ \_loop \_xdef\_crlplist{\_crlplist\_the\_tmpnum,}\_ifnum\_tmpnum<#2\_advance\_tmpnum by1 \_repeat}
+\_def\_crlpD{\_incr\_tmpnum \_edef\_tmpa{\_noexpand\_isinlist\_noexpand\_crlplist{,\_the\_tmpnum,}}%
+ \_tmpa\_iftrue \_kern-\_drulewidth \_tablinefil \_kern-\_drulewidth\_else\_hfil \_fi}
+
+\_def\_tskip{\_afterassignment\_tskipA \_tmpdim}
+\_def\_tskipA{\_gdef\_dditem{}\_gdef\_vvitem{}\_gdef\_vvitemA{}\_gdef\_tabstrutA{}%
+ \_vbox to\_tmpdim{}\_ddlinedata \_crcr
+ \_zerotabrule \_noalign{\_gdef\_tabstrutA{\_copy\_tstrutbox}}}
+
+\_public \crl \crll \crli \crlli \crlp \tskip ;
+
+ \_doc -----------------------------
+ The \`\mspan``{<number>}[<declaration>]{<text>}` macro generates similar `\omit\span\omit\span`
+ sequence as plain \TeX/ macro `\multispan`. Moreover, it uses \^`\_scantabdata` to
+ convert `<declaration>` from `\table` syntax to `\halign` syntax.
+ \_cod -----------------------------
+
+\_def\_mspan{\_omit \_afterassignment\_mspanA \_mscount=}
+\_def\_mspanA[#1]#2{\_loop \_ifnum\_mscount>1 \_cs{_span}\_omit \_advance\_mscount-1 \_repeat
+ \_count1=\_colnum \_colnum=0 \_def\_tmpa{}\_tabdata={}\_scantabdata#1\_relax
+ \_colnum=\_count1 \_setbox0=\_vbox{\_halign\_ea{\_ea\_bgroup\_the\_tabdata\_egroup\_cr#2\_cr}%
+ \_global\_setbox8=\_lastbox}%
+ \_setbox0=\_hbox{\_unhbox8 \_unskip \_global\_setbox8=\_lastbox}%
+ \_unhbox8 \_ignorespaces}
+\_public \mspan ;
+
+ \_doc -----------------------------
+ The \`\vspan``<number>{<text>}` implementation is here.
+ We need to lower the box by
+ \begtt \catcode`\<=13
+ (<number>-1)*(\ht+\dp of \tabstrut) / 2.
+ \endtt
+ The `#1` parameter must be a one-digit number. If you want to set more digits
+ then use braces.
+ \_cod -----------------------------
+
+\_def\_vspan#1#2#{\_vspanA{#1#2}}
+\_def\_vspanA#1#2{\_vtop to\_zo{\_hbox{\_lower \_dimexpr
+ #1\_dimexpr(\_ht\_tstrutbox+\_dp\_tstrutbox)/2\_relax
+ -\_dimexpr(\_ht\_tstrutbox+\_dp\_tstrutbox)/2\_relax \_hbox{#2}}\_vss}}
+\_public \vspan ;
+
+ \_doc -----------------------------
+ The parameters of primitive `\vrule` and `\hrule` keeps the rule \"last wins".
+ If we re-define `\hrule` to `\_orihrule height1pt` then each usage
+ of redefined `\hrule` uses `1pt` height if this parameter isn't
+ overwritten by another following `height` parameter. This principle is used for
+ settings another default rule thickness than 0.4\,pt by the macro
+ \`\rulewidth`.
+ \_cod -----------------------------
+
+\_newdimen\_drulewidth \_drulewidth=0.4pt
+\_let\_orihrule=\_hrule \_let\_orivrule=\_vrule
+\_def\_rulewidth{\_afterassignment\_rulewidthA \_drulewidth}
+\_def\_rulewidthA{\_edef\_hrule{\_orihrule height\_drulewidth}%
+ \_edef\_vrule{\_orivrule width\_drulewidth}%
+ \_let\_rulewidth=\_drulewidth
+ \_public \vrule \hrule \rulewidth;}
+\_public \rulewidth ;
+
+ \_doc -----------------------------
+ The \`\frame``{<text>}` uses \"\code{\\vbox} in \code{\\vtop}" trick in order to keep the
+ baseline of the internal text at the same level as outer baseline.
+ User can write `\frame{abcxyz}` in normal paragraph line, for example
+ and gets the expected result: \frame{abcxyz}.
+ The internal margins are set by `\vvkern` and `\hhkern` parameters.
+ \_cod -----------------------------
+
+\_long\_def\_frame#1{%
+ \_hbox{\_vrule\_vtop{\_vbox{\_hrule\_kern\_vvkern
+ \_hbox{\_kern\_hhkern\_relax#1\_kern\_hhkern}%
+ }\_kern\_vvkern\_hrule}\_vrule}}
+\_public \frame ;
+
+ \_doc -----------------------------
+ \`\eqbox` and \`\eqboxsize` are implemented here. The widths of
+ all `\eqbox`es are saved to the `.ref` file in the format
+ \`\_Xeqbox``{<label>}{<size>}`. The `.ref` file is read again and maximum
+ box width for each <label> is saved to `\_eqb:<label>`.
+ \_cod -----------------------------
+
+\_def\_Xeqbox#1#2{%
+ \_ifcsname _eqb:#1\_endcsname
+ \_ifdim #2>\_cs{_eqb:#1}\_relax \_sdef{_eqb:#1}{#2}\_fi
+ \_else \_sdef{_eqb:#1}{#2}\_fi
+}
+\_def\_eqbox #1[#2]#3{\_setbox0=\_hbox{{#3}}%
+ \_openref \_immediate\_wref \_Xeqbox{{#2}{\_the\_wd0}}%
+ \_ifcsname _eqb:#2\_endcsname
+ \_hbox to\_cs{_eqb:#2}{\_ifx r#1\_hfill\_fi\_hss\_unhbox0\_hss\_ifx l#1\_hfill\_fi}%
+ \_else \_box0 \_fi
+}
+\_def\_eqboxsize [#1]#2{\_trycs{_eqb:#1}{#2}}
+
+\public \eqbox \eqboxsize ;
+
+\_endcode % -------------------------------------
+
+\secc[table.bound] The boundary declarator \code{:}
+
+The `<declaration>` part of `\table{<declaration>}{<data>}` includes
+column declarators (letters) and other material: the `|` or `(<cmd>)`.
+If the boundary declarator `:` is not used then
+the boundaries of columns are just before each column declarator
+with exception of the first one.
+For example, the declaration `{|c||c(xx)(yy)c}`
+should be written more exactly using the boundary declarator `:`
+by `{|c||:c(xx)(yy):c}`. But you can set these boundaries to
+other places using the boundary declarator~`:` explicitly,
+for example `{|c:||c(xx):(yy)c}`. The boundary declarator `:`
+can be used only once between each pair of column declarators.
+
+Each table item has its group. The `(<cmd>)` are parts of the given
+table item (depending on the boundary declarator position).
+If you want to apply a special setting for a given column, you can do this by
+`(<setting>)` followed by column declarator. But if the column is not
+first, you must use `:(<setting>)`. Example. We have three centered columns,
+the second one have to be in bold font and the third one have to be in red:
+`\table{c:(\bf)c:(\Red)c}{<data>}`
+
+\secc Usage of the \code{\\tabskip} primitive
+
+The value of `\tabskip` primitive is used between all columns of the table.
+It is glue-type, so it can be stretchable or shrinkable, see next
+section~\ref[table.w].
+
+By default, `\tabskip` is 0\,pt. It means that only \^`\tabiteml`,
+\^`\tabitemr` and `(<cmds>)` can generate visual spaces between columns. But they
+are not real spaces between columns because they are in fact the part of
+the total column width.
+
+The `\tabskip` value declared before the \^`\table` macro (or in
+\^`\everytable` or in \^`\thistable`) is used between all columns in the table.
+This value is equal to all spaces between columns. But you can set each such space
+individually if you use `(\tabskip=<value>)` in the <declaration> immediately
+before boundary character. The boundary character represents the column pair for
+which the `\tabskip` has individual value. For example
+`c(\tabskip=5pt):r` gives `\tabskip` value between `c` and `r` columns.
+You need not use boundary character explicitly, so `c(\tabskip=5pt)r` gives
+the same result.
+
+Space before the first column is given by the \^`\tabskipl`
+and space after the last column is equal to \^`\tabskipr`.
+Default values are 0\,pt.
+
+Use nonzero `\tabskip` only in special applications. If `\tabskip` is
+nonzero then horizontal lines generated by \^`\crli`, \^`\crlli` and \^`\crlp`
+have another behavior than you probably expected: they are interrupted in
+each `\tabskip` space.
+
+\secc[table.w] Tables to given width
+
+There are two possibilities how to create tables to given width:
+
+\begitems
+* `\table to<size>{<declaration>}{<data>}` uses stretchability or
+ shrinkability of all spaces between columns generated by `\tabskip` value and
+ eventually by \^`\tabskipl`, \^`\tabskipr` values. See example below.
+* `\table pxto<size>{<declaration>}{<data>}` expands the columns declared
+ by `p{<size>}`, if the `<size>` is given by a virtual \^`\tsize` unit.
+ See the example below.
+\enditems
+
+Example of `\table to<size>`:
+
+\begtt \catcode`\<=13
+\thistable{\tabskip=0pt plus1fil minus1fil}
+\table to\hsize {lr}{<data>}
+\endtt
+%
+This table has its width `\hsize`. The first column starts at the left boundary of
+this table and it is justified left (to the boundary). The second column ends at
+the right boundary of the table and it is justified right (to the boundary).
+The space between them is stretchable and shrinkable to reach
+the given width `\hsize`.
+
+\medskip
+Example of `\table pxto<size>` (means \"{\bf p}aragraphs e{\bf x}panded {\bf to}"):
+
+\begtt
+\table pxto\hsize {|c|p{\tsize}|}{\crl
+ aaa & Ddkas jd dsjds ds cgha sfgs dd fddzf dfhz xxz
+ dras ffg hksd kds d sdjds h sd jd dsjds ds cgha
+ sfgs dd fddzf dfhz xxz. \crl
+ bb ddd ggg & Dsjds ds cgha sfgs dd fddzf dfhz xxz
+ ddkas jd dsjds ds cgha sfgs dd fddzf. \crl }
+\endtt
+
+\noindent\table pxto\hsize {|c|p{\tsize}|}{\crl
+ aaa & Ddkas jd dsjds ds cgha sfgs dd fddzf dfhz xxz
+ dras ffg hksd kds d sdjds h sd jd dsjds ds cgha
+ sfgs dd fddzf dfhz xxz. \crl
+ bb ddd ggg & Dsjds ds cgha sfgs dd fddzf dfhz xxz
+ ddkas jd dsjds ds cgha sfgs dd fddzf. \crl }
+\medskip
+
+The first `c` column is variable width (it gets the width of the most wide item)
+and the resting space to given `\hsize` is filled by the `p` column.
+
+You can declare more than one `p{<coefficient>\tsize}` columns in the table
+when `pxto` keyword is used. The total sum of <coefficinets> must be exactly one.
+For example,
+
+\begtt \catcode`\<=13
+\table pxto13cm {r p{.3\tsize} p{.5\tsize} p{.2\tsize} l}{<data>}
+\endtt
+%
+This gives the ratio of widths of individual paragraphs in the table.
+
+\secc `\eqbox`: boxes with equal width across the whole document
+
+The \^`\eqbox` `[<label>]{<text>}` behaves like `\hbox{<text>}` in the first
+run of \TeX. But the widths of all boxes with the same label are saved to
+`.ref` file and the maximum box width for each label is calculated at the
+beginning of the next \TeX/ run. Then \^`\eqbox`~`[<label>]{<text>}` behaves
+like `\hbox to <dim:label> {\hss <text>\hss}`, where <dim:label> is
+the maximum width of all boxes
+labeled by the same `[<label>]`. The documentation of the \LaTeX/ package
+`eqparbox` includes more information and tips.
+
+The \^`\eqboxsize` `[<label>]{<dimen>}` expands to <dim:label> if this value is known,
+else it expands to the given <dimen>.
+
+The optional parameter `r` or `l` can be written before `[<label>]` (for example
+`\eqbox r[label]{text}`) if you want to put the text to the right or to the
+left side of the box width.
+
+Try the following example and watch what happens after first \TeX/ run and
+after the second one.
+
+\begtt
+\def\leftitem#1{\par
+ \noindent \hangindent=\eqboxsize[items]{2em}\hangafter=1
+ \eqbox r[items]{#1 }\ignorespaces}
+
+\leftitem {\bf first} \lorem[1]
+\leftitem {\bf second one} \lorem[2]
+\leftitem {\bf final} \lorem[3]
+\endtt
+
+
+\_endinput
+
+2021-03-09 \_tablepxpreset introduced
+2021-02-15 \_expandafter -> \_ea
+2021-01-27 \_tableB: \long\def added, \vspan syntax improved
+2020-05-26 \eqbox implemented
+2020-05-20 \colnum implemented.
+ \vspan implemented.
+2020-05-19 \fL, \fR ets defined.
+ \table to, \table pxto implemented.
+2020-05-10 \bgroup &\egroup added to tabdata (in order to \aftergroup from colors)
+ boundary declarator : introduced
+ \_unsskip: \ifmmode added.
+2020-04-10 second group for items in order to \localcolors
diff --git a/macros/optex/base/uni-lcuc.opm b/macros/optex/base/uni-lcuc.opm
new file mode 100644
index 0000000000..2a99f52d66
--- /dev/null
+++ b/macros/optex/base/uni-lcuc.opm
@@ -0,0 +1,15944 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+% Preloaded in format. A copy o uni-lcuc.tex fom csplain is here:
+
+% uni-lcuc.tex -- sets \lccodes and \uccodes for Unicode chars, nothing more
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Petr Olsak, Jul. 2014
+
+\_wterm{Setting lccodes and uccodes for Unicode characters}
+
+\_def\_tmp #1 #2 {\_ifx^#1^\_else
+ \_lccode"#1="#1
+ \_ifx.#2%
+ \_uccode"#1="#1
+ \_else
+ \_uccode"#2="#2
+ \_lccode"#2="#1
+ \_uccode"#1="#2
+ \_fi
+ \_ea \_tmp \_fi
+}
+\_tmp
+00AA .
+00B5 039C
+00BA .
+00E0 00C0
+00E1 00C1
+00E2 00C2
+00E3 00C3
+00E4 00C4
+00E5 00C5
+00E6 00C6
+00E7 00C7
+00E8 00C8
+00E9 00C9
+00EA 00CA
+00EB 00CB
+00EC 00CC
+00ED 00CD
+00EE 00CE
+00EF 00CF
+00F0 00D0
+00F1 00D1
+00F2 00D2
+00F3 00D3
+00F4 00D4
+00F5 00D5
+00F6 00D6
+00F8 00D8
+00F9 00D9
+00FA 00DA
+00FB 00DB
+00FC 00DC
+00FD 00DD
+00FE 00DE
+00DF .
+00FF 0178
+0101 0100
+0103 0102
+0105 0104
+0107 0106
+0109 0108
+010B 010A
+010D 010C
+010F 010E
+0111 0110
+0113 0112
+0115 0114
+0117 0116
+0119 0118
+011B 011A
+011D 011C
+011F 011E
+0121 0120
+0123 0122
+0125 0124
+0127 0126
+0129 0128
+012B 012A
+012D 012C
+012F 012E
+0133 0132
+0135 0134
+0137 0136
+0138 .
+013A 0139
+013C 013B
+013E 013D
+0140 013F
+0142 0141
+0144 0143
+0146 0145
+0148 0147
+0149 .
+014B 014A
+014D 014C
+014F 014E
+0151 0150
+0153 0152
+0155 0154
+0157 0156
+0159 0158
+015B 015A
+015D 015C
+015F 015E
+0161 0160
+0163 0162
+0165 0164
+0167 0166
+0169 0168
+016B 016A
+016D 016C
+016F 016E
+0171 0170
+0173 0172
+0175 0174
+0177 0176
+017A 0179
+017C 017B
+017E 017D
+0180 0243
+0253 0181
+0183 0182
+0185 0184
+0254 0186
+0188 0187
+0256 0189
+0257 018A
+018C 018B
+018D .
+01DD 018E
+0259 018F
+025B 0190
+0192 0191
+0260 0193
+0263 0194
+0195 01F6
+0269 0196
+0268 0197
+0199 0198
+019A 023D
+019B .
+026F 019C
+0272 019D
+019E 0220
+0275 019F
+01A1 01A0
+01A3 01A2
+01A5 01A4
+0280 01A6
+01A8 01A7
+0283 01A9
+01AA .
+01AB .
+01AD 01AC
+0288 01AE
+01B0 01AF
+028A 01B1
+028B 01B2
+01B4 01B3
+01B6 01B5
+0292 01B7
+01B9 01B8
+01BA .
+01BB .
+01BD 01BC
+01BE .
+01BF 01F7
+01C0 .
+01C1 .
+01C2 .
+01C3 .
+01C6 01C4
+01C9 01C7
+01CC 01CA
+01CE 01CD
+01D0 01CF
+01D2 01D1
+01D4 01D3
+01D6 01D5
+01D8 01D7
+01DA 01D9
+01DC 01DB
+01DF 01DE
+01E1 01E0
+01E3 01E2
+01E5 01E4
+01E7 01E6
+01E9 01E8
+01EB 01EA
+01ED 01EC
+01EF 01EE
+01F0 .
+01F3 01F1
+01F5 01F4
+01F9 01F8
+01FB 01FA
+01FD 01FC
+01FF 01FE
+0201 0200
+0203 0202
+0205 0204
+0207 0206
+0209 0208
+020B 020A
+020D 020C
+020F 020E
+0211 0210
+0213 0212
+0215 0214
+0217 0216
+0219 0218
+021B 021A
+021D 021C
+021F 021E
+0221 .
+0223 0222
+0225 0224
+0227 0226
+0229 0228
+022B 022A
+022D 022C
+022F 022E
+0231 0230
+0233 0232
+0234 .
+0235 .
+0236 .
+0237 .
+0238 .
+0239 .
+2C65 023A
+023C 023B
+2C66 023E
+023F 2C7E
+0240 2C7F
+0242 0241
+0289 0244
+028C 0245
+0247 0246
+0249 0248
+024B 024A
+024D 024C
+024F 024E
+0250 2C6F
+0251 2C6D
+0252 2C70
+0255 .
+0258 .
+025A .
+025C .
+025D .
+025E .
+025F .
+0261 .
+0262 .
+0264 .
+0265 A78D
+0266 A7AA
+0267 .
+026A .
+026B 2C62
+026C .
+026D .
+026E .
+0270 .
+0271 2C6E
+0273 .
+0274 .
+0276 .
+0277 .
+0278 .
+0279 .
+027A .
+027B .
+027C .
+027D 2C64
+027E .
+027F .
+0281 .
+0282 .
+0284 .
+0285 .
+0286 .
+0287 .
+028D .
+028E .
+028F .
+0290 .
+0291 .
+0293 .
+0294 .
+0295 .
+0296 .
+0297 .
+0298 .
+0299 .
+029A .
+029B .
+029C .
+029D .
+029E .
+029F .
+02A0 .
+02A1 .
+02A2 .
+02A3 .
+02A4 .
+02A5 .
+02A6 .
+02A7 .
+02A8 .
+02A9 .
+02AA .
+02AB .
+02AC .
+02AD .
+02AE .
+02AF .
+02B0 .
+02B1 .
+02B2 .
+02B3 .
+02B4 .
+02B5 .
+02B6 .
+02B7 .
+02B8 .
+02B9 .
+02BA .
+02BB .
+02BC .
+02BD .
+02BE .
+02BF .
+02C0 .
+02C1 .
+02C6 .
+02C7 .
+02C8 .
+02C9 .
+02CA .
+02CB .
+02CC .
+02CD .
+02CE .
+02CF .
+02D0 .
+02D1 .
+02E0 .
+02E1 .
+02E2 .
+02E3 .
+02E4 .
+02EC .
+02EE .
+0371 0370
+0373 0372
+0374 .
+0377 0376
+037A .
+037B 03FD
+037C 03FE
+037D 03FF
+03AC 0386
+03AD 0388
+03AE 0389
+03AF 038A
+03CC 038C
+03CD 038E
+03CE 038F
+0390 .
+03B1 0391
+03B2 0392
+03B3 0393
+03B4 0394
+03B5 0395
+03B6 0396
+03B7 0397
+03B8 0398
+03B9 0399
+03BA 039A
+03BB 039B
+03BD 039D
+03BE 039E
+03BF 039F
+03C0 03A0
+03C1 03A1
+03C3 03A3
+03C4 03A4
+03C5 03A5
+03C6 03A6
+03C7 03A7
+03C8 03A8
+03C9 03A9
+03CA 03AA
+03CB 03AB
+03B0 .
+03D7 03CF
+03D2 .
+03D3 .
+03D4 .
+03D9 03D8
+03DB 03DA
+03DD 03DC
+03DF 03DE
+03E1 03E0
+03E3 03E2
+03E5 03E4
+03E7 03E6
+03E9 03E8
+03EB 03EA
+03ED 03EC
+03EF 03EE
+03F2 03F9
+03F3 .
+03F8 03F7
+03FB 03FA
+03FC .
+0450 0400
+0451 0401
+0452 0402
+0453 0403
+0454 0404
+0455 0405
+0456 0406
+0457 0407
+0458 0408
+0459 0409
+045A 040A
+045B 040B
+045C 040C
+045D 040D
+045E 040E
+045F 040F
+0430 0410
+0431 0411
+0432 0412
+0433 0413
+0434 0414
+0435 0415
+0436 0416
+0437 0417
+0438 0418
+0439 0419
+043A 041A
+043B 041B
+043C 041C
+043D 041D
+043E 041E
+043F 041F
+0440 0420
+0441 0421
+0442 0422
+0443 0423
+0444 0424
+0445 0425
+0446 0426
+0447 0427
+0448 0428
+0449 0429
+044A 042A
+044B 042B
+044C 042C
+044D 042D
+044E 042E
+044F 042F
+0461 0460
+0463 0462
+0465 0464
+0467 0466
+0469 0468
+046B 046A
+046D 046C
+046F 046E
+0471 0470
+0473 0472
+0475 0474
+0477 0476
+0479 0478
+047B 047A
+047D 047C
+047F 047E
+0481 0480
+048B 048A
+048D 048C
+048F 048E
+0491 0490
+0493 0492
+0495 0494
+0497 0496
+0499 0498
+049B 049A
+049D 049C
+049F 049E
+04A1 04A0
+04A3 04A2
+04A5 04A4
+04A7 04A6
+04A9 04A8
+04AB 04AA
+04AD 04AC
+04AF 04AE
+04B1 04B0
+04B3 04B2
+04B5 04B4
+04B7 04B6
+04B9 04B8
+04BB 04BA
+04BD 04BC
+04BF 04BE
+04CF 04C0
+04C2 04C1
+04C4 04C3
+04C6 04C5
+04C8 04C7
+04CA 04C9
+04CC 04CB
+04CE 04CD
+04D1 04D0
+04D3 04D2
+04D5 04D4
+04D7 04D6
+04D9 04D8
+04DB 04DA
+04DD 04DC
+04DF 04DE
+04E1 04E0
+04E3 04E2
+04E5 04E4
+04E7 04E6
+04E9 04E8
+04EB 04EA
+04ED 04EC
+04EF 04EE
+04F1 04F0
+04F3 04F2
+04F5 04F4
+04F7 04F6
+04F9 04F8
+04FB 04FA
+04FD 04FC
+04FF 04FE
+0501 0500
+0503 0502
+0505 0504
+0507 0506
+0509 0508
+050B 050A
+050D 050C
+050F 050E
+0511 0510
+0513 0512
+0515 0514
+0517 0516
+0519 0518
+051B 051A
+051D 051C
+051F 051E
+0521 0520
+0523 0522
+0525 0524
+0527 0526
+0561 0531
+0562 0532
+0563 0533
+0564 0534
+0565 0535
+0566 0536
+0567 0537
+0568 0538
+0569 0539
+056A 053A
+056B 053B
+056C 053C
+056D 053D
+056E 053E
+056F 053F
+0570 0540
+0571 0541
+0572 0542
+0573 0543
+0574 0544
+0575 0545
+0576 0546
+0577 0547
+0578 0548
+0579 0549
+057A 054A
+057B 054B
+057C 054C
+057D 054D
+057E 054E
+057F 054F
+0580 0550
+0581 0551
+0582 0552
+0583 0553
+0584 0554
+0585 0555
+0586 0556
+0559 .
+0587 .
+05D0 .
+05D1 .
+05D2 .
+05D3 .
+05D4 .
+05D5 .
+05D6 .
+05D7 .
+05D8 .
+05D9 .
+05DA .
+05DB .
+05DC .
+05DD .
+05DE .
+05DF .
+05E0 .
+05E1 .
+05E2 .
+05E3 .
+05E4 .
+05E5 .
+05E6 .
+05E7 .
+05E8 .
+05E9 .
+05EA .
+05F0 .
+05F1 .
+05F2 .
+0620 .
+0621 .
+0622 .
+0623 .
+0624 .
+0625 .
+0626 .
+0627 .
+0628 .
+0629 .
+062A .
+062B .
+062C .
+062D .
+062E .
+062F .
+0630 .
+0631 .
+0632 .
+0633 .
+0634 .
+0635 .
+0636 .
+0637 .
+0638 .
+0639 .
+063A .
+063B .
+063C .
+063D .
+063E .
+063F .
+0640 .
+0641 .
+0642 .
+0643 .
+0644 .
+0645 .
+0646 .
+0647 .
+0648 .
+0649 .
+064A .
+066E .
+066F .
+0671 .
+0672 .
+0673 .
+0674 .
+0675 .
+0676 .
+0677 .
+0678 .
+0679 .
+067A .
+067B .
+067C .
+067D .
+067E .
+067F .
+0680 .
+0681 .
+0682 .
+0683 .
+0684 .
+0685 .
+0686 .
+0687 .
+0688 .
+0689 .
+068A .
+068B .
+068C .
+068D .
+068E .
+068F .
+0690 .
+0691 .
+0692 .
+0693 .
+0694 .
+0695 .
+0696 .
+0697 .
+0698 .
+0699 .
+069A .
+069B .
+069C .
+069D .
+069E .
+069F .
+06A0 .
+06A1 .
+06A2 .
+06A3 .
+06A4 .
+06A5 .
+06A6 .
+06A7 .
+06A8 .
+06A9 .
+06AA .
+06AB .
+06AC .
+06AD .
+06AE .
+06AF .
+06B0 .
+06B1 .
+06B2 .
+06B3 .
+06B4 .
+06B5 .
+06B6 .
+06B7 .
+06B8 .
+06B9 .
+06BA .
+06BB .
+06BC .
+06BD .
+06BE .
+06BF .
+06C0 .
+06C1 .
+06C2 .
+06C3 .
+06C4 .
+06C5 .
+06C6 .
+06C7 .
+06C8 .
+06C9 .
+06CA .
+06CB .
+06CC .
+06CD .
+06CE .
+06CF .
+06D0 .
+06D1 .
+06D2 .
+06D3 .
+06D5 .
+06E5 .
+06E6 .
+06EE .
+06EF .
+06FA .
+06FB .
+06FC .
+06FF .
+0710 .
+0712 .
+0713 .
+0714 .
+0715 .
+0716 .
+0717 .
+0718 .
+0719 .
+071A .
+071B .
+071C .
+071D .
+071E .
+071F .
+0720 .
+0721 .
+0722 .
+0723 .
+0724 .
+0725 .
+0726 .
+0727 .
+0728 .
+0729 .
+072A .
+072B .
+072C .
+072D .
+072E .
+072F .
+074D .
+074E .
+074F .
+0750 .
+0751 .
+0752 .
+0753 .
+0754 .
+0755 .
+0756 .
+0757 .
+0758 .
+0759 .
+075A .
+075B .
+075C .
+075D .
+075E .
+075F .
+0760 .
+0761 .
+0762 .
+0763 .
+0764 .
+0765 .
+0766 .
+0767 .
+0768 .
+0769 .
+076A .
+076B .
+076C .
+076D .
+076E .
+076F .
+0770 .
+0771 .
+0772 .
+0773 .
+0774 .
+0775 .
+0776 .
+0777 .
+0778 .
+0779 .
+077A .
+077B .
+077C .
+077D .
+077E .
+077F .
+0780 .
+0781 .
+0782 .
+0783 .
+0784 .
+0785 .
+0786 .
+0787 .
+0788 .
+0789 .
+078A .
+078B .
+078C .
+078D .
+078E .
+078F .
+0790 .
+0791 .
+0792 .
+0793 .
+0794 .
+0795 .
+0796 .
+0797 .
+0798 .
+0799 .
+079A .
+079B .
+079C .
+079D .
+079E .
+079F .
+07A0 .
+07A1 .
+07A2 .
+07A3 .
+07A4 .
+07A5 .
+07B1 .
+07CA .
+07CB .
+07CC .
+07CD .
+07CE .
+07CF .
+07D0 .
+07D1 .
+07D2 .
+07D3 .
+07D4 .
+07D5 .
+07D6 .
+07D7 .
+07D8 .
+07D9 .
+07DA .
+07DB .
+07DC .
+07DD .
+07DE .
+07DF .
+07E0 .
+07E1 .
+07E2 .
+07E3 .
+07E4 .
+07E5 .
+07E6 .
+07E7 .
+07E8 .
+07E9 .
+07EA .
+07F4 .
+07F5 .
+07FA .
+0800 .
+0801 .
+0802 .
+0803 .
+0804 .
+0805 .
+0806 .
+0807 .
+0808 .
+0809 .
+080A .
+080B .
+080C .
+080D .
+080E .
+080F .
+0810 .
+0811 .
+0812 .
+0813 .
+0814 .
+0815 .
+081A .
+0824 .
+0828 .
+0840 .
+0841 .
+0842 .
+0843 .
+0844 .
+0845 .
+0846 .
+0847 .
+0848 .
+0849 .
+084A .
+084B .
+084C .
+084D .
+084E .
+084F .
+0850 .
+0851 .
+0852 .
+0853 .
+0854 .
+0855 .
+0856 .
+0857 .
+0858 .
+08A0 .
+08A2 .
+08A3 .
+08A4 .
+08A5 .
+08A6 .
+08A7 .
+08A8 .
+08A9 .
+08AA .
+08AB .
+08AC .
+0904 .
+0905 .
+0906 .
+0907 .
+0908 .
+0909 .
+090A .
+090B .
+090C .
+090D .
+090E .
+090F .
+0910 .
+0911 .
+0912 .
+0913 .
+0914 .
+0915 .
+0916 .
+0917 .
+0918 .
+0919 .
+091A .
+091B .
+091C .
+091D .
+091E .
+091F .
+0920 .
+0921 .
+0922 .
+0923 .
+0924 .
+0925 .
+0926 .
+0927 .
+0928 .
+0929 .
+092A .
+092B .
+092C .
+092D .
+092E .
+092F .
+0930 .
+0931 .
+0932 .
+0933 .
+0934 .
+0935 .
+0936 .
+0937 .
+0938 .
+0939 .
+093D .
+0950 .
+0958 .
+0959 .
+095A .
+095B .
+095C .
+095D .
+095E .
+095F .
+0960 .
+0961 .
+0971 .
+0972 .
+0973 .
+0974 .
+0975 .
+0976 .
+0977 .
+0979 .
+097A .
+097B .
+097C .
+097D .
+097E .
+097F .
+0985 .
+0986 .
+0987 .
+0988 .
+0989 .
+098A .
+098B .
+098C .
+098F .
+0990 .
+0993 .
+0994 .
+0995 .
+0996 .
+0997 .
+0998 .
+0999 .
+099A .
+099B .
+099C .
+099D .
+099E .
+099F .
+09A0 .
+09A1 .
+09A2 .
+09A3 .
+09A4 .
+09A5 .
+09A6 .
+09A7 .
+09A8 .
+09AA .
+09AB .
+09AC .
+09AD .
+09AE .
+09AF .
+09B0 .
+09B2 .
+09B6 .
+09B7 .
+09B8 .
+09B9 .
+09BD .
+09CE .
+09DC .
+09DD .
+09DF .
+09E0 .
+09E1 .
+09F0 .
+09F1 .
+0A05 .
+0A06 .
+0A07 .
+0A08 .
+0A09 .
+0A0A .
+0A0F .
+0A10 .
+0A13 .
+0A14 .
+0A15 .
+0A16 .
+0A17 .
+0A18 .
+0A19 .
+0A1A .
+0A1B .
+0A1C .
+0A1D .
+0A1E .
+0A1F .
+0A20 .
+0A21 .
+0A22 .
+0A23 .
+0A24 .
+0A25 .
+0A26 .
+0A27 .
+0A28 .
+0A2A .
+0A2B .
+0A2C .
+0A2D .
+0A2E .
+0A2F .
+0A30 .
+0A32 .
+0A33 .
+0A35 .
+0A36 .
+0A38 .
+0A39 .
+0A59 .
+0A5A .
+0A5B .
+0A5C .
+0A5E .
+0A72 .
+0A73 .
+0A74 .
+0A85 .
+0A86 .
+0A87 .
+0A88 .
+0A89 .
+0A8A .
+0A8B .
+0A8C .
+0A8D .
+0A8F .
+0A90 .
+0A91 .
+0A93 .
+0A94 .
+0A95 .
+0A96 .
+0A97 .
+0A98 .
+0A99 .
+0A9A .
+0A9B .
+0A9C .
+0A9D .
+0A9E .
+0A9F .
+0AA0 .
+0AA1 .
+0AA2 .
+0AA3 .
+0AA4 .
+0AA5 .
+0AA6 .
+0AA7 .
+0AA8 .
+0AAA .
+0AAB .
+0AAC .
+0AAD .
+0AAE .
+0AAF .
+0AB0 .
+0AB2 .
+0AB3 .
+0AB5 .
+0AB6 .
+0AB7 .
+0AB8 .
+0AB9 .
+0ABD .
+0AD0 .
+0AE0 .
+0AE1 .
+0B05 .
+0B06 .
+0B07 .
+0B08 .
+0B09 .
+0B0A .
+0B0B .
+0B0C .
+0B0F .
+0B10 .
+0B13 .
+0B14 .
+0B15 .
+0B16 .
+0B17 .
+0B18 .
+0B19 .
+0B1A .
+0B1B .
+0B1C .
+0B1D .
+0B1E .
+0B1F .
+0B20 .
+0B21 .
+0B22 .
+0B23 .
+0B24 .
+0B25 .
+0B26 .
+0B27 .
+0B28 .
+0B2A .
+0B2B .
+0B2C .
+0B2D .
+0B2E .
+0B2F .
+0B30 .
+0B32 .
+0B33 .
+0B35 .
+0B36 .
+0B37 .
+0B38 .
+0B39 .
+0B3D .
+0B5C .
+0B5D .
+0B5F .
+0B60 .
+0B61 .
+0B71 .
+0B83 .
+0B85 .
+0B86 .
+0B87 .
+0B88 .
+0B89 .
+0B8A .
+0B8E .
+0B8F .
+0B90 .
+0B92 .
+0B93 .
+0B94 .
+0B95 .
+0B99 .
+0B9A .
+0B9C .
+0B9E .
+0B9F .
+0BA3 .
+0BA4 .
+0BA8 .
+0BA9 .
+0BAA .
+0BAE .
+0BAF .
+0BB0 .
+0BB1 .
+0BB2 .
+0BB3 .
+0BB4 .
+0BB5 .
+0BB6 .
+0BB7 .
+0BB8 .
+0BB9 .
+0BD0 .
+0C05 .
+0C06 .
+0C07 .
+0C08 .
+0C09 .
+0C0A .
+0C0B .
+0C0C .
+0C0E .
+0C0F .
+0C10 .
+0C12 .
+0C13 .
+0C14 .
+0C15 .
+0C16 .
+0C17 .
+0C18 .
+0C19 .
+0C1A .
+0C1B .
+0C1C .
+0C1D .
+0C1E .
+0C1F .
+0C20 .
+0C21 .
+0C22 .
+0C23 .
+0C24 .
+0C25 .
+0C26 .
+0C27 .
+0C28 .
+0C2A .
+0C2B .
+0C2C .
+0C2D .
+0C2E .
+0C2F .
+0C30 .
+0C31 .
+0C32 .
+0C33 .
+0C35 .
+0C36 .
+0C37 .
+0C38 .
+0C39 .
+0C3D .
+0C58 .
+0C59 .
+0C60 .
+0C61 .
+0C85 .
+0C86 .
+0C87 .
+0C88 .
+0C89 .
+0C8A .
+0C8B .
+0C8C .
+0C8E .
+0C8F .
+0C90 .
+0C92 .
+0C93 .
+0C94 .
+0C95 .
+0C96 .
+0C97 .
+0C98 .
+0C99 .
+0C9A .
+0C9B .
+0C9C .
+0C9D .
+0C9E .
+0C9F .
+0CA0 .
+0CA1 .
+0CA2 .
+0CA3 .
+0CA4 .
+0CA5 .
+0CA6 .
+0CA7 .
+0CA8 .
+0CAA .
+0CAB .
+0CAC .
+0CAD .
+0CAE .
+0CAF .
+0CB0 .
+0CB1 .
+0CB2 .
+0CB3 .
+0CB5 .
+0CB6 .
+0CB7 .
+0CB8 .
+0CB9 .
+0CBD .
+0CDE .
+0CE0 .
+0CE1 .
+0CF1 .
+0CF2 .
+0D05 .
+0D06 .
+0D07 .
+0D08 .
+0D09 .
+0D0A .
+0D0B .
+0D0C .
+0D0E .
+0D0F .
+0D10 .
+0D12 .
+0D13 .
+0D14 .
+0D15 .
+0D16 .
+0D17 .
+0D18 .
+0D19 .
+0D1A .
+0D1B .
+0D1C .
+0D1D .
+0D1E .
+0D1F .
+0D20 .
+0D21 .
+0D22 .
+0D23 .
+0D24 .
+0D25 .
+0D26 .
+0D27 .
+0D28 .
+0D29 .
+0D2A .
+0D2B .
+0D2C .
+0D2D .
+0D2E .
+0D2F .
+0D30 .
+0D31 .
+0D32 .
+0D33 .
+0D34 .
+0D35 .
+0D36 .
+0D37 .
+0D38 .
+0D39 .
+0D3A .
+0D3D .
+0D4E .
+0D60 .
+0D61 .
+0D7A .
+0D7B .
+0D7C .
+0D7D .
+0D7E .
+0D7F .
+0D85 .
+0D86 .
+0D87 .
+0D88 .
+0D89 .
+0D8A .
+0D8B .
+0D8C .
+0D8D .
+0D8E .
+0D8F .
+0D90 .
+0D91 .
+0D92 .
+0D93 .
+0D94 .
+0D95 .
+0D96 .
+0D9A .
+0D9B .
+0D9C .
+0D9D .
+0D9E .
+0D9F .
+0DA0 .
+0DA1 .
+0DA2 .
+0DA3 .
+0DA4 .
+0DA5 .
+0DA6 .
+0DA7 .
+0DA8 .
+0DA9 .
+0DAA .
+0DAB .
+0DAC .
+0DAD .
+0DAE .
+0DAF .
+0DB0 .
+0DB1 .
+0DB3 .
+0DB4 .
+0DB5 .
+0DB6 .
+0DB7 .
+0DB8 .
+0DB9 .
+0DBA .
+0DBB .
+0DBD .
+0DC0 .
+0DC1 .
+0DC2 .
+0DC3 .
+0DC4 .
+0DC5 .
+0DC6 .
+0E01 .
+0E02 .
+0E03 .
+0E04 .
+0E05 .
+0E06 .
+0E07 .
+0E08 .
+0E09 .
+0E0A .
+0E0B .
+0E0C .
+0E0D .
+0E0E .
+0E0F .
+0E10 .
+0E11 .
+0E12 .
+0E13 .
+0E14 .
+0E15 .
+0E16 .
+0E17 .
+0E18 .
+0E19 .
+0E1A .
+0E1B .
+0E1C .
+0E1D .
+0E1E .
+0E1F .
+0E20 .
+0E21 .
+0E22 .
+0E23 .
+0E24 .
+0E25 .
+0E26 .
+0E27 .
+0E28 .
+0E29 .
+0E2A .
+0E2B .
+0E2C .
+0E2D .
+0E2E .
+0E2F .
+0E30 .
+0E32 .
+0E33 .
+0E40 .
+0E41 .
+0E42 .
+0E43 .
+0E44 .
+0E45 .
+0E46 .
+0E81 .
+0E82 .
+0E84 .
+0E87 .
+0E88 .
+0E8A .
+0E8D .
+0E94 .
+0E95 .
+0E96 .
+0E97 .
+0E99 .
+0E9A .
+0E9B .
+0E9C .
+0E9D .
+0E9E .
+0E9F .
+0EA1 .
+0EA2 .
+0EA3 .
+0EA5 .
+0EA7 .
+0EAA .
+0EAB .
+0EAD .
+0EAE .
+0EAF .
+0EB0 .
+0EB2 .
+0EB3 .
+0EBD .
+0EC0 .
+0EC1 .
+0EC2 .
+0EC3 .
+0EC4 .
+0EC6 .
+0EDC .
+0EDD .
+0EDE .
+0EDF .
+0F00 .
+0F40 .
+0F41 .
+0F42 .
+0F43 .
+0F44 .
+0F45 .
+0F46 .
+0F47 .
+0F49 .
+0F4A .
+0F4B .
+0F4C .
+0F4D .
+0F4E .
+0F4F .
+0F50 .
+0F51 .
+0F52 .
+0F53 .
+0F54 .
+0F55 .
+0F56 .
+0F57 .
+0F58 .
+0F59 .
+0F5A .
+0F5B .
+0F5C .
+0F5D .
+0F5E .
+0F5F .
+0F60 .
+0F61 .
+0F62 .
+0F63 .
+0F64 .
+0F65 .
+0F66 .
+0F67 .
+0F68 .
+0F69 .
+0F6A .
+0F6B .
+0F6C .
+0F88 .
+0F89 .
+0F8A .
+0F8B .
+0F8C .
+1000 .
+1001 .
+1002 .
+1003 .
+1004 .
+1005 .
+1006 .
+1007 .
+1008 .
+1009 .
+100A .
+100B .
+100C .
+100D .
+100E .
+100F .
+1010 .
+1011 .
+1012 .
+1013 .
+1014 .
+1015 .
+1016 .
+1017 .
+1018 .
+1019 .
+101A .
+101B .
+101C .
+101D .
+101E .
+101F .
+1020 .
+1021 .
+1022 .
+1023 .
+1024 .
+1025 .
+1026 .
+1027 .
+1028 .
+1029 .
+102A .
+103F .
+1050 .
+1051 .
+1052 .
+1053 .
+1054 .
+1055 .
+105A .
+105B .
+105C .
+105D .
+1061 .
+1065 .
+1066 .
+106E .
+106F .
+1070 .
+1075 .
+1076 .
+1077 .
+1078 .
+1079 .
+107A .
+107B .
+107C .
+107D .
+107E .
+107F .
+1080 .
+1081 .
+108E .
+2D00 10A0
+2D01 10A1
+2D02 10A2
+2D03 10A3
+2D04 10A4
+2D05 10A5
+2D06 10A6
+2D07 10A7
+2D08 10A8
+2D09 10A9
+2D0A 10AA
+2D0B 10AB
+2D0C 10AC
+2D0D 10AD
+2D0E 10AE
+2D0F 10AF
+2D10 10B0
+2D11 10B1
+2D12 10B2
+2D13 10B3
+2D14 10B4
+2D15 10B5
+2D16 10B6
+2D17 10B7
+2D18 10B8
+2D19 10B9
+2D1A 10BA
+2D1B 10BB
+2D1C 10BC
+2D1D 10BD
+2D1E 10BE
+2D1F 10BF
+2D20 10C0
+2D21 10C1
+2D22 10C2
+2D23 10C3
+2D24 10C4
+2D25 10C5
+2D27 10C7
+2D2D 10CD
+10D0 .
+10D1 .
+10D2 .
+10D3 .
+10D4 .
+10D5 .
+10D6 .
+10D7 .
+10D8 .
+10D9 .
+10DA .
+10DB .
+10DC .
+10DD .
+10DE .
+10DF .
+10E0 .
+10E1 .
+10E2 .
+10E3 .
+10E4 .
+10E5 .
+10E6 .
+10E7 .
+10E8 .
+10E9 .
+10EA .
+10EB .
+10EC .
+10ED .
+10EE .
+10EF .
+10F0 .
+10F1 .
+10F2 .
+10F3 .
+10F4 .
+10F5 .
+10F6 .
+10F7 .
+10F8 .
+10F9 .
+10FA .
+10FC .
+10FD .
+10FE .
+10FF .
+1100 .
+1101 .
+1102 .
+1103 .
+1104 .
+1105 .
+1106 .
+1107 .
+1108 .
+1109 .
+110A .
+110B .
+110C .
+110D .
+110E .
+110F .
+1110 .
+1111 .
+1112 .
+1113 .
+1114 .
+1115 .
+1116 .
+1117 .
+1118 .
+1119 .
+111A .
+111B .
+111C .
+111D .
+111E .
+111F .
+1120 .
+1121 .
+1122 .
+1123 .
+1124 .
+1125 .
+1126 .
+1127 .
+1128 .
+1129 .
+112A .
+112B .
+112C .
+112D .
+112E .
+112F .
+1130 .
+1131 .
+1132 .
+1133 .
+1134 .
+1135 .
+1136 .
+1137 .
+1138 .
+1139 .
+113A .
+113B .
+113C .
+113D .
+113E .
+113F .
+1140 .
+1141 .
+1142 .
+1143 .
+1144 .
+1145 .
+1146 .
+1147 .
+1148 .
+1149 .
+114A .
+114B .
+114C .
+114D .
+114E .
+114F .
+1150 .
+1151 .
+1152 .
+1153 .
+1154 .
+1155 .
+1156 .
+1157 .
+1158 .
+1159 .
+115A .
+115B .
+115C .
+115D .
+115E .
+115F .
+1160 .
+1161 .
+1162 .
+1163 .
+1164 .
+1165 .
+1166 .
+1167 .
+1168 .
+1169 .
+116A .
+116B .
+116C .
+116D .
+116E .
+116F .
+1170 .
+1171 .
+1172 .
+1173 .
+1174 .
+1175 .
+1176 .
+1177 .
+1178 .
+1179 .
+117A .
+117B .
+117C .
+117D .
+117E .
+117F .
+1180 .
+1181 .
+1182 .
+1183 .
+1184 .
+1185 .
+1186 .
+1187 .
+1188 .
+1189 .
+118A .
+118B .
+118C .
+118D .
+118E .
+118F .
+1190 .
+1191 .
+1192 .
+1193 .
+1194 .
+1195 .
+1196 .
+1197 .
+1198 .
+1199 .
+119A .
+119B .
+119C .
+119D .
+119E .
+119F .
+11A0 .
+11A1 .
+11A2 .
+11A3 .
+11A4 .
+11A5 .
+11A6 .
+11A7 .
+11A8 .
+11A9 .
+11AA .
+11AB .
+11AC .
+11AD .
+11AE .
+11AF .
+11B0 .
+11B1 .
+11B2 .
+11B3 .
+11B4 .
+11B5 .
+11B6 .
+11B7 .
+11B8 .
+11B9 .
+11BA .
+11BB .
+11BC .
+11BD .
+11BE .
+11BF .
+11C0 .
+11C1 .
+11C2 .
+11C3 .
+11C4 .
+11C5 .
+11C6 .
+11C7 .
+11C8 .
+11C9 .
+11CA .
+11CB .
+11CC .
+11CD .
+11CE .
+11CF .
+11D0 .
+11D1 .
+11D2 .
+11D3 .
+11D4 .
+11D5 .
+11D6 .
+11D7 .
+11D8 .
+11D9 .
+11DA .
+11DB .
+11DC .
+11DD .
+11DE .
+11DF .
+11E0 .
+11E1 .
+11E2 .
+11E3 .
+11E4 .
+11E5 .
+11E6 .
+11E7 .
+11E8 .
+11E9 .
+11EA .
+11EB .
+11EC .
+11ED .
+11EE .
+11EF .
+11F0 .
+11F1 .
+11F2 .
+11F3 .
+11F4 .
+11F5 .
+11F6 .
+11F7 .
+11F8 .
+11F9 .
+11FA .
+11FB .
+11FC .
+11FD .
+11FE .
+11FF .
+1200 .
+1201 .
+1202 .
+1203 .
+1204 .
+1205 .
+1206 .
+1207 .
+1208 .
+1209 .
+120A .
+120B .
+120C .
+120D .
+120E .
+120F .
+1210 .
+1211 .
+1212 .
+1213 .
+1214 .
+1215 .
+1216 .
+1217 .
+1218 .
+1219 .
+121A .
+121B .
+121C .
+121D .
+121E .
+121F .
+1220 .
+1221 .
+1222 .
+1223 .
+1224 .
+1225 .
+1226 .
+1227 .
+1228 .
+1229 .
+122A .
+122B .
+122C .
+122D .
+122E .
+122F .
+1230 .
+1231 .
+1232 .
+1233 .
+1234 .
+1235 .
+1236 .
+1237 .
+1238 .
+1239 .
+123A .
+123B .
+123C .
+123D .
+123E .
+123F .
+1240 .
+1241 .
+1242 .
+1243 .
+1244 .
+1245 .
+1246 .
+1247 .
+1248 .
+124A .
+124B .
+124C .
+124D .
+1250 .
+1251 .
+1252 .
+1253 .
+1254 .
+1255 .
+1256 .
+1258 .
+125A .
+125B .
+125C .
+125D .
+1260 .
+1261 .
+1262 .
+1263 .
+1264 .
+1265 .
+1266 .
+1267 .
+1268 .
+1269 .
+126A .
+126B .
+126C .
+126D .
+126E .
+126F .
+1270 .
+1271 .
+1272 .
+1273 .
+1274 .
+1275 .
+1276 .
+1277 .
+1278 .
+1279 .
+127A .
+127B .
+127C .
+127D .
+127E .
+127F .
+1280 .
+1281 .
+1282 .
+1283 .
+1284 .
+1285 .
+1286 .
+1287 .
+1288 .
+128A .
+128B .
+128C .
+128D .
+1290 .
+1291 .
+1292 .
+1293 .
+1294 .
+1295 .
+1296 .
+1297 .
+1298 .
+1299 .
+129A .
+129B .
+129C .
+129D .
+129E .
+129F .
+12A0 .
+12A1 .
+12A2 .
+12A3 .
+12A4 .
+12A5 .
+12A6 .
+12A7 .
+12A8 .
+12A9 .
+12AA .
+12AB .
+12AC .
+12AD .
+12AE .
+12AF .
+12B0 .
+12B2 .
+12B3 .
+12B4 .
+12B5 .
+12B8 .
+12B9 .
+12BA .
+12BB .
+12BC .
+12BD .
+12BE .
+12C0 .
+12C2 .
+12C3 .
+12C4 .
+12C5 .
+12C8 .
+12C9 .
+12CA .
+12CB .
+12CC .
+12CD .
+12CE .
+12CF .
+12D0 .
+12D1 .
+12D2 .
+12D3 .
+12D4 .
+12D5 .
+12D6 .
+12D8 .
+12D9 .
+12DA .
+12DB .
+12DC .
+12DD .
+12DE .
+12DF .
+12E0 .
+12E1 .
+12E2 .
+12E3 .
+12E4 .
+12E5 .
+12E6 .
+12E7 .
+12E8 .
+12E9 .
+12EA .
+12EB .
+12EC .
+12ED .
+12EE .
+12EF .
+12F0 .
+12F1 .
+12F2 .
+12F3 .
+12F4 .
+12F5 .
+12F6 .
+12F7 .
+12F8 .
+12F9 .
+12FA .
+12FB .
+12FC .
+12FD .
+12FE .
+12FF .
+1300 .
+1301 .
+1302 .
+1303 .
+1304 .
+1305 .
+1306 .
+1307 .
+1308 .
+1309 .
+130A .
+130B .
+130C .
+130D .
+130E .
+130F .
+1310 .
+1312 .
+1313 .
+1314 .
+1315 .
+1318 .
+1319 .
+131A .
+131B .
+131C .
+131D .
+131E .
+131F .
+1320 .
+1321 .
+1322 .
+1323 .
+1324 .
+1325 .
+1326 .
+1327 .
+1328 .
+1329 .
+132A .
+132B .
+132C .
+132D .
+132E .
+132F .
+1330 .
+1331 .
+1332 .
+1333 .
+1334 .
+1335 .
+1336 .
+1337 .
+1338 .
+1339 .
+133A .
+133B .
+133C .
+133D .
+133E .
+133F .
+1340 .
+1341 .
+1342 .
+1343 .
+1344 .
+1345 .
+1346 .
+1347 .
+1348 .
+1349 .
+134A .
+134B .
+134C .
+134D .
+134E .
+134F .
+1350 .
+1351 .
+1352 .
+1353 .
+1354 .
+1355 .
+1356 .
+1357 .
+1358 .
+1359 .
+135A .
+1380 .
+1381 .
+1382 .
+1383 .
+1384 .
+1385 .
+1386 .
+1387 .
+1388 .
+1389 .
+138A .
+138B .
+138C .
+138D .
+138E .
+138F .
+13A0 .
+13A1 .
+13A2 .
+13A3 .
+13A4 .
+13A5 .
+13A6 .
+13A7 .
+13A8 .
+13A9 .
+13AA .
+13AB .
+13AC .
+13AD .
+13AE .
+13AF .
+13B0 .
+13B1 .
+13B2 .
+13B3 .
+13B4 .
+13B5 .
+13B6 .
+13B7 .
+13B8 .
+13B9 .
+13BA .
+13BB .
+13BC .
+13BD .
+13BE .
+13BF .
+13C0 .
+13C1 .
+13C2 .
+13C3 .
+13C4 .
+13C5 .
+13C6 .
+13C7 .
+13C8 .
+13C9 .
+13CA .
+13CB .
+13CC .
+13CD .
+13CE .
+13CF .
+13D0 .
+13D1 .
+13D2 .
+13D3 .
+13D4 .
+13D5 .
+13D6 .
+13D7 .
+13D8 .
+13D9 .
+13DA .
+13DB .
+13DC .
+13DD .
+13DE .
+13DF .
+13E0 .
+13E1 .
+13E2 .
+13E3 .
+13E4 .
+13E5 .
+13E6 .
+13E7 .
+13E8 .
+13E9 .
+13EA .
+13EB .
+13EC .
+13ED .
+13EE .
+13EF .
+13F0 .
+13F1 .
+13F2 .
+13F3 .
+13F4 .
+1401 .
+1402 .
+1403 .
+1404 .
+1405 .
+1406 .
+1407 .
+1408 .
+1409 .
+140A .
+140B .
+140C .
+140D .
+140E .
+140F .
+1410 .
+1411 .
+1412 .
+1413 .
+1414 .
+1415 .
+1416 .
+1417 .
+1418 .
+1419 .
+141A .
+141B .
+141C .
+141D .
+141E .
+141F .
+1420 .
+1421 .
+1422 .
+1423 .
+1424 .
+1425 .
+1426 .
+1427 .
+1428 .
+1429 .
+142A .
+142B .
+142C .
+142D .
+142E .
+142F .
+1430 .
+1431 .
+1432 .
+1433 .
+1434 .
+1435 .
+1436 .
+1437 .
+1438 .
+1439 .
+143A .
+143B .
+143C .
+143D .
+143E .
+143F .
+1440 .
+1441 .
+1442 .
+1443 .
+1444 .
+1445 .
+1446 .
+1447 .
+1448 .
+1449 .
+144A .
+144B .
+144C .
+144D .
+144E .
+144F .
+1450 .
+1451 .
+1452 .
+1453 .
+1454 .
+1455 .
+1456 .
+1457 .
+1458 .
+1459 .
+145A .
+145B .
+145C .
+145D .
+145E .
+145F .
+1460 .
+1461 .
+1462 .
+1463 .
+1464 .
+1465 .
+1466 .
+1467 .
+1468 .
+1469 .
+146A .
+146B .
+146C .
+146D .
+146E .
+146F .
+1470 .
+1471 .
+1472 .
+1473 .
+1474 .
+1475 .
+1476 .
+1477 .
+1478 .
+1479 .
+147A .
+147B .
+147C .
+147D .
+147E .
+147F .
+1480 .
+1481 .
+1482 .
+1483 .
+1484 .
+1485 .
+1486 .
+1487 .
+1488 .
+1489 .
+148A .
+148B .
+148C .
+148D .
+148E .
+148F .
+1490 .
+1491 .
+1492 .
+1493 .
+1494 .
+1495 .
+1496 .
+1497 .
+1498 .
+1499 .
+149A .
+149B .
+149C .
+149D .
+149E .
+149F .
+14A0 .
+14A1 .
+14A2 .
+14A3 .
+14A4 .
+14A5 .
+14A6 .
+14A7 .
+14A8 .
+14A9 .
+14AA .
+14AB .
+14AC .
+14AD .
+14AE .
+14AF .
+14B0 .
+14B1 .
+14B2 .
+14B3 .
+14B4 .
+14B5 .
+14B6 .
+14B7 .
+14B8 .
+14B9 .
+14BA .
+14BB .
+14BC .
+14BD .
+14BE .
+14BF .
+14C0 .
+14C1 .
+14C2 .
+14C3 .
+14C4 .
+14C5 .
+14C6 .
+14C7 .
+14C8 .
+14C9 .
+14CA .
+14CB .
+14CC .
+14CD .
+14CE .
+14CF .
+14D0 .
+14D1 .
+14D2 .
+14D3 .
+14D4 .
+14D5 .
+14D6 .
+14D7 .
+14D8 .
+14D9 .
+14DA .
+14DB .
+14DC .
+14DD .
+14DE .
+14DF .
+14E0 .
+14E1 .
+14E2 .
+14E3 .
+14E4 .
+14E5 .
+14E6 .
+14E7 .
+14E8 .
+14E9 .
+14EA .
+14EB .
+14EC .
+14ED .
+14EE .
+14EF .
+14F0 .
+14F1 .
+14F2 .
+14F3 .
+14F4 .
+14F5 .
+14F6 .
+14F7 .
+14F8 .
+14F9 .
+14FA .
+14FB .
+14FC .
+14FD .
+14FE .
+14FF .
+1500 .
+1501 .
+1502 .
+1503 .
+1504 .
+1505 .
+1506 .
+1507 .
+1508 .
+1509 .
+150A .
+150B .
+150C .
+150D .
+150E .
+150F .
+1510 .
+1511 .
+1512 .
+1513 .
+1514 .
+1515 .
+1516 .
+1517 .
+1518 .
+1519 .
+151A .
+151B .
+151C .
+151D .
+151E .
+151F .
+1520 .
+1521 .
+1522 .
+1523 .
+1524 .
+1525 .
+1526 .
+1527 .
+1528 .
+1529 .
+152A .
+152B .
+152C .
+152D .
+152E .
+152F .
+1530 .
+1531 .
+1532 .
+1533 .
+1534 .
+1535 .
+1536 .
+1537 .
+1538 .
+1539 .
+153A .
+153B .
+153C .
+153D .
+153E .
+153F .
+1540 .
+1541 .
+1542 .
+1543 .
+1544 .
+1545 .
+1546 .
+1547 .
+1548 .
+1549 .
+154A .
+154B .
+154C .
+154D .
+154E .
+154F .
+1550 .
+1551 .
+1552 .
+1553 .
+1554 .
+1555 .
+1556 .
+1557 .
+1558 .
+1559 .
+155A .
+155B .
+155C .
+155D .
+155E .
+155F .
+1560 .
+1561 .
+1562 .
+1563 .
+1564 .
+1565 .
+1566 .
+1567 .
+1568 .
+1569 .
+156A .
+156B .
+156C .
+156D .
+156E .
+156F .
+1570 .
+1571 .
+1572 .
+1573 .
+1574 .
+1575 .
+1576 .
+1577 .
+1578 .
+1579 .
+157A .
+157B .
+157C .
+157D .
+157E .
+157F .
+1580 .
+1581 .
+1582 .
+1583 .
+1584 .
+1585 .
+1586 .
+1587 .
+1588 .
+1589 .
+158A .
+158B .
+158C .
+158D .
+158E .
+158F .
+1590 .
+1591 .
+1592 .
+1593 .
+1594 .
+1595 .
+1596 .
+1597 .
+1598 .
+1599 .
+159A .
+159B .
+159C .
+159D .
+159E .
+159F .
+15A0 .
+15A1 .
+15A2 .
+15A3 .
+15A4 .
+15A5 .
+15A6 .
+15A7 .
+15A8 .
+15A9 .
+15AA .
+15AB .
+15AC .
+15AD .
+15AE .
+15AF .
+15B0 .
+15B1 .
+15B2 .
+15B3 .
+15B4 .
+15B5 .
+15B6 .
+15B7 .
+15B8 .
+15B9 .
+15BA .
+15BB .
+15BC .
+15BD .
+15BE .
+15BF .
+15C0 .
+15C1 .
+15C2 .
+15C3 .
+15C4 .
+15C5 .
+15C6 .
+15C7 .
+15C8 .
+15C9 .
+15CA .
+15CB .
+15CC .
+15CD .
+15CE .
+15CF .
+15D0 .
+15D1 .
+15D2 .
+15D3 .
+15D4 .
+15D5 .
+15D6 .
+15D7 .
+15D8 .
+15D9 .
+15DA .
+15DB .
+15DC .
+15DD .
+15DE .
+15DF .
+15E0 .
+15E1 .
+15E2 .
+15E3 .
+15E4 .
+15E5 .
+15E6 .
+15E7 .
+15E8 .
+15E9 .
+15EA .
+15EB .
+15EC .
+15ED .
+15EE .
+15EF .
+15F0 .
+15F1 .
+15F2 .
+15F3 .
+15F4 .
+15F5 .
+15F6 .
+15F7 .
+15F8 .
+15F9 .
+15FA .
+15FB .
+15FC .
+15FD .
+15FE .
+15FF .
+1600 .
+1601 .
+1602 .
+1603 .
+1604 .
+1605 .
+1606 .
+1607 .
+1608 .
+1609 .
+160A .
+160B .
+160C .
+160D .
+160E .
+160F .
+1610 .
+1611 .
+1612 .
+1613 .
+1614 .
+1615 .
+1616 .
+1617 .
+1618 .
+1619 .
+161A .
+161B .
+161C .
+161D .
+161E .
+161F .
+1620 .
+1621 .
+1622 .
+1623 .
+1624 .
+1625 .
+1626 .
+1627 .
+1628 .
+1629 .
+162A .
+162B .
+162C .
+162D .
+162E .
+162F .
+1630 .
+1631 .
+1632 .
+1633 .
+1634 .
+1635 .
+1636 .
+1637 .
+1638 .
+1639 .
+163A .
+163B .
+163C .
+163D .
+163E .
+163F .
+1640 .
+1641 .
+1642 .
+1643 .
+1644 .
+1645 .
+1646 .
+1647 .
+1648 .
+1649 .
+164A .
+164B .
+164C .
+164D .
+164E .
+164F .
+1650 .
+1651 .
+1652 .
+1653 .
+1654 .
+1655 .
+1656 .
+1657 .
+1658 .
+1659 .
+165A .
+165B .
+165C .
+165D .
+165E .
+165F .
+1660 .
+1661 .
+1662 .
+1663 .
+1664 .
+1665 .
+1666 .
+1667 .
+1668 .
+1669 .
+166A .
+166B .
+166C .
+166F .
+1670 .
+1671 .
+1672 .
+1673 .
+1674 .
+1675 .
+1676 .
+1677 .
+1678 .
+1679 .
+167A .
+167B .
+167C .
+167D .
+167E .
+167F .
+1681 .
+1682 .
+1683 .
+1684 .
+1685 .
+1686 .
+1687 .
+1688 .
+1689 .
+168A .
+168B .
+168C .
+168D .
+168E .
+168F .
+1690 .
+1691 .
+1692 .
+1693 .
+1694 .
+1695 .
+1696 .
+1697 .
+1698 .
+1699 .
+169A .
+16A0 .
+16A1 .
+16A2 .
+16A3 .
+16A4 .
+16A5 .
+16A6 .
+16A7 .
+16A8 .
+16A9 .
+16AA .
+16AB .
+16AC .
+16AD .
+16AE .
+16AF .
+16B0 .
+16B1 .
+16B2 .
+16B3 .
+16B4 .
+16B5 .
+16B6 .
+16B7 .
+16B8 .
+16B9 .
+16BA .
+16BB .
+16BC .
+16BD .
+16BE .
+16BF .
+16C0 .
+16C1 .
+16C2 .
+16C3 .
+16C4 .
+16C5 .
+16C6 .
+16C7 .
+16C8 .
+16C9 .
+16CA .
+16CB .
+16CC .
+16CD .
+16CE .
+16CF .
+16D0 .
+16D1 .
+16D2 .
+16D3 .
+16D4 .
+16D5 .
+16D6 .
+16D7 .
+16D8 .
+16D9 .
+16DA .
+16DB .
+16DC .
+16DD .
+16DE .
+16DF .
+16E0 .
+16E1 .
+16E2 .
+16E3 .
+16E4 .
+16E5 .
+16E6 .
+16E7 .
+16E8 .
+16E9 .
+16EA .
+1700 .
+1701 .
+1702 .
+1703 .
+1704 .
+1705 .
+1706 .
+1707 .
+1708 .
+1709 .
+170A .
+170B .
+170C .
+170E .
+170F .
+1710 .
+1711 .
+1720 .
+1721 .
+1722 .
+1723 .
+1724 .
+1725 .
+1726 .
+1727 .
+1728 .
+1729 .
+172A .
+172B .
+172C .
+172D .
+172E .
+172F .
+1730 .
+1731 .
+1740 .
+1741 .
+1742 .
+1743 .
+1744 .
+1745 .
+1746 .
+1747 .
+1748 .
+1749 .
+174A .
+174B .
+174C .
+174D .
+174E .
+174F .
+1750 .
+1751 .
+1760 .
+1761 .
+1762 .
+1763 .
+1764 .
+1765 .
+1766 .
+1767 .
+1768 .
+1769 .
+176A .
+176B .
+176C .
+176E .
+176F .
+1770 .
+1780 .
+1781 .
+1782 .
+1783 .
+1784 .
+1785 .
+1786 .
+1787 .
+1788 .
+1789 .
+178A .
+178B .
+178C .
+178D .
+178E .
+178F .
+1790 .
+1791 .
+1792 .
+1793 .
+1794 .
+1795 .
+1796 .
+1797 .
+1798 .
+1799 .
+179A .
+179B .
+179C .
+179D .
+179E .
+179F .
+17A0 .
+17A1 .
+17A2 .
+17A3 .
+17A4 .
+17A5 .
+17A6 .
+17A7 .
+17A8 .
+17A9 .
+17AA .
+17AB .
+17AC .
+17AD .
+17AE .
+17AF .
+17B0 .
+17B1 .
+17B2 .
+17B3 .
+17D7 .
+17DC .
+1820 .
+1821 .
+1822 .
+1823 .
+1824 .
+1825 .
+1826 .
+1827 .
+1828 .
+1829 .
+182A .
+182B .
+182C .
+182D .
+182E .
+182F .
+1830 .
+1831 .
+1832 .
+1833 .
+1834 .
+1835 .
+1836 .
+1837 .
+1838 .
+1839 .
+183A .
+183B .
+183C .
+183D .
+183E .
+183F .
+1840 .
+1841 .
+1842 .
+1843 .
+1844 .
+1845 .
+1846 .
+1847 .
+1848 .
+1849 .
+184A .
+184B .
+184C .
+184D .
+184E .
+184F .
+1850 .
+1851 .
+1852 .
+1853 .
+1854 .
+1855 .
+1856 .
+1857 .
+1858 .
+1859 .
+185A .
+185B .
+185C .
+185D .
+185E .
+185F .
+1860 .
+1861 .
+1862 .
+1863 .
+1864 .
+1865 .
+1866 .
+1867 .
+1868 .
+1869 .
+186A .
+186B .
+186C .
+186D .
+186E .
+186F .
+1870 .
+1871 .
+1872 .
+1873 .
+1874 .
+1875 .
+1876 .
+1877 .
+1880 .
+1881 .
+1882 .
+1883 .
+1884 .
+1885 .
+1886 .
+1887 .
+1888 .
+1889 .
+188A .
+188B .
+188C .
+188D .
+188E .
+188F .
+1890 .
+1891 .
+1892 .
+1893 .
+1894 .
+1895 .
+1896 .
+1897 .
+1898 .
+1899 .
+189A .
+189B .
+189C .
+189D .
+189E .
+189F .
+18A0 .
+18A1 .
+18A2 .
+18A3 .
+18A4 .
+18A5 .
+18A6 .
+18A7 .
+18A8 .
+18AA .
+18B0 .
+18B1 .
+18B2 .
+18B3 .
+18B4 .
+18B5 .
+18B6 .
+18B7 .
+18B8 .
+18B9 .
+18BA .
+18BB .
+18BC .
+18BD .
+18BE .
+18BF .
+18C0 .
+18C1 .
+18C2 .
+18C3 .
+18C4 .
+18C5 .
+18C6 .
+18C7 .
+18C8 .
+18C9 .
+18CA .
+18CB .
+18CC .
+18CD .
+18CE .
+18CF .
+18D0 .
+18D1 .
+18D2 .
+18D3 .
+18D4 .
+18D5 .
+18D6 .
+18D7 .
+18D8 .
+18D9 .
+18DA .
+18DB .
+18DC .
+18DD .
+18DE .
+18DF .
+18E0 .
+18E1 .
+18E2 .
+18E3 .
+18E4 .
+18E5 .
+18E6 .
+18E7 .
+18E8 .
+18E9 .
+18EA .
+18EB .
+18EC .
+18ED .
+18EE .
+18EF .
+18F0 .
+18F1 .
+18F2 .
+18F3 .
+18F4 .
+18F5 .
+1900 .
+1901 .
+1902 .
+1903 .
+1904 .
+1905 .
+1906 .
+1907 .
+1908 .
+1909 .
+190A .
+190B .
+190C .
+190D .
+190E .
+190F .
+1910 .
+1911 .
+1912 .
+1913 .
+1914 .
+1915 .
+1916 .
+1917 .
+1918 .
+1919 .
+191A .
+191B .
+191C .
+1950 .
+1951 .
+1952 .
+1953 .
+1954 .
+1955 .
+1956 .
+1957 .
+1958 .
+1959 .
+195A .
+195B .
+195C .
+195D .
+195E .
+195F .
+1960 .
+1961 .
+1962 .
+1963 .
+1964 .
+1965 .
+1966 .
+1967 .
+1968 .
+1969 .
+196A .
+196B .
+196C .
+196D .
+1970 .
+1971 .
+1972 .
+1973 .
+1974 .
+1980 .
+1981 .
+1982 .
+1983 .
+1984 .
+1985 .
+1986 .
+1987 .
+1988 .
+1989 .
+198A .
+198B .
+198C .
+198D .
+198E .
+198F .
+1990 .
+1991 .
+1992 .
+1993 .
+1994 .
+1995 .
+1996 .
+1997 .
+1998 .
+1999 .
+199A .
+199B .
+199C .
+199D .
+199E .
+199F .
+19A0 .
+19A1 .
+19A2 .
+19A3 .
+19A4 .
+19A5 .
+19A6 .
+19A7 .
+19A8 .
+19A9 .
+19AA .
+19AB .
+19C1 .
+19C2 .
+19C3 .
+19C4 .
+19C5 .
+19C6 .
+19C7 .
+1A00 .
+1A01 .
+1A02 .
+1A03 .
+1A04 .
+1A05 .
+1A06 .
+1A07 .
+1A08 .
+1A09 .
+1A0A .
+1A0B .
+1A0C .
+1A0D .
+1A0E .
+1A0F .
+1A10 .
+1A11 .
+1A12 .
+1A13 .
+1A14 .
+1A15 .
+1A16 .
+1A20 .
+1A21 .
+1A22 .
+1A23 .
+1A24 .
+1A25 .
+1A26 .
+1A27 .
+1A28 .
+1A29 .
+1A2A .
+1A2B .
+1A2C .
+1A2D .
+1A2E .
+1A2F .
+1A30 .
+1A31 .
+1A32 .
+1A33 .
+1A34 .
+1A35 .
+1A36 .
+1A37 .
+1A38 .
+1A39 .
+1A3A .
+1A3B .
+1A3C .
+1A3D .
+1A3E .
+1A3F .
+1A40 .
+1A41 .
+1A42 .
+1A43 .
+1A44 .
+1A45 .
+1A46 .
+1A47 .
+1A48 .
+1A49 .
+1A4A .
+1A4B .
+1A4C .
+1A4D .
+1A4E .
+1A4F .
+1A50 .
+1A51 .
+1A52 .
+1A53 .
+1A54 .
+1AA7 .
+1B05 .
+1B06 .
+1B07 .
+1B08 .
+1B09 .
+1B0A .
+1B0B .
+1B0C .
+1B0D .
+1B0E .
+1B0F .
+1B10 .
+1B11 .
+1B12 .
+1B13 .
+1B14 .
+1B15 .
+1B16 .
+1B17 .
+1B18 .
+1B19 .
+1B1A .
+1B1B .
+1B1C .
+1B1D .
+1B1E .
+1B1F .
+1B20 .
+1B21 .
+1B22 .
+1B23 .
+1B24 .
+1B25 .
+1B26 .
+1B27 .
+1B28 .
+1B29 .
+1B2A .
+1B2B .
+1B2C .
+1B2D .
+1B2E .
+1B2F .
+1B30 .
+1B31 .
+1B32 .
+1B33 .
+1B45 .
+1B46 .
+1B47 .
+1B48 .
+1B49 .
+1B4A .
+1B4B .
+1B83 .
+1B84 .
+1B85 .
+1B86 .
+1B87 .
+1B88 .
+1B89 .
+1B8A .
+1B8B .
+1B8C .
+1B8D .
+1B8E .
+1B8F .
+1B90 .
+1B91 .
+1B92 .
+1B93 .
+1B94 .
+1B95 .
+1B96 .
+1B97 .
+1B98 .
+1B99 .
+1B9A .
+1B9B .
+1B9C .
+1B9D .
+1B9E .
+1B9F .
+1BA0 .
+1BAE .
+1BAF .
+1BBA .
+1BBB .
+1BBC .
+1BBD .
+1BBE .
+1BBF .
+1BC0 .
+1BC1 .
+1BC2 .
+1BC3 .
+1BC4 .
+1BC5 .
+1BC6 .
+1BC7 .
+1BC8 .
+1BC9 .
+1BCA .
+1BCB .
+1BCC .
+1BCD .
+1BCE .
+1BCF .
+1BD0 .
+1BD1 .
+1BD2 .
+1BD3 .
+1BD4 .
+1BD5 .
+1BD6 .
+1BD7 .
+1BD8 .
+1BD9 .
+1BDA .
+1BDB .
+1BDC .
+1BDD .
+1BDE .
+1BDF .
+1BE0 .
+1BE1 .
+1BE2 .
+1BE3 .
+1BE4 .
+1BE5 .
+1C00 .
+1C01 .
+1C02 .
+1C03 .
+1C04 .
+1C05 .
+1C06 .
+1C07 .
+1C08 .
+1C09 .
+1C0A .
+1C0B .
+1C0C .
+1C0D .
+1C0E .
+1C0F .
+1C10 .
+1C11 .
+1C12 .
+1C13 .
+1C14 .
+1C15 .
+1C16 .
+1C17 .
+1C18 .
+1C19 .
+1C1A .
+1C1B .
+1C1C .
+1C1D .
+1C1E .
+1C1F .
+1C20 .
+1C21 .
+1C22 .
+1C23 .
+1C4D .
+1C4E .
+1C4F .
+1C5A .
+1C5B .
+1C5C .
+1C5D .
+1C5E .
+1C5F .
+1C60 .
+1C61 .
+1C62 .
+1C63 .
+1C64 .
+1C65 .
+1C66 .
+1C67 .
+1C68 .
+1C69 .
+1C6A .
+1C6B .
+1C6C .
+1C6D .
+1C6E .
+1C6F .
+1C70 .
+1C71 .
+1C72 .
+1C73 .
+1C74 .
+1C75 .
+1C76 .
+1C77 .
+1C78 .
+1C79 .
+1C7A .
+1C7B .
+1C7C .
+1C7D .
+1CE9 .
+1CEA .
+1CEB .
+1CEC .
+1CEE .
+1CEF .
+1CF0 .
+1CF1 .
+1CF5 .
+1CF6 .
+1D00 .
+1D01 .
+1D02 .
+1D03 .
+1D04 .
+1D05 .
+1D06 .
+1D07 .
+1D08 .
+1D09 .
+1D0A .
+1D0B .
+1D0C .
+1D0D .
+1D0E .
+1D0F .
+1D10 .
+1D11 .
+1D12 .
+1D13 .
+1D14 .
+1D15 .
+1D16 .
+1D17 .
+1D18 .
+1D19 .
+1D1A .
+1D1B .
+1D1C .
+1D1D .
+1D1E .
+1D1F .
+1D20 .
+1D21 .
+1D22 .
+1D23 .
+1D24 .
+1D25 .
+1D26 .
+1D27 .
+1D28 .
+1D29 .
+1D2A .
+1D2B .
+1D2C .
+1D2D .
+1D2E .
+1D2F .
+1D30 .
+1D31 .
+1D32 .
+1D33 .
+1D34 .
+1D35 .
+1D36 .
+1D37 .
+1D38 .
+1D39 .
+1D3A .
+1D3B .
+1D3C .
+1D3D .
+1D3E .
+1D3F .
+1D40 .
+1D41 .
+1D42 .
+1D43 .
+1D44 .
+1D45 .
+1D46 .
+1D47 .
+1D48 .
+1D49 .
+1D4A .
+1D4B .
+1D4C .
+1D4D .
+1D4E .
+1D4F .
+1D50 .
+1D51 .
+1D52 .
+1D53 .
+1D54 .
+1D55 .
+1D56 .
+1D57 .
+1D58 .
+1D59 .
+1D5A .
+1D5B .
+1D5C .
+1D5D .
+1D5E .
+1D5F .
+1D60 .
+1D61 .
+1D62 .
+1D63 .
+1D64 .
+1D65 .
+1D66 .
+1D67 .
+1D68 .
+1D69 .
+1D6A .
+1D6B .
+1D6C .
+1D6D .
+1D6E .
+1D6F .
+1D70 .
+1D71 .
+1D72 .
+1D73 .
+1D74 .
+1D75 .
+1D76 .
+1D77 .
+1D78 .
+1D79 A77D
+1D7A .
+1D7B .
+1D7C .
+1D7D 2C63
+1D7E .
+1D7F .
+1D80 .
+1D81 .
+1D82 .
+1D83 .
+1D84 .
+1D85 .
+1D86 .
+1D87 .
+1D88 .
+1D89 .
+1D8A .
+1D8B .
+1D8C .
+1D8D .
+1D8E .
+1D8F .
+1D90 .
+1D91 .
+1D92 .
+1D93 .
+1D94 .
+1D95 .
+1D96 .
+1D97 .
+1D98 .
+1D99 .
+1D9A .
+1D9B .
+1D9C .
+1D9D .
+1D9E .
+1D9F .
+1DA0 .
+1DA1 .
+1DA2 .
+1DA3 .
+1DA4 .
+1DA5 .
+1DA6 .
+1DA7 .
+1DA8 .
+1DA9 .
+1DAA .
+1DAB .
+1DAC .
+1DAD .
+1DAE .
+1DAF .
+1DB0 .
+1DB1 .
+1DB2 .
+1DB3 .
+1DB4 .
+1DB5 .
+1DB6 .
+1DB7 .
+1DB8 .
+1DB9 .
+1DBA .
+1DBB .
+1DBC .
+1DBD .
+1DBE .
+1DBF .
+1E01 1E00
+1E03 1E02
+1E05 1E04
+1E07 1E06
+1E09 1E08
+1E0B 1E0A
+1E0D 1E0C
+1E0F 1E0E
+1E11 1E10
+1E13 1E12
+1E15 1E14
+1E17 1E16
+1E19 1E18
+1E1B 1E1A
+1E1D 1E1C
+1E1F 1E1E
+1E21 1E20
+1E23 1E22
+1E25 1E24
+1E27 1E26
+1E29 1E28
+1E2B 1E2A
+1E2D 1E2C
+1E2F 1E2E
+1E31 1E30
+1E33 1E32
+1E35 1E34
+1E37 1E36
+1E39 1E38
+1E3B 1E3A
+1E3D 1E3C
+1E3F 1E3E
+1E41 1E40
+1E43 1E42
+1E45 1E44
+1E47 1E46
+1E49 1E48
+1E4B 1E4A
+1E4D 1E4C
+1E4F 1E4E
+1E51 1E50
+1E53 1E52
+1E55 1E54
+1E57 1E56
+1E59 1E58
+1E5B 1E5A
+1E5D 1E5C
+1E5F 1E5E
+1E61 1E60
+1E63 1E62
+1E65 1E64
+1E67 1E66
+1E69 1E68
+1E6B 1E6A
+1E6D 1E6C
+1E6F 1E6E
+1E71 1E70
+1E73 1E72
+1E75 1E74
+1E77 1E76
+1E79 1E78
+1E7B 1E7A
+1E7D 1E7C
+1E7F 1E7E
+1E81 1E80
+1E83 1E82
+1E85 1E84
+1E87 1E86
+1E89 1E88
+1E8B 1E8A
+1E8D 1E8C
+1E8F 1E8E
+1E91 1E90
+1E93 1E92
+1E95 1E94
+1E96 .
+1E97 .
+1E98 .
+1E99 .
+1E9A .
+1E9C .
+1E9D .
+1E9F .
+1EA1 1EA0
+1EA3 1EA2
+1EA5 1EA4
+1EA7 1EA6
+1EA9 1EA8
+1EAB 1EAA
+1EAD 1EAC
+1EAF 1EAE
+1EB1 1EB0
+1EB3 1EB2
+1EB5 1EB4
+1EB7 1EB6
+1EB9 1EB8
+1EBB 1EBA
+1EBD 1EBC
+1EBF 1EBE
+1EC1 1EC0
+1EC3 1EC2
+1EC5 1EC4
+1EC7 1EC6
+1EC9 1EC8
+1ECB 1ECA
+1ECD 1ECC
+1ECF 1ECE
+1ED1 1ED0
+1ED3 1ED2
+1ED5 1ED4
+1ED7 1ED6
+1ED9 1ED8
+1EDB 1EDA
+1EDD 1EDC
+1EDF 1EDE
+1EE1 1EE0
+1EE3 1EE2
+1EE5 1EE4
+1EE7 1EE6
+1EE9 1EE8
+1EEB 1EEA
+1EED 1EEC
+1EEF 1EEE
+1EF1 1EF0
+1EF3 1EF2
+1EF5 1EF4
+1EF7 1EF6
+1EF9 1EF8
+1EFB 1EFA
+1EFD 1EFC
+1EFF 1EFE
+1F00 1F08
+1F01 1F09
+1F02 1F0A
+1F03 1F0B
+1F04 1F0C
+1F05 1F0D
+1F06 1F0E
+1F07 1F0F
+1F10 1F18
+1F11 1F19
+1F12 1F1A
+1F13 1F1B
+1F14 1F1C
+1F15 1F1D
+1F20 1F28
+1F21 1F29
+1F22 1F2A
+1F23 1F2B
+1F24 1F2C
+1F25 1F2D
+1F26 1F2E
+1F27 1F2F
+1F30 1F38
+1F31 1F39
+1F32 1F3A
+1F33 1F3B
+1F34 1F3C
+1F35 1F3D
+1F36 1F3E
+1F37 1F3F
+1F40 1F48
+1F41 1F49
+1F42 1F4A
+1F43 1F4B
+1F44 1F4C
+1F45 1F4D
+1F50 .
+1F51 1F59
+1F52 .
+1F53 1F5B
+1F54 .
+1F55 1F5D
+1F56 .
+1F57 1F5F
+1F60 1F68
+1F61 1F69
+1F62 1F6A
+1F63 1F6B
+1F64 1F6C
+1F65 1F6D
+1F66 1F6E
+1F67 1F6F
+1F70 1FBA
+1F71 1FBB
+1F72 1FC8
+1F73 1FC9
+1F74 1FCA
+1F75 1FCB
+1F76 1FDA
+1F77 1FDB
+1F78 1FF8
+1F79 1FF9
+1F7A 1FEA
+1F7B 1FEB
+1F7C 1FFA
+1F7D 1FFB
+1F80 1F88
+1F81 1F89
+1F82 1F8A
+1F83 1F8B
+1F84 1F8C
+1F85 1F8D
+1F86 1F8E
+1F87 1F8F
+1F90 1F98
+1F91 1F99
+1F92 1F9A
+1F93 1F9B
+1F94 1F9C
+1F95 1F9D
+1F96 1F9E
+1F97 1F9F
+1FA0 1FA8
+1FA1 1FA9
+1FA2 1FAA
+1FA3 1FAB
+1FA4 1FAC
+1FA5 1FAD
+1FA6 1FAE
+1FA7 1FAF
+1FB0 1FB8
+1FB1 1FB9
+1FB2 .
+1FB3 1FBC
+1FB4 .
+1FB6 .
+1FB7 .
+1FC2 .
+1FC3 1FCC
+1FC4 .
+1FC6 .
+1FC7 .
+1FD0 1FD8
+1FD1 1FD9
+1FD2 .
+1FD3 .
+1FD6 .
+1FD7 .
+1FE0 1FE8
+1FE1 1FE9
+1FE2 .
+1FE3 .
+1FE4 .
+1FE5 1FEC
+1FE6 .
+1FE7 .
+1FF2 .
+1FF3 1FFC
+1FF4 .
+1FF6 .
+1FF7 .
+2071 .
+207F .
+2090 .
+2091 .
+2092 .
+2093 .
+2094 .
+2095 .
+2096 .
+2097 .
+2098 .
+2099 .
+209A .
+209B .
+209C .
+2102 .
+2107 .
+210A .
+210B .
+210C .
+210D .
+210E .
+210F .
+2110 .
+2111 .
+2112 .
+2113 .
+2115 .
+2119 .
+211A .
+211B .
+211C .
+211D .
+2124 .
+2128 .
+212C .
+212D .
+212F .
+2130 .
+2131 .
+214E 2132
+2133 .
+2134 .
+2135 .
+2136 .
+2137 .
+2138 .
+2139 .
+213C .
+213D .
+213E .
+213F .
+2145 .
+2146 .
+2147 .
+2148 .
+2149 .
+2184 2183
+2C30 2C00
+2C31 2C01
+2C32 2C02
+2C33 2C03
+2C34 2C04
+2C35 2C05
+2C36 2C06
+2C37 2C07
+2C38 2C08
+2C39 2C09
+2C3A 2C0A
+2C3B 2C0B
+2C3C 2C0C
+2C3D 2C0D
+2C3E 2C0E
+2C3F 2C0F
+2C40 2C10
+2C41 2C11
+2C42 2C12
+2C43 2C13
+2C44 2C14
+2C45 2C15
+2C46 2C16
+2C47 2C17
+2C48 2C18
+2C49 2C19
+2C4A 2C1A
+2C4B 2C1B
+2C4C 2C1C
+2C4D 2C1D
+2C4E 2C1E
+2C4F 2C1F
+2C50 2C20
+2C51 2C21
+2C52 2C22
+2C53 2C23
+2C54 2C24
+2C55 2C25
+2C56 2C26
+2C57 2C27
+2C58 2C28
+2C59 2C29
+2C5A 2C2A
+2C5B 2C2B
+2C5C 2C2C
+2C5D 2C2D
+2C5E 2C2E
+2C61 2C60
+2C68 2C67
+2C6A 2C69
+2C6C 2C6B
+2C71 .
+2C73 2C72
+2C74 .
+2C76 2C75
+2C77 .
+2C78 .
+2C79 .
+2C7A .
+2C7B .
+2C7C .
+2C7D .
+2C81 2C80
+2C83 2C82
+2C85 2C84
+2C87 2C86
+2C89 2C88
+2C8B 2C8A
+2C8D 2C8C
+2C8F 2C8E
+2C91 2C90
+2C93 2C92
+2C95 2C94
+2C97 2C96
+2C99 2C98
+2C9B 2C9A
+2C9D 2C9C
+2C9F 2C9E
+2CA1 2CA0
+2CA3 2CA2
+2CA5 2CA4
+2CA7 2CA6
+2CA9 2CA8
+2CAB 2CAA
+2CAD 2CAC
+2CAF 2CAE
+2CB1 2CB0
+2CB3 2CB2
+2CB5 2CB4
+2CB7 2CB6
+2CB9 2CB8
+2CBB 2CBA
+2CBD 2CBC
+2CBF 2CBE
+2CC1 2CC0
+2CC3 2CC2
+2CC5 2CC4
+2CC7 2CC6
+2CC9 2CC8
+2CCB 2CCA
+2CCD 2CCC
+2CCF 2CCE
+2CD1 2CD0
+2CD3 2CD2
+2CD5 2CD4
+2CD7 2CD6
+2CD9 2CD8
+2CDB 2CDA
+2CDD 2CDC
+2CDF 2CDE
+2CE1 2CE0
+2CE3 2CE2
+2CE4 .
+2CEC 2CEB
+2CEE 2CED
+2CF3 2CF2
+2D30 .
+2D31 .
+2D32 .
+2D33 .
+2D34 .
+2D35 .
+2D36 .
+2D37 .
+2D38 .
+2D39 .
+2D3A .
+2D3B .
+2D3C .
+2D3D .
+2D3E .
+2D3F .
+2D40 .
+2D41 .
+2D42 .
+2D43 .
+2D44 .
+2D45 .
+2D46 .
+2D47 .
+2D48 .
+2D49 .
+2D4A .
+2D4B .
+2D4C .
+2D4D .
+2D4E .
+2D4F .
+2D50 .
+2D51 .
+2D52 .
+2D53 .
+2D54 .
+2D55 .
+2D56 .
+2D57 .
+2D58 .
+2D59 .
+2D5A .
+2D5B .
+2D5C .
+2D5D .
+2D5E .
+2D5F .
+2D60 .
+2D61 .
+2D62 .
+2D63 .
+2D64 .
+2D65 .
+2D66 .
+2D67 .
+2D6F .
+2D80 .
+2D81 .
+2D82 .
+2D83 .
+2D84 .
+2D85 .
+2D86 .
+2D87 .
+2D88 .
+2D89 .
+2D8A .
+2D8B .
+2D8C .
+2D8D .
+2D8E .
+2D8F .
+2D90 .
+2D91 .
+2D92 .
+2D93 .
+2D94 .
+2D95 .
+2D96 .
+2DA0 .
+2DA1 .
+2DA2 .
+2DA3 .
+2DA4 .
+2DA5 .
+2DA6 .
+2DA8 .
+2DA9 .
+2DAA .
+2DAB .
+2DAC .
+2DAD .
+2DAE .
+2DB0 .
+2DB1 .
+2DB2 .
+2DB3 .
+2DB4 .
+2DB5 .
+2DB6 .
+2DB8 .
+2DB9 .
+2DBA .
+2DBB .
+2DBC .
+2DBD .
+2DBE .
+2DC0 .
+2DC1 .
+2DC2 .
+2DC3 .
+2DC4 .
+2DC5 .
+2DC6 .
+2DC8 .
+2DC9 .
+2DCA .
+2DCB .
+2DCC .
+2DCD .
+2DCE .
+2DD0 .
+2DD1 .
+2DD2 .
+2DD3 .
+2DD4 .
+2DD5 .
+2DD6 .
+2DD8 .
+2DD9 .
+2DDA .
+2DDB .
+2DDC .
+2DDD .
+2DDE .
+2E2F .
+3005 .
+3006 .
+3031 .
+3032 .
+3033 .
+3034 .
+3035 .
+303B .
+303C .
+3041 .
+3042 .
+3043 .
+3044 .
+3045 .
+3046 .
+3047 .
+3048 .
+3049 .
+304A .
+304B .
+304C .
+304D .
+304E .
+304F .
+3050 .
+3051 .
+3052 .
+3053 .
+3054 .
+3055 .
+3056 .
+3057 .
+3058 .
+3059 .
+305A .
+305B .
+305C .
+305D .
+305E .
+305F .
+3060 .
+3061 .
+3062 .
+3063 .
+3064 .
+3065 .
+3066 .
+3067 .
+3068 .
+3069 .
+306A .
+306B .
+306C .
+306D .
+306E .
+306F .
+3070 .
+3071 .
+3072 .
+3073 .
+3074 .
+3075 .
+3076 .
+3077 .
+3078 .
+3079 .
+307A .
+307B .
+307C .
+307D .
+307E .
+307F .
+3080 .
+3081 .
+3082 .
+3083 .
+3084 .
+3085 .
+3086 .
+3087 .
+3088 .
+3089 .
+308A .
+308B .
+308C .
+308D .
+308E .
+308F .
+3090 .
+3091 .
+3092 .
+3093 .
+3094 .
+3095 .
+3096 .
+309D .
+309E .
+309F .
+30A1 .
+30A2 .
+30A3 .
+30A4 .
+30A5 .
+30A6 .
+30A7 .
+30A8 .
+30A9 .
+30AA .
+30AB .
+30AC .
+30AD .
+30AE .
+30AF .
+30B0 .
+30B1 .
+30B2 .
+30B3 .
+30B4 .
+30B5 .
+30B6 .
+30B7 .
+30B8 .
+30B9 .
+30BA .
+30BB .
+30BC .
+30BD .
+30BE .
+30BF .
+30C0 .
+30C1 .
+30C2 .
+30C3 .
+30C4 .
+30C5 .
+30C6 .
+30C7 .
+30C8 .
+30C9 .
+30CA .
+30CB .
+30CC .
+30CD .
+30CE .
+30CF .
+30D0 .
+30D1 .
+30D2 .
+30D3 .
+30D4 .
+30D5 .
+30D6 .
+30D7 .
+30D8 .
+30D9 .
+30DA .
+30DB .
+30DC .
+30DD .
+30DE .
+30DF .
+30E0 .
+30E1 .
+30E2 .
+30E3 .
+30E4 .
+30E5 .
+30E6 .
+30E7 .
+30E8 .
+30E9 .
+30EA .
+30EB .
+30EC .
+30ED .
+30EE .
+30EF .
+30F0 .
+30F1 .
+30F2 .
+30F3 .
+30F4 .
+30F5 .
+30F6 .
+30F7 .
+30F8 .
+30F9 .
+30FA .
+30FC .
+30FD .
+30FE .
+30FF .
+3105 .
+3106 .
+3107 .
+3108 .
+3109 .
+310A .
+310B .
+310C .
+310D .
+310E .
+310F .
+3110 .
+3111 .
+3112 .
+3113 .
+3114 .
+3115 .
+3116 .
+3117 .
+3118 .
+3119 .
+311A .
+311B .
+311C .
+311D .
+311E .
+311F .
+3120 .
+3121 .
+3122 .
+3123 .
+3124 .
+3125 .
+3126 .
+3127 .
+3128 .
+3129 .
+312A .
+312B .
+312C .
+312D .
+3131 .
+3132 .
+3133 .
+3134 .
+3135 .
+3136 .
+3137 .
+3138 .
+3139 .
+313A .
+313B .
+313C .
+313D .
+313E .
+313F .
+3140 .
+3141 .
+3142 .
+3143 .
+3144 .
+3145 .
+3146 .
+3147 .
+3148 .
+3149 .
+314A .
+314B .
+314C .
+314D .
+314E .
+314F .
+3150 .
+3151 .
+3152 .
+3153 .
+3154 .
+3155 .
+3156 .
+3157 .
+3158 .
+3159 .
+315A .
+315B .
+315C .
+315D .
+315E .
+315F .
+3160 .
+3161 .
+3162 .
+3163 .
+3164 .
+3165 .
+3166 .
+3167 .
+3168 .
+3169 .
+316A .
+316B .
+316C .
+316D .
+316E .
+316F .
+3170 .
+3171 .
+3172 .
+3173 .
+3174 .
+3175 .
+3176 .
+3177 .
+3178 .
+3179 .
+317A .
+317B .
+317C .
+317D .
+317E .
+317F .
+3180 .
+3181 .
+3182 .
+3183 .
+3184 .
+3185 .
+3186 .
+3187 .
+3188 .
+3189 .
+318A .
+318B .
+318C .
+318D .
+318E .
+31A0 .
+31A1 .
+31A2 .
+31A3 .
+31A4 .
+31A5 .
+31A6 .
+31A7 .
+31A8 .
+31A9 .
+31AA .
+31AB .
+31AC .
+31AD .
+31AE .
+31AF .
+31B0 .
+31B1 .
+31B2 .
+31B3 .
+31B4 .
+31B5 .
+31B6 .
+31B7 .
+31B8 .
+31B9 .
+31BA .
+31F0 .
+31F1 .
+31F2 .
+31F3 .
+31F4 .
+31F5 .
+31F6 .
+31F7 .
+31F8 .
+31F9 .
+31FA .
+31FB .
+31FC .
+31FD .
+31FE .
+31FF .
+A000 .
+A001 .
+A002 .
+A003 .
+A004 .
+A005 .
+A006 .
+A007 .
+A008 .
+A009 .
+A00A .
+A00B .
+A00C .
+A00D .
+A00E .
+A00F .
+A010 .
+A011 .
+A012 .
+A013 .
+A014 .
+A015 .
+A016 .
+A017 .
+A018 .
+A019 .
+A01A .
+A01B .
+A01C .
+A01D .
+A01E .
+A01F .
+A020 .
+A021 .
+A022 .
+A023 .
+A024 .
+A025 .
+A026 .
+A027 .
+A028 .
+A029 .
+A02A .
+A02B .
+A02C .
+A02D .
+A02E .
+A02F .
+A030 .
+A031 .
+A032 .
+A033 .
+A034 .
+A035 .
+A036 .
+A037 .
+A038 .
+A039 .
+A03A .
+A03B .
+A03C .
+A03D .
+A03E .
+A03F .
+A040 .
+A041 .
+A042 .
+A043 .
+A044 .
+A045 .
+A046 .
+A047 .
+A048 .
+A049 .
+A04A .
+A04B .
+A04C .
+A04D .
+A04E .
+A04F .
+A050 .
+A051 .
+A052 .
+A053 .
+A054 .
+A055 .
+A056 .
+A057 .
+A058 .
+A059 .
+A05A .
+A05B .
+A05C .
+A05D .
+A05E .
+A05F .
+A060 .
+A061 .
+A062 .
+A063 .
+A064 .
+A065 .
+A066 .
+A067 .
+A068 .
+A069 .
+A06A .
+A06B .
+A06C .
+A06D .
+A06E .
+A06F .
+A070 .
+A071 .
+A072 .
+A073 .
+A074 .
+A075 .
+A076 .
+A077 .
+A078 .
+A079 .
+A07A .
+A07B .
+A07C .
+A07D .
+A07E .
+A07F .
+A080 .
+A081 .
+A082 .
+A083 .
+A084 .
+A085 .
+A086 .
+A087 .
+A088 .
+A089 .
+A08A .
+A08B .
+A08C .
+A08D .
+A08E .
+A08F .
+A090 .
+A091 .
+A092 .
+A093 .
+A094 .
+A095 .
+A096 .
+A097 .
+A098 .
+A099 .
+A09A .
+A09B .
+A09C .
+A09D .
+A09E .
+A09F .
+A0A0 .
+A0A1 .
+A0A2 .
+A0A3 .
+A0A4 .
+A0A5 .
+A0A6 .
+A0A7 .
+A0A8 .
+A0A9 .
+A0AA .
+A0AB .
+A0AC .
+A0AD .
+A0AE .
+A0AF .
+A0B0 .
+A0B1 .
+A0B2 .
+A0B3 .
+A0B4 .
+A0B5 .
+A0B6 .
+A0B7 .
+A0B8 .
+A0B9 .
+A0BA .
+A0BB .
+A0BC .
+A0BD .
+A0BE .
+A0BF .
+A0C0 .
+A0C1 .
+A0C2 .
+A0C3 .
+A0C4 .
+A0C5 .
+A0C6 .
+A0C7 .
+A0C8 .
+A0C9 .
+A0CA .
+A0CB .
+A0CC .
+A0CD .
+A0CE .
+A0CF .
+A0D0 .
+A0D1 .
+A0D2 .
+A0D3 .
+A0D4 .
+A0D5 .
+A0D6 .
+A0D7 .
+A0D8 .
+A0D9 .
+A0DA .
+A0DB .
+A0DC .
+A0DD .
+A0DE .
+A0DF .
+A0E0 .
+A0E1 .
+A0E2 .
+A0E3 .
+A0E4 .
+A0E5 .
+A0E6 .
+A0E7 .
+A0E8 .
+A0E9 .
+A0EA .
+A0EB .
+A0EC .
+A0ED .
+A0EE .
+A0EF .
+A0F0 .
+A0F1 .
+A0F2 .
+A0F3 .
+A0F4 .
+A0F5 .
+A0F6 .
+A0F7 .
+A0F8 .
+A0F9 .
+A0FA .
+A0FB .
+A0FC .
+A0FD .
+A0FE .
+A0FF .
+A100 .
+A101 .
+A102 .
+A103 .
+A104 .
+A105 .
+A106 .
+A107 .
+A108 .
+A109 .
+A10A .
+A10B .
+A10C .
+A10D .
+A10E .
+A10F .
+A110 .
+A111 .
+A112 .
+A113 .
+A114 .
+A115 .
+A116 .
+A117 .
+A118 .
+A119 .
+A11A .
+A11B .
+A11C .
+A11D .
+A11E .
+A11F .
+A120 .
+A121 .
+A122 .
+A123 .
+A124 .
+A125 .
+A126 .
+A127 .
+A128 .
+A129 .
+A12A .
+A12B .
+A12C .
+A12D .
+A12E .
+A12F .
+A130 .
+A131 .
+A132 .
+A133 .
+A134 .
+A135 .
+A136 .
+A137 .
+A138 .
+A139 .
+A13A .
+A13B .
+A13C .
+A13D .
+A13E .
+A13F .
+A140 .
+A141 .
+A142 .
+A143 .
+A144 .
+A145 .
+A146 .
+A147 .
+A148 .
+A149 .
+A14A .
+A14B .
+A14C .
+A14D .
+A14E .
+A14F .
+A150 .
+A151 .
+A152 .
+A153 .
+A154 .
+A155 .
+A156 .
+A157 .
+A158 .
+A159 .
+A15A .
+A15B .
+A15C .
+A15D .
+A15E .
+A15F .
+A160 .
+A161 .
+A162 .
+A163 .
+A164 .
+A165 .
+A166 .
+A167 .
+A168 .
+A169 .
+A16A .
+A16B .
+A16C .
+A16D .
+A16E .
+A16F .
+A170 .
+A171 .
+A172 .
+A173 .
+A174 .
+A175 .
+A176 .
+A177 .
+A178 .
+A179 .
+A17A .
+A17B .
+A17C .
+A17D .
+A17E .
+A17F .
+A180 .
+A181 .
+A182 .
+A183 .
+A184 .
+A185 .
+A186 .
+A187 .
+A188 .
+A189 .
+A18A .
+A18B .
+A18C .
+A18D .
+A18E .
+A18F .
+A190 .
+A191 .
+A192 .
+A193 .
+A194 .
+A195 .
+A196 .
+A197 .
+A198 .
+A199 .
+A19A .
+A19B .
+A19C .
+A19D .
+A19E .
+A19F .
+A1A0 .
+A1A1 .
+A1A2 .
+A1A3 .
+A1A4 .
+A1A5 .
+A1A6 .
+A1A7 .
+A1A8 .
+A1A9 .
+A1AA .
+A1AB .
+A1AC .
+A1AD .
+A1AE .
+A1AF .
+A1B0 .
+A1B1 .
+A1B2 .
+A1B3 .
+A1B4 .
+A1B5 .
+A1B6 .
+A1B7 .
+A1B8 .
+A1B9 .
+A1BA .
+A1BB .
+A1BC .
+A1BD .
+A1BE .
+A1BF .
+A1C0 .
+A1C1 .
+A1C2 .
+A1C3 .
+A1C4 .
+A1C5 .
+A1C6 .
+A1C7 .
+A1C8 .
+A1C9 .
+A1CA .
+A1CB .
+A1CC .
+A1CD .
+A1CE .
+A1CF .
+A1D0 .
+A1D1 .
+A1D2 .
+A1D3 .
+A1D4 .
+A1D5 .
+A1D6 .
+A1D7 .
+A1D8 .
+A1D9 .
+A1DA .
+A1DB .
+A1DC .
+A1DD .
+A1DE .
+A1DF .
+A1E0 .
+A1E1 .
+A1E2 .
+A1E3 .
+A1E4 .
+A1E5 .
+A1E6 .
+A1E7 .
+A1E8 .
+A1E9 .
+A1EA .
+A1EB .
+A1EC .
+A1ED .
+A1EE .
+A1EF .
+A1F0 .
+A1F1 .
+A1F2 .
+A1F3 .
+A1F4 .
+A1F5 .
+A1F6 .
+A1F7 .
+A1F8 .
+A1F9 .
+A1FA .
+A1FB .
+A1FC .
+A1FD .
+A1FE .
+A1FF .
+A200 .
+A201 .
+A202 .
+A203 .
+A204 .
+A205 .
+A206 .
+A207 .
+A208 .
+A209 .
+A20A .
+A20B .
+A20C .
+A20D .
+A20E .
+A20F .
+A210 .
+A211 .
+A212 .
+A213 .
+A214 .
+A215 .
+A216 .
+A217 .
+A218 .
+A219 .
+A21A .
+A21B .
+A21C .
+A21D .
+A21E .
+A21F .
+A220 .
+A221 .
+A222 .
+A223 .
+A224 .
+A225 .
+A226 .
+A227 .
+A228 .
+A229 .
+A22A .
+A22B .
+A22C .
+A22D .
+A22E .
+A22F .
+A230 .
+A231 .
+A232 .
+A233 .
+A234 .
+A235 .
+A236 .
+A237 .
+A238 .
+A239 .
+A23A .
+A23B .
+A23C .
+A23D .
+A23E .
+A23F .
+A240 .
+A241 .
+A242 .
+A243 .
+A244 .
+A245 .
+A246 .
+A247 .
+A248 .
+A249 .
+A24A .
+A24B .
+A24C .
+A24D .
+A24E .
+A24F .
+A250 .
+A251 .
+A252 .
+A253 .
+A254 .
+A255 .
+A256 .
+A257 .
+A258 .
+A259 .
+A25A .
+A25B .
+A25C .
+A25D .
+A25E .
+A25F .
+A260 .
+A261 .
+A262 .
+A263 .
+A264 .
+A265 .
+A266 .
+A267 .
+A268 .
+A269 .
+A26A .
+A26B .
+A26C .
+A26D .
+A26E .
+A26F .
+A270 .
+A271 .
+A272 .
+A273 .
+A274 .
+A275 .
+A276 .
+A277 .
+A278 .
+A279 .
+A27A .
+A27B .
+A27C .
+A27D .
+A27E .
+A27F .
+A280 .
+A281 .
+A282 .
+A283 .
+A284 .
+A285 .
+A286 .
+A287 .
+A288 .
+A289 .
+A28A .
+A28B .
+A28C .
+A28D .
+A28E .
+A28F .
+A290 .
+A291 .
+A292 .
+A293 .
+A294 .
+A295 .
+A296 .
+A297 .
+A298 .
+A299 .
+A29A .
+A29B .
+A29C .
+A29D .
+A29E .
+A29F .
+A2A0 .
+A2A1 .
+A2A2 .
+A2A3 .
+A2A4 .
+A2A5 .
+A2A6 .
+A2A7 .
+A2A8 .
+A2A9 .
+A2AA .
+A2AB .
+A2AC .
+A2AD .
+A2AE .
+A2AF .
+A2B0 .
+A2B1 .
+A2B2 .
+A2B3 .
+A2B4 .
+A2B5 .
+A2B6 .
+A2B7 .
+A2B8 .
+A2B9 .
+A2BA .
+A2BB .
+A2BC .
+A2BD .
+A2BE .
+A2BF .
+A2C0 .
+A2C1 .
+A2C2 .
+A2C3 .
+A2C4 .
+A2C5 .
+A2C6 .
+A2C7 .
+A2C8 .
+A2C9 .
+A2CA .
+A2CB .
+A2CC .
+A2CD .
+A2CE .
+A2CF .
+A2D0 .
+A2D1 .
+A2D2 .
+A2D3 .
+A2D4 .
+A2D5 .
+A2D6 .
+A2D7 .
+A2D8 .
+A2D9 .
+A2DA .
+A2DB .
+A2DC .
+A2DD .
+A2DE .
+A2DF .
+A2E0 .
+A2E1 .
+A2E2 .
+A2E3 .
+A2E4 .
+A2E5 .
+A2E6 .
+A2E7 .
+A2E8 .
+A2E9 .
+A2EA .
+A2EB .
+A2EC .
+A2ED .
+A2EE .
+A2EF .
+A2F0 .
+A2F1 .
+A2F2 .
+A2F3 .
+A2F4 .
+A2F5 .
+A2F6 .
+A2F7 .
+A2F8 .
+A2F9 .
+A2FA .
+A2FB .
+A2FC .
+A2FD .
+A2FE .
+A2FF .
+A300 .
+A301 .
+A302 .
+A303 .
+A304 .
+A305 .
+A306 .
+A307 .
+A308 .
+A309 .
+A30A .
+A30B .
+A30C .
+A30D .
+A30E .
+A30F .
+A310 .
+A311 .
+A312 .
+A313 .
+A314 .
+A315 .
+A316 .
+A317 .
+A318 .
+A319 .
+A31A .
+A31B .
+A31C .
+A31D .
+A31E .
+A31F .
+A320 .
+A321 .
+A322 .
+A323 .
+A324 .
+A325 .
+A326 .
+A327 .
+A328 .
+A329 .
+A32A .
+A32B .
+A32C .
+A32D .
+A32E .
+A32F .
+A330 .
+A331 .
+A332 .
+A333 .
+A334 .
+A335 .
+A336 .
+A337 .
+A338 .
+A339 .
+A33A .
+A33B .
+A33C .
+A33D .
+A33E .
+A33F .
+A340 .
+A341 .
+A342 .
+A343 .
+A344 .
+A345 .
+A346 .
+A347 .
+A348 .
+A349 .
+A34A .
+A34B .
+A34C .
+A34D .
+A34E .
+A34F .
+A350 .
+A351 .
+A352 .
+A353 .
+A354 .
+A355 .
+A356 .
+A357 .
+A358 .
+A359 .
+A35A .
+A35B .
+A35C .
+A35D .
+A35E .
+A35F .
+A360 .
+A361 .
+A362 .
+A363 .
+A364 .
+A365 .
+A366 .
+A367 .
+A368 .
+A369 .
+A36A .
+A36B .
+A36C .
+A36D .
+A36E .
+A36F .
+A370 .
+A371 .
+A372 .
+A373 .
+A374 .
+A375 .
+A376 .
+A377 .
+A378 .
+A379 .
+A37A .
+A37B .
+A37C .
+A37D .
+A37E .
+A37F .
+A380 .
+A381 .
+A382 .
+A383 .
+A384 .
+A385 .
+A386 .
+A387 .
+A388 .
+A389 .
+A38A .
+A38B .
+A38C .
+A38D .
+A38E .
+A38F .
+A390 .
+A391 .
+A392 .
+A393 .
+A394 .
+A395 .
+A396 .
+A397 .
+A398 .
+A399 .
+A39A .
+A39B .
+A39C .
+A39D .
+A39E .
+A39F .
+A3A0 .
+A3A1 .
+A3A2 .
+A3A3 .
+A3A4 .
+A3A5 .
+A3A6 .
+A3A7 .
+A3A8 .
+A3A9 .
+A3AA .
+A3AB .
+A3AC .
+A3AD .
+A3AE .
+A3AF .
+A3B0 .
+A3B1 .
+A3B2 .
+A3B3 .
+A3B4 .
+A3B5 .
+A3B6 .
+A3B7 .
+A3B8 .
+A3B9 .
+A3BA .
+A3BB .
+A3BC .
+A3BD .
+A3BE .
+A3BF .
+A3C0 .
+A3C1 .
+A3C2 .
+A3C3 .
+A3C4 .
+A3C5 .
+A3C6 .
+A3C7 .
+A3C8 .
+A3C9 .
+A3CA .
+A3CB .
+A3CC .
+A3CD .
+A3CE .
+A3CF .
+A3D0 .
+A3D1 .
+A3D2 .
+A3D3 .
+A3D4 .
+A3D5 .
+A3D6 .
+A3D7 .
+A3D8 .
+A3D9 .
+A3DA .
+A3DB .
+A3DC .
+A3DD .
+A3DE .
+A3DF .
+A3E0 .
+A3E1 .
+A3E2 .
+A3E3 .
+A3E4 .
+A3E5 .
+A3E6 .
+A3E7 .
+A3E8 .
+A3E9 .
+A3EA .
+A3EB .
+A3EC .
+A3ED .
+A3EE .
+A3EF .
+A3F0 .
+A3F1 .
+A3F2 .
+A3F3 .
+A3F4 .
+A3F5 .
+A3F6 .
+A3F7 .
+A3F8 .
+A3F9 .
+A3FA .
+A3FB .
+A3FC .
+A3FD .
+A3FE .
+A3FF .
+A400 .
+A401 .
+A402 .
+A403 .
+A404 .
+A405 .
+A406 .
+A407 .
+A408 .
+A409 .
+A40A .
+A40B .
+A40C .
+A40D .
+A40E .
+A40F .
+A410 .
+A411 .
+A412 .
+A413 .
+A414 .
+A415 .
+A416 .
+A417 .
+A418 .
+A419 .
+A41A .
+A41B .
+A41C .
+A41D .
+A41E .
+A41F .
+A420 .
+A421 .
+A422 .
+A423 .
+A424 .
+A425 .
+A426 .
+A427 .
+A428 .
+A429 .
+A42A .
+A42B .
+A42C .
+A42D .
+A42E .
+A42F .
+A430 .
+A431 .
+A432 .
+A433 .
+A434 .
+A435 .
+A436 .
+A437 .
+A438 .
+A439 .
+A43A .
+A43B .
+A43C .
+A43D .
+A43E .
+A43F .
+A440 .
+A441 .
+A442 .
+A443 .
+A444 .
+A445 .
+A446 .
+A447 .
+A448 .
+A449 .
+A44A .
+A44B .
+A44C .
+A44D .
+A44E .
+A44F .
+A450 .
+A451 .
+A452 .
+A453 .
+A454 .
+A455 .
+A456 .
+A457 .
+A458 .
+A459 .
+A45A .
+A45B .
+A45C .
+A45D .
+A45E .
+A45F .
+A460 .
+A461 .
+A462 .
+A463 .
+A464 .
+A465 .
+A466 .
+A467 .
+A468 .
+A469 .
+A46A .
+A46B .
+A46C .
+A46D .
+A46E .
+A46F .
+A470 .
+A471 .
+A472 .
+A473 .
+A474 .
+A475 .
+A476 .
+A477 .
+A478 .
+A479 .
+A47A .
+A47B .
+A47C .
+A47D .
+A47E .
+A47F .
+A480 .
+A481 .
+A482 .
+A483 .
+A484 .
+A485 .
+A486 .
+A487 .
+A488 .
+A489 .
+A48A .
+A48B .
+A48C .
+A4D0 .
+A4D1 .
+A4D2 .
+A4D3 .
+A4D4 .
+A4D5 .
+A4D6 .
+A4D7 .
+A4D8 .
+A4D9 .
+A4DA .
+A4DB .
+A4DC .
+A4DD .
+A4DE .
+A4DF .
+A4E0 .
+A4E1 .
+A4E2 .
+A4E3 .
+A4E4 .
+A4E5 .
+A4E6 .
+A4E7 .
+A4E8 .
+A4E9 .
+A4EA .
+A4EB .
+A4EC .
+A4ED .
+A4EE .
+A4EF .
+A4F0 .
+A4F1 .
+A4F2 .
+A4F3 .
+A4F4 .
+A4F5 .
+A4F6 .
+A4F7 .
+A4F8 .
+A4F9 .
+A4FA .
+A4FB .
+A4FC .
+A4FD .
+A500 .
+A501 .
+A502 .
+A503 .
+A504 .
+A505 .
+A506 .
+A507 .
+A508 .
+A509 .
+A50A .
+A50B .
+A50C .
+A50D .
+A50E .
+A50F .
+A510 .
+A511 .
+A512 .
+A513 .
+A514 .
+A515 .
+A516 .
+A517 .
+A518 .
+A519 .
+A51A .
+A51B .
+A51C .
+A51D .
+A51E .
+A51F .
+A520 .
+A521 .
+A522 .
+A523 .
+A524 .
+A525 .
+A526 .
+A527 .
+A528 .
+A529 .
+A52A .
+A52B .
+A52C .
+A52D .
+A52E .
+A52F .
+A530 .
+A531 .
+A532 .
+A533 .
+A534 .
+A535 .
+A536 .
+A537 .
+A538 .
+A539 .
+A53A .
+A53B .
+A53C .
+A53D .
+A53E .
+A53F .
+A540 .
+A541 .
+A542 .
+A543 .
+A544 .
+A545 .
+A546 .
+A547 .
+A548 .
+A549 .
+A54A .
+A54B .
+A54C .
+A54D .
+A54E .
+A54F .
+A550 .
+A551 .
+A552 .
+A553 .
+A554 .
+A555 .
+A556 .
+A557 .
+A558 .
+A559 .
+A55A .
+A55B .
+A55C .
+A55D .
+A55E .
+A55F .
+A560 .
+A561 .
+A562 .
+A563 .
+A564 .
+A565 .
+A566 .
+A567 .
+A568 .
+A569 .
+A56A .
+A56B .
+A56C .
+A56D .
+A56E .
+A56F .
+A570 .
+A571 .
+A572 .
+A573 .
+A574 .
+A575 .
+A576 .
+A577 .
+A578 .
+A579 .
+A57A .
+A57B .
+A57C .
+A57D .
+A57E .
+A57F .
+A580 .
+A581 .
+A582 .
+A583 .
+A584 .
+A585 .
+A586 .
+A587 .
+A588 .
+A589 .
+A58A .
+A58B .
+A58C .
+A58D .
+A58E .
+A58F .
+A590 .
+A591 .
+A592 .
+A593 .
+A594 .
+A595 .
+A596 .
+A597 .
+A598 .
+A599 .
+A59A .
+A59B .
+A59C .
+A59D .
+A59E .
+A59F .
+A5A0 .
+A5A1 .
+A5A2 .
+A5A3 .
+A5A4 .
+A5A5 .
+A5A6 .
+A5A7 .
+A5A8 .
+A5A9 .
+A5AA .
+A5AB .
+A5AC .
+A5AD .
+A5AE .
+A5AF .
+A5B0 .
+A5B1 .
+A5B2 .
+A5B3 .
+A5B4 .
+A5B5 .
+A5B6 .
+A5B7 .
+A5B8 .
+A5B9 .
+A5BA .
+A5BB .
+A5BC .
+A5BD .
+A5BE .
+A5BF .
+A5C0 .
+A5C1 .
+A5C2 .
+A5C3 .
+A5C4 .
+A5C5 .
+A5C6 .
+A5C7 .
+A5C8 .
+A5C9 .
+A5CA .
+A5CB .
+A5CC .
+A5CD .
+A5CE .
+A5CF .
+A5D0 .
+A5D1 .
+A5D2 .
+A5D3 .
+A5D4 .
+A5D5 .
+A5D6 .
+A5D7 .
+A5D8 .
+A5D9 .
+A5DA .
+A5DB .
+A5DC .
+A5DD .
+A5DE .
+A5DF .
+A5E0 .
+A5E1 .
+A5E2 .
+A5E3 .
+A5E4 .
+A5E5 .
+A5E6 .
+A5E7 .
+A5E8 .
+A5E9 .
+A5EA .
+A5EB .
+A5EC .
+A5ED .
+A5EE .
+A5EF .
+A5F0 .
+A5F1 .
+A5F2 .
+A5F3 .
+A5F4 .
+A5F5 .
+A5F6 .
+A5F7 .
+A5F8 .
+A5F9 .
+A5FA .
+A5FB .
+A5FC .
+A5FD .
+A5FE .
+A5FF .
+A600 .
+A601 .
+A602 .
+A603 .
+A604 .
+A605 .
+A606 .
+A607 .
+A608 .
+A609 .
+A60A .
+A60B .
+A60C .
+A610 .
+A611 .
+A612 .
+A613 .
+A614 .
+A615 .
+A616 .
+A617 .
+A618 .
+A619 .
+A61A .
+A61B .
+A61C .
+A61D .
+A61E .
+A61F .
+A62A .
+A62B .
+A641 A640
+A643 A642
+A645 A644
+A647 A646
+A649 A648
+A64B A64A
+A64D A64C
+A64F A64E
+A651 A650
+A653 A652
+A655 A654
+A657 A656
+A659 A658
+A65B A65A
+A65D A65C
+A65F A65E
+A661 A660
+A663 A662
+A665 A664
+A667 A666
+A669 A668
+A66B A66A
+A66D A66C
+A66E .
+A67F .
+A681 A680
+A683 A682
+A685 A684
+A687 A686
+A689 A688
+A68B A68A
+A68D A68C
+A68F A68E
+A691 A690
+A693 A692
+A695 A694
+A697 A696
+A6A0 .
+A6A1 .
+A6A2 .
+A6A3 .
+A6A4 .
+A6A5 .
+A6A6 .
+A6A7 .
+A6A8 .
+A6A9 .
+A6AA .
+A6AB .
+A6AC .
+A6AD .
+A6AE .
+A6AF .
+A6B0 .
+A6B1 .
+A6B2 .
+A6B3 .
+A6B4 .
+A6B5 .
+A6B6 .
+A6B7 .
+A6B8 .
+A6B9 .
+A6BA .
+A6BB .
+A6BC .
+A6BD .
+A6BE .
+A6BF .
+A6C0 .
+A6C1 .
+A6C2 .
+A6C3 .
+A6C4 .
+A6C5 .
+A6C6 .
+A6C7 .
+A6C8 .
+A6C9 .
+A6CA .
+A6CB .
+A6CC .
+A6CD .
+A6CE .
+A6CF .
+A6D0 .
+A6D1 .
+A6D2 .
+A6D3 .
+A6D4 .
+A6D5 .
+A6D6 .
+A6D7 .
+A6D8 .
+A6D9 .
+A6DA .
+A6DB .
+A6DC .
+A6DD .
+A6DE .
+A6DF .
+A6E0 .
+A6E1 .
+A6E2 .
+A6E3 .
+A6E4 .
+A6E5 .
+A717 .
+A718 .
+A719 .
+A71A .
+A71B .
+A71C .
+A71D .
+A71E .
+A71F .
+A723 A722
+A725 A724
+A727 A726
+A729 A728
+A72B A72A
+A72D A72C
+A72F A72E
+A730 .
+A731 .
+A733 A732
+A735 A734
+A737 A736
+A739 A738
+A73B A73A
+A73D A73C
+A73F A73E
+A741 A740
+A743 A742
+A745 A744
+A747 A746
+A749 A748
+A74B A74A
+A74D A74C
+A74F A74E
+A751 A750
+A753 A752
+A755 A754
+A757 A756
+A759 A758
+A75B A75A
+A75D A75C
+A75F A75E
+A761 A760
+A763 A762
+A765 A764
+A767 A766
+A769 A768
+A76B A76A
+A76D A76C
+A76F A76E
+A770 .
+A771 .
+A772 .
+A773 .
+A774 .
+A775 .
+A776 .
+A777 .
+A778 .
+A77A A779
+A77C A77B
+A77F A77E
+A781 A780
+A783 A782
+A785 A784
+A787 A786
+A788 .
+A78C A78B
+A78E .
+A791 A790
+A793 A792
+A7A1 A7A0
+A7A3 A7A2
+A7A5 A7A4
+A7A7 A7A6
+A7A9 A7A8
+A7F8 .
+A7F9 .
+A7FA .
+A7FB .
+A7FC .
+A7FD .
+A7FE .
+A7FF .
+A800 .
+A801 .
+A803 .
+A804 .
+A805 .
+A807 .
+A808 .
+A809 .
+A80A .
+A80C .
+A80D .
+A80E .
+A80F .
+A810 .
+A811 .
+A812 .
+A813 .
+A814 .
+A815 .
+A816 .
+A817 .
+A818 .
+A819 .
+A81A .
+A81B .
+A81C .
+A81D .
+A81E .
+A81F .
+A820 .
+A821 .
+A822 .
+A840 .
+A841 .
+A842 .
+A843 .
+A844 .
+A845 .
+A846 .
+A847 .
+A848 .
+A849 .
+A84A .
+A84B .
+A84C .
+A84D .
+A84E .
+A84F .
+A850 .
+A851 .
+A852 .
+A853 .
+A854 .
+A855 .
+A856 .
+A857 .
+A858 .
+A859 .
+A85A .
+A85B .
+A85C .
+A85D .
+A85E .
+A85F .
+A860 .
+A861 .
+A862 .
+A863 .
+A864 .
+A865 .
+A866 .
+A867 .
+A868 .
+A869 .
+A86A .
+A86B .
+A86C .
+A86D .
+A86E .
+A86F .
+A870 .
+A871 .
+A872 .
+A873 .
+A882 .
+A883 .
+A884 .
+A885 .
+A886 .
+A887 .
+A888 .
+A889 .
+A88A .
+A88B .
+A88C .
+A88D .
+A88E .
+A88F .
+A890 .
+A891 .
+A892 .
+A893 .
+A894 .
+A895 .
+A896 .
+A897 .
+A898 .
+A899 .
+A89A .
+A89B .
+A89C .
+A89D .
+A89E .
+A89F .
+A8A0 .
+A8A1 .
+A8A2 .
+A8A3 .
+A8A4 .
+A8A5 .
+A8A6 .
+A8A7 .
+A8A8 .
+A8A9 .
+A8AA .
+A8AB .
+A8AC .
+A8AD .
+A8AE .
+A8AF .
+A8B0 .
+A8B1 .
+A8B2 .
+A8B3 .
+A8F2 .
+A8F3 .
+A8F4 .
+A8F5 .
+A8F6 .
+A8F7 .
+A8FB .
+A90A .
+A90B .
+A90C .
+A90D .
+A90E .
+A90F .
+A910 .
+A911 .
+A912 .
+A913 .
+A914 .
+A915 .
+A916 .
+A917 .
+A918 .
+A919 .
+A91A .
+A91B .
+A91C .
+A91D .
+A91E .
+A91F .
+A920 .
+A921 .
+A922 .
+A923 .
+A924 .
+A925 .
+A930 .
+A931 .
+A932 .
+A933 .
+A934 .
+A935 .
+A936 .
+A937 .
+A938 .
+A939 .
+A93A .
+A93B .
+A93C .
+A93D .
+A93E .
+A93F .
+A940 .
+A941 .
+A942 .
+A943 .
+A944 .
+A945 .
+A946 .
+A960 .
+A961 .
+A962 .
+A963 .
+A964 .
+A965 .
+A966 .
+A967 .
+A968 .
+A969 .
+A96A .
+A96B .
+A96C .
+A96D .
+A96E .
+A96F .
+A970 .
+A971 .
+A972 .
+A973 .
+A974 .
+A975 .
+A976 .
+A977 .
+A978 .
+A979 .
+A97A .
+A97B .
+A97C .
+A984 .
+A985 .
+A986 .
+A987 .
+A988 .
+A989 .
+A98A .
+A98B .
+A98C .
+A98D .
+A98E .
+A98F .
+A990 .
+A991 .
+A992 .
+A993 .
+A994 .
+A995 .
+A996 .
+A997 .
+A998 .
+A999 .
+A99A .
+A99B .
+A99C .
+A99D .
+A99E .
+A99F .
+A9A0 .
+A9A1 .
+A9A2 .
+A9A3 .
+A9A4 .
+A9A5 .
+A9A6 .
+A9A7 .
+A9A8 .
+A9A9 .
+A9AA .
+A9AB .
+A9AC .
+A9AD .
+A9AE .
+A9AF .
+A9B0 .
+A9B1 .
+A9B2 .
+A9CF .
+AA00 .
+AA01 .
+AA02 .
+AA03 .
+AA04 .
+AA05 .
+AA06 .
+AA07 .
+AA08 .
+AA09 .
+AA0A .
+AA0B .
+AA0C .
+AA0D .
+AA0E .
+AA0F .
+AA10 .
+AA11 .
+AA12 .
+AA13 .
+AA14 .
+AA15 .
+AA16 .
+AA17 .
+AA18 .
+AA19 .
+AA1A .
+AA1B .
+AA1C .
+AA1D .
+AA1E .
+AA1F .
+AA20 .
+AA21 .
+AA22 .
+AA23 .
+AA24 .
+AA25 .
+AA26 .
+AA27 .
+AA28 .
+AA40 .
+AA41 .
+AA42 .
+AA44 .
+AA45 .
+AA46 .
+AA47 .
+AA48 .
+AA49 .
+AA4A .
+AA4B .
+AA60 .
+AA61 .
+AA62 .
+AA63 .
+AA64 .
+AA65 .
+AA66 .
+AA67 .
+AA68 .
+AA69 .
+AA6A .
+AA6B .
+AA6C .
+AA6D .
+AA6E .
+AA6F .
+AA70 .
+AA71 .
+AA72 .
+AA73 .
+AA74 .
+AA75 .
+AA76 .
+AA7A .
+AA80 .
+AA81 .
+AA82 .
+AA83 .
+AA84 .
+AA85 .
+AA86 .
+AA87 .
+AA88 .
+AA89 .
+AA8A .
+AA8B .
+AA8C .
+AA8D .
+AA8E .
+AA8F .
+AA90 .
+AA91 .
+AA92 .
+AA93 .
+AA94 .
+AA95 .
+AA96 .
+AA97 .
+AA98 .
+AA99 .
+AA9A .
+AA9B .
+AA9C .
+AA9D .
+AA9E .
+AA9F .
+AAA0 .
+AAA1 .
+AAA2 .
+AAA3 .
+AAA4 .
+AAA5 .
+AAA6 .
+AAA7 .
+AAA8 .
+AAA9 .
+AAAA .
+AAAB .
+AAAC .
+AAAD .
+AAAE .
+AAAF .
+AAB1 .
+AAB5 .
+AAB6 .
+AAB9 .
+AABA .
+AABB .
+AABC .
+AABD .
+AAC0 .
+AAC2 .
+AADB .
+AADC .
+AADD .
+AAE0 .
+AAE1 .
+AAE2 .
+AAE3 .
+AAE4 .
+AAE5 .
+AAE6 .
+AAE7 .
+AAE8 .
+AAE9 .
+AAEA .
+AAF2 .
+AAF3 .
+AAF4 .
+AB01 .
+AB02 .
+AB03 .
+AB04 .
+AB05 .
+AB06 .
+AB09 .
+AB0A .
+AB0B .
+AB0C .
+AB0D .
+AB0E .
+AB11 .
+AB12 .
+AB13 .
+AB14 .
+AB15 .
+AB16 .
+AB20 .
+AB21 .
+AB22 .
+AB23 .
+AB24 .
+AB25 .
+AB26 .
+AB28 .
+AB29 .
+AB2A .
+AB2B .
+AB2C .
+AB2D .
+AB2E .
+ABC0 .
+ABC1 .
+ABC2 .
+ABC3 .
+ABC4 .
+ABC5 .
+ABC6 .
+ABC7 .
+ABC8 .
+ABC9 .
+ABCA .
+ABCB .
+ABCC .
+ABCD .
+ABCE .
+ABCF .
+ABD0 .
+ABD1 .
+ABD2 .
+ABD3 .
+ABD4 .
+ABD5 .
+ABD6 .
+ABD7 .
+ABD8 .
+ABD9 .
+ABDA .
+ABDB .
+ABDC .
+ABDD .
+ABDE .
+ABDF .
+ABE0 .
+ABE1 .
+ABE2 .
+D7B0 .
+D7B1 .
+D7B2 .
+D7B3 .
+D7B4 .
+D7B5 .
+D7B6 .
+D7B7 .
+D7B8 .
+D7B9 .
+D7BA .
+D7BB .
+D7BC .
+D7BD .
+D7BE .
+D7BF .
+D7C0 .
+D7C1 .
+D7C2 .
+D7C3 .
+D7C4 .
+D7C5 .
+D7C6 .
+D7CB .
+D7CC .
+D7CD .
+D7CE .
+D7CF .
+D7D0 .
+D7D1 .
+D7D2 .
+D7D3 .
+D7D4 .
+D7D5 .
+D7D6 .
+D7D7 .
+D7D8 .
+D7D9 .
+D7DA .
+D7DB .
+D7DC .
+D7DD .
+D7DE .
+D7DF .
+D7E0 .
+D7E1 .
+D7E2 .
+D7E3 .
+D7E4 .
+D7E5 .
+D7E6 .
+D7E7 .
+D7E8 .
+D7E9 .
+D7EA .
+D7EB .
+D7EC .
+D7ED .
+D7EE .
+D7EF .
+D7F0 .
+D7F1 .
+D7F2 .
+D7F3 .
+D7F4 .
+D7F5 .
+D7F6 .
+D7F7 .
+D7F8 .
+D7F9 .
+D7FA .
+D7FB .
+F900 .
+F901 .
+F902 .
+F903 .
+F904 .
+F905 .
+F906 .
+F907 .
+F908 .
+F909 .
+F90A .
+F90B .
+F90C .
+F90D .
+F90E .
+F90F .
+F910 .
+F911 .
+F912 .
+F913 .
+F914 .
+F915 .
+F916 .
+F917 .
+F918 .
+F919 .
+F91A .
+F91B .
+F91C .
+F91D .
+F91E .
+F91F .
+F920 .
+F921 .
+F922 .
+F923 .
+F924 .
+F925 .
+F926 .
+F927 .
+F928 .
+F929 .
+F92A .
+F92B .
+F92C .
+F92D .
+F92E .
+F92F .
+F930 .
+F931 .
+F932 .
+F933 .
+F934 .
+F935 .
+F936 .
+F937 .
+F938 .
+F939 .
+F93A .
+F93B .
+F93C .
+F93D .
+F93E .
+F93F .
+F940 .
+F941 .
+F942 .
+F943 .
+F944 .
+F945 .
+F946 .
+F947 .
+F948 .
+F949 .
+F94A .
+F94B .
+F94C .
+F94D .
+F94E .
+F94F .
+F950 .
+F951 .
+F952 .
+F953 .
+F954 .
+F955 .
+F956 .
+F957 .
+F958 .
+F959 .
+F95A .
+F95B .
+F95C .
+F95D .
+F95E .
+F95F .
+F960 .
+F961 .
+F962 .
+F963 .
+F964 .
+F965 .
+F966 .
+F967 .
+F968 .
+F969 .
+F96A .
+F96B .
+F96C .
+F96D .
+F96E .
+F96F .
+F970 .
+F971 .
+F972 .
+F973 .
+F974 .
+F975 .
+F976 .
+F977 .
+F978 .
+F979 .
+F97A .
+F97B .
+F97C .
+F97D .
+F97E .
+F97F .
+F980 .
+F981 .
+F982 .
+F983 .
+F984 .
+F985 .
+F986 .
+F987 .
+F988 .
+F989 .
+F98A .
+F98B .
+F98C .
+F98D .
+F98E .
+F98F .
+F990 .
+F991 .
+F992 .
+F993 .
+F994 .
+F995 .
+F996 .
+F997 .
+F998 .
+F999 .
+F99A .
+F99B .
+F99C .
+F99D .
+F99E .
+F99F .
+F9A0 .
+F9A1 .
+F9A2 .
+F9A3 .
+F9A4 .
+F9A5 .
+F9A6 .
+F9A7 .
+F9A8 .
+F9A9 .
+F9AA .
+F9AB .
+F9AC .
+F9AD .
+F9AE .
+F9AF .
+F9B0 .
+F9B1 .
+F9B2 .
+F9B3 .
+F9B4 .
+F9B5 .
+F9B6 .
+F9B7 .
+F9B8 .
+F9B9 .
+F9BA .
+F9BB .
+F9BC .
+F9BD .
+F9BE .
+F9BF .
+F9C0 .
+F9C1 .
+F9C2 .
+F9C3 .
+F9C4 .
+F9C5 .
+F9C6 .
+F9C7 .
+F9C8 .
+F9C9 .
+F9CA .
+F9CB .
+F9CC .
+F9CD .
+F9CE .
+F9CF .
+F9D0 .
+F9D1 .
+F9D2 .
+F9D3 .
+F9D4 .
+F9D5 .
+F9D6 .
+F9D7 .
+F9D8 .
+F9D9 .
+F9DA .
+F9DB .
+F9DC .
+F9DD .
+F9DE .
+F9DF .
+F9E0 .
+F9E1 .
+F9E2 .
+F9E3 .
+F9E4 .
+F9E5 .
+F9E6 .
+F9E7 .
+F9E8 .
+F9E9 .
+F9EA .
+F9EB .
+F9EC .
+F9ED .
+F9EE .
+F9EF .
+F9F0 .
+F9F1 .
+F9F2 .
+F9F3 .
+F9F4 .
+F9F5 .
+F9F6 .
+F9F7 .
+F9F8 .
+F9F9 .
+F9FA .
+F9FB .
+F9FC .
+F9FD .
+F9FE .
+F9FF .
+FA00 .
+FA01 .
+FA02 .
+FA03 .
+FA04 .
+FA05 .
+FA06 .
+FA07 .
+FA08 .
+FA09 .
+FA0A .
+FA0B .
+FA0C .
+FA0D .
+FA0E .
+FA0F .
+FA10 .
+FA11 .
+FA12 .
+FA13 .
+FA14 .
+FA15 .
+FA16 .
+FA17 .
+FA18 .
+FA19 .
+FA1A .
+FA1B .
+FA1C .
+FA1D .
+FA1E .
+FA1F .
+FA20 .
+FA21 .
+FA22 .
+FA23 .
+FA24 .
+FA25 .
+FA26 .
+FA27 .
+FA28 .
+FA29 .
+FA2A .
+FA2B .
+FA2C .
+FA2D .
+FA2E .
+FA2F .
+FA30 .
+FA31 .
+FA32 .
+FA33 .
+FA34 .
+FA35 .
+FA36 .
+FA37 .
+FA38 .
+FA39 .
+FA3A .
+FA3B .
+FA3C .
+FA3D .
+FA3E .
+FA3F .
+FA40 .
+FA41 .
+FA42 .
+FA43 .
+FA44 .
+FA45 .
+FA46 .
+FA47 .
+FA48 .
+FA49 .
+FA4A .
+FA4B .
+FA4C .
+FA4D .
+FA4E .
+FA4F .
+FA50 .
+FA51 .
+FA52 .
+FA53 .
+FA54 .
+FA55 .
+FA56 .
+FA57 .
+FA58 .
+FA59 .
+FA5A .
+FA5B .
+FA5C .
+FA5D .
+FA5E .
+FA5F .
+FA60 .
+FA61 .
+FA62 .
+FA63 .
+FA64 .
+FA65 .
+FA66 .
+FA67 .
+FA68 .
+FA69 .
+FA6A .
+FA6B .
+FA6C .
+FA6D .
+FA70 .
+FA71 .
+FA72 .
+FA73 .
+FA74 .
+FA75 .
+FA76 .
+FA77 .
+FA78 .
+FA79 .
+FA7A .
+FA7B .
+FA7C .
+FA7D .
+FA7E .
+FA7F .
+FA80 .
+FA81 .
+FA82 .
+FA83 .
+FA84 .
+FA85 .
+FA86 .
+FA87 .
+FA88 .
+FA89 .
+FA8A .
+FA8B .
+FA8C .
+FA8D .
+FA8E .
+FA8F .
+FA90 .
+FA91 .
+FA92 .
+FA93 .
+FA94 .
+FA95 .
+FA96 .
+FA97 .
+FA98 .
+FA99 .
+FA9A .
+FA9B .
+FA9C .
+FA9D .
+FA9E .
+FA9F .
+FAA0 .
+FAA1 .
+FAA2 .
+FAA3 .
+FAA4 .
+FAA5 .
+FAA6 .
+FAA7 .
+FAA8 .
+FAA9 .
+FAAA .
+FAAB .
+FAAC .
+FAAD .
+FAAE .
+FAAF .
+FAB0 .
+FAB1 .
+FAB2 .
+FAB3 .
+FAB4 .
+FAB5 .
+FAB6 .
+FAB7 .
+FAB8 .
+FAB9 .
+FABA .
+FABB .
+FABC .
+FABD .
+FABE .
+FABF .
+FAC0 .
+FAC1 .
+FAC2 .
+FAC3 .
+FAC4 .
+FAC5 .
+FAC6 .
+FAC7 .
+FAC8 .
+FAC9 .
+FACA .
+FACB .
+FACC .
+FACD .
+FACE .
+FACF .
+FAD0 .
+FAD1 .
+FAD2 .
+FAD3 .
+FAD4 .
+FAD5 .
+FAD6 .
+FAD7 .
+FAD8 .
+FAD9 .
+FB00 .
+FB01 .
+FB02 .
+FB03 .
+FB04 .
+FB05 .
+FB06 .
+FB13 .
+FB14 .
+FB15 .
+FB16 .
+FB17 .
+FB1D .
+FB1F .
+FB20 .
+FB21 .
+FB22 .
+FB23 .
+FB24 .
+FB25 .
+FB26 .
+FB27 .
+FB28 .
+FB2A .
+FB2B .
+FB2C .
+FB2D .
+FB2E .
+FB2F .
+FB30 .
+FB31 .
+FB32 .
+FB33 .
+FB34 .
+FB35 .
+FB36 .
+FB38 .
+FB39 .
+FB3A .
+FB3B .
+FB3C .
+FB3E .
+FB40 .
+FB41 .
+FB43 .
+FB44 .
+FB46 .
+FB47 .
+FB48 .
+FB49 .
+FB4A .
+FB4B .
+FB4C .
+FB4D .
+FB4E .
+FB4F .
+FB50 .
+FB51 .
+FB52 .
+FB53 .
+FB54 .
+FB55 .
+FB56 .
+FB57 .
+FB58 .
+FB59 .
+FB5A .
+FB5B .
+FB5C .
+FB5D .
+FB5E .
+FB5F .
+FB60 .
+FB61 .
+FB62 .
+FB63 .
+FB64 .
+FB65 .
+FB66 .
+FB67 .
+FB68 .
+FB69 .
+FB6A .
+FB6B .
+FB6C .
+FB6D .
+FB6E .
+FB6F .
+FB70 .
+FB71 .
+FB72 .
+FB73 .
+FB74 .
+FB75 .
+FB76 .
+FB77 .
+FB78 .
+FB79 .
+FB7A .
+FB7B .
+FB7C .
+FB7D .
+FB7E .
+FB7F .
+FB80 .
+FB81 .
+FB82 .
+FB83 .
+FB84 .
+FB85 .
+FB86 .
+FB87 .
+FB88 .
+FB89 .
+FB8A .
+FB8B .
+FB8C .
+FB8D .
+FB8E .
+FB8F .
+FB90 .
+FB91 .
+FB92 .
+FB93 .
+FB94 .
+FB95 .
+FB96 .
+FB97 .
+FB98 .
+FB99 .
+FB9A .
+FB9B .
+FB9C .
+FB9D .
+FB9E .
+FB9F .
+FBA0 .
+FBA1 .
+FBA2 .
+FBA3 .
+FBA4 .
+FBA5 .
+FBA6 .
+FBA7 .
+FBA8 .
+FBA9 .
+FBAA .
+FBAB .
+FBAC .
+FBAD .
+FBAE .
+FBAF .
+FBB0 .
+FBB1 .
+FBD3 .
+FBD4 .
+FBD5 .
+FBD6 .
+FBD7 .
+FBD8 .
+FBD9 .
+FBDA .
+FBDB .
+FBDC .
+FBDD .
+FBDE .
+FBDF .
+FBE0 .
+FBE1 .
+FBE2 .
+FBE3 .
+FBE4 .
+FBE5 .
+FBE6 .
+FBE7 .
+FBE8 .
+FBE9 .
+FBEA .
+FBEB .
+FBEC .
+FBED .
+FBEE .
+FBEF .
+FBF0 .
+FBF1 .
+FBF2 .
+FBF3 .
+FBF4 .
+FBF5 .
+FBF6 .
+FBF7 .
+FBF8 .
+FBF9 .
+FBFA .
+FBFB .
+FBFC .
+FBFD .
+FBFE .
+FBFF .
+FC00 .
+FC01 .
+FC02 .
+FC03 .
+FC04 .
+FC05 .
+FC06 .
+FC07 .
+FC08 .
+FC09 .
+FC0A .
+FC0B .
+FC0C .
+FC0D .
+FC0E .
+FC0F .
+FC10 .
+FC11 .
+FC12 .
+FC13 .
+FC14 .
+FC15 .
+FC16 .
+FC17 .
+FC18 .
+FC19 .
+FC1A .
+FC1B .
+FC1C .
+FC1D .
+FC1E .
+FC1F .
+FC20 .
+FC21 .
+FC22 .
+FC23 .
+FC24 .
+FC25 .
+FC26 .
+FC27 .
+FC28 .
+FC29 .
+FC2A .
+FC2B .
+FC2C .
+FC2D .
+FC2E .
+FC2F .
+FC30 .
+FC31 .
+FC32 .
+FC33 .
+FC34 .
+FC35 .
+FC36 .
+FC37 .
+FC38 .
+FC39 .
+FC3A .
+FC3B .
+FC3C .
+FC3D .
+FC3E .
+FC3F .
+FC40 .
+FC41 .
+FC42 .
+FC43 .
+FC44 .
+FC45 .
+FC46 .
+FC47 .
+FC48 .
+FC49 .
+FC4A .
+FC4B .
+FC4C .
+FC4D .
+FC4E .
+FC4F .
+FC50 .
+FC51 .
+FC52 .
+FC53 .
+FC54 .
+FC55 .
+FC56 .
+FC57 .
+FC58 .
+FC59 .
+FC5A .
+FC5B .
+FC5C .
+FC5D .
+FC5E .
+FC5F .
+FC60 .
+FC61 .
+FC62 .
+FC63 .
+FC64 .
+FC65 .
+FC66 .
+FC67 .
+FC68 .
+FC69 .
+FC6A .
+FC6B .
+FC6C .
+FC6D .
+FC6E .
+FC6F .
+FC70 .
+FC71 .
+FC72 .
+FC73 .
+FC74 .
+FC75 .
+FC76 .
+FC77 .
+FC78 .
+FC79 .
+FC7A .
+FC7B .
+FC7C .
+FC7D .
+FC7E .
+FC7F .
+FC80 .
+FC81 .
+FC82 .
+FC83 .
+FC84 .
+FC85 .
+FC86 .
+FC87 .
+FC88 .
+FC89 .
+FC8A .
+FC8B .
+FC8C .
+FC8D .
+FC8E .
+FC8F .
+FC90 .
+FC91 .
+FC92 .
+FC93 .
+FC94 .
+FC95 .
+FC96 .
+FC97 .
+FC98 .
+FC99 .
+FC9A .
+FC9B .
+FC9C .
+FC9D .
+FC9E .
+FC9F .
+FCA0 .
+FCA1 .
+FCA2 .
+FCA3 .
+FCA4 .
+FCA5 .
+FCA6 .
+FCA7 .
+FCA8 .
+FCA9 .
+FCAA .
+FCAB .
+FCAC .
+FCAD .
+FCAE .
+FCAF .
+FCB0 .
+FCB1 .
+FCB2 .
+FCB3 .
+FCB4 .
+FCB5 .
+FCB6 .
+FCB7 .
+FCB8 .
+FCB9 .
+FCBA .
+FCBB .
+FCBC .
+FCBD .
+FCBE .
+FCBF .
+FCC0 .
+FCC1 .
+FCC2 .
+FCC3 .
+FCC4 .
+FCC5 .
+FCC6 .
+FCC7 .
+FCC8 .
+FCC9 .
+FCCA .
+FCCB .
+FCCC .
+FCCD .
+FCCE .
+FCCF .
+FCD0 .
+FCD1 .
+FCD2 .
+FCD3 .
+FCD4 .
+FCD5 .
+FCD6 .
+FCD7 .
+FCD8 .
+FCD9 .
+FCDA .
+FCDB .
+FCDC .
+FCDD .
+FCDE .
+FCDF .
+FCE0 .
+FCE1 .
+FCE2 .
+FCE3 .
+FCE4 .
+FCE5 .
+FCE6 .
+FCE7 .
+FCE8 .
+FCE9 .
+FCEA .
+FCEB .
+FCEC .
+FCED .
+FCEE .
+FCEF .
+FCF0 .
+FCF1 .
+FCF2 .
+FCF3 .
+FCF4 .
+FCF5 .
+FCF6 .
+FCF7 .
+FCF8 .
+FCF9 .
+FCFA .
+FCFB .
+FCFC .
+FCFD .
+FCFE .
+FCFF .
+FD00 .
+FD01 .
+FD02 .
+FD03 .
+FD04 .
+FD05 .
+FD06 .
+FD07 .
+FD08 .
+FD09 .
+FD0A .
+FD0B .
+FD0C .
+FD0D .
+FD0E .
+FD0F .
+FD10 .
+FD11 .
+FD12 .
+FD13 .
+FD14 .
+FD15 .
+FD16 .
+FD17 .
+FD18 .
+FD19 .
+FD1A .
+FD1B .
+FD1C .
+FD1D .
+FD1E .
+FD1F .
+FD20 .
+FD21 .
+FD22 .
+FD23 .
+FD24 .
+FD25 .
+FD26 .
+FD27 .
+FD28 .
+FD29 .
+FD2A .
+FD2B .
+FD2C .
+FD2D .
+FD2E .
+FD2F .
+FD30 .
+FD31 .
+FD32 .
+FD33 .
+FD34 .
+FD35 .
+FD36 .
+FD37 .
+FD38 .
+FD39 .
+FD3A .
+FD3B .
+FD3C .
+FD3D .
+FD50 .
+FD51 .
+FD52 .
+FD53 .
+FD54 .
+FD55 .
+FD56 .
+FD57 .
+FD58 .
+FD59 .
+FD5A .
+FD5B .
+FD5C .
+FD5D .
+FD5E .
+FD5F .
+FD60 .
+FD61 .
+FD62 .
+FD63 .
+FD64 .
+FD65 .
+FD66 .
+FD67 .
+FD68 .
+FD69 .
+FD6A .
+FD6B .
+FD6C .
+FD6D .
+FD6E .
+FD6F .
+FD70 .
+FD71 .
+FD72 .
+FD73 .
+FD74 .
+FD75 .
+FD76 .
+FD77 .
+FD78 .
+FD79 .
+FD7A .
+FD7B .
+FD7C .
+FD7D .
+FD7E .
+FD7F .
+FD80 .
+FD81 .
+FD82 .
+FD83 .
+FD84 .
+FD85 .
+FD86 .
+FD87 .
+FD88 .
+FD89 .
+FD8A .
+FD8B .
+FD8C .
+FD8D .
+FD8E .
+FD8F .
+FD92 .
+FD93 .
+FD94 .
+FD95 .
+FD96 .
+FD97 .
+FD98 .
+FD99 .
+FD9A .
+FD9B .
+FD9C .
+FD9D .
+FD9E .
+FD9F .
+FDA0 .
+FDA1 .
+FDA2 .
+FDA3 .
+FDA4 .
+FDA5 .
+FDA6 .
+FDA7 .
+FDA8 .
+FDA9 .
+FDAA .
+FDAB .
+FDAC .
+FDAD .
+FDAE .
+FDAF .
+FDB0 .
+FDB1 .
+FDB2 .
+FDB3 .
+FDB4 .
+FDB5 .
+FDB6 .
+FDB7 .
+FDB8 .
+FDB9 .
+FDBA .
+FDBB .
+FDBC .
+FDBD .
+FDBE .
+FDBF .
+FDC0 .
+FDC1 .
+FDC2 .
+FDC3 .
+FDC4 .
+FDC5 .
+FDC6 .
+FDC7 .
+FDF0 .
+FDF1 .
+FDF2 .
+FDF3 .
+FDF4 .
+FDF5 .
+FDF6 .
+FDF7 .
+FDF8 .
+FDF9 .
+FDFA .
+FDFB .
+FE70 .
+FE71 .
+FE72 .
+FE73 .
+FE74 .
+FE76 .
+FE77 .
+FE78 .
+FE79 .
+FE7A .
+FE7B .
+FE7C .
+FE7D .
+FE7E .
+FE7F .
+FE80 .
+FE81 .
+FE82 .
+FE83 .
+FE84 .
+FE85 .
+FE86 .
+FE87 .
+FE88 .
+FE89 .
+FE8A .
+FE8B .
+FE8C .
+FE8D .
+FE8E .
+FE8F .
+FE90 .
+FE91 .
+FE92 .
+FE93 .
+FE94 .
+FE95 .
+FE96 .
+FE97 .
+FE98 .
+FE99 .
+FE9A .
+FE9B .
+FE9C .
+FE9D .
+FE9E .
+FE9F .
+FEA0 .
+FEA1 .
+FEA2 .
+FEA3 .
+FEA4 .
+FEA5 .
+FEA6 .
+FEA7 .
+FEA8 .
+FEA9 .
+FEAA .
+FEAB .
+FEAC .
+FEAD .
+FEAE .
+FEAF .
+FEB0 .
+FEB1 .
+FEB2 .
+FEB3 .
+FEB4 .
+FEB5 .
+FEB6 .
+FEB7 .
+FEB8 .
+FEB9 .
+FEBA .
+FEBB .
+FEBC .
+FEBD .
+FEBE .
+FEBF .
+FEC0 .
+FEC1 .
+FEC2 .
+FEC3 .
+FEC4 .
+FEC5 .
+FEC6 .
+FEC7 .
+FEC8 .
+FEC9 .
+FECA .
+FECB .
+FECC .
+FECD .
+FECE .
+FECF .
+FED0 .
+FED1 .
+FED2 .
+FED3 .
+FED4 .
+FED5 .
+FED6 .
+FED7 .
+FED8 .
+FED9 .
+FEDA .
+FEDB .
+FEDC .
+FEDD .
+FEDE .
+FEDF .
+FEE0 .
+FEE1 .
+FEE2 .
+FEE3 .
+FEE4 .
+FEE5 .
+FEE6 .
+FEE7 .
+FEE8 .
+FEE9 .
+FEEA .
+FEEB .
+FEEC .
+FEED .
+FEEE .
+FEEF .
+FEF0 .
+FEF1 .
+FEF2 .
+FEF3 .
+FEF4 .
+FEF5 .
+FEF6 .
+FEF7 .
+FEF8 .
+FEF9 .
+FEFA .
+FEFB .
+FEFC .
+FF41 FF21
+FF42 FF22
+FF43 FF23
+FF44 FF24
+FF45 FF25
+FF46 FF26
+FF47 FF27
+FF48 FF28
+FF49 FF29
+FF4A FF2A
+FF4B FF2B
+FF4C FF2C
+FF4D FF2D
+FF4E FF2E
+FF4F FF2F
+FF50 FF30
+FF51 FF31
+FF52 FF32
+FF53 FF33
+FF54 FF34
+FF55 FF35
+FF56 FF36
+FF57 FF37
+FF58 FF38
+FF59 FF39
+FF5A FF3A
+FF66 .
+FF67 .
+FF68 .
+FF69 .
+FF6A .
+FF6B .
+FF6C .
+FF6D .
+FF6E .
+FF6F .
+FF70 .
+FF71 .
+FF72 .
+FF73 .
+FF74 .
+FF75 .
+FF76 .
+FF77 .
+FF78 .
+FF79 .
+FF7A .
+FF7B .
+FF7C .
+FF7D .
+FF7E .
+FF7F .
+FF80 .
+FF81 .
+FF82 .
+FF83 .
+FF84 .
+FF85 .
+FF86 .
+FF87 .
+FF88 .
+FF89 .
+FF8A .
+FF8B .
+FF8C .
+FF8D .
+FF8E .
+FF8F .
+FF90 .
+FF91 .
+FF92 .
+FF93 .
+FF94 .
+FF95 .
+FF96 .
+FF97 .
+FF98 .
+FF99 .
+FF9A .
+FF9B .
+FF9C .
+FF9D .
+FF9E .
+FF9F .
+FFA0 .
+FFA1 .
+FFA2 .
+FFA3 .
+FFA4 .
+FFA5 .
+FFA6 .
+FFA7 .
+FFA8 .
+FFA9 .
+FFAA .
+FFAB .
+FFAC .
+FFAD .
+FFAE .
+FFAF .
+FFB0 .
+FFB1 .
+FFB2 .
+FFB3 .
+FFB4 .
+FFB5 .
+FFB6 .
+FFB7 .
+FFB8 .
+FFB9 .
+FFBA .
+FFBB .
+FFBC .
+FFBD .
+FFBE .
+FFC2 .
+FFC3 .
+FFC4 .
+FFC5 .
+FFC6 .
+FFC7 .
+FFCA .
+FFCB .
+FFCC .
+FFCD .
+FFCE .
+FFCF .
+FFD2 .
+FFD3 .
+FFD4 .
+FFD5 .
+FFD6 .
+FFD7 .
+FFDA .
+FFDB .
+FFDC .
+10000 .
+10001 .
+10002 .
+10003 .
+10004 .
+10005 .
+10006 .
+10007 .
+10008 .
+10009 .
+1000A .
+1000B .
+1000D .
+1000E .
+1000F .
+10010 .
+10011 .
+10012 .
+10013 .
+10014 .
+10015 .
+10016 .
+10017 .
+10018 .
+10019 .
+1001A .
+1001B .
+1001C .
+1001D .
+1001E .
+1001F .
+10020 .
+10021 .
+10022 .
+10023 .
+10024 .
+10025 .
+10026 .
+10028 .
+10029 .
+1002A .
+1002B .
+1002C .
+1002D .
+1002E .
+1002F .
+10030 .
+10031 .
+10032 .
+10033 .
+10034 .
+10035 .
+10036 .
+10037 .
+10038 .
+10039 .
+1003A .
+1003C .
+1003D .
+1003F .
+10040 .
+10041 .
+10042 .
+10043 .
+10044 .
+10045 .
+10046 .
+10047 .
+10048 .
+10049 .
+1004A .
+1004B .
+1004C .
+1004D .
+10050 .
+10051 .
+10052 .
+10053 .
+10054 .
+10055 .
+10056 .
+10057 .
+10058 .
+10059 .
+1005A .
+1005B .
+1005C .
+1005D .
+10080 .
+10081 .
+10082 .
+10083 .
+10084 .
+10085 .
+10086 .
+10087 .
+10088 .
+10089 .
+1008A .
+1008B .
+1008C .
+1008D .
+1008E .
+1008F .
+10090 .
+10091 .
+10092 .
+10093 .
+10094 .
+10095 .
+10096 .
+10097 .
+10098 .
+10099 .
+1009A .
+1009B .
+1009C .
+1009D .
+1009E .
+1009F .
+100A0 .
+100A1 .
+100A2 .
+100A3 .
+100A4 .
+100A5 .
+100A6 .
+100A7 .
+100A8 .
+100A9 .
+100AA .
+100AB .
+100AC .
+100AD .
+100AE .
+100AF .
+100B0 .
+100B1 .
+100B2 .
+100B3 .
+100B4 .
+100B5 .
+100B6 .
+100B7 .
+100B8 .
+100B9 .
+100BA .
+100BB .
+100BC .
+100BD .
+100BE .
+100BF .
+100C0 .
+100C1 .
+100C2 .
+100C3 .
+100C4 .
+100C5 .
+100C6 .
+100C7 .
+100C8 .
+100C9 .
+100CA .
+100CB .
+100CC .
+100CD .
+100CE .
+100CF .
+100D0 .
+100D1 .
+100D2 .
+100D3 .
+100D4 .
+100D5 .
+100D6 .
+100D7 .
+100D8 .
+100D9 .
+100DA .
+100DB .
+100DC .
+100DD .
+100DE .
+100DF .
+100E0 .
+100E1 .
+100E2 .
+100E3 .
+100E4 .
+100E5 .
+100E6 .
+100E7 .
+100E8 .
+100E9 .
+100EA .
+100EB .
+100EC .
+100ED .
+100EE .
+100EF .
+100F0 .
+100F1 .
+100F2 .
+100F3 .
+100F4 .
+100F5 .
+100F6 .
+100F7 .
+100F8 .
+100F9 .
+100FA .
+10280 .
+10281 .
+10282 .
+10283 .
+10284 .
+10285 .
+10286 .
+10287 .
+10288 .
+10289 .
+1028A .
+1028B .
+1028C .
+1028D .
+1028E .
+1028F .
+10290 .
+10291 .
+10292 .
+10293 .
+10294 .
+10295 .
+10296 .
+10297 .
+10298 .
+10299 .
+1029A .
+1029B .
+1029C .
+102A0 .
+102A1 .
+102A2 .
+102A3 .
+102A4 .
+102A5 .
+102A6 .
+102A7 .
+102A8 .
+102A9 .
+102AA .
+102AB .
+102AC .
+102AD .
+102AE .
+102AF .
+102B0 .
+102B1 .
+102B2 .
+102B3 .
+102B4 .
+102B5 .
+102B6 .
+102B7 .
+102B8 .
+102B9 .
+102BA .
+102BB .
+102BC .
+102BD .
+102BE .
+102BF .
+102C0 .
+102C1 .
+102C2 .
+102C3 .
+102C4 .
+102C5 .
+102C6 .
+102C7 .
+102C8 .
+102C9 .
+102CA .
+102CB .
+102CC .
+102CD .
+102CE .
+102CF .
+102D0 .
+10300 .
+10301 .
+10302 .
+10303 .
+10304 .
+10305 .
+10306 .
+10307 .
+10308 .
+10309 .
+1030A .
+1030B .
+1030C .
+1030D .
+1030E .
+1030F .
+10310 .
+10311 .
+10312 .
+10313 .
+10314 .
+10315 .
+10316 .
+10317 .
+10318 .
+10319 .
+1031A .
+1031B .
+1031C .
+1031D .
+1031E .
+10330 .
+10331 .
+10332 .
+10333 .
+10334 .
+10335 .
+10336 .
+10337 .
+10338 .
+10339 .
+1033A .
+1033B .
+1033C .
+1033D .
+1033E .
+1033F .
+10340 .
+10342 .
+10343 .
+10344 .
+10345 .
+10346 .
+10347 .
+10348 .
+10349 .
+10380 .
+10381 .
+10382 .
+10383 .
+10384 .
+10385 .
+10386 .
+10387 .
+10388 .
+10389 .
+1038A .
+1038B .
+1038C .
+1038D .
+1038E .
+1038F .
+10390 .
+10391 .
+10392 .
+10393 .
+10394 .
+10395 .
+10396 .
+10397 .
+10398 .
+10399 .
+1039A .
+1039B .
+1039C .
+1039D .
+103A0 .
+103A1 .
+103A2 .
+103A3 .
+103A4 .
+103A5 .
+103A6 .
+103A7 .
+103A8 .
+103A9 .
+103AA .
+103AB .
+103AC .
+103AD .
+103AE .
+103AF .
+103B0 .
+103B1 .
+103B2 .
+103B3 .
+103B4 .
+103B5 .
+103B6 .
+103B7 .
+103B8 .
+103B9 .
+103BA .
+103BB .
+103BC .
+103BD .
+103BE .
+103BF .
+103C0 .
+103C1 .
+103C2 .
+103C3 .
+103C8 .
+103C9 .
+103CA .
+103CB .
+103CC .
+103CD .
+103CE .
+103CF .
+10428 10400
+10429 10401
+1042A 10402
+1042B 10403
+1042C 10404
+1042D 10405
+1042E 10406
+1042F 10407
+10430 10408
+10431 10409
+10432 1040A
+10433 1040B
+10434 1040C
+10435 1040D
+10436 1040E
+10437 1040F
+10438 10410
+10439 10411
+1043A 10412
+1043B 10413
+1043C 10414
+1043D 10415
+1043E 10416
+1043F 10417
+10440 10418
+10441 10419
+10442 1041A
+10443 1041B
+10444 1041C
+10445 1041D
+10446 1041E
+10447 1041F
+10448 10420
+10449 10421
+1044A 10422
+1044B 10423
+1044C 10424
+1044D 10425
+1044E 10426
+1044F 10427
+10450 .
+10451 .
+10452 .
+10453 .
+10454 .
+10455 .
+10456 .
+10457 .
+10458 .
+10459 .
+1045A .
+1045B .
+1045C .
+1045D .
+1045E .
+1045F .
+10460 .
+10461 .
+10462 .
+10463 .
+10464 .
+10465 .
+10466 .
+10467 .
+10468 .
+10469 .
+1046A .
+1046B .
+1046C .
+1046D .
+1046E .
+1046F .
+10470 .
+10471 .
+10472 .
+10473 .
+10474 .
+10475 .
+10476 .
+10477 .
+10478 .
+10479 .
+1047A .
+1047B .
+1047C .
+1047D .
+1047E .
+1047F .
+10480 .
+10481 .
+10482 .
+10483 .
+10484 .
+10485 .
+10486 .
+10487 .
+10488 .
+10489 .
+1048A .
+1048B .
+1048C .
+1048D .
+1048E .
+1048F .
+10490 .
+10491 .
+10492 .
+10493 .
+10494 .
+10495 .
+10496 .
+10497 .
+10498 .
+10499 .
+1049A .
+1049B .
+1049C .
+1049D .
+10800 .
+10801 .
+10802 .
+10803 .
+10804 .
+10805 .
+10808 .
+1080A .
+1080B .
+1080C .
+1080D .
+1080E .
+1080F .
+10810 .
+10811 .
+10812 .
+10813 .
+10814 .
+10815 .
+10816 .
+10817 .
+10818 .
+10819 .
+1081A .
+1081B .
+1081C .
+1081D .
+1081E .
+1081F .
+10820 .
+10821 .
+10822 .
+10823 .
+10824 .
+10825 .
+10826 .
+10827 .
+10828 .
+10829 .
+1082A .
+1082B .
+1082C .
+1082D .
+1082E .
+1082F .
+10830 .
+10831 .
+10832 .
+10833 .
+10834 .
+10835 .
+10837 .
+10838 .
+1083C .
+1083F .
+10840 .
+10841 .
+10842 .
+10843 .
+10844 .
+10845 .
+10846 .
+10847 .
+10848 .
+10849 .
+1084A .
+1084B .
+1084C .
+1084D .
+1084E .
+1084F .
+10850 .
+10851 .
+10852 .
+10853 .
+10854 .
+10855 .
+10900 .
+10901 .
+10902 .
+10903 .
+10904 .
+10905 .
+10906 .
+10907 .
+10908 .
+10909 .
+1090A .
+1090B .
+1090C .
+1090D .
+1090E .
+1090F .
+10910 .
+10911 .
+10912 .
+10913 .
+10914 .
+10915 .
+10920 .
+10921 .
+10922 .
+10923 .
+10924 .
+10925 .
+10926 .
+10927 .
+10928 .
+10929 .
+1092A .
+1092B .
+1092C .
+1092D .
+1092E .
+1092F .
+10930 .
+10931 .
+10932 .
+10933 .
+10934 .
+10935 .
+10936 .
+10937 .
+10938 .
+10939 .
+10980 .
+10981 .
+10982 .
+10983 .
+10984 .
+10985 .
+10986 .
+10987 .
+10988 .
+10989 .
+1098A .
+1098B .
+1098C .
+1098D .
+1098E .
+1098F .
+10990 .
+10991 .
+10992 .
+10993 .
+10994 .
+10995 .
+10996 .
+10997 .
+10998 .
+10999 .
+1099A .
+1099B .
+1099C .
+1099D .
+1099E .
+1099F .
+109A0 .
+109A1 .
+109A2 .
+109A3 .
+109A4 .
+109A5 .
+109A6 .
+109A7 .
+109A8 .
+109A9 .
+109AA .
+109AB .
+109AC .
+109AD .
+109AE .
+109AF .
+109B0 .
+109B1 .
+109B2 .
+109B3 .
+109B4 .
+109B5 .
+109B6 .
+109B7 .
+109BE .
+109BF .
+10A00 .
+10A10 .
+10A11 .
+10A12 .
+10A13 .
+10A15 .
+10A16 .
+10A17 .
+10A19 .
+10A1A .
+10A1B .
+10A1C .
+10A1D .
+10A1E .
+10A1F .
+10A20 .
+10A21 .
+10A22 .
+10A23 .
+10A24 .
+10A25 .
+10A26 .
+10A27 .
+10A28 .
+10A29 .
+10A2A .
+10A2B .
+10A2C .
+10A2D .
+10A2E .
+10A2F .
+10A30 .
+10A31 .
+10A32 .
+10A33 .
+10A60 .
+10A61 .
+10A62 .
+10A63 .
+10A64 .
+10A65 .
+10A66 .
+10A67 .
+10A68 .
+10A69 .
+10A6A .
+10A6B .
+10A6C .
+10A6D .
+10A6E .
+10A6F .
+10A70 .
+10A71 .
+10A72 .
+10A73 .
+10A74 .
+10A75 .
+10A76 .
+10A77 .
+10A78 .
+10A79 .
+10A7A .
+10A7B .
+10A7C .
+10B00 .
+10B01 .
+10B02 .
+10B03 .
+10B04 .
+10B05 .
+10B06 .
+10B07 .
+10B08 .
+10B09 .
+10B0A .
+10B0B .
+10B0C .
+10B0D .
+10B0E .
+10B0F .
+10B10 .
+10B11 .
+10B12 .
+10B13 .
+10B14 .
+10B15 .
+10B16 .
+10B17 .
+10B18 .
+10B19 .
+10B1A .
+10B1B .
+10B1C .
+10B1D .
+10B1E .
+10B1F .
+10B20 .
+10B21 .
+10B22 .
+10B23 .
+10B24 .
+10B25 .
+10B26 .
+10B27 .
+10B28 .
+10B29 .
+10B2A .
+10B2B .
+10B2C .
+10B2D .
+10B2E .
+10B2F .
+10B30 .
+10B31 .
+10B32 .
+10B33 .
+10B34 .
+10B35 .
+10B40 .
+10B41 .
+10B42 .
+10B43 .
+10B44 .
+10B45 .
+10B46 .
+10B47 .
+10B48 .
+10B49 .
+10B4A .
+10B4B .
+10B4C .
+10B4D .
+10B4E .
+10B4F .
+10B50 .
+10B51 .
+10B52 .
+10B53 .
+10B54 .
+10B55 .
+10B60 .
+10B61 .
+10B62 .
+10B63 .
+10B64 .
+10B65 .
+10B66 .
+10B67 .
+10B68 .
+10B69 .
+10B6A .
+10B6B .
+10B6C .
+10B6D .
+10B6E .
+10B6F .
+10B70 .
+10B71 .
+10B72 .
+10C00 .
+10C01 .
+10C02 .
+10C03 .
+10C04 .
+10C05 .
+10C06 .
+10C07 .
+10C08 .
+10C09 .
+10C0A .
+10C0B .
+10C0C .
+10C0D .
+10C0E .
+10C0F .
+10C10 .
+10C11 .
+10C12 .
+10C13 .
+10C14 .
+10C15 .
+10C16 .
+10C17 .
+10C18 .
+10C19 .
+10C1A .
+10C1B .
+10C1C .
+10C1D .
+10C1E .
+10C1F .
+10C20 .
+10C21 .
+10C22 .
+10C23 .
+10C24 .
+10C25 .
+10C26 .
+10C27 .
+10C28 .
+10C29 .
+10C2A .
+10C2B .
+10C2C .
+10C2D .
+10C2E .
+10C2F .
+10C30 .
+10C31 .
+10C32 .
+10C33 .
+10C34 .
+10C35 .
+10C36 .
+10C37 .
+10C38 .
+10C39 .
+10C3A .
+10C3B .
+10C3C .
+10C3D .
+10C3E .
+10C3F .
+10C40 .
+10C41 .
+10C42 .
+10C43 .
+10C44 .
+10C45 .
+10C46 .
+10C47 .
+10C48 .
+11003 .
+11004 .
+11005 .
+11006 .
+11007 .
+11008 .
+11009 .
+1100A .
+1100B .
+1100C .
+1100D .
+1100E .
+1100F .
+11010 .
+11011 .
+11012 .
+11013 .
+11014 .
+11015 .
+11016 .
+11017 .
+11018 .
+11019 .
+1101A .
+1101B .
+1101C .
+1101D .
+1101E .
+1101F .
+11020 .
+11021 .
+11022 .
+11023 .
+11024 .
+11025 .
+11026 .
+11027 .
+11028 .
+11029 .
+1102A .
+1102B .
+1102C .
+1102D .
+1102E .
+1102F .
+11030 .
+11031 .
+11032 .
+11033 .
+11034 .
+11035 .
+11036 .
+11037 .
+11083 .
+11084 .
+11085 .
+11086 .
+11087 .
+11088 .
+11089 .
+1108A .
+1108B .
+1108C .
+1108D .
+1108E .
+1108F .
+11090 .
+11091 .
+11092 .
+11093 .
+11094 .
+11095 .
+11096 .
+11097 .
+11098 .
+11099 .
+1109A .
+1109B .
+1109C .
+1109D .
+1109E .
+1109F .
+110A0 .
+110A1 .
+110A2 .
+110A3 .
+110A4 .
+110A5 .
+110A6 .
+110A7 .
+110A8 .
+110A9 .
+110AA .
+110AB .
+110AC .
+110AD .
+110AE .
+110AF .
+110D0 .
+110D1 .
+110D2 .
+110D3 .
+110D4 .
+110D5 .
+110D6 .
+110D7 .
+110D8 .
+110D9 .
+110DA .
+110DB .
+110DC .
+110DD .
+110DE .
+110DF .
+110E0 .
+110E1 .
+110E2 .
+110E3 .
+110E4 .
+110E5 .
+110E6 .
+110E7 .
+110E8 .
+11103 .
+11104 .
+11105 .
+11106 .
+11107 .
+11108 .
+11109 .
+1110A .
+1110B .
+1110C .
+1110D .
+1110E .
+1110F .
+11110 .
+11111 .
+11112 .
+11113 .
+11114 .
+11115 .
+11116 .
+11117 .
+11118 .
+11119 .
+1111A .
+1111B .
+1111C .
+1111D .
+1111E .
+1111F .
+11120 .
+11121 .
+11122 .
+11123 .
+11124 .
+11125 .
+11126 .
+11183 .
+11184 .
+11185 .
+11186 .
+11187 .
+11188 .
+11189 .
+1118A .
+1118B .
+1118C .
+1118D .
+1118E .
+1118F .
+11190 .
+11191 .
+11192 .
+11193 .
+11194 .
+11195 .
+11196 .
+11197 .
+11198 .
+11199 .
+1119A .
+1119B .
+1119C .
+1119D .
+1119E .
+1119F .
+111A0 .
+111A1 .
+111A2 .
+111A3 .
+111A4 .
+111A5 .
+111A6 .
+111A7 .
+111A8 .
+111A9 .
+111AA .
+111AB .
+111AC .
+111AD .
+111AE .
+111AF .
+111B0 .
+111B1 .
+111B2 .
+111C1 .
+111C2 .
+111C3 .
+111C4 .
+11680 .
+11681 .
+11682 .
+11683 .
+11684 .
+11685 .
+11686 .
+11687 .
+11688 .
+11689 .
+1168A .
+1168B .
+1168C .
+1168D .
+1168E .
+1168F .
+11690 .
+11691 .
+11692 .
+11693 .
+11694 .
+11695 .
+11696 .
+11697 .
+11698 .
+11699 .
+1169A .
+1169B .
+1169C .
+1169D .
+1169E .
+1169F .
+116A0 .
+116A1 .
+116A2 .
+116A3 .
+116A4 .
+116A5 .
+116A6 .
+116A7 .
+116A8 .
+116A9 .
+116AA .
+12000 .
+12001 .
+12002 .
+12003 .
+12004 .
+12005 .
+12006 .
+12007 .
+12008 .
+12009 .
+1200A .
+1200B .
+1200C .
+1200D .
+1200E .
+1200F .
+12010 .
+12011 .
+12012 .
+12013 .
+12014 .
+12015 .
+12016 .
+12017 .
+12018 .
+12019 .
+1201A .
+1201B .
+1201C .
+1201D .
+1201E .
+1201F .
+12020 .
+12021 .
+12022 .
+12023 .
+12024 .
+12025 .
+12026 .
+12027 .
+12028 .
+12029 .
+1202A .
+1202B .
+1202C .
+1202D .
+1202E .
+1202F .
+12030 .
+12031 .
+12032 .
+12033 .
+12034 .
+12035 .
+12036 .
+12037 .
+12038 .
+12039 .
+1203A .
+1203B .
+1203C .
+1203D .
+1203E .
+1203F .
+12040 .
+12041 .
+12042 .
+12043 .
+12044 .
+12045 .
+12046 .
+12047 .
+12048 .
+12049 .
+1204A .
+1204B .
+1204C .
+1204D .
+1204E .
+1204F .
+12050 .
+12051 .
+12052 .
+12053 .
+12054 .
+12055 .
+12056 .
+12057 .
+12058 .
+12059 .
+1205A .
+1205B .
+1205C .
+1205D .
+1205E .
+1205F .
+12060 .
+12061 .
+12062 .
+12063 .
+12064 .
+12065 .
+12066 .
+12067 .
+12068 .
+12069 .
+1206A .
+1206B .
+1206C .
+1206D .
+1206E .
+1206F .
+12070 .
+12071 .
+12072 .
+12073 .
+12074 .
+12075 .
+12076 .
+12077 .
+12078 .
+12079 .
+1207A .
+1207B .
+1207C .
+1207D .
+1207E .
+1207F .
+12080 .
+12081 .
+12082 .
+12083 .
+12084 .
+12085 .
+12086 .
+12087 .
+12088 .
+12089 .
+1208A .
+1208B .
+1208C .
+1208D .
+1208E .
+1208F .
+12090 .
+12091 .
+12092 .
+12093 .
+12094 .
+12095 .
+12096 .
+12097 .
+12098 .
+12099 .
+1209A .
+1209B .
+1209C .
+1209D .
+1209E .
+1209F .
+120A0 .
+120A1 .
+120A2 .
+120A3 .
+120A4 .
+120A5 .
+120A6 .
+120A7 .
+120A8 .
+120A9 .
+120AA .
+120AB .
+120AC .
+120AD .
+120AE .
+120AF .
+120B0 .
+120B1 .
+120B2 .
+120B3 .
+120B4 .
+120B5 .
+120B6 .
+120B7 .
+120B8 .
+120B9 .
+120BA .
+120BB .
+120BC .
+120BD .
+120BE .
+120BF .
+120C0 .
+120C1 .
+120C2 .
+120C3 .
+120C4 .
+120C5 .
+120C6 .
+120C7 .
+120C8 .
+120C9 .
+120CA .
+120CB .
+120CC .
+120CD .
+120CE .
+120CF .
+120D0 .
+120D1 .
+120D2 .
+120D3 .
+120D4 .
+120D5 .
+120D6 .
+120D7 .
+120D8 .
+120D9 .
+120DA .
+120DB .
+120DC .
+120DD .
+120DE .
+120DF .
+120E0 .
+120E1 .
+120E2 .
+120E3 .
+120E4 .
+120E5 .
+120E6 .
+120E7 .
+120E8 .
+120E9 .
+120EA .
+120EB .
+120EC .
+120ED .
+120EE .
+120EF .
+120F0 .
+120F1 .
+120F2 .
+120F3 .
+120F4 .
+120F5 .
+120F6 .
+120F7 .
+120F8 .
+120F9 .
+120FA .
+120FB .
+120FC .
+120FD .
+120FE .
+120FF .
+12100 .
+12101 .
+12102 .
+12103 .
+12104 .
+12105 .
+12106 .
+12107 .
+12108 .
+12109 .
+1210A .
+1210B .
+1210C .
+1210D .
+1210E .
+1210F .
+12110 .
+12111 .
+12112 .
+12113 .
+12114 .
+12115 .
+12116 .
+12117 .
+12118 .
+12119 .
+1211A .
+1211B .
+1211C .
+1211D .
+1211E .
+1211F .
+12120 .
+12121 .
+12122 .
+12123 .
+12124 .
+12125 .
+12126 .
+12127 .
+12128 .
+12129 .
+1212A .
+1212B .
+1212C .
+1212D .
+1212E .
+1212F .
+12130 .
+12131 .
+12132 .
+12133 .
+12134 .
+12135 .
+12136 .
+12137 .
+12138 .
+12139 .
+1213A .
+1213B .
+1213C .
+1213D .
+1213E .
+1213F .
+12140 .
+12141 .
+12142 .
+12143 .
+12144 .
+12145 .
+12146 .
+12147 .
+12148 .
+12149 .
+1214A .
+1214B .
+1214C .
+1214D .
+1214E .
+1214F .
+12150 .
+12151 .
+12152 .
+12153 .
+12154 .
+12155 .
+12156 .
+12157 .
+12158 .
+12159 .
+1215A .
+1215B .
+1215C .
+1215D .
+1215E .
+1215F .
+12160 .
+12161 .
+12162 .
+12163 .
+12164 .
+12165 .
+12166 .
+12167 .
+12168 .
+12169 .
+1216A .
+1216B .
+1216C .
+1216D .
+1216E .
+1216F .
+12170 .
+12171 .
+12172 .
+12173 .
+12174 .
+12175 .
+12176 .
+12177 .
+12178 .
+12179 .
+1217A .
+1217B .
+1217C .
+1217D .
+1217E .
+1217F .
+12180 .
+12181 .
+12182 .
+12183 .
+12184 .
+12185 .
+12186 .
+12187 .
+12188 .
+12189 .
+1218A .
+1218B .
+1218C .
+1218D .
+1218E .
+1218F .
+12190 .
+12191 .
+12192 .
+12193 .
+12194 .
+12195 .
+12196 .
+12197 .
+12198 .
+12199 .
+1219A .
+1219B .
+1219C .
+1219D .
+1219E .
+1219F .
+121A0 .
+121A1 .
+121A2 .
+121A3 .
+121A4 .
+121A5 .
+121A6 .
+121A7 .
+121A8 .
+121A9 .
+121AA .
+121AB .
+121AC .
+121AD .
+121AE .
+121AF .
+121B0 .
+121B1 .
+121B2 .
+121B3 .
+121B4 .
+121B5 .
+121B6 .
+121B7 .
+121B8 .
+121B9 .
+121BA .
+121BB .
+121BC .
+121BD .
+121BE .
+121BF .
+121C0 .
+121C1 .
+121C2 .
+121C3 .
+121C4 .
+121C5 .
+121C6 .
+121C7 .
+121C8 .
+121C9 .
+121CA .
+121CB .
+121CC .
+121CD .
+121CE .
+121CF .
+121D0 .
+121D1 .
+121D2 .
+121D3 .
+121D4 .
+121D5 .
+121D6 .
+121D7 .
+121D8 .
+121D9 .
+121DA .
+121DB .
+121DC .
+121DD .
+121DE .
+121DF .
+121E0 .
+121E1 .
+121E2 .
+121E3 .
+121E4 .
+121E5 .
+121E6 .
+121E7 .
+121E8 .
+121E9 .
+121EA .
+121EB .
+121EC .
+121ED .
+121EE .
+121EF .
+121F0 .
+121F1 .
+121F2 .
+121F3 .
+121F4 .
+121F5 .
+121F6 .
+121F7 .
+121F8 .
+121F9 .
+121FA .
+121FB .
+121FC .
+121FD .
+121FE .
+121FF .
+12200 .
+12201 .
+12202 .
+12203 .
+12204 .
+12205 .
+12206 .
+12207 .
+12208 .
+12209 .
+1220A .
+1220B .
+1220C .
+1220D .
+1220E .
+1220F .
+12210 .
+12211 .
+12212 .
+12213 .
+12214 .
+12215 .
+12216 .
+12217 .
+12218 .
+12219 .
+1221A .
+1221B .
+1221C .
+1221D .
+1221E .
+1221F .
+12220 .
+12221 .
+12222 .
+12223 .
+12224 .
+12225 .
+12226 .
+12227 .
+12228 .
+12229 .
+1222A .
+1222B .
+1222C .
+1222D .
+1222E .
+1222F .
+12230 .
+12231 .
+12232 .
+12233 .
+12234 .
+12235 .
+12236 .
+12237 .
+12238 .
+12239 .
+1223A .
+1223B .
+1223C .
+1223D .
+1223E .
+1223F .
+12240 .
+12241 .
+12242 .
+12243 .
+12244 .
+12245 .
+12246 .
+12247 .
+12248 .
+12249 .
+1224A .
+1224B .
+1224C .
+1224D .
+1224E .
+1224F .
+12250 .
+12251 .
+12252 .
+12253 .
+12254 .
+12255 .
+12256 .
+12257 .
+12258 .
+12259 .
+1225A .
+1225B .
+1225C .
+1225D .
+1225E .
+1225F .
+12260 .
+12261 .
+12262 .
+12263 .
+12264 .
+12265 .
+12266 .
+12267 .
+12268 .
+12269 .
+1226A .
+1226B .
+1226C .
+1226D .
+1226E .
+1226F .
+12270 .
+12271 .
+12272 .
+12273 .
+12274 .
+12275 .
+12276 .
+12277 .
+12278 .
+12279 .
+1227A .
+1227B .
+1227C .
+1227D .
+1227E .
+1227F .
+12280 .
+12281 .
+12282 .
+12283 .
+12284 .
+12285 .
+12286 .
+12287 .
+12288 .
+12289 .
+1228A .
+1228B .
+1228C .
+1228D .
+1228E .
+1228F .
+12290 .
+12291 .
+12292 .
+12293 .
+12294 .
+12295 .
+12296 .
+12297 .
+12298 .
+12299 .
+1229A .
+1229B .
+1229C .
+1229D .
+1229E .
+1229F .
+122A0 .
+122A1 .
+122A2 .
+122A3 .
+122A4 .
+122A5 .
+122A6 .
+122A7 .
+122A8 .
+122A9 .
+122AA .
+122AB .
+122AC .
+122AD .
+122AE .
+122AF .
+122B0 .
+122B1 .
+122B2 .
+122B3 .
+122B4 .
+122B5 .
+122B6 .
+122B7 .
+122B8 .
+122B9 .
+122BA .
+122BB .
+122BC .
+122BD .
+122BE .
+122BF .
+122C0 .
+122C1 .
+122C2 .
+122C3 .
+122C4 .
+122C5 .
+122C6 .
+122C7 .
+122C8 .
+122C9 .
+122CA .
+122CB .
+122CC .
+122CD .
+122CE .
+122CF .
+122D0 .
+122D1 .
+122D2 .
+122D3 .
+122D4 .
+122D5 .
+122D6 .
+122D7 .
+122D8 .
+122D9 .
+122DA .
+122DB .
+122DC .
+122DD .
+122DE .
+122DF .
+122E0 .
+122E1 .
+122E2 .
+122E3 .
+122E4 .
+122E5 .
+122E6 .
+122E7 .
+122E8 .
+122E9 .
+122EA .
+122EB .
+122EC .
+122ED .
+122EE .
+122EF .
+122F0 .
+122F1 .
+122F2 .
+122F3 .
+122F4 .
+122F5 .
+122F6 .
+122F7 .
+122F8 .
+122F9 .
+122FA .
+122FB .
+122FC .
+122FD .
+122FE .
+122FF .
+12300 .
+12301 .
+12302 .
+12303 .
+12304 .
+12305 .
+12306 .
+12307 .
+12308 .
+12309 .
+1230A .
+1230B .
+1230C .
+1230D .
+1230E .
+1230F .
+12310 .
+12311 .
+12312 .
+12313 .
+12314 .
+12315 .
+12316 .
+12317 .
+12318 .
+12319 .
+1231A .
+1231B .
+1231C .
+1231D .
+1231E .
+1231F .
+12320 .
+12321 .
+12322 .
+12323 .
+12324 .
+12325 .
+12326 .
+12327 .
+12328 .
+12329 .
+1232A .
+1232B .
+1232C .
+1232D .
+1232E .
+1232F .
+12330 .
+12331 .
+12332 .
+12333 .
+12334 .
+12335 .
+12336 .
+12337 .
+12338 .
+12339 .
+1233A .
+1233B .
+1233C .
+1233D .
+1233E .
+1233F .
+12340 .
+12341 .
+12342 .
+12343 .
+12344 .
+12345 .
+12346 .
+12347 .
+12348 .
+12349 .
+1234A .
+1234B .
+1234C .
+1234D .
+1234E .
+1234F .
+12350 .
+12351 .
+12352 .
+12353 .
+12354 .
+12355 .
+12356 .
+12357 .
+12358 .
+12359 .
+1235A .
+1235B .
+1235C .
+1235D .
+1235E .
+1235F .
+12360 .
+12361 .
+12362 .
+12363 .
+12364 .
+12365 .
+12366 .
+12367 .
+12368 .
+12369 .
+1236A .
+1236B .
+1236C .
+1236D .
+1236E .
+13000 .
+13001 .
+13002 .
+13003 .
+13004 .
+13005 .
+13006 .
+13007 .
+13008 .
+13009 .
+1300A .
+1300B .
+1300C .
+1300D .
+1300E .
+1300F .
+13010 .
+13011 .
+13012 .
+13013 .
+13014 .
+13015 .
+13016 .
+13017 .
+13018 .
+13019 .
+1301A .
+1301B .
+1301C .
+1301D .
+1301E .
+1301F .
+13020 .
+13021 .
+13022 .
+13023 .
+13024 .
+13025 .
+13026 .
+13027 .
+13028 .
+13029 .
+1302A .
+1302B .
+1302C .
+1302D .
+1302E .
+1302F .
+13030 .
+13031 .
+13032 .
+13033 .
+13034 .
+13035 .
+13036 .
+13037 .
+13038 .
+13039 .
+1303A .
+1303B .
+1303C .
+1303D .
+1303E .
+1303F .
+13040 .
+13041 .
+13042 .
+13043 .
+13044 .
+13045 .
+13046 .
+13047 .
+13048 .
+13049 .
+1304A .
+1304B .
+1304C .
+1304D .
+1304E .
+1304F .
+13050 .
+13051 .
+13052 .
+13053 .
+13054 .
+13055 .
+13056 .
+13057 .
+13058 .
+13059 .
+1305A .
+1305B .
+1305C .
+1305D .
+1305E .
+1305F .
+13060 .
+13061 .
+13062 .
+13063 .
+13064 .
+13065 .
+13066 .
+13067 .
+13068 .
+13069 .
+1306A .
+1306B .
+1306C .
+1306D .
+1306E .
+1306F .
+13070 .
+13071 .
+13072 .
+13073 .
+13074 .
+13075 .
+13076 .
+13077 .
+13078 .
+13079 .
+1307A .
+1307B .
+1307C .
+1307D .
+1307E .
+1307F .
+13080 .
+13081 .
+13082 .
+13083 .
+13084 .
+13085 .
+13086 .
+13087 .
+13088 .
+13089 .
+1308A .
+1308B .
+1308C .
+1308D .
+1308E .
+1308F .
+13090 .
+13091 .
+13092 .
+13093 .
+13094 .
+13095 .
+13096 .
+13097 .
+13098 .
+13099 .
+1309A .
+1309B .
+1309C .
+1309D .
+1309E .
+1309F .
+130A0 .
+130A1 .
+130A2 .
+130A3 .
+130A4 .
+130A5 .
+130A6 .
+130A7 .
+130A8 .
+130A9 .
+130AA .
+130AB .
+130AC .
+130AD .
+130AE .
+130AF .
+130B0 .
+130B1 .
+130B2 .
+130B3 .
+130B4 .
+130B5 .
+130B6 .
+130B7 .
+130B8 .
+130B9 .
+130BA .
+130BB .
+130BC .
+130BD .
+130BE .
+130BF .
+130C0 .
+130C1 .
+130C2 .
+130C3 .
+130C4 .
+130C5 .
+130C6 .
+130C7 .
+130C8 .
+130C9 .
+130CA .
+130CB .
+130CC .
+130CD .
+130CE .
+130CF .
+130D0 .
+130D1 .
+130D2 .
+130D3 .
+130D4 .
+130D5 .
+130D6 .
+130D7 .
+130D8 .
+130D9 .
+130DA .
+130DB .
+130DC .
+130DD .
+130DE .
+130DF .
+130E0 .
+130E1 .
+130E2 .
+130E3 .
+130E4 .
+130E5 .
+130E6 .
+130E7 .
+130E8 .
+130E9 .
+130EA .
+130EB .
+130EC .
+130ED .
+130EE .
+130EF .
+130F0 .
+130F1 .
+130F2 .
+130F3 .
+130F4 .
+130F5 .
+130F6 .
+130F7 .
+130F8 .
+130F9 .
+130FA .
+130FB .
+130FC .
+130FD .
+130FE .
+130FF .
+13100 .
+13101 .
+13102 .
+13103 .
+13104 .
+13105 .
+13106 .
+13107 .
+13108 .
+13109 .
+1310A .
+1310B .
+1310C .
+1310D .
+1310E .
+1310F .
+13110 .
+13111 .
+13112 .
+13113 .
+13114 .
+13115 .
+13116 .
+13117 .
+13118 .
+13119 .
+1311A .
+1311B .
+1311C .
+1311D .
+1311E .
+1311F .
+13120 .
+13121 .
+13122 .
+13123 .
+13124 .
+13125 .
+13126 .
+13127 .
+13128 .
+13129 .
+1312A .
+1312B .
+1312C .
+1312D .
+1312E .
+1312F .
+13130 .
+13131 .
+13132 .
+13133 .
+13134 .
+13135 .
+13136 .
+13137 .
+13138 .
+13139 .
+1313A .
+1313B .
+1313C .
+1313D .
+1313E .
+1313F .
+13140 .
+13141 .
+13142 .
+13143 .
+13144 .
+13145 .
+13146 .
+13147 .
+13148 .
+13149 .
+1314A .
+1314B .
+1314C .
+1314D .
+1314E .
+1314F .
+13150 .
+13151 .
+13152 .
+13153 .
+13154 .
+13155 .
+13156 .
+13157 .
+13158 .
+13159 .
+1315A .
+1315B .
+1315C .
+1315D .
+1315E .
+1315F .
+13160 .
+13161 .
+13162 .
+13163 .
+13164 .
+13165 .
+13166 .
+13167 .
+13168 .
+13169 .
+1316A .
+1316B .
+1316C .
+1316D .
+1316E .
+1316F .
+13170 .
+13171 .
+13172 .
+13173 .
+13174 .
+13175 .
+13176 .
+13177 .
+13178 .
+13179 .
+1317A .
+1317B .
+1317C .
+1317D .
+1317E .
+1317F .
+13180 .
+13181 .
+13182 .
+13183 .
+13184 .
+13185 .
+13186 .
+13187 .
+13188 .
+13189 .
+1318A .
+1318B .
+1318C .
+1318D .
+1318E .
+1318F .
+13190 .
+13191 .
+13192 .
+13193 .
+13194 .
+13195 .
+13196 .
+13197 .
+13198 .
+13199 .
+1319A .
+1319B .
+1319C .
+1319D .
+1319E .
+1319F .
+131A0 .
+131A1 .
+131A2 .
+131A3 .
+131A4 .
+131A5 .
+131A6 .
+131A7 .
+131A8 .
+131A9 .
+131AA .
+131AB .
+131AC .
+131AD .
+131AE .
+131AF .
+131B0 .
+131B1 .
+131B2 .
+131B3 .
+131B4 .
+131B5 .
+131B6 .
+131B7 .
+131B8 .
+131B9 .
+131BA .
+131BB .
+131BC .
+131BD .
+131BE .
+131BF .
+131C0 .
+131C1 .
+131C2 .
+131C3 .
+131C4 .
+131C5 .
+131C6 .
+131C7 .
+131C8 .
+131C9 .
+131CA .
+131CB .
+131CC .
+131CD .
+131CE .
+131CF .
+131D0 .
+131D1 .
+131D2 .
+131D3 .
+131D4 .
+131D5 .
+131D6 .
+131D7 .
+131D8 .
+131D9 .
+131DA .
+131DB .
+131DC .
+131DD .
+131DE .
+131DF .
+131E0 .
+131E1 .
+131E2 .
+131E3 .
+131E4 .
+131E5 .
+131E6 .
+131E7 .
+131E8 .
+131E9 .
+131EA .
+131EB .
+131EC .
+131ED .
+131EE .
+131EF .
+131F0 .
+131F1 .
+131F2 .
+131F3 .
+131F4 .
+131F5 .
+131F6 .
+131F7 .
+131F8 .
+131F9 .
+131FA .
+131FB .
+131FC .
+131FD .
+131FE .
+131FF .
+13200 .
+13201 .
+13202 .
+13203 .
+13204 .
+13205 .
+13206 .
+13207 .
+13208 .
+13209 .
+1320A .
+1320B .
+1320C .
+1320D .
+1320E .
+1320F .
+13210 .
+13211 .
+13212 .
+13213 .
+13214 .
+13215 .
+13216 .
+13217 .
+13218 .
+13219 .
+1321A .
+1321B .
+1321C .
+1321D .
+1321E .
+1321F .
+13220 .
+13221 .
+13222 .
+13223 .
+13224 .
+13225 .
+13226 .
+13227 .
+13228 .
+13229 .
+1322A .
+1322B .
+1322C .
+1322D .
+1322E .
+1322F .
+13230 .
+13231 .
+13232 .
+13233 .
+13234 .
+13235 .
+13236 .
+13237 .
+13238 .
+13239 .
+1323A .
+1323B .
+1323C .
+1323D .
+1323E .
+1323F .
+13240 .
+13241 .
+13242 .
+13243 .
+13244 .
+13245 .
+13246 .
+13247 .
+13248 .
+13249 .
+1324A .
+1324B .
+1324C .
+1324D .
+1324E .
+1324F .
+13250 .
+13251 .
+13252 .
+13253 .
+13254 .
+13255 .
+13256 .
+13257 .
+13258 .
+13259 .
+1325A .
+1325B .
+1325C .
+1325D .
+1325E .
+1325F .
+13260 .
+13261 .
+13262 .
+13263 .
+13264 .
+13265 .
+13266 .
+13267 .
+13268 .
+13269 .
+1326A .
+1326B .
+1326C .
+1326D .
+1326E .
+1326F .
+13270 .
+13271 .
+13272 .
+13273 .
+13274 .
+13275 .
+13276 .
+13277 .
+13278 .
+13279 .
+1327A .
+1327B .
+1327C .
+1327D .
+1327E .
+1327F .
+13280 .
+13281 .
+13282 .
+13283 .
+13284 .
+13285 .
+13286 .
+13287 .
+13288 .
+13289 .
+1328A .
+1328B .
+1328C .
+1328D .
+1328E .
+1328F .
+13290 .
+13291 .
+13292 .
+13293 .
+13294 .
+13295 .
+13296 .
+13297 .
+13298 .
+13299 .
+1329A .
+1329B .
+1329C .
+1329D .
+1329E .
+1329F .
+132A0 .
+132A1 .
+132A2 .
+132A3 .
+132A4 .
+132A5 .
+132A6 .
+132A7 .
+132A8 .
+132A9 .
+132AA .
+132AB .
+132AC .
+132AD .
+132AE .
+132AF .
+132B0 .
+132B1 .
+132B2 .
+132B3 .
+132B4 .
+132B5 .
+132B6 .
+132B7 .
+132B8 .
+132B9 .
+132BA .
+132BB .
+132BC .
+132BD .
+132BE .
+132BF .
+132C0 .
+132C1 .
+132C2 .
+132C3 .
+132C4 .
+132C5 .
+132C6 .
+132C7 .
+132C8 .
+132C9 .
+132CA .
+132CB .
+132CC .
+132CD .
+132CE .
+132CF .
+132D0 .
+132D1 .
+132D2 .
+132D3 .
+132D4 .
+132D5 .
+132D6 .
+132D7 .
+132D8 .
+132D9 .
+132DA .
+132DB .
+132DC .
+132DD .
+132DE .
+132DF .
+132E0 .
+132E1 .
+132E2 .
+132E3 .
+132E4 .
+132E5 .
+132E6 .
+132E7 .
+132E8 .
+132E9 .
+132EA .
+132EB .
+132EC .
+132ED .
+132EE .
+132EF .
+132F0 .
+132F1 .
+132F2 .
+132F3 .
+132F4 .
+132F5 .
+132F6 .
+132F7 .
+132F8 .
+132F9 .
+132FA .
+132FB .
+132FC .
+132FD .
+132FE .
+132FF .
+13300 .
+13301 .
+13302 .
+13303 .
+13304 .
+13305 .
+13306 .
+13307 .
+13308 .
+13309 .
+1330A .
+1330B .
+1330C .
+1330D .
+1330E .
+1330F .
+13310 .
+13311 .
+13312 .
+13313 .
+13314 .
+13315 .
+13316 .
+13317 .
+13318 .
+13319 .
+1331A .
+1331B .
+1331C .
+1331D .
+1331E .
+1331F .
+13320 .
+13321 .
+13322 .
+13323 .
+13324 .
+13325 .
+13326 .
+13327 .
+13328 .
+13329 .
+1332A .
+1332B .
+1332C .
+1332D .
+1332E .
+1332F .
+13330 .
+13331 .
+13332 .
+13333 .
+13334 .
+13335 .
+13336 .
+13337 .
+13338 .
+13339 .
+1333A .
+1333B .
+1333C .
+1333D .
+1333E .
+1333F .
+13340 .
+13341 .
+13342 .
+13343 .
+13344 .
+13345 .
+13346 .
+13347 .
+13348 .
+13349 .
+1334A .
+1334B .
+1334C .
+1334D .
+1334E .
+1334F .
+13350 .
+13351 .
+13352 .
+13353 .
+13354 .
+13355 .
+13356 .
+13357 .
+13358 .
+13359 .
+1335A .
+1335B .
+1335C .
+1335D .
+1335E .
+1335F .
+13360 .
+13361 .
+13362 .
+13363 .
+13364 .
+13365 .
+13366 .
+13367 .
+13368 .
+13369 .
+1336A .
+1336B .
+1336C .
+1336D .
+1336E .
+1336F .
+13370 .
+13371 .
+13372 .
+13373 .
+13374 .
+13375 .
+13376 .
+13377 .
+13378 .
+13379 .
+1337A .
+1337B .
+1337C .
+1337D .
+1337E .
+1337F .
+13380 .
+13381 .
+13382 .
+13383 .
+13384 .
+13385 .
+13386 .
+13387 .
+13388 .
+13389 .
+1338A .
+1338B .
+1338C .
+1338D .
+1338E .
+1338F .
+13390 .
+13391 .
+13392 .
+13393 .
+13394 .
+13395 .
+13396 .
+13397 .
+13398 .
+13399 .
+1339A .
+1339B .
+1339C .
+1339D .
+1339E .
+1339F .
+133A0 .
+133A1 .
+133A2 .
+133A3 .
+133A4 .
+133A5 .
+133A6 .
+133A7 .
+133A8 .
+133A9 .
+133AA .
+133AB .
+133AC .
+133AD .
+133AE .
+133AF .
+133B0 .
+133B1 .
+133B2 .
+133B3 .
+133B4 .
+133B5 .
+133B6 .
+133B7 .
+133B8 .
+133B9 .
+133BA .
+133BB .
+133BC .
+133BD .
+133BE .
+133BF .
+133C0 .
+133C1 .
+133C2 .
+133C3 .
+133C4 .
+133C5 .
+133C6 .
+133C7 .
+133C8 .
+133C9 .
+133CA .
+133CB .
+133CC .
+133CD .
+133CE .
+133CF .
+133D0 .
+133D1 .
+133D2 .
+133D3 .
+133D4 .
+133D5 .
+133D6 .
+133D7 .
+133D8 .
+133D9 .
+133DA .
+133DB .
+133DC .
+133DD .
+133DE .
+133DF .
+133E0 .
+133E1 .
+133E2 .
+133E3 .
+133E4 .
+133E5 .
+133E6 .
+133E7 .
+133E8 .
+133E9 .
+133EA .
+133EB .
+133EC .
+133ED .
+133EE .
+133EF .
+133F0 .
+133F1 .
+133F2 .
+133F3 .
+133F4 .
+133F5 .
+133F6 .
+133F7 .
+133F8 .
+133F9 .
+133FA .
+133FB .
+133FC .
+133FD .
+133FE .
+133FF .
+13400 .
+13401 .
+13402 .
+13403 .
+13404 .
+13405 .
+13406 .
+13407 .
+13408 .
+13409 .
+1340A .
+1340B .
+1340C .
+1340D .
+1340E .
+1340F .
+13410 .
+13411 .
+13412 .
+13413 .
+13414 .
+13415 .
+13416 .
+13417 .
+13418 .
+13419 .
+1341A .
+1341B .
+1341C .
+1341D .
+1341E .
+1341F .
+13420 .
+13421 .
+13422 .
+13423 .
+13424 .
+13425 .
+13426 .
+13427 .
+13428 .
+13429 .
+1342A .
+1342B .
+1342C .
+1342D .
+1342E .
+16800 .
+16801 .
+16802 .
+16803 .
+16804 .
+16805 .
+16806 .
+16807 .
+16808 .
+16809 .
+1680A .
+1680B .
+1680C .
+1680D .
+1680E .
+1680F .
+16810 .
+16811 .
+16812 .
+16813 .
+16814 .
+16815 .
+16816 .
+16817 .
+16818 .
+16819 .
+1681A .
+1681B .
+1681C .
+1681D .
+1681E .
+1681F .
+16820 .
+16821 .
+16822 .
+16823 .
+16824 .
+16825 .
+16826 .
+16827 .
+16828 .
+16829 .
+1682A .
+1682B .
+1682C .
+1682D .
+1682E .
+1682F .
+16830 .
+16831 .
+16832 .
+16833 .
+16834 .
+16835 .
+16836 .
+16837 .
+16838 .
+16839 .
+1683A .
+1683B .
+1683C .
+1683D .
+1683E .
+1683F .
+16840 .
+16841 .
+16842 .
+16843 .
+16844 .
+16845 .
+16846 .
+16847 .
+16848 .
+16849 .
+1684A .
+1684B .
+1684C .
+1684D .
+1684E .
+1684F .
+16850 .
+16851 .
+16852 .
+16853 .
+16854 .
+16855 .
+16856 .
+16857 .
+16858 .
+16859 .
+1685A .
+1685B .
+1685C .
+1685D .
+1685E .
+1685F .
+16860 .
+16861 .
+16862 .
+16863 .
+16864 .
+16865 .
+16866 .
+16867 .
+16868 .
+16869 .
+1686A .
+1686B .
+1686C .
+1686D .
+1686E .
+1686F .
+16870 .
+16871 .
+16872 .
+16873 .
+16874 .
+16875 .
+16876 .
+16877 .
+16878 .
+16879 .
+1687A .
+1687B .
+1687C .
+1687D .
+1687E .
+1687F .
+16880 .
+16881 .
+16882 .
+16883 .
+16884 .
+16885 .
+16886 .
+16887 .
+16888 .
+16889 .
+1688A .
+1688B .
+1688C .
+1688D .
+1688E .
+1688F .
+16890 .
+16891 .
+16892 .
+16893 .
+16894 .
+16895 .
+16896 .
+16897 .
+16898 .
+16899 .
+1689A .
+1689B .
+1689C .
+1689D .
+1689E .
+1689F .
+168A0 .
+168A1 .
+168A2 .
+168A3 .
+168A4 .
+168A5 .
+168A6 .
+168A7 .
+168A8 .
+168A9 .
+168AA .
+168AB .
+168AC .
+168AD .
+168AE .
+168AF .
+168B0 .
+168B1 .
+168B2 .
+168B3 .
+168B4 .
+168B5 .
+168B6 .
+168B7 .
+168B8 .
+168B9 .
+168BA .
+168BB .
+168BC .
+168BD .
+168BE .
+168BF .
+168C0 .
+168C1 .
+168C2 .
+168C3 .
+168C4 .
+168C5 .
+168C6 .
+168C7 .
+168C8 .
+168C9 .
+168CA .
+168CB .
+168CC .
+168CD .
+168CE .
+168CF .
+168D0 .
+168D1 .
+168D2 .
+168D3 .
+168D4 .
+168D5 .
+168D6 .
+168D7 .
+168D8 .
+168D9 .
+168DA .
+168DB .
+168DC .
+168DD .
+168DE .
+168DF .
+168E0 .
+168E1 .
+168E2 .
+168E3 .
+168E4 .
+168E5 .
+168E6 .
+168E7 .
+168E8 .
+168E9 .
+168EA .
+168EB .
+168EC .
+168ED .
+168EE .
+168EF .
+168F0 .
+168F1 .
+168F2 .
+168F3 .
+168F4 .
+168F5 .
+168F6 .
+168F7 .
+168F8 .
+168F9 .
+168FA .
+168FB .
+168FC .
+168FD .
+168FE .
+168FF .
+16900 .
+16901 .
+16902 .
+16903 .
+16904 .
+16905 .
+16906 .
+16907 .
+16908 .
+16909 .
+1690A .
+1690B .
+1690C .
+1690D .
+1690E .
+1690F .
+16910 .
+16911 .
+16912 .
+16913 .
+16914 .
+16915 .
+16916 .
+16917 .
+16918 .
+16919 .
+1691A .
+1691B .
+1691C .
+1691D .
+1691E .
+1691F .
+16920 .
+16921 .
+16922 .
+16923 .
+16924 .
+16925 .
+16926 .
+16927 .
+16928 .
+16929 .
+1692A .
+1692B .
+1692C .
+1692D .
+1692E .
+1692F .
+16930 .
+16931 .
+16932 .
+16933 .
+16934 .
+16935 .
+16936 .
+16937 .
+16938 .
+16939 .
+1693A .
+1693B .
+1693C .
+1693D .
+1693E .
+1693F .
+16940 .
+16941 .
+16942 .
+16943 .
+16944 .
+16945 .
+16946 .
+16947 .
+16948 .
+16949 .
+1694A .
+1694B .
+1694C .
+1694D .
+1694E .
+1694F .
+16950 .
+16951 .
+16952 .
+16953 .
+16954 .
+16955 .
+16956 .
+16957 .
+16958 .
+16959 .
+1695A .
+1695B .
+1695C .
+1695D .
+1695E .
+1695F .
+16960 .
+16961 .
+16962 .
+16963 .
+16964 .
+16965 .
+16966 .
+16967 .
+16968 .
+16969 .
+1696A .
+1696B .
+1696C .
+1696D .
+1696E .
+1696F .
+16970 .
+16971 .
+16972 .
+16973 .
+16974 .
+16975 .
+16976 .
+16977 .
+16978 .
+16979 .
+1697A .
+1697B .
+1697C .
+1697D .
+1697E .
+1697F .
+16980 .
+16981 .
+16982 .
+16983 .
+16984 .
+16985 .
+16986 .
+16987 .
+16988 .
+16989 .
+1698A .
+1698B .
+1698C .
+1698D .
+1698E .
+1698F .
+16990 .
+16991 .
+16992 .
+16993 .
+16994 .
+16995 .
+16996 .
+16997 .
+16998 .
+16999 .
+1699A .
+1699B .
+1699C .
+1699D .
+1699E .
+1699F .
+169A0 .
+169A1 .
+169A2 .
+169A3 .
+169A4 .
+169A5 .
+169A6 .
+169A7 .
+169A8 .
+169A9 .
+169AA .
+169AB .
+169AC .
+169AD .
+169AE .
+169AF .
+169B0 .
+169B1 .
+169B2 .
+169B3 .
+169B4 .
+169B5 .
+169B6 .
+169B7 .
+169B8 .
+169B9 .
+169BA .
+169BB .
+169BC .
+169BD .
+169BE .
+169BF .
+169C0 .
+169C1 .
+169C2 .
+169C3 .
+169C4 .
+169C5 .
+169C6 .
+169C7 .
+169C8 .
+169C9 .
+169CA .
+169CB .
+169CC .
+169CD .
+169CE .
+169CF .
+169D0 .
+169D1 .
+169D2 .
+169D3 .
+169D4 .
+169D5 .
+169D6 .
+169D7 .
+169D8 .
+169D9 .
+169DA .
+169DB .
+169DC .
+169DD .
+169DE .
+169DF .
+169E0 .
+169E1 .
+169E2 .
+169E3 .
+169E4 .
+169E5 .
+169E6 .
+169E7 .
+169E8 .
+169E9 .
+169EA .
+169EB .
+169EC .
+169ED .
+169EE .
+169EF .
+169F0 .
+169F1 .
+169F2 .
+169F3 .
+169F4 .
+169F5 .
+169F6 .
+169F7 .
+169F8 .
+169F9 .
+169FA .
+169FB .
+169FC .
+169FD .
+169FE .
+169FF .
+16A00 .
+16A01 .
+16A02 .
+16A03 .
+16A04 .
+16A05 .
+16A06 .
+16A07 .
+16A08 .
+16A09 .
+16A0A .
+16A0B .
+16A0C .
+16A0D .
+16A0E .
+16A0F .
+16A10 .
+16A11 .
+16A12 .
+16A13 .
+16A14 .
+16A15 .
+16A16 .
+16A17 .
+16A18 .
+16A19 .
+16A1A .
+16A1B .
+16A1C .
+16A1D .
+16A1E .
+16A1F .
+16A20 .
+16A21 .
+16A22 .
+16A23 .
+16A24 .
+16A25 .
+16A26 .
+16A27 .
+16A28 .
+16A29 .
+16A2A .
+16A2B .
+16A2C .
+16A2D .
+16A2E .
+16A2F .
+16A30 .
+16A31 .
+16A32 .
+16A33 .
+16A34 .
+16A35 .
+16A36 .
+16A37 .
+16A38 .
+16F00 .
+16F01 .
+16F02 .
+16F03 .
+16F04 .
+16F05 .
+16F06 .
+16F07 .
+16F08 .
+16F09 .
+16F0A .
+16F0B .
+16F0C .
+16F0D .
+16F0E .
+16F0F .
+16F10 .
+16F11 .
+16F12 .
+16F13 .
+16F14 .
+16F15 .
+16F16 .
+16F17 .
+16F18 .
+16F19 .
+16F1A .
+16F1B .
+16F1C .
+16F1D .
+16F1E .
+16F1F .
+16F20 .
+16F21 .
+16F22 .
+16F23 .
+16F24 .
+16F25 .
+16F26 .
+16F27 .
+16F28 .
+16F29 .
+16F2A .
+16F2B .
+16F2C .
+16F2D .
+16F2E .
+16F2F .
+16F30 .
+16F31 .
+16F32 .
+16F33 .
+16F34 .
+16F35 .
+16F36 .
+16F37 .
+16F38 .
+16F39 .
+16F3A .
+16F3B .
+16F3C .
+16F3D .
+16F3E .
+16F3F .
+16F40 .
+16F41 .
+16F42 .
+16F43 .
+16F44 .
+16F50 .
+16F93 .
+16F94 .
+16F95 .
+16F96 .
+16F97 .
+16F98 .
+16F99 .
+16F9A .
+16F9B .
+16F9C .
+16F9D .
+16F9E .
+16F9F .
+1B000 .
+1B001 .
+1D400 .
+1D401 .
+1D402 .
+1D403 .
+1D404 .
+1D405 .
+1D406 .
+1D407 .
+1D408 .
+1D409 .
+1D40A .
+1D40B .
+1D40C .
+1D40D .
+1D40E .
+1D40F .
+1D410 .
+1D411 .
+1D412 .
+1D413 .
+1D414 .
+1D415 .
+1D416 .
+1D417 .
+1D418 .
+1D419 .
+1D41A .
+1D41B .
+1D41C .
+1D41D .
+1D41E .
+1D41F .
+1D420 .
+1D421 .
+1D422 .
+1D423 .
+1D424 .
+1D425 .
+1D426 .
+1D427 .
+1D428 .
+1D429 .
+1D42A .
+1D42B .
+1D42C .
+1D42D .
+1D42E .
+1D42F .
+1D430 .
+1D431 .
+1D432 .
+1D433 .
+1D434 .
+1D435 .
+1D436 .
+1D437 .
+1D438 .
+1D439 .
+1D43A .
+1D43B .
+1D43C .
+1D43D .
+1D43E .
+1D43F .
+1D440 .
+1D441 .
+1D442 .
+1D443 .
+1D444 .
+1D445 .
+1D446 .
+1D447 .
+1D448 .
+1D449 .
+1D44A .
+1D44B .
+1D44C .
+1D44D .
+1D44E .
+1D44F .
+1D450 .
+1D451 .
+1D452 .
+1D453 .
+1D454 .
+1D456 .
+1D457 .
+1D458 .
+1D459 .
+1D45A .
+1D45B .
+1D45C .
+1D45D .
+1D45E .
+1D45F .
+1D460 .
+1D461 .
+1D462 .
+1D463 .
+1D464 .
+1D465 .
+1D466 .
+1D467 .
+1D468 .
+1D469 .
+1D46A .
+1D46B .
+1D46C .
+1D46D .
+1D46E .
+1D46F .
+1D470 .
+1D471 .
+1D472 .
+1D473 .
+1D474 .
+1D475 .
+1D476 .
+1D477 .
+1D478 .
+1D479 .
+1D47A .
+1D47B .
+1D47C .
+1D47D .
+1D47E .
+1D47F .
+1D480 .
+1D481 .
+1D482 .
+1D483 .
+1D484 .
+1D485 .
+1D486 .
+1D487 .
+1D488 .
+1D489 .
+1D48A .
+1D48B .
+1D48C .
+1D48D .
+1D48E .
+1D48F .
+1D490 .
+1D491 .
+1D492 .
+1D493 .
+1D494 .
+1D495 .
+1D496 .
+1D497 .
+1D498 .
+1D499 .
+1D49A .
+1D49B .
+1D49C .
+1D49E .
+1D49F .
+1D4A2 .
+1D4A5 .
+1D4A6 .
+1D4A9 .
+1D4AA .
+1D4AB .
+1D4AC .
+1D4AE .
+1D4AF .
+1D4B0 .
+1D4B1 .
+1D4B2 .
+1D4B3 .
+1D4B4 .
+1D4B5 .
+1D4B6 .
+1D4B7 .
+1D4B8 .
+1D4B9 .
+1D4BB .
+1D4BD .
+1D4BE .
+1D4BF .
+1D4C0 .
+1D4C1 .
+1D4C2 .
+1D4C3 .
+1D4C5 .
+1D4C6 .
+1D4C7 .
+1D4C8 .
+1D4C9 .
+1D4CA .
+1D4CB .
+1D4CC .
+1D4CD .
+1D4CE .
+1D4CF .
+1D4D0 .
+1D4D1 .
+1D4D2 .
+1D4D3 .
+1D4D4 .
+1D4D5 .
+1D4D6 .
+1D4D7 .
+1D4D8 .
+1D4D9 .
+1D4DA .
+1D4DB .
+1D4DC .
+1D4DD .
+1D4DE .
+1D4DF .
+1D4E0 .
+1D4E1 .
+1D4E2 .
+1D4E3 .
+1D4E4 .
+1D4E5 .
+1D4E6 .
+1D4E7 .
+1D4E8 .
+1D4E9 .
+1D4EA .
+1D4EB .
+1D4EC .
+1D4ED .
+1D4EE .
+1D4EF .
+1D4F0 .
+1D4F1 .
+1D4F2 .
+1D4F3 .
+1D4F4 .
+1D4F5 .
+1D4F6 .
+1D4F7 .
+1D4F8 .
+1D4F9 .
+1D4FA .
+1D4FB .
+1D4FC .
+1D4FD .
+1D4FE .
+1D4FF .
+1D500 .
+1D501 .
+1D502 .
+1D503 .
+1D504 .
+1D505 .
+1D507 .
+1D508 .
+1D509 .
+1D50A .
+1D50D .
+1D50E .
+1D50F .
+1D510 .
+1D511 .
+1D512 .
+1D513 .
+1D514 .
+1D516 .
+1D517 .
+1D518 .
+1D519 .
+1D51A .
+1D51B .
+1D51C .
+1D51E .
+1D51F .
+1D520 .
+1D521 .
+1D522 .
+1D523 .
+1D524 .
+1D525 .
+1D526 .
+1D527 .
+1D528 .
+1D529 .
+1D52A .
+1D52B .
+1D52C .
+1D52D .
+1D52E .
+1D52F .
+1D530 .
+1D531 .
+1D532 .
+1D533 .
+1D534 .
+1D535 .
+1D536 .
+1D537 .
+1D538 .
+1D539 .
+1D53B .
+1D53C .
+1D53D .
+1D53E .
+1D540 .
+1D541 .
+1D542 .
+1D543 .
+1D544 .
+1D546 .
+1D54A .
+1D54B .
+1D54C .
+1D54D .
+1D54E .
+1D54F .
+1D550 .
+1D552 .
+1D553 .
+1D554 .
+1D555 .
+1D556 .
+1D557 .
+1D558 .
+1D559 .
+1D55A .
+1D55B .
+1D55C .
+1D55D .
+1D55E .
+1D55F .
+1D560 .
+1D561 .
+1D562 .
+1D563 .
+1D564 .
+1D565 .
+1D566 .
+1D567 .
+1D568 .
+1D569 .
+1D56A .
+1D56B .
+1D56C .
+1D56D .
+1D56E .
+1D56F .
+1D570 .
+1D571 .
+1D572 .
+1D573 .
+1D574 .
+1D575 .
+1D576 .
+1D577 .
+1D578 .
+1D579 .
+1D57A .
+1D57B .
+1D57C .
+1D57D .
+1D57E .
+1D57F .
+1D580 .
+1D581 .
+1D582 .
+1D583 .
+1D584 .
+1D585 .
+1D586 .
+1D587 .
+1D588 .
+1D589 .
+1D58A .
+1D58B .
+1D58C .
+1D58D .
+1D58E .
+1D58F .
+1D590 .
+1D591 .
+1D592 .
+1D593 .
+1D594 .
+1D595 .
+1D596 .
+1D597 .
+1D598 .
+1D599 .
+1D59A .
+1D59B .
+1D59C .
+1D59D .
+1D59E .
+1D59F .
+1D5A0 .
+1D5A1 .
+1D5A2 .
+1D5A3 .
+1D5A4 .
+1D5A5 .
+1D5A6 .
+1D5A7 .
+1D5A8 .
+1D5A9 .
+1D5AA .
+1D5AB .
+1D5AC .
+1D5AD .
+1D5AE .
+1D5AF .
+1D5B0 .
+1D5B1 .
+1D5B2 .
+1D5B3 .
+1D5B4 .
+1D5B5 .
+1D5B6 .
+1D5B7 .
+1D5B8 .
+1D5B9 .
+1D5BA .
+1D5BB .
+1D5BC .
+1D5BD .
+1D5BE .
+1D5BF .
+1D5C0 .
+1D5C1 .
+1D5C2 .
+1D5C3 .
+1D5C4 .
+1D5C5 .
+1D5C6 .
+1D5C7 .
+1D5C8 .
+1D5C9 .
+1D5CA .
+1D5CB .
+1D5CC .
+1D5CD .
+1D5CE .
+1D5CF .
+1D5D0 .
+1D5D1 .
+1D5D2 .
+1D5D3 .
+1D5D4 .
+1D5D5 .
+1D5D6 .
+1D5D7 .
+1D5D8 .
+1D5D9 .
+1D5DA .
+1D5DB .
+1D5DC .
+1D5DD .
+1D5DE .
+1D5DF .
+1D5E0 .
+1D5E1 .
+1D5E2 .
+1D5E3 .
+1D5E4 .
+1D5E5 .
+1D5E6 .
+1D5E7 .
+1D5E8 .
+1D5E9 .
+1D5EA .
+1D5EB .
+1D5EC .
+1D5ED .
+1D5EE .
+1D5EF .
+1D5F0 .
+1D5F1 .
+1D5F2 .
+1D5F3 .
+1D5F4 .
+1D5F5 .
+1D5F6 .
+1D5F7 .
+1D5F8 .
+1D5F9 .
+1D5FA .
+1D5FB .
+1D5FC .
+1D5FD .
+1D5FE .
+1D5FF .
+1D600 .
+1D601 .
+1D602 .
+1D603 .
+1D604 .
+1D605 .
+1D606 .
+1D607 .
+1D608 .
+1D609 .
+1D60A .
+1D60B .
+1D60C .
+1D60D .
+1D60E .
+1D60F .
+1D610 .
+1D611 .
+1D612 .
+1D613 .
+1D614 .
+1D615 .
+1D616 .
+1D617 .
+1D618 .
+1D619 .
+1D61A .
+1D61B .
+1D61C .
+1D61D .
+1D61E .
+1D61F .
+1D620 .
+1D621 .
+1D622 .
+1D623 .
+1D624 .
+1D625 .
+1D626 .
+1D627 .
+1D628 .
+1D629 .
+1D62A .
+1D62B .
+1D62C .
+1D62D .
+1D62E .
+1D62F .
+1D630 .
+1D631 .
+1D632 .
+1D633 .
+1D634 .
+1D635 .
+1D636 .
+1D637 .
+1D638 .
+1D639 .
+1D63A .
+1D63B .
+1D63C .
+1D63D .
+1D63E .
+1D63F .
+1D640 .
+1D641 .
+1D642 .
+1D643 .
+1D644 .
+1D645 .
+1D646 .
+1D647 .
+1D648 .
+1D649 .
+1D64A .
+1D64B .
+1D64C .
+1D64D .
+1D64E .
+1D64F .
+1D650 .
+1D651 .
+1D652 .
+1D653 .
+1D654 .
+1D655 .
+1D656 .
+1D657 .
+1D658 .
+1D659 .
+1D65A .
+1D65B .
+1D65C .
+1D65D .
+1D65E .
+1D65F .
+1D660 .
+1D661 .
+1D662 .
+1D663 .
+1D664 .
+1D665 .
+1D666 .
+1D667 .
+1D668 .
+1D669 .
+1D66A .
+1D66B .
+1D66C .
+1D66D .
+1D66E .
+1D66F .
+1D670 .
+1D671 .
+1D672 .
+1D673 .
+1D674 .
+1D675 .
+1D676 .
+1D677 .
+1D678 .
+1D679 .
+1D67A .
+1D67B .
+1D67C .
+1D67D .
+1D67E .
+1D67F .
+1D680 .
+1D681 .
+1D682 .
+1D683 .
+1D684 .
+1D685 .
+1D686 .
+1D687 .
+1D688 .
+1D689 .
+1D68A .
+1D68B .
+1D68C .
+1D68D .
+1D68E .
+1D68F .
+1D690 .
+1D691 .
+1D692 .
+1D693 .
+1D694 .
+1D695 .
+1D696 .
+1D697 .
+1D698 .
+1D699 .
+1D69A .
+1D69B .
+1D69C .
+1D69D .
+1D69E .
+1D69F .
+1D6A0 .
+1D6A1 .
+1D6A2 .
+1D6A3 .
+1D6A4 .
+1D6A5 .
+1D6A8 .
+1D6A9 .
+1D6AA .
+1D6AB .
+1D6AC .
+1D6AD .
+1D6AE .
+1D6AF .
+1D6B0 .
+1D6B1 .
+1D6B2 .
+1D6B3 .
+1D6B4 .
+1D6B5 .
+1D6B6 .
+1D6B7 .
+1D6B8 .
+1D6B9 .
+1D6BA .
+1D6BB .
+1D6BC .
+1D6BD .
+1D6BE .
+1D6BF .
+1D6C0 .
+1D6C2 .
+1D6C3 .
+1D6C4 .
+1D6C5 .
+1D6C6 .
+1D6C7 .
+1D6C8 .
+1D6C9 .
+1D6CA .
+1D6CB .
+1D6CC .
+1D6CD .
+1D6CE .
+1D6CF .
+1D6D0 .
+1D6D1 .
+1D6D2 .
+1D6D3 .
+1D6D4 .
+1D6D5 .
+1D6D6 .
+1D6D7 .
+1D6D8 .
+1D6D9 .
+1D6DA .
+1D6DC .
+1D6DD .
+1D6DE .
+1D6DF .
+1D6E0 .
+1D6E1 .
+1D6E2 .
+1D6E3 .
+1D6E4 .
+1D6E5 .
+1D6E6 .
+1D6E7 .
+1D6E8 .
+1D6E9 .
+1D6EA .
+1D6EB .
+1D6EC .
+1D6ED .
+1D6EE .
+1D6EF .
+1D6F0 .
+1D6F1 .
+1D6F2 .
+1D6F3 .
+1D6F4 .
+1D6F5 .
+1D6F6 .
+1D6F7 .
+1D6F8 .
+1D6F9 .
+1D6FA .
+1D6FC .
+1D6FD .
+1D6FE .
+1D6FF .
+1D700 .
+1D701 .
+1D702 .
+1D703 .
+1D704 .
+1D705 .
+1D706 .
+1D707 .
+1D708 .
+1D709 .
+1D70A .
+1D70B .
+1D70C .
+1D70D .
+1D70E .
+1D70F .
+1D710 .
+1D711 .
+1D712 .
+1D713 .
+1D714 .
+1D716 .
+1D717 .
+1D718 .
+1D719 .
+1D71A .
+1D71B .
+1D71C .
+1D71D .
+1D71E .
+1D71F .
+1D720 .
+1D721 .
+1D722 .
+1D723 .
+1D724 .
+1D725 .
+1D726 .
+1D727 .
+1D728 .
+1D729 .
+1D72A .
+1D72B .
+1D72C .
+1D72D .
+1D72E .
+1D72F .
+1D730 .
+1D731 .
+1D732 .
+1D733 .
+1D734 .
+1D736 .
+1D737 .
+1D738 .
+1D739 .
+1D73A .
+1D73B .
+1D73C .
+1D73D .
+1D73E .
+1D73F .
+1D740 .
+1D741 .
+1D742 .
+1D743 .
+1D744 .
+1D745 .
+1D746 .
+1D747 .
+1D748 .
+1D749 .
+1D74A .
+1D74B .
+1D74C .
+1D74D .
+1D74E .
+1D750 .
+1D751 .
+1D752 .
+1D753 .
+1D754 .
+1D755 .
+1D756 .
+1D757 .
+1D758 .
+1D759 .
+1D75A .
+1D75B .
+1D75C .
+1D75D .
+1D75E .
+1D75F .
+1D760 .
+1D761 .
+1D762 .
+1D763 .
+1D764 .
+1D765 .
+1D766 .
+1D767 .
+1D768 .
+1D769 .
+1D76A .
+1D76B .
+1D76C .
+1D76D .
+1D76E .
+1D770 .
+1D771 .
+1D772 .
+1D773 .
+1D774 .
+1D775 .
+1D776 .
+1D777 .
+1D778 .
+1D779 .
+1D77A .
+1D77B .
+1D77C .
+1D77D .
+1D77E .
+1D77F .
+1D780 .
+1D781 .
+1D782 .
+1D783 .
+1D784 .
+1D785 .
+1D786 .
+1D787 .
+1D788 .
+1D78A .
+1D78B .
+1D78C .
+1D78D .
+1D78E .
+1D78F .
+1D790 .
+1D791 .
+1D792 .
+1D793 .
+1D794 .
+1D795 .
+1D796 .
+1D797 .
+1D798 .
+1D799 .
+1D79A .
+1D79B .
+1D79C .
+1D79D .
+1D79E .
+1D79F .
+1D7A0 .
+1D7A1 .
+1D7A2 .
+1D7A3 .
+1D7A4 .
+1D7A5 .
+1D7A6 .
+1D7A7 .
+1D7A8 .
+1D7AA .
+1D7AB .
+1D7AC .
+1D7AD .
+1D7AE .
+1D7AF .
+1D7B0 .
+1D7B1 .
+1D7B2 .
+1D7B3 .
+1D7B4 .
+1D7B5 .
+1D7B6 .
+1D7B7 .
+1D7B8 .
+1D7B9 .
+1D7BA .
+1D7BB .
+1D7BC .
+1D7BD .
+1D7BE .
+1D7BF .
+1D7C0 .
+1D7C1 .
+1D7C2 .
+1D7C4 .
+1D7C5 .
+1D7C6 .
+1D7C7 .
+1D7C8 .
+1D7C9 .
+1D7CA .
+1D7CB .
+1EE00 .
+1EE01 .
+1EE02 .
+1EE03 .
+1EE05 .
+1EE06 .
+1EE07 .
+1EE08 .
+1EE09 .
+1EE0A .
+1EE0B .
+1EE0C .
+1EE0D .
+1EE0E .
+1EE0F .
+1EE10 .
+1EE11 .
+1EE12 .
+1EE13 .
+1EE14 .
+1EE15 .
+1EE16 .
+1EE17 .
+1EE18 .
+1EE19 .
+1EE1A .
+1EE1B .
+1EE1C .
+1EE1D .
+1EE1E .
+1EE1F .
+1EE21 .
+1EE22 .
+1EE24 .
+1EE27 .
+1EE29 .
+1EE2A .
+1EE2B .
+1EE2C .
+1EE2D .
+1EE2E .
+1EE2F .
+1EE30 .
+1EE31 .
+1EE32 .
+1EE34 .
+1EE35 .
+1EE36 .
+1EE37 .
+1EE39 .
+1EE3B .
+1EE42 .
+1EE47 .
+1EE49 .
+1EE4B .
+1EE4D .
+1EE4E .
+1EE4F .
+1EE51 .
+1EE52 .
+1EE54 .
+1EE57 .
+1EE59 .
+1EE5B .
+1EE5D .
+1EE5F .
+1EE61 .
+1EE62 .
+1EE64 .
+1EE67 .
+1EE68 .
+1EE69 .
+1EE6A .
+1EE6C .
+1EE6D .
+1EE6E .
+1EE6F .
+1EE70 .
+1EE71 .
+1EE72 .
+1EE74 .
+1EE75 .
+1EE76 .
+1EE77 .
+1EE79 .
+1EE7A .
+1EE7B .
+1EE7C .
+1EE7E .
+1EE80 .
+1EE81 .
+1EE82 .
+1EE83 .
+1EE84 .
+1EE85 .
+1EE86 .
+1EE87 .
+1EE88 .
+1EE89 .
+1EE8B .
+1EE8C .
+1EE8D .
+1EE8E .
+1EE8F .
+1EE90 .
+1EE91 .
+1EE92 .
+1EE93 .
+1EE94 .
+1EE95 .
+1EE96 .
+1EE97 .
+1EE98 .
+1EE99 .
+1EE9A .
+1EE9B .
+1EEA1 .
+1EEA2 .
+1EEA3 .
+1EEA5 .
+1EEA6 .
+1EEA7 .
+1EEA8 .
+1EEA9 .
+1EEAB .
+1EEAC .
+1EEAD .
+1EEAE .
+1EEAF .
+1EEB0 .
+1EEB1 .
+1EEB2 .
+1EEB3 .
+1EEB4 .
+1EEB5 .
+1EEB6 .
+1EEB7 .
+1EEB8 .
+1EEB9 .
+1EEBA .
+1EEBB .
+2F800 .
+2F801 .
+2F802 .
+2F803 .
+2F804 .
+2F805 .
+2F806 .
+2F807 .
+2F808 .
+2F809 .
+2F80A .
+2F80B .
+2F80C .
+2F80D .
+2F80E .
+2F80F .
+2F810 .
+2F811 .
+2F812 .
+2F813 .
+2F814 .
+2F815 .
+2F816 .
+2F817 .
+2F818 .
+2F819 .
+2F81A .
+2F81B .
+2F81C .
+2F81D .
+2F81E .
+2F81F .
+2F820 .
+2F821 .
+2F822 .
+2F823 .
+2F824 .
+2F825 .
+2F826 .
+2F827 .
+2F828 .
+2F829 .
+2F82A .
+2F82B .
+2F82C .
+2F82D .
+2F82E .
+2F82F .
+2F830 .
+2F831 .
+2F832 .
+2F833 .
+2F834 .
+2F835 .
+2F836 .
+2F837 .
+2F838 .
+2F839 .
+2F83A .
+2F83B .
+2F83C .
+2F83D .
+2F83E .
+2F83F .
+2F840 .
+2F841 .
+2F842 .
+2F843 .
+2F844 .
+2F845 .
+2F846 .
+2F847 .
+2F848 .
+2F849 .
+2F84A .
+2F84B .
+2F84C .
+2F84D .
+2F84E .
+2F84F .
+2F850 .
+2F851 .
+2F852 .
+2F853 .
+2F854 .
+2F855 .
+2F856 .
+2F857 .
+2F858 .
+2F859 .
+2F85A .
+2F85B .
+2F85C .
+2F85D .
+2F85E .
+2F85F .
+2F860 .
+2F861 .
+2F862 .
+2F863 .
+2F864 .
+2F865 .
+2F866 .
+2F867 .
+2F868 .
+2F869 .
+2F86A .
+2F86B .
+2F86C .
+2F86D .
+2F86E .
+2F86F .
+2F870 .
+2F871 .
+2F872 .
+2F873 .
+2F874 .
+2F875 .
+2F876 .
+2F877 .
+2F878 .
+2F879 .
+2F87A .
+2F87B .
+2F87C .
+2F87D .
+2F87E .
+2F87F .
+2F880 .
+2F881 .
+2F882 .
+2F883 .
+2F884 .
+2F885 .
+2F886 .
+2F887 .
+2F888 .
+2F889 .
+2F88A .
+2F88B .
+2F88C .
+2F88D .
+2F88E .
+2F88F .
+2F890 .
+2F891 .
+2F892 .
+2F893 .
+2F894 .
+2F895 .
+2F896 .
+2F897 .
+2F898 .
+2F899 .
+2F89A .
+2F89B .
+2F89C .
+2F89D .
+2F89E .
+2F89F .
+2F8A0 .
+2F8A1 .
+2F8A2 .
+2F8A3 .
+2F8A4 .
+2F8A5 .
+2F8A6 .
+2F8A7 .
+2F8A8 .
+2F8A9 .
+2F8AA .
+2F8AB .
+2F8AC .
+2F8AD .
+2F8AE .
+2F8AF .
+2F8B0 .
+2F8B1 .
+2F8B2 .
+2F8B3 .
+2F8B4 .
+2F8B5 .
+2F8B6 .
+2F8B7 .
+2F8B8 .
+2F8B9 .
+2F8BA .
+2F8BB .
+2F8BC .
+2F8BD .
+2F8BE .
+2F8BF .
+2F8C0 .
+2F8C1 .
+2F8C2 .
+2F8C3 .
+2F8C4 .
+2F8C5 .
+2F8C6 .
+2F8C7 .
+2F8C8 .
+2F8C9 .
+2F8CA .
+2F8CB .
+2F8CC .
+2F8CD .
+2F8CE .
+2F8CF .
+2F8D0 .
+2F8D1 .
+2F8D2 .
+2F8D3 .
+2F8D4 .
+2F8D5 .
+2F8D6 .
+2F8D7 .
+2F8D8 .
+2F8D9 .
+2F8DA .
+2F8DB .
+2F8DC .
+2F8DD .
+2F8DE .
+2F8DF .
+2F8E0 .
+2F8E1 .
+2F8E2 .
+2F8E3 .
+2F8E4 .
+2F8E5 .
+2F8E6 .
+2F8E7 .
+2F8E8 .
+2F8E9 .
+2F8EA .
+2F8EB .
+2F8EC .
+2F8ED .
+2F8EE .
+2F8EF .
+2F8F0 .
+2F8F1 .
+2F8F2 .
+2F8F3 .
+2F8F4 .
+2F8F5 .
+2F8F6 .
+2F8F7 .
+2F8F8 .
+2F8F9 .
+2F8FA .
+2F8FB .
+2F8FC .
+2F8FD .
+2F8FE .
+2F8FF .
+2F900 .
+2F901 .
+2F902 .
+2F903 .
+2F904 .
+2F905 .
+2F906 .
+2F907 .
+2F908 .
+2F909 .
+2F90A .
+2F90B .
+2F90C .
+2F90D .
+2F90E .
+2F90F .
+2F910 .
+2F911 .
+2F912 .
+2F913 .
+2F914 .
+2F915 .
+2F916 .
+2F917 .
+2F918 .
+2F919 .
+2F91A .
+2F91B .
+2F91C .
+2F91D .
+2F91E .
+2F91F .
+2F920 .
+2F921 .
+2F922 .
+2F923 .
+2F924 .
+2F925 .
+2F926 .
+2F927 .
+2F928 .
+2F929 .
+2F92A .
+2F92B .
+2F92C .
+2F92D .
+2F92E .
+2F92F .
+2F930 .
+2F931 .
+2F932 .
+2F933 .
+2F934 .
+2F935 .
+2F936 .
+2F937 .
+2F938 .
+2F939 .
+2F93A .
+2F93B .
+2F93C .
+2F93D .
+2F93E .
+2F93F .
+2F940 .
+2F941 .
+2F942 .
+2F943 .
+2F944 .
+2F945 .
+2F946 .
+2F947 .
+2F948 .
+2F949 .
+2F94A .
+2F94B .
+2F94C .
+2F94D .
+2F94E .
+2F94F .
+2F950 .
+2F951 .
+2F952 .
+2F953 .
+2F954 .
+2F955 .
+2F956 .
+2F957 .
+2F958 .
+2F959 .
+2F95A .
+2F95B .
+2F95C .
+2F95D .
+2F95E .
+2F95F .
+2F960 .
+2F961 .
+2F962 .
+2F963 .
+2F964 .
+2F965 .
+2F966 .
+2F967 .
+2F968 .
+2F969 .
+2F96A .
+2F96B .
+2F96C .
+2F96D .
+2F96E .
+2F96F .
+2F970 .
+2F971 .
+2F972 .
+2F973 .
+2F974 .
+2F975 .
+2F976 .
+2F977 .
+2F978 .
+2F979 .
+2F97A .
+2F97B .
+2F97C .
+2F97D .
+2F97E .
+2F97F .
+2F980 .
+2F981 .
+2F982 .
+2F983 .
+2F984 .
+2F985 .
+2F986 .
+2F987 .
+2F988 .
+2F989 .
+2F98A .
+2F98B .
+2F98C .
+2F98D .
+2F98E .
+2F98F .
+2F990 .
+2F991 .
+2F992 .
+2F993 .
+2F994 .
+2F995 .
+2F996 .
+2F997 .
+2F998 .
+2F999 .
+2F99A .
+2F99B .
+2F99C .
+2F99D .
+2F99E .
+2F99F .
+2F9A0 .
+2F9A1 .
+2F9A2 .
+2F9A3 .
+2F9A4 .
+2F9A5 .
+2F9A6 .
+2F9A7 .
+2F9A8 .
+2F9A9 .
+2F9AA .
+2F9AB .
+2F9AC .
+2F9AD .
+2F9AE .
+2F9AF .
+2F9B0 .
+2F9B1 .
+2F9B2 .
+2F9B3 .
+2F9B4 .
+2F9B5 .
+2F9B6 .
+2F9B7 .
+2F9B8 .
+2F9B9 .
+2F9BA .
+2F9BB .
+2F9BC .
+2F9BD .
+2F9BE .
+2F9BF .
+2F9C0 .
+2F9C1 .
+2F9C2 .
+2F9C3 .
+2F9C4 .
+2F9C5 .
+2F9C6 .
+2F9C7 .
+2F9C8 .
+2F9C9 .
+2F9CA .
+2F9CB .
+2F9CC .
+2F9CD .
+2F9CE .
+2F9CF .
+2F9D0 .
+2F9D1 .
+2F9D2 .
+2F9D3 .
+2F9D4 .
+2F9D5 .
+2F9D6 .
+2F9D7 .
+2F9D8 .
+2F9D9 .
+2F9DA .
+2F9DB .
+2F9DC .
+2F9DD .
+2F9DE .
+2F9DF .
+2F9E0 .
+2F9E1 .
+2F9E2 .
+2F9E3 .
+2F9E4 .
+2F9E5 .
+2F9E6 .
+2F9E7 .
+2F9E8 .
+2F9E9 .
+2F9EA .
+2F9EB .
+2F9EC .
+2F9ED .
+2F9EE .
+2F9EF .
+2F9F0 .
+2F9F1 .
+2F9F2 .
+2F9F3 .
+2F9F4 .
+2F9F5 .
+2F9F6 .
+2F9F7 .
+2F9F8 .
+2F9F9 .
+2F9FA .
+2F9FB .
+2F9FC .
+2F9FD .
+2F9FE .
+2F9FF .
+2FA00 .
+2FA01 .
+2FA02 .
+2FA03 .
+2FA04 .
+2FA05 .
+2FA06 .
+2FA07 .
+2FA08 .
+2FA09 .
+2FA0A .
+2FA0B .
+2FA0C .
+2FA0D .
+2FA0E .
+2FA0F .
+2FA10 .
+2FA11 .
+2FA12 .
+2FA13 .
+2FA14 .
+2FA15 .
+2FA16 .
+2FA17 .
+2FA18 .
+2FA19 .
+2FA1A .
+2FA1B .
+2FA1C .
+2FA1D .
+2170 2160
+2171 2161
+2172 2162
+2173 2163
+2174 2164
+2175 2165
+2176 2166
+2177 2167
+2178 2168
+2179 2169
+217A 216A
+217B 216B
+217C 216C
+217D 216D
+217E 216E
+217F 216F
+24D0 24B6
+24D1 24B7
+24D2 24B8
+24D3 24B9
+24D4 24BA
+24D5 24BB
+24D6 24BC
+24D7 24BD
+24D8 24BE
+24D9 24BF
+24DA 24C0
+24DB 24C1
+24DC 24C2
+24DD 24C3
+24DE 24C4
+24DF 24C5
+24E0 24C6
+24E1 24C7
+24E2 24C8
+24E3 24C9
+24E4 24CA
+24E5 24CB
+24E6 24CC
+24E7 24CD
+24E8 24CE
+24E9 24CF
+0300 .
+0301 .
+0302 .
+0303 .
+0304 .
+0305 .
+0306 .
+0307 .
+0308 .
+0309 .
+030A .
+030B .
+030C .
+030D .
+030E .
+030F .
+0310 .
+0311 .
+0312 .
+0313 .
+0314 .
+0315 .
+0316 .
+0317 .
+0318 .
+0319 .
+031A .
+031B .
+031C .
+031D .
+031E .
+031F .
+0320 .
+0321 .
+0322 .
+0323 .
+0324 .
+0325 .
+0326 .
+0327 .
+0328 .
+0329 .
+032A .
+032B .
+032C .
+032D .
+032E .
+032F .
+0330 .
+0331 .
+0332 .
+0333 .
+0334 .
+0335 .
+0336 .
+0337 .
+0338 .
+0339 .
+033A .
+033B .
+033C .
+033D .
+033E .
+033F .
+0340 .
+0341 .
+0342 .
+0343 .
+0344 .
+0345 .
+0346 .
+0347 .
+0348 .
+0349 .
+034A .
+034B .
+034C .
+034D .
+034E .
+034F .
+0350 .
+0351 .
+0352 .
+0353 .
+0354 .
+0355 .
+0356 .
+0357 .
+0358 .
+0359 .
+035A .
+035B .
+035C .
+035D .
+035E .
+035F .
+0360 .
+0361 .
+0362 .
+0363 .
+0364 .
+0365 .
+0366 .
+0367 .
+0368 .
+0369 .
+036A .
+036B .
+036C .
+036D .
+036E .
+036F .
+0483 .
+0484 .
+0485 .
+0486 .
+0487 .
+0488 .
+0489 .
+0591 .
+0592 .
+0593 .
+0594 .
+0595 .
+0596 .
+0597 .
+0598 .
+0599 .
+059A .
+059B .
+059C .
+059D .
+059E .
+059F .
+05A0 .
+05A1 .
+05A2 .
+05A3 .
+05A4 .
+05A5 .
+05A6 .
+05A7 .
+05A8 .
+05A9 .
+05AA .
+05AB .
+05AC .
+05AD .
+05AE .
+05AF .
+05B0 .
+05B1 .
+05B2 .
+05B3 .
+05B4 .
+05B5 .
+05B6 .
+05B7 .
+05B8 .
+05B9 .
+05BA .
+05BB .
+05BC .
+05BD .
+05BF .
+05C1 .
+05C2 .
+05C4 .
+05C5 .
+05C7 .
+0610 .
+0611 .
+0612 .
+0613 .
+0614 .
+0615 .
+0616 .
+0617 .
+0618 .
+0619 .
+061A .
+064B .
+064C .
+064D .
+064E .
+064F .
+0650 .
+0651 .
+0652 .
+0653 .
+0654 .
+0655 .
+0656 .
+0657 .
+0658 .
+0659 .
+065A .
+065B .
+065C .
+065D .
+065E .
+065F .
+0670 .
+06D6 .
+06D7 .
+06D8 .
+06D9 .
+06DA .
+06DB .
+06DC .
+06DF .
+06E0 .
+06E1 .
+06E2 .
+06E3 .
+06E4 .
+06E7 .
+06E8 .
+06EA .
+06EB .
+06EC .
+06ED .
+0711 .
+0730 .
+0731 .
+0732 .
+0733 .
+0734 .
+0735 .
+0736 .
+0737 .
+0738 .
+0739 .
+073A .
+073B .
+073C .
+073D .
+073E .
+073F .
+0740 .
+0741 .
+0742 .
+0743 .
+0744 .
+0745 .
+0746 .
+0747 .
+0748 .
+0749 .
+074A .
+07A6 .
+07A7 .
+07A8 .
+07A9 .
+07AA .
+07AB .
+07AC .
+07AD .
+07AE .
+07AF .
+07B0 .
+07EB .
+07EC .
+07ED .
+07EE .
+07EF .
+07F0 .
+07F1 .
+07F2 .
+07F3 .
+0816 .
+0817 .
+0818 .
+0819 .
+081B .
+081C .
+081D .
+081E .
+081F .
+0820 .
+0821 .
+0822 .
+0823 .
+0825 .
+0826 .
+0827 .
+0829 .
+082A .
+082B .
+082C .
+082D .
+0859 .
+085A .
+085B .
+08E4 .
+08E5 .
+08E6 .
+08E7 .
+08E8 .
+08E9 .
+08EA .
+08EB .
+08EC .
+08ED .
+08EE .
+08EF .
+08F0 .
+08F1 .
+08F2 .
+08F3 .
+08F4 .
+08F5 .
+08F6 .
+08F7 .
+08F8 .
+08F9 .
+08FA .
+08FB .
+08FC .
+08FD .
+08FE .
+0900 .
+0901 .
+0902 .
+0903 .
+093A .
+093B .
+093C .
+093E .
+093F .
+0940 .
+0941 .
+0942 .
+0943 .
+0944 .
+0945 .
+0946 .
+0947 .
+0948 .
+0949 .
+094A .
+094B .
+094C .
+094D .
+094E .
+094F .
+0951 .
+0952 .
+0953 .
+0954 .
+0955 .
+0956 .
+0957 .
+0962 .
+0963 .
+0981 .
+0982 .
+0983 .
+09BC .
+09BE .
+09BF .
+09C0 .
+09C1 .
+09C2 .
+09C3 .
+09C4 .
+09C7 .
+09C8 .
+09CB .
+09CC .
+09CD .
+09D7 .
+09E2 .
+09E3 .
+0A01 .
+0A02 .
+0A03 .
+0A3C .
+0A3E .
+0A3F .
+0A40 .
+0A41 .
+0A42 .
+0A47 .
+0A48 .
+0A4B .
+0A4C .
+0A4D .
+0A51 .
+0A70 .
+0A71 .
+0A75 .
+0A81 .
+0A82 .
+0A83 .
+0ABC .
+0ABE .
+0ABF .
+0AC0 .
+0AC1 .
+0AC2 .
+0AC3 .
+0AC4 .
+0AC5 .
+0AC7 .
+0AC8 .
+0AC9 .
+0ACB .
+0ACC .
+0ACD .
+0AE2 .
+0AE3 .
+0B01 .
+0B02 .
+0B03 .
+0B3C .
+0B3E .
+0B3F .
+0B40 .
+0B41 .
+0B42 .
+0B43 .
+0B44 .
+0B47 .
+0B48 .
+0B4B .
+0B4C .
+0B4D .
+0B56 .
+0B57 .
+0B62 .
+0B63 .
+0B82 .
+0BBE .
+0BBF .
+0BC0 .
+0BC1 .
+0BC2 .
+0BC6 .
+0BC7 .
+0BC8 .
+0BCA .
+0BCB .
+0BCC .
+0BCD .
+0BD7 .
+0C01 .
+0C02 .
+0C03 .
+0C3E .
+0C3F .
+0C40 .
+0C41 .
+0C42 .
+0C43 .
+0C44 .
+0C46 .
+0C47 .
+0C48 .
+0C4A .
+0C4B .
+0C4C .
+0C4D .
+0C55 .
+0C56 .
+0C62 .
+0C63 .
+0C82 .
+0C83 .
+0CBC .
+0CBE .
+0CBF .
+0CC0 .
+0CC1 .
+0CC2 .
+0CC3 .
+0CC4 .
+0CC6 .
+0CC7 .
+0CC8 .
+0CCA .
+0CCB .
+0CCC .
+0CCD .
+0CD5 .
+0CD6 .
+0CE2 .
+0CE3 .
+0D02 .
+0D03 .
+0D3E .
+0D3F .
+0D40 .
+0D41 .
+0D42 .
+0D43 .
+0D44 .
+0D46 .
+0D47 .
+0D48 .
+0D4A .
+0D4B .
+0D4C .
+0D4D .
+0D57 .
+0D62 .
+0D63 .
+0D82 .
+0D83 .
+0DCA .
+0DCF .
+0DD0 .
+0DD1 .
+0DD2 .
+0DD3 .
+0DD4 .
+0DD6 .
+0DD8 .
+0DD9 .
+0DDA .
+0DDB .
+0DDC .
+0DDD .
+0DDE .
+0DDF .
+0DF2 .
+0DF3 .
+0E31 .
+0E34 .
+0E35 .
+0E36 .
+0E37 .
+0E38 .
+0E39 .
+0E3A .
+0E47 .
+0E48 .
+0E49 .
+0E4A .
+0E4B .
+0E4C .
+0E4D .
+0E4E .
+0EB1 .
+0EB4 .
+0EB5 .
+0EB6 .
+0EB7 .
+0EB8 .
+0EB9 .
+0EBB .
+0EBC .
+0EC8 .
+0EC9 .
+0ECA .
+0ECB .
+0ECC .
+0ECD .
+0F18 .
+0F19 .
+0F35 .
+0F37 .
+0F39 .
+0F3E .
+0F3F .
+0F71 .
+0F72 .
+0F73 .
+0F74 .
+0F75 .
+0F76 .
+0F77 .
+0F78 .
+0F79 .
+0F7A .
+0F7B .
+0F7C .
+0F7D .
+0F7E .
+0F7F .
+0F80 .
+0F81 .
+0F82 .
+0F83 .
+0F84 .
+0F86 .
+0F87 .
+0F8D .
+0F8E .
+0F8F .
+0F90 .
+0F91 .
+0F92 .
+0F93 .
+0F94 .
+0F95 .
+0F96 .
+0F97 .
+0F99 .
+0F9A .
+0F9B .
+0F9C .
+0F9D .
+0F9E .
+0F9F .
+0FA0 .
+0FA1 .
+0FA2 .
+0FA3 .
+0FA4 .
+0FA5 .
+0FA6 .
+0FA7 .
+0FA8 .
+0FA9 .
+0FAA .
+0FAB .
+0FAC .
+0FAD .
+0FAE .
+0FAF .
+0FB0 .
+0FB1 .
+0FB2 .
+0FB3 .
+0FB4 .
+0FB5 .
+0FB6 .
+0FB7 .
+0FB8 .
+0FB9 .
+0FBA .
+0FBB .
+0FBC .
+0FC6 .
+102B .
+102C .
+102D .
+102E .
+102F .
+1030 .
+1031 .
+1032 .
+1033 .
+1034 .
+1035 .
+1036 .
+1037 .
+1038 .
+1039 .
+103A .
+103B .
+103C .
+103D .
+103E .
+1056 .
+1057 .
+1058 .
+1059 .
+105E .
+105F .
+1060 .
+1062 .
+1063 .
+1064 .
+1067 .
+1068 .
+1069 .
+106A .
+106B .
+106C .
+106D .
+1071 .
+1072 .
+1073 .
+1074 .
+1082 .
+1083 .
+1084 .
+1085 .
+1086 .
+1087 .
+1088 .
+1089 .
+108A .
+108B .
+108C .
+108D .
+108F .
+109A .
+109B .
+109C .
+109D .
+135D .
+135E .
+135F .
+1712 .
+1713 .
+1714 .
+1732 .
+1733 .
+1734 .
+1752 .
+1753 .
+1772 .
+1773 .
+17B4 .
+17B5 .
+17B6 .
+17B7 .
+17B8 .
+17B9 .
+17BA .
+17BB .
+17BC .
+17BD .
+17BE .
+17BF .
+17C0 .
+17C1 .
+17C2 .
+17C3 .
+17C4 .
+17C5 .
+17C6 .
+17C7 .
+17C8 .
+17C9 .
+17CA .
+17CB .
+17CC .
+17CD .
+17CE .
+17CF .
+17D0 .
+17D1 .
+17D2 .
+17D3 .
+17DD .
+180B .
+180C .
+180D .
+18A9 .
+1920 .
+1921 .
+1922 .
+1923 .
+1924 .
+1925 .
+1926 .
+1927 .
+1928 .
+1929 .
+192A .
+192B .
+1930 .
+1931 .
+1932 .
+1933 .
+1934 .
+1935 .
+1936 .
+1937 .
+1938 .
+1939 .
+193A .
+193B .
+19B0 .
+19B1 .
+19B2 .
+19B3 .
+19B4 .
+19B5 .
+19B6 .
+19B7 .
+19B8 .
+19B9 .
+19BA .
+19BB .
+19BC .
+19BD .
+19BE .
+19BF .
+19C0 .
+19C8 .
+19C9 .
+1A17 .
+1A18 .
+1A19 .
+1A1A .
+1A1B .
+1A55 .
+1A56 .
+1A57 .
+1A58 .
+1A59 .
+1A5A .
+1A5B .
+1A5C .
+1A5D .
+1A5E .
+1A60 .
+1A61 .
+1A62 .
+1A63 .
+1A64 .
+1A65 .
+1A66 .
+1A67 .
+1A68 .
+1A69 .
+1A6A .
+1A6B .
+1A6C .
+1A6D .
+1A6E .
+1A6F .
+1A70 .
+1A71 .
+1A72 .
+1A73 .
+1A74 .
+1A75 .
+1A76 .
+1A77 .
+1A78 .
+1A79 .
+1A7A .
+1A7B .
+1A7C .
+1A7F .
+1B00 .
+1B01 .
+1B02 .
+1B03 .
+1B04 .
+1B34 .
+1B35 .
+1B36 .
+1B37 .
+1B38 .
+1B39 .
+1B3A .
+1B3B .
+1B3C .
+1B3D .
+1B3E .
+1B3F .
+1B40 .
+1B41 .
+1B42 .
+1B43 .
+1B44 .
+1B6B .
+1B6C .
+1B6D .
+1B6E .
+1B6F .
+1B70 .
+1B71 .
+1B72 .
+1B73 .
+1B80 .
+1B81 .
+1B82 .
+1BA1 .
+1BA2 .
+1BA3 .
+1BA4 .
+1BA5 .
+1BA6 .
+1BA7 .
+1BA8 .
+1BA9 .
+1BAA .
+1BAB .
+1BAC .
+1BAD .
+1BE6 .
+1BE7 .
+1BE8 .
+1BE9 .
+1BEA .
+1BEB .
+1BEC .
+1BED .
+1BEE .
+1BEF .
+1BF0 .
+1BF1 .
+1BF2 .
+1BF3 .
+1C24 .
+1C25 .
+1C26 .
+1C27 .
+1C28 .
+1C29 .
+1C2A .
+1C2B .
+1C2C .
+1C2D .
+1C2E .
+1C2F .
+1C30 .
+1C31 .
+1C32 .
+1C33 .
+1C34 .
+1C35 .
+1C36 .
+1C37 .
+1CD0 .
+1CD1 .
+1CD2 .
+1CD4 .
+1CD5 .
+1CD6 .
+1CD7 .
+1CD8 .
+1CD9 .
+1CDA .
+1CDB .
+1CDC .
+1CDD .
+1CDE .
+1CDF .
+1CE0 .
+1CE1 .
+1CE2 .
+1CE3 .
+1CE4 .
+1CE5 .
+1CE6 .
+1CE7 .
+1CE8 .
+1CED .
+1CF2 .
+1CF3 .
+1CF4 .
+1DC0 .
+1DC1 .
+1DC2 .
+1DC3 .
+1DC4 .
+1DC5 .
+1DC6 .
+1DC7 .
+1DC8 .
+1DC9 .
+1DCA .
+1DCB .
+1DCC .
+1DCD .
+1DCE .
+1DCF .
+1DD0 .
+1DD1 .
+1DD2 .
+1DD3 .
+1DD4 .
+1DD5 .
+1DD6 .
+1DD7 .
+1DD8 .
+1DD9 .
+1DDA .
+1DDB .
+1DDC .
+1DDD .
+1DDE .
+1DDF .
+1DE0 .
+1DE1 .
+1DE2 .
+1DE3 .
+1DE4 .
+1DE5 .
+1DE6 .
+1DFC .
+1DFD .
+1DFE .
+1DFF .
+20D0 .
+20D1 .
+20D2 .
+20D3 .
+20D4 .
+20D5 .
+20D6 .
+20D7 .
+20D8 .
+20D9 .
+20DA .
+20DB .
+20DC .
+20DD .
+20DE .
+20DF .
+20E0 .
+20E1 .
+20E2 .
+20E3 .
+20E4 .
+20E5 .
+20E6 .
+20E7 .
+20E8 .
+20E9 .
+20EA .
+20EB .
+20EC .
+20ED .
+20EE .
+20EF .
+20F0 .
+2CEF .
+2CF0 .
+2CF1 .
+2D7F .
+2DE0 .
+2DE1 .
+2DE2 .
+2DE3 .
+2DE4 .
+2DE5 .
+2DE6 .
+2DE7 .
+2DE8 .
+2DE9 .
+2DEA .
+2DEB .
+2DEC .
+2DED .
+2DEE .
+2DEF .
+2DF0 .
+2DF1 .
+2DF2 .
+2DF3 .
+2DF4 .
+2DF5 .
+2DF6 .
+2DF7 .
+2DF8 .
+2DF9 .
+2DFA .
+2DFB .
+2DFC .
+2DFD .
+2DFE .
+2DFF .
+302A .
+302B .
+302C .
+302D .
+302E .
+302F .
+3099 .
+309A .
+A66F .
+A670 .
+A671 .
+A672 .
+A674 .
+A675 .
+A676 .
+A677 .
+A678 .
+A679 .
+A67A .
+A67B .
+A67C .
+A67D .
+A69F .
+A6F0 .
+A6F1 .
+A802 .
+A806 .
+A80B .
+A823 .
+A824 .
+A825 .
+A826 .
+A827 .
+A880 .
+A881 .
+A8B4 .
+A8B5 .
+A8B6 .
+A8B7 .
+A8B8 .
+A8B9 .
+A8BA .
+A8BB .
+A8BC .
+A8BD .
+A8BE .
+A8BF .
+A8C0 .
+A8C1 .
+A8C2 .
+A8C3 .
+A8C4 .
+A8E0 .
+A8E1 .
+A8E2 .
+A8E3 .
+A8E4 .
+A8E5 .
+A8E6 .
+A8E7 .
+A8E8 .
+A8E9 .
+A8EA .
+A8EB .
+A8EC .
+A8ED .
+A8EE .
+A8EF .
+A8F0 .
+A8F1 .
+A926 .
+A927 .
+A928 .
+A929 .
+A92A .
+A92B .
+A92C .
+A92D .
+A947 .
+A948 .
+A949 .
+A94A .
+A94B .
+A94C .
+A94D .
+A94E .
+A94F .
+A950 .
+A951 .
+A952 .
+A953 .
+A980 .
+A981 .
+A982 .
+A983 .
+A9B3 .
+A9B4 .
+A9B5 .
+A9B6 .
+A9B7 .
+A9B8 .
+A9B9 .
+A9BA .
+A9BB .
+A9BC .
+A9BD .
+A9BE .
+A9BF .
+A9C0 .
+AA29 .
+AA2A .
+AA2B .
+AA2C .
+AA2D .
+AA2E .
+AA2F .
+AA30 .
+AA31 .
+AA32 .
+AA33 .
+AA34 .
+AA35 .
+AA36 .
+AA43 .
+AA4C .
+AA4D .
+AA7B .
+AAB0 .
+AAB2 .
+AAB3 .
+AAB4 .
+AAB7 .
+AAB8 .
+AABE .
+AABF .
+AAC1 .
+AAEB .
+AAEC .
+AAED .
+AAEE .
+AAEF .
+AAF5 .
+AAF6 .
+ABE3 .
+ABE4 .
+ABE5 .
+ABE6 .
+ABE7 .
+ABE8 .
+ABE9 .
+ABEA .
+ABEC .
+ABED .
+FB1E .
+FE00 .
+FE01 .
+FE02 .
+FE03 .
+FE04 .
+FE05 .
+FE06 .
+FE07 .
+FE08 .
+FE09 .
+FE0A .
+FE0B .
+FE0C .
+FE0D .
+FE0E .
+FE0F .
+FE20 .
+FE21 .
+FE22 .
+FE23 .
+FE24 .
+FE25 .
+FE26 .
+101FD .
+10A01 .
+10A02 .
+10A03 .
+10A05 .
+10A06 .
+10A0C .
+10A0D .
+10A0E .
+10A0F .
+10A38 .
+10A39 .
+10A3A .
+10A3F .
+11000 .
+11001 .
+11002 .
+11038 .
+11039 .
+1103A .
+1103B .
+1103C .
+1103D .
+1103E .
+1103F .
+11040 .
+11041 .
+11042 .
+11043 .
+11044 .
+11045 .
+11046 .
+11080 .
+11081 .
+11082 .
+110B0 .
+110B1 .
+110B2 .
+110B3 .
+110B4 .
+110B5 .
+110B6 .
+110B7 .
+110B8 .
+110B9 .
+110BA .
+11100 .
+11101 .
+11102 .
+11127 .
+11128 .
+11129 .
+1112A .
+1112B .
+1112C .
+1112D .
+1112E .
+1112F .
+11130 .
+11131 .
+11132 .
+11133 .
+11134 .
+11180 .
+11181 .
+11182 .
+111B3 .
+111B4 .
+111B5 .
+111B6 .
+111B7 .
+111B8 .
+111B9 .
+111BA .
+111BB .
+111BC .
+111BD .
+111BE .
+111BF .
+111C0 .
+116AB .
+116AC .
+116AD .
+116AE .
+116AF .
+116B0 .
+116B1 .
+116B2 .
+116B3 .
+116B4 .
+116B5 .
+116B6 .
+116B7 .
+16F51 .
+16F52 .
+16F53 .
+16F54 .
+16F55 .
+16F56 .
+16F57 .
+16F58 .
+16F59 .
+16F5A .
+16F5B .
+16F5C .
+16F5D .
+16F5E .
+16F5F .
+16F60 .
+16F61 .
+16F62 .
+16F63 .
+16F64 .
+16F65 .
+16F66 .
+16F67 .
+16F68 .
+16F69 .
+16F6A .
+16F6B .
+16F6C .
+16F6D .
+16F6E .
+16F6F .
+16F70 .
+16F71 .
+16F72 .
+16F73 .
+16F74 .
+16F75 .
+16F76 .
+16F77 .
+16F78 .
+16F79 .
+16F7A .
+16F7B .
+16F7C .
+16F7D .
+16F7E .
+16F8F .
+16F90 .
+16F91 .
+16F92 .
+1D165 .
+1D166 .
+1D167 .
+1D168 .
+1D169 .
+1D16D .
+1D16E .
+1D16F .
+1D170 .
+1D171 .
+1D172 .
+1D17B .
+1D17C .
+1D17D .
+1D17E .
+1D17F .
+1D180 .
+1D181 .
+1D182 .
+1D185 .
+1D186 .
+1D187 .
+1D188 .
+1D189 .
+1D18A .
+1D18B .
+1D1AA .
+1D1AB .
+1D1AC .
+1D1AD .
+1D242 .
+1D243 .
+1D244 .
+E0100 .
+E0101 .
+E0102 .
+E0103 .
+E0104 .
+E0105 .
+E0106 .
+E0107 .
+E0108 .
+E0109 .
+E010A .
+E010B .
+E010C .
+E010D .
+E010E .
+E010F .
+E0110 .
+E0111 .
+E0112 .
+E0113 .
+E0114 .
+E0115 .
+E0116 .
+E0117 .
+E0118 .
+E0119 .
+E011A .
+E011B .
+E011C .
+E011D .
+E011E .
+E011F .
+E0120 .
+E0121 .
+E0122 .
+E0123 .
+E0124 .
+E0125 .
+E0126 .
+E0127 .
+E0128 .
+E0129 .
+E012A .
+E012B .
+E012C .
+E012D .
+E012E .
+E012F .
+E0130 .
+E0131 .
+E0132 .
+E0133 .
+E0134 .
+E0135 .
+E0136 .
+E0137 .
+E0138 .
+E0139 .
+E013A .
+E013B .
+E013C .
+E013D .
+E013E .
+E013F .
+E0140 .
+E0141 .
+E0142 .
+E0143 .
+E0144 .
+E0145 .
+E0146 .
+E0147 .
+E0148 .
+E0149 .
+E014A .
+E014B .
+E014C .
+E014D .
+E014E .
+E014F .
+E0150 .
+E0151 .
+E0152 .
+E0153 .
+E0154 .
+E0155 .
+E0156 .
+E0157 .
+E0158 .
+E0159 .
+E015A .
+E015B .
+E015C .
+E015D .
+E015E .
+E015F .
+E0160 .
+E0161 .
+E0162 .
+E0163 .
+E0164 .
+E0165 .
+E0166 .
+E0167 .
+E0168 .
+E0169 .
+E016A .
+E016B .
+E016C .
+E016D .
+E016E .
+E016F .
+E0170 .
+E0171 .
+E0172 .
+E0173 .
+E0174 .
+E0175 .
+E0176 .
+E0177 .
+E0178 .
+E0179 .
+E017A .
+E017B .
+E017C .
+E017D .
+E017E .
+E017F .
+E0180 .
+E0181 .
+E0182 .
+E0183 .
+E0184 .
+E0185 .
+E0186 .
+E0187 .
+E0188 .
+E0189 .
+E018A .
+E018B .
+E018C .
+E018D .
+E018E .
+E018F .
+E0190 .
+E0191 .
+E0192 .
+E0193 .
+E0194 .
+E0195 .
+E0196 .
+E0197 .
+E0198 .
+E0199 .
+E019A .
+E019B .
+E019C .
+E019D .
+E019E .
+E019F .
+E01A0 .
+E01A1 .
+E01A2 .
+E01A3 .
+E01A4 .
+E01A5 .
+E01A6 .
+E01A7 .
+E01A8 .
+E01A9 .
+E01AA .
+E01AB .
+E01AC .
+E01AD .
+E01AE .
+E01AF .
+E01B0 .
+E01B1 .
+E01B2 .
+E01B3 .
+E01B4 .
+E01B5 .
+E01B6 .
+E01B7 .
+E01B8 .
+E01B9 .
+E01BA .
+E01BB .
+E01BC .
+E01BD .
+E01BE .
+E01BF .
+E01C0 .
+E01C1 .
+E01C2 .
+E01C3 .
+E01C4 .
+E01C5 .
+E01C6 .
+E01C7 .
+E01C8 .
+E01C9 .
+E01CA .
+E01CB .
+E01CC .
+E01CD .
+E01CE .
+E01CF .
+E01D0 .
+E01D1 .
+E01D2 .
+E01D3 .
+E01D4 .
+E01D5 .
+E01D6 .
+E01D7 .
+E01D8 .
+E01D9 .
+E01DA .
+E01DB .
+E01DC .
+E01DD .
+E01DE .
+E01DF .
+E01E0 .
+E01E1 .
+E01E2 .
+E01E3 .
+E01E4 .
+E01E5 .
+E01E6 .
+E01E7 .
+E01E8 .
+E01E9 .
+E01EA .
+E01EB .
+E01EC .
+E01ED .
+E01EE .
+E01EF .
+{} {} \_relax
+\_def\_tmp #1 #2 {\_lccode"#2="#1 \_uccode"#2="#2 }
+\_tmp 0069 0130
+\_tmp 03B8 03F4
+\_tmp 00DF 1E9E
+\_tmp 03C9 2126
+\_tmp 006B 212A
+\_tmp 00E5 212B
+\_def\_tmp #1 #2 {\_lccode"#1="#1 \_uccode"#1="#2 }
+\_tmp 0131 0049
+\_tmp 017F 0053
+\_tmp 03BC 039C
+\_tmp 03C2 03A3
+\_tmp 03D0 0392
+\_tmp 03D1 0398
+\_tmp 03D5 03A6
+\_tmp 03D6 03A0
+\_tmp 03F0 039A
+\_tmp 03F1 03A1
+\_tmp 03F5 0395
+\_tmp 1E9B 1E60
+\_tmp 1FBE 0399
+% end of file
+\_endcode
+
+All codes in unicode table keep information about pairs lowecase-uppercase
+letters or single letter. We need to read such information and set
+appropriate `\lccode` and `\uccode`. The `\catcode` above the code 127
+is not set, i.\,e.\ the `\catcode`=12 for all codes above 127.
+
+The file `uni-lcuc.opm` does this work. It is not much interesting file, only
+first few lines from 15928 lines in total is shown here.
+
+{\everytt={\typosize[8/10]\_let\_printverbline=\_printcodeline \medskip}\ttline=-1
+\def\docfile{uni-lcuc.opm}
+\verbinput (3-30) uni-lcuc.opm
+\vskip-\medskipamount
+\noindent\typosize[8/]\dots etc. (see {\tt\Brown\docfile})
+}
diff --git a/macros/optex/base/unimath-codes.opm b/macros/optex/base/unimath-codes.opm
new file mode 100644
index 0000000000..6e83ab94ad
--- /dev/null
+++ b/macros/optex/base/unimath-codes.opm
@@ -0,0 +1,439 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \_ncharrmA {Uni math codes <2021-03-11>} % preloaded on demand by \loadmath
+
+ \_doc -----------------------------
+ The control sequences for `\alpha`, `\beta` etc are redefined here.
+ The `\alpha` expands to the character with Unicode `"03B1`, this is a normal
+ character $α$. You can type it directly in your editor if you know how
+ to do this.
+ \_cod -----------------------------
+
+\_umathnumB="0391
+\_greekdef \Alpha \Beta \Gamma \Delta \Epsilon \Zeta \Eta \Theta \Iota \Kappa
+ \Lambda \Mu \Nu \Xi \Omicron \Pi \Rho \varTheta \Sigma \Tau \Upsilon \Phi
+ \Chi \Psi \Omega \_relax
+
+\_umathnumB="03B1
+\_greekdef \alpha \beta \gamma \delta \varepsilon \zeta \eta \theta \iota \kappa
+ \lambda \mu \nu \xi \omicron \pi \rho \varsigma \sigma \tau \upsilon
+ \varphi \chi \psi \omega \vardelta \epsilon \vartheta \varkappa \phi
+ \varrho \varpi \_relax
+
+ \_doc -----------------------------
+ The math alphabets are declared here using the
+ \^`\_umathrange {<range>}<class><family><starting-code>` macro.
+ \_cod -----------------------------
+
+\_chardef\_ncharrmA=`A \_chardef\_ncharrma=`a
+\_chardef\_ncharbfA="1D400 \_chardef\_ncharbfa="1D41A
+\_chardef\_ncharitA="1D434 \_chardef\_ncharita="1D44E
+\_chardef\_ncharbiA="1D468 \_chardef\_ncharbia="1D482
+\_chardef\_ncharclA="1D49C \_chardef\_ncharcla="1D4B6
+\_chardef\_ncharbcA="1D4D0 \_chardef\_ncharbca="1D4EA
+\_chardef\_ncharfrA="1D504 \_chardef\_ncharfra="1D51E
+\_chardef\_ncharbrA="1D56C \_chardef\_ncharbra="1D586
+\_chardef\_ncharbbA="1D538 \_chardef\_ncharbba="1D552
+\_chardef\_ncharsnA="1D5A0 \_chardef\_ncharsna="1D5BA
+\_chardef\_ncharbsA="1D5D4 \_chardef\_ncharbsa="1D5EE
+\_chardef\_ncharsiA="1D608 \_chardef\_ncharsia="1D622
+\_chardef\_ncharsxA="1D63C \_chardef\_ncharsxa="1D656
+\_chardef\_ncharttA="1D670 \_chardef\_nchartta="1D68A
+
+\_protected\_def\_rmvariables {\_umathrange{A-Z}71\_ncharrmA \_umathrange{a-z}71\_ncharrma}
+\_protected\_def\_bfvariables {\_umathrange{A-Z}71\_ncharbfA \_umathrange{a-z}71\_ncharbfa}
+\_protected\_def\_itvariables {\_umathrange{A-Z}71\_ncharitA \_umathrange{a-z}71\_ncharita}
+\_protected\_def\_bivariables {\_umathrange{A-Z}71\_ncharbiA \_umathrange{a-z}71\_ncharbia}
+\_protected\_def\_calvariables {\_umathrange{A-Z}71\_ncharclA \_umathrange{a-z}71\_ncharcla}
+\_protected\_def\_bcalvariables {\_umathrange{A-Z}71\_ncharbcA \_umathrange{a-z}71\_ncharbca}
+\_protected\_def\_frakvariables {\_umathrange{A-Z}71\_ncharfrA \_umathrange{a-z}71\_ncharfra}
+\_protected\_def\_bfrakvariables {\_umathrange{A-Z}71\_ncharbrA \_umathrange{a-z}71\_ncharbra}
+\_protected\_def\_bbvariables {\_umathrange{A-Z}71\_ncharbbA \_umathrange{a-z}71\_ncharbba}
+\_protected\_def\_sansvariables {\_umathrange{A-Z}71\_ncharsnA \_umathrange{a-z}71\_ncharsna}
+\_protected\_def\_bsansvariables {\_umathrange{A-Z}71\_ncharbsA \_umathrange{a-z}71\_ncharbsa}
+\_protected\_def\_isansvariables {\_umathrange{A-Z}71\_ncharsiA \_umathrange{a-z}71\_ncharsia}
+\_protected\_def\_bisansvariables {\_umathrange{A-Z}71\_ncharsxA \_umathrange{a-z}71\_ncharsxa}
+\_protected\_def\_ttvariables {\_umathrange{A-Z}71\_ncharttA \_umathrange{a-z}71\_nchartta}
+
+\_chardef\_greekrmA="0391 \_chardef\_greekrma="03B1
+\_chardef\_greekbfA="1D6A8 \_chardef\_greekbfa="1D6C2
+\_chardef\_greekitA="1D6E2 \_chardef\_greekita="1D6FC
+\_chardef\_greekbiA="1D71C \_chardef\_greekbia="1D736
+\_chardef\_greeksnA="1D756 \_chardef\_greeksna="1D770
+\_chardef\_greeksiA="1D790 \_chardef\_greeksia="1D7AA
+
+\_protected\_def\_itgreek {\_umathrangegreek71\_greekita}
+\_protected\_def\_rmgreek {\_umathrangegreek71\_greekrma}
+\_protected\_def\_bfgreek {\_umathrangegreek71\_greekbfa}
+\_protected\_def\_bigreek {\_umathrangegreek71\_greekbia}
+\_protected\_def\_bsansgreek {\_umathrangegreek71\_greeksna}
+\_protected\_def\_bisansgreek{\_umathrangegreek71\_greeksia}
+\_protected\_def\_itGreek {\_umathrangeGREEK71\_greekitA}
+\_protected\_def\_rmGreek {\_umathrangeGREEK71\_greekrmA}
+\_protected\_def\_bfGreek {\_umathrangeGREEK71\_greekbfA}
+\_protected\_def\_biGreek {\_umathrangeGREEK71\_greekbiA}
+\_protected\_def\_bsansGreek {\_umathrangeGREEK71\_greeksnA}
+\_protected\_def\_bisansGreek{\_umathrangeGREEK71\_greeksiA}
+
+\_chardef\_digitrmO=`0
+\_chardef\_digitbfO="1D7CE
+\_chardef\_digitbbO="1D7D8
+\_chardef\_digitsnO="1D7E2
+\_chardef\_digitbsO="1D7EC
+\_chardef\_digitttO="1D7F6
+
+\_protected\_def\_rmdigits {\_umathrange{0-9}71\_digitrmO}
+\_protected\_def\_bfdigits {\_umathrange{0-9}71\_digitbfO}
+\_protected\_def\_bbdigits {\_umathrange{0-9}71\_digitbbO}
+\_protected\_def\_sansdigits {\_umathrange{0-9}71\_digitsnO}
+\_protected\_def\_bsansdigits {\_umathrange{0-9}71\_digitbsO}
+\_protected\_def\_ttdigits {\_umathrange{0-9}71\_digitttO}
+
+ \_doc -----------------------------
+ The \`\cal`, \`\bbchar`, \`\frak`, \`\script`
+ and
+ the \`\rm`, \`\bf`, \`\it`, \`\bi`, \`\tt` are defined here.
+ Their \"8bit definitions" from the file `math-preload.opm`
+ (section~\ref[math-preload]) are removed.\nl
+ You can redefine them again if you need different behavior (for example
+ you don't want to use sans serif bold in math). What to do:
+ \begtt \advance\hsize by2em
+ \_protected\_def\_bf
+ {\_tryloadbf\_tenbf \_inmath{\_bfvariables\_bfgreek\_bfGreek\_bfdigits}}
+ \_protected\_def\_bi
+ {\_tryloadbi\_tenbi \_inmath{\_bivariables\_bigreek\_bfGreek\_bfdigits}}
+ \_public \bf \bi ;
+ \endtt
+ \`\_inmath` `{<cmds>}` applies `<cmds>` only in math mode.
+ \_cod -----------------------------
+
+\_protected\_def\_inmath#1{\_relax \_ifmmode#1\_fi} % to keep off \loop processing in text mode
+
+% You can redefine these macros to follow your wishes.
+% For example, you need upright lowercase greek letters, you don't need
+% \bf and \bi behave as sans serif in math, ...
+
+\_protected\_def\_rm {\_tryloadrm \_tenrm \_inmath{\_rmvariables \_rmdigits}}
+\_protected\_def\_it {\_tryloadit \_tenit \_inmath{\_itvariables}}
+\_protected\_def\_bf
+ {\_tryloadbf \_tenbf \_inmath{\_bsansvariables \_bsansgreek \_bsansGreek \_bsansdigits}}
+\_protected\_def\_bi
+ {\_tryloadbi \_tenbi \_inmath{\_bisansvariables \_bisansgreek \_bsansGreek \_bsansdigits}}
+\_protected\_def\_tt {\_tryloadtt \_tentt \_inmath{\_ttvariables \_ttdigits}}
+\_protected\_def\_bbchar {\_bbvariables \_bbdigits}
+\_protected\_def\_cal {\_calvariables}
+\_protected\_def\_frak {\_frakvariables}
+\_protected\_def\_misans {\_isansvariables \_sansdigits}
+\_protected\_def\_mbisans {\_bisansvariables \_bisansgreek \_bsansGreek \_bsansdigits}
+\_protected\_def\_script {\_rmvariables \_fam4 }
+\_protected\_def\_mit {\_itvariables \_rmdigits \_itgreek \_rmGreek }
+
+\_public \rm \it \bf \bi \tt \bbchar \cal \frak \misans \mbisans \script \mit ;
+
+ \_doc -----------------------------
+ Each Unicode slot carries information about math type. This is saved in
+ the file `mathclass.txt` which is copied to `mathclass.opm` The file
+ has the following format:
+ {\vitt{mathclass.opm}\verbinput (70-85) mathclass.opm }
+ We have to read this information and convert it to the `\Umathcode`s.
+ \_cod -----------------------------
+
+\_begingroup % \input mathclass.opm (which is a copy of MathClass.txt):
+ \_def\_p#1;#2{\_edef\_tmp{\_pB#2}\_ifx\_tmp\_empty \_else\_pA#1....\_end#2\_fi}
+ \_def\_pA#1..#2..#3\_end#4{%
+ \_ifx\_relax#2\_relax \_pset{"#1}{#4}\_else
+ \_umathnumA="#1
+ \_loop
+ \_pset{\_umathnumA}{#4}%
+ \_ifnum\_umathnumA<"#2 \_advance\_umathnumA by1
+ \_repeat
+ \_fi
+ }
+ \_def\_pB#1{\_if#1L1\_fi \_if#1B2\_fi \_if#1V2\_fi \_if#1R3\_fi \_if#1N0\_fi \_if#1U0\_fi
+ \_if#1F0\_fi \_if#1O4\_fi \_if#1C5\_fi \_if#1P6\_fi \_if#1A7\_fi}
+ \_def\_pset#1#2{\_global\_Umathcode#1=\_tmp\_space 1 #1\_relax
+ \_if#2O\_global\_Udelcode#1=1 #1\_relax\_fi
+ \_if#2C\_global\_Udelcode#1=1 #1\_relax\_fi
+ \_if#2F\_global\_Udelcode#1=1 #1\_relax\_fi
+ }
+ \_catcode`#=14
+ \_everypar={\_setbox0=\_lastbox \_par \_p}
+ \_setbox0=\_vbox{\_input mathclass.opm }
+\_endgroup
+
+ \_doc -----------------------------
+ Each math symbol has its declaration in the file `unicode-math-table.tex`
+ which is copied to `unimath-table.opm`. The file has the following format:
+ {\vitt{unimath-table.opm}\verbinput (70-85) unimath-table.opm }
+ We have to read this information and convert it to the Unicode math codes.
+ \_cod -----------------------------
+
+\_begingroup % \input unimath-table.opm (it is a copy of unicode-math-table.tex):
+ \_def\UnicodeMathSymbol #1#2#3#4{%
+ \_ifnum#1=\_Umathcodenum#1 % the code isn't set by mathclass.opm
+ \_global\_Umathchardef#2=0 1 #1 \_global\_Umathcode#1=0 1 #1
+ \_else \_global\_Umathcharnumdef#2=\_Umathcodenum#1 \_fi
+ \_ifx#3\_mathopen \_gdef#2{\_Udelimiter 4 1 #1 }\_fi
+ \_ifx#3\_mathclose \_gdef#2{\_Udelimiter 5 1 #1 }\_fi
+ \_ifx#3\_mathaccent \_gdef#2{\_Umathaccent fixed 7 1 #1 }\_fi
+ }
+ \_input unimath-table.opm
+\_endgroup
+
+ \_doc -----------------------------
+ Many special characters must be declared with care...
+ \_cod -----------------------------
+
+\_global\_Udelcode`<=1 "027E8 % these characters have different meaning
+\_global\_Udelcode`>=1 "027E9 % as normal and as delimeter
+
+\_mit % default math alphabets setting
+
+% hyphen character is transformed to minus:
+\_Umathcode `- = 2 1 "2212
+
+% mathclass defines : as Punct, plain.tex as Rel, we keep mathclass,
+% i.e. there is difference from plain.tex, you can use $f:A\to B$.
+
+\_let\{=\lbrace \_let\}=\rbrace
+
+% mathclas defines ! as Ord, plain.tex as Close
+\_Umathcode `! = 5 1 `! % keep plain.tex declaration
+\_Umathchardef \mathexclam = 5 1 `!
+% mathclas defines ? as Punct, plain.tex as Close
+\_Umathcode `? = 5 1 `? % keep plain.tex declaration
+\_Umathchardef \mathquestion = 5 1 `?
+
+\_Umathcode `* = 2 1 "02217 % equivalent to \ast, like in plain TeX
+
+\_protected\_def \_sqrt {\_Uradical 1 "0221A }
+\_protected\_def \_cuberoot {\_Uradical 1 "0221B }
+\_protected\_def \_fourthroot {\_Uradical 1 "0221C }
+
+\_public \sqrt \cuberoot \fourthroot ;
+
+\_def\_intwithnolimits#1#2 {\_ifx#1\_relax \_else
+ \_ea\_let\_csname\_csstring#1op\_endcsname=#1%
+ \_ea\_def\_ea #1\_ea{\_csname\_csstring#1op\_endcsname \_nolimits}%
+ \_bgroup \_lccode`\~=#2 \_lowercase{\_egroup \_mathcode`~="8000 \_let ~=#1}%
+ \_ea \_intwithnolimits \_fi
+}
+\_intwithnolimits \int "0222B \iint "0222C \iiint "0222D
+ \oint "0222E \oiint "0222F \oiiint "02230
+ \intclockwise "02231 \varointclockwise "02232 \ointctrclockwise "02233
+ \sumint "02A0B \iiiint "02A0C \intbar "02A0D \intBar "02A0E \fint "02A0F
+ \pointint "02A15 \sqint "02A16 \intlarhk "02A17 \intx "02A18
+ \intcap "02A19 \intcup "02A1A \upint "02A1B \lowint "02A1C \_relax "0
+
+\_protected\_def \vert {\_Udelimiter 0 1 "07C }
+\_protected\_def \Vert {\_Udelimiter 0 1 "02016 }
+\_protected\_def \Vvert {\_Udelimiter 0 1 "02980 }
+
+\_protected\_def \_overbrace #1{\mathop {\Umathaccent 7 1 "023DE{#1}}\limits}
+\_protected\_def \_underbrace #1{\mathop {\Umathaccent bottom 7 1 "023DF{#1}}\limits}
+\_protected\_def \_overparen #1{\mathop {\Umathaccent 7 1 "023DC{#1}}\limits}
+\_protected\_def \_underparen #1{\mathop {\Umathaccent bottom 7 1 "023DD{#1}}\limits}
+\_protected\_def \_overbracket #1{\mathop {\Umathaccent 7 1 "023B4{#1}}\limits}
+\_protected\_def \_underbracket #1{\mathop {\Umathaccent bottom 7 1 "023B5{#1}}\limits}
+
+\_public \overbrace \underbrace \overparen \underparen \overbracket \underbracket ;
+
+\_protected\def \widehat {\Umathaccent 7 1 "00302 }
+\_protected\def \widetilde {\Umathaccent 7 1 "00303 }
+\_protected\def \overleftharpoon {\Umathaccent 7 1 "020D0 }
+\_protected\def \overrightharpoon {\Umathaccent 7 1 "020D1 }
+\_protected\def \overleftarrow {\Umathaccent 7 1 "020D6 }
+\_protected\def \overrightarrow {\Umathaccent 7 1 "020D7 }
+\_protected\def \overleftrightarrow {\Umathaccent 7 1 "020E1 }
+
+\_mathchardef\ldotp="612E
+\_let\|=\Vert
+\_mathcode`\_="8000
+
+\_global\_Umathcode "22EF = 0 1 "22EF % mathclass says that it is Rel
+\_global\_Umathcode "002E = 0 1 "002E % mathclass says that dot is Punct
+\_global\_Umathchardef \unicodecdots = 0 1 "22EF
+
+\_global\_Umathcode `/ = 0 1 `/ % mathclass says that / is Bin, Plain TeX says that it is Ord.
+
+% compressed dots in S and SS styles (usable in \matrix when it is in T, S and SS style)
+\_protected\_def \vdots {\_relax \_ifnum \_mathstyle>3 \_unicodevdots \_else \_vdots \_fi}
+\_protected\_def \ddots {\_relax \_ifnum \_mathstyle>3 \_unicodeddots \_else \_ddots \_fi}
+\_protected\_def \adots {\_relax \_ifnum \_mathstyle>3 \_unicodeadots \_else \_adots \_fi}
+
+% Unicode superscripts (²) and subscripts as simple macros with \mathcode"8000
+\_bgroup
+ \_def\_tmp#1#2{\_global\_mathcode#1="8000 \_lccode`\~=#1 \_lowercase{\_gdef~}{#2}}
+ \_fornum 0..1 \_do {\_tmp{"207#1}{{^#1}}}
+ \_tmp{"B2}{{^2}}\_tmp{"B3}{{^3}}
+ \_fornum 4..9 \_do {\_tmp{"207#1}{{^#1}}}
+ \_fornum 0..9 \_do {\_tmp{"208#1}{{_#1}}}
+\_egroup
+
+ \_doc -----------------------------
+ Aliases are declared here. They are names not mentioned in the `unimath-table.opm` file
+ but commonly used in \TeX.
+ \_cod -----------------------------
+
+\_let \setminus=\smallsetminus
+\_let \diamond=\smwhtdiamond
+\_let \colon=\mathcolon
+\_let \bullet=\smblkcircle
+\_let \circ=\vysmwhtcircle
+\_let \bigcirc=\mdlgwhtcircle
+\_let \to=\rightarrow
+\_let \le=\leq
+\_let \ge=\geq
+\_let \neq=\ne
+\_protected\_def \triangle {\mathord{\bigtriangleup}}
+\_let \emptyset=\varnothing
+\_let \hbar=\hslash
+\_let \land=\wedge
+\_let \lor=\vee
+\_let \owns=\ni
+\_let \gets=\leftarrow
+\_let \mathring=\ocirc
+\_let \lnot=\neg
+\_let \longdivisionsign=\longdivision
+\_let \backepsilon=\upbackepsilon
+\_let \eth=\matheth
+\_let \dbkarow=\dbkarrow
+\_let \drbkarow=\drbkarrow
+\_let \hksearow=\hksearrow
+\_let \hkswarow=\hkswarrow
+
+\_let \upalpha=\mupalpha
+\_let \upbeta=\mupbeta
+\_let \upgamma=\mupgamma
+\_let \updelta=\mupdelta
+\_let \upepsilon=\mupvarepsilon
+\_let \upvarepsilon=\mupvarepsilon
+\_let \upzeta=\mupzeta
+\_let \upeta=\mupeta
+\_let \uptheta=\muptheta
+\_let \upiota=\mupiota
+\_let \upkappa=\mupkappa
+\_let \uplambda=\muplambda
+\_let \upmu=\mupmu
+\_let \upnu=\mupnu
+\_let \upxi=\mupxi
+\_let \upomicron=\mupomicron
+\_let \uppi=\muppi
+\_let \uprho=\muprho
+\_let \upvarrho=\mupvarrho
+\_let \upvarsigma=\mupvarsigma
+\_let \upsigma=\mupsigma
+\_let \uptau=\muptau
+\_let \upupsilon=\mupupsilon
+\_let \upvarphi=\mupvarphi
+\_let \upchi=\mupchi
+\_let \uppsi=\muppsi
+\_let \upomega=\mupomega
+\_let \upvartheta=\mupvartheta
+\_let \upphi=\mupphi
+\_let \upvarpi=\mupvarpi
+
+ \_doc -----------------------------
+ The \`\not` macro is redefined here. If the `\_not!<char>` is defined
+ (by \`\_negationof`)
+ then this macro is used. Else centered / is printed over the <char>.
+ \_cod -----------------------------
+
+\_protected\_def\_not#1{%
+ \_trycs{_not!\_csstring#1}{\_mathrel\_mathstyles{%
+ \_setbox0=\_hbox{\_math$\_currstyle#1$}%
+ \_hbox to\_wd0{\_hss$\_currstyle/$\_hss}\_kern-\_wd0 \_box0
+}}}
+\_def\_negationof #1#2{\_ea\_let \_csname _not!\_csstring#1\_endcsname =#2}
+
+\_negationof = \neq
+\_negationof < \nless
+\_negationof > \ngtr
+\_negationof \gets \nleftarrow
+\_negationof \simeq \nsime
+\_negationof \equal \ne
+\_negationof \le \nleq
+\_negationof \ge \ngeq
+\_negationof \greater \ngtr
+\_negationof \forksnot \forks
+\_negationof \in \notin
+\_negationof \mid \nmid
+\_negationof \cong \ncong
+\_negationof \leftarrow \nleftarrow
+\_negationof \rightarrow \nrightarrow
+\_negationof \leftrightarrow \nleftrightarrow
+\_negationof \Leftarrow \nLeftarrow
+\_negationof \Leftrightarrow \nLeftrightarrow
+\_negationof \Rightarrow \nRightarrow
+\_negationof \exists \nexists
+\_negationof \ni \nni
+\_negationof \paralel \nparalel
+\_negationof \sim \nsim
+\_negationof \approx \napprox
+\_negationof \equiv \nequiv
+\_negationof \asymp \nasymp
+\_negationof \lesssim \nlesssim
+\_negationof \ngtrsim \ngtrsim
+\_negationof \lessgtr \nlessgtr
+\_negationof \gtrless \ngtrless
+\_negationof \prec \nprec
+\_negationof \succ \nsucc
+\_negationof \subset \nsubset
+\_negationof \supset \nsupset
+\_negationof \subseteq \nsubseteq
+\_negationof \supseteq \nsupseteq
+\_negationof \vdash \nvdash
+\_negationof \vDash \nvDash
+\_negationof \Vdash \nVdash
+\_negationof \VDash \nVDash
+\_negationof \preccurlyeq \npreccurlyeq
+\_negationof \succcurlyeq \nsucccurlyeq
+\_negationof \sqsubseteq \nsqsubseteq
+\_negationof \sqsupseteq \nsqsupseteq
+\_negationof \vartriangleleft \nvartriangleleft
+\_negationof \vartriangleright \nvartriangleright
+\_negationof \trianglelefteq \ntrianglelefteq
+\_negationof \trianglerighteq \ntrianglerighteq
+\_negationof \vinfty \nvinfty
+
+\_public \not ;
+
+ \_doc -----------------------------
+ Newly declared public control sequences are used in internal macros by
+ \OpTeX/. We need to get new meanings for these control sequences in
+ the private namespace.
+ \_cod -----------------------------
+
+\_private
+ \ldotp \cdotp \bullet \triangleleft \trianglerigt \mapstochar \rightarrow
+ \prime \lhook \rightarrow \leftarrow \rhook \triangleright \triangleleft
+ \Relbar \Rightarrow \relbar \rightarrow \Leftarrow \mapstochar
+ \longrightarrow \Longleftrightarrow \unicodevdots \unicodeddots \unicodeadots ;
+
+\_endcode
+
+\secc More Unicode-math examples
+
+Example of using additional math font is in section 5.3 in the
+\ulink[http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf]{\tt optex-math.pdf} documentation
+
+You can combine more Unicode math fonts in single formula simply
+by the `\addUmathfont` macro, see
+\ulink[http://petr.olsak.net/optex/optex-tricks.html#addumathfont]{\OpTeX/ trick 0030}.
+
+See \url{http://tex.stackexchange.com/questions/308749}
+for technical details about Unicode-math.
+
+\_endinput
+
+History:
+2021-03-11 Umathcode `* declaed as \ast
+2021-02-03 Unicode superscripts, subscripts declared
+2021-01-31 Mathcode of ! ? set to Close, codes undeclared in mathclass set correctly
+2021-01-23 Compressed \vdots, \ddots, \adots in script(script)style.
+2020-11-13 Bug fix: \colon declared
+2020-06-13 Umathcode of / declared as in Plain TeX
+2020-06-07 \_itgreek \_itGreek, \_rmgreek \_rmGreek etc. introduced, names changed
+2020-06-03 \not\mid = \nmid added, \not corrected
+2020-04-30 Bug fix: \phi, \varpi etc. were bad encoded
+2020-04-09 Bug fix: \Udelcode`<, \Udelcode`> added
diff --git a/macros/optex/base/unimath-table.opm b/macros/optex/base/unimath-table.opm
new file mode 100644
index 0000000000..252c1fc26a
--- /dev/null
+++ b/macros/optex/base/unimath-table.opm
@@ -0,0 +1,2471 @@
+%%^^A%% unicode-math-table.tex -- part of UNICODE-MATH <wspr.io/unicode-math>
+%%^^A%% Source file of the math symbols.
+
+% Only \ddots, \adots and \vdots are called differently:
+% \unicodeddots, \unicodeadots and \unicodevdots
+% \mathquestion: Ord -> Close (because plain.tex declares it as Close)
+
+\UnicodeMathSymbol{"00021}{\mathexclam }{\mathclose}{exclamation mark}%
+\UnicodeMathSymbol{"00023}{\mathoctothorpe }{\mathord}{number sign}%
+\UnicodeMathSymbol{"00024}{\mathdollar }{\mathord}{dollar sign}%
+\UnicodeMathSymbol{"00025}{\mathpercent }{\mathord}{percent sign}%
+\UnicodeMathSymbol{"00026}{\mathampersand }{\mathord}{ampersand}%
+\UnicodeMathSymbol{"00028}{\lparen }{\mathopen}{left parenthesis}%
+\UnicodeMathSymbol{"00029}{\rparen }{\mathclose}{right parenthesis}%
+\UnicodeMathSymbol{"0002B}{\mathplus }{\mathbin}{plus sign b:}%
+\UnicodeMathSymbol{"0002C}{\mathcomma }{\mathpunct}{comma}%
+\UnicodeMathSymbol{"0002E}{\mathperiod }{\mathord}{full stop, period}%
+\UnicodeMathSymbol{"0002F}{\mathslash }{\mathord}{solidus}%
+\UnicodeMathSymbol{"0003A}{\mathcolon }{\mathpunct}{colon}%
+\UnicodeMathSymbol{"0003B}{\mathsemicolon }{\mathpunct}{semicolon p:}%
+\UnicodeMathSymbol{"0003C}{\less }{\mathrel}{less-than sign r:}%
+\UnicodeMathSymbol{"0003D}{\equal }{\mathrel}{equals sign r:}%
+\UnicodeMathSymbol{"0003E}{\greater }{\mathrel}{greater-than sign r:}%
+\UnicodeMathSymbol{"0003F}{\mathquestion }{\mathclose}{question mark}%
+\UnicodeMathSymbol{"00040}{\mathatsign }{\mathord}{commercial at}%
+\UnicodeMathSymbol{"0005B}{\lbrack }{\mathopen}{left square bracket}%
+\UnicodeMathSymbol{"0005C}{\backslash }{\mathord}{reverse solidus}%
+\UnicodeMathSymbol{"0005D}{\rbrack }{\mathclose}{right square bracket}%
+\UnicodeMathSymbol{"0007B}{\lbrace }{\mathopen}{left curly bracket}%
+\UnicodeMathSymbol{"0007C}{\vert }{\mathfence}{vertical bar}%
+\UnicodeMathSymbol{"0007D}{\rbrace }{\mathclose}{right curly bracket}%
+\UnicodeMathSymbol{"000A3}{\mathsterling }{\mathord}{pound sign}%
+\UnicodeMathSymbol{"000A5}{\mathyen }{\mathord}{yen sign}%
+\UnicodeMathSymbol{"000A7}{\mathsection }{\mathord}{section symbol}%
+\UnicodeMathSymbol{"000AC}{\neg }{\mathord}{/neg /lnot not sign}%
+\UnicodeMathSymbol{"000B1}{\pm }{\mathbin}{plus-or-minus sign}%
+\UnicodeMathSymbol{"000B6}{\mathparagraph }{\mathord}{paragraph symbol}%
+\UnicodeMathSymbol{"000B7}{\cdotp }{\mathbin}{/centerdot b: middle dot}%
+\UnicodeMathSymbol{"000D7}{\times }{\mathbin}{multiply sign}%
+\UnicodeMathSymbol{"000F0}{\matheth }{\mathalpha}{eth}%
+\UnicodeMathSymbol{"000F7}{\div }{\mathbin}{divide sign}%
+\UnicodeMathSymbol{"001B5}{\Zbar }{\mathord}{impedance (latin capital letter z with stroke)}%
+\UnicodeMathSymbol{"00300}{\grave }{\mathaccent}{grave accent}%
+\UnicodeMathSymbol{"00301}{\acute }{\mathaccent}{acute accent}%
+\UnicodeMathSymbol{"00302}{\hat }{\mathaccent}{circumflex accent}%
+\UnicodeMathSymbol{"00302}{\widehat }{\mathaccentwide}{circumflex accent}%
+\UnicodeMathSymbol{"00303}{\tilde }{\mathaccent}{tilde}%
+\UnicodeMathSymbol{"00303}{\widetilde }{\mathaccentwide}{tilde}%
+\UnicodeMathSymbol{"00304}{\bar }{\mathaccent}{macron}%
+\UnicodeMathSymbol{"00305}{\overbar }{\mathaccent}{overbar embellishment}%
+\UnicodeMathSymbol{"00305}{\wideoverbar }{\mathaccentwide}{stretchy overbar embellishment}%
+\UnicodeMathSymbol{"00306}{\breve }{\mathaccent}{breve}%
+\UnicodeMathSymbol{"00306}{\widebreve }{\mathaccentwide}{stretchy breve}%
+\UnicodeMathSymbol{"00307}{\dot }{\mathaccent}{dot above}%
+\UnicodeMathSymbol{"00308}{\ddot }{\mathaccent}{dieresis}%
+\UnicodeMathSymbol{"00309}{\ovhook }{\mathaccent}{combining hook above}%
+\UnicodeMathSymbol{"0030A}{\ocirc }{\mathaccent}{ring}%
+\UnicodeMathSymbol{"0030C}{\check }{\mathaccent}{caron}%
+\UnicodeMathSymbol{"0030C}{\widecheck }{\mathaccentwide}{stretchy caron}%
+\UnicodeMathSymbol{"00310}{\candra }{\mathaccent}{candrabindu (non-spacing)}%
+\UnicodeMathSymbol{"00312}{\oturnedcomma }{\mathaccent}{combining turned comma above}%
+\UnicodeMathSymbol{"00315}{\ocommatopright }{\mathaccent}{combining comma above right}%
+\UnicodeMathSymbol{"0031A}{\droang }{\mathaccent}{left angle above (non-spacing)}%
+\UnicodeMathSymbol{"00330}{\wideutilde }{\mathbotaccentwide}{under tilde accent (multiple characters and non-spacing)}%
+\UnicodeMathSymbol{"00332}{\mathunderbar }{\mathbotaccentwide}{combining low line}%
+\UnicodeMathSymbol{"00338}{\notaccent }{\mathaccentoverlay}{combining long solidus overlay}%
+\UnicodeMathSymbol{"0034D}{\underleftrightarrow }{\mathbotaccentwide}{underleftrightarrow accent}%
+\UnicodeMathSymbol{"00391}{\mupAlpha }{\mathalpha}{capital alpha, greek}%
+\UnicodeMathSymbol{"00392}{\mupBeta }{\mathalpha}{capital beta, greek}%
+\UnicodeMathSymbol{"00393}{\mupGamma }{\mathalpha}{capital gamma, greek}%
+\UnicodeMathSymbol{"00394}{\mupDelta }{\mathalpha}{capital delta, greek}%
+\UnicodeMathSymbol{"00395}{\mupEpsilon }{\mathalpha}{capital epsilon, greek}%
+\UnicodeMathSymbol{"00396}{\mupZeta }{\mathalpha}{capital zeta, greek}%
+\UnicodeMathSymbol{"00397}{\mupEta }{\mathalpha}{capital eta, greek}%
+\UnicodeMathSymbol{"00398}{\mupTheta }{\mathalpha}{capital theta, greek}%
+\UnicodeMathSymbol{"00399}{\mupIota }{\mathalpha}{capital iota, greek}%
+\UnicodeMathSymbol{"0039A}{\mupKappa }{\mathalpha}{capital kappa, greek}%
+\UnicodeMathSymbol{"0039B}{\mupLambda }{\mathalpha}{capital lambda, greek}%
+\UnicodeMathSymbol{"0039C}{\mupMu }{\mathalpha}{capital mu, greek}%
+\UnicodeMathSymbol{"0039D}{\mupNu }{\mathalpha}{capital nu, greek}%
+\UnicodeMathSymbol{"0039E}{\mupXi }{\mathalpha}{capital xi, greek}%
+\UnicodeMathSymbol{"0039F}{\mupOmicron }{\mathalpha}{capital omicron, greek}%
+\UnicodeMathSymbol{"003A0}{\mupPi }{\mathalpha}{capital pi, greek}%
+\UnicodeMathSymbol{"003A1}{\mupRho }{\mathalpha}{capital rho, greek}%
+\UnicodeMathSymbol{"003A3}{\mupSigma }{\mathalpha}{capital sigma, greek}%
+\UnicodeMathSymbol{"003A4}{\mupTau }{\mathalpha}{capital tau, greek}%
+\UnicodeMathSymbol{"003A5}{\mupUpsilon }{\mathalpha}{capital upsilon, greek}%
+\UnicodeMathSymbol{"003A6}{\mupPhi }{\mathalpha}{capital phi, greek}%
+\UnicodeMathSymbol{"003A7}{\mupChi }{\mathalpha}{capital chi, greek}%
+\UnicodeMathSymbol{"003A8}{\mupPsi }{\mathalpha}{capital psi, greek}%
+\UnicodeMathSymbol{"003A9}{\mupOmega }{\mathalpha}{capital omega, greek}%
+\UnicodeMathSymbol{"003B1}{\mupalpha }{\mathalpha}{small alpha, greek}%
+\UnicodeMathSymbol{"003B2}{\mupbeta }{\mathalpha}{small beta, greek}%
+\UnicodeMathSymbol{"003B3}{\mupgamma }{\mathalpha}{small gamma, greek}%
+\UnicodeMathSymbol{"003B4}{\mupdelta }{\mathalpha}{small delta, greek}%
+\UnicodeMathSymbol{"003B5}{\mupvarepsilon }{\mathalpha}{rounded small varepsilon, greek}%
+\UnicodeMathSymbol{"003B6}{\mupzeta }{\mathalpha}{small zeta, greek}%
+\UnicodeMathSymbol{"003B7}{\mupeta }{\mathalpha}{small eta, greek}%
+\UnicodeMathSymbol{"003B8}{\muptheta }{\mathalpha}{straight theta, small theta, greek}%
+\UnicodeMathSymbol{"003B9}{\mupiota }{\mathalpha}{small iota, greek}%
+\UnicodeMathSymbol{"003BA}{\mupkappa }{\mathalpha}{small kappa, greek}%
+\UnicodeMathSymbol{"003BB}{\muplambda }{\mathalpha}{small lambda, greek}%
+\UnicodeMathSymbol{"003BC}{\mupmu }{\mathalpha}{small mu, greek}%
+\UnicodeMathSymbol{"003BD}{\mupnu }{\mathalpha}{small nu, greek}%
+\UnicodeMathSymbol{"003BE}{\mupxi }{\mathalpha}{small xi, greek}%
+\UnicodeMathSymbol{"003BF}{\mupomicron }{\mathalpha}{small omicron, greek}%
+\UnicodeMathSymbol{"003C0}{\muppi }{\mathalpha}{small pi, greek}%
+\UnicodeMathSymbol{"003C1}{\muprho }{\mathalpha}{small rho, greek}%
+\UnicodeMathSymbol{"003C2}{\mupvarsigma }{\mathalpha}{terminal sigma, greek}%
+\UnicodeMathSymbol{"003C3}{\mupsigma }{\mathalpha}{small sigma, greek}%
+\UnicodeMathSymbol{"003C4}{\muptau }{\mathalpha}{small tau, greek}%
+\UnicodeMathSymbol{"003C5}{\mupupsilon }{\mathalpha}{small upsilon, greek}%
+\UnicodeMathSymbol{"003C6}{\mupvarphi }{\mathalpha}{curly or open small phi, greek}%
+\UnicodeMathSymbol{"003C7}{\mupchi }{\mathalpha}{small chi, greek}%
+\UnicodeMathSymbol{"003C8}{\muppsi }{\mathalpha}{small psi, greek}%
+\UnicodeMathSymbol{"003C9}{\mupomega }{\mathalpha}{small omega, greek}%
+\UnicodeMathSymbol{"003D1}{\mupvartheta }{\mathalpha}{/vartheta - curly or open theta}%
+\UnicodeMathSymbol{"003D5}{\mupphi }{\mathalpha}{/straightphi - small phi, greek}%
+\UnicodeMathSymbol{"003D6}{\mupvarpi }{\mathalpha}{rounded small pi (pomega), greek}%
+\UnicodeMathSymbol{"003DC}{\upDigamma }{\mathalpha}{capital digamma}%
+\UnicodeMathSymbol{"003DD}{\updigamma }{\mathalpha}{old greek small letter digamma}%
+\UnicodeMathSymbol{"003F0}{\mupvarkappa }{\mathalpha}{rounded small kappa, greek}%
+\UnicodeMathSymbol{"003F1}{\mupvarrho }{\mathalpha}{rounded small rho, greek}%
+\UnicodeMathSymbol{"003F4}{\mupvarTheta }{\mathalpha}{greek capital theta symbol}%
+\UnicodeMathSymbol{"003F5}{\mupepsilon }{\mathalpha}{greek lunate varepsilon symbol}%
+\UnicodeMathSymbol{"003F6}{\upbackepsilon }{\mathord}{greek reversed lunate epsilon symbol}%
+\UnicodeMathSymbol{"02010}{\mathhyphen }{\mathalpha}{hyphen}%
+\UnicodeMathSymbol{"02015}{\horizbar }{\mathord}{horizontal bar}%
+\UnicodeMathSymbol{"02016}{\Vert }{\mathfence}{double vertical bar}%
+\UnicodeMathSymbol{"02017}{\twolowline }{\mathord}{double low line (spacing)}%
+\UnicodeMathSymbol{"02020}{\dagger }{\mathbin}{dagger relation}%
+\UnicodeMathSymbol{"02021}{\ddagger }{\mathbin}{double dagger relation}%
+\UnicodeMathSymbol{"02022}{\smblkcircle }{\mathbin}{/bullet b: round bullet, filled}%
+\UnicodeMathSymbol{"02025}{\enleadertwodots }{\mathord}{double baseline dot (en leader)}%
+\UnicodeMathSymbol{"02026}{\unicodeellipsis }{\mathord}{ellipsis (horizontal)}%
+\UnicodeMathSymbol{"02032}{\prime }{\mathord}{prime or minute, not superscripted}%
+\UnicodeMathSymbol{"02033}{\dprime }{\mathord}{double prime or second, not superscripted}%
+\UnicodeMathSymbol{"02034}{\trprime }{\mathord}{triple prime (not superscripted)}%
+\UnicodeMathSymbol{"02035}{\backprime }{\mathord}{reverse prime, not superscripted}%
+\UnicodeMathSymbol{"02036}{\backdprime }{\mathord}{double reverse prime, not superscripted}%
+\UnicodeMathSymbol{"02037}{\backtrprime }{\mathord}{triple reverse prime, not superscripted}%
+\UnicodeMathSymbol{"02038}{\caretinsert }{\mathord}{caret (insertion mark)}%
+\UnicodeMathSymbol{"0203C}{\Exclam }{\mathord}{double exclamation mark}%
+\UnicodeMathSymbol{"02040}{\tieconcat }{\mathbin}{character tie, z notation sequence concatenation}%
+\UnicodeMathSymbol{"02043}{\hyphenbullet }{\mathord}{rectangle, filled (hyphen bullet)}%
+\UnicodeMathSymbol{"02044}{\fracslash }{\mathbin}{fraction slash}%
+\UnicodeMathSymbol{"02047}{\Question }{\mathord}{double question mark}%
+\UnicodeMathSymbol{"02050}{\closure }{\mathrel}{close up}%
+\UnicodeMathSymbol{"02057}{\qprime }{\mathord}{quadruple prime, not superscripted}%
+\UnicodeMathSymbol{"020AC}{\euro }{\mathord}{euro sign}%
+\UnicodeMathSymbol{"020D0}{\leftharpoonaccent }{\mathaccent}{combining left harpoon above}%
+\UnicodeMathSymbol{"020D0}{\overleftharpoon }{\mathaccentwide}{combining left harpoon above}%
+\UnicodeMathSymbol{"020D1}{\rightharpoonaccent }{\mathaccent}{combining right harpoon above}%
+\UnicodeMathSymbol{"020D1}{\overrightharpoon }{\mathaccentwide}{combining right harpoon above}%
+\UnicodeMathSymbol{"020D2}{\vertoverlay }{\mathaccent}{combining long vertical line overlay}%
+\UnicodeMathSymbol{"020D6}{\overleftarrow }{\mathaccentwide}{combining left arrow above}%
+\UnicodeMathSymbol{"020D7}{\overrightarrow }{\mathaccentwide}{combining left arrow above}%
+\UnicodeMathSymbol{"020D7}{\vec }{\mathaccent}{combining right arrow above}%
+\UnicodeMathSymbol{"020DB}{\dddot }{\mathaccent}{combining three dots above}%
+\UnicodeMathSymbol{"020DC}{\ddddot }{\mathaccent}{combining four dots above}%
+\UnicodeMathSymbol{"020DD}{\enclosecircle }{\mathord}{combining enclosing circle}%
+\UnicodeMathSymbol{"020DE}{\enclosesquare }{\mathord}{combining enclosing square}%
+\UnicodeMathSymbol{"020DF}{\enclosediamond }{\mathord}{combining enclosing diamond}%
+\UnicodeMathSymbol{"020E1}{\overleftrightarrow }{\mathaccentwide}{combining left right arrow above}%
+\UnicodeMathSymbol{"020E4}{\enclosetriangle }{\mathord}{combining enclosing upward pointing triangle}%
+\UnicodeMathSymbol{"020E7}{\annuity }{\mathaccent}{combining annuity symbol}%
+\UnicodeMathSymbol{"020E8}{\threeunderdot }{\mathbotaccent}{combining triple underdot}%
+\UnicodeMathSymbol{"020E9}{\widebridgeabove }{\mathaccent}{combining wide bridge above}%
+\UnicodeMathSymbol{"020EC}{\underrightharpoondown }{\mathbotaccentwide}{combining rightwards harpoon with barb downwards}%
+\UnicodeMathSymbol{"020ED}{\underleftharpoondown }{\mathbotaccentwide}{combining leftwards harpoon with barb downwards}%
+\UnicodeMathSymbol{"020EE}{\underleftarrow }{\mathbotaccentwide}{combining left arrow below}%
+\UnicodeMathSymbol{"020EF}{\underrightarrow }{\mathbotaccentwide}{combining right arrow below}%
+\UnicodeMathSymbol{"020F0}{\asteraccent }{\mathaccent}{combining asterisk above}%
+\UnicodeMathSymbol{"02102}{\BbbC }{\mathalpha}{/bbb c, open face c}%
+\UnicodeMathSymbol{"02107}{\Eulerconst }{\mathord}{euler constant}%
+\UnicodeMathSymbol{"0210A}{\mscrg }{\mathalpha}{/scr g, script letter g}%
+\UnicodeMathSymbol{"0210B}{\mscrH }{\mathalpha}{hamiltonian (script capital h)}%
+\UnicodeMathSymbol{"0210C}{\mfrakH }{\mathalpha}{/frak h, upper case h}%
+\UnicodeMathSymbol{"0210D}{\BbbH }{\mathalpha}{/bbb h, open face h}%
+\UnicodeMathSymbol{"0210E}{\Planckconst }{\mathord}{planck constant}%
+\UnicodeMathSymbol{"0210F}{\hslash }{\mathalpha}{/hslash - variant planck's over 2pi}%
+\UnicodeMathSymbol{"02110}{\mscrI }{\mathalpha}{/scr i, script letter i}%
+\UnicodeMathSymbol{"02111}{\Im }{\mathalpha}{imaginary part}%
+\UnicodeMathSymbol{"02112}{\mscrL }{\mathalpha}{lagrangian (script capital l)}%
+\UnicodeMathSymbol{"02113}{\ell }{\mathalpha}{cursive small l}%
+\UnicodeMathSymbol{"02115}{\BbbN }{\mathalpha}{/bbb n, open face n}%
+\UnicodeMathSymbol{"02118}{\wp }{\mathalpha}{weierstrass p}%
+\UnicodeMathSymbol{"02119}{\BbbP }{\mathalpha}{/bbb p, open face p}%
+\UnicodeMathSymbol{"0211A}{\BbbQ }{\mathalpha}{/bbb q, open face q}%
+\UnicodeMathSymbol{"0211B}{\mscrR }{\mathalpha}{/scr r, script letter r}%
+\UnicodeMathSymbol{"0211C}{\Re }{\mathalpha}{real part}%
+\UnicodeMathSymbol{"0211D}{\BbbR }{\mathalpha}{/bbb r, open face r}%
+\UnicodeMathSymbol{"02124}{\BbbZ }{\mathalpha}{/bbb z, open face z}%
+\UnicodeMathSymbol{"02127}{\mho }{\mathord}{conductance}%
+\UnicodeMathSymbol{"02128}{\mfrakZ }{\mathalpha}{/frak z, upper case z}%
+\UnicodeMathSymbol{"02129}{\turnediota }{\mathalpha}{turned iota}%
+\UnicodeMathSymbol{"0212B}{\Angstrom }{\mathalpha}{angstrom capital a, ring}%
+\UnicodeMathSymbol{"0212C}{\mscrB }{\mathalpha}{bernoulli function (script capital b)}%
+\UnicodeMathSymbol{"0212D}{\mfrakC }{\mathalpha}{black-letter capital c}%
+\UnicodeMathSymbol{"0212F}{\mscre }{\mathalpha}{/scr e, script letter e}%
+\UnicodeMathSymbol{"02130}{\mscrE }{\mathalpha}{/scr e, script letter e}%
+\UnicodeMathSymbol{"02131}{\mscrF }{\mathalpha}{/scr f, script letter f}%
+\UnicodeMathSymbol{"02132}{\Finv }{\mathord}{turned capital f}%
+\UnicodeMathSymbol{"02133}{\mscrM }{\mathalpha}{physics m-matrix (script capital m)}%
+\UnicodeMathSymbol{"02134}{\mscro }{\mathalpha}{order of (script small o)}%
+\UnicodeMathSymbol{"02135}{\aleph }{\mathalpha}{aleph, hebrew}%
+\UnicodeMathSymbol{"02136}{\beth }{\mathalpha}{beth, hebrew}%
+\UnicodeMathSymbol{"02137}{\gimel }{\mathalpha}{gimel, hebrew}%
+\UnicodeMathSymbol{"02138}{\daleth }{\mathalpha}{daleth, hebrew}%
+\UnicodeMathSymbol{"0213C}{\Bbbpi }{\mathord}{double-struck small pi}%
+\UnicodeMathSymbol{"0213D}{\Bbbgamma }{\mathalpha}{double-struck small gamma}%
+\UnicodeMathSymbol{"0213E}{\BbbGamma }{\mathalpha}{double-struck capital gamma}%
+\UnicodeMathSymbol{"0213F}{\BbbPi }{\mathalpha}{double-struck capital pi}%
+\UnicodeMathSymbol{"02140}{\Bbbsum }{\mathop}{double-struck n-ary summation}%
+\UnicodeMathSymbol{"02141}{\Game }{\mathord}{turned sans-serif capital g}%
+\UnicodeMathSymbol{"02142}{\sansLturned }{\mathord}{turned sans-serif capital l}%
+\UnicodeMathSymbol{"02143}{\sansLmirrored }{\mathord}{reversed sans-serif capital l}%
+\UnicodeMathSymbol{"02144}{\Yup }{\mathord}{turned sans-serif capital y}%
+\UnicodeMathSymbol{"02145}{\mitBbbD }{\mathord}{double-struck italic capital d}%
+\UnicodeMathSymbol{"02146}{\mitBbbd }{\mathord}{double-struck italic small d}%
+\UnicodeMathSymbol{"02147}{\mitBbbe }{\mathord}{double-struck italic small e}%
+\UnicodeMathSymbol{"02148}{\mitBbbi }{\mathord}{double-struck italic small i}%
+\UnicodeMathSymbol{"02149}{\mitBbbj }{\mathord}{double-struck italic small j}%
+\UnicodeMathSymbol{"0214A}{\PropertyLine }{\mathord}{property line}%
+\UnicodeMathSymbol{"0214B}{\upand }{\mathbin}{turned ampersand}%
+\UnicodeMathSymbol{"02190}{\leftarrow }{\mathrel}{/leftarrow /gets a: leftward arrow}%
+\UnicodeMathSymbol{"02191}{\uparrow }{\mathrel}{upward arrow}%
+\UnicodeMathSymbol{"02192}{\rightarrow }{\mathrel}{/rightarrow /to a: rightward arrow}%
+\UnicodeMathSymbol{"02193}{\downarrow }{\mathrel}{downward arrow}%
+\UnicodeMathSymbol{"02194}{\leftrightarrow }{\mathrel}{left and right arrow}%
+\UnicodeMathSymbol{"02195}{\updownarrow }{\mathrel}{up and down arrow}%
+\UnicodeMathSymbol{"02196}{\nwarrow }{\mathrel}{nw pointing arrow}%
+\UnicodeMathSymbol{"02197}{\nearrow }{\mathrel}{ne pointing arrow}%
+\UnicodeMathSymbol{"02198}{\searrow }{\mathrel}{se pointing arrow}%
+\UnicodeMathSymbol{"02199}{\swarrow }{\mathrel}{sw pointing arrow}%
+\UnicodeMathSymbol{"0219A}{\nleftarrow }{\mathrel}{not left arrow}%
+\UnicodeMathSymbol{"0219B}{\nrightarrow }{\mathrel}{not right arrow}%
+\UnicodeMathSymbol{"0219C}{\leftwavearrow }{\mathrel}{left arrow-wavy}%
+\UnicodeMathSymbol{"0219D}{\rightwavearrow }{\mathrel}{right arrow-wavy}%
+\UnicodeMathSymbol{"0219E}{\twoheadleftarrow }{\mathrel}{left two-headed arrow}%
+\UnicodeMathSymbol{"0219F}{\twoheaduparrow }{\mathrel}{up two-headed arrow}%
+\UnicodeMathSymbol{"021A0}{\twoheadrightarrow }{\mathrel}{right two-headed arrow}%
+\UnicodeMathSymbol{"021A1}{\twoheaddownarrow }{\mathrel}{down two-headed arrow}%
+\UnicodeMathSymbol{"021A2}{\leftarrowtail }{\mathrel}{left arrow-tailed}%
+\UnicodeMathSymbol{"021A3}{\rightarrowtail }{\mathrel}{right arrow-tailed}%
+\UnicodeMathSymbol{"021A4}{\mapsfrom }{\mathrel}{maps to, leftward}%
+\UnicodeMathSymbol{"021A5}{\mapsup }{\mathrel}{maps to, upward}%
+\UnicodeMathSymbol{"021A6}{\mapsto }{\mathrel}{maps to, rightward}%
+\UnicodeMathSymbol{"021A7}{\mapsdown }{\mathrel}{maps to, downward}%
+\UnicodeMathSymbol{"021A8}{\updownarrowbar }{\mathord}{up down arrow with base (perpendicular)}%
+\UnicodeMathSymbol{"021A9}{\hookleftarrow }{\mathrel}{left arrow-hooked}%
+\UnicodeMathSymbol{"021AA}{\hookrightarrow }{\mathrel}{right arrow-hooked}%
+\UnicodeMathSymbol{"021AB}{\looparrowleft }{\mathrel}{left arrow-looped}%
+\UnicodeMathSymbol{"021AC}{\looparrowright }{\mathrel}{right arrow-looped}%
+\UnicodeMathSymbol{"021AD}{\leftrightsquigarrow }{\mathrel}{left and right arr-wavy}%
+\UnicodeMathSymbol{"021AE}{\nleftrightarrow }{\mathrel}{not left and right arrow}%
+\UnicodeMathSymbol{"021AF}{\downzigzagarrow }{\mathrel}{downwards zigzag arrow}%
+\UnicodeMathSymbol{"021B0}{\Lsh }{\mathrel}{/lsh a:}%
+\UnicodeMathSymbol{"021B1}{\Rsh }{\mathrel}{/rsh a:}%
+\UnicodeMathSymbol{"021B2}{\Ldsh }{\mathrel}{left down angled arrow}%
+\UnicodeMathSymbol{"021B3}{\Rdsh }{\mathrel}{right down angled arrow}%
+\UnicodeMathSymbol{"021B4}{\linefeed }{\mathord}{rightwards arrow with corner downwards}%
+\UnicodeMathSymbol{"021B5}{\carriagereturn }{\mathord}{downwards arrow with corner leftward = carriage return}%
+\UnicodeMathSymbol{"021B6}{\curvearrowleft }{\mathrel}{left curved arrow}%
+\UnicodeMathSymbol{"021B7}{\curvearrowright }{\mathrel}{right curved arrow}%
+\UnicodeMathSymbol{"021B8}{\barovernorthwestarrow }{\mathord}{north west arrow to long bar}%
+\UnicodeMathSymbol{"021B9}{\barleftarrowrightarrowbar}{\mathord}{leftwards arrow to bar over rightwards arrow to bar}%
+\UnicodeMathSymbol{"021BA}{\acwopencirclearrow }{\mathord}{anticlockwise open circle arrow}%
+\UnicodeMathSymbol{"021BB}{\cwopencirclearrow }{\mathord}{clockwise open circle arrow}%
+\UnicodeMathSymbol{"021BC}{\leftharpoonup }{\mathrel}{left harpoon-up}%
+\UnicodeMathSymbol{"021BD}{\leftharpoondown }{\mathrel}{left harpoon-down}%
+\UnicodeMathSymbol{"021BE}{\upharpoonright }{\mathrel}{/upharpoonright /restriction a: up harpoon-right}%
+\UnicodeMathSymbol{"021BF}{\upharpoonleft }{\mathrel}{up harpoon-left}%
+\UnicodeMathSymbol{"021C0}{\rightharpoonup }{\mathrel}{right harpoon-up}%
+\UnicodeMathSymbol{"021C1}{\rightharpoondown }{\mathrel}{right harpoon-down}%
+\UnicodeMathSymbol{"021C2}{\downharpoonright }{\mathrel}{down harpoon-right}%
+\UnicodeMathSymbol{"021C3}{\downharpoonleft }{\mathrel}{down harpoon-left}%
+\UnicodeMathSymbol{"021C4}{\rightleftarrows }{\mathrel}{right arrow over left arrow}%
+\UnicodeMathSymbol{"021C5}{\updownarrows }{\mathrel}{up arrow, down arrow}%
+\UnicodeMathSymbol{"021C6}{\leftrightarrows }{\mathrel}{left arrow over right arrow}%
+\UnicodeMathSymbol{"021C7}{\leftleftarrows }{\mathrel}{two left arrows}%
+\UnicodeMathSymbol{"021C8}{\upuparrows }{\mathrel}{two up arrows}%
+\UnicodeMathSymbol{"021C9}{\rightrightarrows }{\mathrel}{two right arrows}%
+\UnicodeMathSymbol{"021CA}{\downdownarrows }{\mathrel}{two down arrows}%
+\UnicodeMathSymbol{"021CB}{\leftrightharpoons }{\mathrel}{left harpoon over right}%
+\UnicodeMathSymbol{"021CC}{\rightleftharpoons }{\mathrel}{right harpoon over left}%
+\UnicodeMathSymbol{"021CD}{\nLeftarrow }{\mathrel}{not implied by}%
+\UnicodeMathSymbol{"021CE}{\nLeftrightarrow }{\mathrel}{not left and right double arrows}%
+\UnicodeMathSymbol{"021CF}{\nRightarrow }{\mathrel}{not implies}%
+\UnicodeMathSymbol{"021D0}{\Leftarrow }{\mathrel}{is implied by}%
+\UnicodeMathSymbol{"021D1}{\Uparrow }{\mathrel}{up double arrow}%
+\UnicodeMathSymbol{"021D2}{\Rightarrow }{\mathrel}{implies}%
+\UnicodeMathSymbol{"021D3}{\Downarrow }{\mathrel}{down double arrow}%
+\UnicodeMathSymbol{"021D4}{\Leftrightarrow }{\mathrel}{left and right double arrow}%
+\UnicodeMathSymbol{"021D5}{\Updownarrow }{\mathrel}{up and down double arrow}%
+\UnicodeMathSymbol{"021D6}{\Nwarrow }{\mathrel}{nw pointing double arrow}%
+\UnicodeMathSymbol{"021D7}{\Nearrow }{\mathrel}{ne pointing double arrow}%
+\UnicodeMathSymbol{"021D8}{\Searrow }{\mathrel}{se pointing double arrow}%
+\UnicodeMathSymbol{"021D9}{\Swarrow }{\mathrel}{sw pointing double arrow}%
+\UnicodeMathSymbol{"021DA}{\Lleftarrow }{\mathrel}{left triple arrow}%
+\UnicodeMathSymbol{"021DB}{\Rrightarrow }{\mathrel}{right triple arrow}%
+\UnicodeMathSymbol{"021DC}{\leftsquigarrow }{\mathrel}{leftwards squiggle arrow}%
+\UnicodeMathSymbol{"021DD}{\rightsquigarrow }{\mathrel}{rightwards squiggle arrow}%
+\UnicodeMathSymbol{"021DE}{\nHuparrow }{\mathord}{upwards arrow with double stroke}%
+\UnicodeMathSymbol{"021DF}{\nHdownarrow }{\mathord}{downwards arrow with double stroke}%
+\UnicodeMathSymbol{"021E0}{\leftdasharrow }{\mathord}{leftwards dashed arrow}%
+\UnicodeMathSymbol{"021E1}{\updasharrow }{\mathord}{upwards dashed arrow}%
+\UnicodeMathSymbol{"021E2}{\rightdasharrow }{\mathord}{rightwards dashed arrow}%
+\UnicodeMathSymbol{"021E3}{\downdasharrow }{\mathord}{downwards dashed arrow}%
+\UnicodeMathSymbol{"021E4}{\barleftarrow }{\mathrel}{leftwards arrow to bar}%
+\UnicodeMathSymbol{"021E5}{\rightarrowbar }{\mathrel}{rightwards arrow to bar}%
+\UnicodeMathSymbol{"021E6}{\leftwhitearrow }{\mathord}{leftwards white arrow}%
+\UnicodeMathSymbol{"021E7}{\upwhitearrow }{\mathord}{upwards white arrow}%
+\UnicodeMathSymbol{"021E8}{\rightwhitearrow }{\mathord}{rightwards white arrow}%
+\UnicodeMathSymbol{"021E9}{\downwhitearrow }{\mathord}{downwards white arrow}%
+\UnicodeMathSymbol{"021EA}{\whitearrowupfrombar }{\mathord}{upwards white arrow from bar}%
+\UnicodeMathSymbol{"021F4}{\circleonrightarrow }{\mathrel}{right arrow with small circle}%
+\UnicodeMathSymbol{"021F5}{\downuparrows }{\mathrel}{downwards arrow leftwards of upwards arrow}%
+\UnicodeMathSymbol{"021F6}{\rightthreearrows }{\mathrel}{three rightwards arrows}%
+\UnicodeMathSymbol{"021F7}{\nvleftarrow }{\mathrel}{leftwards arrow with vertical stroke}%
+\UnicodeMathSymbol{"021F8}{\nvrightarrow }{\mathrel}{rightwards arrow with vertical stroke}%
+\UnicodeMathSymbol{"021F9}{\nvleftrightarrow }{\mathrel}{left right arrow with vertical stroke}%
+\UnicodeMathSymbol{"021FA}{\nVleftarrow }{\mathrel}{leftwards arrow with double vertical stroke}%
+\UnicodeMathSymbol{"021FB}{\nVrightarrow }{\mathrel}{rightwards arrow with double vertical stroke}%
+\UnicodeMathSymbol{"021FC}{\nVleftrightarrow }{\mathrel}{left right arrow with double vertical stroke}%
+\UnicodeMathSymbol{"021FD}{\leftarrowtriangle }{\mathrel}{leftwards open-headed arrow}%
+\UnicodeMathSymbol{"021FE}{\rightarrowtriangle }{\mathrel}{rightwards open-headed arrow}%
+\UnicodeMathSymbol{"021FF}{\leftrightarrowtriangle }{\mathrel}{left right open-headed arrow}%
+\UnicodeMathSymbol{"02200}{\forall }{\mathord}{for all}%
+\UnicodeMathSymbol{"02201}{\complement }{\mathord}{complement sign}%
+\UnicodeMathSymbol{"02202}{\partial }{\mathalpha}{partial differential}%
+\UnicodeMathSymbol{"02203}{\exists }{\mathord}{at least one exists}%
+\UnicodeMathSymbol{"02204}{\nexists }{\mathord}{negated exists}%
+\UnicodeMathSymbol{"02205}{\varnothing }{\mathord}{circle, slash}%
+\UnicodeMathSymbol{"02206}{\increment }{\mathord}{laplacian (delta; nabla\string^2)}%
+\UnicodeMathSymbol{"02207}{\nabla }{\mathalpha}{nabla, del, hamilton operator}%
+\UnicodeMathSymbol{"02208}{\in }{\mathrel}{set membership, variant}%
+\UnicodeMathSymbol{"02209}{\notin }{\mathrel}{negated set membership}%
+\UnicodeMathSymbol{"0220A}{\smallin }{\mathrel}{set membership (small set membership)}%
+\UnicodeMathSymbol{"0220B}{\ni }{\mathrel}{contains, variant}%
+\UnicodeMathSymbol{"0220C}{\nni }{\mathrel}{negated contains, variant}%
+\UnicodeMathSymbol{"0220D}{\smallni }{\mathrel}{/ni /owns r: contains (small contains as member)}%
+\UnicodeMathSymbol{"0220E}{\QED }{\mathord}{end of proof}%
+\UnicodeMathSymbol{"0220F}{\prod }{\mathop}{product operator}%
+\UnicodeMathSymbol{"02210}{\coprod }{\mathop}{coproduct operator}%
+\UnicodeMathSymbol{"02211}{\sum }{\mathop}{summation operator}%
+\UnicodeMathSymbol{"02212}{\minus }{\mathbin}{minus sign}%
+\UnicodeMathSymbol{"02213}{\mp }{\mathbin}{minus-or-plus sign}%
+\UnicodeMathSymbol{"02214}{\dotplus }{\mathbin}{plus sign, dot above}%
+\UnicodeMathSymbol{"02215}{\divslash }{\mathbin}{division slash}%
+\UnicodeMathSymbol{"02216}{\smallsetminus }{\mathbin}{small set minus (cf. reverse solidus)}%
+\UnicodeMathSymbol{"02217}{\ast }{\mathbin}{centered asterisk}%
+\UnicodeMathSymbol{"02218}{\vysmwhtcircle }{\mathbin}{composite function (small circle)}%
+\UnicodeMathSymbol{"02219}{\vysmblkcircle }{\mathbin}{bullet operator}%
+\UnicodeMathSymbol{"0221A}{\sqrt }{\mathopen}{radical}%
+\UnicodeMathSymbol{"0221A}{\surd }{\mathord}{radical}%
+\UnicodeMathSymbol{"0221B}{\cuberoot }{\mathopen}{cube root}%
+\UnicodeMathSymbol{"0221C}{\fourthroot }{\mathopen}{fourth root}%
+\UnicodeMathSymbol{"0221D}{\propto }{\mathrel}{is proportional to}%
+\UnicodeMathSymbol{"0221E}{\infty }{\mathord}{infinity}%
+\UnicodeMathSymbol{"0221F}{\rightangle }{\mathord}{right (90 degree) angle}%
+\UnicodeMathSymbol{"02220}{\angle }{\mathord}{angle}%
+\UnicodeMathSymbol{"02221}{\measuredangle }{\mathord}{angle-measured}%
+\UnicodeMathSymbol{"02222}{\sphericalangle }{\mathord}{angle-spherical}%
+\UnicodeMathSymbol{"02223}{\mid }{\mathrel}{/mid r:}%
+\UnicodeMathSymbol{"02224}{\nmid }{\mathrel}{negated mid}%
+\UnicodeMathSymbol{"02225}{\parallel }{\mathrel}{parallel}%
+\UnicodeMathSymbol{"02226}{\nparallel }{\mathrel}{not parallel}%
+\UnicodeMathSymbol{"02227}{\wedge }{\mathbin}{/wedge /land b: logical and}%
+\UnicodeMathSymbol{"02228}{\vee }{\mathbin}{/vee /lor b: logical or}%
+\UnicodeMathSymbol{"02229}{\cap }{\mathbin}{intersection}%
+\UnicodeMathSymbol{"0222A}{\cup }{\mathbin}{union or logical sum}%
+\UnicodeMathSymbol{"0222B}{\int }{\mathop}{integral operator}%
+\UnicodeMathSymbol{"0222C}{\iint }{\mathop}{double integral operator}%
+\UnicodeMathSymbol{"0222D}{\iiint }{\mathop}{triple integral operator}%
+\UnicodeMathSymbol{"0222E}{\oint }{\mathop}{contour integral operator}%
+\UnicodeMathSymbol{"0222F}{\oiint }{\mathop}{double contour integral operator}%
+\UnicodeMathSymbol{"02230}{\oiiint }{\mathop}{triple contour integral operator}%
+\UnicodeMathSymbol{"02231}{\intclockwise }{\mathop}{clockwise integral}%
+\UnicodeMathSymbol{"02232}{\varointclockwise }{\mathop}{contour integral, clockwise}%
+\UnicodeMathSymbol{"02233}{\ointctrclockwise }{\mathop}{contour integral, anticlockwise}%
+\UnicodeMathSymbol{"02234}{\therefore }{\mathord}{therefore}%
+\UnicodeMathSymbol{"02235}{\because }{\mathord}{because}%
+\UnicodeMathSymbol{"02236}{\mathratio }{\mathrel}{ratio}%
+\UnicodeMathSymbol{"02237}{\Colon }{\mathrel}{two colons}%
+\UnicodeMathSymbol{"02238}{\dotminus }{\mathbin}{minus sign, dot above}%
+\UnicodeMathSymbol{"02239}{\dashcolon }{\mathrel}{excess (-:)}%
+\UnicodeMathSymbol{"0223A}{\dotsminusdots }{\mathrel}{minus with four dots, geometric properties}%
+\UnicodeMathSymbol{"0223B}{\kernelcontraction }{\mathrel}{homothetic}%
+\UnicodeMathSymbol{"0223C}{\sim }{\mathrel}{similar}%
+\UnicodeMathSymbol{"0223D}{\backsim }{\mathrel}{reverse similar}%
+\UnicodeMathSymbol{"0223E}{\invlazys }{\mathbin}{most positive [inverted lazy s]}%
+\UnicodeMathSymbol{"0223F}{\sinewave }{\mathord}{sine wave}%
+\UnicodeMathSymbol{"02240}{\wr }{\mathbin}{wreath product}%
+\UnicodeMathSymbol{"02241}{\nsim }{\mathrel}{not similar}%
+\UnicodeMathSymbol{"02242}{\eqsim }{\mathrel}{equals, similar}%
+\UnicodeMathSymbol{"02243}{\simeq }{\mathrel}{similar, equals}%
+\UnicodeMathSymbol{"02244}{\nsime }{\mathrel}{not similar, equals}%
+\UnicodeMathSymbol{"02243}{\sime }{\mathrel}{similar, equals (alias)}%
+\UnicodeMathSymbol{"02244}{\nsimeq }{\mathrel}{not similar, equals (alias)}%
+\UnicodeMathSymbol{"02245}{\cong }{\mathrel}{congruent with}%
+\UnicodeMathSymbol{"02246}{\simneqq }{\mathrel}{similar, not equals [vert only for 9573 entity]}%
+\UnicodeMathSymbol{"02247}{\ncong }{\mathrel}{not congruent with}%
+\UnicodeMathSymbol{"02248}{\approx }{\mathrel}{approximate}%
+\UnicodeMathSymbol{"02249}{\napprox }{\mathrel}{not approximate}%
+\UnicodeMathSymbol{"0224A}{\approxeq }{\mathrel}{approximate, equals}%
+\UnicodeMathSymbol{"0224B}{\approxident }{\mathrel}{approximately identical to}%
+\UnicodeMathSymbol{"0224C}{\backcong }{\mathrel}{all equal to}%
+\UnicodeMathSymbol{"0224D}{\asymp }{\mathrel}{asymptotically equal to}%
+\UnicodeMathSymbol{"0224E}{\Bumpeq }{\mathrel}{bumpy equals}%
+\UnicodeMathSymbol{"0224F}{\bumpeq }{\mathrel}{bumpy equals, equals}%
+\UnicodeMathSymbol{"02250}{\doteq }{\mathrel}{equals, single dot above}%
+\UnicodeMathSymbol{"02251}{\Doteq }{\mathrel}{/doteqdot /doteq r: equals, even dots}%
+\UnicodeMathSymbol{"02252}{\fallingdotseq }{\mathrel}{equals, falling dots}%
+\UnicodeMathSymbol{"02253}{\risingdotseq }{\mathrel}{equals, rising dots}%
+\UnicodeMathSymbol{"02254}{\coloneq }{\mathrel}{colon, equals}%
+\UnicodeMathSymbol{"02255}{\eqcolon }{\mathrel}{equals, colon}%
+\UnicodeMathSymbol{"02256}{\eqcirc }{\mathrel}{circle on equals sign}%
+\UnicodeMathSymbol{"02257}{\circeq }{\mathrel}{circle, equals}%
+\UnicodeMathSymbol{"02258}{\arceq }{\mathrel}{arc, equals; corresponds to}%
+\UnicodeMathSymbol{"02259}{\wedgeq }{\mathrel}{corresponds to (wedge, equals)}%
+\UnicodeMathSymbol{"0225A}{\veeeq }{\mathrel}{logical or, equals}%
+\UnicodeMathSymbol{"0225B}{\stareq }{\mathrel}{star equals}%
+\UnicodeMathSymbol{"0225C}{\triangleq }{\mathrel}{triangle, equals}%
+\UnicodeMathSymbol{"0225D}{\eqdef }{\mathrel}{equals by definition}%
+\UnicodeMathSymbol{"0225E}{\measeq }{\mathrel}{measured by (m over equals)}%
+\UnicodeMathSymbol{"0225F}{\questeq }{\mathrel}{equal with questionmark}%
+\UnicodeMathSymbol{"02260}{\ne }{\mathrel}{/ne /neq r: not equal}%
+\UnicodeMathSymbol{"02261}{\equiv }{\mathrel}{identical with}%
+\UnicodeMathSymbol{"02262}{\nequiv }{\mathrel}{not identical with}%
+\UnicodeMathSymbol{"02263}{\Equiv }{\mathrel}{strict equivalence (4 lines)}%
+\UnicodeMathSymbol{"02264}{\leq }{\mathrel}{/leq /le r: less-than-or-equal}%
+\UnicodeMathSymbol{"02265}{\geq }{\mathrel}{/geq /ge r: greater-than-or-equal}%
+\UnicodeMathSymbol{"02266}{\leqq }{\mathrel}{less, double equals}%
+\UnicodeMathSymbol{"02267}{\geqq }{\mathrel}{greater, double equals}%
+\UnicodeMathSymbol{"02268}{\lneqq }{\mathrel}{less, not double equals}%
+\UnicodeMathSymbol{"02269}{\gneqq }{\mathrel}{greater, not double equals}%
+\UnicodeMathSymbol{"0226A}{\ll }{\mathrel}{much less than, type 2}%
+\UnicodeMathSymbol{"0226B}{\gg }{\mathrel}{much greater than, type 2}%
+\UnicodeMathSymbol{"0226C}{\between }{\mathrel}{between}%
+\UnicodeMathSymbol{"0226D}{\nasymp }{\mathrel}{not asymptotically equal to}%
+\UnicodeMathSymbol{"0226E}{\nless }{\mathrel}{not less-than}%
+\UnicodeMathSymbol{"0226F}{\ngtr }{\mathrel}{not greater-than}%
+\UnicodeMathSymbol{"02270}{\nleq }{\mathrel}{not less-than-or-equal}%
+\UnicodeMathSymbol{"02271}{\ngeq }{\mathrel}{not greater-than-or-equal}%
+\UnicodeMathSymbol{"02272}{\lesssim }{\mathrel}{less, similar}%
+\UnicodeMathSymbol{"02273}{\gtrsim }{\mathrel}{greater, similar}%
+\UnicodeMathSymbol{"02274}{\nlesssim }{\mathrel}{not less, similar}%
+\UnicodeMathSymbol{"02275}{\ngtrsim }{\mathrel}{not greater, similar}%
+\UnicodeMathSymbol{"02276}{\lessgtr }{\mathrel}{less, greater}%
+\UnicodeMathSymbol{"02277}{\gtrless }{\mathrel}{greater, less}%
+\UnicodeMathSymbol{"02278}{\nlessgtr }{\mathrel}{not less, greater}%
+\UnicodeMathSymbol{"02279}{\ngtrless }{\mathrel}{not greater, less}%
+\UnicodeMathSymbol{"0227A}{\prec }{\mathrel}{precedes}%
+\UnicodeMathSymbol{"0227B}{\succ }{\mathrel}{succeeds}%
+\UnicodeMathSymbol{"0227C}{\preccurlyeq }{\mathrel}{precedes, curly equals}%
+\UnicodeMathSymbol{"0227D}{\succcurlyeq }{\mathrel}{succeeds, curly equals}%
+\UnicodeMathSymbol{"0227E}{\precsim }{\mathrel}{precedes, similar}%
+\UnicodeMathSymbol{"0227F}{\succsim }{\mathrel}{succeeds, similar}%
+\UnicodeMathSymbol{"02280}{\nprec }{\mathrel}{not precedes}%
+\UnicodeMathSymbol{"02281}{\nsucc }{\mathrel}{not succeeds}%
+\UnicodeMathSymbol{"02282}{\subset }{\mathrel}{subset or is implied by}%
+\UnicodeMathSymbol{"02283}{\supset }{\mathrel}{superset or implies}%
+\UnicodeMathSymbol{"02284}{\nsubset }{\mathrel}{not subset, variant [slash negation]}%
+\UnicodeMathSymbol{"02285}{\nsupset }{\mathrel}{not superset, variant [slash negation]}%
+\UnicodeMathSymbol{"02286}{\subseteq }{\mathrel}{subset, equals}%
+\UnicodeMathSymbol{"02287}{\supseteq }{\mathrel}{superset, equals}%
+\UnicodeMathSymbol{"02288}{\nsubseteq }{\mathrel}{not subset, equals}%
+\UnicodeMathSymbol{"02289}{\nsupseteq }{\mathrel}{not superset, equals}%
+\UnicodeMathSymbol{"0228A}{\subsetneq }{\mathrel}{subset, not equals}%
+\UnicodeMathSymbol{"0228B}{\supsetneq }{\mathrel}{superset, not equals}%
+\UnicodeMathSymbol{"0228C}{\cupleftarrow }{\mathbin}{multiset}%
+\UnicodeMathSymbol{"0228D}{\cupdot }{\mathbin}{union, with dot}%
+\UnicodeMathSymbol{"0228E}{\uplus }{\mathbin}{plus sign in union}%
+\UnicodeMathSymbol{"0228F}{\sqsubset }{\mathrel}{square subset}%
+\UnicodeMathSymbol{"02290}{\sqsupset }{\mathrel}{square superset}%
+\UnicodeMathSymbol{"02291}{\sqsubseteq }{\mathrel}{square subset, equals}%
+\UnicodeMathSymbol{"02292}{\sqsupseteq }{\mathrel}{square superset, equals}%
+\UnicodeMathSymbol{"02293}{\sqcap }{\mathbin}{square intersection}%
+\UnicodeMathSymbol{"02294}{\sqcup }{\mathbin}{square union}%
+\UnicodeMathSymbol{"02295}{\oplus }{\mathbin}{plus sign in circle}%
+\UnicodeMathSymbol{"02296}{\ominus }{\mathbin}{minus sign in circle}%
+\UnicodeMathSymbol{"02297}{\otimes }{\mathbin}{multiply sign in circle}%
+\UnicodeMathSymbol{"02298}{\oslash }{\mathbin}{solidus in circle}%
+\UnicodeMathSymbol{"02299}{\odot }{\mathbin}{middle dot in circle}%
+\UnicodeMathSymbol{"0229A}{\circledcirc }{\mathbin}{small circle in circle}%
+\UnicodeMathSymbol{"0229B}{\circledast }{\mathbin}{asterisk in circle}%
+\UnicodeMathSymbol{"0229C}{\circledequal }{\mathbin}{equal in circle}%
+\UnicodeMathSymbol{"0229D}{\circleddash }{\mathbin}{hyphen in circle}%
+\UnicodeMathSymbol{"0229E}{\boxplus }{\mathbin}{plus sign in box}%
+\UnicodeMathSymbol{"0229F}{\boxminus }{\mathbin}{minus sign in box}%
+\UnicodeMathSymbol{"022A0}{\boxtimes }{\mathbin}{multiply sign in box}%
+\UnicodeMathSymbol{"022A1}{\boxdot }{\mathbin}{/dotsquare /boxdot b: small dot in box}%
+\UnicodeMathSymbol{"022A2}{\vdash }{\mathrel}{vertical, dash}%
+\UnicodeMathSymbol{"022A3}{\dashv }{\mathrel}{dash, vertical}%
+\UnicodeMathSymbol{"022A4}{\top }{\mathord}{top}%
+\UnicodeMathSymbol{"022A5}{\bot }{\mathord}{bottom}%
+\UnicodeMathSymbol{"022A6}{\assert }{\mathrel}{assertion (vertical, short dash)}%
+\UnicodeMathSymbol{"022A7}{\models }{\mathrel}{models (vertical, short double dash)}%
+\UnicodeMathSymbol{"022A8}{\vDash }{\mathrel}{vertical, double dash}%
+\UnicodeMathSymbol{"022A9}{\Vdash }{\mathrel}{double vertical, dash}%
+\UnicodeMathSymbol{"022AA}{\Vvdash }{\mathrel}{triple vertical, dash}%
+\UnicodeMathSymbol{"022AB}{\VDash }{\mathrel}{double vert, double dash}%
+\UnicodeMathSymbol{"022AC}{\nvdash }{\mathrel}{not vertical, dash}%
+\UnicodeMathSymbol{"022AD}{\nvDash }{\mathrel}{not vertical, double dash}%
+\UnicodeMathSymbol{"022AE}{\nVdash }{\mathrel}{not double vertical, dash}%
+\UnicodeMathSymbol{"022AF}{\nVDash }{\mathrel}{not double vert, double dash}%
+\UnicodeMathSymbol{"022B0}{\prurel }{\mathrel}{element precedes under relation}%
+\UnicodeMathSymbol{"022B1}{\scurel }{\mathrel}{succeeds under relation}%
+\UnicodeMathSymbol{"022B2}{\vartriangleleft }{\mathrel}{left triangle, open, variant}%
+\UnicodeMathSymbol{"022B3}{\vartriangleright }{\mathrel}{right triangle, open, variant}%
+\UnicodeMathSymbol{"022B4}{\trianglelefteq }{\mathrel}{left triangle, equals}%
+\UnicodeMathSymbol{"022B5}{\trianglerighteq }{\mathrel}{right triangle, equals}%
+\UnicodeMathSymbol{"022B6}{\origof }{\mathrel}{original of}%
+\UnicodeMathSymbol{"022B7}{\imageof }{\mathrel}{image of}%
+\UnicodeMathSymbol{"022B8}{\multimap }{\mathrel}{/multimap a:}%
+\UnicodeMathSymbol{"022B9}{\hermitmatrix }{\mathord}{hermitian conjugate matrix}%
+\UnicodeMathSymbol{"022BA}{\intercal }{\mathbin}{intercal}%
+\UnicodeMathSymbol{"022BB}{\veebar }{\mathbin}{logical or, bar below (large vee); exclusive disjunction}%
+\UnicodeMathSymbol{"022BC}{\barwedge }{\mathbin}{bar, wedge (large wedge)}%
+\UnicodeMathSymbol{"022BD}{\barvee }{\mathbin}{bar, vee (large vee)}%
+\UnicodeMathSymbol{"022BE}{\measuredrightangle }{\mathord}{right angle-measured [with arc]}%
+\UnicodeMathSymbol{"022BF}{\varlrtriangle }{\mathord}{right triangle}%
+\UnicodeMathSymbol{"022C0}{\bigwedge }{\mathop}{logical and operator}%
+\UnicodeMathSymbol{"022C1}{\bigvee }{\mathop}{logical or operator}%
+\UnicodeMathSymbol{"022C2}{\bigcap }{\mathop}{intersection operator}%
+\UnicodeMathSymbol{"022C3}{\bigcup }{\mathop}{union operator}%
+\UnicodeMathSymbol{"022C4}{\smwhtdiamond }{\mathbin}{white diamond}%
+\UnicodeMathSymbol{"022C5}{\cdot }{\mathbin}{small middle dot}%
+\UnicodeMathSymbol{"022C6}{\star }{\mathbin}{small star, filled, low}%
+\UnicodeMathSymbol{"022C7}{\divideontimes }{\mathbin}{division on times}%
+\UnicodeMathSymbol{"022C8}{\bowtie }{\mathrel}{bowtie}%
+\UnicodeMathSymbol{"022C9}{\ltimes }{\mathbin}{times sign, left closed}%
+\UnicodeMathSymbol{"022CA}{\rtimes }{\mathbin}{times sign, right closed}%
+\UnicodeMathSymbol{"022CB}{\leftthreetimes }{\mathbin}{left semidirect product}%
+\UnicodeMathSymbol{"022CC}{\rightthreetimes }{\mathbin}{right semidirect product}%
+\UnicodeMathSymbol{"022CD}{\backsimeq }{\mathrel}{reverse similar, equals}%
+\UnicodeMathSymbol{"022CE}{\curlyvee }{\mathbin}{curly logical or}%
+\UnicodeMathSymbol{"022CF}{\curlywedge }{\mathbin}{curly logical and}%
+\UnicodeMathSymbol{"022D0}{\Subset }{\mathrel}{double subset}%
+\UnicodeMathSymbol{"022D1}{\Supset }{\mathrel}{double superset}%
+\UnicodeMathSymbol{"022D2}{\Cap }{\mathbin}{/cap /doublecap b: double intersection}%
+\UnicodeMathSymbol{"022D3}{\Cup }{\mathbin}{/cup /doublecup b: double union}%
+\UnicodeMathSymbol{"022D4}{\pitchfork }{\mathrel}{pitchfork}%
+\UnicodeMathSymbol{"022D5}{\equalparallel }{\mathrel}{parallel, equal; equal or parallel}%
+\UnicodeMathSymbol{"022D6}{\lessdot }{\mathrel}{less than, with dot}%
+\UnicodeMathSymbol{"022D7}{\gtrdot }{\mathrel}{greater than, with dot}%
+\UnicodeMathSymbol{"022D8}{\lll }{\mathrel}{/ll /lll /llless r: triple less-than}%
+\UnicodeMathSymbol{"022D9}{\ggg }{\mathrel}{/ggg /gg /gggtr r: triple greater-than}%
+\UnicodeMathSymbol{"022DA}{\lesseqgtr }{\mathrel}{less, equals, greater}%
+\UnicodeMathSymbol{"022DB}{\gtreqless }{\mathrel}{greater, equals, less}%
+\UnicodeMathSymbol{"022DC}{\eqless }{\mathrel}{equal-or-less}%
+\UnicodeMathSymbol{"022DD}{\eqgtr }{\mathrel}{equal-or-greater}%
+\UnicodeMathSymbol{"022DE}{\curlyeqprec }{\mathrel}{curly equals, precedes}%
+\UnicodeMathSymbol{"022DF}{\curlyeqsucc }{\mathrel}{curly equals, succeeds}%
+\UnicodeMathSymbol{"022E0}{\npreccurlyeq }{\mathrel}{not precedes, curly equals}%
+\UnicodeMathSymbol{"022E1}{\nsucccurlyeq }{\mathrel}{not succeeds, curly equals}%
+\UnicodeMathSymbol{"022E2}{\nsqsubseteq }{\mathrel}{not, square subset, equals}%
+\UnicodeMathSymbol{"022E3}{\nsqsupseteq }{\mathrel}{not, square superset, equals}%
+\UnicodeMathSymbol{"022E4}{\sqsubsetneq }{\mathrel}{square subset, not equals}%
+\UnicodeMathSymbol{"022E5}{\sqsupsetneq }{\mathrel}{square superset, not equals}%
+\UnicodeMathSymbol{"022E6}{\lnsim }{\mathrel}{less, not similar}%
+\UnicodeMathSymbol{"022E7}{\gnsim }{\mathrel}{greater, not similar}%
+\UnicodeMathSymbol{"022E8}{\precnsim }{\mathrel}{precedes, not similar}%
+\UnicodeMathSymbol{"022E9}{\succnsim }{\mathrel}{succeeds, not similar}%
+\UnicodeMathSymbol{"022EA}{\nvartriangleleft }{\mathrel}{not left triangle}%
+\UnicodeMathSymbol{"022EB}{\nvartriangleright }{\mathrel}{not right triangle}%
+\UnicodeMathSymbol{"022EC}{\ntrianglelefteq }{\mathrel}{not left triangle, equals}%
+\UnicodeMathSymbol{"022ED}{\ntrianglerighteq }{\mathrel}{not right triangle, equals}%
+\UnicodeMathSymbol{"022EE}{\unicodevdots }{\mathrel}{vertical ellipsis}%
+\UnicodeMathSymbol{"022EF}{\unicodecdots }{\mathord}{three dots, centered}%
+\UnicodeMathSymbol{"022F0}{\unicodeadots }{\mathrel}{three dots, ascending}%
+\UnicodeMathSymbol{"022F1}{\unicodeddots }{\mathrel}{three dots, descending}%
+\UnicodeMathSymbol{"022F2}{\disin }{\mathrel}{element of with long horizontal stroke}%
+\UnicodeMathSymbol{"022F3}{\varisins }{\mathrel}{element of with vertical bar at end of horizontal stroke}%
+\UnicodeMathSymbol{"022F4}{\isins }{\mathrel}{small element of with vertical bar at end of horizontal stroke}%
+\UnicodeMathSymbol{"022F5}{\isindot }{\mathrel}{element of with dot above}%
+\UnicodeMathSymbol{"022F6}{\varisinobar }{\mathrel}{element of with overbar}%
+\UnicodeMathSymbol{"022F7}{\isinobar }{\mathrel}{small element of with overbar}%
+\UnicodeMathSymbol{"022F8}{\isinvb }{\mathrel}{element of with underbar}%
+\UnicodeMathSymbol{"022F9}{\isinE }{\mathrel}{element of with two horizontal strokes}%
+\UnicodeMathSymbol{"022FA}{\nisd }{\mathrel}{contains with long horizontal stroke}%
+\UnicodeMathSymbol{"022FB}{\varnis }{\mathrel}{contains with vertical bar at end of horizontal stroke}%
+\UnicodeMathSymbol{"022FC}{\nis }{\mathrel}{small contains with vertical bar at end of horizontal stroke}%
+\UnicodeMathSymbol{"022FD}{\varniobar }{\mathrel}{contains with overbar}%
+\UnicodeMathSymbol{"022FE}{\niobar }{\mathrel}{small contains with overbar}%
+\UnicodeMathSymbol{"022FF}{\bagmember }{\mathrel}{z notation bag membership}%
+\UnicodeMathSymbol{"02300}{\diameter }{\mathord}{diameter sign}%
+\UnicodeMathSymbol{"02302}{\house }{\mathord}{house}%
+\UnicodeMathSymbol{"02305}{\varbarwedge }{\mathbin}{/barwedge b: logical and, bar above [projective (bar over small wedge)]}%
+\UnicodeMathSymbol{"02306}{\vardoublebarwedge }{\mathbin}{/doublebarwedge b: logical and, double bar above [perspective (double bar over small wedge)]}%
+\UnicodeMathSymbol{"02308}{\lceil }{\mathopen}{left ceiling}%
+\UnicodeMathSymbol{"02309}{\rceil }{\mathclose}{right ceiling}%
+\UnicodeMathSymbol{"0230A}{\lfloor }{\mathopen}{left floor}%
+\UnicodeMathSymbol{"0230B}{\rfloor }{\mathclose}{right floor}%
+\UnicodeMathSymbol{"02310}{\invnot }{\mathord}{reverse not}%
+\UnicodeMathSymbol{"02311}{\sqlozenge }{\mathord}{square lozenge}%
+\UnicodeMathSymbol{"02312}{\profline }{\mathord}{profile of a line}%
+\UnicodeMathSymbol{"02313}{\profsurf }{\mathord}{profile of a surface}%
+\UnicodeMathSymbol{"02317}{\viewdata }{\mathord}{viewdata square}%
+\UnicodeMathSymbol{"02319}{\turnednot }{\mathord}{turned not sign}%
+\UnicodeMathSymbol{"0231C}{\ulcorner }{\mathopen}{upper left corner}%
+\UnicodeMathSymbol{"0231D}{\urcorner }{\mathclose}{upper right corner}%
+\UnicodeMathSymbol{"0231E}{\llcorner }{\mathopen}{lower left corner}%
+\UnicodeMathSymbol{"0231F}{\lrcorner }{\mathclose}{lower right corner}%
+\UnicodeMathSymbol{"02320}{\inttop }{\mathord}{top half integral}%
+\UnicodeMathSymbol{"02321}{\intbottom }{\mathord}{bottom half integral}%
+\UnicodeMathSymbol{"02322}{\frown }{\mathrel}{down curve}%
+\UnicodeMathSymbol{"02323}{\smile }{\mathrel}{up curve}%
+\UnicodeMathSymbol{"0232C}{\varhexagonlrbonds }{\mathord}{six carbon ring, corner down, double bonds lower right etc}%
+\UnicodeMathSymbol{"02332}{\conictaper }{\mathord}{conical taper }%
+\UnicodeMathSymbol{"02336}{\topbot }{\mathord}{top and bottom}%
+\UnicodeMathSymbol{"0233D}{\obar }{\mathbin}{circle with vertical bar}%
+\UnicodeMathSymbol{"0233F}{\APLnotslash }{\mathrel}{solidus, bar through (apl functional symbol slash bar)}%
+\UnicodeMathSymbol{"02340}{\APLnotbackslash }{\mathord}{apl functional symbol backslash bar}%
+\UnicodeMathSymbol{"02353}{\APLboxupcaret }{\mathord}{boxed up caret}%
+\UnicodeMathSymbol{"02370}{\APLboxquestion }{\mathord}{boxed question mark}%
+\UnicodeMathSymbol{"0237C}{\rangledownzigzagarrow }{\mathord}{right angle with downwards zigzag arrow}%
+\UnicodeMathSymbol{"02394}{\hexagon }{\mathord}{horizontal benzene ring [hexagon flat open]}%
+\UnicodeMathSymbol{"0239B}{\lparenuend }{\mathord}{left parenthesis upper hook}%
+\UnicodeMathSymbol{"0239C}{\lparenextender }{\mathord}{left parenthesis extension}%
+\UnicodeMathSymbol{"0239D}{\lparenlend }{\mathord}{left parenthesis lower hook}%
+\UnicodeMathSymbol{"0239E}{\rparenuend }{\mathord}{right parenthesis upper hook}%
+\UnicodeMathSymbol{"0239F}{\rparenextender }{\mathord}{right parenthesis extension}%
+\UnicodeMathSymbol{"023A0}{\rparenlend }{\mathord}{right parenthesis lower hook}%
+\UnicodeMathSymbol{"023A1}{\lbrackuend }{\mathord}{left square bracket upper corner}%
+\UnicodeMathSymbol{"023A2}{\lbrackextender }{\mathord}{left square bracket extension}%
+\UnicodeMathSymbol{"023A3}{\lbracklend }{\mathord}{left square bracket lower corner}%
+\UnicodeMathSymbol{"023A4}{\rbrackuend }{\mathord}{right square bracket upper corner}%
+\UnicodeMathSymbol{"023A5}{\rbrackextender }{\mathord}{right square bracket extension}%
+\UnicodeMathSymbol{"023A6}{\rbracklend }{\mathord}{right square bracket lower corner}%
+\UnicodeMathSymbol{"023A7}{\lbraceuend }{\mathord}{left curly bracket upper hook}%
+\UnicodeMathSymbol{"023A8}{\lbracemid }{\mathord}{left curly bracket middle piece}%
+\UnicodeMathSymbol{"023A9}{\lbracelend }{\mathord}{left curly bracket lower hook}%
+\UnicodeMathSymbol{"023AA}{\vbraceextender }{\mathord}{curly bracket extension}%
+\UnicodeMathSymbol{"023AB}{\rbraceuend }{\mathord}{right curly bracket upper hook}%
+\UnicodeMathSymbol{"023AC}{\rbracemid }{\mathord}{right curly bracket middle piece}%
+\UnicodeMathSymbol{"023AD}{\rbracelend }{\mathord}{right curly bracket lower hook}%
+\UnicodeMathSymbol{"023AE}{\intextender }{\mathord}{integral extension}%
+\UnicodeMathSymbol{"023AF}{\harrowextender }{\mathord}{horizontal line extension (used to extend arrows)}%
+\UnicodeMathSymbol{"023B0}{\lmoustache }{\mathopen}{upper left or lower right curly bracket section}%
+\UnicodeMathSymbol{"023B1}{\rmoustache }{\mathclose}{upper right or lower left curly bracket section}%
+\UnicodeMathSymbol{"023B2}{\sumtop }{\mathord}{summation top}%
+\UnicodeMathSymbol{"023B3}{\sumbottom }{\mathord}{summation bottom}%
+\UnicodeMathSymbol{"023B4}{\overbracket }{\mathover}{top square bracket}%
+\UnicodeMathSymbol{"023B5}{\underbracket }{\mathunder}{bottom square bracket}%
+\UnicodeMathSymbol{"023B6}{\bbrktbrk }{\mathord}{bottom square bracket over top square bracket}%
+\UnicodeMathSymbol{"023B7}{\sqrtbottom }{\mathord}{radical symbol bottom}%
+\UnicodeMathSymbol{"023B8}{\lvboxline }{\mathord}{left vertical box line}%
+\UnicodeMathSymbol{"023B9}{\rvboxline }{\mathord}{right vertical box line}%
+\UnicodeMathSymbol{"023CE}{\varcarriagereturn }{\mathord}{return symbol}%
+\UnicodeMathSymbol{"023DC}{\overparen }{\mathover}{top parenthesis (mathematical use)}%
+\UnicodeMathSymbol{"023DD}{\underparen }{\mathunder}{bottom parenthesis (mathematical use)}%
+\UnicodeMathSymbol{"023DE}{\overbrace }{\mathover}{top curly bracket (mathematical use)}%
+\UnicodeMathSymbol{"023DF}{\underbrace }{\mathunder}{bottom curly bracket (mathematical use)}%
+\UnicodeMathSymbol{"023E0}{\obrbrak }{\mathord}{top tortoise shell bracket (mathematical use)}%
+\UnicodeMathSymbol{"023E1}{\ubrbrak }{\mathord}{bottom tortoise shell bracket (mathematical use)}%
+\UnicodeMathSymbol{"023E2}{\trapezium }{\mathord}{white trapezium}%
+\UnicodeMathSymbol{"023E3}{\benzenr }{\mathord}{benzene ring with circle}%
+\UnicodeMathSymbol{"023E4}{\strns }{\mathord}{straightness}%
+\UnicodeMathSymbol{"023E5}{\fltns }{\mathord}{flatness}%
+\UnicodeMathSymbol{"023E6}{\accurrent }{\mathord}{ac current}%
+\UnicodeMathSymbol{"023E7}{\elinters }{\mathord}{electrical intersection}%
+\UnicodeMathSymbol{"02422}{\blanksymbol }{\mathord}{blank symbol}%
+\UnicodeMathSymbol{"02423}{\mathvisiblespace }{\mathord}{open box}%
+\UnicodeMathSymbol{"02506}{\bdtriplevdash }{\mathord}{doubly broken vert}%
+\UnicodeMathSymbol{"02580}{\blockuphalf }{\mathord}{upper half block}%
+\UnicodeMathSymbol{"02584}{\blocklowhalf }{\mathord}{lower half block}%
+\UnicodeMathSymbol{"02588}{\blockfull }{\mathord}{full block}%
+\UnicodeMathSymbol{"0258C}{\blocklefthalf }{\mathord}{left half block}%
+\UnicodeMathSymbol{"02590}{\blockrighthalf }{\mathord}{right half block}%
+\UnicodeMathSymbol{"02591}{\blockqtrshaded }{\mathord}{25\% shaded block}%
+\UnicodeMathSymbol{"02592}{\blockhalfshaded }{\mathord}{50\% shaded block}%
+\UnicodeMathSymbol{"02593}{\blockthreeqtrshaded }{\mathord}{75\% shaded block}%
+\UnicodeMathSymbol{"025A0}{\mdlgblksquare }{\mathord}{square, filled}%
+\UnicodeMathSymbol{"025A1}{\mdlgwhtsquare }{\mathord}{square, open}%
+\UnicodeMathSymbol{"025A2}{\squoval }{\mathord}{white square with rounded corners}%
+\UnicodeMathSymbol{"025A3}{\blackinwhitesquare }{\mathord}{white square containing black small square}%
+\UnicodeMathSymbol{"025A4}{\squarehfill }{\mathord}{square, horizontal rule filled}%
+\UnicodeMathSymbol{"025A5}{\squarevfill }{\mathord}{square, vertical rule filled}%
+\UnicodeMathSymbol{"025A6}{\squarehvfill }{\mathord}{square with orthogonal crosshatch fill}%
+\UnicodeMathSymbol{"025A7}{\squarenwsefill }{\mathord}{square, nw-to-se rule filled}%
+\UnicodeMathSymbol{"025A8}{\squareneswfill }{\mathord}{square, ne-to-sw rule filled}%
+\UnicodeMathSymbol{"025A9}{\squarecrossfill }{\mathord}{square with diagonal crosshatch fill}%
+\UnicodeMathSymbol{"025AA}{\smblksquare }{\mathord}{/blacksquare - sq bullet, filled}%
+\UnicodeMathSymbol{"025AB}{\smwhtsquare }{\mathord}{white small square}%
+\UnicodeMathSymbol{"025AC}{\hrectangleblack }{\mathord}{black rectangle}%
+\UnicodeMathSymbol{"025AD}{\hrectangle }{\mathord}{horizontal rectangle, open}%
+\UnicodeMathSymbol{"025AE}{\vrectangleblack }{\mathord}{black vertical rectangle}%
+\UnicodeMathSymbol{"025AF}{\vrectangle }{\mathord}{rectangle, white (vertical)}%
+\UnicodeMathSymbol{"025B0}{\parallelogramblack }{\mathord}{black parallelogram}%
+\UnicodeMathSymbol{"025B1}{\parallelogram }{\mathord}{parallelogram, open}%
+\UnicodeMathSymbol{"025B2}{\bigblacktriangleup }{\mathord}{black up-pointing triangle}%
+\UnicodeMathSymbol{"025B3}{\bigtriangleup }{\mathbin}{big up triangle, open}%
+\UnicodeMathSymbol{"025B4}{\blacktriangle }{\mathord}{up triangle, filled}%
+\UnicodeMathSymbol{"025B5}{\vartriangle }{\mathrel}{/triangle - up triangle, open}%
+\UnicodeMathSymbol{"025B6}{\blacktriangleright }{\mathord}{(large) right triangle, filled}%
+\UnicodeMathSymbol{"025B7}{\triangleright }{\mathbin}{(large) right triangle, open; z notation range restriction}%
+\UnicodeMathSymbol{"025B8}{\smallblacktriangleright }{\mathord}{right triangle, filled}%
+\UnicodeMathSymbol{"025B9}{\smalltriangleright }{\mathord}{right triangle, open}%
+\UnicodeMathSymbol{"025BA}{\blackpointerright }{\mathord}{black right-pointing pointer}%
+\UnicodeMathSymbol{"025BB}{\whitepointerright }{\mathord}{white right-pointing pointer}%
+\UnicodeMathSymbol{"025BC}{\bigblacktriangledown }{\mathord}{big down triangle, filled}%
+\UnicodeMathSymbol{"025BD}{\bigtriangledown }{\mathord}{big down triangle, open}%
+\UnicodeMathSymbol{"025BE}{\blacktriangledown }{\mathord}{down triangle, filled}%
+\UnicodeMathSymbol{"025BF}{\triangledown }{\mathord}{down triangle, open}%
+\UnicodeMathSymbol{"025C0}{\blacktriangleleft }{\mathord}{(large) left triangle, filled}%
+\UnicodeMathSymbol{"025C1}{\triangleleft }{\mathbin}{(large) left triangle, open; z notation domain restriction}%
+\UnicodeMathSymbol{"025C2}{\smallblacktriangleleft }{\mathord}{left triangle, filled}%
+\UnicodeMathSymbol{"025C3}{\smalltriangleleft }{\mathord}{left triangle, open}%
+\UnicodeMathSymbol{"025C4}{\blackpointerleft }{\mathord}{black left-pointing pointer}%
+\UnicodeMathSymbol{"025C5}{\whitepointerleft }{\mathord}{white left-pointing pointer}%
+\UnicodeMathSymbol{"025C6}{\mdlgblkdiamond }{\mathord}{black diamond}%
+\UnicodeMathSymbol{"025C7}{\mdlgwhtdiamond }{\mathord}{white diamond; diamond, open}%
+\UnicodeMathSymbol{"025C8}{\blackinwhitediamond }{\mathord}{white diamond containing black small diamond}%
+\UnicodeMathSymbol{"025C9}{\fisheye }{\mathord}{fisheye}%
+\UnicodeMathSymbol{"025CA}{\mdlgwhtlozenge }{\mathord}{lozenge or total mark}%
+\UnicodeMathSymbol{"025CB}{\mdlgwhtcircle }{\mathbin}{medium large circle}%
+\UnicodeMathSymbol{"025CC}{\dottedcircle }{\mathord}{dotted circle}%
+\UnicodeMathSymbol{"025CD}{\circlevertfill }{\mathord}{circle with vertical fill}%
+\UnicodeMathSymbol{"025CE}{\bullseye }{\mathord}{bullseye}%
+\UnicodeMathSymbol{"025CF}{\mdlgblkcircle }{\mathord}{circle, filled}%
+\UnicodeMathSymbol{"025D0}{\circlelefthalfblack }{\mathord}{circle, filled left half [harvey ball]}%
+\UnicodeMathSymbol{"025D1}{\circlerighthalfblack }{\mathord}{circle, filled right half}%
+\UnicodeMathSymbol{"025D2}{\circlebottomhalfblack }{\mathord}{circle, filled bottom half}%
+\UnicodeMathSymbol{"025D3}{\circletophalfblack }{\mathord}{circle, filled top half}%
+\UnicodeMathSymbol{"025D4}{\circleurquadblack }{\mathord}{circle with upper right quadrant black}%
+\UnicodeMathSymbol{"025D5}{\blackcircleulquadwhite }{\mathord}{circle with all but upper left quadrant black}%
+\UnicodeMathSymbol{"025D6}{\blacklefthalfcircle }{\mathord}{left half black circle}%
+\UnicodeMathSymbol{"025D7}{\blackrighthalfcircle }{\mathord}{right half black circle}%
+\UnicodeMathSymbol{"025D8}{\inversebullet }{\mathord}{inverse bullet }%
+\UnicodeMathSymbol{"025D9}{\inversewhitecircle }{\mathord}{inverse white circle}%
+\UnicodeMathSymbol{"025DA}{\invwhiteupperhalfcircle }{\mathord}{upper half inverse white circle}%
+\UnicodeMathSymbol{"025DB}{\invwhitelowerhalfcircle }{\mathord}{lower half inverse white circle}%
+\UnicodeMathSymbol{"025DC}{\ularc }{\mathord}{upper left quadrant circular arc}%
+\UnicodeMathSymbol{"025DD}{\urarc }{\mathord}{upper right quadrant circular arc}%
+\UnicodeMathSymbol{"025DE}{\lrarc }{\mathord}{lower right quadrant circular arc}%
+\UnicodeMathSymbol{"025DF}{\llarc }{\mathord}{lower left quadrant circular arc}%
+\UnicodeMathSymbol{"025E0}{\topsemicircle }{\mathord}{upper half circle}%
+\UnicodeMathSymbol{"025E1}{\botsemicircle }{\mathord}{lower half circle}%
+\UnicodeMathSymbol{"025E2}{\lrblacktriangle }{\mathord}{lower right triangle, filled}%
+\UnicodeMathSymbol{"025E3}{\llblacktriangle }{\mathord}{lower left triangle, filled}%
+\UnicodeMathSymbol{"025E4}{\ulblacktriangle }{\mathord}{upper left triangle, filled}%
+\UnicodeMathSymbol{"025E5}{\urblacktriangle }{\mathord}{upper right triangle, filled}%
+\UnicodeMathSymbol{"025E6}{\smwhtcircle }{\mathord}{white bullet}%
+\UnicodeMathSymbol{"025E7}{\squareleftblack }{\mathord}{square, filled left half}%
+\UnicodeMathSymbol{"025E8}{\squarerightblack }{\mathord}{square, filled right half}%
+\UnicodeMathSymbol{"025E9}{\squareulblack }{\mathord}{square, filled top left corner}%
+\UnicodeMathSymbol{"025EA}{\squarelrblack }{\mathord}{square, filled bottom right corner}%
+\UnicodeMathSymbol{"025EB}{\boxbar }{\mathbin}{vertical bar in box}%
+\UnicodeMathSymbol{"025EC}{\trianglecdot }{\mathord}{triangle with centered dot}%
+\UnicodeMathSymbol{"025ED}{\triangleleftblack }{\mathord}{up-pointing triangle with left half black}%
+\UnicodeMathSymbol{"025EE}{\trianglerightblack }{\mathord}{up-pointing triangle with right half black}%
+\UnicodeMathSymbol{"025EF}{\lgwhtcircle }{\mathord}{large circle}%
+\UnicodeMathSymbol{"025F0}{\squareulquad }{\mathord}{white square with upper left quadrant}%
+\UnicodeMathSymbol{"025F1}{\squarellquad }{\mathord}{white square with lower left quadrant}%
+\UnicodeMathSymbol{"025F2}{\squarelrquad }{\mathord}{white square with lower right quadrant}%
+\UnicodeMathSymbol{"025F3}{\squareurquad }{\mathord}{white square with upper right quadrant}%
+\UnicodeMathSymbol{"025F4}{\circleulquad }{\mathord}{white circle with upper left quadrant}%
+\UnicodeMathSymbol{"025F5}{\circlellquad }{\mathord}{white circle with lower left quadrant}%
+\UnicodeMathSymbol{"025F6}{\circlelrquad }{\mathord}{white circle with lower right quadrant}%
+\UnicodeMathSymbol{"025F7}{\circleurquad }{\mathord}{white circle with upper right quadrant}%
+\UnicodeMathSymbol{"025F8}{\ultriangle }{\mathord}{upper left triangle}%
+\UnicodeMathSymbol{"025F9}{\urtriangle }{\mathord}{upper right triangle}%
+\UnicodeMathSymbol{"025FA}{\lltriangle }{\mathord}{lower left triangle}%
+\UnicodeMathSymbol{"025FB}{\mdwhtsquare }{\mathord}{white medium square}%
+\UnicodeMathSymbol{"025FC}{\mdblksquare }{\mathord}{black medium square}%
+\UnicodeMathSymbol{"025FD}{\mdsmwhtsquare }{\mathord}{white medium small square}%
+\UnicodeMathSymbol{"025FE}{\mdsmblksquare }{\mathord}{black medium small square}%
+\UnicodeMathSymbol{"025FF}{\lrtriangle }{\mathord}{lower right triangle}%
+\UnicodeMathSymbol{"02605}{\bigstar }{\mathord}{star, filled}%
+\UnicodeMathSymbol{"02606}{\bigwhitestar }{\mathord}{star, open}%
+\UnicodeMathSymbol{"02609}{\astrosun }{\mathord}{sun}%
+\UnicodeMathSymbol{"02621}{\danger }{\mathord}{dangerous bend (caution sign)}%
+\UnicodeMathSymbol{"0263B}{\blacksmiley }{\mathord}{black smiling face}%
+\UnicodeMathSymbol{"0263C}{\sun }{\mathord}{white sun with rays}%
+\UnicodeMathSymbol{"0263D}{\rightmoon }{\mathord}{first quarter moon}%
+\UnicodeMathSymbol{"0263E}{\leftmoon }{\mathord}{last quarter moon}%
+\UnicodeMathSymbol{"02640}{\female }{\mathord}{venus, female}%
+\UnicodeMathSymbol{"02642}{\male }{\mathord}{mars, male}%
+\UnicodeMathSymbol{"02660}{\spadesuit }{\mathord}{spades suit symbol}%
+\UnicodeMathSymbol{"02661}{\heartsuit }{\mathord}{heart suit symbol}%
+\UnicodeMathSymbol{"02662}{\diamondsuit }{\mathord}{diamond suit symbol}%
+\UnicodeMathSymbol{"02663}{\clubsuit }{\mathord}{club suit symbol}%
+\UnicodeMathSymbol{"02664}{\varspadesuit }{\mathord}{spade, white (card suit)}%
+\UnicodeMathSymbol{"02665}{\varheartsuit }{\mathord}{filled heart (card suit)}%
+\UnicodeMathSymbol{"02666}{\vardiamondsuit }{\mathord}{filled diamond (card suit)}%
+\UnicodeMathSymbol{"02667}{\varclubsuit }{\mathord}{club, white (card suit)}%
+\UnicodeMathSymbol{"02669}{\quarternote }{\mathord}{music note (sung text sign)}%
+\UnicodeMathSymbol{"0266A}{\eighthnote }{\mathord}{eighth note}%
+\UnicodeMathSymbol{"0266B}{\twonotes }{\mathord}{beamed eighth notes}%
+\UnicodeMathSymbol{"0266D}{\flat }{\mathord}{musical flat}%
+\UnicodeMathSymbol{"0266E}{\natural }{\mathord}{music natural}%
+\UnicodeMathSymbol{"0266F}{\sharp }{\mathord}{musical sharp}%
+\UnicodeMathSymbol{"0267E}{\acidfree }{\mathord}{permanent paper sign}%
+\UnicodeMathSymbol{"02680}{\dicei }{\mathord}{die face-1}%
+\UnicodeMathSymbol{"02681}{\diceii }{\mathord}{die face-2}%
+\UnicodeMathSymbol{"02682}{\diceiii }{\mathord}{die face-3}%
+\UnicodeMathSymbol{"02683}{\diceiv }{\mathord}{die face-4}%
+\UnicodeMathSymbol{"02684}{\dicev }{\mathord}{die face-5}%
+\UnicodeMathSymbol{"02685}{\dicevi }{\mathord}{die face-6}%
+\UnicodeMathSymbol{"02686}{\circledrightdot }{\mathord}{white circle with dot right}%
+\UnicodeMathSymbol{"02687}{\circledtwodots }{\mathord}{white circle with two dots}%
+\UnicodeMathSymbol{"02688}{\blackcircledrightdot }{\mathord}{black circle with white dot right}%
+\UnicodeMathSymbol{"02689}{\blackcircledtwodots }{\mathord}{black circle with two white dots}%
+\UnicodeMathSymbol{"026A5}{\Hermaphrodite }{\mathord}{male and female sign}%
+\UnicodeMathSymbol{"026AA}{\mdwhtcircle }{\mathord}{medium white circle}%
+\UnicodeMathSymbol{"026AB}{\mdblkcircle }{\mathord}{medium black circle}%
+\UnicodeMathSymbol{"026AC}{\mdsmwhtcircle }{\mathord}{medium small white circle}%
+\UnicodeMathSymbol{"026B2}{\neuter }{\mathord}{neuter}%
+\UnicodeMathSymbol{"02713}{\checkmark }{\mathord}{tick, check mark}%
+\UnicodeMathSymbol{"02720}{\maltese }{\mathord}{maltese cross}%
+\UnicodeMathSymbol{"0272A}{\circledstar }{\mathord}{circled white star}%
+\UnicodeMathSymbol{"02736}{\varstar }{\mathord}{six pointed black star}%
+\UnicodeMathSymbol{"0273D}{\dingasterisk }{\mathord}{heavy teardrop-spoked asterisk}%
+\UnicodeMathSymbol{"02772}{\lbrbrak }{\mathopen}{light left tortoise shell bracket ornament}%
+\UnicodeMathSymbol{"02773}{\rbrbrak }{\mathclose}{light right tortoise shell bracket ornament}%
+\UnicodeMathSymbol{"0279B}{\draftingarrow }{\mathord}{right arrow with bold head (drafting)}%
+\UnicodeMathSymbol{"027C0}{\threedangle }{\mathord}{three dimensional angle}%
+\UnicodeMathSymbol{"027C1}{\whiteinwhitetriangle }{\mathord}{white triangle containing small white triangle}%
+\UnicodeMathSymbol{"027C2}{\perp }{\mathrel}{perpendicular}%
+\UnicodeMathSymbol{"027C3}{\subsetcirc }{\mathord}{open subset}%
+\UnicodeMathSymbol{"027C4}{\supsetcirc }{\mathord}{open superset}%
+\UnicodeMathSymbol{"027C5}{\lbag }{\mathopen}{left s-shaped bag delimiter}%
+\UnicodeMathSymbol{"027C6}{\rbag }{\mathclose}{right s-shaped bag delimiter}%
+\UnicodeMathSymbol{"027C7}{\veedot }{\mathbin}{or with dot inside}%
+\UnicodeMathSymbol{"027C8}{\bsolhsub }{\mathrel}{reverse solidus preceding subset}%
+\UnicodeMathSymbol{"027C9}{\suphsol }{\mathrel}{superset preceding solidus}%
+\UnicodeMathSymbol{"027CC}{\longdivision }{\mathopen}{long division}%
+\UnicodeMathSymbol{"027D0}{\diamondcdot }{\mathord}{white diamond with centred dot}%
+\UnicodeMathSymbol{"027D1}{\wedgedot }{\mathbin}{and with dot}%
+\UnicodeMathSymbol{"027D2}{\upin }{\mathrel}{element of opening upwards}%
+\UnicodeMathSymbol{"027D3}{\pullback }{\mathrel}{lower right corner with dot}%
+\UnicodeMathSymbol{"027D4}{\pushout }{\mathrel}{upper left corner with dot}%
+\UnicodeMathSymbol{"027D5}{\leftouterjoin }{\mathop}{left outer join}%
+\UnicodeMathSymbol{"027D6}{\rightouterjoin }{\mathop}{right outer join}%
+\UnicodeMathSymbol{"027D7}{\fullouterjoin }{\mathop}{full outer join}%
+\UnicodeMathSymbol{"027D8}{\bigbot }{\mathop}{large up tack}%
+\UnicodeMathSymbol{"027D9}{\bigtop }{\mathop}{large down tack}%
+\UnicodeMathSymbol{"027DA}{\DashVDash }{\mathrel}{left and right double turnstile}%
+\UnicodeMathSymbol{"027DB}{\dashVdash }{\mathrel}{left and right tack}%
+\UnicodeMathSymbol{"027DC}{\multimapinv }{\mathrel}{left multimap}%
+\UnicodeMathSymbol{"027DD}{\vlongdash }{\mathrel}{long left tack}%
+\UnicodeMathSymbol{"027DE}{\longdashv }{\mathrel}{long right tack}%
+\UnicodeMathSymbol{"027DF}{\cirbot }{\mathrel}{up tack with circle above}%
+\UnicodeMathSymbol{"027E0}{\lozengeminus }{\mathbin}{lozenge divided by horizontal rule}%
+\UnicodeMathSymbol{"027E1}{\concavediamond }{\mathbin}{white concave-sided diamond}%
+\UnicodeMathSymbol{"027E2}{\concavediamondtickleft }{\mathbin}{white concave-sided diamond with leftwards tick}%
+\UnicodeMathSymbol{"027E3}{\concavediamondtickright }{\mathbin}{white concave-sided diamond with rightwards tick}%
+\UnicodeMathSymbol{"027E4}{\whitesquaretickleft }{\mathbin}{white square with leftwards tick}%
+\UnicodeMathSymbol{"027E5}{\whitesquaretickright }{\mathbin}{white square with rightwards tick}%
+\UnicodeMathSymbol{"027E6}{\lBrack }{\mathopen}{mathematical left white square bracket}%
+\UnicodeMathSymbol{"027E7}{\rBrack }{\mathclose}{mathematical right white square bracket}%
+\UnicodeMathSymbol{"027E8}{\langle }{\mathopen}{mathematical left angle bracket}%
+\UnicodeMathSymbol{"027E9}{\rangle }{\mathclose}{mathematical right angle bracket}%
+\UnicodeMathSymbol{"027EA}{\lAngle }{\mathopen}{mathematical left double angle bracket}%
+\UnicodeMathSymbol{"027EB}{\rAngle }{\mathclose}{mathematical right double angle bracket}%
+\UnicodeMathSymbol{"027EC}{\Lbrbrak }{\mathopen}{mathematical left white tortoise shell bracket}%
+\UnicodeMathSymbol{"027ED}{\Rbrbrak }{\mathclose}{mathematical right white tortoise shell bracket}%
+\UnicodeMathSymbol{"027EE}{\lgroup }{\mathopen}{mathematical left flattened parenthesis}%
+\UnicodeMathSymbol{"027EF}{\rgroup }{\mathclose}{mathematical right flattened parenthesis}%
+\UnicodeMathSymbol{"027F0}{\UUparrow }{\mathrel}{upwards quadruple arrow}%
+\UnicodeMathSymbol{"027F1}{\DDownarrow }{\mathrel}{downwards quadruple arrow}%
+\UnicodeMathSymbol{"027F2}{\acwgapcirclearrow }{\mathrel}{anticlockwise gapped circle arrow}%
+\UnicodeMathSymbol{"027F3}{\cwgapcirclearrow }{\mathrel}{clockwise gapped circle arrow}%
+\UnicodeMathSymbol{"027F4}{\rightarrowonoplus }{\mathrel}{right arrow with circled plus}%
+\UnicodeMathSymbol{"027F5}{\longleftarrow }{\mathrel}{long leftwards arrow}%
+\UnicodeMathSymbol{"027F6}{\longrightarrow }{\mathrel}{long rightwards arrow}%
+\UnicodeMathSymbol{"027F7}{\longleftrightarrow }{\mathrel}{long left right arrow}%
+\UnicodeMathSymbol{"027F8}{\Longleftarrow }{\mathrel}{long leftwards double arrow}%
+\UnicodeMathSymbol{"027F9}{\Longrightarrow }{\mathrel}{long rightwards double arrow}%
+\UnicodeMathSymbol{"027FA}{\Longleftrightarrow }{\mathrel}{long left right double arrow}%
+\UnicodeMathSymbol{"027FB}{\longmapsfrom }{\mathrel}{long leftwards arrow from bar}%
+\UnicodeMathSymbol{"027FC}{\longmapsto }{\mathrel}{long rightwards arrow from bar}%
+\UnicodeMathSymbol{"027FD}{\Longmapsfrom }{\mathrel}{long leftwards double arrow from bar}%
+\UnicodeMathSymbol{"027FE}{\Longmapsto }{\mathrel}{long rightwards double arrow from bar}%
+\UnicodeMathSymbol{"027FF}{\longrightsquigarrow }{\mathrel}{long rightwards squiggle arrow}%
+\UnicodeMathSymbol{"02900}{\nvtwoheadrightarrow }{\mathrel}{rightwards two-headed arrow with vertical stroke}%
+\UnicodeMathSymbol{"02901}{\nVtwoheadrightarrow }{\mathrel}{rightwards two-headed arrow with double vertical stroke}%
+\UnicodeMathSymbol{"02902}{\nvLeftarrow }{\mathrel}{leftwards double arrow with vertical stroke}%
+\UnicodeMathSymbol{"02903}{\nvRightarrow }{\mathrel}{rightwards double arrow with vertical stroke}%
+\UnicodeMathSymbol{"02904}{\nvLeftrightarrow }{\mathrel}{left right double arrow with vertical stroke}%
+\UnicodeMathSymbol{"02905}{\twoheadmapsto }{\mathrel}{rightwards two-headed arrow from bar}%
+\UnicodeMathSymbol{"02906}{\Mapsfrom }{\mathrel}{leftwards double arrow from bar}%
+\UnicodeMathSymbol{"02907}{\Mapsto }{\mathrel}{rightwards double arrow from bar}%
+\UnicodeMathSymbol{"02908}{\downarrowbarred }{\mathrel}{downwards arrow with horizontal stroke}%
+\UnicodeMathSymbol{"02909}{\uparrowbarred }{\mathrel}{upwards arrow with horizontal stroke}%
+\UnicodeMathSymbol{"0290A}{\Uuparrow }{\mathrel}{upwards triple arrow}%
+\UnicodeMathSymbol{"0290B}{\Ddownarrow }{\mathrel}{downwards triple arrow}%
+\UnicodeMathSymbol{"0290C}{\leftbkarrow }{\mathrel}{leftwards double dash arrow}%
+\UnicodeMathSymbol{"0290D}{\rightbkarrow }{\mathrel}{rightwards double dash arrow}%
+\UnicodeMathSymbol{"0290E}{\leftdbkarrow }{\mathrel}{leftwards triple dash arrow}%
+\UnicodeMathSymbol{"0290F}{\dbkarrow }{\mathrel}{rightwards triple dash arrow}%
+\UnicodeMathSymbol{"02910}{\drbkarrow }{\mathrel}{rightwards two-headed triple dash arrow}%
+\UnicodeMathSymbol{"02911}{\rightdotarrow }{\mathrel}{rightwards arrow with dotted stem}%
+\UnicodeMathSymbol{"02912}{\baruparrow }{\mathrel}{upwards arrow to bar}%
+\UnicodeMathSymbol{"02913}{\downarrowbar }{\mathrel}{downwards arrow to bar}%
+\UnicodeMathSymbol{"02914}{\nvrightarrowtail }{\mathrel}{rightwards arrow with tail with vertical stroke}%
+\UnicodeMathSymbol{"02915}{\nVrightarrowtail }{\mathrel}{rightwards arrow with tail with double vertical stroke}%
+\UnicodeMathSymbol{"02916}{\twoheadrightarrowtail }{\mathrel}{rightwards two-headed arrow with tail}%
+\UnicodeMathSymbol{"02917}{\nvtwoheadrightarrowtail }{\mathrel}{rightwards two-headed arrow with tail with vertical stroke}%
+\UnicodeMathSymbol{"02918}{\nVtwoheadrightarrowtail }{\mathrel}{rightwards two-headed arrow with tail with double vertical stroke}%
+\UnicodeMathSymbol{"02919}{\lefttail }{\mathrel}{leftwards arrow-tail}%
+\UnicodeMathSymbol{"0291A}{\righttail }{\mathrel}{rightwards arrow-tail}%
+\UnicodeMathSymbol{"0291B}{\leftdbltail }{\mathrel}{leftwards double arrow-tail}%
+\UnicodeMathSymbol{"0291C}{\rightdbltail }{\mathrel}{rightwards double arrow-tail}%
+\UnicodeMathSymbol{"0291D}{\diamondleftarrow }{\mathrel}{leftwards arrow to black diamond}%
+\UnicodeMathSymbol{"0291E}{\rightarrowdiamond }{\mathrel}{rightwards arrow to black diamond}%
+\UnicodeMathSymbol{"0291F}{\diamondleftarrowbar }{\mathrel}{leftwards arrow from bar to black diamond}%
+\UnicodeMathSymbol{"02920}{\barrightarrowdiamond }{\mathrel}{rightwards arrow from bar to black diamond}%
+\UnicodeMathSymbol{"02921}{\nwsearrow }{\mathrel}{north west and south east arrow}%
+\UnicodeMathSymbol{"02922}{\neswarrow }{\mathrel}{north east and south west arrow}%
+\UnicodeMathSymbol{"02923}{\hknwarrow }{\mathrel}{north west arrow with hook}%
+\UnicodeMathSymbol{"02924}{\hknearrow }{\mathrel}{north east arrow with hook}%
+\UnicodeMathSymbol{"02925}{\hksearrow }{\mathrel}{south east arrow with hook}%
+\UnicodeMathSymbol{"02926}{\hkswarrow }{\mathrel}{south west arrow with hook}%
+\UnicodeMathSymbol{"02927}{\tona }{\mathrel}{north west arrow and north east arrow}%
+\UnicodeMathSymbol{"02928}{\toea }{\mathrel}{north east arrow and south east arrow}%
+\UnicodeMathSymbol{"02929}{\tosa }{\mathrel}{south east arrow and south west arrow}%
+\UnicodeMathSymbol{"0292A}{\towa }{\mathrel}{south west arrow and north west arrow}%
+\UnicodeMathSymbol{"0292B}{\rdiagovfdiag }{\mathord}{rising diagonal crossing falling diagonal}%
+\UnicodeMathSymbol{"0292C}{\fdiagovrdiag }{\mathord}{falling diagonal crossing rising diagonal}%
+\UnicodeMathSymbol{"0292D}{\seovnearrow }{\mathord}{south east arrow crossing north east arrow}%
+\UnicodeMathSymbol{"0292E}{\neovsearrow }{\mathord}{north east arrow crossing south east arrow}%
+\UnicodeMathSymbol{"0292F}{\fdiagovnearrow }{\mathord}{falling diagonal crossing north east arrow}%
+\UnicodeMathSymbol{"02930}{\rdiagovsearrow }{\mathord}{rising diagonal crossing south east arrow}%
+\UnicodeMathSymbol{"02931}{\neovnwarrow }{\mathord}{north east arrow crossing north west arrow}%
+\UnicodeMathSymbol{"02932}{\nwovnearrow }{\mathord}{north west arrow crossing north east arrow}%
+\UnicodeMathSymbol{"02933}{\rightcurvedarrow }{\mathrel}{wave arrow pointing directly right}%
+\UnicodeMathSymbol{"02934}{\uprightcurvearrow }{\mathord}{arrow pointing rightwards then curving upwards}%
+\UnicodeMathSymbol{"02935}{\downrightcurvedarrow }{\mathord}{arrow pointing rightwards then curving downwards}%
+\UnicodeMathSymbol{"02936}{\leftdowncurvedarrow }{\mathrel}{arrow pointing downwards then curving leftwards}%
+\UnicodeMathSymbol{"02937}{\rightdowncurvedarrow }{\mathrel}{arrow pointing downwards then curving rightwards}%
+\UnicodeMathSymbol{"02938}{\cwrightarcarrow }{\mathrel}{right-side arc clockwise arrow}%
+\UnicodeMathSymbol{"02939}{\acwleftarcarrow }{\mathrel}{left-side arc anticlockwise arrow}%
+\UnicodeMathSymbol{"0293A}{\acwoverarcarrow }{\mathrel}{top arc anticlockwise arrow}%
+\UnicodeMathSymbol{"0293B}{\acwunderarcarrow }{\mathrel}{bottom arc anticlockwise arrow}%
+\UnicodeMathSymbol{"0293C}{\curvearrowrightminus }{\mathrel}{top arc clockwise arrow with minus}%
+\UnicodeMathSymbol{"0293D}{\curvearrowleftplus }{\mathrel}{top arc anticlockwise arrow with plus}%
+\UnicodeMathSymbol{"0293E}{\cwundercurvearrow }{\mathrel}{lower right semicircular clockwise arrow}%
+\UnicodeMathSymbol{"0293F}{\ccwundercurvearrow }{\mathrel}{lower left semicircular anticlockwise arrow}%
+\UnicodeMathSymbol{"02940}{\acwcirclearrow }{\mathrel}{anticlockwise closed circle arrow}%
+\UnicodeMathSymbol{"02941}{\cwcirclearrow }{\mathrel}{clockwise closed circle arrow}%
+\UnicodeMathSymbol{"02942}{\rightarrowshortleftarrow }{\mathrel}{rightwards arrow above short leftwards arrow}%
+\UnicodeMathSymbol{"02943}{\leftarrowshortrightarrow }{\mathrel}{leftwards arrow above short rightwards arrow}%
+\UnicodeMathSymbol{"02944}{\shortrightarrowleftarrow }{\mathrel}{short rightwards arrow above leftwards arrow}%
+\UnicodeMathSymbol{"02945}{\rightarrowplus }{\mathrel}{rightwards arrow with plus below}%
+\UnicodeMathSymbol{"02946}{\leftarrowplus }{\mathrel}{leftwards arrow with plus below}%
+\UnicodeMathSymbol{"02947}{\rightarrowx }{\mathrel}{rightwards arrow through x}%
+\UnicodeMathSymbol{"02948}{\leftrightarrowcircle }{\mathrel}{left right arrow through small circle}%
+\UnicodeMathSymbol{"02949}{\twoheaduparrowcircle }{\mathrel}{upwards two-headed arrow from small circle}%
+\UnicodeMathSymbol{"0294A}{\leftrightharpoonupdown }{\mathrel}{left barb up right barb down harpoon}%
+\UnicodeMathSymbol{"0294B}{\leftrightharpoondownup }{\mathrel}{left barb down right barb up harpoon}%
+\UnicodeMathSymbol{"0294C}{\updownharpoonrightleft }{\mathrel}{up barb right down barb left harpoon}%
+\UnicodeMathSymbol{"0294D}{\updownharpoonleftright }{\mathrel}{up barb left down barb right harpoon}%
+\UnicodeMathSymbol{"0294E}{\leftrightharpoonupup }{\mathrel}{left barb up right barb up harpoon}%
+\UnicodeMathSymbol{"0294F}{\updownharpoonrightright }{\mathrel}{up barb right down barb right harpoon}%
+\UnicodeMathSymbol{"02950}{\leftrightharpoondowndown }{\mathrel}{left barb down right barb down harpoon}%
+\UnicodeMathSymbol{"02951}{\updownharpoonleftleft }{\mathrel}{up barb left down barb left harpoon}%
+\UnicodeMathSymbol{"02952}{\barleftharpoonup }{\mathrel}{leftwards harpoon with barb up to bar}%
+\UnicodeMathSymbol{"02953}{\rightharpoonupbar }{\mathrel}{rightwards harpoon with barb up to bar}%
+\UnicodeMathSymbol{"02954}{\barupharpoonright }{\mathrel}{upwards harpoon with barb right to bar}%
+\UnicodeMathSymbol{"02955}{\downharpoonrightbar }{\mathrel}{downwards harpoon with barb right to bar}%
+\UnicodeMathSymbol{"02956}{\barleftharpoondown }{\mathrel}{leftwards harpoon with barb down to bar}%
+\UnicodeMathSymbol{"02957}{\rightharpoondownbar }{\mathrel}{rightwards harpoon with barb down to bar}%
+\UnicodeMathSymbol{"02958}{\barupharpoonleft }{\mathrel}{upwards harpoon with barb left to bar}%
+\UnicodeMathSymbol{"02959}{\downharpoonleftbar }{\mathrel}{downwards harpoon with barb left to bar}%
+\UnicodeMathSymbol{"0295A}{\leftharpoonupbar }{\mathrel}{leftwards harpoon with barb up from bar}%
+\UnicodeMathSymbol{"0295B}{\barrightharpoonup }{\mathrel}{rightwards harpoon with barb up from bar}%
+\UnicodeMathSymbol{"0295C}{\upharpoonrightbar }{\mathrel}{upwards harpoon with barb right from bar}%
+\UnicodeMathSymbol{"0295D}{\bardownharpoonright }{\mathrel}{downwards harpoon with barb right from bar}%
+\UnicodeMathSymbol{"0295E}{\leftharpoondownbar }{\mathrel}{leftwards harpoon with barb down from bar}%
+\UnicodeMathSymbol{"0295F}{\barrightharpoondown }{\mathrel}{rightwards harpoon with barb down from bar}%
+\UnicodeMathSymbol{"02960}{\upharpoonleftbar }{\mathrel}{upwards harpoon with barb left from bar}%
+\UnicodeMathSymbol{"02961}{\bardownharpoonleft }{\mathrel}{downwards harpoon with barb left from bar}%
+\UnicodeMathSymbol{"02962}{\leftharpoonsupdown }{\mathrel}{leftwards harpoon with barb up above leftwards harpoon with barb down}%
+\UnicodeMathSymbol{"02963}{\upharpoonsleftright }{\mathrel}{upwards harpoon with barb left beside upwards harpoon with barb right}%
+\UnicodeMathSymbol{"02964}{\rightharpoonsupdown }{\mathrel}{rightwards harpoon with barb up above rightwards harpoon with barb down}%
+\UnicodeMathSymbol{"02965}{\downharpoonsleftright }{\mathrel}{downwards harpoon with barb left beside downwards harpoon with barb right}%
+\UnicodeMathSymbol{"02966}{\leftrightharpoonsup }{\mathrel}{leftwards harpoon with barb up above rightwards harpoon with barb up}%
+\UnicodeMathSymbol{"02967}{\leftrightharpoonsdown }{\mathrel}{leftwards harpoon with barb down above rightwards harpoon with barb down}%
+\UnicodeMathSymbol{"02968}{\rightleftharpoonsup }{\mathrel}{rightwards harpoon with barb up above leftwards harpoon with barb up}%
+\UnicodeMathSymbol{"02969}{\rightleftharpoonsdown }{\mathrel}{rightwards harpoon with barb down above leftwards harpoon with barb down}%
+\UnicodeMathSymbol{"0296A}{\leftharpoonupdash }{\mathrel}{leftwards harpoon with barb up above long dash}%
+\UnicodeMathSymbol{"0296B}{\dashleftharpoondown }{\mathrel}{leftwards harpoon with barb down below long dash}%
+\UnicodeMathSymbol{"0296C}{\rightharpoonupdash }{\mathrel}{rightwards harpoon with barb up above long dash}%
+\UnicodeMathSymbol{"0296D}{\dashrightharpoondown }{\mathrel}{rightwards harpoon with barb down below long dash}%
+\UnicodeMathSymbol{"0296E}{\updownharpoonsleftright }{\mathrel}{upwards harpoon with barb left beside downwards harpoon with barb right}%
+\UnicodeMathSymbol{"0296F}{\downupharpoonsleftright }{\mathrel}{downwards harpoon with barb left beside upwards harpoon with barb right}%
+\UnicodeMathSymbol{"02970}{\rightimply }{\mathrel}{right double arrow with rounded head}%
+\UnicodeMathSymbol{"02971}{\equalrightarrow }{\mathrel}{equals sign above rightwards arrow}%
+\UnicodeMathSymbol{"02972}{\similarrightarrow }{\mathrel}{tilde operator above rightwards arrow}%
+\UnicodeMathSymbol{"02973}{\leftarrowsimilar }{\mathrel}{leftwards arrow above tilde operator}%
+\UnicodeMathSymbol{"02974}{\rightarrowsimilar }{\mathrel}{rightwards arrow above tilde operator}%
+\UnicodeMathSymbol{"02975}{\rightarrowapprox }{\mathrel}{rightwards arrow above almost equal to}%
+\UnicodeMathSymbol{"02976}{\ltlarr }{\mathrel}{less-than above leftwards arrow}%
+\UnicodeMathSymbol{"02977}{\leftarrowless }{\mathrel}{leftwards arrow through less-than}%
+\UnicodeMathSymbol{"02978}{\gtrarr }{\mathrel}{greater-than above rightwards arrow}%
+\UnicodeMathSymbol{"02979}{\subrarr }{\mathrel}{subset above rightwards arrow}%
+\UnicodeMathSymbol{"0297A}{\leftarrowsubset }{\mathrel}{leftwards arrow through subset}%
+\UnicodeMathSymbol{"0297B}{\suplarr }{\mathrel}{superset above leftwards arrow}%
+\UnicodeMathSymbol{"0297C}{\leftfishtail }{\mathrel}{left fish tail}%
+\UnicodeMathSymbol{"0297D}{\rightfishtail }{\mathrel}{right fish tail}%
+\UnicodeMathSymbol{"0297E}{\upfishtail }{\mathrel}{up fish tail}%
+\UnicodeMathSymbol{"0297F}{\downfishtail }{\mathrel}{down fish tail}%
+\UnicodeMathSymbol{"02980}{\Vvert }{\mathfence}{triple vertical bar delimiter}%
+\UnicodeMathSymbol{"02981}{\mdsmblkcircle }{\mathord}{z notation spot}%
+\UnicodeMathSymbol{"02982}{\typecolon }{\mathrel}{z notation type colon}%
+\UnicodeMathSymbol{"02983}{\lBrace }{\mathopen}{left white curly bracket}%
+\UnicodeMathSymbol{"02984}{\rBrace }{\mathclose}{right white curly bracket}%
+\UnicodeMathSymbol{"02985}{\lParen }{\mathopen}{left white parenthesis}%
+\UnicodeMathSymbol{"02986}{\rParen }{\mathclose}{right white parenthesis}%
+\UnicodeMathSymbol{"02987}{\llparenthesis }{\mathopen}{z notation left image bracket}%
+\UnicodeMathSymbol{"02988}{\rrparenthesis }{\mathclose}{z notation right image bracket}%
+\UnicodeMathSymbol{"02989}{\llangle }{\mathopen}{z notation left binding bracket}%
+\UnicodeMathSymbol{"0298A}{\rrangle }{\mathclose}{z notation right binding bracket}%
+\UnicodeMathSymbol{"0298B}{\lbrackubar }{\mathopen}{left square bracket with underbar}%
+\UnicodeMathSymbol{"0298C}{\rbrackubar }{\mathclose}{right square bracket with underbar}%
+\UnicodeMathSymbol{"0298D}{\lbrackultick }{\mathopen}{left square bracket with tick in top corner}%
+\UnicodeMathSymbol{"0298E}{\rbracklrtick }{\mathclose}{right square bracket with tick in bottom corner}%
+\UnicodeMathSymbol{"0298F}{\lbracklltick }{\mathopen}{left square bracket with tick in bottom corner}%
+\UnicodeMathSymbol{"02990}{\rbrackurtick }{\mathclose}{right square bracket with tick in top corner}%
+\UnicodeMathSymbol{"02991}{\langledot }{\mathopen}{left angle bracket with dot}%
+\UnicodeMathSymbol{"02992}{\rangledot }{\mathclose}{right angle bracket with dot}%
+\UnicodeMathSymbol{"02993}{\lparenless }{\mathopen}{left arc less-than bracket}%
+\UnicodeMathSymbol{"02994}{\rparengtr }{\mathclose}{right arc greater-than bracket}%
+\UnicodeMathSymbol{"02995}{\Lparengtr }{\mathopen}{double left arc greater-than bracket}%
+\UnicodeMathSymbol{"02996}{\Rparenless }{\mathclose}{double right arc less-than bracket}%
+\UnicodeMathSymbol{"02997}{\lblkbrbrak }{\mathopen}{left black tortoise shell bracket}%
+\UnicodeMathSymbol{"02998}{\rblkbrbrak }{\mathclose}{right black tortoise shell bracket}%
+\UnicodeMathSymbol{"02999}{\fourvdots }{\mathord}{dotted fence}%
+\UnicodeMathSymbol{"0299A}{\vzigzag }{\mathord}{vertical zigzag line}%
+\UnicodeMathSymbol{"0299B}{\measuredangleleft }{\mathord}{measured angle opening left}%
+\UnicodeMathSymbol{"0299C}{\rightanglesqr }{\mathord}{right angle variant with square}%
+\UnicodeMathSymbol{"0299D}{\rightanglemdot }{\mathord}{measured right angle with dot}%
+\UnicodeMathSymbol{"0299E}{\angles }{\mathord}{angle with s inside}%
+\UnicodeMathSymbol{"0299F}{\angdnr }{\mathord}{acute angle}%
+\UnicodeMathSymbol{"029A0}{\gtlpar }{\mathord}{spherical angle opening left}%
+\UnicodeMathSymbol{"029A1}{\sphericalangleup }{\mathord}{spherical angle opening up}%
+\UnicodeMathSymbol{"029A2}{\turnangle }{\mathord}{turned angle}%
+\UnicodeMathSymbol{"029A3}{\revangle }{\mathord}{reversed angle}%
+\UnicodeMathSymbol{"029A4}{\angleubar }{\mathord}{angle with underbar}%
+\UnicodeMathSymbol{"029A5}{\revangleubar }{\mathord}{reversed angle with underbar}%
+\UnicodeMathSymbol{"029A6}{\wideangledown }{\mathord}{oblique angle opening up}%
+\UnicodeMathSymbol{"029A7}{\wideangleup }{\mathord}{oblique angle opening down}%
+\UnicodeMathSymbol{"029A8}{\measanglerutone }{\mathord}{measured angle with open arm ending in arrow pointing up and right}%
+\UnicodeMathSymbol{"029A9}{\measanglelutonw }{\mathord}{measured angle with open arm ending in arrow pointing up and left}%
+\UnicodeMathSymbol{"029AA}{\measanglerdtose }{\mathord}{measured angle with open arm ending in arrow pointing down and right}%
+\UnicodeMathSymbol{"029AB}{\measangleldtosw }{\mathord}{measured angle with open arm ending in arrow pointing down and left}%
+\UnicodeMathSymbol{"029AC}{\measangleurtone }{\mathord}{measured angle with open arm ending in arrow pointing right and up}%
+\UnicodeMathSymbol{"029AD}{\measangleultonw }{\mathord}{measured angle with open arm ending in arrow pointing left and up}%
+\UnicodeMathSymbol{"029AE}{\measangledrtose }{\mathord}{measured angle with open arm ending in arrow pointing right and down}%
+\UnicodeMathSymbol{"029AF}{\measangledltosw }{\mathord}{measured angle with open arm ending in arrow pointing left and down}%
+\UnicodeMathSymbol{"029B0}{\revemptyset }{\mathord}{reversed empty set}%
+\UnicodeMathSymbol{"029B1}{\emptysetobar }{\mathord}{empty set with overbar}%
+\UnicodeMathSymbol{"029B2}{\emptysetocirc }{\mathord}{empty set with small circle above}%
+\UnicodeMathSymbol{"029B3}{\emptysetoarr }{\mathord}{empty set with right arrow above}%
+\UnicodeMathSymbol{"029B4}{\emptysetoarrl }{\mathord}{empty set with left arrow above}%
+\UnicodeMathSymbol{"029B5}{\circlehbar }{\mathbin}{circle with horizontal bar}%
+\UnicodeMathSymbol{"029B6}{\circledvert }{\mathbin}{circled vertical bar}%
+\UnicodeMathSymbol{"029B7}{\circledparallel }{\mathbin}{circled parallel}%
+\UnicodeMathSymbol{"029B8}{\obslash }{\mathbin}{circled reverse solidus}%
+\UnicodeMathSymbol{"029B9}{\operp }{\mathbin}{circled perpendicular}%
+\UnicodeMathSymbol{"029BA}{\obot }{\mathord}{circle divided by horizontal bar and top half divided by vertical bar}%
+\UnicodeMathSymbol{"029BB}{\olcross }{\mathord}{circle with superimposed x}%
+\UnicodeMathSymbol{"029BC}{\odotslashdot }{\mathord}{circled anticlockwise-rotated division sign}%
+\UnicodeMathSymbol{"029BD}{\uparrowoncircle }{\mathord}{up arrow through circle}%
+\UnicodeMathSymbol{"029BE}{\circledwhitebullet }{\mathord}{circled white bullet}%
+\UnicodeMathSymbol{"029BF}{\circledbullet }{\mathord}{circled bullet}%
+\UnicodeMathSymbol{"029C0}{\olessthan }{\mathbin}{circled less-than}%
+\UnicodeMathSymbol{"029C1}{\ogreaterthan }{\mathbin}{circled greater-than}%
+\UnicodeMathSymbol{"029C2}{\cirscir }{\mathord}{circle with small circle to the right}%
+\UnicodeMathSymbol{"029C3}{\cirE }{\mathord}{circle with two horizontal strokes to the right}%
+\UnicodeMathSymbol{"029C4}{\boxdiag }{\mathbin}{squared rising diagonal slash}%
+\UnicodeMathSymbol{"029C5}{\boxbslash }{\mathbin}{squared falling diagonal slash}%
+\UnicodeMathSymbol{"029C6}{\boxast }{\mathbin}{squared asterisk}%
+\UnicodeMathSymbol{"029C7}{\boxcircle }{\mathbin}{squared small circle}%
+\UnicodeMathSymbol{"029C8}{\boxbox }{\mathbin}{squared square}%
+\UnicodeMathSymbol{"029C9}{\boxonbox }{\mathord}{two joined squares}%
+\UnicodeMathSymbol{"029CA}{\triangleodot }{\mathord}{triangle with dot above}%
+\UnicodeMathSymbol{"029CB}{\triangleubar }{\mathord}{triangle with underbar}%
+\UnicodeMathSymbol{"029CC}{\triangles }{\mathord}{s in triangle}%
+\UnicodeMathSymbol{"029CD}{\triangleserifs }{\mathbin}{triangle with serifs at bottom}%
+\UnicodeMathSymbol{"029CE}{\rtriltri }{\mathrel}{right triangle above left triangle}%
+\UnicodeMathSymbol{"029CF}{\ltrivb }{\mathrel}{left triangle beside vertical bar}%
+\UnicodeMathSymbol{"029D0}{\vbrtri }{\mathrel}{vertical bar beside right triangle}%
+\UnicodeMathSymbol{"029D1}{\lfbowtie }{\mathrel}{left black bowtie}%
+\UnicodeMathSymbol{"029D2}{\rfbowtie }{\mathrel}{right black bowtie}%
+\UnicodeMathSymbol{"029D3}{\fbowtie }{\mathrel}{black bowtie}%
+\UnicodeMathSymbol{"029D4}{\lftimes }{\mathrel}{left black times}%
+\UnicodeMathSymbol{"029D5}{\rftimes }{\mathrel}{right black times}%
+\UnicodeMathSymbol{"029D6}{\hourglass }{\mathbin}{white hourglass}%
+\UnicodeMathSymbol{"029D7}{\blackhourglass }{\mathbin}{black hourglass}%
+\UnicodeMathSymbol{"029D8}{\lvzigzag }{\mathopen}{left wiggly fence}%
+\UnicodeMathSymbol{"029D9}{\rvzigzag }{\mathclose}{right wiggly fence}%
+\UnicodeMathSymbol{"029DA}{\Lvzigzag }{\mathopen}{left double wiggly fence}%
+\UnicodeMathSymbol{"029DB}{\Rvzigzag }{\mathclose}{right double wiggly fence}%
+\UnicodeMathSymbol{"029DC}{\iinfin }{\mathord}{incomplete infinity}%
+\UnicodeMathSymbol{"029DD}{\tieinfty }{\mathord}{tie over infinity}%
+\UnicodeMathSymbol{"029DE}{\nvinfty }{\mathord}{infinity negated with vertical bar}%
+\UnicodeMathSymbol{"029DF}{\dualmap }{\mathrel}{double-ended multimap}%
+\UnicodeMathSymbol{"029E0}{\laplac }{\mathord}{square with contoured outline}%
+\UnicodeMathSymbol{"029E1}{\lrtriangleeq }{\mathrel}{increases as}%
+\UnicodeMathSymbol{"029E2}{\shuffle }{\mathbin}{shuffle product}%
+\UnicodeMathSymbol{"029E3}{\eparsl }{\mathrel}{equals sign and slanted parallel}%
+\UnicodeMathSymbol{"029E4}{\smeparsl }{\mathrel}{equals sign and slanted parallel with tilde above}%
+\UnicodeMathSymbol{"029E5}{\eqvparsl }{\mathrel}{identical to and slanted parallel}%
+\UnicodeMathSymbol{"029E6}{\gleichstark }{\mathrel}{gleich stark}%
+\UnicodeMathSymbol{"029E7}{\thermod }{\mathord}{thermodynamic}%
+\UnicodeMathSymbol{"029E8}{\downtriangleleftblack }{\mathord}{down-pointing triangle with left half black}%
+\UnicodeMathSymbol{"029E9}{\downtrianglerightblack }{\mathord}{down-pointing triangle with right half black}%
+\UnicodeMathSymbol{"029EA}{\blackdiamonddownarrow }{\mathord}{black diamond with down arrow}%
+\UnicodeMathSymbol{"029EB}{\mdlgblklozenge }{\mathbin}{black lozenge}%
+\UnicodeMathSymbol{"029EC}{\circledownarrow }{\mathord}{white circle with down arrow}%
+\UnicodeMathSymbol{"029ED}{\blackcircledownarrow }{\mathord}{black circle with down arrow}%
+\UnicodeMathSymbol{"029EE}{\errbarsquare }{\mathord}{error-barred white square}%
+\UnicodeMathSymbol{"029EF}{\errbarblacksquare }{\mathord}{error-barred black square}%
+\UnicodeMathSymbol{"029F0}{\errbardiamond }{\mathord}{error-barred white diamond}%
+\UnicodeMathSymbol{"029F1}{\errbarblackdiamond }{\mathord}{error-barred black diamond}%
+\UnicodeMathSymbol{"029F2}{\errbarcircle }{\mathord}{error-barred white circle}%
+\UnicodeMathSymbol{"029F3}{\errbarblackcircle }{\mathord}{error-barred black circle}%
+\UnicodeMathSymbol{"029F4}{\ruledelayed }{\mathrel}{rule-delayed}%
+\UnicodeMathSymbol{"029F5}{\setminus }{\mathbin}{reverse solidus operator}%
+\UnicodeMathSymbol{"029F6}{\dsol }{\mathbin}{solidus with overbar}%
+\UnicodeMathSymbol{"029F7}{\rsolbar }{\mathbin}{reverse solidus with horizontal stroke}%
+\UnicodeMathSymbol{"029F8}{\xsol }{\mathop}{big solidus}%
+\UnicodeMathSymbol{"029F9}{\xbsol }{\mathop}{big reverse solidus}%
+\UnicodeMathSymbol{"029FA}{\doubleplus }{\mathbin}{double plus}%
+\UnicodeMathSymbol{"029FB}{\tripleplus }{\mathbin}{triple plus}%
+\UnicodeMathSymbol{"029FC}{\lcurvyangle }{\mathopen}{left pointing curved angle bracket}%
+\UnicodeMathSymbol{"029FD}{\rcurvyangle }{\mathclose}{right pointing curved angle bracket}%
+\UnicodeMathSymbol{"029FE}{\tplus }{\mathbin}{tiny}%
+\UnicodeMathSymbol{"029FF}{\tminus }{\mathbin}{miny}%
+\UnicodeMathSymbol{"02A00}{\bigodot }{\mathop}{n-ary circled dot operator}%
+\UnicodeMathSymbol{"02A01}{\bigoplus }{\mathop}{n-ary circled plus operator}%
+\UnicodeMathSymbol{"02A02}{\bigotimes }{\mathop}{n-ary circled times operator}%
+\UnicodeMathSymbol{"02A03}{\bigcupdot }{\mathop}{n-ary union operator with dot}%
+\UnicodeMathSymbol{"02A04}{\biguplus }{\mathop}{n-ary union operator with plus}%
+\UnicodeMathSymbol{"02A05}{\bigsqcap }{\mathop}{n-ary square intersection operator}%
+\UnicodeMathSymbol{"02A06}{\bigsqcup }{\mathop}{n-ary square union operator}%
+\UnicodeMathSymbol{"02A07}{\conjquant }{\mathop}{two logical and operator}%
+\UnicodeMathSymbol{"02A08}{\disjquant }{\mathop}{two logical or operator}%
+\UnicodeMathSymbol{"02A09}{\bigtimes }{\mathop}{n-ary times operator}%
+\UnicodeMathSymbol{"02A0A}{\modtwosum }{\mathop}{modulo two sum}%
+\UnicodeMathSymbol{"02A0B}{\sumint }{\mathop}{summation with integral}%
+\UnicodeMathSymbol{"02A0C}{\iiiint }{\mathop}{quadruple integral operator}%
+\UnicodeMathSymbol{"02A0D}{\intbar }{\mathop}{finite part integral}%
+\UnicodeMathSymbol{"02A0E}{\intBar }{\mathop}{integral with double stroke}%
+\UnicodeMathSymbol{"02A0F}{\fint }{\mathop}{integral average with slash}%
+\UnicodeMathSymbol{"02A10}{\cirfnint }{\mathop}{circulation function}%
+\UnicodeMathSymbol{"02A11}{\awint }{\mathop}{anticlockwise integration}%
+\UnicodeMathSymbol{"02A12}{\rppolint }{\mathop}{line integration with rectangular path around pole}%
+\UnicodeMathSymbol{"02A13}{\scpolint }{\mathop}{line integration with semicircular path around pole}%
+\UnicodeMathSymbol{"02A14}{\npolint }{\mathop}{line integration not including the pole}%
+\UnicodeMathSymbol{"02A15}{\pointint }{\mathop}{integral around a point operator}%
+\UnicodeMathSymbol{"02A16}{\sqint }{\mathop}{quaternion integral operator}%
+\UnicodeMathSymbol{"02A17}{\intlarhk }{\mathop}{integral with leftwards arrow with hook}%
+\UnicodeMathSymbol{"02A18}{\intx }{\mathop}{integral with times sign}%
+\UnicodeMathSymbol{"02A19}{\intcap }{\mathop}{integral with intersection}%
+\UnicodeMathSymbol{"02A1A}{\intcup }{\mathop}{integral with union}%
+\UnicodeMathSymbol{"02A1B}{\upint }{\mathop}{integral with overbar}%
+\UnicodeMathSymbol{"02A1C}{\lowint }{\mathop}{integral with underbar}%
+\UnicodeMathSymbol{"02A1D}{\Join }{\mathop}{join}%
+\UnicodeMathSymbol{"02A1E}{\bigtriangleleft }{\mathop}{large left triangle operator}%
+\UnicodeMathSymbol{"02A1F}{\zcmp }{\mathop}{z notation schema composition}%
+\UnicodeMathSymbol{"02A20}{\zpipe }{\mathop}{z notation schema piping}%
+\UnicodeMathSymbol{"02A21}{\zproject }{\mathop}{z notation schema projection}%
+\UnicodeMathSymbol{"02A22}{\ringplus }{\mathbin}{plus sign with small circle above}%
+\UnicodeMathSymbol{"02A23}{\plushat }{\mathbin}{plus sign with circumflex accent above}%
+\UnicodeMathSymbol{"02A24}{\simplus }{\mathbin}{plus sign with tilde above}%
+\UnicodeMathSymbol{"02A25}{\plusdot }{\mathbin}{plus sign with dot below}%
+\UnicodeMathSymbol{"02A26}{\plussim }{\mathbin}{plus sign with tilde below}%
+\UnicodeMathSymbol{"02A27}{\plussubtwo }{\mathbin}{plus sign with subscript two}%
+\UnicodeMathSymbol{"02A28}{\plustrif }{\mathbin}{plus sign with black triangle}%
+\UnicodeMathSymbol{"02A29}{\commaminus }{\mathbin}{minus sign with comma above}%
+\UnicodeMathSymbol{"02A2A}{\minusdot }{\mathbin}{minus sign with dot below}%
+\UnicodeMathSymbol{"02A2B}{\minusfdots }{\mathbin}{minus sign with falling dots}%
+\UnicodeMathSymbol{"02A2C}{\minusrdots }{\mathbin}{minus sign with rising dots}%
+\UnicodeMathSymbol{"02A2D}{\opluslhrim }{\mathbin}{plus sign in left half circle}%
+\UnicodeMathSymbol{"02A2E}{\oplusrhrim }{\mathbin}{plus sign in right half circle}%
+\UnicodeMathSymbol{"02A2F}{\vectimes }{\mathbin}{vector or cross product}%
+\UnicodeMathSymbol{"02A30}{\dottimes }{\mathbin}{multiplication sign with dot above}%
+\UnicodeMathSymbol{"02A31}{\timesbar }{\mathbin}{multiplication sign with underbar}%
+\UnicodeMathSymbol{"02A32}{\btimes }{\mathbin}{semidirect product with bottom closed}%
+\UnicodeMathSymbol{"02A33}{\smashtimes }{\mathbin}{smash product}%
+\UnicodeMathSymbol{"02A34}{\otimeslhrim }{\mathbin}{multiplication sign in left half circle}%
+\UnicodeMathSymbol{"02A35}{\otimesrhrim }{\mathbin}{multiplication sign in right half circle}%
+\UnicodeMathSymbol{"02A36}{\otimeshat }{\mathbin}{circled multiplication sign with circumflex accent}%
+\UnicodeMathSymbol{"02A37}{\Otimes }{\mathbin}{multiplication sign in double circle}%
+\UnicodeMathSymbol{"02A38}{\odiv }{\mathbin}{circled division sign}%
+\UnicodeMathSymbol{"02A39}{\triangleplus }{\mathbin}{plus sign in triangle}%
+\UnicodeMathSymbol{"02A3A}{\triangleminus }{\mathbin}{minus sign in triangle}%
+\UnicodeMathSymbol{"02A3B}{\triangletimes }{\mathbin}{multiplication sign in triangle}%
+\UnicodeMathSymbol{"02A3C}{\intprod }{\mathbin}{interior product}%
+\UnicodeMathSymbol{"02A3D}{\intprodr }{\mathbin}{righthand interior product}%
+\UnicodeMathSymbol{"02A3E}{\fcmp }{\mathbin}{z notation relational composition}%
+\UnicodeMathSymbol{"02A3F}{\amalg }{\mathbin}{amalgamation or coproduct}%
+\UnicodeMathSymbol{"02A40}{\capdot }{\mathbin}{intersection with dot}%
+\UnicodeMathSymbol{"02A41}{\uminus }{\mathbin}{union with minus sign}%
+\UnicodeMathSymbol{"02A42}{\barcup }{\mathbin}{union with overbar}%
+\UnicodeMathSymbol{"02A43}{\barcap }{\mathbin}{intersection with overbar}%
+\UnicodeMathSymbol{"02A44}{\capwedge }{\mathbin}{intersection with logical and}%
+\UnicodeMathSymbol{"02A45}{\cupvee }{\mathbin}{union with logical or}%
+\UnicodeMathSymbol{"02A46}{\cupovercap }{\mathbin}{union above intersection}%
+\UnicodeMathSymbol{"02A47}{\capovercup }{\mathbin}{intersection above union}%
+\UnicodeMathSymbol{"02A48}{\cupbarcap }{\mathbin}{union above bar above intersection}%
+\UnicodeMathSymbol{"02A49}{\capbarcup }{\mathbin}{intersection above bar above union}%
+\UnicodeMathSymbol{"02A4A}{\twocups }{\mathbin}{union beside and joined with union}%
+\UnicodeMathSymbol{"02A4B}{\twocaps }{\mathbin}{intersection beside and joined with intersection}%
+\UnicodeMathSymbol{"02A4C}{\closedvarcup }{\mathbin}{closed union with serifs}%
+\UnicodeMathSymbol{"02A4D}{\closedvarcap }{\mathbin}{closed intersection with serifs}%
+\UnicodeMathSymbol{"02A4E}{\Sqcap }{\mathbin}{double square intersection}%
+\UnicodeMathSymbol{"02A4F}{\Sqcup }{\mathbin}{double square union}%
+\UnicodeMathSymbol{"02A50}{\closedvarcupsmashprod }{\mathbin}{closed union with serifs and smash product}%
+\UnicodeMathSymbol{"02A51}{\wedgeodot }{\mathbin}{logical and with dot above}%
+\UnicodeMathSymbol{"02A52}{\veeodot }{\mathbin}{logical or with dot above}%
+\UnicodeMathSymbol{"02A53}{\Wedge }{\mathbin}{double logical and}%
+\UnicodeMathSymbol{"02A54}{\Vee }{\mathbin}{double logical or}%
+\UnicodeMathSymbol{"02A55}{\wedgeonwedge }{\mathbin}{two intersecting logical and}%
+\UnicodeMathSymbol{"02A56}{\veeonvee }{\mathbin}{two intersecting logical or}%
+\UnicodeMathSymbol{"02A57}{\bigslopedvee }{\mathbin}{sloping large or}%
+\UnicodeMathSymbol{"02A58}{\bigslopedwedge }{\mathbin}{sloping large and}%
+\UnicodeMathSymbol{"02A59}{\veeonwedge }{\mathrel}{logical or overlapping logical and}%
+\UnicodeMathSymbol{"02A5A}{\wedgemidvert }{\mathbin}{logical and with middle stem}%
+\UnicodeMathSymbol{"02A5B}{\veemidvert }{\mathbin}{logical or with middle stem}%
+\UnicodeMathSymbol{"02A5C}{\midbarwedge }{\mathbin}{ogical and with horizontal dash}%
+\UnicodeMathSymbol{"02A5D}{\midbarvee }{\mathbin}{logical or with horizontal dash}%
+\UnicodeMathSymbol{"02A5E}{\doublebarwedge }{\mathbin}{logical and with double overbar}%
+\UnicodeMathSymbol{"02A5F}{\wedgebar }{\mathbin}{logical and with underbar}%
+\UnicodeMathSymbol{"02A60}{\wedgedoublebar }{\mathbin}{logical and with double underbar}%
+\UnicodeMathSymbol{"02A61}{\varveebar }{\mathbin}{small vee with underbar}%
+\UnicodeMathSymbol{"02A62}{\doublebarvee }{\mathbin}{logical or with double overbar}%
+\UnicodeMathSymbol{"02A63}{\veedoublebar }{\mathbin}{logical or with double underbar}%
+\UnicodeMathSymbol{"02A64}{\dsub }{\mathbin}{z notation domain antirestriction}%
+\UnicodeMathSymbol{"02A65}{\rsub }{\mathbin}{z notation range antirestriction}%
+\UnicodeMathSymbol{"02A66}{\eqdot }{\mathrel}{equals sign with dot below}%
+\UnicodeMathSymbol{"02A67}{\dotequiv }{\mathrel}{identical with dot above}%
+\UnicodeMathSymbol{"02A68}{\equivVert }{\mathrel}{triple horizontal bar with double vertical stroke}%
+\UnicodeMathSymbol{"02A69}{\equivVvert }{\mathrel}{triple horizontal bar with triple vertical stroke}%
+\UnicodeMathSymbol{"02A6A}{\dotsim }{\mathrel}{tilde operator with dot above}%
+\UnicodeMathSymbol{"02A6B}{\simrdots }{\mathrel}{tilde operator with rising dots}%
+\UnicodeMathSymbol{"02A6C}{\simminussim }{\mathrel}{similar minus similar}%
+\UnicodeMathSymbol{"02A6D}{\congdot }{\mathrel}{congruent with dot above}%
+\UnicodeMathSymbol{"02A6E}{\asteq }{\mathrel}{equals with asterisk}%
+\UnicodeMathSymbol{"02A6F}{\hatapprox }{\mathrel}{almost equal to with circumflex accent}%
+\UnicodeMathSymbol{"02A70}{\approxeqq }{\mathrel}{approximately equal or equal to}%
+\UnicodeMathSymbol{"02A71}{\eqqplus }{\mathbin}{equals sign above plus sign}%
+\UnicodeMathSymbol{"02A72}{\pluseqq }{\mathbin}{plus sign above equals sign}%
+\UnicodeMathSymbol{"02A73}{\eqqsim }{\mathrel}{equals sign above tilde operator}%
+\UnicodeMathSymbol{"02A74}{\Coloneq }{\mathrel}{double colon equal}%
+\UnicodeMathSymbol{"02A75}{\eqeq }{\mathrel}{two consecutive equals signs}%
+\UnicodeMathSymbol{"02A76}{\eqeqeq }{\mathrel}{three consecutive equals signs}%
+\UnicodeMathSymbol{"02A77}{\ddotseq }{\mathrel}{equals sign with two dots above and two dots below}%
+\UnicodeMathSymbol{"02A78}{\equivDD }{\mathrel}{equivalent with four dots above}%
+\UnicodeMathSymbol{"02A79}{\ltcir }{\mathrel}{less-than with circle inside}%
+\UnicodeMathSymbol{"02A7A}{\gtcir }{\mathrel}{greater-than with circle inside}%
+\UnicodeMathSymbol{"02A7B}{\ltquest }{\mathrel}{less-than with question mark above}%
+\UnicodeMathSymbol{"02A7C}{\gtquest }{\mathrel}{greater-than with question mark above}%
+\UnicodeMathSymbol{"02A7D}{\leqslant }{\mathrel}{less-than or slanted equal to}%
+\UnicodeMathSymbol{"02A7E}{\geqslant }{\mathrel}{greater-than or slanted equal to}%
+\UnicodeMathSymbol{"02A7F}{\lesdot }{\mathrel}{less-than or slanted equal to with dot inside}%
+\UnicodeMathSymbol{"02A80}{\gesdot }{\mathrel}{greater-than or slanted equal to with dot inside}%
+\UnicodeMathSymbol{"02A81}{\lesdoto }{\mathrel}{less-than or slanted equal to with dot above}%
+\UnicodeMathSymbol{"02A82}{\gesdoto }{\mathrel}{greater-than or slanted equal to with dot above}%
+\UnicodeMathSymbol{"02A83}{\lesdotor }{\mathrel}{less-than or slanted equal to with dot above right}%
+\UnicodeMathSymbol{"02A84}{\gesdotol }{\mathrel}{greater-than or slanted equal to with dot above left}%
+\UnicodeMathSymbol{"02A85}{\lessapprox }{\mathrel}{less-than or approximate}%
+\UnicodeMathSymbol{"02A86}{\gtrapprox }{\mathrel}{greater-than or approximate}%
+\UnicodeMathSymbol{"02A87}{\lneq }{\mathrel}{less-than and single-line not equal to}%
+\UnicodeMathSymbol{"02A88}{\gneq }{\mathrel}{greater-than and single-line not equal to}%
+\UnicodeMathSymbol{"02A89}{\lnapprox }{\mathrel}{less-than and not approximate}%
+\UnicodeMathSymbol{"02A8A}{\gnapprox }{\mathrel}{greater-than and not approximate}%
+\UnicodeMathSymbol{"02A8B}{\lesseqqgtr }{\mathrel}{less-than above double-line equal above greater-than}%
+\UnicodeMathSymbol{"02A8C}{\gtreqqless }{\mathrel}{greater-than above double-line equal above less-than}%
+\UnicodeMathSymbol{"02A8D}{\lsime }{\mathrel}{less-than above similar or equal}%
+\UnicodeMathSymbol{"02A8E}{\gsime }{\mathrel}{greater-than above similar or equal}%
+\UnicodeMathSymbol{"02A8F}{\lsimg }{\mathrel}{less-than above similar above greater-than}%
+\UnicodeMathSymbol{"02A90}{\gsiml }{\mathrel}{greater-than above similar above less-than}%
+\UnicodeMathSymbol{"02A91}{\lgE }{\mathrel}{less-than above greater-than above double-line equal}%
+\UnicodeMathSymbol{"02A92}{\glE }{\mathrel}{greater-than above less-than above double-line equal}%
+\UnicodeMathSymbol{"02A93}{\lesges }{\mathrel}{less-than above slanted equal above greater-than above slanted equal}%
+\UnicodeMathSymbol{"02A94}{\gesles }{\mathrel}{greater-than above slanted equal above less-than above slanted equal}%
+\UnicodeMathSymbol{"02A95}{\eqslantless }{\mathrel}{slanted equal to or less-than}%
+\UnicodeMathSymbol{"02A96}{\eqslantgtr }{\mathrel}{slanted equal to or greater-than}%
+\UnicodeMathSymbol{"02A97}{\elsdot }{\mathrel}{slanted equal to or less-than with dot inside}%
+\UnicodeMathSymbol{"02A98}{\egsdot }{\mathrel}{slanted equal to or greater-than with dot inside}%
+\UnicodeMathSymbol{"02A99}{\eqqless }{\mathrel}{double-line equal to or less-than}%
+\UnicodeMathSymbol{"02A9A}{\eqqgtr }{\mathrel}{double-line equal to or greater-than}%
+\UnicodeMathSymbol{"02A9B}{\eqqslantless }{\mathrel}{double-line slanted equal to or less-than}%
+\UnicodeMathSymbol{"02A9C}{\eqqslantgtr }{\mathrel}{double-line slanted equal to or greater-than}%
+\UnicodeMathSymbol{"02A9D}{\simless }{\mathrel}{similar or less-than}%
+\UnicodeMathSymbol{"02A9E}{\simgtr }{\mathrel}{similar or greater-than}%
+\UnicodeMathSymbol{"02A9F}{\simlE }{\mathrel}{similar above less-than above equals sign}%
+\UnicodeMathSymbol{"02AA0}{\simgE }{\mathrel}{similar above greater-than above equals sign}%
+\UnicodeMathSymbol{"02AA1}{\Lt }{\mathrel}{double nested less-than}%
+\UnicodeMathSymbol{"02AA2}{\Gt }{\mathrel}{double nested greater-than}%
+\UnicodeMathSymbol{"02AA3}{\partialmeetcontraction }{\mathrel}{double less-than with underbar}%
+\UnicodeMathSymbol{"02AA4}{\glj }{\mathrel}{greater-than overlapping less-than}%
+\UnicodeMathSymbol{"02AA5}{\gla }{\mathrel}{greater-than beside less-than}%
+\UnicodeMathSymbol{"02AA6}{\ltcc }{\mathrel}{less-than closed by curve}%
+\UnicodeMathSymbol{"02AA7}{\gtcc }{\mathrel}{greater-than closed by curve}%
+\UnicodeMathSymbol{"02AA8}{\lescc }{\mathrel}{less-than closed by curve above slanted equal}%
+\UnicodeMathSymbol{"02AA9}{\gescc }{\mathrel}{greater-than closed by curve above slanted equal}%
+\UnicodeMathSymbol{"02AAA}{\smt }{\mathrel}{smaller than}%
+\UnicodeMathSymbol{"02AAB}{\lat }{\mathrel}{larger than}%
+\UnicodeMathSymbol{"02AAC}{\smte }{\mathrel}{smaller than or equal to}%
+\UnicodeMathSymbol{"02AAD}{\late }{\mathrel}{larger than or equal to}%
+\UnicodeMathSymbol{"02AAE}{\bumpeqq }{\mathrel}{equals sign with bumpy above}%
+\UnicodeMathSymbol{"02AAF}{\preceq }{\mathrel}{precedes above single-line equals sign}%
+\UnicodeMathSymbol{"02AB0}{\succeq }{\mathrel}{succeeds above single-line equals sign}%
+\UnicodeMathSymbol{"02AB1}{\precneq }{\mathrel}{precedes above single-line not equal to}%
+\UnicodeMathSymbol{"02AB2}{\succneq }{\mathrel}{succeeds above single-line not equal to}%
+\UnicodeMathSymbol{"02AB3}{\preceqq }{\mathrel}{precedes above equals sign}%
+\UnicodeMathSymbol{"02AB4}{\succeqq }{\mathrel}{succeeds above equals sign}%
+\UnicodeMathSymbol{"02AB5}{\precneqq }{\mathrel}{precedes above not equal to}%
+\UnicodeMathSymbol{"02AB6}{\succneqq }{\mathrel}{succeeds above not equal to}%
+\UnicodeMathSymbol{"02AB7}{\precapprox }{\mathrel}{precedes above almost equal to}%
+\UnicodeMathSymbol{"02AB8}{\succapprox }{\mathrel}{succeeds above almost equal to}%
+\UnicodeMathSymbol{"02AB9}{\precnapprox }{\mathrel}{precedes above not almost equal to}%
+\UnicodeMathSymbol{"02ABA}{\succnapprox }{\mathrel}{succeeds above not almost equal to}%
+\UnicodeMathSymbol{"02ABB}{\Prec }{\mathrel}{double precedes}%
+\UnicodeMathSymbol{"02ABC}{\Succ }{\mathrel}{double succeeds}%
+\UnicodeMathSymbol{"02ABD}{\subsetdot }{\mathrel}{subset with dot}%
+\UnicodeMathSymbol{"02ABE}{\supsetdot }{\mathrel}{superset with dot}%
+\UnicodeMathSymbol{"02ABF}{\subsetplus }{\mathrel}{subset with plus sign below}%
+\UnicodeMathSymbol{"02AC0}{\supsetplus }{\mathrel}{superset with plus sign below}%
+\UnicodeMathSymbol{"02AC1}{\submult }{\mathrel}{subset with multiplication sign below}%
+\UnicodeMathSymbol{"02AC2}{\supmult }{\mathrel}{superset with multiplication sign below}%
+\UnicodeMathSymbol{"02AC3}{\subedot }{\mathrel}{subset of or equal to with dot above}%
+\UnicodeMathSymbol{"02AC4}{\supedot }{\mathrel}{superset of or equal to with dot above}%
+\UnicodeMathSymbol{"02AC5}{\subseteqq }{\mathrel}{subset of above equals sign}%
+\UnicodeMathSymbol{"02AC6}{\supseteqq }{\mathrel}{superset of above equals sign}%
+\UnicodeMathSymbol{"02AC7}{\subsim }{\mathrel}{subset of above tilde operator}%
+\UnicodeMathSymbol{"02AC8}{\supsim }{\mathrel}{superset of above tilde operator}%
+\UnicodeMathSymbol{"02AC9}{\subsetapprox }{\mathrel}{subset of above almost equal to}%
+\UnicodeMathSymbol{"02ACA}{\supsetapprox }{\mathrel}{superset of above almost equal to}%
+\UnicodeMathSymbol{"02ACB}{\subsetneqq }{\mathrel}{subset of above not equal to}%
+\UnicodeMathSymbol{"02ACC}{\supsetneqq }{\mathrel}{superset of above not equal to}%
+\UnicodeMathSymbol{"02ACD}{\lsqhook }{\mathrel}{square left open box operator}%
+\UnicodeMathSymbol{"02ACE}{\rsqhook }{\mathrel}{square right open box operator}%
+\UnicodeMathSymbol{"02ACF}{\csub }{\mathrel}{closed subset}%
+\UnicodeMathSymbol{"02AD0}{\csup }{\mathrel}{closed superset}%
+\UnicodeMathSymbol{"02AD1}{\csube }{\mathrel}{closed subset or equal to}%
+\UnicodeMathSymbol{"02AD2}{\csupe }{\mathrel}{closed superset or equal to}%
+\UnicodeMathSymbol{"02AD3}{\subsup }{\mathrel}{subset above superset}%
+\UnicodeMathSymbol{"02AD4}{\supsub }{\mathrel}{superset above subset}%
+\UnicodeMathSymbol{"02AD5}{\subsub }{\mathrel}{subset above subset}%
+\UnicodeMathSymbol{"02AD6}{\supsup }{\mathrel}{superset above superset}%
+\UnicodeMathSymbol{"02AD7}{\suphsub }{\mathrel}{superset beside subset}%
+\UnicodeMathSymbol{"02AD8}{\supdsub }{\mathrel}{superset beside and joined by dash with subset}%
+\UnicodeMathSymbol{"02AD9}{\forkv }{\mathrel}{element of opening downwards}%
+\UnicodeMathSymbol{"02ADA}{\topfork }{\mathrel}{pitchfork with tee top}%
+\UnicodeMathSymbol{"02ADB}{\mlcp }{\mathrel}{transversal intersection}%
+\UnicodeMathSymbol{"02ADC}{\forks }{\mathrel}{forking}%
+\UnicodeMathSymbol{"02ADD}{\forksnot }{\mathrel}{nonforking}%
+\UnicodeMathSymbol{"02ADE}{\shortlefttack }{\mathrel}{short left tack}%
+\UnicodeMathSymbol{"02ADF}{\shortdowntack }{\mathrel}{short down tack}%
+\UnicodeMathSymbol{"02AE0}{\shortuptack }{\mathrel}{short up tack}%
+\UnicodeMathSymbol{"02AE1}{\perps }{\mathord}{perpendicular with s}%
+\UnicodeMathSymbol{"02AE2}{\vDdash }{\mathrel}{vertical bar triple right turnstile}%
+\UnicodeMathSymbol{"02AE3}{\dashV }{\mathrel}{double vertical bar left turnstile}%
+\UnicodeMathSymbol{"02AE4}{\Dashv }{\mathrel}{vertical bar double left turnstile}%
+\UnicodeMathSymbol{"02AE5}{\DashV }{\mathrel}{double vertical bar double left turnstile}%
+\UnicodeMathSymbol{"02AE6}{\varVdash }{\mathrel}{long dash from left member of double vertical}%
+\UnicodeMathSymbol{"02AE7}{\Barv }{\mathrel}{short down tack with overbar}%
+\UnicodeMathSymbol{"02AE8}{\vBar }{\mathrel}{short up tack with underbar}%
+\UnicodeMathSymbol{"02AE9}{\vBarv }{\mathrel}{short up tack above short down tack}%
+\UnicodeMathSymbol{"02AEA}{\barV }{\mathrel}{double down tack}%
+\UnicodeMathSymbol{"02AEB}{\Vbar }{\mathrel}{double up tack}%
+\UnicodeMathSymbol{"02AEC}{\Not }{\mathrel}{double stroke not sign}%
+\UnicodeMathSymbol{"02AED}{\bNot }{\mathrel}{reversed double stroke not sign}%
+\UnicodeMathSymbol{"02AEE}{\revnmid }{\mathrel}{does not divide with reversed negation slash}%
+\UnicodeMathSymbol{"02AEF}{\cirmid }{\mathrel}{vertical line with circle above}%
+\UnicodeMathSymbol{"02AF0}{\midcir }{\mathrel}{vertical line with circle below}%
+\UnicodeMathSymbol{"02AF1}{\topcir }{\mathord}{down tack with circle below}%
+\UnicodeMathSymbol{"02AF2}{\nhpar }{\mathrel}{parallel with horizontal stroke}%
+\UnicodeMathSymbol{"02AF3}{\parsim }{\mathrel}{parallel with tilde operator}%
+\UnicodeMathSymbol{"02AF4}{\interleave }{\mathbin}{triple vertical bar binary relation}%
+\UnicodeMathSymbol{"02AF5}{\nhVvert }{\mathbin}{triple vertical bar with horizontal stroke}%
+\UnicodeMathSymbol{"02AF6}{\threedotcolon }{\mathbin}{triple colon operator}%
+\UnicodeMathSymbol{"02AF7}{\lllnest }{\mathrel}{stacked very much less-than}%
+\UnicodeMathSymbol{"02AF8}{\gggnest }{\mathrel}{stacked very much greater-than}%
+\UnicodeMathSymbol{"02AF9}{\leqqslant }{\mathrel}{double-line slanted less-than or equal to}%
+\UnicodeMathSymbol{"02AFA}{\geqqslant }{\mathrel}{double-line slanted greater-than or equal to}%
+\UnicodeMathSymbol{"02AFB}{\trslash }{\mathbin}{triple solidus binary relation}%
+\UnicodeMathSymbol{"02AFC}{\biginterleave }{\mathop}{large triple vertical bar operator}%
+\UnicodeMathSymbol{"02AFD}{\sslash }{\mathbin}{double solidus operator}%
+\UnicodeMathSymbol{"02AFE}{\talloblong }{\mathbin}{white vertical bar}%
+\UnicodeMathSymbol{"02AFF}{\bigtalloblong }{\mathop}{n-ary white vertical bar}%
+\UnicodeMathSymbol{"02B12}{\squaretopblack }{\mathord}{square with top half black}%
+\UnicodeMathSymbol{"02B13}{\squarebotblack }{\mathord}{square with bottom half black}%
+\UnicodeMathSymbol{"02B14}{\squareurblack }{\mathord}{square with upper right diagonal half black}%
+\UnicodeMathSymbol{"02B15}{\squarellblack }{\mathord}{square with lower left diagonal half black}%
+\UnicodeMathSymbol{"02B16}{\diamondleftblack }{\mathord}{diamond with left half black}%
+\UnicodeMathSymbol{"02B17}{\diamondrightblack }{\mathord}{diamond with right half black}%
+\UnicodeMathSymbol{"02B18}{\diamondtopblack }{\mathord}{diamond with top half black}%
+\UnicodeMathSymbol{"02B19}{\diamondbotblack }{\mathord}{diamond with bottom half black}%
+\UnicodeMathSymbol{"02B1A}{\dottedsquare }{\mathord}{dotted square}%
+\UnicodeMathSymbol{"02B1B}{\lgblksquare }{\mathord}{black large square}%
+\UnicodeMathSymbol{"02B1C}{\lgwhtsquare }{\mathord}{white large square}%
+\UnicodeMathSymbol{"02B1D}{\vysmblksquare }{\mathord}{black very small square}%
+\UnicodeMathSymbol{"02B1E}{\vysmwhtsquare }{\mathord}{white very small square}%
+\UnicodeMathSymbol{"02B1F}{\pentagonblack }{\mathord}{black pentagon}%
+\UnicodeMathSymbol{"02B20}{\pentagon }{\mathord}{white pentagon}%
+\UnicodeMathSymbol{"02B21}{\varhexagon }{\mathord}{white hexagon}%
+\UnicodeMathSymbol{"02B22}{\varhexagonblack }{\mathord}{black hexagon}%
+\UnicodeMathSymbol{"02B23}{\hexagonblack }{\mathord}{horizontal black hexagon}%
+\UnicodeMathSymbol{"02B24}{\lgblkcircle }{\mathord}{black large circle}%
+\UnicodeMathSymbol{"02B25}{\mdblkdiamond }{\mathord}{black medium diamond}%
+\UnicodeMathSymbol{"02B26}{\mdwhtdiamond }{\mathord}{white medium diamond}%
+\UnicodeMathSymbol{"02B27}{\mdblklozenge }{\mathord}{black medium lozenge}%
+\UnicodeMathSymbol{"02B28}{\mdwhtlozenge }{\mathord}{white medium lozenge}%
+\UnicodeMathSymbol{"02B29}{\smblkdiamond }{\mathord}{black small diamond}%
+\UnicodeMathSymbol{"02B2A}{\smblklozenge }{\mathord}{black small lozenge}%
+\UnicodeMathSymbol{"02B2B}{\smwhtlozenge }{\mathord}{white small lozenge}%
+\UnicodeMathSymbol{"02B2C}{\blkhorzoval }{\mathord}{black horizontal ellipse}%
+\UnicodeMathSymbol{"02B2D}{\whthorzoval }{\mathord}{white horizontal ellipse}%
+\UnicodeMathSymbol{"02B2E}{\blkvertoval }{\mathord}{black vertical ellipse}%
+\UnicodeMathSymbol{"02B2F}{\whtvertoval }{\mathord}{white vertical ellipse}%
+\UnicodeMathSymbol{"02B30}{\circleonleftarrow }{\mathrel}{left arrow with small circle}%
+\UnicodeMathSymbol{"02B31}{\leftthreearrows }{\mathrel}{three leftwards arrows}%
+\UnicodeMathSymbol{"02B32}{\leftarrowonoplus }{\mathrel}{left arrow with circled plus}%
+\UnicodeMathSymbol{"02B33}{\longleftsquigarrow }{\mathrel}{long leftwards squiggle arrow}%
+\UnicodeMathSymbol{"02B34}{\nvtwoheadleftarrow }{\mathrel}{leftwards two-headed arrow with vertical stroke}%
+\UnicodeMathSymbol{"02B35}{\nVtwoheadleftarrow }{\mathrel}{leftwards two-headed arrow with double vertical stroke}%
+\UnicodeMathSymbol{"02B36}{\twoheadmapsfrom }{\mathrel}{leftwards two-headed arrow from bar}%
+\UnicodeMathSymbol{"02B37}{\twoheadleftdbkarrow }{\mathrel}{leftwards two-headed triple-dash arrow}%
+\UnicodeMathSymbol{"02B38}{\leftdotarrow }{\mathrel}{leftwards arrow with dotted stem}%
+\UnicodeMathSymbol{"02B39}{\nvleftarrowtail }{\mathrel}{leftwards arrow with tail with vertical stroke}%
+\UnicodeMathSymbol{"02B3A}{\nVleftarrowtail }{\mathrel}{leftwards arrow with tail with double vertical stroke}%
+\UnicodeMathSymbol{"02B3B}{\twoheadleftarrowtail }{\mathrel}{leftwards two-headed arrow with tail}%
+\UnicodeMathSymbol{"02B3C}{\nvtwoheadleftarrowtail }{\mathrel}{leftwards two-headed arrow with tail with vertical stroke}%
+\UnicodeMathSymbol{"02B3D}{\nVtwoheadleftarrowtail }{\mathrel}{leftwards two-headed arrow with tail with double vertical stroke}%
+\UnicodeMathSymbol{"02B3E}{\leftarrowx }{\mathrel}{leftwards arrow through x}%
+\UnicodeMathSymbol{"02B3F}{\leftcurvedarrow }{\mathrel}{wave arrow pointing directly left}%
+\UnicodeMathSymbol{"02B40}{\equalleftarrow }{\mathrel}{equals sign above leftwards arrow}%
+\UnicodeMathSymbol{"02B41}{\bsimilarleftarrow }{\mathrel}{reverse tilde operator above leftwards arrow}%
+\UnicodeMathSymbol{"02B42}{\leftarrowbackapprox }{\mathrel}{leftwards arrow above reverse almost equal to}%
+\UnicodeMathSymbol{"02B43}{\rightarrowgtr }{\mathrel}{rightwards arrow through greater-than}%
+\UnicodeMathSymbol{"02B44}{\rightarrowsupset }{\mathrel}{rightwards arrow through subset}%
+\UnicodeMathSymbol{"02B45}{\LLeftarrow }{\mathrel}{leftwards quadruple arrow}%
+\UnicodeMathSymbol{"02B46}{\RRightarrow }{\mathrel}{rightwards quadruple arrow}%
+\UnicodeMathSymbol{"02B47}{\bsimilarrightarrow }{\mathrel}{reverse tilde operator above rightwards arrow}%
+\UnicodeMathSymbol{"02B48}{\rightarrowbackapprox }{\mathrel}{rightwards arrow above reverse almost equal to}%
+\UnicodeMathSymbol{"02B49}{\similarleftarrow }{\mathrel}{tilde operator above leftwards arrow}%
+\UnicodeMathSymbol{"02B4A}{\leftarrowapprox }{\mathrel}{leftwards arrow above almost equal to}%
+\UnicodeMathSymbol{"02B4B}{\leftarrowbsimilar }{\mathrel}{leftwards arrow above reverse tilde operator}%
+\UnicodeMathSymbol{"02B4C}{\rightarrowbsimilar }{\mathrel}{righttwards arrow above reverse tilde operator}%
+\UnicodeMathSymbol{"02B50}{\medwhitestar }{\mathord}{white medium star}%
+\UnicodeMathSymbol{"02B51}{\medblackstar }{\mathord}{black medium star}%
+\UnicodeMathSymbol{"02B52}{\smwhitestar }{\mathord}{white small star}%
+\UnicodeMathSymbol{"02B53}{\rightpentagonblack }{\mathord}{black right-pointing pentagon}%
+\UnicodeMathSymbol{"02B54}{\rightpentagon }{\mathord}{white right-pointing pentagon}%
+\UnicodeMathSymbol{"03012}{\postalmark }{\mathord}{postal mark}%
+\UnicodeMathSymbol{"03030}{\hzigzag }{\mathord}{zigzag}%
+\UnicodeMathSymbol{"1D400}{\mbfA }{\mathalpha}{mathematical bold capital a}%
+\UnicodeMathSymbol{"1D401}{\mbfB }{\mathalpha}{mathematical bold capital b}%
+\UnicodeMathSymbol{"1D402}{\mbfC }{\mathalpha}{mathematical bold capital c}%
+\UnicodeMathSymbol{"1D403}{\mbfD }{\mathalpha}{mathematical bold capital d}%
+\UnicodeMathSymbol{"1D404}{\mbfE }{\mathalpha}{mathematical bold capital e}%
+\UnicodeMathSymbol{"1D405}{\mbfF }{\mathalpha}{mathematical bold capital f}%
+\UnicodeMathSymbol{"1D406}{\mbfG }{\mathalpha}{mathematical bold capital g}%
+\UnicodeMathSymbol{"1D407}{\mbfH }{\mathalpha}{mathematical bold capital h}%
+\UnicodeMathSymbol{"1D408}{\mbfI }{\mathalpha}{mathematical bold capital i}%
+\UnicodeMathSymbol{"1D409}{\mbfJ }{\mathalpha}{mathematical bold capital j}%
+\UnicodeMathSymbol{"1D40A}{\mbfK }{\mathalpha}{mathematical bold capital k}%
+\UnicodeMathSymbol{"1D40B}{\mbfL }{\mathalpha}{mathematical bold capital l}%
+\UnicodeMathSymbol{"1D40C}{\mbfM }{\mathalpha}{mathematical bold capital m}%
+\UnicodeMathSymbol{"1D40D}{\mbfN }{\mathalpha}{mathematical bold capital n}%
+\UnicodeMathSymbol{"1D40E}{\mbfO }{\mathalpha}{mathematical bold capital o}%
+\UnicodeMathSymbol{"1D40F}{\mbfP }{\mathalpha}{mathematical bold capital p}%
+\UnicodeMathSymbol{"1D410}{\mbfQ }{\mathalpha}{mathematical bold capital q}%
+\UnicodeMathSymbol{"1D411}{\mbfR }{\mathalpha}{mathematical bold capital r}%
+\UnicodeMathSymbol{"1D412}{\mbfS }{\mathalpha}{mathematical bold capital s}%
+\UnicodeMathSymbol{"1D413}{\mbfT }{\mathalpha}{mathematical bold capital t}%
+\UnicodeMathSymbol{"1D414}{\mbfU }{\mathalpha}{mathematical bold capital u}%
+\UnicodeMathSymbol{"1D415}{\mbfV }{\mathalpha}{mathematical bold capital v}%
+\UnicodeMathSymbol{"1D416}{\mbfW }{\mathalpha}{mathematical bold capital w}%
+\UnicodeMathSymbol{"1D417}{\mbfX }{\mathalpha}{mathematical bold capital x}%
+\UnicodeMathSymbol{"1D418}{\mbfY }{\mathalpha}{mathematical bold capital y}%
+\UnicodeMathSymbol{"1D419}{\mbfZ }{\mathalpha}{mathematical bold capital z}%
+\UnicodeMathSymbol{"1D41A}{\mbfa }{\mathalpha}{mathematical bold small a}%
+\UnicodeMathSymbol{"1D41B}{\mbfb }{\mathalpha}{mathematical bold small b}%
+\UnicodeMathSymbol{"1D41C}{\mbfc }{\mathalpha}{mathematical bold small c}%
+\UnicodeMathSymbol{"1D41D}{\mbfd }{\mathalpha}{mathematical bold small d}%
+\UnicodeMathSymbol{"1D41E}{\mbfe }{\mathalpha}{mathematical bold small e}%
+\UnicodeMathSymbol{"1D41F}{\mbff }{\mathalpha}{mathematical bold small f}%
+\UnicodeMathSymbol{"1D420}{\mbfg }{\mathalpha}{mathematical bold small g}%
+\UnicodeMathSymbol{"1D421}{\mbfh }{\mathalpha}{mathematical bold small h}%
+\UnicodeMathSymbol{"1D422}{\mbfi }{\mathalpha}{mathematical bold small i}%
+\UnicodeMathSymbol{"1D423}{\mbfj }{\mathalpha}{mathematical bold small j}%
+\UnicodeMathSymbol{"1D424}{\mbfk }{\mathalpha}{mathematical bold small k}%
+\UnicodeMathSymbol{"1D425}{\mbfl }{\mathalpha}{mathematical bold small l}%
+\UnicodeMathSymbol{"1D426}{\mbfm }{\mathalpha}{mathematical bold small m}%
+\UnicodeMathSymbol{"1D427}{\mbfn }{\mathalpha}{mathematical bold small n}%
+\UnicodeMathSymbol{"1D428}{\mbfo }{\mathalpha}{mathematical bold small o}%
+\UnicodeMathSymbol{"1D429}{\mbfp }{\mathalpha}{mathematical bold small p}%
+\UnicodeMathSymbol{"1D42A}{\mbfq }{\mathalpha}{mathematical bold small q}%
+\UnicodeMathSymbol{"1D42B}{\mbfr }{\mathalpha}{mathematical bold small r}%
+\UnicodeMathSymbol{"1D42C}{\mbfs }{\mathalpha}{mathematical bold small s}%
+\UnicodeMathSymbol{"1D42D}{\mbft }{\mathalpha}{mathematical bold small t}%
+\UnicodeMathSymbol{"1D42E}{\mbfu }{\mathalpha}{mathematical bold small u}%
+\UnicodeMathSymbol{"1D42F}{\mbfv }{\mathalpha}{mathematical bold small v}%
+\UnicodeMathSymbol{"1D430}{\mbfw }{\mathalpha}{mathematical bold small w}%
+\UnicodeMathSymbol{"1D431}{\mbfx }{\mathalpha}{mathematical bold small x}%
+\UnicodeMathSymbol{"1D432}{\mbfy }{\mathalpha}{mathematical bold small y}%
+\UnicodeMathSymbol{"1D433}{\mbfz }{\mathalpha}{mathematical bold small z}%
+\UnicodeMathSymbol{"1D434}{\mitA }{\mathalpha}{mathematical italic capital a}%
+\UnicodeMathSymbol{"1D435}{\mitB }{\mathalpha}{mathematical italic capital b}%
+\UnicodeMathSymbol{"1D436}{\mitC }{\mathalpha}{mathematical italic capital c}%
+\UnicodeMathSymbol{"1D437}{\mitD }{\mathalpha}{mathematical italic capital d}%
+\UnicodeMathSymbol{"1D438}{\mitE }{\mathalpha}{mathematical italic capital e}%
+\UnicodeMathSymbol{"1D439}{\mitF }{\mathalpha}{mathematical italic capital f}%
+\UnicodeMathSymbol{"1D43A}{\mitG }{\mathalpha}{mathematical italic capital g}%
+\UnicodeMathSymbol{"1D43B}{\mitH }{\mathalpha}{mathematical italic capital h}%
+\UnicodeMathSymbol{"1D43C}{\mitI }{\mathalpha}{mathematical italic capital i}%
+\UnicodeMathSymbol{"1D43D}{\mitJ }{\mathalpha}{mathematical italic capital j}%
+\UnicodeMathSymbol{"1D43E}{\mitK }{\mathalpha}{mathematical italic capital k}%
+\UnicodeMathSymbol{"1D43F}{\mitL }{\mathalpha}{mathematical italic capital l}%
+\UnicodeMathSymbol{"1D440}{\mitM }{\mathalpha}{mathematical italic capital m}%
+\UnicodeMathSymbol{"1D441}{\mitN }{\mathalpha}{mathematical italic capital n}%
+\UnicodeMathSymbol{"1D442}{\mitO }{\mathalpha}{mathematical italic capital o}%
+\UnicodeMathSymbol{"1D443}{\mitP }{\mathalpha}{mathematical italic capital p}%
+\UnicodeMathSymbol{"1D444}{\mitQ }{\mathalpha}{mathematical italic capital q}%
+\UnicodeMathSymbol{"1D445}{\mitR }{\mathalpha}{mathematical italic capital r}%
+\UnicodeMathSymbol{"1D446}{\mitS }{\mathalpha}{mathematical italic capital s}%
+\UnicodeMathSymbol{"1D447}{\mitT }{\mathalpha}{mathematical italic capital t}%
+\UnicodeMathSymbol{"1D448}{\mitU }{\mathalpha}{mathematical italic capital u}%
+\UnicodeMathSymbol{"1D449}{\mitV }{\mathalpha}{mathematical italic capital v}%
+\UnicodeMathSymbol{"1D44A}{\mitW }{\mathalpha}{mathematical italic capital w}%
+\UnicodeMathSymbol{"1D44B}{\mitX }{\mathalpha}{mathematical italic capital x}%
+\UnicodeMathSymbol{"1D44C}{\mitY }{\mathalpha}{mathematical italic capital y}%
+\UnicodeMathSymbol{"1D44D}{\mitZ }{\mathalpha}{mathematical italic capital z}%
+\UnicodeMathSymbol{"1D44E}{\mita }{\mathalpha}{mathematical italic small a}%
+\UnicodeMathSymbol{"1D44F}{\mitb }{\mathalpha}{mathematical italic small b}%
+\UnicodeMathSymbol{"1D450}{\mitc }{\mathalpha}{mathematical italic small c}%
+\UnicodeMathSymbol{"1D451}{\mitd }{\mathalpha}{mathematical italic small d}%
+\UnicodeMathSymbol{"1D452}{\mite }{\mathalpha}{mathematical italic small e}%
+\UnicodeMathSymbol{"1D453}{\mitf }{\mathalpha}{mathematical italic small f}%
+\UnicodeMathSymbol{"1D454}{\mitg }{\mathalpha}{mathematical italic small g}%
+\UnicodeMathSymbol{"1D456}{\miti }{\mathalpha}{mathematical italic small i}%
+\UnicodeMathSymbol{"1D457}{\mitj }{\mathalpha}{mathematical italic small j}%
+\UnicodeMathSymbol{"1D458}{\mitk }{\mathalpha}{mathematical italic small k}%
+\UnicodeMathSymbol{"1D459}{\mitl }{\mathalpha}{mathematical italic small l}%
+\UnicodeMathSymbol{"1D45A}{\mitm }{\mathalpha}{mathematical italic small m}%
+\UnicodeMathSymbol{"1D45B}{\mitn }{\mathalpha}{mathematical italic small n}%
+\UnicodeMathSymbol{"1D45C}{\mito }{\mathalpha}{mathematical italic small o}%
+\UnicodeMathSymbol{"1D45D}{\mitp }{\mathalpha}{mathematical italic small p}%
+\UnicodeMathSymbol{"1D45E}{\mitq }{\mathalpha}{mathematical italic small q}%
+\UnicodeMathSymbol{"1D45F}{\mitr }{\mathalpha}{mathematical italic small r}%
+\UnicodeMathSymbol{"1D460}{\mits }{\mathalpha}{mathematical italic small s}%
+\UnicodeMathSymbol{"1D461}{\mitt }{\mathalpha}{mathematical italic small t}%
+\UnicodeMathSymbol{"1D462}{\mitu }{\mathalpha}{mathematical italic small u}%
+\UnicodeMathSymbol{"1D463}{\mitv }{\mathalpha}{mathematical italic small v}%
+\UnicodeMathSymbol{"1D464}{\mitw }{\mathalpha}{mathematical italic small w}%
+\UnicodeMathSymbol{"1D465}{\mitx }{\mathalpha}{mathematical italic small x}%
+\UnicodeMathSymbol{"1D466}{\mity }{\mathalpha}{mathematical italic small y}%
+\UnicodeMathSymbol{"1D467}{\mitz }{\mathalpha}{mathematical italic small z}%
+\UnicodeMathSymbol{"1D468}{\mbfitA }{\mathalpha}{mathematical bold italic capital a}%
+\UnicodeMathSymbol{"1D469}{\mbfitB }{\mathalpha}{mathematical bold italic capital b}%
+\UnicodeMathSymbol{"1D46A}{\mbfitC }{\mathalpha}{mathematical bold italic capital c}%
+\UnicodeMathSymbol{"1D46B}{\mbfitD }{\mathalpha}{mathematical bold italic capital d}%
+\UnicodeMathSymbol{"1D46C}{\mbfitE }{\mathalpha}{mathematical bold italic capital e}%
+\UnicodeMathSymbol{"1D46D}{\mbfitF }{\mathalpha}{mathematical bold italic capital f}%
+\UnicodeMathSymbol{"1D46E}{\mbfitG }{\mathalpha}{mathematical bold italic capital g}%
+\UnicodeMathSymbol{"1D46F}{\mbfitH }{\mathalpha}{mathematical bold italic capital h}%
+\UnicodeMathSymbol{"1D470}{\mbfitI }{\mathalpha}{mathematical bold italic capital i}%
+\UnicodeMathSymbol{"1D471}{\mbfitJ }{\mathalpha}{mathematical bold italic capital j}%
+\UnicodeMathSymbol{"1D472}{\mbfitK }{\mathalpha}{mathematical bold italic capital k}%
+\UnicodeMathSymbol{"1D473}{\mbfitL }{\mathalpha}{mathematical bold italic capital l}%
+\UnicodeMathSymbol{"1D474}{\mbfitM }{\mathalpha}{mathematical bold italic capital m}%
+\UnicodeMathSymbol{"1D475}{\mbfitN }{\mathalpha}{mathematical bold italic capital n}%
+\UnicodeMathSymbol{"1D476}{\mbfitO }{\mathalpha}{mathematical bold italic capital o}%
+\UnicodeMathSymbol{"1D477}{\mbfitP }{\mathalpha}{mathematical bold italic capital p}%
+\UnicodeMathSymbol{"1D478}{\mbfitQ }{\mathalpha}{mathematical bold italic capital q}%
+\UnicodeMathSymbol{"1D479}{\mbfitR }{\mathalpha}{mathematical bold italic capital r}%
+\UnicodeMathSymbol{"1D47A}{\mbfitS }{\mathalpha}{mathematical bold italic capital s}%
+\UnicodeMathSymbol{"1D47B}{\mbfitT }{\mathalpha}{mathematical bold italic capital t}%
+\UnicodeMathSymbol{"1D47C}{\mbfitU }{\mathalpha}{mathematical bold italic capital u}%
+\UnicodeMathSymbol{"1D47D}{\mbfitV }{\mathalpha}{mathematical bold italic capital v}%
+\UnicodeMathSymbol{"1D47E}{\mbfitW }{\mathalpha}{mathematical bold italic capital w}%
+\UnicodeMathSymbol{"1D47F}{\mbfitX }{\mathalpha}{mathematical bold italic capital x}%
+\UnicodeMathSymbol{"1D480}{\mbfitY }{\mathalpha}{mathematical bold italic capital y}%
+\UnicodeMathSymbol{"1D481}{\mbfitZ }{\mathalpha}{mathematical bold italic capital z}%
+\UnicodeMathSymbol{"1D482}{\mbfita }{\mathalpha}{mathematical bold italic small a}%
+\UnicodeMathSymbol{"1D483}{\mbfitb }{\mathalpha}{mathematical bold italic small b}%
+\UnicodeMathSymbol{"1D484}{\mbfitc }{\mathalpha}{mathematical bold italic small c}%
+\UnicodeMathSymbol{"1D485}{\mbfitd }{\mathalpha}{mathematical bold italic small d}%
+\UnicodeMathSymbol{"1D486}{\mbfite }{\mathalpha}{mathematical bold italic small e}%
+\UnicodeMathSymbol{"1D487}{\mbfitf }{\mathalpha}{mathematical bold italic small f}%
+\UnicodeMathSymbol{"1D488}{\mbfitg }{\mathalpha}{mathematical bold italic small g}%
+\UnicodeMathSymbol{"1D489}{\mbfith }{\mathalpha}{mathematical bold italic small h}%
+\UnicodeMathSymbol{"1D48A}{\mbfiti }{\mathalpha}{mathematical bold italic small i}%
+\UnicodeMathSymbol{"1D48B}{\mbfitj }{\mathalpha}{mathematical bold italic small j}%
+\UnicodeMathSymbol{"1D48C}{\mbfitk }{\mathalpha}{mathematical bold italic small k}%
+\UnicodeMathSymbol{"1D48D}{\mbfitl }{\mathalpha}{mathematical bold italic small l}%
+\UnicodeMathSymbol{"1D48E}{\mbfitm }{\mathalpha}{mathematical bold italic small m}%
+\UnicodeMathSymbol{"1D48F}{\mbfitn }{\mathalpha}{mathematical bold italic small n}%
+\UnicodeMathSymbol{"1D490}{\mbfito }{\mathalpha}{mathematical bold italic small o}%
+\UnicodeMathSymbol{"1D491}{\mbfitp }{\mathalpha}{mathematical bold italic small p}%
+\UnicodeMathSymbol{"1D492}{\mbfitq }{\mathalpha}{mathematical bold italic small q}%
+\UnicodeMathSymbol{"1D493}{\mbfitr }{\mathalpha}{mathematical bold italic small r}%
+\UnicodeMathSymbol{"1D494}{\mbfits }{\mathalpha}{mathematical bold italic small s}%
+\UnicodeMathSymbol{"1D495}{\mbfitt }{\mathalpha}{mathematical bold italic small t}%
+\UnicodeMathSymbol{"1D496}{\mbfitu }{\mathalpha}{mathematical bold italic small u}%
+\UnicodeMathSymbol{"1D497}{\mbfitv }{\mathalpha}{mathematical bold italic small v}%
+\UnicodeMathSymbol{"1D498}{\mbfitw }{\mathalpha}{mathematical bold italic small w}%
+\UnicodeMathSymbol{"1D499}{\mbfitx }{\mathalpha}{mathematical bold italic small x}%
+\UnicodeMathSymbol{"1D49A}{\mbfity }{\mathalpha}{mathematical bold italic small y}%
+\UnicodeMathSymbol{"1D49B}{\mbfitz }{\mathalpha}{mathematical bold italic small z}%
+\UnicodeMathSymbol{"1D49C}{\mscrA }{\mathalpha}{mathematical script capital a}%
+\UnicodeMathSymbol{"1D49E}{\mscrC }{\mathalpha}{mathematical script capital c}%
+\UnicodeMathSymbol{"1D49F}{\mscrD }{\mathalpha}{mathematical script capital d}%
+\UnicodeMathSymbol{"1D4A2}{\mscrG }{\mathalpha}{mathematical script capital g}%
+\UnicodeMathSymbol{"1D4A5}{\mscrJ }{\mathalpha}{mathematical script capital j}%
+\UnicodeMathSymbol{"1D4A6}{\mscrK }{\mathalpha}{mathematical script capital k}%
+\UnicodeMathSymbol{"1D4A9}{\mscrN }{\mathalpha}{mathematical script capital n}%
+\UnicodeMathSymbol{"1D4AA}{\mscrO }{\mathalpha}{mathematical script capital o}%
+\UnicodeMathSymbol{"1D4AB}{\mscrP }{\mathalpha}{mathematical script capital p}%
+\UnicodeMathSymbol{"1D4AC}{\mscrQ }{\mathalpha}{mathematical script capital q}%
+\UnicodeMathSymbol{"1D4AE}{\mscrS }{\mathalpha}{mathematical script capital s}%
+\UnicodeMathSymbol{"1D4AF}{\mscrT }{\mathalpha}{mathematical script capital t}%
+\UnicodeMathSymbol{"1D4B0}{\mscrU }{\mathalpha}{mathematical script capital u}%
+\UnicodeMathSymbol{"1D4B1}{\mscrV }{\mathalpha}{mathematical script capital v}%
+\UnicodeMathSymbol{"1D4B2}{\mscrW }{\mathalpha}{mathematical script capital w}%
+\UnicodeMathSymbol{"1D4B3}{\mscrX }{\mathalpha}{mathematical script capital x}%
+\UnicodeMathSymbol{"1D4B4}{\mscrY }{\mathalpha}{mathematical script capital y}%
+\UnicodeMathSymbol{"1D4B5}{\mscrZ }{\mathalpha}{mathematical script capital z}%
+\UnicodeMathSymbol{"1D4B6}{\mscra }{\mathalpha}{mathematical script small a}%
+\UnicodeMathSymbol{"1D4B7}{\mscrb }{\mathalpha}{mathematical script small b}%
+\UnicodeMathSymbol{"1D4B8}{\mscrc }{\mathalpha}{mathematical script small c}%
+\UnicodeMathSymbol{"1D4B9}{\mscrd }{\mathalpha}{mathematical script small d}%
+\UnicodeMathSymbol{"1D4BB}{\mscrf }{\mathalpha}{mathematical script small f}%
+\UnicodeMathSymbol{"1D4BD}{\mscrh }{\mathalpha}{mathematical script small h}%
+\UnicodeMathSymbol{"1D4BE}{\mscri }{\mathalpha}{mathematical script small i}%
+\UnicodeMathSymbol{"1D4BF}{\mscrj }{\mathalpha}{mathematical script small j}%
+\UnicodeMathSymbol{"1D4C0}{\mscrk }{\mathalpha}{mathematical script small k}%
+\UnicodeMathSymbol{"1D4C1}{\mscrl }{\mathalpha}{mathematical script small l}%
+\UnicodeMathSymbol{"1D4C2}{\mscrm }{\mathalpha}{mathematical script small m}%
+\UnicodeMathSymbol{"1D4C3}{\mscrn }{\mathalpha}{mathematical script small n}%
+\UnicodeMathSymbol{"1D4C5}{\mscrp }{\mathalpha}{mathematical script small p}%
+\UnicodeMathSymbol{"1D4C6}{\mscrq }{\mathalpha}{mathematical script small q}%
+\UnicodeMathSymbol{"1D4C7}{\mscrr }{\mathalpha}{mathematical script small r}%
+\UnicodeMathSymbol{"1D4C8}{\mscrs }{\mathalpha}{mathematical script small s}%
+\UnicodeMathSymbol{"1D4C9}{\mscrt }{\mathalpha}{mathematical script small t}%
+\UnicodeMathSymbol{"1D4CA}{\mscru }{\mathalpha}{mathematical script small u}%
+\UnicodeMathSymbol{"1D4CB}{\mscrv }{\mathalpha}{mathematical script small v}%
+\UnicodeMathSymbol{"1D4CC}{\mscrw }{\mathalpha}{mathematical script small w}%
+\UnicodeMathSymbol{"1D4CD}{\mscrx }{\mathalpha}{mathematical script small x}%
+\UnicodeMathSymbol{"1D4CE}{\mscry }{\mathalpha}{mathematical script small y}%
+\UnicodeMathSymbol{"1D4CF}{\mscrz }{\mathalpha}{mathematical script small z}%
+\UnicodeMathSymbol{"1D4D0}{\mbfscrA }{\mathalpha}{mathematical bold script capital a}%
+\UnicodeMathSymbol{"1D4D1}{\mbfscrB }{\mathalpha}{mathematical bold script capital b}%
+\UnicodeMathSymbol{"1D4D2}{\mbfscrC }{\mathalpha}{mathematical bold script capital c}%
+\UnicodeMathSymbol{"1D4D3}{\mbfscrD }{\mathalpha}{mathematical bold script capital d}%
+\UnicodeMathSymbol{"1D4D4}{\mbfscrE }{\mathalpha}{mathematical bold script capital e}%
+\UnicodeMathSymbol{"1D4D5}{\mbfscrF }{\mathalpha}{mathematical bold script capital f}%
+\UnicodeMathSymbol{"1D4D6}{\mbfscrG }{\mathalpha}{mathematical bold script capital g}%
+\UnicodeMathSymbol{"1D4D7}{\mbfscrH }{\mathalpha}{mathematical bold script capital h}%
+\UnicodeMathSymbol{"1D4D8}{\mbfscrI }{\mathalpha}{mathematical bold script capital i}%
+\UnicodeMathSymbol{"1D4D9}{\mbfscrJ }{\mathalpha}{mathematical bold script capital j}%
+\UnicodeMathSymbol{"1D4DA}{\mbfscrK }{\mathalpha}{mathematical bold script capital k}%
+\UnicodeMathSymbol{"1D4DB}{\mbfscrL }{\mathalpha}{mathematical bold script capital l}%
+\UnicodeMathSymbol{"1D4DC}{\mbfscrM }{\mathalpha}{mathematical bold script capital m}%
+\UnicodeMathSymbol{"1D4DD}{\mbfscrN }{\mathalpha}{mathematical bold script capital n}%
+\UnicodeMathSymbol{"1D4DE}{\mbfscrO }{\mathalpha}{mathematical bold script capital o}%
+\UnicodeMathSymbol{"1D4DF}{\mbfscrP }{\mathalpha}{mathematical bold script capital p}%
+\UnicodeMathSymbol{"1D4E0}{\mbfscrQ }{\mathalpha}{mathematical bold script capital q}%
+\UnicodeMathSymbol{"1D4E1}{\mbfscrR }{\mathalpha}{mathematical bold script capital r}%
+\UnicodeMathSymbol{"1D4E2}{\mbfscrS }{\mathalpha}{mathematical bold script capital s}%
+\UnicodeMathSymbol{"1D4E3}{\mbfscrT }{\mathalpha}{mathematical bold script capital t}%
+\UnicodeMathSymbol{"1D4E4}{\mbfscrU }{\mathalpha}{mathematical bold script capital u}%
+\UnicodeMathSymbol{"1D4E5}{\mbfscrV }{\mathalpha}{mathematical bold script capital v}%
+\UnicodeMathSymbol{"1D4E6}{\mbfscrW }{\mathalpha}{mathematical bold script capital w}%
+\UnicodeMathSymbol{"1D4E7}{\mbfscrX }{\mathalpha}{mathematical bold script capital x}%
+\UnicodeMathSymbol{"1D4E8}{\mbfscrY }{\mathalpha}{mathematical bold script capital y}%
+\UnicodeMathSymbol{"1D4E9}{\mbfscrZ }{\mathalpha}{mathematical bold script capital z}%
+\UnicodeMathSymbol{"1D4EA}{\mbfscra }{\mathalpha}{mathematical bold script small a}%
+\UnicodeMathSymbol{"1D4EB}{\mbfscrb }{\mathalpha}{mathematical bold script small b}%
+\UnicodeMathSymbol{"1D4EC}{\mbfscrc }{\mathalpha}{mathematical bold script small c}%
+\UnicodeMathSymbol{"1D4ED}{\mbfscrd }{\mathalpha}{mathematical bold script small d}%
+\UnicodeMathSymbol{"1D4EE}{\mbfscre }{\mathalpha}{mathematical bold script small e}%
+\UnicodeMathSymbol{"1D4EF}{\mbfscrf }{\mathalpha}{mathematical bold script small f}%
+\UnicodeMathSymbol{"1D4F0}{\mbfscrg }{\mathalpha}{mathematical bold script small g}%
+\UnicodeMathSymbol{"1D4F1}{\mbfscrh }{\mathalpha}{mathematical bold script small h}%
+\UnicodeMathSymbol{"1D4F2}{\mbfscri }{\mathalpha}{mathematical bold script small i}%
+\UnicodeMathSymbol{"1D4F3}{\mbfscrj }{\mathalpha}{mathematical bold script small j}%
+\UnicodeMathSymbol{"1D4F4}{\mbfscrk }{\mathalpha}{mathematical bold script small k}%
+\UnicodeMathSymbol{"1D4F5}{\mbfscrl }{\mathalpha}{mathematical bold script small l}%
+\UnicodeMathSymbol{"1D4F6}{\mbfscrm }{\mathalpha}{mathematical bold script small m}%
+\UnicodeMathSymbol{"1D4F7}{\mbfscrn }{\mathalpha}{mathematical bold script small n}%
+\UnicodeMathSymbol{"1D4F8}{\mbfscro }{\mathalpha}{mathematical bold script small o}%
+\UnicodeMathSymbol{"1D4F9}{\mbfscrp }{\mathalpha}{mathematical bold script small p}%
+\UnicodeMathSymbol{"1D4FA}{\mbfscrq }{\mathalpha}{mathematical bold script small q}%
+\UnicodeMathSymbol{"1D4FB}{\mbfscrr }{\mathalpha}{mathematical bold script small r}%
+\UnicodeMathSymbol{"1D4FC}{\mbfscrs }{\mathalpha}{mathematical bold script small s}%
+\UnicodeMathSymbol{"1D4FD}{\mbfscrt }{\mathalpha}{mathematical bold script small t}%
+\UnicodeMathSymbol{"1D4FE}{\mbfscru }{\mathalpha}{mathematical bold script small u}%
+\UnicodeMathSymbol{"1D4FF}{\mbfscrv }{\mathalpha}{mathematical bold script small v}%
+\UnicodeMathSymbol{"1D500}{\mbfscrw }{\mathalpha}{mathematical bold script small w}%
+\UnicodeMathSymbol{"1D501}{\mbfscrx }{\mathalpha}{mathematical bold script small x}%
+\UnicodeMathSymbol{"1D502}{\mbfscry }{\mathalpha}{mathematical bold script small y}%
+\UnicodeMathSymbol{"1D503}{\mbfscrz }{\mathalpha}{mathematical bold script small z}%
+\UnicodeMathSymbol{"1D504}{\mfrakA }{\mathalpha}{mathematical fraktur capital a}%
+\UnicodeMathSymbol{"1D505}{\mfrakB }{\mathalpha}{mathematical fraktur capital b}%
+\UnicodeMathSymbol{"1D507}{\mfrakD }{\mathalpha}{mathematical fraktur capital d}%
+\UnicodeMathSymbol{"1D508}{\mfrakE }{\mathalpha}{mathematical fraktur capital e}%
+\UnicodeMathSymbol{"1D509}{\mfrakF }{\mathalpha}{mathematical fraktur capital f}%
+\UnicodeMathSymbol{"1D50A}{\mfrakG }{\mathalpha}{mathematical fraktur capital g}%
+\UnicodeMathSymbol{"1D50D}{\mfrakJ }{\mathalpha}{mathematical fraktur capital j}%
+\UnicodeMathSymbol{"1D50E}{\mfrakK }{\mathalpha}{mathematical fraktur capital k}%
+\UnicodeMathSymbol{"1D50F}{\mfrakL }{\mathalpha}{mathematical fraktur capital l}%
+\UnicodeMathSymbol{"1D510}{\mfrakM }{\mathalpha}{mathematical fraktur capital m}%
+\UnicodeMathSymbol{"1D511}{\mfrakN }{\mathalpha}{mathematical fraktur capital n}%
+\UnicodeMathSymbol{"1D512}{\mfrakO }{\mathalpha}{mathematical fraktur capital o}%
+\UnicodeMathSymbol{"1D513}{\mfrakP }{\mathalpha}{mathematical fraktur capital p}%
+\UnicodeMathSymbol{"1D514}{\mfrakQ }{\mathalpha}{mathematical fraktur capital q}%
+\UnicodeMathSymbol{"1D516}{\mfrakS }{\mathalpha}{mathematical fraktur capital s}%
+\UnicodeMathSymbol{"1D517}{\mfrakT }{\mathalpha}{mathematical fraktur capital t}%
+\UnicodeMathSymbol{"1D518}{\mfrakU }{\mathalpha}{mathematical fraktur capital u}%
+\UnicodeMathSymbol{"1D519}{\mfrakV }{\mathalpha}{mathematical fraktur capital v}%
+\UnicodeMathSymbol{"1D51A}{\mfrakW }{\mathalpha}{mathematical fraktur capital w}%
+\UnicodeMathSymbol{"1D51B}{\mfrakX }{\mathalpha}{mathematical fraktur capital x}%
+\UnicodeMathSymbol{"1D51C}{\mfrakY }{\mathalpha}{mathematical fraktur capital y}%
+\UnicodeMathSymbol{"1D51E}{\mfraka }{\mathalpha}{mathematical fraktur small a}%
+\UnicodeMathSymbol{"1D51F}{\mfrakb }{\mathalpha}{mathematical fraktur small b}%
+\UnicodeMathSymbol{"1D520}{\mfrakc }{\mathalpha}{mathematical fraktur small c}%
+\UnicodeMathSymbol{"1D521}{\mfrakd }{\mathalpha}{mathematical fraktur small d}%
+\UnicodeMathSymbol{"1D522}{\mfrake }{\mathalpha}{mathematical fraktur small e}%
+\UnicodeMathSymbol{"1D523}{\mfrakf }{\mathalpha}{mathematical fraktur small f}%
+\UnicodeMathSymbol{"1D524}{\mfrakg }{\mathalpha}{mathematical fraktur small g}%
+\UnicodeMathSymbol{"1D525}{\mfrakh }{\mathalpha}{mathematical fraktur small h}%
+\UnicodeMathSymbol{"1D526}{\mfraki }{\mathalpha}{mathematical fraktur small i}%
+\UnicodeMathSymbol{"1D527}{\mfrakj }{\mathalpha}{mathematical fraktur small j}%
+\UnicodeMathSymbol{"1D528}{\mfrakk }{\mathalpha}{mathematical fraktur small k}%
+\UnicodeMathSymbol{"1D529}{\mfrakl }{\mathalpha}{mathematical fraktur small l}%
+\UnicodeMathSymbol{"1D52A}{\mfrakm }{\mathalpha}{mathematical fraktur small m}%
+\UnicodeMathSymbol{"1D52B}{\mfrakn }{\mathalpha}{mathematical fraktur small n}%
+\UnicodeMathSymbol{"1D52C}{\mfrako }{\mathalpha}{mathematical fraktur small o}%
+\UnicodeMathSymbol{"1D52D}{\mfrakp }{\mathalpha}{mathematical fraktur small p}%
+\UnicodeMathSymbol{"1D52E}{\mfrakq }{\mathalpha}{mathematical fraktur small q}%
+\UnicodeMathSymbol{"1D52F}{\mfrakr }{\mathalpha}{mathematical fraktur small r}%
+\UnicodeMathSymbol{"1D530}{\mfraks }{\mathalpha}{mathematical fraktur small s}%
+\UnicodeMathSymbol{"1D531}{\mfrakt }{\mathalpha}{mathematical fraktur small t}%
+\UnicodeMathSymbol{"1D532}{\mfraku }{\mathalpha}{mathematical fraktur small u}%
+\UnicodeMathSymbol{"1D533}{\mfrakv }{\mathalpha}{mathematical fraktur small v}%
+\UnicodeMathSymbol{"1D534}{\mfrakw }{\mathalpha}{mathematical fraktur small w}%
+\UnicodeMathSymbol{"1D535}{\mfrakx }{\mathalpha}{mathematical fraktur small x}%
+\UnicodeMathSymbol{"1D536}{\mfraky }{\mathalpha}{mathematical fraktur small y}%
+\UnicodeMathSymbol{"1D537}{\mfrakz }{\mathalpha}{mathematical fraktur small z}%
+\UnicodeMathSymbol{"1D538}{\BbbA }{\mathalpha}{mathematical double-struck capital a}%
+\UnicodeMathSymbol{"1D539}{\BbbB }{\mathalpha}{mathematical double-struck capital b}%
+\UnicodeMathSymbol{"1D53B}{\BbbD }{\mathalpha}{mathematical double-struck capital d}%
+\UnicodeMathSymbol{"1D53C}{\BbbE }{\mathalpha}{mathematical double-struck capital e}%
+\UnicodeMathSymbol{"1D53D}{\BbbF }{\mathalpha}{mathematical double-struck capital f}%
+\UnicodeMathSymbol{"1D53E}{\BbbG }{\mathalpha}{mathematical double-struck capital g}%
+\UnicodeMathSymbol{"1D540}{\BbbI }{\mathalpha}{mathematical double-struck capital i}%
+\UnicodeMathSymbol{"1D541}{\BbbJ }{\mathalpha}{mathematical double-struck capital j}%
+\UnicodeMathSymbol{"1D542}{\BbbK }{\mathalpha}{mathematical double-struck capital k}%
+\UnicodeMathSymbol{"1D543}{\BbbL }{\mathalpha}{mathematical double-struck capital l}%
+\UnicodeMathSymbol{"1D544}{\BbbM }{\mathalpha}{mathematical double-struck capital m}%
+\UnicodeMathSymbol{"1D546}{\BbbO }{\mathalpha}{mathematical double-struck capital o}%
+\UnicodeMathSymbol{"1D54A}{\BbbS }{\mathalpha}{mathematical double-struck capital s}%
+\UnicodeMathSymbol{"1D54B}{\BbbT }{\mathalpha}{mathematical double-struck capital t}%
+\UnicodeMathSymbol{"1D54C}{\BbbU }{\mathalpha}{mathematical double-struck capital u}%
+\UnicodeMathSymbol{"1D54D}{\BbbV }{\mathalpha}{mathematical double-struck capital v}%
+\UnicodeMathSymbol{"1D54E}{\BbbW }{\mathalpha}{mathematical double-struck capital w}%
+\UnicodeMathSymbol{"1D54F}{\BbbX }{\mathalpha}{mathematical double-struck capital x}%
+\UnicodeMathSymbol{"1D550}{\BbbY }{\mathalpha}{mathematical double-struck capital y}%
+\UnicodeMathSymbol{"1D552}{\Bbba }{\mathalpha}{mathematical double-struck small a}%
+\UnicodeMathSymbol{"1D553}{\Bbbb }{\mathalpha}{mathematical double-struck small b}%
+\UnicodeMathSymbol{"1D554}{\Bbbc }{\mathalpha}{mathematical double-struck small c}%
+\UnicodeMathSymbol{"1D555}{\Bbbd }{\mathalpha}{mathematical double-struck small d}%
+\UnicodeMathSymbol{"1D556}{\Bbbe }{\mathalpha}{mathematical double-struck small e}%
+\UnicodeMathSymbol{"1D557}{\Bbbf }{\mathalpha}{mathematical double-struck small f}%
+\UnicodeMathSymbol{"1D558}{\Bbbg }{\mathalpha}{mathematical double-struck small g}%
+\UnicodeMathSymbol{"1D559}{\Bbbh }{\mathalpha}{mathematical double-struck small h}%
+\UnicodeMathSymbol{"1D55A}{\Bbbi }{\mathalpha}{mathematical double-struck small i}%
+\UnicodeMathSymbol{"1D55B}{\Bbbj }{\mathalpha}{mathematical double-struck small j}%
+\UnicodeMathSymbol{"1D55C}{\Bbbk }{\mathalpha}{mathematical double-struck small k}%
+\UnicodeMathSymbol{"1D55D}{\Bbbl }{\mathalpha}{mathematical double-struck small l}%
+\UnicodeMathSymbol{"1D55E}{\Bbbm }{\mathalpha}{mathematical double-struck small m}%
+\UnicodeMathSymbol{"1D55F}{\Bbbn }{\mathalpha}{mathematical double-struck small n}%
+\UnicodeMathSymbol{"1D560}{\Bbbo }{\mathalpha}{mathematical double-struck small o}%
+\UnicodeMathSymbol{"1D561}{\Bbbp }{\mathalpha}{mathematical double-struck small p}%
+\UnicodeMathSymbol{"1D562}{\Bbbq }{\mathalpha}{mathematical double-struck small q}%
+\UnicodeMathSymbol{"1D563}{\Bbbr }{\mathalpha}{mathematical double-struck small r}%
+\UnicodeMathSymbol{"1D564}{\Bbbs }{\mathalpha}{mathematical double-struck small s}%
+\UnicodeMathSymbol{"1D565}{\Bbbt }{\mathalpha}{mathematical double-struck small t}%
+\UnicodeMathSymbol{"1D566}{\Bbbu }{\mathalpha}{mathematical double-struck small u}%
+\UnicodeMathSymbol{"1D567}{\Bbbv }{\mathalpha}{mathematical double-struck small v}%
+\UnicodeMathSymbol{"1D568}{\Bbbw }{\mathalpha}{mathematical double-struck small w}%
+\UnicodeMathSymbol{"1D569}{\Bbbx }{\mathalpha}{mathematical double-struck small x}%
+\UnicodeMathSymbol{"1D56A}{\Bbby }{\mathalpha}{mathematical double-struck small y}%
+\UnicodeMathSymbol{"1D56B}{\Bbbz }{\mathalpha}{mathematical double-struck small z}%
+\UnicodeMathSymbol{"1D56C}{\mbffrakA }{\mathalpha}{mathematical bold fraktur capital a}%
+\UnicodeMathSymbol{"1D56D}{\mbffrakB }{\mathalpha}{mathematical bold fraktur capital b}%
+\UnicodeMathSymbol{"1D56E}{\mbffrakC }{\mathalpha}{mathematical bold fraktur capital c}%
+\UnicodeMathSymbol{"1D56F}{\mbffrakD }{\mathalpha}{mathematical bold fraktur capital d}%
+\UnicodeMathSymbol{"1D570}{\mbffrakE }{\mathalpha}{mathematical bold fraktur capital e}%
+\UnicodeMathSymbol{"1D571}{\mbffrakF }{\mathalpha}{mathematical bold fraktur capital f}%
+\UnicodeMathSymbol{"1D572}{\mbffrakG }{\mathalpha}{mathematical bold fraktur capital g}%
+\UnicodeMathSymbol{"1D573}{\mbffrakH }{\mathalpha}{mathematical bold fraktur capital h}%
+\UnicodeMathSymbol{"1D574}{\mbffrakI }{\mathalpha}{mathematical bold fraktur capital i}%
+\UnicodeMathSymbol{"1D575}{\mbffrakJ }{\mathalpha}{mathematical bold fraktur capital j}%
+\UnicodeMathSymbol{"1D576}{\mbffrakK }{\mathalpha}{mathematical bold fraktur capital k}%
+\UnicodeMathSymbol{"1D577}{\mbffrakL }{\mathalpha}{mathematical bold fraktur capital l}%
+\UnicodeMathSymbol{"1D578}{\mbffrakM }{\mathalpha}{mathematical bold fraktur capital m}%
+\UnicodeMathSymbol{"1D579}{\mbffrakN }{\mathalpha}{mathematical bold fraktur capital n}%
+\UnicodeMathSymbol{"1D57A}{\mbffrakO }{\mathalpha}{mathematical bold fraktur capital o}%
+\UnicodeMathSymbol{"1D57B}{\mbffrakP }{\mathalpha}{mathematical bold fraktur capital p}%
+\UnicodeMathSymbol{"1D57C}{\mbffrakQ }{\mathalpha}{mathematical bold fraktur capital q}%
+\UnicodeMathSymbol{"1D57D}{\mbffrakR }{\mathalpha}{mathematical bold fraktur capital r}%
+\UnicodeMathSymbol{"1D57E}{\mbffrakS }{\mathalpha}{mathematical bold fraktur capital s}%
+\UnicodeMathSymbol{"1D57F}{\mbffrakT }{\mathalpha}{mathematical bold fraktur capital t}%
+\UnicodeMathSymbol{"1D580}{\mbffrakU }{\mathalpha}{mathematical bold fraktur capital u}%
+\UnicodeMathSymbol{"1D581}{\mbffrakV }{\mathalpha}{mathematical bold fraktur capital v}%
+\UnicodeMathSymbol{"1D582}{\mbffrakW }{\mathalpha}{mathematical bold fraktur capital w}%
+\UnicodeMathSymbol{"1D583}{\mbffrakX }{\mathalpha}{mathematical bold fraktur capital x}%
+\UnicodeMathSymbol{"1D584}{\mbffrakY }{\mathalpha}{mathematical bold fraktur capital y}%
+\UnicodeMathSymbol{"1D585}{\mbffrakZ }{\mathalpha}{mathematical bold fraktur capital z}%
+\UnicodeMathSymbol{"1D586}{\mbffraka }{\mathalpha}{mathematical bold fraktur small a}%
+\UnicodeMathSymbol{"1D587}{\mbffrakb }{\mathalpha}{mathematical bold fraktur small b}%
+\UnicodeMathSymbol{"1D588}{\mbffrakc }{\mathalpha}{mathematical bold fraktur small c}%
+\UnicodeMathSymbol{"1D589}{\mbffrakd }{\mathalpha}{mathematical bold fraktur small d}%
+\UnicodeMathSymbol{"1D58A}{\mbffrake }{\mathalpha}{mathematical bold fraktur small e}%
+\UnicodeMathSymbol{"1D58B}{\mbffrakf }{\mathalpha}{mathematical bold fraktur small f}%
+\UnicodeMathSymbol{"1D58C}{\mbffrakg }{\mathalpha}{mathematical bold fraktur small g}%
+\UnicodeMathSymbol{"1D58D}{\mbffrakh }{\mathalpha}{mathematical bold fraktur small h}%
+\UnicodeMathSymbol{"1D58E}{\mbffraki }{\mathalpha}{mathematical bold fraktur small i}%
+\UnicodeMathSymbol{"1D58F}{\mbffrakj }{\mathalpha}{mathematical bold fraktur small j}%
+\UnicodeMathSymbol{"1D590}{\mbffrakk }{\mathalpha}{mathematical bold fraktur small k}%
+\UnicodeMathSymbol{"1D591}{\mbffrakl }{\mathalpha}{mathematical bold fraktur small l}%
+\UnicodeMathSymbol{"1D592}{\mbffrakm }{\mathalpha}{mathematical bold fraktur small m}%
+\UnicodeMathSymbol{"1D593}{\mbffrakn }{\mathalpha}{mathematical bold fraktur small n}%
+\UnicodeMathSymbol{"1D594}{\mbffrako }{\mathalpha}{mathematical bold fraktur small o}%
+\UnicodeMathSymbol{"1D595}{\mbffrakp }{\mathalpha}{mathematical bold fraktur small p}%
+\UnicodeMathSymbol{"1D596}{\mbffrakq }{\mathalpha}{mathematical bold fraktur small q}%
+\UnicodeMathSymbol{"1D597}{\mbffrakr }{\mathalpha}{mathematical bold fraktur small r}%
+\UnicodeMathSymbol{"1D598}{\mbffraks }{\mathalpha}{mathematical bold fraktur small s}%
+\UnicodeMathSymbol{"1D599}{\mbffrakt }{\mathalpha}{mathematical bold fraktur small t}%
+\UnicodeMathSymbol{"1D59A}{\mbffraku }{\mathalpha}{mathematical bold fraktur small u}%
+\UnicodeMathSymbol{"1D59B}{\mbffrakv }{\mathalpha}{mathematical bold fraktur small v}%
+\UnicodeMathSymbol{"1D59C}{\mbffrakw }{\mathalpha}{mathematical bold fraktur small w}%
+\UnicodeMathSymbol{"1D59D}{\mbffrakx }{\mathalpha}{mathematical bold fraktur small x}%
+\UnicodeMathSymbol{"1D59E}{\mbffraky }{\mathalpha}{mathematical bold fraktur small y}%
+\UnicodeMathSymbol{"1D59F}{\mbffrakz }{\mathalpha}{mathematical bold fraktur small z}%
+\UnicodeMathSymbol{"1D5A0}{\msansA }{\mathalpha}{mathematical sans-serif capital a}%
+\UnicodeMathSymbol{"1D5A1}{\msansB }{\mathalpha}{mathematical sans-serif capital b}%
+\UnicodeMathSymbol{"1D5A2}{\msansC }{\mathalpha}{mathematical sans-serif capital c}%
+\UnicodeMathSymbol{"1D5A3}{\msansD }{\mathalpha}{mathematical sans-serif capital d}%
+\UnicodeMathSymbol{"1D5A4}{\msansE }{\mathalpha}{mathematical sans-serif capital e}%
+\UnicodeMathSymbol{"1D5A5}{\msansF }{\mathalpha}{mathematical sans-serif capital f}%
+\UnicodeMathSymbol{"1D5A6}{\msansG }{\mathalpha}{mathematical sans-serif capital g}%
+\UnicodeMathSymbol{"1D5A7}{\msansH }{\mathalpha}{mathematical sans-serif capital h}%
+\UnicodeMathSymbol{"1D5A8}{\msansI }{\mathalpha}{mathematical sans-serif capital i}%
+\UnicodeMathSymbol{"1D5A9}{\msansJ }{\mathalpha}{mathematical sans-serif capital j}%
+\UnicodeMathSymbol{"1D5AA}{\msansK }{\mathalpha}{mathematical sans-serif capital k}%
+\UnicodeMathSymbol{"1D5AB}{\msansL }{\mathalpha}{mathematical sans-serif capital l}%
+\UnicodeMathSymbol{"1D5AC}{\msansM }{\mathalpha}{mathematical sans-serif capital m}%
+\UnicodeMathSymbol{"1D5AD}{\msansN }{\mathalpha}{mathematical sans-serif capital n}%
+\UnicodeMathSymbol{"1D5AE}{\msansO }{\mathalpha}{mathematical sans-serif capital o}%
+\UnicodeMathSymbol{"1D5AF}{\msansP }{\mathalpha}{mathematical sans-serif capital p}%
+\UnicodeMathSymbol{"1D5B0}{\msansQ }{\mathalpha}{mathematical sans-serif capital q}%
+\UnicodeMathSymbol{"1D5B1}{\msansR }{\mathalpha}{mathematical sans-serif capital r}%
+\UnicodeMathSymbol{"1D5B2}{\msansS }{\mathalpha}{mathematical sans-serif capital s}%
+\UnicodeMathSymbol{"1D5B3}{\msansT }{\mathalpha}{mathematical sans-serif capital t}%
+\UnicodeMathSymbol{"1D5B4}{\msansU }{\mathalpha}{mathematical sans-serif capital u}%
+\UnicodeMathSymbol{"1D5B5}{\msansV }{\mathalpha}{mathematical sans-serif capital v}%
+\UnicodeMathSymbol{"1D5B6}{\msansW }{\mathalpha}{mathematical sans-serif capital w}%
+\UnicodeMathSymbol{"1D5B7}{\msansX }{\mathalpha}{mathematical sans-serif capital x}%
+\UnicodeMathSymbol{"1D5B8}{\msansY }{\mathalpha}{mathematical sans-serif capital y}%
+\UnicodeMathSymbol{"1D5B9}{\msansZ }{\mathalpha}{mathematical sans-serif capital z}%
+\UnicodeMathSymbol{"1D5BA}{\msansa }{\mathalpha}{mathematical sans-serif small a}%
+\UnicodeMathSymbol{"1D5BB}{\msansb }{\mathalpha}{mathematical sans-serif small b}%
+\UnicodeMathSymbol{"1D5BC}{\msansc }{\mathalpha}{mathematical sans-serif small c}%
+\UnicodeMathSymbol{"1D5BD}{\msansd }{\mathalpha}{mathematical sans-serif small d}%
+\UnicodeMathSymbol{"1D5BE}{\msanse }{\mathalpha}{mathematical sans-serif small e}%
+\UnicodeMathSymbol{"1D5BF}{\msansf }{\mathalpha}{mathematical sans-serif small f}%
+\UnicodeMathSymbol{"1D5C0}{\msansg }{\mathalpha}{mathematical sans-serif small g}%
+\UnicodeMathSymbol{"1D5C1}{\msansh }{\mathalpha}{mathematical sans-serif small h}%
+\UnicodeMathSymbol{"1D5C2}{\msansi }{\mathalpha}{mathematical sans-serif small i}%
+\UnicodeMathSymbol{"1D5C3}{\msansj }{\mathalpha}{mathematical sans-serif small j}%
+\UnicodeMathSymbol{"1D5C4}{\msansk }{\mathalpha}{mathematical sans-serif small k}%
+\UnicodeMathSymbol{"1D5C5}{\msansl }{\mathalpha}{mathematical sans-serif small l}%
+\UnicodeMathSymbol{"1D5C6}{\msansm }{\mathalpha}{mathematical sans-serif small m}%
+\UnicodeMathSymbol{"1D5C7}{\msansn }{\mathalpha}{mathematical sans-serif small n}%
+\UnicodeMathSymbol{"1D5C8}{\msanso }{\mathalpha}{mathematical sans-serif small o}%
+\UnicodeMathSymbol{"1D5C9}{\msansp }{\mathalpha}{mathematical sans-serif small p}%
+\UnicodeMathSymbol{"1D5CA}{\msansq }{\mathalpha}{mathematical sans-serif small q}%
+\UnicodeMathSymbol{"1D5CB}{\msansr }{\mathalpha}{mathematical sans-serif small r}%
+\UnicodeMathSymbol{"1D5CC}{\msanss }{\mathalpha}{mathematical sans-serif small s}%
+\UnicodeMathSymbol{"1D5CD}{\msanst }{\mathalpha}{mathematical sans-serif small t}%
+\UnicodeMathSymbol{"1D5CE}{\msansu }{\mathalpha}{mathematical sans-serif small u}%
+\UnicodeMathSymbol{"1D5CF}{\msansv }{\mathalpha}{mathematical sans-serif small v}%
+\UnicodeMathSymbol{"1D5D0}{\msansw }{\mathalpha}{mathematical sans-serif small w}%
+\UnicodeMathSymbol{"1D5D1}{\msansx }{\mathalpha}{mathematical sans-serif small x}%
+\UnicodeMathSymbol{"1D5D2}{\msansy }{\mathalpha}{mathematical sans-serif small y}%
+\UnicodeMathSymbol{"1D5D3}{\msansz }{\mathalpha}{mathematical sans-serif small z}%
+\UnicodeMathSymbol{"1D5D4}{\mbfsansA }{\mathalpha}{mathematical sans-serif bold capital a}%
+\UnicodeMathSymbol{"1D5D5}{\mbfsansB }{\mathalpha}{mathematical sans-serif bold capital b}%
+\UnicodeMathSymbol{"1D5D6}{\mbfsansC }{\mathalpha}{mathematical sans-serif bold capital c}%
+\UnicodeMathSymbol{"1D5D7}{\mbfsansD }{\mathalpha}{mathematical sans-serif bold capital d}%
+\UnicodeMathSymbol{"1D5D8}{\mbfsansE }{\mathalpha}{mathematical sans-serif bold capital e}%
+\UnicodeMathSymbol{"1D5D9}{\mbfsansF }{\mathalpha}{mathematical sans-serif bold capital f}%
+\UnicodeMathSymbol{"1D5DA}{\mbfsansG }{\mathalpha}{mathematical sans-serif bold capital g}%
+\UnicodeMathSymbol{"1D5DB}{\mbfsansH }{\mathalpha}{mathematical sans-serif bold capital h}%
+\UnicodeMathSymbol{"1D5DC}{\mbfsansI }{\mathalpha}{mathematical sans-serif bold capital i}%
+\UnicodeMathSymbol{"1D5DD}{\mbfsansJ }{\mathalpha}{mathematical sans-serif bold capital j}%
+\UnicodeMathSymbol{"1D5DE}{\mbfsansK }{\mathalpha}{mathematical sans-serif bold capital k}%
+\UnicodeMathSymbol{"1D5DF}{\mbfsansL }{\mathalpha}{mathematical sans-serif bold capital l}%
+\UnicodeMathSymbol{"1D5E0}{\mbfsansM }{\mathalpha}{mathematical sans-serif bold capital m}%
+\UnicodeMathSymbol{"1D5E1}{\mbfsansN }{\mathalpha}{mathematical sans-serif bold capital n}%
+\UnicodeMathSymbol{"1D5E2}{\mbfsansO }{\mathalpha}{mathematical sans-serif bold capital o}%
+\UnicodeMathSymbol{"1D5E3}{\mbfsansP }{\mathalpha}{mathematical sans-serif bold capital p}%
+\UnicodeMathSymbol{"1D5E4}{\mbfsansQ }{\mathalpha}{mathematical sans-serif bold capital q}%
+\UnicodeMathSymbol{"1D5E5}{\mbfsansR }{\mathalpha}{mathematical sans-serif bold capital r}%
+\UnicodeMathSymbol{"1D5E6}{\mbfsansS }{\mathalpha}{mathematical sans-serif bold capital s}%
+\UnicodeMathSymbol{"1D5E7}{\mbfsansT }{\mathalpha}{mathematical sans-serif bold capital t}%
+\UnicodeMathSymbol{"1D5E8}{\mbfsansU }{\mathalpha}{mathematical sans-serif bold capital u}%
+\UnicodeMathSymbol{"1D5E9}{\mbfsansV }{\mathalpha}{mathematical sans-serif bold capital v}%
+\UnicodeMathSymbol{"1D5EA}{\mbfsansW }{\mathalpha}{mathematical sans-serif bold capital w}%
+\UnicodeMathSymbol{"1D5EB}{\mbfsansX }{\mathalpha}{mathematical sans-serif bold capital x}%
+\UnicodeMathSymbol{"1D5EC}{\mbfsansY }{\mathalpha}{mathematical sans-serif bold capital y}%
+\UnicodeMathSymbol{"1D5ED}{\mbfsansZ }{\mathalpha}{mathematical sans-serif bold capital z}%
+\UnicodeMathSymbol{"1D5EE}{\mbfsansa }{\mathalpha}{mathematical sans-serif bold small a}%
+\UnicodeMathSymbol{"1D5EF}{\mbfsansb }{\mathalpha}{mathematical sans-serif bold small b}%
+\UnicodeMathSymbol{"1D5F0}{\mbfsansc }{\mathalpha}{mathematical sans-serif bold small c}%
+\UnicodeMathSymbol{"1D5F1}{\mbfsansd }{\mathalpha}{mathematical sans-serif bold small d}%
+\UnicodeMathSymbol{"1D5F2}{\mbfsanse }{\mathalpha}{mathematical sans-serif bold small e}%
+\UnicodeMathSymbol{"1D5F3}{\mbfsansf }{\mathalpha}{mathematical sans-serif bold small f}%
+\UnicodeMathSymbol{"1D5F4}{\mbfsansg }{\mathalpha}{mathematical sans-serif bold small g}%
+\UnicodeMathSymbol{"1D5F5}{\mbfsansh }{\mathalpha}{mathematical sans-serif bold small h}%
+\UnicodeMathSymbol{"1D5F6}{\mbfsansi }{\mathalpha}{mathematical sans-serif bold small i}%
+\UnicodeMathSymbol{"1D5F7}{\mbfsansj }{\mathalpha}{mathematical sans-serif bold small j}%
+\UnicodeMathSymbol{"1D5F8}{\mbfsansk }{\mathalpha}{mathematical sans-serif bold small k}%
+\UnicodeMathSymbol{"1D5F9}{\mbfsansl }{\mathalpha}{mathematical sans-serif bold small l}%
+\UnicodeMathSymbol{"1D5FA}{\mbfsansm }{\mathalpha}{mathematical sans-serif bold small m}%
+\UnicodeMathSymbol{"1D5FB}{\mbfsansn }{\mathalpha}{mathematical sans-serif bold small n}%
+\UnicodeMathSymbol{"1D5FC}{\mbfsanso }{\mathalpha}{mathematical sans-serif bold small o}%
+\UnicodeMathSymbol{"1D5FD}{\mbfsansp }{\mathalpha}{mathematical sans-serif bold small p}%
+\UnicodeMathSymbol{"1D5FE}{\mbfsansq }{\mathalpha}{mathematical sans-serif bold small q}%
+\UnicodeMathSymbol{"1D5FF}{\mbfsansr }{\mathalpha}{mathematical sans-serif bold small r}%
+\UnicodeMathSymbol{"1D600}{\mbfsanss }{\mathalpha}{mathematical sans-serif bold small s}%
+\UnicodeMathSymbol{"1D601}{\mbfsanst }{\mathalpha}{mathematical sans-serif bold small t}%
+\UnicodeMathSymbol{"1D602}{\mbfsansu }{\mathalpha}{mathematical sans-serif bold small u}%
+\UnicodeMathSymbol{"1D603}{\mbfsansv }{\mathalpha}{mathematical sans-serif bold small v}%
+\UnicodeMathSymbol{"1D604}{\mbfsansw }{\mathalpha}{mathematical sans-serif bold small w}%
+\UnicodeMathSymbol{"1D605}{\mbfsansx }{\mathalpha}{mathematical sans-serif bold small x}%
+\UnicodeMathSymbol{"1D606}{\mbfsansy }{\mathalpha}{mathematical sans-serif bold small y}%
+\UnicodeMathSymbol{"1D607}{\mbfsansz }{\mathalpha}{mathematical sans-serif bold small z}%
+\UnicodeMathSymbol{"1D608}{\mitsansA }{\mathalpha}{mathematical sans-serif italic capital a}%
+\UnicodeMathSymbol{"1D609}{\mitsansB }{\mathalpha}{mathematical sans-serif italic capital b}%
+\UnicodeMathSymbol{"1D60A}{\mitsansC }{\mathalpha}{mathematical sans-serif italic capital c}%
+\UnicodeMathSymbol{"1D60B}{\mitsansD }{\mathalpha}{mathematical sans-serif italic capital d}%
+\UnicodeMathSymbol{"1D60C}{\mitsansE }{\mathalpha}{mathematical sans-serif italic capital e}%
+\UnicodeMathSymbol{"1D60D}{\mitsansF }{\mathalpha}{mathematical sans-serif italic capital f}%
+\UnicodeMathSymbol{"1D60E}{\mitsansG }{\mathalpha}{mathematical sans-serif italic capital g}%
+\UnicodeMathSymbol{"1D60F}{\mitsansH }{\mathalpha}{mathematical sans-serif italic capital h}%
+\UnicodeMathSymbol{"1D610}{\mitsansI }{\mathalpha}{mathematical sans-serif italic capital i}%
+\UnicodeMathSymbol{"1D611}{\mitsansJ }{\mathalpha}{mathematical sans-serif italic capital j}%
+\UnicodeMathSymbol{"1D612}{\mitsansK }{\mathalpha}{mathematical sans-serif italic capital k}%
+\UnicodeMathSymbol{"1D613}{\mitsansL }{\mathalpha}{mathematical sans-serif italic capital l}%
+\UnicodeMathSymbol{"1D614}{\mitsansM }{\mathalpha}{mathematical sans-serif italic capital m}%
+\UnicodeMathSymbol{"1D615}{\mitsansN }{\mathalpha}{mathematical sans-serif italic capital n}%
+\UnicodeMathSymbol{"1D616}{\mitsansO }{\mathalpha}{mathematical sans-serif italic capital o}%
+\UnicodeMathSymbol{"1D617}{\mitsansP }{\mathalpha}{mathematical sans-serif italic capital p}%
+\UnicodeMathSymbol{"1D618}{\mitsansQ }{\mathalpha}{mathematical sans-serif italic capital q}%
+\UnicodeMathSymbol{"1D619}{\mitsansR }{\mathalpha}{mathematical sans-serif italic capital r}%
+\UnicodeMathSymbol{"1D61A}{\mitsansS }{\mathalpha}{mathematical sans-serif italic capital s}%
+\UnicodeMathSymbol{"1D61B}{\mitsansT }{\mathalpha}{mathematical sans-serif italic capital t}%
+\UnicodeMathSymbol{"1D61C}{\mitsansU }{\mathalpha}{mathematical sans-serif italic capital u}%
+\UnicodeMathSymbol{"1D61D}{\mitsansV }{\mathalpha}{mathematical sans-serif italic capital v}%
+\UnicodeMathSymbol{"1D61E}{\mitsansW }{\mathalpha}{mathematical sans-serif italic capital w}%
+\UnicodeMathSymbol{"1D61F}{\mitsansX }{\mathalpha}{mathematical sans-serif italic capital x}%
+\UnicodeMathSymbol{"1D620}{\mitsansY }{\mathalpha}{mathematical sans-serif italic capital y}%
+\UnicodeMathSymbol{"1D621}{\mitsansZ }{\mathalpha}{mathematical sans-serif italic capital z}%
+\UnicodeMathSymbol{"1D622}{\mitsansa }{\mathalpha}{mathematical sans-serif italic small a}%
+\UnicodeMathSymbol{"1D623}{\mitsansb }{\mathalpha}{mathematical sans-serif italic small b}%
+\UnicodeMathSymbol{"1D624}{\mitsansc }{\mathalpha}{mathematical sans-serif italic small c}%
+\UnicodeMathSymbol{"1D625}{\mitsansd }{\mathalpha}{mathematical sans-serif italic small d}%
+\UnicodeMathSymbol{"1D626}{\mitsanse }{\mathalpha}{mathematical sans-serif italic small e}%
+\UnicodeMathSymbol{"1D627}{\mitsansf }{\mathalpha}{mathematical sans-serif italic small f}%
+\UnicodeMathSymbol{"1D628}{\mitsansg }{\mathalpha}{mathematical sans-serif italic small g}%
+\UnicodeMathSymbol{"1D629}{\mitsansh }{\mathalpha}{mathematical sans-serif italic small h}%
+\UnicodeMathSymbol{"1D62A}{\mitsansi }{\mathalpha}{mathematical sans-serif italic small i}%
+\UnicodeMathSymbol{"1D62B}{\mitsansj }{\mathalpha}{mathematical sans-serif italic small j}%
+\UnicodeMathSymbol{"1D62C}{\mitsansk }{\mathalpha}{mathematical sans-serif italic small k}%
+\UnicodeMathSymbol{"1D62D}{\mitsansl }{\mathalpha}{mathematical sans-serif italic small l}%
+\UnicodeMathSymbol{"1D62E}{\mitsansm }{\mathalpha}{mathematical sans-serif italic small m}%
+\UnicodeMathSymbol{"1D62F}{\mitsansn }{\mathalpha}{mathematical sans-serif italic small n}%
+\UnicodeMathSymbol{"1D630}{\mitsanso }{\mathalpha}{mathematical sans-serif italic small o}%
+\UnicodeMathSymbol{"1D631}{\mitsansp }{\mathalpha}{mathematical sans-serif italic small p}%
+\UnicodeMathSymbol{"1D632}{\mitsansq }{\mathalpha}{mathematical sans-serif italic small q}%
+\UnicodeMathSymbol{"1D633}{\mitsansr }{\mathalpha}{mathematical sans-serif italic small r}%
+\UnicodeMathSymbol{"1D634}{\mitsanss }{\mathalpha}{mathematical sans-serif italic small s}%
+\UnicodeMathSymbol{"1D635}{\mitsanst }{\mathalpha}{mathematical sans-serif italic small t}%
+\UnicodeMathSymbol{"1D636}{\mitsansu }{\mathalpha}{mathematical sans-serif italic small u}%
+\UnicodeMathSymbol{"1D637}{\mitsansv }{\mathalpha}{mathematical sans-serif italic small v}%
+\UnicodeMathSymbol{"1D638}{\mitsansw }{\mathalpha}{mathematical sans-serif italic small w}%
+\UnicodeMathSymbol{"1D639}{\mitsansx }{\mathalpha}{mathematical sans-serif italic small x}%
+\UnicodeMathSymbol{"1D63A}{\mitsansy }{\mathalpha}{mathematical sans-serif italic small y}%
+\UnicodeMathSymbol{"1D63B}{\mitsansz }{\mathalpha}{mathematical sans-serif italic small z}%
+\UnicodeMathSymbol{"1D63C}{\mbfitsansA }{\mathalpha}{mathematical sans-serif bold italic capital a}%
+\UnicodeMathSymbol{"1D63D}{\mbfitsansB }{\mathalpha}{mathematical sans-serif bold italic capital b}%
+\UnicodeMathSymbol{"1D63E}{\mbfitsansC }{\mathalpha}{mathematical sans-serif bold italic capital c}%
+\UnicodeMathSymbol{"1D63F}{\mbfitsansD }{\mathalpha}{mathematical sans-serif bold italic capital d}%
+\UnicodeMathSymbol{"1D640}{\mbfitsansE }{\mathalpha}{mathematical sans-serif bold italic capital e}%
+\UnicodeMathSymbol{"1D641}{\mbfitsansF }{\mathalpha}{mathematical sans-serif bold italic capital f}%
+\UnicodeMathSymbol{"1D642}{\mbfitsansG }{\mathalpha}{mathematical sans-serif bold italic capital g}%
+\UnicodeMathSymbol{"1D643}{\mbfitsansH }{\mathalpha}{mathematical sans-serif bold italic capital h}%
+\UnicodeMathSymbol{"1D644}{\mbfitsansI }{\mathalpha}{mathematical sans-serif bold italic capital i}%
+\UnicodeMathSymbol{"1D645}{\mbfitsansJ }{\mathalpha}{mathematical sans-serif bold italic capital j}%
+\UnicodeMathSymbol{"1D646}{\mbfitsansK }{\mathalpha}{mathematical sans-serif bold italic capital k}%
+\UnicodeMathSymbol{"1D647}{\mbfitsansL }{\mathalpha}{mathematical sans-serif bold italic capital l}%
+\UnicodeMathSymbol{"1D648}{\mbfitsansM }{\mathalpha}{mathematical sans-serif bold italic capital m}%
+\UnicodeMathSymbol{"1D649}{\mbfitsansN }{\mathalpha}{mathematical sans-serif bold italic capital n}%
+\UnicodeMathSymbol{"1D64A}{\mbfitsansO }{\mathalpha}{mathematical sans-serif bold italic capital o}%
+\UnicodeMathSymbol{"1D64B}{\mbfitsansP }{\mathalpha}{mathematical sans-serif bold italic capital p}%
+\UnicodeMathSymbol{"1D64C}{\mbfitsansQ }{\mathalpha}{mathematical sans-serif bold italic capital q}%
+\UnicodeMathSymbol{"1D64D}{\mbfitsansR }{\mathalpha}{mathematical sans-serif bold italic capital r}%
+\UnicodeMathSymbol{"1D64E}{\mbfitsansS }{\mathalpha}{mathematical sans-serif bold italic capital s}%
+\UnicodeMathSymbol{"1D64F}{\mbfitsansT }{\mathalpha}{mathematical sans-serif bold italic capital t}%
+\UnicodeMathSymbol{"1D650}{\mbfitsansU }{\mathalpha}{mathematical sans-serif bold italic capital u}%
+\UnicodeMathSymbol{"1D651}{\mbfitsansV }{\mathalpha}{mathematical sans-serif bold italic capital v}%
+\UnicodeMathSymbol{"1D652}{\mbfitsansW }{\mathalpha}{mathematical sans-serif bold italic capital w}%
+\UnicodeMathSymbol{"1D653}{\mbfitsansX }{\mathalpha}{mathematical sans-serif bold italic capital x}%
+\UnicodeMathSymbol{"1D654}{\mbfitsansY }{\mathalpha}{mathematical sans-serif bold italic capital y}%
+\UnicodeMathSymbol{"1D655}{\mbfitsansZ }{\mathalpha}{mathematical sans-serif bold italic capital z}%
+\UnicodeMathSymbol{"1D656}{\mbfitsansa }{\mathalpha}{mathematical sans-serif bold italic small a}%
+\UnicodeMathSymbol{"1D657}{\mbfitsansb }{\mathalpha}{mathematical sans-serif bold italic small b}%
+\UnicodeMathSymbol{"1D658}{\mbfitsansc }{\mathalpha}{mathematical sans-serif bold italic small c}%
+\UnicodeMathSymbol{"1D659}{\mbfitsansd }{\mathalpha}{mathematical sans-serif bold italic small d}%
+\UnicodeMathSymbol{"1D65A}{\mbfitsanse }{\mathalpha}{mathematical sans-serif bold italic small e}%
+\UnicodeMathSymbol{"1D65B}{\mbfitsansf }{\mathalpha}{mathematical sans-serif bold italic small f}%
+\UnicodeMathSymbol{"1D65C}{\mbfitsansg }{\mathalpha}{mathematical sans-serif bold italic small g}%
+\UnicodeMathSymbol{"1D65D}{\mbfitsansh }{\mathalpha}{mathematical sans-serif bold italic small h}%
+\UnicodeMathSymbol{"1D65E}{\mbfitsansi }{\mathalpha}{mathematical sans-serif bold italic small i}%
+\UnicodeMathSymbol{"1D65F}{\mbfitsansj }{\mathalpha}{mathematical sans-serif bold italic small j}%
+\UnicodeMathSymbol{"1D660}{\mbfitsansk }{\mathalpha}{mathematical sans-serif bold italic small k}%
+\UnicodeMathSymbol{"1D661}{\mbfitsansl }{\mathalpha}{mathematical sans-serif bold italic small l}%
+\UnicodeMathSymbol{"1D662}{\mbfitsansm }{\mathalpha}{mathematical sans-serif bold italic small m}%
+\UnicodeMathSymbol{"1D663}{\mbfitsansn }{\mathalpha}{mathematical sans-serif bold italic small n}%
+\UnicodeMathSymbol{"1D664}{\mbfitsanso }{\mathalpha}{mathematical sans-serif bold italic small o}%
+\UnicodeMathSymbol{"1D665}{\mbfitsansp }{\mathalpha}{mathematical sans-serif bold italic small p}%
+\UnicodeMathSymbol{"1D666}{\mbfitsansq }{\mathalpha}{mathematical sans-serif bold italic small q}%
+\UnicodeMathSymbol{"1D667}{\mbfitsansr }{\mathalpha}{mathematical sans-serif bold italic small r}%
+\UnicodeMathSymbol{"1D668}{\mbfitsanss }{\mathalpha}{mathematical sans-serif bold italic small s}%
+\UnicodeMathSymbol{"1D669}{\mbfitsanst }{\mathalpha}{mathematical sans-serif bold italic small t}%
+\UnicodeMathSymbol{"1D66A}{\mbfitsansu }{\mathalpha}{mathematical sans-serif bold italic small u}%
+\UnicodeMathSymbol{"1D66B}{\mbfitsansv }{\mathalpha}{mathematical sans-serif bold italic small v}%
+\UnicodeMathSymbol{"1D66C}{\mbfitsansw }{\mathalpha}{mathematical sans-serif bold italic small w}%
+\UnicodeMathSymbol{"1D66D}{\mbfitsansx }{\mathalpha}{mathematical sans-serif bold italic small x}%
+\UnicodeMathSymbol{"1D66E}{\mbfitsansy }{\mathalpha}{mathematical sans-serif bold italic small y}%
+\UnicodeMathSymbol{"1D66F}{\mbfitsansz }{\mathalpha}{mathematical sans-serif bold italic small z}%
+\UnicodeMathSymbol{"1D670}{\mttA }{\mathalpha}{mathematical monospace capital a}%
+\UnicodeMathSymbol{"1D671}{\mttB }{\mathalpha}{mathematical monospace capital b}%
+\UnicodeMathSymbol{"1D672}{\mttC }{\mathalpha}{mathematical monospace capital c}%
+\UnicodeMathSymbol{"1D673}{\mttD }{\mathalpha}{mathematical monospace capital d}%
+\UnicodeMathSymbol{"1D674}{\mttE }{\mathalpha}{mathematical monospace capital e}%
+\UnicodeMathSymbol{"1D675}{\mttF }{\mathalpha}{mathematical monospace capital f}%
+\UnicodeMathSymbol{"1D676}{\mttG }{\mathalpha}{mathematical monospace capital g}%
+\UnicodeMathSymbol{"1D677}{\mttH }{\mathalpha}{mathematical monospace capital h}%
+\UnicodeMathSymbol{"1D678}{\mttI }{\mathalpha}{mathematical monospace capital i}%
+\UnicodeMathSymbol{"1D679}{\mttJ }{\mathalpha}{mathematical monospace capital j}%
+\UnicodeMathSymbol{"1D67A}{\mttK }{\mathalpha}{mathematical monospace capital k}%
+\UnicodeMathSymbol{"1D67B}{\mttL }{\mathalpha}{mathematical monospace capital l}%
+\UnicodeMathSymbol{"1D67C}{\mttM }{\mathalpha}{mathematical monospace capital m}%
+\UnicodeMathSymbol{"1D67D}{\mttN }{\mathalpha}{mathematical monospace capital n}%
+\UnicodeMathSymbol{"1D67E}{\mttO }{\mathalpha}{mathematical monospace capital o}%
+\UnicodeMathSymbol{"1D67F}{\mttP }{\mathalpha}{mathematical monospace capital p}%
+\UnicodeMathSymbol{"1D680}{\mttQ }{\mathalpha}{mathematical monospace capital q}%
+\UnicodeMathSymbol{"1D681}{\mttR }{\mathalpha}{mathematical monospace capital r}%
+\UnicodeMathSymbol{"1D682}{\mttS }{\mathalpha}{mathematical monospace capital s}%
+\UnicodeMathSymbol{"1D683}{\mttT }{\mathalpha}{mathematical monospace capital t}%
+\UnicodeMathSymbol{"1D684}{\mttU }{\mathalpha}{mathematical monospace capital u}%
+\UnicodeMathSymbol{"1D685}{\mttV }{\mathalpha}{mathematical monospace capital v}%
+\UnicodeMathSymbol{"1D686}{\mttW }{\mathalpha}{mathematical monospace capital w}%
+\UnicodeMathSymbol{"1D687}{\mttX }{\mathalpha}{mathematical monospace capital x}%
+\UnicodeMathSymbol{"1D688}{\mttY }{\mathalpha}{mathematical monospace capital y}%
+\UnicodeMathSymbol{"1D689}{\mttZ }{\mathalpha}{mathematical monospace capital z}%
+\UnicodeMathSymbol{"1D68A}{\mtta }{\mathalpha}{mathematical monospace small a}%
+\UnicodeMathSymbol{"1D68B}{\mttb }{\mathalpha}{mathematical monospace small b}%
+\UnicodeMathSymbol{"1D68C}{\mttc }{\mathalpha}{mathematical monospace small c}%
+\UnicodeMathSymbol{"1D68D}{\mttd }{\mathalpha}{mathematical monospace small d}%
+\UnicodeMathSymbol{"1D68E}{\mtte }{\mathalpha}{mathematical monospace small e}%
+\UnicodeMathSymbol{"1D68F}{\mttf }{\mathalpha}{mathematical monospace small f}%
+\UnicodeMathSymbol{"1D690}{\mttg }{\mathalpha}{mathematical monospace small g}%
+\UnicodeMathSymbol{"1D691}{\mtth }{\mathalpha}{mathematical monospace small h}%
+\UnicodeMathSymbol{"1D692}{\mtti }{\mathalpha}{mathematical monospace small i}%
+\UnicodeMathSymbol{"1D693}{\mttj }{\mathalpha}{mathematical monospace small j}%
+\UnicodeMathSymbol{"1D694}{\mttk }{\mathalpha}{mathematical monospace small k}%
+\UnicodeMathSymbol{"1D695}{\mttl }{\mathalpha}{mathematical monospace small l}%
+\UnicodeMathSymbol{"1D696}{\mttm }{\mathalpha}{mathematical monospace small m}%
+\UnicodeMathSymbol{"1D697}{\mttn }{\mathalpha}{mathematical monospace small n}%
+\UnicodeMathSymbol{"1D698}{\mtto }{\mathalpha}{mathematical monospace small o}%
+\UnicodeMathSymbol{"1D699}{\mttp }{\mathalpha}{mathematical monospace small p}%
+\UnicodeMathSymbol{"1D69A}{\mttq }{\mathalpha}{mathematical monospace small q}%
+\UnicodeMathSymbol{"1D69B}{\mttr }{\mathalpha}{mathematical monospace small r}%
+\UnicodeMathSymbol{"1D69C}{\mtts }{\mathalpha}{mathematical monospace small s}%
+\UnicodeMathSymbol{"1D69D}{\mttt }{\mathalpha}{mathematical monospace small t}%
+\UnicodeMathSymbol{"1D69E}{\mttu }{\mathalpha}{mathematical monospace small u}%
+\UnicodeMathSymbol{"1D69F}{\mttv }{\mathalpha}{mathematical monospace small v}%
+\UnicodeMathSymbol{"1D6A0}{\mttw }{\mathalpha}{mathematical monospace small w}%
+\UnicodeMathSymbol{"1D6A1}{\mttx }{\mathalpha}{mathematical monospace small x}%
+\UnicodeMathSymbol{"1D6A2}{\mtty }{\mathalpha}{mathematical monospace small y}%
+\UnicodeMathSymbol{"1D6A3}{\mttz }{\mathalpha}{mathematical monospace small z}%
+\UnicodeMathSymbol{"1D6A4}{\imath }{\mathalpha}{mathematical italic small dotless i}%
+\UnicodeMathSymbol{"1D6A5}{\jmath }{\mathalpha}{mathematical italic small dotless j}%
+\UnicodeMathSymbol{"1D6A8}{\mbfAlpha }{\mathalpha}{mathematical bold capital alpha}%
+\UnicodeMathSymbol{"1D6A9}{\mbfBeta }{\mathalpha}{mathematical bold capital beta}%
+\UnicodeMathSymbol{"1D6AA}{\mbfGamma }{\mathalpha}{mathematical bold capital gamma}%
+\UnicodeMathSymbol{"1D6AB}{\mbfDelta }{\mathalpha}{mathematical bold capital delta}%
+\UnicodeMathSymbol{"1D6AC}{\mbfEpsilon }{\mathalpha}{mathematical bold capital epsilon}%
+\UnicodeMathSymbol{"1D6AD}{\mbfZeta }{\mathalpha}{mathematical bold capital zeta}%
+\UnicodeMathSymbol{"1D6AE}{\mbfEta }{\mathalpha}{mathematical bold capital eta}%
+\UnicodeMathSymbol{"1D6AF}{\mbfTheta }{\mathalpha}{mathematical bold capital theta}%
+\UnicodeMathSymbol{"1D6B0}{\mbfIota }{\mathalpha}{mathematical bold capital iota}%
+\UnicodeMathSymbol{"1D6B1}{\mbfKappa }{\mathalpha}{mathematical bold capital kappa}%
+\UnicodeMathSymbol{"1D6B2}{\mbfLambda }{\mathalpha}{mathematical bold capital lambda}%
+\UnicodeMathSymbol{"1D6B3}{\mbfMu }{\mathalpha}{mathematical bold capital mu}%
+\UnicodeMathSymbol{"1D6B4}{\mbfNu }{\mathalpha}{mathematical bold capital nu}%
+\UnicodeMathSymbol{"1D6B5}{\mbfXi }{\mathalpha}{mathematical bold capital xi}%
+\UnicodeMathSymbol{"1D6B6}{\mbfOmicron }{\mathalpha}{mathematical bold capital omicron}%
+\UnicodeMathSymbol{"1D6B7}{\mbfPi }{\mathalpha}{mathematical bold capital pi}%
+\UnicodeMathSymbol{"1D6B8}{\mbfRho }{\mathalpha}{mathematical bold capital rho}%
+\UnicodeMathSymbol{"1D6B9}{\mbfvarTheta }{\mathalpha}{mathematical bold capital theta symbol}%
+\UnicodeMathSymbol{"1D6BA}{\mbfSigma }{\mathalpha}{mathematical bold capital sigma}%
+\UnicodeMathSymbol{"1D6BB}{\mbfTau }{\mathalpha}{mathematical bold capital tau}%
+\UnicodeMathSymbol{"1D6BC}{\mbfUpsilon }{\mathalpha}{mathematical bold capital upsilon}%
+\UnicodeMathSymbol{"1D6BD}{\mbfPhi }{\mathalpha}{mathematical bold capital phi}%
+\UnicodeMathSymbol{"1D6BE}{\mbfChi }{\mathalpha}{mathematical bold capital chi}%
+\UnicodeMathSymbol{"1D6BF}{\mbfPsi }{\mathalpha}{mathematical bold capital psi}%
+\UnicodeMathSymbol{"1D6C0}{\mbfOmega }{\mathalpha}{mathematical bold capital omega}%
+\UnicodeMathSymbol{"1D6C1}{\mbfnabla }{\mathalpha}{mathematical bold nabla}%
+\UnicodeMathSymbol{"1D6C2}{\mbfalpha }{\mathalpha}{mathematical bold small alpha}%
+\UnicodeMathSymbol{"1D6C3}{\mbfbeta }{\mathalpha}{mathematical bold small beta}%
+\UnicodeMathSymbol{"1D6C4}{\mbfgamma }{\mathalpha}{mathematical bold small gamma}%
+\UnicodeMathSymbol{"1D6C5}{\mbfdelta }{\mathalpha}{mathematical bold small delta}%
+\UnicodeMathSymbol{"1D6C6}{\mbfvarepsilon }{\mathalpha}{mathematical bold small varepsilon}%
+\UnicodeMathSymbol{"1D6C7}{\mbfzeta }{\mathalpha}{mathematical bold small zeta}%
+\UnicodeMathSymbol{"1D6C8}{\mbfeta }{\mathalpha}{mathematical bold small eta}%
+\UnicodeMathSymbol{"1D6C9}{\mbftheta }{\mathalpha}{mathematical bold small theta}%
+\UnicodeMathSymbol{"1D6CA}{\mbfiota }{\mathalpha}{mathematical bold small iota}%
+\UnicodeMathSymbol{"1D6CB}{\mbfkappa }{\mathalpha}{mathematical bold small kappa}%
+\UnicodeMathSymbol{"1D6CC}{\mbflambda }{\mathalpha}{mathematical bold small lambda}%
+\UnicodeMathSymbol{"1D6CD}{\mbfmu }{\mathalpha}{mathematical bold small mu}%
+\UnicodeMathSymbol{"1D6CE}{\mbfnu }{\mathalpha}{mathematical bold small nu}%
+\UnicodeMathSymbol{"1D6CF}{\mbfxi }{\mathalpha}{mathematical bold small xi}%
+\UnicodeMathSymbol{"1D6D0}{\mbfomicron }{\mathalpha}{mathematical bold small omicron}%
+\UnicodeMathSymbol{"1D6D1}{\mbfpi }{\mathalpha}{mathematical bold small pi}%
+\UnicodeMathSymbol{"1D6D2}{\mbfrho }{\mathalpha}{mathematical bold small rho}%
+\UnicodeMathSymbol{"1D6D3}{\mbfvarsigma }{\mathalpha}{mathematical bold small final sigma}%
+\UnicodeMathSymbol{"1D6D4}{\mbfsigma }{\mathalpha}{mathematical bold small sigma}%
+\UnicodeMathSymbol{"1D6D5}{\mbftau }{\mathalpha}{mathematical bold small tau}%
+\UnicodeMathSymbol{"1D6D6}{\mbfupsilon }{\mathalpha}{mathematical bold small upsilon}%
+\UnicodeMathSymbol{"1D6D7}{\mbfvarphi }{\mathalpha}{mathematical bold small phi}%
+\UnicodeMathSymbol{"1D6D8}{\mbfchi }{\mathalpha}{mathematical bold small chi}%
+\UnicodeMathSymbol{"1D6D9}{\mbfpsi }{\mathalpha}{mathematical bold small psi}%
+\UnicodeMathSymbol{"1D6DA}{\mbfomega }{\mathalpha}{mathematical bold small omega}%
+\UnicodeMathSymbol{"1D6DB}{\mbfpartial }{\mathalpha}{mathematical bold partial differential}%
+\UnicodeMathSymbol{"1D6DC}{\mbfepsilon }{\mathalpha}{mathematical bold varepsilon symbol}%
+\UnicodeMathSymbol{"1D6DD}{\mbfvartheta }{\mathalpha}{mathematical bold theta symbol}%
+\UnicodeMathSymbol{"1D6DE}{\mbfvarkappa }{\mathalpha}{mathematical bold kappa symbol}%
+\UnicodeMathSymbol{"1D6DF}{\mbfphi }{\mathalpha}{mathematical bold phi symbol}%
+\UnicodeMathSymbol{"1D6E0}{\mbfvarrho }{\mathalpha}{mathematical bold rho symbol}%
+\UnicodeMathSymbol{"1D6E1}{\mbfvarpi }{\mathalpha}{mathematical bold pi symbol}%
+\UnicodeMathSymbol{"1D6E2}{\mitAlpha }{\mathalpha}{mathematical italic capital alpha}%
+\UnicodeMathSymbol{"1D6E3}{\mitBeta }{\mathalpha}{mathematical italic capital beta}%
+\UnicodeMathSymbol{"1D6E4}{\mitGamma }{\mathalpha}{mathematical italic capital gamma}%
+\UnicodeMathSymbol{"1D6E5}{\mitDelta }{\mathalpha}{mathematical italic capital delta}%
+\UnicodeMathSymbol{"1D6E6}{\mitEpsilon }{\mathalpha}{mathematical italic capital epsilon}%
+\UnicodeMathSymbol{"1D6E7}{\mitZeta }{\mathalpha}{mathematical italic capital zeta}%
+\UnicodeMathSymbol{"1D6E8}{\mitEta }{\mathalpha}{mathematical italic capital eta}%
+\UnicodeMathSymbol{"1D6E9}{\mitTheta }{\mathalpha}{mathematical italic capital theta}%
+\UnicodeMathSymbol{"1D6EA}{\mitIota }{\mathalpha}{mathematical italic capital iota}%
+\UnicodeMathSymbol{"1D6EB}{\mitKappa }{\mathalpha}{mathematical italic capital kappa}%
+\UnicodeMathSymbol{"1D6EC}{\mitLambda }{\mathalpha}{mathematical italic capital lambda}%
+\UnicodeMathSymbol{"1D6ED}{\mitMu }{\mathalpha}{mathematical italic capital mu}%
+\UnicodeMathSymbol{"1D6EE}{\mitNu }{\mathalpha}{mathematical italic capital nu}%
+\UnicodeMathSymbol{"1D6EF}{\mitXi }{\mathalpha}{mathematical italic capital xi}%
+\UnicodeMathSymbol{"1D6F0}{\mitOmicron }{\mathalpha}{mathematical italic capital omicron}%
+\UnicodeMathSymbol{"1D6F1}{\mitPi }{\mathalpha}{mathematical italic capital pi}%
+\UnicodeMathSymbol{"1D6F2}{\mitRho }{\mathalpha}{mathematical italic capital rho}%
+\UnicodeMathSymbol{"1D6F3}{\mitvarTheta }{\mathalpha}{mathematical italic capital theta symbol}%
+\UnicodeMathSymbol{"1D6F4}{\mitSigma }{\mathalpha}{mathematical italic capital sigma}%
+\UnicodeMathSymbol{"1D6F5}{\mitTau }{\mathalpha}{mathematical italic capital tau}%
+\UnicodeMathSymbol{"1D6F6}{\mitUpsilon }{\mathalpha}{mathematical italic capital upsilon}%
+\UnicodeMathSymbol{"1D6F7}{\mitPhi }{\mathalpha}{mathematical italic capital phi}%
+\UnicodeMathSymbol{"1D6F8}{\mitChi }{\mathalpha}{mathematical italic capital chi}%
+\UnicodeMathSymbol{"1D6F9}{\mitPsi }{\mathalpha}{mathematical italic capital psi}%
+\UnicodeMathSymbol{"1D6FA}{\mitOmega }{\mathalpha}{mathematical italic capital omega}%
+\UnicodeMathSymbol{"1D6FB}{\mitnabla }{\mathalpha}{mathematical italic nabla}%
+\UnicodeMathSymbol{"1D6FC}{\mitalpha }{\mathalpha}{mathematical italic small alpha}%
+\UnicodeMathSymbol{"1D6FD}{\mitbeta }{\mathalpha}{mathematical italic small beta}%
+\UnicodeMathSymbol{"1D6FE}{\mitgamma }{\mathalpha}{mathematical italic small gamma}%
+\UnicodeMathSymbol{"1D6FF}{\mitdelta }{\mathalpha}{mathematical italic small delta}%
+\UnicodeMathSymbol{"1D700}{\mitvarepsilon }{\mathalpha}{mathematical italic small varepsilon}%
+\UnicodeMathSymbol{"1D701}{\mitzeta }{\mathalpha}{mathematical italic small zeta}%
+\UnicodeMathSymbol{"1D702}{\miteta }{\mathalpha}{mathematical italic small eta}%
+\UnicodeMathSymbol{"1D703}{\mittheta }{\mathalpha}{mathematical italic small theta}%
+\UnicodeMathSymbol{"1D704}{\mitiota }{\mathalpha}{mathematical italic small iota}%
+\UnicodeMathSymbol{"1D705}{\mitkappa }{\mathalpha}{mathematical italic small kappa}%
+\UnicodeMathSymbol{"1D706}{\mitlambda }{\mathalpha}{mathematical italic small lambda}%
+\UnicodeMathSymbol{"1D707}{\mitmu }{\mathalpha}{mathematical italic small mu}%
+\UnicodeMathSymbol{"1D708}{\mitnu }{\mathalpha}{mathematical italic small nu}%
+\UnicodeMathSymbol{"1D709}{\mitxi }{\mathalpha}{mathematical italic small xi}%
+\UnicodeMathSymbol{"1D70A}{\mitomicron }{\mathalpha}{mathematical italic small omicron}%
+\UnicodeMathSymbol{"1D70B}{\mitpi }{\mathalpha}{mathematical italic small pi}%
+\UnicodeMathSymbol{"1D70C}{\mitrho }{\mathalpha}{mathematical italic small rho}%
+\UnicodeMathSymbol{"1D70D}{\mitvarsigma }{\mathalpha}{mathematical italic small final sigma}%
+\UnicodeMathSymbol{"1D70E}{\mitsigma }{\mathalpha}{mathematical italic small sigma}%
+\UnicodeMathSymbol{"1D70F}{\mittau }{\mathalpha}{mathematical italic small tau}%
+\UnicodeMathSymbol{"1D710}{\mitupsilon }{\mathalpha}{mathematical italic small upsilon}%
+\UnicodeMathSymbol{"1D711}{\mitvarphi }{\mathalpha}{mathematical italic small phi}%
+\UnicodeMathSymbol{"1D712}{\mitchi }{\mathalpha}{mathematical italic small chi}%
+\UnicodeMathSymbol{"1D713}{\mitpsi }{\mathalpha}{mathematical italic small psi}%
+\UnicodeMathSymbol{"1D714}{\mitomega }{\mathalpha}{mathematical italic small omega}%
+\UnicodeMathSymbol{"1D715}{\mitpartial }{\mathalpha}{mathematical italic partial differential}%
+\UnicodeMathSymbol{"1D716}{\mitepsilon }{\mathalpha}{mathematical italic varepsilon symbol}%
+\UnicodeMathSymbol{"1D717}{\mitvartheta }{\mathalpha}{mathematical italic theta symbol}%
+\UnicodeMathSymbol{"1D718}{\mitvarkappa }{\mathalpha}{mathematical italic kappa symbol}%
+\UnicodeMathSymbol{"1D719}{\mitphi }{\mathalpha}{mathematical italic phi symbol}%
+\UnicodeMathSymbol{"1D71A}{\mitvarrho }{\mathalpha}{mathematical italic rho symbol}%
+\UnicodeMathSymbol{"1D71B}{\mitvarpi }{\mathalpha}{mathematical italic pi symbol}%
+\UnicodeMathSymbol{"1D71C}{\mbfitAlpha }{\mathalpha}{mathematical bold italic capital alpha}%
+\UnicodeMathSymbol{"1D71D}{\mbfitBeta }{\mathalpha}{mathematical bold italic capital beta}%
+\UnicodeMathSymbol{"1D71E}{\mbfitGamma }{\mathalpha}{mathematical bold italic capital gamma}%
+\UnicodeMathSymbol{"1D71F}{\mbfitDelta }{\mathalpha}{mathematical bold italic capital delta}%
+\UnicodeMathSymbol{"1D720}{\mbfitEpsilon }{\mathalpha}{mathematical bold italic capital epsilon}%
+\UnicodeMathSymbol{"1D721}{\mbfitZeta }{\mathalpha}{mathematical bold italic capital zeta}%
+\UnicodeMathSymbol{"1D722}{\mbfitEta }{\mathalpha}{mathematical bold italic capital eta}%
+\UnicodeMathSymbol{"1D723}{\mbfitTheta }{\mathalpha}{mathematical bold italic capital theta}%
+\UnicodeMathSymbol{"1D724}{\mbfitIota }{\mathalpha}{mathematical bold italic capital iota}%
+\UnicodeMathSymbol{"1D725}{\mbfitKappa }{\mathalpha}{mathematical bold italic capital kappa}%
+\UnicodeMathSymbol{"1D726}{\mbfitLambda }{\mathalpha}{mathematical bold italic capital lambda}%
+\UnicodeMathSymbol{"1D727}{\mbfitMu }{\mathalpha}{mathematical bold italic capital mu}%
+\UnicodeMathSymbol{"1D728}{\mbfitNu }{\mathalpha}{mathematical bold italic capital nu}%
+\UnicodeMathSymbol{"1D729}{\mbfitXi }{\mathalpha}{mathematical bold italic capital xi}%
+\UnicodeMathSymbol{"1D72A}{\mbfitOmicron }{\mathalpha}{mathematical bold italic capital omicron}%
+\UnicodeMathSymbol{"1D72B}{\mbfitPi }{\mathalpha}{mathematical bold italic capital pi}%
+\UnicodeMathSymbol{"1D72C}{\mbfitRho }{\mathalpha}{mathematical bold italic capital rho}%
+\UnicodeMathSymbol{"1D72D}{\mbfitvarTheta }{\mathalpha}{mathematical bold italic capital theta symbol}%
+\UnicodeMathSymbol{"1D72E}{\mbfitSigma }{\mathalpha}{mathematical bold italic capital sigma}%
+\UnicodeMathSymbol{"1D72F}{\mbfitTau }{\mathalpha}{mathematical bold italic capital tau}%
+\UnicodeMathSymbol{"1D730}{\mbfitUpsilon }{\mathalpha}{mathematical bold italic capital upsilon}%
+\UnicodeMathSymbol{"1D731}{\mbfitPhi }{\mathalpha}{mathematical bold italic capital phi}%
+\UnicodeMathSymbol{"1D732}{\mbfitChi }{\mathalpha}{mathematical bold italic capital chi}%
+\UnicodeMathSymbol{"1D733}{\mbfitPsi }{\mathalpha}{mathematical bold italic capital psi}%
+\UnicodeMathSymbol{"1D734}{\mbfitOmega }{\mathalpha}{mathematical bold italic capital omega}%
+\UnicodeMathSymbol{"1D735}{\mbfitnabla }{\mathalpha}{mathematical bold italic nabla}%
+\UnicodeMathSymbol{"1D736}{\mbfitalpha }{\mathalpha}{mathematical bold italic small alpha}%
+\UnicodeMathSymbol{"1D737}{\mbfitbeta }{\mathalpha}{mathematical bold italic small beta}%
+\UnicodeMathSymbol{"1D738}{\mbfitgamma }{\mathalpha}{mathematical bold italic small gamma}%
+\UnicodeMathSymbol{"1D739}{\mbfitdelta }{\mathalpha}{mathematical bold italic small delta}%
+\UnicodeMathSymbol{"1D73A}{\mbfitvarepsilon }{\mathalpha}{mathematical bold italic small varepsilon}%
+\UnicodeMathSymbol{"1D73B}{\mbfitzeta }{\mathalpha}{mathematical bold italic small zeta}%
+\UnicodeMathSymbol{"1D73C}{\mbfiteta }{\mathalpha}{mathematical bold italic small eta}%
+\UnicodeMathSymbol{"1D73D}{\mbfittheta }{\mathalpha}{mathematical bold italic small theta}%
+\UnicodeMathSymbol{"1D73E}{\mbfitiota }{\mathalpha}{mathematical bold italic small iota}%
+\UnicodeMathSymbol{"1D73F}{\mbfitkappa }{\mathalpha}{mathematical bold italic small kappa}%
+\UnicodeMathSymbol{"1D740}{\mbfitlambda }{\mathalpha}{mathematical bold italic small lambda}%
+\UnicodeMathSymbol{"1D741}{\mbfitmu }{\mathalpha}{mathematical bold italic small mu}%
+\UnicodeMathSymbol{"1D742}{\mbfitnu }{\mathalpha}{mathematical bold italic small nu}%
+\UnicodeMathSymbol{"1D743}{\mbfitxi }{\mathalpha}{mathematical bold italic small xi}%
+\UnicodeMathSymbol{"1D744}{\mbfitomicron }{\mathalpha}{mathematical bold italic small omicron}%
+\UnicodeMathSymbol{"1D745}{\mbfitpi }{\mathalpha}{mathematical bold italic small pi}%
+\UnicodeMathSymbol{"1D746}{\mbfitrho }{\mathalpha}{mathematical bold italic small rho}%
+\UnicodeMathSymbol{"1D747}{\mbfitvarsigma }{\mathalpha}{mathematical bold italic small final sigma}%
+\UnicodeMathSymbol{"1D748}{\mbfitsigma }{\mathalpha}{mathematical bold italic small sigma}%
+\UnicodeMathSymbol{"1D749}{\mbfittau }{\mathalpha}{mathematical bold italic small tau}%
+\UnicodeMathSymbol{"1D74A}{\mbfitupsilon }{\mathalpha}{mathematical bold italic small upsilon}%
+\UnicodeMathSymbol{"1D74B}{\mbfitvarphi }{\mathalpha}{mathematical bold italic small phi}%
+\UnicodeMathSymbol{"1D74C}{\mbfitchi }{\mathalpha}{mathematical bold italic small chi}%
+\UnicodeMathSymbol{"1D74D}{\mbfitpsi }{\mathalpha}{mathematical bold italic small psi}%
+\UnicodeMathSymbol{"1D74E}{\mbfitomega }{\mathalpha}{mathematical bold italic small omega}%
+\UnicodeMathSymbol{"1D74F}{\mbfitpartial }{\mathalpha}{mathematical bold italic partial differential}%
+\UnicodeMathSymbol{"1D750}{\mbfitepsilon }{\mathalpha}{mathematical bold italic varepsilon symbol}%
+\UnicodeMathSymbol{"1D751}{\mbfitvartheta }{\mathalpha}{mathematical bold italic theta symbol}%
+\UnicodeMathSymbol{"1D752}{\mbfitvarkappa }{\mathalpha}{mathematical bold italic kappa symbol}%
+\UnicodeMathSymbol{"1D753}{\mbfitphi }{\mathalpha}{mathematical bold italic phi symbol}%
+\UnicodeMathSymbol{"1D754}{\mbfitvarrho }{\mathalpha}{mathematical bold italic rho symbol}%
+\UnicodeMathSymbol{"1D755}{\mbfitvarpi }{\mathalpha}{mathematical bold italic pi symbol}%
+\UnicodeMathSymbol{"1D756}{\mbfsansAlpha }{\mathalpha}{mathematical sans-serif bold capital alpha}%
+\UnicodeMathSymbol{"1D757}{\mbfsansBeta }{\mathalpha}{mathematical sans-serif bold capital beta}%
+\UnicodeMathSymbol{"1D758}{\mbfsansGamma }{\mathalpha}{mathematical sans-serif bold capital gamma}%
+\UnicodeMathSymbol{"1D759}{\mbfsansDelta }{\mathalpha}{mathematical sans-serif bold capital delta}%
+\UnicodeMathSymbol{"1D75A}{\mbfsansEpsilon }{\mathalpha}{mathematical sans-serif bold capital epsilon}%
+\UnicodeMathSymbol{"1D75B}{\mbfsansZeta }{\mathalpha}{mathematical sans-serif bold capital zeta}%
+\UnicodeMathSymbol{"1D75C}{\mbfsansEta }{\mathalpha}{mathematical sans-serif bold capital eta}%
+\UnicodeMathSymbol{"1D75D}{\mbfsansTheta }{\mathalpha}{mathematical sans-serif bold capital theta}%
+\UnicodeMathSymbol{"1D75E}{\mbfsansIota }{\mathalpha}{mathematical sans-serif bold capital iota}%
+\UnicodeMathSymbol{"1D75F}{\mbfsansKappa }{\mathalpha}{mathematical sans-serif bold capital kappa}%
+\UnicodeMathSymbol{"1D760}{\mbfsansLambda }{\mathalpha}{mathematical sans-serif bold capital lambda}%
+\UnicodeMathSymbol{"1D761}{\mbfsansMu }{\mathalpha}{mathematical sans-serif bold capital mu}%
+\UnicodeMathSymbol{"1D762}{\mbfsansNu }{\mathalpha}{mathematical sans-serif bold capital nu}%
+\UnicodeMathSymbol{"1D763}{\mbfsansXi }{\mathalpha}{mathematical sans-serif bold capital xi}%
+\UnicodeMathSymbol{"1D764}{\mbfsansOmicron }{\mathalpha}{mathematical sans-serif bold capital omicron}%
+\UnicodeMathSymbol{"1D765}{\mbfsansPi }{\mathalpha}{mathematical sans-serif bold capital pi}%
+\UnicodeMathSymbol{"1D766}{\mbfsansRho }{\mathalpha}{mathematical sans-serif bold capital rho}%
+\UnicodeMathSymbol{"1D767}{\mbfsansvarTheta }{\mathalpha}{mathematical sans-serif bold capital theta symbol}%
+\UnicodeMathSymbol{"1D768}{\mbfsansSigma }{\mathalpha}{mathematical sans-serif bold capital sigma}%
+\UnicodeMathSymbol{"1D769}{\mbfsansTau }{\mathalpha}{mathematical sans-serif bold capital tau}%
+\UnicodeMathSymbol{"1D76A}{\mbfsansUpsilon }{\mathalpha}{mathematical sans-serif bold capital upsilon}%
+\UnicodeMathSymbol{"1D76B}{\mbfsansPhi }{\mathalpha}{mathematical sans-serif bold capital phi}%
+\UnicodeMathSymbol{"1D76C}{\mbfsansChi }{\mathalpha}{mathematical sans-serif bold capital chi}%
+\UnicodeMathSymbol{"1D76D}{\mbfsansPsi }{\mathalpha}{mathematical sans-serif bold capital psi}%
+\UnicodeMathSymbol{"1D76E}{\mbfsansOmega }{\mathalpha}{mathematical sans-serif bold capital omega}%
+\UnicodeMathSymbol{"1D76F}{\mbfsansnabla }{\mathalpha}{mathematical sans-serif bold nabla}%
+\UnicodeMathSymbol{"1D770}{\mbfsansalpha }{\mathalpha}{mathematical sans-serif bold small alpha}%
+\UnicodeMathSymbol{"1D771}{\mbfsansbeta }{\mathalpha}{mathematical sans-serif bold small beta}%
+\UnicodeMathSymbol{"1D772}{\mbfsansgamma }{\mathalpha}{mathematical sans-serif bold small gamma}%
+\UnicodeMathSymbol{"1D773}{\mbfsansdelta }{\mathalpha}{mathematical sans-serif bold small delta}%
+\UnicodeMathSymbol{"1D774}{\mbfsansvarepsilon }{\mathalpha}{mathematical sans-serif bold small varepsilon}%
+\UnicodeMathSymbol{"1D775}{\mbfsanszeta }{\mathalpha}{mathematical sans-serif bold small zeta}%
+\UnicodeMathSymbol{"1D776}{\mbfsanseta }{\mathalpha}{mathematical sans-serif bold small eta}%
+\UnicodeMathSymbol{"1D777}{\mbfsanstheta }{\mathalpha}{mathematical sans-serif bold small theta}%
+\UnicodeMathSymbol{"1D778}{\mbfsansiota }{\mathalpha}{mathematical sans-serif bold small iota}%
+\UnicodeMathSymbol{"1D779}{\mbfsanskappa }{\mathalpha}{mathematical sans-serif bold small kappa}%
+\UnicodeMathSymbol{"1D77A}{\mbfsanslambda }{\mathalpha}{mathematical sans-serif bold small lambda}%
+\UnicodeMathSymbol{"1D77B}{\mbfsansmu }{\mathalpha}{mathematical sans-serif bold small mu}%
+\UnicodeMathSymbol{"1D77C}{\mbfsansnu }{\mathalpha}{mathematical sans-serif bold small nu}%
+\UnicodeMathSymbol{"1D77D}{\mbfsansxi }{\mathalpha}{mathematical sans-serif bold small xi}%
+\UnicodeMathSymbol{"1D77E}{\mbfsansomicron }{\mathalpha}{mathematical sans-serif bold small omicron}%
+\UnicodeMathSymbol{"1D77F}{\mbfsanspi }{\mathalpha}{mathematical sans-serif bold small pi}%
+\UnicodeMathSymbol{"1D780}{\mbfsansrho }{\mathalpha}{mathematical sans-serif bold small rho}%
+\UnicodeMathSymbol{"1D781}{\mbfsansvarsigma }{\mathalpha}{mathematical sans-serif bold small final sigma}%
+\UnicodeMathSymbol{"1D782}{\mbfsanssigma }{\mathalpha}{mathematical sans-serif bold small sigma}%
+\UnicodeMathSymbol{"1D783}{\mbfsanstau }{\mathalpha}{mathematical sans-serif bold small tau}%
+\UnicodeMathSymbol{"1D784}{\mbfsansupsilon }{\mathalpha}{mathematical sans-serif bold small upsilon}%
+\UnicodeMathSymbol{"1D785}{\mbfsansvarphi }{\mathalpha}{mathematical sans-serif bold small phi}%
+\UnicodeMathSymbol{"1D786}{\mbfsanschi }{\mathalpha}{mathematical sans-serif bold small chi}%
+\UnicodeMathSymbol{"1D787}{\mbfsanspsi }{\mathalpha}{mathematical sans-serif bold small psi}%
+\UnicodeMathSymbol{"1D788}{\mbfsansomega }{\mathalpha}{mathematical sans-serif bold small omega}%
+\UnicodeMathSymbol{"1D789}{\mbfsanspartial }{\mathalpha}{mathematical sans-serif bold partial differential}%
+\UnicodeMathSymbol{"1D78A}{\mbfsansepsilon }{\mathalpha}{mathematical sans-serif bold varepsilon symbol}%
+\UnicodeMathSymbol{"1D78B}{\mbfsansvartheta }{\mathalpha}{mathematical sans-serif bold theta symbol}%
+\UnicodeMathSymbol{"1D78C}{\mbfsansvarkappa }{\mathalpha}{mathematical sans-serif bold kappa symbol}%
+\UnicodeMathSymbol{"1D78D}{\mbfsansphi }{\mathalpha}{mathematical sans-serif bold phi symbol}%
+\UnicodeMathSymbol{"1D78E}{\mbfsansvarrho }{\mathalpha}{mathematical sans-serif bold rho symbol}%
+\UnicodeMathSymbol{"1D78F}{\mbfsansvarpi }{\mathalpha}{mathematical sans-serif bold pi symbol}%
+\UnicodeMathSymbol{"1D790}{\mbfitsansAlpha }{\mathalpha}{mathematical sans-serif bold italic capital alpha}%
+\UnicodeMathSymbol{"1D791}{\mbfitsansBeta }{\mathalpha}{mathematical sans-serif bold italic capital beta}%
+\UnicodeMathSymbol{"1D792}{\mbfitsansGamma }{\mathalpha}{mathematical sans-serif bold italic capital gamma}%
+\UnicodeMathSymbol{"1D793}{\mbfitsansDelta }{\mathalpha}{mathematical sans-serif bold italic capital delta}%
+\UnicodeMathSymbol{"1D794}{\mbfitsansEpsilon }{\mathalpha}{mathematical sans-serif bold italic capital epsilon}%
+\UnicodeMathSymbol{"1D795}{\mbfitsansZeta }{\mathalpha}{mathematical sans-serif bold italic capital zeta}%
+\UnicodeMathSymbol{"1D796}{\mbfitsansEta }{\mathalpha}{mathematical sans-serif bold italic capital eta}%
+\UnicodeMathSymbol{"1D797}{\mbfitsansTheta }{\mathalpha}{mathematical sans-serif bold italic capital theta}%
+\UnicodeMathSymbol{"1D798}{\mbfitsansIota }{\mathalpha}{mathematical sans-serif bold italic capital iota}%
+\UnicodeMathSymbol{"1D799}{\mbfitsansKappa }{\mathalpha}{mathematical sans-serif bold italic capital kappa}%
+\UnicodeMathSymbol{"1D79A}{\mbfitsansLambda }{\mathalpha}{mathematical sans-serif bold italic capital lambda}%
+\UnicodeMathSymbol{"1D79B}{\mbfitsansMu }{\mathalpha}{mathematical sans-serif bold italic capital mu}%
+\UnicodeMathSymbol{"1D79C}{\mbfitsansNu }{\mathalpha}{mathematical sans-serif bold italic capital nu}%
+\UnicodeMathSymbol{"1D79D}{\mbfitsansXi }{\mathalpha}{mathematical sans-serif bold italic capital xi}%
+\UnicodeMathSymbol{"1D79E}{\mbfitsansOmicron }{\mathalpha}{mathematical sans-serif bold italic capital omicron}%
+\UnicodeMathSymbol{"1D79F}{\mbfitsansPi }{\mathalpha}{mathematical sans-serif bold italic capital pi}%
+\UnicodeMathSymbol{"1D7A0}{\mbfitsansRho }{\mathalpha}{mathematical sans-serif bold italic capital rho}%
+\UnicodeMathSymbol{"1D7A1}{\mbfitsansvarTheta }{\mathalpha}{mathematical sans-serif bold italic capital theta symbol}%
+\UnicodeMathSymbol{"1D7A2}{\mbfitsansSigma }{\mathalpha}{mathematical sans-serif bold italic capital sigma}%
+\UnicodeMathSymbol{"1D7A3}{\mbfitsansTau }{\mathalpha}{mathematical sans-serif bold italic capital tau}%
+\UnicodeMathSymbol{"1D7A4}{\mbfitsansUpsilon }{\mathalpha}{mathematical sans-serif bold italic capital upsilon}%
+\UnicodeMathSymbol{"1D7A5}{\mbfitsansPhi }{\mathalpha}{mathematical sans-serif bold italic capital phi}%
+\UnicodeMathSymbol{"1D7A6}{\mbfitsansChi }{\mathalpha}{mathematical sans-serif bold italic capital chi}%
+\UnicodeMathSymbol{"1D7A7}{\mbfitsansPsi }{\mathalpha}{mathematical sans-serif bold italic capital psi}%
+\UnicodeMathSymbol{"1D7A8}{\mbfitsansOmega }{\mathalpha}{mathematical sans-serif bold italic capital omega}%
+\UnicodeMathSymbol{"1D7A9}{\mbfitsansnabla }{\mathalpha}{mathematical sans-serif bold italic nabla}%
+\UnicodeMathSymbol{"1D7AA}{\mbfitsansalpha }{\mathalpha}{mathematical sans-serif bold italic small alpha}%
+\UnicodeMathSymbol{"1D7AB}{\mbfitsansbeta }{\mathalpha}{mathematical sans-serif bold italic small beta}%
+\UnicodeMathSymbol{"1D7AC}{\mbfitsansgamma }{\mathalpha}{mathematical sans-serif bold italic small gamma}%
+\UnicodeMathSymbol{"1D7AD}{\mbfitsansdelta }{\mathalpha}{mathematical sans-serif bold italic small delta}%
+\UnicodeMathSymbol{"1D7AE}{\mbfitsansvarepsilon }{\mathalpha}{mathematical sans-serif bold italic small varepsilon}%
+\UnicodeMathSymbol{"1D7AF}{\mbfitsanszeta }{\mathalpha}{mathematical sans-serif bold italic small zeta}%
+\UnicodeMathSymbol{"1D7B0}{\mbfitsanseta }{\mathalpha}{mathematical sans-serif bold italic small eta}%
+\UnicodeMathSymbol{"1D7B1}{\mbfitsanstheta }{\mathalpha}{mathematical sans-serif bold italic small theta}%
+\UnicodeMathSymbol{"1D7B2}{\mbfitsansiota }{\mathalpha}{mathematical sans-serif bold italic small iota}%
+\UnicodeMathSymbol{"1D7B3}{\mbfitsanskappa }{\mathalpha}{mathematical sans-serif bold italic small kappa}%
+\UnicodeMathSymbol{"1D7B4}{\mbfitsanslambda }{\mathalpha}{mathematical sans-serif bold italic small lambda}%
+\UnicodeMathSymbol{"1D7B5}{\mbfitsansmu }{\mathalpha}{mathematical sans-serif bold italic small mu}%
+\UnicodeMathSymbol{"1D7B6}{\mbfitsansnu }{\mathalpha}{mathematical sans-serif bold italic small nu}%
+\UnicodeMathSymbol{"1D7B7}{\mbfitsansxi }{\mathalpha}{mathematical sans-serif bold italic small xi}%
+\UnicodeMathSymbol{"1D7B8}{\mbfitsansomicron }{\mathalpha}{mathematical sans-serif bold italic small omicron}%
+\UnicodeMathSymbol{"1D7B9}{\mbfitsanspi }{\mathalpha}{mathematical sans-serif bold italic small pi}%
+\UnicodeMathSymbol{"1D7BA}{\mbfitsansrho }{\mathalpha}{mathematical sans-serif bold italic small rho}%
+\UnicodeMathSymbol{"1D7BB}{\mbfitsansvarsigma }{\mathalpha}{mathematical sans-serif bold italic small final sigma}%
+\UnicodeMathSymbol{"1D7BC}{\mbfitsanssigma }{\mathalpha}{mathematical sans-serif bold italic small sigma}%
+\UnicodeMathSymbol{"1D7BD}{\mbfitsanstau }{\mathalpha}{mathematical sans-serif bold italic small tau}%
+\UnicodeMathSymbol{"1D7BE}{\mbfitsansupsilon }{\mathalpha}{mathematical sans-serif bold italic small upsilon}%
+\UnicodeMathSymbol{"1D7BF}{\mbfitsansvarphi }{\mathalpha}{mathematical sans-serif bold italic small phi}%
+\UnicodeMathSymbol{"1D7C0}{\mbfitsanschi }{\mathalpha}{mathematical sans-serif bold italic small chi}%
+\UnicodeMathSymbol{"1D7C1}{\mbfitsanspsi }{\mathalpha}{mathematical sans-serif bold italic small psi}%
+\UnicodeMathSymbol{"1D7C2}{\mbfitsansomega }{\mathalpha}{mathematical sans-serif bold italic small omega}%
+\UnicodeMathSymbol{"1D7C3}{\mbfitsanspartial }{\mathalpha}{mathematical sans-serif bold italic partial differential}%
+\UnicodeMathSymbol{"1D7C4}{\mbfitsansepsilon }{\mathalpha}{mathematical sans-serif bold italic varepsilon symbol}%
+\UnicodeMathSymbol{"1D7C5}{\mbfitsansvartheta }{\mathalpha}{mathematical sans-serif bold italic theta symbol}%
+\UnicodeMathSymbol{"1D7C6}{\mbfitsansvarkappa }{\mathalpha}{mathematical sans-serif bold italic kappa symbol}%
+\UnicodeMathSymbol{"1D7C7}{\mbfitsansphi }{\mathalpha}{mathematical sans-serif bold italic phi symbol}%
+\UnicodeMathSymbol{"1D7C8}{\mbfitsansvarrho }{\mathalpha}{mathematical sans-serif bold italic rho symbol}%
+\UnicodeMathSymbol{"1D7C9}{\mbfitsansvarpi }{\mathalpha}{mathematical sans-serif bold italic pi symbol}%
+\UnicodeMathSymbol{"1D7CA}{\mbfDigamma }{\mathalpha}{mathematical bold capital digamma}%
+\UnicodeMathSymbol{"1D7CB}{\mbfdigamma }{\mathalpha}{mathematical bold small digamma}%
+\UnicodeMathSymbol{"1D7CE}{\mbfzero }{\mathord}{mathematical bold digit 0}%
+\UnicodeMathSymbol{"1D7CF}{\mbfone }{\mathord}{mathematical bold digit 1}%
+\UnicodeMathSymbol{"1D7D0}{\mbftwo }{\mathord}{mathematical bold digit 2}%
+\UnicodeMathSymbol{"1D7D1}{\mbfthree }{\mathord}{mathematical bold digit 3}%
+\UnicodeMathSymbol{"1D7D2}{\mbffour }{\mathord}{mathematical bold digit 4}%
+\UnicodeMathSymbol{"1D7D3}{\mbffive }{\mathord}{mathematical bold digit 5}%
+\UnicodeMathSymbol{"1D7D4}{\mbfsix }{\mathord}{mathematical bold digit 6}%
+\UnicodeMathSymbol{"1D7D5}{\mbfseven }{\mathord}{mathematical bold digit 7}%
+\UnicodeMathSymbol{"1D7D6}{\mbfeight }{\mathord}{mathematical bold digit 8}%
+\UnicodeMathSymbol{"1D7D7}{\mbfnine }{\mathord}{mathematical bold digit 9}%
+\UnicodeMathSymbol{"1D7D8}{\Bbbzero }{\mathord}{mathematical double-struck digit 0}%
+\UnicodeMathSymbol{"1D7D9}{\Bbbone }{\mathord}{mathematical double-struck digit 1}%
+\UnicodeMathSymbol{"1D7DA}{\Bbbtwo }{\mathord}{mathematical double-struck digit 2}%
+\UnicodeMathSymbol{"1D7DB}{\Bbbthree }{\mathord}{mathematical double-struck digit 3}%
+\UnicodeMathSymbol{"1D7DC}{\Bbbfour }{\mathord}{mathematical double-struck digit 4}%
+\UnicodeMathSymbol{"1D7DD}{\Bbbfive }{\mathord}{mathematical double-struck digit 5}%
+\UnicodeMathSymbol{"1D7DE}{\Bbbsix }{\mathord}{mathematical double-struck digit 6}%
+\UnicodeMathSymbol{"1D7DF}{\Bbbseven }{\mathord}{mathematical double-struck digit 7}%
+\UnicodeMathSymbol{"1D7E0}{\Bbbeight }{\mathord}{mathematical double-struck digit 8}%
+\UnicodeMathSymbol{"1D7E1}{\Bbbnine }{\mathord}{mathematical double-struck digit 9}%
+\UnicodeMathSymbol{"1D7E2}{\msanszero }{\mathord}{mathematical sans-serif digit 0}%
+\UnicodeMathSymbol{"1D7E3}{\msansone }{\mathord}{mathematical sans-serif digit 1}%
+\UnicodeMathSymbol{"1D7E4}{\msanstwo }{\mathord}{mathematical sans-serif digit 2}%
+\UnicodeMathSymbol{"1D7E5}{\msansthree }{\mathord}{mathematical sans-serif digit 3}%
+\UnicodeMathSymbol{"1D7E6}{\msansfour }{\mathord}{mathematical sans-serif digit 4}%
+\UnicodeMathSymbol{"1D7E7}{\msansfive }{\mathord}{mathematical sans-serif digit 5}%
+\UnicodeMathSymbol{"1D7E8}{\msanssix }{\mathord}{mathematical sans-serif digit 6}%
+\UnicodeMathSymbol{"1D7E9}{\msansseven }{\mathord}{mathematical sans-serif digit 7}%
+\UnicodeMathSymbol{"1D7EA}{\msanseight }{\mathord}{mathematical sans-serif digit 8}%
+\UnicodeMathSymbol{"1D7EB}{\msansnine }{\mathord}{mathematical sans-serif digit 9}%
+\UnicodeMathSymbol{"1D7EC}{\mbfsanszero }{\mathord}{mathematical sans-serif bold digit 0}%
+\UnicodeMathSymbol{"1D7ED}{\mbfsansone }{\mathord}{mathematical sans-serif bold digit 1}%
+\UnicodeMathSymbol{"1D7EE}{\mbfsanstwo }{\mathord}{mathematical sans-serif bold digit 2}%
+\UnicodeMathSymbol{"1D7EF}{\mbfsansthree }{\mathord}{mathematical sans-serif bold digit 3}%
+\UnicodeMathSymbol{"1D7F0}{\mbfsansfour }{\mathord}{mathematical sans-serif bold digit 4}%
+\UnicodeMathSymbol{"1D7F1}{\mbfsansfive }{\mathord}{mathematical sans-serif bold digit 5}%
+\UnicodeMathSymbol{"1D7F2}{\mbfsanssix }{\mathord}{mathematical sans-serif bold digit 6}%
+\UnicodeMathSymbol{"1D7F3}{\mbfsansseven }{\mathord}{mathematical sans-serif bold digit 7}%
+\UnicodeMathSymbol{"1D7F4}{\mbfsanseight }{\mathord}{mathematical sans-serif bold digit 8}%
+\UnicodeMathSymbol{"1D7F5}{\mbfsansnine }{\mathord}{mathematical sans-serif bold digit 9}%
+\UnicodeMathSymbol{"1D7F6}{\mttzero }{\mathord}{mathematical monospace digit 0}%
+\UnicodeMathSymbol{"1D7F7}{\mttone }{\mathord}{mathematical monospace digit 1}%
+\UnicodeMathSymbol{"1D7F8}{\mtttwo }{\mathord}{mathematical monospace digit 2}%
+\UnicodeMathSymbol{"1D7F9}{\mttthree }{\mathord}{mathematical monospace digit 3}%
+\UnicodeMathSymbol{"1D7FA}{\mttfour }{\mathord}{mathematical monospace digit 4}%
+\UnicodeMathSymbol{"1D7FB}{\mttfive }{\mathord}{mathematical monospace digit 5}%
+\UnicodeMathSymbol{"1D7FC}{\mttsix }{\mathord}{mathematical monospace digit 6}%
+\UnicodeMathSymbol{"1D7FD}{\mttseven }{\mathord}{mathematical monospace digit 7}%
+\UnicodeMathSymbol{"1D7FE}{\mtteight }{\mathord}{mathematical monospace digit 8}%
+\UnicodeMathSymbol{"1D7FF}{\mttnine }{\mathord}{mathematical monospace digit 9}%
+\UnicodeMathSymbol{"1EEF0}{\arabicmaj }{\mathop}{arabic mathematical operator meem with hah with tatweel}%
+\UnicodeMathSymbol{"1EEF1}{\arabichad }{\mathop}{arabic mathematical operator hah with dal}%
+
+% /©
+%
+% ------------------------------------------------
+% The UNICODE-MATH package <wspr.io/unicode-math>
+% ------------------------------------------------
+% This package is free software and may be redistributed and/or modified under
+% the conditions of the LaTeX Project Public License, version 1.3c or higher
+% (your choice): <http://www.latex-project.org/lppl/>.
+% ------------------------------------------------
+% Copyright 2006-2019 Will Robertson, LPPL "maintainer"
+% Copyright 2010-2017 Philipp Stephani
+% Copyright 2011-2017 Joseph Wright
+% Copyright 2012-2015 Khaled Hosny
+% ------------------------------------------------
+%
+% ©/
+
diff --git a/macros/optex/base/usebib.opm b/macros/optex/base/usebib.opm
new file mode 100644
index 0000000000..f37d21b315
--- /dev/null
+++ b/macros/optex/base/usebib.opm
@@ -0,0 +1,398 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \MakeReference {Reading bib databases <2021-03-12>} % loaded on demand by \usebib
+
+ \_doc -----------------------------
+ Loading the `librarian.tex` macro package. See `texdoc librarian`
+ for more information about it.
+
+ We want to ignore `\errmessage` and we want not to create `\jobname.lbr`
+ file.
+ \_cod -----------------------------
+
+\_def\errmessage#1{}
+\_def\newwrite#1{\_csname lb@restoreat\_endcsname \_endinput}
+\_def\_tmpb{\_catcode`\_=12 \_input librarian \_catcode`\_=11 }\_tmpb
+\_let\errmessage=\_errmessage
+\_let\newwrite=\_newwrite
+
+\_private \BibFile \ReadList \SortList \SortingOrder \NameCount \AbbreviateFirstname
+ \CreateField \RetrieveFieldInFor \RetrieveFieldIn ;
+
+ \_doc -----------------------------
+ The `\usebib` command.
+ \_cod -----------------------------
+
+\_def\_usebib/#1 (#2) #3 {%
+ \_let\_citeI=\_relax \_xdef\_citelist{\_citelist\_citelistB}%
+ \_global\_let\_addcitelist=\_writeXcite
+ \_ifx\_citelist\_empty
+ \_opwarning{No cited items. \_noexpand\usebib ignored}%
+ \_else
+ \_bgroup \_par
+ \_emergencystretch=.3\_hsize
+ \_ifx\_bibpart\_undefined \_def\_bibpart{none}\_fi
+ \_def\_optexbibstyle{#2}%
+ \_setctable\_optexcatcodes
+ \_ea \_skiptoendinput \_input languages.opm
+ \_input bib-#2.opm
+ \_the \_bibtexhook
+ \_ifcsname _mt:bib.and:\_cs{_lan:\_the\_language}\_endcsname \_else
+ \_opwarning{\_string\usebib: No phrases for language
+ "\_cs{_lan:\_the\_language}" (using "en")}%
+ \_language=0 \_chardef\_documentlanguage=0
+ \_fi
+ \_def\_tmp##1[*]##2\_relax{\_def\_tmp{##2}}\_ea\_tmp\_citelist[*]\_relax
+ \_ifx\_tmp\_empty\_else % there was \nocite[*] used.
+ \_setbox0=\_vbox{\_hsize=\_maxdimen \_def\_citelist{}\_adef@{\_readbibentry}%
+ \_input #3.bib
+ \_ea}\_ea\_def\_ea\_citelist\_ea{\_citelist}%
+ \_fi
+ \_def\_citeI[##1]{\_csname lb@cite\_endcsname{##1}{\_bibpart}{}{}}\_citelist
+ \_BibFile{#3}%
+ \_if s#1\_SortList{\_bibpart}\_fi
+ \_ReadList{\_bibpart}%
+ \_restorectable
+ \_egroup
+ \_fi
+}
+\_long\_def\_skiptoendinput#1\_endinput{}
+\_def\_readbibentry#1#{\_readbibentryA}
+\_def\_readbibentryA#1{\_readbibentryB#1,,\_relax!.}
+\_def\_readbibentryB#1#2,#3\_relax!.{\_addto\_citelist{\_citeI[#1#2]}}
+
+ \_doc -----------------------------
+ Corrections in librarian macros.
+ \_cod -----------------------------
+
+\_tmpnum=\_catcode`\@ \_catcode`\@=11
+\_def\lb@checkmissingentries#1,{% we needn't \errmessage here, only \opmacwarning
+ \_def\lb@temp{#1}%
+ \_unless\_ifx\lb@temp\lb@eoe
+ \lb@ifcs{#1}{fields}%
+ {}%
+ {\_opwarning{\_string\usebib: entry [#1] isn't found in .bib}}%
+ \_ea\lb@checkmissingentries
+ \_fi
+}
+\_def\lb@readentry#1#2#3,{% space before key have to be ingnored
+ \_def\lb@temp{#2#3}% we need case sensitive keys
+ \_def\lb@next{\_ea\lb@gotoat\lb@gobbletoeoe}%
+ \lb@ifcs\lb@temp{requested}%
+ {\_let\lb@entrykey\lb@temp
+ \lb@ifcs\lb@entrykey{fields}{}%
+ {\lb@defcs\lb@entrykey{fields}{}%
+ \_lowercase{\lb@addfield{entrytype}{#1}}%
+ \_let\lb@next\lb@analyzeentry}}{}%
+ \lb@next
+}
+\_let\lb@compareA=\lb@compare
+\_let\lb@preparesortA=\lb@preparesort
+\_def\lb@compare#1\lb@eoe#2\lb@eoe{% SpecialSort:
+ \_ifx\lb@sorttype\lb@namestring
+ \_ifx\_sortfield\_undefined \lb@compareA#1\lb@eoe#2\lb@eoe
+ \_else
+ \_ea\_RetrieveFieldInFor\_ea{\_sortfield}\lb@entrykey\lb@temp
+ \_ifx\lb@temp\_empty \_toks1={#1\lb@eoe}\_else \_toks1=\_ea{\lb@temp\lb@eoe}\_fi
+ \_ea\_RetrieveFieldInFor\_ea{\_sortfield}\lb@currententry\lb@temp
+ \_ifx\lb@temp\_empty \_toks2={#2\lb@eoe}\_else \_toks2=\_ea{\lb@temp\lb@eoe}\_fi
+ \_edef\lb@temp{\_noexpand\lb@compareA\_space\_the\_toks1 \_space\_the\_toks2}\lb@temp
+ \_fi
+ \_else \lb@compareA#1\lb@eoe#2\lb@eoe \_fi
+}
+\_def\lb@preparesort#1#2\lb@eoe{%
+ \_if#1-%
+ \_def\lb@sorttype{#2}%
+ \_else
+ \_def\lb@sorttype{#1#2}%
+ \_fi
+ \lb@preparesortA#1#2\lb@eoe
+}
+\_def\_SpecialSort#1{\_def\_sortfield{#1}}
+\_def\WriteImmediateInfo#1{} % the existence of .lbr file bocks new reading of .bib
+\_catcode`\@=\_tmpnum
+
+ \_doc -----------------------------
+ Main action per each entry.
+ \_cod -----------------------------
+
+\_def\MakeReference{\_par \_bibskip
+ \_advance\_bibnum by1
+ \_isdefined{_bim:\_the\_bibnum}\_iftrue
+ \_edef\_tmpb{\_csname _bim:\_the\_bibnum\_endcsname}%
+ \_bibmark=\_ea{\_tmpb}%
+ \_else \_bibmark={}\_fi
+ \_edef\_tmpb{\EntryKey}%
+ \_noindent \_dest[cite:\_the\_bibnum]\_printlabel\EntryKey
+ \_printbib
+ {%
+ \_RetrieveFieldIn{entrytype}\_entrytype
+ \_csname _print:BEGIN\_endcsname
+ \_isdefined{_print:\_entrytype}\_iftrue
+ \_csname _print:\_entrytype\_endcsname
+ \_else
+ \_ifx\_entrytype\_empty \_else
+ \_opwarning{Entrytype @\_entrytype\_space from [\EntryKey] undefined}%
+ \_csname _print:misc\_endcsname
+ \_fi\_fi
+ \_csname _print:END\_endcsname
+ \_ifx\_wref\_wrefrelax\_else
+ \_immediate\_wref\_Xbib{{\EntryKey}{\_the\_bibnum}{\_the\_bibmark}}\_fi
+ }\_par
+}
+
+ \_doc -----------------------------
+ The \`\_bprinta`, \`\_bprintb`, \`\_bprintc`, \`\_bprintv`
+ commands used in the style files:
+ \_cod -----------------------------
+
+\_def\_bprinta {\_bprintb*}
+\_def\_bprintb #1[#2#3]{%
+ \_def\_bibfieldname{#2#3}%
+ \_if!#2\_relax
+ \_def\_bibfieldname{#3}%
+ \_RetrieveFieldIn{#3}\_bibfield
+ \_ifx\_bibfield\_empty\_else
+ \_RetrieveFieldIn{#3number}\_namecount
+ \_def\_bibfield{\_csname _Read#3\_ea\_endcsname \_csname _pp:#3\_endcsname}%
+ \_fi
+ \_else
+ \_RetrieveFieldIn{#2#3}\_bibfield
+ \_fi
+ \_if^#1^%
+ \_ifx\_bibfield\_empty \_ea\_ea\_ea \_doemptyfield
+ \_else \_ea\_ea\_ea \_dofullfield \_fi
+ \_else \_ea \_bprintaA
+ \_fi
+}
+\_def\_dofullfield#1#2{\_def\_dofield##1{#1}\_ea\_dofield\_ea{\_bibfield}}
+\_def\_doemptyfield#1#2{\_def\_dofield##1{#2}\_ea\_dofield\_ea{\_bibfield}}
+\_let\_Readauthor=\ReadAuthor \_let\_Readeditor=\ReadEditor
+\_def\_bprintaA #1#2{\_ifx\_bibfield\_empty #2\_else\_bprintaB #1**\_eee\_fi}
+\_def\_bprintaB #1*#2*#3\_eee{\_if^#3^#1\_else\_ea\_bprintaC\_ea{\_bibfield}{#1}{#2}\_fi}
+\_def\_bprintaC #1#2#3{#2#1#3}
+\_def\_bprintc#1#2{\_bprintcA#1#2**\_relax}
+\_def\_bprintcA#1#2*#3*#4\_relax{\_ifx#1\_empty \_else \_if^#4^#2\_else#2#1#3\_fi\_fi}
+\_def\_bprintv [#1]#2#3{\_def\_tmpa{#2}\_def\_tmpb{#3}\_bprintvA #1,,}
+\_def\_bprintvA #1,{%
+ \_if^#1^\_tmpb\_else
+ \_RetrieveFieldIn{#1}\_tmp
+ \_ifx \_tmp\_empty
+ \_else \_tmpa \_def\_tmpb{}\_def\_tmpa{}%
+ \_fi
+ \_ea \_bprintvA
+ \_fi
+}
+\_sdef{_pp:author}{\_letNames\_authorname}
+\_sdef{_pp:editor}{\_letNames\_editorname}
+\_def\_letNames{\_let\_Firstname=\Firstname \_let\_Lastname=\Lastname
+ \_let\_Von=\Von \_let\_Junior=\Junior
+}
+
+ \_doc -----------------------------
+ Various macros + multilingual. Note that \`\_nobibwarnlist` is used in
+ \`\_bibwarning` and it is set by \^`\nobibwarning` macro.
+ \_cod -----------------------------
+
+\_def\_bibwarning{%
+ \_ea\_isinlist \_ea\_nobibwarnlist\_ea{\_ea,\EntryKey,}\_iffalse
+ \_opwarning{Missing field "\_bibfieldname" in [\EntryKey]}\_fi}
+
+\_endcode
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The file `usebib.opm` implements the command
+\~`\usebib/<sorttype> (<style>) <bibfiles>`
+where `<sorttype>` is one letter `c` (references ordered by citation order in
+the text) or `s` (references ordered by key in the style file),
+`<style>` is the part of the name `bib-<style>.opm` of the style file
+and `<bibfiles>` are one or more `.bib` file names without suffix separated by
+comma without space. Example:
+
+\begtt
+\usebib/s (simple) mybase,yourbase
+\endtt
+
+This command reads the `<bibfiles>` directly and creates the list of
+bibliographic references (only those declared by \~`\cite[]` or
+\~`\nocite[]` in the text). The formatting of such references is defined in the style
+file.
+
+The principle \"first entry wins" is used. Suppose `\usebib/s (simple) local,global`.
+If an entry with the same label is declared in `local.bib` and in
+`global.bib` too then the first wins. So, you can set exceptions in your
+`local.bib` file for your document.
+
+The `bib-<style>.opm` declares entry types (like `@BOOK`, `@ARTICLE`) and declares
+their mandatory and optional fields (like `author`, `title`). When
+a mandatory field is missing in an entry in the `.bib` file then a warning is printed on the
+terminal about it. You can suppress such warnings by command
+\^`\nobibwarning`~`[<bib-labels>]`, where <bib-labels> is a comma-separated list
+of labels (without spaces) where missing mandatory fields will be no warned.
+
+Old `.bib` files may use the obscure notation for accents like `{\"o}`.
+Recommendation: convert such old files to Unicode encoding. If you are
+unable to do this then you can set \^`\bibtexhook={`\^`\oldaccents}`.
+
+\secc Notes for bib-style writers
+
+The `.bib` files include records in the format:
+
+\begtt \catcode`\<=13
+@<entry-type>{<label>,
+ <field-name> = "<field-data>",
+ <field-name> = "<field-data>",
+ ...etc
+}
+\endtt
+%
+see the file `demo/op-biblist.bib` for a real example. The <entry-types> and
+<field-names> are case insensitive.
+
+Ancient Bib\TeX/ has read such files and has generated files appropriate for
+reading by \LaTeX. It has worked with a set of <entry-types>, see the www
+page \url{http://en.wikipedia.org/wiki/BibTeX}. The set of entry types
+listed on this www page is de facto the Bib\TeX/ standard. The \OpTeX/ bib
+style writer must \"declare" all such entry types and more non-standard
+entry types can be declared too if there is a good reason for doing it. The
+word \"declare" used in the previous sentence means that a bib-style writer must
+define the printing rules for each <entry-type>.
+The printing rules for <entry-type> include: which fields will be printed, in
+what order, by what format they will be printed on (italic, caps, etc.),
+which fields are mandatory, which are optional, and which are ignored in
+`.bib` records.
+
+The style writer can be inspired by two styles already done: `bib-simple.opm`
+and `bib-iso690.opm`. The second one is documented in detail in
+section~\ref[isobib].
+
+The printing rules for each <entry-type> must be declared by
+`\_sdef{_print:<entry-type>}` in `bib-<style>.opm` file.
+The `<entry-type>` has to be lowercase here. \OpTeX/ supports following
+macros for a more comfortable setting of printing rules:
+
+\begitems
+* \^`\_bprinta` `[<field-name>] {<if defined>} {<if not defined>}`. The part <if defined>
+ is executed if <field-name> is declared in .bib file for the entry which is
+ currently processed. Else the part <if not defined> is processed.
+ The part <if defined> can include the `*` parameter which is replaced
+ by the value of the <field-name>.
+* The part <if not defined> can include
+ the \^`\_bibwarning` command if the <field-name> is mandatory.
+* \^`\_bprintb` `[<field-name>] {<if defined>} {<if not defined>}`. The same as
+ `\_bprinta`, but the `##1` parameter is used instead `*`. Differences: `##1`
+ parameter can be used more than once and can be enclosed in nested
+ braces. The `*` parameter can be used at most once and cannot be enclosed
+ in braces. Warning: if the `\_bprintb` commands are nested (`\_bprintb` in
+ `\_bprintb`), then you need to write the `####1` parameter for internal `\_bprintb`.
+ But if `\_bprinta` commands are nested then the parameter is not duplicated.
+* \^`\_bprintc` `\macro {<if non-empty>}`. The <if non-empty> part is executed if
+ `\macro` is non-empty. The `*` parameter can be used, it is replaced by
+ the `\macro`.
+* \^`\_bprintv` `[<field1>,<field2>,...] {<if defined>} {<if not defined>}`.
+ The part <if defined> is executed if <field1> or <filed2> or ...
+ is defined, else the second part <if not defined> is executed.
+ There is one filed name or the list field names separated by commas.
+ The parts cannot include any parameters.
+\enditems
+
+There are two special field-names: `!author` and `!editor`. The processed list of
+authors or editors are printed here instead of raw data, see the commands
+\~`\_authorname` and \~`\_editorname` below.
+
+The bib-style writer can define `_print:BEGIN` and/or `_print:END`.
+They are executed at the beginning or
+end of each `<entry-type>`. The formatting does not solve the numbering and
+paragraph indentation of the entry. This is processed by \^`\_printbib` macro
+used in \OpTeX/ (and may be redefined by the author or document designer).
+
+The \^`\bibmark={something}` can be declared, for instance in the `_print:END` macro.
+Such \"bibmark" is saved to the `.ref` file and used in next \TeX/ run as
+`\cite` marks when `\nonumcitations` is set.
+
+Moreover, the bib-style writer must declare the format of
+special fields `author` and `editor`. These fields include a
+list of names, each name is precessed individually in a loop. The
+\^`\_authorname` or \^`\_editorname` is called for each name on the list.
+The bib-style writer must define
+the \`\_authorname` and \`\_editorname` commands
+in order to declare the format of printing each individual name.
+The following control sequences can be used in these macros:
+
+\begitems
+* `\_NameCount`: the number of the currently processed author in the list
+* `\_namecont`: the total number of the authors in the list
+* `\_Lastname`, `\_Firstname`, `\_Von`, `\_Junior`: the parts of the name.
+\enditems
+
+The whole style file is read in the group during the `\usebib` command is executed
+before typesetting the reference list. Each definition or setting is local
+here.
+
+The auto-generated phrases (dependent on current language) can be used in
+bib-style files by `\_mtext{bib.<identifier>}`, where <ident> is an identifier of
+the phrase and the phrase itself is defined by
+`\_sdef{_mt:bib.<identifier>:<language>}{<phrase>}`. See section~\ref[langphrases]
+for more detail. Phrases for <identifiers>:
+and, etal, edition, citedate, volume, number, prepages, postpages, editor,
+editors, available, availablealso, bachthesis, masthesis, phdthesis
+are defined already, see the end of section~\ref[langphrases].
+
+If you are using non-standard field-names in .bib database and bib-style,
+you have to declare them by `\_CreateField {<fieldname>}`.
+
+You can declare `\_SortingOrder` in the manner documented by librarian package.
+
+User or author of the bib-style can create the hidden field which has a
+precedence while sorting names. Example:
+
+\begtt
+\CreateField {sortedby}
+\SpecialSort {sortedby}
+\endtt
+Suppose that the .bib file includes:
+\begtt
+...
+author = "Jan Chadima",
+sortedby = "Hzzadima Jan",
+...
+\endtt
+Now, this author is sorted between H and I, because the Ch digraph in this
+name has to be sorted by this rule.
+
+If you need (for example) to place the auto-citations before other citations,
+then you can mark your entries in `.bib` file by `sortedby = "@"`, because this
+character is sorted before `A`.
+
+\_endinput
+
+History:
+--------
+
+2021-03-12 \_citelistB added before first test.
+2021-02-15 \_expandafter -> \_ea
+Apr. 2014: released in OPmac
+Jan. 2016: "first entry wins" implemented
+Apr. 2016: \readentry -> \readbibentry, \usebib->\MakeReference
+Feb. 2018: \input librarian does not create \jobname.lbr
+
+% Source:
+
+% opmac-bib
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Petr Olsak, version Feb. 2018 (beta)
+
+% This is module for OPmac macros, see http://petr.olsak.net/opmac.html
+% The command:
+% \usebib/<sorttype> (<style>) (bibfiles>
+% for direct reading .bib files by OPmac macros (without bibTeX) is implemented here.
+% The implementation depends on librarian.tex package by Paul Isambert.
+% Use:
+% \input opmac \input opmac-bib
+% or simply:
+% \input opmac-bib
+% before using the command \usebib.
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% end
+
diff --git a/macros/optex/base/verbatim.opm b/macros/optex/base/verbatim.opm
new file mode 100644
index 0000000000..8fd20ee531
--- /dev/null
+++ b/macros/optex/base/verbatim.opm
@@ -0,0 +1,372 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \begtt {Verbatim <2021-01-22>} % preloaded in format
+
+ \_doc ----------------------------
+ The internal parameters
+ \`\_ttskip`, \`\_ttpenalty`, \`\_viline`, \`\_vifile` and \`\_ttfont`
+ for verbatim macros are set.
+ \_cod ----------------------------
+
+\_def\_ttskip{\_medskip} % space above and below \begtt, \verbinput
+\_mathchardef\_ttpenalty=100 % penalty between lines in \begtt, \verbinput
+\_newcount\_viline % last line number in \verbinput
+\_newread\_vifile % file given by \verinput
+\_def\_ttfont{\_tt} % default tt font
+
+ \_doc ----------------------------
+ \`\code``{<text>}` expands to `\detokenize{<text>}` when `\escapechar=-1`. In
+ order to do it more robust when it is used in `\write` then it expands as
+ noexpanded `\code<space>` (followed by space in its csname). This macro
+ does the real work.
+
+ The \`\_printinverbatim``{<text>}` macro is used for `\code{<text>}` printing and for
+ \code{`}<text>\code{`} printing. It is defined as `\hbox`, so the in-verbatim <text>
+ will be never broken. But you can re-define this macro.
+
+ When `\code` occurs in PDF outlines then it does the same as `\detokenize`.
+ The macro for preparing outlines sets `\escapechar` to $-1$ and uses
+ \^`\_regoul` token list before `\edef`.
+
+ The `\code` is not `\proteced` because we want it expands to
+ `\unexpanded{\code<space>{<text>}}` in `\write` parameters. This protect the
+ expansions of the `\code` parameter (like `\\`, `\^` etc.).
+ \_cod ----------------------------
+
+\_def\_code#1{\_unexpanded\_ea{\_csname _code \_endcsname{#1}}}
+\_protected\_sdef{_code }#1{{\_escapechar=-1 \_ttfont \_the\_everyintt \_relax
+ \_ea\_printinverbatim\_ea{\_detokenize{#1}}}}
+\_def\_printinverbatim#1{\_leavevmode\_hbox{#1}}
+
+\_regmacro {}{}{\_let\code=\_detokenize \_let\_code=\_detokenize}
+\_public \code ;
+
+ \_doc ----------------------------
+ The \`\_setverb` macro sets all catcodes to \"verbatim mode". It should be used only
+ in a group, so we prepare a new catcode table with \"verbatim" catcodes and we define
+ it as\nl `\_catcodetable`\`\_verbatimcatcodes`. After the group is finished then
+ original catcode table is restored.
+ \_cod ----------------------------
+
+\_newcatcodetable \_verbatimcatcodes
+\_def\_setverb{\_begingroup
+ \_def\do##1{\_catcode`##1=12 }
+ \_dospecials
+ \_savecatcodetable\_verbatimcatcodes % all characters are normal
+ \_endgroup
+}
+\_setverb
+\_def\_setverb{\_catcodetable\_verbatimcatcodes }%
+
+ \_doc ----------------------------
+ \`\verbchar``<char>` saves original catcode of previously declared `<char>` (if
+ such character was declared) using \`\_savedttchar` and \`\_savedttcharc`
+ values. Then new such values are stored. The declared character is activated
+ by `\_adef` as a macro (active character) which opens a group,
+ does `\_setverb` and other settings and reads its parameter until second the same
+ character. This is done by the \`\_readverb` macro. Finally, it prints scanned
+ `<text>` by \^`\_printinverbatim` and closes group. Suppose that `\verbchar"` is
+ used. Then the following work is schematically done:
+ \begtt
+ \_def "{\_begingroup \_setverb ... \_readverb}
+ \_def \_readverb #1"{\_printinverbatim{#1}\_endgroup}
+ \endtt
+ Note that the second occurrence of `"` is not active because `\_setverb`
+ deactivates it.
+ \_cod ----------------------------
+
+\_def\_verbchar#1{%
+ \_ifx\_savedttchar\_undefined\_else \_catcode\_savedttchar=\_savedttcharc \_fi
+ \_chardef\_savedttchar=`#1
+ \_chardef\_savedttcharc=\_catcode`#1
+ \_adef{#1}{\_begingroup \_setverb \_adef{ }{\_dsp}\_ttfont \_the\_everyintt\_relax \_readverb}%
+ \_def\_readverb ##1#1{\_printinverbatim{##1}\_endgroup}%
+}
+\_let \_activettchar=\_verbchar % for backward compatibility
+\_public \verbchar \activettchar ;
+
+ \_doc ----------------------------
+ \`\begtt` is defined only as public. We don't need a private `\_begtt` variant.
+ This macro opens a group and sets `%` as an active character (temporary).
+ This will allow it to be used as the comment character at the same line after
+ `\begtt`. Then \`\_begtti` is run. It is defined by \^`\eoldef`,
+ so users can put a parameter at the
+ same line where `\begtt` is. This `#1` parameter is used after \^`\everytt`
+ parameters settings, so users can change them locally.
+
+ The \^`\_begtti` macro does \^`\_setverb` and another preprocessing, sets
+ `\endlinechar` to `^^J` and reads the following text in verbatim mode
+ until \`\endtt` occurs. This scanning is done by \`\_startverb` macro which is
+ defined as:
+ \begtt \adef/{\bslash}
+ \_def\_startverb #1/endtt #2^^J{...}
+ \endtt
+ We must to ensure that the backslash in `\endtt` has category 12 (this is a
+ reason of the `\ea` chain in real code).
+ The `#2` is something between `\endtt` and the end of the same line and it is simply
+ ignored.
+
+ The `\_startverb` puts the scanned data to \`\_prepareverbdata`. It sets the data
+ to `\_tmpb` without changes by default, but you should re-define it in order
+ to do special changes if you want. (For example, \^`\hisyntax` redefines
+ this macro.) The scanned data have `^^J` at each end of line and all spaces are
+ active characters (defined as {\visiblesp`\ `}).
+ Other characters have normal category 11 or 12.
+
+ When `\_prepareverbdata` finishes then `\_startverb` runs `\_printverb` loop
+ over each line of the data and does a final work: last skip plus `\noindent`
+ in the next paragraph.
+ \_cod ---------------------------
+
+\_def\begtt{\_par \_begingroup \_adef\%##1\_relax{\_relax}\_begtti}
+\_eoldef \_begtti#1{\_wipeepar \_setxhsize
+ \_vskip\_parskip \_ttskip
+ \_setverb
+ \_ifnum\_ttline<0 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi
+ \_adef{ }{\_dsp}\_adef\^^I{\t}\_parindent=\_ttindent \_parskip=0pt
+ \_def\t{\_hskip \_dimexpr\_tabspaces em/2\_relax}%
+ \_the\_everytt \_relax #1\_relax \_ttfont
+ \_def\_testcommentchars##1\_iftrue{\_iffalse}\_let\_hicomments=\_relax
+ \_endlinechar=`^^J
+ \_startverb
+}
+\_ea\_def\_ea\_startverb \_ea#\_ea1\_csstring\\endtt#2^^J{%
+ \_prepareverbdata\_tmpb{#1^^J}%
+ \_ea\_printverb \_tmpb\_end
+ \_par
+ \_endgroup \_ttskip
+ \_isnextchar\_par{}{\_noindent}%
+}
+\_def\_prepareverbdata#1#2{\_def#1{#2}}
+
+ \_doc
+ The \`\_printverb` macro calls \^`\_printverbline``{<line>}` repeatedly
+ to each scanned line of verbatim text. The `\_printverb` is used from
+ `\begtt...\endtt` and from `\verbinput` too.
+
+ The \^`\_testcommentchars` replaces the following `\_iftrue` to
+ `\_iffalse` by default unless the \~`\commentchars` are set. So, the main body
+ of the loop is written in the `\_else` part of the `\_iftrue` condition.
+ The \^`\_printverbline``{<line>}` is called here.
+
+ The \`\_printverbline``{<line>}` expects that it starts in vertical mode and it must
+ do `\par` to return the vertical mode. The \`\_printverblinenum`
+ is used here: it does nothing when `\_ttline`\code{<0} else it prints the line
+ number using `\_llap`.
+
+ \`\_putttpenalty` puts \^`\_ttpenalty` before second and next lines, but
+ not before first line in each `\begtt...\endtt` environment.
+ \_cod ----------------------------
+
+\_def\_printverb #1^^J#2{%
+ \_ifx\_printverblinenum\_relax \_else \_incr\_ttline \_fi
+ \_testcommentchars #1\_relax\_relax\_relax
+ \_iftrue
+ \_ifx\_end#2 \_printcomments\_fi
+ \_else
+ \_ifx\_vcomments\_empty\_else \_printcomments \_def\_vcomments{}\_fi
+ \_ifx\_end#2
+ \_bgroup \_adef{ }{}\_def\t{}% if the last line is emtpy, we don't print it
+ \_ifcat&#1&\_egroup \_else\_egroup \_printverbline{#1}\_fi
+ \_else
+ \_printverbline{#1}%
+ \_fi
+ \_fi
+ \_ifx\_end#2 \_let\_next=\_relax \_else \_def\_next{\_printverb#2}\_fi
+ \_next
+}
+\_def\_printverbline#1{\_putttpenalty \_indent \_printverblinenum \_kern\_ttshift #1\par}
+\_def\_initverblinenum{\_tenrm \_thefontscale[700]\_ea\_let\_ea\_sevenrm\_the\_font}
+\_def\_printverblinenum{\_llap{\_sevenrm \_the\_ttline\_kern.9em}}
+\_def\_putttpenalty{\_def\_putttpenalty{\_penalty\_ttpenalty}}
+
+ \_doc ----------------------------
+ Macro \`\verbinput` uses a file read previously or opens the given file. Then
+ it runs the parameter scanning by \`\_viscanparameter` and \`\_viscanminus`.
+ Finally the \`\_doverbinput` is run. At the beginning of `\_doverbinput`, we have
+ `\_viline`= number of lines already read using previous `\verbinput`,
+ `\_vinolines`= the number of lines we need to skip and `\_vidolnes`= the
+ number of lines we need to print.
+ A similar preparation is done as in `\begtt` after the group is opened. Then
+ we skip \`\_vinolines` lines in a loop a and we read \`\_vidolines` lines. The
+ read data is accumulated into `\_tmpb` macro. The next steps are equal to
+ the steps done in \^`\_startverb` macro: data are processed via
+ \^`\_prepareverbdata` and printed via \^`\_printverb` loop.
+ \_cod \_fin ----------------------
+
+\_def\_verbinput #1(#2) #3 {\_par \_def\_tmpa{#3}%
+ \_def\_tmpb{#1}% cmds used in local group
+ \_ifx\_vifilename\_tmpa \_else
+ \_openin\_vifile={#3}%
+ \_global\_viline=0 \_global\_let\_vifilename=\_tmpa
+ \_ifeof\_vifile
+ \_opwarning{\_string\verbinput: file "#3" unable to read}
+ \_ea\_ea\_ea\_skiptorelax
+ \_fi
+ \_fi
+ \_viscanparameter #2+\_relax
+}
+\_def\_skiptorelax#1\_relax{}
+
+\_def \_viscanparameter #1+#2\_relax{%
+ \_if$#2$\_viscanminus(#1)\_else \_viscanplus(#1+#2)\_fi
+}
+\_def\_viscanplus(#1+#2+){%
+ \_if$#1$\_tmpnum=\_viline
+ \_else \_ifnum#1<0 \_tmpnum=\_viline \_advance\_tmpnum by-#1
+ \_else \_tmpnum=#1
+ \_advance\_tmpnum by-1
+ \_ifnum\_tmpnum<0 \_tmpnum=0 \_fi % (0+13) = (1+13)
+ \_fi \_fi
+ \_edef\_vinolines{\_the\_tmpnum}%
+ \_if$#2$\_def\_vidolines{0}\_else\_edef\_vidolines{#2}\_fi
+ \_doverbinput
+}
+\_def\_viscanminus(#1-#2){%
+ \_if$#1$\_tmpnum=0
+ \_else \_tmpnum=#1 \_advance\_tmpnum by-1 \_fi
+ \_ifnum\_tmpnum<0 \_tmpnum=0 \_fi % (0-13) = (1-13)
+ \_edef\_vinolines{\_the\_tmpnum}%
+ \_if$#2$\_tmpnum=0
+ \_else \_tmpnum=#2 \_advance\_tmpnum by-\_vinolines \_fi
+ \_edef\_vidolines{\_the\_tmpnum}%
+ \_doverbinput
+}
+\_def\_doverbinput{%
+ \_tmpnum=\_vinolines
+ \_advance\_tmpnum by-\_viline
+ \_ifnum\_tmpnum<0
+ \_openin\_vifile={\_vifilename}%
+ \_global\_viline=0
+ \_else
+ \_edef\_vinolines{\_the\_tmpnum}%
+ \_fi
+ \_vskip\_parskip \_ttskip \_wipeepar \_setxhsize
+ \_begingroup
+ \_ifnum\_ttline<-1 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi
+ \_setverb \_adef{ }{\_dsp}\_adef\^^I{\t}\_parindent=\_ttindent \_parskip=0pt
+ \_def\t{\_hskip \_dimexpr\_tabspaces em/2\_relax}%
+ \_the\_everytt\_relax \_tmpb\_relax \_ttfont
+ \_endlinechar=`^^J \_tmpnum=0
+ \_loop \_ifeof\_vifile \_tmpnum=\_vinolines\_space \_fi
+ \_ifnum\_tmpnum<\_vinolines\_space
+ \_vireadline \_advance\_tmpnum by1 \_repeat %% skip lines
+ \_edef\_ttlinesave{\_ttline=\_the\_ttline}%
+ \_ifnum\_ttline=-1 \_ttline=\_viline \_fi
+ \_tmpnum=0 \_def\_tmpb{}%
+ \_ifnum\_vidolines=0 \_tmpnum=-1 \_fi
+ \_ifeof\_vifile \_tmpnum=\_vidolines\_space \_fi
+ \_loop \_ifnum\_tmpnum<\_vidolines\_space
+ \_vireadline
+ \_ifnum\_vidolines=0 \_else\_advance\_tmpnum by1 \_fi
+ \_ifeof\_vifile \_tmpnum=\_vidolines\_space \_else \_visaveline \_fi %% save line
+ \_repeat
+ \_ea\_prepareverbdata \_ea \_tmpb\_ea{\_tmpb^^J}%
+ \_catcode`\ =10 \_catcode`\%=9 % used in \commentchars comments
+ \_ea\_printverb \_tmpb\_end
+ \_global\_ttlinesave
+ \_par
+ \_endgroup
+ \_ttskip
+ \_isnextchar\_par{}{\_noindent}%
+}
+\_def\_vireadline{\_read\_vifile to \_tmp \_incr\_viline }
+\_def\_visaveline{\_ea\_addto\_ea\_tmpb\_ea{\_tmp}}
+
+\_public \verbinput ;
+
+ \_doc -----------------------------
+ If the language of your code\label[commentchars]\wlabel{}
+ printed by \^`\verbinput` supports the
+ format of comments started by two characters from the beginning of the
+ line then you can set these characters by \^`\commentchars``<first><second>`.
+ Such comments are printed in the non-verbatim mode without these two
+ characters and they look like the verbatim printing is interrupted
+ at the places where such comments are.
+ See the section~\ref[lua] for good illustration.
+ The file `optex.lua` is read by a single command
+ `\verbinput (4-) optex.lua` here and the `\commentchars --` was set before it.
+
+ If you need to set a special character by \^`\commentchars` then you must
+ to set the catcode to 12 (and space to 13). Examples:
+ \begtt
+ \commentchars // % C++ comments
+ \commentchars -- % Lua comments
+ {\catcode`\%=12 \_ea}\commentchars %% % TeX comments
+ {\catcode`\#=12 \catcode`\ =13 \_ea}\commentchars#{ } % bash comments
+ \endtt
+
+ There is one limitation when \TeX/ interprets the comments declared by
+ \^`\commentchars`. Each block of comments is accumulated to one line
+ and then it is re-interpreted by \TeX. So, the ends of lines in the
+ comments block are lost. You cannot use macros which
+ need to scan end of lines, for example `\begtt...\endtt` inside the comments
+ block does not work. The character `%` is ignored in comments but you can use `\%`
+ for printing or `%` alone for de-activating `\_endpar` from empty
+ comment lines.
+
+ Implementation: The \`\commentchars``<first><second>` redefines the \`\_testcommentchars`
+ used in \^`\_printverb` in order to it removes the following `\_iftrue`
+ and returns `\_iftrue` or `\_iffalse` depending on the fact that
+ the comment characters are or aren't present at the beginning of tested line.
+ If it is true (`\ifnum` expands to `\ifnum 10>0`) then the rest of the
+ line is added to the \`\_vcomments` macro.
+
+ The \`\_hicomments` is `\relax` by default but it is redefined by \^`\commentchars`
+ in order to keep no-colorized comments if we need to use feature from
+ \^`\commentchars`.
+
+ The accumulated comments are printed whenever the non-comment line
+ occurs. This is done by \`\_printcomments` macro.
+ You can re-define it, but the main idea must be kept: it is printed in the
+ group, `\_reloding \_rm` initializes normal font, `\catcodetable0`
+ returns to normal catcode table used before `\verbinput` is started, and
+ the text accumulated in `\_vcomments` must be printed by
+ `\_scantextokens` primitive.
+ \_cod -----------------------------
+
+\_def\_vcomments{}
+\_let\_hicomments=\_relax
+
+\_def\_commentchars#1#2{%
+ \_def\_testcommentchars ##1##2##3\_relax ##4\_iftrue{\_ifnum % not closed in this macro
+ \_ifx #1##1\_ifx#2##21\_fi\_fi 0>0
+ \_ifx\_relax##3\_relax \_addto\_vcomments{\_endgraf}% empty comment=\enfgraf
+ \_else \_addto\_vcomments{##3 }\_fi}%
+ \_def\_hicomments{\_replfromto{\b\n#1#2}{^^J}{\w{#1#2####1}^^J}}% used in \hisyntax
+}
+\_def\_testcommentchars #1\_iftrue{\_iffalse} % default value of \_testcommentchar
+\_def\_printcomments{\_ttskip
+ {\_catcodetable0 \_reloading \_rm \_everypar={}%
+ \_noindent \_ignorespaces \_scantextokens\_ea{\_vcomments}\_par}%
+ \_ttskip
+}
+\_public \commentchars ;
+
+ \_doc -----------------------------
+ The \`\visiblesp` sets spaces as visible characters \char9251.
+ It redefines the \^`\_dsp`, so it is useful for verbatim modes only.
+
+ The \`\_dsp` is equivalent to {\visiblesp`\ `} primitive.
+ It is used in all verbatim environments: spaces are active and defined as
+ `\_dsp` here.
+ \_cod -----------------------------
+
+\_def \_visiblesp{\_ifx\_initunifonts\_relax \_def\_dsp{\_char9251 }%
+ \_else \_def\_dsp{\_char32 }\_fi}
+\_let\_dsp=\ % primitive "direct space"
+
+\_public \visiblesp ;
+
+\_endcode
+
+\_endinput
+
+History:
+2020-01-22 ... \activettchar changed to \verbchar
+2020-12-30 ... \secc followed by \begtt must be unbreakable
+2020-11-13 ... \commentchars implemented
+2020-04-22 ... \ttshift introduced
+2020-04-06 ... \visiblesp added
+2020-04-04 ... ^^I activated as \t for multiline verbatim
+ \verbinput <cmds> (...) <filename>, <cmds> added.
diff --git a/macros/optex/demo/op-biblist.bib b/macros/optex/demo/op-biblist.bib
new file mode 100644
index 0000000000..691a02ea0e
--- /dev/null
+++ b/macros/optex/demo/op-biblist.bib
@@ -0,0 +1,298 @@
+This is an example of .bib file using by OpTeX.
+Petr Olsak 2014
+----------------------------------------------------------
+See the section 1.5.3 of OpTeX documentation for more information.
+
+@BOOK{white,
+ author = "David J. Whitehouse",
+ title = "Handbook of surface and nanometrology",
+ edition = "2nd",
+ address = "Boca Raton",
+ publisher = "CRC Press",
+ year = 2011,
+ isbn = "978-1-4200-8201-2",
+ lang = "en",
+}
+@BOOK{lech,
+ author = "Richard Lech",
+ title = "Fundamental principles of engineering nanometrology",
+ howpublished = "online",
+ address = "Oxford",
+ publisher = "Elsevier",
+ year = 2009,
+ isbn = "978-0-08-096454-6",
+ citedate = "2011/08/29",
+ url = "http://www.sciencedirect.com/science/book/9780080964546",
+ option = "autrim:1",
+}
+@BOOK{Cmej,
+ author = "Světla Čmejrková and František Daneš and Jindra Světlá",
+ title = "Jak napsat odborný text",
+ address = "Praha",
+ publisher = "Leda",
+ year = 1999,
+ isbn = "80-85927-69-1",
+ key = "Czzmejrkova",
+}
+@BOOK{ tbn,
+ bibmark = "Ol00",
+ author = "Petr Olšák",
+ title = "\TeX{}book naruby",
+ edition = "2.",
+ address = "Brno",
+ publisher = "Konvoj",
+ year = 2001,
+ isbn = "80-7302-007-6",
+ url = "http://math.feld.cvut.cz/olsak/tbn.html",
+ option = "urlalso",
+}
+@BOOK{ tst,
+ author = "Petr Olšák",
+ title = "Typografický systém \TeX{}",
+ edition = "2.",
+ address = "Brno",
+ publisher = "Konvoj",
+ year = 2000,
+ url = "http://math.feld.cvut.cz/olsak/tst.html",
+ isbn = "80-85615-91-6",
+}
+@BOOK{ tpp,
+ author = "Petr Olšák",
+ title = "\TeX{} pro pragmatiky",
+ year = "2013",
+ address = "Brno",
+ publisher = "CsTUG",
+ isbn = "978-80-901950-1-1",
+ option = "titlepost:{\TeX{} -- CSplain -- OPmac}",
+ howpublished = "online",
+ url = "http://math.feld.cvut.cz/olsak/tpp.html",
+}
+@BOOK{texbook,
+ author = "Donald Ervin Knuth",
+ title = "The \TeX{}book",
+ address = "Boston",
+ publisher = "Addison-Wesley",
+ year = 1984,
+ isbn = "02-011-3448-9",
+}
+@BOOK{ rowling,
+ author = "Robert Calbraith",
+ option = "auprint:{\AU\space [pseudonym of J. K. Rowling]}",
+ title = "The Cuckoo's Calling",
+ address = "New York",
+ publisher = "Mulholland Books",
+ isbn = "0-316-20684-6",
+ year = 2013,
+}
+@BOOK{ earle,
+ author = "Richard Earle",
+ title = "The art of cause marketing:
+ how to use advertising to change personal behavior and public policy",
+ ednote = "Cover and interior design by Monica \upper{Baziuk}",
+ address = "New York",
+ publisher = "McGraw-Hill",
+ year = 2000,
+ isbn = "0-07-138702-1",
+ option = "yearprint:{\copyright2000}",
+}
+@BOOK{ novaci,
+ author = "Jan Novák and Helena Nováková",
+ title = "Alergenní rostliny",
+ address = "Praha",
+ publisher = "Knižní klub",
+ year = 2010,
+ isbn = "80-242-2591-3",
+}
+@BOOK{ adobe,
+ author = "Adobe\ creative\ team",
+ title = "Adobe Flash CS4 Professional: Oficiální výukový kurz",
+ ednote = "Přeložil Lukáš \upper{Krejčí}",
+ address = "Brno",
+ publisher = "Computer Press",
+ year = 2009,
+ isbn = "80-251-2334-8",
+}
+@BOOK{ nierhaus,
+ author = "Grehard Nierhaus",
+ title = "Algorithmic Composition: Paradigms of Automated Music Generation",
+ address = "Wien",
+ publisher = "Springer",
+ year = 2009,
+ isbn = "3-211-77539-6",
+ url = "http://www.springerlink.com/content/g7h129",
+ option = "yearprint:{\copyright2009} urlalso",
+}
+@BOOK{ taschen,
+ author = "Laszlo Taschen",
+ title = "Modern architekture A-Z",
+ ednote = "vol. 1, A-L",
+ address = "Köln",
+ publisher = "Tashen",
+ year = 2010,
+ isbn = "383-6521-321",
+}
+@ARTICLE{ opmactug,
+ author = "Petr Olšák",
+ title = "OPmac: Macros for Plain \TeX",
+ journal = "TUGboat",
+ publisher = "\TeX{} Users Group",
+ year = 2013,
+ volume = 34,
+ number = 1,
+ pages = "88--96",
+ issn = "0896-3207",
+ url = "http://petr.olsak.net/ftp/olsak/bulletin/tb106olsak-csplain.pdf",
+ option = "urlalso",
+ lang = "en",
+}
+@ARTICLE{ optextug,
+ author = "Petr Olšák",
+ title = "\OpTeX/ -- A new generation of Plain \TeX/",
+ journal = "TUGboat",
+ publisher = "\TeX{} Users Group",
+ year = 2020,
+ volume = 41,
+ number = 3,
+ pages = "348--354",
+ issn = "0896-3207",
+ url = "http://petr.olsak.net/ftp/olsak/bulletin/tb128olsak-optex.pdf",
+ option = "urlalso",
+ lang = "en",
+}
+@THESIS{ mirekB,
+ author = "Miroslav Olšák",
+ title = "Kvadratické rovnice na slovech",
+ school = "Univerzita Karlova v~Praze, fakulta Matematicko-fyzikální",
+ address = "Praha",
+ year = 2013,
+ url = "http://www.olsak.net/mirek/bakalarka/",
+ type = "Bakalářská práce",
+ option = "urlalso",
+}
+@THESIS{ mirekM,
+ author = "Miroslav Olšák",
+ title = "Součiny Fréchetovských prostorů",
+ school = "Univerzita Karlova v~Praze, fakulta Matematicko-fyzikální",
+ address = "Praha",
+ year = 2015,
+ url = "http://www.olsak.net/mirek/diplomka/",
+ type = "Diplomová práce",
+ option = "urlalso",
+}
+@THESIS{ mirekD,
+ author = "Miroslav Olšák",
+ title = "Generalizing CSP-related results to infinite algebras",
+ school = "Univerzita Karlova v~Praze, fakulta Matematicko-fyzikální",
+ address = "Praha",
+ year = 2019,
+ url = "https://dspace.cuni.cz/handle/20.500.11956/108756",
+ type = "Disertační práce",
+ option = "urlalso",
+ lang = "en",
+}
+@INBOOK{ zakonVS,
+ author = "Česko",
+ title = "Zákon č. 111 ze dne 22. dubna 1998 o vysokých školách a o změně a
+ doplnění dalších zákonů (zákon o vysokých školách)",
+ booktitle = "Sbírka zákonů České republiky",
+ year = 1998,
+ series = "částka 39, s. 5388--5419",
+ url = "http://aplikace.mvcr.cz/archiv2008/sbirka/1998/sb039-98.pdf",
+ issn = "1211-1244",
+ option = "urlalso unpublished",
+ key = "Czzesko",
+}
+@INBOOK{ lonka,
+ author = "Kristi Lonka",
+ title = "Helping doctoral students to finish their theses",
+ booktitle = "Teaching academic writing in European higher education",
+ editor = "Lennart Björk and Gerd Bräuer and Lotte Reinecker and Peter Stray Jörgensen",
+ address = "Dordrecht",
+ publisher = "Kluwer Academic Publ.",
+ year = 2003,
+ pages = "113--131",
+ isbn = "1-4020-1208-X",
+ option = "edprint:{\ED,~eds.}",
+}
+@INBOOK{ demay,
+ author = "Y. Demay",
+ title = "Computation of 2D viscoelastic flows for a differential constitutive equation",
+ editor = "J-M. Piau and J-F. Agassant",
+ booktitle = "Rheology for Polymer Melt Processing",
+ howpublished = "online",
+ publisher = "Elsevier",
+ year = 2011,
+ numbering = "s.~237--255",
+ isbn = "0444822369",
+ citedate = "2011/08/29",
+ url = "htpp://www.sciencedirect.com/science/article/pii/S0169310796800098",
+ option = "nowarn",
+}
+@INPROCEEDINGS{ distler,
+ author = "Tobias Distler and Rüdiger Kapitza",
+ title = "Increasing performance in Byzantine fault-tolerant systems on-demand replica consistency",
+ booktitle = "Proceedings of the Eurosys' 2011 conference. April 10 -- April 13, 2011, Salzburg, Austria",
+ address = "New York",
+ publisher = "Association of computer machinery",
+ year = 2011,
+ numbering = "pp.~91--105",
+ isbn = "1-4503-0634-8",
+}
+@INPROCEEDINGS{ talich,
+ author = "Milan Talich and Filip Antoš",
+ title = "Metody a postupy doigitalizace a online zpřístupnění starých kartografických děl",
+ howpublished = "online",
+ booktitle = "INFORUM 2011: 17. ročník konference o profesionálních informačních zdrojích,
+ 24.--26. května 2011, Vysoká škola ekonomická v Praze",
+ option = "unpublished",
+ url = "http://www.inforum.cz/pdf/2011/talich-milan.pdf",
+ citedate = "2011/08/29",
+ year = 2011,
+ option = "nowarn",
+}
+@ARTICLE{ mansouri,
+ author = "Majdi Mansouri and Quachani Ilham and Hicham Snoussi and Richard Cédric",
+ title = "Adaptive quantized target tracking in wireless sensors networks",
+ journal = "Wireles Networks",
+ number = 7,
+ volume = 17,
+ pages = "1625--1639",
+ lang = "en",
+ option = "nowarn",
+}
+@ARTICLE{ calafiore,
+ author = "Giuseppe C. Calafiore and Fabrizio Dabbene and Roberto Tempo",
+ title = "Research~ on probabilistic methods for control system design",
+ journal = "Automatica",
+ howpublished = "online",
+ Publisher = "Elsevier",
+ month = "July",
+ year = 2011,
+ volume = 47,
+ number = 7,
+ pages = "1279--1293",
+ issn = "0005-1090",
+ citedate = "2011/07/17",
+ doi = "10.1016/j.automatica.2011.02.029",
+ lang = "en",
+}
+@MISC{ bowles,
+ title = "What is fluid technology?",
+ ednote = "Bowles Fluidics Corp.",
+ citedate = "2011/10/10",
+ url = "http://www.bowlesfluidics.com/capabilites/technology/",
+ key = "zzzz"
+}
+@MISC{ biernatova,
+ author = "Olga Biernátová and Jan Skůpa",
+ title = "Bibliografické okazy a citace dokumentů: dle ČSN ISO 690 (01~0197) platné od 1. dubna 2011",
+ ednote = "Brno, 2011. Vytvořeno ve spolupráci s portálem citace.com",
+ url = "http://www.citace.com/dokumenty.php",
+}
+@MISC{ trtikova,
+ author = "Ilona Trtíková and Ludmila Tichá",
+ title = "Jak citovat",
+ ednote = "Ústřední knihovna ČVUT, 2011, 2012, 2013",
+ citedate = "2014/04/22",
+ url = "http://knihovna.cvut.cz/studium/jak-psat-vskp/doporuceni/jak-citovat/",
+}
diff --git a/macros/optex/demo/op-demo.tex b/macros/optex/demo/op-demo.tex
new file mode 100644
index 0000000000..e17b2f0b2f
--- /dev/null
+++ b/macros/optex/demo/op-demo.tex
@@ -0,0 +1,127 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\fontfam[LMfonts] % Default font family: Latin Modern
+
+\margins/1 a5 (1,1,1,1.4)cm % A5 paper + 1cm margins
+\typosize[9/10.5] % 9pt font / 10.5pt baselineskip
+\parindent=10pt % typesetting parameters
+\hyperlinks \Blue\Blue % active hyperlinks
+\verbchar` % in-text verbatim by `...`
+\everyintt={\Red} % in-text verbatim Red
+\enquotes % use \"text" for English quotation
+
+\tit Demonstration
+
+\nonum\notoc\sec Contents
+
+\maketoc % Table of Contents is auto-generated here
+
+\sec Lists
+
+The lists have to be surrounded by `\begitems`
+and `\enditems` sequences.
+
+\begitems
+* First item.
+* Second item.
+ \begitems \style i
+ * Nested item list,
+ * numbered by roman numerals.
+ \enditems
+* Last item.
+\enditems
+
+\secc Title of\nl Subsection
+
+The subsection text\dots
+
+\sec References
+
+There is a numbered equation.
+The number is auto-generated by `\eqmark` sequence.
+$$\label[my-eq]
+ a^2 + b^2 = c^2 \eqmark
+$$
+We can refer to Equation~\ref[my-eq]
+on page~\pgref[my-eq].
+We can refer to Table~\ref[my-tab] in
+Section~\ref[tab-sec] too. And Figure~\ref[my-pic]
+is on page~\pgref[my-pic].
+
+\sec Hyperlinks
+
+You can refer to \url{http://petr.olsak.net} using `\url`.
+Or use `\ulink` if the raw URL needs to be hidden:
+\ulink[http://petr.olsak.net/optex]{\OpTeX/ page}.
+The parameter text is colorized and it becomes
+an active link if the `\hyperlinks` sequence
+is used at the beginning of the document.
+Internal links are activated too.
+
+\sec[tab-sec] Tables
+
+The `\table` sequence can be used
+instead of \"low level" `\halign`.
+The following table is framed by the `\frame` sequence
+to get a double frame.
+
+\bigskip
+\caption/t [my-tab] Testing table.
+\cskip
+\centerline{%
+ \frame{\table{|r|c|l|}{\crl
+ \bf Title A & \bf Title B & \bf Title C \crll
+ first & second & third \cr
+ next & text & last \crl }}}
+
+\sec Images
+
+The images (PDF, JPG, PNG, TIFF) can be inserted
+by `\inspic` sequence. The `\caption`
+can be added if you need to refer to a figure.
+
+\label[my-pic]
+\centerline {\picwidth=2.7cm \inspic{op-ring.png}}
+\cskip
+\caption/f The nonempty ideal of a simple ring --
+ the ring itself.
+
+\sec Verbatim
+
+In-text verbatim is surrounded by the character declared
+by `\verbchar` sequence. The listing can be surrounded
+by `\begtt` and `\endtt` sequences
+\begtt
+This is verbatim.
+ All characters are printed $$, \, # etc.
+\endtt
+or it can be included by `\verbinput` from an external file.
+
+\verbinput (98-100) op-demo.tex
+
+\sec Math
+
+The Math alphabets
+`\mit`, `\cal`, `\script`, `\frak`, `\bbchar`, `\bi`
+are provided. For example:
+$$
+ {\bi A} = \pmatrix {\cal C & \script C \cr
+ \frak M & \bbchar R }.
+$$
+Hundreds of AMS symbols are available:
+$\sphericalangle, \boxplus, \Cup, \Cap, \ldots$
+
+\sec Others
+
+The `\fontfam` command selects a desired family of fonts.
+The `\typosize` or `\typoscale` sequences set the size
+and baselineskip of used fonts (including math fonts).
+The `\fnote` generates a footnote\fnote{Like this} and
+`\mnote` generates a margin note.
+The `\margins` sets margins and paper dimensions.
+The `\cite` sequence can be used for bibliographic citations.
+The `\bib` sequence creates one bibliography record. Or
+you can use `\usebib` for direct access to the {\tt.bib} files.
+The list of features does not end here\dots
+
+\bye
diff --git a/macros/optex/demo/op-letter-cs.tex b/macros/optex/demo/op-letter-cs.tex
new file mode 100644
index 0000000000..b6883cb74c
--- /dev/null
+++ b/macros/optex/demo/op-letter-cs.tex
@@ -0,0 +1,41 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\letter % \letter OpTeX style activated
+\fontfam[bonum]
+\cslang
+
+\address
+ Vážený pan
+ Mgr. Bořek Byrokrat
+ ředitel Ústavu pro další možnosti
+ Úřední 789
+ 123 45 Praha 1
+
+\hfill V Praze dne \today
+
+\subject Žádost o možnost další možnosti
+
+Vážený pane řediteli,
+
+na základě Vašeho dopisu č.j.~123456/78-dat a elektronické výzvy si dovoluji
+Vás požádat o prozkoumání mé možnosti další možnosti.
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
+eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
+commodo consequat.
+
+Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
+eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
+veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
+commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit
+esse cillum dolore eu fugiat nulla pariatur.
+
+S úctou
+
+\hfill \address
+ {\it Petr Olšák}
+ specialista na \TeX/
+ Ulice 12345
+ Praha 13
+
+\bye
diff --git a/macros/optex/demo/op-letter-en.tex b/macros/optex/demo/op-letter-en.tex
new file mode 100644
index 0000000000..0154e48c01
--- /dev/null
+++ b/macros/optex/demo/op-letter-en.tex
@@ -0,0 +1,38 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+\useOpTeX
+
+\letter % \letter OpTeX style activated
+\enlang \enquotes % Language and quote style
+\fontfam[bonum]
+
+\hfill\address
+ Alice Author
+ 123 Sender Street
+ City 4567
+
+\bigskip
+
+\address
+ Mr. Bobby Bureaucrat
+ 456 Magnolia Street
+ City 8901
+
+\hfill\today
+
+\subject Inquiry regarding \"lorem ipsum"
+
+Dear Mr. Bureaucrat,
+
+\lorem[1-2] % 2 paragraphs of blindtext
+
+Thank you for your time.
+
+With best regards,
+
+\bigskip % leave some space for signature
+\bigskip
+
+Alice Author
+
+\bye
+
diff --git a/macros/optex/demo/op-ring.png b/macros/optex/demo/op-ring.png
new file mode 100644
index 0000000000..de7811df83
--- /dev/null
+++ b/macros/optex/demo/op-ring.png
Binary files differ
diff --git a/macros/optex/demo/op-slides-bg.png b/macros/optex/demo/op-slides-bg.png
new file mode 100644
index 0000000000..4ac1ad8c38
--- /dev/null
+++ b/macros/optex/demo/op-slides-bg.png
Binary files differ
diff --git a/macros/optex/demo/op-slides.tex b/macros/optex/demo/op-slides.tex
new file mode 100644
index 0000000000..50bcdaffa6
--- /dev/null
+++ b/macros/optex/demo/op-slides.tex
@@ -0,0 +1,322 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\slides % OpTeX slides style activated
+
+\catcode`<=13 % special printing of <text>
+\def<#1>{\hbox{$\langle$\it#1\/$\rangle$}}
+\everyintt={\catcode`\<=13}
+
+\hyperlinks\Blue\Blue % hyperlinks are used in the title page
+\backgroundpic{op-slides-bg.png} % background picture
+
+\verbchar` % inline verbatim
+\enquotes % English quotes \"..."
+
+\slideshow %------------------------------------------------------------
+
+
+\tit \OpTeX/ slides
+
+\subtit Petr Olšák\nl petr@olsak.net
+
+\subtit\rm \url{http://petr.olsak.net/optex}
+
+\pg; %------------------------------------------------------------------
+
+\sec Basics
+
+* The the simple document looks like:
+
+\begtt
+\slides % style initialized
+%\wideformat % 16:9
+\slideshow % partially uncovering ideas
+
+\sec First slide
+text
+\pg;
+
+\sec Second slide
+text
+\pg.
+\endtt
+
+* If `\slideshow` is missing or commented out then
+ \"partially uncovering ideas" (see later) are deactivated. It is useful
+ for printing.
+* The `\slideshow` must be the last command in the declaration part of the
+ document.
+* By default, the slides have A5 landscape format.
+ You can declare `\wideformat`. Then the height is the same
+ but width is 263\,mm, i.\,e.~the ratio width:height is 16:9.
+
+\pg; %------------------------------------------------------------------
+
+\sec Title slide
+
+* Title of the document (used at the first slide) is created
+ by `\tit Title` (terminated by end of line).
+* The `\subtit Author name etc.`\ (terminated by end of line)
+ can be used after `\tit` at the first slide.
+* You can use `\nl` for a new line in paragraphs or titles.
+
+\sec Default design
+
+* The paragraph texts are ragged right.
+* Titles, subtitles, and section titles are centered.
+* The `\sec` and `\secc` are printed without numbers.
+* No paragraph indentation, a little vertical space between paragraphs.
+* The Heros font family (aka Helvetica) is initialized as default.\nl
+ Sans-serif FiraMath font for math typesetting is used.\nl
+ If `\fontfam[<famname>]` precedes `\slides` then it rewrites default.
+* The items in lists are started by a blue square (`\type X` and `\type x` ).
+
+\pg; %------------------------------------------------------------------
+
+\sec One slide (one page)
+
+* Top-level item list is activated by default. The asterisk `*` opens
+ new item at the top-level list.
+* Nested items lists (second and more level) should be created in
+ the `\begitems`\dots`\enditems` environments.
+* Each slide (page) must be terminated by `\pg;` command.
+* The last slide must be terminated by `\pg.` command or by `\bye`.
+
+\begtt
+\sec My ideas
+
+* First idea
+* Second idea
+ \begitems
+ * First sub-idea
+ * Second sub-idea
+ \enditems
+* Final idea
+\endtt
+
+* Note: each page is processed in a group, so: put your own definitions
+ (if~exist) before `\slideshow` or use `\global` assignment.
+
+\pg; %------------------------------------------------------------------
+
+\sec Partially uncovering ideas
+
+* The control sequence `\pg` must be followed by:\pg+
+\begitems
+* the character `;` -- normal next page,\pg+
+* the character `.` -- the end of the document,\pg+
+* the character `+` -- next page keeps the same text
+ and a next text is added (usable for partially uncovering of ideas).\pg+
+\enditems
+
+* Summary:
+\begtt
+\pg; ... next page
+\pg. ... the end of the document
+\pg+ ... uncover next text on the same page
+\endtt
+\pg+
+
+* When `\slideshow` is not declared then `\pg+` is deactivated.\pg+
+* The `\pg+` creates a new \"virtual page", so the current paragraph is
+ terminated.
+
+\pg; %------------------------------------------------------------------
+
+\sec Example with partially uncovering ideas
+
+The previous page was created by:
+
+\begtt
+\sec Partially uncovering ideas
+
+* The control sequence `\pg` must be followed by:\pg+
+
+\begitems
+* the character `.` -- normal next page,\pg+
+* the character `;` -- the end of the document,\pg+
+* the character `+` -- next ... \pg+
+\enditems
+
+* Summary
+...
+* When `\slideshow` is not declared
+ then `\pg+` is deactivated.\pg+
+* The `\pg+` creates a new \"virtual page",
+ so the current paragraph is terminated.
+\pg;
+\endtt
+
+\pg; %------------------------------------------------------------------
+
+\sec Notes to `\slideshow`
+
+* When `\slideshow` is active then you cannot reference sections by
+ hyperlinked `\ref`. Only `\pgref` works (and goes to the last layer
+ of the referenced page).
+* If the text overfull the page (slide) then it follows to the next page without
+ saying explicitly `\pg;`. But `\slideshow` cannot work in this case.\pg+
+* If `\slideshow` then each part of page between two `\pg`'s or between
+ `\slideshow` and the first `\pg` is processed in a local group.
+* If not `\slideshow` then the document is not separated to groups.
+ This can lead to different results. So, you can put `\slideopen` command
+ instead of `\slideshow`. Then local groups are opened exactly as when
+ `\slideshow` is used but `\slideshow` is not activated. Example:
+
+\begtt
+\slides
+\def\foo...{...} % global definitions.
+%\slideshow % printing version, no slide show.
+\slideopen % opens group for first page.
+... first page
+\pg; % closes group and opens group for second page.
+... second page
+\pg. % closes group of the last page.
+\endtt
+
+\pg; %------------------------------------------------------------------
+
+\sec More about design
+
+* You can use `\backgroundpic{<image-file>}` for putting an image to the background.
+* You can re-declare `\footline` or re-define internal macros for design as
+ you wish.
+* The TeXGyre Heros font is used as default text font, the FiraMath is used
+ for math.
+* If you want to use another text font fmaily, use `\fontfam`
+ {\em before} `\slides` command.
+* If you want to use different math font, use
+ `\loadmath{[font]}` before `\fontfam` (if used) and before `\slides`. For example:
+
+\begtt
+\loadmath{[Asana-Math]} % Math font: Asana
+\fontfam[Termes] % Text font: Termes
+\slides
+...
+\endtt
+
+* You can put the images or text wherever using `\putimege` or `\puttext`
+ macros...
+
+\pg; %------------------------------------------------------------------
+
+\sec Putting images and texts wherever
+
+* `\puttext <right> <up> {<text>}` puts a <text> to the desired place:
+ It moves the current point <right> and <up>, puts the <text> and returns
+ back, so the typesetting continues from previous position. The parameters
+ <right> and <up> are dimensions. For example
+
+\begtt
+\puttext 0mm 50mm {\Red HELLO}
+\endtt
+
+ \puttext 0mm 50mm {\Red HELLO}
+ prints red HELLO, as shown here.\pg+
+
+* `\putpic <right> <up> <width> <height> {<image-file>}`
+ puts the image with desired <width> and <height> at the position like
+ `\puttext` puts the text.
+
+ \putpic .8\hsize 20mm 30mm \nospec {op-ring.png}
+* The ring above is the result of
+
+\begtt
+\putpic .8\hsize 20mm 30mm \nospec {op-ring.png}
+\endtt
+ %
+ used at beginning of this paragraph.\pg+
+* Use `\nospec` for <width> or <height> of the image if you don't want to specify both
+ dimensions (because you don't want to change the image aspect ratio).
+
+\pg; %------------------------------------------------------------------
+
+\sec Limits of the \code{\\pg+} sequence
+
+* The \code{\\pg+} sequence (partially uncovering ideas) cannot be used inside
+ a~group.
+* The exception is the nested environment `\begitems...\enditems`.
+* The `\pg+` always finalizes the current paragraph.
+ It is impossible to hide only a part of the horizontal mode.\pg+
+
+\sec The \code{\\layers}\,...\code{\\endlayers} environment
+
+If you really need something unsupported by `\pg+` then you can use
+
+\begtt \catcode`\<=13
+\layers <number>
+<layered text>
+\endlayers
+\endtt
+
+* The <layered text> should include conditions like
+ `\ifnum\layernum...` or `\ifcase\layernum`.
+ It is printed <number> times to more slide pages (layers) with the same
+ surrounding text. See next page...
+
+\pg; %------------------------------------------------------------------
+
+\sec Example of \code{\\layers} environment
+
+The `\slides` style provides a shortcut `\use` and a macro `\pshow` (means
+partially show):
+
+\begtt
+\def\use#1#2{\ifnum\layernum#1\relax#2\fi}
+\def\pshow#1{\use{=#1}\Red \use{<#1}\Transparent \ignorespaces}
+\endtt
+`\use{=3}{do something}` does something only if `\layernum=3`.
+
+The `{\pshow<num> <text>}` prints <text> in Red when current layer is equal
+to <num> or it prints <text> normally when current layers is greater than <num>.
+The transparent (invisible) text is used in other cases.
+
+The following dance:
+\layers 3
+{\pshow2 Second text.} {\pshow3 Third text.} {\pshow1 First text.}
+\endlayers
+\pg+
+
+was generated by
+
+\begtt
+\layers 3
+{\pshow2 Second text.} {\pshow3 Third text.} {\pshow1 First text.}
+\endlayers
+\endtt
+
+\pg+
+* The <layered text> is treated as a macro parameter. So, you cannot use verbatim
+ nor `\sec` titles here. Maximal one `\layers` environment can be per one
+ page (terminated by `\pg+` or `\pg;` or `\pg.`
+
+\pg; %------------------------------------------------------------------
+
+\sec Comparison \OpTeX/ slides with Beamer\fnote{\url{http://www.ctan.org/pkg/beamer}}
+
+The \LaTeX{} package {\bf\Blue Beamer} gives much more features and many themes
+are prepared for Beamer, {\bf\Red but}
+\pg+
+* the user of Beamer is forced to {\em program} his/her document using
+ dozens of \code{\\begin{foo}} and \code{\\end{foo}} and many another
+ programming constructions,\pg+
+* plain \TeX{} gives you a possibility to simply
+ {\em write} your document with minimal markup. The result is more compact.
+ You can concentrate on the contents of your document, not on the
+ programming syntax.\pg+
+* User needs to read 250 pages of doc for understanding Beamer,\pg+
+* on the other hand, you need to read only eleven
+ slides\fnote{this twelfth slide isn't counted}
+ and you are ready to use {\bf\Blue\OpTeX/ slides}.
+
+\pg; %------------------------------------------------------------------
+
+\null
+\vskip2cm
+\centerline{\typosize[35/40]\bf Thanks for your attention}\pg+
+
+\vskip2cm
+\centerline{\Blue\typosize[60/70]\bf Questions?}
+
+\pg. %----------------------------- THE END ----------------------------
+
diff --git a/macros/optex/doc/omls.tex b/macros/optex/doc/omls.tex
new file mode 100644
index 0000000000..bcc5749a51
--- /dev/null
+++ b/macros/optex/doc/omls.tex
@@ -0,0 +1,832 @@
+\fontfam[lm]
+
+\adef<#1>{\ifcsname s:#1\endcsname
+ \link[s:#1]{}{\Blue$\langle$\hbox{\it#1\/}$\rangle$}%
+ \else {\Blue$\langle$\hbox{\it#1\/}$\rangle$}\fi}
+\everyintt={\catcode`<=13 \Red}
+\verbchar`
+\enlang
+\enquotes
+
+\def\r[#1]{\label[#1]\wlabel{\the\_itemnum}}
+\def\:{$\to$}
+\let\_narrowlastlinecentered=\ignoreit
+\_def\_printsecc#1{\_par
+ \_abovetitle{\_penalty-200}{\_medskip\_smallskip}
+ {\_seccfont \_noindent \_raggedright \_printrefnum[@\_quad]%
+ \_label[\the\_secnum.\the\_seccnum]\wlabel{\the\_secnum.\the\_seccnum}#1\_nbpar}%
+ \_nobreak \_belowtitle{\_medskip}%
+ \_firstnoindent
+}
+\def\.`{\bgroup\catcode`\ =12 \scancs}
+\def\scancs#1{\egroup
+ \immediate\_wref\Xknowncs{\string#1{\the\_secnum.\the\_seccnum}}%
+ \ea`\string#1%
+}
+\def\printcs#1{\ea\printcsred\csstring#1;~\ref[#1] \ }
+\def\printcsred,#1;{{\Red\tt \bslash#1}}
+\def\printknowncs{\ifx\knowncslist\undefined \let\knowncslist=\empty \fi
+ \ifx\knowncslist\empty TeX me again...\else
+ \_dosorting\knowncslist \ea\xargs \ea\printcs \knowncslist;\fi}
+
+\def\~`<#1>`{<#1>\sxdef{s:#1}{}\dest[s:#1]}
+
+\refdecl{
+ \def\knowncslist{}^^J
+ \def\Xknowncs#1#2{%
+ \sxdef{,\csstring#1}{#2}%
+ \global\ea\addto\ea\knowncslist\ea{\csname,\csstring#1\endcsname}%
+ }
+}
+\sdef{_item:c}{\pdfsave\llap{\pdfscale{1.3}{1.3}$\circ$\enspace}\pdfrestore}
+
+%\parindent=15pt \iindent=\parindent \ttindent=\parindent
+%\ttindent=0pt
+\everylist={\advance\ttindent by-1em}
+\hyperlinks \Green \Green
+\def\cskip{\par\nobreak}
+\def\begblock{\medskip\hbox\bgroup\vrule\vbox\bgroup\hrule\smallskip
+ \_fnset\leftskip=\parindent \rightskip=\parindent \medskip\noindent}
+\def\endblock{\medskip\hrule\egroup\vrule\egroup}
+
+\def\raggedright{\rightskip=10pt plus1fil\relax}
+\def\optexmanual{\ulink[http://petr.olsak.net/ftp/olsak/optex/optex-doc.pdf]{\OpTeX/ manual}}
+
+\titskip=1cm
+
+\hfill Version 0.1
+
+\tit \OpTeX/ Markup Language Standard
+
+{\it\hfil Petr Olšák, 2021}\bigskip
+
+The \OpTeX/ markup language standard (OMLS) declares a list of control
+sequences used in \OpTeX/ documents including their syntax and sematic. The
+listed control sequences in OMLS in section~\ref[listcs] in table~\ref[alistcs]
+are called {\it known} and other control sequences are {\it unknown}.
+
+The main reason for OMLS is to give instructions on how to program convertors
+from \OpTeX/ documents to another formats (Html, Markdown, \LaTeX/) or how
+to interpret the \OpTeX/ document sources in such applications as
+{\tt texcount} or text editors\fnote
+{We suppose advanced editor features: color highlighting, sections/chapters folding,
+ auto-completions, etc.}.
+These converters and applications are called {\it cnv-programs} in this document.
+
+We suppose that if you need absolute control over the typography of the
+document when it is converted to PDF pages, then you use \OpTeX/ itself. If
+you need to create other formats of the same document then you can use a
+cnv-program which accepts OMLS. The result is a document without
+typographical instructions like dimensions of pages, margins, paginations
+and headers, selection of a font-family, dimensions of the fonts, etc.\ You can
+imagine the result of such a conversion as a single Html page where more
+typographical features can be controlled in a different way, for example by
+an external CSS file. This is a reason why control sequences like `\fontfam` or
+`\margins` are ignored by cnv-programs.
+
+Obviously, \TeX/ and \OpTeX/ itself gives possibility to declare various
+input formats for various purposes. Sometimes (in very special cases) there
+exists a good reason to declare a different and special input format by
+\TeX/ macros. But if the source of the document respects the OMLS then it is
+reasonably transformable to other formats by cnv-programs. We hope that
+OMLS-ready documents cover a very large set of typical documents used these
+days.
+
+We suppose that cnv-programs work internally with strings of source lines
+without tokenization. This is one of the great differences in processing the
+document directly by \OpTeX/ and using a cnv-program. The second difference is
+that the expansion process of macros is not implemented in cnv-programs in
+its full range. We respect that the result of cnv-programs will be different
+than from processing directly by \OpTeX/. But this is not a bug, this is
+the feature. We concentrate on the fixed syntax and sematic given by OMLS of the
+\OpTeX/ document and we throw behind the head the typographical
+exactness of the document which can be done only directly by \TeX/ (and it is
+exactly described in \TeX/book, for example).
+
+\notoc\nonum\sec Table of contents
+
+\begmulti 2
+\maketoc
+\endmulti
+\vfil\break
+
+\sec Syntactical rules
+
+The syntactical elements are described as strings here. No \TeX/'s tokenization is
+taken into account. The rule with a smaller number has precedence.
+
+\begitems \style n
+* end of line or end of file \: \~`<eol>`.\r[eol]
+* `%%:` at beginning of the line \: \~`<cnv-declarator>`, see section~\ref[cnv-decl].
+* `<cnv-declarator><text><eol>` is interpreted specially.
+* space or a tab-character \: \~`<space>`.
+* non-empty sequence of `<space>`s \: \~`<spaces>`.\r[spcs]
+* an empty line or a line only with `<spaces>` \: \~`<empty-line>`.
+* a character `a`--`z` or `A`--`Z` \: \~`<letter>`.
+* a `<letter>` or `_` \: \~`<specletter>`.
+* a character different from previous rule or `<eol>` or `<spaces>` \: \~`<non-specletter>`
+* `\<non-specletter>` \: \~`<singlechar-control-sequence>`.\r[scs]
+* a non-empty sequence of `<specletter>`s \: \~`<letters-seq>`.
+* `\<letters-seq><non-specletter>` \: \~`<multiletter-control-sequence>``<non-specletter>`.
+* `%<text><eol>` \: `<comment>` and it is completely ignored including `<eol>`.\r[com]
+* `<spaces>` at beginning of the line marks that the line as {\it indented}.
+* `<spaces>` at beginning of the line \: are ignored.\r[bspace]
+* `<spaces><eol>` or `<eol>` \: `<spaces>`.\r[eolrm]
+* `<multileter-control-sequence><spaces>` \: `<multileter-control-sequence>`.\r[csspace]
+* `<multiletter-control-sequence>` or `<singlechar-control-sequence>` \: \~`<control-sequence>`.\r[cs]
+* `<spaces>` \: `<space>`.\r[sspace]
+* `~` \: non-breakable space.
+* text where all pairs `{` and `}` match at arbitrary level \: \~`<balanced-text>`.\r[balt]
+* `{<balanced-text>}` can be interpreted as a parameter of a `<control-sequence>`, see section~\ref[listcs].
+* The `{` alone not used by previous rule opens a group and the `}` alone closes the same group.\r[group]
+* There are two main modes: h-mode, v-mode\fnote
+ {this is great simplification of real \TeX/ modes.}.
+ The document processing starts in v-mode.
+* In v-mode: a `<non-space>` character or a control sequence listed
+ in table~\ref[vtohmode] swithes to h-mode.
+* In h-mode: an `<empty-line>` or a control sequence listed in table~\ref[htovmode] switches to v-mode.\r[htov]
+* The switching from v-mode to h-mode \: a paragraph begins.
+* The switching from h-mode to v-mode \: the current paragraph ends.
+* `$<text>$` or `$$<text>$$` \: process `<text>` in math-mode, see section~\ref[math].
+* a non-empty sequence of digits with optional `+` or `-` in the front \: \~`<number>`.
+* `<number>` with optional dot inside the sequence of digits \: \~`<decimal-number>`.
+* a pair of letters listed in the table~\ref[tex-units] \: \~`<tex-unit>`.
+* optional space, i.e.\ `<space>` or nothing \: \~`<o-space>`.
+* `<decimal-number><o-space><tex-unit><o-space>` \: \~`<dimen>`.
+* `<control-sequence>` not listed in table~\ref[alistcs] nor in configuration \: \~`<unknown-control-sequence>`.\r[unkncs]
+* `=<o-space>` or `<o-space>` \: \~`<o-equal>`.
+* `<unknown-control-sequence><o-equal><dimen>` \: should be completely ignored.\r[eqdim]
+* `<unknown-control-sequence><o-equal><number>` \: should be completely ignored.
+* `<unknown-control-sequence>=<o-space>{<balanced-text>}` \: should be completely ignored.
+* `<unknown-control-sequence>[<balanced-text>]` \: should be completely ignored.\r[ibkt]
+* `<unknown-control-sequence>` \: should be ignored.\r[ignore]
+* `<control-sequence>`s are processed as described in section~\ref[listcs] or
+ by a configuration of the cnv-program.
+\enditems
+
+\bigskip
+\label[vtohmode]\caption/t
+List of control sequences which switch from v-mode to h-mode.
+\cskip
+\begblock
+`\`<space>,
+`\hfil`,
+`\hfill`,
+`\hskip`,
+`\hss`,
+`\indent`,
+`\leavevmode`,
+`\noindent`,
+`\quad`,
+`\qquad`,
+`\vrule`.
+\endblock
+
+\bigskip
+\label[htovmode]\caption/t
+List of control sequences which switch from h-mode to v-mode.
+\cskip
+\begblock
+`\begblock`,
+`\begitems`,
+`\begmulti`,
+`\begtt`,
+`\bib`,
+`\bigskip`,
+`\bye`,
+`\caption`,
+`\chap`,
+`\cskip`,
+`\end`,
+`\endblock`,
+`\enditems`,
+`\endmulti`
+`\hrule`,
+`\medskip`,
+`\par`,
+`\sec`,
+`\secc`,
+`\secl`,
+`\smallskip`,
+`\vfil`,
+`\vskip`.
+\endblock
+
+\bigskip
+\label[tex-units]\caption/t
+List of \TeX/ units.
+\cskip
+\begblock
+`bp`,
+`cc`,
+`cm`,
+`dd`,
+`em`,
+`ex`,
+`in`,
+`mm`,
+`pc`,
+`pt`,
+`sp`.
+\endblock
+
+\nonum\secc Examples
+
+\begitems
+* `\%` is `<control-sequence>` by rules \ref[scs], \ref[cs]. It does not start
+ comment, because rule \ref[scs] has precedence before rule \ref[com].
+* `\%<space>`: the `<space>` is kept, but `\foo<space>`: the space is removed
+ by rule~\ref[csspace].
+* `wordA<spaces><eol><spaces>wordB` is `wordA<space>wordB` by rules~\ref[bspace],
+ \ref[eolrm], and~\ref[sspace].
+* `\kern-3pt` should be ignored, because `\kern` is `<unknown-control-sequence>` and rule
+ \ref[eqdim] is applied.
+* `\vskip42mm` should finalize paragraph in h-mode by rule~\ref[htov] and then it
+ is ignored by rule~\ref[eqdim] because `\vskip` is
+ `<unknown-control-sequence>` not listed in table~\ref[alistcs].
+* `\typosize[12/16]` is ignored by rule~\ref[ibkt].
+* `\foo{text}` is `{text}` (i.e. `text` in a group) by rules~\ref[ignore] and~\ref[group].
+\enditems
+
+\sec Scanning parameters
+
+If a control sequence listed in rules above or in the section~\ref[listcs]
+has a parameter, the parameter is scanned
+as a string with interpretation only those rules which are needed to
+determine the boundary of the parameters. For example `\tit <title><eol>`
+applies only rule~\ref[eol] during scanning the parameter, i.e.\ `<title>`
+is a string telemetered by the end of the line or the end of the file.
+Or `\fnote{<balanced-text>}` applies only rule~\ref[balt].
+
+If the parameter is in the format `{<something>}` then the `<something>` is
+always meant as `<balanced-text>`. We don't specify the type `<balanced-text>`
+explicitly here, so we refer to `\fnote{<text>}` and not
+`\fnote{<balanced-text>}`, for example.
+
+The spaces before the scanned parameter are optional
+and they are ignored. Spaces inside `{`...`}` are not ignored.
+
+If the parameter is in the format `{<something>}` and the first non-space
+character is not `{` then the parameter is this first non-space character or
+a `<control-sequence>` if the first non-space character is~`\`. For example
+`\fnote a` is equal to `\fnote{a}`. The difference from this rule is given
+for `\input`, `\verbinput`,`\inspic` and `\inkinspic` control sequences in
+section~\ref[listcs].
+
+If the parameter is scanned as a string already then
+all syntactical rules are applied when it is used. For example:
+\begtt
+\tit This is a title
+\endtt
+the parameter is scanned as `This is a title` and the rules~\ref[spcs]
+and~\ref[sspace] are applied when it is used.
+
+
+\sec Declaration and text parts of the document
+
+A typical \OpTeX/ document has two parts. A declaration part, where
+macros are defined by `\def` and friends, fonts and sizes are declared, etc.
+This part should be ignored by cnv-programs.
+The second part includes the document text with a markup using well-declared control
+sequences. The cnv-program has to interpret the second part.
+
+So, the cnv-program starts in declaration-skipping mode and it switches to
+the text mode later.
+
+When cnv-program is in declaration-skipping mode then all indented lines are
+ignored. And lines which begins by `}` or by a <control-sequence> not listed
+in table~\ref[textopen] are ignored too.
+
+If the line begins by a character other than `}` or by a <control-sequence>
+listed in table~\ref[textopen] then cnv-program switches to text mode. All
+texts are interpreted from this line including this one.
+
+User can say explicitly where the second part of the document starts by
+`%%:text` given at beginning of a line. Moreover, if `%%:decl` is given at
+beginning of a line, then all text between `%%:decl` and `%%:text` is
+ignored, only other possible `<cnv-declarator>`s are processed here.
+It means that the declaration part and the text part of the document can be
+simply determined by the pair `%%:decl` and `%%:text`.
+
+\bigskip
+\label[textopen]\caption/t
+List of control sequences which start the text mode.
+\cskip
+\begblock \raggedright
+`\address`,
+`\begblock`,
+`\begitems`,
+`\begmulti`,
+`\begtt`,
+`\bf`,
+`\bi`,
+`\bib`,
+`\caption`,
+`\cite`,
+`\clipinoval`,
+`\clipincircle`,
+`\ecite`,
+`\fnote`,
+`\frame`,
+`\hfil`,
+`\hfill`,
+`\ii`,
+`\iid`,
+`\incircle`,
+`\inkinspic`,
+`\inoval`,
+`\inspic`,
+`\it`,
+`\LaTeX`,
+`\LuaTeX`,
+`\maketoc`,
+`\mnote`,
+`\OpTeX`,
+`\putpic`,
+`\puttext`,
+`\rcite`,
+`\rm`,
+`\rotbox`,
+`\sec`,
+`\secc`,
+`\secl`,
+`\table`,
+`\TeX`,
+`\tit`,
+`\usebib`,
+`\verbinput`.
+\endblock
+
+
+\sec[cnv-decl] The `%%:` declarators
+
+The `%%:` declarators are ignored when the document is processed by \TeX/
+but they can give instructions to cnv-programs. The `%%:` must be placed at
+beginning of the line. The list of `%%:` declarators follows:
+
+\begitems
+* `%%:decl` -- the following text is ignored until `%%:text` occurs. Only
+ other `%%:` declarators are interpreted.
+* `%%:text` -- the following text must be interpreted in text mode.
+* `%%:to <format> <config-file>` -- if the cnv-program converts to the
+ <format> then it has to use the <config-file>. For example:
+ \begtt
+ %%:to html html-mydocument.cfg
+ %%:to markdown markdown-mydocument.cfg
+ %%:to latex preamble-mydocument.cfg
+ \endtt
+ The language of the config files are not a part of this standard, we
+ suppose something to be natural for used cnv-program. The config file should
+ give additional rules for interpreting control sequences not listed in the
+ section~\ref[listcs] (see rule~\ref[unkncs]). For example a tool for
+ defining a behavior of unknown control sequences can be here.
+ These definitions can depend on the converted document and on the output
+ format and they can be given in the configuration files.
+* `%%:app <application> <config-file>` -- behaves like `%%;to` but the
+ cnv-program name instead output format is given here.
+* `%%:do <format-or-app> <action>` -- does an `<action>` if `<format-or-app>`
+ is output format or used cnv\hbox{-}program name. The `<action>` syntax depends
+ on used cnv-program and it typicaly does a change in its configuration or
+ give a command to it.
+* `%%:skip <formats-or-apps>` -- ignores all following lines until another `%%:` occurs
+ if the output format or application name is included in the `<formats-or-apps>`
+ space-separated list. Example:
+ \begtt
+ %%:skip html markdown
+ This text is not interpreted when Html or Markdown output is generated.
+ %%:
+ \endtt
+ If the `<formats-or-apps>` is empty then the `%%:skip` is applied for
+ each cnv-program and for each output.
+* `%%:if <formats-or-apps>` -- processes following lines until another `%%:`
+ only if the output format or application name is included in the
+ `<formats-or-apps>` space-separated list. Other cnv-programs or output formats
+ not mentioned here skip these lines. Note that \TeX/ processes such lines always.
+ But you can use `\ignoreit{<text>}` which is processed as
+ `{<text>}` by cnv-programs (see rule~\ref[ignore]) but it is ignored by \OpTeX.
+ Example:
+ \begtt
+ %%:if html latex
+ \ignoreit{\input{file.tex}}
+ %%:
+ \endtt
+ The `file.tex` in this example is processed only if \LaTeX/ or Html output is generated.
+* `%%:use` -- the next single line is fully interpreted unless cnv-program ignores
+ declarations by `%%:decl` or because it is in declaration-skipping mode.
+ Example:
+ \begtt
+ %%:use
+ \verbchar` \picdir={img/}
+ \endtt
+ The example shows how cnv-program is able to read `\verbchar` or
+ `\picdir` settings in the declaration\hbox{-}skipping mode although these control
+ sequences are not listed in table~\ref[textopen].
+* `%%:quotes <qql> <qqr> <ql> <qr>` -- declares \~`<qql>` and \~`<qqr>` (left
+ and right double quotation marks), \~`<ql>` and \~`<qr>` (left and right single
+ quotation mark). They are used when `\"` or `\'` control sequences are
+ processed. Default: unset, i.e.\ `\"` and `\'` are interpreted as
+ unknown control sequences.
+\enditems
+
+
+\sec[listcs] List of known control sequences
+
+The phrase \"should be" is used very often when the interpretation of
+control sequences is declared here. It means that this is only a common
+interpretation, but differences are possible due to the type of the output
+format and used cnv-program. For example, when we convert to \LaTeX\, then
+`\-` and `\/` are not ignored but they are re-written without change to the
+output of the \LaTeX/ source file.
+
+\bigskip
+\label[alistcs]
+\caption/t List of known control sequences alphabeticaly sorted.
+\cskip
+\begblock
+\raggedright \printknowncs
+\endblock
+
+
+\secc Character-like control sequences
+
+\begitems
+* \.`\%`, \.`\$`, \.`\&`,\.`\#` respectively \: should be normal characters
+ `%`, `$`, `&`, `#` respectively.
+* \.`\bslash` \: normal character `\`.
+* \.`\space`, `\<space>`, `\<eol>` \: space.
+* `\,` \: should be small space or space.
+* \.`\quad`, \.`\qquad` \: should be bigger space or more spaces.
+* \.`\-`, \.`\/` \: should be ignored.
+* \.`\"<text>"` or \.`\'<text>'` \: `<qql><text><qqr>` or `<ql><text><qr>`,
+ only if `%%:quotes` are set.
+\enditems
+
+\secc Input files
+
+\begitems
+* \.`\input {<file-name>}` or `\input <file-name><space>` should redirect the
+ input to given file. At the end of the input-ed file or at \.`\endinput` the
+ reading of the current file continues. The file is read from the current
+ directory, but the <file-name> should include the full path to the file
+ or relative path starting from the current directory. First, the file
+ `<file-name>.tex` is tried to read and if it doesn't exist then
+ the file `<file-name>` is read.
+* \.`\picdir <o-equal>{<text>}` saves `<text>` to `<picdir-value>`. By
+ default, `<picdir-value>` is empty.
+* \.`\inspic {<file-name>}` or `\inspic <file-name><space>` should include the
+ given picture from the `<picdir-value><file-name>`.
+* \.`\inkinspic {<file-name>}` or `\inkinspic <file-name><space>` behaves like
+ `\inspic`.
+* \.`\verinput <ignore> (<lines>) <file-name><space>` should include the
+ <file-name> (only given lines) as a verbatim text, i.\,e. without any
+ syntactical interpretation.
+* \.`\usebib/<letter> (<style>) <file-names>` should use files from
+ `<file-names>` to generate the list of bib references. The `<file-names>`
+ is comma separated list (the `.bib` extension is appended to
+ each such file name). Only cited bib records should be used in this
+ bib-references, i.e. their label must be used in a `\cite[<labels>]` or
+ `\rcite[<labels>]` or `\ecite[<label>]`.
+ What bib fields are used in bib records depends on the cnv-program and
+ on its configuration. Maybe, simple cnv-programs should generate nothing here.
+\enditems
+
+\secc Titles
+
+\begitems
+* \.`\tit <title><eof>` should be a title of the document.
+* \.`\chap <title><eof>` or `\chap [<label>] <title><eof>` is the title of
+ first level.
+* \.`\sec <title><eof>` or `\sec [<label>] <title><eof>` is the title of
+ second level.
+* \.`\secc <title><eof>` or `\secc [<label>] <title><eof>` is the title of
+ third level.
+* \.`\secl<level> <title><eof>` is the title of given level.
+\enditems
+
+\secc Fonts
+
+\.`\rm` selects upright normal font (it is selected by default), \.`\it` selects
+italic, \.`\bf` selects upright bold font, \.`\bi` selects bold italic and
+\.`\tt` selects a monospaced font, \.`\em` select italic (if upright is current) or upright
+(if italic is current). The font sizes or other font features are typically ignored
+by cnv-programs. The actual font selection is closed at the end of the current group.
+The groups are given:
+\begitems
+* explicitly by `{` and `}` characters (which are not delimiters of
+ parameters of known control sequences),
+* implicitly: parameters of control sequences listed in table~\ref[groupcs]
+ are processed in a group and blocks of text enclosed by
+ `\begitems`...`\enditems`, `\begblock`...`\endblock`, `\begmulti`...`\endmulti`
+ are processed in a group.
+ Each item in `\table` is in a group.
+\enditems
+
+\label[groupcs]
+\caption/t Parameters of following control sequences are processed in a group.
+\cskip
+\begblock
+`\caption`,
+`\chap`,
+`\fnote`,
+`\mnote`,
+`\sec`,
+`\secc`,
+`\tit`.
+\endblock
+
+\secc Colors
+
+\.`\Red`, \.`\Green`, \.`\Blue`, \.`\Cyan`, \.`\Magenta`, \.`\Yellow`, \.`\White`,
+\.`\Black`, and \.`\Brown` should select the given color of the font. The selection
+is closed at the end of the current group (like font selectors).
+
+\secc Blockquotes
+
+The blockquote\fnote
+{The terminology is borrowed from Markdown.}
+is opened by \.`\begblock` and closed by \.`\endblock`.
+Blockquotes can contain multiple paragraphs and can contain nested
+blockquotes.
+
+\secc Lists
+
+The list is opened by \.`\begitems` and closed by \.`\enditems`. The `*` starts
+a new item in this environment. Nested lists are allowed.
+
+The type of items (ordered/unordered)
+is given by \.`\style <character>`, see section 1.4.5 in the
+\optexmanual. Default type is unordered (bullets are used).
+
+
+\secc Code blocks (verbatim texts)
+
+Code blocks are inline verbatim or display verbatim.
+
+\begitems
+* \.`\begtt <ignored><eol><text>\endtt<ignored><eol>` processes `<text>` in
+ \"display verbatim mode", i.\,e. there are no special characters, each character
+ is processed without special interpretation, the <eol>s are end of lines.
+ The text at the same line after `\begtt` and after `\endtt` (if any) is
+ ignored.
+* \.`\verbchar <character>` declares `<verbchar>`. By default, it is undeclared.\nl
+ New `\verbchar <character>` rewrites previous setting. The setting is
+ local in the group.
+* Inline verbatim is enclosed in the pairs of `<verbchar>`s.
+ The text between two `<verbchar>`s is processed without special interpretation.
+ Only possibly <eol>s are replaced by space.
+ Example:
+ \begtt
+ %%:use
+ \verbchar`
+ Now, `$this %text ~\` is processed as inline verbatim.
+ \endtt
+ gives: Now, `$this %text ~\` is processed as inline verbatim.
+* \.`\code{<text>}` processes `<text>` like inline verbatim, but
+ all `\<character>` are processed as `<character>`, specially `\{` and `\}`
+ are `{` and `}` but without taking them into `<balanced-text>` rule,
+ `\\` is `\` but do not create a `<control-sequence>`, etc.
+\enditems
+
+
+\secc Multicolumns
+
+\.`\begmulti <number><space>` opens the group and \.`\endmulti`
+closes the group. If output format allows multi-columns then
+the text enclosed between `\begmulti <number><space>` and matching
+`\endmulti` should be printed in `<number>` balanced columns.
+
+
+\secc Links
+
+\begitems
+* \.`\url{<text>}` creates `<text>` as an external link which points to `<text>`.
+ The `\<character>` is interpreted as `<character>` in `<text>` with one
+ exception: `\|` is ignored.
+* \.`\ulink[<url>]{<text>}` creates `<text>` as an external link which points
+ to `<url>`. The `\<character>` is interpreted as `<character>` only in
+ `<url>` parameter.
+* \.`\label[<label>]` sets the `<label>`. First following occurence of `\chap`, `\sec`,
+ `\secc`, `\caption` or `\eqmark` sets this `<label>` as bounded to its
+ position in the document.
+* \.`\ref[<label>]` should create an internal link to the position given by
+ `\chap`, `\sec`, `\secc`, `\caption` or `\eqmark`,
+ if `[<label>]` is used as the parameter of this control sequence
+ else if `<label>` is bounded here by previous `\label[<label>]`
+ The visual aspect of the link
+ is not declared by OMLS because we don't suppose that the chapters,
+ sections, equations, etc.\ are automatically numbered by exactly the same way as in
+ \OpTeX/. A recommendation should be: create a simple sequence of numbers over
+ all internal links.
+* \.`\pgref[<label>]` should be replaced by `??` if cnv-program generates single-page
+ output (like Html, Markdown). Unfortunately, we get the irrelevant phrases in the output:
+ \"{\tt The problem is shown at the page ??}".
+ Users can declare `%%:skip` for such cases.
+* \.`\bib[<label>]` or `\bib[<label>]<o-space>=<o-space>{<ignored>}` should open the new bib
+ record. More exactly, it closes previous paragraph (if h-mode is current)
+ and opens new h-mode. Then prints an auto-generated reference number in
+ `[...]`. Following text is interpreted as a bib record until the h-mode ends.
+* \.`\cite[<labels>]` should create internal links to corresponding bib
+ records generated by `\usebib` or by `\bib`. The `<labels>` is a comma-separated list
+ of labels used in `.bib` files or in `\bib` commands to indicate
+ the corresponding bib record. The labels should be replaced by auto-generated
+ reference numbers used in bib records. All reference numbers created by
+ single `\cite` should be enclosed by single `[...]`. These numbers are
+ internal links. If the cnv-program does not implement this complicated
+ bib machinery then `\cite[<labels>]` should print only `[<labels>]`.
+* \.`\rcite[<labels>]` does the same as `\cite[<labels>]` but doesn't print
+ outer `[...]`.
+* \.`\ecite[<label>]{<text>}` creates the link to corresponding bib record,
+ `<text>` is is hyperlinked (no the auto-generated reference number).
+* \.`\maketoc` should create a list of titles from all `\chap`, `\sec` and `\secc`
+ used in the document if they are not preceded by \.`\notoc`. All lines in
+ this list should include internal links to the position where the corresponding title
+ is used.
+\enditems
+
+\secc Tables
+
+\begitems
+* \.`\caption/<letter>` opens a caption. More exactly, if current mode is
+ h-mode, then switch to v-mode first (i.e.\ close the current paragraph).
+ Then switch from v-mode to h-mode and put a <caption-head>. The following
+ text should be interpreted as the caption text until h-mode ends.
+ If <letter> is `t` then <caption-head> is `Table` followed
+ by an auto-generated number. If the <letter> is `f` then <caption-head> is
+ `Figure` followed by an auto-generated number. The configuration of
+ cnv-programs shoud allow different words than default `Table` or `Figure` (for
+ example, if another language is used).
+* \.`\table<ignored>{<declaration>}{<data>}` should create a table. The fidelity
+ rate of created output depends heavily on the used cnv-program and the output
+ format. We don't suppose that all aspects of \OpTeX/ tables are implemented.
+ The following features are listed in their priority of implementation.
+ \begitems \style c
+ * Items in `<data>` are separated by `&`.
+ The last item in each row is separated by end-row separator: \.`\cr`, \.`\crl`, \.`\crll`,
+ \.`\crli`, \.`\crlli`, or \.`\crlp{<list>}`. If there are $n$ columns in
+ the table then we have $n-1$ `&` separators and one end-row separator
+ for each table row.
+ There can be an optional end-row separator at the first item in `<data>` and
+ it should be ignored. The `<data>` can end without the end-row separator, it
+ should be added here.
+ * Spaces around `&` and before end-row separator are ignored.
+ * \.`\noalign{<text>}` and \.`\tskip <dimen>` should be ignored.
+ * Colum declarators in <declaration> should be interpreted: `l` (left aligned), `c` (center
+ aligned), `r` (right aligned) or `p{<ignored>}` (paragraph-like item).
+ * The `<number><letter>` or `<number>{<text>}` should be interpreted as
+ `<number>`-times repeated `<letter>` or `<text>` in `<declaration>`.
+ * \.`\vspan<decimal-number>{<text>}` should be an item with only `<text>`.
+ * \.`\mspan<number>[<decl>]{<text>}` should create `<text>` as an item which
+ spans over `<number>` columns. It is used instead `<number>` real
+ items, i.e.\ `<number>`$-1$ separators `&` aren't used here.
+ * Rules in the table should be interpreted, i.e. `|` in <declaration>
+ should be not ignored and
+ various end-row separators should be distinguished (see \optexmanual,
+ section 1.4.6).
+ * The aligning of `p{<p-data>}` columns should be interpreded by reading
+ \.`\fL`, \.`\fR`, \.`\fC`, \.`\fS` and \.`\fX` control sequences in `<p-data>`.
+ See \optexmanual, section 1.4.6.
+ \enditems
+\enditems
+
+\secc Footnotes, marginal notes
+
+\begitems
+* \.`\fnote{<text>}` should create a footnote link as an auto-generated
+ reference number.
+ The `<text>` should be appended at the end of the document labeled by this
+ reference number. Another alternative (for Html output, for example): the mouse over
+ the reference number riases an auto-popup `<text>`.
+* \.`\fnotemark<number>` should create a pointer to a next declared
+ footnote as auto-generated reference number. The `<text>` of the footnote is
+ declared after that by \.`\fnotetext{<text>}`. Exact behavior: if the
+ reference number of the last processed `\fnote` is $n$ then
+ `\fnotemark<number>` uses the value
+ $n+{}$`<number>` as its reference number. A set of `\fnotemark`s
+ is followed by an equally large set of `\fnotetext{<text>}`. First one
+ have reference number $n+1$, second $n+2$, etc. When whole set of `\fnotetext{<text>}`
+ is processed then $n$ is reset to the last reference number used here.
+* \.`\mnote <ignored>{<text>}` should be created as auto-popup `<text>` or the `<text>`
+ is inserted at the margin.
+\enditems
+
+\secc Tagging for index
+
+We don't suppose that the cnv-program can generate the alphabetically sorted
+index. So, the markup for creating the index should be ignored:
+
+\begitems
+* \.`\ii <word><space>` (where `<word>` is a sequence of non-space characters)
+ should be ignored.
+* \.`\iid <word><space>` is `<word><space>` by default, but
+ if `,` or `.` follows after `<space>` then the `<space>` is removed.
+\enditems
+
+\secc Logos
+
+\.`\TeX`, \.`\LuaTeX`, \.`\OpTeX`, \.`\LaTeX`, respectively \:
+`TeX`, `LuaTeX`, `OpTeX`, `LaTeX`, respectively. If `/` follows
+these control sequences then it is ignored. Other logos should be declared
+in the configuration of the cnv-program.
+
+\secc What should be ignored
+
+\begitems
+* \.`\def<text>{<text>}` and other variants with \.`\gdef`, \.`\edef`, \.`\xdef`.
+ Reason: user can insert a special definition in the `%%:text` part of the
+ document in order to solve a problem. But cnv-program should ignore~it.
+* \.`\outlines{<text>}`, \.`\insertoutline{<text>}` and \.`\thisoutline{<text>}`.
+\enditems
+
+
+\sec[math] Math mode processing
+
+There are two math modes, inline: `$<formula>$` or display: `$$<formula>$$`.
+We suppose that `<formula>` will be processed by MathJax or similar
+software. So, the `<formula>` should be kept without changes in cnv-program
+output, but there are exceptions:
+
+\begitems
+* `$<sign><decimal-number>$` should be transformed to non-math text
+ `<sign><decimal-number>`. The `<sign>` is~`+` or~`-` or nothing.
+ The `<decimal-number>` can include `,` (comma) instead `.` (period).
+ If the `<sign>` is~`-` (character U+002D) then
+ it must be converted to `−` (character U+2212, math minus).
+* `{\bbchar <text>}` should be converted to `\mathbb{<text>}`, because
+ MathJax doesn't understand `\bbchar`. `$\bbchar <text>$` should be
+ converted to `$\mathbb{<text>}$`.
+* `{\frak <text>}` or `$\frak <text>$` \:
+ `\mathfrak{<text>}` or `$\mathfrak{<text>}$`.
+* `{\script <text>}` or `$\script <text>$` \:
+ `\mathscr{<text>}` or `$\mathscr{<text>}$`.
+* `\eqmark`, `\eqmark[<label>]` \: `\leqno (<num>)`, where `<num>` is
+ auto-generated number. Or it should be completely ignored.
+* It is strongly recommended to allow users to declare another replacement
+ rules over `<formula>` in configuration files of cnv-programs.
+\enditems
+
+
+\sec Notes on various conversions
+
+The cnv-programs behave differently because output formats have different
+concepts and are intended for different purposes. The following sections
+mention the main differences for typical conversions.
+
+\secc To Html
+
+The Html document is one single page. If we want to split the document to more
+pages, then we can use `%%:do html <action>` in positions where the document
+should be split (the syntax of `<action>` depends on the used cnv-program.)
+
+The design of Html pages should be declared by CSS files.
+
+Pictures inserted by `\inspic` should be inserted into the Html page as
+\code{<img src="...">}, so the picture files must be installed in
+the webserver to render the Html page correctly in a web browser.
+
+The `\maketoc` used in the \OpTeX/ document means that the Table of contents should
+be here. It should be generated by the cnv-program, two-pass processing is
+needed because the cnv-program needs to read all titles of `\chap`, `\sec` and
+`\secc`. Another approach is to read the `.ref` file produced by \OpTeX/.
+
+
+\secc To Markdown
+
+Markdown source file is \"one-page document" too. The principles a
+re similar to conversion to Html.
+
+\secc From Markdown
+
+The cnv-program which does such a reverse conversion should be very useful for
+people they prefer even clearer markup than in \OpTeX/.
+
+\secc To \LaTeX
+
+\LaTeX/ gives the same main feature as \OpTeX/: it can generate PDF
+output from a source file. But different macros, a different concept, and
+a different markup are used.
+
+The main reason for such conversion is that journal editors
+require \LaTeX/ source file, but user want to prepare their real document in
+more comfortable (\OpTeX/) markup and with more simple macros.
+
+This conversion should keep almost all features. For example, the
+`\pgref[<label>]` is converted to `\pageref{<label>}`. The cnv-program
+needs not to generate a Table of contents, bibliography references, etc. Only
+appropriate \LaTeX/ markup must be used.
+
+The contents of generated \LaTeX/ preamble should be configurable.
+
+
+\secc From \LaTeX
+
+The reverse conversion from \LaTeX/ to \OpTeX/ can be usable
+for people, they want to switch to creating their documents in \OpTeX/.
+
+The cnv-program must solve additional problem in this type of conversion.
+There are various math \LaTeX/ environments, they must be converted to
+plain~\TeX/ syntax of math typesetting. For example:\nl
+`\begin{array}...\end{array}` \: `\matrix{...}`,\nl
+`\begin{align*}...\end{align*}` \: `$$\eqalign{...}$$`\nl
+`\frac{...}{...}` \: `{...\over...}`.
+
+\bye
diff --git a/macros/optex/doc/optex-doc.pdf b/macros/optex/doc/optex-doc.pdf
new file mode 100644
index 0000000000..a4df4f013a
--- /dev/null
+++ b/macros/optex/doc/optex-doc.pdf
Binary files differ
diff --git a/macros/optex/doc/optex-doc.tex b/macros/optex/doc/optex-doc.tex
new file mode 100644
index 0000000000..9f2fadeeb4
--- /dev/null
+++ b/macros/optex/doc/optex-doc.tex
@@ -0,0 +1,114 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+% Run optex optex-doc
+% (three times) to generate OpTeX documentation including references and the index.
+
+\load [doc.opm] \let\enddocument=\endinput
+
+\typosize[10/12] % Main size (used in techdoc)
+
+\begingroup \typosize [11/13.5] % Different size used in useroc.
+
+\insertoutline{OpTeX} % PDF outlines generated from TOC
+
+% Title:
+
+\vglue1cm
+\centerline{\setfontsize{at50pt}\rm\OpTeX}
+\vskip-8mm
+
+\tit Format Based on Plain \TeX/ and OPmac\fnotemark1
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\hfill Version 1.01
+
+\centerline{\it Petr Olšák, 2020, 2021}
+
+\bigskip
+\centerline{\url{http://petr.olsak.net/optex}}
+
+\fnotetext {OPmac package is a set of simple additional macros to Plain \TeX{}.
+It enables users to take advantage of \LaTeX/ functionality but keeps
+Plain \TeX/ simplicity. See
+\url{http://petr.olsak.net/opmac-e.html} for more information about it.}
+
+\bigskip
+\noindent
+\OpTeX/ is \LuaTeX/ format with Plain \TeX/ and OPmac. Only \LuaTeX/ engine
+is supported.
+
+\OpTeX/ should be a modern Plain \TeX/ with power from OPmac (Fonts
+Selection System, colors, graphics, references, hyperlinks,
+indexing, bibliography, ...) with preferred Unicode fonts.
+
+The main goal of \OpTeX/ is:
+
+\begitems
+* \OpTeX/ keeps the simplicity (like in Plain \TeX/ and OPmac macros).
+* There is no old obscurities concerning various 8-bit encodings and
+ various engines.
+* \OpTeX/ provides a powerful Fonts Selection System (for Unicode font
+ families, of course).
+* \OpTeX/ supports hyphenations of all languages installed in your \TeX/ system.
+* All features from OPmac macros are copied. For example sorting words in
+ the Index\fnotemark1, reading `.bib` files directly\fnotemark1, syntax
+ highlighting\fnotemark1, colors, graphics, hyperlinks, references).
+ \fnotetext{All these features are implemented by \TeX/ macros, no external
+ program is needed.}
+* Macros are documented in the same place where code is.
+* User namespace of control sequences is separated from the internal namespace
+ of \OpTeX/ and primitives (`\foo` versus `\_foo`).
+ The namespaces for macro writers are designed too.
+\enditems
+
+If you need to customize your document or you need to use something
+very specific, then you can copy relevant parts of \OpTeX/ macros into your macro
+file and do changes to these macros here. This is a significant difference from
+\LaTeX/ or ConTeXt, which is an attempt to create a new user level with a
+plenty of non-primitive parameters and syntax hiding \TeX/ internals.
+The macros from \OpTeX/ are simple and straightforward because they solve only
+what is explicitly needed, they do not create a new user level for
+controlling your document. We are using \TeX/ directly in this case.
+You can use \OpTeX/ macros, understand them, and modify them.
+
+\OpTeX/ offers a markup language for authors of texts (like \LaTeX),
+i.\,e.\ the fixed set of tags to define the structure of the document. This
+markup is different from the \LaTeX{} markup. It may offer to write the
+source text of the document somewhat clearer and more attractive.
+
+The manual includes two parts: user documentation and technical
+documentation. The second part is generated directly from the sources of
+\OpTeX/. There are many hyperlinks from one part to second and vice versa.
+
+This manual describes \OpTeX/ features only. We suppose that the user knows \TeX/
+basics. They are described in many books. You can see a short
+document \ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf]
+{\TeX/ in nutshell} too.
+
+\vfil\break
+
+\insertoutline{CONTENTS} \outlines{0}
+
+\notoc\nonum \sec Contents
+\maketoc
+
+\thisoutline {USER DOCUMENTATION}
+
+\chap User documentation
+
+\input optex-userdoc
+\endgroup
+
+%\end
+
+\input optex-techdoc
+
+\vfil\break
+
+\def\_printchap#1{\noindent{\_printrefnum[@]\_secfont #1}\medskip}
+
+\nonum\chap Index
+
+\begmulti 3 \tt \makeindex \endmulti
+
+\bye
diff --git a/macros/optex/doc/optex-math.tex b/macros/optex/doc/optex-math.tex
new file mode 100644
index 0000000000..789dd5a187
--- /dev/null
+++ b/macros/optex/doc/optex-math.tex
@@ -0,0 +1,1662 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+% Run optex optex-math (two times) to generate this document
+% or look at PDF here: http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf
+
+\fontfam[lmfonts]
+
+\font\ttlib=[LiberationMono-Regular]
+\def\ttspec{\let\_ttfont=\ttlib}
+
+\report
+
+\def\new #1 {\mnote{\Red$\blacktriangleleft$\,\sans\setfontsize{at9pt}\rm#1}}
+\fixmnotes\right
+\enquotes
+\verbchar`
+\catcode`\<=13
+\def<#1>{$\langle\hbox{\it#1\/}\rangle$}
+\everyintt={\catcode`\<=13 }
+\def\ss#1{$\vrule height3pt#1\vrule height3pt$}
+
+\addto\_secfont\Blue \addto\_seccfont\Blue
+\_def\_printsec#1{\_par
+ \_abovetitle{\_penalty-400}\_bigskip
+ {{\_secfont \_noindent \_raggedright \llap{\_printrefnum[@\_quad]}#1}\_nbpar}\_insertmark{#1}%
+ \_nobreak \_belowtitle{\_medskip}%
+ \_firstnoindent
+}
+\_def\_printsecc#1{\_par
+ \_abovetitle{\_penalty-200}\_medskip
+ {{\_seccfont \_noindent \_raggedright \llap{\_printrefnum[@\_quad]}#1}\_nbpar}%
+ \_nobreak \_belowtitle{\_medskip}%
+ \_firstnoindent
+}
+
+\def\i #1 {\ii .#1 \iis .#1 {{\code{\\#1}}}}
+\def\x`{\bgroup\_setverb\xx}
+\bgroup \lccode\string`\.=\string`\` \lowercase{\egroup \def\xx #1#2.{\i #2 \egroup `#1#2.}}
+
+
+\hyperlinks\Green\Green
+
+\insertoutline{MATH}
+\outlines{0}
+
+
+
+\tit Typesetting Math with \OpTeX/
+
+\hfill Version 03, January 2021
+
+\author Petr Olšák
+
+
+This document is a brief summary of typesetting math. It describes \TeX/,
+Plain \TeX/ and \OpTeX/ features concerned to math. The first two types of
+features are documented in \TeX/book in chapters 16, 17, and 18, but it is
+summarized here in short again in order to give a complete guide about math
+typesetting for \OpTeX/ users.
+
+\new {}
+The \OpTeX/ features which differs from standard \TeX/ or Plain \TeX/ are
+documented with the red triangle at the margin (like in this paragraph).
+Reader can simply distinguish between \"standard" features (given by
+\TeX/ or Plain \TeX/) and new \OpTeX/ features.
+
+There are more types of extensions: e\TeX, lua\TeX/, Unicode math and
+\OpTeX/ macros. The appropriate label (e\TeX, Lua\TeX/, Unicode, \OpTeX/)
+is appended to the red triangle to inform you about the extension type.
+Nevertheless, \OpTeX/ user doesn't have to worry about it, all extensions
+are available if Unicode Math font is loaded (e.g., by the command
+`\fonfam[lmfonts]`). See section 1.3.3 in \OpTeX/ documentation about
+loading Unicode math fonts.
+
+{\iindent=2em
+\bigskip
+\maketoc }
+\vfil\break
+
+\sec Basics structure of math formulas
+
+\secc General rules and terminology
+
+The \ii in-line/math in-line math (in the paragraph) is created by `$<math list>$`. The
+\ii display/math display math (a standalone line between paragraphs) is created by `$$<math list>$$`.
+More than one line can be here if an appropriate macro is used. In-line math is
+processed in a \TeX/ group in \ii in-line/math/mode {\em in-line math mode}. The display math is
+processed in a \TeX/ group in \ii display/math/mode {\em display math mode}. Spaces are
+ignored in math modes, so `$x+y$` and `$x + y$` gives the same result: $x+y$.
+
+The \ii math/list <math list> is a sequence of \ii math/atom,atom {\em math atoms} and
+\ii other/material {\em other material}.
+The math atoms are \ii single/math/object {\em single math objects} or
+\ii composed/math/atom composed math atoms.
+
+\begitems \hfuzz=.6pt
+* The single math object is a single character to be printed in math mode
+ like `x`, `+`, `\int`.
+* The math atom is constructed in general by `{<math list 1>}^{<math list 2>}_{<math list 3>}`.
+ It consists from \ii nucleus {\em nucleus} <math list 1>, \ii exponent exponent <math list 2>
+ and \ii subscript subscript <math list 3>. Each part of the atom should be empty.
+ If <math list 2> or <math list 3> is empty, we need not to write brackets and
+ the prefix `^` or `_`.
+ If the <math list 1> or <math list 2> or <math list 3>
+ consist only from a single math object then we need not use brackets.
+ For example
+ `x^2` is a math atom with `x` in the nucleus, `2` in the exponent, and with empty subscript.
+ Or `a_{i,j}` is a math atom with `a` in the nucleus, empty exponent, and `i,j` in the subscript.%
+ \fnote{In \OpTeX/, the character `_` can be interpreted as a part of
+ the control sequence name, not as the subscript constructor. But in common cases,
+ constructions of math atoms are interpreted exactly as in plain \TeX. See sections
+ 2.2.2 and 2.14 of \OpTeX/ documentation for more details. If you want to
+ be sure that `_` is just a subscript constructor in \OpTeX/ then you can set \code{\\catcode`\\_=8}
+ but after this, you cannot use control sequences with `_` character.}
+ The constructors for exponent `^` and subscript `_` can be used in arbitrary order
+ after the nucleus, for example, `z_1^{x+y}` is the same math atom as
+ `z^{x+y}_1`. The single math objects not followed by `^` nor `_` are
+ considered as math atoms with this object in the nucleus and with empty
+ exponent and subscript (this is a very common case).
+ \TeX/ assigns the \ii class {\em class} for each math atom, see section~\ref[class].
+* Other material can be \TeX/ box or glue (space) or `\kern` or `\vrule` etc.
+\enditems
+
+Example: The `Z = \int``_\Omega x^{2y} + z\, dx` generates
+$Z = \int_\Omega x^{2y} + z\, dx$ and it is <math list> which consists from:
+
+\begitems
+* `Z` is math atom with empty exponent and subscript, class: Ord,
+* `=` is math atom with empty exponent and subscript, class: Rel,
+* `\int``_\Omega` is math atom with empty exponent and with subscript `\Omega`, class: Op,
+* `x^{2y}` is math atom with exponent `2y` and empty subscript, class: Ord,
+ \begitems \let\_bullet=\circ
+ * `2` is math atom with empty exponent and subscript, class: Ord,
+ * `y` is math atom with empty exponent and subscript, class: Ord,
+ \enditems
+* `+` is math atom with empty exponent and subscript, class: Bin,
+* `z` is math atom with empty exponent and subscript, class: Ord,
+* `\,` is another material, the glue (space) in this case,
+* `d` is math atom with empty exponent and subscript, class: Ord,
+* `x` is math atom with empty exponent and subscript, class: Ord.
+\enditems
+
+\secc[class] Classes of math atoms
+
+\TeX/ assigns \ii class {\em a class} for each math atom.\fnote
+{Using terminology of \TeX/book, each single math object has its {\em class} but the
+ math atom has its {\em kind} derived from this class. I use only one word
+ for both meanings in this document.}
+This data type is used when
+\TeX/ decides about \ii horizontal/spacing horizontal spaces between atoms in the output. (Note
+that spaces in the input are ignored.) For example,
+`$xy$` prints two atoms without space between them but `$x+y$` is printed with
+small spaces around the `+` binary operator. Compare: $xy$ and $x+y$.
+
+The class is assigned depending on the nucleus of the atom. If the nucleus is
+not a single math object, i.e. it is constructed by `{<math list>}` with braces
+then the atom has its class Ord. If the nucleus is a single math object constructed
+without braces then the class of the atom depends on this single math
+object. Each single math object must be declared in \TeX/ with its default
+class. The following table lists the classes with typical examples.
+The full set of all math objects used in math typesetting
+is listed in section~\ref[objects] with their default classes.
+
+\bigskip
+\noindent\hfil\table{llll}{
+ & \ii class Class & Meaning & Example \crl
+ 0 & \iid Ord & ordinary object & variables, digits, $x, {\bbchar R}, \Gamma, 0, 1$ \cr
+ 1 & \iid Op & big opertator & $\sum, \int, \bigcup$ \cr
+ 2 & \iid Bin & binary operator & $+, \times, -, \pm, \cup$ \cr
+ 3 & \iid Rel & reations & $=, \ne, \leq, \supseteq, \succsim$ \cr
+ 4 & \iid Open & opening bracket & $\{, (, [, \langle$ \cr
+ 5 & \iid Close & closing bracket & $\}, ), ], \rangle$ \cr
+ 6 & \iid Punct & punctuation & comma \cr
+ & \iid Inner & left-right & \code{\\left...\\right} outputs, see section~\ref[delims]
+}
+\bigskip
+
+There are \ii horizontal/spacing,spacing three space types used
+by the algorithm for horizontal spacing in the math formulas.
+
+\begitems
+* \ii thin/space Thin space: \x`\thinmuskip` primitive register, `\,` macro. Used around Op atoms.
+* \ii medium/space Medium space: \x`\medmuskip` primitive register, `\>` macro. Used around Bin atoms.
+* \ii thick/space Thick space: \x`\thickmusip` primitive register, `\;` macro. Used around Rel atoms.
+\enditems
+
+\puttext 7.8cm -3.7cm {\rotbox{90}{Left atom}}
+\puttext 11.5cm -.5cm {Right atom}
+\puttext 8.2cm -4.4cm {\typosize[9/11]
+\thistable{\def\_enspace{ }}%
+\table {l|8c|} {
+ \omit & Ord & Op & Bin & Rel & Open & Close & Punct & \omit \hfil Inner \crlp{2-9}
+ Ord & 0 & 1 & 2 & 3 & 0 & 0 & 0 & 1 \cr
+ Op & 1 & 1 & & 3 & 0 & 0 & 0 & 1 \cr
+ Bin & 2 & 2 & & & 2 & & & 2 \cr
+ Rel & 3 & 3 & & 0 & 3 & 0 & 0 & 3 \cr
+ Open & 0 & 0 & & 0 & 0 & 0 & 0 & 0 \cr
+ Close & 0 & 1 & 2 & 3 & 0 & 0 & 0 & 1 \cr
+ Punct & 1 & 1 & & 1 & 1 & 1 & 1 & 1 \cr
+ Inner & 1 & 1 & 2 & 3 & 1 & 0 & 1 & 1 \crlp{2-9}
+}}
+
+\hangindent=-8.7cm \hangafter=0
+Ord atoms are printed without spaces between them. The spaces are not
+cumulated, so the rule about spaces mentioned above is only a rough idea.
+The exact rule for horizontal spaces is given for each pairs of atoms
+in the table here. The symbol 0 means no space, 1 thin space, 2 medium space,
+and 3 means thick space.
+
+\hangindent=-8.7cm \hangafter-2
+The Bin atom is automatically transformed to the
+Ord atom if no atom precedes or if Op, Bin, Rel, Open, or Punct atom
+precedes. And it is transformed to the Ord atom if Rel, Close or Punct atom
+follows. This corresponds to the empty cells in the table.
+Why such behavior? Compare \"\hbox{$0-3$}" and \"$-3$". The Bin atom in
+the second case behaves like Ord atom because it is \ii unary/minus {\em unary minus}.
+There is no space between the unary minus and the following object.
+
+All medium spaces and thick spaces and some thin spaces from this table are
+omitted if the <math list> is processed in
+\ii script/style,scriptscript/style script or scriptscript styles
+(smaller size). See section~\ref[styles] about math styles.
+
+You can overwrite the default class derived from the nucleus of the atom by
+\TeX/ primitives \x`\mathord`, \x`\mathop`, \x`\mathbin`, \x`\mathrel`, \x`\mathopen`,
+\x`\mathclose`, \x`\mathpunct` and \x`\mathinner`. They can precede a nucleus of
+the atom and they set the class of the atom.
+For example, `x \mathrel+ y` behaves like `x = y` from a spacing point of view but +
+is printed. Another example: `\mathop{\rm lim} z` creates the atom `lim` in
+roman font of class Op. So, the thin space is inserted between lim and $z$.
+
+There are more special kinds of math atoms: fractions, math accents,
+radicals. They are constructed in a special way (see next sections) but they behave
+like Ord atom in the horizontal spacing algorithm.
+
+\secc[styles] Math styles
+
+When a formula (or a sub-formula) is processed by \TeX/ then one from four
+\ii math/style,display/style,text/style,script/style,scriptscript/style
+styles is active: display style ($D$), text style ($T$), script style ($S$) or
+scriptscript style ($SS$).
+
+\ii T/style,D/style,S/style,SS/style The $T$ style is started in in-line math mode `$...$` and the $D$
+style is started in display math mode `$$...$$`. The first level of exponents or
+subscripts is processed in $S$ style and the second and more levels of
+exponents or indexes are processed in $SS$ style.
+There are special rules for math styles when fractions are constructed, see
+section~\ref[frac].
+
+The $D$ and $T$ styles use basic \ii font/size font size, $S$ uses smaller font size (typically
+70~\%) and $SS$ style uses more smaller font size (typically 50~\%). Next
+levels of \"more smaller fonts" are not used due to classical typographic rules.
+
+The \ii nucleus nucleus of \iid Op atoms (big operators, $\sum$, $\int$, etc.) have typically bigger versions
+of the character shape for $D$ style than for $T$ style.
+So, there are four sizes for such math
+objects: one size for each math style. All other math objects (with non Op
+class) are printed only in three sizes: The sizes for $T$ and $D$ styles are equal.
+
+The \iid Op atom puts its \iid exponent and \iid subscript above and below the nucleus in $D$
+style but right to the nucleus in other styles:
+$$
+ `\sum``_{i=1}^\infty` \quad \hbox{gives}\quad \sum_{i=1}^\infty \hbox{ in $D$ style and}
+ \quad \textstyle \sum_{i=1}^\infty \hbox{ in $T$ style}.
+$$
+This default behavior of the Op atom
+can be modified by placing \x`\limits` or \x`\nolimits` or
+\x`\displaylimits` \TeX/ primitive just after its nucleus before the constructors
+of exponent and/or index. The `\nolimits` puts exponent and subscript right
+to the nucleus (regardless of the current style) and `\limits` puts these
+objects above and below the nucleus (regardless of the current style). There
+can be more such primitives in a queue (due to a macro expansion, for
+instance). Then the last primitive in the queue wins.
+If the last primitive is \x`\displaylimits` then
+the default behavior is processed regardless there are \x`\limits` or \x`\nolimits`
+before it.
+$$
+ `\sum\nolimits``_{i=1}^\infty` \quad \hbox{gives}\quad \sum\nolimits_{i=1}^\infty
+ \hbox{ in $D$ style and}\quad \textstyle\sum\nolimits_{i=1}^\infty
+ \hbox{ in $T$ style}.
+$$
+Atoms of all other classes have their exponents and/or subscripts only right
+to their nucleus without any exception.
+
+The primitives \x`\displaystyle`, \x`\textstyle`, \x`\scriptstyle` and
+\x`\scriptscriptstyle` set the given style regardless the default rules. For
+example, you can create a formula in in-line math mode and in $D$ style by
+`$\displaystyle <fomula>$` or a formula in display mode and $T$ style can be printed
+by `$$\textstyle <fomrula>$$`.
+
+If a subformula is placed below something (below a line from root symbol,
+below a fraction line), then the processed style $D, T, S$ or $SS$ is
+\ii cramped/style {\em cramped}.
+The exponents are positioned slightly lower than in
+\ii non-cramped/style non-cramped style. The selectors `\displaystyle`\,\dots
+`\scriptscriptstyle` mentioned above select non-cramped style. The
+non-cramped style is selected when math mode starts too.
+\new \OpTeX/
+You can select a cramped style by the macro \x`\cramped` at the start of the
+math formula or after the math-style selectors: `\scriptstyle\cramped` for
+example.
+
+Several macros need to know what math style is currently processed (for
+example they need to draw something in an appropriate size). But it
+not possible simply due to the syntax of fractions (section~\ref[frac]).
+This syntax requires to process all math lists in two steps: the first step
+expands all macros and creates structured data of processed math list. The
+second step reads the output of the first step, switches between math
+styles and creates definitive output. So, macros (working in the first step)
+cannot know the current math
+style because it is set only in the second step. \TeX/ supports the primitive
+\x`\matchchioce``{<D>}{<T>}{<S>}{<SS>}` which prepares four math lists in the
+first step and only one of these four lists are used in the second step. We
+can put different macros into each of the four parameters of `\mathchoice`.
+Plain \TeX/ supports the macro \x`\mathpalette` which gives a more comfortable
+interface of \x`\mathchoice` to the macro programmer.
+The cramped/non-cramped variants of the current style are kept when `\mathchioce`
+is used.
+
+\new \OpTeX/
+We describe another interface for creating macros depending on the current
+style. You can use \x`\mathstyles``{<math list>}`. It
+behaves like `{<math list>}`, moreover, you can use the following commands inside such
+<math list>:
+\begitems
+* The macro \x`\currstyle`. It expands to
+ `\displaystyle`, `\textstyle`,
+ `\scriptstyle` or `\scriptscriptstyle` depending on the current math style
+ when the `\mathstyles` was opened.
+* The \x`\dobystyle``{<D>}{<T>}{<S>}{<SS>}` is expandable macro. It expands its
+ parameter `<D>`, `<T>`, `<S>` or `<SS>` depending on the current math style
+ when `\mathstyles` was opened.
+* The value of the \x`\stylenum` register is 0, 1, 2 or 3
+ depending on the current math style when `\mathstyles` was opened.
+\enditems
+%
+Example of usage of \x`\mathstyles`:
+\def\mysymbol{\mathbin\mathstyles
+ {\kern1pt\vrule height\mysymbolA width\mysymbolA\kern1pt}}
+\def\mysymbolA{\dobystyle{5pt}{5pt}{3.5pt}{2.5pt}}
+\begtt
+\def\mysymbol{\mathbin\mathstyles
+ {\kern1pt\vrule height\mysymbolA width\mysymbolA\kern1pt}}
+\def\mysymbolA{\dobystyle{5pt}{5pt}{3.5pt}{2.5pt}}
+Test: $a\mysymbol b_{c \mysymbol d}$ or $a\mysymbol b\over c$.
+\endtt
+This example gives Test: $a\mysymbol b_{c \mysymbol d}$ or $a\mysymbol b\over c$.
+
+The \x`\mathstyles` macro mentioned above uses \TeX/ primitive \x`\mathchoice`, so it
+creates four math lists and only one is used. It may take more
+computer time in special cases.
+\new Lua\TeX/
+Lua\TeX/ supports the \x`\mathstyle` primitive
+(no \"`s`" at the end of this control sequence) which
+expands to values 0 to 7 depending on the current style:
+$D, D', T, T', S, S', SS, SS'$
+(where $X'$ means cramped variant of the style). This primitive does
+not use `\mathchoice` but it simply ignores the fraction syntax, so
+`$a\mysymbol b\over c$` cannot work if `\mysymbol` is defined using the `\mathstyle`
+primitive. See section 7.3.1 of Lua\TeX/ documentation for more information.
+
+
+\secc[frac] Fractions
+
+The \iid fraction can be constructed by `{<numerator>`\x`\over``<denominator>}`. If the
+fraction is only a single object in the whole math mode (between dollars),
+you need not use the outer braces, so you can write `$1\over2$` to get $1\over2$.
+
+The \ii numerator,denominator <numerator> and <denominator> are printed in \"smaller" math style than
+current math style. More exactly the following schema is used.
+$D$: $T\over T$., $T$: $S\over S$, $S$: $SS\over SS$, $SS$: $SS\over SS$.
+For example
+$$
+ `{a+b \over c}` \quad \hbox{is printed as }
+ {a+b\over c} \hbox{ in $D$ style and as }
+ \textstyle {a+b\over c} \hbox{ in $T$ style}.
+$$
+
+The \LaTeX/ macro \x`\frac``{<numerator>}{<denominator>}` is not supported in
+Plain \TeX/ nor in \OpTeX/ but you can define such macro if you want.
+
+The syntax with \x`\over` is more preferred because it is more human-readable
+notation. You can write the fraction in the same manner as you can read it.
+You can compare: `$1\over2$` (one over two) with `$\frac12$` (frac twelve).
+
+Besides the `\over` primitive, there are analogical \TeX/ primitives which
+create \"generalized" fractions. The result is similar to `{<above>\over <below>}`
+but there is something extra:
+
+\begitems
+* `{<above>`\x`\atop``<below>}` does `{<above>\over<below>}` but
+ without the fractional rule.
+* `{<above>`\x`\above``<dimen><below>}` creates fractional rule with <dimen> thickness.
+* `{<above>`\x`\overwithdelims``<delim-l><delim-r><below>}` adds the <delim-l> left to
+ the fraction and the <delim-r> right to the fraction.
+* `{<above>`\x`\atopwithdelims``<delim-l><delim-r><below>}` is analogical to
+ `\overwithdelims` but without fractional rule.
+* `{<above>`\x`\abovewithdelims``<delim-l><delim-r><dimen><below>}` behaves as
+ `\overwithdelims` but the fractional rule has <dimen> thickness.
+\enditems
+%
+The `\...withdelims` variants read <delim-l> and <delim-r>, they must be
+declared as {\em math delimiter} in \TeX. They are vertically scalable
+math objects, typically brackets. See section~\ref[delims] for more
+information about math delimiters. Example:
+$$
+ `{n \atopwithdelims() k}`\quad \hbox{ creates }
+ {n \choose k} \hbox{ in $D$ style and }
+ \textstyle {n \choose k} \hbox{ in $T$ style}.
+$$
+The \x`\choose` macro is defined by `\def\choose{\atopwithdelims()}`, so the
+user can write `{n\choose k}` in order to get binomial coefficients.
+
+
+\secc[delims] Vertically scalable objects: math delimiters
+
+The vertically scalable objects are called \ii delimiters {\em delimiters}. For example,
+all types of brackets are declared as delimiters.
+This means that you can use a bracket in arbitrary
+vertical size.\fnote{
+This is not exactly true, because traditional typography says that they
+cannot be scaled continuously but by visible steps. This means that there is
+a sequence of increasing brackets in the font, the reader must see a difference
+between every two sizes of brackets.}
+
+The following objects are declared as delimiters (i.e.\ vertically scalable):
+
+\bigskip
+{\tt \adef!{\bslash}
+\table{l 14c}{
+ \rm source: & ( & ) & [ & ] & \code{\\\{} & \code{\\\}} & /
+ & !backslash & !langle & !rangle
+ & | & \code{\\|} & \cr
+ \rm output: &$($&$)$&$[$&$]$& $\{$ & $\}$ & $/$
+ & $\backslash$ & $\langle$ & $\rangle$
+ & $|$ & $\|$
+}
+\medskip
+\table{l 14c}{
+ \rm source: & !lfloor & !rfloor & !lceil & !rceil \cr
+ \rm output: & $\lfloor$ & $\rfloor$ & $\lceil$ & $\rceil$
+}
+\medskip
+\table{l 14c}{
+ \rm source: & !uparrow & !Uparrow & !dowarrow & !Downarrow
+ & !updownarrow & !Updownarrow \cr
+ \rm output: & $\uparrow$ & $\Uparrow$ & $\downarrow$ & $\Downarrow$
+ & $\updownarrow$ & $\Updownarrow$
+}}
+\bigskip
+\noindent \new Unicode
+If you can produce the characters $\langle$, $\rangle$,\fnote
+ {Do not confuse $\string<, >$ and $\langle, \rangle$. The first pair are Rel atoms
+ with meaning \"less than" or \"greater than", but the second pair are special
+ types of brackets. They are not directly available at computer keyboards without
+ using a keyboard macro.}
+$\lfloor$, $\rfloor$, ... $\updownarrow$, $\Updownarrow$
+directly in your text editor then you can use these Unicode characters in your source instead of control
+sequences `\langle`, `\rangle`, `\lfloor`, `\rfloor` ... `\updownarrow`, `\Updownarrow`.
+For many users (including me), there is more simple to type `\lfloor` than to find
+how to create the $\lfloor$ character in my text editor. Note that there exist
+text editors (Emacs, for example)
+enabling you to type `\lfloor` and this control sequence is immediately
+converted to the $\lfloor$ Unicode character.
+Your source text looks pretty and you can use classical \TeX/ sequences.
+
+\new Unicode
+There are more \ii delimiters delimiters, but it heavily depends on loaded Unicode Math
+font. For example, this document is printed in `latinmodern-math` font and
+there are six more delimiters `\lBrack`~$\lBrack$, `\rBrack`~$\rBrack$,
+`\lAngle` $\lAngle$, `\rAngle` $\rAngle$, `\lgroup` $\lgroup$, `\rgroup` $\rgroup$.
+See section~\ref[objects] for table of all Unicode symbols for math typesetting.
+
+Arbitrary tall formula can be surrounded by a pair of delimiters using
+\x`\left` and \x`\right` \TeX/ primitives: `\left<delim> <formula> \right<delim>`.
+The delimiters are scaled to the height and depth of the <formula>
+and vertically centered to the {\em math axis}.\fnote
+{Math axis is a horizontal line passing through the center of symbols $+$
+ and $-$. All vertically scalable objects are vertically centered with
+ respect to this axis.}
+Example:
+$$
+ `+ \left\{ \sum_{i=1}^\infty x_i \right)` \quad \hbox{ gives }
+ + \left\{ \sum_{i=1}^\infty x_i \right).
+$$
+The pair `\left<delim> <formula> \right<delim>` creates the formula in a
+\TeX/ group. Such group can be nested with another groups.
+Each `\left` must have its `\right` counterpart at the same group level.
+If you don't want to create visible delimiter, use dot instead <delim>.
+Example:
+$$
+ `\left. \int``_0^t e^{x^2}\,dx\, \right|_{t=42}` \quad \hbox{ gives }
+ \left. \int_0^t e^{x^2} \,dx\, \right|_{t=42}
+$$
+
+\new e\TeX/
+You can use \x`\middle``<delim>` inside the <formula> which is surrounded by
+`\left...\right`. Then the given <delim> is scaled to the same size like
+their `\left` and `\right` counterparts.
+
+When a delimiter is used without `\left` nor `\right` prefix, then it is the
+Open, Close, Ord or Bin atom by its natural meaning:
+$(, [, \{, \ldots, \lfloor, \lceil$ are Open atoms,
+$], ], \}, \ldots, \rfloor, \rceil$ are Close atoms,
+$/, \backslash, |, \|$ are Ord atoms and
+$\uparrow, \Uparrow, \ldots, \Updownarrow$ are Bin atoms. You can overwrite
+this default setting, for example `\mathclose(`. If delimiters are used with
+`\left` and `\right` prefixes then `\left<delim>` behaves like Open atom,
+`\right<delim>` behaves like Close atom and the math list
+`\left<delim><formula>\right<delim>` is encapsulated as a single Inner atom.
+The `\middle<delim>` behaves like Open atom at its left side and like Close
+atom at its right side.
+
+The sequence of increasing delimiters can be printed by the following
+macros:
+$$
+ `(` \to (,\quad \x`\big``(` \to \big(,\quad \x`\Big``(` \to \Big(,\quad
+ \x`\bigg``(` \to \bigg(, \quad \x`\Bigg``(` \to \Bigg(.
+$$
+The `\Bigg<delim>` is not the maximal size of the bracket. Try
+`\left(\vbox to5cm{}\right.`, for example. You can see that the font
+\"cheats" from certain sizes, because there are not all infinity number of
+sizes of brackets drawn in the font, of course.
+
+The `\big<delim>` creates Ord atom. We need to create Open atom
+for opening bracket and Close atom for closing bracket more often.
+Then we can use macros
+\x`\bigl``<delim>`,
+\x`\Bigl``<delim>`,
+\x`\biggl``<delim>`,
+\x`\Biggl``<delim>` for creating Open atoms and
+\x`\bigr``<delim>`,
+\x`\Bigr``<delim>`,
+\x`\biggr``<delim>`,
+\x`\Biggr``<delim>` for creating Close atoms. Unfortunately, the source is not
+too attractive when more sizes of brackets are used, but typographic
+traditions say that we have to distinguish brackets by the size in math
+mode if they are in equal types:
+$$
+ `\Bigl( f\bigl( 2(x+y) + z\bigr) \Bigr)'` \quad \hbox{gives }
+ \Bigl(f\bigl(2(x+y)+z\bigr)\Bigr)'.
+$$
+
+\secc Horizontally scalable objects: math accents
+
+Arbitrary wide formula can be covered by \ii math/accent,accent {\em scalable math accent}.
+Example:
+$$
+ \x`\overrightarrow`` {a+b+c+d+e+f}` \quad \hbox{gives } \overrightarrow {a+b+c+d+e+f}.
+$$
+The usage is: control sequence of selected math accent followed by `{<math list>}`.
+
+Standard scalable math accents are:
+\x`\overline` $\overline{abc}$,
+\x`\overbrace` $\overbrace{abc}$,
+\x`\overrightarrow` $\overrightarrow{abc}$,
+\x`\overleftarrow`~$\overleftarrow{abc}$,
+\x`\underline` $\underline{abc}$,
+\x`\underbrace` $\underbrace{abc}$.
+
+An Op atom is created. The exponents and subscripts are centered above
+and below the nucleus of this atom (regardless of the current style). Example:
+$$
+ `\overbrace {b\cdot b\cdot b \cdots b}^{k\times}` \quad \hbox{gives }
+ \overbrace {b\cdot b\cdot b \cdots b}^{k\times}
+$$
+There are scalable accents with a limited maximum width:
+\x`\widehat` $\widehat{abc}$ and \x`\widetilde` $\widetilde{abc}$. If the
+formula is wider than the font can cover then the widest variant from the
+font is used and it is horizontally centered.
+
+\new Unicode
+There are more scalable accents in Unicode math fonts:
+\x`\overparen` $\overparen{abc}$, \x`\underparen` $\underparen{abc}$,
+\x`\overbracket` $\overbracket{abc}$, \x`\underbracket` $\underbracket{abc}$,
+\x`\overleftrightarrow` $\overleftrightarrow{abc}$,
+\x`\overleftharpoon` $\overleftharpoon{abc}$,
+\x`\overrightharpoon` $\overrightharpoon{abc}$,
+
+
+\secc Fixed math accents
+
+Fixed \ii math/accent,accent math accents can be applied to single math object or to the `{<math list>}`.
+The accent is centered (with respect of slanting axis) and the result is a
+nucleus of Ord
+atom. For example `\dot x` gives $\dot x$. The list of fixed math accents
+follows: \x`\acute`` x` $\acute x$, \x`\bar`` x` $\bar x$,
+\x`\breve`` x` $\breve x$, \x`\check`` x` $\check x$,
+\x`\dot`` x` $\dot x$, \x`\ddot`` x` $\ddot x$,
+\x`\grave`` x` $\grave x$, \x`\hat`` x` $\hat x$,
+\x`\vec`` x` $\vec x$, \x`\tilde`` x` $\tilde x$.
+
+\new Unicode
+The additional fixed accents depends on used Unicode math font. The
+`latinmodern-math` supports:
+\x`\ovhook`` x` $\ovhook x$, \x`\ocirc`` x` $\ocirc x$,
+\x`\leftharpoonaccent`` x` $\leftharpoonaccent x$, \x`\rightharpoonaccent`` x` $\rightharpoonaccent x$,
+\x`\dddot`` x` $\dddot x$, \x`\ddddot`` x` $\ddddot x$,
+\x`\widebridgeabove`` x` $\widebridgeabove x$, \x`\asteraccent`` x` $\asteraccent x$.
+
+There exist one special math accent `'` (single quote, ASCII 39)
+which can be appended after a symbol like this: `f'`
+and it creates $f'$ (typical meaning is the
+derivation of the given function). You can put more such accents, for
+example `g'''` gives $g'''$.
+
+\secc Roots
+
+There is a macro \x`\sqrt``{<math list>}` to create \ii square/root square root. For example:
+$$
+ `\sqrt{\sqrt{\sqrt{x+1}+1}+1}` \quad \hbox{gives }
+ \sqrt{\sqrt{\sqrt{x+1}+1}+1}
+$$
+The \ii root $n$-th root is created by the macro \x`\root`` <n>\of{<math list>}`. For
+example `\root k+1\of x` gives $\root k+1\of x$.
+
+\secc Math alphabets
+
+Letters \ii math/alphabet $a\dots z$, $A\dots Z$ and $\alpha$\dots$\omega$ are printed in italic
+in math mode. This follows the traditional typographic rule.
+All other math symbols, digits, and uppercase Greek letters must be
+upright.\fnote
+{French typographic convention says that uppercase Greek letters have to be
+ in italic too. Use `\_itGreek` declaration in this case.}
+These rules are independent of the current variant of surrounding text font.
+
+If we want to use the letters or digits
+in another than this default shape, then we can use
+\ii math/alphabet/selector {\em math alphabet selectors}:
+\x`\mit`, \x`\rm`, \x`\it`, \x`\bf`, \x`\cal`.
+\new \OpTeX/
+\OpTeX/ supports more such selectors \x`\script`, \x`\frak`, \x`\bbchar`, \x`\bi`, see
+section 1.3.3 in the \OpTeX/ documentation. The math selectors have local
+validity in the group.
+
+The control sequences \x`\rm`, \x`\it`, \x`\bf`, and \x`\bi` act as variant selectors
+of fonts in non-math mode (text mode) and they act
+as math alphabet selectors in math mode. This \"overlaying" concept
+is given by Plain \TeX/. Example: math operators lim, sin, cos,
+log, etc.\ must be printed unslanted. We are using `\lim`, `\sin`, `\cos`,
+`\log` etc.\ in math mode in order to comply with this typographic convention. For
+example `\sin` is defined as:
+\begtt
+\def\sin {\mathop{\rm sin}\nolimits}
+\endtt
+The `\rm` is used here as math alphabet selector, no variant selector of
+text fonts.
+
+The list of all predefined `\rm`-like math operators follows: \x`\arccos`,
+\x`\arcsin`, \x`\arctan`, \x`\arg`, \x`\cos`, \x`\cosh`, \x`\cot`, \x`\coth`, \x`\deg`.
+\x`\det`, \x`\dim`, \x`\exp`, \x`\gcd`, \x`\hom`, \x`\inf`, \x`\ker`, \x`\lg`, \x`\lim`,
+\x`\liminf`, \x`\limsup`, \x`\ln`, \x`\log`, \x`\max`, \x`\min`, \x`\Pr`, \x`\scs`, \x`\sin`,
+\x`\sinh`, \x`\sup`, \x`\tan`, \x`\tanh`, You can define another such operator
+analogically.
+
+\new Unicode
+Unicode font can include the following math alphabets:
+\begtt \typosize[9/11]
+\_rmvariables % upright letters A-Z, a-z
+\_bfvariables % bold letters A-Z, a-z
+\_itvariables % italic letters A-Z, a-z
+\_bivariables % bold italic letters A-Z, a-z
+\_calvariables % calligraphic letters A-Z, a-z
+\_bcalvariables % calligraphic letters A-Z, a-z
+\_frakvariables % fraktur A-Z, a-z
+\_bfrakvariables % bold fraktur A-Z, a-z
+\_sansvaraibales % sans serif letters A-Z, a-z
+\_bsansvaraibales % bold sans serif letters A-Z, a-z
+\_isansvaraibales % slanted sans serif letters A-Z, a-z
+\_bisansvaraibales % bold slanted sans serif letters A-Z, a-z
+\_ttvariables % monospace, typewriter letters A-Z, a-z
+\_bbvariables % double struck A-Z, a-z
+\_rmdigits % upright digits 0..9
+\_bfdigits % bold digits 0..9
+\_sansdigits % sans serif digits 0..9
+\_bsansdigits % bold sans serif digits 0..9
+\_ttdigits % monospace typewriter digits 0..9
+\_bbdigits % double-struck digits 0..9
+\_rmgreek % upright Greek letters \alpha-\omega
+\_itgreek % slanted Greek letters \alpha-\omega
+\_bfgreek % bold Greek letters \alpha-\omega
+\_bigreek % bold italic Greek letters \alpha-\omega
+\_bsansgreek % bold sans serif Greek letters \alpha-\omega
+\_bisansgreek % bold slanted snas serif Greek letters \alpha-\omega
+\_itGreek % slanted Greek letters \Alpha-\Omega
+\_bfGreek % bold Greek letters \Alpha-\Omega
+\_biGreek % bold italic Greek letters \Alpha-\Omega
+\_bsansGreek % bold sans serif Greek letters \Alpha-\Omega
+\_bisansGreek % bold slanted snas serif Greek letters \Alpha-\Omega
+\endtt
+%
+Not all Unicode math fonts include all math alphabets listed here. Typically,
+the lowercase letters of calligraphic shape and all letters of
+bold calligraphic shape are missing.
+
+\new \OpTeX/
+\OpTeX/ defines internal math alphabet selectors as mentioned in the
+previous listing of math alphabets and sets as default:
+\begtt \typosize[10/12]
+\_itvariables \_rmdigits \_itgreek \_rmGreek
+\endtt
+%
+Moreover, it defines the alphabet selectors at user level (see section 1.3.3
+of the \OpTeX/ manual). For example
+\begtt \typosize[10/12]
+\def\rm {\_tryload\_tenrm \_inmath{\_rmavariables \_rmdigits}}
+\endtt
+%
+The first part
+\new \OpTeX/
+`\_tryload\_tenrm` is applicable for text fonts and the
+`\_inmath` part is processed only in math mode and sets the math alphabets.
+You can see the file `unimath-codes.opm` where all user-level selectors are
+defined. You can redefine them. For example, \OpTeX/ defines `\bf` as a math
+alphabet selector that selects sans serif bold in math. This is the common
+notation for vectors, tensors, and matrices. If you dislike this, then you can define:
+\begtt \typosize[10/12]
+\def\bf {\_tryloadbf\_tenbf \_inmath{\_bfvariables\_bfdigits\_bfgreek\_bfGreek}}
+\endtt
+
+
+\secc[objects] List of single math objects
+
+\new Unicode
+All \ii single/math/object single math objects are listed in the `unimath-table.opm` or
+`unicode-math-table.tex` file. You can
+look into this file. The codes, \TeX/ sequences, classes, and comments
+for all possible math codes are here. Maybe, your Unicode math font which is loaded
+does not support all these codes.
+\new \OpTeX/
+You can try all codes of the currently loaded font by
+\begtt
+\input print-unimath.opm
+\endtt
+The `unimath-table` is printed with characters available in the loaded font.
+\new \OpTeX/
+If the character is unsupported by the font then the slot is empty and only
+\TeX/ sequence and the class of the code is printed in the table.
+For example, this document loads `latimodern-math.otf` font.
+And the result from `\input print-unimath.opm` looks like the following ten
+pages.
+
+Unsupported characters can be replaced by characters from other Unicode math
+font, see
+\ulink[http://petr.olsak.net/optex/optex-tricks.html\#addumathfont]{OpTeX trick 0030}
+or section~\ref[newfam].
+
+
+\label[listA]\wlabel{}
+
+\bigskip
+\input print-unimath.opm
+\bigskip
+
+\label[listB]\wlabel{}
+
+It isn't very comfortable to find something in the previous table
+if you know the shape. You can try the online web tool \ii Detexify
+\ulink[https://detexify.kirelabs.org/classify.html]{Detexify}.
+You can draw the symbol here and the suggestion of \TeX/ sequence is
+printed.
+
+\def\g#1{{\tt\string#1}~$#1$}
+
+The generic \TeX/ sequences for the Greek letters \ii Greek/letters can be used:
+\g\alpha, \g\beta, \g\gamma, \g\delta, \g\varepsilon, \g\zeta, \g\eta,
+\g\theta, \g\iota, \g\kappa, \g\lambda, \g\mu, \g\nu, \g\xi,
+\g\omicron, \g\pi, \g\rho, \g\varsigma, \g\sigma, \g\tau, \g\upsilon,
+\g\varphi, \g\chi, \g\psi, \g\omega, \g\vardelta, \g\epsilon, \g\vartheta,
+\g\varkappa, \g\phi, \g\varrho, \g\varpi\
+and
+\g\Alpha, \g\Beta, \g\Gamma, \g\Delta, \g\Epsilon, \g\Zeta, \g\Eta, \g\Theta,
+\g\Iota, \g\Kappa, \g\Lambda, \g\Mu, \g\Nu, \g\Xi, \g\Omicron, \g\Pi, \g\Rho,
+\g\Sigma, \g\Tau, \g\Upsilon, \g\Phi, \g\Chi, \g\Psi, \g\Omega.
+
+\new \OpTeX/
+The variant of Greek letters in the output
+(upright, italic, bold, bold sans serif, etc.)
+written by the sequences `\alpha`, `\beta` etc. depends on the math alphabet
+selected by `\_itgreek`, `\_rmgreek`, etc. selectors. The user-level
+selectors `\bf` and `\bi` set `\_bsansgreek` and `\_bisansgreek`, so
+`{\bi\delta}` produces $\bi\delta$.
+
+\new Unicode
+All characters available in the math font can be accessed by \TeX/ control
+sequence or by directly using the Unicode character in the document source.
+Example:
+\begtt \adef/{}
+$$
+ \sum/_{k=0}^\infty e^{(\alpha+i\beta/_k)} =
+ e^\alpha \sum/_{k=0}^\infty e^{i\beta/_k} =
+ e^\alpha \sum/_{k=0}^\infty (\cos\beta/_k + i\sin\beta/_k).
+$$
+\endtt
+or
+\begtt \ttspec
+$$
+ ∑_{k=0}^∞ e^{(α + iβ_k)} = e^α ∑_{k=0}^∞ e^{iβ_k}
+ = e^α ∑_{k=0}^∞ (\cos β_k + i\sin β_k).
+$$
+\endtt
+both gives the same result:
+$$
+ ∑_{k=0}^∞ e^{(α + iβ_k)} = e^α ∑_{k=0}^∞ e^{iβ_k}
+ = e^α ∑_{k=0}^∞ (\cos β_k + i\sin β_k).
+$$
+\medskip
+
+
+\sec Other specialities
+
+\secc The `\not` prefix
+
+You can apply \x`\not` before a following math object.
+The slash $/$ is overprinted such math object, for example
+`$a \not= b$` gives $a \not= b$.
+
+\new \OpTeX/
+If there exists a direct Unicode character for the negation of a relation symbol
+(for example `\ne` creates $\ne$ directly as a character U+2260)
+then `\not<char>` expands to appropriate Unicode character.
+For example `\not=` expands to `\ne` or `\not\in` expands to `\notin`.
+If such character does not exist then
+the centered $/$ is overprinted over the next character.
+
+
+\secc The `\buildrel` macro: text over the relation
+
+The macro \x`\buildrel`` <text>\over <relation>` creates a new atom Rel with the
+<relation> and with the smaller <text> above this <relation>. Example:
+`$M \buildrel\rm def\over= X\cup Y$` gives $M\buildrel\rm def\over= X\cup Y$.
+
+
+\secc Spaces
+
+Spaces between atoms are created automatically as were mentioned in
+section~\ref[class]. But sometimes you have to help \TeX/ to create
+appropriate space. You can use following macros:
+
+\begitems
+* `\,` is \ii thin/space {\em thin space} used around Op atoms, after comma, etc.: \ss\,,
+* `\!` is \ii negative/thin/space negative thin space,
+* `\>` is \ii medium/space {\em medium space} used around Bin atoms: \ss\>,
+* `\;` is \ii thick/space {\em thick space} used around Rel atoms: \ss\;,
+* \x`\quad` is \ii em/space {\em em space}: \ss\quad,
+* \x`\qquad` is \ii double/em/space {\em double em space}: \ss\qquad.
+\enditems
+%
+Of course, you can use \ii direct/space {\em direct space} {\visiblesp`\ `} which is \TeX/ primitive
+and gives interword space: \ss\ \
+or you can use \x`\hskip`` <value>` to put arbitrary space.
+
+The space size of `\,`, `\!` resp. `\>`, resp. `\;` is given by
+`\thinmuskip`, resp. `\medmuskip`, resp. `\thickmuskip` values. You can see
+in the `plain.tex` file that these default values differ very little in their basic
+size but there is no stretchability/shrinkability in the `\,` space, there is small
+stretchability in the `\>` space, and more stretchability in the `\;` space.
+
+The registers \x`\thinmuskip`, \x`\medmuskip`, and \x`\thickmuskip` store so-called
+\ii mu/values {\em mu values} given by math unit `mu`. It is 1/18 em and this unit depends
+on the current font size used in the math formula ($S$ or $SS$ styles use
+smaller font size, the `mu` unit is smaller here). You can use \x`\muskip`
+instead `\hskip` or \x`\mukern` instead `\kern` if you want to use this
+special mu unit. It is allowed only in math mode.
+
+The \x`\quad` and \x`\qquad` spaces have fixed width and they can be used in text
+mode too. (\OpTeX/ allows to use `\,` in text mode too).
+Use `\quad` or `\qquad` if you want to separate more formulas created in
+single math mode. Examples of typical usage of spaces:
+
+\begtt \adef/{} \typosize[10/12]
+$$ \alpha\,(x+y), \qquad \int/_a^b \!\! f(x)\,{\rm d}x, \qquad \Gamma/_{\!i}. $$
+\endtt
+$$ \alpha\,(x+y), \qquad \int_a^b \!\! f(x)\,{\rm d}x, \qquad \Gamma_{\!i}. $$
+
+
+\secc Texts in math mode
+
+If you write `$Hello world!$` (i.e.\ Hello world in math mode), then you get
+$Hello world!$. It is interpreted as the product of variables $H$, and $e$, and
+$l^2$, and $o$, etc., followed by the symbol ! used for factorial.
+The non-ASCII letters (with accents) don't work at all because they are
+never used as symbols for variables. Spaces are ignored.
+
+If you want to write a short text in the math mode, then you can use
+`\hbox{<text>}`. The \x`\hbox` primitive initializes text mode regardless of
+the \"outer mode". Example:
+
+\begtt \adef/{} \typosize[10/12]
+$$ \sum/_{n=0}^\infty (-1)^n a_n \hbox{ converges, if $a_n\searrow 0$.} $$
+\endtt
+$$ \sum_{n=0}^\infty (-1)^n a_n \hbox{ converges, if $a_n\searrow 0$.} $$
+%
+Note the space before the word \"converges". The space before `\hbox` is
+irrelevant. Second notice: the example shows the text mode inside math mode
+and the in-line math mode inside this text mode. The same result can be
+produced by:
+
+\begtt \adef/{} \typosize[10/12]
+$$ \sum/_{n=0}^\infty (-1)^n a_n \hbox{ converges, if } a_n\searrow 0. $$
+\endtt
+%
+The difference can be visible if the formula $a_n\searrow 0$ includes a
+fraction, for example ${1\over2}a_n\searrow 0$. The first example prints the
+fraction in the text style and the second example prints it in the display style.
+
+The disadvantage of `\hbox` is that it starts in the text mode independently
+of the current style, but we want to use smaller font in $S$ or $SS$ styles.
+\new \OpTeX/
+You can use \x`\mathbox``{<text>}` in such situations. This macro behaves like
+`\hbox` but the text is appropriately smaller in $S$ and $SS$ styles.
+Example:
+$$
+ `{\mathbox{cena}\over\mathbox{výkon}}` \quad \hbox{gives }
+ {\mathbox{cena}\over\mathbox{výkon}} \hbox{ in $D$ style and }
+ \textstyle {\mathbox{cena}\over\mathbox{výkon}} \hbox{ in $T$ style.}
+$$
+Note that $\mathbox{cena}\over\mathbox{výkon}$ means $\rm price\over performance$
+and you can write `$\rm price\over performance$` when you are using only
+words without spaces and accented letters. But phrases with spaces or accented letters
+should be printed in text mode using `\hbox` or `\mathbox`.
+
+\secc `\vcenter`
+
+The \x`\vcenter` primitive behaves like `\vbox`, but it can be used only in
+math mode and its result is vertically centered to the math axis.
+For example, matrices, are created by tables in `\vcenter`.
+
+All big objects in math formula are centered on the math axis and the baseline is
+ignored. In the following example, we create a new big math operator by
+`\vcenter`:
+\begtt
+$$
+ \def\myop#1{\mathop{\vcenter{\frame{\vbox to2em{\vss\hbox{ $#1$ }\vss}}}}}
+ F(x) = \myop{x(i)}_{i=1}^\infty
+$$
+\endtt
+\vskip-2em
+$$
+ \def\myop#1{\mathop{\vcenter{\frame{\vbox to2em{\vss\hbox{ $#1$ }\vss}}}}}
+ F(x) = \myop{x(i)}_{i=1}^\infty
+$$
+
+
+\secc Three dots
+
+You can write `$1,2,\dots,n$` to get $1,2,\dots,n$. The \x`\dots` macro puts
+thin space between dots and after the last dot, so the five object: comma,
+dots, comma are exactly equidistant.
+
+Typographic conventions say that you have to use the repeating symbol
+before and after three dots (comma in the previous example) and the three dots
+should be at baseline if the repeating symbol is at baseline. Or they should be
+at the math axis if the repeating symbol is at the math axis. We have to use \x`\cdots` instead
+`\dots` in the second case. Example:
+$$
+ `a_1, a_2, \dots, a_n, \quad a_1 + a_2 + \cdots + a_n` \qquad
+ a_1, a_2, \dots, a_n, \quad a_1 + a_2 + \cdots + a_n
+$$
+\vskip-.7em
+There are \x`\vdots` $\vdots$, \x`\ddots` $\ddots$ and \x`\adots` $\adots$ which
+can be used in matrices.
+
+\new Unicode
+Three dots like the output of the `\dots` macro are present as a single
+character in fonts too. This character is called ellipsis. Font designers
+typically suggest this character with smaller spaces between dots than we
+need in math mode. So the rule about equidistant \"comma, three dots, comma"
+is not met when this character is used. You can try `$1,2,\unicodeellipsis, n$`
+and `$1+2+\unicodecdots + n$`. You get $1,2,\unicodeellipsis, n$ and
+$1+2+\unicodecdots + n$. If you feel that this is better, then you can set:
+`\let\dots=\unicodeellipsis \let\cdots=\unicodecdots`.
+
+The Unicode fonts includes compact variants `\unicodevdots` $\unicodevdots$,
+`\unicodeddots` $\unicodeddots$ and `\unicodeadots` $\unicodeadots$ too.
+
+
+\secc Phantoms and `\smash`
+
+The \x`\phantom``{<math list>}` macro creates an invisible subformula equal to
+the formula generated by <math list>. It has its size, so it can
+interfere with surrounding visible subformulas. This macro is very useful for
+aligning with special requirements. Examples are shown in
+sections~\ref[matrix] and~\ref[elines].
+
+The \x`\vphantom``{<math list>}` has only its vertical size (i.e.\ its height
+and depth), the width is zero. The \x`\hphantom``{<math list>}` has only its
+width.
+
+The \x`\smash``{<math list>}` is the opposite of `\vphantom`. It creates visible
+subformula but it has only its width. Its height and depth are zero.
+
+The result of these macros is the nucleus of an Ord atom. You can use `\mathop`,
+`\mathbin`, etc. primitives to change this class. For example
+`$a\mathrel{\phantom{=}}b$` creates the same formula as $a=b$ with the same
+distance from $a$ to $b$ but without the equal sign:
+$a\mathrel{\phantom{=}}b$.
+
+These macros work in the text mode too. Then their argument is
+the <horizontal list>.
+
+
+\sec Structured objects
+
+\secc[matrix] Matrices
+
+The macro \x`\matrix``{<data>}` creates a vertically centered table of items.
+The <data> includes <items> separated by `&` and rows are separated by
+`\cr`. The number of columns and rows are unlimited. Columns are printed centered
+and separated by the `\quad` space. The vertically scalable
+brackets around the table are not printed. You can use \x`\pmatrix``{<data>}`
+instead `\matrix{<data>}`: the vertically scalable parentheses () are inserted
+around the table. Examples:
+
+\begtt
+$$
+ {\bf A} = \pmatrix{a_{1,1} & a_{1,2} & \cdots & a_{1,n} \cr
+ a_{2,1} & a_{2,2} & \cdots & a_{2,n} \cr
+ \vdots & \vdots & \ddots & \vdots \cr
+ a_{m,1} & a_{m,2} & \cdots & a_{m,n} },
+$$
+\endtt
+$$
+ {\bf A} = \pmatrix{a_{1,1} & a_{1,2} & \cdots & a_{1,n} \cr
+ a_{2,1} & a_{2,2} & \cdots & a_{2,n} \cr
+ \vdots & \vdots & \ddots & \vdots \cr
+ a_{m,1} & a_{m,2} & \cdots & a_{m,n} },
+$$
+or:
+
+\begtt
+\def\qmatrix[#1]{\left[\matrix{#1}\right]}
+$$
+ \qmatrix[a&b&c\cr d&e&f\cr g&h&i] \cdot \qmatrix[x_1\cr x_2\cr x_3]
+ = \qmatrix[b_1\cr b_2\cr b_3].
+$$
+\endtt
+$$
+ \def\qmatrix[#1]{\left[\matrix{#1}\right]}
+ \qmatrix[a&b&c\cr d&e&f\cr g&h&i] \cdot \qmatrix[x_1\cr x_2\cr x_3]
+ = \qmatrix[b_1\cr b_2\cr b_3].
+$$
+
+If you need to align the columns by another way than to center, then you can
+use the phantom. Compare:
+
+\begtt
+$$
+ \pmatrix{ 1 & -1 & 0 \cr
+ 0 & 2 & 13 \cr
+ -3 & 0 & 5 } \quad \hbox{or} \quad
+ \def\0{\phantom0} \def\+{\phantom+}
+ \pmatrix { \+1 & -1 & \00 \cr
+ \+0 & \+2 & 13 \cr
+ -3 & \+0 & \05 }
+$$
+\endtt
+$$
+ \pmatrix{ 1 & -1 & 0 \cr
+ 0 & 2 & 13 \cr
+ -3 & 0 & 5 } \quad \hbox{or} \quad
+ \def\0{\phantom0} \def\+{\phantom+}
+ \pmatrix { \+1 & -1 & \00 \cr
+ \+0 & \+2 & 13 \cr
+ -3 & \+0 & \05 }
+$$
+
+\new\OpTeX/
+Another option to set the right aligned matrix is setting the \x`\lmfil`:
+Its value is used on the left side in each `\matrix` item. The right side is
+set directly to `\hfil`.
+\begtt
+$$
+ \lmfil={\hfill} % left matrix filler = \hfill
+ \pmatrix{ 1 & -1 & 0 \cr 0 & 2 & 13 \cr -3 & 0 & 5 }
+$$
+\endtt
+
+\new \OpTeX/
+If you want to draw a vertical line inside the matrix, you can use `\adef|`
+as in the following example:
+\begtt
+$$
+ \adef|{\kern-.2em&\strut\vrule&\kern-.2em}
+ \def\+{\phantom+}
+ \pmatrix{1 & 2 & 3 | 0 \cr 4 & 5 & 6 | 1 \cr 7 & 8 & 9 | 2 } \sim
+ \pmatrix{1 & \+2 & \+3 | 0 \cr 0 & -3 & -6 | 1 \cr 0 & -6 & -12 | 2} \sim
+ \pmatrix{1 & 2 & 3 | 0 \cr 0 & 1 & 2 | -1/3 \cr 0 & 0 & 0 | 1 }
+$$
+\endtt
+$$
+ \adef|{\kern-.2em&\strut\vrule&\kern-.2em}
+ \def\+{\phantom+}
+ \pmatrix{1 & 2 & 3 | 0 \cr 4 & 5 & 6 | 1 \cr 7 & 8 & 9 | 2 } \sim
+ \pmatrix{1 & \+2 & \+3 | 0 \cr 0 & -3 & -6 | 1 \cr 0 & -6 & -12 | 2} \sim
+ \pmatrix{1 & 2 & 3 | 0 \cr 0 & 1 & 2 | -1/3 \cr 0 & 0 & 0 | 1 }
+$$
+
+If you want to put something before the opening bracket in the matrix, you can
+use another `\matrix`. Example:
+
+\begtt
+$$
+ \adef|{\kern-.2em&\strut\vrule&\kern-.2em}
+ \def\+{\phantom+}
+ \def\r{{\bf r}}
+ \pmatrix{1 & 2 & 3 | 0 \cr 4 & 5 & 6 | 1 \cr 7 & 8 & 9 | 2 } \ \sim \
+ \matrix{\cr 2.\r - 4\cdot 1.\r: \cr 3.\r -7\cdot 1.\r: }
+ \pmatrix{1 & \+2 & \+3 | 0 \cr 0 & -3 & -6 | 1 \cr 0 & -6 & -12 | 2}
+$$
+\endtt
+$$
+ \adef|{\kern-.2em&\strut\vrule&\kern-.2em}
+ \def\+{\phantom+}
+ \def\r{{\bf r}}
+ \pmatrix{1 & 2 & 3 | 0 \cr 4 & 5 & 6 | 1 \cr 7 & 8 & 9 | 2 } \ \sim \
+ \matrix{\cr 2.\r - 4\cdot 1.\r: \cr 3.\r -7\cdot 1.\r: }
+ \pmatrix{1 & \+2 & \+3 | 0 \cr 0 & -3 & -6 | 1 \cr 0 & -6 & -12 | 2}
+$$
+
+Plain \TeX/ defines the \x`\bordermatrix` macro which allows you to create a
+top row above the brackets and left column before the opening bracket.
+\TeX/book shows the following example:
+
+\begtt
+$$
+ M = \bordermatrix{ &C&I&C'\cr
+ C&1&0&0 \cr I&1-b&0 \cr C'&0&a&1-a }
+$$
+\endtt
+$$
+ M = \bordermatrix{ &C&I&C'\cr
+ C&1&0&0 \cr I&1-b&0 \cr C'&0&a&1-a }
+$$
+
+The `\matrix` macro used in $D$ style creates all its items in $T$ style.
+\new \OpTeX/
+If you are using the `\matrix` macro in $T$ style or $S$ style (but not in
+fractions nor another matrices) then the resulting table is appropriately
+smaller and all its items are processed in $S$ style.
+If you are using `\matrix` in $SS$ style then the items are in $SS$ style too.
+The following example shows one-column matrix in script style:
+$$
+ `\sum``_{\matrix{i\in M\cr j\in N\cr k\in P}} x_{i,j,k}` \ \hbox{ creates: }
+ \sum_{\matrix{i\in M\cr j\in N\cr k\in P}} x_{i,j,k}
+$$
+
+
+\secc Cases
+
+The \x`\cases` macro can be used as in the following example:
+
+\begtt
+$$
+ f(x) = \cases{ 1 & for $x\le 0$, \cr
+ 100-x\over 100 & when $0 < x \le 100$, \cr
+ 0 & in other cases. }
+$$
+\endtt
+$$
+ f(x) = \cases{ 1 & for $x\le 0$, \cr
+ 100-x\over 100 & when $0\string< x\le 100$, \cr
+ 0 & in other cases. }
+$$
+
+The `\cases` macro behaves like a special `\matrix` with two left-aligned
+columns and with left vertically scaled brace $\{$.
+The first column is processed in math mode and $T$ style, the second column
+is processed in text mode. We have to use `$...$` in the second column if
+there is math material.
+
+
+\sec Lines in display mode
+
+\secc General principles
+
+The \ii display/math,display/math/mode
+`$$<formula>$$` finalizes previous paragraph, prints centered <formula> on
+single line with a vertical space above and below and opens next paragraph
+with no indentation.
+
+From \TeX/'s point of view, the text above `$$<formula>$$` plus text
+below is a single paragraph interrupted by display <formula>. If there is no
+text above (i.e. the opening `$$` are in vertical mode), then the internal
+`\noindent` is processed first and the empty line above <formula> is created.
+Thus, it is definitely a bad idea to open display mode in vertical mode: never
+put an empty line before `$$<formula>$$`. On the other hand, the empty line
+just after `$$<formula>$$` says that the paragraph is finalized by the
+<formula> and the next text (after the empty line) opens the next paragraph with
+indentation. Summary:
+
+\begitems
+* \"Text above `$$<formula>$$` text below": the <formula> interrupts the
+ paragraph with \"Text above" and \"text below". The \"text below" is
+ without indentation.
+* \"Text above `$$<formula>$$` empty line Text below": the \"Text below"
+ opens new paragraph with indentation.
+* \"Empty line `$$<formula>$$`" is bad practice.
+\enditems
+
+In contrast with the paragraph breaking, there is no built-in algorithm for
+breaking display <formula> to more lines. If the <formula> is too wide then
+overfull `\hbox` occurs and human must decide about splitting the <formula>
+to more lines. The macros `\displaylines` and `\eqalign` are intended to
+such task, see sections~\ref[dlines] and~\ref[elines].
+
+On the other hand, the in-line math <formula>, i.e.\ the `$<formula>$` in a
+paragraph, can be broken after a Bin atom (with penalty `\binoppenalty`) or
+after a Rel atom (with penalty `\relpenalty`). If you don't want to break
+such a formula at a specific place then use `\nobreak`, for example
+`$a+\nobreak b$`. If you want never to break such formulas then you can set
+`\binoppenalty=10000`, `\relpenalty=10000`. (Default values are 700 and 500.)
+
+
+\secc References to display lines
+
+The `$$<formula>`\x`\eqno``<mark>$$` \ii mark prints centered <formula> and the <mark> at
+right margin. The `$$<formula>`\x`\leqno``<mark>$$` prints centered <formula> and
+the <mark> at left margin. Examples:
+
+\begtt
+$$ a^2 + b^2 = c^2 \eqno (1) $$
+\endtt
+$$
+ a^2 + b^2 = c^2 \eqno (1)
+$$
+\begtt \aftergroup\nobreak
+$$ a^2 + b^2 = c^2 \leqno \rm Py $$
+\endtt
+$$\predisplaypenalty=10000
+ a^2 + b^2 = c^2 \leqno \rm Py
+$$
+The <mark> \ii mark is processed in math mode and $T$ style. If you want to put a
+text here then you have to use `\rm <text>` or `\hbox{<text>}`.
+
+\new \OpTeX/
+The auto-generated <mark> can be created by `$$<formula>`\x`\eqmark``$$`. The
+<label> can be used previously declared by \x`\label``[<label>]`.
+Then it is associated to such
+auto-generated <mark> and you can write a reference in the form
+`see equation~\ref[<label>]`. You can write `\eqmark[<label>]` instead of
+`\label[<label>]...\eqmark`. See the \OpTeX/ manual, section~1.4.3.
+
+\secc[dlines] The `\displaylines` macro
+
+This macro creates more horizontally centered formulas in one display mode.
+The syntax is
+\begtt \catcode`\<=13
+$$ \displaylines{
+ <formula> \cr
+ <formula> \cr
+ ... \cr
+ <formula>
+} $$
+\endtt
+Usage of \x`\displaylines` is more
+prefered than doing more display modes just behind each other.
+Example:
+\begtt
+$$ \displaylines{
+ (3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \cr
+ = 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30.
+} $$
+\endtt
+$$ \displaylines{
+ (3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \cr
+ = 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30.
+} $$
+
+The output from `\displaylines` macro is breakable to more pages because
+the lines are not encapsulated in one box. The macro uses a special feature of
+`\halign` primitive. The disadvantage is that you cannot use `\eqno` nor
+`\leqno` nor `\eqmark`.
+
+\new \OpTeX/
+\OpTeX/ provides alternative form: `\displaylines to<dimen> {<data>}`.
+Then the centered formulas are encapsulated in a `\vcenter` box of width <dimen> and
+usage of `\eqno` or `\leqno` or `\eqmark` is allowed.
+The individual lines have the form `\hbox to<dimen>` and formulas are centered using
+`\hss` from both sides. This means that you can set arbitrary <dimen>
+without visual change of the formulas. Use smaller <dimen> value than
+`\hsize` (or `\displaywidth`\fnote
+{`\displaywith` = `\hsize` in most cases but it is
+real display width when `\parshape` or `\hangindent` is used.})
+if you want to center formulas with `\eqno` appended.
+The internal \TeX/ rule says: the formula with `\eqno` (or `\leqno`) is centered
+if its width is less or equal `\displaywidth-4<mark-width>`. So
+\begtt \catcode`\<=13
+$$ \displaylines to\hsize-8em {<formula>\cr<formula>}\eqno (1) $$
+\endtt
+does global centering, because size of `(1)` is less than 2\,em.
+You can do more experiments with this example,
+for example `\diplaylines to\hsize{...}`
+puts the `\eqno` mark to the next line in the display environment. Read
+\TeX/book or \TeX/book naruby, where the precise explanation about such
+positioning is.
+
+\new \OpTeX/
+You can use \"`\displaylines to<dimen>`" for more applications. For example,
+you can put more
+\"`\displaylines to<dimen>`" in single display mode, one next to second in order
+to creating more centered columns with formulas; the width of such columns
+are controlled by the <dimen> parameter.
+Or, you can give an exception for several lines:
+
+\begtt \catcode`\<=13
+$$\displaylines to 10cm {<formula>\hfill \cr
+ <formula>\cr
+ <formula>\cr
+ \hfill <formula>}
+$$
+\endtt
+The example above gives similar result as the \LaTeX/ `multline` environment:
+$$\displaylines to \hsize {
+ (3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \hfill \cr
+ = 3x^9 + 3x^5 + 15x^3 + 4x^8 + 4x^4 + 20x^2 + 5x^7 + 5x^3 + 25x
+ + 6x^6 + 6x^2 + 30 = \cr
+ \hfill = 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30. }
+$$
+
+
+\secc[elines] The `\eqalign` macro
+
+The \ii .eqalign \iis .eqalign {{\code{\\eqalign}}} usage is:
+\begtt \catcode`\<=13
+$$ \eqalign { <left-side> & <right-side> \cr
+ <left-side> & <right-side> \cr
+ ... \cr
+ <left-side> & <right-side>
+} $$
+\endtt
+The `\vcenter` box is created with two columns, left column is right aligned
+and right column is left aligned. Example:
+
+\vbox{
+\begtt
+$$ \eqalign{
+ x + 2y + 3z &= 600 \cr
+ 12x + y - 3z &= 7 \cr
+ 4x - y + 5z &= -5 \cr
+} $$
+\endtt
+\vskip-5.7\baselineskip
+{\hsize=1.35\hsize
+$$ \eqalign{
+ x + 2y + 3z &= 600 \cr
+ 12x + y - 3z &= 7 \cr
+ 4x - y + 5z &= -5 \cr
+} $$}}
+
+\bigskip\noindent
+The tab \"`&`" should be used just before a relation, i.e. `&=` is right, `=&`
+is wrong. All lines are aligned to the used tab.
+
+Maybe you want more precise alignment in the example above. You can use
+`\phantom`:
+
+\par\nobreak\vbox{
+\begtt
+$$ \def\1{\phantom1} \def\+{\phantom+}
+ \eqalign{
+ x + 2y + 3z &= 600 \cr
+ 12x + \1y - 3z &= \+7 \cr
+ 4x - \1y + 5z &= -5 \cr
+} $$
+\endtt
+\vskip-5.7\baselineskip
+{\hsize=1.35\hsize
+$$ \def\1{\phantom1} \def\+{\phantom+}
+ \eqalign{
+ x + 2y + 3z &= 600 \cr
+ 12x + \1y - 3z &= \+7 \cr
+ 4x - \1y + 5z &= -5
+} $$}}
+\bigskip
+Another typical usage of the `\eqalign` macro:
+
+\begtt \typosize[10/12]
+$$ \eqalign{
+ p(x)\,q(x) &= (3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \cr
+ &= 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30.
+} $$
+\endtt
+$$ \eqalign{
+ p(x)\,q(x) &= (3x^3 + 4x^2 + 5x + 6) \cdot (x^6 + x^2 + 5) = \cr
+ &= 3x^9 + 4x^8 + 5x^7 + 6x^6 + 3x^5 + 4x^4 + 20x^3 + 26x^2 + 25x + 30.
+} $$
+
+In \OpTeX/, \new\OpTeX/
+the `\eqalign` macro is more flexible. You can set the
+`\baselineskip` value by the \x`\eqlines` parameter and math style
+by the \x`\eqstyle` parameter.
+For example, you need to put the system of \"equations" as a subscript of a sum
+operator:
+\begtt \typosize[10/12] \adef/{}
+$$
+ \sum/_{\eqlines{\baselineskip=.7\baselineskip}\eqstyle{\scriptstyle}\eqalign{
+ i &\in A \cr
+ \quad j &\in B\cup C \cr
+ m &\in C }}
+ i + j + m
+$$
+\endtt
+$$
+ \sum_{\eqlines{\baselineskip=.7\baselineskip}\eqstyle{\scriptstyle}\eqalign{
+ i &\in A \cr
+ \quad j &\in B\cup C \cr
+ m &\in C }}
+ i + j + m
+$$
+
+\indent \new\OpTeX/
+You can write more equation systems one next second:
+\begtt
+$$\eqalign{
+ x + y + z &= 1 && a + b + c &= -1 \cr
+ u + v &= 20 && f + g &= -20 \cr
+ i &= j
+}$$
+\endtt
+You can use the third column for centered equations
+without aligning point. For example:
+\begtt \catcode`\<=13
+$$ \left( \eqspace=0pt \eqalign{&& <first equation>\cr
+ && <second equation>} \right) $$
+\endtt
+The \x`\eqspace` is additional space used in the third column to separate
+equation systems one next second.
+
+\new \OpTeX/
+\OpTeX/ extensions summary:
+\begitems
+* `\eqlines` and `\eqstyle` set baselineskip and math style of the formulas.
+* `\eqalign` allows more than two columns:
+ The first column is right-aligned (no space). The second is left-aligned (no space).
+ The third column (if used)
+ is centered with `\eqspace/2` at the left and right boundary of the column.
+ The fourth is the same as the first. The fifth is the same as second etc. The number
+ of columns that can be used in `\eqalign` is unlimited.
+\enditems
+
+\secc The `\eqalign` macro with references
+
+You can give common mark to whole equation system by
+`$$\eqalign{<data>}\eqno <mark>$$`. If you want to give marks to individual
+lines of the equation system, then you can use another macro:
+\x`\eqalignno`. The usage is similar as `\eqalign` but the
+third column (if used) is intended to the equation mark. Example:
+
+\begtt
+$$ \eqalignno{
+ x + 2y + 3z &= 600 & \rm(A) \cr
+ 12x + y - 3z &= 7 & \rm(B) \cr
+ 4x - y + 5z &= -5 & \rm(C) \cr
+} $$
+\endtt
+\vskip-\baselineskip
+$$ \eqalignno{
+ x + 2y + 3z &= 600 & \rm(A) \cr
+ 12x + y - 3z &= 7 & \rm(B) \cr
+ 4x - y + 5z &= -5 & \rm(C) \cr
+} $$
+
+The `\leqalignno` macro is similar to `\eqalignno` but the marks are at the left
+margin. The \OpTeX/ extensions of `\eqalign` are not available in
+`\eqalignno` nor `\leqalignno` macros.
+
+\new \OpTeX/
+You can use auto-generated marks by `\eqmark` macro:
+`$$\eqalign{<data>}\eqmark$$` or:
+\begtt
+$$ \eqalignno{
+ x + 2y + 3z &= 600 & \eqmark[A] \cr
+ 12x + y - 3z &= 7 & \eqmark[B] \cr
+ 4x - y + 5z &= -5 & \eqmark[C] \cr
+} $$
+\endtt
+
+
+\sec Concept of loading math fonts
+
+\secc[fams] Math families
+
+\TeX/ can use more than one math font in math mode. This was a
+necessity in the old days when only 128-characters fonts existed.
+Each math font used in math mode has its \ii math/family {\em math family} represented by a number.
+Math family is a collection of three (almost) equal fonts in three sizes:
+first for `\textstyle` and `\displaystyle`, second for `\scriptstyle`
+and third for `\scriptscriptstyle`.
+
+\new Unicode
+When Unicode math font is loaded then it includes all three optical sizes and
+all characters needed for typesetting math formula.
+Theoretically, we can use only one math family with this single font. But more math families
+(i.e.\ more fonts in math mode) is still possible. You can combine
+characters from more fonts (Unicode fonts and old TFM fonts together) in one math formula.
+
+\new \OpTeX/
+\OpTeX/ loads the main Unicode math font into math family 1. The math
+families 2 and 3 are reserved for specific \TeX/nical reasons, family 4 is
+used for `\script` font and families 5, 6, 7, etc. can be used by user for
+loading more fonts. The default macro for loading math fonts looks like:
+
+\begtt \typosize[10/12]
+\_def\_normalunimath{%
+ \_loadumathfamily 1 {\_unimathfont}{} % Main Unicode math font
+ \_loadmathfamily 4 rsfs % \script (old TFM font)
+ \_setunimathdimens % set dimen parameters used in math formulas internally
+}%
+\let\_normalmath=\_normalunimath % this is done when Unicode math is initialized
+\endtt
+%
+Whenever \OpTeX/ needs to resize math fonts (for example in footnotes or
+titles), it calls the `\_normalmath` macro to reload all math
+families to the desired size. If you want to add the next font, you can add
+`\_loadunimathfamily <family> {<Unicode-font>}{<features>}` or
+`\_loadmathfamily <family> <TFM-font>` into the `\_normalmath` macro.
+The example in section~\ref[newfam] shows how to do it.
+
+\secc Two variants of math fonts: normal and bold
+
+All math formulas in the whole document need only one Unicode font (or only one collection
+of math fonts as mentioned in section~\ref[fams]). But this
+is not really true if titles are in bold font. If a math formula is present in
+such a bold title then all characters of this formula must be bolder.
+For example \"normal" variables must be in bold italic in titles, symbols
+like `+` `=` must be bold and \"normal bold" letters
+(e.g., indicating vectors in math formula) must be extra bold in titles.
+It means that all fonts from the collection of math fonts must be bolder.
+We need a second collection of math fonts with bolder
+shape. Unfortunately, it is not always available.
+
+\new \OpTeX/
+If you have bold variant of used Unicode math font, then you can use
+\ii .loadmath \iis .loadmath {{\code{\\loadmath}}} \x`\loadboldmath` command, for example:
+\begtt
+\loadmath {[xitsmath-regular]}
+\loadboldmath {[xitsmath-bold]} \to {[xitsmath-regular]}
+\endtt
+%
+\OpTeX/ uses `\_normalmath` macro for loading collection of math fonts in
+\"normal" cases and `\_boldmath` macro for bold titles. The font declared by
+\x`\loadboldmath` is used in second case. But if the bold variant of the font is
+not available (this is unfortunately more typical), then \OpTeX/ uses faked
+bold of main Unicode math font (the `embolden` internal font feature is
+used). So, the default `\_boldmath` macro defined by \OpTeX/ looks like:
+
+\begtt \typosize[10/12]
+\_def\_boldunimath{%
+ \_ifx\_unimathboldfont \_undefined
+ \_loadumathfamily 1 {\_unimathfont}{embolden=1.7;} % Main faked bold
+ \_else
+ \_loadumathfamily 1 {\_unimathboldfont}{} % Main real bold font
+ \_fi
+ \_loadmathfamily 4 rsfs % rsfs in not in bold, unfortunately
+ \_setunimathdimens
+}%
+\let\_boldmath=\_boldunimath % this is done when Unicode math is initialized
+\endtt
+
+\secc[newfam] Example of using additional math font
+
+The font `bbold10.tfm` includes double stroked characters, for example,
+double stroked plus, double stroked Greek letters and digits.
+Try to run `pdftex testfont`, then answer the question about the name of the
+font: `bbold10` and then type command `\table\end`. The `testfont.pdf` is
+printed with the table of characters of this font.
+Most of these characters cannot be found in Unicode math fonts.
+
+\new \OpTeX/
+We show an example of how to add this font to the collection of used math fonts.
+We can re-define the `\_normalmath` macro by:
+\begtt \typosize[10/12]
+\addto\_normalmath {\_loadmathfamily 5 bbold }
+
+\_regtfm bbold 0 bbold5 5.5 bbold6 6.5 bbold7 7.5 bbold8 8.5 bbold9
+ 9.5 bbold10 11.1 bbold12 15 bbold17 * % using all bbold*.tfm
+\_normalmath % reload the math fonts collection
+\endtt
+%
+The string \"`bbold`" is declared by `\_regtfm` as a collection of all
+`bbold*.tfm` fonts, the optical sizes are supported.
+
+\addto\_normalmath {\_loadmathfamily 5 bbold }
+\_regtfm bbold 0 bbold5 5.5 bbold6 6.5 bbold7 7.5 bbold8 8.5 bbold9
+ 9.5 bbold10 11.1 bbold12 15 bbold17 * % using all bbold*.tfm
+\_normalmath
+\Umathchardef \bbplus 2 5 "2B
+\Umathchardef \bble 3 5 "3C
+\Umathchardef \bbge 3 5 "3E
+
+Finally, we must to declare new \TeX/ sequences for accessing the characters
+from the new font, for example:
+
+\begtt \typosize[10/12]
+\Umathchardef \bbplus 2 5 "2B
+\Umathchardef \bble 3 5 "3C
+\Umathchardef \bbge 3 5 "3E
+\endtt
+%
+The \x`\Umathchardef` \TeX/ primitive declares new \TeX/ sequence used in math
+typesetting. The first parameter is a class number (2 means Bin, 3 means Rel,
+see the table in the section~\ref[class]). The second parameter is a math
+family number. It is 5, see the redefinition of the `\_normalmath` macro above.
+The third parameter is a slot in the font. Now you can try to use these characters:
+$$
+ `a \bbplus b \bbge c` \quad \hbox{gives} \quad a \bbplus b \bbge c.
+$$
+%
+Maybe, you want to declare a special math selector which can be used as
+`$\bball a+b>c$` in order to get $\bbchar a \bbplus b \bbge c$.
+Then you can define:
+
+\begtt \typosize[10/12]
+\def\bball {\bbchar \Umathcodenum `+ \bbplus
+ \Umathcodenum `> \bbge
+ \Umathcodenum `< \bble }
+\endtt
+
+If you want to add all double stroked Greek letters into `\bball`
+selector, then you can do something like this:
+
+\begtt \typosize[10/12]
+\def\setbbgreek #1 {\tmpnum=#1\xargs\setbbgreekA}
+\def\setbbgreekA #1{\Umathcode \_ea`#1 0 5 \tmpnum \advance\tmpnum by1 }
+
+\addto\bball {%
+ \setbbgreek "0B \alpha \beta \gamma \delta \epsilon \zeta \eta
+ \theta \iota \kappa \lambda \mu \nu \xi \pi \rho \sigma
+ \tau \upsilon \phi \chi ;
+ \setbbgreek "7F \omega ;
+ \setbbgreek "00 \Gamma \Delta \Theta \Lambda \Xi \Pi \Sigma \Upsilon
+ \Phi \Psi \Omega ; }
+\endtt
+%
+The \x`\Umathcode`` <input-code> <class> <family> <font-slot>` primitive is used
+here. The control sequences `\alpha`, `\beta`, `\gamma` etc. are macros which expand
+to the Unicode character of appropriate (non-math) Greek letter. We set the
+Umathcode to such character, for example
+\code{\\Umathcode `}$\_rmgreek\alpha$` 0 5 "0B` is processed.
+
+The bold variant of the font `bbold*.tfm` is not available, unfortunately.
+We have to settle for normal version of the font in the `\_boldmath` macro:
+
+\begtt \typosize[10/12]
+ \addto \_boldmath {\_loadmathfamily 5 bbold }
+\endtt
+
+Another approach of using more Unicode math fonts in a single formula is
+shown in
+\ulink[http://petr.olsak.net/optex/optex-tricks.html\#addumathfont]{OpTeX trick 0030}.
+
+\sec Index
+
+Control sequences listed at pages \pgref[listA]--\pgref[listB] are not
+mentioned here again.
+
+\begmulti 3
+\makeindex
+\endmulti
+
+\bye
diff --git a/macros/optex/doc/optex-techdoc.tex b/macros/optex/doc/optex-techdoc.tex
new file mode 100644
index 0000000000..4ae25a9c7e
--- /dev/null
+++ b/macros/optex/doc/optex-techdoc.tex
@@ -0,0 +1,290 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+% This file is read from optex-doc.tex
+% Use: optex optex-doc
+% (three times) to create whole documentation including all references and the index.
+
+\load [doc.opm]
+
+\thisoutline {TECHNICAL DOCUMENTATION}
+
+\chap Technical documentation
+
+This documentation is written in the source files `*.opm` between
+the `\_doc` and `\_cod` pairs or after the `\_endcode` command.
+When the format is generated by
+\begtt
+luatex -ini optex.ini
+\endtt
+then the text of the documentation is ignored and the format `optex.fmt` is
+generated. On the other hand, if you run
+\begtt
+optex optex-doc.tex
+\endtt
+then the same `*.opm` files are read when the second chapter of this
+documentation is printed.
+
+A knowledge about \TeX/ is expected from the reader.
+You can see a short document
+\ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf]{\TeX/ in a Nutshell}
+or more detail
+\ulink[https://eijkhout.net/texbytopic/texbytopic.html]{\TeX/ by topic}.
+
+Notices about hyperlinks.
+If a control sequence is printed in red color in this documentation then
+this denotes its \"main documentation point". Typically, the listing where
+the control sequence is declared follows immediately. If a control sequence is
+printed in the blue color in the listing or in the text
+then it is an active link that points (usually) to the main documentation point.
+The main documentation point can be an active link that points to a previous
+text where the control sequence was
+mentioned. Such occurrences are active links to the main documentation point.
+
+\sec[init] The main initialization file
+
+The `optex.ini` file is read as the main file when the format is generated.
+
+{\everytt={\typosize[8/10]\_let\_printverbline=\_printcodeline \medskip}
+ \def\docfile{optex.ini}
+
+\verbinput (-4) optex.ini
+%
+Category codes are set first. Note that the `_` is set to category code
+\"letter", it can be used as a part of control sequence names.
+Other category codes are set as in the plain \TeX/.
+
+\verbinput (6-20) optex.ini
+%
+The \`\optexversion` and \`\fmtname` are defined.
+
+\verbinput (22-25) optex.ini
+%
+We check if \LuaTeX/ engine is used at `-ini` state. And the `^^J` character
+is set as `\newlinechar`.
+
+\verbinput (27-36) optex.ini
+%
+The basic macros for macro file syntax is defined, i.\,e.\
+`\_endcode`, `\_doc` and `\_cod`.
+The `\_codedecl` will be re-defined later.
+
+\verbinput (38-42) optex.ini
+%
+Individual `*.opm` macro files are read.
+
+\verbinput (44-87) optex.ini
+%
+The file `optex.lua` is embedded into the format as byte-code.
+It is documented in section~\ref[lua].
+
+\verbinput (89-92) optex.ini
+
+The `\everyjob` register is initialized and the format is saved by
+the `\dump` command.
+
+\verbinput (94-102) optex.ini
+
+}
+
+\printdoctail prefixed.opm
+\secc The implementation of the namespaces
+\printdoc prefixed.opm
+
+\sec pdf\TeX/ initialization
+\printdoctail luatex-ini.opm
+\printdoc luatex-ini.opm
+
+\sec Basic macros
+We define first bundle of basic macros.
+\printdoc basic-macros.opm
+
+\sec Allocators for \TeX/ registers
+\printdoctail alloc.opm
+\printdoc alloc.opm
+
+\sec If-macros, loops, is-macros
+\printdoc if-macros.opm
+
+\sec Setting parameters
+\printdoctail parameters.opm
+\printdoc parameters.opm
+
+\sec More \OpTeX/ macros
+The second bundle of \OpTeX/ macros is here.
+\printdoc more-macros.opm
+
+\sec Using key=value format in parameters
+\printdoctail keyval.opm
+\printdoc keyval.opm
+
+\sec Plain \TeX/ macros
+All macros from plain \TeX/ are rewritten here.
+Differences are mentioned in the documentation below.
+\printdoc plain-macros.opm
+
+\sec Preloaded fonts for text mode
+\printdoctail fonts-preload.opm
+\printdoc fonts-preload.opm
+
+\printdoctail fonts-resize.opm
+\printdoc fonts-resize.opm
+
+\printdoctail fonts-select.opm
+\secc Implementation of the Font Selection System
+\printdoc fonts-select.opm
+
+\sec [math-preload] Preloaded fonts for math mode
+\printdoctail math-preload.opm
+\printdoc math-preload.opm
+
+\sec[math-macros] Math macros
+\printdoc math-macros.opm
+
+\sec Unicode-math fonts
+\printdoctail math-unicode.opm
+
+\sec[opmac-fonts] Scaling fonts in document (high-level macros)
+These macros are documented in section~\ref[sizes] from the user point of view.
+\printdoc fonts-opmac.opm
+
+\sec[output] Output routine
+\printdoctail output.opm
+\printdoc output.opm
+
+\sec Margins
+The `\margins` macro is documented in the section~\ref[marg].
+\printdoc margins.opm
+
+\sec[colors] Colors
+\printdoctail colors.opm
+\printdoc colors.opm
+
+\sec[ref-file] The \code{.ref} file
+\printdoctail ref-file.opm
+\printdoc ref-file.opm
+
+\sec[references] References
+\printdoctail references.opm
+\printdoc references.opm
+
+\sec Hyperlinks
+\printdoctail hyperlinks.opm
+\printdoc hyperlinks.opm
+
+\sec[maketoc] Making table of contents
+\printdoc maketoc.opm
+
+\sec PDF outlines
+\secc Nesting PDF outlines
+\printdoctail outlines.opm
+\printdoc outlines.opm
+\secc Strings in PDF outlines
+\printdoctail pdfuni-string.opm
+\printdoc pdfuni-string.opm
+
+\sec[sections] Chapters, sections, subsections
+\printdoc sections.opm
+
+\sec[lists] Lists, items
+\printdoc lists.opm
+
+\sec Verbatim, listings
+\secc[verb] Inline and \"display" verbatim
+\printdoc verbatim.opm
+\secc[hisyntax] Listings with syntax highlighting
+\printdoctail hi-syntax.opm
+\printdoc hi-syntax.opm
+
+\sec Graphics
+\printdoctail graphics.opm
+\printdoc graphics.opm
+
+\sec[table] The \code{\\table} macro, tables and rules
+\printdoctail table.opm
+\secc[table.impl] Implemetation of the \code{\\table} macro and friends
+\printdoc table.opm
+
+\sec Balanced multi-columns
+\printdoc multicolumns.opm
+
+\sec Citations, bibliography
+\secc[bib] Macros for citations and bibliography preloaded in the format
+\printdoc cite-bib.opm
+\secc[usebib] The \code{\\usebib} command
+\printdoctail usebib.opm
+\secc The \code{usebib.opm} macro file loaded when \code{\\usebib} is used
+\printdoc usebib.opm
+
+\secc[isobib] Usage of the \code{bib-iso690} style
+{\everyintt={\catcode`\<=13 \visiblesp}
+\printdoctail bib-iso690.opm }
+
+\secc Implementation of the \code{bib-iso690} style
+\printdoc bib-iso690.opm
+
+\sec[makeindex] Sorting and making Index
+\printdoc makeindex.opm
+
+\sec[fnotes] Footnotes and marginal notes
+\printdoc fnotes.opm
+
+\sec Styles
+ \OpTeX/ provides three styles: `\report`, `\letter` and `\slides`.
+ Their behavior is documented in user part of the manual in the section
+ \ref[styles] and `\slides` style (for presentations) is documented in
+ `op-slides.pdf` which is an example of the presentation.
+\secc \code{\\report} and \code{\\letter} styles
+\printdoc styles.opm
+\secc[slides] \code{\\slides} style for presentations
+\printdoc slides.opm
+
+\sec Logos
+\printdoc logos.opm
+
+\sec Multilingual support
+\secc Lowercase, uppercase codes
+\printdoctail uni-lcuc.opm
+\secc Hyphenations
+\printdoc hyphen-lan.opm
+\printdoctail hyphen-lan.opm
+\secc[langphrases] Multilingual phrases and quotation marks
+\printdoc languages.opm
+
+\sec Other macros
+Miscellaneous macros are here.
+\printdoc others.opm
+
+\sec[lua] Lua code embedded to the format
+
+The file `optex.lua` is loaded into the format in `optex.ini` as byte-code
+and initialized by `\everyjob`, see section~\ref[init].
+
+The file implements part of the functionality from `luatexbase` namespace,
+nowadays defined by \LaTeX/ kernel. `luatexbase` deals with modules,
+allocators, and callback management. Callback management is a nice extension
+and is actually used in \OpTeX/. Other functions are defined more or less just
+to suit luaotfload's use.
+
+\newtoks \_hisyntaxlua
+\_hisyntaxlua={%
+ \_hicolor C \Green
+ \_replfromto {--}{^^J} {\z C{--#1}^^J}%
+}
+
+{\everytt={\typosize[8/10]\_let\_printverbline=\_printcodeline \medskip}
+ \commentchars-- \def\docfile{optex.lua} \ttline=-1
+ \_def\_printcomments{\_medskip
+ {\_catcodetable0 \_typosize[10/12]\_everypar={}\_scantextokens\_ea{\_vcomments}\par}%
+ \_bigskip
+ }
+
+\verbinput \hisyntax{lua} (4-) optex.lua
+}
+
+
+\sec Printing documentation
+\printdoctail doc.opm
+\printdoc doc.opm
+
+\enddocument
+
diff --git a/macros/optex/doc/optex-userdoc.tex b/macros/optex/doc/optex-userdoc.tex
new file mode 100644
index 0000000000..a70cedcf4d
--- /dev/null
+++ b/macros/optex/doc/optex-userdoc.tex
@@ -0,0 +1,2019 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+% This file is read from optex-doc.tex
+% Use: optex optex-doc (three times) to create whole documentation.
+
+\let\new=\relax
+
+\sec Starting with \OpTeX/
+%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\new
+\OpTeX/ is compiled as a format for \LuaTeX/. Maybe there is a command
+`optex` in your \TeX/ distribution. Then you can write into the command line
+
+\begtt
+optex document
+\endtt
+%
+You can try to process `optex op-demo` or `optex optex-doc`.
+
+If there is no `optex` command, see more information about installation
+\OpTeX/ at \url{http://petr.olsak.net/optex}.
+
+A minimal document should be
+
+\begtt
+\fontfam[LMfonts]
+Hello World! \bye
+\endtt
+
+The first line \~`\fontfam[LMfonts]` tells that Unicode Latin Modern
+fonts (derived from Computer Modern) are used. If you omit this line then
+preloaded Latin Modern fonts are used but preloaded fonts cannot be in
+Unicode\fnote
+{This is a technical limitation of \LuaTeX/ for fonts downloaded in formats:
+only 8bit fonts can be preloaded.}.
+So the sentence `Hello World` will be OK without the first line, but you
+cannot print such sentence in other languages (for example `Ahoj světe!`)
+where Unicode fonts are needed
+because the characters like `ě` are not mapped correctly in preloaded
+fonts.
+
+A somewhat larger example with common settings should be:
+
+\begtt \catcode`!=0
+\fontfam[Termes] % selecting Unicode font family Termes (section !ref[fontfam])
+\typosize[11/13] % setting default font size and baselineskip (sec. !ref[sizes])
+\margins/1 a4 (1,1,1,1)in % setting A4 paper, 1 in margins (section !ref[marg])
+\cslang % Czech hyphenation patterns (section !ref[lang])
+
+Tady je zkušební textík v českém jazyce.
+\bye
+\endtt
+%
+You can look at `op-demo.tex` file for a more complex, but still simple example.
+
+\sec Page layout
+%%%%%%%%%%%%%%%%
+
+\secc[marg] Setting the margins
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The \^`\margins` command declares margins of the document. This command have
+the following parameters:
+
+\begtt \catcode`\<=13
+\margins/<pg> <fmt> (<left>,<right>,<top>,<bot>)<unit>
+ example:
+\margins/1 a4 (2.5,2.5,2,2)cm
+\endtt
+
+Parameters are:
+
+\begitems
+* <pg> \dots\ `1` or `2` specifies one-page or two-pages design.
+* <fmt> \dots\ paper format (a4, a4l, a5, letter, etc. or user defined).
+* <left>, <right>, <top>, <bot> \dots\ gives the amount of left, right,
+ top and bottom margins.
+* <unit> \dots\ unit used for values <left>, <right>, <top>, <bot>.
+\enditems
+
+Each of the parameters <left>, <right>, <top>, <bot> can be empty.
+If both <left> and <right> are nonempty then `\hsize` is set. Else `\hsize`
+is unchanged. If both <left> and <right> are empty then typesetting area is
+centered in the paper format. The analogical rule works when <top> or <bot>
+parameter is empty (`\vsize` instead `\hsize` is used). Examples:
+
+\begtt
+\margins/1 a4 (,,,)mm % \hsize, \vsize untouched,
+ % typesetting area centered
+\margins/1 a4 (,2,,)cm % right margin set to 2cm
+ % \hsize, \vsize untouched, vertically centered
+\endtt
+
+If `<pg>=1` then all pages have the same margins. If `<pg>=2` then the
+declared margins are true for odd pages. The margins at the even pages are
+automatically mirrored in such case, it means that <left> is replaced by
+<right> and vice versa.
+
+\OpTeX/ declares following paper formats: a4, a4l (landscape~a4),
+a5, a5l, a3, a3l, b5, letter and user can declare another own format by \~`\sdef`:
+
+\begtt
+\sdef{_pgs:b5l}{(250,176)mm}
+\sdef{_pgs:letterl}{(11,8.5)in}
+\endtt
+
+The `<fmt>` can be also in the form `(<width>,<height>)<unit>` where `<unit>` is
+optional. If it is missing then `<unit>` after margins specification is
+used. For example:
+
+\begtt
+\margins/1 (100,200) (7,7,7,7)mm
+\endtt
+%
+declares the paper 100$\times$200\,mm with all four margins 7\,mm. The spaces
+before and after <fmt> parameter are necessary.
+
+The command \^`\magscale[<factor>]` scales the whole typesetting area.
+\new The fixed point of such scaling is the upper left corner of the paper sheet.
+Typesetting (breakpoints etc.) is unchanged. All units are relative after
+such scaling. Only paper format's dimensions stay unscaled. Example:
+
+\begtt
+\margins/2 a5 (22,17,19,21)mm
+\magscale[1414] \margins/1 a4 (,,,)mm
+\endtt
+%
+The first line sets the `\hsize` and `\vsize` and margins for final
+printing at a5 format. The setting on the second line centers the scaled
+typesetting area to the true a4 paper while breaking points for paragraphs
+and pages are unchanged. It may be usable for
+review printing. After the review is done, the second line can be commented out.
+
+\secc Concept of the default page
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\OpTeX/ uses \"output routine" for page design.
+It is very similar to the Plain \TeX/ output routine.
+There is \^`\headline` followed by \"page body" followed by
+\^`\footline`. The \^`\headline` is empty by default and it can be used
+for running headers repeated on each page. The \^`\footline` prints
+centered page number by default. You can set the \^`\footline` to empty
+using \^`\nopagenumbers` macro.
+
+The margins declared by \^`\margins` macro (documented in the previous
+section~\ref[marg]) is concerned to the page body,
+i.e.\ the \^`\headline` and \^`\footline` are placed to the top and bottom
+margins.
+
+The distance between the \^`\headline` and the top of the page body is given by
+the \^`\headlinedist` register. The distance between bottom of the page body and
+the \^`\footline` is given by \^`\footlinedist`. The default values are:
+
+\begtt
+\headline = {}
+\footline = {\_hss\_rmfixed \_folio \_hss} % \folio expands to page number
+\headlinedist = 14pt % from baseline of \headline to top of page body
+\footlinedist = 24pt % from last line in pagebody to baseline of footline
+\endtt
+
+The page body should be divided into top insertions (floating tables and
+figures) followed by a real text and followed by footnotes.
+Typically, the only real text is here.
+
+The \^`\pgbackground` tokens list is empty by default but it can be used for
+creating a background of each page (colors, picture, watermark for example).
+The macro \^`\draft` uses this register and puts big text DRAFT as a watermark
+to each page. You can try it.
+
+More about the page layout is documented in sections~\ref[oparams] and~\ref[output].
+
+\secc Footnotes and marginal notes
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The Plain \TeX/'s macro \^`\footnote` can be used as usual. But a new macro
+\^`\fnote{<text>}` is defined. The footnote mark is added automatically and it
+is numbered
+\new
+on each chapter from one\fnote
+{You can declare \^`\fnotenumglobal` if you want footnotes numbered in whole
+document from one or \^`\fnotenumpages` if you want footnotes numbered at each
+page from one. Default setting is \^`\fnotenumchapters`}.
+The <text> is scaled to 80 \%.
+User can redefine footnote mark or scaling, as shown in the section~\ref[fnotes].
+
+The \^`\fnote` macro is fully applicable only in \"normal outer" paragraph.
+It doesn't work inside boxes (tables, for example). If you are solving such
+a case then you can use the command \^`\fnotemark``<numeric-label>` inside the box: only the
+footnote mark is generated here. When the box is finished you can use
+\^`\fnotetext{<text>}`. This macro puts the <text> to the footnote.
+The <numeric-label> has to be `1` if only one such command is in the box.
+Second \^`\fnotemark` inside the same box has to have the parameter `2` etc.
+The same number of \^`\fnotetext`s have to be written
+after the box as the number of \^`\fnotemark`s inserted inside the box.
+Example:
+
+\begtt
+Text in a paragraph\fnote{First notice}... % a "normal" footnote
+\table{...}{...\fnotemark1...\fnotemark2...} % two footnotes in a box
+\fnotetext{Second notice}
+\fnotetext{Third notice}
+...
+\table{...}{...\fnotemark1...} % one footnote in a box
+\fnotetext{Fourth notice}
+\endtt
+
+The marginal note can be printed by the \^`\mnote{<text>}` macro. The <text>
+is placed to the right margin on the odd pages and it is placed to the left
+margin on the even pages. This is done after second \TeX{} run because the
+relevant information is stored in an external file and read from it again.
+If you need to place the notes only to the fixed margin write
+\^`\fixmnotes\right` or \^`\fixmnotes\left`.
+
+The <text> is formatted as a little paragraph with the maximal width
+\^`\mnotesize` ragged left on the left margins or ragged right on the right
+margins. The first line of this little paragraph has its vertical position
+given by the position of \^`\mnote` in the text. The exceptions are possible
+by using the `up` keyword: \~`\mnote`` up<dimen>{<text>}`.
+You can set such <dimen> to each \^`\mnote` manually in final printing
+in order to margin notes do not overlap. The positive value of <dimen>
+shifts the note up and negative value shifts it down. For example
+\^`\mnote`` up 2\baselineskip{<text>}` shifts this marginal note two lines up.
+
+\sec Fonts
+%%%%%%%%%%
+
+\secc[fontfam] Font families
+%%%%%%%%%%%%%%%%%%%%%%%
+
+You can select the font family by \^`\fontfam[<Family-name>]`.
+The argument <Family-name> is case insensitive and spaces are ignored in it. For
+example, \^`\fontfam[LM Fonts]` is equal to \^`\fontfam[LMfonts]` and it is equal
+to \^`\fontfam[lmfonts]`. Several aliases are prepared, thus
+\^`\fontfam[Latin Modern]` can be used for loading Latin Modern family too.
+
+If you write \^`\fontfam[?]` then all font families registered in \OpTeX/
+are listed on the terminal and in the log file.
+If you write \^`\fontfam[catalog]` then a catalog of all fonts registered in
+\OpTeX/ and available in your \TeX/ system is printed. The instructions
+on how to register your own font family are appended in the catalog.
+
+If the family is loaded then {\em font modifiers} applicable in such font family
+are listed on the terminal: (`\caps`, `\cond` for example).
+And there are four basic {\em variant selectors} (\^`\rm`, \^`\bf`, \^`\it`, \^`\bi`).
+The usage of variant selectors is the same as in Plain \TeX:
+`{\it italics text}`, `{\bf bold text}` etc.
+
+The font modifiers (`\caps`, `\cond` for example) can
+be used before a variant selector and they
+can be (independently) combined: `\caps\it` or `\cond\caps\bf`. The
+modifiers keep their internal setting until the group ends or until another
+modifier that negates the previous feature is used. So
+`{\caps \rm First text \it Second text}`
+gives {\caps \rm First text \it Second text}.
+
+The font modifier without following variant selector does not change the font
+actually, it only prepares data used by next variant selectors.
+There is one special variant selector \^`\currvar` which does not change the
+selected variant but reloads the font due to (maybe newly
+specified) font modifier(s).
+
+The context between variants \^`\rm` $\leftrightarrow$ \^`\it` and
+\^`\bf` $\leftrightarrow$ \^`\bi` is kept by the \^`\em`
+macro (emphasize text).
+It switches from current \^`\rm` to \^`\it`, from current \^`\it` to \^`\rm`, from
+current \^`\bf` to \^`\bi` and from current \^`\bi` to \^`\bf`.
+The italics correction `\/` is inserted automatically, if needed. Example:
+
+\begtt
+This is {\em important} text. % = This is {\it important\/} text.
+\it This is {\em important} text. % = This is\/ {\rm important} text.
+\bf This is {\em important} text. % = This is {\bi important\/} text.
+\bi This is {\em important} text. % = This is\/ {\bf important} text.
+\endtt
+
+\new
+More about the \OpTeX/ Font Selection System is written in the technical
+documentation in the section~\ref[fontsystem].
+You can mix more font families in your document, you can
+declare your own variant selectors or modifiers, etc.
+
+\secc[sizes] Font sizes
+%%%%%%%%%%%%%%%%%%%%%
+
+The command \^`\typosize[<fontsize>/<baselineskip>]` sets the font size of text and
+math fonts and baselineskip. If one of these two parameters is empty, the
+corresponding feature stays unchanged. Don't write the unit of these
+parameters. The unit is internally set to \^`\ptunit` which is 1pt by default.
+You can change the unit by the command \^`\ptunit=<something-else>`,
+for instance \^`\ptunit=1mm` enlarges all font sizes declared by \^`\typosize`.
+Examples:
+
+\begtt
+\typosize[10/12] % default of Plain TeX
+\typosize[11/12.5] % font 11pt, baseline 12.5pt
+\typosize[8/] % font 8pt, baseline unchanged
+\endtt
+
+The commands for font size setting described in this section
+have local validity. If you put them into a group,
+the settings are lost when the group is finished. If you set
+something relevant with paragraph shape (baselineskip given by
+\^`\typosize` for example) then you must first finalize the
+paragraph before closing the group:
+`{\typosize[12/14] ...<text of paragraph>... \par}`.
+
+The command \^`\typoscale[<font-factor>/<baselineskip-factor>]`
+sets the text and math fonts
+size and baselineskip as a multiple of the current fonts size and
+baselineskip. The factor is written in \"scaled"-like way, it means that 1000
+means factor one. The empty parameter is equal to the parameter 1000,
+i.e. the value stays unchanged. Examples:
+
+\begtt
+\typoscale[800/800] % fonts and baselineskip re-size to 80 %
+\typoscale[\magstep2/] % fonts bigger 1,44times (\magstep2 expands to 1440)
+\endtt
+
+First usage of \^`\typosize` or \^`\typoscale` macro in your document sets so-called {\em main values}, i.\,e.\ main font size and main baselineskip. They are internally
+saved in registers \^`\mainfosize` and \^`\mainbaselineskip`.
+
+\new
+The \^`\typoscale` command does scaling with respect to current values by default.
+If you want to do it with respect to the main values, type \^`\scalemain` immediately
+before \^`\typoscale` command.
+
+\begtt
+\typosize[12/14.4] % first usage in document, sets main values internally
+\typosize[15/18] % bigger font
+\scalemain \typoscale[800/800] % reduces from main values, no from current.
+\endtt
+
+The \^`\typosize` and \^`\typoscale` macros initialize the font family by `\rm`.
+You can re-size only the current font by the command
+\^`\thefontsize[<font-size>]` or the font can be rescaled by
+\^`\thefontscale[<factor>]`. These macros don't change math fonts sizes nor
+baselineskip.
+
+\new
+There is \"low level" \^`\setfontsize{<size-spec>}` command which behaves like
+a font modifier and sets given font size used by next variant selectors.
+It doesn't change the font size immediately, but the following variant selector
+does it. For example \^`\setfontsize{at15pt}`\^`\currvar` sets current variant to 15pt.
+
+If you are using a font family with \"optical sizes feature" (i.\,e.\ there
+are more recommended sizes of the same font which are not scaled
+linearly; a good example is Computer Modern aka Latin Modern fonts)
+then the recommended size is selected by all mentioned commands automatically.
+
+More information about resizing of fonts is documented in the
+section~\ref[setfontsize].
+
+\secc Typesetting math
+%%%%%%%%%%%%%%%%%%%%%
+
+See the additional document
+\ulink[http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf]
+{Typesetting Math with \OpTeX/} for more details about this issue.
+
+\OpTeX/ preloads a collection of 7bit Computer Modern math fonts
+and AMS fonts in its format for math typesetting.
+You can use them in any size and in the \^`\boldmath` variant.
+%
+\new
+Most declared text font families (see \^`\fontfam` in the section~\ref[fontfam])
+are configured with a recommended Unicode
+math font. This font is automatically loaded unless you specify
+\^`\noloadmath` before first \^`\fontfam` command. See log file for more
+information about loading text font family and Unicode math fonts. If you
+prefer another Unicode math font, specify it by \^`\loadmath{[<font-file>]}`
+or \^`\loadmath{<font-name>}` before first \^`\fontfam` command.
+
+Hundreds math symbols and operators like in AMS\TeX/ are accessible.
+For example `\alpha` $\alpha$, `\geq`~$\geq$, `\sum` $\sum$,
+`\sphericalangle` $\sphericalangle$, `\bumpeq`, $\bumpeq$. See AMS\TeX/
+manual or
+\ulink[http://petr.olsak.net/ftp/olsak/optex/optex-math.pdf]
+{Typesetting Math with \OpTeX/} for complete list of math symbols.
+
+The following math alphabets are available:
+
+\begtt \catcode`\$=3 \catcode`/=0 \medmuskip=0mu \adef{ }{ }
+\mit % mathematical variables $abc-xyz,ABC-XYZ$
+\it % text italics $/it abc-xyz,ABC-XYZ$
+\rm % text roman $/rm abc-xyz,ABC-XYZ$
+\cal % normal calligraphics $/cal ABC-XYZ$
+\script % script $/script ABC-XYZ$
+\frak % fracture $/frak abc-xyz,ABC-XYZ$
+\bbchar % double stroked letters $/bbchar ABC-XYZ$
+\bf % sans serif bold $/bf abc-xyz,ABC-XYZ$
+\bi % sans serif bold slanted $/bi abc-xyz,ABC-XYZ$
+\endtt
+
+The last two selectors \^`\bf` and \^`\bi` select the sans serif fonts in math regardless of the current text font family. This is a common notation for vectors and
+matrices. You can re-declare them, see section~\ref[unimath-codes] where
+definitions of Unicode math variants of \^`\bf` and \^`\bi` selectors are documented.
+
+The math fonts can be scaled by \^`\typosize` and \^`\typoscale` macros.
+Two math fonts collections are prepared: \^`\normalmath` for normal weight
+and \^`\boldmath` for bold. The first one is set by default, the second one
+is usable for math formulae in titles typeset in bold, for example.
+
+\new
+You can use \^`\mathbox{<text>}` inside math mode. It behaves as `{\hbox{<text>}}`
+(i.e. the <text> is printed in horizontal non-math mode)
+but the size of the <text> is adapted to the context of math size (text or script or
+scriptscript).
+
+\sec Typical elements of the document
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\secc[chap] Chapters and sections
+%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The documents can be divided into chapters (\^`\chap`),
+sections (\^`\sec`), subsections (\^`\secc`) and they can be titled
+by \^`\tit` command. The parameters are separated by the end of current line (no
+braces are used):
+
+\begtt \catcode`\<=13
+\tit Document title <end of line>
+\chap Chapter title <end of line>
+\sec Section title <end of line>
+\secc Subsection title <end of line>
+\endtt
+
+The chapters are automatically numbered by one number, sections by two numbers
+(chapter.section), and subsections by three numbers. If there are no chapters
+then sections have only one number and subsections two.
+
+The implicit design of the titles of chapter etc.\ is implemented in the
+macros \^`\_printchap`, \^`\_printsec` and \^`\_printsecc`. A designer can simply change
+these macros if he/she needs another behavior.
+
+The first paragraph after the title of chapter, section, and subsection is
+not indented but you can type `\let`\^`\_firstnoindent=\relax` if you need all
+paragraphs indented.
+
+If a title is so long then it breaks into more lines in the output. It is better to hint at the
+breakpoints because \TeX/ does not interpret the meaning of the title.
+Users can put the \^`\nl` (means newline) to the breakpoints.
+
+If you want to arrange a title to more lines in your source file then you can
+use `^^J` at the end of each line (except the last one).
+When `^^J` is used, then the reading of the title continues at the next line.
+The \"normal" comment character `%` doesn't work in titles.
+You can use \^`\nl`{\visiblesp` ^^J`} if you want to have corresponding lines in the source
+and the output.
+
+The chapter, section, or subsection isn't numbered if the \^`\nonum` precedes.
+And the chapter, section, or subsection isn't delivered to the table of
+contents if \^`\notoc` precedes. You can combine both prefixes.
+
+\secc[cap] Another numbered objects
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+Apart from chapters, sections, and subsections, there are another
+automatically numbered objects: equations, captions for tables and
+figures. The user can declare more numbered objects.
+
+If the user writes the \^`\eqmark` as the last element of the display mode then
+this equation is numbered. The equation number is printed in brackets. This number
+is reset in each section by default.
+
+If the \^`\eqalignno` is used, then user can put \^`\eqmark` to the last column
+before `\cr`. For example:
+
+\begtt
+\eqalignno{
+ a^2+b^2 &= c^2 \cr
+ c &= \sqrt{a^2+b^2} & \eqmark \cr}
+\endtt
+
+Another automatically numbered object is a caption which is tagged by \^`\caption/t` for
+tables and \^`\caption/f` for figures. The caption text follows.
+The \^`\cskip` can be used between \^`\caption` text and the real object (table
+or figure). You can use two orders: `<caption>\cskip <object>` or
+`<object>\cskip <caption>`.
+The \^`\cskip` creates appropriate vertical space between them. Example:
+
+\begtt
+\caption/t The dependency of the computer-dependency on the age.
+\cskip
+\noindent\hfil\table{rl}{
+ age & value \crl\noalign{\smallskip}
+ 0--1 & unmeasured \cr
+ 1--6 & observable \cr
+ 6--12 & significant \cr
+ 12--20 & extremal \cr
+ 20--40 & normal \cr
+ 40--60 & various \cr
+ 60--$\infty$ & moderate}
+\endtt
+
+This example produces:
+
+\medskip
+\caption/t The dependency of the computer-dependency on the age.
+\cskip
+\noindent\hfil\table{rl}{
+ age & value \crl\noalign{\smallskip}
+ 0--1 & unmeasured \cr
+ 1--6 & observable \cr
+ 6--12 & significant \cr
+ 12--20 & extremal \cr
+ 20--40 & normal \cr
+ 40--60 & various \cr
+ 60--$\infty$ & moderate}
+\medskip
+
+You can see that the word \"Table" followed by a number is added by the macro
+`\caption/t`.
+The caption text is centered. If it occupies more lines then the
+last line is centered.
+
+The macro \^`\caption/f` behaves like \^`\caption/t` but it is intended for
+figure captions with independent numbering.
+The word (Table, Figure) depends on the selected language (see
+section~\ref[lang] about languages).
+
+If you wish to make the table or figure as a floating object, you need to use
+Plain \TeX/ macros \^`\midinsert` or \^`\topinsert` terminated by \^`\endinsert`.
+Example:
+
+\begtt
+\topinsert % table and its caption printed at the top of the current page
+ <caption and table>
+\endinsert
+\endtt
+%
+The pair \^`\midinsert`...\^`\endinsert` prefers to put the enclosed object
+to the current place. Only if this is unable due to page breaking, it
+behaves like \^`\topinsert`...\^`\endinsert`.
+
+\new
+There are five prepared counters `A`, `B`, `C`, `D` and `E`.
+They are reset in each chapter and section\fnote
+{This feature can be changed, see the section~\ref[sections] in the technical documentation.}.
+They can be used in context of \^`\numberedpar` `<letter>{<text>}`
+macro. For example:
+\begtt
+\def\theorem {\numberedpar A{Theorem}}
+\def\corollary {\numberedpar A{Corollary}}
+\def\definition {\numberedpar B{Definition}}
+\def\example {\numberedpar C{Example}}
+\endtt
+%
+Three independent numbers are used in this example. One for Theorems and Corollaries
+second for Definitions and third for Examples. The user can write
+`\theorem Let $M$ be...` and the new paragraph is started with the text:
+{\bf Theorem 1.4.1.} Let $M$ be...
+You can add an optional parameter in brackets. For example,
+`\theorem [(L'Hôpital's rule)] Let $f$, $g$ be...`
+is printed like {\bf Theorem 1.4.2 (L'Hôpital's rule).} Let $f$, $g$ be...
+
+\secc References
+%%%%%%%%%%%%%%%
+
+Each automatically numbered object documented in
+sections \ref[chap] and \ref[cap] can be referenced
+\new
+if optional parameter
+`[<label>]` is appended to \^`\chap`, \^`\sec`,
+\^`\secc`, \^`\caption/t`, \^`\caption/f` or \^`\eqmark`. The alternative syntax is
+to use \^`\label[<label>]` before mentioned commands (not necessarily directly
+before). The reference is realized by \^`\ref[<label>]` or \^`\pgref[<label>]`.
+Example:
+
+\begtt
+\sec[beatle] About Beatles
+
+\noindent\hfil\table{rl}{...} % the table
+\cskip
+\caption/t [comp-depend] The dependency of the comp-dependency on the age.
+
+\label[pythagoras]
+$$ a^2 + b^2 = c^2 \eqmark $$
+
+Now we can point to the section~\ref[beatle] on the page~\pgref[beatle]
+or write something about the equation~\ref[pythagoras]. Finally there
+is an interesting Table~\ref[comp-depend].
+\endtt
+
+If there are forward referenced objects then users have to run \TeX{} twice.
+During each pass, the working `*.ref` file (with references data) is created
+and this file is used (if it exists) at the beginning of the document.
+
+You can use the \^`\label[<label>]` before the `\theorem`, `\definition` etc.\
+(macros defined with `\numberedpar`) if you want to reference these numbered objects.
+You can't use `\theorem[<label>]` because the optional parameter
+is reserved to another purpose here.
+
+You can create a reference to whatever else by commands
+\^`\label[<label>]`\^`\wlabel{<text>}`. The connection between <label> and
+<text> is established. The \^`\ref[<label>]` will print <text>.
+
+By default, labels are not printed, of course. But if you are preparing a
+draft version of your document then you can declare \^`\showlabels`. The labels
+are printed at their destination places after such a declaration.
+
+\secc Hyperlinks, outlines
+%%%%%%%%%%%%%%%%%%%%%%%%%
+
+If the command \^`\hyperlinks` `<color-in> <color-out>` is used at the beginning of
+the document, then the following objects are hyperlinked in the PDF output:
+
+\begitems
+* numbers and texts generated by \^`\ref` or \^`\pgref`,
+* numbers of chapters, sections, subsections, and page numbers in the table of contents,
+* numbers or marks generated by \~`\cite` command (bibliography references),
+* texts printed by \~`\url` or \~`\ulink` commands.
+\enditems
+
+The last object is an external link and it is colored by
+<color-out>. Other links are internal and they are colored by
+<color-in>. Example:
+
+\begtt
+\hyperlinks \Blue \Green % internal links blue, URLs green.
+\endtt
+
+You can use another marking of active links: by frames which are visible in
+the PDF viewer but invisible when the document is printed. The way to do it
+is to define the macros \^`\_pgborder`, \^`\_tocborder`, \^`\_citeborder`,
+\^`\_refborder` and \^`\_urlborder` as the triple of RGB components of the used
+color. Example:
+
+\begtt
+\def\_tocborder {1 0 0} % links in table of contents: red frame
+\def\_pgborder {0 1 0} % links to pages: green frame
+\def\_citeborder {0 0 1} % links to references: blue frame
+\endtt
+
+By default, these macros are not defined. It means that no frames are created.
+
+The hyperlinked footnotes can be activated by \^`\fnotelinks` `<color-fnt> <color-fnf>`
+where footnote marks in the text have `<color-fnt>` and the same footnote marks
+in footnotes have <color-fnf>. You can define relevant borders
+\^`\_fntborder` and \^`\_fnfborder` analogically as \^`\_pgborder` (for example).
+
+There are \"low level" commands to create the links. You can specify the
+destination of the internal link by \^`\dest[<type>:<label>]`. The
+active text linked to the \^`\dest` can be created by
+\^`\ilink[<type>:<label>]{<text>}`. The `<type>` parameter is one of
+the `toc`, `pg`, `cite`, `ref`, or another special for your purpose.
+These commands create internal links only when \^`\hyperlinks` is declared.
+
+The \^`\url` macro prints its parameter in \~`\tt` font and creates a potential
+breakpoints in it (after slash or dot, for example). If the \^`\hyperlinks`
+declaration is used then the parameter of \^`\url` is treated as an external URL link.
+An example: `\url{http://www.olsak.net}` creates \url{http://www.olsak.net}.
+The characters \code{\%}, `\`, `#`, `{`, and `}` have to be protected by
+backslash in the \^`\url` argument, the other special characters `~`,
+`^`, `&` can be written as single character\fnote
+{More exactly, there are the same rules as for `\code` command, see
+section~\ref[verbatim].}.
+You can insert the `\|` command
+in the `\url` argument as a potential breakpoint.
+
+If the linked text have to be different than the URL, you can use
+\^`\ulink[<url>]{<text>}` macro. For example:
+`\ulink[http://petr.olsak.net/optex]{\OpTeX/ page}`
+outputs to the text
+\ulink[http://petr.olsak.net/optex]{\OpTeX/ page}.
+The characters \code{\%}, `\`, `#`, `{`, and `}` must by escaped in
+the <url> parameter.
+
+The PDF format provides {\em outlines} which are notes placed in the special frame of
+the PDF viewer. These notes can be managed as a structured and hyperlinked
+table of contents of the document. The command \^`\outlines{<level>}` creates
+such outlines from data used for the table of contents in the document. The
+<level> parameter gives the level of opened sub-outlines
+in the default view. The deeper levels can be opened by mouse click on the
+triangle symbol after that.
+
+\new
+If you are using a special unprotected macro in section titles then \^`\outlines` macro
+may crash. You must declare a variant of the macro for outlines case which is
+expandable. Use \~`\regmacro` in this case. See the section \ref[toc] for more information
+about \~`\regmacro`.
+
+The command \^`\insertoutline{<text>}` inserts a next entry into PDF outlines at
+the main level~0. These entries can be placed before the table of contents (created
+by \^`\outlines`) or after it. Their hyperlink destination is in the place
+where the \^`\insertoutline` macro is used.
+
+The command \^`\thisoutline{<text>}` uses <text> in the outline instead of default
+title text for the first following `\chap`, `\sec`, or `\secc`.
+Special case: \^`\thisoutline{\relax}` doesn't create any outline for the following
+`\chap`, `\sec`, or `\secc`.
+
+\secc Lists
+%%%%%%%%%%
+
+The list of items is surrounded by \^`\begitems` and \^`\enditems` commands.
+The asterisk (`*`) is active within this environment and it starts one item.
+The item style can be chosen by the \^`\style` parameter written after \^`\begitems`:
+
+\begtt
+\style o % small bullet
+\style O % big bullet (default)
+\style - % hyphen char
+\style n % numbered items 1., 2., 3., ...
+\style N % numbered items 1), 2), 3), ...
+\style i % numbered items (i), (ii), (iii), ...
+\style I % numbered items I, II, III, IV, ...
+\style a % items of type a), b), c), ...
+\style A % items of type A), B), C), ...
+\style x % small rectangle
+\style X % big rectangle
+\endtt
+
+For example:
+
+\begtt
+\begitems
+* First idea
+* Second idea in subitems:
+ \begitems \style i
+ * First sub-idea
+ * Second sub-idea
+ * Last sub-idea
+ \enditems
+* Finito
+\enditems
+\endtt
+%
+produces:
+
+\begitems
+* First idea
+* Second idea in subitems:
+ \begitems \style i
+ * First sub-idea
+ * Second sub-idea
+ * Last sub-idea
+ \enditems
+* Finito
+\enditems
+
+Another style can be defined by the command \~`\sdef{_item:<style>}{<text>}`.
+Default item can be set by \^`\defaultitem={<text>}`.
+The list environments can be nested. Each new level of items is indented by
+next multiple of \^`\iindent` value which is set to `\parindent` by default.
+The \^`\ilevel` register says what level of items is currently processed.
+Each \^`\begitems` starts \^`\everylist` tokens register. You can set, for
+example:
+\begtt
+\everylist={\ifcase\ilevel\or \style X \or \style x \else \style - \fi}
+\endtt
+
+You can say \^`\begitems` \^`\novspaces` if you don't want vertical spaces above
+and below the list. The nested item list is without vertical spaces
+automatically. More information about the design of lists of items should be
+found in the section~\ref[lists].
+
+A \"selected block of text" can be surrounded by
+\^`\begblock`\dots\^`\endblock`. The default design of blocks of text is
+indented text in smaller font. The blocks of text can be nested.
+
+\secc Tables
+%%%%%%%%%%%
+
+The macro \^`\table{<declaration>}{<data>}` provides similar <declaration>
+of tables as in \LaTeX: you can use letters `l`, `r`, `c`, each letter declares
+one column (aligned to left, right, center, respectively).
+These letters can be combined by the `|` character (vertical line). Example
+
+\begtt
+\table{||lc|r||}{ \crl
+ Month & commodity & price \crli \tskip2pt
+ January & notebook & \$ 700 \cr
+ February & skateboard & \$ 100 \cr
+ July & yacht & k\$ 170 \crl}
+\endtt
+%
+generates the result:
+
+\vskip-\medskipamount
+\noindent\hfil\table{||lc|r||}{ \crl
+ Month & commodity & price \crli \tskip2pt
+ January & notebook & \$ 700 \cr
+ February & skateboard & \$ 100 \cr
+ July & yacht & k\$ 170 \crl}
+\medskip
+
+Apart from `l`, `r`, `c` declarators, you can use the `p{<size>}` declarator
+which declares the column with paragraphs of given width. More precisely,
+a long text in the table cell is printed as a multiline paragraph with given width.
+By default, the paragraph is left-right justified. But there are
+alternatives:
+
+\begitems
+* `p{<size>`\^`\fL}` fit left, i.e.\ left justified, ragged right,
+* `p{<size>`\^`\fR}` fit right, i.e.\ right justified, ragged left,
+* `p{<size>`\^`\fC}` fit center, i.e.\ ragged left plus right,
+* `p{<size>`\^`\fS}` fit special, short one-line pararaph centered,
+ long paragraph normal,
+* `p{<size>`\^`\fX}` fit extra, left-right justified but last line centered.
+\enditems
+
+You can use `(<text>)` in the <declaration>. Then this text is applied in
+each line of the table. For example `r(\kern10pt)l` adds more 10\,pt space
+between `r` and `l` rows.
+
+An arbitrary part of the <declaration> can be repeated by a <number>
+prefixed. For example `3c` means `ccc` or `c 3{|c}` means
+`c|c|c|c`. Note that spaces in the <declaration> are ignored and you
+can use them in order to more legibility.
+
+The command `\cr` used in the <data> part of the table
+is generally known from Plain \TeX. It marks the end of each row in the table.
+Moreover \OpTeX/ defines following similar commands:
+
+\begitems
+* \^`\crl` \dots\ the end of the row with a horizontal line after it.
+* \^`\crll` \dots\ the end of the row with a double horizontal line after it.
+* \^`\crli` \dots\ like \^`\crl` but the horizontal line doesn't intersect the
+ vertical double lines.
+* \^`\crlli` \dots\ like \^`\crli` but horizontal line is doubled.
+* \^`\crlp{<list>}` \dots\ like \^`\crli` but the lines are drawn only in the
+ columns mentioned in comma-separated `<list>` of their numbers.
+ The <list> can include `<from>-<to>` declarators, for example
+ \^`\crlp{1-3,5}` is equal to \^`\crlp{1,2,3,5}`.
+\enditems
+
+The \^`\tskip``<dimen>` command works like the `\noalign{\vskip<dimen>}`
+immediately after `\cr*` commands but it doesn't interrupt the vertical lines.
+
+\new
+You can use the following parameters for the \^`\table` macro. Default values are listed
+too.
+
+\begtt
+\everytable={} % code used in \vbox before table processing
+\thistable={} % code used in \vbox, it is removed after using it
+\tabiteml={\enspace} % left material in each column
+\tabitemr={\enspace} % right material in each column
+\tabstrut={\strut} % strut which declares lines distance in the table
+\tablinespace=2pt % additional vert. space before/after horizontal lines
+\vvkern=1pt % space between lines in double vertical line
+\hhkern=1pt % space between lines in double horizontal line
+\tabskip=0pt % space between columns
+\tabskipl=0pt \tabskipr=0pt % space before first and after last column
+\endtt
+
+Example: if you do \^`\tabiteml={$\enspace}`\^`\tabitemr={\enspace$}` then
+the \^`\table` acts like \LaTeX's array environment.
+
+If there is an item that spans to more than one column in the table then
+the macro \^`\multispan{<number>}` (from Plain \TeX) can help you. Another
+alternative is
+the command \^`\mspan``<number>[<declaration>]{<text>}`
+which spans <number> columns and formats the <text> by the
+<declaration>. The <declaration> must include a declaration of only one column
+with the same syntax as common \^`\table` <declaration>.
+If your table includes vertical rules and you want to
+create continuous vertical rules by \^`\mspan`, then use rule declarators `|`
+after `c`, `l` or `r` letter in \^`\mspan` <declaration>. The
+exception is only in the case when \^`\mspan` includes the first
+column and the table have rules on the left side. The example of \^`\mspan`
+usage is below.
+
+The \^`\frame{<text>}` makes a frame around <text>. You can put the whole \^`\table`
+into \^`\frame` if you need double-ruled border of the table. Example:
+
+\begtt
+\frame{\table{|c||l||r|}{ \crl
+ \mspan3[|c|]{\bf Title} \crl \noalign{\kern\hhkern}\crli
+ first & second & third \crlli
+ seven & eight & nine \crli}}
+\endtt
+%
+creates the following result:
+
+\hfil\frame{\table{|c||l||r|}{\crl
+ \mspan3[|c|]{\bf Title} \crl \noalign{\kern\hhkern}\crli
+ first & second & third \crlli
+ seven & eight & nine \crli}}
+\bigskip
+
+The \^`\vspan``<number>{<text>}` shifts the <text> down in order it looks
+like to be in the center of the <number> lines (current line is first).
+You can use this for creating tables like in the following example:
+
+\begtt \typosize[8.7/11]
+\thistable{\tabstrut={\vrule height 20pt depth10pt width0pt}
+ \baselineskip=20pt \tablinespace=0pt \rulewidth=.8pt}
+\table{|8{c|}}{\crlp{3-8}
+ \mspan2[c|]{} & \mspan3[c|]{Singular} & \mspan3[c|]{Plural} \crlp{3-8}
+ \mspan2[c|]{} & Neuter & Masculine & Feminine & Masculine & Feminine & Neuter \crl
+ \vspan2{I} & Inclusive & \mspan3[c|]{\vspan2{O}} & \mspan3[c|]{X} \crlp{2,6-8}
+ & Exclusive & \mspan3[c|]{} & \mspan3[c|]{X} \crl
+ \vspan2{II} & Informal & \mspan3[c|]{X} & \mspan3[c|]{X} \crlp{2-8}
+ & Formal & \mspan6[c|]{X} \crl
+ \vspan2{III} & Informal & \vspan2{O} & X & X & \mspan2[c|]{X} &\vspan2{O} \crlp{2,4-7}
+ & Formal & & \mspan4[c|]{X} & \crl
+}
+\endtt
+
+\puttext 8.9cm -4cm {\pdfsave\pdfscale{.5}{.5}\rlap{%
+\thistable{\tabstrut={\vrule height 20pt depth10pt width0pt}
+ \baselineskip=20pt \tablinespace=0pt \rulewidth=.8pt}
+\table{|8{c|}}{\crlp{3-8}
+ \mspan2[c|]{} &\mspan3[c|]{Singular} &\mspan3[c|]{Plural} \crlp{3-8}
+ \mspan2[c|]{} & Neuter & Masculine & Feminine & Masculine & Feminine & Neuter \crl
+ \vspan2{I} & Inclusive & \mspan3[c|]{\vspan2{O}} &\mspan3[c|] X \crlp{2,6-8}
+ & Exclusive & \mspan3[c|]{} &\mspan3[c|] X \crl
+ \vspan2{II} & Informal & \mspan3[c|] X &\mspan3[c|] X \crlp{2-8}
+ & Formal & \mspan6[c|] X \crl
+ \vspan2{III} & Informal & \vspan2{O} & X & X &\mspan2[c|] X & \vspan2{O} \crlp{2,4-7}
+ & Formal & &\mspan4[c|] X & \crl
+}}\pdfrestore}
+
+\hangindent=-7.5cm \hangafter=0
+You can use \^`\vspan` with non-integer parameter too if you feel that the
+result looks better, for example \^`\vspan2.1{text}`.
+
+\hangindent=-7.5cm \hangafter=0
+The rule width of tables and implicit width of all `\vrule`s and `\hrule`s
+can be set by the command \^`\rulewidth=<dimen>`. The default value given
+by \TeX/ is 0.4\,pt.
+
+\hangindent=-7.5cm \hangafter=-2
+The `c`, `l`, `r` and `p` are default \"declaration letters" but you can define
+more such letters by `\def\_tabdeclare<letter>{<left>##<right>}`.
+More about it is in technical documentation in section~\ref[table.impl].
+See the definition of the \^`\_tabdeclarec` macro, for example.
+
+The `:` columns boundary declarator is described in section~\ref[table.bound].
+The tables with given width can be declared by `to<size>` or `pxto<size>`.
+More about it is in section~\ref[table.w].
+Many tips about tables can be seen on the site
+\url{http://petr.olsak.net/optex/optex-tricks.html}.
+
+\label[verbatim]\secc Verbatim
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+The display verbatim text have to be surrounded by the \^`\begtt` and
+\^`\endtt` couple.
+The in-line verbatim have to be tagged (before and after)
+by a character which is declared by
+\^`\verbchar``<char>`. For example \code{\\verbchar`}
+declares the character \code{`}
+for in-line verbatim markup.
+And you can use \code{`\\relax`} for
+verbatim `\relax` (for example).
+\new
+Another alternative of printing in-line
+verbatim text is \~`\code{<text>}` (see below).
+
+If the numerical register \^`\ttline` is set to the non-negative value then
+display verbatim will number the lines. The first line has the number
+\^`\ttline+1` and when the verbatim ends then the \^`\ttline` value is equal to the
+number of the last line printed. Next \^`\begtt...`\^`\endtt` environment will follow
+the line numbering. \OpTeX/ sets \^`\ttline=-1` by default.
+
+The indentation of each line in display verbatim is controlled by
+\^`\ttindent` register. This register is set to the `\parindent` by default.
+Users can change the values of the `\parindent` and \^`\ttindent` independently.
+
+The \^`\begtt` command starts the internal group in which the catcodes are changed.
+\new
+Then the \^`\everytt` tokens register is run. It is empty by default and the user can
+control fine behavior by it. For example, the catcodes can be re-declared here. If
+you need to define an active character in the \^`\everytt`, use \~`\adef` as in the
+following example:
+
+\begtt \adef@{\string\endtt}
+\everytt={\adef!{?}\adef?{!}}
+\begtt
+Each occurrence of the exclamation mark will be changed to
+the question mark and vice versa. Really? You can try it!
+@
+\endtt
+%
+The \~`\adef` command sets its parameter as active {\it after\/}
+the parameter of \^`\everytt` is read. So you don't have to worry about active
+categories in this parameter.
+
+There is an alternative to \^`\everytt` named \^`\everyintt` which is used for
+in-line verbatim surrounded by an \^`\verbchar` or processed by the \~`\code`
+command.
+
+The \^`\everytt` is applied to all \^`\begtt...`\^`\endtt` environments (if it is not
+declared in a group). There are tips for such global `\everytt` definitions here:
+
+\begtt \adef!{\char9251 }
+\everytt={\typosize[9/11]} % setting font size for verbatim
+\everytt={\ttline=0} % each listing will be numbered from one
+\everytt={\visiblesp} % visualization!of!spaces
+\endtt
+
+\new
+If you want to apply a special code only for one \^`\begtt...`\^`\endtt`
+environment then don't set any \^`\everytt` but put desired material at the
+same line where \^`\begtt` is. For example:
+
+\begtt \adef@{\string\endtt}
+\begtt \adef!{?}\adef?{!}
+Each occurrence of ? will be changed to ! and vice versa.
+@
+\endtt
+
+The in-line verbatim surrounded by a \^`\verbchar` doesn't work in
+parameter of macros and macro definitions. (It works in titles declared by
+\~`\chap`, \~`\sec` etc. and in \~`\fnote`s, because these macros are
+specially defined in \OpTeX/).
+\new
+You can use more robust command \^`\code{<text>}` in problematic
+situations, but you have to escape the following characters in the <text>:
+`\`, `#`, `%`, braces (if the braces are unmatched in the <text>),
+and space or `^` (if there are more than one subsequent spaces or `^` in
+the <text>). Examples:
+
+\begtt
+\code{\\text, \%\#} ... prints \text, %#
+\code{@{..}*&^$ $} ... prints @{..}*&^$ $ without escaping, but you can
+ escape these characters too, if you want.
+\code{a \ b} ... two spaces between a b, the second must be escaped
+\code{xy\{z} ... xy{z ... unbalanced brace must be escaped
+\code{^\^M} ... prints ^^M, the second ^ must be escaped
+\endtt
+
+You can print verbatim listing from external files by the \^`\verbinput` command.
+Examples:
+
+\begtt
+\verbinput (12-42) program.c % listing from program.c, only lines 12-42
+\verbinput (-60) program.c % print from begin to the line 60
+\verbinput (61-) program.c % from line 61 to the end
+\verbinput (-) program.c % whole file is printed
+\verbinput (70+10) program.c % from line 70, only 10 lines printed
+\verbinput (+10) program.c % from the last line read, print 10 lines
+\verbinput (-5+7) program.c % from the last line read, skip 5, print 7
+\verbinput (+) program.c % from the last line read to the end
+\endtt
+
+\new
+You can insert additional commands for \^`\verbinput` before
+the first opening bracket. They are processed in the local group.
+For example, `\verbinput \hsize=20cm (-) program.c`.
+
+The \~`\ttline` influences the line numbering by the same way as in
+\~`\begtt...`\~`\endtt` environment. If \~`\ttline=-1` then real line numbers are
+printed (this is the default). If \code{\\ttline<-1} then no line
+numbers are printed.
+
+The \^`\verbinput` can be controlled by \^`\everytt`, \^`\ttindent` just like
+in \~`\begtt...`\~`\endtt`.
+
+The \~`\begtt`...\~`\endtt` pair or \~`\verbinput` can be used for listings of
+codes. Automatic syntax highlighting is possible, for example
+`\begtt` \^`\hisyntax{C}` activates colors for C programs. Or
+`\verbinput` \^`\hisyntax{HTML} (-) file.html` can be used for HTML or XML codes.
+\OpTeX/ implements C, Python, \TeX/, HTML and XML syntax highlighting.
+More languages can be declared, see the section~\ref[hisyntax].
+
+If the code is read by \^`\verbinput` and there are comment lines prefixed
+by two characters then
+you can set them by \~`\commentchars``<first><second>`. Such comments are
+fully interpreted by \TeX/ (i.e. not verbatim).
+Section~\ref[verb] (page \pgref[commentchars]) says more about this feature.
+
+\sec Autogenerated lists
+%%%%%%%%%%%%%%%%%%%%%%%%
+
+\secc[toc] Table of contents
+%%%%%%%%%%%%%%%%%%%%%%
+
+The \^`\maketoc` command prints the table of contents of all \~`\chap`, \~`\sec`
+and \~`\secc` used in the document. These data are read from the external `*.ref` file, so
+you have to run \TeX/ more than once (typically three times if the table of
+contents is at the beginning of the document).
+
+Typically, we don't want to repeat the name of the section \"Table of contents"
+in the table of contents again. The direct usage
+of \~`\chap` or \~`\sec` isn't recommended here because the table of contents
+is typically not referenced to itself. You can print the unnumbered and unreferenced
+title of the section like this:
+
+\begtt
+\nonum\notoc\sec Table of Contents
+\endtt
+If you need a customization of the design of the TOC, read the
+section~\ref[maketoc].
+
+\new
+If you are using a special macro in section or chapter titles
+and you need different behavior of such macro in other cases then use
+\^`\regmacro{<case-toc>}{<case-mark>}{<case-outline>}`.
+The parameters are applied locally in given cases. The \^`\regmacro` can be
+used repeatedly: then its parameters are accumulated (for more macros).
+If a parameter is empty then original definition is used in given case.
+For example:
+
+\begtt
+% default value of \mylogo macro used in text and in the titles:
+\def\mylogo{\leavevmode\hbox{{\Red\it My}{\setfontsize{mag1.5}\rm Lo}Go}}
+% another variants:
+\regmacro {\def\mylogo{\hbox{\Red My\Black LoGo}}} % used in TOC
+ {\def\mylogo{\hbox{{\it My}\/LoGo}}} % used in running heads
+ {\def\mylogo{MyLoGo}} % used in PDF outlines
+\endtt
+
+\secc Making the index
+%%%%%%%%%%%%%%%%%%%%%
+
+The index can be included in the document by the \^`\makeindex` macro. No external
+program is needed, the alphabetical sorting is done inside \TeX/ at macro
+level.
+
+The \^`\ii` command (insert to index) declares the word separated by the space
+as the index item. This declaration is represented as an invisible item on the
+page connected to the next visible word. The page number of the page where
+this item occurs is listed in the index entry. So you can type:
+
+\begtt
+The \ii resistor resistor is a passive electrical component ...
+\endtt
+
+You cannot double the word if you use the \^`\iid` instead of \^`\ii`:
+
+\begtt
+The \iid resistor is a passive electrical component ...
+or:
+Now we'll deal with the \iid resistor .
+\endtt
+
+Note that the dot or comma has to be separated by space when \^`\iid` is
+used. This space (before dot or comma) is removed by the macro in
+the current text.
+
+The multiple-words entries are commonly arranged in the index as follows:
+
+\medskip
+
+linear~dependency 11, 40--50
+
+--- independency 12, 42--53
+
+--- space 57, 76
+
+--- subspace 58
+
+\medskip
+
+To do this you have to declare the parts of the index entries by the `/` separator.
+Example:
+
+\begtt
+{\bf Definition.}
+\ii linear/space,vector/space
+{\em Linear space} (or {\em vector space}) is a nonempty set of...
+\endtt
+
+The number of the parts of one index entry (separated by `/`) is unlimited. Note, that you can
+spare your typing by the comma in the \~`\ii` parameter. The previous example
+is equivalent to `\ii linear/space \ii vector/space`~.
+
+Maybe you need to propagate to the index the similar entry to the
+linear/space in the form of space/linear. You can do this by the shorthand `,@`
+at the end of the \~`\ii` parameter. Example:
+
+\begtt
+\ii linear/space,vector/space,@
+is equivalent to:
+\ii linear/space,vector/space \ii space/linear,space/vector
+\endtt
+
+If you really need to insert the space into the index entry, write `~`.
+
+The \~`\ii` or \~`\iid` commands can be preceded by \^`\iitype` `<letter>`, then such
+reference (or more references generated by one \~`\ii`) has the specified type.
+The page numbers of such references should be formatted
+specially in the index. \OpTeX/ implements only \^`\iitype` `b`,
+\^`\iitype` `i` and \^`\iitype` `u`:
+the page number in bold or in italics or underlined is printed
+in the index when these types are used. The default index type is empty, which
+prints page numbers in normal font. The \TeX/book index is a good example.
+
+The \^`\makeindex` creates the list of alphabetically sorted index entries
+without the title of the section and without creating more columns. \OpTeX/
+provides other macros \^`\begmulti` and \^`\endmulti` for more columns:
+
+\begtt \catcode`\<=13
+\begmulti <number of columns>
+<text>
+\endmulti
+\endtt
+The columns will be balanced. The Index can be printed by the following
+code:
+
+\begtt
+\sec Index
+\begmulti 3 \makeindex \endmulti
+\endtt
+
+Only \"pure words" can be propagated to the index by the \~`\ii` command. It
+means that there cannot be any macro, \TeX/ primitive, math selector, etc.
+But there is another possibility to create such a complex index entry. Use
+\"pure equivalent" in the \~`\ii` parameter and map this equivalent to a
+real word that is printed in the index. Such mapping is done by
+\^`\iis` command. Example:
+
+\begtt
+The \ii chiquadrat $\chi$-quadrat method is ...
+If the \ii relax `\relax` command is used then \TeX/ is relaxing.
+...
+\iis chiquadrat {$\chi$-quadrat}
+\iis relax {\code{\\relax}}
+\endtt
+%
+The \^`\iis` `<equivalent> {<text>}` creates one entry in the \"dictionary
+of the exceptions". The sorting is done by the <equivalent> but the
+<text> is printed in the index entry list.
+
+The sorting rules when \^`\makeindex` runs depends on the current language.
+See section~\ref[lang] about languages selection.
+
+\secc Bib\TeX/ing
+%%%%%%%%%%%%%%%%
+
+The command \^`\cite[<label>]` (or
+\hbox{\^`\cite[<label-1>,<label-2>,...,<label-n>]`})
+creates the citation in the form [42] (or [15,~19,~26]).
+If \^`\shortcitations` is declared at the beginning of the document then
+continuous sequences of numbers are re-printed like this:
+\hbox{[3--5,~7,~9--11]}. If
+\^`\sortcitations` is declared then numbers generated by one \^`\cite` command
+are sorted upward.
+
+If \^`\nonumcitations` is declared then the marks instead of numbers are generated
+depending on the used bib-style. For example, the citations look like
+[Now08] or [Nowak, 2008].
+
+The \^`\rcite[<labels>]` creates the same list as \^`\cite[<labels>]` but without
+the outer brackets. Example: `[\rcite[tbn], pg.~13]` creates [4,~pg.~13].
+
+The \^`\ecite[<label>]{<text>}` prints the `<text>` only, but the entry labeled
+<label> is decided as to be cited. If \~`\hyperlinks` is used then <text>
+is linked to the references list.
+
+You can define alternative formating of \^`\cite` command. Example:
+
+\begtt \catcode`\<=13
+\def\cite[#1]{(\rcite[#1])} % \cite[<label>] creates (27)
+\def\cite[#1]{$^{\rcite[#1]}$} % \cite[<label>] creates^{27}
+\endtt
+
+The numbers printed by \^`\cite` correspond to the same numbers generated in
+the list of references. There are two possibilities to generate this
+references list:
+
+\begitems
+* Manually using \~`\bib[<label>]` commands.
+* By \~`\usebib/<type> (<style>) <bib-base>` command which reads `*.bib`
+ files directly.
+\enditems
+
+\new
+Note that another two possibilities documented in OPmac (using external
+Bib\TeX/ program) isn't supported because Bib\TeX/ is an old program that does not
+support Unicode. And Biber seems to be not compliant with Plain \TeX.
+
+\medskip\noindent
+{\bf References created manually using \^`\bib[<label>]` command.}
+
+\begtt
+\bib [tbn] P. Olšák. {\it\TeX{}book naruby.} 468~s. Brno: Konvoj, 1997.
+\bib [tst] P. Olšák. {\it Typografický systém \TeX.}
+ 269~s. Praha: CSTUG, 1995.
+\endtt
+
+If you are using \~`\nonumcitations` then you need to declare the <marks>
+used by \~`\cite` command. To do it you must use long form of the \^`\bib`
+command in the format \^`\bib[<label>] = {<mark>}`. The spaces around
+equal sign are mandatory. Example:
+
+\begtt
+\bib [tbn] = {Olšák, 2001}
+ P. Olšák. {\it\TeX{}book naruby.} 468~s. Brno: Konvoj, 2001.
+\endtt
+
+\noindent
+{\bf Direct reading of `.bib` files} is possible by \^`\usebib` macro.
+This macro reads and uses macro package `librarian.tex` by Paul Isambert.
+The usage is:
+
+\begtt \catcode`\<=13
+\usebib/c (<style>) <bib-base> % sorted by \cite-order (c=cite),
+\usebib/s (<style>) <bib-base> % sorted by style (s=style).
+% example:
+\nocite[*] \usebib/s (simple) op-biblist % prints all from op-biblist.bib
+\endtt
+
+The <bib-base> is one or more `*.bib` database source files (separated by
+spaces and without extension) and the <style> is the part of the filename
+`bib-<style>.opm` where the formatting of the references list is
+defined. \OpTeX/ supports `simple` or `iso690` styles. The features of
+the `iso690` style is documented in the section~\ref[isobib] in detail.
+The \^`\usebib` command is more documented in section~\ref[usebib].
+
+Not all records are printed from <bib-base> files: the command \^`\usebib`
+selects only such bib-records which were used in \~`\cite` or \^`\nocite`
+commands in your document. The \^`\nocite` behaves as \~`\cite` but prints
+nothing. It tells only that the mentioned bib-record should be printed in the
+reference list. If \^`\nocite[*]` is used then all records from <bib-base>
+are printed.
+
+\sec Graphics
+%%%%%%%%%%%%%
+
+\secc Colors
+%%%%%%%%%%%
+
+\OpTeX/ provides a small number of color selectors:
+{\Blue `\Blue`},
+{\Red `\Red`},
+{\Brown `\Brown`},
+{\Green `\Green`},
+{\Yellow `\Yellow`},
+{\Cyan `\Cyan`},
+{\Magenta `\Magenta`},
+{`\White`},
+{\Grey `\Grey`},
+{\LightGrey `\LightGrey`} and
+`\Black`. User can define more
+such selectors by setting four CMYK components
+\new
+or three RGB components. For example
+
+\begtt
+\def \Orange {\setcmykcolor{0 0.5 1 0}}
+\def \Purple {\setrgbcolor{1 0 1}}
+\endtt
+
+\new
+The command \^`\morecolors` reads more definitions of color selectors from
+the \LaTeX/ file `x11nam.def`.
+There are about 300 color names like
+`\DeepPink`, `\Chocolate` etc. If there are numbered variants of the same
+name, then the letters B, C, etc. are appended to the name in \OpTeX/. For example
+`\Chocolate` is Chocolate1, `\ChocolateB` is Chocolate2 etc.
+
+\new
+The color selectors work locally in groups by default but with limitations. See
+the technical documentation, section~\ref[colors] for more information.
+
+The basic colors \^`\Blue`, \^`\Red`, \^`\Cyan`, \^`\Yellow` etc.\ are defined
+with CMYK components using \^`\setcmykcolor`.
+On the other hand, you can define a color with three
+RGB components and \^`\morecolors` defines such RGB colors.
+By default, the color model isn't converted but only stored to
+PDF output for each used color. Thus, there may be a mix of color
+models in the PDF output which is not a good idea. You can overcome this
+problem by declaration \^`\onlyrgb` or \^`\onlycmyk`. Then only the selected color
+model is used for PDF output and if a used color is declared by another color
+model then it is converted.
+The \^`\onlyrgb` creates colors more bright (usable for computer
+presentations). On the other hand, CMYK makes colors more true\fnote
+{Printed output is more equal to the monitor preview especially if you are
+using ICC profile for your printer.}
+for printing.
+
+\new
+You can define your color by a linear combination of previously defined colors using
+\^`\colordef`. For example:
+
+\begtt
+\colordef \myCyan {.3\Green + .5\Blue} % 30 % green, 50 % blue, 20% white
+\colordef \DarkBlue {\Blue + .4\Black} % Blue mixed with 40 % of black
+\colordef \myGreen{\Cyan+\Yellow} % exact the same as \Green
+\colordef \MyColor {.3\Orange+.5\Green+.2\Yellow}
+\endtt
+%
+The linear combination is done in CMYK subtractive color space by default
+(RGB colors used in \^`\colordef` argument are converted first).
+If the resulting component is greater than 1 then it is truncated to 1.
+If a convex linear combination (as in the last example above) is used then it
+emulates color behavior on a painter's palette.
+You can use \^`\rgbcolordef` instead of \^`\colordef` if you want to mix colors
+in the additive RGB color space.
+
+\def\coloron#1#2#3{%
+ \setbox0=\hbox{{#2#3}}\leavevmode
+ \localcolor \rlap{#1\strut \vrule width\wd0}\box0
+}
+The following example defines the macro for the
+\coloron\Yellow\Brown{colored text on the colored background}. Usage:
+`\coloron<background><foreground>{<text>}`
+
+The `\coloron` can be defined as follows:
+
+\begtt
+\def\coloron#1#2#3{%
+ \setbox0=\hbox{{#2#3}}%
+ \leavevmode \rlap{#1\strut \vrule width\wd0}\box0
+}
+\coloron\Yellow\Brown{The brown text on the yellow background}
+\endtt
+
+\secc Images
+%%%%%%%%%%%
+
+The \^`\inspic` `{<filename>.<extension>}` or
+\^`\inspic` `<filename>.<extension><space>`
+inserts the picture stored in
+the graphics file with the name `<filename>.<extension>` to the document.
+You can set the picture width by \^`\picw=<dimen>`
+before \^`\inspic` command which declares the width of the picture.
+The image files can be in the PNG, JPG, JBIG2 or PDF format.
+
+The \^`\picwidth` is an equivalent register to `\picw`. Moreover, there is an
+\^`\picheight` register which denotes the height of the picture. If both
+registers are set then the picture will be (probably) deformed.
+
+The image files are searched in \^`\picdir`. This token list is empty
+by default, this means that the image files are searched in the
+current directory. Example: \^`\picdir={img/}` supposes that image files are
+in `img` subdirectory. Note: the directory name must end by `/` in
+the \^`\picdir` declaration.
+
+Inkscape\fnote
+{A powerful and free Wysiwyg editor for creating vector graphics.}
+is able to save a picture to PDF and labels of the picture to another
+file\fnote
+{Chose \"Omit text in PDF and create LaTeX file" option.}.
+This second file should be read by \TeX/to print labels
+in the same font as document font. \OpTeX/ supports this feature by
+\^`\inkinspic` `{<filename>.pdf}` command. It reads and displays
+both: PDF image and labels generated by Inkscape.
+
+If you want to create vector graphics (diagrams, schema, geometry
+skicing) then you can do it by Wysiwyg graphics editor (Inkscape, Geogebra for
+example), export the result to PDF and include it by \^`\inspic`.
+If you want to \"program" such pictures then Tikz package is recommended.
+It works in Plain \TeX/ and \OpTeX.
+
+\secc PDF transformations
+%%%%%%%%%%%%%%%%%%%%%%%%
+
+All typesetting elements are transformed by linear
+transformation given by the current transformation matrix. The
+`\pdfsetmatrix` `{<a> <b> <c> <d>}` command makes the internal multiplication
+with the current matrix so linear transformations can be composed.
+One linear transformation given by the `\pdfsetmatrix` above transforms
+the vector $[0,1]$ to [<a>,\,<b>] and $[1,0]$ to [<c>,\,<d>].
+The stack-oriented commands `\pdfsave` and `\pdfrestore` gives a possibility of
+storing and restoring the current transformation matrix and the position of the current point.
+This position has to be the same from \TeX{}'s point of
+view as from the transformation point of view when `\pdfrestore` is processed.
+Due to this fact the `\pdfsave\rlap{<transformed text>}\pdfrestore`
+or something similar is recommended.
+
+\OpTeX/ provides two special transformation macros
+\^`\pdfscale` and \^`\pdfrotate`:
+
+\begtt \catcode`\<=13
+\pdfscale{<horizontal-factor>}{<vertical-factor>}
+\pdfrotate{<angle-in-degrees>}
+\endtt
+
+These macros simply call the properly `\pdfsetmatrix` command.
+
+It is known that the composition of transformations is not commutative. It
+means that the order is important. You have to read the transformation
+matrices from right to left. Example:
+
+\begtt
+First: \pdfsave \pdfrotate{30}\pdfscale{-2}{2}\rlap{text1}\pdfrestore
+ % text1 is scaled two times and it is reflected about vertical axis
+ % and next it is rotated by 30 degrees left.
+second: \pdfsave \pdfscale{-2}{2}\pdfrotate{30}\rlap{text2}\pdfrestore
+ % text2 is rotated by 30 degrees left then it is scaled two times
+ % and reflected about vertical axis.
+third: \pdfsave \pdfrotate{-15.3}\pdfsetmatrix{2 0 1.5 2}\rlap{text3}%
+ \pdfrestore % first slanted, then rotated by 15.3 degrees right
+\endtt
+%
+\par\nobreak\bigskip\smallskip
+This gives the following result.
+First: \pdfsave \pdfrotate{30}\pdfscale{-2}{2}\rlap{text1}\pdfrestore
+second: \pdfsave \pdfscale{-2}{2}\pdfrotate{30}\rlap{text2}\pdfrestore
+third: \pdfsave \pdfrotate{-15.3}\pdfsetmatrix{2 0 1.5 2}\rlap{text3}\pdfrestore
+\par\nobreak\bigskip\penalty0%\bigskip
+
+You can see that \TeX/ knows nothing about dimensions of transformed material,
+it treats it as with a zero dimension object.
+\new
+The \^`\transformbox{<transformation>}{<text>}`
+macro solves the problem. This macro puts the transformed
+material into a box with relevant dimensions. The <transfromation> parameter
+includes one or more transformation commands `\pdfsetmatrix`, `\pdfscale`,
+`\pdfrotate` with their parameters. The <text> is transformed text.
+
+Example: \~`\frame{\transformbox{\pdfscale{1}{1.5}\pdfrotate{-10}}{moj}}`
+creates \frame{\transformbox{\pdfscale{1}{1.5}\pdfrotate{-10}}{moj}}.
+
+The \^`\rotbox{<deg>}{<text>}` is shortcut for
+\^`\transformbox{\pdfrotate{<deg>}}{<text>}`.
+
+\secc Ovals, circles
+%%%%%%%%%%%%%%%%%%%%
+
+\new
+The \^`\inoval{<text>}` creates a box like this: \inoval{text}.
+Multiline text can be put in an oval by the command \^`\inoval{\vbox{<text>}}`.
+Local settings can be set by
+\^`\inoval[<settings>]{<text>}` or you can re-declare global settings by
+\^`\ovalparams={<settings>}`. The default settings are:
+
+\begtt
+\ovalparams={\roundness=2pt % diameter of circles in the corners
+ \fcolor=\Yellow % color used for filling oval
+ \lcolor=\Red % line color used in the border
+ \lwidth=0.5bp % line width in the border
+ \shadow=N % use a shadow effect
+ \overlapmargins=N % ignore margins by surrounding text
+ \hhkern=0pt \vvkern=0pt} % left-righ margin, top-bottom margin
+\endtt
+The total distance from text to oval boundary is `\hhkern+\roundness` at the left and right
+sides and
+`\vvkern+\roundness` at the top and bottom sides of the text.
+
+If you need to set a parameters for the <text> (color, size, font etc.),
+put such setting right in front of the <text>:
+\^`\inoval{<text settings><text>}`.
+
+\new
+The \^`\incircle[\ratio=1.8]{<text>}` creates a box like this \incircle[\ratio=1.8]{text}.
+The \^`\ratio` parameter means width/height. The usage is analogical like for oval.
+The default parameters are
+
+\begtt
+\circleparams={\ratio=1 \fcolor=\Yellow \lcolor=\Red \lwidth=0.5bp
+ \shadow=N \ignoremargins=N \hhkern=2pt \vvkern=2pt}
+\endtt
+
+\new
+The macros \^`\clipinoval` `<x> <y> <width> <height> {<text>}`
+and \^`\clipincircle` (with the same parameters)
+print the `<text>` when a clipping path (oval or cirle with given
+`<with>` and `<height>` shifted its center by `<x>` to right and by `<y>` to up)
+is used.
+The `\roundness=5mm` is default for \^`\clipinoval` and user can change it.
+Example:
+
+\begtt
+\clipincircle 3cm 3.5cm 6cm 7cm {\picw=6cm \inspic{myphoto.jpg}}
+\endtt
+
+\secc Putting images and texts wherever
+
+\new
+The \^`\puttext` `<x> <y> {<text>}` puts the `<text>` shifted by `<x>` right and by
+`<y>` up from the current point of typesetting and does not change the
+position of the current point. Assume a coordinate system with origin in the
+current point. Then \^`\puttext` `<x> <y> {<text>}` puts the text at the
+coordinates `<x>`, `<y>`. More exactly the left edge of its baseline is at that
+position.
+
+\new
+The \^`\putpic` `<x> <y> <width> <height> {<image-file>}` puts an image
+given by `<image-file>` (including extension) of given
+`<width>` and `<height>` at given position (its left-bottom corner).
+You can write \^`\nospec` instead `<width>` or `<height>` if this parameter
+is not specified.
+
+\sec Others
+%%%%%%%%%%%
+
+\secc[lang] Using more languages
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\OpTeX/ prepares hyphenation patterns for all languages if such patterns are
+available in your \TeX/ system.
+\new
+Only USenglish patterns (original from Plain \TeX/) are preloaded.
+Hyphenation patterns of all other languages are loaded on demand when you first use
+the `\<iso-code>lang` command in your document.
+For example \^`\delang` for German, \^`\cslang` for
+Czech, \^`\pllang` for Polish. The <iso-code> is a shortcut
+of the language (mostly from ISO 639-1).
+You can list all available languages by \^`\langlist`
+macro. This macro prints now:
+
+\medskip
+{\typosize[8.5/11.5]\emergencystretch=4em \hbadness=4000
+\noindent \langlist
+\par}
+\medskip
+
+\new
+For compatibility with e-plain macros, there is the command
+\^`\uselanguage{<language>}`. The parameter <language> is long-form of
+language name, i.e.\ \^`\uselanguage{Czech}` works the same as \^`\cslang`.
+The \^`\uselanguage` parameter is case insensitive.
+
+For compatibility with \csplain/, there are macros \^`\ehyph`, \^`\chyph`,
+\^`\shyph` which are equivalent to \^`\enlang`, \^`\cslang` and \^`\sklang`.
+
+You can switch between language patterns by `\<iso-code>lang` commands mentioned
+above. Default is \^`\enlang`.
+
+\OpTeX/ generates three phrases used for captions and titles in technical
+articles or books: \"Chapter", \"Table" and \"Figure". These phrases need to be known
+in used language and it depends on the previously used language selectors
+`\<iso-code>lang`. \OpTeX/ declares these words only for few languages:
+\new
+Czech, German, Spanish, French, Greek, Italian, Polish, Russian, Slovak and
+English, If you need to use these words in other languages or you want to
+auto-generate more words in your macros, then you can declare it by
+\~`\sdef` or \^`\_langw` commands as shown in section~\ref[langphrases].
+
+The \~`\makeindex` command needs to know the sorting rules used in your language.
+\OpTeX/ defines only a few language rules for sorting: Czech,
+Slovak and English. How to declare sorting rules for more languages are
+described in the section~\ref[makeindex].
+
+If you declare `\<iso-code>quotes`, then the control sequences `\"` and `\'`
+should be used like this: `\"<quoted text>"` or `\'<quoted text>'`
+(note that the terminating character is the same but it isn't escaped).
+This prints language-dependent normal or alternative quotes around
+<quoted text>. The language is specified by <iso-code>. \OpTeX/ declares
+quotes only for Czech, German, Spanish, French, Greek, Italian, Polish,
+Russian, Slovak and English (\^`\csquotes`, \^`\dequotes`, \dots, \^`\enquotes`).
+You can simply define your own quotes as shown in section~\ref[langphrases].
+The `\"` is used for quotes visually more similar to the `"` character which
+can be primary quotes or secondary quotes depending on the language rules.
+Maybe you want to alternate the meaning of these two types of quotes. Use
+`\<isocode>quotes\altquotes` in such case.
+
+\secc[styles] Pre-defined styles
+%%%%%%%%%%%%%%%%%%%%%%%
+
+\OpTeX/ defines three style-declaration macros \~`\report`, \~`\letter` and
+\~`\slides`. You can use them at the beginning of your document if you are
+preparing these types of documents and you don't need to create your own
+macros.
+
+The \^`\report` declaration is intended to create reports. It
+sets default font size to 11\,pt and `\parindent` (paragraph indentation) to 1.2\,em.
+The `\tit` macro uses smaller font because we assume that \"chapter level"
+will be not used in reports. The first page has no page number, but the next pages
+are numbered (from number~2). Footnotes are numbered from one in the whole
+document. The macro `\author <authors><end-line>` can be used when
+\^`\report` is declared. It prints `<authors>` in italics at the center of the
+line. You can separate authors by `\nl` to more lines.
+
+The \^`\letter` declaration is intended to create letters.
+See the files `op-letter-*.tex` for examples.
+The \^`\letter` style sets default
+font size to 11\,pt and `\parindent` to 0\,pt. It sets half-line space
+between paragraphs. The page numbers are not printed. The \^`\subject` macro
+can be used, it prints the word \"Subject:" or \"Věc" (or something else
+depending on current language) in bold. Moreover, the \^`\address` macro
+can be used when \^`\letter` is declared. The usage of the \^`\address` macro
+looks like:
+
+\begtt \catcode`\<=13
+\address
+ <first line of address>
+ <second line of address>
+ <etc.>
+ <empty line>
+\endtt
+
+It means that you need not use any special mark at the end of lines: the ends
+of lines in the source file are the same as in printed output. The
+\^`\address` macro creates `\vtop` with address lines. The width of such
+`\vtop` is equal to the widest line used in it. So, you can use
+`\hfill\address...` to put the address box to the right side of the
+document. Or you can use `<prefixed text>\address...` to put
+`<prefixed text>` before the first line of the address.
+
+The \^`\slides` style creates a simple presentation slides. See an example
+in the file `op-slides.tex`. Run `optex op-slides.tex` and see the documentation of
+\^`\slides` style in the file `op-slides.pdf`.
+
+Analogical declaration macro `\book` is not prepared. Each book needs
+individual typographical care. You need to create specific macros for
+design.
+
+\secc Loading other macro packages
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+You can load more macro packages by `\input{<file-name>}` or by
+\^`\load[<file-names>]`. The first case (`\input`) is \TeX/ primitive command, it can be
+used in the alternative old syntax `\input <filename><space>` too. The
+second case (\^`\load`) allows specifying a comma-separated list of included files.
+Moreover, it loads each macro file only once, it sets
+temporarily standard category codes during loading and it tries to
+load `<filename>.opm` or `<filename>.tex` or `<filename>`, the first occurence
+wins. Example:
+\begtt
+\load [qrcode, tikz]
+\endtt
+%
+does `\input qrcode.opm` \,and `\input tikz.tex` \,and it saves
+local information about the fact that these file names
+`qrcode` and `tikz` were already used, i.\,e. next \^`\load` will skip them.
+
+It is strongly recommended to use the `\load` macro for loading external
+macros if you need them. On the other hand, if your source document is structured
+to more files (with individual chapters or sections), use simply the `\input` primitive.
+
+The macro packages intended to \OpTeX/ have the name `*.opm`.
+The following packages are distributed as part of \OpTeX/:
+\begitems
+* `qrcode.opm` enables to create QR codes.
+* `vlna.opm` enables to protect of one-letter prepositions and more things automatically.
+* `emoji.opm` defines `\emoji{<name>}` command for colored emoticons.
+* `plain-at.opm` defines the old names from plain \TeX/.
+\enditems
+See the directory `optex/pkg/` and these files for more information about
+them.
+
+\secc Lorem ipsum dolor sit
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+\new
+A designer needs to concentrate on the design of the output and maybe he/she
+needs material for testing macros. There is the possibility to generate a
+neutral text for such experiments. Use \^`\lorem[<number>]` or
+\^`\lorem[<from>-<to>]`. It prints a paragraph (or paragraphs) with neutral
+text. The numbers <number> or <from>, <to> must be in the range 1 to 150
+because there are 150 paragraphs with neutral text prepared for you.
+The \^`\lipsum` macro is equivalent to \^`\lorem`. Example: \^`\lipsum[1-150]`
+prints all prepared paragraphs.
+
+\secc Logos
+%%%%%%%%%%
+
+\new
+The control sequences for typical logos can be terminated by optional `/`
+which is ignored when printing. This makes logos more legible in the source file:
+
+\begtt
+We are using \TeX/ because it is cool. \OpTeX/ is better than \LaTeX.
+\endtt
+
+\secc The last page
+%%%%%%%%%%%%%%%%%%%
+
+The number of the last page (it may be different from the number of pages) is
+expanded by \^`\lastpage` macro. It expands to `?` in first \TeX/ run and to
+the last page in next \TeX/ runs.
+
+There is an example for footlines in the format \"current page / last page":
+
+\begtt
+\footline={\hss \fixedrm \folio/\lastpage \hss}
+\endtt
+
+\new
+The \^`\lastpage` expands to the last \^`\folio` which is a decimal
+number or Roman numeral (when \^`\pageno` is negative). If you need to know
+the total pages used in the document, use \^`\totalpages` macro. It expands to
+zero (in first \TeX/ run) or to the number of all pages in the document
+(in next \TeX/ runs).
+
+\secc Use \OpTeX/
+%%%%%%%%%%%%%%%%%
+
+\new
+The command \^`\useOpTeX` (or \^`\useoptex`) does nothing in \OpTeX/ but it causes
+an error (undefined control sequence) when another format is used. You can
+put it as the first command in your document:
+
+\begtt
+\useOpTeX % we are using OpTeX format, no LaTeX :)
+\endtt
+
+\sec Summary
+%%%%%%%%%%%%
+
+\def\ttref#1'{\ea\~\ea`\csname#1\endcsname`}
+
+\begtt \typosize[9/11]\adef&{\kern.25em}\adef~#1'{\ea\~\ea`\csname#1\endcsname`}
+~tit' Title (terminated by end of line)
+~chap' Chapter Title (terminated by end of line)
+~sec' Section Title (terminated by end of line)
+~secc' Subsection Title (terminated by end of line)
+
+~maketoc' % table of contents generation
+~ii' item1,item2 % insertion the items to the index
+~makeindex' % the index is generated
+
+~label' [labname] % link target location
+~ref' [labname] % link to the chapter, section, subsection, equation
+~pgref' [labname] % link to the page of the chapter, section, ...
+
+~caption'/t % a numbered table caption
+~caption'/f % a numbered caption for the picture
+~eqmark' % a numbered equation
+
+~begitems' % start a list of the items
+~enditems' % end of list of the items
+~begblock' % start a block of text
+~endblock' % end of block of text
+~begtt' % start a verbatim text
+~endtt' % end verbatim text
+~verbchar' X % initialization character X for in-text verbatim
+~code' % another alternative for in-text verbatim
+~verbinput' % verbatim extract from the external file
+~begmulti' num % start multicolumn text (num columns)
+~endmulti' % end multicolumn text
+
+~cite' [labnames] % refers to the item in the lits of references
+~rcite' [labnames] % similar to \cite but [] are not printed.
+~sortcitations' ~shortcitations' ~nonumcitations' % cite format
+~bib' [labname] % an item in the list of references
+~usebib'/? (style) bib-base % direct using of .bib file, ? in {s,c}
+
+~load' [filenames] % loadaing macro files
+~fontfam' [FamilyName] % selection of font family
+~typosize' [font-size/baselineskip] % size setting of typesetting
+~typoscale' [factor-font/factor-baselineskip] % size scaling
+~thefontsize' [size] ~thefontscale' [factor] % current font size
+
+~inspic' file.ext % insert a picture, extensions: jpg, png, pdf
+~table' {rule}{data} % macro for the tables like in LaTeX
+
+~fnote' {text} % footnote (local numbering on each page)
+~mnote' {text} % note in the margin (left or right by page number)
+
+~hyperlinks' {color-in}{color-out} % PDF links activate as clickable
+~outlines' {level} % PDF will have a table of contents in the left tab
+
+~magscale'[factor] % resize typesetting, line/page breaking unchanged
+~margins'/pg format (left, right, top, bottom)unit % margins setting
+
+~report' ~letter' ~slides' % style declaration macros
+\endtt
+
+\sec API for macro writers
+%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+All \TeX/ primitives and almost all \OpTeX/ macros are accesible by two
+names: `\foo` (public or user name space) and `\_foo` (private name space).
+For example `\hbox` and `\_hbox` means the same \TeX/ primitive. More about
+it is documented in section~\ref[prefixed].
+
+If this manual refers `\foo` then `\_foo` equivalent exists too. For example,
+we mention the `\addto` macro below. The `\_addto` equivalent exists too, but it
+is not explicitly mentioned here. If we refer only `\_foo` then its public
+equivalent does not exist. For example, we mention the `\_codedecl` macro below, so
+this macro is not available as `\codedecl`.
+
+If you are writing a document or macros specific for the document, then use
+simply user namespace (`\foo`). If you are writing more general macros,
+then use private namespace (`\_foo`), but you should declare your own namespace
+by \~`\_namespace` macro and you have to follow the naming discipline described in
+section~\ref[pkg-namespace].
+
+The alphabetically sorted list of macros typically usable for macro writers follows.
+More information about such macros can be found in the technical documentation.
+You can use hyperlinks here in order to go to the appropriate place of the technical
+documentation.
+
+\medskip \noindent
+\^`\addto`` \macro{<text>}` adds <text> at the end of `\macro` body.\nl
+\^`\adef` `<char>{<body>}` defines <char> active character with meaning <body>.\nl
+\^`\afterfi` `{<text>}<ignored>\fi` expands to `\fi<text>`.\nl
+\^`\bp`` {<dimen expression>}` expands \TeX/ dimension to decimal number in `bp` without unit.\nl
+\~`\_codedecl`` <sequence> {<info>}` is used at beginning of macro files.\nl
+\~`\colordef`` \macro {<mix of colors>}` declares `\macro` as color switch.\nl
+\^`\cs` `{<string>}` expands `\<string>`.\nl
+\~`\_doc` `...` \~`\_cod` encloses documenation text in the macro code.\nl
+\^`\eoldef`` \macro #1{<body>}` defines `\macro` with parameter separated to end of line.\nl
+\~`\_endcode` closes the part of macro code in macro files.\nl
+\~`\_endnamespace` closes name space declared by \~`\_namespace`.\nl
+\~`\eqbox`` [<label>]{<text>}` creates `\hbox{<text>}` with common width across whole document.\nl
+\^`\expr`` {<expression>}` expands to result of the <expression> with decimal numbers.\nl
+\~`\fontdef`` \f {<font spec.>}` declares `\f` as font switch.\nl
+\~`\fontlet` `\fa=\fb <sizespec.>` declares `\fa` as the same font switch
+ like `\fb` at given <sizespec.>.\nl
+\^`\foreach` `<list>\do <parameters>{<what>}` is exapandable loop over <list>.\nl
+\^`\foreachdef` `\macro <parameters>{<what>}` declares expandable `\macro` as loop over <list>.\nl
+\^`\fornum` `<from>..<to>\do {<what>}` is expanadable loop with numeric variable.\nl
+\^`\incr` `<counter>` increases and \^`\decr` `<counter>` decreases `<counter>` by one globally.\nl
+\^`\ignoreit` `<one>`, \^`\ignoresecond` `<one><two>` ignores given parameter.\nl
+`\expandafter` \^`\ignorept` `\the<dimen>` expands to decimal number <dimen> without `pt`.\nl
+\~`\isempty`, \~`\istoksempty`, \~`\isequal`, \~`\ismacro`, \~`\isdefined`, \~`\isinlist`
+\~`\isfile`, \~`\isfont` do various tests. Example: \~`\isinlist\list{<text>}\iftrue` does
+ `\iftrue` if <text> is in `\list`.\nl
+\^`\isnextchar`` <char>{<text1>}{<text2>}` performs <text1> if next
+ character is <char>, else <text2>.\nl
+\~`\kv` `{<key>}` expands to value when key-value parameters are used.\nl
+\^`\loop` `...` \^`\repeat` is classical Plain \TeX/ loop.\nl
+\^`\mathstyles`` {<math list>}` enables to create macros dependent on current math style.\nl
+\~`\_namespace`` {<pkg>}` declares name space used by package writers.\nl
+\^`\newcount`, \^`\newdimen` etc. are classical Plain \TeX/ allocators.\nl
+\^`\newif` `\iffoo` declares boolean `\iffoo` as in Plain \TeX/.\nl
+\^`\_newifi` `\_iffoo` declares boolean `\_iffoo`.\nl
+\^`\opinput`` {<filename>}` reads file like `\input` but with standard catcodes.\nl
+\^`\optdef`` \macro [<opt-default>] <parameters>{<body>}` defines `\macro` with [opt.parameter].\nl
+\^`\opwarning` `{<text>}` prints <text> to the terminal and .log file as warning.\nl
+\~`\private`` <sequence> <sequence> ... ;` declares <sequence>s for private name space.\nl
+\~`\public`` <sequence> <sequence> ... ;` declares <sequence>s for public name space.\nl
+\~`\readkv` `\macro` reads parameters from `\macro` in key-value format.\nl
+\^`\replstring`` \macro{<stringA>}{<stringB>}` replaces all <stringA> to <stringB> in `\macro`.\nl
+\^`\sdef` `{<string>}<parameters>{<body>}` behaves like `\def\<string><parameters>{<body>}`.\nl
+\^`\setctable` and \^`\restorectable` manipulate with stack of catcode tables.\nl
+\^`\slet` `{<stringA>}{<stringB>}` behaves like `\let\<stringA>=\<stringB>`\nl
+\^`\sxdef` `{<string>}<parameters>{<body>}` behaves like `\xdef\<string><parameters>{<body>}`.\nl
+\^`\trycs`` {<string>}{<text>}` expands `\<string>` if it is defined else expands <text>.\nl
+\^`\useit` `<one>`, \^`\usesecond` `<one><two>` uses given parameter.\nl
+\^`\wlog`` {<text>}` writes <text> to .log file.\nl
+\^`\wterm`` {<text>}` writes <text> to the terminal and .log file.\nl
+\^`\xargs`` <what> <token> <token> ... ;` repeats <what><token> for each <token>.\nl
+\unpenalty\unskip
+
+\sec Compatibility with Plain \TeX/
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+All macros of Plain \TeX/ are re-written in \OpTeX/. Common macros should
+work in the same sense as in original Plain \TeX. Internal control sequences
+like `\p@` or `\f@@t` are removed and mostly replaced by control sequences
+prefixed by `_` (like `\_this`). If you need to use the basic set of old Plain
+\TeX/ control sequences like `\p@` (for example you are reading an old macro file),
+use `\load[plain-at]`.
+
+All primitives and common macros have two
+control sequences with the same meaning: in prefixed and unprefixed form.
+For example `\hbox` is equal to `\_hbox`.
+Internal macros of \OpTeX/ have and use only prefixed form. User should use
+unprefixed forms, but prefixed forms are accessible too because the `_` is
+set as a letter category code globally (in macro files and users document too). User
+should re-define unprefixed forms of control sequences without worries that
+something internal will be broken (only the sequence `\par` cannot be
+re-defined without change of internal \TeX/ behavior because it is
+hard-coded in \TeX/, unfortunately).
+
+\new
+The Latin Modern 8bit fonts instead Computer Modern 7bit fonts are
+preloaded in the format, but only a few ones. The full family set is ready to
+use after the command \~`\fontfam[LMfonts]` which reads the fonts in OTF
+format.
+
+\new
+Plain \TeX/ defines `\newcount`, `\bye` etc. as `\outer` macros. \OpTeX/
+doesn't set any macro as `\outer`. Macros like `\TeX`, `\rm` are defined as
+`\protected`.
+
+\new
+The text accents macros `\"`, `\'`, `\v`, `\u`, `\=`, `\^`, `\.`, `\H`,
+`\~`, \code{\\`}, `\t` are undefined\fnote
+{The math accents macros like `\acute`, `\bar`, `\dot`, `\hat` still work.}
+in \OpTeX/. Use real
+letters like á, ř, ž in your source document instead of these old accents macros.
+If you really want to use them, you can initialize them by the \^`\oldaccents`
+command. But we don't recommend it.
+
+\new
+The default paper size is not set as the letter with 1\,in margins but as A4 with
+2.5\,cm margins. You can change it, for example by
+\^`\margins/1 letter (1,1,1,1)in`. This example sets the classical Plain \TeX/
+page layout.
+
+\new
+The origin for the typographical area is not at the top left 1\,in 1\,in coordinates
+but at the top left paper corner exactly. For example, `\hoffset` includes directly left
+margin.
+
+The tabbing macros `\settabs`\iindex{settabs} and `\+` (from Plain \TeX/)
+are not defined in \OpTeX/ because they are obsolete. But you can use the
+\ulink[http://petr.olsak.net/optex/optex-tricks.html\#tabs]{\OpTeX/ trick 0021}
+if you really need such feature.
+
+The `\sec` macro is reserved for sections but original Plain \TeX/ declares this
+control sequence for math secans.
+
+\enddocument
+
+
+\sec Dependencies
+%%%%%%%%%%%%%%%%%
+
+When `optex.fmt` is created then the following must be installed
+
+\begitems
+* The `\luatex` program.
+* Latin moder font metrics
+ `ec-lmr10.tfm`, `ec-lmbx10.tfm`, `ec-lmri10.tfm`,
+ `ec-lmbxi10.tfm`, `ec-lmtt10.tfm` (for basic text font initializing).
+* Computer rmodern font metrics
+ `cmr10.tfm`, `cmmi10.tfm`, `cmsy10.tfm`, `cmex10.tfm` (for basic math
+ initializing). If there are more Computer Modern fonts then they are read
+ too.
+* The file `hyphen.tex` form plain \TeX.
+\enditems
+
+When `\fontfam` is used then the ability of Unicode fonts reading
+is initialized using Lua scripts: `ltluatex.lua` (from \LaTeX/ package),
+`luaotfload-main.lua` and more 20 similar `.lua` files (from `luaotfload`
+package).
+
+When a font family is needed using `\fontfam` then such font family must be
+installed in the OTF format otherwise, the `\fontfam` command is ignored
+(only warning about no-existent font family is printed).
+
+When `\cslang`, `\delang` etc. commands are used in the document
+then the hyphenation patterns of relevant languages must be installed.
+Moreover the Lua script `luatex-hyphen.lua` (from `hyph-utf8` package)
+and data file `language-dat.lua` (from `hyphen-base` package)
+must be installed.
+
+When `\usebib` command is used then `librarian.tex` file
+(from the `librarian` macro package) must be installed.
+
+When `\morecolors` command is used then `x11nam.def` file
+(from the `xcolor` package) must be installed.
+
+When `\lorem` command is used then `lipsum.ltd.tex` file
+(from the `lipsum` package) must be installed.
+
diff --git a/macros/optex/doc/optex.1 b/macros/optex/doc/optex.1
new file mode 100644
index 0000000000..7b912e12a8
--- /dev/null
+++ b/macros/optex/doc/optex.1
@@ -0,0 +1,42 @@
+.TH OPTEX 1 "17 Feb. 2020" "Petr Olsak"
+.\"=====================================================================
+.if t .ds TX \fRT\\h'-0.1667m'\\v'0.20v'E\\v'-0.20v'\\h'-0.125m'X\fP
+.if n .ds TX TeX
+.ie t .ds OX \fIT\v'+0.25m'E\v'-0.25m'X\fP\" for troff
+.el .ds OX TeX\" for nroff
+.\" the same but obliqued
+.\" BX definition must follow TX so BX can use TX
+.if t .ds BX \fRB\s-2IB\s0\fP\*(TX
+.if n .ds BX BibTeX
+.\" LX definition must follow TX so LX can use TX
+.if t .ds LX \fRL\\h'-0.36m'\\v'-0.15v'\s-2A\s0\\h'-0.15m'\\v'0.15v'\fP\*(TX
+.if n .ds LX LaTeX
+.\"=====================================================================
+.SH NAME
+optex \- OPmac and Plain TeX for LuaTeX engine.
+.SH SYNOPSIS
+.B optex
+[ first line ]
+.\"=====================================================================
+.SH DESCRIPTION
+This manual page was derived from the manual page for \*(LX and is not meant
+to be exhaustive. The complete
+documentation for this version of \*(TX can be found in the info file
+or manual
+.IR "Web2C: A TeX implementation" .
+.PP
+.B OpTeX
+is LuaTeX macro package initialized as the LuaTeX format optex.fmt.
+It is based on Plain TeX macros by Donlad Knuth and on OPmac macros from
+csplain package. For more information about it see
+http://petr.olsak.net/optex web page.
+.\"=====================================================================
+.SH "SEE ALSO"
+.BR luatex (1),
+.BR tex (1),
+.br
+.SH AUTHORS
+The author of
+.B OpTeX
+is Petr Olsak.
+.PP
diff --git a/macros/optex/pkg/emoji.opm b/macros/optex/pkg/emoji.opm
new file mode 100644
index 0000000000..e14579135f
--- /dev/null
+++ b/macros/optex/pkg/emoji.opm
@@ -0,0 +1,55 @@
+% This is the macro package used by OpTeX, see http://petr.olsak.net/optex
+
+% emoji.opm, Petr Olšák <petr@olsak.net>, 2021
+
+% Emoji allows us to use colored emoticons as characters from the font.
+% The \emoji{<name>} command is available, see texdoc emoji (from
+% corresponding LaTeX package).
+
+\_namespace{emoji}
+
+\_codedecl \.emoji {Emotikons from the TwemojiMozilla.ttf font}
+
+ \_doc -----------------------------
+ Font TwemojiMozilla.ttf is loaded. The font feature +colr is needed.
+ The `\emojifont` is implemented using `\_resizethefont` as size-dependent.
+ \_cod -----------------------------
+
+\_initunifonts
+\_font\.tenemoji=[TwemojiMozilla]:+colr
+\_def\.emojifont{\.tenemoji\_resizethefont}
+\_def\.emoji#1{{\.emojifont\_trycs{_emoji_:#1}{\_opwarning{uknown emoji "#1"}}}}
+
+ \_doc -----------------------------
+ The mapping from names or aliases to the codes are declared in the
+ `emoji-table.def` file from the \LaTeX/ package emoji.
+ \_cod -----------------------------
+
+\_bgroup
+ \_def\__emoji_def #1 #2#3#4#5#6{% #1=n, #2=data, #3=name, #4=aliases, #5=descr, #6=versi
+ \_sxdef{_emoji_:#3}{#2}%
+ \_ifx^#4^\_else \_foreach #4, \_do ##1, {\_global\_slet{_emoji_:##1}{_emoji_:#3}}\_fi
+ }
+ \_def\ProvidesExplFile#1#2#3#4{}
+ \_def\__emoji_group#1 #2{}
+ \_def\__emoji_subgroup#1 #2{}
+ \_catcode`\#=12
+ \_input {emoji-table.def}% defining emoji names
+\_egroup
+
+\_nspublic \emoji \emojifont ;
+
+\_endnamespace
+
+\_endcode
+
+\begtt % ----------------------- Testing file ---------------------------
+\load[emoji]
+We can use \emoji{grinning} or directly: {\emojifont 😀} too.
+\bye
+\endtt % ----------------------------------------------------------------
+
+More than 3000 emoticons are available.
+
+If you want black-and-white pictograms, see another font:
+\url{http://petr.olsak.net/optex/optex-tricks.html\#fawesome}
diff --git a/macros/optex/pkg/plain-at.opm b/macros/optex/pkg/plain-at.opm
new file mode 100644
index 0000000000..3277d7b24e
--- /dev/null
+++ b/macros/optex/pkg/plain-at.opm
@@ -0,0 +1,43 @@
+% This is macro package used by OpTeX, see http://petr.olsak.net/optex
+
+\_codedecl \_undefined {Obscure @ names from plain TeX <2020-05-22>}
+
+\_setctable \_optexcatcodes
+% PlainTeX obscure names:
+\_catcode`\@=11
+\_let\z@=\_zo
+\_let\z@skip=\_zoskip
+\_newdimen\p@ \p@=1pt
+\_chardef\@ne=1
+\_chardef\tw@=2
+\_chardef\thr@@=3
+\_chardef\sixt@@n=16
+\_mathchardef\@m=1000
+\_mathchardef\@M=10000
+\_mathchardef\@MM=20000
+\_countdef\m@ne=22 \m@ne=-1
+\_chardef\@cclv=255
+\_mathchardef\@cclvi=256
+\_skipdef\skip@=0
+\_dimendef\dimen@=0
+\_dimendef\dimen@i=1
+\_dimendef\dimen@ii=2
+\_countdef\count@=255
+\_def\m@th{\_mathsurround\z@}
+\_def\o@lign{\_lineskiplimit\z@ \_oalign}
+\_def\n@space{\_nulldelimiterspace\z@ \m@th}
+\_newdimen\p@renwd \p@renwd=8.75pt
+\_def\alloc@#1#2#3#4#5{\_allocator#5{\_csstring#2}#3}
+\_restorectable
+
+\_endcode
+
+We absolutely don't recommend to use such obscure names in your macros. But
+sometimes you need to read an old plain TeX document or a macro file. You
+can load this file in such cases. For example:
+
+\begtt
+ \load [plain-at, shapepar.sty]
+\endtt
+
+\_endinput
diff --git a/macros/optex/pkg/qrcode.opm b/macros/optex/pkg/qrcode.opm
new file mode 100644
index 0000000000..5df0ad2c07
--- /dev/null
+++ b/macros/optex/pkg/qrcode.opm
@@ -0,0 +1,2707 @@
+% This is macro package used by OpTeX, see http://petr.olsak.net/optex
+% qrcode.opm, Petr Olšák <petr@olsak.net>, 2020
+
+% See end of the file for more information
+
+\_codedecl \qrcode {Macro for QR code printing <2020-05-04>}
+
+\_namespace{qr}
+
+\_newcount\.i
+\_newcount\.j
+\_newcount\.a
+\_newcount\.b
+\_newcount\.c
+
+\_def\.relax{\_relax}%
+
+\_def\.utfstring#1{\_directlua{
+ local text="\_luaescapestring{#1}"
+ tex.print(string.format('\_pcent.2x',string.len(text)))
+ for i=1,string.len(text) do
+ tex.print(string.format('\_pcent.2x',string.byte(text,i)))
+ end
+}}
+\_def\.utfstringlen#1{\_directlua{
+ tex.print(string.len("\_luaescapestring{#1}"))
+}}
+
+\_def\.g_preface_macro#1#2{%
+ % #1 = macro to be appended to
+ % #2 = code to add
+ \_edef\.codeA{#2}%
+ \_ea\_ea\_ea\_gdef\_ea\_ea\_ea#1\_ea\_ea\_ea{\_ea\.codeA#1}%
+}
+
+\_def\.getstringlength#1{%
+ \_xdef\.stringlength{\.utfstringlen{#1}}%
+}%
+
+\_def\.for#1=#2to#3by#4#{\.forA{#1}{#2}{#3}{#4}}
+\_long\_def\.forA#1#2#3#4#5{\_begingroup
+ {\_escapechar=`\\ % allocation of #1 as counter:
+ \_ea \_ifx\_csname for:\_string#1\_endcsname \_relax
+ \_csname newcount\_ea\_endcsname \_csname for:\_string#1\_endcsname\_fi
+ \_ea}\_ea\_let\_ea#1\_csname for:\_string#1\_endcsname
+ #1=#2%
+ \_def\.forB{#5\_advance#1by#4\_relax \_ea\.forC}%
+ \_ifnum#4>0 \_def\.forC{\_ifnum#1>#3\_relax\_else\.forB\_fi}%
+ \_else \_def\.forC{\_ifnum#1<#3\_relax\_else\.forB\_fi}%
+ \_fi
+ \_ifnum#4=0 \let\.forC=\_relax \_fi
+ \.forC \_endgroup
+}
+
+\_def\.padatfront#1#2{%
+ % #1 = macro containing text to pad
+ % #2 = desired number of characters
+ % Pads a number with initial zeros.
+ \.getstringlength{#1}%
+ \.a=\.stringlength\_relax
+ \_advance\.a by 1\_relax
+ \.for \.iz = \.a to #2 by 1
+ {\.g_preface_macro{#1}{0}}%
+}
+
+\.a=-1\_relax
+\_def\.savehexsymbols(#1#2){%
+ \_advance\.a by 1\_relax%
+ \_ea\_def\_csname _qr_hexchar:\_the\.a\_endcsname{#1}%
+ \_ea\_edef\_csname _qr_hextodecimal:#1\_endcsname{\_the\.a}%
+ \_ifnum\.a=15\_relax
+ %Done.
+ \_let\.next=\_relax
+ \_else
+ \_def\.next{\.savehexsymbols(#2)}%
+ \_fi
+ \.next
+}%
+\.savehexsymbols(0123456789abcdef\_relax\_relax)%
+
+\_def\.decimaltobase#1#2#3{%
+ % #1 = macro to store result
+ % #2 = decimal representation of a positive integer
+ % #3 = new base
+ \_bgroup
+ \_edef\.newbase{#3}%
+ \_gdef\.base_result{}%
+ \.a=#2\_relax%
+ \.decimaltobase_recursive%
+ \_xdef#1{\.base_result}%
+ \_egroup
+}
+\_def\.decimaltobase_recursive{%
+ \.b=\.a
+ \_divide\.b by \.newbase\_relax
+ \_multiply\.b by -\.newbase\_relax
+ \_advance\.b by \.a\_relax
+ \_divide\.a by \.newbase\_relax
+ \_ifnum\.b<10\_relax
+ \_edef\.newdigit{\_the\.b}%
+ \_else
+ \_edef\.newdigit{\_csname _qr_hexchar:\_the\.b\_endcsname}%
+ \_fi
+ \_edef\.argument{{\_noexpand\.base_result}{\.newdigit}}%
+ \_ea\.g_preface_macro\.argument
+ \_ifnum\.a=0\_relax
+ \_relax
+ \_else
+ \_ea\.decimaltobase_recursive
+ \_fi
+}
+\_long\_def\.xaddto#1#2{\_xdef#1{#1#2}}
+
+\_def\.decimaltohex[#1]#2#3{%
+ % #1 (opt.) = number of hex digits to create
+ % #2 = macro to store result
+ % #3 = decimal digits to convert
+ \.decimaltobase{#2}{#3}{16}%
+ \.padatfront{#2}{#1}%
+}
+\_def\.decimaltobinary[#1]#2#3{%
+ % #1 (opt.) = number of bits to create
+ % #2 = macro to store result
+ % #3 = decimal digits to convert
+ \.decimaltobase{#2}{#3}{2}%
+ \.padatfront{#2}{#1}%
+}
+
+\.for \.iz = 0 to 15 by 1%
+ {%
+ \.decimaltohex[1]{\.hexchar}{\_the\.iz}%
+ \.decimaltobinary[4]{\.bits}{\_the\.iz}%
+ \_ea\_xdef\_csname _qr_b2h:\.bits\_endcsname{\.hexchar}%
+ \_ea\_xdef\_csname _qr_h2b:\.hexchar\_endcsname{\.bits}%
+ }%
+
+\_def\.binarytohex[#1]#2#3{%
+ % #1 (optional) = # digits desired
+ % #2 = macro to save to
+ % #3 = binary string (must be multiple of 4 bits)
+ \_def\.testi{#1}%
+ \_ifx\.testi\.relax%
+ %No argument specified
+ \_def\.desireddigits{0}%
+ \_else
+ \_def\.desireddigits{#1}%
+ \_fi
+ \_gdef\.base_result{}%
+ \_edef\.argument{(#3\_relax\_relax\_relax\_relax\_relax)}%
+ \_ea\.binarytohex_int\.argument%
+ \.padatfront{\.base_result}{\.desireddigits}%
+ \_xdef#2{\.base_result}%
+}
+\_def\.binarytohex_int(#1#2#3#4#5){%
+ % #1#2#3#4 = 4 bits
+ % #5 = remainder, including \_relax\_relax\_relax\_relax\_relax terminator
+ \_def\.testi{#1}%
+ \_ifx\.testi\.relax%
+ %Done.
+ \_def\.next{\_relax}%
+ \_else%
+ \_xdef\.base_result{\.base_result\_csname _qr_b2h:#1#2#3#4\_endcsname}%
+ \_def\.next{\.binarytohex_int(#5)}%
+ \_fi%
+ \.next%
+}
+
+\_def\.hextobinary[#1]#2#3{%
+ % #1 (optional) = # bits desired
+ % #2 = macro to save to
+ % #3 = hexadecimal string
+ \_bgroup
+ \_def\.testi{#1}%
+ \_ifx\.testi\.relax
+ %No argument specified
+ \_def\.desireddigits{0}%
+ \_else
+ \_def\.desireddigits{#1}%
+ \_fi
+ \_gdef\.base_result{}%
+ \_edef\.argument{(#3\_relax\_relax)}%
+ \_ea\.hextobinary_int\.argument%
+ \.padatfront{\.base_result}{\.desireddigits}%
+ \_xdef#2{\.base_result}%
+ \_egroup
+}
+\_def\.hextobinary_int(#1#2){%
+ % #1 = hexadecimal character
+ % #2 = remainder, including \_relax\_relax terminator
+ \_def\.testii{#1}%
+ \_ifx\.testii\.relax
+ %Done.
+ \_def\.next{\_relax}%
+ \_else
+ \_xdef\.base_result{\.base_result\_csname _qr_h2b:#1\_endcsname}%
+ \_def\.next{\.hextobinary_int(#2)}%
+ \_fi
+ \.next
+}
+
+\_def\.hextodecimal#1#2{%
+ \_edef\.argument{#2}%
+ \_ea\.a\_ea=\_ea\_number\_ea"\.argument\_relax
+ \_edef#1{\_the\.a}%
+}
+
+\_def\.hextodecimal#1#2{%
+ % #1 = macro to store result
+ % #2 = hexadecimal representation of a positive integer
+ \_bgroup
+ \.a=0\_relax
+ \_edef\.argument{(#2\_relax)}%
+ \_ea\.hextodecimal_recursive\.argument%
+ \_xdef#1{\_the\.a}%
+ \_egroup
+}
+\_def\.hextodecimal_recursive(#1#2){%
+ % #1 = first hex char
+ % #2 = remainder
+ \_advance \.a by \_csname _qr_hextodecimal:#1\_endcsname\_relax%
+ \_edef\.testii{#2}%
+ \_ifx\.testii\.relax%
+ %Done.
+ \_let\.next=\_relax%
+ \_else
+ %There's at least one more digit.
+ \_multiply\.a by 16\_relax
+ \_edef\.next{\_noexpand\.hextodecimal_recursive(#2)}%
+ \_fi%
+ \.next%
+}
+
+\_def\.storetomatrix#1#2#3#4{%
+ % #1 = matrix name
+ % #2 = row number
+ % #3 = column number
+ % #4 = value of matrix entry
+ \_ea\_gdef\_csname #1@#2@#3\_endcsname{#4}%
+}%
+
+\_def\.estoretomatrix#1#2#3#4{%
+ % This version performs exactly one expansion on #4.
+ % #1 = matrix name
+ % #2 = row number
+ % #3 = column number
+ % #4 = value of matrix
+ \_ea\_gdef\_csname #1@#2@#3\_ea\_endcsname\_ea{#4}%
+}%
+
+\_def\.matrixentry#1#2#3{%
+ % #1 = matrix name
+ % #2 = row number
+ % #3 = column number
+ \_csname #1@#2@#3\_endcsname
+}%
+
+\_def\.createsquareblankmatrix#1#2{%
+% \.creatematrix{#1}%
+ \_ea\_gdef\_csname #1@numrows\_endcsname{#2}%
+ \_ea\_gdef\_csname #1@numcols\_endcsname{#2}%
+ \.for \.iz = 1 to #2 by 1%
+ {\.for \.jz = 1 to #2 by 1%
+ {\.storetomatrix{#1}{\_the\.iz}{\_the\.jz}{\.blank}}}%
+}%
+
+\_def\.numberofrowsinmatrix#1{%
+ \_csname #1@numrows\_endcsname%
+}%
+
+\_def\.numberofcolsinmatrix#1{%
+ \_csname #1@numcols\_endcsname%
+}%
+
+\_def\.setnumberofrows#1#2{%
+ \_ea\_xdef\_csname #1@numrows\_endcsname{#2}%
+}%
+
+\_def\.setnumberofcols#1#2{%
+ \_ea\_xdef\_csname #1@numcols\_endcsname{#2}%
+}%
+
+\_newdimen\.desiredheight
+\_newdimen\.modulesize
+
+\_def\.link#1#2{\_hbox{\_pdfstartlink height\_ht0 depth0pt \.border
+ user{/Subtype/Link/A <</Type/Action/S/URI/URI(#1)>>}\_relax #2\_pdfendlink}%
+}
+\_def\.border{%
+ \_ifcsname _qr_kv:qrborder\_endcsname attr{/C[\.kv{qrborder}] /Border[0 0 .6]}%
+ \_else attr{/Border[0 0 0]}%
+ \_fi
+}
+
+\_def\.createliteralmatrix#1#2#3{%
+ % #1 = matrix name
+ % #2 = m, the number of rows and columns in the square matrix
+ % #3 = a string of m^2 tokens to be written into the matrix
+% \.creatematrix{#1}%
+ \_ea\_xdef\_csname #1@numrows\_endcsname{#2}%
+ \_ea\_xdef\_csname #1@numcols\_endcsname{#2}%
+ \_gdef\.literalmatrix_tokens{#3}%
+ \.for \.iz = 1 to #2 by 1%
+ {\.for \.jz = 1 to #2 by 1%
+ {\_ea\.createliteralmatrix_int\_ea(\.literalmatrix_tokens)%
+ \.estoretomatrix{#1}{\_the\.iz}{\_the\.jz}{\.entrytext}%
+ }%
+ }%
+}
+\_def\.createliteralmatrix_int(#1#2){%
+ \_def\.entrytext{#1}%
+ \_gdef\.literalmatrix_tokens{#2}%
+}
+
+\.createliteralmatrix{finderpattern}{8}{%
+ \.blackfixed\.blackfixed\.blackfixed\.blackfixed\.blackfixed\.blackfixed\.blackfixed\.whitefixed
+ \.blackfixed\.whitefixed\.whitefixed\.whitefixed\.whitefixed\.whitefixed\.blackfixed\.whitefixed
+ \.blackfixed\.whitefixed\.blackfixed\.blackfixed\.blackfixed\.whitefixed\.blackfixed\.whitefixed
+ \.blackfixed\.whitefixed\.blackfixed\.blackfixed\.blackfixed\.whitefixed\.blackfixed\.whitefixed
+ \.blackfixed\.whitefixed\.blackfixed\.blackfixed\.blackfixed\.whitefixed\.blackfixed\.whitefixed
+ \.blackfixed\.whitefixed\.whitefixed\.whitefixed\.whitefixed\.whitefixed\.blackfixed\.whitefixed
+ \.blackfixed\.blackfixed\.blackfixed\.blackfixed\.blackfixed\.blackfixed\.blackfixed\.whitefixed
+ \.whitefixed\.whitefixed\.whitefixed\.whitefixed\.whitefixed\.whitefixed\.whitefixed\.whitefixed
+}%
+
+\.createliteralmatrix{alignmentpattern}{5}{%
+ \.blackfixed\.blackfixed\.blackfixed\.blackfixed\.blackfixed
+ \.blackfixed\.whitefixed\.whitefixed\.whitefixed\.blackfixed
+ \.blackfixed\.whitefixed\.blackfixed\.whitefixed\.blackfixed
+ \.blackfixed\.whitefixed\.whitefixed\.whitefixed\.blackfixed
+ \.blackfixed\.blackfixed\.blackfixed\.blackfixed\.blackfixed
+}%
+
+\_def\.copymatrixentry#1#2#3#4#5#6{%
+ % Copy the (#2,#3) entry of matrix #1
+ % to the (#5,#6) position of matrix #4.
+ \_ea\_ea\_ea\_global%
+ \_ea\_ea\_ea\_let\_ea\_ea\_csname #4@#5@#6\_endcsname
+ \_csname #1@#2@#3\_endcsname
+}%
+
+\_def\.createduplicatematrix#1#2{%
+ % #1 = name of copy
+ % #2 = original matrix to be copied
+% \.creatematrix{#1}%
+ \.for \.iz = 1 to \.numberofrowsinmatrix{#2} by 1%
+ {\.for \.jz = 1 to \.numberofcolsinmatrix{#2} by 1%
+ {\.copymatrixentry{#2}{\_the\.iz}{\_the\.jz}{#1}{\_the\.iz}{\_the\.jz}%
+ }%
+ }%
+ \.setnumberofrows{#1}{\.numberofrowsinmatrix{#2}}%
+ \.setnumberofcols{#1}{\.numberofcolsinmatrix{#2}}%
+}%
+
+\_def\.placefinderpattern_int#1#2#3#4#5{%
+ % Work on matrix #1.
+ % Start in position (#2, #3) -- should be a corner
+ % #4 indicates horizontal direction (1=right, -1=left)
+ % #5 indicates vertical direction (1=down, -1=up)
+ %
+ % In this code, \sourcei and \sourcej are TeX counts working through the finderpattern matrix,
+ % and i and j are counters indicating positions in the big matrix.
+ \.setcounter\.i{#2}%
+ \.for \.sourcei=1 to 8 by 1%
+ {\.setcounter\.j{#3}%
+ \.for \.sourcej=1 to 8 by 1%
+ {\.copymatrixentry{finderpattern}{\_the\.sourcei}{\_the\.sourcej}%
+ {#1}{\_the\.i}{\_the\.j}%
+ \.addtocounter\.j{#5}%
+ }%
+ \.addtocounter\.i{#4}%
+ }%
+}%
+
+\_def\.placefinderpatterns#1{%
+ % #1=matrix name
+ \.placefinderpattern_int{#1}{1}{1}{1}{1}%
+ \.placefinderpattern_int{#1}{\.numberofrowsinmatrix{#1}}{1}{-1}{1}%
+ \.placefinderpattern_int{#1}{1}{\.numberofcolsinmatrix{#1}}{1}{-1}%
+}%
+
+\_def\.placetimingpatterns#1{%
+ %Set \.endingcol to n-8.
+ \.a=\.size\_relax%
+ \_advance\.a by -8\_relax%
+ \_edef\.endingcol{\_the\.a}%
+ \.for \.jz = 9 to \.endingcol by 1%
+ {\_ifodd\.jz\_relax%
+ \.storetomatrix{#1}{7}{\_the\.jz}{\.blackfixed}%
+ \.storetomatrix{#1}{\_the\.jz}{7}{\.blackfixed}%
+ \_else%
+ \.storetomatrix{#1}{7}{\_the\.jz}{\.whitefixed}%
+ \.storetomatrix{#1}{\_the\.jz}{7}{\.whitefixed}%
+ \_fi%
+ }%
+}%
+
+\_def\.placealignmentpattern_int#1#2#3{%
+ % Work on matrix #1.
+ % Write an alignment pattern into the matrix, centered on (#2,#3).
+ \.a=#2\_relax%
+ \_advance\.a by -2\_relax%
+ \.b=#3\_relax%
+ \_advance\.b by -2\_relax%
+ \.setcounter\.i{\_the\.a}%
+ \.for \.iz=1 to 5 by 1%
+ {\.setcounter\.j{\_the\.b}%
+ \.for \.jz=1 to 5 by 1%
+ {\.copymatrixentry{alignmentpattern}{\_the\.iz}{\_the\.jz}%
+ {#1}{\_the\.i}{\_the\.j}%
+ \.stepcounter\.j
+ }%
+ \.stepcounter\.i
+ }%
+}%
+
+\_newifi\_ifqr_incorner%
+\_def\.placealignmentpatterns#1{%
+ %There are k^2-3 alignment patterns,
+ %arranged in a (k x k) grid within the matrix.
+ %They begin in row 7, column 7,
+ %except that the ones in the NW, NE, and SW corners
+ %are omitted because of the finder patterns.
+ %Recall that
+ % * \.k stores k,
+ % * \.alignment_firstskip stores how far between the 1st and 2nd row/col, &
+ % * \.alignment_generalskip stores how far between each subsequent row/col.
+ \_ea\_ifnum\.k>0\_relax
+ %There will be at least one alignment pattern.
+ %N.B. k cannot equal 1.
+ \_ea\_ifnum\.k=2\_relax
+ % 2*2-3 = exactly 1 alignment pattern.
+ \.a=7\_relax
+ \_advance\.a by \.alignment_firstskip\_relax
+ \_xdef\.targetii{\_the\.a}%
+ \.placealignmentpattern_int{#1}{\.targetii}{\.targetii}%
+ \_else
+ % k is at least 3, so the following loops should be safe.
+ \_xdef\.targetii{7}%
+ \.for \.ii = 1 to \.k by 1%
+ {\_ifcase\.ii\_relax%
+ \_relax% \.ii should never equal 0.
+ \_or
+ \_xdef\.targetii{7}% If \.ii = 1, we start in row 7.
+ \_or
+ %If \.ii = 2, we add the firstskip.
+ \.a=\.targetii\_relax%
+ \_advance\.a by \.alignment_firstskip\_relax%
+ \_xdef\.targetii{\_the\.a}%
+ \_else
+ %If \.ii>2, we add the generalskip.
+ \.a=\.targetii\_relax%
+ \_advance\.a by \.alignment_generalskip\_relax%
+ \_xdef\.targetii{\_the\.a}%
+ \_fi
+ \.for \.jj = 1 to \.k by 1%
+ {\_ifcase\.jj\_relax%
+ \_relax% \.jj should never equal 0.
+ \_or
+ \_xdef\.targetjj{7}% If \.jj=1, we start in row 7.
+ \_or
+ %If \.jj=2, we add the firstskip.
+ \.a=\.targetjj\_relax%
+ \_advance\.a by \.alignment_firstskip%
+ \_xdef\.targetjj{\_the\.a}%
+ \_else
+ %If \.jj>2, we add the generalskip.
+ \.a=\.targetjj\_relax%
+ \_advance\.a by \.alignment_generalskip%
+ \_xdef\.targetjj{\_the\.a}%
+ \_fi
+ \.incornerfalse%
+ \_ifnum\.ii=1\_relax
+ \_ifnum\.jj=1\_relax
+ \.incornertrue
+ \_else
+ \_ifnum\.k=\.jj\_relax
+ \.incornertrue
+ \_fi
+ \_fi
+ \_else
+ \_ea\_ifnum\.k=\.ii\_relax
+ \_ifnum\.jj=1\_relax
+ \.incornertrue
+ \_fi
+ \_fi
+ \_fi
+ \_ifqr_incorner
+ \_relax
+ \_else
+ \.placealignmentpattern_int{#1}{\.targetii}{\.targetjj}%
+ \_fi
+ }% ends \.for \.jj
+ }% ends \.for \.ii
+ \_fi
+ \_fi
+}%
+
+\_def\.placedummyformatpatterns#1{%
+ \.for \.jz = 1 to 9 by 1%
+ {\_ifnum\.jz=7\_relax%
+ \_else%
+ \.storetomatrix{#1}{9}{\_the\.jz}{\.formatsquare}%
+ \.storetomatrix{#1}{\_the\.jz}{9}{\.formatsquare}%
+ \_fi%
+ }%
+ \.setcounter\.j{\.size}%
+ \.for \.jz = 1 to 8 by 1%
+ {\.storetomatrix{#1}{9}{\_the\.j}{\.formatsquare}%
+ \.storetomatrix{#1}{\_the\.j}{9}{\.formatsquare}%
+ \.addtocounter\.j{-1}%
+ }%
+ %Now go back and change the \.formatsquare in (n-8,9) to \.blackfixed.
+ \.addtocounter\.j{1}%
+ \.storetomatrix{#1}{\_the\.j}{9}{\.blackfixed}%
+}%
+
+\_def\.placedummyversionpatterns#1{%
+ \_ea\_ifnum\.version>6\_relax
+ %Must include version information.
+ \_global\.i=\.size%
+ \_global\_advance\.i by -10\_relax%
+ \.for \.iz = 1 to 3 by 1%
+ {\.for \.jz = 1 to 6 by 1%
+ {\.storetomatrix{#1}{\_the\.i}{\_the\.jz}{\.formatsquare}%
+ \.storetomatrix{#1}{\_the\.jz}{\_the\.i}{\.formatsquare}%
+ }%
+ \.stepcounter\.i
+ }%
+ \_fi
+}%
+
+\_def\.writebit(#1#2)#3{%
+ % #3 = matrix name
+ % (qr_i,qr_j) = position to write in (counters)
+ % #1 = bit to be written
+ % #2 = remaining bits plus '\_relax' as an end-of-file marker
+ \_edef\.datatowrite{#2}%
+ \_ifnum#1=1
+ \.storetomatrix{#3}{\_the\.i}{\_the\.j}{\.black}%
+ \_else
+ \.storetomatrix{#3}{\_the\.i}{\_the\.j}{\.white}%
+ \_fi
+}%
+
+\_newifi\_ifqr_rightcol
+\_newifi\_ifqr_goingup
+
+\_def\.writedata_hex#1#2{%
+ % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc.
+ % #2 = a string consisting of bytes to write into the matrix, in two-char hex format.
+ \.setcounter\.i{\.numberofrowsinmatrix{#1}}%
+ \.setcounter\.j{\.numberofcolsinmatrix{#1}}%
+ \.rightcoltrue
+ \.goinguptrue
+ \_edef\.argument{{#1}(#2\_relax\_relax\_relax)}%
+ \_ea\.writedata_hex_recursive\.argument%
+}%
+
+\_def\.writedata_hex_recursive#1(#2#3#4){%
+ % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc.
+ % (qr_i,qr_j) = position to write in counters
+ % #2#3#4 contains the hex codes of the bytes to be written, plus \_relax\_relax\_relax
+ % as an end-of-file marker
+ \_edef\.testii{#2}%
+ \_ifx\.testii\.relax%
+ % #2 is \_relax, so there is nothing more to write.
+ \_relax
+ \_let\.go=\_relax
+ \_else
+ % #2 is not \_relax, so there is another byte to write.
+ \.hextobinary[8]{\.bytetowrite}{#2#3}%
+ \_xdef\.datatowrite{\.bytetowrite\_relax}% %Add terminating "\_relax"
+ \.writedata_recursive{#1}% %This function actually writes the 8 bits.
+ \_edef\.argument{{#1}(#4)}%
+ \_ea\_def\_ea\.go\_ea{\_ea\.writedata_hex_recursive\.argument}% %Call self to write the next bit.
+ \_fi
+ \.go
+}%
+
+\_def\.writedata#1#2{%
+ % #1 = name of a matrix that has been prepared with finder patterns, timing patterns, etc.
+ % #2 = a string consisting of 0's and 1's to write into the matrix.
+ \.setcounter\.i{\.numberofrowsinmatrix{#1}}%
+ \.setcounter\.j{\.numberofcolsinmatrix{#1}}%
+ \.rightcoltrue
+ \.goinguptrue
+ \_edef\.datatowrite{#2\_relax}%
+ \.writedata_recursive{#1}%
+}%
+
+\_def\.iblank{\.blank}%
+
+\_def\.writedata_recursive#1{%
+ % #1 = matrix name
+ % (qr_i,qr_j) = position to write in (counters)
+ % \.datatowrite contains the bits to be written, plus '\_relax' as an end-of-file marker
+ \_ea\_let\_ea\.squarevalue\_csname #1@\_the\.i @\_the\.j\_endcsname%
+ \_ifx\.squarevalue\.iblank
+ %Square is blank, so write data in it.
+ \_ea\.writebit\_ea(\.datatowrite){#1}%
+ %The \.writebit macro not only writes the first bit of \.datatowrite into the matrix,
+ %but also removes the bit from the 'bitstream' of \.datatowrite.
+ \_fi
+ %Now adjust our position in the matrix.
+ \_ifqr_rightcol
+ %From the right-hand half of the two-bit column, we always move left. Easy peasy.
+ \.addtocounter\.j{-1}%
+ \.rightcolfalse
+ \_else
+ %If we're in the left-hand column, things are harder.
+ \_ifqr_goingup
+ %First, suppose we're going upwards.
+ \_ifnum\.i>1\_relax%
+ %If we're not in the first row, things are easy.
+ %We move one to the right and one up.
+ \.addtocounter\.j{1}%
+ \.addtocounter\.i{-1}%
+ \.rightcoltrue
+ \_else
+ %If we are in the first row, then we move to the left,
+ %and we are now in the right-hand column on a downward pass.
+ \.addtocounter\.j{-1}%
+ \.goingupfalse
+ \.rightcoltrue
+ \_fi
+ \_else
+ %Now, suppose we're going downwards.
+ \_ea\_ifnum\.size>\.i\_relax%
+ %If we're not yet in the bottom row, things are easy.
+ %We move one to the right and one down.
+ \.addtocounter\.j{1}%
+ \.addtocounter\.i{1}%
+ \.rightcoltrue
+ \_else
+ %If we are in the bottom row, then we move to the left,
+ %and we are now in the right-hand column on an upward pass.
+ \.addtocounter\.j{-1}%
+ \.rightcoltrue
+ \.goinguptrue
+ \_fi
+ \_fi
+ %One problem: what if we just moved into the 7th column?
+ %Das ist verboten.
+ %If we just moved (left) into the 7th column, we should move on into the 6th column.
+ \_ifnum\.j=7\_relax%
+ \.setcounter\.j{6}%
+ \_fi
+ \_fi
+ %Now check whether there are any more bits to write.
+ \_ifx\.datatowrite\.relax
+ % \.datatowrite is just `\_relax', so we're done.
+ \_let\.nexttoken=\_relax
+ \_relax
+ \_else
+ % Write some more!
+ \_def\.nexttoken{\.writedata_recursive{#1}}%
+ \_fi
+ \.nexttoken
+}%
+
+\_def\.writeremainderbits#1{%
+ % #1 = name of a matrix that has been prepared and partly filled.
+ % (qr_i,qr_j) = position to write in counters
+ \_ea\_ifnum\.numremainderbits>0\_relax
+ \_def\.datatowrite{}%
+ \.for \.iz = 1 to \.numremainderbits by 1%
+ {\.xaddto{\.datatowrite}{0}}%
+ \.xaddto{\.datatowrite}{\_relax}% terminator
+ \.writedata_recursive{#1}%
+ \_fi
+}%
+
+\_newifi\_ifqr_cellinmask
+
+\_def\.setmaskingfunction#1{%
+ % #1 = 1 decimal digit for the mask. (I see no reason to use the 3-bit binary code.)
+ % The current position is (\themaski,\themaskj), with indexing starting at 0.
+ \_edef\.maskselection{#1}%
+ \_ea\_ifcase\.maskselection\_relax
+ %Case 0: checkerboard
+ \_def\.parsemaskingfunction{%
+ % Compute mod(\themaski+\themaskj,2)%
+ \.a=\.maski%
+ \_advance\.a by \.maskj%
+ \.b=\.a%
+ \_divide\.b by 2%
+ \_multiply\.b by 2%
+ \_advance\.a by -\.b%
+ \_edef\.maskfunctionresult{\_the\.a}%
+ }%
+ \_or
+ %Case 1: horizontal stripes
+ \_def\.parsemaskingfunction{%
+ % Compute mod(\themaski,2)%
+ \_ifodd\.maski\_relax%
+ \_def\.maskfunctionresult{1}%
+ \_else%
+ \_def\.maskfunctionresult{0}%
+ \_fi%
+ }%
+ \_or
+ %Case 2: vertical stripes
+ \_def\.parsemaskingfunction{%
+ % Compute mod(\themaskj,3)%
+ \.a=\.maskj%
+ \_divide\.a by 3%
+ \_multiply\.a by 3%
+ \_advance\.a by -\.maskj%
+ \_edef\.maskfunctionresult{\_the\.a}%
+ }%
+ \_or
+ %Case 3: diagonal stripes
+ \_def\.parsemaskingfunction{%
+ % Compute mod(\themaski+\themaskj,3)%
+ \.a=\.maski%
+ \_advance\.a by \.maskj%
+ \.b=\.a%
+ \_divide\.b by 3%
+ \_multiply\.b by 3%
+ \_advance\.b by -\.a%
+ \_edef\.maskfunctionresult{\_the\.b}%
+ }%
+ \_or
+ %Case 4: wide checkerboard
+ \_def\.parsemaskingfunction{%
+ % Compute mod(floor(\themaski/2) + floor(\themaskj/3),2) %
+ \.a=\.maski%
+ \_divide\.a by 2%
+ \.b=\.maskj%
+ \_divide\.b by 3%
+ \_advance\.a by \.b%
+ \.b=\.a%
+ \_divide\.a by 2%
+ \_multiply\.a by 2%
+ \_advance\.a by -\.b%
+ \_edef\.maskfunctionresult{\_the\.a}%
+ }%
+ \_or
+ %Case 5: quilt
+ \_def\.parsemaskingfunction{%
+ % Compute mod(\themaski*\themaskj,2) + mod(\themaski*\themaskj,3) %
+ \.a=\.maski%
+ \_multiply\.a by \.maskj%
+ \.b=\.a%
+ \.c=\.a%
+ \_divide\.a by 2%
+ \_multiply\.a by 2%
+ \_advance\.a by -\.c% (result will be -mod(i*j,2), which is negative.)
+ \_divide\.b by 3%
+ \_multiply\.b by 3%
+ \_advance\.b by -\.c% (result will be -mod(i*j,3), which is negative.)
+ \_advance\.a by \.b% (result is negative of what's in the spec.)
+ \_edef\.maskfunctionresult{\_the\.a}%
+ }%
+ \_or
+ %Case 6: arrows
+ \_def\.parsemaskingfunction{%
+ % Compute mod( mod(\themaski*\themaskj,2) + mod(\themaski*\themaskj,3) , 2 ) %
+ \.a=\.maski%
+ \_multiply\.a by \.maskj%
+ \.b=\.a%
+ \.c=\.a%
+ \_multiply\.c by 2% % \.c equals 2*i*j.
+ \_divide\.a by 2%
+ \_multiply\.a by 2%
+ \_advance\.c by -\.a% Now \.c equals i*j + mod(i*j,2).
+ \_divide\.b by 3%
+ \_multiply\.b by 3%
+ \_advance\.c by -\.b% (Now \.c equals mod(i*j,2) + mod(i*j,3).
+ \.a=\.c%
+ \_divide\.a by 2%
+ \_multiply\.a by 2%
+ \_advance\.c by-\.a%
+ \_edef\.maskfunctionresult{\_the\.c}%
+ }%
+ \_or
+ %Case 7: shotgun
+ \_def\.parsemaskingfunction{%
+ % Compute mod( mod(\themaski+\themaskj,2) + mod(\themaski*\themaskj,3) , 2 ) %
+ \.a=\.maski%
+ \_advance\.a by \.maskj% %So \.a = i+j
+ \.b=\.maski%
+ \_multiply\.b by \.maskj% %So \.b = i*j
+ \.c=\.a%
+ \_advance\.c by \.b% So \.c = i+j+i*j
+ \_divide\.a by 2%
+ \_multiply\.a by 2%
+ \_advance\.c by -\.a% So \.c = mod(i+j,2) + i*j
+ \_divide\.b by 3%
+ \_multiply\.b by 3%
+ \_advance\.c by -\.b% So \.c = mod(i+j,2) + mod(i*j,3)
+ \.a=\.c%
+ \_divide\.c by 2%
+ \_multiply\.c by 2%
+ \_advance\.a by -\.c%
+ \_edef\.maskfunctionresult{\_the\.a}%
+ }%
+ \_fi
+}%
+
+\_def\.checkifcellisinmask{%
+ % The current position is (\.iz,\.jz), in TeX counts,
+ % but the counters (maski,maskj) should contain
+ % the current position with indexing starting at 0.
+ % That is, maski = \.iz-1 and maskj = \.jz-1.
+ %
+ % \.parsemaskingfunction must have been set by a call to \.setmaskingfunction
+ \.parsemaskingfunction
+ \_ea\_ifnum\.maskfunctionresult=0\_relax
+ \.cellinmasktrue
+ \_else
+ \.cellinmaskfalse
+ \_fi
+}%
+
+\_newcount\.maski
+\_newcount\.maskj
+
+\_def\.applymask#1#2#3{%
+ % #1 = name of a matrix that should be filled out completely
+ % except for the format and/or version information.
+ % #2 = name of a new matrix to contain the masked version
+ % #3 = 1 decimal digit naming the mask
+ \.createduplicatematrix{#2}{#1}%
+ \.setmaskingfunction{#3}%
+ \.setcounter\.maski{-1}%
+ \.for \.iz = 1 to \.size by 1%
+ {\.stepcounter\.maski
+ \.setcounter\.maskj{-1}%
+ \.for \.jz = 1 to \.size by 1%
+ {\.stepcounter\.maskj
+ \.checkifcellisinmask
+ \_ifqr_cellinmask
+ \.checkifcurrentcellcontainsdata{#2}%
+ \_ifqr_currentcellcontainsdata
+ \.flipcurrentcell{#2}%
+ \_fi
+ \_fi
+ }%
+ }%
+}%
+
+\_newifi\_ifqr_currentcellcontainsdata
+\.currentcellcontainsdatafalse
+
+\_def\.iwhite{\.white}%
+\_def\.iblack{\.black}%
+
+\_def\.checkifcurrentcellcontainsdata#1{%
+ % #1 = name of matrix
+ \.currentcellcontainsdatafalse
+ \_ea\_ifx\_csname #1@\_the\.iz @\_the\.jz\_endcsname\.iwhite
+ \.currentcellcontainsdatatrue
+ \_fi
+ \_ea\_ifx\_csname #1@\_the\.iz @\_the\.jz\_endcsname\.iblack
+ \.currentcellcontainsdatatrue
+ \_fi
+}%
+
+\_def\.flippedblack{\.black}%
+\_def\.flippedwhite{\.white}%
+
+\_def\.flipcurrentcell#1{%
+ % #1 = name of matrix
+ % (\.iz, \.jz) = current position, in TeX counts.
+ % This assumes the cell contains data, either black or white!
+ \_ea\_ifx\_csname #1@\_the\.iz @\_the\.jz\_endcsname\.iwhite
+ \.storetomatrix{#1}{\_the\.iz}{\_the\.jz}{\.flippedblack}%
+ \_else
+ \.storetomatrix{#1}{\_the\.iz}{\_the\.jz}{\.flippedwhite}%
+ \_fi
+}%
+
+\_def\.chooseandapplybestmask#1{%
+ % #1 = name of a matrix that should be filled out completely
+ % except for the format and/or version information.
+ % This function applies all eight masks in succession,
+ % calculates their penalties, and remembers the best.
+ % The number indicating which mask was used is saved in \.mask_selected.
+ \.createduplicatematrix{originalmatrix}{#1}%
+ \.message{<Applying Mask 0...}%
+ \.applymask{originalmatrix}{#1}{0}%
+ \.message{done. Calculating penalty...}%
+ \.evaluatemaskpenalty{#1}%
+ \_xdef\.currentbestpenalty{\.penalty}%
+ \.message{penalty is \.penalty>^^J}%
+ \_gdef\.currentbestmask{0}%
+ \.for \.iz = 1 to 7 by 1%
+ {\.message{<Applying Mask \_the\.iz...}%
+ \.applymask{originalmatrix}{currentmasked}{\_the\.iz}%
+ \.message{done. Calculating penalty...}%
+ \.evaluatemaskpenalty{currentmasked}%
+ \.message{penalty is \.penalty>^^J}%
+ \_ea\_ea\_ea\_ifnum\_ea\.penalty\_ea<\.currentbestpenalty\_relax
+ %We found a better mask.
+ \_xdef\.currentbestmask{\_the\.iz}%
+ \.createduplicatematrix{#1}{currentmasked}%
+ \_xdef\.currentbestpenalty{\.penalty}%
+ \_fi
+ }%
+ \_xdef\.mask_selected{\.currentbestmask}%
+ \.message{<Selected Mask \.mask_selected>^^J}%
+}%
+
+\_def\.Ni{3}%
+\_def\.Nii{3}%
+\_def\.Niii{40}%
+\_def\.Niv{10}%
+\_def\.fiveones{11111}%
+\_def\.fivezeros{00000}%
+\_def\.twoones{11}%
+\_def\.twozeros{00}%
+\_def\.finderA{00001011101}%
+\_def\.finderB{10111010000}%
+\_def\.finderBthree{1011101000}%
+\_def\.finderBtwo{101110100}%
+\_def\.finderBone{10111010}%
+\_def\.finderBzero{1011101}%
+\_newifi\_ifqr_stringoffive
+\_def\.addpenaltyiii{%
+ \.addtocounter\.penaltyiii{\.Niii}%
+}%
+\_newcount\.totalones
+\_newcount\.penaltyi
+\_newcount\.penaltyii
+\_newcount\.penaltyiii
+\_newcount\.penaltyiv
+\_def\.evaluatemaskpenalty#1{%
+ % #1 = name of a matrix that we will test for the penalty
+ % according to the specs.
+ \.setcounter\.penaltyi{0}%
+ \.setcounter\.penaltyii{0}%
+ \.setcounter\.penaltyiii{0}%
+ \.setcounter\.penaltyiv{0}%
+ \_bgroup%localize the meanings we give to the symbols
+ \_def\.black{1}\_def\.white{0}%
+ \_def\.blackfixed{1}\_def\.whitefixed{0}%
+ \_def\.formatsquare{0}% This is not stated in the specs, but seems
+ % to be the standard implementation.
+ \_def\.blank{0}% These would be any bits at the end.
+ %
+ \.setcounter\.totalones{0}%
+ \.for \.iz=1 to \.size by 1%
+ {\_def\.lastfive{z}% %The z is a dummy, that will be removed before any testing.
+ \.stringoffivefalse
+ \_def\.lasttwo_thisrow{z}% %The z is a dummy.
+ \_def\.lasttwo_nextrow{z}% %The z is a dummy.
+ \_def\.lastnine{z0000}% %The 0000 stands for the white space to the left. The z is a dummy.
+ \_def\.ignore_finderBat{0}%
+ \.for \.jz=1 to \.size by 1%
+ {\_edef\.newbit{\.matrixentry{#1}{\_the\.iz}{\_the\.jz}}%
+ %
+ % LASTFIVE CODE FOR PENALTY 1
+ % First, add the new bit to the end.
+ \_ea\.xaddto\_ea\.lastfive\_ea{\.newbit}%
+ \_ifnum\.jz<5\_relax%
+ %Not yet on the 5th entry.
+ %Don't do any testing.
+ \_else
+ % 5th entry or later.
+ % Remove the old one, and then test.
+ \.removefirsttoken\.lastfive%
+ \_ifx\.lastfive\.fiveones%
+ \_ifqr_stringoffive
+ %This is a continuation of a previous block of five or more 1's.
+ \.stepcounter\.penaltyi
+ \_else
+ %This is a new string of five 1's.
+ \.addtocounter\.penaltyi{\.Ni}%
+ \_global\.stringoffivetrue
+ \_fi
+ \_else
+ \_ifx\.lastfive\.fivezeros%
+ \_ifqr_stringoffive
+ %This is a continuation of a previous block of five or more 0's.
+ \.stepcounter\.penaltyi
+ \_else
+ %This is a new string of five 0's.
+ \.addtocounter\.penaltyi{\.Ni}%
+ \_global\.stringoffivetrue
+ \_fi
+ \_else
+ %This is not a string of five 1's or five 0's.
+ \_global\.stringoffivefalse
+ \_fi
+ \_fi
+ \_fi
+ %
+ % 2x2 BLOCKS FOR PENALTY 2
+ % Every 2x2 block of all 1's counts for \.Nii penalty points.
+ % We do not need to run this test in the last row.
+ \_ea\_ifnum\_ea\.iz\_ea<\.size\_relax
+ \_ea\.xaddto\_ea\.lasttwo_thisrow\_ea{\.newbit}%
+ %Compute \.iplusone
+ \.a=\.iz\_relax%
+ \_advance\.a by 1%
+ \_edef\.iplusone{\_the\.a}%
+ %
+ \_edef\.nextrowbit{\.matrixentry{#1}{\.iplusone}{\_the\.jz}}%
+ \_ea\.xaddto\_ea\.lasttwo_nextrow\_ea{\.nextrowbit}%
+ \_ifnum\.jz<2\_relax%
+ %Still in the first column; no check.
+ \_else
+ %Second column or later. Remove the old bits, and then test.
+ \.removefirsttoken\.lasttwo_thisrow
+ \.removefirsttoken\.lasttwo_nextrow
+ \_ifx\.lasttwo_thisrow\.twoones
+ \_ifx\.lasttwo_nextrow\.twoones
+ \.addtocounter\.penaltyii{\.Nii}%
+ \_fi
+ \_else
+ \_ifx\.lasttwo_thisrow\.twozeros
+ \_ifx\.lasttwo_nextrow\.twozeros
+ \.addtocounter\.penaltyii{\.Nii}%
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ %
+ % LASTNINE CODE FOR PENALTY 3
+ % First, add the new bit to the end.
+ \_ea\.xaddto\_ea\.lastnine\_ea{\.newbit}%
+ \_ifnum\.jz<7\_relax%
+ %Not yet on the 7th entry.
+ %Don't do any testing.
+ \_else
+ % 7th entry or later.
+ % Remove the old one, and then test.
+ \.removefirsttoken\.lastnine
+ \_ea\_ifnum\.size=\.jz\_relax%
+ % Last column. Any of the following should count:
+ % 1011101 (\.finderBzero)
+ % 10111010 (\.finderBone)
+ % 101110100 (\.finderBtwo)
+ % 1011101000 (\.finderBthree)
+ % 10111010000 (\.finderB)
+ \_ifx\.lastnine\.finderB
+ \.addpenaltyiii
+ \_else
+ \.removefirsttoken\.lastnine
+ \_ifx\.lastnine\.finderBthree
+ \.addpenaltyiii
+ \_else
+ \.removefirsttoken\.lastnine
+ \_ifx\.lastnine\.finderBtwo
+ \.addpenaltyiii
+ \_else
+ \.removefirsttoken\.lastnine
+ \_ifx\.lastnine\.finderBone
+ \.addpenaltyiii
+ \_else
+ \.removefirsttoken\.lastnine
+ \_ifx\.lastnine\.finderBzero
+ \.addpenaltyiii
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ \_else
+ \_ifx\.lastnine\.finderA% %Matches 0000 1011101
+ \.addpenaltyiii
+ %Also, we record our discovery, so that we can't count this pattern again
+ %if it shows up four columns later as 1011101 0000.
+ %
+ %Set \.ignore_finderBat to \.jz+4.
+ \.a=\.jz\_relax%
+ \_advance\.a by 4%
+ \_xdef\.ignore_finderBat{\_the\.a}%
+ \_else
+ \_ifx\.lastfive\.finderB% %Matches 1011101 0000.
+ \_ea\_ifnum\.ignore_finderBat=\.jz\_relax
+ %This pattern was *not* counted already earlier.
+ \.addpenaltyiii
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ %
+ %COUNT 1's FOR PENALTY 4
+ \_ea\_ifnum\.newbit=1\_relax%
+ \.stepcounter\.totalones
+ \_fi
+ }% end of j-loop
+ }% end of i-loop
+ %
+ %NOW WE ALSO NEED TO RUN DOWN THE COLUMNS TO FINISH CALCULATING PENALTIES 1 AND 3.
+ \.for \.jz=1 to \.size by 1%
+ {\_def\.lastfive{z}% %The z is a dummy, that will be removed before any testing.
+ \.stringoffivefalse
+ \_def\.lastnine{z0000}% %The 0000 stands for the white space to the left. The z is a dummy.
+ \_def\.ignore_finderBat{0}%
+ \.for \.iz=1 to \.size by 1%
+ {\_edef\.newbit{\.matrixentry{#1}{\_the\.iz}{\_the\.jz}}%
+ %
+ % LASTFIVE CODE FOR PENALTY 1
+ % First, add the new bit to the end.
+ \_ea\.xaddto\_ea\.lastfive\_ea{\.newbit}%
+ \_ifnum\.iz<5\_relax%
+ %Not yet on the 5th entry.
+ %Don't do any testing.
+ \_else
+ % 5th entry or later.
+ % Remove the old one, and then test.
+ \.removefirsttoken\.lastfive
+ \_ifx\.lastfive\.fiveones%
+ \_ifqr_stringoffive
+ %This is a continuation of a previous block of five or more 1's.
+ \.stepcounter\.penaltyi
+ \_else
+ %This is a new string of five 1's.
+ \.addtocounter\.penaltyi{\.Ni}%
+ \_global\.stringoffivetrue
+ \_fi
+ \_else
+ \_ifx\.lastfive\.fivezeros%
+ \_ifqr_stringoffive
+ %This is a continuation of a previous block of five or more 0's.
+ \.stepcounter\.penaltyi
+ \_else
+ %This is a new string of five 0's.
+ \.addtocounter\.penaltyi{\.Ni}%
+ \_global\.stringoffivetrue
+ \_fi
+ \_else
+ %This is not a string of five 1's or five 0's.
+ \_global\.stringoffivefalse
+ \_fi
+ \_fi
+ \_fi
+ %
+ % HAPPILY, WE DON'T NEED TO CALCULATE PENALTY 2 AGAIN.
+ %
+ % LASTNINE CODE FOR PENALTY 3
+ % First, add the new bit to the end.
+ \_ea\.xaddto\_ea\.lastnine\_ea{\.newbit}%
+ \_ifnum\.iz<7\_relax%
+ %Not yet on the 7th entry.
+ %Don't do any testing.
+ \_else
+ % 7th entry or later.
+ % Remove the old one, and then test.
+ \.removefirsttoken\.lastnine
+ \_ea\_ifnum\.size=\.iz\_relax%
+ % Last column. Any of the following should count:
+ % 1011101 (\.finderBzero)
+ % 10111010 (\.finderBone)
+ % 101110100 (\.finderBtwo)
+ % 1011101000 (\.finderBthree)
+ % 10111010000 (\.finderB)
+ \_ifx\.lastnine\.finderB
+ \.addpenaltyiii
+ \_else
+ \.removefirsttoken\.lastnine
+ \_ifx\.lastnine\.finderBthree
+ \.addpenaltyiii
+ \_else
+ \.removefirsttoken\.lastnine
+ \_ifx\.lastnine\.finderBtwo
+ \.addpenaltyiii
+ \_else
+ \.removefirsttoken\.lastnine
+ \_ifx\.lastnine\.finderBone
+ \.addpenaltyiii
+ \_else
+ \.removefirsttoken\.lastnine
+ \_ifx\.lastnine\.finderBzero
+ \.addpenaltyiii
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ \_else
+ \_ifx\.lastnine\.finderA% %Matches 0000 1011101
+ \.addpenaltyiii
+ %Also, we record our discovery, so that we can't count this pattern again
+ %if it shows up four columns later as 1011101 0000.
+ %
+ %Set \.ignore_finderBat to \.iz+4.
+ \.a=\.iz\_relax%
+ \_advance\.a by 4%
+ \_xdef\.ignore_finderBat{\_the\.a}%
+ \_else
+ \_ifx\.lastfive\.finderB% %Matches 1011101 0000.
+ \_ea\_ifnum\.ignore_finderBat=\.iz\_relax
+ %This pattern was *not* counted already earlier.
+ \.addpenaltyiii
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ \_fi
+ %
+ }% end of i-loop
+ }% end of j-loop
+ \_egroup
+ %
+ %CALCULATE PENALTY 4
+ %According to the spec, penalty #4 is computed as
+ % floor( |(i/n^2)-0.5|/0.05 )
+ % where i is the total number of 1's in the matrix.
+ % This is equal to abs(20*i-10n^2) div n^2.
+ %
+ \.a=\.totalones\_relax
+ \_multiply\.a by 20\_relax
+ \.b=\.size\_relax
+ \_multiply\.b by \.size\_relax
+ \.c=10\_relax
+ \_multiply\.c by \.b\_relax
+ \_advance\.a by -\.c\_relax
+ \_ifnum\.a<0\_relax
+ \_multiply\.a by -1\_relax
+ \_fi
+ \_divide\.a by \.b\_relax
+ \.setcounter\.penaltyiv{\_the\.a}%
+ %
+ %CALCULATE TOTAL PENALTY
+ \.a=\_the\.penaltyi\_relax%
+ \_advance\.a by \_the\.penaltyii\_relax%
+ \_advance\.a by \_the\.penaltyiii\_relax%
+ \_advance\.a by \_the\.penaltyiv\_relax%
+ \_edef\.penalty{\_the\.a}%
+}%
+
+\_def\.removefirsttoken#1{%
+ %Removes the first token from the macro named in #1.
+ \_edef\.argument{(#1)}%
+ \_ea\.removefirsttoken_int\.argument%
+ \_xdef#1{\.removefirsttoken_result}%
+}%
+\_def\.removefirsttoken_int(#1#2){%
+ \_def\.removefirsttoken_result{#2}%
+}%
+
+\_def\.writeformatstring#1#2{%
+ % #1 = matrix name
+ % #2 = binary string representing the encoded and masked format information
+ \.setcounter\.i{9}%
+ \.setcounter\.j{1}%
+ \_edef\.argument{{#1}(#2\_relax)}%
+ \_ea\.writeformatA_recursive\.argument
+ %
+ \.setcounter\.i{\.numberofrowsinmatrix{#1}}%
+ \.setcounter\.j{9}%
+ \_ea\.writeformatB_recursive\.argument
+}%
+
+\_def\.writeformatA_recursive#1(#2#3){%
+ % #1 = matrix name
+ % #2 = first bit of string
+ % #3 = rest of bitstream
+ % (qr_i,qr_j) = current (valid) position to write (in counters)
+ \_ifnum#2=1\_relax
+ \.storetomatrix{#1}{\_the\.i}{\_the\.j}{\.blackformat}%
+ \_else
+ \.storetomatrix{#1}{\_the\.i}{\_the\.j}{\.whiteformat}%
+ \_fi
+ % Now the tricky part--moving \.iz and \.jz to their next positions.
+ \_ifnum\.j<9\_relax
+ %If we're not yet in column 9, move right.
+ \.stepcounter\.j
+ \_ifnum\.j=7\_relax
+ %But we skip column 7!
+ \.stepcounter\.j
+ \_fi
+ \_else
+ %If we're in column 9, we move up.
+ \.addtocounter\.i{-1}%
+ \_ifnum\.i=7\_relax
+ %But we skip row 7!
+ \.addtocounter\.i{-1}%
+ \_fi
+ \_fi
+ %N.B. that at the end of time, this will leave us at invalid position (0,9).
+ %That makes for an easy test to know when we are done.
+ \_ifnum\.i<1
+ \_let\.nexttoken=\_relax
+ \_else
+ \_def\.nexttoken{\.writeformatA_recursive{#1}(#3)}%
+ \_fi
+ \.nexttoken
+}%
+
+\_def\.writeformatB_recursive#1(#2#3){%
+ % #1 = matrix name
+ % #2 = first bit of string
+ % #3 = rest of bitstream
+ % (qr_i,qr_j) = current (valid) position to write (in counters)
+ \_ifnum#2=1\_relax
+ \.storetomatrix{#1}{\_the\.i}{\_the\.j}{\.blackformat}%
+ \_else
+ \.storetomatrix{#1}{\_the\.i}{\_the\.j}{\.whiteformat}%
+ \_fi
+ % Now the tricky part--moving counters i and j to their next positions.
+ \.a=\.size%
+ \_advance\.a by -6\_relax%
+ \_ifnum\.a<\.i\_relax
+ %If we're not yet in row n-6, move up.
+ \.addtocounter\.i{-1}%
+ \_else
+ \_ifnum\.a=\.i\_relax
+ %If we're actually in row n-6, we jump to position (9,n-7).
+ \.setcounter\.i{9}%
+ %Set counter j equal to \.size-7.
+ \_global\.j=\.size\_relax%
+ \_global\_advance\.j by -7\_relax%
+ \_else
+ %Otherwise, we must be in row 9.
+ %In this case, we move right.
+ \.stepcounter\.j
+ \_fi
+ \_fi
+ %N.B. that at the end of time, this will leave us at invalid position (9,n+1).
+ %That makes for an easy test to know when we are done.
+ \_ea\_ifnum\.size<\.j\_relax
+ \_let\.nexttoken=\_relax
+ \_else
+ \_def\.nexttoken{\.writeformatB_recursive{#1}(#3)}%
+ \_fi
+ \.nexttoken
+}%
+
+\_def\.writeversionstring#1#2{%
+ % #1 = matrix name
+ % #2 = binary string representing the encoded version information
+ %
+ % Plot the encoded version string into the matrix.
+ % This is only done for versions 7 and higher.
+ \_ea\_ifnum\.version>6\_relax
+ %Move to position (n-8,6).
+ \.setcounter\.i{\.size}\_relax%
+ \.addtocounter\.i{-8}\_relax%
+ \.setcounter\.j{6}%
+ \_edef\.argument{{#1}(#2\_relax)}%
+ \_ea\.writeversion_recursive\.argument
+ \_fi
+}%
+
+\_def\.writeversion_recursive#1(#2#3){%
+ % #1 = matrix name
+ % #2 = first bit of string
+ % #3 = rest of bitstream
+ % (qr_i,qr_j) = current (valid) position to write (in counters)
+ %
+ % The version information is stored symmetrically in the matrix
+ % In two transposed regions, so we can write both at the same time.
+ % In the comments, we describe what happens in the lower-left region,
+ % not the upper-right.
+ %
+ %Set \.topline equal to n-10.
+ \.a=\.size\_relax%
+ \_advance\.a by -10\_relax%
+ \_edef\.topline{\_the\.a}%
+ %
+ \_ifnum#2=1\_relax
+ \.storetomatrix{#1}{\_the\.i}{\_the\.j}{\.blackformat}%
+ \.storetomatrix{#1}{\_the\.j}{\_the\.i}{\.blackformat}%
+ \_else
+ \.storetomatrix{#1}{\_the\.i}{\_the\.j}{\.whiteformat}%
+ \.storetomatrix{#1}{\_the\.j}{\_the\.i}{\.whiteformat}%
+ \_fi
+ % Now the tricky part--moving counters i and j to their next positions.
+ \.addtocounter\.i{-1}%
+ \_ea\_ifnum\.topline>\.i\_relax
+ %We've overshot the top of the region.
+ %We need to move left one column and down three.
+ \.addtocounter\.j{-1}%
+ \.addtocounter\.i{3}%
+ \_fi
+ %N.B. that at the end of time, this will leave us at invalid position (n-8,0).
+ %That makes for an easy test to know when we are done.
+ \_ifnum\.j<1\_relax
+ \_let\.nexttoken=\_relax
+ \_else
+ \_def\.nexttoken{\.writeversion_recursive{#1}(#3)}%
+ \_fi
+ \.nexttoken
+}%
+\_newcount\.hexchars
+
+\_def\.encode_binary#1{%
+ % #1 = string of ascii characters, to be converted into bitstream
+ %
+ % We do this one entirely in hex, rather than binary, because we can.
+ %
+ %Now comes the actual data.
+ %
+ {\_endlinechar=-1 \_xdef\.codetext{4\.utfstring{#1}0}}%
+ %The terminator is 0
+ %\.xaddto\.codetext{0}% %This is '0000' in binary.
+ %
+ %There is no need to pad bits to make a multiple of 8,
+ %because the data length is already 4 + 8 + 8n + 4.
+ %
+ %Now add padding codewords if needed.
+ \.setcounter\.hexchars{0}%
+ \.getstringlength{\.codetext}%
+ \.setcounter\.hexchars{\.stringlength}%
+ %Set \.numpaddingcodewords equal to \.totaldatacodewords - hexchars/2.
+ \.a=-\.hexchars\_relax
+ \_divide\.a by 2\_relax
+ \_advance\.a by \.totaldatacodewords\_relax
+ \_edef\.numpaddingcodewords{\_the\.a}%
+ %
+ \_ea\_ifnum\.numpaddingcodewords<0%
+ \_edef\.ds{ERROR: Too much data! Over by \.numpaddingcodewords bytes.}\_show\.ds
+ \_fi
+ \_ea\_ifnum\.numpaddingcodewords>0%
+ \.for \.iz = 2 to \.numpaddingcodewords by 2%
+ {\.xaddto{\.codetext}{ec11}}%
+ \_ea\_ifodd\.numpaddingcodewords\_relax
+ \.xaddto{\.codetext}{ec}%
+ \_fi
+ \_fi
+}%
+
+\_def\.splitcodetextintoblocks{%
+ \.setcounter\.i{0}%
+ \.for \.jz = 1 to \.numshortblocks by 1%
+ {\.stepcounter\.i
+ \.splitoffblock{\.codetext}{\_the\.i}{\.shortblock_size}%
+ }%
+ \_ea\_ifnum\.numlongblocks>0\_relax
+ \.for \.jz = 1 to \.numlongblocks by 1%
+ {\.stepcounter\.i
+ \.splitoffblock{\.codetext}{\_the\.i}{\.longblock_size}%
+ }%
+ \_fi
+}%
+
+\_def\.splitoffblock#1#2#3{%
+ % #1 = current codetext in hexadecimal
+ % #2 = number to use in csname "\datablock@#2".
+ % #3 = number of bytes to split off
+ \.message{<Splitting off block #2>}%
+ \_ea\_gdef\_csname datablock@#2\_endcsname{}% %This line is important!
+ \.for \.iz = 1 to #3 by 1%
+ {\_edef\.argument{{#2}(#1)}%
+ \_ea\.splitoffblock_int\.argument
+ }%
+}%
+
+\_def\.splitoffblock_int#1(#2#3#4){%
+ % #1 = number to use in csname "\datablock@#1".
+ % #2#3 = next byte to split off
+ % #4 = remaining text
+ %
+ % We add the next byte to "\datablock@#1",
+ % and we remove it from the codetext.
+ \_ea\_xdef\_csname datablock@#1\_endcsname{\_csname datablock@#1\_endcsname#2#3}%
+ \_xdef\.codetext{#4}%
+}%
+
+\_def\.createerrorblocks{%
+ \.for \.ii = 1 to \.numblocks by 1%
+ {\.message{<Making error block \_the\.ii>}%
+ \.FXgenerate_errorbytes{\_csname datablock@\_the\.ii\_endcsname}{\.numeccodewords}%
+ \_ea\_xdef\_csname errorblock@\_the\.ii\_endcsname{\.FXerrorbytes}%
+ }%
+}%
+
+\_def\.interleave{%
+ \.setcounter\.i{0}%
+ \_def\.interleaved_text{}%
+ \.message{<Interleaving datablocks of length \.shortblock_size\_space and \.longblock_size: }%
+ \.for \.ii = 1 to \.shortblock_size by 1%
+ {\.for \.jj = 1 to \.numblocks by 1%
+ {\.writefromblock{datablock}{\_the\.jj}%
+ }%
+ \.message{\_the\.ii,}%
+ }%
+ %The long blocks are numbered \.numshortblocks+1, \.numshortblocks+2, ..., \.numblocks.
+ \.a=\.numshortblocks\_relax
+ \_advance\.a by 1\_relax
+ \.for \.jj = \.a to \.numblocks by 1%
+ {\.writefromblock{datablock}{\_the\.jj}}%
+ \_ea\_ifnum\.numlongblocks>0\_relax%
+ \.message{\.longblock_size.>}%
+ \_else
+ \.message{.>}%
+ \_fi
+ \.message{<Interleaving errorblocks of length \.numeccodewords: }%
+ \.for \.ii = 1 to \.numeccodewords by 1%
+ {\.message{\_the\.ii,}%
+ \.for \.jj = 1 to \.numblocks by 1%
+ {\.writefromblock{errorblock}{\_the\.jj}%
+ }%
+ }%
+ \.message{.><Interleaving complete.>}%
+}%
+
+\_def\.writefromblock#1#2{%
+ % #1 = either 'datablock' or 'errorblock'
+ % #2 = block number, in {1,...,\.numblocks}%
+ \_edef\.argument{(\_csname #1@#2\_endcsname\_relax\_relax\_relax)}%
+ \_ea\.writefromblock_int\.argument
+ \_ea\_xdef\_csname #1@#2\_endcsname{\.writefromblock_remainder}%
+}%
+
+\_def\.writefromblock_int(#1#2#3){%
+ % #1#2 = first byte (in hex) of text, which will be written to \.interleaved_text
+ % #3 = remainder, including \_relax\_relax\_relax terminator.
+ \.xaddto{\.interleaved_text}{#1#2}%
+ \.writefromblock_intint(#3)%
+}%
+
+\_def\.writefromblock_intint(#1\_relax\_relax\_relax){%
+ \_xdef\.writefromblock_remainder{#1}%
+}%
+
+\_newifi\_ifqr_leadingcoeff
+\_def\.testleadingcoeff(#1#2){%
+ % Tests whether the leading digit of #1#2 is 1.
+ \_ifnum#1=1\_relax
+ \.leadingcoefftrue
+ \_else
+ \.leadingcoefffalse
+ \_fi
+}%
+
+\_def\.polynomialdivide#1#2{%
+ \_edef\.numerator{#1}%
+ \_edef\.denominator{#2}%
+ \.divisiondonefalse%
+ \_ea\_ea\_ea\.oneroundofdivision\_ea\_ea\_ea{\_ea\.numerator\_ea}\_ea{\.denominator}%
+}%
+
+\_def\.empty{}%
+\_def\.oneroundofdivision#1#2{%
+ % #1 = f(x), of degree n
+ % #2 = g(x), of degree m
+ % Obtains a new polynomial h(x), congruent to f(x) modulo g(x),
+ % but of degree at most n-1.
+ %
+ % If leading coefficient of f(x) is 1, subtracts off g(x) * x^(n-m).
+ % If leading coefficient of f(x) is 0, strips off that leading zero.
+ %
+ \.testleadingcoeff(#1)%
+ \_ifqr_leadingcoeff
+ \.xorbitstrings{#1}{#2}%
+ \_ifqr_xorfailed
+ %If xor failed, that means our #1 was already the remainder!
+ \.divisiondonetrue
+ \_edef\.theremainder{#1}%
+ \_else
+ %xor succeeded. We need to recurse.
+ \_ea\_ea\_ea\_edef\_ea\_ea\_ea\.numerator\_ea\_ea\_ea{\_ea\.stripleadingzero\_ea(\.xorresult)}%
+ \_fi
+ \_else
+ \_ea\_def\_ea\.numerator\_ea{\.stripleadingzero(#1)}%
+ \_ifx\.numerator\.empty
+ \.divisiondonetrue
+ \_def\.theremainder{0}%
+ \_fi
+ \_fi
+ \_ifqr_divisiondone
+ \_relax
+ \_else
+ \_ea\.oneroundofdivision\_ea{\.numerator}{#2}%
+ \_fi
+}%
+
+\_def\.stripleadingzero(0#1){#1}%Strips off a leading zero.
+
+\_newifi\_ifqr_xorfailed% This flag will trigger when #2 is longer than #1.
+
+\_def\.xorbitstrings#1#2{%
+ % #1 = bitstring
+ % #2 = bitstring no longer than #1
+ \.xorfailedfalse
+ \_edef\.argument{(,#1\_relax\_relax)(#2\_relax\_relax)}%
+ \_ea\.xorbitstrings_recursive\.argument
+ %\.xorbitstrings_recursive(,#1\_relax\_relax)(#2\_relax\_relax)%
+}%
+
+\_def\.xorbitstrings_recursive(#1,#2#3)(#4#5){%
+ % #1#2#3 is the first bitstring, xor'ed up through #1.
+ % #4#5 is the remaining portion of the second bitstring.
+ \_def\.testii{#2}%
+ \_def\.testiv{#4}%
+ \_ifx\.testii\.relax
+ % #1 contains the whole string.
+ % Now if #4 is also \_relax, that means the two strings started off with equal lengths.
+ % If, however, #4 is not \_relax, that means the second string was longer than the first, a problem.
+ \_ifx\.testiv\.relax
+ %No problem. We are done.
+ \.xorbit_saveresult(#1#2#3)%
+ \_else
+ %Problem! The second string was longer than the first.
+ \.xorfailedtrue
+ \_def\.xorresult{}%
+ \_fi
+ \_else
+ % There is still a bit to manipulate in #2.
+ % Check whether #4 contains anything.
+ \_ifx\.testiv\.relax
+ % No, #4 is empty. We are done. "#2#3" contains the remainder of the first string,
+ % which we append untouched and then strip off the two \_relax-es.
+ \.xorbit_saveresult(#1#2#3)%
+ \_else
+ % Yes, #4 still has something to XOR. Do the task.
+ \_ifnum#2=#4\_relax
+ \.xorbitstrings_recursive(#1%
+ 0,#3)(#5)%
+ \_else
+ \.xorbitstrings_recursive(#1%
+ 1,#3)(#5)%
+ \_fi
+ \_fi
+ \_fi
+}%
+
+\_def\.xorbit_saveresult(#1\_relax\_relax){%
+ %Strips off the extra '\_relax'es at the end.
+ \_def\.xorresult{#1}%
+}%
+
+\_newifi\_ifqr_divisiondone
+
+\_def\.BCHcode#1{%
+ \_edef\.formatinfo{#1}%
+ \_def\.formatinfopadded{\.formatinfo 0000000000}%
+ \_def\.divisor{10100110111}%
+ \.divisiondonefalse
+ \.polynomialdivide{\.formatinfopadded}{\.divisor}%
+ %
+ \.getstringlength{\.theremainder}%
+ %Run loop from stringlength+1 to 10.
+ \.a=\.stringlength\_relax%
+ \_advance\.a by 1\_relax%
+ \.for \.iz = \.a to 10 by 1%
+ {%
+ \_xdef\.theremainder{0\.theremainder}%
+ }%
+ \_edef\.BCHresult{\.formatinfo\.theremainder}%
+}%
+
+\_def\.formatmask{101010000010010}%
+
+\_def\.encodeandmaskformat#1{%
+ \.BCHcode{#1}%
+ \.xorbitstrings{\.BCHresult}{\.formatmask}%
+ \_edef\.formatbitstring{\.xorresult}%
+}%
+
+\_def\.Golaycode#1{%
+ % #1 = 6-bit version number
+ \_edef\.versioninfo{#1}%
+ \_def\.versioninfopadded{\.versioninfo 000000000000}% %Append 12 zeros.
+ \_def\.divisor{1111100100101}%
+ \.divisiondonefalse
+ \.polynomialdivide{\.versioninfopadded}{\.divisor}%
+ %
+ \.getstringlength{\.theremainder}%
+ %Run loop from stringlength+1 to 12.
+ \.a=\.stringlength\_relax%
+ \_advance\.a by 1\_relax%
+ \.for \.iz = \.a to 12 by 1%
+ {%
+ \_xdef\.theremainder{0\.theremainder}%
+ }%
+ \_edef\.Golayresult{\.versioninfo\.theremainder}%
+}%
+\_def\.Fresult{}%
+
+\_def\.xorbitstring#1#2#3{%
+ % #1 = new macro to receive result
+ % #2, #3 = bitstrings to xor. The second can be shorter than the first.
+ \_def\.xor_result{}%
+ \_edef\.argument{(#2\_relax\_relax)(#3\_relax\_relax)}%
+ \_ea\.xorbitstring_recursive\.argument%
+ \_edef#1{\.xor_result}%
+}%
+\_def\.xorbitstring_recursive(#1#2)(#3#4){%
+ \_edef\.testi{#1}%
+ \_ifx\.testi\.relax%
+ %Done.
+ \let\.next=\_relax%
+ \_else
+ \_if#1#3\_relax
+ \.xaddto{\.xor_result}{0}%
+ \_else
+ \.xaddto{\.xor_result}{1}%
+ \_fi
+ \_edef\.next{\_noexpand\.xorbitstring_recursive(#2)(#4)}%
+ \_fi
+ \.next
+}
+
+\_def\.Faddchar_raw#1#2{%
+ %Add two hexadecimal digits using bitwise xor
+ \.hextobinary[4]{\.summandA}{#1}%
+ \.hextobinary[4]{\.summandB}{#2}%
+ \.xorbitstring{\.Fresult}{\.summandA}{\.summandB}%
+ \.binarytohex[1]{\.Fresult}{\.Fresult}%
+}%
+
+\_def\.canceltwos#1{%
+ \_edef\.argument{(#1\_relax\_relax)}%
+ \_ea\.canceltwos_int\.argument%
+}%
+
+\_def\.canceltwos_int(#1#2){%
+ \_ea\.canceltwos_recursion(,#1#2)%
+}%
+
+\_def\.canceltwos_recursion(#1,#2#3){%
+ \_def\.testii{#2}%
+ \_ifx\.testii\.relax
+ %Cancelling complete.
+ \.striptworelaxes(#1#2#3)%
+ %Now \.Fresult contains the answer.
+ \_else
+ \_relax
+ \_ifnum#2=2\_relax
+ \.canceltwos_recursion(#10,#3)%
+ \_else
+ \.canceltwos_recursion(#1#2,#3)%
+ \_fi
+ \_fi
+}%
+
+\_def\.striptworelaxes(#1\_relax\_relax){%
+ \_gdef\.Fresult{#1}%
+}%
+
+\.for \.iz = 0 to 15 by 1%
+ {\.decimaltohex[1]{\.tempa}{\_the\.iz}%
+ \.for \.jz = 0 to 15 by 1%
+ {\.decimaltohex[1]{\.tempb}{\_the\.jz}%
+ \.Faddchar_raw\.tempa\.tempb
+ \_ea\_xdef\_csname F@addchar@\.tempa\.tempb\_endcsname{\.Fresult}%
+ }%
+ }%
+
+\_def\.Faddchar#1#2{%
+ \_ea\_def\_ea\.Fresult\_ea{\_csname F@addchar@#1#2\_endcsname}%
+}%
+
+\_def\.Faddstrings#1#2{%
+ \_edef\.argument{(,#1\_relax\_relax)(#2\_relax\_relax)}%
+ \_ea\.Faddstrings_recursion\.argument%
+}%
+
+\_def\.Faddstrings_recursion(#1,#2#3)(#4#5){%
+ %Adds two hexadecimal strings, bitwise, from left to right.
+ %The second string is allowed to be shorter than the first.
+ \_def\.testii{#2}%
+ \_def\.testiv{#4}%
+ \_ifx\.testii\.relax
+ %The entire string has been processed.
+ \_gdef\.Fresult{#1}%
+ \_else
+ \_ifx\.testiv\.relax
+ %The second string is over.
+ \.striptworelaxes(#1#2#3)%
+ %Now \.Fresult contains the answer.
+ \_else
+ %We continue to add.
+ \.Faddchar{#2}{#4}%
+ \_edef\.argument{(#1\.Fresult,#3)(#5)}%
+ \_ea\.Faddstrings_recursion\.argument%
+ \_fi
+ \_fi
+}%
+\_gdef\.Fstripleadingzero(0#1){\_edef\.Fresult{#1}}%
+
+\.i=0%
+\_def\.poweroftwo{1}%
+\.for \.iz = 1 to 254 by 1%
+ {\_global\_advance\.i by1%
+ \.a=\.poweroftwo\_relax
+ \_multiply\.a by 2\_relax
+ \_edef\.poweroftwo{\_the\.a}%
+ \.decimaltohex[2]{\.poweroftwo_hex}{\.poweroftwo}%
+ \_ea\_ifnum\.poweroftwo>255\_relax
+ %We need to bitwise add the polynomial represented by 100011101, i.e. 0x11d.
+ \.Faddstrings{\.poweroftwo_hex}{11d}% %Now it should start with 0.
+ \_ea\.Fstripleadingzero\_ea(\.Fresult)% %Now it should be two hex digits.
+ \_edef\.poweroftwo_hex{\.Fresult}% %Save the hex version.
+ \.hextodecimal{\.poweroftwo}{\.Fresult}%
+ \_fi
+ \_xdef\.poweroftwo{\.poweroftwo}%
+ \_ea\_xdef\_csname F@twotothe@\_the\.i\_endcsname{\.poweroftwo_hex}%
+ \_ea\_xdef\_csname F@logtwo@\.poweroftwo_hex\_endcsname{\_the\.i}%
+ }%
+\_ea\_xdef\_csname F@twotothe@0\_endcsname{01}%
+\_ea\_xdef\_csname F@logtwo@01\_endcsname{0}%
+
+\_def\.Ftwotothe#1{%
+ \_ea\_xdef\_ea\.Fresult\_ea{\_csname F@twotothe@#1\_endcsname}%
+}%
+\_def\.Flogtwo#1{%
+ \_ea\_xdef\_ea\.Fresult\_ea{\_csname F@logtwo@#1\_endcsname}%
+}%
+
+\_def\.zerozero{00}%
+
+\_def\.Fmultiply#1#2{%
+ % #1 and #2 are two elements of F_256,
+ % given as two-character hexadecimal strings.
+ % Multiply them within F_256, and place the answer in \.Fresult
+ \_edef\.argA{#1}%
+ \_edef\.argB{#2}%
+ \_ifx\.argA\.zerozero
+ \_def\.Fresult{00}%
+ \_else
+ \_ifx\.argB\.zerozero
+ \_def\.Fresult{00}%
+ \_else
+ \_ea\.Flogtwo\_ea{\.argA}%
+ \_edef\.logA{\.Fresult}%
+ \_ea\.Flogtwo\_ea{\.argB}%
+ \_edef\.logB{\.Fresult}%
+ \_ea\.a\_ea=\.logA\_relax% \.a = \logA
+ \_ea\_advance\_ea\.a\.logB\_relax% \advance \.a by \logB
+ \_ifnum\.a>254\_relax%
+ \_advance\.a by -255\_relax
+ \_fi
+ \_ea\.Ftwotothe\_ea{\_the\.a}%
+ % Now \.Fresult contains the product, as desired.
+ \_fi
+ \_fi
+}%
+
+\_newifi\_ifqr_FXleadingcoeff_zero
+\_def\.FXtestleadingcoeff(#1#2#3){%
+ % Tests whether the leading coefficient of the hex-string #1#2#3 is '00'.
+ \_edef\.FXleadingcoefficient{#1#2}%
+ \.FXleadingcoeff_zerofalse
+ \_ifx\.FXleadingcoefficient\.zerozero
+ \.FXleadingcoeff_zerotrue
+ \_fi
+}%
+
+\_newifi\_ifqr_FXdivisiondone
+
+\_newcount\.divisionsremaining %Keep track of how many divisions to go!
+\_def\.FXpolynomialdivide#1#2{%
+ \_edef\.FXnumerator{#1}%
+ \_edef\.denomin{#2}%
+ \.getstringlength\.FXnumerator
+ \.setcounter\.divisionsremaining{\.stringlength}%
+ \.getstringlength\.denomin
+ \.addtocounter\.divisionsremaining{-\.stringlength}%
+ \.addtocounter\.divisionsremaining{2}%
+ \_divide\.divisionsremaining by 2\_relax %2 hex chars per number
+ \.FXdivisiondonefalse
+ \_ea\_ea\_ea\.FXpolynomialdivide_recursive\_ea\_ea\_ea{\_ea\.FXnumerator\_ea}\_ea{\.denomin}%
+}%
+
+\_def\.FXpolynomialdivide_recursive#1#2{%
+ % #1 = f(x), of degree n
+ % #2 = g(x), of degree m
+ % Obtains a new polynomial h(x), congruent to f(x) modulo g(x),
+ % but of degree at most n-1.
+ %
+ % If leading coefficient of f(x) is 0, strips off that leading zero.
+ % If leading coefficient of f(x) is a, subtracts off a * g(x) * x^(n-m).
+ % N.B. we assume g is monic.
+ %
+ \.FXtestleadingcoeff(#1)%
+ \_ifqr_FXleadingcoeff_zero
+ %Leading coefficient is zero, so remove it.
+ \_ea\_def\_ea\.FXnumerator\_ea{\.FXstripleadingzero(#1)}%
+ \_else%
+ %Leading coefficient is nonzero, and contained in \.FXleadingcoefficient
+ \.FXsubtractphase{#1}{#2}{\.FXleadingcoefficient}%
+ \_ifqr_FXsubtractfailed
+ %If subtraction failed, that means our #1 was already the remainder!
+ \.FXdivisiondonetrue
+ \_edef\.theremainder{#1}%
+ \_else%
+ %xor succeeded. We need to recurse.
+ \_ea\_ea\_ea\_edef\_ea\_ea\_ea\.FXnumerator\_ea\_ea\_ea{\_ea\.FXstripleadingzero\_ea(\.FXsubtraction_result)}%
+ \_fi%
+ \_fi%
+ \.addtocounter\.divisionsremaining{-1}%
+ \_ifnum\.divisionsremaining=0\_relax
+ %Division is done!
+ \.FXdivisiondonetrue
+ \_edef\.theremainder{\.FXnumerator}%
+ \_relax%
+ \_else%
+ \_ea\.FXpolynomialdivide_recursive\_ea{\.FXnumerator}{#2}%
+ \_fi%
+}%
+
+\_def\.FXstripleadingzero(00#1){#1}%Strips off a single leading zero of F_256.
+
+\_newifi\_ifqr_FXsubtractfailed% This flag will trigger when #2 is longer than #1.
+
+\_def\.FXsubtractphase#1#2#3{%
+ % #1 = bitstring
+ % #2 = bitstring no longer than #1
+ % #3 = leading coefficient
+ \.FXsubtractfailedfalse
+ \_edef\.argument{(,#1\_relax\_relax\_relax)(#2\_relax\_relax\_relax)(#3)}%
+ \_ea\.FXsubtract_recursive\.argument%
+}%
+
+\_def\.FXsubtract_recursive(#1,#2#3#4)(#5#6#7)(#8){%
+ % This is a recursive way to compute f(x) - a*g(x)*x^k.
+ % #1#2#3#4 is the first bitstring, subtracted up through #1.
+ % Thus #2#3 constitutes the next two-character coefficient.
+ % #5#6#7 is the remaining portion of the second bitstring.
+ % Thus #5#6 constitutes the next two-character coefficient
+ % #8 is the element a of F_256. It should contain two characters.
+ \_def\.testii{#2}%
+ \_def\.testv{#5}%
+ \_ifx\.testii\.relax
+ % #1 contains the whole string.
+ % Now if #5 is also \_relax, that means the two strings started off with equal lengths.
+ % If, however, #5 is not \_relax, that means the second string was longer than the first, a problem.
+ \_ifx\.testv\.relax
+ %No problem. We are done.
+ \.FXsubtract_saveresult(#1#2#3#4)% %We keep the #2#3#4 to be sure we have all three relax-es to strip off.
+ \_else
+ %Problem! The second string was longer than the first.
+ %This usually indicates the end of the long division process.
+ \.FXsubtractfailedtrue
+ \_def\.FXsubtraction_result{}%
+ \_fi
+ \_else
+ % There is still a coefficient to manipulate in #2#3.
+ % Check whether #5 contains anything.
+ \_ifx\.testv\.relax
+ % No, #5 is empty. We are done. "#2#3#4" contains the remainder of the first string,
+ % which we append untouched and then strip off the three \_relax-es.
+ \.FXsubtract_saveresult(#1#2#3#4)%
+ \_else
+ % Yes, #5#6 still has something to XOR. Do the task.
+ \.Fmultiply{#5#6}{#8}% Multiply by the factor 'a'.
+ \.Faddstrings{#2#3}{\.Fresult}% Subtract. (We're in characteristic two, so adding works.)
+ \_edef\.argument{(#1\.Fresult,#4)(#7)(#8)}%
+ \_ea\.FXsubtract_recursive\.argument%
+ \_fi
+ \_fi
+}%
+
+\_def\.FXsubtract_saveresult(#1\_relax\_relax\_relax){%
+ %Strips off the three extra '\_relax'es at the end.
+ \_def\.FXsubtraction_result{#1}%
+}%
+
+\_def\.FXcreategeneratorpolynomial#1{%
+ % #1 = n, the number of error codewords desired.
+ % We need to create \prod_{j=0}^{n-1} (x-2^j).
+ \_edef\.FXgenerator_degree{#1}%
+ \_def\.FXgeneratorpolynomial{01}% Initially, set it equal to 1.
+ \.setcounter\.i{0}%
+ \.FXcreategenerator_recursive%
+ %The result is now stored in \.FXgeneratorpolynomial
+}%
+
+\_def\.FXcreategenerator_recursive{%
+ % \.FXgeneratorpolynomial contains the current polynomial f(x),
+ % which should be a degree-i polynomial
+ % equal to \prod_{j=0}^{i-1} (x-2^j).
+ % (If i=0, then \.FXgeneratorpolynomial should be 01.)
+ % This recursion step should multiply the existing polynomial by (x-2^i),
+ % increment i by 1, and check whether we're done or not.
+ \_edef\.summandA{\.FXgeneratorpolynomial 00}% This is f(x) * x
+ \_edef\.summandB{00\.FXgeneratorpolynomial}% This is f(x), with a 0x^{i+1} in front.
+ \.Ftwotothe{\_the\.i}%
+ \_edef\.theconstant{\.Fresult}%
+ \.FXsubtractphase{\.summandA}{\.summandB}{\.theconstant}%
+ %This calculates \.summandA + \.theconstant * \.summandB
+ %and stores the result in \.FXsubtraction_result
+ \_edef\.FXgeneratorpolynomial{\.FXsubtraction_result}%
+ \.stepcounter\.i
+ \_ea \_ifnum\.FXgenerator_degree=\.i\_relax
+ %We just multiplied by (x-2^{n-1}), so we're done.
+ \_relax
+ \_else%
+ %We need to do this again!
+ \_ea \.FXcreategenerator_recursive
+ \_fi
+}%
+
+\_def\.FXgenerate_errorbytes#1#2{%
+ % #1 = datastream in hex
+ % #2 = number of error correction bytes requested
+ \_edef\.numerrorbytes{#2}%
+ \_ea\.FXcreategeneratorpolynomial\_ea{\.numerrorbytes}%
+ \_edef\.FXnumerator{#1}%
+ \.for \.iz = 1 to \.numerrorbytes by 1%
+ {\.xaddto\.FXnumerator{00}}% %One error byte means two hex codes.
+ \.FXpolynomialdivide{\.FXnumerator}{\.FXgeneratorpolynomial}%
+ \_edef\.FXerrorbytes{\.theremainder}%
+}%
+\_newifi\_ifqr_versionmodules
+
+\_def\.level_char#1{%
+ \_ea\_ifcase#1
+ M\_or L\_or H\_or Q\_fi}%
+
+\_newifi\_ifqr_versiongoodenough
+\_def\.choose_bestversion#1{%
+ % \.desiredversion = user-requested version
+ % \.desiredlevel = user-requested error-correction level
+ \_edef\.stringlength{\.utfstringlen{#1}}%
+ %
+ %Run double loop over levels and versions, looking for
+ %the smallest version that can contain our data,
+ %and then choosing the best error-correcting level at that version,
+ %subject to the level being at least as good as the user desires.
+ \_global\.versiongoodenoughfalse%
+ \_gdef\.bestversion{0}%
+ \_gdef\.bestlevel{0}%
+ \_ifnum\.desiredversion=0\_relax
+ \.a=1\_relax
+ \_else
+ \.a=\.desiredversion\_relax
+ \_fi
+ \.for \.iz=\.a to 40 by 1
+ {\_edef\.version{\_the\.iz}%
+ \_global\.versiongoodenoughfalse
+ \.for \.jz=0 to 3 by 1%
+ {%First, we map {0,1,2,3} to {1,0,4,3}, so that we loop through {M,L,H,Q}
+ %in order of increasing error-correction capabilities.
+ \.a = \.jz\_relax
+ \_divide \.a by 2\_relax
+ \_multiply \.a by 4\_relax
+ \_advance \.a by 1\_relax
+ \_advance \.a by -\.jz\_relax
+ \_edef\.level{\_the\.a}%
+ \_ifnum\.desiredlevel=\.a\_relax
+ \_global\.versiongoodenoughtrue
+ \_fi
+ \_ifqr_versiongoodenough
+ \.calculate_capacity{\.version}{\.level}%
+ \_ea\_ea\_ea\_ifnum\_ea\.truecapacity\_ea<\.stringlength\_relax
+ %Too short
+ \_relax
+ \_else
+ %Long enough!
+ \_xdef\.bestversion{\.version}%
+ \_xdef\.bestlevel{\.level}%
+ \_global\.iz=40%
+ \_fi
+ \_fi
+ }%
+ }%
+ \_edef\.version{\.bestversion}%
+ \_edef\.level{\.bestlevel}%
+ \_ea\_ifnum\.desiredversion>0\_relax
+ \_ifx\.bestversion\.desiredversion\_relax
+ %No change from desired version.
+ \_else
+ %Version was increased
+ \.message{<Requested QR version '\.desiredversion' is too small for desired text.}%
+ \.message{Version increased to '\.bestversion' to fit text.>^^J}%
+ \_fi
+ \_fi
+ \_ifx\.bestlevel\.desiredlevel\_relax
+ %No change in level.
+ \_else
+ \.message{<Error-correction level increased from \.level_char{\.desiredlevel}}%
+ \.message{to \.level_char{\.bestlevel} at no cost.>^^J}%
+ \_fi
+}%
+
+\_def\.calculate_capacity#1#2{%
+ \_edef\.version{#1}%
+ \_edef\.level{#2}%
+ %Calculate \.size, the number of modules per side.
+ % The formula is 4\.version+17.
+ \.a=\.version\_relax
+ \_multiply\.a by 4\_relax
+ \_advance\.a by 17\_relax
+ \_xdef\.size{\_the\.a}%
+ %
+ % Calculate \.k, which governs the number of alignment patterns.
+ % The alignment patterns lie in a kxk square, except for 3 that are replaced by finding patterns.
+ % The formula is 2 + floor( \.version / 7 ), except that k=0 for version 1.
+ \_ea\_ifnum\.version=1\_relax%
+ \_def\.k{0}%
+ \_else%
+ \.a=\.version\_relax
+ \_divide \.a by 7\_relax
+ \_advance\.a by 2\_relax
+ \_edef\.k{\_the\.a}%
+ \_fi%
+ %
+ %Calculate number of function pattern modules.
+ %This consists of the three 8x8 finder patterns, the two timing strips, and the (k^2-3) 5x5 alignment patterns.
+ %The formula is 160+2n+25(k^2-3)-10(k-2), unless k=0 in which case we just have 160+2n.
+ \.a=\.size\_relax
+ \_multiply\.a by 2\_relax
+ \_advance\.a by 160\_relax
+ \_ea\_ifnum\.k=0\_relax\_else
+ %\.k is nonzero, hence at least 2, so we continue to add 25(k^2-3)-10(k-2).
+ \.b=\.k\_relax
+ \_multiply\.b by \.k\_relax
+ \_advance\.b by -3\_relax
+ \_multiply\.b by 25\_relax
+ \_advance\.a by \.b\_relax
+ \.b=\.k\_relax
+ \_advance\.b by -2\_relax
+ \_multiply\.b by 10\_relax
+ \_advance\.a by -\.b\_relax
+ \_fi
+ \_edef\.numfunctionpatternmodules{\_the\.a}%
+ %
+ %Calculate the number of version modules, either 36 or 0.
+ \_ea\_ifnum\.version>6\_relax
+ \.versionmodulestrue
+ \_def\.numversionmodules{36}%
+ \_else
+ \.versionmodulesfalse
+ \_def\.numversionmodules{0}%
+ \_fi
+ %
+ %Now calculate the codeword capacity and remainder bits.
+ %Take n^2 modules, subtract all those dedicated to finder patterns etc., format information, and version information,
+ %and what's left is the number of bits we can play with.
+ %The number of complete bytes is \.numdatacodewords;
+ %the leftover bits are \.numremainderbits.
+ \.a=\.size\_relax
+ \_multiply \.a by \.size\_relax
+ \_advance \.a by -\.numfunctionpatternmodules\_relax
+ \_advance \.a by -31\_relax% % There are 31 format modules.
+ \_advance \.a by -\.numversionmodules\_relax
+ \.b=\.a\_relax
+ \_divide \.a by 8\_relax
+ \_edef\.numdatacodewords{\_the\.a}%
+ \_multiply\.a by 8\_relax
+ \_advance \.b by -\.a\_relax
+ \_edef\.numremainderbits{\_the\.b}%
+ %
+ %The size of the character count indicator also varies by version.
+ %There are only two options, so hardcoding seems easier than expressing these functionally.
+ \_ea\_ifnum\.version<10\_relax
+ \_def\.charactercountbytes_byte{1}%
+ \_def\.charactercountbits_byte{8}%
+ \_else
+ \_def\.charactercountbytes_byte{2}%
+ \_def\.charactercountbits_byte{16}%
+ \_fi
+ %
+ %Now we call on the table, from the QR specification,
+ %of how many blocks to divide the message into, and how many error bytes each block gets.
+ %This affects the true capacity for data, which we store into \.totaldatacodewords.
+ % The following macro sets \.numblocks and \.numeccodewords
+ % based on Table 9 of the QR specification.
+ \.settableix
+ \.a = -\.numblocks\_relax
+ \_multiply \.a by \.numeccodewords\_relax
+ \_advance\.a by \.numdatacodewords\_relax
+ \_edef\.totaldatacodewords{\_the\.a}%
+ \_advance\.a by -\.charactercountbytes_byte\_relax%Subtract character count
+ \_advance\.a by -1\_relax% Subtract 1 byte for the 4-bit mode indicator and the 4-bit terminator at the end.
+ \_edef\.truecapacity{\_the\.a}%
+}
+
+\_def\.setversion#1#2{%
+ % #1 = version number, an integer between 1 and 40 inclusive.
+ % #2 = error-correction level, as an integer between 0 and 3 inclusive.
+ % 0 = 00 = M
+ % 1 = 01 = L
+ % 2 = 10 = H
+ % 3 = 11 = Q
+ % This macro calculates and sets a variety of global macros and/or counters
+ % storing version information that is used later in construction the QR code.
+ % Thus \setversion should be called every time!
+ %
+ \_edef\.version{#1}%
+ \_edef\.level{#2}%
+ %
+ \.calculate_capacity{\.version}{\.level}%
+ %The capacity-check code sets the following:
+ % * \.size
+ % * \.k
+ % * \_ifqr_versionmodules
+ % * \.numversionmodules
+ % * \.numdatacodewords
+ % * \.numremainderbits
+ % * \.charactercountbits_byte
+ % * \.charactercountbytes_byte
+ % * \.numblocks (via \.settableix)
+ % * \.numeccodewords (via \.settableix)
+ % * \.totaldatacodewords
+ %
+ % The alignment patterns' square is 7 modules in from each edge.
+ % They are spaced "as evenly as possible" with an even number of modules between each row/column,
+ % unevenness in division being accommodated by making the first such gap smaller.
+ % The formula seems to be
+ % general distance = 2*round((n-13)/(k-1)/2+0.25)
+ % = 2*floor((n-13)/(k-1)/2+0.75)
+ % = 2*floor( (2*(n-13)/(k-1)+3) / 4 )
+ % = (((2*(n-13)) div (k-1) + 3 ) div 4 ) * 2
+ % first distance = leftovers
+ % The 0.25 is to accommodate version 32, which is the only time we round down.
+ % Otherwise a simple 2*ceiling((n-13)/(k-1)/2) would have sufficed.
+ %
+ \.a = \.size\_relax
+ \_advance\.a by -13\_relax
+ \_multiply\.a by 2\_relax
+ \.b = \.k\_relax
+ \_advance \.b by -1\_relax
+ \_divide\.a by \.b\_relax
+ \_advance\.a by 3\_relax
+ \_divide\.a by 4\_relax
+ \_multiply\.a by 2\_relax
+ \_edef\.alignment_generalskip{\_the\.a}%
+ %
+ %Now set \.alignment_firstskip to (\.size-13)-(\.k-2)*\.alignment_generalskip %
+ \.a = \.k\_relax
+ \_advance\.a by -2\_relax
+ \_multiply\.a by -\.alignment_generalskip\_relax
+ \_advance\.a by \.size\_relax
+ \_advance\.a by -13\_relax
+ \_edef\.alignment_firstskip{\_the\.a}%
+ %
+ %
+ %
+ % Our \.totaldatacodewords bytes of data are broken up as evenly as possible
+ % into \.numblocks datablocks; some may be one byte longer than others.
+ % We set \.shortblock_size to floor(\.totaldatacodewords / \.numblocks)
+ % and \.numlongblocks to mod(\.totaldatacodewords , \.numblocks).
+ \.a=\.totaldatacodewords\_relax
+ \_divide\.a by \.numblocks\_relax
+ \_edef\.shortblock_size{\_the\.a}%
+ \_multiply\.a by -\.numblocks\_relax
+ \_advance\.a by \.totaldatacodewords\_relax
+ \_edef\.numlongblocks{\_the\.a}%
+ %
+ %Set \.longblock_size to \.shortblock_size+1.
+ \.a=\.shortblock_size\_relax
+ \_advance\.a by 1\_relax
+ \_edef\.longblock_size{\_the\.a}%
+ %
+ %Set \.numshortblocks to \.numblocks - \.numlongblocks
+ \.b=\.numblocks\_relax
+ \_advance\.b by -\.numlongblocks\_relax
+ \_edef\.numshortblocks{\_the\.b}%
+}%
+
+\_def\.settableix_int(#1,#2){%
+ \_edef\.numblocks{#1}%
+ \_edef\.numeccodewords{#2}%
+}%
+
+\_def\.settableix{%
+\_ea\_ifcase\.level\_relax
+ %00: Level 'M', medium error correction
+ \_edef\.tempdata{(%
+ \_ifcase\.version\_relax
+ \_relax %There is no version 0.
+ \_or1,10%
+ \_or1,16%
+ \_or1,26%
+ \_or2,18%
+ \_or2,24%
+ \_or4,16%
+ \_or4,18%
+ \_or4,22%
+ \_or5,22%
+ \_or5,26%
+ \_or5,30%
+ \_or8,22%
+ \_or9,22%
+ \_or9,24%
+ \_or10,24%
+ \_or10,28%
+ \_or11,28%
+ \_or13,26%
+ \_or14,26%
+ \_or16,26%
+ \_or17,26%
+ \_or17,28%
+ \_or18,28%
+ \_or20,28%
+ \_or21,28%
+ \_or23,28%
+ \_or25,28%
+ \_or26,28%
+ \_or28,28%
+ \_or29,28%
+ \_or31,28%
+ \_or33,28%
+ \_or35,28%
+ \_or37,28%
+ \_or38,28%
+ \_or40,28%
+ \_or43,28%
+ \_or45,28%
+ \_or47,28%
+ \_or49,28%
+ \_fi)}%
+\_or
+ %01: Level 'L', low error correction
+ \_edef\.tempdata{%
+ (\_ifcase\.version\_relax
+ \_relax %There is no version 0.
+ \_or 1,7%
+ \_or 1,10%
+ \_or 1,15%
+ \_or 1,20%
+ \_or 1,26%
+ \_or 2,18%
+ \_or 2,20%
+ \_or 2,24%
+ \_or 2,30%
+ \_or 4,18%
+ \_or 4,20%
+ \_or 4,24%
+ \_or 4,26%
+ \_or 4,30%
+ \_or 6,22%
+ \_or 6,24%
+ \_or 6,28%
+ \_or 6,30%
+ \_or 7,28%
+ \_or 8,28%
+ \_or 8,28%
+ \_or 9,28%
+ \_or 9,30%
+ \_or 10,30%
+ \_or 12,26%
+ \_or 12,28%
+ \_or 12,30%
+ \_or 13,30%
+ \_or 14,30%
+ \_or 15,30%
+ \_or 16,30%
+ \_or 17,30%
+ \_or 18,30%
+ \_or 19,30%
+ \_or 19,30%
+ \_or 20,30%
+ \_or 21,30%
+ \_or 22,30%
+ \_or 24,30%
+ \_or 25,30%
+ \_fi)}%
+\_or
+ %10: Level 'H', high error correction
+ \_edef\.tempdata{(%
+ \_ifcase\.version\_relax
+ \_relax %There is no version 0.
+ \_or1,17%
+ \_or1,28%
+ \_or2,22%
+ \_or4,16%
+ \_or4,22%
+ \_or4,28%
+ \_or5,26%
+ \_or6,26%
+ \_or8,24%
+ \_or8,28%
+ \_or11,24%
+ \_or11,28%
+ \_or16,22%
+ \_or16,24%
+ \_or18,24%
+ \_or16,30%
+ \_or19,28%
+ \_or21,28%
+ \_or25,26%
+ \_or25,28%
+ \_or25,30%
+ \_or34,24%
+ \_or30,30%
+ \_or32,30%
+ \_or35,30%
+ \_or37,30%
+ \_or40,30%
+ \_or42,30%
+ \_or45,30%
+ \_or48,30%
+ \_or51,30%
+ \_or54,30%
+ \_or57,30%
+ \_or60,30%
+ \_or63,30%
+ \_or66,30%
+ \_or70,30%
+ \_or74,30%
+ \_or77,30%
+ \_or81,30%
+ \_fi)}%
+\_or
+ %11: Level 'Q', quality error correction
+ \_edef\.tempdata{(%
+ \_ifcase\.version\_relax
+ \_relax %There is no version 0.
+ \_or1,13%
+ \_or1,22%
+ \_or2,18%
+ \_or2,26%
+ \_or4,18%
+ \_or4,24%
+ \_or6,18%
+ \_or6,22%
+ \_or8,20%
+ \_or8,24%
+ \_or8,28%
+ \_or10,26%
+ \_or12,24%
+ \_or16,20%
+ \_or12,30%
+ \_or17,24%
+ \_or16,28%
+ \_or18,28%
+ \_or21,26%
+ \_or20,30%
+ \_or23,28%
+ \_or23,30%
+ \_or25,30%
+ \_or27,30%
+ \_or29,30%
+ \_or34,28%
+ \_or34,30%
+ \_or35,30%
+ \_or38,30%
+ \_or40,30%
+ \_or43,30%
+ \_or45,30%
+ \_or48,30%
+ \_or51,30%
+ \_or53,30%
+ \_or56,30%
+ \_or59,30%
+ \_or62,30%
+ \_or65,30%
+ \_or68,30%
+ \_fi)}%
+\_fi
+\_ea\.settableix_int\.tempdata
+}%
+
+\_def\.qM{M}\_def\.qz{0}%
+\_def\.qL{L}\_def\.qi{1}%
+\_def\.qH{H}\_def\.qii{2}%
+\_def\.qQ{Q}\_def\.qiii{3}%
+\_def\.setlevel#1{%
+ \_edef\.level_selected{#1}%
+ \_ifx\.level_selected\.qM
+ \_edef\.desiredlevel{0}%
+ \_fi
+ \_ifx\.level_selected\.qL
+ \_edef\.desiredlevel{1}%
+ \_fi
+ \_ifx\.level_selected\.qH
+ \_edef\.desiredlevel{2}%
+ \_fi
+ \_ifx\.level_selected\.qQ
+ \_edef\.desiredlevel{3}%
+ \_fi
+ \_ifx\.level_selected\.qz
+ \_edef\.desiredlevel{0}%
+ \_fi
+ \_ifx\.level_selected\.qi
+ \_edef\.desiredlevel{1}%
+ \_fi
+ \_ifx\.level_selected\.qii
+ \_edef\.desiredlevel{2}%
+ \_fi
+ \_ifx\.level_selected\.qiii
+ \_edef\.desiredlevel{3}%
+ \_fi
+}%
+
+% key-value pairs (OPmac trick 0069)
+\_def\.kv#1{\_ifcsname _qr_kv:#1\_endcsname \_csname _qr_kv:#1\_ea\_endcsname
+ \_else \_ea\.kvunknown \_fi
+}
+\_def\.kvunknown{???}
+\_def\.kvscan #1#2=#3,{\_ifx#1,\_else \_sdef{_qr_kv:#1#2}{#3}\_ea\.kvscan\_fi}
+
+\_def\.qrset#1{\_def\.tmpb{#1,}%
+ \_replstring\.tmpb{ =}{=}\_replstring\.tmpb{= }{=}%
+ \_replstring\.tmpb{tight,}{qr-border=0,}%
+ \_replstring\.tmpb{padding,}{qr-border=1,}%
+ \_replstring\.tmpb{verbose,}{qr-message=1,}%
+ \_replstring\.tmpb{silent,}{qr-message=0,}%
+ \_replstring\.tmpb{draft,}{qr-final=0,}%
+ \_replstring\.tmpb{final,}{qr-final=1,}%
+ \_replstring\.tmpb{nolink,}{qr-link=0,}%
+ \_replstring\.tmpb{link,}{qr-link=1,}%
+ \_ea\.kvscan\.tmpb,=,%
+ \.desiredheight=\.kv{height}\_relax
+ \.setlevel{\.kv{level}}%
+ \_edef\.desiredversion{\.kv{version}}%
+}
+\.qrset{height=2cm, version=0, level=M, tight, silent, final, nolink}
+
+\_def\.setcounter #1#2{\_global#1=#2\_relax}
+\_def\.stepcounter #1{\_global\_advance#1 by1\_relax}
+\_def\.addtocounter#1#2{\_global\_advance#1 by#2\_relax}
+
+\_def\.qrcode{\_begingroup
+ \_isnextchar[{\.qrcodeA}{\.qrcodeB}%
+}
+\_def\.qrcodeA[#1]{\.qrset{#1}\_ea\.qrcodeB\_romannumeral-`\.}
+\_def\.qrcodeB#1{%
+ \_if1\.kv{qr-message}\_let\.message=\_message \_else \_def\.message##1{}\_fi
+ \_if1\.kv{qr-border}\_def\.padd{\_kern4\.modulesize}\_else\_def\.padd{}\_fi
+ \_bgroup
+ \_escapechar=-1
+ \_xdef\.etext{\_detokenize{#1}}\_gdef\.text{#1}%
+ \_egroup
+ \.qrcode_int
+ \_endgroup
+}
+\_def\.qrcode_int{%
+ \.message{<QR code requested for "\.etext" in version
+ \.desiredversion-\.level_char{\.desiredlevel}.>^^J}%
+ %First, choose the version and level.
+ %Recall that \.choose_bestversion sets \.version and \.level.
+ \_ea\.choose_bestversion\_ea{\.etext}%
+ \_if1\.kv{qr-final}%
+ \.setversion{\.version}{\.level}%
+ \.qrcode_int_new
+ \_else
+ \.modulesize=\.desiredheight
+ \_divide\.modulesize by \.size\_relax
+ \_let\.d=\.desiredheight
+ \_vbox{\.padd\_hbox{\.padd\_vbox to\.d{\_hrule\_vss
+ \_hbox to\.d{\_vrule height.7\.d depth.3\.d \_hss ...QR...\_hss\_vrule}%
+ \_vss\_hrule}\.padd}\.padd}%
+ \_fi
+}%
+
+\_nspublic \qrcode \qrset ;
+
+\_def\.qrcode_int_new{%
+ \.qrbeginhook
+ \.createsquareblankmatrix{newqr}{\.size}%
+ \.placefinderpatterns{newqr}%
+ \.placetimingpatterns{newqr}%
+ \.placealignmentpatterns{newqr}%
+ \.placedummyformatpatterns{newqr}%
+ \.placedummyversionpatterns{newqr}%
+ \.message{<Calculating QR code for "\.etext" in
+ version \.version-\.level_char{\.level}.>^^J}%
+ \_ea\.encode_binary\_ea{\.etext}%
+ \.splitcodetextintoblocks
+ \.createerrorblocks
+ \.interleave
+ \.message{<Writing data...}%
+ \.writedata_hex{newqr}{\.interleaved_text}%
+ \.message{done.>^^J}%
+ \.writeremainderbits{newqr}%
+ \.chooseandapplybestmask{newqr}%
+ \.decimaltobinary[2]{\.level_binary}{\.level}%
+ \.decimaltobinary[3]{\.mask_binary}{\.mask_selected}%
+ \_edef\.formatstring{\.level_binary\.mask_binary}%
+ \.message{<Encoding and writing format string...}%
+ \_ea\.encodeandmaskformat\_ea{\.formatstring}%
+ \.writeformatstring{newqr}{\.formatbitstring}%
+ \.message{done.>^^J}%
+ \.message{<Encoding and writing version information...}%
+ \.decimaltobinary[6]{\.version_binary}{\.version}%
+ \.Golaycode{\.version_binary}%
+ \.writeversionstring{newqr}{\.Golayresult}%
+ \.message{done.>^^J}%
+ \.message{<Printing QR code...}%
+ \.matrixtobinary{newqr}%
+ \.restore\.data
+ \.message{done.>^^J}%
+ \.qrendhook
+}%
+
+\_def\.matrixtobinary#1{%
+ \_bgroup
+ \_gdef\.data{}%
+ \_def\.black{1}\_let\.blackfixed=\.black \_let\.blackformat=\.black
+ \_def\.white{0}\_let\.whitefixed=\.white \_let\.whiteformat=\.white
+ \.for \.iz = 1 to \.size by 1
+ {\.for \.jz = 1 to \.size by 1
+ {\_xdef\.data{\.data\.matrixentry{#1}{\_the\.iz}{\_the\.jz}}}}%
+ \_xdef\.data{{\.size}{\.data}}%
+ \_egroup
+}
+
+\_def\.restore#1{\_ea\.restoreA#1}
+\_def\.restoreA#1#2{%
+ \.modulesize=\.desiredheight \_divide\.modulesize by#1
+ \_if1\.kv{qr-link}\_setbox0=\_fi
+ \_vbox\_bgroup\.padd \_offinterlineskip \_baselineskip=\.modulesize
+ \.i=0 \.j=0 \_let\.next=\.restoreB
+ \_hbox\_bgroup\.padd \.restoreB #2%
+ \_if1\.kv{qr-link}\.link{\.etext}{\_box0}\_fi
+}
+\_def\.restoreB#1{\_advance \.j by1
+ \_ifx1#1\_vrule height\.modulesize width\.modulesize\_else \_kern\.modulesize\_fi
+ \_ifnum\.size=\.j \_vrule height\.modulesize width 0pt \.padd\_egroup \_advance\.i by1
+ \_ifnum\.size=\.i \.padd\_egroup \_let\.next=\_relax \_else \_hbox\_bgroup\.padd \_fi
+ \_fi \.next
+}
+
+\_def\.qrbeginhook{}
+\_def\.qrendhook{}
+
+\_endnamespace
+\_endcode
+
+This macro file is created for \OpTeX/. It is derived from:
+
+\begtt
+% qrcode.tex
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Petr Olsak <petr@olsak.net> Jul. 2015
+
+% This macro qrcode.tex is (roughly speaking) a copy of qrcode.sty
+% macro by Anders Hendrickson <ahendric@cord.edu>, see
+% http://www.ctan.org/tex-archive/macros/latex/contrib/qrcode
+
+% The main difference between qrcode.sty and qrcode.tex is, that
+% the LaTeX ballast was removed from qrcode.sty by Petr Olsak. The result:
+% The qrcode.tex macro can be used in plain TeX format too.
+\endtt
+
+\secc Usage
+
+Load this macro file by `\load[qrcode]` and then the command
+`\qrcode{<encoded text>}` or `\qrcode[<options>]{<encoded text>}` is ready to use.
+
+The parameter <encoded text> is used as is (without expanding).
+It follows the same rules as in the `\code{<text>}` macro.
+Use these rules if the encoded text includes a \TeX/ sensitive characters.
+
+The characters from all Unicode table are allowed in <encoded text>.
+
+\secc Options
+
+You can use `\qrset{<options>}` for global-like options and
+`\qrcode[<options>]{<encoded text>}` for local options for one QR code.
+The `\qrset{<options>}` is valid within a group (if exists) or in whole
+document.
+
+Options are separated by comma and they are in two types: single
+word or key=value format. Default options are:
+
+\begtt
+\qrset{height=2cm, version=0, level=M, tight, silent, final, nolink}
+\endtt
+
+The options are the same as described in `qrcode.pdf` at
+\url{http://www.ctan.org/tex-archive/macros/latex/contrib/qrcode}.
+In short:
+
+\begitems
+* `height=dimen` ... The height of the QRcode without padding.
+
+* `version=number` ... Number 0 to 40 linearly depends on the density of QRcode.
+ The 0 means that the density is automatically selected.
+
+* `level=letter` ... L, M, Q o H (low, medium, quality, hight) sets the amount
+ of redundancy in the code in order of error recovering.
+
+* `tight` ... Code without margins.
+* `padding` ... 4module blank margins around the code.
+
+* `verbose` ... Information about calculating in terminal and in the log.
+* `silent` ... No information about calculating.
+
+* `final` ... The QR code is calculated and printed.
+* `draft` ... Only empty rectangle in the same size as QR code is printed.
+
+* `nolink` ... The QR code is not active hyperlink.
+* `link` ... The QR code is active hyperlink to <encoded text>.
+
+* `qrborder={R G B}` ... The color of the frame around active hypertext space
+ if link option is set. R G B (red green blue) are decimal
+ numbers from 0 to 1. The frame is visible only in
+ pdf viewers. Default: invisible frame.
+\enditems
+
+
+Example:
+
+\begtt
+\qrset{silent} % ... all codes will be silent in the log and terminal.
+\qrcode [height=3cm, link, padding, qrborder={1 0 0}] {http://petr.olsak.net}
+ % ... 3cm QRcode as hyperlink
+\endtt
+
+Note:
+
+The saving/restoring pre-calculated QRcodes isn't supported by default.
+If you are printing the same QR codes repeatedly, use \setbox/\copy
+technique. For example:
+
+\begtt
+\newbox\mybox
+\setbox\mybox=\hbox{\qrcode{encoded text}}
+\copy\mybox \copy\mybox \copy\mybox etc.
+\endtt
+
+If you have a huge amount of different QR codes, you can use draft/final
+options.
+
+The `\_qr_data` macro is saved after each \qrcode calculation in the format
+`{size}{111101011...001}` where size is the number of columns or rows in QR
+square and second parameter includes size^2 ones or zeros which means black
+or white modules (scanned left to right, top to bottom). Another information
+can be retrieved from `\_qr_text` macro (encoded text before expanding) and
+`\_qr_etext` macro (raw encoded text, each charater is detokeinized).
+The macros `\_qr_data`, `\_qr_text` and `\_qr_etext` are saved globally.
+
diff --git a/macros/optex/pkg/vlna.opm b/macros/optex/pkg/vlna.opm
new file mode 100644
index 0000000000..4db22aa0cc
--- /dev/null
+++ b/macros/optex/pkg/vlna.opm
@@ -0,0 +1,193 @@
+% This is the macro package used by OpTeX, see http://petr.olsak.net/optex
+
+% vlna.opm, Petr Olšák <petr@olsak.net>, 2021
+
+% Vlna prevents breaks in spaces after single-letter prepositions, after (or
+% before) degrees, and between value and SI units. It enables or disables
+% split hyphens too. All folks are done at the postprocessing phase before TeX splits
+% the typesetting material into the paragraph lines.
+
+% vlna.opm is based on Lua code from the package `luavlna` (by Michal Hoftich
+% and Miro Hrončok). See `texdoc luavlna` or end of this file for more information.
+
+\_namespace{vlna}
+
+\_codedecl \.singlechars {Preventing single-chars prepositions and more <2021-01-08>}
+
+ \_doc -----------------------------
+ We declare new attribute, register callbacks, and define Lua functions that
+ point to Lua functions from `luavlna.lua` package.
+ We need this package installed.
+
+ We need not `require ltluatex` because `luatexbase.callbaks` are defined
+ in the `optex.lua` file and it is part of the OpTeX format.
+ \_cod -----------------------------
+
+\_newattribute \.preventsinglestatus
+
+\_directlua{%
+ luavlna = require "luavlna"
+
+ luatexbase.add_to_callback("pre_linebreak_filter", luavlna.preventsingle,"LuaVlna")
+ luatexbase.add_to_callback("hyphenate", luavlna.split_hyphens, "allow hyphen breaks")
+ luavlna.preventsingleid = \_the\_attributealloc
+
+ set_singlechars = function(lang,chars)
+ if (lang == "") then return nil end
+ local utf_gmatch = unicode.utf8.gmatch
+ local chars = chars or ""
+ local singlechars = {}
+ for char in unicode.utf8.gmatch(chars,"(\_csstring\%a)") do
+ singlechars[char] = true
+ end
+ luavlna.singlechars(lang,singlechars)
+ end
+
+ set_compounds = function(lang, compounds)
+ if (lang == "") then return nil end
+ local c = compounds:explode(",+") % match multiple colons as one
+ local compoundstable = {}
+ for _, compound in pairs(c) do
+ compoundstable[compound] = true
+ end
+ luavlna.initials(lang, compoundstable)
+ end
+
+ set_main_language = function(lang)
+ if (lang == "") then return nil end
+ luavlna.set_main_language(tonumber(lang))
+ end
+
+ enable_split_hyphens = function(lang)
+ if (lang == "") then return nil end
+ luavlna.split_hyphen_langs[tonumber(lang)] = true
+ end
+
+ disable_split_hyphens = function(lang)
+ if (lang == "") then return nil end
+ luavlna.split_hyphen_langs[tonumber(lang)] = nil
+ end
+}
+
+ \_doc -----------------------------
+ We need not `require luavlna-langno` because of the conversion from
+ language name to the `\language` number is done by the macro
+ `\.langtonum``<sequence>={<langname>}` defined here.
+ It does `\def<sequence>{<langnumber>}` or `\def\sequence{}` if <langname>
+ is unknown. The <langname> is case insensitive and these names are
+ declared in the hyphen-lan.opm file, section 2.37.2 in OpTeX documentation.
+ \_cod -----------------------------
+
+\_def\.langtonum#1=#2{\_lowercase{\_edef#1{\_trycs{_ulan:#2}{}}}%
+ \_ifx#1\_empty \_opwarning{vlna: unknown language "#2", ignored}%
+ \_else \_edef#1{\_the\_cs{_#1Patt}}\_fi}
+
+ \_doc -----------------------------
+ `\singlechars``{<langname>}{<prepositions>}` sets <prepositions> for
+ given language.\nl
+ `\compoundinitials``{<langname>}{<comma-separated-list>}` sets
+ compound characters from the list for given language.
+ \_cod -----------------------------
+
+\_def\.singlechars#1#2{\.langtonum\.l={#1}\_directlua{set_singlechars("\.l","#2")}}
+\_def\.compoundinitials#1#2{\.langtonum\.l={#1}\_directlua{set_compounds("\.l","#2")}}
+
+ \_doc -----------------------------
+ `\enablesplithyphens` and `\disablesplithyphens` are dependent on the language.
+ \_cod -----------------------------
+
+\_def\.enablesplithyphens#1{\.langtonum\.l={#1}\_directlua{enable_split_hyphens("\.l")}}
+\_def\.disablesplithyphens#1{\.langtonum\.l={#1}\_directlua{disable_split_hyphens("\.l")}}
+
+ \_doc -----------------------------
+ By default, the language-dependent features of the `luavlna` depend on
+ the current `\language` value, i.e. on the currently selected hyphenation.
+ `\preventsinglelang``{<langname>}` activates the language-dependent
+ features regardless of the current `\language` value.
+ \_cod -----------------------------
+
+\_def\.preventsinglelang#1{\.langtonum\.l={#1}\_directlua{set_main_language("\.l")}}
+
+ \_doc -----------------------------
+ Switching on/off `luavlna` preposition features should be done using attribute
+ setting. It will allow you to switch them on/off in the middle of the paragraph.
+ \_cod -----------------------------
+
+\_def\.preventsingleon{\.preventsinglestatus=2 }
+\_def\.preventsingleoff{\.preventsinglestatus=1 }
+
+ \_doc -----------------------------
+ Switching on/off the other `luavlna` features is implemented only by
+ setting a special `luavlna` variable.
+ \_cod -----------------------------
+
+\_def\.preventsingledebugon{\_directlua{luavlna.debug(true)}}
+\_def\.preventsingledebugoff{\_directlua{luavlna.debug(false)}}
+
+\_def\.nopredegrees{\_directlua{luavlna.no_predegrees = true}}
+\_def\.nosufdegrees{\_directlua{luavlna.no_sufdegrees = true}}
+\_def\.nounits{\_directlua{luavlna.no_unit = true}}
+\_def\.noinitials{\_directlua{luavlna.no_initials = true}}
+
+\_nspublic
+ \singlechars % declare single-letter prepositions per language
+ \compoundinitials % declare compound characters per language
+ \enablesplithyphens % enable split hyphens per language
+ \disablesplithyphens % disable split hyphens per language
+ \preventsinglelang % declare main language independent of current hyphenation
+ \preventsingleon % switch on the prepositions feature (default)
+ \preventsingleoff % switch off the prepositions feature
+ \nopredegrees % switch off pre-degrees feature (default is on)
+ \nosufdegrees % switch off post-degrees feature (default is on)
+ \nounits % switch off SI units feature (default is on)
+ \noinitials % switch off initials feature (default is on)
+ \preventsingledebugon % switch on debug printing (purple squares)
+ \preventsingledebugoff % switch off debug printing (default)
+ ;
+
+\_endnamespace
+
+% Default values:
+\singlechars{Czech}{AIiVvOoUuSsZzKk}
+\singlechars{Slovak}{AIiVvOoUuSsZzKk}
+\compoundinitials{Czech}{Ch,CH} % doesn't work in version v0.1g of luavlna
+\enablesplithyphens{Czech}
+\enablesplithyphens{Slovak}
+% + predegrees, sufdegrees, units, initials (they are independent of language value)
+
+\_endcode
+
+What should be done automatically after `\load[vlna]`:
+
+ Prepositions feature: v lese -> v~lese, (A taky zde) -> (A~taky zde).
+
+ Pre-degrees feature: Mgr. Bown -> Mgr.~Brown.
+
+ Post-degrees feature: John Brown, PhD. -> John Brown,~PhD.
+
+ SI units feature: 42 cm -> 42~cm (with thin space)
+
+ Initials feature: J. Brown -> J.~Brown
+
+ Split hyphens feature: propan-butan -> propan\discretionary{-}{-}{-}butan.
+
+The prepositions and split-hyphens features are language-dependent, the other
+features are language-independent.
+
+A testing file:
+
+\begtt
+\load[vlna]
+\fontfam[LMfonts]
+\cslang
+\preventsingledebugon
+
+Mgr. J. Brown, PhD., zkusí v lese (A taky v závorce) zkontrolovat rozměr 42 m.
+Obejde se bez propan-butanových lahví.
+\bye
+\endtt
+
+Note, that versinon v0.1g 2020-06-02 of the luavlna package is an
+experimental code. It seems that `\compoundinitials` does not work in this
+version and when you use `\hbox{-}` in a paragraph when
+`\enablesplithyphens` then LuaTeX hangs.