summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r--Master/texmf-dist/tex/luatex/optex/basics-macros.opm54
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-adventor.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-antt.opm10
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-baskerville.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-bonum.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-cursor.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-gfsbodoni.opm6
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-heros.opm34
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-libertine-s.opm10
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-libertine.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-lido.opm52
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-lmfonts.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-pagella.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-schola.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-technika.opm10
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-termes.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/f-xcharter.opm7
-rw-r--r--Master/texmf-dist/tex/luatex/optex/fams-ini.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/fonts-catalog.opm40
-rw-r--r--Master/texmf-dist/tex/luatex/optex/fonts-opmac.opm88
-rw-r--r--Master/texmf-dist/tex/luatex/optex/fonts-resize.opm3
-rw-r--r--Master/texmf-dist/tex/luatex/optex/fonts-select.opm246
-rw-r--r--Master/texmf-dist/tex/luatex/optex/hyperlinks.opm137
-rw-r--r--Master/texmf-dist/tex/luatex/optex/if-macros.opm112
-rw-r--r--Master/texmf-dist/tex/luatex/optex/luatex-ini.opm4
-rw-r--r--Master/texmf-dist/tex/luatex/optex/maketoc.opm92
-rw-r--r--Master/texmf-dist/tex/luatex/optex/math-macros.opm78
-rw-r--r--Master/texmf-dist/tex/luatex/optex/math-preload.opm5
-rw-r--r--Master/texmf-dist/tex/luatex/optex/math-unicode.opm107
-rw-r--r--Master/texmf-dist/tex/luatex/optex/op-macros.opm15
-rw-r--r--Master/texmf-dist/tex/luatex/optex/opmac-rest.opm322
-rw-r--r--Master/texmf-dist/tex/luatex/optex/optex.ini8
-rw-r--r--Master/texmf-dist/tex/luatex/optex/outlines.opm87
-rw-r--r--Master/texmf-dist/tex/luatex/optex/output.opm31
-rw-r--r--Master/texmf-dist/tex/luatex/optex/pdfuni-string.opm22
-rw-r--r--Master/texmf-dist/tex/luatex/optex/prefixed.opm2
-rw-r--r--Master/texmf-dist/tex/luatex/optex/ref-file.opm61
-rw-r--r--Master/texmf-dist/tex/luatex/optex/references.opm113
-rw-r--r--Master/texmf-dist/tex/luatex/optex/unimath-codes.opm479
-rw-r--r--Master/texmf-dist/tex/luatex/optex/verbatim.opm265
40 files changed, 1559 insertions, 981 deletions
diff --git a/Master/texmf-dist/tex/luatex/optex/basics-macros.opm b/Master/texmf-dist/tex/luatex/optex/basics-macros.opm
index 638270d38b5..9f87f27c832 100644
--- a/Master/texmf-dist/tex/luatex/optex/basics-macros.opm
+++ b/Master/texmf-dist/tex/luatex/optex/basics-macros.opm
@@ -4,37 +4,63 @@
\let\_bgroup={ \let\_egroup=}
-\_bgroup \_lccode`\.=`\\ \_lowercase{\_egroup \_def\_nbackslash {.}}
-\_edef \_nbb {\_nbackslash\_nbackslash}
-\_edef \_pcent{\_csstring\%}
\_def \_empty {}
\_def \_space { }
\_def \_null {\_hbox{}}
\_def \_wlog {\_immediate\_write-1 } % write on log file (only)
-\_def \_opwarning #1{\_wterm{WARNING: #1.}}
+
+\_edef\_bslash {\_csstring\\}
+\_edef \_nbb {\_bslash\_bslash}
+\_edef \_pcent{\_csstring\%}
\_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}
\_def \_adef #1{\_catcode`#1=13 \_begingroup \_lccode`\~=`#1\_lowercase{\_endgroup\_def~}}
\_def \_cs #1{\_csname#1\_endcsname}
-
\_long\_def \_addto #1#2{\_ea\_def\_ea#1\_ea{#1#2}}
+\_def \_opwarning #1{\_wterm{WARNING: #1.}}
-\_def\_loggingall{\_tracingcommands=3 \tracingstats=2 \tracingassigns=1
- \tracingpages=1 \tracingoutput=1 \tracinglostchars=1
- \tracingmacros=2 \tracingparagraphs=1 \tracingrestores=1 }
-\_def\_tracingall{\tracingonline=1 \loggingall}
-
-\_def\_remfirstunderscore#1{\_ea\_remfirstunderscoreA#1\_relax#1}
-\_def\_remfirstunderscoreA#1#2\_relax#3{\_if _#1\_def#3{#2}\_fi}
+\_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
- \bgroup \egroup \nbackslash
- \empty \space \null \nbb \pcent \ncaret
+ \bgroup \egroup \empty \space \null \wlog
+ \bslash \nbb \pcent
\sdef \sxdef \slet \cs \adef
\addto \wlog \opwarning
\loggingall \tracingall ;
\_endcode % -------------------------------------
+`\bgroup`, `\egroup`, `\empty`, `\space`, `\null` and `\wlog` are classical
+macros from plain \TeX/.
+
+`\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.
+
+`\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{\}}.
+
+`\sxdef{<text>}` is equivalent to `\xdef\<text>`.
+
+`\slet{<textA>}{<textB>}` is equivalent to `\let \<textA> = \<textB>`.
+
+`\adef{<char>}{<body>}` puts the <char> as active character and defines it
+as {<body>}. You can use parameter mask too.
+
+`\cs{<text>}` is only a shortcut to `\csname <text>\endcsname`, but you need
+one more `\ea` if you need to ger the real control sequence `\<text>`.
+
+`\addto\macro{<text>}` adds <text> to your `\macro`, which must be defined.
+
+`\opwarning{<text>}` prints warning on the terminal and to the log file.
+
+`\loggingall` and `\tracingall` is similar as in plain \TeX/, but prints
+more logging information to the log file and to the terminal.
+
diff --git a/Master/texmf-dist/tex/luatex/optex/f-adventor.opm b/Master/texmf-dist/tex/luatex/optex/f-adventor.opm
index 93afbee7876..022b14a1de6 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-adventor.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-adventor.opm
@@ -2,7 +2,7 @@
\_fontdecl [Adventor] \Adventor {TeX Gyre Adventor based on Avantgarde Book}
{\caps} {\rm \bf \it \bi} {}
- "[texgyreadventor-regular]"
+ {[texgyreadventor-regular]}
\_wlog{\_detokenize{%
Modifier:^^J
@@ -11,7 +11,7 @@ Modifier:^^J
\_protected\_def \Adventor {%
\_def \_currfamily {Adventor}%
- \_def \_fontnamegen {"[texgyreadventor-\_currV]:\_capsV\_fontfeatures"}%
+ \_def \_fontnamegen {[texgyreadventor-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-antt.opm b/Master/texmf-dist/tex/luatex/optex/f-antt.opm
index efbdb9a1d68..d7015ed28db 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-antt.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-antt.opm
@@ -2,16 +2,20 @@
\_fontdecl [Antykwa Torunska] \Antt {Traditional Polish font family}
{\cond \medium \light \caps} {\rm \bf \it \bi} {Pagella}
- "[AntykwaTorunska-Regular]"
+ {[AntykwaTorunska-Regular]}
\_wlog{\_detokenize{%
-Modifier:^^J
+Modifiers:^^J
\caps ...... caps & small caps^^J
+ \cond ...... condensed^^J
+ \medium .... medium weight^^J
+ \light ..... light weight^^J
+ \cond ...... condensed^^J
}}
\_protected\def \Antt {%
\_def \_currfamily {Antt}%
- \_def \_fontnamegen {"[AntykwaTorunska\_sfamxV\_sfamyV-\_currV]:\_capsV\_fontfeatures"}%
+ \_def \_fontnamegen {[AntykwaTorunska\_sfamxV\_sfamyV-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV sfamx={},sfamy={},caps={} \_fvars Regular Bold Italic BoldItalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-baskerville.opm b/Master/texmf-dist/tex/luatex/optex/f-baskerville.opm
index c493f7e0b57..a81e97f6398 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-baskerville.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-baskerville.opm
@@ -2,7 +2,7 @@
\_fontdecl [Baskerville] \Baskerville {Free vaiants of classical Baskerville}
{\caps} {\rm \bf \it \bi} {}
- "[BaskervilleF-Regular]"
+ {[BaskervilleF-Regular]}
\_wlog{\_detokenize{%
Modifier:^^J
@@ -11,7 +11,7 @@ Modifier:^^J
\_protected\def \Baskerville {%
\_def \_currfamily {Baskerville}%
- \_def \_fontnamegen {"[BaskervilleF-\_currV]:\_capsV\_fontfeatures"}%
+ \_def \_fontnamegen {[BaskervilleF-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV caps={} \_fvars Regular Bold Italic BoldItalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-bonum.opm b/Master/texmf-dist/tex/luatex/optex/f-bonum.opm
index e1fc78680bd..6c163ce7cbe 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-bonum.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-bonum.opm
@@ -2,7 +2,7 @@
\_fontdecl [Bonum] \Bonum {TeX Gyre Bonum fonts based on Bookman}
{\caps} {\rm \bf \it \bi} {Bonum}
- "[texgyrebonum-regular]"
+ {[texgyrebonum-regular]}
\_wlog{\_detokenize{%
Modifier:^^J
@@ -11,7 +11,7 @@ Modifier:^^J
\_protected\def \Bonum {%
\_def \_currfamily {Bonum}%
- \_def \_fontnamegen {"[texgyrebonum-\_currV]:\_capsV\_fontfeatures"}%
+ \_def \_fontnamegen {[texgyrebonum-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-cursor.opm b/Master/texmf-dist/tex/luatex/optex/f-cursor.opm
index b89a4a74119..0774a6d0b9b 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-cursor.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-cursor.opm
@@ -2,7 +2,7 @@
\_fontdecl [Cursor] \Cursor {TeX Gyre Cursor fonts based on Courier}
{\caps} {\rm \bf \it \bi} {}
- "[texgyrecursor-regular]"
+ {[texgyrecursor-regular]}
\_wlog{\_detokenize{%
Modifier:^^J
@@ -11,7 +11,7 @@ Modifier:^^J
\_protected\def \Cursor {%
\_def \_currfamily {Cursor}%
- \_def \_fontnamegen {"[texgyrecursor-\_currV]:\_capsV\_fontfeatures"}%
+ \_def \_fontnamegen {[texgyrecursor-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-gfsbodoni.opm b/Master/texmf-dist/tex/luatex/optex/f-gfsbodoni.opm
index 7afbe001cce..4b743e07252 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-gfsbodoni.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-gfsbodoni.opm
@@ -2,16 +2,16 @@
\_fontdecl [GFS Bodoni] \GFSBodoni {Based on Bodoni with greek letters}
{} {\rm \bf \it \bi} {}
- "[GFSBodoni]"
+ {[GFSBodoni]}
\_wlog{\_detokenize{%
Modifier:^^J
- \caps ...... doesn't work even though otfinfo -f lists cmcp^^J
+ \caps ...... doesn't work even though otfinfo -f lists smcp^^J
}}
\_protected\def \GFSBodoni {%
\_def \_currfamily {GFSBodoni}%
- \_def \_fontnamegen {"[GFSBodoni\_currV]:\_fontfeatures"}%
+ \_def \_fontnamegen {[GFSBodoni\_currV]:\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fvars {} Bold It BoldIt }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-heros.opm b/Master/texmf-dist/tex/luatex/optex/f-heros.opm
index 6bea7a2642c..5a03746cae2 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-heros.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-heros.opm
@@ -2,7 +2,7 @@
\_fontdecl [Heros] \Heros {TeX Gyre Heros fonts based on Helvetica}
{\caps \cond} {\rm \bf \it \bi} {FiraMath}
- "[texgyreheros-regular]"
+ {[texgyreheros-regular]}
\_wlog{\_detokenize{%
Modifiers:^^J
@@ -12,7 +12,7 @@ Modifiers:^^J
\_protected\_def \Heros {%
\_def \_currfamily {Heros}%
- \_def \_fontnamegen {"[texgyreheros\_condV-\_currV]:\_capsV\_fontfeatures"}%
+ \_def \_fontnamegen {[texgyreheros\_condV-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV caps={},cond={} \_fvars regular bold italic bolditalic }
@@ -45,7 +45,7 @@ rules.
\begtt
\_fontdecl [<Name of family>] \<Main-command> {<comments>}
{<modifiers>} {<variant selectors>} {<comments about math fonts>}
- "<font-for-testing>"
+ {<font-for-testing>}
\endtt
as first command in this file. This writes information about font family at
terminal and prevents loading such file twice. Moreover, it probes
@@ -84,27 +84,31 @@ name) and to optional fontfeatures appended. The font selection
system uses this macro at primitive level in the following sense:
\begtt
- \font \_fontnamegen \space \_sizespec
+ \font {\_fontnamegen} \_sizespec
\endtt
For example, using macros from `f-heros.opm` the `\font` command expands its
parameters to:
\begtt
- \font "[texgyreheros-regular]:+tlig;" at10pt
+ \font {[texgyreheros-regular]:+tlig;} at10pt
\endtt
if the `\rm` variant is processed and if no additional font modifiers are
activated. Of course, you need to know something about fontname syntax for
-extended `\font` primitive used with OTF fonts. The `"` characters are at
-outside boundary of font name. The `[` `]` brackets tell us that the file
-name (no font name) is specified inside such brackets. This file (with
-additional `.otf` extension) must be accessible in your filesystem. Without
-spaces, there are font features appended to file name (or font name) divided
-by semicolon. The `+tlig` font feature means that TeX like ligatures
-(minus minus = endash, for example) are active. Normal ligatures are active
-by default. You can list font features of given font by
-`otfinfo -f fontfile.otf`.
+extended `\font` primitive used with OTF fonts. The `[` `]` brackets tell us
+that the file name (no font name) is specified inside such brackets. This
+file (with additional `.otf` or `.ttf` extension) must be accessible by
+Lua\TeX/ in your filesystem. Without spaces, there are font features
+appended to file name (or font name) divided by semicolon. The `+tlig` font
+feature means that TeX like ligatures (minus minus = endash, for example)
+are active. Normal ligatures are active by default. You can list font
+features of given font by `otfinfo -f fontfile.otf`.
+
+The `\_fontnamegen` macro must include colon followed by family dependent
+font features (optional) and followed by `\_fontfeatures` (required).
+If this is not true then font modifiers `\setff`, `\setfontcolor`,
+`\setletterspace` and `\setwordspace` don't work.
You can use any expandable macros or expandable primitives in `\fontnamegen`
macro. The simple macros in it with names `\_<word>V` are preferred. They
@@ -136,7 +140,7 @@ Example: if both modifiers `\caps` and `\cond` were applied from this family
Heros and `\bf` variant is needed at 11pt then
\begtt
- \font "[texgyreheroscn-bold]:+smcp;+tlig;" at11pt
+ \font {[texgyreheroscn-bold]:+smcp;+tlig;} at11pt
\endtt
is processed. We assume that a font file texgyreheroscn-bold.otf is present
diff --git a/Master/texmf-dist/tex/luatex/optex/f-libertine-s.opm b/Master/texmf-dist/tex/luatex/optex/f-libertine-s.opm
index 1eb2933faa6..123585dac71 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-libertine-s.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-libertine-s.opm
@@ -1,8 +1,8 @@
%% This is part of OpTeX project, see http://petr.olsak.net/optex
-\_fontdecl [Linux Libertine] \libertine {Free Linux Libertine fonts}
+\_fontdecl [Linux Libertine] \Libertine {Free Linux Libertine fonts}
{\sans \mono \caps} {\rm \bf \it \bi \initials \displ \keybr} {}
- "Linux Libertine O"
+ {Linux Libertine O}
\_wlog{\_detokenize{%
Modifiers^^J
@@ -15,9 +15,9 @@ Special variants:^^J
\keybr ..... keyboard, emulates keyboard buttons^^J
}}
-\_protected\_def \_libertine {%
- \_def \_currfamily {libertine}%
- \_def\_fontnamegen {"Linux \_mainfamV\_V\_subfamV O/\_currV:\_capsV\_fontfeatures"}%
+\_protected\_def \Libertine {%
+ \_def \_currfamily {Libertine}%
+ \_def\_fontnamegen {Linux \_mainfamV\_V\_subfamV O/\_currV:\_capsV\_fontfeatures}%
\_resetmod
}
diff --git a/Master/texmf-dist/tex/luatex/optex/f-libertine.opm b/Master/texmf-dist/tex/luatex/optex/f-libertine.opm
index adc0961f7a7..041e3742f08 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-libertine.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-libertine.opm
@@ -2,7 +2,7 @@
\_fontdecl [Linux Libertine] \Libertine {Free Linux Libertine fonts}
{\sans \mono \caps \semi} {\rm \bf \it \bi \initials \displ \keybr} {Libertinus}
- "[LinLibertine_R]"
+ {[LinLibertine_R]}
\_wlog{\_detokenize{%
Modifiers:^^J
@@ -18,7 +18,7 @@ Special variants:^^J
\_protected\_def \Libertine {%
\_def \_currfamily {Libertine}%
- \_def\_fontnamegen {"[Lin\_subfamV _\_currV]:\_capsV\_fontfeatures"}%
+ \_def\_fontnamegen {[Lin\_subfamV _\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV subfam=Libertine,caps={} \_fvars R RB RI RBI }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-lido.opm b/Master/texmf-dist/tex/luatex/optex/f-lido.opm
new file mode 100644
index 00000000000..e082663125d
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/optex/f-lido.opm
@@ -0,0 +1,52 @@
+%% This is part of OpTeX project, see http://petr.olsak.net/optex
+
+\_fontdecl [Lido] \Lido {by StormType Foundry designed for "lidove noviny"}
+ {\caps \cond} {\rm \bf \mr \mi \it \bi} {Termes}
+ {[LidoSTF]}
+
+\_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
+}}
+
+\_protected\def \Lido {%
+ \_def \_currfamily {Lido}%
+ \_def \_fontnamegen {[LidoSTF\_condV\_currV]:\_capsV\_fontfeatures}%
+ \_resetmod
+}
+\_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/Master/texmf-dist/tex/luatex/optex/f-lmfonts.opm b/Master/texmf-dist/tex/luatex/optex/f-lmfonts.opm
index 5be1362b0b0..7a7c7527afe 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-lmfonts.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-lmfonts.opm
@@ -3,7 +3,7 @@
\_fontdecl [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]"
+ {[lmroman10-regular]}
\_wlog{\_detokenize{%
Modifiers (selects subfamily):^^J
@@ -19,7 +19,7 @@ Modifiers (selects subfamily):^^J
Submodifiers (setlects 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 (\roman gives extended bold by default)^^J
+ \nbold ..... normal bold (extended bold is default)^^J
\bolder .... extended bold^^J
}}
diff --git a/Master/texmf-dist/tex/luatex/optex/f-pagella.opm b/Master/texmf-dist/tex/luatex/optex/f-pagella.opm
index 1f9b8dac806..27127b7a6f1 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-pagella.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-pagella.opm
@@ -2,7 +2,7 @@
\_fontdecl [Pagella] \Pagella {TeX Gyre Pagella fonts based on Palatino}
{\caps} {\rm \bf \it \bi} {Pagella}
- "[texgyrepagella-regular]"
+ {[texgyrepagella-regular]}
\_wlog{\_detokenize{%
Modifier:^^J
@@ -11,7 +11,7 @@ Modifier:^^J
\_protected\def \Pagella {%
\_def \_currfamily {Pagella}%
- \_def\_fontnamegen {"[texgyrepagella-\_currV]:\_capsV\_fontfeatures"}%
+ \_def\_fontnamegen {[texgyrepagella-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-schola.opm b/Master/texmf-dist/tex/luatex/optex/f-schola.opm
index 649515e4a1a..d876582683a 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-schola.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-schola.opm
@@ -2,7 +2,7 @@
\_fontdecl [Schola] \Schola {TeX Gyre Schola fonts based on New Century}
{\caps} {\rm \bf \it \bi} {Schola}
- "[texgyreschola-regular]"
+ {[texgyreschola-regular]}
\_wlog{\_detokenize{%
Modifier:^^J
@@ -11,7 +11,7 @@ Modifier:^^J
\_protected\def \Schola {%
\_def \_currfamily {Schola}%
- \_def\_fontnamegen {"[texgyreschola-\_currV]:\_capsV\_fontfeatures"}%
+ \_def\_fontnamegen {[texgyreschola-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-technika.opm b/Master/texmf-dist/tex/luatex/optex/f-technika.opm
index cf9a197dda2..1e572345a46 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-technika.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-technika.opm
@@ -2,20 +2,20 @@
\_fontdecl [Technika] \Technika {Fonts from visual style of CTU in Prague}
{\caps \light} {\rm \bf \it \bi \stencil} {}
- "[Technika-Regular]"
+ {[Technika-Regular]}
\_wlog{\_detokenize{%
Modifiers:^^J
- \light ..... ligher variants: \rm\bf=light \bf\bi=normal
- \book ..... semi-ligher variants: \rm\bf=book \bf\bi=bold
+ \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
+ \stencil ... dashed leters (only uppercase)^^J
}}
\_protected\def \Technika {%
\_def \_currfamily {Technika}%
- \_def \_fontnamegen {"[Technika\_stencilV-\_currV]:\_capsV\_fontfeatures"}%
+ \_def \_fontnamegen {[Technika\_stencilV-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV stencil={},caps={} \_fvars Regular Bold Italic BoldItalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-termes.opm b/Master/texmf-dist/tex/luatex/optex/f-termes.opm
index d64d6a463e5..e0ed0c63c45 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-termes.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-termes.opm
@@ -2,7 +2,7 @@
\_fontdecl [Termes] \Termes {TeX Gyre Termes fonts based on Times}
{\caps} {\rm \bf \it \bi} {Termes}
- "[texgyretermes-regular]"
+ {[texgyretermes-regular]}
\_wlog{\_detokenize{%
Modifier:^^J
@@ -11,7 +11,7 @@ Modifier:^^J
\_protected\def \Termes {%
\_def \_currfamily {Termes}%
- \_def \_fontnamegen {"[texgyretermes-\_currV]:\_capsV\_fontfeatures"}%
+ \_def \_fontnamegen {[texgyretermes-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV caps={} \_fvars regular bold italic bolditalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/f-xcharter.opm b/Master/texmf-dist/tex/luatex/optex/f-xcharter.opm
index d7b4d475487..d889c8ba2b1 100644
--- a/Master/texmf-dist/tex/luatex/optex/f-xcharter.opm
+++ b/Master/texmf-dist/tex/luatex/optex/f-xcharter.opm
@@ -2,16 +2,17 @@
\_fontdecl [XCharter] \XCharter {An extension of Bitstream Charter}
{\caps \slant} {\rm \bf \it \bi} {}
- "[XCharter-Roman]"
+ {[XCharter-Roman]}
\_wlog{\_detokenize{%
-Modifier:^^J
+Modifiers:^^J
\caps ...... caps & small caps^^J
+ \slant ..... slanted variants used in \it, \bi^^J
}}
\_protected\def \XCharter {%
\_def \_currfamily {XCharter}%
- \_def \_fontnamegen {"[XCharter-\_currV]:\_capsV\_fontfeatures"}%
+ \_def \_fontnamegen {[XCharter-\_currV]:\_capsV\_fontfeatures}%
\_resetmod
}
\_moddef \resetmod {\_fsetV caps={} \_fvars Roman Bold Italic BoldItalic }
diff --git a/Master/texmf-dist/tex/luatex/optex/fams-ini.opm b/Master/texmf-dist/tex/luatex/optex/fams-ini.opm
index 096e32df5c2..fca923963c5 100644
--- a/Master/texmf-dist/tex/luatex/optex/fams-ini.opm
+++ b/Master/texmf-dist/tex/luatex/optex/fams-ini.opm
@@ -38,7 +38,7 @@
\_famtext {Other fonts:}
-\_faminfo [Linux Libertine] {Free fonts typicaly instaled in systems} {f-libertine}
+\_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]
@@ -84,7 +84,7 @@ 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-user.opm`. The second file is optional. User can create it and write to
+`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`.
diff --git a/Master/texmf-dist/tex/luatex/optex/fonts-catalog.opm b/Master/texmf-dist/tex/luatex/optex/fonts-catalog.opm
index f771fe92ebe..f9cd2af6df8 100644
--- a/Master/texmf-dist/tex/luatex/optex/fonts-catalog.opm
+++ b/Master/texmf-dist/tex/luatex/optex/fonts-catalog.opm
@@ -3,8 +3,9 @@
\_initunifonts
\_begingroup
-\_noloadmath
+\_istoksempty\_catalogmathsample \_iftrue \_noloadmath \_fi
\_let\_ttfixed=\_tentt
+\_fontlet\_smalltt=\_tentt at7pt
\_suppressfontnotfounderror=1
\_lowercase\_ea{\_ea\_def\_ea\_cataloglist\_ea{\_the\_catalogonly}}
@@ -28,9 +29,14 @@
\_iftrue \def\_cataloglist{.}\_fi
\_ifx\_cataloglist\_empty
\_ifx^#4^\_else
- \_bigskip {\_qquad\_ttfixed\_string\fontfam [#1] -- (#2)\_par}
- \_fontfam[#1]
+ \_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
@@ -55,6 +61,14 @@
\_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}
@@ -62,7 +76,8 @@
\_ttfixed
\_input fams-ini.opm
-\_isfile {fams-user.opm}\_iftrue \_input fams-user.opm \_fi
+
+\_isfile {fams-local.opm}\_iftrue \_input fams-local.opm \_fi
\_endgroup
@@ -77,7 +92,20 @@ You can redeclare the printed sample of each font by:
\catalogsample={Hello world!}
\endtt
-before \code{\\fontfam[catalog]} command is used.
+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
@@ -95,7 +123,7 @@ 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-user.opm}. The second file
+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.
diff --git a/Master/texmf-dist/tex/luatex/optex/fonts-opmac.opm b/Master/texmf-dist/tex/luatex/optex/fonts-opmac.opm
index 40f3f4dd50d..52afb97650f 100644
--- a/Master/texmf-dist/tex/luatex/optex/fonts-opmac.opm
+++ b/Master/texmf-dist/tex/luatex/optex/fonts-opmac.opm
@@ -46,11 +46,15 @@
\_mainbaselineskip=\_baselineskip
\_mainfosize=\_optsize
\_bf \_it \_bi \_rm \_normalmath % load fonts if \typosize is running firstly
- \_def \_setmainvalues{\_rm \_everymath={\_normalmath}\_everydisplay={\_normalmath}}%
+ \_let \_setmainvalues =\_setmainvaluesL
}
+\_def\_setmainvaluesL {\_rm \_everymath={\_normalmath}\_everydisplay={\_normalmath}}
\_def\_scalemain {%
- \_ifdim \_mainfosize >0pt
- \_optsize=\_mainfosize \_baselineskip=\_mainbaselineskip \fi
+ \_ifdim \_mainfosize=0pt
+ \_mainfosize=10pt \_mainbaselineskip=12pt
+ \_let \_setmainvalues=\_setmainvaluesL
+ \fi
+ \_optsize=\_mainfosize \_baselineskip=\_mainbaselineskip
}
\_newskip \_mainbaselineskip \_mainbaselineskip=0pt \_relax
@@ -82,6 +86,7 @@
\_let\_italcorr=\/
\_protected\_def \_boldify {%
+ \_let \_setmainvalues=\_setmainvaluesL
\_let\it =\_bi \_let\rm =\_bf \_let\normalmath =\_boldmath
\_let\_it=\_bi \_let\_rm=\_bf \_let\_normalmath=\_boldmath \_rm
}
@@ -90,80 +95,3 @@
\_endcode % -------------------------------------
-
-\sec Font size settings in general (high-level macros)
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-The commands for font size setting described here have local validity. If
-you put them into a group, the described features are selected locally. Don't use
-dimension unit in parameters in these commands. The dimension unit is
-`\ptunit` which is set by `1pt` by default. If you set this register to
-another value at begining of your document, all fonts and `\baselineskip`
-will be set to different sizes.
-
-The command `\typosize[<fontsize>/<baselineskip>]` sets the font size of text and
-math fonts and baselineskip. If one of these two parameters is empty, the
-corresponding feature stays unchanged. Examples:
-
-\begtt
- \typosize[10/12] % default in plainTeX and OpTeX
- \typosize[11/12.5] % font 11pt, baseline 12.5pt
- \typosize[8/] % font 8pt, baseline unchanged
-\endtt
-
-The command `\typoscale[<font-factor>/<baselineskip-factor>]` sets the text
-and math fonts size and baselineskip as a multiple of the current fonts size
-and baselineskip. The factor is written in `scaled`-like way, it means that
-1000 means factor one. The empty parameter is equal to the parameter 1000,
-i.e. the value stays unchanged. Examples:
-
-\begtt
- \typoscale[800/800] % fonts and baselineskip re-size to 80 %
- \typoscale[\magstep2/] % fonts bigger 1,44times
-\endtt
-
-First usage of `\typosize` or `\typoscale` macro in your document sets "main
-values", i.e. main font size and main baselineskip. They are saved in registers
-`\mainfosize` and `\mainbaselineskip`.
-
-The `\typoscale` comand does scaling in respect to current values. If you
-want to do it in respect to main values, type `\scalemain` immediately
-before `\typoscale` command.
-
-\begtt
- \typosize[12/14.4] % first usage in document, sets main values internally
- \typosize[15/18] % bigger font
- \scalemain \typoscale[800/800] % reduces from main values, no from current values.
-\endtt
-
-The size of the current text font can be changed by the command
-"\thefontsize[<font-size>]" or can be rescaled by
-"\thefontscale[<factor>]". These macros don't change math fonts sizes nor
-baselineskip.
-
-When you need titles in bold, you can use the `\boldify` macro with
-co-operation with `\typosize` or `\typoscale` command. The `\boldify` command
-sets `\rm` as `\bf`, `\it` as `\bi` a and math formulae are bolder too.
-Example:
-
-\begtt
- \def\titlefont{\boldify\typosize[15/18]}
- {\titlefont Here is big bold {\it italics is bold-italics} and
- math $a+b^2$ is bolder too.\par}
-\endtt
-
-The `\em` macro acts as `\it` if the current font is `\rm`, acts as `\rm` if
-the current font is `\it`, acts as `\bi` if the current font is `\bf` and
-acts as `\bf` if the current font is `\bi`. The "\/" spaces are inserted
-automatically. Example:
-
-\begtt
- This is {\em important} text. % = This is {\it important\/} text.
- \it This is {\em important} text. % = This is\/ {\rm important} text.
- \bf This is {\em important} text. % = This is {\bi important\/} text.
- \bi This is {\em important} text. % = This is\/ {\bf important} text.
-\endtt
-
-If you are interesting in font selection system used in \OpTeX/ then see
-`fonts-select.opm` file. If you are interesting in font size settings in
-detail, see `font-resize.opm` file.
diff --git a/Master/texmf-dist/tex/luatex/optex/fonts-resize.opm b/Master/texmf-dist/tex/luatex/optex/fonts-resize.opm
index b537c2d7224..c686b85b798 100644
--- a/Master/texmf-dist/tex/luatex/optex/fonts-resize.opm
+++ b/Master/texmf-dist/tex/luatex/optex/fonts-resize.opm
@@ -10,10 +10,11 @@
\_else \_ea \_doresizefont \_fontselector \_fi
\_slet{_tryload#1}{_relax}%
}
-\_def\_doresizefont#1{\_logfont{#1}%
+\_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}
diff --git a/Master/texmf-dist/tex/luatex/optex/fonts-select.opm b/Master/texmf-dist/tex/luatex/optex/fonts-select.opm
index ee8fa7709ba..0bdc0acfd48 100644
--- a/Master/texmf-dist/tex/luatex/optex/fonts-select.opm
+++ b/Master/texmf-dist/tex/luatex/optex/fonts-select.opm
@@ -11,22 +11,23 @@
}%
\_gdef\_rfskipatX ##1" ##2\_relax{"##1"}%
\_gdef\_doresizefont ##1{\_logfont{##1}%
- \_font##1=\_fontnamegen\_space \_sizespec \_relax}%
- \_def \_fontnamegen{ec-lmr10}%
+ \_ifx\_fontnamegen\_undefined \_doresizetfmfont##1\_else
+ \_font##1={\_fontnamegen} \_sizespec \_relax \_setwsp##1\_relax
+ \_fi}%
\_global\_let\_initunifonts=\_relax % we need not to do this work twice
\_global\_let\initunifonts=\_relax
}
-\_def\_fontdecl [#1]#2#3#4#5#6#7"#8"{%
+\_def\_fontdecl [#1]#2#3#4#5#6#7{%
\_initunifonts \_uniaccents
\_ifx #2\_undefined
- \_isfont"#8"\_iffalse
+ \_isfont{#7}\_iffalse
\_opwarning{Family [#1] skipped, font "#7" not found}\_ea\_ea\_ea\_endinput \_else
\_def\_textfamily{#1}%
\_edef\_currfamily {\_csstring #2}%
- \_def\_mainfamcommand{#2}%
+ \_def\_mainfamcommand{#2}\_def\_mathfaminfo{#6}%
\_wterm {FONT: [#1] -- \string#2 \_detokenize{(#3)^^J mods:{#4} vars:{#5} math:{#6}}}%
\_fi
- \_else \_ea \_endinput \_fi
+ \_else \_ea #2\_ea\_endinput \_fi
}
\_def\_regoptsizes #1 #2?#3 #4*{\_sdef{_optsizes:#1}{#2?#3 #4* }}
\_def\_optfontalias #1#2{\_slet{_optsizes:#1}{_optsizes:#2}}
@@ -43,16 +44,28 @@
\_def\_afterfifi #1\_fi\_fi{\_fi\_fi #1}
\_newifi \_ifexistfam
-\_def\_isfont"#1"#2{%
+\_def\_isfont#1#2{%
\_begingroup
\_suppressfontnotfounderror=1
- \_font\_testfont="#1"\_relax
+ \_font\_testfont={#1}\_relax
\_ifx\_testfont\_nullfont \_def\_tmp{\_existfamfalse \_unless}
\else \_def\_tmp{\_existfamtrue}\_fi
\_ea \_endgroup \_tmp #2%
}
-\_def\_fontfeatures{+tlig;}
+\_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
+}
\_def\_fvars #1 #2 #3 #4 {%
\_sdef{_fvar:rm}{#1}%
\_sdef{_fvar:bf}{#2}%
@@ -110,7 +123,7 @@
\_ifx \_famfile\_empty \_listfamnames \_fi
\_isfile {f-\_famname.opm}\_iftrue
\_opinput {f-\_famname.opm}
- \_else \_isfile {fams-user.opm}\_iftrue \_opinput {fams-user.opm} \_fi
+ \_else \_isfile {fams-local.opm}\_iftrue \_opinput {fams-local.opm} \_fi
\_ifcsname _famf:\_famname\_endcsname \_edef\_famfile{\_cs{_famf:\_famname}}%
\_else \_edef\_famfile{f-\_famname}\_fi
\_isfile {\_famfile.opm}\_iftrue \_opinput {\_famfile.opm}
@@ -126,7 +139,7 @@
\_wterm{ \_space\_noexpand\fontfam [##1] -- ##2}%
\_let\_famalias=\_famaliasA}%
\_opinput {fams-ini.opm}
- \_isfile {fams-user.opm}\_iftrue \_opinput {fams-user.opm} \_fi
+ \_isfile {fams-local.opm}\_iftrue \_opinput {fams-local.opm} \_fi
\_message{^^J}%
\_endgroup
}
@@ -135,8 +148,8 @@
\_def\_famtext #1{}
\_def\_faminfo [#1]#2#3#4{%
- \_lowercase{\_edef\_famname{\_ea\_removespaces #1 {} }}%
- \_sdef{_famf:\_famname}{#3}%
+ \_lowercase{\_edef\_tmp{\_ea\_removespaces #1 {} }}%
+ \_sdef{_famf:\_tmp}{#3}%
\_def\_famfile{#3}%
}
\_def\_famalias [#1]{%
@@ -144,14 +157,45 @@
\_sdef{_famf:\_famname\_ea}\_ea{\_famfile}%
}
\_input fams-ini.opm
-\_newtoks \_catalogsample
+\_let\_famfile=\_undefined
+\_newtoks \_catalogsample
+\_newtoks \_catalogmathsample
\_newtoks \_catalogonly
\_newtoks \_catalogexclude
\_catalogsample={ABCDabcd Qsty fi fl áéíóúüů řžč ÁÉÍÓÚ ŘŽČ 0123456789}
+\_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
- \fontfam \initunifonts \isfont \famvardef \moddef
- \catalogonly \catalogexclude \catalogsample ;
+ \fontfam \initunifonts \isfont
+ \setff \setfontcolor \setletterspace \setwordspace \famvardef \moddef
+ \catalogonly \catalogexclude \catalogsample \catalogmathsample ;
\_endcode %---------------------------------------------------
@@ -161,7 +205,7 @@
Try to write `\fontfam[?]`. All font families registered in \OpTeX/
font selection system are listed on the terminal and in the log file.
-You can choose one of them and use for example `\fontfam[Termes]` or
+You can choose one of them and use it, for example `\fontfam[Termes]` or
`\fontfam[LM Fonts]`. Then you can use four basic variant selectors `\rm` or
or `\bf` or `\it` or `\bi` and desired fonts are printed.
@@ -172,31 +216,25 @@ The fonts registered in \OpTeX/ have their macros in "font files", each family
in one font file with the name `f-famname.opm`. All families are collected
in `fams-ini.opm`. You can read the documentation in the file `fams-ini.opm`
and in the files `f-heros.opm`, `f-lmfonts.opm` for more information how
-to install and to register your own font family. Note that all families
+to install and how to register your own font family. Note that all families
registered in such files are Unicode fonts. Non-Unicode fonts are not
preferred in \OpTeX/ but you can use them using classical `\font` primitive,
of course.
-Each font family is connected with a preferred unicode-math font. This
-unicode-math is activated when 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.
-
There are two equal possibilities how to load a font family: `\fontfam[Family]`
or `\input f-fontfamily.opm`.
There are "main family command", "font modifiers" and "variant selectors" in
-each family. Each family provides four variant selectors mentioned above
-(may be, in few cases a missing variant is substituded by `\rm` or
-`\it`). A few families provides more than these four variant selectors.
+each family. Each family provides four default variant selectors mentioned above
+(may be, in few cases a missing variants are substituded)
+A few families provides more than these four variant selectors.
Mostly all families provides "font modifiers" like `\caps`, `\light`,
-`\cond`. Which font modifiers are provided is listed in terminal or in the
+`\cond`. Supported font modifiers are listed in terminal or in the
catalogue. A font modifier does nothing with current font, but the next
variant selectors select a modified font. You can combine more than one
font modifiers followed by a variant selector. The font is reloaded at the
-moment when variant selector is in its process. The following example
+moment when variant selector is processed. The following example
supposes that we are working with a font family where `\caps` and `\cond`
font modifiers are provided.
@@ -217,9 +255,9 @@ independent, so there are four variants: normal, condensed, caps and
caps-condensed, all these variants are present in four standard
variants: regular, bold, italics, bold-italics.
-There is one special command `\currvar` which respects the current
-variant and the font of such variant is reloaded with respect to previously
-given font modifiers.
+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 previously given font modifiers.
You can use the `\setfontsize{<sizespec>}` command in the same sense as
other font modifiers. It means that the command itself does nothing with the
@@ -234,7 +272,7 @@ in 14pt size too \bf bold too.
Note that much more comfortable is to resize fonts 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
-`opmac-fonts.opm` file for more information.
+the section \ref[typosize] for more information.
\secc More than one font families loaded
@@ -249,7 +287,7 @@ family comand. For example, when Heros and Termes are loaded then:
\Heros \rm here is Heros font \it italics is in Heros too.
\endtt
-Summary: To select a font you can use (in this order):
+To select a font you can use (in this order):
\begtt
\<main-family-command> \<font-modifiers> \<variant-selector-or-currvar>
@@ -269,16 +307,18 @@ modifiers are working in context of current used family. For example
font family using different internal definitions.
Maybe, one needs a context switching between `\rm`<-->`\bf` and
-`\it`<-->`\bi`. This is done by `\em` macro, see opmac-fonts.ofm.
+`\it`<-->`\bi`. This is done by `\em` and `\boldify` macros, see
+section \ref[fonts].
\secc Math Fonts
%---------------
-First usage of `\fontfam` loads UnicodeMath fonts too if the specified font
-family is configured with an UnicodeMath font. If you neeed not this feature
-(because preloaded 8bit math fonts seem to be sufficient for you) then write
-`\noloadmath` before first `\fontfam`.
+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 UnicodeMath font then use
`\loadmath{[<font_file>]}` or `\loadmath{<font_name>}` before first
@@ -288,9 +328,6 @@ If you want to use your specially selected UnicodeMath font then use
\secc Defining a font commands
%-----------------------------
-You can define your own font selectors as a combination of font modifiers
-followed by a font selector or by `\currvar` command.
-
You can declare a "font switch" like `\font` primitive does it,
but you need not to know nothing about names of font files:
@@ -336,39 +373,91 @@ applies variant selector (loads the font now), closes the group but keeps
the selected font and use it. Moreover, such `\selector` is declared as
family-dependent in the same sense as font modifiers.
-You can use `\isfont "<fontname>"\iftrue` or `\isfont "<fontname>"\iffalse`
-to test if the specified font is present in your system.
-
\secc Example of modifying font features
%---------------------------------------
-Each OTF fionts provides "font features". You can list these 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
-fonrm.
+form.
-If you need to activate or deactivate a font feature then you must to
-re-load the font with new collection of features. Actual collection of
-features are stored in `\_fontfeatures` macro. The features are separated by
-semicolon and prefixed by `+` (to activate it) or `-` (to deactivate it).
-If you want to print fractions in LinLibertine create a font modifier using
-`\moddef` of variant selector using `\famvardef`:
+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]
- \moddef \fracmod {\addto\_fontfeatures{+frac;}}
- {Compare 1/2 or 1/10 \fracmod\currvar to 1/2 or 1/10.}
- or:
- \famvardef \fraclig {\addto\_fontfeatures{+frac;}\currvar}
- {Compare 1/2 or 1/10 \fraclig to 1/2 or 1/10.}
+ \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: font feature is not activated.
+
The `onum` font feature (old style digits) is connected to `\caps` macro for
Caps+SmallCaps variant in \OpTeX/ font-definition-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-file (and dependent on
+the font family), we have following font modifiers:
+
+\begtt
+\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 section \ref[fontsize].
+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` instead of the hexadecimal
+specification. The emtpy 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 <num> means no letter spacing which is default.
+
+`\setwordspace{<scaling>}` scale the default interword space (defined in the
+font) and its stretching and shrinking parameters by given <scaling>
+factor. For example `\setwordspace{2.5}` multiplies interword space by 2.5.
+
+If you need another font transformations, you can use `\setff`
+with following font features provided by Lua\TeX/:
+
+\begtt
+ \setff{embolden=1.5}\rm % font is bolder because outline has nonzero width
+ \setff{slant=0.2}\rm % font is slanted by a linear transformation
+ \setff{extend=1.2}\rm % font is extended by a linear transformation.
+\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 reccomended to add `\setff{-liga}` in
+order to disable ligatures. And setting a positive letter spacing probably
+needs to scale interword spacing too.
+
+All mentioned font modifiers (with the exception of `\setfontsize`) work only
+with Unicode fonts loaded by `\fontfam`.
+
+
\secc Example of usage more vaiants
%----------------------------------
@@ -384,7 +473,7 @@ Then you can define:
Now, you can select between eight variants. But the context between similar
variants like `\bf`--`\bfcond` is lost. Maybe you will find more usefull to
-create only a two cond--nocond swithers which respect the current variant.
+create only a two cond--nocond simple macros which respect the current variant.
And use only four standard variant selectors:
\begtt
@@ -394,6 +483,9 @@ And use only four standard variant selectors:
\it here is italics-condensed \useNormal here is italics-normal.
\endtt
+Another example of decalaration of `\mr` (medium-regular) and `\mi`
+(medium-italics) variant selectors is in the file f-lido.opm.
+
\secc Example of usage more than one family
%------------------------------------------
@@ -405,7 +497,7 @@ Supose we have load Termes and Heros families. Then you can define
\def\useHeros {\Heros\currvar} % switch to Heros with respect curent variant
\endtt
-Or you can declare fonts-like macros:
+Or you can declare font selectors:
\begtt
\fontdef \titlefont {\setfontsize{at14pt}\Heros\bf}
@@ -415,7 +507,7 @@ Or you can declare fonts-like macros:
If you are mixing fonts from various font families then the ex height can
be different and optical unfit. You can compensate exheight of such fonts
-for example by:
+by `mag` keyword in the `\setfontsize` macro. For example by:
\begtt
\Termes
@@ -424,15 +516,15 @@ for example by:
\endtt
-\secc Fontfam processing in detail
-%-----------------------/---------
+\secc \code{\\fontfam} processing in detail
+%------------------------------------------
The `\fontfam` macro lists all declared families if parameter is empty or
`?`. If not, then `\fontfam` transforms the given parameter to lowercase and
without spaces. If exists the file `f-<parameter>.opm` then it is read. If
does not exists such file then `\fontfam` internally lists the families
declared by `\_faminfo` and `\_famalias`, firstly from `fams-ini.opm` file
-and secondly from `fams-user.opm` (if such file exists). The last
+and secondly from `fams-local.opm` (if such file exists). The last
declaration from this internal list (which mathes the given <parameter>)
wins. If the parameter does not match then font-macro-file is not found and
the warning is printed and no new family is loaded.
@@ -441,11 +533,35 @@ When the font-macro-file is found, then `\fontfam` tries an existence of fonts i
system. If they does not exist, a warning on the terminal is printed and no
family is loaded.
-Note, that `fams-user.opm` has higher precedence that internal
+Note, that `fams-local.opm` has higher precedence that internal
`fams-ini.file`. You can declare families with the same name as internal
names and your declaration wins.
+\secc Others
+
+You can use `\isfont {<fontname>}\iftrue` or `\isfont {<fontname>}\iffalse`
+to test if the specified font is present in your system.
+
+The macro `\initunifonts` should be used before usage of first `\font` primitive
+when you need to lodad Unicode fonts directly wihout support of the `\fontfam` or
+`\loadmath` \"high level" macros\fnote
+{The `\initunifonts` macro initializes an extension features of the
+\code{\\font} primitive using Lua code. Without this only 8\,bit fonts can be
+loaded.}.
+
+The `\boldify` macro can be used for titles. It sets `\it` to `\bi` and
+`\rm` to `\bf`. It means that user can write `{\it something}` in the title
+and the result is the same as `{\bi something}`. Math formulae are in bold
+variant too. The `\boldify` macro has local validity like others font
+modifiers. Example:
+
+\begtt
+{\boldify\typosize[14/16] Title in {\it bold}\par}
+\endtt
+
+
+
\secc Implementation notes
%-------------------------
diff --git a/Master/texmf-dist/tex/luatex/optex/hyperlinks.opm b/Master/texmf-dist/tex/luatex/optex/hyperlinks.opm
new file mode 100644
index 00000000000..891ae41f492
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/optex/hyperlinks.opm
@@ -0,0 +1,137 @@
+%% This is part of OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \urllink {references <2020-02-22>}
+
+%> \dest
+
+\_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 ;
+
+%> \_link, \ilink
+
+\_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 ;
+
+%> \ulink
+
+\_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 ;
+
+%> \_pdfborder
+
+\_def\_pdfborder#1{\_if^#1^\_else \_isdefined{#1border}\_iftrue
+ \_if^\_csname#1border\_endcsname^\_else
+ attr{/C[\_csname#1border\_endcsname] /Border[0 0 .6]}\_fi
+ \_else attr{/Border[0 0 0]}\_fi\_fi
+}
+
+%> \hyperlinks
+
+\_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 ;
+
+%> \url
+
+\_def\_url#1{{%
+ \_def\_tmpa{#1}\_replstring\_tmpa {\|}{}%
+ \_def\_tmpb{#1}\_replstring\_tmpb {\|}{\\|}%
+ {\_escapechar=-1 \_ea}\_ea\_edef\_ea\_tmpb\_ea{\detokenize\_ea{\_tmpb}}%
+ \_let\_tmpa=\_tmpb
+ \_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 % -------------------------------------
+
+\%> \dest
+
+`\dest[<type>:<label>]` creates a destination of internal links. The
+destination is declared by `<type>:<label>`. If `\hyperlinks` are not
+declared, 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 se
+the line where destination is. The destination box is positioned by
+different way dependent on current vertical or horizontal mode.
+
+\%> \_link \ilink
+
+`\_link[<type>:<label>]{<color>}{<text>}` creates an internal link to `\dest`
+with the same `<type>:<label>`. You can have more links with the same
+`<type>:<label>` but only one `\dest` in the document. If `\hyperlinks` are
+not declared, then `\link` only prints <text> else it is set to `\_linkactive`.
+The `\_linktactive` is implemented by `\_pdfstartlink...\_pdfendlink`
+primitives.
+
+`\ilink[<type>:<label>]{<text>}` is equivalent to `\_link` but <color> is
+used from `\hyperlinks` decaration.
+
+\%> \ulink
+
+`\ulink[<url>]{<text>}` creates external link. It only <text> by default but
+the `\hyperlinks` declaration defines it as `\_urlactive[url:<url>]{<text>}`.
+The external link is created by `\_pdfstartlink...\pdfendlink` primitives.
+The <url> is detokenized with `\escapechar=-1` before it is used, so
+`\%`, `\#` etc. can be used in the <url>.
+
+\%> \_pdfborder
+
+The `\_pdfstartink` primitive uses `\_pdfborder{<type>}` in its parameter
+(see `\_linkactive` or `\_urlactive` macros). The `\_pdfbordef{<type>}`
+expands to `attr{/C[? ? ?] /Border[0 0 .6]} if the
+`\<type>border` 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).
+
+\%> \hyperlinks
+
+`\hyperlinks{<ilink_color>}{<ulink_color>}` activates `\dest`, `\link`,
+`\ilink`, `\ulink` in order they create links. These macros are redefined
+here to their \"active" version.
+
+\%> \url
+
+`\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 in 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.
+
diff --git a/Master/texmf-dist/tex/luatex/optex/if-macros.opm b/Master/texmf-dist/tex/luatex/optex/if-macros.opm
index 5f3f4d91cf0..ea2f84ee41d 100644
--- a/Master/texmf-dist/tex/luatex/optex/if-macros.opm
+++ b/Master/texmf-dist/tex/luatex/optex/if-macros.opm
@@ -2,7 +2,7 @@
\_codedecl \newif {Special if-macros, is-macros and loops <2020-01-23>}
-% \newif like in plain\TeX/:
+%> \newif
\_def\_newif #1{\_ea\_newifA \_string #1\_relax#1}
\_ea\_def \_ea\_newifA \_string\if #1\_relax#2{%
@@ -17,7 +17,7 @@
\_let#2=\_iffalse
}
-% \loop like in plain\TeX/:
+%> \loop
\_def \_loop #1\_repeat{\_def\_body{#1}\_iterate}
\_def \loop #1\repeat{\_def\_body{#1}\_iterate}
@@ -25,7 +25,14 @@
\_let \repeat=\_fi
\_def \_iterate {\_body \_ea \_iterate \_fi}
-% \isempty{text}\iftrue, \isempty{text}\iffalse:
+%> \isnextchar <char>{exec if true}{exec if false}
+
+\_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}
+
+%> \isempty{text}\iftrue, \isempty{text}\iffalse:
\_def \_isempty #1#2{\_ea\_ifx\_ea\_relax\_detokenize{#1}\_relax
\_else \_ea\_unless \_fi #2}
@@ -33,52 +40,46 @@
\_ea\_unless \_fi #2}
\_def \_istoksempty #1{\_ea\_isempty\_ea{\_the#1}}
-% \isinlist\list{text}\iftrue, \isinlist\list{text}\false:
-
-\_long\_def\_isinlist#1#2{\_begingroup
- \_long\_def\_tmp##1#2##2\_end/_{\_endgroup\_isnoempty{##2}}%
- \_ea\_tmp#1\_endlistsep#2\_end/_%
-}
-
-% \isequal{text}{text}\iftrue ...
+%> \isequal{text}{text}\iftrue ...
\_def\_isequal#1#2#3{\_directlua{%
- if "\_luaescapestring{#1}"=="\_luaescapestring{#2}" then else tex.print("\_nbb unless") end}#3}
+ if "\_luaescapestring{\_detokenize{#1}}"=="\_luaescapestring{\_detokenize{#2}}"
+ then else tex.print("\_nbb unless") end}#3}
-% \ismacro\macro{text}\iftrue ...
+%> \ismacro\macro{text}\iftrue ...
\_def\_ismacro#1{\_ea\_isequal\_ea{#1}}
-% \isnextchar <char>{exec if true}{exec if false}
+%> \isdefined{csname}\iftrue
-\_long\_def\_isnextchar#1#2#3{\_begingroup\_toks0={\_endgroup#2}\_toks1={\_endgroup#3}%
- \_let\_tmp=#1\_futurelet\_next\_isnextcharA
+\_def\_isdefined #1#2{\_ifcsname #1\_endcsname \_else \_ea\_unless \_fi #2}
+
+%> \isinlist\list{text}\iftrue ...
+
+\_long\_def\_isinlist#1#2{\_begingroup
+ \_long\_def\_tmp##1#2##2\_end/_{\_endgroup\_isnoempty{##2}}%
+ \_ea\_tmp#1\_endlistsep#2\_end/_%
}
-\_def\_isnextcharA{\_the\_toks\_ifx\_tmp\_next0\_else1\_fi\_space}
-% \isfile{name}\iftrue
+%> \isfile{name}\iftrue ...
\_newread \_testin
\_def\_isfile #1{%
- \_openin\_testin =#1
+ \_openin\_testin ={#1}\_relax
\_ifeof\_testin \_ea\_unless
\_else \_closein\_testin
\_fi
}
-% \removespaces text with spaces {} -> textwithspaces
-
-\_def\_removespaces #1 {\_isempty{#1}\_iffalse #1\_ea\_removespaces\_fi}
-
-
\_public
- \newif \isempty \istoksempty \isinlist \isnextchar
- \isfile \ismacro \isequal \removespaces ;
+ \newif \isnextchar \isempty \isequal \ismacro \isdefined \isinlist \isfile ;
\_endcode %---------------------------------------------------------
-The `\newif` macro works like in plain\TeX. It means that
+\%> \newif
+
+The `\newif` macro works like 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 defalut value is false.
@@ -86,21 +87,60 @@ to test this value. The defalut value is false.
The macro `\_newifi` enables to declare `\_ifxxx` and to use `\_xxxtrue` and
`\_xxxfalse`. This means that it is usable for _prefixed macros.
+\%> \loop
+
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.
+finished. This works like in plain \TeX, but implementation is soewhat
+better (you can use `\else` clause after the `\ifsomething`).
-The macro `\isempty{<text>}\iftrue <codeA>\else <codeB>\fi` executes <codeA>
-if <text> is empty and <codeB> if it is nonempty. You can use
-`\isempty{<text>}\iffalse <codeB>\else <codeA>\fi` too. This macro is
-expandable.
+There are public version `\loop...\repeat` and private version
+`\_loop...\_repeat`. You canot mix both versions in one loop.
-The macro `\isinlist\list{<text>}\iftrue` acts like `\iftrue` if the
-`<text>` is included the macro body of `\list`. Else it acts like
-`\ifflase`. You can write `\isinlist\list{<text>}\iffalse` to reverse the
-boolean value of this condition. THe macro is not expandable.
+\%> \isnextchar
The macro `\isnextchar <char>{<codeA>}{<codeB>}` executes `<codeA>` if next
character is equal to <char>. Else the `<codeB>` is executed. The macro is
not expandable.
+\%> \isempty
+
+The macro `\isempty{<text>}\iftrue <codeA>\else <codeB>\fi` executes <codeA>
+if <text> is empty and <codeB> if it is non-empty. You can use
+`\isempty{<text>}\iffalse <codeB>\else <codeA>\fi` too. This macro is
+expandable.
+
+There are a collection of macros with commnon syntax:
+`\issomething<params>\iftrue` or `\issomething<params>\iffalse`.
+The `\iftrue` or `\iffalse` is a part of this syntax because we need to keep
+skippable nested `\if` conditions.
+
+We read this `\iftrue` or `\iffalse` into unseparated parameter and repeat
+it because we need to remove an optional space before this command.
+
+\%> \isequal
+
+`\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.
+
+\%> \ismacro
+
+`\ismacro\macro{text}\iftrue` is true if macro is defined as {<text>}.
+Category codes are ignored in this testing. The macro is expandable.
+
+\%> \isdefined
+
+`\isdefined{<csname>}\iftrue` is true if `\<csname>` is defined.
+
+\%> \isinlist
+
+`\isinlist\list{<text>}\iftrue` is true if the
+`<text>` is included the macro body of the `\list`.
+The catogory code are relevant here. THe macro is not expandable.
+
+\%> \isfile
+
+`\isfile{<filename>}\iftrue` is true if the file <filename> exists and are
+readable by \TeX.
+
diff --git a/Master/texmf-dist/tex/luatex/optex/luatex-ini.opm b/Master/texmf-dist/tex/luatex/optex/luatex-ini.opm
index d84e0da8b1a..872d808ee99 100644
--- a/Master/texmf-dist/tex/luatex/optex/luatex-ini.opm
+++ b/Master/texmf-dist/tex/luatex/optex/luatex-ini.opm
@@ -133,6 +133,4 @@
\_endcode
-Non-TeX82 primitives are initialized here in non-prefix and _prefixed form.
-Macros for emulation of pdfTeX primitives are set here too.
-
+Common pdf\TeX/ primitives equivalnets are declared here. Initial values is set.
diff --git a/Master/texmf-dist/tex/luatex/optex/maketoc.opm b/Master/texmf-dist/tex/luatex/optex/maketoc.opm
new file mode 100644
index 00000000000..05df7d0d647
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/optex/maketoc.opm
@@ -0,0 +1,92 @@
+%% This is part of OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \maketoc {maketoc <2020-02-14>}
+
+\_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}%
+}
+\def\_tocline#1#2#3#4#5#6{\_bgroup
+ \_leftskip=\_iindent \_rightskip=2\_iindent
+ \_ifischap \_advance\_leftskip by \_iindent \_fi
+ \_def\_pg{\_ilink[pg:#5]}%
+ \_pretocline \_the\_tochook
+ \_ifcsname _tocl:#1\_endcsname
+ \_cs{_tocl:#1}{#3}{#4}{#6}\_nobreak \_hskip-2\_iindent\_null \_par
+ \_fi
+ \_egroup
+ \_advance\_tocrefnum by1
+}
+\_sdef{_tocl:1}#1#2#3{\_nofirst\_bigskip \_bf\_llaptoclink{#1}{#2}\_hfill \_pg{#3}}
+\_sdef{_tocl:2}#1#2#3{\_llaptoclink{#1}{#2}\_tocdotfill \_pg{#3}}
+\_sdef{_tocl:3}#1#2#3{\_advance\_leftskip by\_iindent \_cs{_tocl:2}{#1}{#2}{#3}}
+
+\_def\_llaptoclink#1{\_noindent \_llap{\_ilink[toc:\_the\_tocrefnum]{#1\enspace}}}
+\_def\_tocdotfill{\_leaders\_hbox to.8em{\_hss.\_hss}\_hskip 1em plus1fill\_relax}
+\_def\_nofirst #1{\_ifnum \_lastpenalty=11333 \_else #1\_fi}
+
+\_def\_pretocline{}
+
+\_def\_maketoc{\_par \_ifx\_toclist\_empty
+ \_opwarning{\_noexpand\maketoc -- data unavailable, TeX me again}\_openref
+ \_else \_begingroup \_tocrefnum=0 \_penalty11333 \_toclist \_endgroup \_fi}
+
+\_newtoks \_tochook
+
+\_public \maketoc \tochook ;
+
+\_endcode % -------------------------------------
+
+`\_Xtoc{<level>}{<type>}{<number>}{<text>}` reads the specified
+data from REF file and saves it to `\_toclist` as
+
+\begtt
+\_tocline{<level>}{<type>}{<number>}{<text>}{<gpageno>}{<pageno>}
+where:
+<level>: 0 reserved, 1: chapter, 2: section, 3: subsection
+<type>: the type of the level, i.e. chap, sec, secc (unused)
+<number>: the number of the chapret/section/subsection in the format 1.2.3
+<text>: the title text
+<gpageno>: the page number numbered from 1 independently of pagination
+<pageno>: the page number used in the pagination
+\endtt
+
+The last two parameters are restored from previous
+`\_Xpage{<pageno>}{<gpageno>}`, data are saved in the `\_currpage` macro.
+
+`\_tocline{<level>}{<type>}{<number>}{<text>}{<gpageno>}{<pageno>}` prints
+the record to the table of contents. It opens group, reduces `\_leftskip`,
+`\_rightskip`, runs the `\tochook` (user can customise the design o TOC
+here) and runs `\_tocl:<level> {<number>}{<text>}{<page>}` macro.
+This macro starts with vertical mode,
+inserts one record with given <level> and ends in horizontal mode. Then
+`\_tocline` 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 <text>) 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.
+
+You can re-define default macros for each level if you want.
+
+`\_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.
+
+`\_pg{<pageno>}` creates <pageno> as link to real <gpage> saved in `#6`.
+
+`\maketoc` prints warning if TOC data is empty, lse it creates TOC by
+running `\_toclist`
diff --git a/Master/texmf-dist/tex/luatex/optex/math-macros.opm b/Master/texmf-dist/tex/luatex/optex/math-macros.opm
index 27bea8dcc41..ea33dc396e5 100644
--- a/Master/texmf-dist/tex/luatex/optex/math-macros.opm
+++ b/Master/texmf-dist/tex/luatex/optex/math-macros.opm
@@ -375,45 +375,46 @@
\_mathchardef\_colon="603A % colon as a punctuation mark
\_public \ldotp \cdotp \colon ;
-\_newdimen \_pt
-\_def\_setpt{\_pt=.1\_fontdimen6\_textfont1 }
\_protected\_def\_ldots{\_mathinner{\_ldotp\_ldotp\_ldotp}}
\_protected\_def\_cdots{\_mathinner{\_cdotp\_cdotp\_cdotp}}
-\_protected\_def\_vdots{\_setpt \_vbox{\_baselineskip=4\_pt \_lineskiplimit=0pt
- \_kern6\_pt \_hbox{.}\_hbox{.}\_hbox{.}}}
-\_protected\_def\_ddots{\_mathinner{\_setpt
- \_mkern1mu\_raise7\_pt\_vbox{\_kern7\_pt\_hbox{.}}\_mkern2mu
- \_raise4\_pt\_hbox{.}\_mkern2mu\_raise1\_pt\_hbox{.}\_mkern1mu}}
+\_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 ;
-\_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 }
+\_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 }
\_def\_math{\_mathsurround0pt }
-\_protected\_def\_overrightarrow #1{\_vbox{\_setpt\_math\_ialign{##\_crcr
- \_rightarrowfill\_crcr\_noalign{\_kern-\_pt\_nointerlineskip}
+\_protected\_def\_overrightarrow #1{\_vbox{\_math\_ialign{##\_crcr
+ \_rightarrowfill\_crcr\_noalign{\_kern-.1em \_nointerlineskip}
$\_hfil\_displaystyle{#1}\_hfil$\_crcr}}}
-\_protected\_def\_overleftarrow #1{\_vbox{\_setpt\_math\_ialign{##\_crcr
- \_leftarrowfill\_crcr\_noalign{\_kern-\_pt\_nointerlineskip}
+\_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{\_setpt\_math\_ialign{##\_crcr\_noalign{\_kern3\_pt}
- \_downbracefill\_crcr\_noalign{\_kern3\_pt\_nointerlineskip}
+\_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{\_setpt\_math\_ialign{##\_crcr
- $\_hfil\_displaystyle{#1}\_hfil$\_crcr\_noalign{\_kern3\_pt\_nointerlineskip}
- \_upbracefill\_crcr\_noalign{\_kern3\_pt}}}}\_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 ;
\_protected\_def\lmoustache{\_delimiter"437A340 } % top from (, bottom from )
@@ -476,12 +477,12 @@
\_public \mathpalette \vphantom \hphantom \phantom \mathstrut \smash ;
\_protected\_def\_cong{\_mathrel{\_mathpalette\_overeq\_sim}} % congruence sign
-\_def\_overeq#1#2{\_setpt\_lower.5\_pt\_vbox{\_lineskiplimit\_maxdimen\_lineskip=-.5\_pt
+\_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{\_setpt\_math\_hbox{\_ooalign{\_raise2\_pt
+\_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}}}
@@ -502,17 +503,16 @@
\_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\_setpt
- \_setbox0=\_vbox{\_setpt
- \_def\_cr{\_crcr\_noalign{\_kern2\_pt\_global\_let\_cr\_endline}}%
- \_ialign{$##$\_hfil\_kern2\_pt\_kern\_ptrenwd&\_thinspace\_hfil$##$\_hfil
+\_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 \_kern2\_pt}%
+ \_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 ;
@@ -797,8 +797,8 @@
\_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
+ \_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
@@ -857,9 +857,7 @@ plain\TeX/, but they are `\protected`.
These macros are defined similarly as in plain\TeX. Only internal macro
names from plain\TeX/ with `@` character are we-written in more readable
-form. The macro `\_setpt` is introduced. This sets `\_pt` dimen to 1 pt if
-10 point font is used. In another cases the appropriate scaling is applied.
-
+form.
\secc Matchchardefs from AMS fonts
%---------------------------------
diff --git a/Master/texmf-dist/tex/luatex/optex/math-preload.opm b/Master/texmf-dist/tex/luatex/optex/math-preload.opm
index a2a5669831e..8ced2c1cc07 100644
--- a/Master/texmf-dist/tex/luatex/optex/math-preload.opm
+++ b/Master/texmf-dist/tex/luatex/optex/math-preload.opm
@@ -135,8 +135,9 @@
\_suppressfontnotfounderror=0
\_public
- \normalmath \boldmath \setmathsizes
- \bf \it \bi \tt \mit \cal \bbchar \frak \script \ptunit ;
+ \setmathsizes \bf \it \bi \tt \mit \cal \bbchar \frak \script \ptunit ;
+
+\_def \normalmath {\_normalmath} \_def\boldmath {\_boldmath}
\_endcode %---------------------------------------------------
diff --git a/Master/texmf-dist/tex/luatex/optex/math-unicode.opm b/Master/texmf-dist/tex/luatex/optex/math-unicode.opm
index 9b4cf60acbc..cf800ca5408 100644
--- a/Master/texmf-dist/tex/luatex/optex/math-unicode.opm
+++ b/Master/texmf-dist/tex/luatex/optex/math-unicode.opm
@@ -10,22 +10,15 @@
\_def\_loadmath#1{%
\_ifmathloading
\_initunifonts
- \_isfont"#1"\_iffalse
+ \_isfont{#1}\_iffalse
\_opwarning{Math font "#1" not found, skipped...}%
\_else
\_def\_unimathfont{#1}%
- \_def\_normalmath{%
- \_loadumathfamily 1 {\_unimathfont}{} % Base font
- \_loadmathfamily 4 rsfs % script
- \_setmathdimens
- }%
- \_let\_boldmath=\_normalmath
- \_addto\_boldmath{\_pdfliteral direct {2 Tr .3 w}\_aftergroup\_noboldmath}%
- \_def\_noboldmath{\_pdfliteral direct {0 Tr 0 w}}% faked bold only :-(
- \_normalmath
- \_wterm {MATH-FONT: "#1" -- unicode math prepared.}%
- \_setctable\_optexcatcodes \_input unimath-codes.opm \_restorectable
- \_mathloadingfalse
+ \_let\_normalmath = \_normalunimath \_let\_boldmath = \_boldunimath
+ \_normalmath
+ \_wterm {MATH-FONT: "#1" -- unicode math prepared.}%
+ \_setctable\_optexcatcodes \_input unimath-codes.opm \_restorectable
+ \_mathloadingfalse
\_fi\_fi}
\_def\_loadboldmath#1#2\to #3{%
@@ -34,14 +27,25 @@
\_opwarning{Bold-Math font "#1" not found, skipped...}
\_else
\_def\_unimathboldfont{#1}%
- \_def\_boldmath{%
- \_loadumathfamily 1 {\_unimathboldfont}{} % Base font
- \_loadmathfamily 4 rsfs % script
- \_setmathdimens
- }%
\_wterm {MATH-FONT: "#1" -- unicode math bold prepared.}%
\_fi\_fi}
+\_def\_normalunimath{%
+ \_loadumathfamily 1 {\_unimathfont}{} % Base font
+ \_loadmathfamily 4 rsfs % script
+ \_setmathdimens
+}%
+\_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
+ \_setmathdimens
+}%
+
+
\_def\_umathname#1#2{"#1:\_mfontfeatures#2"}
\_def\_mfontfeatures{mode=base;script=math;}
@@ -56,13 +60,13 @@
\_optsize=\_optsizesave \_relax
}
-\_newcount\umathnumA \_newcount\umathnumB
+\_newcount\_umathnumA \_newcount\_umathnumB
-\def\umathcorr#1#2{\expandafter#1\expandafter{\the#2}}
-\def\umathprepare#1{\def\umathscanholes##1[#1]##2##3\relax{##2}}
-\def\umathvalue#1{\expandafter\umathscanholes\umathcharholes[#1]{#1}\relax}
+\_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:
+\_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}%
@@ -70,25 +74,25 @@
[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\_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
+\_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
}
\_public
@@ -120,27 +124,6 @@ accepts only codes less than 255.
See http://tex.stackexchange.com/questions/308749/ for more technical details.
-The poor bold is used for complete bold vaiant of the font. If the selected
-font has its bold vaiant (like xits-math), you can re-define \boldmath macro
-by:
-
-\def\boldmath{%
- \loadumathfamily 1 {[xitsmath-bold]}{} % Base font
- \loadmathfamily 4 rsfs % script
- \setmathdimens
-}
-
-XITSmath-bold needs correction: the norm symbol ||x|| is missing here. So, you
-can define:
-
-\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
-}
-
--------------------
\loadmath{[XITSMath-Regular]} ... XITS MATH^^J
diff --git a/Master/texmf-dist/tex/luatex/optex/op-macros.opm b/Master/texmf-dist/tex/luatex/optex/op-macros.opm
index 659abfe8750..00c8f587052 100644
--- a/Master/texmf-dist/tex/luatex/optex/op-macros.opm
+++ b/Master/texmf-dist/tex/luatex/optex/op-macros.opm
@@ -44,7 +44,6 @@
\_newtoks\_opt
-
% \eoldef \foo #1{thex to end of line is: #1}
\_def\_eoldef #1{\_def #1{\_begingroup \_catcode`\^^M=12 \_eoldefA #1}%
@@ -84,11 +83,23 @@
\_def\_enquotes{\_chardef\"="201C } % use \"text" for English quotes
+%> \removespaces text with spaces {} -> textwithspaces
+
+\_def\_removespaces #1 {\_isempty{#1}\_iffalse #1\_ea\_removespaces\_fi}
+
+%> \trycs{<csname>}{<text>}
+
+\_def \_trycs#1#2{\_ifcsname #1\_endcsname \_csname #1\_endcsname \_else #2\_fi}
+
\public
\setctable \restorectable
\normalcatodes \opt \optdef \eoldef \replstring
- \keepinputnames \lastinputname \enquotes ;
+ \keepinputnames \lastinputname \enquotes \removespaces \trycs ;
\_endcode % -------------------------------------
+
+\%> \trycs
+
+`\trycs{<csname>}{<text>} expands to \<csname> if it is defined else to <text>.
diff --git a/Master/texmf-dist/tex/luatex/optex/opmac-rest.opm b/Master/texmf-dist/tex/luatex/optex/opmac-rest.opm
index 4f9dbd1aaf0..4353f891e2c 100644
--- a/Master/texmf-dist/tex/luatex/optex/opmac-rest.opm
+++ b/Master/texmf-dist/tex/luatex/optex/opmac-rest.opm
@@ -10,15 +10,13 @@
\ifx\OPmacversion\undefined \else \endinput \fi
\def\OPmacversion{Jul. 2019}
-\immediate\write16{This is OPmac (Olsak's Plain macros), version <\OPmacversion>}
+\immediate\write16{This is OPmac-rest, version <\OPmacversion>}
%%%%%%%%%%%%%% Basic macros, sec. 3.1 in opmac-d.pdf
\newcount\tmpnum % auxiliary count
\newdimen\tmpdim % auxiliary dimen
-\long\def\addto#1#2{\expandafter\def\expandafter#1\expandafter{#1#2}}
-
\def\protectlist{}
\def\addprotect#1{\addto\protectlist{\doprotect#1}}
\addprotect~
@@ -27,41 +25,14 @@
\let\pdfoutput=\outputmode \def\pdfcolorstackinit{\pdffeedback colorstackinit}\fi
\newif\ifpdftex \pdftextrue
-\ifx\pdfoutput\undefined \pdftexfalse \else \ifnum\pdfoutput=0 \pdftexfalse \fi \fi
-\ifx\XeTeXversion\undefined \else \pdftextrue \fi
-
-\def\sdef#1{\expandafter\def\csname#1\endcsname}
-\def\sxdef#1{\expandafter\xdef\csname#1\endcsname}
-\def\slet#1#2{\expandafter\let\csname#1\expandafter\endcsname\csname#2\endcsname}
-
-\def\adef#1{\catcode`#1=13 \begingroup \lccode`\~=`#1\lowercase{\endgroup\def~}}
-
-\def\isdefined #1#2{\expandafter\ifx \csname#1\endcsname \relax
- \csname iffalse\expandafter\endcsname
- \else
- \csname iftrue\expandafter\endcsname
- \fi
-}
-\long\def\isinlist#1#2#3{\begingroup \long\def\tmp##1#2##2\end{\def\tmp{##2}%
- \ifx\tmp\empty \endgroup \csname iffalse\expandafter\endcsname \else
- \endgroup \csname iftrue\expandafter\endcsname \fi}% end of \def\tmp
- \expandafter\tmp#1\endlistsep#2\end
-}
-\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}
\def\maybebreak{\afterassignment\maybebreakA\tmpdim=}
\def\maybebreakA{\ifvmode \vskip0pt plus\tmpdim \penalty-130 \vskip0pt plus-\tmpdim
\else \hskip0pt plus\tmpdim \penalty-130 \hskip0pt plus-\tmpdim \fi \relax
}
-%\long\def\uv#1{\clqq#1\crqq}
\let\\=\undefined
-{\lccode`\?=`\% \lowercase{\gdef\percent{?}}}
-{\lccode`\?=`\\ \lowercase{\gdef\bslash{?}}}
\def\,{\relax\ifmmode \mskip\thinmuskip \else \thinspace \fi}
-\addprotect\percent \addprotect\bslash \addprotect\, \addprotect\exfont
+\addprotect\, \addprotect\exfont
\bgroup \catcode`!=3 \catcode`?=3
\gdef\replacestrings#1#2{\long\def\replacestringsA##1#1{\def\tmpb{##1}\replacestringsB}%
@@ -79,8 +50,9 @@
\showboxdepth=7
\showboxbreadth=30
-\newdimen\iindent \iindent=\parindent
+\newdimen\_iindent \_iindent=\parindent
% indentation of items, TOC, captions, list of bib. references
+\_public \iindent ;
\def\iiskip{\medskip} % space above and below \begitems...\enditems
\def\itemhook{} % hook in \startitem
@@ -120,10 +92,8 @@
%%%%%%%%%%%%%% Multilingual support, sec. 3.5 in opmac-d.pdf
-\def\mtext#1{\_ifcsname _mt:#1:\csname _lan:\_the\_language\_endcsname\_endcsname
- \_csname _mt:#1:\_csname _lan:\_the\_language\_endcsname\_endcsname
- \_else \_csname _mt:#1:en\_endcsname \_fi
-}
+\def\mtext#1{\_csname _mt:#1:\_trycs{_lan:\_the\_language}{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}
@@ -131,59 +101,9 @@
%%%%%%%%%%%%%% REF file, sec 3.6 in opmac-d.pdf
-\newwrite\reffile
-\newread\testin
-
-\def\wrefrelax#1#2{}
-\let\wref=\wrefrelax
-
-\def\inputref{
- \openin\testin=\jobname.ref
- \ifeof\testin \else
- \closein\testin
- \input \jobname.ref
- \fnotenum=0 \mnotenum=0
- \openrefA{\string\inputref}%
- \fi
-}
-\def\openref{%
- \ifx\wref\wrefrelax \openrefA{\string\openref}\fi
- \gdef\openref{}%
-}
-\def\openrefA#1{%
- \immediate\openout\reffile=\jobname.ref
- \gdef\wref##1##2{\write\reffile{\string##1##2}}%
- \immediate\write\reffile {\percent\percent\space OPmac - REF file (#1)}%
- \immediate\wref\Xrefversion{{\REFversion}}%
-}
-\def\REFversion{2}
-\def\Xrefversion#1{\ifnum#1=\REFversion\relax \else \endinput \fi}
%%%%%%%%%%%%%% \label, \ref, \pgref, sec. 3.7 in opmac-d.pdf
-\def\label[#1]{\isdefined{l0:#1}%
- \iftrue \opwarning{duplicated label [#1], ignored}\else \xdef\lastlabel{#1}\fi
- \ignorespaces}
-
-\def\wlabel#1{%
- \ifx\lastlabel\undefined \else
- \dest[ref:\lastlabel]%
- {\protectlist\edef\tmp{\wref\Xlabel{{\lastlabel}{#1}}}\expandafter}\tmp
- \sxdef{lab:\lastlabel}{#1}\sxdef{l0:\lastlabel}{}%
- \global\let\lastlabel=\undefined
- \fi
-}
-\def\ref[#1]{\isdefined{lab:#1}%
- \iftrue \reflink[#1]{\csname lab:#1\endcsname}%
- \else ??\opwarning{label [#1] unknown. Try to TeX me again}\openref
- \fi
-}
-\def\pgref[#1]{\isdefined{pgref:#1}%
- \iftrue \pglink{\csname pgref:#1\endcsname}%
- \else ??\opwarning{pg-label [#1] unknown. Try to TeX me again}\openref
- \fi
-}
-\def\Xlabel#1#2{\sdef{lab:#1}{#2}\sxdef{pgref:#1}{\the\lastpage}}
%%%%%%%%%%%%%% Chapters, sections, subsections -- sec. 3.8 in opmac-d.pdf
@@ -216,39 +136,45 @@
\eoldef\chap#1{\ifnonum\else \global\advance\chapnum by1 \fi
\chaphook {\globaldefs=1 \secnum=0 \seccnum=0 \tnum=0 \fnum=0 \dnum=0}\relax
- \edef\thechapnum{\the\chapnum}\let\thetocnum=\thechapnum
+ \edef\thechapnum{\ifnonum\space\else\the\chapnum\fi}\let\thetocnum=\thechapnum
\edef\thesecnum{\othe\chapnum.\the\secnum}%
- \def\dotocnumafter{\wtotoc0\bfshape{#1}}%
+ \def\dotocnumafter{\ea\wtotoc\ea{\thechapnum}1{chap}{#1}}%
\printchap{#1}\resetnonumnotoc
}
\eoldef\sec#1{\ifnonum\else \global\advance\secnum by1 \fi
\sechook {\globaldefs=1 \seccnum=0 \tnum=0 \fnum=0 \dnum=0}\relax
- \edef\thesecnum{\othe\chapnum.\the\secnum}\let\thetocnum=\thesecnum
- \def\dotocnumafter{\wtotoc1\rm{#1}}%
+ \edef\thesecnum{\ifnonum\space\else\othe\chapnum.\the\secnum\fi}\let\thetocnum=\thesecnum
+ \def\dotocnumafter{\ea\wtotoc\ea{\thesecnum}2{sec}{#1}}%
\printsec{#1}\resetnonumnotoc
}
\eoldef\secc#1{\ifnonum\else \global\advance\seccnum by1 \fi
\secchook {}\relax
- \edef\theseccnum{\othe\chapnum.\the\secnum.\the\seccnum}\let\thetocnum=\theseccnum
- \def\dotocnumafter{\wtotoc2\rm{#1}}%
+ \edef\theseccnum{\ifnonum\space\else\othe\chapnum.\the\secnum.\the\seccnum\fi}\let\thetocnum=\theseccnum
+ \def\dotocnumafter{\ea\wtotoc\ea{\theseccnum}3{secc}{#1}}%
\printsecc{#1}\resetnonumnotoc
}
-\def\wtotoc#1#2#3{% #1 = level, #2 = info, #3 = titletext
+
+\def\wtotoc#1#2#3#4{% #1 = number, #2 = level, #3 = info, #4 = text
\ifnotoc\else
- \def\act{\wref{\Xtoc{#1}{\noexpand#2}}}%
- \expandafter\act\expandafter{\expandafter{\thetocnum}{#3}{\the\pageno}}%
+ \_wref\_Xtoc{{#2}{#3}{#1}{\detokenize{#4}}}%
+ \_incr\_tocrefnum
\fi
}
+\_def\_incr#1{\_global\_advance#1by1 }
+
+\_newcount\_tocrefnum
+
\def\wcontents#1#2{% #1 = sequence to REF, #2 = titletext
\ifnotoc\else
- \expandafter\wref\expandafter#1\expandafter
+ \expandafter\_wref\expandafter#1\expandafter
{\expandafter{\thetocnum}{#2}{\the\pageno}}%
\fi
}
\def\dotocnum#1{%
\leavevmode
{\ifnonum \global\advance\nonumnum by1 \edef\thetocnum{!\the\nonumnum}\fi
- \wlabel\thetocnum \dest[toc:\tocilabel.\thetocnum]%
+ \wlabel\thetocnum
+ \ifnotoc \else \_dest[toc:\_the\_tocrefnum]\fi
\dotocnumafter}\ifnonum\else#1\fi
\global\let\dotocnumafter=\relax
}
@@ -272,6 +198,9 @@
\let\firstnoindent=\afternoindent
\def\nbpar{{\interlinepenalty=10000\endgraf}}
\def\nl{\hfil\break}
+\addto\_begoutput{\_def\nl{\_unskip\_space}}
+\addto\_pretocline{\_def\nl{\_unskip\_space}}
+
%%%%%%%%%%%%%% Captions, equations -- sec. 3.9 in opmac-d.pdf
@@ -286,8 +215,8 @@
\else \opwarning{Unknown caption /#1}%
\fi
\bgroup
- \leftskip=\iindent plus1fil
- \rightskip=\iindent plus-1fil
+ \leftskip=\_iindent plus1fil
+ \rightskip=\_iindent plus-1fil
\parfillskip=0pt plus2fil
\def\par{\nbpar\egroup}%
\captionhook{#1}\noindent
@@ -309,7 +238,7 @@
\def\begitems{\par\iiskip\bgroup
\itemnum=0 \adef*{\startitem}
- \advance\leftskip by\iindent
+ \advance\leftskip by\_iindent
\let\printitem=\normalitem
}
\def\enditems{\par\egroup\iiskip}
@@ -340,27 +269,10 @@
%%%%%%%%%%%%%% TOC -- sec. 3.11 in opmac-d.pdf
-\def\_toclist{} \newif\ifischap \ischapfalse
-
-\def\Xtoc#1#2#3#4#5{\ifnum#1=0 \ischaptrue\fi \addto\_toclist{\_tocline{#1}{#2}{#3}{#4}{#5}}}
-\def\Xchap{\Xtoc0\bfshape} \def\Xsec{\Xtoc1\rm} \def\Xsecc{\Xtoc2\rm}
-
-\def\_tocline#1#2#3#4#5{{\leftskip=#1\iindent \rightskip=2\iindent
- \ifischap\advance\leftskip by\iindent\fi
- \ifnum#1>1 \advance\leftskip by\iindent\fi
- \toclinehook \noindent\llap{#2\toclink{#3}\enspace}%
- {#2#4}\nobreak\tocdotfill\pglink{#5}\nobreak\hskip-2\iindent\null\par}}
-\def\tocdotfill{\leaders\hbox to.8em{\hss.\hss}\hskip 1em plus1fill\relax}
-
-\def\maketoc{\par \ifx\_toclist\empty
- \opwarning{\noexpand\maketoc -- data unavailable, TeX me again}\openref
- \else \_toclist \fi}
-
-\def\toclinkA#1{\def\tmp##1!##2\end{\if^##1^\kern.8em \else##1\fi}\tmp#1!\end}
%%%%%%%%%%%%%% Index -- sec. 3.12 on opmac-d.pdf
-\def\iindex#1{\openref\wref\Xindex{{#1}{\the\pageno}}}
+\def\iindex#1{\_openref\_wref\_Xindex{{#1}{\the\pageno}}}
\def\ii #1 {\leavevmode\def\tmp{#1}\iiA #1,,}
@@ -375,15 +287,15 @@
\def\iid #1 {\leavevmode\iindex{#1}#1\futurelet\tmp\iiD}
\def\iiD{\ifx\tmp,\else\ifx\tmp.\else\space\fi\fi}
-\def\Xindex{\Xindexg,}
-\def\Xindexg#1#2#3{\bgroup \def~{ }% #1=prefix, #2=index-item, #3=pageno
+\def\_Xindex{\_Xindexg,}
+\def\_Xindexg#1#2#3{\bgroup \def~{ }% #1=prefix, #2=index-item, #3=pageno
\isdefined{#1#2}\iftrue
\ifx^#3^\else
- \expandafter\firstdata \csname#1#2\endcsname \XindexA
+ \expandafter\firstdata \csname#1#2\endcsname \_XindexA
\ifnum#3=\tmpa % \ii on the same page
\else
\tmpnum=#3 \advance\tmpnum by\pgfolioB-1
- \expandafter\seconddata \csname#1#2\endcsname \XindexB
+ \expandafter\seconddata \csname#1#2\endcsname \_XindexB
\ifx\tmp\empty
\sxdef{#1#2}{{#3/+}{\pgfolioA{#3}}} % previous item: empty page
\else
@@ -417,8 +329,8 @@
\def\seconddata#1#2{\expandafter\expandafter\expandafter #2\expandafter\seconddataA#1}
\def\seconddataA#1#2{#2&}
-\def\XindexA#1/#2&{\def\tmpa{#1}\let\tmpb=#2}
-\def\XindexB#1&{\def\tmp{#1}}
+\def\_XindexA#1/#2&{\def\tmpa{#1}\let\tmpb=#2}
+\def\_XindexB#1&{\def\tmp{#1}}
\def\pgfolioA#1{\ifnum#1<0 \romannumeral-\fi#1}
\def\pgfolioB{\ifnum\tmpnum<0-\fi}
@@ -429,7 +341,7 @@
\bgroup
\setprimarysorting
\def\act##1{\ifx##1\relax \else
- \firstdata##1\XindexA \seconddata##1\XindexB
+ \firstdata##1\_XindexA \seconddata##1\_XindexB
\if\tmpb+%
\preparesorting##1% converted item by sorting data in \tmpb
\xdef##1{{\tmpb}{\tmp}}
@@ -442,7 +354,7 @@
\egroup
\dosorting % sorting is in progress
\bgroup
- \rightskip=0pt plus1fil \exhyphenpenalty=10000 \leftskip=\iindent
+ \rightskip=0pt plus1fil \exhyphenpenalty=10000 \leftskip=\_iindent
\def\act##1{\ifx##1\relax \else \prepii##1%
\seconddata##1\printiipages \expandafter\act \fi}
\expandafter \act \iilist \relax
@@ -466,7 +378,7 @@
\def\iispeclist{}
\def\printii #1&{\gdef\currii{#1}\noindent\everyii
- \hskip-\iindent \ignorespaces\printiiA#1//}
+ \hskip-\_iindent \ignorespaces\printiiA#1//}
\def\printiiA #1/{\if^#1^\let\previi=\currii \else
\expandafter\scanprevii\previi/&\def\tmpb{#1}\edef\tmpb{\meaning\tmpb}%
\ifx\tmpa\tmpb \iiemdash \else#1 \gdef\previi{}\fi
@@ -706,6 +618,8 @@
\newif\iflocalcolor \localcolorfalse
\let\localcolor=\localcolortrue
+\let\_localcolor=\localcolortrue
+
% for backward compatibility:
\let\longlocalcolor=\localcolor \let\locpgcolor=\relax
@@ -769,77 +683,6 @@
%%%%%%%%%%%%%% Hyperrefs -- sec. 3.16 in opmac-d.pdf
-\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]{}
-
-\def\linkactive[#1:#2]#3#4{\leavevmode\pdfstartlink height.9em depth.3em
- \pdfborder{#1} goto name{#1:#2}\relax {#3#4}\pdfendlink
-}
-\def\link[#1]#2#3{\leavevmode{#3}}
-
-\def\urllink[#1:#2]#3{{\let~=\relax \let\\=\relax \let\{=\relax \let\}=\relax
- \leavevmode\pdfstartlink height.9em depth.3em
- \pdfborder{#1}user{/Subtype/Link/A <</Type/Action/S/URI/URI(#2)>>}\relax
- {\def~{\nobreak\space}\_urlcolor#3}\pdfendlink}%
-}
-\def\toclink#1{\toclinkA{#1}}
-\def\pglink#1{\leavevmode{\pgfolioA{#1}}}
-\def\citelink#1#2{\leavevmode{#2}}
-\def\reflink[#1]#2{\leavevmode{#2}}
-\def\ulink[#1]#2{\leavevmode{#2}}
-\def\_urlcolor{}
-
-\def\hyperlinks#1#2{%
- \let\dest=\destactive \let\link=\linkactive
- \def\toclink##1{\link[toc:\tocilabel.##1]{\localcolor#1}{\toclinkA{##1}}}%
- \def\pglink##1{\link[pg:\pgilabel.##1]{\localcolor#1}{\pgfolioA{##1}}}%
- \def\citelink##1##2{\link[cite:##1]{\localcolor#1}{##2}}%
- \def\reflink[##1]##2{\link[ref:##1]{\localcolor#1}{##2}}%
- \def\ulink[##1]##2{\urllink[url:##1]{##2}}%
- \def\_urlcolor{\localcolor#2}%
-}
-\def\tocilabel{} \def\pgilabel{}
-
-\def\pdfborder#1{\if^#1^\else \isdefined{#1border}\iftrue
- \if^\csname#1border\endcsname^\else attr{/C[\csname#1border\endcsname] /Border[0 0 .6]}\fi
- \else attr{/Border[0 0 0]}\fi\fi
-}
-
-\ifpdftex \else
- \def\link[#1]#2#3{#3}
- \def\urllink[#1]#2{#2}
- \def\hyperlinks#1#2{\opwarning{No pdfTeX detected, \noexpand\hyperlinks ignored}}
-\fi
-
-\def\url#1{{\def\tmpb{#1}%
- \replacestrings{//}{{\urlskip\urlslashslash\urlbskip}}%
- \replacestrings{/}{{\urlskip/\urlbskip}}%
- \replacestrings{.}{{\urlskip.\urlbskip}}%
- \replacestrings{?}{{\urlskip?\urlbskip}}%
- \replacestrings{=}{{\urlskip=\urlbskip}}%
- \replacestrings{~}{{\char`\~}}%
- \replacestrings{_}{{\char`\_}}%
- \replacestrings{^}{{\char`\^}}%
- \replacestrings{\\}{\bslash}%
- \replacestrings{\{}{{\char`\{}}%
- \replacestrings{\}}{{\char`\}}}%
- \replacestrings{&}{{\urlbskip\char`\& \urlskip}}%
- \def\|{}\ulink[#1]{\urlfont\tmpb\null}%
-}}
-\def\urlfont{\tt \let\|=\urlspecchar}
-\def\urlspecchar{\penalty10 }
-\def\urlskip{\null\nobreak\hskip0pt plus0.05em\relax}
-\def\urlbskip{\penalty100 \hskip0pt plus0.05em\relax}
-\def\urlslashslash{/\urlskip/}
-\addprotect\url
-
%%%%%%%%%%%%%% Outlines -- sec. 3.17 in opmac-d.pdf
%%%%%%%%%%%%%% Verbatim, \begtt, \endtt -- sec. 3.18 in opmac-d.pdf
@@ -996,43 +839,44 @@
%%%%%%%%%%%%%% \fnote, \mnote -- sec 3.22 in opmac-d.pdf
-\newcount\fnotenum \fnotenum=0
-\newcount\fnotenumlocal
+\newcount\_fnotenum \_fnotenum=0
+\newcount\_fnotenumlocal
\newif\iflocfnum \locfnumtrue
-\long\def\fnoteG#1#2{\global\advance \fnotenum by1
+\long\def\fnoteG#1{\global\advance \_fnotenum by1
\ifx\relax#1\relax\else\leavevmode\fi
- \iflocfnum \openref\wref\Xfnote{}%
- \isdefined{fn:\the\fnotenum}\iftrue
+ \iflocfnum \_openref\_wref\_Xfnote{}%
+ \isdefined{fn:\the\_fnotenum}\iftrue
\else\opwarning{unknown \noexpand\fnote mark. TeX me again}\fi\fi
- #1{\everypar={}\fnotehook\scalemain\typoscale[800/800]\vfootnote\fnmarkx{#2}}%
+ #1\_opfootnote\fnset\fnmarkx
}
+\def\fnset{\everypar={}\fnotehook\scalemain\typoscale[800/800]}
\def\fnote{\fnoteG\fnmarkx}
\def\fnotetext{\fnoteG{}}
-\def\fnotemark#1{{\advance\fnotenum by#1\relax \fnmarkx}}
-\def\fnmarkx{\isdefined{fn:\the\fnotenum}\iftrue\thefnote\else$^?$\fi}
+\def\fnotemark#1{{\advance\_fnotenum by#1\relax \fnmarkx}}
+\def\fnmarkx{\isdefined{fn:\the\_fnotenum}\iftrue\thefnote\else$^?$\fi}
\def\thefnote{$^{\locfnum}$}
-\def\locfnum{\csname fn:\the\fnotenum\endcsname}
+\def\locfnum{\csname fn:\the\_fnotenum\endcsname}
-\def\Xfnote{\advance\fnotenumlocal by1 \advance\fnotenum by1
- \sxdef{fn:\the\fnotenum}{\the\fnotenumlocal}}
+\def\_Xfnote{\advance\_fnotenumlocal by1 \advance\_fnotenum by1
+ \sxdef{fn:\the\_fnotenum}{\the\_fnotenumlocal}}
-\def\runningfnotes{\locfnumfalse\def\locfnum{\the\fnotenum}\def\fnmarkx{\thefnote}}
+\def\runningfnotes{\locfnumfalse\def\locfnum{\the\_fnotenum}\def\fnmarkx{\thefnote}}
-\newcount\mnotenum \mnotenum=0 % global counter of mnotes
+\newcount\_mnotenum \_mnotenum=0 % global counter of mnotes
\newdimen\mnoteskip \mnoteskip=0pt
\long\def\mnote#1{\ifvmode \hbox{\vbox to\ht\strutbox{}\mnoteA{#1}}\nobreak\vskip-\baselineskip
\else \strut\vadjust{\kern-\dp\strutbox \mnoteA{#1}\kern\dp\strutbox}%
\fi
}
-\long\def\mnoteA#1{\global\advance \mnotenum by1
+\long\def\mnoteA#1{\global\advance \_mnotenum by1
\ifx\mnotesfixed\undefined
- \isdefined{mn:\the\mnotenum}\iftrue
+ \isdefined{mn:\the\_mnotenum}\iftrue
\else\opwarning{unknown \noexpand\mnote side. TeX me again}\fi
- \edef\tmp{\csname mn:\the\mnotenum\endcsname}%
- \openref\wref\Xmnote{}\ifvmode\nobreak\fi
+ \edef\tmp{\csname mn:\the\_mnotenum\endcsname}%
+ \_openref\_wref\_Xmnote{}\ifvmode\nobreak\fi
\else \let\tmp=\mnotesfixed \fi
\expandafter\ifx\tmp \left
\hbox to0pt{\kern-\mnotesize \kern-\mnoteindent
@@ -1046,11 +890,14 @@
\dp0=0pt \box0 \kern\mnoteskip \global\mnoteskip=0pt}\hss}%
\fi
}
-\def\Xmnote{\advance\mnotenum by1
- \sxdef{mn:\the\mnotenum}{\ifodd\lastpage \right \else \left \fi}}
+\def\_Xmnote{\advance\_mnotenum by1
+ \sxdef{mn:\the\_mnotenum}{\ifodd\lastpage \right \else \left \fi}}
\def\fixmnotes#1{\def\mnotesfixed{#1}}
+\_addto\_begoutput{\def\fnote##1{}\def\fnotemark##1{}}
+\_addto\_pretocline{\def\fnote##1{}\def\fnotemark##1{}}
+
%%%%%%%%%%%%%% \cite, \bib, \usebibtex, \usebbl -- sec. 3.23 in opmac-d.pdf
\newwrite\auxfile % AUX file for BibTeX
@@ -1067,7 +914,7 @@
\if *#1\addcitelist{*}\expandafter \skiptorelax \fi
\isdefined{bib:#1#2}\iftrue \else
\addcitelist{#1#2}%
- \opwarning{The cite [#1#2] unknown. Try to TeX me again}\openref
+ \opwarning{The cite [#1#2] unknown. Try to TeX me again}\_openref
\addto\savedcites{?,}\def\sortcitesA{}\lastcitenum=0
\expandafter\gdef\csname bib:#1#2\endcsname {}%
\expandafter \skiptorelax \fi
@@ -1128,8 +975,8 @@
}
\def\shortcitations{\lastcitenum=1 }
-\def\printcite#1{\citesep\citelink{#1}{\citelinkA{#1}}\def\citesep{,\hskip.2em\relax}}
-\def\printdashcite#1{\ifmmode-\else\hbox{--}\fi\citelink{#1}{\citelinkA{#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}$}%
@@ -1139,7 +986,7 @@
\def\citelinkA{}
\def\ecite[#1]{\bgroup\citeA#1,,,\expandafter\eciteB\savedcites;}
-\def\eciteB#1,#2;#3{\if?#1\relax #3\else \citelink{#1}{#3}\fi\egroup}
+\def\eciteB#1,#2;#3{\if?#1\relax #3\else \_ilink[cite:#1]{#3}\fi\egroup}
\def\bib[#1]{\def\tmp{\isnextchar={\bibA[#1]}{\bibmark={}\bibB[#1]}}%
\expandafter\tmp\romannumeral-`\.} % ignore optional space
@@ -1149,23 +996,23 @@
\noindent \def\tmpb{#1}\wbib{#1}{\the\bibnum}{\the\bibmark}%
\printbib \ignorespaces
}
-\def\wbib#1#2#3{\dest[cite:\the\bibnum]%
- \ifx\wref\wrefrelax\else \immediate\wref\Xbib{{#1}{#2}{#3}}\fi}
+\def\wbib#1#2#3{\_dest[cite:\the\bibnum]%
+ \ifx\_wref\wrefrelax\else \immediate\_wref\_Xbib{{#1}{#2}{#3}}\fi}
-\def\Xbib#1#2#3{\sdef{bib:#1}{\bibnn{#2}&}\if^#3^\else\sdef{bim:#2}{#3}\fi\def\lastbibnum{#2}}
+\def\_Xbib#1#2#3{\sdef{bib:#1}{\bibnn{#2}&}\if^#3^\else\sdef{bim:#2}{#3}\fi\def\lastbibnum{#2}}
-\def\printbib{\hangindent=\iindent
- \ifx\citelinkA\empty \noindent\hskip\iindent \llap{[\the\bibnum] }%
+\def\printbib{\hangindent=\_iindent
+ \ifx\citelinkA\empty \noindent\hskip\_iindent \llap{[\the\bibnum] }%
\else \noindent \fi
}
\def\addcitelist#1{\global\addto\citelist{\citeI[#1]}}
\def\writeaux#1{\immediate\write\auxfile{\string\citation{#1}}}
-\def\writeXcite#1{\openref\immediate\wref\Xcite{{#1}}}
+\def\writeXcite#1{\_openref\immediate\_wref\_Xcite{{#1}}}
\def\citelist{} \def\citelistB{}
\def\usebibtex#1#2{%
- \openref \openauxfile{#1}{#2}%
+ \_openref \openauxfile{#1}{#2}%
\def\citeI[##1]{\writeaux{##1}}\citelist
\global\let\addcitelist=\writeaux
\bgroup \readbblfile{\jobname}\egroup
@@ -1173,7 +1020,7 @@
\def\openauxfile#1#2{%
\immediate\openout\auxfile=\jobname.aux
\immediate\write\auxfile
- {\percent\percent\space Opmac: AUX file reserved for bibtex only}%
+ {\_pcent\_pcent\space Opmac: AUX file reserved for bibtex only}%
\immediate\write\auxfile{\string\bibdata{#1}}%
\immediate\write\auxfile{\string\bibstyle{#2}}%
}
@@ -1188,7 +1035,7 @@
\def\httpAddr##1{\url{http:##1}}\def\\{\hfill\break}%
\def\newblock{\hskip .11em plus.33em minus.07em}%
\def\mbox{\leavevmode\hbox}\def\emph##1{{\it##1}}%
- \parindent=\iindent \bibtexhook\relax
+ \parindent=\_iindent \bibtexhook\relax
\input #1.bbl
\par
\fi
@@ -1204,7 +1051,7 @@
\def\genbbl#1#2{\openauxfile{#1}{#2}%
\immediate\write\auxfile{\string\citation{*}}%
\bgroup
- \iindent=4em
+ \_iindent=4em
\def\bibitemC##1{\par\ifnum\bibnum>0 \bibskip \fi
\advance\bibnum by1
\noindent \hangindent=\parindent
@@ -1245,7 +1092,7 @@
\global\let\addcitelist=\writeXcite
\egroup
}
-\def\Xcite#1{\addto\citelistB{\citeI[#1]}}
+\def\_Xcite#1{\addto\citelistB{\citeI[#1]}}
\newcatcodetable\savedcatcodes
@@ -1253,19 +1100,12 @@
%%%%%%%%%%%%%% output -- sec. 3.24 in opmac-d.pdf
-\addto\_begoutput{%
- \immediate\wref\Xpage{{\the\pageno}}%
- \def\nl{ }\def\fnote##1{}\def\fnotemark##1{}%
-}
\def\doprotect#1{\let#1=\relax}
-\def\_pagedest{\def\destheight{25pt}\dest[pg:\pgilabel.\the\pageno]}
+\def\_pagedest{\def\destheight{25pt}\_dest[pg:\_the\_gpageno]}
%\footline={\hss\_tenrm\thefontsize[10]\folio\hss}
-\newcount\lastpage \lastpage=0 % the last page of the document
-\def\Xpage#1{\lastpage=#1 \fnotenumlocal=0 }
-
%%%%%%%%%%%%%% margins -- sec. 3.25 in opmac-d.pdf
@@ -1287,7 +1127,7 @@
\eoldef\author##1{\removelastskip\bigskip
{\leftskip=0pt plus1fill \rightskip=\leftskip \it \noindent ##1\par}\nobreak\bigskip
}
- \parindent=1.2em \iindent=\parindent \_ttindent=\parindent
+ \parindent=1.2em \_iindent=\parindent \_ttindent=\parindent
\footline={\global\footline={\hss\_tenrm\thefontsize[10]\folio\hss}}
\runningfnotes
}
diff --git a/Master/texmf-dist/tex/luatex/optex/optex.ini b/Master/texmf-dist/tex/luatex/optex/optex.ini
index 280dd347ca0..802e6ccc2eb 100644
--- a/Master/texmf-dist/tex/luatex/optex/optex.ini
+++ b/Master/texmf-dist/tex/luatex/optex/optex.ini
@@ -20,7 +20,7 @@
% OpTeX version
-\def\optexversion{Alpha 0.03 Feb 2020}
+\def\optexversion{Alpha 0.05 Feb 2020}
% Engine testing:
@@ -62,8 +62,12 @@
\input fonts-opmac.opm % font managing macros from OPmac
\input outlines.opm % PDF outlines
\input pdfuni-string.opm % PDFunicode strings for outlines
+\input maketoc.opm % maketoc
\input output.opm % output routine
\input margins.opm % macros for margins setting
+\input ref-file.opm % ref file
+\input references.opm % references
+\input hyperlinks.opm % hyperlinks
\input verbatim.opm % verbatim
\input logos.opm % standard logos
\input uni-lcuc.opm % Setting lccodes and uccodes for Unicode characters
@@ -74,7 +78,7 @@
\_everyjob = {%
\_message{This is OpTeX (Olsak's Plain TeX), version <\optexversion>^^J}%
\_mathsbon % replaces \int_a^b to \int _a^b
- \inputref % inputs \jobname.ref if exists
+ \_inputref % inputs \jobname.ref if exists
}
\let\loadmathfonts=\relax % TODO: unicode-math
diff --git a/Master/texmf-dist/tex/luatex/optex/outlines.opm b/Master/texmf-dist/tex/luatex/optex/outlines.opm
index e95f4ec9c5f..5a5529a0858 100644
--- a/Master/texmf-dist/tex/luatex/optex/outlines.opm
+++ b/Master/texmf-dist/tex/luatex/optex/outlines.opm
@@ -2,23 +2,25 @@
\_codedecl \pdfunidef {PDFunicode strings for outlines <2019-05-21>}
-\_def\_outlines#1{\_pdfcatalog{/PageMode/UseOutlines}\openref
+\_def\_outlines#1{\_pdfcatalog{/PageMode/UseOutlines}\_openref
\_ifx\_toclist\_empty
\_opwarning{\noexpand\outlines -- data unavailable. TeX me again}%
\_else
- \_ifx\_urlcolor\_empty
+ \_ifx\_dest\_destactive \_else
\opwarning{\_noexpand\outlines doesn't work when \_noexpand\hyperlinks isn't declared}\_fi
{\_let\_tocline=\_outlinesA
- \_count0=0 \_count1=0 \_toclist % calculate numbers o childs
+ \_count0=0 \_count1=0 \_count2=0 \_count3=0 \_toclist % calculate numbers o childs
\_def\_outlinelevel{#1}\_let\_tocline=\_outlinesB
- \_count0=0 \_count1=0 \_toclist}% create outlines
+ \_tocrefnum=0 \_count0=0 \_count1=0 \_count2=0 \_count3=0 \_toclist}% create outlines
\_fi
}
-\_def\_outlinesA#1#2#3#4#5{%
+\_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}\_fi
+ \_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
@@ -27,21 +29,24 @@
\_else \_sxdef{#1}{1}%
\_fi
}
-\_def\_outlinesB#1#2#3#4#5{%
+\_def\_outlinesB#1#2#3#4#5#6{%
\_advance\_count#1 by1
- \_ifcase#1\_tmpnum=\_csifdefined{_ol:\_the\_count0}{0}\_relax\_or
- \_tmpnum=\_csifdefined{_ol:\_the\_count0:\_the\_count1}{0}\_relax\_or
- \_tmpnum = 0\_relax\_fi
+ \_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}%
- \_outlinesC{#1}{toc:\tocilabel.#3}{\_ifnum#1<\_outlinelevel\_space\_else-\_fi}{\_tmpnum}{\_tmp}%
+ \_outlinesC{#1}{toc:\_the\_tocrefnum}{\_ifnum#1<\_outlinelevel\_space\_else-\_fi}{\_tmpnum}{\_tmp}%
+ \_advance\_tocrefnum by1
}
-\_def\_csifdefined#1#2{\_ifcsname #1\_endcsname \_csname#1\_endcsname \_else #2\_fi}
\_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
- \_pdfoutline goto name{oul:\_the\_oulnum} count0 {#1}\_relax
+ \_pdfdest name{_oul:\_the\_oulnum} xyz\_relax
+ \_pdfoutline goto name{_oul:\_the\_oulnum} count0 {#1}\_relax
}
\_public
@@ -49,14 +54,44 @@
\_endcode % ----------------------------
-The PDF format provides ``outlines'' which are notes placed in the special frame of
-the PDF viewer. These notes can be managed as structured and hyperlinked
-table of contents of the document. The command "\outlines{<level>}" creates
-such outlines from data used for table of contents in the document. The
-"<level>" parameter gives the level of opened sub-outlines
-in the default view. The deeper levels can be open by mouse click on the
-triangle symbol after that.
-
-The command "\insertoutline{<text>}" inserts next entry into PDF outlines at
-the main level~0. This entry can be placed before table of contents (created
-by "\outlines") or after it.
+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 `\outline` macro sets `\_tocline` to `\_outlineA` and
+calculates the number of direct descendants of each record. Second step,
+the `\outline` macro sets `\_tocline` to `\_codlineB` and it uses prepared
+data and crete 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 i finished. Each new outline of given level
+incerases 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 fisrst step then we do:
+
+\begtt
+ \advance \count2 by 1
+ % incerases the mapping pointer of the type
+ % \_ol:<\_count0:\_count1:\_count2> of this section
+ \advance \<_ol:\_count0:\_count1> by 1
+ % incerases 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 `\isertoutline` is used) and the link itself is created too in the
+outline.
diff --git a/Master/texmf-dist/tex/luatex/optex/output.opm b/Master/texmf-dist/tex/luatex/optex/output.opm
index e8028abcf13..a22afe68973 100644
--- a/Master/texmf-dist/tex/luatex/optex/output.opm
+++ b/Master/texmf-dist/tex/luatex/optex/output.opm
@@ -10,9 +10,9 @@
\_shipout\_vbox{%
\_istoksempty \_pgbackground
\_iffalse \_backgroundbox {\_the\_pgbackground}\_nointerlineskip \_fi
- \_istoksempty \_headline \_iffalse \_ensureblack{\_makeheadline}\_fi
+ \_ensureblack{\_makeheadline}%
\_vbox to\_vsize {\_boxmaxdepth=\_maxdepth \_pagecontents}%
- \_istoksempty \_footline \_iffalse \_ensureblack{\_makefootline}\_fi }%
+ \_ensureblack{\_makefootline}}%
\_advancepageno
\_ifnum\_outputpenalty>-20000 \_else\_dosupereject\_fi
}
@@ -21,10 +21,16 @@
\_def \_prepoffsets {} % will be re-defined by margins macros
\_def \_backgroundbox #1{\_moveleft\_hoffset\_vbox to0pt{\_kern-\voffset #1\_vss}}
-\_def\_makeheadline {\_vbox to0pt{\_vskip-\_headlinedist
- \_line{\_copy\_strutbox \_the\_headline}\_vss}\_nointerlineskip}
-\_def\_makefootline{\_baselineskip=\_footlinedist
- \_lineskiplimit=-\maxdimen \_line{\_the\_footline}}
+\_def\_makeheadline {\_istoksempty \_headline \_iffalse
+ \_vbox to0pt{\_vskip-\_headlinedist
+ \_line{\_copy\_strutbox \_the\_headline}\_vss}\_nointerlineskip
+ \_fi
+}
+\_def\_makefootline{\_istoksempty \_footline \_iffalse
+ \_baselineskip=\_footlinedist
+ \_lineskiplimit=-\maxdimen \_line{\_the\_footline}
+ \_fi
+}
\_def\_pagecontents{\_pagedest % destination of the page
\_ifvoid\_topins \_else \_ensureblack{\_unvbox\_topins}\_fi
\_dimen0=\dp255 \_unvbox255 % open up \box255
@@ -48,8 +54,9 @@
\_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 \_global \_advance\_pageno by1 \_fi } % increase |pageno|
+\_def \_advancepageno {%
+ \_ifnum\_pageno<0 \_global\_advance\_pageno by-1 \_else \_incr\_pageno \_fi
+} % increase |pageno|
\_newifi\_ifraggedbottom
\_def \_raggedbottom {\_topskip=10pt plus60pt \_raggedbottomtrue}
\_def \_normalbottom {\_topskip=10pt \_raggedbottomfalse} % undoes \raggedbottom
@@ -60,12 +67,13 @@
\_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 #1{\_insert\_footins\_bgroup
+\_def\_vfootnote#1{\_opfootnote{}{#1}}
+\_def \_opfootnote #1#2{\_insert\_footins\_bgroup
\_interlinepenalty=\_interfootnotelinepenalty
\_splittopskip=\_ht\_strutbox % top baseline for broken footnotes
\_splitmaxdepth=\_dp\_strutbox \_floatingpenalty=20000
- \_leftskip=0pt \_rightskip=0pt \_spaceskip=0pt \_xspaceskip=0pt \_relax
- \_textindent{#1}\_footstrut
+ \_leftskip=0pt \_rightskip=0pt \_spaceskip=0pt \_xspaceskip=0pt \_relax
+ #1\_textindent{#2}\_footstrut
\_isnextchar \_bgroup {\_bgroup \_aftergroup\_vfootA \_let\_next=}{\_vfootB}%
}
\_def\_vfootA{\_strut\_egroup}
@@ -97,6 +105,7 @@
\_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 ;
diff --git a/Master/texmf-dist/tex/luatex/optex/pdfuni-string.opm b/Master/texmf-dist/tex/luatex/optex/pdfuni-string.opm
index dac1c5c3b82..923a08fc86f 100644
--- a/Master/texmf-dist/tex/luatex/optex/pdfuni-string.opm
+++ b/Master/texmf-dist/tex/luatex/optex/pdfuni-string.opm
@@ -12,9 +12,14 @@
}}
\_def\_pdfunidef#1#2{%
\_begingroup
- \_catcode`\\=12 \_let\\=\_nbackslash
+ \_catcode`\\=12 \_let\\=\_bslash
\_the\_pdfstringout % extra defnitions of logos etc.
+ \_the\_outlineshook % user definitions
\_edef#1{#2}%
+ \_ea\_edef \_ea#1\_ea{\_ea\_removeoutmath #1$\_end$}% $x$ -> x
+ \_ea\_edef \_ea#1\_ea{\_ea\_removeoutbraces #1{\_end}}% {x} -> x
+ \_escapechar=-1
+ \_edef#1{\_detokenize\_ea{#1}}%
\_replstring#1{ }{{ }}% text text -> text{ }text
\_edef\_out{\\376\\377}%
\_ea\_pdfunidefB#1^% text -> \_out in octal
@@ -25,14 +30,23 @@
\_def\_pdfunidefB#1{%
\_ifx^#1\_else
\_tmpnum=`#1
- \_ea\_ifx\_nbackslash#1\_pdfunidefC{#1#1}\_else\_pdfunidefC{#1}\_fi
+ \_pdfunidefC{\_luaescapestring{#1}}%
\_ea\_pdfunidefB \_fi
}
\_def\_pdfunidefC #1{\_edef\_out{\_out \\\_ea\_octalprint\_ea{\_the\_tmpnum}{#1}}}
-\_newtoks \_pdfstringout
+\_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}
-\public \pdfunidef \pdfstringout ;
+\_newtoks \_pdfstringout \_newtoks \_outlineshook
+
+\_pdfstringout={\_let\em=\_empty \_let\rm=\_empty \_let\bf=\_empty
+ \_let\it=\_empty \_let\bi=\_empty \_let\tt=\_empty \_let\/=\_empty
+ \_let~=\_space \let\nl=\_space
+}
+
+\public \pdfunidef \outlineshook ;
\_endcode % --------------------------------
diff --git a/Master/texmf-dist/tex/luatex/optex/prefixed.opm b/Master/texmf-dist/tex/luatex/optex/prefixed.opm
index ca84181f6ea..c545c29f1ad 100644
--- a/Master/texmf-dist/tex/luatex/optex/prefixed.opm
+++ b/Master/texmf-dist/tex/luatex/optex/prefixed.opm
@@ -7,7 +7,7 @@
\let\_directlua = \directlua
\_directlua {
- % enable all primitives with _ prefix
+ % enable all TeX primitives with _ prefix
tex.enableprimitives('_', tex.extraprimitives('tex'))
% enable all primitives without prefixing
tex.enableprimitives('', tex.extraprimitives())
diff --git a/Master/texmf-dist/tex/luatex/optex/ref-file.opm b/Master/texmf-dist/tex/luatex/optex/ref-file.opm
new file mode 100644
index 00000000000..e16e89ab7b5
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/optex/ref-file.opm
@@ -0,0 +1,61 @@
+%% This is part of OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \_openref {references <2020-02-14>}
+
+\_newwrite\_reffile
+
+\_def\_wrefrelax#1#2{}
+\_let\_wref=\_wrefrelax
+
+\_def\_inputref {%
+ \_isfile{\_jobname.ref}\_iftrue
+ \input {\jobname.ref}
+ \_fnotenum=0 \_mnotenum=0
+ \_openrefA{\_string\inputref}%
+ \_fi
+}
+\_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 - REF file (#1)}%
+ \_immediate\_wref \_Xrefversion{{\_REFversion}}%
+}
+\_def\_REFversion{3}
+\_def\_Xrefversion#1{\_ifnum #1=\_REFversion\_relax \_else \_endinput \_fi}
+\_def\_Xprocess#1{#1}
+
+\_public \Xrefversion ;
+
+\_endcode % -------------------------------------
+
+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.
+
+If the file does not exists then it is not created. 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 unusable in
+such case.
+
+If a macro needs to ceate and to use REF file then such file must be created by
+`\_openref`. When the file is created (using internal `\_openrefA`) then
+`\_opneref` destroys itself, because we need not to open the file again.
+
+We are using a convention that the macros used in REF file are named
+`\_X<foo>`. If there is a new wersion 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/. So first line of REF line is in the form
+
+\begtt
+\_Xrefversion{<version>}
+\endtt
+
+We can check the verion compatibility by this macro.
+
+User can write the `\_openref\_wref\_Xpocess{<comething>}` at beginning of
+the document if he/she needs to define a macros used in REF file later.
+
diff --git a/Master/texmf-dist/tex/luatex/optex/references.opm b/Master/texmf-dist/tex/luatex/optex/references.opm
new file mode 100644
index 00000000000..8eb1fba2e27
--- /dev/null
+++ b/Master/texmf-dist/tex/luatex/optex/references.opm
@@ -0,0 +1,113 @@
+%% This is part of OpTeX project, see http://petr.olsak.net/optex
+
+\_codedecl \ref {references <2020-02-22>}
+
+%> \_Xpage
+
+\_newcount\_lastpage \_lastpage=0 % the last page of the document
+\_newcount\_fnotenumlocal
+\_def\_Xpage#1#2{\_def\_currpage{{#1}{#2}}\_lastpage=#2 \_fnotenumlocal=0 }
+
+%> \_Xlabel
+
+\_def\_Xlabel#1#2{\_sdef{_lab:#1}{#2}\_sxdef{_pgref:#1}{\_ea\_bracketspg\_currpage}}
+\_def\_bracketspg#1#2{[pg:#1]{#2}}
+
+%> \label \wlabel
+
+\_def\_label[#1]{\_isdefined{l0:#1}%
+ \_iftrue \_opwarning{duplicated label [#1], ignored}\_else \_xdef\_lastlabel{#1}\_fi
+ \_ignorespaces
+}
+\_def\_wlabel#1{%
+ \_ifx\_lastlabel\_undefined \_else
+ \_dest[ref:\_lastlabel]%
+ \_edef\_tmp{{\_lastlabel}{#1}}%
+ \_ea\_wref \_ea\_Xlabel \_ea{\_tmp}%
+ \_sxdef{_lab:\_lastlabel}{#1}\_sxdef{l0:\_lastlabel}{}%
+ \_global\_let\_lastlabel=\_undefined
+ \_fi
+}
+
+%> \ref \pgref
+
+\_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
+}
+
+%> \begoutput
+
+\addto\_begoutput{%
+ \_incr \_gpageno % global pageno from one independent on pagination
+ \immediate\_wref\_Xpage{{\the\gpageno}{\_the\_pageno}}%
+}
+
+\_newcount\_gpageno
+
+\_public
+ \label \wlabel \ref \pgref \gpageno ;
+
+
+\_endcode % -------------------------------------
+
+The REF file looks like:
+
+\begtt
+\_Xpage{<gpageno>}{<pageno>}
+\_Xlabel{<label>}{<text>}
+\_Xlabel{<label>}{<text>}
+\_Xlabel{<label>}{<text>}
+...
+\_Xpage{<gpageno>}{<pageno>}
+\_Xlabel{<label>}{<text>}
+...
+\endtt
+
+where <gpageno> is internal page number numbered from one and <pageno> is
+a page number used in pagination. Each page begins with `\_Xpage`.
+The <label> is <label> used by user in `\label[<label>]` and <text> is a
+<text> which shoul be referenced (the number of section or table, for
+example).
+
+The REF file is scanned at the begining of the document using `\inputref`
+invoked by `\everyjob`.
+
+\%> \_Xpage
+
+`\_Xpage {<gpageno>}{<pageno>}` saves the patameter pair into `\_currpage`
+and actualizes `\lastpage`. Resets `\_fnotenumlocal` used if footnotes are
+numbered from one at each page.
+
+\%> \_Xlabel
+
+`\_Xlabel {<label>}{<text>}` saves <text> to `\_lab:<label>` nad saves
+`[<gpageno>]{<pageno>}` to `\_pgref:<label>`.
+
+\%> \label \wlabel
+
+`\label[<label>]` saves decalred labet to `\_lastlabel` and `\wlabel{<text>}`
+uses `\lastlabel` and activetes `\wref\_Xlabel{<label>}{<text>}`.
+
+\%> \ref \pgref
+
+`\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`.
+
+`\pgref[<label>]` uses `{<gpageno>}{<pageno>}` from `\_pgref:<label>` and
+prints (linked) <pageno> using `\_ilink` macro.
+
+\%> \begoutput
+
+We add to `\_begoutput` incrementing `<gpageno>` and writting
+`\_Xpage {<gpageno>}{<pageno>}`.
+
diff --git a/Master/texmf-dist/tex/luatex/optex/unimath-codes.opm b/Master/texmf-dist/tex/luatex/optex/unimath-codes.opm
index 816584022ec..b6d9226a954 100644
--- a/Master/texmf-dist/tex/luatex/optex/unimath-codes.opm
+++ b/Master/texmf-dist/tex/luatex/optex/unimath-codes.opm
@@ -2,261 +2,271 @@
% This file is read when \loadmath is used.
-\_ifx \ncharrmA\undefined \_else \_endinput \_fi
+\_ifx \_ncharrmA\_undefined \_else \_endinput \_fi
-\umathnumB="0391
-\greekdef \Alpha \Beta \Gamma \Delta \Epsilon \Zeta \Eta \Theta \Iota \Kappa
+\_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
+ \Chi \Psi \Omega \_relax
-\umathnumB="03B1
-\greekdef \alpha \beta \gamma \delta \epsilon \zeta \eta \theta \iota \kappa
+\_umathnumB="03B1
+\_greekdef \alpha \beta \gamma \delta \epsilon \zeta \eta \theta \iota \kappa
\lambda \mu \nu \xi \omicron \pi \rho \varsigma \sigma \tau \upsilon
- \varphi \chi \psi \omega \varbeta \vartheta \phi \varpi \relax
-
-\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}
-
-\protected\def\inmath#1{\relax \ifmmode#1\fi} % to keep off \loop processing in text mode
+ \varphi \chi \psi \omega \varbeta \vartheta \phi \varpi \_relax
+
+\_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}
+
+\_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 }
+\_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 ;
% Math codes:
-\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
+\_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
+ \_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
-
-\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
+ \_catcode`#=14
+ \_everypar={\_setbox0=\_lastbox \_par \_p}
+ \_input mathclass.opm
+\_endgroup
+
+\_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
+ \_input unimath-table.opm
+\_endgroup
-\nitgreek \nitvariables \rmdigits % default setting
+\_nitgreek \_nitvariables \_rmdigits % default setting
-\Umathcode `- = 2 1 "2212
-\let\{=\lbrace \let\}=\rbrace
+\_Umathcode `- = 2 1 "2212
+\_let\{=\lbrace \_let\}=\rbrace
-\def\sqrt {\Uradical 1 "0221A }
-\def\cuberoot {\Uradical 1 "0221B }
-\def\fourthroot {\Uradical 1 "0221C }
+\_protected\_def \_sqrt {\_Uradical 1 "0221A }
+\_protected\_def \_cuberoot {\_Uradical 1 "0221B }
+\_protected\_def \_fourthroot {\_Uradical 1 "0221C }
-\def\intwithnolimits#1{\ifx#1\relax \escapechar=`\\ \else \escapechar=-1
- \expandafter\let\csname\string#1op\endcsname=#1%
- \expandafter\def\expandafter#1\expandafter{\csname\string#1op\endcsname \nolimits}%
- \expandafter \intwithnolimits \fi
+\_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 \iint \iiint \oint \oiint \oiiint \intclockwise
- \varointclockwise \ointctrclockwise \sumint \iiiint \intbar \intBar \fint
- \pointint \sqint \intlarhk \intx \intcap \intcup \upint \lowint \relax
-
-\def\vert {\Udelimiter 0 1 "07C }
-\def\Vert {\Udelimiter 0 1 "02016 }
-\def\Vvert {\Udelimiter 0 1 "02980 }
-
-\def\overbrace #1{\mathop {\Umathaccent 7 1 "023DE{#1}}\limits}
-\def\underbrace #1{\mathop {\Umathaccent bottom 7 1 "023DF{#1}}\limits}
-\def\overparen #1{\mathop {\Umathaccent 7 1 "023DC{#1}}\limits}
-\def\underparen #1{\mathop {\Umathaccent bottom 7 1 "023DD{#1}}\limits}
-\def\overbracket #1{\mathop {\Umathaccent 7 1 "023B4{#1}}\limits}
-\def\underbracket #1{\mathop {\Umathaccent bottom 7 1 "023B5{#1}}\limits}
-
-\def\widehat {\Umathaccent 7 1 "00302 }
-\def\widetilde {\Umathaccent 7 1 "00303 }
-\def\overleftharpoon {\Umathaccent 7 1 "020D0 }
-\def\overrightharpoon {\Umathaccent 7 1 "020D1 }
-\def\overleftarrow {\Umathaccent 7 1 "020D6 }
-\def\overrightarrow {\Umathaccent 7 1 "020D7 }
-\def\overleftrightarrow {\Umathaccent 7 1 "020E1 }
+\_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 }
% corrections:
-\mathchardef\ldotp="612E
-\let\|=\Vert
-
-\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\varepsilon=\epsilon
-\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
-
-\protected\def\not#1{%
- \expandafter\ifx \csname not!\string#1\endcsname \relax
- \mathrel{\mathord{\rlap{\kern1pt/}}\mathord{#1}}%
- \else \csname not!\string#1\endcsname
- \fi
+\_mathchardef\ldotp="612E
+\_let\|=\Vert
+
+\_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 \varepsilon=\epsilon
+\_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
+
+\_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{\expandafter\let \csname not!\string#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
+\_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 ;
% we need no more 8bit math fonts
\mathcode`\_="8000
-\mathcode`\∫="8000
-{\catcode`\∫=13 \_ea}\_ea \_let \_noexpand ∫ = \int
\_private
\ldotp \cdotp \triangleleft \trianglerigt \mapstochar \rightarrow \prime
@@ -265,9 +275,6 @@
\longrightarrow \Longleftrightarrow \vdots \ddots ;
-\def\boldmath{\pdfliteral direct {2 Tr .3 w}\aftergroup\noboldmath}
-\def\noboldmath{\pdfliteral direct {0 Tr 0 w}} % faked bold only :-(
-
\_endcode
--------------------------------------------
@@ -282,20 +289,12 @@ accepts only codes less than 255.
See http://tex.stackexchange.com/questions/308749/ for more technical details.
-The poor bold is used for complete bold vaiant of the font. If the selected
-font has its bold vaiant (like xits-math), you can re-define \boldmath macro
-by:
-
-\def\boldmath{%
- \loadumathfamily 1 {[xitsmath-bold]}{} % Base font
- \loadmathfamily 4 rsfs % script
- \setmathdimens
-}
+-----
XITSmath-bold needs correction: the norm symbol ||x|| is missing here. So, you
can define:
-\def\boldmath{%
+\def\_boldmath{%
\loadumathfamily 1 {[xitsmath-bold]}{} % Base font
\loadmathfamily 4 rsfs % script
\loadumathfamily 5 {[xitsmath-regular]}{}
diff --git a/Master/texmf-dist/tex/luatex/optex/verbatim.opm b/Master/texmf-dist/tex/luatex/optex/verbatim.opm
index acc7922a8da..121ec0698e6 100644
--- a/Master/texmf-dist/tex/luatex/optex/verbatim.opm
+++ b/Master/texmf-dist/tex/luatex/optex/verbatim.opm
@@ -2,21 +2,31 @@
\_codedecl \begtt {Verbatim <2020-02-14>}
-\_newdimen\_ttindent \_ttindent=\_parindent
- % indentation in \begtt...\endtt and \verbinput
-\_def\_ttskip{\medskip} % space above and below \begtt, \verbinput
-\_mathchardef\_ttpenalty=100 % penalty between lines in \begtt, \verbinput
+%> parameters
+
+\_newdimen\_ttindent \_ttindent=\_parindent % indentation in \begtt...\endtt and \verbinput
+\_def\_ttskip{\_medskip} % space above and below \begtt, \verbinput
+\_mathchardef\_ttpenalty=100 % penalty between lines in \begtt, \verbinput
+
+\_newcount\_ttline \_ttline=-1 % last line number in \begtt...\endtt
+\_newcount\_viline % last line number in \verbinput
+\_newread\_vifile % file fgiven by \verinput
+\_newtoks\_tthook % tokens procesed in \begtt...\endtt
+\_newtoks\_intthook % toens procesed in \code or in `...`
+
+\_public \ttline \tthook \intthook ;
+
+%> \code
\_def\_code#1{\_unexpanded\_ea{\_csname _code \_endcsname{#1}}}
-\_protected\_sdef{_code }#1{{\_escapechar=-1 \_ea}%
- \_ea\_printinverbatim\_ea{\_detokenize{#1}}}
-\_def\_printinverbatim#1{\_leavevmode\_hbox{\_tt \_the\_intthook\_relax #1}}
+\_protected\_sdef{_code }#1{{\_escapechar=-1 \_tt \_the\_intthook \_relax
+ \_ea\_printinverbatim\_ea{\_detokenize{#1}}}}
+\_def\_printinverbatim#1{\_leavevmode\_hbox{#1}}
+\_toksapp \_pdfstringout{\_let\code=\_detokenize \_let\_code=\_detokenize}
\_public \code ;
-\_newcount\_ttline \_ttline=-1
-\_newcount\_viline
-\_newread\_vifile
+%> \_setverb
\_newcatcodetable \_verbatimcatcodes
\_def\_setverb{\_begingroup
@@ -28,45 +38,49 @@
\_setverb
\_def\_setverb{\_catcodetable\_verbatimcatcodes }%
-% \begtt ... \endtt
-
-\_eoldef \_begtt #1{%
- \_par \_vskip\_parskip \_ttskip \_bgroup \_wipeepar
- \_setverb \_adef{ }{\ }%
- \_parindent=\_ttindent \_parskip=0pt
- \_the\_tthook #1%
- \_ifnum\_ttline<0 \_else
- \_tenrm \_thefontscale[700]\_ea\_let\_ea\_sevenrm\_the\_font
- \_toksapp\_everypar{\_global\_advance\_ttline by1 \_printttline}\_fi
- \_def\par##1{\_endgraf\_ifx##1\_egroup\_else\_penalty\_ttpenalty\_leavevmode\_fi ##1}%
- \_obeylines \_startverb}
-
-\_catcode`\|=0 \_catcode`\\=12
- |_def|_startverb#1\endtt{|_tt|_the|_ptthook#1|_endtt}
-|_normalcatcodes
-
-\def\_endtt{\_egroup\_par\_ttskip\_testparA}
-\_def\_testparA{\_ea\_testparB\_romannumeral-`\.}
-\_def\_testparB{\_futurelet\_tmpa\_testparC}
-\_def\_testparC{\_ifx\_tmpa\_par\_else\afternoindent\_fi}
-
-\_def\_printttline{\_llap{\_sevenrm\_the\_ttline\_kern.9em}}
-
-\_newtoks\_tthook
-\_newtoks\_ptthook
-\_newtoks\_intthook
+%> \activettchar
\_def\_activettchar#1{%
\_ifx\_savedttchar\_undefined\_else \_catcode\_savedttchar=\_savedttcharc \_fi
- \_chardef\_savedttchar=`#1%
- \_chardef\_savedttcharc=\_catcode`#1%
- \_adef{#1}{{\_setverb\_adef{ }{\ }\_catcode`#1=13 \_ea}\_readverb}%
- \_bgroup\_lccode`\~=`#1\_lowercase{\_egroup\_def\_readverb ##1~}{\_printinverbatim{##1}}%
- \_catcode`#1=13
+ \_chardef\_savedttchar=`#1
+ \_chardef\_savedttcharc=\_catcode`#1
+ \_adef{#1}{\_begingroup \_setverb \_adef{ }{\ }\_tt \_the\_intthook\_relax \_readverb}%
+ \_def\_readverb ##1#1{\_printinverbatim{##1}\_endgroup}%
}
+\_public \activettchar ;
-\_newcount\_viline
-\_newread\_vifile
+%> \begtt ... \endtt
+
+\_eoldef \begtt#1{\_par \_wipeepar
+ \_begingroup
+ \_vskip\_parskip \_ttskip
+ \_setverb
+ \_ifnum\_ttline<0 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi
+ \_adef{ }{\ }\_parindent=\_ttindent \_parskip=0pt
+ \_the\_tthook #1\_relax \_tt
+ \_endlinechar=`^^J
+ \_startverb
+}
+\_ea\_def\_ea\_startverb \_ea#\ea1\_csstring\\endtt#2^^J{%
+ \_prepareverbdata\_tmpb{#1^^J}%
+ \_ea\_printverb \_tmpb\_end
+ \_par\_ttskip
+ \_endgroup
+ \_noindent \_setbox0=\_lastbox
+}
+\_def\_printverb #1^^J#2{\_ifx\_end#2
+ \_bgroup \_adef{ }{}\_if\_relax#1\_relax\_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 #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}}
+
+%> \verbinput
\_def\_verbinput (#1) #2 {\_par \_def\_tmpa{#2}%
\_ifx\_vifilename\_tmpa \_else
@@ -114,76 +128,145 @@
\_else
\_edef\_vinolines{\_the\_tmpnum}%
\_fi
- \_vskip\_parskip \_ttskip \_bgroup \_wipeepar
- \_setverb \_adef{ }{\ }%
- \_ifx\_savedttchar\_undefined \_else \_catcode\_savedttchar=12 \_fi
- \_parindent=\_ttindent \_parskip=0pt
- \_the\_tthook\_relax
- \_ifnum\_ttline<-1 \_else
- \_tenrm \_thefontscale[700]\_ea\_let\_ea\_sevenrm\_the\_font
- \_everypar\_ea{\_the\_everypar \_glob\_advance\_ttline by1 \_printttline}\_fi
- \_def\par##1{\_endgraf\_ifx##1\_egroup\_else\_penalty\_ttpenalty\_leavevmode\_fi ##1}%
- \_obeylines \_tmpnum=0 \_lccode`\~=`\^^M \_lowercase{\_def\_tmpb{~}}%
+ \_vskip\_parskip \_ttskip \_wipeepar
+ \_begingroup
+ \_ifnum\_ttline<-1 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi
+ \_setverb \_adef{ }{\ }\_parindent=\_ttindent \_parskip=0pt
+ \_the\_tthook\_relax \_tt
+ \_endlinechar=`^^J \_tmpnum=0
\_loop \_ifeof\_vifile \_tmpnum=\_vinolines\_space \_fi
\_ifnum\_tmpnum<\_vinolines\_space
- \_vireadline \_advance\_tmpnum by1 \_repeat %% skip line
- \_ifnum\_ttline=-1 \_ttline=\_viline \_let\_glob=\_relax \_else\_let\_glob=\_global \_fi
- \_tmpnum=0 \_ifnum\_vidolines=0 \_tmpnum=-1 \_fi
+ \_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
- \_ifeof\_vifile \_tmpnum=\_vidolines\_space \_else \_viprintline \_fi %% print line
- \_ifnum\_vidolines=0 \_else\_advance\_tmpnum by1 \_fi
+ \_ifnum\_vidolines=0 \_else\_advance\_tmpnum by1 \_fi
+ \_ifeof\_vifile \_tmpnum=\_vidolines\_space \_else \_visaveline \_fi %% save line
\_repeat
- \_tt\_ea\_the\_ea\_ptthook\_tmpb\_egroup\_par\_ttskip\_testparA
+ \_ea\_prepareverbdata \_ea \_tmpb\_ea{\_tmpb^^J}%
+ \_ea\_printverb \_tmpb\_end
+ \_global\_ttlinesave
+ \_par\_ttskip
+ \_endgroup
+ \_noindent \_setbox0=\_lastbox
}
\_def\_vireadline{\_read\_vifile to \_tmp \_global\_advance\_viline by1 }
-\_def\_viprintline{\_ea\_addto\_ea\_tmpb\_ea{\_tmp}}
+\_def\_visaveline{\_ea\_addto\_ea\_tmpb\_ea{\_tmp}}
\_public
- \begtt \activettchar \tthook \ptthook \intthook \verbinput ;
-
+ \verbinput ;
\_endcode %---------------------------------------
-`\code{text}` is a macro which writes verbatim-like inline text and it is
-robust to use it in parameters of macros or section names etc. User have to
-escape the following characters: percent, hash mark, escape, space (if there
-are more than one consecutive spaces) and `{`, `}` (if these braces are
-unbalanced in the `\code` parameter). For example
+\secc Implementation notes
-\begtt
- \code{\\text, \%\#} ... \text, %#
- \code{@{..}*&^$ $} ... prints the same without escaping, but you can
- escape these characters too, if you want.
- \code{a \ b} ... two spaces between a b, the second one must be escaped
- \code{xy\{z} ... unbalanced brace must be escaped
-\endtt
+\%> parameters
-If you set a character as `\activettchar` then it can be used as boundary
-character of inline code. The text betweent these boundary characters are
-printed without any change. For example
-\code{\`}`\print % whatever #&`\code{\`} does `\print % whatever #&`
-if `\activettchar`\code{\`} was declared.
+The parameters for verbatim macros are set. `\ttline` is set to $-1$ by
+default, so `\begtt...\endtt` are not numbered but `\verbinput` are with
+numbers.
-But this in/line verbatim text cannot be used inside parameters of
-macros, for example inside section names. Use `\code` in such situation.
+\%> \code
+`\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 doew
+really the work.
-\secc Implementation notes
+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
+\_pdftringout` token list before `\edef`.
+
+The `\code` is not `\_proteced` because we want that it expands to
+`\_unexpanded{\code<space>{<text>}` in `\write` parameters. This protect the
+expansions of the `\code` parameter (like `\\`, `\^` etc.).
+
+\%> \_setverb
+
+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 `\_catcodetable\_verbatimcatcodes`. After the group is finished then
+original catcode table is restored.
+
+\%> \activettchar
-If the code is used in non-detokenized `\write` parameter, we must to
-`detokenize` its parameter and write `\code` as prefix again. The second
-(internal) `\code` is a macro with the name followed by a space. So
+This macro saves original catcode of previously declared `\catcodettchar` (if
+such character was decalred) from `\_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 `\_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
- \code{\\aha\%} ... writes: \code {\\aha\%} into workong file.
+\_def "{\_begingroup \_setverb ... \_readverb}
+\_def \_readverb #1"{\_printinverbatim{#1}\_endgroup}
\endtt
+%
+Note that the second occurence of `"` is not active because `\_setverb`
+deactivates it.
+
+\%> \begtt ... \endtt
+
+`\begtt` id defined only as public. We don't need private `\_begtt` variant.
+This macro os defined by `\eoldef`, sot user can put an parameter at the
+same line where `\begtt` is. This `#1` parameter is used after globap
+parameters settings, so user can change it 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
+edfined as:
+
+\begtt
+\_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 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 does s special changes (for example colorization of the code), if you
+want. The scanned data have `^^J` at each end of line and all spaces are
+active characters. Other characters have nomal category 11 or 12.
+
+When `\prepareverbdata` finishes then `\startverb` runs `\_printverb` loop
+over aech line of the data and does a final work: last skip plus `\noindent`
+without first indentation box. This trick keeps horizontal mode without
+indentation when the empty line after `\endtt` does not exists. But it stops
+horizontal mode without any new box in outer vertical mode if `\par` is
+processed immediately after `\endtt`.
+
+The `\_printverb` macro calls `\_printverbline{<line>}` to each scanned line of
+verbatim text. This macro expect that it strarts in vertical mode ant it must
+do `\par` in order to return the vertical mode. The `\_printverblinenum`
+is used here: it does nothing when `\_ttline<0` else it prints the line
+number using `\_llap`.
-This can be read again without any chnge of meaning of the parameter (the
-second space after `\code` sequence will be ingnored).
+\%> \verbinput
-If the `\code` is used in normal horizontal mode, then escape characters are
-ignored using `\ecsapechar=-1 \detokenize`.
+Macro `\verbinput` uses a file read perviously or opens the given file. Then
+it runss 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.
+After group is opened then similar preparation is done as in `\begtt`. Then
+we skip `\_nolines` lines in a loop a and we read `\_dolines` 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.