diff options
author | Karl Berry <karl@freefriends.org> | 2020-02-26 22:08:47 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-02-26 22:08:47 +0000 |
commit | 3805b044b79834780c2e5f21292a3e4f63869b4f (patch) | |
tree | d7889ac9ff37b1953f03792775ef2fc63110658b /Master/texmf-dist/tex | |
parent | 33fdbb41f0300f164828daec8135305598415b51 (diff) |
optex (26feb20)
git-svn-id: svn://tug.org/texlive/trunk@53927 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
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. |