diff options
Diffstat (limited to 'macros/luatex/optex/base')
71 files changed, 33041 insertions, 0 deletions
diff --git a/macros/luatex/optex/base/alloc.opm b/macros/luatex/optex/base/alloc.opm new file mode 100644 index 0000000000..7e03ae77b7 --- /dev/null +++ b/macros/luatex/optex/base/alloc.opm @@ -0,0 +1,165 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \newdimen {Allocators for registers <2020-01-23>} % 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\_mathalloc=18 \_mathalloc=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{% + \_global\_advance\_cs{_#2alloc}by1 + \_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 \`\newmath` + 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\_newmath #1{\_allocator #1{fam}\_chardef} + +\_public \newcount \newdimen \newskip \newmuskip \newbox \newtoks \newread \newwrite \newmath ; + + \_doc ----------------------------- + The \`\newinsert` macro is defined differently than others. + \_cod ----------------------------- + +\_newcount\_insertalloc \_insertalloc=255 +\_chardef\_insertmin = 201 + +\_def\_newinsert #1{% + \_advance\_insertalloc by-1 + \_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 \`\newcatodetable` + 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/. Note that `\z@` and `\z@skip` from + plain\TeX/ is `\zo` and `\zoskip` because we absolutely + don't support the `@` category dance. + Note that `\p@` is not defined because we can write 1pt which is more + legible. + \_cod ----------------------------- + +\_newdimen\_maxdimen \_maxdimen=16383.99999pt % the largest legal <dimen> +\_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 \zoskip \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 like in old plain\TeX/, but the range of directly used registers +is wider. + +Inserts are allocated form 254 to 201 using `\newinsert`. + +You can define your own allocation concept (for example for allocation of +arrays) from top of 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] + \advance\_maicount by -#2\relax + \ifnum \_countalloc > \_maicount + \errmessage{No room for a new array of \string\count}% + \else + \chardef#1=\_maicount + \fi +} +\def\usecount #1[#2]{% \usecount \foo[2] + \count\numexpr#1+#2\relax +} +\endtt + + diff --git a/macros/luatex/optex/base/basic-macros.opm b/macros/luatex/optex/base/basic-macros.opm new file mode 100644 index 0000000000..512678c312 --- /dev/null +++ b/macros/luatex/optex/base/basic-macros.opm @@ -0,0 +1,97 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \sdef {Basic macros for OpTeX <2020-02-14>} % 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 ------------------------------ + \`\bslash` is \"normal backslash" with category code 12. + \`\nbb` and \`\pcent` are double backslash and normal~`%`, + they should 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\_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 ------------------------------ + \`\opwarning` `{<text>}` prints warning on the terminal and to the log file. + \_cod ------------------------------ + +\_def \_opwarning #1{\_wterm{WARNING: #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 to 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 ; + +\_endcode % ------------------------------------- + + diff --git a/macros/luatex/optex/base/bib-iso690.opm b/macros/luatex/optex/base/bib-iso690.opm new file mode 100644 index 0000000000..b569de0d30 --- /dev/null +++ b/macros/luatex/optex/base/bib-iso690.opm @@ -0,0 +1,940 @@ +% This is part of 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 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}% +} +% Multilinguals: English Czech Slovak + +\_mtdef{bib.and} {, and } { a } {} +\_mtdef{bib.etal} { et al.} { a~kol.} {} +\_mtdef{bib.edition} { ed.} { vyd.} {} +\_mtdef{bib.bachthesis} {Bachelor's Thesis} {Bakalářská práce} {Bakalárska práca} +\_mtdef{bib.masthesis} {Master's Thesis} {Diplomová práce} {Diplomová práca} +\_mtdef{bib.phdthesis} {Ph.D. Thesis} {Disertační práce} {Dizertačná práca} +\_mtdef{bib.available} {Available from } {Dostupné na } {} +\_mtdef{bib.availablealso} {Available also from } {Dostupné též na } {Dotupné tiež na } +\_mtdef{bib.citedate} {cit.~} {vid.~} {} +\_mtdef{bib.volume} {Vol.~} {ročník~} {} +\_mtdef{bib.number} {No.~} {č.~} {} +\_mtdef{bib.prepages} {pp.~} {s.~} {} +\_mtdef{bib.postpages} {~p.} {~s.} {} +\_mtdef{bib.editor} {,~ed.} {,~editor} {} +\_mtdef{bib.editors} {,~eds.} {,~editoři} {,~editori} + +\_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} + +\_chardef\_documentlanguage=\_language +\_def\_Mtext#1{\_csname _mt:#1:\_csname _lan:\_the\_documentlanguage\_endcsname\_endcsname} + +\_CreateField {lang} +\_def\_setlang#1{\_ifx#1\_empty \_else + \_ea \_ifx \_csname _#1Patt\_endcsname \_relax + \_opwarning{The language "#1" used in .bib file is unknown} + \_else \_language=\_csname _#1Patt\_endcsname + \_fi\_fi +} + + \_doc ----------------------------- + Non-standard fieldnames. + \_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 \_docitedateA{#1}{#2}{#3}% + \_fi\_fi ]% +} +\_def\_docitedateA#1#2#3{% + \_ifnum\_documentlanguage=\_csPatt \_docitedateCS{#1}{#2}{#3}% + \_else \_ifnum\_documentlanguage=\_skPatt \_docitedateSK{#1}{#2}{#3}% + \_else \_docitedateEN{#1}{#2}{#3}% + \_fi\_fi +} +\_def\_docitedateEN#1#2#3{#1-#2-#3} +\_def\_docitedateCS#1#2#3{\_hbox{\_tmpnum=#3 \_the\_tmpnum. \_tmpnum=#2 \_the\_tmpnum. #1}} +\_let\_docitedateSK=\_docitedateCS + +\_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-example.bib` for an example of the `.bib` input. You can try it by: + +\begtt +\fontfam[LMfonts] +\nocite[*] +\usebib/s (iso690) op-example +\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 bad interpreted. + +The entry names and field names are case insensitive. If there exist 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 special printing of vairous fields. +\enditems + +There can be only one option field per each entry with (may be) 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 by 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 semifinal and final author the word \"and" (or something +different depending on current language) is printed. + +The first author is printed in reverse order: \"LASTNAME, Firstname(s) von, +After" and the others author 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 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 is printed in such 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 is 8 or more authors then only 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 authors 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 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 authors, replace all +spaces by `\ ` in this name. Such text is interpreted as Lastname. You +can add the secondary name (interpreted as Firstname) after 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 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 have to be used for Lastnames in 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 colon. Next, the optional secondary +title have to be printed in 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 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 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, may be 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 different current language is used) before URL. +It means, that the output of 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 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 to use 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 +such field is missing then the 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 occurs. + +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 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 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 such case. If it is used then +it has a precedence before 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 of 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 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 orientes +bib-marks instead numbers. This style file autogenerates these marks in the +form \"Lastname of the first author, comma, space, the year" if 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 as 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 (ie. 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 to place the autocitations to 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 semifinal and final author) +may be 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 on the language +(for example In:). Unfortunately, the bib\TeX/ supposes that the entry data +are not fully included in value parts of the fields (see edition, volume +etc. fields) so the automaton have to add some text during processing. +But what language have to be chosen? + +The current value of the `\language` register at the start of the `.bib` +processing is decided as the language of the outer document. This language +is used for technical notes regardless of the entry language. Each entry can +have the lang field with the two-letter mark of the entry language. This +language is used for ed./vyd., vol./ročník etc. and it is used for +hyphenation too. If the entry language is not set then the outer document +language is used. + +If the outer document language is known before creating of the `.bib` file, you +can store some language-dependent phrases into it. On the other hand, if the +main document language is unknown, you can use the `\Mtext` macro to +create the text multilingual. Example: + +\begtt +howpublished = "\Mtext{blue-ray}" +\endtt + +Now, you can set the variants of blue-ray into your macros: + +\begtt +\mtdef {blue-ray} {Blue-ray disc} {Blue-ray disk} {} +\endtt + + +\seccc Tips for using more languages + +This style prefers English, Czech and Slovak languages. However, you can add +more languages. Use the shortcuts of language names (`de` and `pl` in the +example below). You can define all phrases for your language: +\begtt +\def\mtdefx#1#2#3{\sdef{_mt:#1:de}{#2}\sdef{_mt:#1:pl}{#3}} + + % German % Polish +\mtdefx {bib.and} { und } { a } +\mtdefx {bib.phdthesis} {Ph.D. Dissertation} {Praca doktorska} +... +\endtt +See more about language phrases in the \ref[langphrases] section. + + +\seccc Summary of non-standard fields + +This style uses the following fields unkown by bib\TeX/: + +\begtt +option ... options separated by spaces +lang ... the language two-letter code of one entry +ednote ... editional 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 +aumax:<number> ... maximum number of printed authors +aumin:<number> ... number of printed authors if aumax exceedes +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 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 + +Another options in the option field are silently ignored. diff --git a/macros/luatex/optex/base/bib-simple.opm b/macros/luatex/optex/base/bib-simple.opm new file mode 100644 index 0000000000..347d90bb14 --- /dev/null +++ b/macros/luatex/optex/base/bib-simple.opm @@ -0,0 +1,181 @@ +%% This is part of 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 + +% Formating 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}% +} + +% Multilinguals: English Czech Slovak + +\_mtdef{bib.and} {, and } { a } {} +\_mtdef{bib.edition} {edition} {vydání} {vydanie} +\_mtdef{bib.masterthesis} {Master's Thesis} {Diplomová práce} {Diplomová práca} +\_mtdef{bib.phdthesis} {Ph.D. Thesis} {Disertační práce} {Dizertačná práca} + + +\_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~*.\ }{\_bibwarning}% + \_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:phdthesis}{% + \_bprinta [!author] {*\.\ }{\_bibwarning}% + \_bprintb [title] {{\_em##1}\.\ }{\_bibwarning}% + \_mtext{bib.phdthesis}, % + \_bprinta [school] {*.\ }{}% + \_bprinta [address] {*, }{}% + \_bprinta [year] {*.\ }{}% + \_bprintb [url] {\_preurl\_url{##1}. }{}% +} +\_sdef{_print:mastersthesis}{% + \_bprinta [!author] {*\.\ }{\_bibwarning}% + \_bprintb [title] {{\_em##1}\.\ }{\_bibwarning}% + \_mtext{bib.masterthesis}, % + \_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/luatex/optex/base/cite-bib.opm b/macros/luatex/optex/base/cite-bib.opm new file mode 100644 index 0000000000..44f8dee055 --- /dev/null +++ b/macros/luatex/optex/base/cite-bib.opm @@ -0,0 +1,258 @@ +%% This is part of 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 emptpty internal macro \`\_savedcites` will include the `<bib-marks>` list to + be printed. This list is set by `\_citeA` inside 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 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 to know what <labels> are used in the document in order 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 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{The cite [#1#2] unknown. Try to TeX me again}\_openref + \_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 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 BibTeX 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 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 implemted in `usebib.opm` file which is loaded + when the `\usebib` command is firstly used. + The `usebib.opm` file loads the `librarian.tex` for scaning 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 ----------------------------- + 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 usage of `iso690` bib-style. + diff --git a/macros/luatex/optex/base/colors.opm b/macros/luatex/optex/base/colors.opm new file mode 100644 index 0000000000..2745e0fc51 --- /dev/null +++ b/macros/luatex/optex/base/colors.opm @@ -0,0 +1,393 @@ +%% This is part of 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 a 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 headres and footers) to `\_ensureblackA` which sets + Black at the start of its parameter and retunrs 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 current color to your macro by `\let\yourmacro=\_currentcolor` + and you can return to this color by the command `\_setcmykcolor\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 next pages and their colors are independent on colors + used in the main page-body. The \`\_openfnotestack` is defined as + \`\_openfnotestackA` when the \^`\_setcolor` is used first. + The \`\_fnotestack` is initializedin 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 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 + 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. A 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 totally independent on \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 to return back to black color +using `\Black` manually. + +By default, \OpTeX/ sets `\localcolor`. It means that the typesetting +returns back to a previous color at the end of current group, so you cannot +write `\Black` explicitly. This is implemented using `\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 previous color are 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 substractive color +model CMYK. If the result has a component greater than 1 then all +components are multiplied by a coefficient in order to 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 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 black component from the color. You can use +the `-\Black` trick after `\useK` command in order to remove grey components +occured during color mixing. + +Finally, you can use `^` immediately preceeded before 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/luatex/optex/base/doc.opm b/macros/luatex/optex/base/doc.opm new file mode 100644 index 0000000000..62cbd219c4 --- /dev/null +++ b/macros/luatex/optex/base/doc.opm @@ -0,0 +1,266 @@ +%% This is part of 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 ----------------------------- + Full page of listing causes underfill `\vbox` in output routine. + We need to add a small tolerance. + \_cod ----------------------------- + +\_pgbottomskip=0pt plus10pt minus2pt + + \_doc ----------------------------- + The listing mode is implemented here. + \_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}% +} + + \_doc ----------------------------- + The lines in the listing mode have 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 + \_penalty \_ttpenalty \_kern-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{\_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 to 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 point and hyperlinks to/from it. + \_cod ----------------------------- + +\_activettchar` + +\_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\^`#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 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`. Is is set to almost infinity (100000). You can set it +to a more sensible value. Such setting is valid only for the first following +listing mode. + +When the listing mode is finished by `\_doc` then 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 a compensation of this indentation. + +The `\_cod` macro ignores the rest of 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 active link to the main documentation point of such control sequence +and prints them in blue. Other 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 hyperlink to the user documentation point, +if such 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/luatex/optex/base/f-adventor.opm b/macros/luatex/optex/base/f-adventor.opm new file mode 100644 index 0000000000..8dac5cf324 --- /dev/null +++ b/macros/luatex/optex/base/f-adventor.opm @@ -0,0 +1,22 @@ +%% This is part of 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/luatex/optex/base/f-antt.opm b/macros/luatex/optex/base/f-antt.opm new file mode 100644 index 0000000000..4ec379ab39 --- /dev/null +++ b/macros/luatex/optex/base/f-antt.opm @@ -0,0 +1,32 @@ +%% This is part of 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]:\_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/luatex/optex/base/f-baskerville.opm b/macros/luatex/optex/base/f-baskerville.opm new file mode 100644 index 0000000000..a228c14a54 --- /dev/null +++ b/macros/luatex/optex/base/f-baskerville.opm @@ -0,0 +1,22 @@ +%% This is part of 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]:\_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/luatex/optex/base/f-bonum.opm b/macros/luatex/optex/base/f-bonum.opm new file mode 100644 index 0000000000..900136e26f --- /dev/null +++ b/macros/luatex/optex/base/f-bonum.opm @@ -0,0 +1,24 @@ +%% This is part of 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/luatex/optex/base/f-cursor.opm b/macros/luatex/optex/base/f-cursor.opm new file mode 100644 index 0000000000..c7af7d6912 --- /dev/null +++ b/macros/luatex/optex/base/f-cursor.opm @@ -0,0 +1,22 @@ +%% This is part of 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/luatex/optex/base/f-gfsbodoni.opm b/macros/luatex/optex/base/f-gfsbodoni.opm new file mode 100644 index 0000000000..369f2474b2 --- /dev/null +++ b/macros/luatex/optex/base/f-gfsbodoni.opm @@ -0,0 +1,21 @@ +%% This is part of 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]:\_fontfeatures}} + +\_wlog{\_detokenize{% +Modifier:^^J + \caps ...... doesn't work even though otfinfo -f lists smcp^^J +}} + +\_moddef \resetmod {\_fvars {} Bold It BoldIt } + +\_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/luatex/optex/base/f-heros.opm b/macros/luatex/optex/base/f-heros.opm new file mode 100644 index 0000000000..d369ec8936 --- /dev/null +++ b/macros/luatex/optex/base/f-heros.opm @@ -0,0 +1,203 @@ +%% This is part of 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 + +\_loadmath {[FiraMath-Regular]} + +\_endcode + +The font family file declares the font family for selecting fonts from such +family at 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 font file, you need to keep 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 such 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 aditional information into + 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.ofm` + 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 does 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` in order to start the family. +* 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 expand processor level only) to a file name of loaded font (or to its font +name) and to optional font features appended. The Font Selection +System uses this macro at primitive level in the following sense: + +\begtt +\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. + +\bigskip +{\noindent\bf Example.} +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 in `f-<family>.opm` files. The `f-heros.opm` is listed +here. When Heros family is selected and `\bf` is asked then +\begtt +\font {[texgyreheros-bold]:+tlig;} at10pt +\endtt +% +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. + +Example: if both font modifiers `\caps` and `\cond` were applied from the Heros +family, then `\def\_capsV{+smcp;+onum}` and `\def\_condV{cn}` were processed +by these font modifiers. If 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. + +Recommendation: the \^`\_fontfeatures` macro at the end of the `\_fontnamegen` +macro in order to the \^`\setff`, \^`\setfontcolor`, \^`\setletterspace` +macros can work. + +\bigskip +{\noindent\bf The \^`\moddef` macro} +does more things than simple `\_def`: + +\begitems +* The modifier macros are defined as `\_protected`. +* The modifier macros are defined as family-dependent. +\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 {<font name or font file name generated>}% + \resetmod +\endtt + +{\noindent\bf The font context} consists from + \begitems + * Family context, i.\,e.\ \^`\_currfamily` and \^`\_fontnamegen` values + saved by the `\<Familyselector>`, + * \^`\_sizespec` value saved by the \^`\setfontsize` macro, + * whatever what influences the expansion of the `\_fontnamegen` macro, + they are typically macros `\_<key>V` saved by the font modifiers. + \enditems + +{\noindent\bf The \^`\_initfontfamily` must be run} after modifers decaration. +It sets `\_let\_resetmod=\resetmod` and runs the `\<Familyselector>`. +Finally, it runs `\_rm`, so first font from new family is loaded and it +is ready to use it. + +\bigskip +{\noindent\bf Name conventions.} +Create font modifiers, new variants and the `\<Familyselector>` only as public, i.e. +without `_` prefix. We assume that if user re-defines them then he/she needs +not them, so we have no problems. + +The name of `\<Familyselector>` should begin with uppercase letter. + +If you need to declare your private modifier (because it is used in another +modifiers or macros, for example), use the name `\_wordM`. You can be +sure that such name does not influence the private name space used by \OpTeX/. + +\bigskip +{\noindent\bf 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` where you can find the +the example of the optical sizes declaration including a documentation about +it. + +If you need to create font family file with non-Unicode font, you can do it. +The `\_fontnamegen` must expand to the name of TFM file in such 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 +codes of such alphabets), but middle or east Europe use languages where +such condition is not true. diff --git a/macros/luatex/optex/base/f-libertine-s.opm b/macros/luatex/optex/base/f-libertine-s.opm new file mode 100644 index 0000000000..f08126984e --- /dev/null +++ b/macros/luatex/optex/base/f-libertine-s.opm @@ -0,0 +1,50 @@ +%% This is part of 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/luatex/optex/base/f-libertine.opm b/macros/luatex/optex/base/f-libertine.opm new file mode 100644 index 0000000000..2aa52dad32 --- /dev/null +++ b/macros/luatex/optex/base/f-libertine.opm @@ -0,0 +1,60 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_famdecl [Linux Libertine] \Libertine {Free Linux Libertine fonts} + {\sans \mono \caps \semi} {\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 + \semi ...... semi-bold variants (\rm, \it)^^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 \semi {\_fsetV subfam=Libertine \_fvars RZ . 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/luatex/optex/base/f-lido.opm b/macros/luatex/optex/base/f-lido.opm new file mode 100644 index 0000000000..b91bf1df4f --- /dev/null +++ b/macros/luatex/optex/base/f-lido.opm @@ -0,0 +1,48 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_famdecl [Lido] \Lido {by StormType Foundry designed for "lidove noviny"} + {\caps \cond} {\rm \bf \mr \mi \it \bi} {Termes} + {[LidoSTF]} + {\_def\_fontnamegen {[LidoSTF\_condV\_currV]:\_capsV\_fontfeatures}} + +\_wlog{\_detokenize{% +Variants:^^J + \rm \bf \it \bi ... classical variants^^J + \mr \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 \mr \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 \mr {\_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 +\mr Medium-Regular \mi Medium-Italics +\bf Bold-Regular \bi Bold-Italics + +and three Condensed variants: + +\cond \rm Condensed + \mr 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/luatex/optex/base/f-lmfonts.opm b/macros/luatex/optex/base/f-lmfonts.opm new file mode 100644 index 0000000000..9f9a650a83 --- /dev/null +++ b/macros/luatex/optex/base/f-lmfonts.opm @@ -0,0 +1,181 @@ +%% This is part of 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 ; % \tt variant selector re-defined + +\_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 to 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 to use a shortcasts isntead real <resizing-data>. +There are shortcats `\_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 + diff --git a/macros/luatex/optex/base/f-pagella.opm b/macros/luatex/optex/base/f-pagella.opm new file mode 100644 index 0000000000..f40b102b1c --- /dev/null +++ b/macros/luatex/optex/base/f-pagella.opm @@ -0,0 +1,24 @@ +%% This is part of 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/luatex/optex/base/f-schola.opm b/macros/luatex/optex/base/f-schola.opm new file mode 100644 index 0000000000..c891317265 --- /dev/null +++ b/macros/luatex/optex/base/f-schola.opm @@ -0,0 +1,24 @@ +%% This is part of 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/luatex/optex/base/f-technika.opm b/macros/luatex/optex/base/f-technika.opm new file mode 100644 index 0000000000..0d1af54100 --- /dev/null +++ b/macros/luatex/optex/base/f-technika.opm @@ -0,0 +1,31 @@ +%% This is part of 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/luatex/optex/base/f-termes.opm b/macros/luatex/optex/base/f-termes.opm new file mode 100644 index 0000000000..b765245640 --- /dev/null +++ b/macros/luatex/optex/base/f-termes.opm @@ -0,0 +1,24 @@ +%% This is part of 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/luatex/optex/base/f-xcharter.opm b/macros/luatex/optex/base/f-xcharter.opm new file mode 100644 index 0000000000..7f6ff7a356 --- /dev/null +++ b/macros/luatex/optex/base/f-xcharter.opm @@ -0,0 +1,24 @@ +%% This is part of 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]:\_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/luatex/optex/base/fams-ini.opm b/macros/luatex/optex/base/fams-ini.opm new file mode 100644 index 0000000000..5ecbfc361f --- /dev/null +++ b/macros/luatex/optex/base/fams-ini.opm @@ -0,0 +1,130 @@ +%% This is part of 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 catalogue:} + +\_faminfo [Catalogue] {Catalogue of all registered font families} {fonts-catalog} {} +\_famalias [Catalog] + +\_famtext {Computer Modern like family:} + +\_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] + +\_famtext {TeX Gyre fonts based o 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 [Palation] + +\_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:} + +\_faminfo [Linux Libertine] {Free fonts typicaly installed in systems} {f-libertine} + { -: {\rm\bf\it\bi} \semi: {\rm\it} + \caps,\sans,\mono,\caps\sans: {\rm\bf\it\bi} -: {\initials\displ\keybr} } +\_famalias [Libertine] \_famalias [LinLibertine] + +\_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] + +\_faminfo [Baskerville] {Free vaiants of classical Baskerville} {f-baskerville} + { -,\caps: {\rm\bf\it\bi} } +\_famalias [BaskevilleF] + +\_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] + +\_faminfo [XCharter] {An extension of Bitstream Charter} {f-xcharter} + { -,\slant,\caps,\caps\slant: {\rm\bf\it\bi} } + +\_faminfo [GFSBodoni] {Based on Bodoni with greek letters} {f-gfsbodoni} + { -: {\rm\bf\it\bi} } + +\_endcode + +Once you have prepared a font family file with the name `f-<famname>.opm` and \TeX/ is +able to see it in your filesystem then you can type \^`\fontfam``[<famname>]` and +the file is read, so the information about 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 gives more tolerance: +you can write uppercase letters and spaces here. The spaces are ignored and +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 previous paragraph without +registering it. But problem is that such families are not listed when +`\fontfam[?]` is used and it is not included in font catalogue when +`\fontfam[catalog]` is printed. The list of families taken in the catalogue and +listed on the terminal is declared in two files: `fams-ini.opm` and +`fams-local.opm`. The second file is optional. User 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 original Times purchased from Adobe then you can register your +declaration about Times family in `fams-local.opm`. When an user write +`\fontfam[Times]` then orginal Times (no Termes) is used in such case. + +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-27) 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 catalogue. It consists with +one or more pairs `<mods>: {<vars>} <mods>: {<vars>}` etc. +For each pair: each modifiers (separated by comma) are applied to each <vars> +and prepared sample is 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 to the log file when all +families are listed. + diff --git a/macros/luatex/optex/base/fnotes.opm b/macros/luatex/optex/base/fnotes.opm new file mode 100644 index 0000000000..3a1f28cfc2 --- /dev/null +++ b/macros/luatex/optex/base/fnotes.opm @@ -0,0 +1,175 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \fnote {Footnotes, marginal notes OpTeX <2020-03-20>} % loaded in format + + \_doc ----------------------------- + \`\_gfnotenum` is conter which counts footnotes globally in the document. + whole document, chapters, pages.\nl + \`\_lfnotenum` is 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 such case.\nl + \`\fnotenum` is a macro which 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 + 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 are able to propagate a macro parameter into 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` does't read the text as a + parameter but during normal horizontal mode. This is 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} + \_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 numeric type and false + if it is non-numeric type (Roman numeral, for example). We prefer to use + `<pageno>`, but only if it has 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 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 ----------------------------- + +\_long\_def\_mnote#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 \`\_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 + \_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 % ------------------------------------- + + diff --git a/macros/luatex/optex/base/fonts-catalog.opm b/macros/luatex/optex/base/fonts-catalog.opm new file mode 100644 index 0000000000..de45dd3dcf --- /dev/null +++ b/macros/luatex/optex/base/fonts-catalog.opm @@ -0,0 +1,135 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \_undefined {Font catalogue <2020-02-26>} % loaded on demand by \fontfam[catalog] + +\_initunifonts +\_begingroup + +\_istoksempty\_catalogmathsample \_iftrue \_noloadmath \_fi +\_let\_ttfixed=\_tentt +\_fontlet\_smalltt=\_tentt 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 \_mainfamcommand + \_vtop{\leftskip=1em \_baselineskip=9pt \_tmp \_par}\_hss + } +} + +\_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 \_input fams-local.opm \_fi + +\_endgroup + +\parindent=0pt + +\nonum\sec Customization of the catalogue + + +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 catalogue 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 user can create it. The syntax rules are +described in the \code{fams-ini.opm} file. + + +\_endcode % ------------------------------------- + +
\ No newline at end of file diff --git a/macros/luatex/optex/base/fonts-opmac.opm b/macros/luatex/optex/base/fonts-opmac.opm new file mode 100644 index 0000000000..7b83138335 --- /dev/null +++ b/macros/luatex/optex/base/fonts-opmac.opm @@ -0,0 +1,175 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \typosize {Font managing macros from OPmac <2020-04-28>} % 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 thes 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. + It redefines itself in order to set the main values only first. + \nl + \`\scalemain` returns to these values if they were set. Else they are set + to 10/12\,pt. + \_cod ----------------------------- + +\_newskip \_mainbaselineskip \_mainbaselineskip=0pt \_relax +\_newdimen \_mainfosize \_mainfosize=0pt + +\_def\_setmainvalues {% + \_mainbaselineskip=\_baselineskip + \_mainfosize=\_optsize + \_topskip=\_mainfosize \_splittopskip=\_topskip + \_ifmmode \_else \_bf \_it \_bi \_rm \_fi % load all basic variants of the family + \_normalmath % load fonts if \typosize is running first + \_let \_setmainvalues =\_setmainvaluesL +} +\_def\_setmainvaluesL {\_ifmmode \_normalmath \_else + \_rm \_everymath={\_normalmath}\_everydisplay={\_normalmath}\_fi} +\_def\_scalemain {% + \_ifdim \_mainfosize=0pt + \_mainfosize=10pt \_mainbaselineskip=12pt + \_let \_setmainvalues=\_setmainvaluesL + \_fi + \_optsize=\_mainfosize \_baselineskip=\_mainbaselineskip +} +\_public \scalemain \mainfosize \mainbaselineskip ; + + \_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 vaiant 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>0pt + \_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\it\bi` and `\let\normalmath=\boldmath`. + \_cod ----------------------------- + +\_protected\_def \_boldify {% + \_let \_setmainvalues=\_setmainvaluesL + \_let\it =\_bi \_let\rm =\_bf \_let\_normalmath=\_boldmath \_bf +} +\_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 default font size + (declared by first \^`\typosize` command and redefines itself be only + the font switch for next pages. + \_cod ----------------------------- + +\_def \_rmfixed {% used in default \footline + {\_ifdim\_mainfosize=0pt \_mainfosize=10pt \_fi + \_fontdef\_rmfixed{\_setfontsize{at\mainfosize}\_resetmod\_rm}% + \_global\_let\_rmfixed=\_rmfixed} % next use will be font switch only + \_rmfixed +} +\_let \rmfixed = \_tenrm % user can redefine it + + +\_endcode % ------------------------------------- + +History: +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/luatex/optex/base/fonts-preload.opm b/macros/luatex/optex/base/fonts-preload.opm new file mode 100644 index 0000000000..2ab3790f8f --- /dev/null +++ b/macros/luatex/optex/base/fonts-preload.opm @@ -0,0 +1,35 @@ +%% This is part of 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 %--------------------------------------------------- + +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 +few 8bit fonts here especially for simple testing the format. +But, if the user needs to do a more serious work, he/she can +use `\fontfam` macro in order to load a selected font family of Unicode fonts. + +We have a dilemma: when the Unicode fonts cannot be preloaded in format then basic +font set can be loaded by `\everyjob`. But why to load a set of fonts ta the +beginning of every job when there is highly likely that the user will +load something completely different. Our decision is: there is a basic 8bit +font set and user will load the font 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/luatex/optex/base/fonts-resize.opm b/macros/luatex/optex/base/fonts-resize.opm new file mode 100644 index 0000000000..5a9f0df40e --- /dev/null +++ b/macros/luatex/optex/base/fonts-resize.opm @@ -0,0 +1,349 @@ +%% This is part of 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>0pt \_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=0pt + \_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 show 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 has the same meaning because of the + \`\_reversetfm` macro. The `\_whichtfm` expands this data line and apply + \`\_dowhichtfm`. This macro select 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-lmtt10 11.1 ec-lmtt12 * + +\_setfontsize {at10pt} % default font size + +\_endcode %--------------------------------------------------- + + +\sec[setfontsize] Scaling fonts in text mode (low-level macros) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +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 current font to the size given by previous +\^`\setfontsize`. For example + +\begtt + Here is 10 pt text, +\setfontsize{at12pt} 10 pt text here unchanged... +\resizethefont and 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 + +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 Here is 10 pt text +\setfontsize{at12pt} +\comfortaa Here is 12 pt text +\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/. If you didn't use this command, you must to initialize +these features by `\initunifonts` command, for example: + +\begtt +\initunifonts +\font\tencyklop=[cyklop-regular] at10pt % the font cyklop-regular.otf is loaded +\def\cyklop{\tencyklop\resizethefont} + +\cyklop Here is 10 pt text +\setfontsize{at12pt} +\cyklop Here is 12 pt text +\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 a group and sets the +resulting current font as `\<newfont>`. + +The resulting `\<newfont>` declared by \^`\fontdef` is \"fixed font switch" +independent of \^`\setfontsize` and other font modifiers. More exactly, it is +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 is able to resize +arbitrary font given by its font switch. +This font switch was declared it 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 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/luatex/optex/base/fonts-select.opm b/macros/luatex/optex/base/fonts-select.opm new file mode 100644 index 0000000000..83ded2f35b --- /dev/null +++ b/macros/luatex/optex/base/fonts-select.opm @@ -0,0 +1,670 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \fontfam {Fonts selection system <2020-03-18>} % preloaded in format + + \_doc ----------------------------- + The \`\initunifonts` initializes extended `\font` primitive + (to be able to load Unicode fonts). Unfortunately, this part of + \OpTeX/ depends on \LaTeX/ lua codes `ltluatex.lua` and + `luaotfload-main.lua`. And this code need to be declared a + control sequence `\e@alloc@attribute@count` by `\countdef` primitive. + Moreover, the `\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, the `\initunifnt` sets itself to relax because we need not to do + this work twice. + \_cod ----------------------------- + +\_def\_initunifonts {% + \_ea\_newcount \_csname e@alloc@attribute@count\_endcsname + \_global \_csname e@alloc@attribute@count\_endcsname=-1 + \_directlua{% + require("ltluatex") + require('luaotfload-main') local _void = luaotfload.main () + }% + \_gdef\_rfskipatX ##1" ##2\_relax{"##1"}% + \_global\_let \_doresizefont=\_doresizeunifont + \_gdef\_tryloadtt {\_fontdef\_tentt{\_def\_fontnamegen{[lmmono10-regular]}\_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 +} +\_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 \`\_mainfamcommand` + macro because the \`\_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 faily context. The font family context is given by the current + `\_currfamily` value and by the actual meaning of the \^`\_fontnamegen` macro. + \_cod ----------------------------- + +\_def\_famdecl [#1]#2#3#4#5#6#7#8{% + \_initunifonts \_uniaccents + \_ifx #2\_undefined + \_isfont{#7}\_iffalse + \_opwarning{Family [#1] skipped, font "#7" not found}\_ea\_ea\_ea\_endinput \_else + \_edef\_currfamily {\_csstring #2}% + \_def\_mainfamcommand{#2}\_def\_mathfaminfo{#6}% + \_protected\_edef#2{\_def\_noexpand\_currfamily{\_csstring #2}\_unexpanded{#8\_resetmod}}% + \_wterm {FONT: [#1] -- \_string#2 \_detokenize{(#3)^^J mods:{#4} vars:{#5} math:{#6}}}% + \_fi + \_else \_ea #2\_ea\_endinput \_fi +} +\_def\_initfontfamily{% + \_mainfamcommand \_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 + \`\_fset` `<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>`. + \_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{,#2,}{,\_cs{_#1V},}}\_act + \_iftrue #3\_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 + warning. When the `\_currfamily` value is + changed then we can declare the same `\<modifier>` with different meaning. + + When user declare a prefixed variant of the `\<modifier>` then unprefixed + modifier name is used in internal macros, this is 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 `_`. + \_cod ----------------------------- + +\_def \_moddef #1#2{\_edef\_tmp{\_csstring#1}\_remfirstunderscore\_tmp + \_sdef{_f:\_currfamily:\_tmp}{#2\_reloading}% + \_protected \_edef #1{\noexpand\_famdepend\noexpand#1{_f:\noexpand\_currfamily:\_tmp}}% + \_ea \_ifx \_csname\_tmp\_endcsname #1\_else + \_ea \_public \_csname\_tmp\_endcsname ;\_fi +} +\_def\_remfirstunderscore#1{\_ea\_remfirstunderscoreA#1\_relax#1} +\_def\_remfirstunderscoreA#1#2\_relax#3{\_if _#1\_def#3{#2}\_fi} + +\_protected \_def\_resetmod {\_cs{_f:\_currfamily:resetmod}} % private variant of \resetmod +\_def\_currfamily{} % default current family is empty + +\_def\_famdepend#1#2{\_ifcsname#2\_endcsname \_csname#2\_ea\_endcsname \_else + \_opwarning{\_string#1 is undeclared in current family "\_currfamily", ignored}\_fi +} +\_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 + * `\protected\def \<XX> {\_famdepend \<XX> {_f:\_currfamily:<XX>}}`, + * `\def \_f:<current family>:<XX> {\_tryload<XX>\_ten<XX>}` keeps family dependent definition, + * `\def \_tryload<XX> {`\^`\fontdef`` \_ten<XX> {<data>}}` loads actually the font `\_ten<XX>`, + * `\def \_currvar:_ten<XX> {\<XX>}` in ordef to the \^`\currvar` macro + work correctly. + \enditems + \_cod ----------------------------- + +\_def\_famvardef#1{\_edef\_tmp{\_csstring#1}\_remfirstunderscore\_tmp + \_ea\_famvardefA \_ea#1\_csname _ten\_tmp\_ea\_endcsname + \_csname _tryload:\_tmp\_endcsname +} +\_def\_famvardefA #1#2#3#4{% #1=\_XX #2=\_tenXX #3=\_tryloadXX #4=data + \_isinlist{.\_rm\_bf\_it\_bi\currvar\_currvar}#1\_iftrue + \_opwarning{\_string\famvardef: + You cannot re-declare private standard variant selector \_string#1}% + \_else + \_protected\_edef #1{\_noexpand\_famdepend\_noexpand#1{_f:\_noexpand\_currfamily:\_tmp}}% + \_sdef{_f:\_currfamily:\_tmp}{#3#2}% + \_def#3{\_fontdef#2{#4}}% + \_ifx#1\tt \_addto#1{\_fam\_ttfam}\_fi + \_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 to 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} + \_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-loca.opm` files are read then we need + to save ony 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 infrormation 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. + \_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\_famname{\_ea\_removespaces #1 {} }}% + \_sdef{_famf:\_famname\_ea}\_ea{\_famfile}% +} +\_input fams-ini.opm +\_let\_famfile=\_undefined + + \_doc ----------------------------- + When the \^`\fontfam``[catalog]` is used then the file + `fonts-tatalog.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, +* {\em variant selectors}, there are four basic variant selectors + `\rm`, `\bf`, `\it`, `\bi`, there is a special selector `\currvar` + and more variant selectors can be declared by the \^`\famvardef` macro. +* {\em font modifiers} (for example `\cond`, `\caps`, \^`\setfontsize``{<size spec>}`), + they are in two types: bulid in (like \^`\setfontsize`) or + declared modifiers (by by the \^`\moddef` macro). +* {\em family selectors} (for example `\Termes`, `\LMfonts`), + they are declared typically in the {\em font family files}. +\enditems + +These selectors / switchers sets its values locally. When the \TeX/ group is +leaved then selected font and the {\em font context} are returned back to the values +used when the group was opened. They have the following features: + +\begitems +* The {\em font switchers} select fonts independent on the font context. +* The {\em variant selectors} select the font depending on the font context and on + the specified variant. +* The {\em font modifiers} create a change in the font context but they + don't select the font itself. +* The {\em family selectors} set a family in the font context and resets all + font modifiers. They dont't select the font itself. +\enditems + +The variant selectors and declared font modifiers are +defined in the family context. They can behave differently 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 user 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. Their definitions depends on given family. +The family is set as active in the font context and `\rm` variant selector is run. + +The available declared font modifiers and declared variant selectors are +listed in the log file when 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 arbitrary combined (in arbitrary order) and if the font family disposes +with all such sub-variants then the desired font is selected (after variant +selector is used). On the other hand there are font modifiers which 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 variant selector. +It keeps the current variant and the font of such variant is +reloaded with respect to the current font context by previously given family +selector and font modifiers. + +You can use the \^`\setfontsize` `{<sizespec>}` command in the same sense as +other font modifiers. It saves only 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 + +Much more comfortable way to resize fonts is using OPmac-like command +`\typosize`, `\typoscale`. +These commands prepare the right sizes for math +fonts too and re-calculates 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 Declaring font commands +%---------------------------- + +The font switches can be declared by `\font` primitive or by \^`\fontdef` or +\^`\fontlet` macros. See the sections~\ref[fontdef] and~\ref[fontlet] +for more details. The general format for \^`\fontdef` is +\begtt \catcode`\<=13 +\fontdef\<font switch> {\<family selector> <font modifiers> \<variant selector>} +\endtt + +Such font switches should be used in `\output` routine (headers, footers) for +example. We need fixed sizes here. But they are less usable in common +text. For example the document includes notices in smaller font. +When the notice is started then we want +to do all variants smaller: `\rm`, `\it`, `\bf`, etc. +It means that the smaller font for notices should be initialized by +`\setfontsize{at9pt}\rm` for example. If you want a \"notices font selector" +then you can do `\def\noticefont{\setfontsize{at9pt}\rm}`. This font +selector does not change the `\baselineskip`. If you want to do this then +put different `\baselineskip` setting to your definition. But you must not +forget that the end of group before `\par` is a typical mistake of \TeX/ +users: the last paragraph is in smaller font but in normal baselineskip, +because `\baselineskip` setting is taken into account when `\par` +command is processed. + +Somewhat more complicated task is the \"title font selector", because titles are +not only bigger but they are typically in bold variant. When the user puts +`{\it...}` into the title 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 here we have bold 14pt font and {\it here} was bold 14pt italics} +\endtt + +You can declare a new variant slector by the \^`\famvardef` macro. This +macro has similar syntax as \^`\fontdef`: +\begtt \catcode`\<=13 +\famvardef\<new variant selector> {<font modifiers> \<variant selector>} +\endtt +% +The `\<new variant selector>` should be used in the same sense as `\rm`, +`\bf` etc. It can be used as the final command in the +`\fontdef` or `\famvardef` declarators +too. When the `\<new variant selector>` is used in normal text then it does +following steps: pushes current font context to a stack, modifies font +context by declared `<font modifiers>`, runs following `\<variant selector>`. +It selects a font. Then pops the stack. The font context have its original +values but new font is selected. + +The \^`\famvardef` creates the `\<new variant selector>` family dependent. +When the selector is used in another family than it is defined then warning is +printed on the terminal \"<var selector> is undeclared in current family" +and nothing happens. But you can declare the same variant selector by +\^`\famvardef` macro in the context of new family. Then the same command +will be 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 but supports only basic variant selectors `\rm`, `\bf`, `\it`, +and `\bi`. Then you can declare: +\begtt +\famvardef \mr {\medium\rm} +\famvardef \mi {\medium\it} +\endtt +Now, you can use six independent variant selectors `\rm`, `\bf`, `\it`, +`\bi`, `\mr` 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 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 + +There exists analogical declarator `\moddef` for declaration family dependent +font modifiers. It is described in detail the section~\ref[fontfamfiles]. + + +\secc 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 supports given font feature then font is realoaded +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 to +create a new modifier, just use `{\caps`\^`\currvar`` 012345}`. + + +\secc 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 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 backslash) +instead of the hexadecimal specification. +The empty parameter `<color>` means default black color. + +That colors of fonts are implemented using \LuaTeX/ internal font feature. This +is different approach than using colors in section \ref[colors]. + +\^`\setletterspace` `{<number>}` specifies letter spacing of the font. The +`<number>` is 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 default. + +\^`\setwordspace` `{<scaling>}` scales the default inter word space (defined in the +font) and its stretching and shrinking parameters by given `<scaling>` +factor. For example `\setwordspace{2.5}` multiplies inter word 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 +\endtt + +Use font transformations mentioned above and \^`\setletterspace`, +\^`\setwordspace` with care. The best setting of these values is default +setting in every font, of course. If you really needs to set a different +letter spacing then it is strongly recommended to add `\setff{-liga}` in +order to disable ligatures. And setting a positive letter spacing probably +needs to scale inter word spacing too. + +All mentioned font modifiers (with the exception of `\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 + +\endinput + +2020-04-18 \_tryloadfamslocal introduced + \_fontdecl -> \_famdecl with different concept +2020-03-18 released diff --git a/macros/luatex/optex/base/graphics.opm b/macros/luatex/optex/base/graphics.opm new file mode 100644 index 0000000000..f2fa1b9257 --- /dev/null +++ b/macros/luatex/optex/base/graphics.opm @@ -0,0 +1,425 @@ +%% This is part of 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=0pt \_else width\_picwidth\_fi + \_ifdim\_picheight=0pt \_else height\_picheight\_fi + \_picparams {\_the\_picdir#1}% + \_pdfrefximage\_pdflastximage\_egroup} + +\_def\_picparams{} + +\_public \inspic ; + + \_doc ----------------------------- + Inkscape is able to 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 it after `*.pdf` in included + in order to place labels of this ficture in the same font as 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` toknes 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 to0pt{\_vss\_hbox to0pt{\_kern#1\_picwidth + \_pdfsave\_hbox to0pt{#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 to0pt{\_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 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 width0pt + \_setbox0=\_hbox{\_box0}\_ht0=0pt \_dp0=0pt + \_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=0pt \_dp0=0pt \_ht0=0pt + \_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 natural dimension. + \nl + \`\backgroundpic``{<image-file>}` puts the image to + the background of each page. It it 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>0pt \_vskip-\_prevdepth \_relax \_fi + \_nointerlineskip + \_fi + \_wd0=0pt \_ht0=0pt \_dp0=0pt + \_vbox to0pt{\_kern-\_dimen2 \_hbox to0pt{\_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>` axix. + The origin is in the center. + \nl + \`\_oval``{<x>}{<y>}{<roudness>}` creates an oval with `<x>`, `<y>` size and with + 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>`, crates the + `<curve>` and retuns back the current point. + 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=0pt \_else \_ht0=\_dimexpr\_ht0+\_vvkern \_relax + \_dp0=\_dimexpr\_dp0+\_vvkern \_relax \_fi + \_ifdim\_hhkern=0pt \_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 to0pt{\_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=0pt \_dimen1=0pt + \_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=0pt \_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 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 begining 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=0pt + \_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 % ------------------------------------- + +2020-04-12: \_public \clipinoval \clipincircle ; added, bug fixed + diff --git a/macros/luatex/optex/base/hi-syntax.opm b/macros/luatex/optex/base/hi-syntax.opm new file mode 100644 index 0000000000..e0ac530c3d --- /dev/null +++ b/macros/luatex/optex/base/hi-syntax.opm @@ -0,0 +1,223 @@ +%% This is part of 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 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 \_def\t{\n\_noexpand\t\n}\_let\_start=\_relax + \_adef{ }{\n\ \n}\_edef\_tmpb{\_start^^J##2\_end}% + \_replthis{^^J}{\n^^J\n}\_replthis{\n\_end}{\_end}% + \_let\x=\_relax \_let\y=\_relax \_let\z=\_relax \_let\t=\_relax + \_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 highlighting "\_tmpa" undeclared (no file hisyntax-\_tmpa.opm)} + \_fi\_fi + \_replthis{\_start\n^^J}{}\_replthis{^^J\_end}{^^J}% + \_def\n{}% + \_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: + +\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. + +\medskip +\noindent{\bf 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 preparared 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 repersented by `\n^^J\n`. +* The `\_start` control sequence is added before the verbatim text and `\_end` control + sequence is appended to the end of the verbatim text. These control + sequences are removed in post-processing phase. +\enditems + +There are special macros 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 tabelator. 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 (separatelly) 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/luatex/optex/base/hisyntax-c.opm b/macros/luatex/optex/base/hisyntax-c.opm new file mode 100644 index 0000000000..e7583657a4 --- /dev/null +++ b/macros/luatex/optex/base/hisyntax-c.opm @@ -0,0 +1,66 @@ +%% This is part of 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 ceclare the syntax declaration +in it. The second cotken 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 deacred if you want to give these token lists to +the user name space. 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 to read it repeatedly in before each code chunk +again and again. + +Note that `\foreach` is used to each non-letters (expanded via \string +because we needn't to treate with active or special TeX characters). The +keyword are applied in the `\foreach` loop too. + +See `hi-sytax.opm` for more information about `\hicolor`, `\replfromto` and +`\replthis` macros. diff --git a/macros/luatex/optex/base/hisyntax-html.opm b/macros/luatex/optex/base/hisyntax-html.opm new file mode 100644 index 0000000000..f34aafe66f --- /dev/null +++ b/macros/luatex/optex/base/hisyntax-html.opm @@ -0,0 +1,31 @@ +%% This is part of 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{\}} + +\_endcode %------------------------------------------------ + diff --git a/macros/luatex/optex/base/hisyntax-python.opm b/macros/luatex/optex/base/hisyntax-python.opm new file mode 100644 index 0000000000..e703f96fdc --- /dev/null +++ b/macros/luatex/optex/base/hisyntax-python.opm @@ -0,0 +1,82 @@ +%% This is part of 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/luatex/optex/base/hisyntax-tex.opm b/macros/luatex/optex/base/hisyntax-tex.opm new file mode 100644 index 0000000000..2aaaa323fd --- /dev/null +++ b/macros/luatex/optex/base/hisyntax-tex.opm @@ -0,0 +1,38 @@ +%% This is part of 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/luatex/optex/base/hyperlinks.opm b/macros/luatex/optex/base/hyperlinks.opm new file mode 100644 index 0000000000..ab0909b553 --- /dev/null +++ b/macros/luatex/optex/base/hyperlinks.opm @@ -0,0 +1,156 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \ulink {Hyperlinks <2020-04-22>} % 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 top border of the PDF viewer but we want to see + the line where destination is. The destination box is positioned by + different way dependent on 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 to0pt{\_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 te `<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. User 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 ;% +} +\_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 a breakpoints to special places of the + `<url>`. For example `//` is replaced by `\_urlskip/\_urlskip/\_urlbskip` + where `\urlskip` adds a small nobreakable 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 the 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 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 + +2020-04-22 \| in \url: bug fixed +2020-03-15 introduced
\ No newline at end of file diff --git a/macros/luatex/optex/base/hyphen-lan.opm b/macros/luatex/optex/base/hyphen-lan.opm new file mode 100644 index 0000000000..76feb2296d --- /dev/null +++ b/macros/luatex/optex/base/hyphen-lan.opm @@ -0,0 +1,203 @@ +%% This is part of 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 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 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 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> <number-cs> <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 <long-lang> <number> % 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` `<long-lang> <iso-code>` + in initialization state and \^`\_uselang` in processing state. + \_cod ----------------------------- + +\_def\_preplang #1 #2 #3#4 #5 {% + \_chardef#3=#4 + \_sdef{_lan:#4}{#1}\_lowercase{\_sdef{_ulan:#2}}{#1}% + \_def\_next{\_ea\_noexpand\_csname _#1lang\_endcsname} + \_ea\_edef \_csname _#1lang\_endcsname {% + \_lowercase{\_noexpand\_loadpattrs #2} #4 % loads patterns + \_gdef\_next{\_noexpand\_uselang{#1}#3#5}% re-defines itself + \_next % runs itself in processing state + } + \_addto\_langlist{ #1(#2)}% + \_sdef{#1lang}{\_csname _#1lang\_endcsname}% unprefixed \<isocode>lang +} +\_def\_loadpattrs#1 #2 {% + \_directlua{ + require("luatex-hyphen") + luatexhyphen.loadlanguage("#1",#2) + }% +} + + \_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 from 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 \_enusPatt 100 23 +\_preplang engb UKenglish \_engbPatt 101 23 +\_preplang it Italian \_itPatt 102 22 +\_preplang ia Interlingua \_iaPatt 103 22 +\_preplang id Indonesian \_idPatt 104 22 + +\_preplang cs Czech \_csPatt 115 23 +\_preplang sk Slovak \_skPatt 116 23 +\_preplang de nGerman \_dePatt 121 22 +\_preplang fr French \_frPatt 122 22 +\_preplang pl Polish \_plPatt 123 22 +\_preplang cy Welsh \_cyPatt 124 23 +\_preplang da Danish \_daPatt 125 22 +\_preplang es Spanish \_esPatt 126 22 +\_preplang sl Slovenian \_slPatt 128 22 +\_preplang fi Finnish \_fiPatt 129 22 +\_preplang hy Hungarian \_huPatt 130 22 +\_preplang tr Turkish \_trPatt 131 22 +\_preplang et Estoniak \_etPatt 132 23 +\_preplang eu Basque \_euPatt 133 22 +\_preplang ga Irish \_gaPatt 134 23 +\_preplang nb Bokmal \_nbPatt 135 22 +\_preplang nn Nynorsk \_nnPatt 136 22 +\_preplang nl Dutch \_nlPatt 137 22 +\_preplang pt Portuguese \_ptPatt 138 23 +\_preplang ro Romanian \_roPatt 139 22 +\_preplang hr Croatian \_hrPatt 140 22 +\_preplang zh Pinyin \_zhPatt 141 11 +\_preplang is Icelandic \_isPatt 142 22 +\_preplang hsb Uppersorbian \_hsbPatt 143 22 +\_preplang af Afrikaans \_afPatt 144 12 +\_preplang gl Galician \_glPatt 145 22 +\_preplang kmr Kurmanji \_kmrPatt 146 22 +\_preplang tk Turkmen \_tkPatt 147 22 +\_preplang la Latin \_laPatt 148 22 +\_preplang lac classicLatin \_lacPatt 149 22 +\_preplang lal liturgicalLatin \_lalPatt 150 22 +\_preplang elm monoGreek \_elmPatt 201 11 +\_preplang elp Greek \_elpPatt 202 11 +\_preplang grc ancientGreek \_grcPatt 203 11 +\_preplang ca Catalan \_caPatt 204 22 +\_preplang cop Coptic \_copPatt 205 11 +\_preplang mn Mongolian \_mnPatt 206 22 +\_preplang sa Sanskrit \_saPatt 207 13 +\_preplang ru Russian \_ruPatt 208 22 +\_preplang uk Ukrainian \_ukPatt 209 22 +\_preplang hy Armenian \_hyPatt 210 12 +\_preplang as Assamese \_asPatt 211 11 +\_preplang hi Hindi \_hiPatt 212 11 +\_preplang kn Kannada \_knPatt 213 11 +\_preplang lv Latvian \_lvPatt 215 22 +\_preplang lt Lithuanian \_ltPatt 216 22 +\_preplang ml Malayalam \_mlPatt 217 11 +\_preplang mr Marathi \_mrPatt 218 11 +\_preplang or Oriya \_orPatt 219 11 +\_preplang pa Panjabi \_paPatt 220 11 +\_preplang ta Tamil \_taPatt 221 11 +\_preplang te Telugu \_tePatt 222 11 + + \_doc ----------------------------- + The \`\langlist` includes names of all languages which are ready to load + and use their hyphenation patterns. This list is printed to terminal and + to log at ini\TeX/ state here. It can be used when processing document 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 only to swich +hyphenation patterns. For example you need to load a specific font with a +specific script used in selected language, you can define a 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 to 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/luatex/optex/base/if-macros.opm b/macros/luatex/optex/base/if-macros.opm new file mode 100644 index 0000000000..c33c8a91d3 --- /dev/null +++ b/macros/luatex/optex/base/if-macros.opm @@ -0,0 +1,258 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \newif {Special if-macros, is-macros and loops <2020-05-02>} % 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 internal name space + (`_`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 ---------------------------- + \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} +\_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. + + \`\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 sequence `<from>..<to>` can be decreasing too. + The macro is expandable. + + Recommendation: it is better to + use private variants of \`\_foreach` and \`\_fornum`. + 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{\_putforstack + \_immediateassignment\_def\_fbody##1{#2}% + \_foreachA #1\_do} +\_long\_def\_foreachA #1{\_ifx\_do#1\_getforstack\_else\_fbody{#1}\_ea\_foreachA\_fi} + +\_def\_fornum#1..#2\_do{\_fornumstep 1:#1..#2\_do} +\_long\_def\_fornumstep#1:#2..#3\_do#4{\_putforstack + \_immediateassigned{% + \_def\_fbody##1{#4}% + \_def\_fornumsgn{}% + \_def\_fornumrel{<}% + \_frnum=\_numexpr#2\_relax + \_ifnum\_numexpr#3<\_frnum \_def\_fornumrel{>}\_fi %decreasing sequence + \_ifnum\_numexpr#1\_fornumrel0 \_def\_fornumsgn{-}\_fi % correction + }% + \_fornumB{#3}{#1}% +} +\_def\_fornumB #1#2{\_ifnum\_numexpr#1\_fornumrel\_frnum \_getforstack \_else + \_ea\_fbody\_ea{\_the\_frnum}% + \_immediateassignment\_advance\_frnum by\_numexpr\_fornumsgn#2\_relax + \_afterfi{\_fornumB{#1}{#2}}\_fi +} +\_def\_afterfi#1#2\_fi{\_fi#1} + +\_def\foreach #1\do{\_foreach #1\_do} +\_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 + \_sdef{_frnum:\_the\_forlevel\_ea}\_ea{\_the\_frnum}% + \_slet{_fbody:\_the\_forlevel}{_fbody}% + \_fi + \_advance\_forlevel by1 +}} +\_def\_getforstack{\_immediateassigned{% + \_advance\_forlevel by-1 + \_ifnum\_forlevel>0 + \_slet{_fbody}{_fbody:\_the\_forlevel}% + \_frnum=\_cs{_frnum:\_the\_forlevel}\_space + \_fi +}} + + \_doc ---------------------------- + \secc Is-macros + There are a collection of macros + `\isempty`, `\istoksempty`, `\isequal`, `\ismacro`, `\isdefined`, `\isinlist` and `\isfile` + 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 ---------------------------- + +\_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 code 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 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 different syntax than all others 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 + +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/luatex/optex/base/languages.opm b/macros/luatex/optex/base/languages.opm new file mode 100644 index 0000000000..aedcd249f4 --- /dev/null +++ b/macros/luatex/optex/base/languages.opm @@ -0,0 +1,121 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \_mtext {Languages <2020-04-29>} % 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 declared word and `<lang>` is 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 Subjekt +\_langw es Capítulo Tabla Figura Sujeto +\_langw fr Chaptire Tableau Figure Matière +\_langw it Capitolo Tabella Fig. Soggetto +\_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 + +\_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 `\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 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 + +\_def \_quoteschars #1#2#3#4{\_def\_altquotes{\_quoteschars#3#4#1#2}\_public\altquotes;% + \_def \"##1"{#1##1#2}\_def \'##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 first backslash. + First, declare `\<iso-code>quotes`, then \^`\altquotes` (if needed) and finally + \^`\activequotes`. + \_cod ----------------------------- + +\_def\_activequotes{\_ea\_activequotesA\"""\_ea\_activequotesA\'''} +\_def\_activequotesA#1#2#3{\_bgroup\_lccode`\~=`#3\_lowercase{\_egroup\_adef#3##1~{#1##1#2}}} + +\_public \quoteschars \activequotes \enquotes \csquotes \skquotes \frquotes \plquotes + \esquotes \grquotes \ruquotes \itquotes \dequotes ; + +\_endcode % ------------------------------------- + +2020-04-29 Obrazek -> Abbildung: bug fixed +2020-03-15 introduced
\ No newline at end of file diff --git a/macros/luatex/optex/base/lists.opm b/macros/luatex/optex/base/lists.opm new file mode 100644 index 0000000000..0b30ed43bb --- /dev/null +++ b/macros/luatex/optex/base/lists.opm @@ -0,0 +1,110 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \begitems {Lists: begitems, enditems <2020-04-21>} % 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. User can set + initial value of `\itemnum` to another value after `\beitems` if he/she want. + \nl + Each level of nested lists is indented by new `\iindent` from left. + 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*{\_startitem} + \_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 ; + +\_endcode % ------------------------------------- + +2020-04-21 \isnextchar\par added to \enditems +2020-03-18 introduced diff --git a/macros/luatex/optex/base/logos.opm b/macros/luatex/optex/base/logos.opm new file mode 100644 index 0000000000..f7161e8eda --- /dev/null +++ b/macros/luatex/optex/base/logos.opm @@ -0,0 +1,62 @@ +%% This is part of 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 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 {\_futurelet\_next \_ignoreslashA} +\_def\_ignoreslashA {\_ifx\_next/\_ea\_ignoreit\_fi} + +\_public \TeX \OpTeX \LuaTeX \XeTeX \ignoreslash ; + + \_doc ----------------------------- + The \`\_slantcorr` macro expands to slant-correction of 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 needs 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/luatex/optex/base/luatex-ini.opm b/macros/luatex/optex/base/luatex-ini.opm new file mode 100644 index 0000000000..04490a9b91 --- /dev/null +++ b/macros/luatex/optex/base/luatex-ini.opm @@ -0,0 +1,136 @@ +%% This is part of 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/luatex/optex/base/makeindex.opm b/macros/luatex/optex/base/makeindex.opm new file mode 100644 index 0000000000..5904b494b4 --- /dev/null +++ b/macros/luatex/optex/base/makeindex.opm @@ -0,0 +1,460 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \makeindex {Makeindex and sorting <2020-04-26>} % loaded in format + + \_doc ----------------------------- + \^`\makeindex` implements sorting algorithm at \TeX/ macro-language level. + You need not any external program. + + There are two passes in sorting algorithm. Primary pass does not + distinguish between a group o letters (typically non-accented and + accented). If the result of comparing two string is equal in primary pass + then secondary pass is started. It distinguish 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 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 sorting algorithm are declared in \`\_ignoredchars``<iso-code>`. + The compound characters (two or more characters interpreted as one + character in sorting algorithm) is mapped to single invisible characters + in \`\_compoundchars``<iso-code>`. Czech rules declares 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 first pass + without additional condition. All characters are taken into account in + second pass: ASCII characters with code $\lq65$ 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 subset of 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 in 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 code. + 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=65 \_ea\_act \_sortingdata \_relax +} + + \_doc ----------------------------- + Strings to be sorted are prepared in `\,<string>` control sequences + (in order 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 first character from both converted strings, compares them + and if it is equal then calls itself recursively else gives 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 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 in 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} + \_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 + \_expandafter\_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 solves 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 othes variants of indexing macros expands internally to `\iindex`. + \_cod ----------------------------- + +\_def\_iindex#1{\_isempty{#1}\_iffalse\_openref{\def~{ }% + \edef\_act{\_noexpand\_wref\_noexpand\_Xindex{{#1}{\_iitypesaved}}}\_act}\_fi} +\_public \iindex ; + + \_doc ----------------------------- + The \`\_Xindex``{<word>}{<iitype>}` stores `\,<word>` to the `\_iilist` if + there is 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. + Moreower, 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 horizontal mode on 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 % ------------------------------------- + +2020-04-21 \isempty \iffalse ... \fi added to \iindex +2020-03-26 introduced diff --git a/macros/luatex/optex/base/maketoc.opm b/macros/luatex/optex/base/maketoc.opm new file mode 100644 index 0000000000..f94571629e --- /dev/null +++ b/macros/luatex/optex/base/maketoc.opm @@ -0,0 +1,126 @@ +% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \maketoc {Macros for maketoc <2020-03-12>} % preloaded in format + + \_doc ------------------------------------ + \`\_Xtoc` `{<level>}{<type>}{<number>}{<title>}` (in `.ref` file) reads the + specified data and appends them to the \`\_toclist` as + \^`\_tocline``{<level>}{<type>}{<number>}{<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 + * `<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. + \_cod ------------------------------------ + +\_def\_toclist{} +\_newifi \_ifischap \_ischapfalse + +\_def\_Xtoc#1#2#3#4{\_ifnum#1=0 \_ischaptrue\_fi + \_addto\_toclist{\_tocline{#1}{#2}{#3}{#4}} + \_ea\_addto\_ea\_toclist\_ea{\_currpage}% +} + + \_doc ------------------------------------ + \`\_tocline``{<level>}{<type>}{<number>}{<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 hrizontal 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: + \begtt + | | + \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 global counter of all TOC records (used by hyperlinks). + \_cod ------------------------------------ + +\_newcount \_tocrefnum +\_def\_tocline#1#2#3#4#5#6{% + \_advance\_tocrefnum by1 + \_bgroup + \_leftskip=\_iindent \_rightskip=2\_iindent + \_ifischap \_advance\_leftskip by \_iindent \_fi + \_def\_pgn{\_ilink[pg:#5]}% + \_the\_everytocline + \_ifcsname _tocl:#1\_endcsname + \_cs{_tocl:#1}{#3}{#4}{#6}\_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 ----------------------------------- + \`\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 + \_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 + +2020-04-23 \_tocpar introduced (incompatible change) +2020-04-22 \_pg -> \_pgn (incompatible change) +2020-03-12 introduced
\ No newline at end of file diff --git a/macros/luatex/optex/base/margins.opm b/macros/luatex/optex/base/margins.opm new file mode 100644 index 0000000000..a02bf3e57a --- /dev/null +++ b/macros/luatex/optex/base/margins.opm @@ -0,0 +1,78 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \margins {Macros for margins setting <2020-03-14>} % 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 + \_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 % ----------------------------------------- + + diff --git a/macros/luatex/optex/base/math-macros.opm b/macros/luatex/optex/base/math-macros.opm new file mode 100644 index 0000000000..a1e7b817ff --- /dev/null +++ b/macros/luatex/optex/base/math-macros.opm @@ -0,0 +1,946 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \sin {Math macros plus mathchardefs <2020-04-27>} % preloaded in format + + \_doc ----------------------------- + The category code of the character `_` remains as letter (11) and the mathocode + of it is `"8000`. + It means that it is active character in math mode. It is defined as subscript prefix. + + There is a problem: The `x_n` is tokenized as `x`, `_`, `n` and it works + without problem. 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 our own + control sequence in the form `\<word>_` or `\<word>_<one-letter>` (where + <word> is sequence of letters) because such control sequences are + unacessible: proprocessor rewrites it. + + The \`\mathsbon` macro activates the rewritting 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, is is activated in the `\everyjob`. + \_cod ----------------------------- + +\catcode`\_ = 8 \let\sb = _ +\catcode`\_ = 13 \let _ = \sb +\catcode`\_ = 11 +\_private \sb ; + +\_newifi\_ifmathsb \_mathsbfalse +\_def \_mathsbon {% + \_directlua{ + callback.register("process_input_buffer", + function (str) + return string.gsub(str.." ", "(\_nbb[a-zA-Z]+)_([a-zA-Z]?[^_a-zA-Z])", "\_pcent 1 _\_pcent 2") + end) }% + \_global\_mathsbtrue +} +\_def \_mathsboff {% + \_directlua{ callback.register("process_input_buffer", nil) }% + \_global \_mathsbfalse +} +\_public \mathsboff \mathsbon ; + + \_doc ----------------------------- + All mathcodes are set to equal values as in plain\TeX/. + But all encoding-dependend declarations (like these) will be set + to different values when 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 delcared 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 tha 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 more readable + form.\nl + \`\sp` is alternative for `^`. The \`\sb` alternative for `_` was defined + at the 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=0pt + \_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 ----------------------------- + 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 ----------------------------- + \`\overrightarrow`, \`\overleftarrow`, \`\overbrace`, \`\underbrace`, \`\skew` macros. + \_cod ----------------------------- + +\_def\_math{\_mathsurround0pt } +\_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} +\_protected\_def\_skew #1#2#3{{\_muskip0=#1mu\_divide\_muskip0=by2 \_mkern\_muskip0 + #2{\_mkern-\_muskip0{#3}\_mkern\_muskip0}\_mkern-\_muskip0}{}} + +\_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 \_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=0pt \_dp0=0pt \_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{\_kern0pt #2}\_limits^{#1}}} +\_protected\_def\_doteq{\_buildrel\_textstyle.\over=} +\_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 ----------------------------- + \`\cases`, \`\matrix`, \`\pmatrix` and \`\bordermatrix` macros from plain \TeX/ + \_cod ----------------------------- + +\_protected\_def\_cases#1{\_left\{\_thinsk\_vcenter{\_normalbaselines\_math + \_ialign{$##\_hfil$&\_quad##\_hfil\_crcr#1\_crcr}}\_right.} +\_protected\_def\_matrix#1{\_null\_thinsk\_vcenter{\_normalbaselines\_math + \_ialign{\_hfil$##$\_hfil&&\_quad\_hfil$##$\_hfil\_crcr + \_mathstrut\_crcr\_noalign{\_kern-\_baselineskip} + #1\_crcr\_mathstrut\_crcr\_noalign{\_kern-\_baselineskip}}}\_thinsk} +\_protected\_def\_pmatrix#1{\_left(\_matrix{#1}\_right)} +\_newdimen\_ptrenwd +\_ptrenwd=0.875\_fontdimen6\_textfont1 % width of the big left ( +\_protected\_def\_bordermatrix#1{\_begingroup \_math + \_setbox0=\_vbox{\_def\_cr{\_crcr\_noalign{\_kern.2em\_global\_let\_cr\_endline}}% + \_ialign{$##$\_hfil\_kern.2em\_kern\_ptrenwd&\_thinspace\_hfil$##$\_hfil + &&\_quad\_hfil$##$\_hfil\_crcr + \_omit\_strut\_hfil\_crcr\_noalign{\_kern-\_baselineskip}% + #1\_crcr\_omit\_strut\_cr}}% + \_setbox2=\_vbox{\_unvcopy0 \_global\_setbox1=\_lastbox}% + \_setbox2=\_hbox{\_unhbox1 \_unskip\_global\_setbox1=\_lastbox}% + \_setbox2=\_hbox{$\_kern\_wd1 \_kern-\_ptrenwd\_left(\_kern-\_wd1 + \_global\_setbox1=\_vbox{\_box1 \_kern.2em}% + \_vcenter{\_kern-\_ht1 \_unvbox0 \_kern-\_baselineskip}\_thinsk\_right)$}% + \_null\_thicksk\_vbox{\_kern\_ht1 \_box2}\_endgroup} +\_public \cases \matrix \pmatrix \bordermatrix ; + + \_doc ----------------------------- + \`\openup`, \`\eqalign`, \`\displaylines` and \`\eqalignno` macros from + plain \TeX/. + \_cod ----------------------------- + +\_def\_openup{\_afterassignment\_openupA\_dimen0=} +\_def\_openupA{\_advance\_lineskip by\_dimen0 + \_advance\_baselineskip by\_dimen0 + \_advance\_lineskiplimit by\_dimen0 } +\_def\_eqalign#1{\_null\_thinsk\_vcenter{\_openup\_jot\_math + \_ialign{\_strut\_hfil$\_displaystyle{##}$&$\_displaystyle{{}##}$\_hfil + \_crcr#1\_crcr}}\_thinsk} +\_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 +\_def\_displaylines#1{\_display \_tabskip=\_zoskip + \_halign{\_hbox to\_displaywidth{$\_elign\_hfil\_displaystyle##\_hfil$}\_crcr + #1\_crcr}} +\_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}} +\_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 \eqalign \displaylines \eqalignno ; + + \_doc ----------------------------- + These macros are inspired from `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 mote inteligent 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 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}{\_stylenum1 #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 \`\mathbox``{<text>}` macro is copied from OPmac trick 078. + It behaves like `\hbox{<text>}` but the `<text>` is scaled to smaller + size if it is used in scriptstye or scriptscript style. + \_cod ----------------------------- + +\_def\_mathbox#1{{\_mathstyles{\_hbox{% + \_ifnum\_stylenum<2 \_everymath{\_currstyle}% + \_else \_typoscale[\_dobystyle{}{}{700}{500}/]\_fi #1}}}% +} +\_public \mathbox ; + +\_endcode %--------------------------------------------------- + +2020-04-27 \mathstyles introduced +2020-03-14 implemented diff --git a/macros/luatex/optex/base/math-preload.opm b/macros/luatex/optex/base/math-preload.opm new file mode 100644 index 0000000000..0b8ffeebab --- /dev/null +++ b/macros/luatex/optex/base/math-preload.opm @@ -0,0 +1,221 @@ +%% This is part of 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 normal shape of all math + symbols and \`\boldmath` for bold shape of all math symbos. 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 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 5.5 eufm6 6.5 eufm7 7.5 eufm8 8.5 eufm9 9.5 eufm10 * +\_regtfm eufb 0 eufb5 5.5 eufb6 6.5 eufb7 7.5 eufb8 8.5 eufb9 9.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 defaut. + \nl + \`\_corrmsizes` should be used in the \^`\normalmath` and \^`\boldmath` + macros if you need a size correction when a selected math family is + loaded. It is similar as ex-height correction but for math fonts. + \_cod ----------------------------- + +\_def\_corrmsizes{\_ptmunit=1\_ptunit\_relax} % for corrections of sizes in diferent fomts + +\_def\_loadmathfamily #1 #2 {\_chardef\_tmp#1\_corrmsizes + \_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 \_relax +} +\_def\_setmathfamily #1 #2{\_let\_mF=#2\_chardef\_tmp#1\_corrmsizes + \_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 \_let#2=\_mF +} +\_def\_setmathsizes[#1/#2/#3]{% + \_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 ----------------------------- + Finaly, we preload a math fonts colleciton in [10/7/5] sizes + when the format is generated. This is done when + `\_suppressfontnotfounderror=1` because we need not errors when 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 Unicoded fonts, i.e. +Unicoded-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/luatex/optex/base/math-unicode.opm b/macros/luatex/optex/base/math-unicode.opm new file mode 100644 index 0000000000..f35b8652e0 --- /dev/null +++ b/macros/luatex/optex/base/math-unicode.opm @@ -0,0 +1,236 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \loadmath {Unicode Math fonts <2020-02-25>} % preloaded in format + + \_doc ----------------------------- + \`\loadmath` `{<Unicode-math font>}` loads 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 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.}% + \_opinput {unimath-codes.opm}% + \_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 similar sense as + \^`\_setmathdimens`. + \_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 +} + + \_doc ----------------------------- + \`\_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 fath family 1 is loaded then the family 2 and 3 is 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. + \_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}{#3} at\_optsize \_textfont#1=\_mF + \_ifnum#1=1 \_textfont2=\_mF \_textfont3=\_mF \_fi + \_optsize=\_sizemscript \_font\_mF=\_umathname{#2}{+ssty=0;#3} at\_optsize \_scriptfont#1=\_mF + \_ifnum#1=1 \_scriptfont2=\_mF \_scriptfont3=\_mF \_fi + \_optsize=\_sizemsscript \_font\_mF=\_umathname{#2}{+ssty=1;#3} at\_optsize\_scriptscriptfont#1=\_mF + \_ifnum#1=1 \_scriptscriptfont2=\_mF \_scriptscriptfont3=\_mF \_fi + \_optsize=\_optsizesave \_relax +} + + \_doc ----------------------------- + Unicode math font includes all typical math alphabets together, user needs not to + load more \TeX/ math families. These math aphabets are encoded by + different parts of Unicode table. We need auxiliary macros for setting + mathcodes by selected math alphabet. + \nl + \`\_umathrange` `{<from->-<to>}\<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 causes 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{\_umathnumB=#2\_relax \_umathrangeA#1} +\_def\_umathrangeA#1-#2{\_umathnumA=`#1\_relax + \_loop + \_umathcorr\_umathprepare\_umathnumB + \_Umathcode \_umathnumA = 7 1 \_umathcorr\_umathvalue{\_umathnumB} + \_ifnum\_umathnumA<`#2\_relax + \_advance\_umathnumA by1 \_advance\_umathnumB by1 + \_repeat +} +\_def\_umathrangeGREEK{\_begingroup + \_lccode`A="0391 \_lccode`Z="03A9 + \_lowercase{\_endgroup \_umathrange{A-Z}}} +\_def\_umathrangegreek{\_begingroup + \_lccode`A="03B1 \_lccode`Z="03D6 + \_lowercase{\_endgroup \_umathrange{A-Z}}} +\_def\_greekdef#1{\_ifx#1\_relax \_else + \_begingroup \_lccode`X=\_umathnumB \_lowercase{\_endgroup \_def#1{X}}% + \_advance\_umathnumB by 1 + \_expandafter\_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 new UnicodeMath 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 `\loadmath`. For example: + +\begtt +\loadmath {[xitsmath-regular]} +\loadboldmath {[xitsmath-bold]} \to {[xitsmath-regular]} +\endtt + +You can combine more fonts, if you register them to another +math families (5, 6, 7, etc.) in the `\normalmath` macro. + +The default value of `\normalmath` shows a combination of base Unicode Math +font with 8bit Math font at family 4. See definition of `\script` macro where +`\fam4` is used. Of course, we need to set `\rmvariables` too, because 8bit font +accepts only codes less than 255. + +See \url{http://tex.stackexchange.com/questions/308749/} for more technical details. + +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 +\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 + + + +\_endinput + +2020-04-15 \_setmathdimens -> \_setuniathdimens +2020-02-25 implemented diff --git a/macros/luatex/optex/base/mathclass.opm b/macros/luatex/optex/base/mathclass.opm new file mode 100644 index 0000000000..458431abca --- /dev/null +++ b/macros/luatex/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/luatex/optex/base/more-macros.opm b/macros/luatex/optex/base/more-macros.opm new file mode 100644 index 0000000000..a022375360 --- /dev/null +++ b/macros/luatex/optex/base/more-macros.opm @@ -0,0 +1,241 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \eoldef {OpTeX useful macos <2020-05-03>} % preloaded in format + + \_doc ----------------------------- + We define \`\opinput` `{<file name>}` macro which + does `\input {<file name>}` but catocodes are set to normal catcodes + (like \OpTeX/ initializes them) and the catodes setting is return back to + the current values when the file is read. You can use `\optinput` + in any situation inside the document and you will be sure that the file + is read correctly with correct catcode settings. + + In order to achieve this, we declare \`\optexcatcodes` catcode table + and \`\plaintexcatocdes`. 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 catocdes + from the catcode table stack. So, the `\opinput` macro can be implemented simply: + \_cod ----------------------------- + +\_def\_opinput #1{\_setctable\_optexcatcodes \_input {#1}\_relax\_restorectable} + +\_newcatcodetable \_optexcatcodes +\_newcatcodetable \_plaintexcatcodes + +\_public \optexcatcodes \plaintexcatcodes \opinput ; + +\_savecatcodetable\_optexcatcodes +{\_catcode`_=8 \savecatcodetable\plaintexcatcodes} + + \_doc ----------------------------- + The implementation of the catcodetable stack follows. + + The current catodes 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 the 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 which 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 ----------------------------- + 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. + \_cod ----------------------------- + +\_catcode`!=3 \_catcode`?=3 +\_def\_replstring #1#2#3{% \replstring #1{stringA}{stringB} + \_long\_def\_replacestringsA##1#2{\_def #1{##1}\_replacestringsB}% + \_long\_def\_replacestringsB##1#2{\_ifx!##1\_relax \_else \_addto #1{#3##1}% + \_ea\_replacestringsB\_fi}% + \_ea\_replacestringsA #1?#2!#2% + \_long\_def\_replacestringsA##1?{\_def #1{##1}}\_ea\_replacestringsA #1} +\_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 `\activettchar` 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{\_catcode\_string} % more robust in cases \catcode` or \catcode" + + \_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. + \nl + The \`\ignoreit``<token>` just ignores the `<token>`. + \_cod ----------------------------- + +\_def\_removespaces #1 {\_isempty{#1}\_iffalse #1\_ea\_removespaces\_fi} +\_ea\_def \_ea\_ignorept \_ea#\_ea1\_detokenize{pt}{#1} +\_def\_ignoreit#1{} + +\public \removespaces \ignorept \ignoreit ; + + \_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 decimal point. + The `<expression>` can include `+-*/()` and decimal numbers in common syntax. + + The usage of prefixed versions \`\_expr` or \`\_bp` is more recommended + because 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 + \_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-03 \load macro introduced +2020-03-15 released diff --git a/macros/luatex/optex/base/multicolumns.opm b/macros/luatex/optex/base/multicolumns.opm new file mode 100644 index 0000000000..c593f72552 --- /dev/null +++ b/macros/luatex/optex/base/multicolumns.opm @@ -0,0 +1,114 @@ +%% This is part of 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 height of such free space. This is done only if we have + enought amount of material in `\vbox 6` to fill full page by columns. + This is repeated in loop until we have less amount of material in `\vbox 6`. + Then we run `\_balancecolumns` which balances the last part of columns. + Each part of printed material is distributed to 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\_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/luatex/optex/base/optex.ini b/macros/luatex/optex/base/optex.ini new file mode 100644 index 0000000000..de15a1db73 --- /dev/null +++ b/macros/luatex/optex/base/optex.ini @@ -0,0 +1,99 @@ +%% This is part of 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{Beta 0.12 May 2020} +\def\fmtname{OpTeX} + +% 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 plain-macros.opm % plainTeX macros (todo:doc) +\input fonts-preload.opm % preloaded Latin Modern fonts +\input fonts-resize.opm % font resizing (low-level macros) (todo: texdoc) +\input fonts-select.opm % font selection system (todo: texdoc) +\input math-preload.opm % math fams CM + AMS preloaded (todo: doc) +\input math-macros.opm % basic macros for math plus mathchardefs (todo: x) +\input math-unicode.opm % macros for loading UnicodeMath fonts (todo: x) +\input fonts-opmac.opm % font managing macros from OPmac (todo: doc) +\input output.opm % output routine +\input margins.opm % macros for margins setting (todo: texdoc) +\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 (todo: x) +\input pdfuni-string.opm % PDFunicode strings for outlines (todo: x) +\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 (todo: doc) +\input languages.opm % languages +\input others.opm % miscenaleous + +\_everyjob = {% + \_message{This is OpTeX (Olsak's Plain TeX), version <\optexversion>^^J}% + \_mathchardef\_fnotestack=\_pdfcolorstackinit page {0 g 0 G}% + \_mathsbon % replaces \int_a^b to \int _a^b + \_inputref % inputs \jobname.ref if exists +} + +\_dump + +\_endcode % ------------------------------ + diff --git a/macros/luatex/optex/base/others.opm b/macros/luatex/optex/base/others.opm new file mode 100644 index 0000000000..ffa8451f90 --- /dev/null +++ b/macros/luatex/optex/base/others.opm @@ -0,0 +1,92 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \uv {Miscenaleous <2020-04-02>} % 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\_lastpageA\_currpage} +\_def\_lastpage {\_openref\_ea\_lastpageB\_currpage} +\_def\_lastpageA #1#2{#1} +\_def\_lastpageB #1#2{#2} +\_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 ---------------------------- + Lorem ipsum can be printed by \`\lipsum``[<range>]` or \`\lorem``[<range>]`, + for example `\lipsum[3]` or `\lipsum[112-121]`, max=150. The data are read + from \LaTeX/ file `lipsum.ltd.tex`. + \_cod ---------------------------- + +\_def \_lipsum {% + {\_long\_def\ProvidesFile##1[##2]##3{\_ifx\_par##3\_relax\_else \_ea##3\_fi}\_tmpnum=0 + \_def\NewLipsumPar{\_advance\_tmpnum by1 + \_afterassignment\_negativermnm \_sxdef{lips:\_the\_tmpnum}}% + \_opinput {lipsum.ltd.tex}% + \_global\_let \_lipsum=\_reallipsum + }\_lipsum +} +\_def\_negativermnm{\_romannumeral-`\.} +\_def\_reallipsum[#1]{\_lipsumA #1\_empty-\_empty\_end} +\_def\_lipsumA #1-#2\_empty#3\_end{\_tmpnum=#1 \_edef\_tmp{\_ifx^#2^#1\_else#2\_fi}% + \_loop \_csname lips:\_the\_tmpnum\_endcsname \par % \par is better here + \_ifnum\_tmpnum<\_tmp \_advance\_tmpnum by1 \_repeat +} +\def\lipsum {\_lipsum} +\def\lorem {\_lipsum} + +\_endcode + diff --git a/macros/luatex/optex/base/outlines.opm b/macros/luatex/optex/base/outlines.opm new file mode 100644 index 0000000000..0d041c743c --- /dev/null +++ b/macros/luatex/optex/base/outlines.opm @@ -0,0 +1,97 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \outlines {PDF outlines <2020-03-12>} % preloaded in format + +\_def\_outlines#1{\_pdfcatalog{/PageMode/UseOutlines}\_openref + \_ifx\_toclist\_empty + \_opwarning{\_noexpand\outlines -- data unavailable. TeX me again}% + \_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{% + \_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 +} +\_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{% + \_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 + \_pdfunidef\_tmp{#4}% + \_advance\_tocrefnum by1 + \_outlinesC{#1}{toc:\_the\_tocrefnum}{\_ifnum#1<\_outlinelevel\_space\_else-\_fi}{\_tmpnum}{\_tmp}% +} +\_def\_outlinesC#1#2#3#4#5{\_pdfoutline goto name{#2} count #3#4{#5}\_relax} + +\_newcount\_oulnum +\_def\_insertoutline#1{\_global\_advance\_oulnum by1 + \_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`. + +First step, the \`\outlines` macro sets `\_tocline` to \`\_outlinesA` and +calculates the number of direct descendants of each record. Second step, +the `\outlines` macro sets `\_tocline` to \`\_outlinesB` and it uses prepared +data and create outlines. + +Each ouline 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), third +one for level 2 (sections) etc. The number of direct descentants will be stored +in these macros after first step is finished. Each new outline of given level +increases the `<num>` at given level. When the first step is processed then +(above that) the `\_ol:..` sequence of the parent inceases 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 second step is processed, then we only read the stored data about the +number of descentants. Ad 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 link destination of the type `oul:<num>` into the document +(where \^`\insertoutline` is used) and the link itself is created too in the +outline. diff --git a/macros/luatex/optex/base/output.opm b/macros/luatex/optex/base/output.opm new file mode 100644 index 0000000000..ae8ee0b08b --- /dev/null +++ b/macros/luatex/optex/base/output.opm @@ -0,0 +1,245 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \nopagenumbers {Output routine <2020-03-28>} % preloaded in format + + \_doc ----------------------------- + \`\_optexoutput` is 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 is local in the `\output` group. + + The \`\_prepoffsets` can set `\hoffset` differently for left or right + page. It is re-defined by the \^`\margins` macro.. + + The \^`\_regmark` tokens list includes accumulated `#2` from the \^`\regmacro`. + Logos and another macros are re-defined here (locally) for their usage + in headlines or footlines. + \_cod ----------------------------- + +\_def \_begoutput{\_incr\_gpageno + \_immediate\_wref\_Xpage{{\_the\_gpageno}{\_folio}}% + \_prepoffsets \_the\_regmark} % +\_def \_endoutput{\_advancepageno + {\_globaldefs=1 \_the\_nextpages \_nextpages={}}% + \_ifnum\_outputpenalty>-20000 \_else\_dosupereject\_fi +} +\_def \_prepoffsets {} + + \_doc ----------------------------- + \`\gpageno` counts pages from one in whole document + \_cod ----------------------------- + +\_newcount\_gpageno +\_public \gpageno ; + + \_doc ----------------------------- + The \`\_completepage` is similar what plain \TeX/ does in its output routine. + New is only \`\_backgroundbox`. It is `\vbox` with zero height with its + contents (from \^`\pgbackground`) llaped 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, + default value of the `\_ensureblack` macro is empty. But 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 to0pt{\_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 to0pt{\_vss + \_baselineskip=\_headlinedist \_lineskiplimit=-\_maxdimen + \_line{\_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 \_line{\_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 \_global\_advance\_pageno by-1 \_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 a 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 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=0pt \_rightskip=0pt \_spaceskip=0pt \_xspaceskip=0pt \_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\_uskip\_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 + water color 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 \_kern4.5\_wd0 + \_hbox to0pt{\_kern.5\_hsize \_kern-1\_wd0 + \_pdfsave \_pdfrotate{55}\_pdfscale{10}{10}% + \_hbox to0pt{\_localcolor\LightGrey \_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 diff --git a/macros/luatex/optex/base/parameters.opm b/macros/luatex/optex/base/parameters.opm new file mode 100644 index 0000000000..8a707b4758 --- /dev/null +++ b/macros/luatex/optex/base/parameters.opm @@ -0,0 +1,542 @@ +%% This is part of 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 the 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 following primitive registers. + We prohibit orphans, set more information for tracing boxes, set page origin + to 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 aparagraph building algoritmh + % we need not to 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 \OpTeX/ parameters + + The main principle 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 important difference: all "string-like" + parameters are token lists in \OpTeX/ (OPmac uses macros for them). The reason of + this difference: if user sets parameter by unprotected control sequence, + an \OpTeX/ macro can read {\em the same data} using protected control sequence. + If user re-defines such unprotected control sequence (because he/she does + know about it) then nothing bad happens. + + 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/ is able to find them). If you set 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 dimesions 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 height is given, 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 to set these + parameters locally in the group where `\inspic` is used in order to not + influence the dimensions of another 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 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 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 `\activettchar` 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 have numbered lines from `\ttline+1`. The `\ttline` + register is re-set to 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 + shows 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 right. + Despite to the \^`\ttindent`, it does not shift the line numbers, only + the text. + \nl + The \`\iindent` gives default indentations used in 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 tabelator `^^I` has its category code like space: it behaves as a + space in normal text. This is normal 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 tabelator 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. + Full color set must be declared here. + \_cod ----------------------------- + +\_newtoks\_hicolors +\_public \hicolors ; + + \_doc ----------------------------- + The default item mark used between `\begitems` and `\enditems` is bullet. + The \`\defaultitem` tokens list declare 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 group is opened by + \nl + The \`\ilevel` keeps the value of 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` `\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 definite result of columns width. + \_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 style file here or you can modify the + more declaration for printing (fonts, baselineskip, etc.) or you can + define a specific macros used in your `.bib` file. + \_cod ----------------------------- + +\_newtoks\_bibtexhook +\_public \bibtexhook ; + +\_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 horizontal size of the marginal notes. + \nl + The \`\mnoteindent` is horizontal space between body-text and marginal note. + \nl + The \`\mnoteskip` is a dimen which denotes the vertical shift of marginal + note from its normal position. Positive value means shift up, negative + down. The `\mnoteskip` register is set to zero + after the marginal note is printed. + Use it as an exception of marginal note position if the marginal + notes overlaps or they are put at bottom of the page. + \_cod ----------------------------- + +\_newtoks\_everymnote +\_newdimen\_mnotesize \_mnotesize=20mm % the width of the mnote paragraph +\_newdimen\_mnoteindent \_mnoteindent=10pt % ditance between mnote and text +\_newdimen\_mnoteskip +\_public \everymnote \mnotesize \mnoteindent \mnoteskip ; + + \_doc ----------------------------- + The `\table` parameters follows. 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 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. + \_cod ----------------------------- + +\_newtoks\_everytable \_newtoks\_thistable +\_newtoks\_tabiteml \_newtoks\_tabitemr \_newtoks\_tabstrut +\_newdimen\_tablinespace \_newdimen\_vvkern \_newdimen\_hhkern +\_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 +\_public \everytable \thistable \tabiteml \tabitemr \tabstrut \tablinespace \vvkern \hhkern ; + + \_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 begining 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 bottom of + page-text and `\footline` is \`\footlinedist`. + More precisely: baseline of + headline and baseline of 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 from 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 a 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={\fixedrm \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. + The default values (documented in user manual) are set in the macros. + The user can re-set these values using tokens \`\ovalparams`, \`\circleparams`. + \_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 ; + + +\_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 such control sequence then the appropriate register exists +steadily and build-in algorithms are using it without change. But user +cannot access its value in such case. \OpTeX/ declares two control sequences +for each register: prefixed and unprefixed. \OpTeX/ macros use only +prefixed variants of control sequences. The user should use unprefixed variant +with the same meaning and set or read 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 is only few parameters declared by \OpTeX/ macros. All of them +%are listed in this section. This is desired feature of the \OpTeX/. +%If you want to do more +%changes wich 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 declares the design of the document. + +\_endinput + +History: +2020-04-04 ... \tabspaces added +2020-04-03 ... \hicolors added diff --git a/macros/luatex/optex/base/pdfuni-string.opm b/macros/luatex/optex/base/pdfuni-string.opm new file mode 100644 index 0000000000..d7566eb91d --- /dev/null +++ b/macros/luatex/optex/base/pdfuni-string.opm @@ -0,0 +1,78 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \pdfunidef {PDFunicode strings for outlines <2020-03-12>} % preloaded in format + +\_edef\_octalprint#1#2{\_noexpand\_directlua{% #1=character-code #2=character + if ('#2'>='A' and '#2'<='Z') or ('#2'>='a' and '#2'<='z') then + tex.print(string.format('000\_pcent s',"#2")) + else + local num=#1\_pcent256 + tex.print(string.format('\_pcent 03o\_nbb\_pcent03o',(#1-num)/256,num)) + end +}} +\_def\_pdfunidef#1#2{% + \_begingroup + \_catcode`\\=12 \_let\\=\_bslash + \_the\_regoul \_relax % \_regmacro alternatives of logos etc. + \_escapechar=-1 + \_edef#1{#2\_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 + \_edef\_out{\\376\\377}% + \_ea\_pdfunidefB#1^% text -> \_out in octal + \_ea + \_endgroup + \_ea\_def\_ea#1\_ea{\_out} +} +\_def\_pdfunidefB#1{% + \_ifx^#1\_else + \_tmpnum=`#1 + \_pdfunidefC{\_luaescapestring{#1}}% + \_ea\_pdfunidefB \_fi +} +\_def\_pdfunidefC #1{\_edef\_out{\_out \\\_ea\_octalprint\_ea{\_the\_tmpnum}{#1}}} + +\_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} + +\_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.). First one is PDFDocEncoding which is one-byte encoding, but most +Czech or Slovak characters are missing here. + +The second encoding is PDFunicode encoding wich is implemented in this file. +This encoding is \TeX/-discomfortable, because it looks like + +\begtt +\376\377\000C\000v\000i\001\015\000e\000n\000\355\000\040\000j\000e\000\040 +\000z\000\341\000t\001\033\001\176 +\endtt + +This example is real encoding of the string "Cvičení je zátěž". You can see +that this is UTF-16 encoding (two bytes per character) with two starting +bytes FEFF. Moreover, each byte is encoded by three octal digits preceded by +backslash. The only exception is the visible ASCII character encoding: such +a character is encoded by its real byte preceded by `\000`. + +The command \`\pdfunidef``\macro{string}` is implemented here +using `\directlua`. +The input string is preprocessed: detokenized, converted `\word /` to +`\word/` (used in logos) preprocessed spaces using \^`\replstring` and then the +\`\_pdfunidefB` is repeated on each character. It calls the `\directlua` chunk +to print octal numbers in the macro `\_octalprint`. + +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. + diff --git a/macros/luatex/optex/base/plain-macros.opm b/macros/luatex/optex/base/plain-macros.opm new file mode 100644 index 0000000000..f5c16ba3bd --- /dev/null +++ b/macros/luatex/optex/base/plain-macros.opm @@ -0,0 +1,339 @@ +%% This is part of 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=0pt \_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 to0pt{#1\_hss}} +\_def \_llap #1{\_hbox to0pt{\_hss#1}} +\_def\_underbar #1{$\_setbox0=\_hbox{#1}\_dp0=0pt \_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 of 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=0pt \_lineskip=.25ex + \_ialign{##\_crcr#1\_crcr}}} +\_def \_oalignA {\_lineskiplimit=0pt \_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 accents commands like `\v`, `\.`, `\H`, etc. are not defined. Use the + accented characters directly -- it is best solution. But you can use the + macro \`\oldaccents` which defines accented macros. + \nl + Much more usable is to define these control sequences to 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 last part of plain \TeX/ macros. + \`\hrulefill`, \`\dotfill`, \`\rightarrowfill`, \`\leftarrowfill`, + \`\magnification`, \`\bye`. + Math macros are defined in the `math-macros.opm` file. + \_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-$} + +\_public \hrulefill \dotfill \rightarrowfill \leftarrowfill ; + +% \downbracefill \upbracefill will be re-defined when Unicode-math is used +\_mathchardef \_braceld="37A \_mathchardef \_bracerd="37B +\_mathchardef \_bracelu="37C \_mathchardef \_braceru="37D +\_def \downbracefill {$\_math \_setbox0=\_hbox{$\_braceld$}% + \_braceld \_leaders\_vrule height\_ht0 depth0pt \_hfill \_braceru + \_bracelu \_leaders\_vrule height\_ht0 depth0pt \_hfill \_bracerd$} +\_def \upbracefill {$\_math \_setbox0=\_hbox{$\_braceld$}% + \_bracelu \_leaders\_vrule height\_ht0 depth0pt \_hfill \_bracerd + \_braceld \_leaders\_vrule height\_ht0 depth0pt \_hfill \_braceru$} + +\_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 \_end} +\_public \bye ; + +\_endcode % ------------------------------------- + diff --git a/macros/luatex/optex/base/prefixed.opm b/macros/luatex/optex/base/prefixed.opm new file mode 100644 index 0000000000..799cc923f9 --- /dev/null +++ b/macros/luatex/optex/base/prefixed.opm @@ -0,0 +1,275 @@ +%% This is part of 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 \_pkglabel _\_csstring #1\_endcsname} + +\_def \_private {\_xargs \_privateA} +\_def \_privateA #1{\_ea\_let \_csname \_pkglabel _\_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 one times. 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 \_expandafter \_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 macro \`\_namespace` `{<pkg label>}` for package writers, see + section~\ref[pkg-namespace]. + \_cod ----------------------------- + +\_def\_namespace #1{% + \_ifcsname namesp:#1\_endcsname \_errmessage + {The name space "#1" is used already, it cannot be used twice}% + \_endinput + \_else + \_ea \_gdef \_csname namesp:#1\_endcsname {}% + \_gdef \_pkglabel{_#1}% + \_directlua{ + callback.register("process_input_buffer", + function (str) + return string.gsub(str, "\_nbb[.]([a-zA-Z])", "\_nbb _#1_\_pcent 1") + end ) + }% + \_gdef \_endcode {% + \_ifmathsb \_mathsbon \_else \_mthsboff \_fi + \_gdef \_pkglabel{_#1}% + \_global \_let \_endcode=\_endinput + \_endinput }% + \_fi +} + +\_endcode %---------------------------------------------------- + + +\sec Concept of name spaces 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 user. + +\OpTeX/ sets the character `_` as 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 +\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 such 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 unprefixed variant of 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 +unprefixed variant. The code typically defines prefixed variant +and then the \^`\public` (or `\_public`) macro is used. + +\secc Name space of control sequences for users + +User 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 macro package writers. +* Control sequences (terminated by non-letter) in the form + `\<word>_` or `\<word>_<one-letter>`, where + <word> is a sequence of letters, are unaccessible, 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. User 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 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 protect 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 write repeatedly `\_pkg_foo` `\_pkg_bar` +etc.\ again and again in the macro file.\fnote +{We have not adatped 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 \^`\_endcode` command +or when another \^`\_namespace` is used. This command checks +if the same package label is not declared by the \^`\_namespace` twice. + +The \^`\public` macro does `\let\foo = \_<pkg>_foo` when +\^`\_namespace{<pkg>}` is declared. And the \^`\private` macro does reverse +operation to it. Example: you can define `\def\.macro{...}` and then +set it to the user name space by `\_public \macro;`. + +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 writting a macro file which is intended to be published for +\OpTeX/, then you are greatly welcome. You should follow these rules: + +\begitems +* Don't use a control sequences from user name space in the macro + bodies if there is not explicit and documented reason to do this. +* Don't declare control sequences in the user name space if there is not + explicit and documented reason to do this. +* Use control sequences from \OpTeX/ and primitive name space + in read only mode if there is not 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 a precedence before `.tex` when +the \^`\load` macro is used. + +The `qrcode.opm` is first example how an external macro file for \OpTeX/ +can look like. + diff --git a/macros/luatex/optex/base/ref-file.opm b/macros/luatex/optex/base/ref-file.opm new file mode 100644 index 0000000000..52ace30b8d --- /dev/null +++ b/macros/luatex/optex/base/ref-file.opm @@ -0,0 +1,137 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \openref {File for references <2020-02-14>} % 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 exists 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 dummy in + such case. + \_cod -------------------------- + +\_def\_wrefrelax#1#2{} +\_let\_wref=\_wrefrelax + + \_doc --------------------- + If a macro needs to ceate 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 to open the file again. + \_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{\_string##1##2}}% + \_immediate\_write\_reffile {\_pcent\_pcent\_space OPTeX <\_optexversion> - REF file (#1)}% + \_immediate\_wref \Xrefversion{{\_REFversion}}% +} +\def\openref{\_openref} + + \_doc ---------------------- + We are using convention that the macros used in `.ref` file are named + `\_X<foo>`. If there is a new version of \OpTeX/ with 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 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 different number of `<version>` form OPmac) here. + The result: OPmac skips the `.ref` files produced by \OpTeX/ and vice + versa. + \_cod ---------------------- + +\_def\_REFversion{3} % 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 catcode of `#` is 12 + because we needn't to 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 be 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 a title of the chapter (`<level>`=1, +`<type>`=`chap`), section (`<level>`=2, `<type>`=`sec`), subsection +(`<level>`=3, `<type>`=`secc`). The `\_Xpage` is written at begining 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 empty `test.ref` file in your directory. + diff --git a/macros/luatex/optex/base/references.opm b/macros/luatex/optex/base/references.opm new file mode 100644 index 0000000000..5aaf36a87a --- /dev/null +++ b/macros/luatex/optex/base/references.opm @@ -0,0 +1,86 @@ +%% This is part of 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 ---------------------------- + \`\_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 + \_edef\_tmp{{\_lastlabel}{#1}}% + \_ea\_wref \_ea\_Xlabel \_ea{\_tmp}% + \_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 backwarded 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 first run of \TeX/ and we print 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}\_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}\_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 to0pt{\_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/luatex/optex/base/sections.opm b/macros/luatex/optex/base/sections.opm new file mode 100644 index 0000000000..45a3e61d28 --- /dev/null +++ b/macros/luatex/optex/base/sections.opm @@ -0,0 +1,411 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \chap {Titles, chapters, sections, subsections <2020-03-28>} % 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 by `\eoldef`, it means that the parameter is + separated by end of line. The macros `\chap`, `\sec` and `\secc` use + `\eoldef` too. + \_cod --------------------------- + +\_eoldef\_tit #1{\_vglue\_titskip + {\_leftskip=0pt plus1fill \_rightskip=\_leftskip % centering + \_titfont \_noindent #1\_par}% + \_nobreak\_bigskip +} +\_public \tit ; + + \_doc --------------------------- + You can re-define \`\_printchap`, \`\_printsec` or \`\_printsecc` macros if + another design of section titles is needed. These macros gets 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 of such behavior: we don't want to duplicate vertical skip + and we don't want to use 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 of 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 label (if + \^`\label``[<label>]` precedes) and saves references for 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 to 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 + {\_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 + {\_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) + \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, figuers and display maths are numbered + from one in each section -- subsetions doesn'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.\_the\_secnum.\_the\_tnum} +\_def \_thefnum {\_othe\_chapnum.\_the\_secnum.\_the\_fnum} +\_def \_thednum {(\_the\_dnum)} + +\_def\_othe #1.{\_ifnum#1>0 \_the#1.\_fi} +\_def\_incr #1{\_global\_advance#1by1 } + + \_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 does the real work, + First, we read the optional parameter `[<label>]`, if it exists. + \_cod ---------------------------- + +\_optdef\_chap[]{\_trylabel \_inchap} +\_optdef\_sec []{\_trylabel \_insec} +\_optdef\_secc[]{\_trylabel \_insecc} +\_def\_trylabel{\_istoksempty\_opt\_iffalse \_label[\_the\_opt]\_fi} + +\_eoldef\_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{#1}% + \_resetnonumnotoc +} +\_eoldef\_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{#1}% + \_resetnonumnotoc +} +\_eoldef\_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{#1}% + \_resetnonumnotoc +} +\_public \chap \sec \secc ; + + \_doc ---------------------------- + The \`\_printrefnum``[<pre>@<post>]` macro is used in `\_print*` macros. + \nl + The \`\_wtotoc` `{<level>}{<info>}{<ref-num>}{<title-text>}` + macro expands its parameters and does \^`\_wref`. + + Note that the `<tite-text>` is `\detokenize`d before `\_wref`, so the + problem of \"fragile macros" from old \LaTeX/ never occurs. + \_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]% + \_wtotoc{\_the\_sectionlevel}{\_secinfo}% + {\_therefnum}{\_detokenize\_ea{\_savedtitle}}% + \_fi +} +\_def \_wtotoc #1#2#3#4{\_edef\_tmp{{#1}{#2}{#3}{#4}}\_ea\_wtotocA\_tmp} +\_def \_wtotocA #1#2#3#4{\_wref\_Xtoc{{#1}{#2}{#3}{#4}}} + + \_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 don'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 preceded) 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>0pt \_vskip-\_lastskip \_fi + \_ifnum\_lastpenalty=11333 \_vskip-\_savedtitleskip \_else #1\_fi + \_ifdim\_savedlastskip>0pt \_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 text (or titles), but space in toc or headlines or outlines. + \_cod ----------------------------- + +\_def\_nbpar{{\_interlinepenalty=10000\_endgraf}} + +\_protected\_def\_nl{\_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 user 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 \`\_insermark``{<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 \`\caption``/<letter>` uses `\_<letter>num` counter. + The group opened by `\caption` is finalized by first `\par` from + 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 nobreakable vertical space between 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}}% + \_ifcsname _everycaption\_tmpa\_endcsname + \_ea\_the \_csname _everycaption\_tmpa\_endcsname \_fi + \_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 + \_cod ----------------------------- + +\_def \_printcaptiont {% + \_noindent \_wlabel\_thecapnum {\_bf\_thecaptitle~\_thecapnum}\_enspace + \_narrowlastlinecentered\_iindent +} +\_let \_printcaptionf = \_printcaptiont % caption of figures = caption of tables + + \_doc ----------------------------- + The default format of `\caption` text is 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 +} + + \_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 \_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 % ------------------------------------- + +2020-04-28 \_secfonts etc: \_boldify is last. +2020-04-22 \_chapx, \_secx, \_seccx rewritten +2020-03-14 introduced diff --git a/macros/luatex/optex/base/slides.opm b/macros/luatex/optex/base/slides.opm new file mode 100644 index 0000000000..e25cc5ee7a --- /dev/null +++ b/macros/luatex/optex/base/slides.opm @@ -0,0 +1,219 @@ +% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \slideshow {Slides style for OpTeX <2020-03-19>} % 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 + +\_fontfam[Heros] +\_typosize[16/19] +\_famvardef\_ttfont{\_setfontsize{mag1.15}\_tt} +\_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 baseline of + `\footline` is 2\,mm from the bottom page. This is 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 trasparency is set by 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 nested level of items and `\pg+` is used then + `\egroups` macro expands to the right number of `\egroup`s + in order to close 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*{\_startitem} +\_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:.}{\_end} +\_sdef{_spg:+}{\_par} + + \_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\_decr#1{\_global\_advance#1 by-1 } + +\_def\_slideshow{\_slidelayer=1 \_slideshowactive \_setbox\_slidepage=\_vbox\_bgroup} + +\_def\_slideshowactive{% + \_sdef{_spg:;}{\_closepage \_global\_slidelayer=1 \_resetpage \_openslide} + \_sdef{_spg:.}{\_closepage \_end} + \_sdef{_spg:+}{\_closepage \_incr\_slidelayer \_decr\_pageno \_openslide} + \_def\bye {\_closepage \_end} + \_let\_layers=\_layersactive + \_def\_destbox[##1:##2]{\_isequal{##1}{ref}\_iffalse \_destboxori[##1:##2]\_fi}% +} +\_def\_openslide{\_setbox\_slidepage=\_vbox\_bgroup \_setilevel + \_ifvoid\_slidepage \_else \_unvbox\_slidepage \_nointerlineskip\_lastbox \_fi} +\_def\_setilevel{\_loop \_decr\_gilevel \_ifnum\_gilevel<0 \_else \_begitems \_repeat} + +\_def\_closepage{\_egroups + \_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\_egroup + \_gdef\_layertext{#2}% + \_global\_maxlayers=#1 + \_setbox\_slidepageB=\_vbox\_bgroup +} +\_public \subtit \slideshow \pg \wideformat \use \pshow ; + + \_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 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. + diff --git a/macros/luatex/optex/base/styles.opm b/macros/luatex/optex/base/styles.opm new file mode 100644 index 0000000000..a51f4e998d --- /dev/null +++ b/macros/luatex/optex/base/styles.opm @@ -0,0 +1,115 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \report {Basic styles of OpTeX <2020-03-28>} % 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 + \_input slides.opm +} +\_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 %--------------------------------------------------------------------- + diff --git a/macros/luatex/optex/base/table.opm b/macros/luatex/optex/base/table.opm new file mode 100644 index 0000000000..5fa252eeba --- /dev/null +++ b/macros/luatex/optex/base/table.opm @@ -0,0 +1,211 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \table {Basic macros for OpTeX <2020-04-10>} % 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 ----------------------------- + Categories (for example of `|` character) have to be normal when reading + `\table` parameters. + \_cod ----------------------------- + +\_def\_table{\_tablebox\_bgroup \_catcodetable\_optexcatcodes \_tableA} +\_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. + \_cod ----------------------------- + +\_def\_tableA#1{% + \_the\_thistable \_global\_thistable={}% + \_ea\_ifx\_ea^\_the\_tabstrut^\_setbox\_tstrutbox=\_null + \_else \_setbox\_tstrutbox=\_hbox{\_the\_tabstrut}% + \_setbox\_tstrutbox=\_hbox{\_vrule width0pt + height\_dimexpr\_ht\_tstrutbox+\_tablinespace + depth\_dimexpr\_dp\_tstrutbox+\_tablinespace}% + \_offinterlineskip + \_lineskip=-2\_tablinespace + \_fi + \_colnum=0 \_def\_tmpa{}\_tabdata={}\_scantabdata#1\_relax + \_the\_everytable \_tableB +} +\_def\_tableB#1{\_halign\_ea{\_the\_tabdata\_cr#1\_crcr}\_egroup} +\_newbox\_tstrutbox % strut used in table rows +\_newtoks\_tabdata % the \halign declaration line +\_newcount\_colnum % number of columns + + \_doc ----------------------------- + The \`\_scantabdata` converts `\table`'s `<declaration>` to + `\halign` `<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 teplate 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\_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 \_next +} +\_def\_scantabdataA#1{\_addtabitem \_ea\_addtabdata\_ea{#1\_tabstrutA}\_scantabdata} +\_def\_scantabdataB#1#2{\_addtabitem\_ea\_addtabdata\_ea{#1{#2}\_tabstrutA}\_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\_addtabitem{\_ifnum\_colnum>0 \_addtabdata{&}\_addto\_ddlinedata{&\_dditem}\_fi + \_advance\_colnum by1 \_let\_tmpa=\_relax} +\_def\_addtabdata#1{\_tabdata\_ea{\_the\_tabdata#1}} +\_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 `\def\_tabdeclare<letter>{...}` for a non-parametric + letter and by `\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. + All items are put in group because of `\aftergroup` can be used (from + `\localcolors` for example). + 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=0pt \_noindent##\_unsskip\_lower\_dp\_tstrutbox\_hbox{}}\_the\_tabitemr}} + + \_doc ----------------------------- + User puts optional spaces around the table item typically, i.\,e.\ he/she writes + `& text &` instead `&text&`. The left space is ignored by internal \TeX/ algorithm but + the right space must be removed by macros. This is a reason why we reccomend 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{\_ifdim\_lastskip>0pt \_unskip\_fi} + + \_doc ----------------------------- + The family of `\_cr*` macros + \`\crl`, \`\crll`, \`\crli`, \`\crlli`, \`\crlp` and + \`\tskip` `<dimen>` is implemented here. + The \`\_zerotabrule` is used in order 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 height0pt width0pt depth0pt}} + +\_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{,\_expandafter}\_expandafter\_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,\_expandafter\_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{\_global\_advance\_tmpnum by1 + \_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``[<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 \_tabdata={\_tabstrutA}\_let\_tmpa=\_relax \_afterassignment\_mspanA \_mscount=} +\_def\_mspanA[#1]#2{\_loop \_ifnum\_mscount>1 \_cs{_span}\_omit \_advance\_mscount-1 \_repeat + \_colnum=0 \_def\_tmpa{}\_tabdata={}\_scantabdata#1\_relax + \_setbox0=\_vbox{\_halign\_expandafter{\_the\_tabdata\_cr#2\_cr}\_global\_setbox8=\_lastbox}% + \_setbox0=\_hbox{\_unhbox8 \_unskip \_global\_setbox8=\_lastbox}% + \_unhbox8 \_ignorespaces} +\_public \mspan ; + + \_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 + overwriten 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 ; + +\_endcode % ------------------------------------- + +2020-04-10 second group for items in order to \localcolors diff --git a/macros/luatex/optex/base/uni-lcuc.opm b/macros/luatex/optex/base/uni-lcuc.opm new file mode 100644 index 0000000000..3ddf286011 --- /dev/null +++ b/macros/luatex/optex/base/uni-lcuc.opm @@ -0,0 +1,15944 @@ +%% This is part of 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 `\catocde`=12 for all codes above 127. + +The file `uni-lcuc.opm` does this work. It is not much intereting 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/luatex/optex/base/unimath-codes.opm b/macros/luatex/optex/base/unimath-codes.opm new file mode 100644 index 0000000000..4be18807d7 --- /dev/null +++ b/macros/luatex/optex/base/unimath-codes.opm @@ -0,0 +1,361 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \_ncharrmA {Uni math codes <2020-03-14>} % preloaded on demand by \loadmath + + \_doc ----------------------------- + The control sequences for `\alpha`, `\beta` etc are redefined here. + The `\alpha` expands to the charcter with unicode `"03B1`, this is 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` 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}\_ncharrmA \_umathrange{a-z}\_ncharrma} +\_protected\_def\_bfvariables {\_umathrange{A-Z}\_ncharbfA \_umathrange{a-z}\_ncharbfa} +\_protected\_def\_nitvariables {\_umathrange{A-Z}\_ncharitA \_umathrange{a-z}\_ncharita} +\_protected\_def\_bivariables {\_umathrange{A-Z}\_ncharbiA \_umathrange{a-z}\_ncharbia} +\_protected\_def\_calvariables {\_umathrange{A-Z}\_ncharclA \_umathrange{a-z}\_ncharcla} +\_protected\_def\_bcalvariables {\_umathrange{A-Z}\_ncharbcA \_umathrange{a-z}\_ncharbca} +\_protected\_def\_frakvariables {\_umathrange{A-Z}\_ncharfrA \_umathrange{a-z}\_ncharfra} +\_protected\_def\_bfrakvariables {\_umathrange{A-Z}\_ncharbrA \_umathrange{a-z}\_ncharbra} +\_protected\_def\_bbvariables {\_umathrange{A-Z}\_ncharbbA \_umathrange{a-z}\_ncharbba} +\_protected\_def\_sansvariables {\_umathrange{A-Z}\_ncharsnA \_umathrange{a-z}\_ncharsna} +\_protected\_def\_bsansvariables {\_umathrange{A-Z}\_ncharbsA \_umathrange{a-z}\_ncharbsa} +\_protected\_def\_isansvariables {\_umathrange{A-Z}\_ncharsiA \_umathrange{a-z}\_ncharsia} +\_protected\_def\_bisansvariables {\_umathrange{A-Z}\_ncharsxA \_umathrange{a-z}\_ncharsxa} +\_protected\_def\_ttvariables {\_umathrange{A-Z}\_ncharttA \_umathrange{a-z}\_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\_nitgreek {\_umathrangeGREEK\_greekrmA \_umathrangegreek\_greekita} +\_protected\_def\_rmgreek {\_umathrangeGREEK\_greekrmA \_umathrangegreek\_greekrma} +\_protected\_def\_bfgreek {\_umathrangeGREEK\_greekbfA \_umathrangegreek\_greekbfa} +\_protected\_def\_bigreek {\_umathrangeGREEK\_greekbfA \_umathrangegreek\_greekbia} +\_protected\_def\_sansgreek {\_umathrangeGREEK\_greeksnA \_umathrangegreek\_greeksna} +\_protected\_def\_isansgreek {\_umathrangeGREEK\_greeksnA \_umathrangegreek\_greeksia} + +% Another possibility (slanted capitals in \_nitgreek, \_bigreek, \_isansgreek): +%\_protected\_def\_nitgreek {\_umathrangeGREEK\_greekitA \_umathrangegreek\_greekita} +%\_protected\_def\_rmgreek {\_umathrangeGREEK\_greekrmA \_umathrangegreek\_greekrma} +%\_protected\_def\_bfgreek {\_umathrangeGREEK\_greekbfA \_umathrangegreek\_greekbfa} +%\_protected\_def\_bigreek {\_umathrangeGREEK\_greekbiA \_umathrangegreek\_greekbia} +%\_protected\_def\_sansgreek {\_umathrangeGREEK\_greeksnA \_umathrangegreek\_greeksna} +%\_protected\_def\_isansgreek {\_umathrangeGREEK\_greeksiA \_umathrangegreek\_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}\_digitrmO} +\_protected\_def\_bfdigits {\_umathrange{0-9}\_digitbfO} +\_protected\_def\_bbdigits {\_umathrange{0-9}\_digitbbO} +\_protected\_def\_sansdigits {\_umathrange{0-9}\_digitsnO} +\_protected\_def\_bsansdigits {\_umathrange{0-9}\_digitbsO} +\_protected\_def\_ttdigits {\_umathrange{0-9}\_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\_bfdigits}} + \_protected\_def\_bi {\_tryloadbi\_tenbi \_inmath{\_bivariables\_bigreek\_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 upgright lowercase greek letters, you don't need +% \bf and \bi behaves as sans serif in math, ... + +\_protected\_def\_rm {\_tryloadrm \_tenrm \_inmath{\_rmvariables \_rmdigits}} +\_protected\_def\_it {\_tryloadit \_tenit \_inmath{\_nitvariables}} +\_protected\_def\_bf {\_tryloadbf \_tenbf \_inmath{\_bsansvariables \_sansgreek \_bsansdigits}} +\_protected\_def\_bi {\_tryloadbi \_tenbi \_inmath{\_bisansvariables \_isansgreek \_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 \_isansgreek \_sansdigits} +\_protected\_def\_mbisans {\_bisansvariables \_isansgreek \_bsansdigits} +\_protected\_def\_script {\_rmvariables \_fam4 } + +\_public \rm \it \bf \bi \tt \bbchar \cal \frak \misans \mbisans \script ; + + \_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} + \_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 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{% + \_global\_Umathcharnumdef#2=\_Umathcodenum#1\_relax + \_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 + +\_nitgreek \_nitvariables \_rmdigits % default setting + +\_Umathcode `- = 2 1 "2212 +%\_Umathcode`: = 3 1 "3A % mathclass defines it as 6 1 "3A (punctuation) +\_let\{=\lbrace \_let\}=\rbrace + +\_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 + + \_doc ----------------------------- + Aliases are declared here. They are names not menitioned in the `unimath-table.opm` file + but commonly used in \TeX. + \_cod ----------------------------- + +\_let \setminus=\smallsetminus +\_let \diamond=\smwhtdiamond +\_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 \longdivision=\longdivisionsign +\_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. + \_cod ----------------------------- + +\_protected\_def\_not#1{% + \_ifcsname _not!\_csstring#1\_endcsname \_csname _not!\_csstring#1\_endcsname + \_else \_mathrel{\_mathord{\_rlap{\_kern1pt/}}\_mathord{#1}}% + \_fi +} +\_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 + +\_public \not ; + + \_doc ----------------------------- + Newly declared public control sequences are used in internal macros by + \OpTeX/. We need to get new meanings of these control sequences in + private name space. + \_cod ----------------------------- + +\_private + \ldotp \cdotp \bullet \triangleleft \trianglerigt \mapstochar \rightarrow + \prime \lhook \rightarrow \leftarrow \rhook \triangleright \triangleleft + \Relbar \Rightarrow \relbar \rightarrow \Leftarrow \mapstochar + \longrightarrow \Longleftrightarrow \vdots \ddots ; + +\_endcode + +\secc A few observations + +You can combine more fonts in math, if you register them to another +math families (5, 6, 7, etc.) in the \^`\normalmath` macro. + +The default value of \^`\normalmath` shows a combination of base Unicode Math +font with 8bit Math font at family 4. See definition of the `\script` macro where +`\fam4` is used. Of course, we need to set `\rmvariables` too, because 8bit font +accepts only codes less than 255. + +XITSmath-bold needs correction: the norm symbol ||x|| is missing here. So, you +can define: + +\begtt +\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 + +\_endinput + +History: +2020-04-30 Bug fix: \phi, \varpi etc. were bad encoded +2020-04-09 Bug fix: \Udelcode`<, \Udelcode`> added diff --git a/macros/luatex/optex/base/unimath-table.opm b/macros/luatex/optex/base/unimath-table.opm new file mode 100644 index 0000000000..511b67e8ce --- /dev/null +++ b/macros/luatex/optex/base/unimath-table.opm @@ -0,0 +1,2467 @@ +%%^^A%% unicode-math-table.tex -- part of UNICODE-MATH <wspr.io/unicode-math> +%%^^A%% Source file of the math symbols. + +\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 }{\mathord}{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}{\vdots }{\mathrel}{vertical ellipsis}% +\UnicodeMathSymbol{"022EF}{\unicodecdots }{\mathord}{three dots, centered}% +\UnicodeMathSymbol{"022F0}{\adots }{\mathrel}{three dots, ascending}% +\UnicodeMathSymbol{"022F1}{\ddots }{\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/luatex/optex/base/usebib.opm b/macros/luatex/optex/base/usebib.opm new file mode 100644 index 0000000000..33ac47b575 --- /dev/null +++ b/macros/luatex/optex/base/usebib.opm @@ -0,0 +1,351 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \MakeReference {Reading bib databases <2020-03-13>} % loaded on demand by \usebib + + \_doc ----------------------------- + Loading the `librarian.tex` macro package. See `texdoc librarian` + for more information about it. + \_cod ----------------------------- + +\_def\_tmp{} +\_let\_errmessageori=\_errmessage % we needn't \errmessage during \input librarian +\_def\_errmessage#1{\_def\_tmp{error}} +\_let\_newwriteori=\_newwrite % we need not to create \jobname.lbr: +\_def\_newwrite#1{\_csname lb@restoreat\_endcsname \_endinput} +\_def\_tmpb{\_catcode`\_=12 \_input librarian \_catcode`\_=11 }\_tmpb +\_let\_errmessage=\_errmessageori +\_let\_newwrite=\_newwriteori +\_ifx\_tmp\_empty\_else + \_def\_usebib/#1 (#2) #3 {% + \_opwarning{eTeX and (pdfTeX or XeTeX or LuaTeX) not detected}% + \_immediate\_write16{\_space\_space + But librarian package needs it. \_noexpand\usebib ignored.}% + } + \_endinput \_fi +\_private \BibFile \ReadList \SortList \SortingOrder \NameCount \AbbreviateFirstname + \CreateField \RetrieveFieldInFor \RetrieveFieldIn ; + + \_doc ----------------------------- + The `\usebib` command. + \_cod ----------------------------- + +\_def\_usebib/#1 (#2) #3 {% + \_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 + \_input bib-#2.opm + \_the \_bibtexhook + \_let\_citeI=\_relax \_xdef\_citelist{\_citelist\_citelistB}% + \_global\_let\_addcitelist=\_writeXcite + \_def\_tmp##1[*]##2\_relax{\_def\_tmp{##2}}\_expandafter\_tmp\_citelist[*]\_relax + \_ifx\_tmp\_empty\_else % there was \nocite[*] used. + \_setbox0=\_vbox{\_hsize=\_maxdimen \_def\_citelist{}\_adef@{\_readbibentry}% + \_input #3.bib + \_expandafter}\_expandafter\_def\_expandafter\_citelist\_expandafter{\_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 +} +\_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 file(s)}}% + \_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 every 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 + multilinguas. + \_cod ----------------------------- + +\_def\_bibwarning{\_opwarning{Missing field "\_bibfieldname" in [\EntryKey]}} + +\_def\_mtdef#1#2#3#4{\_sdef{_mt:#1:en}{#2} \_sdef{_mt:#1:cs}{#3} + \_if$#4$\_slet{_mt:#1:sk}{_mt:#1:cs} + \_else \_sdef{_mt:#1:sk}{#4} + \_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 +bibliographics references (only those declared by by `\cite[]` or +`\nocite[]` in the text). The formatting of such references is defined in the style +file. The usage is mentioned in user documentation too. + +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 an exceptions in your +`local.bib` file for your document. + +\seccc Notes for style writers + +The `bib-<style>.opm` file must define the commands: + +\begitems +* `\_authorname` ... formatting of one name in the authors list. The macro can + use the following data: `\_NameCount` (the number of the currently + processed author name in the list), `0\_namecount` (the total number of the + authors in the list), `\_Lastname`, `\_Firstname`, `\_Von`, `\_Junior` + (the parts of the name). See the documentation of the librarian package + for more info. +* `\_editorname` ... the same as `\_authorname`, but for editors list. +* `_print:<entrytype>` (defined by `\_sdef`) for formatting the entry of `<entrytype>`. + The `<entrytype>` have to be lowercase. This command can use the command: +* `\_bprinta [<fieldname>] {<if defined>} {<if not defined>}`. The part <if defined> + is executed if <fieldname> 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 <fieldname>. The part <if not defined> can include + the `\_bibwarning` command if the <fieldname> is mandatory. +* `\_bprintb [<fieldname>] {<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 `####1` parameter for internal `\_bprintb`. + But if `\_bprinta` commands are nested then the parameter is not duplicated. +* `\_pbprintc \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 parameter. +\enditems +% +There are two special fieldnames: `!author` and `!editor`. The processed list of +authors or editors (by repeatedly calling `\_authorname` or `\_editorname`) are +used here insted of raw data. + +You can define `_print:BEGIN` and/or `_print:END` which is executed at the begin or +end of each `<entrytype>`. 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). + +You can declare `\_bimark={something}` in the `_print:END` macro. This bibmark is +saved to the `.ref` file (created by \OpTeX/) and used in the next \TeX/ run as +`\cite` marks when `\nonumcitations` is set. + +The whole style file is read in the group during `\usebib` command is executed +before typesetting the reference list. Each definition or setting is local +here. + +If you are using non-standard fieldnames in .bib database and bib. style, +you has to declare them by `\_CreateField {<fieldname>}`. + +You can declare `\_SortingOrder` in the manner documented by librarian package. + +If your style adds some words or abbreviations you can make them +multilingual by saying `\_mtext{<label>}` instead such word and +`\_mtdef{<label>} {<English>} {<Czech>} {<Slovak>}` declaration. +The right part is printed by current value of the `\language` regiter. +You can add more languages by re-defining the `\_mtdef` command. +See the section \ref[langphrases] for more information. + +If you are using `\nonumcitations`, then the `\_bibmark` tokens register have to be +prepared in the style file (in `_print:BEGIN`, `_print:END`, in +`\_authorname` etc.) This value will be used in the `\cite[]` places +in the document. + +The example of the style file is in `bib-simple.opm`. + +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 autocitations before other citations, +then you can mark your entries in `.bib` file by `sortedby = "@"`, because this +character is sorted before `A`. + +\_endinput + +History: +-------- + +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/luatex/optex/base/verbatim.opm b/macros/luatex/optex/base/verbatim.opm new file mode 100644 index 0000000000..ba2cf93dab --- /dev/null +++ b/macros/luatex/optex/base/verbatim.opm @@ -0,0 +1,267 @@ +%% This is part of OpTeX project, see http://petr.olsak.net/optex + +\_codedecl \begtt {Verbatim <2020-04-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 ---------------------------- + \`\activettchar``<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 charater 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 `\activettchar"` 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\_activettchar#1{% + \_ifx\_savedttchar\_undefined\_else \_catcode\_savedttchar=\_savedttcharc \_fi + \_chardef\_savedttchar=`#1 + \_chardef\_savedttcharc=\_catcode`#1 + \_adef{#1}{\_begingroup \_setverb \_adef{ }{\ }\_ttfont \_the\_everyintt\_relax \_readverb}% + \_def\_readverb ##1#1{\_printinverbatim{##1}\_endgroup}% +} +\_public \activettchar ; + + \_doc ---------------------------- + \`\begtt` is defined only as public. We don't need private `\_begtt` variant. + This macro is defined by `\eoldef`, so user can put a parameter at the + same line where `\begtt` is. This `#1` parameter is used after `\_everytt` + parameters settings, so user can change them locally. + + The `\begtt` macro opens group, 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 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. + + The `\_printverb` macro calls \`\_printverbline``{<line>}` to each scanned line of + verbatim text. This macro expect that it strarts in vertical mode and it must + do `\par` in order 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`. + \_cod ---------------------------- + +\_eoldef \begtt#1{\_par \_wipeepar + \_vskip\_parskip \_ttskip + \_begingroup + \_setverb + \_ifnum\_ttline<0 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi + \_adef{ }{\ }\_adef\^^I{\t}\_parindent=\_ttindent \_parskip=0pt + \_def\t{\_hskip \_dimexpr\_tabspaces em/2\_relax}% + \_the\_everytt \_relax #1\_relax \_ttfont + \_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\_printverb #1^^J#2{\_ifx\_end#2 + \_bgroup \_adef{ }{}\_def\t{}% + \_ifcat&\_egroup \_else\_egroup \_printverbline{#1}\_fi + \_else + \_printverbline{#1}% + \_ea \_printverb \_ea #2% + \_fi +} +\_def\_prepareverbdata#1#2{\_def#1{#2}} +\_def\_printverbline#1{\_penalty \_ttpenalty + \_indent \_printverblinenum \_kern\_ttshift #1\par} +\_def\_initverblinenum{\_tenrm \_thefontscale[700]\_ea\_let\_ea\_sevenrm\_the\_font} +\_def\_printverblinenum{\_global\_advance\_ttline by1 \_llap{\_sevenrm \_the\_ttline\_kern.9em}} + + \_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 begining 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. + 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{\_noexpand\verbinput - file "#3" is unable to reading} + \_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 + \_begingroup + \_ifnum\_ttline<-1 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi + \_setverb \_adef{ }{\ }\_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}% + \_ea\_printverb \_tmpb\_end + \_global\_ttlinesave + \_par + \_endgroup + \_ttskip + \_isnextchar\_par{}{\_noindent}% +} +\_def\_vireadline{\_read\_vifile to \_tmp \_global\_advance\_viline by1 } +\_def\_visaveline{\_ea\_addto\_ea\_tmpb\_ea{\_tmp}} + +\_public \verbinput ; + + \_doc ----------------------------- + The \`\visiblesp` sets spaces as visible characters \char9251. + It redefines {\visiblesp`\ `} primitive, so it is useful for verbatim modes only. + \_cod ----------------------------- + +\_def \_visiblesp{\_ifx\_initunifonts\_relax \_def\ {\_char9251 }% + \_else \_def\ {\_char32 }\_fi} + +\_public \visiblesp ; + +\_endcode + +\_endinput + +History: +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. |