texlive[59458] Master: optex (3jun21)

commits+karl at tug.org commits+karl at tug.org
Thu Jun 3 22:53:13 CEST 2021


Revision: 59458
          http://tug.org/svn/texlive?view=revision&revision=59458
Author:   karl
Date:     2021-06-03 22:53:13 +0200 (Thu, 03 Jun 2021)
Log Message:
-----------
optex (3jun21)

Modified Paths:
--------------
    trunk/Master/texmf-dist/doc/optex/base/README
    trunk/Master/texmf-dist/doc/optex/base/optex-doc.pdf
    trunk/Master/texmf-dist/doc/optex/base/optex-doc.tex
    trunk/Master/texmf-dist/doc/optex/base/optex-techdoc.tex
    trunk/Master/texmf-dist/doc/optex/base/optex-userdoc.tex
    trunk/Master/texmf-dist/tex/optex/base/alloc.opm
    trunk/Master/texmf-dist/tex/optex/base/basic-macros.opm
    trunk/Master/texmf-dist/tex/optex/base/cite-bib.opm
    trunk/Master/texmf-dist/tex/optex/base/colors.opm
    trunk/Master/texmf-dist/tex/optex/base/doc.opm
    trunk/Master/texmf-dist/tex/optex/base/f-heros.opm
    trunk/Master/texmf-dist/tex/optex/base/f-lmfonts.opm
    trunk/Master/texmf-dist/tex/optex/base/fams-ini.opm
    trunk/Master/texmf-dist/tex/optex/base/fnotes.opm
    trunk/Master/texmf-dist/tex/optex/base/fonts-opmac.opm
    trunk/Master/texmf-dist/tex/optex/base/fonts-preload.opm
    trunk/Master/texmf-dist/tex/optex/base/fonts-resize.opm
    trunk/Master/texmf-dist/tex/optex/base/fonts-select.opm
    trunk/Master/texmf-dist/tex/optex/base/hyperlinks.opm
    trunk/Master/texmf-dist/tex/optex/base/languages.opm
    trunk/Master/texmf-dist/tex/optex/base/makeindex.opm
    trunk/Master/texmf-dist/tex/optex/base/math-macros.opm
    trunk/Master/texmf-dist/tex/optex/base/multicolumns.opm
    trunk/Master/texmf-dist/tex/optex/base/optex.ini
    trunk/Master/texmf-dist/tex/optex/base/optex.lua
    trunk/Master/texmf-dist/tex/optex/base/styles.opm
    trunk/Master/texmf-dist/tex/optex/base/table.opm
    trunk/Master/texmf-dist/tex/optex/base/usebib.opm
    trunk/Master/texmf-dist/tex/optex/pkg/emoji.opm
    trunk/Master/texmf-dist/tex/optex/pkg/vlna.opm
    trunk/Master/tlpkg/libexec/ctan2tds

Added Paths:
-----------
    trunk/Master/texmf-dist/doc/optex/base/mte-doc.tex
    trunk/Master/texmf-dist/tex/optex/base/f-erewhon.opm
    trunk/Master/texmf-dist/tex/optex/pkg/mte.opm

Modified: trunk/Master/texmf-dist/doc/optex/base/README
===================================================================
--- trunk/Master/texmf-dist/doc/optex/base/README	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/doc/optex/base/README	2021-06-03 20:53:13 UTC (rev 59458)
@@ -17,8 +17,14 @@
            in the OpTeX documentation.
 doc/   ... PDF version of the OpTeX documentation and sources.
 
-History:
-
+<1.03> Jun. 2021:
+       mte: Package for MicroTypographic Extensions released.
+       Erewhon: font family support added.
+       \rgbcmykmap for RGB-CMYK mapping introduced.
+       \table: sum of \tsizes allowed different from one.
+       doc: hyperlinks from Index created.
+       \url and \link macros re-written.
+       Bugs fixing.
 <1.02> Apr. 2021
        Location CTAN:macros/luatex/optex moved to CTAN:macros/optex (similarly for TDS).
        NewComputerModern font support added.

Added: trunk/Master/texmf-dist/doc/optex/base/mte-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/optex/base/mte-doc.tex	                        (rev 0)
+++ trunk/Master/texmf-dist/doc/optex/base/mte-doc.tex	2021-06-03 20:53:13 UTC (rev 59458)
@@ -0,0 +1,26 @@
+% This is part of mte.opm macro package for OpTeX
+
+% Run  optex mte-doc
+% (two times) to generate documentation including references and the index.
+
+\load [doc]
+
+\def\elink[#1]#2{%
+   \ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf\#cs:#1]%
+   {\tt\string#2}%
+}
+\def\olink[#1]#2{%
+   \ulink[http://petr.olsak.net/ftp/olsak/optex/optex-doc.pdf\#cs:#1]%
+   {\tt\string#2}%
+}
+\let\_urllinkcolor=\Cyan
+
+\printdoctail mte.opm
+\printdoc     mte.opm
+
+\nonum\sec Index
+\begmulti 3
+\tt \makeindex
+\endmulti
+
+\bye


Property changes on: trunk/Master/texmf-dist/doc/optex/base/mte-doc.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/doc/optex/base/optex-doc.pdf
===================================================================
(Binary files differ)

Modified: trunk/Master/texmf-dist/doc/optex/base/optex-doc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/optex/base/optex-doc.tex	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/doc/optex/base/optex-doc.tex	2021-06-03 20:53:13 UTC (rev 59458)
@@ -4,6 +4,7 @@
 % (three times) to generate OpTeX documentation including references and the index. 
 
 \load [doc.opm]  \let\enddocument=\endinput
+\let\_catcodedot=\relax \catcode`\.=12 % we are not using \.foo sequences
 
 \typosize[10/12]  % Main size (used in techdoc)
 
@@ -20,7 +21,7 @@
 \tit Format Based on Plain \TeX/ and OPmac\fnotemark1
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
-\hfill Version 1.02
+\hfill Version 1.03
 
 \centerline{\it Petr Olšák, 2020, 2021}
 
@@ -109,6 +110,14 @@
 
 \nonum\chap Index
 
+\noindent
+There are all control sequences used in \OpTeX/ except \TeX/ primitives.
+If you want to know something about \TeX/ primitives then you can use another index from
+\ulink[http://petr.olsak.net/ftp/olsak/optex/tex-nutshell.pdf\#ref:index]{\TeX/ in a Nutshell}.
+
+% active links directly to the main documentation point but not to the pages:
+\def\_printii #1&{\noindent\hskip-\iindent \link[cs:#1]\Blue{\bslash #1} }
+\def\_pgprintA #1{#1}
 \begmulti 3 \tt \makeindex \endmulti
 
 \bye

Modified: trunk/Master/texmf-dist/doc/optex/base/optex-techdoc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/optex/base/optex-techdoc.tex	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/doc/optex/base/optex-techdoc.tex	2021-06-03 20:53:13 UTC (rev 59458)
@@ -127,10 +127,14 @@
 \printdoc     fonts-preload.opm
 
 \printdoctail fonts-resize.opm
+\secc[fresize] Implementation of resizing
+Only \"resizing" macros are implemented here. Other aspects of Font
+Selection System and their implementation are desribed in
+section~\ref[fselect].
 \printdoc     fonts-resize.opm
 
 \printdoctail fonts-select.opm
-\secc Implementation of the Font Selection System
+\secc[fselect] Implementation of the Font Selection System
 \printdoc     fonts-select.opm
 
 \sec [math-preload] Preloaded fonts for math mode

Modified: trunk/Master/texmf-dist/doc/optex/base/optex-userdoc.tex
===================================================================
--- trunk/Master/texmf-dist/doc/optex/base/optex-userdoc.tex	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/doc/optex/base/optex-userdoc.tex	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1733,12 +1733,16 @@
 The following packages are distributed as part of \OpTeX/:
 \begitems
 * `qrcode.opm` enables to create QR codes.
+* \ulink[http://petr.olsak.net/ftp/olsak/optex/mte-doc.pdf]{\tt mte.opm}
+  includes settings for microtypographic extensions (protrusions+expanding fonts).
 * `vlna.opm` enables to protect of one-letter prepositions and more things automatically.
 * `emoji.opm` defines `\emoji{<name>}` command for colored emoticons.
 * `plain-at.opm` defines the old names from plain \TeX/.
+* \ulink[https://ctan.org/tex-archive/macros/luatex/optex/pdfextra/pdfextra-doc.pdf]{\tt pdfextra.opm}
+  allows the use of many extra features from PDF standard (by M. Vlasák).
 \enditems
-See the directory `optex/pkg/` and these files for more information about
-them.
+See these files in `optex/pkg/` or `optex/<pkgname>` for more information about
+them. The packages may have their documentation, try `texdoc <pkgname>`.
 
 \secc Lorem ipsum dolor sit
 %%%%%%%%%%%%%%%%%%%%%%%%%%%
@@ -1988,13 +1992,13 @@
 but at the top left paper corner exactly. For example, `\hoffset` includes directly left
 margin.
 
-The tabbing macros `\settabs`\iindex{settabs} and `\+` (from Plain \TeX/)
+The tabbing macros `\settabs` and `\+` (from Plain \TeX/)
 are not defined in \OpTeX/ because they are obsolete. But you can use the
 \ulink[http://petr.olsak.net/optex/optex-tricks.html\#tabs]{\OpTeX/ trick 0021}
 if you really need such feature.
 
 The `\sec` macro is reserved for sections but original Plain \TeX/ declares this
-control sequence for math secans.
+control sequence for math secant\fnote{Use \code{$\\secant(x)$} to get $\secant(x)$.}.
 
 \enddocument
 

Modified: trunk/Master/texmf-dist/tex/optex/base/alloc.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/alloc.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/alloc.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \newdimen {Allocators for registers <2021-02-15>} % loaded in format
+\_codedecl \newdimen {Allocators for registers <2021-02-15>} % preloaded in format
 
    \_doc -----------------------------
    The limits are set first.

Modified: trunk/Master/texmf-dist/tex/optex/base/basic-macros.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/basic-macros.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/basic-macros.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \sdef {Basic macros for OpTeX <2021-02-03>} % loaded in format
+\_codedecl \sdef {Basic macros for OpTeX <2021-05-16>} % preloaded in format
 
    \_doc ------------------------------
    \`\bgroup`, \`\egroup`, \`\empty`, \`\space`, \`\null` and \`\wlog`
@@ -51,7 +51,9 @@
 
 \_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 \_slet #1#2{\_ea\_let \_csname#1\_ea\_endcsname
+   \_ifcsname#2\_ea\_endcsname \_begincsname#2\_endcsname \_else \_undefined \_fi
+}
 \_public \sdef \sxdef \slet ;
 
    \_doc ------------------------------
@@ -123,6 +125,7 @@
 
 \_endcode % -------------------------------------
 
+2021-05-16: \slet reimplemnted (to allow \slet{foo}{undefined}).
 2021-02-03: \useit defined.
 2021-01-22: \trycs: \ea added in order to be able to use cs with parameters
 2021-01-08: \opwarning format changed (secondly, hope that conclusively)

Modified: trunk/Master/texmf-dist/tex/optex/base/cite-bib.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/cite-bib.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/cite-bib.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \cite {Cite, Biblioraphy <2021-04-13>} % loaded in format
+\_codedecl \cite {Cite, Biblioraphy <2021-04-13>} % preloaded in format
 
    \_doc -----------------------------
    Registers used by `\cite`, `\bib` macros are declared here.
@@ -280,7 +280,7 @@
 \_def\usebib{\_usebib}
 
    \_doc ------------------------------
-   \_forwardlink\`\nobibwarning` `[<list of bib-labels>]`
+   \_fw\`\nobibwarning` `[<list of bib-labels>]`
    declares a list of bib labels
    which are not fully declared in `.bib` file but we want to suppress the
    warning about it. List of bib labels are comma-separated case sensitive

Modified: trunk/Master/texmf-dist/tex/optex/base/colors.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/colors.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/colors.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \colordef {Colors <2020-03-18>} % loaded in format
+\_codedecl \colordef {Colors <2021-05-28>} % preloaded in format
 
    \_doc -----------------------------
    We declare internal boolean value \`\_iflocalcolor` ad do
@@ -129,9 +129,12 @@
    to they are in $[0,1]$ interval. The `\colordefFin` expands to the values
    accumulated in Lua code `color_C`, `color_M`, `color_Y` and `color_K`.
    The `\_douseK` applies \^`\useK` to CMYK components.
+   \nl
+   The `\_tocmyk:<rgb>` or `\_torgb:<cmyk>` control sequences (given by
+   \^`\rgbcmykmap`) have precedence.
    \_cod -----------------------------
 
-\_def\_rgbtocmyk #1 #2 #3 ;{%
+\_def\_rgbtocmyk #1 #2 #3 ;{\_trycs{_tocmyk:#1 #2 #3}{%
    \_ea \_stripzeros \_detokenize \_ea{\_directlua{
       local kr = math.max(#1,#2,#3)
       if (kr==0) then
@@ -140,13 +143,13 @@
          tex.print(string.format('\_pcent.3f \_pcent.3f \_pcent.3f \_pcent.3f ;',
             (kr-#1)/kr, (kr-#2)/kr, (kr-#3)/kr, 1-kr))
       end
-}}}
-\_def\_cmyktorgb #1 #2 #3 #4 ;{%
+}}}}
+\_def\_cmyktorgb #1 #2 #3 #4 ;{\_trycs{_torgb:#1 #2 #3 #4}{%
    \_ea \_stripzeros \_detokenize \_ea{\_directlua{
       local kr = 1-#4
       tex.print(string.format('\_pcent.3f \_pcent.3f \_pcent.3f ;',
          (1-#1)*kr, (1-#2)*kr, (1-#3)*kr))
-}}}
+}}}}
 \_def\_colorcrop{\_directlua{
    local m=math.max(color_C, color_M, color_Y, color_K)
    if (m>1) then
@@ -181,6 +184,19 @@
 \_def\_stripzeroC #1 #2:{#1}
 
    \_doc -----------------------------
+   \`\rgbcmykmap` `{<R> <G> <B>}`\,`{<C> <M> <Y> <K>}` declares mapping from
+   RGB to CMYK and from CMYK to RGB for given color. It has precedence
+   before general formulae used in the \^`\_rgbtocmyk` and \^`\_cmyktorgb`
+   macros. Note, that the values <R> <G> <B> <C> <M> <Y> <K> must be given
+   exacly in the same format as in \^`\setcmykcolor` and \^`\setrgbcolor`
+   parameters. For example, `0.5` or `.5` or `.50` are different values from
+   point of view of this mapping.
+   \_cod -----------------------------
+
+\_def\_rgbcmykmap#1#2{\_sxdef{_torgb:#2}{#1}\_sxdef{_tocmyk:#1}{#2}}
+\_public \rgbcmykmap ;
+
+   \_doc -----------------------------
    The \`\rgbcolordef` and \`\cmykcolordef` use common macro
    \`\_commoncolordef` with different first four parameters.
    The `\_commoncolordef <selector><K><R><G><what-define>{<data>}` does the
@@ -373,7 +389,8 @@
 If \^`\onlyrgb` is declared, then \^`\colordef` works as \^`\rgbcolordef`.
 
 If a CMYK to RGB or RGB to CMYK conversion is needed then
-the following simple formulae are used
+direct conversion of given color is used (if declared using
+\^`\rgbcmykmap``{<rgb>}{<cmyk>}`) or the following simple formulae are used
 (ICC profiles are not supported):
 $$
 \displaylines{
@@ -390,5 +407,6 @@
 
 \_endinput
 
+2021-05-28 \rgbcmykmap introduced
 2020-04-22 \replstring\tmpb{+ }{+}, {- }{-} added in \colordef, bug fixed
 2020-03-18 introduced

Modified: trunk/Master/texmf-dist/tex/optex/base/doc.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/doc.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/doc.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \printdoc {Macros for documentation printing <2020-04-28>}
+\_codedecl \printdoc {Macros for documentation printing <2021-05-15>} % loaded on demand by \load[doc]
 
    \_doc -----------------------------
    General decalarations.
@@ -34,6 +34,8 @@
    \_doc -----------------------------
    The listing mode is implemented here. The \`\maxlines`
    is maximal lines of code printed in the listing mode.
+   The \`\_catcodedot` sets dot as letter in listngs (for package
+   documentation where `\.foo` sequeces exist).
    \_cod -----------------------------
 
 \_newcount \_maxlines   \_maxlines=100000
@@ -45,9 +47,10 @@
    \_typosize[8/10]
    \_let\_printverbline=\_printcodeline
    \_ttline=\_inputlineno
-   \_setverb
+   \_setverb \_catcodedot
    \_ifnum\_ttline<0 \_let\_printverblinenum=\_relax \_else \_initverblinenum \_fi
    \_adef{ }{\ }\_adef\^^I{\t}\_parindent=\_ttindent \_parskip=0pt
+   \_def\t{\_hskip \_dimexpr\_tabspaces em/2\_relax}%
    \_relax \_ttfont
    \_endlinechar=`^^J
    \_def\_tmpb{\_start}%
@@ -57,27 +60,38 @@
    \_def\_tmpa{\_empty#1}%
    \_let\_next=\_readverbline
    \_ea\_isinlist\_ea\_tmpa\_ea{\_Doc}\_iftrue \_let\_next=\_processinput \_fi
-   \_ea\_isinlist\_ea\_tmpa\_ea{\_Endcode}\_iftrue \_endinput \_let\_next=\_processinput \_fi
+   \_ea\_isinlist\_ea\_tmpa\_ea{\_Doctab}\_iftrue \_let\_next=\_processinput \_fi
+   \_ea\_isinlist\_ea\_tmpa\_ea{\_Endcode}\_iftrue \_def\_next{\_processinput\_endinput}\_fi
    \_ifx\_next\_readverbline \_addto\_tmpb{#1^^J}\_fi
    \_next
 }
 {\_catcode`\ =13 \_gdef\_aspace{ }}\_def\_asp{\_ea\_noexpand\_aspace}
 \_edef\_Doc{\_asp\_asp\_bslash _doc}
+\_bgroup \_lccode`~=`\^^I \_lowercase{\_egroup\_edef\_Doctab{\_noexpand~\_bslash _doc}}
 \_edef\_Endcode{\_noexpand\_empty\_bslash _endcode}
+\_def\_catcodedot{\_catcode`\.=11 }
 
    \_doc -----------------------------
-   The scanner of the control sequences in the listing mode.
+   The scanner of the control sequences in the listing mode replaces all
+   occurrences of `\` by \`\_makecs`. This macro reads next tokens and
+   accumulates them to `\_tmpa` as long as they have category 11. It
+   means that `\_tmpa` includes the name of the following control sequence
+   when \fw\`\_makecsF` is run. The printing form of the control
+   sequence is set to `\_tmpb` and the test of existence `\,<csname>`is
+   performed. If it is true then active hyperlink is created. If not, then
+   the first `_` or `.` is removed from `\_tmpa` and the test is repeated.
    \_cod -----------------------------
 
-\_def\_makecs{\_def\_tmp{}\_futurelet\_next\_makecsA}
+\_def\_makecs{\_def\_tmpa{}\_futurelet\_next\_makecsA}
 \_def\_makecsA{\_ifcat a\_noexpand\_next \_ea\_makecsB \_else \_ea\_makecsF \_fi}
-\_def\_makecsB#1{\_addto\_tmp{#1}\_futurelet\_next\_makecsA}
-\_def\_makecsF{\_ifx\_tmp\_empty \_csstring\\%
-       \_else \_ifcsname ,\_tmp\_endcsname \_link[cs:\_tmp]{\Blue}{\_csstring\\\_tmp}%
-       \_else \_let\_next=\_tmp \_remfirstunderscore\_next
-              \_ifx\_next\_empty \_let\_next=\_tmp \_fi
-              \_ifcsname ,\_next\_endcsname \_link[cs:\_next]{\Blue}{\_csstring\\\_tmp}%
-       \_else \_csstring\\\_tmp \_fi\_fi\_fi
+\_def\_makecsB#1{\_addto\_tmpa{#1}\_futurelet\_next\_makecsA}
+\_def\_makecsF{\_let\_tmpb=\_tmpa
+       \_ifx\_tmpa\_empty \_csstring\\%
+       \_else \_ifcsname ,\_tmpa\_endcsname \_trycs{el:\_tmpa}{\_intlink}%
+       \_else \_remfirstunderscoreordot\_tmpa
+              \_ifx\_tmpa\_empty \_let\_tmpa=\_tmpb \_fi
+              \_ifcsname ,\_tmpa\_endcsname \_trycs{el:\_tmpa}{\_intlink}%
+       \_else \_csstring\\\_tmpb \_fi\_fi\_fi
 }
 \_def\_processinput{%
    \_let\_start=\_relax
@@ -96,10 +110,20 @@
    \_endgroup \_ttskip
    \_isnextchar\_par{}{\_noindent}%
 }
-\_def\_remfirstunderscore#1{\_ea\_remfirstunderscoreA#1\_relax#1}
-\_def\_remfirstunderscoreA#1#2\_relax#3{\_if _#1\_def#3{#2}\_fi}
+\_def\_remfirstunderscoreordot#1{\_ea\_remfirstuordotA#1\_relax#1}
+\_def\_remfirstuordotA#1#2\_relax#3{\_if _#1\_def#3{#2}\_fi \_if\_string#1.\_def#3{#2}\_fi}
 
    \_doc -----------------------------
+   By default the internal link is created by \`\_intlink` inside listing
+   mode. But you can define `\el:<csname>` which has precedence and it can
+   create an external link. The `\_tmpa` includes the name used in the link
+   and `\_tmpb` is the name to be printed. See \^`\_makecsF` above and the
+   example at the beginning of this section.
+   \_cod -----------------------------
+
+\_def\_intlink{\_link[cs:\_tmpa]{\Blue}{\_csstring\\\_tmpb}}
+
+   \_doc -----------------------------
    The lines in the listing mode have a yellow background.
    \_cod -----------------------------
 
@@ -167,6 +191,16 @@
    \_bf\_llaptoclink{#1}{#2}\_hfill \_pgn{#3}\_tocpar\_medskip}
 
    \_doc -----------------------------
+   If this macro is loaded by \^`\load` then we need to initialize
+   catcodes using the `\_afteroad` macro.
+   \_cod -----------------------------
+
+\_def\_afterload{\_catcode`\<=13 \_catcode`\`=13 \_catcode`\.=11
+   \_wlog {doc.opm: catcodes of < and ` activated, catcode of . is letter.}%
+}
+\_catcode`.=11
+
+   \_doc -----------------------------
    The \code{<something>} will be print as <something>.
    \_cod -----------------------------
 
@@ -177,20 +211,11 @@
 \_everyintt{\_catcode`\<=13 }
 
    \_doc -----------------------------
-   If this macro is loaded by \^`\load` then we need to initialize
-   catcodes using the `\_afteroad` macro.
-   \_cod -----------------------------
-
-\_def\_afterload{\_catcode`\<=13 \_catcode`\`=13 }
-
-   \_doc -----------------------------
    Main documentation points and hyperlinks to/from it.
    Main documentation point: \code{\\`\\foo`}.
-   User-level documentation point: \code{\\^`\\foo}, first occurence only.
+   User documentation point: \code{\\^`\\foo}, first occurence only.
    The next occurrences are only links to the main documentation point.
-   Link to user-level documentation point: \code{\\~`\\foo}.
-   If user-level documentation point follows the main documentation point
-   then use \code{\\_forwardlink\\`\\foo`}.
+   Link to user documentation point: \code{\\~`\\foo}.
    \_cod -----------------------------
 
 \_verbchar`
@@ -202,8 +227,6 @@
             \_link[cs:^\_tmp]{\Red}{\_tt\_csstring\\\_tmp}\_else
             {\_tt\Red\_csstring\\\_tmp}\_fi}%
 }
-\_def\_forwardlink\`#1`{{\_slet{cs:^\_csstring#1}{relax}\`#1`}}
-
 \_def\^`#1{\_leavevmode\_edef\_tmp{\_csstring#1}\_iindex{\_tmp}%
    \_hbox{\_ifcsname cs:^\_tmp\_endcsname \_else \_dest[cs:^\_tmp]\_sxdef{cs:^\_tmp}{}\_fi
          \_link[cs:\_tmp]{\Blue}{\_tt\_string#1}}%
@@ -216,6 +239,14 @@
    \_futurelet\_next\_cslinkA
 }
 
+   \_doc -----------------------------
+   The \`\fw` macro for forward links to user documentation point (given later)
+   is defined here.
+   \_cod -----------------------------
+
+\_def\_fw\`#1`{{\_slet{cs:^\_csstring#1}{}\`#1`}}
+\_public \fw ;
+
 \_endcode %-------------------------------------------
 
 \noindent
@@ -225,12 +256,13 @@
 The `\printcoc` starts reading of given `<filename>` from the second line.
 The file is read in {\em the listing mode}.
 The `\prindoctail` starts reading given `<filename>` from the
-first occurrence of the `\_encode`. The file is read
+first occurrence of the `\_endcode`. The file is read
 in normal mode (like `\input <filename>`).
 
 The {\em listing mode} prints the lines as a listing of a code. This mode is
 finished when first {\visiblesp`  \_doc`} occurs or first `\_endcode`
-occurs. At least two spaces must precede before such `\_doc`. On the other
+occurs. At least two spaces or one tab
+character must precede before such `\_doc`. On the other
 hand, the `\_encode` must be at the left edge of the line without spaces.
 If this rule is not met then the listing mode continues.
 
@@ -255,10 +287,6 @@
 You cannot reach the end of the file (without `\_endcode`) in the listing
 mode.
 
-The listing mode creates all control sequences which are listed in the
-index as an active link to the main documentation point of such control sequence
-and prints them in blue. Another text is printed in black.
-
 The main documentation point is denoted by \code{\\`\\}`<sequence>`\code{`}
 in red, for example \code{\\`\\foo`}.
 The user documentation point is the first occurrence of
@@ -266,11 +294,63 @@
 There can be more such markups, all of them are hyperlinks to the main
 documentation point.
 And main documentation point is a hyperlink to the user documentation point
-if this point exists. Finally, the
+if this point precedes. Finally, the
 \code{\\~`\\}`<sequence>`\code{`} (for example \code{\\~`\\foo`}) are
 hyperlinks to the user documentation point.
 
+By default, the hyperink from main documentation point to the user
+documentation point is active only if it is backward link, i.e.\
+the main documentation point is given later. The reason is that we don't
+know if such user documentation point will exist when creating
+main documentation point and we don't want
+broken links. If you are sure that user documentation point will
+follow then use prefix \^`\fw` before~\code{\\`}, for example
+\code{\\fw\\`\\foo`} is main documentation point where the user
+documentation point is given later and forward hyperlink is created here.
+
+Control sequences and their page positions of main documentation points and user
+documentation points are saved to the index.
+
+The listing mode creates all control sequences which are listed in the
+index as an active link to the main documentation point of such control sequence
+and prints them in blue. Moreower, active links are control sequneces of the
+type `\_foo` or `\.foo` although the documentation mentions only `\foo`.
+Another text is printed in black.
+
+The listing mode is able to generate external links to another \OpTeX/-like
+documentation, if the macros `\,<csname>` and `\el:<csname>` are defined.
+The second macro should create a hyperlink using `\_tmpa`
+where the link name of the <csname> is saved and `\_tmpb` where the name of
+the <csname> to be printed is saved (`\tmpb` can include preceding `_` or
+`.` unlike `\_tmpa`). For example, suppose, that we have created
+`optex-doc.eref` file by:
+\begtt
+TEXINPUTS='.;$TEXMF/{doc,tex}//' optex optex-doc
+grep Xindex optex-doc.ref > optex-doc.eref
+\endtt
+The `.eref` file includes only `\_Xindex{<csname>}{}` lines from
+`optex-doc.ref` file. Then we can use following macros:
+\begtt
+\def\_Xindex#1#2{\sdef{,#1}{}\slet{el:#1}{optexdoclink}}
+\def\optexdoclink{%
+   \edef\extlink{url:\optexdocurl\csstring\#cs:\_tmpa}%
+   \_ea\_urlactive\_ea[\extlink]{\Cyan}{\csstring\\\_tmpb}}
+\def\optexdocurl{http://petr.olsak.net/ftp/olsak/optex/optex-doc.pdf}
+\isfile{optex-doc.eref}\iftrue \input{optex-doc.eref}\fi
+\endtt
+All `\el:<csname>`, where <csname> is from `optex-doc.ref`,
+have the same meaning: `\optexdoclink` in this example. And
+`\optexdoclink` creates the external link in `\Cyan` color.
+
+\secc Implementation
+
 \endinput
 
+2021-05-15 \_endinput shifted after \_processinput when \_endcode is scanned.
+2021-05-14 \_catcodedot, \_Doctab introduced.
+2021-05-13 \def\t added, bug fixed.
+2021-05-03 External links fom listing mode allowed.
+2021-05-02 \_forwadlink replaced by \_fw, to be more consistent.
+2021-05-02 \fw introduced, \.foo -> \foo allowed.
 2020-04-28 \levevmode in \^ macros added (bug fixed)
-2020-04-22 released
\ No newline at end of file
+2020-04-22 released

Added: trunk/Master/texmf-dist/tex/optex/base/f-erewhon.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/f-erewhon.opm	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/optex/base/f-erewhon.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -0,0 +1,31 @@
+%% This is part of the OpTeX project, see http://petr.olsak.net/optex
+
+\_famdecl [Erewhon] \Erewhon {Derived from Heuristica with slanted variants}
+        {\caps} {\rm \bf \it \bi \sl \bs} {Erewhon}
+        {[Erewhon-Regular]}
+        {\_def\_fontnamegen {[Erewhon-\_currV]:\_capsV\_fontfeatures}}
+
+\_wlog{\_detokenize{%
+Modifiers:^^J
+ \caps ...... caps & small caps^^J
+ \slant ..... slanted Regular, Bold^^J%
+Variants:^^J
+ \sl ... slanted Regular, \sb ... slanted Bold^^J
+}}
+
+\_moddef \resetmod {\_fsetV caps={} \_fvars Regular Bold Italic Bolditalic }
+\_moddef \caps     {\_fsetV caps=+smcp;\_ffonum; }
+\_moddef \slant    {\_fvars RegularSlanted BoldSlanted RegularSlanted BoldSlanted }
+\_private \slant ;
+\_famvardef \sl    {\_slant\_rm}
+\_famvardef \bs    {\_slant\_bf}
+
+\_initfontfamily % new font family must be initialized
+
+\_loadmath {[Erewhon-Math]}
+
+\_endcode
+
+See the file `f-heros.opm` for information about principles of such
+font-macro-files.
+


Property changes on: trunk/Master/texmf-dist/tex/optex/base/f-erewhon.opm
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/optex/base/f-heros.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/f-heros.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/f-heros.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -33,6 +33,7 @@
    \_let\_bsansdigits=\_bfdigits
    \_let\_bisansvariables=\_bivariables
    \_let\_bisansgreek=\_bigreek
+   \_Umathchardef \triangle "0 "5 "25B3 \_Umathcode "25B3 "0 "5 "25B3
 \_fi
 
 \_endcode
@@ -81,12 +82,12 @@
 System uses this macro at the primitive level in the following sense:
 
 \begtt \catcode`\<=13
-\font \<selector> {\_fontnamegen} \_sizespec
+\font \<font-switch> {\_fontnamegen} \_sizespec
 \endtt
 %
 Note that the extended `\font` syntax
-`\font\<selector> {<font name>:<font features>} <size spec.>` or
-`\font\<selector> {[<font file name>]:<font features>} <size spec.>`
+`\font\<font-switch> {<font name>:<font features>} <size spec.>` or
+`\font\<font-switch> {[<font file name>]:<font features>} <size spec.>`
 is expected here.
 
 \seccc Example 1

Modified: trunk/Master/texmf-dist/tex/optex/base/f-lmfonts.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/f-lmfonts.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/f-lmfonts.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -115,7 +115,7 @@
 
 \_endcode
 
-\secc How to write the font family file with optical sizes
+\secc[optsizes] How to write the font family file with optical sizes
 
 You can use \^`\_optname` macro when `\_fontnamegen` in expanded. This macro is fully
 expandable and its input is `<internal-template>` and its output is a

Modified: trunk/Master/texmf-dist/tex/optex/base/fams-ini.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/fams-ini.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/fams-ini.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -95,6 +95,9 @@
    { -,\caps: {\rm\bf\it\bi} }
 \_famalias [BaskervilleF]
 
+\_faminfo [Erewhon] {Derived from Heuristica with slanted variants} {f-erewhon}
+   { -: {\rm\bf\it\bi\sl\bs} \caps: {\rm\bf\it\bi} }
+
 \_famfrom {Georg Duffner, Octavio Pardo}
 \_faminfo [EB Garamond] {Free variants of classical Garamond} {f-ebgaramond}
    { -,\caps,\medium,\medium\caps,\semibold,\semibold\caps: {\rm\bf\it\bi}
@@ -184,7 +187,7 @@
 declaration of Adobe's Times family in `fams-local.opm`. When a user writes
 `\fontfam[Times]` then the original Times (not Termes) is used.
 
-The `fams-ini.opm` and `fams-local.opm` files use the macros
+The `fams-ini.opm` and `fams-local.opm` files can use the macros
 \~`\_faminfo`, \~`\_famalias` and \~`\_famtext`. See the example from
 `fams-ini.tex`:
 

Modified: trunk/Master/texmf-dist/tex/optex/base/fnotes.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/fnotes.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/fnotes.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \fnote {Footnotes, marginal notes OpTeX <2020-05-26>} % loaded in format
+\_codedecl \fnote {Footnotes, marginal notes OpTeX <2020-05-26>} % preloaded in format
 
    \_doc -----------------------------
    \`\_gfnotenum` is a counter which counts footnotes globally in the whole document.\nl

Modified: trunk/Master/texmf-dist/tex/optex/base/fonts-opmac.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/fonts-opmac.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/fonts-opmac.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \typosize {Font managing macros from OPmac <2021-03-10>} % loaded in format
+\_codedecl \typosize {Font managing macros from OPmac <2021-03-10>} % preloaded in format
 
    \_doc -----------------------------
    \`\typosize` `[<font-size>/<baselineskip>]` sets given parameters.

Modified: trunk/Master/texmf-dist/tex/optex/base/fonts-preload.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/fonts-preload.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/fonts-preload.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \tenrm {Latin Modern fonts (EC) preloaded <2020-01-23>} % loaded in format
+\_codedecl \tenrm {Latin Modern fonts (EC) preloaded <2020-01-23>} % preloaded in format
 
 % Only few text fonts are preloaded:
 

Modified: trunk/Master/texmf-dist/tex/optex/base/fonts-resize.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/fonts-resize.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/fonts-resize.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \setfontsize {Font resizing macros <2021-04-17>} % preloaded in format
+\_codedecl \setfontsize {Font resizing macros <2021-05-02>} % preloaded in format
 
    \_doc -----------------------------
    The \`\setfontsize` `{<sizespec>}` saves the `<sizespec>` to the \`\_sizespec` macro.
@@ -33,75 +33,6 @@
 \_public \setfontsize \defaultoptsize ;
 
    \_doc -----------------------------
-   \`\_resizefont` `{<variant-name>}\<font switch>`,
-   resizes the font given by the variant.
-   The <variant-name> is `rm` or `bf` or `it` or `bi`.
-   The new <font-switch> is declared (roughly speaking) by:
-   \begtt \catcode`<=13
-   \_font <font switch> = <fontname of>\_ten<variant-name> \_sizepec
-   \endtt
-   If the \^`\_fontselector` is defined then it has priority before <font-switch>
-   and the font is loaded by:
-   \begtt \catcode`<=13
-   \_ea\_font \_fontselector = <fontname of>\_ten<variant-name> \_sizepec
-   \endtt
-   The font is loaded by \`\_doresizefont``<font switch>`. This macro has
-   meaning \`\_doresizetfmfont` in TFM mode and it switches to
-   \^`\_doresizeunifont` when \^`\initunifonts` is used.\nl
-   The `<fontname of>` is generated by the `\fontname` \TeX/ primitive where
-   \`\_rfontskipat` removes the `at<dimen>` part of the `\fontname` output.
-   The `<fontname of>` is generated differently in OTF mode, see
-   \^`\_doresizeunifont` macro.\nl
-   The \`\_whatresize` is defined as `<variant-name>`.\nl
-   The \^`\_fontloaded``<font switch>` is a macro which can be used for
-   post-processing when a font is loaded.
-   \_cod -----------------------------
-
-\_def\_resizefont#1#2{%
-   \_edef\_whatresize{#1}%
-   \_ifx \_fontselector \_undefined
-          \_doresizefont#2\_relax  \_ea\_fontloaded \_csname _ten#1\_endcsname
-   \_else \_ea\_doresizefont \_fontselector  \_ea\_fontloaded \_fontselector \_fi
-   \_lastmagsize=\_zo
-   \_slet{_tryload#1}{_relax}%
-}
-\_def\_doresizetfmfont#1{\_logfont{#1}%
-   \_ea\_font\_ea#1\_ea\_rfontskipat
-      \_fontname \_cs{_ten\_whatresize} \_relax\_space \_sizespec \_relax
-}
-\_let\_doresizefont=\_doresizetfmfont
-\_def\_logfont#1{} % default is no logging of used fonts
-
-\_def\_rfontskipat#1{\_ifx#1"\_ea\_rfskipatX \_else\_ea\_rfskipatN\_ea#1\_fi}
-\_def\_rfskipatX #1" #2\_relax{"\_whichtfm{#1}"}
-\_def\_rfskipatN #1 #2\_relax{\_whichtfm{#1}}
-
-   \_doc -----------------------------
-   If a font is loaded by \^`\_resizefont` or \^`\resizethefont` then the
-   \`\_fontloaded``<font switch>` is called immediately after it. If the font
-   is loaded first then its `\skewchar` is equal to $-1$. We run
-   \`\_newfontloaded``<font switch>` and set `\skewchar=-2` in this case.
-   A user can define a `\_newfontloaded` macro. We are sure that
-   `\_newfontloaded` macro is called only once for each instance of the font
-   given by its name, OTF features and size specification. The `\skewchar` value is
-   globally saved to the font (like `\fontdimen`). If it is used in math
-   typesetting then it is set to a positive value.\nl
-   The `\_newfontloaded` should be defined for micro-typographic configuration of
-   fonts, for example. See
-   \ulink[http://petr.olsak.net/optex/optex-tricks.html\#fontexpand]{OpTeX/ trick 0058}.
-   \_cod -----------------------------
-
-\_def\_fontloaded #1{\_ifnum\_skewchar#1=-1 \_skewchar#1=-2 \_newfontloaded#1\_fi}
-\_def\_newfontloaded #1{}
-
-   \_doc -----------------------------
-   \`\fontdef` `<font switch>{<modifiers><variant selector>}`
-   opens group, runs `<modifiers><variant selector>` (i.e.\ it runs `#2` parameter).
-   The font switch `#1` saved in the \`\_fontselector` macro is re-declared
-   because the variant selector runs the \^`\_resizefont`. Now, we need to
-   keep the current meaning of the font switch `#1` but we must leave the
-   opened group. This is done by the \`\_keepmeaning` macro.
-   \nl
    \`\fontlet` `<font switch A> <font switch B> <size spec>` does
    \begtt \catcode`\<=13
    \font <font switch A> = <fontname> <sizespec>
@@ -109,18 +40,10 @@
    The `<fontname>` is extracted using the primitive command `\_fontname <font switch B>`.
    \_cod -----------------------------
 
-\_def \_fontdef #1#2{\_begingroup
-   \_ifx\_fontselector\_undefined \_def\_fontselector{#1}\_fi
-   \_reloading #2%
-   \_ea \_keepmeaning \_fontselector \_endgroup
-}
 \_def\_fontlet#1#2{\_ifx #2=\_ea\_fontlet \_ea#1\_else
-  \_ea\_font\_ea#1\_ea\_rfontskipat\_fontname#2 \_relax\_space \_fi
+   \_ea\_font\_ea#1\_ea\_rfontskipat\_fontname#2 \_relax\_space \_fi
 }
-\_def \_keepmeaning #1#2{\_global\_let\_keepmeaningdata=#1%
-   #2\_let#1=\_keepmeaningdata \_global\_let\_keepmeaningdata=\_undefined
-}
-\_public \fontdef \fontlet ;
+\_public \fontlet ;
 
    \_doc -----------------------------
    \`\newcurrfontsize` `<size spec>` sets current font size to the `<size spec>`
@@ -144,39 +67,6 @@
  \_public \newcurrfontsize \resizethefont ;
 
    \_doc -----------------------------
-   The variant selector is defined by `\protected\def\XX{\_tryloadXX \_tenXX}`
-   The `\_tryloadXX` can be in `\_relax` state if no font modifiers were
-   declared. But normally it does \^`\_resizefont``{XX}\tenXX`. This meaning
-   is activated by the \`\_reloading` macro.
-   \_cod -----------------------------
-
-\_def\_reloading{\_loadf{rm}\_tenrm \_loadf{bf}\_tenbf
-   \_loadf{it}\_tenit \_loadf{bi}\_tenbi
-}
-\_def\_loadf#1#2{\_sdef{_tryload#1}{\_ifmmode \_else \_resizefont{#1}#2\_fi}}
-\_def\_tryloadtt{\_resizefont{tt}\_tentt} % only in TFM mode
-
-\_let\_tryloadrm=\_relax
-\_let\_tryloadbf=\_relax
-\_let\_tryloadit=\_relax
-\_let\_tryloadbi=\_relax
-
-    \_doc ----------------------------
-    The font selection system allows to use \`\currvar`
-    instead explicitly specified variant selector. The current variant
-    is extracted from `\the\font` output which could be `\_tenXX` control
-    sequence. Then `\currvar` expands to `\_rm` or `\_it` etc.
-    \_cod ----------------------------
-
-\_protected \_def \_currvar{\_cs{_currvar:\_ea \_csstring \_the\_font}}
-\_sdef{_currvar:_tenrm}{\_rm}
-\_sdef{_currvar:_tenbf}{\_bf}
-\_sdef{_currvar:_tenit}{\_it}
-\_sdef{_currvar:_tenbi}{\_bi}
-\_sdef{_currvar:_tentt}{\_tt}
-\_public \currvar ;
-
-   \_doc -----------------------------
    The \`\_regtfm` `<font id> <optical size data>`
    saves the <optical size data> concerned to `<font id>`.
    The `<optical size data>` is in the form as shown below in the code where
@@ -232,8 +122,6 @@
 \_regtfm lmri 0 ec-lmri7 7.5 ec-lmri8 8.5 ec-lmri9 9.5 ec-lmri10 11.1 ec-lmri12 *
 \_regtfm lmtt 0 ec-lmtt8 8.5 ec-lmtt9 9.5 ec-lmtt10 11.1 ec-lmtt12 *
 
-\_setfontsize {at10pt} % default font size
-
 \_endcode %---------------------------------------------------
 
 
@@ -240,6 +128,11 @@
 \sec[setfontsize] Scaling fonts in text mode (low-level macros)
 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
 
+This section describes single part of Font Selection System: resizing fonts
+to various sizes. This feature is available in both modes: TFM mode
+(initialized when format starts) and OTF mode (after \~`\fontfam` or
+\~`\initunifonts` is used).
+
 \secc The `\setfontsize` macro
 
 The \^`\setfontsize` `{<size spec>}`
@@ -310,28 +203,6 @@
 \cyklop The 12 pt text is here
 \endtt
 
-\secc[fontdef] The \code{\\fontdef} declarator
-
-You can declare `\<newfont>` by the \~`\fontdef` command.
-
-\begtt \catcode`\<=13
-  \fontdef \<newfont> {<font modifiers> \<variant-selector>}
-  example:
-  \fontdef \bigfont {\setfontsize{at15pt}\bf}
-\endtt
-%
-This command runs `<font modifiers> \<variant-selector>` in an internal group and sets the
-resulting selected font as `\<newfont>`.
-
-The resulting `\<newfont>` declared by \~`\fontdef` is \"fixed font switch"
-independent of \^`\setfontsize` and other font modifiers. More exactly, it is
-a fixed font switch when it is used but it can depend on the current font
-modifiers and font family and given font modifiers when it is declared.
-
-The parameter of the \~`\fontdef` macro must be exactly finished by the
-variant selector. More information about font modifiers
-and variant selectors are in the section~\ref[fontsystem].
-
 \secc[fontlet] The \code{\\fontlet} declarator
 
 We have another command for scaling: \^`\fontlet` which can resize
@@ -370,13 +241,13 @@
 
 Font collections with optical sizes must be registered by the
 \^`\_regtfm` for `tfm` files or \^`\_regoptsizes` for Unicode fonts.
-\OpTeX/ registers 8bit Latin Moder fonts in the format (`fonts-resize.opm` file)
+\OpTeX/ registers 8bit Latin Modern fonts in the format
 and OTF Latin Modern fonts in the `f-lmfonts.opm` file.
+See also section~\ref[optsizes].
 
-\secc Implementation notes
-
 \_endinput
 
+2021-05-02 better concept of doc, moving parts to fonts-select
 2021-04-17 \_fontloaded, \_newfontloaded introduced
 2020-04-17 \resizethefont introduced
 2020-03-17 released

Modified: trunk/Master/texmf-dist/tex/optex/base/fonts-select.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/fonts-select.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/fonts-select.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,8 +1,133 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \fontfam {Fonts selection system <2021-04-22>} % preloaded in format
+\_codedecl \fontfam {Fonts selection system <2021-05-23>} % preloaded in format
 
    \_doc -----------------------------
+   The variant selectors  \^`\rm`, \^`\bf`, \^`\it`, \^`\bi`, \^`\tt`
+   are defined (roughly speaking) by
+   \begtt \catcode`\<=13
+   \def\<XX> {\_tryload<XX>\_ten<XX>}
+   \endtt
+   where <XX> is \"internal variant name" `rm` or `bf` or `it` or `bi` or `tt`.
+   There are five \"internal font switchers" `\_tenrm`, `\_tenbf`, `\_tenit`,
+   `\_tenbi` and `\_tentt`. They are used almost for all fonts selected by the Fonts
+   Selection System. For example, `\_tenbf` is the switcher for bold variant of
+   the current family in the current font context. The \^`\bf` macro is defined as
+   `\_tryloadbf \_tenbf`. If the font context (font family, font size, features)
+   is not changed, then `\_tryloadbf` is `\relax` and `\_tenbf` font switcher selects
+   given font. If the font context is changed, then `\_tryloadbf` is re-defined (see
+   \^`\_reloading` macro) to load new bold varinat of the font using \^`\_resizefont`
+   The loaded font is saved to `\_tenbf` switcher and `\_tryloadbf` returns
+   back to the `\relax` meaning. So, `\bf` macro loads
+   new font with current font context and then selects it by `\_tenbf`
+   selector. The word \"ten" is used here
+   only for historical reason; the font can be at arbitrary size.
+   \nl
+   The \`\_reloading` macro is run whenever font context is changed.
+   It activates `\_tryload<XX>` for `<XX>` in `rm`, `bf`, `it` and `bi`.
+   The \`\_loadf``{<XX>}\ten<XX>` is processed for this.
+   \nl
+   The \`\_tryloadtt` is implemented differently because we want to keep
+   family independence for `\tt` macro, see section~\ref[tt].
+   So, `\_tryloadtt` is defined constantly as \"loading `\tt` font" and it is
+   not re-defined to `\relax`. On the other hand, `\_tryloadtt` is
+   re-defined in the \^`\initunifonts` macro or when used
+   \~`\famvardef``\tt`.
+   \_cod -----------------------------
+
+\_def\_reloading{\_loadf{rm}\_tenrm \_loadf{bf}\_tenbf \_loadf{it}\_tenit \_loadf{bi}\_tenbi}
+\_def\_loadf#1#2{\_sdef{_tryload#1}{\_ifmmode \_else \_resizefont{#1}#2\_fi}}
+\_def\_tryloadtt{\_resizefont{tt}\_tentt} % only in TFM mode
+
+\_let\_tryloadrm=\_relax
+\_let\_tryloadbf=\_relax
+\_let\_tryloadit=\_relax
+\_let\_tryloadbi=\_relax
+
+   \_doc ----------------------------
+   The Font Selection system allows to use \`\currvar`
+   instead explicitly specified variant selector. The current variant
+   is extracted from `\the\font` output which could be `\_ten<XX>` control
+   sequence. Then `\currvar` expands to `\_rm` or `\_it` etc.
+   \_cod ----------------------------
+
+\_protected \_def \_currvar{\_cs{_currvar:\_ea \_csstring \_the\_font}}
+\_sdef{_currvar:_tenrm}{\_rm}
+\_sdef{_currvar:_tenbf}{\_bf}
+\_sdef{_currvar:_tenit}{\_it}
+\_sdef{_currvar:_tenbi}{\_bi}
+\_sdef{_currvar:_tentt}{\_tt}
+\_public \currvar ;
+
+   \_doc -----------------------------
+   The \`\_resizefont` `{<variant-name>}\<font switch>` is the heart of the
+   Fonts Selection System. It resizes the font given by the variant with
+   respect to the current font context and sets a new <font-switch>.
+   The <variant-name> is `rm` or `bf` or `it` or `bi` or `tt`.
+   The new <font-switch> is declared (roughly speaking) by:
+   \begtt \catcode`<=13
+   \_font <font switch> = <fontname of>\_ten<variant-name> \_sizepec % in TFM mode
+   \_font <font switch> = {\_fontnamegen} \_sizespec              % in OTF mode
+   \endtt
+   The font is loaded by \`\_doresizefont``<font switch>`. This macro has
+   meaning \`\_doresizetfmfont` in TFM mode (default in format) and it
+   switches to \^`\_doresizeunifont` when \^`\initunifonts` is used.\nl
+   The `<fontname of>` is generated by the `\fontname` \TeX/ primitive where
+   \`\_rfontskipat` removes the `at<dimen>` part of the `\fontname` output.\nl
+   The \`\_whatresize` is defined as `<variant-name>`.\nl
+   The \^`\_fontloaded``<font switch>` is a macro which can be used for
+   post-processing when a font is loaded.
+   \_cod -----------------------------
+
+\_def\_resizefont#1#2{%
+   \_edef\_whatresize{#1}\_doresizefont#2\_relax \_fontloaded #2%
+   \_lastmagsize=\_zo
+   \_if t\_ignoresecond#1\_else \_slet{_tryload#1}{_relax}\_fi
+}
+\_def\_doresizetfmfont#1{\_logfont{#1}%
+   \_ea\_font\_ea#1\_ea\_rfontskipat
+      \_fontname \_cs{_ten\_whatresize} \_relax\_space \_sizespec \_relax
+}
+\_let\_doresizefont=\_doresizetfmfont
+\_def\_logfont#1{} % default is no logging of used fonts
+
+\_def\_rfontskipat#1{\_ifx#1"\_ea\_rfskipatX \_else\_ea\_rfskipatN\_ea#1\_fi}
+\_def\_rfskipatX #1" #2\_relax{"\_whichtfm{#1}"}
+\_def\_rfskipatN #1 #2\_relax{\_whichtfm{#1}}
+
+   \_doc -----------------------------
+    \`\_doresizeunifont``<font-switch>` implements the OTF mode of
+   loading fonts \^`\_doresizefont`.
+   There is a fallback to TFM mode if \^`\_fontnamegen` is not defined.\nl
+   The \^`\_fontnamegen` expands to the font name/file:font-features
+   depending on the current font context.
+   \_cod -----------------------------
+
+\_def\_doresizeunifont #1{\_logfont{#1}%
+   \_ifx\_fontnamegen\_undefined \_doresizetfmfont#1\_else
+       \_font#1={\_fontnamegen} \_sizespec \_relax \_setwsp#1\_relax
+   \_fi
+}
+
+   \_doc -----------------------------
+   If a font is loaded by \^`\_resizefont` or \^`\resizethefont` then the
+   \`\_fontloaded``<font switch>` is called immediately after it. If the font
+   is loaded first then its `\skewchar` is equal to $-1$. We run
+   \`\_newfontloaded``<font switch>` and set `\skewchar=-2` in this case.
+   A user can define a `\_newfontloaded` macro. We are sure that
+   `\_newfontloaded` macro is called only once for each instance of the font
+   given by its name, OTF features and size specification. The `\skewchar` value is
+   globally saved to the font (like `\fontdimen`). If it is used in math
+   typesetting then it is set to a positive value.\nl
+   The `\_newfontloaded` should be defined for micro-typographic configuration of
+   fonts, for example. See
+   \ulink[http://petr.olsak.net/optex/optex-tricks.html\#fontexpand]{OpTeX/ trick 0058}.
+   \_cod -----------------------------
+
+\_def\_fontloaded #1{\_ifnum\_skewchar#1=-1 \_skewchar#1=-2 \_newfontloaded#1\_fi}
+\_def\_newfontloaded #1{}
+
+   \_doc -----------------------------
    \`\initunifonts` macro extends \LuaTeX's font capabalities,
    in order to be able to load Unicode fonts. Unfortunately, this part of
    \OpTeX/ depends on `luaotfload` package, which adapts Con\TeX/t's generic
@@ -10,30 +135,25 @@
    from \LaTeX's `luatexbase` namespace, we provide our own replacements.
    Moreover, `\initunifont` switches with
    the \^`\_doresizefont` macro to OTF mode which is represented by the
-   macro \`\_doresizeunifont`. This mode includes
-   a fallback to TFM mode if \^`\_fontnamegen` is not defined.
-   Finally, `\initunifonts` sets itself to relax because we don't want to do
+   macro \^`\_doresizeunifont`.
+   Finally, \^`\initunifonts` sets itself to relax because we don't want to do
    this work twice.\nl
-   \`\_ttunifont` is default font for `\tt` variant if
-   `f-lmfonts.opm` (or another font file where `\tt` is declared) is not loaded.
+   \`\_ttunifont` is default font for `\tt` variant.
+   User can re-define it or use \^`\famvardef``\tt`.
    \_cod -----------------------------
 
 \_def\_initunifonts {%
-   \directlua{%
+   \_directlua{%
       require('luaotfload-main')
       luaotfload.main()
    }%
    \_gdef\_rfskipatX ##1" ##2\_relax{"##1"}%
    \_global\_let \_doresizefont=\_doresizeunifont
-   \_gdef\_tryloadtt {\_fontdef\_tentt{\_let\_fontnamegen=\_ttunifont\_rm}}%
+   \_gdef\_tryloadtt {\_begingroup \_let\_fontnamegen\_ttunifont % \tt uses \_ttunifont
+      \_resizefont{tt}\_tentt\_relax \_ea\_endgroup \_ea\_let \_ea\_tentt \_the\_tentt}%
    \_global\_let \_initunifonts=\_relax % we need not to do this work twice
    \_global\_let \initunifonts=\_relax
 }
-\_gdef\_doresizeunifont #1{\_logfont{#1}%
-   \_ifx\_fontnamegen\_undefined \_doresizetfmfont#1\_else
-       \_font#1={\_fontnamegen} \_sizespec \_relax \_setwsp#1\_relax
-   \_fi
-}
 \_def\_ttunifont{[lmmono10-regular]:\_fontfeatures-tlig;}
 
 \_public \initunifonts ;
@@ -72,31 +192,6 @@
 }
 
    \_doc -----------------------------
-   \`\_regoptsizes` `<internal-template> <left-output>?<right-output> <resizing-data>`
-   prepares data for using by the \`\_optname` `<internal-template>` macro.
-   The data are saved to the `\_oz:<internal-template>` macro.
-   When the `\_optname` is expanded then the data are scanned by the macro
-   \`\_optnameA` `<left-output>?<right-output> <mid-output> `\code{<}`<size>`
-   in the loop.\nl
-   \`\_optfontalias` `{<template A>}{<template B>}` is defined as
-   `\let\_oz:<templateA>=\_oz:<templateB>`.
-   \_cod -----------------------------
-
-\_def\_regoptsizes #1 #2?#3 #4*{\_sdef{_oz:#1}{#2?#3 #4* }}
-\_def\_optname #1{\_ifcsname _oz:#1\_endcsname
-   \_ea\_ea\_ea \_optnameA \_csname _oz:#1\_ea\_endcsname
-   \_else \_failedoptname{#1}\_fi
-}
-\_def\_failedoptname #1{optname-fails:(#1)}
-\_def\_optnameA #1?#2 #3 <#4 {\_ifx*#4#1#3#2\_else
-   \_ifdim\_optsize<#4pt #1#3#2\_optnameC
-   \_else \_afterfifi \_optnameA #1?#2 \_fi\_fi
-}
-\_def\_optnameC #1* {\_fi\_fi}
-\_def\_afterfifi #1\_fi\_fi{\_fi\_fi #1}
-\_def\_optfontalias #1#2{\_slet{_oz:#1}{_oz:#2}}
-
-   \_doc -----------------------------
    \`\_fvars` `<rm-template> <bf-template> <it-template> <bi-template>`
    saves data for usage by the `\_currV` macro. If a template is only dot
    then previous template is used (it can be used if the font family doesn't
@@ -199,10 +294,40 @@
 \_public \moddef ;
 
    \_doc -----------------------------
-   The \`\famvardef` `\<XX> {<data>}`
+   \`\fontdef` `<font-switch> {<data>}` does:
+   \begtt \catcode`\<=13
+   \begingroup <data> \ea\endgroup \ea\let \ea<font-switch> \the\font
+   \endtt
+   It means that font modifiers used in <data> are applied in the group and the
+   resulting selected font (current at the end of the group) is set to the
+   <font-switch>.
+   We want to declare <font-switch> in its real name directly by `\font` primitive in
+   order to save this name for reporting later (in overfull messages, for
+   example). This is the reason why \^`\_loadf` is re-defined locally here.
+   The <variant selector> used in <data> expands to `\_tryload<XX> \_ten<XX>`.
+   The modified `\_tryload<XX>`
+   removes `\_ten<XX>` and does `\_resizefont{<XX>}<font-swith><font-switch>`,
+   i.e.\ a font is loaded using real `<font-switch>` name and then it is selected
+   as the current font.
+   \_cod -----------------------------
+
+\_def\_fontdef #1#2{\_begingroup
+   \_def\_loadf##1##2{\_sdef{_tryload##1}####1{\_resizefont{##1}#1#1}}%
+   \_reloading \_let\_reloading=\_relax
+   #2\_ea\_endgroup \_ea\_let \_ea#1\_the\_font
+}
+\_public \fontdef ;
+
+   \_doc -----------------------------
+   The \`\famvardef` `\<XX> {<data>}` does, roughly speaking:
+   \begtt \catcode`\<=13
+   \def \<XX> {\fontdef\_ten<XX> {<data>}\_ten<XX>}
+   \endtt
+   but the macro `\<XX>` is declared as family-dependent.
+   So, the real \^`\famvardef` `\<XX> {<data>}`
    uses analogical trick like \^`\moddef` with
-   the \^`\_famdepend` macro. The auxiliary
-   \`\_famvardefA` `\<XX> \_ten<XX> \_tryload<XX> {<data>}` is used.
+   the \^`\_famdepend` macro. The \^`\famvardef` loads
+   the auxiliary \`\_famvardefA` `\<XX> \_ten<XX> \_tryload<XX> {<data>}`.
    It does:
    \begitems
    * `\def \_tryload:<currfam>:<XX> {`\^`\fontdef`` \_ten<XX> {<data>}}` loads font `\_ten<XX>`,
@@ -213,6 +338,9 @@
    `\famvardef\tt` behaves somewhat differently: it doesn't re-define the
    `\tt` macro which is defined  as `\_tryloadtt \_tentt` in sections~\ref[math-preload]
    and~\ref[unimath-codes]. It only re-defines the internal `\_tryloadtt` macro.
+   Note, that you cannot use `\tt` inside `\famvardef\tt`. So, new `\tt`
+   macro does not load \^`\_ttunifont` but uses font from a standard variant
+   rm, bf, it or bi with given font context.
    \_cod -----------------------------
 
 \_def\_famvardef#1{\_edef\_tmp{\_csstring#1}%
@@ -339,25 +467,34 @@
 
    \_doc -----------------------------
    The font features are managed in the \`\_fontfeatures` macro.
-   They have their implicit values saved in the \`\_defaultfontfeatures`
-   and the \`\setff` `{<features>}`
-   can add next font features. If there is the same font feature as the newly
-   added one then the old value is removed from the `\_fontfeatures` list.
+   It expands to
+   \begitems
+   * \`\_defaultfontfeatures` -- used for each font,
+   * \`\_ffadded` -- features added by \^`\setff`,
+   * \`\_ffcolor` -- features added by \^`\setfontcolor`,
+   * \`\_ffletterspace` -- features added by \^`\setletterspace`,
+   * \`\_ffwordspace` -- features added by \^`\setwordspace`.
+   \enditems
+   The macros \^`\_ffadded`, \^`\_ffcolor`, \^`\_ffletterspace`,
+   \^`\_ffwordspace` are empty by default.
    \_cod -----------------------------
 
+\_def \_fontfeatures{\_defaultfontfeatures\_ffadded\_ffcolor\_ffletterspace\_ffwordspace}
 \_def \_defaultfontfeatures {+tlig;}
+\_def \_ffadded{}
+\_def \_ffcolor{}
+\_def \_ffletterspace{}
+\_def \_ffwordspace{}
+
+   \_doc -----------------------------
+   The \`\setff` `{<features>}` adds next font features to \^`\_ffadded`.
+   Usage \^`\setff{}` resets empty set of all \^`\_ffadded` features.
+   \_cod -----------------------------
+
 \_def \_setff #1{%
-   \_ifx^#1^\_let \_fontfeatures=\_defaultfontfeatures
-   \_else \_edef\_fontfeatures{\_fontfeatures #1;}\_fi
+   \_ifx^#1^\_def\_ffadded{}\_else \_edef\_ffadded{\_ffadded #1;}\_fi
    \_reloading
 }
-\_setff {} % default font features: +tlig;
-\_def\_removefeature #1{%
-    \_isinlist\_fontfeatures{#1}\_iftrue
-        \_def\_tmp ##1#1##2;##3\_relax{\_def\_fontfeatures{##1##3}}%
-        \_ea \_tmp \_fontfeatures \_relax
-    \_fi
-}
 \_public \setff ;
 
    \_doc -----------------------------
@@ -370,22 +507,18 @@
    `\fontdimen` registers).
    \_cod -----------------------------
 
-\_def\_savedfontcolor{}
-\_def\_savedletterspace{}
-\_def\_savedwsp{}
-
-\_def \_setfontcolor #1{\_removefeature{color=}%
-    \_edef\_tmp{\_calculatefontcolor{#1}}%
-    \_ifx\_tmp\_empty \_else \_edef\_fontfeatures{\_fontfeatures color=\_tmp;}\_fi
-    \_reloading
+\_def \_setfontcolor #1{%
+   \_edef\_tmp{\_calculatefontcolor{#1}}%
+   \_ifx\_tmp\_empty \_def\_ffcolor{}\_else \_edef\_ffcolor{color=\_tmp;}\_fi
+   \_reloading
 }
-\_def \_setletterspace #1{\_removefeature{letterspace=}%
-    \_if^#1^\_else \_edef\_fontfeatures{\_fontfeatures letterspace=#1;}\_fi
-    \_reloading
+\_def \_setletterspace #1{%
+   \_if^#1^\_def\_ffletterspace{}\_else \_edef\_ffletterspace{letterspace=#1;}\_fi
+   \_reloading
 }
 \_def \_setwordspace #1{%
-   \_if^#1^\_def\_setwsp##1{}\_removefeature{+Ws}%
-   \_else \_def\_setwsp{\_setwspA#1/}\_setff{+Ws}\_fi
+   \_if^#1^\_def\_setwsp##1{}\_def\_ffwordspace{}%
+   \_else \_def\_setwsp{\_setwspA#1/}\_def\_ffwordspace{+Ws;}\_fi
    \_reloading
 }
 \_def\_setwsp #1{}
@@ -402,6 +535,33 @@
 
 \_public \setfontcolor \setletterspace \setwordspace ;
 
+   \_doc -----------------------------
+   \`\_regoptsizes` `<internal-template> <left-output>?<right-output> <resizing-data>`
+   prepares data for using by the \`\_optname` `<internal-template>` macro.
+   The data are saved to the `\_oz:<internal-template>` macro.
+   When the `\_optname` is expanded then the data are scanned by the macro
+   \`\_optnameA` `<left-output>?<right-output> <mid-output> `\code{<}`<size>`
+   in the loop.\nl
+   \`\_optfontalias` `{<template A>}{<template B>}` is defined as
+   `\let\_oz:<templateA>=\_oz:<templateB>`.
+   \_cod -----------------------------
+
+\_def\_regoptsizes #1 #2?#3 #4*{\_sdef{_oz:#1}{#2?#3 #4* }}
+\_def\_optname #1{\_ifcsname _oz:#1\_endcsname
+   \_ea\_ea\_ea \_optnameA \_csname _oz:#1\_ea\_endcsname
+   \_else \_failedoptname{#1}\_fi
+}
+\_def\_failedoptname #1{optname-fails:(#1)}
+\_def\_optnameA #1?#2 #3 <#4 {\_ifx*#4#1#3#2\_else
+   \_ifdim\_optsize<#4pt #1#3#2\_optnameC
+   \_else \_afterfifi \_optnameA #1?#2 \_fi\_fi
+}
+\_def\_optnameC #1* {\_fi\_fi}
+\_def\_afterfifi #1\_fi\_fi{\_fi\_fi #1}
+\_def\_optfontalias #1#2{\_slet{_oz:#1}{_oz:#2}}
+
+\_setfontsize {at10pt} % default font size
+
 \_endcode %---------------------------------------------------
 
 
@@ -532,7 +692,7 @@
 * Font switches can be decared by `\font` primitive (see
   section~\ref[fontprimitive]) or by \^`\fontlet` command (see
   section~\ref[fontlet]) or by \~`\fontdef` command (see
-  sections~\ref[fontdef2] and~\ref[fontdef]).
+  sections~\ref[fontdef2]).
   When the font switches are used then they select the given font independently
   of the current font context. They can be used
   in `\output` routine (for example) because we need to set fixed fonts
@@ -566,14 +726,19 @@
 
 \secc[fontdef2] The `\fontdef` declarator in detail
 
-The general format for \^`\fontdef` usage is
+You can declare `\<font-switch>` by the \^`\fontdef` command.
 \begtt \catcode`\<=13
-\fontdef\<font switch> {\<family selector> <font modifiers> \<variant selector>}
+\fontdef\<font-switch> {\<family selector> <font modifiers> \<variant selector>}
 \endtt
 %
 where `\<family selector>` and `<font modifiers>` are optional and
 `\<variant selector>` is mandatory.
 
+The resulting `\<font-switch>` declared by \~`\fontdef` is \"fixed font switch"
+independent of the font context. More exactly, it is
+a fixed font switch when it is {\em used}. But it can depend on the current font
+modifiers and font family and given font modifiers when it is {\em declared}.
+
 The \^`\fontdef` does the following steps.
 It pushes the current font context to a stack, it does modifications of the font
 context by given `\<family selector>` and/or `<font modifiers>` and it
@@ -582,10 +747,7 @@
 it). Finally, `\fontdef` pops the font context stack, so the current
 font context is the same as it was before `\fontdef` is used.
 
-More about `\fontdef` command including examples is written in
-section~\ref[fontdef].
 
-
 \secc[famvardef] The `\famvardef` declarator
 
 You can declare a new variant selector by the \^`\famvardef` macro. This
@@ -596,8 +758,8 @@
 %
 where `\<family selector>` and `<font modifiers>` are optional and
 `\<variant selector>` is mandatory.
-The `\<new variant selector>` should be used in the same sense as `\rm`,
-`\bf` etc. It can be used as the final command in next
+The `\<new variant selector>` declared by `\famvardef` should be used in the same
+sense as `\rm`, `\bf` etc. It can be used as the final command in next
 \^`\fontdef` or \^`\famvardef` declarators
 too. When the `\<new variant selector>` is used in the normal text then it does
 the following steps: pushes current font context to a stack, modifies font
@@ -848,6 +1010,8 @@
 
 \endinput
 
+2021-05-23  concept of \_fontfeatures macro re-implemented
+2021-05-02  simpler \_resizefont, better concept of doc, moving parts from fonts-resize
 2021-04-22  \_ffonum introduced
 2021-04-19  \setwordspace: parameter format {/A/B/C} implemented.
 2021-02-25  \_ttunifont introduced

Modified: trunk/Master/texmf-dist/tex/optex/base/hyperlinks.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/hyperlinks.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/hyperlinks.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \ulink {Hyperlinks <2021-04-17>} % preloaded in format
+\_codedecl \ulink {Hyperlinks <2021-05-14>} % preloaded in format
 
    \_doc ----------------------------
    \`\dest``[<type>:<spec>]` creates a destination of internal links. The
@@ -25,78 +25,81 @@
 \_public \dest ;
 
    \_doc ----------------------------
-   \`\link``[<type>:<spec>]{<color>}{<text>}` creates an internal link to \^`\dest`
-   with the same `<type>:<spec>`. You can have more links with the same
-   `<type>:<spec>` but only one `\dest` in the document. If \^`\hyperlinks`
-   command is not used, then `\link` only prints `<text>` else its meaning is set to
-   `\_linkactive`.
-   The \`\_linkactive` is implemented by `\_pdfstartlink...\_pdfendlink`
-   primitives. The `<color>` is the color of the link text generated by
-   the `\_linkactive` macro.
-   The `<color>` parameter can be overwritten by definition of
-   `\_<type>linkcolor`. For example `\def\_toclinkcolor{\Red}` means that
-   links from table of contents are in red. This is similar concept as
-   `\_def\_tocborder`.
+   Each hyperlink is created internally by \`\_xlink``{<type>}{<spec>}{<color>}{<text>}`.
+   This macro expands to `\_quitvmode{<text>}` by default, i.e.\ no active
+   hyperlink is created, only <text> is printed in horizontal mode.
+   If \^`\hyperlinks` is used, then `\_xlink` gets meaning of
+   \`\_xlinkactive` and hyperlinks are created using `\pdfstartlink`,
+   `\pdfendlink` primitives. The <text> has given <color> only when
+   hyperlink is created. But if `\_<type>linkcolor` is defined, it has
+   precedence.
    \nl
-   \`\ilink``[<type>:<spec>]{<text>}` is equivalent to `\_link` but
-   the `<color>` is used from \^`\hyperlinks` declaration
-   (or it is overwriten by `\def\_<type>linkcolor`).
+   The \`\_linkdimens` macro declares the dimensions of link area.
    \nl
-   \`\_linkdimens` are default dimensions of the link area.
-   \_cod ----------------------------
+   A specific action can be defined for each link <type> by the macro
+   `\_<type>action{<spec>}`. \OpTeX/ defines only \`\_urlaction``{<url>}`.
+   The default link action (when `\_<type>action` is not defined) is
+   `goto mame{<type>:<spec>}` (creates an internal link). It is declared in the
+   \`\_linkactions``{<type>}{<spec>}` macro.
+   \nl
+   The `\_pdfstartlink` primitive uses `attr{\_pdfborder{<type>}}`. The
+   \`\_pdfborder``{<type>}` macro expands to `/C[? ? ?] /Border[0 0 .6]` if the
+   `\_<type>border` macro (i.e.\ \`\_refborder`, \`\_citeborder`, \`\_tocborder`,
+   \`\_pgborder`, \`\_urlborder`, \`\_fntborder` or \`\_fnfborder`)
+   is defined.
+   \_cod
 
-\_protected\_def\_linkactive[#1:#2]#3#4{\_leavevmode\_pdfstartlink \_linkdimens
-      attr{\_pdfborder{#1}} goto name{#1:#2}\_relax
-      {\_localcolor\_trycs{_#1linkcolor}{#3}#4}\_pdfendlink
+\_protected\_def\_xlinkactive#1#2#3#4{\_quitvmode
+   \_pdfstartlink \_linkdimens attr{\_pdfborder{#1}}\_linkactions{#1}{#2}\_relax
+   {\_localcolor\_trycs{_#1linkcolor}{#3}#4}\_pdfendlink
 }
-\_protected\_def\_link[#1]#2#3{\_leavevmode{#3}}
-\_def\_ilink[#1]#2{\_link[#1]{}{#2}}
+\_protected\_def\_xlink#1#2#3#4{\_quitvmode{#4}}
+
 \_def\_linkdimens{height.9em depth.3em}
-\_public \ilink \link ;
 
-   \_doc ----------------------------
-   \`\ulink``[<url>]{<text>}` creates external link. It prints only the `<text>` by default but
-   the \^`\hyperlinks` declaration defines it as \`\_urlactive``[url:<url>]{<text>}`.
-   The external link is created by the `\_pdfstartlink...\pdfendlink` primitives.
+\_def\_linkactions#1#2{\_ifcsname _#1action\_endcsname
+   \_lastnamedcs{#2}\_else goto name{#1:#2}\_fi}
+\_def\_urlaction #1{user{/Subtype/Link/A <</Type/Action/S/URI/URI(#1)>>}}
+
+\_def\_pdfborder#1{\_ifcsname _#1border\_endcsname
+     /C [\_csname _#1border\_endcsname] /Border [0 0 .6]\_else  /Border [0 0 0]\_fi
+}
+
+   \_doc ------------------------------
+   \`\link``[<type>:<spec>]{<color>}{<text>}` creates a link. It is
+   kept here for backward compatibility and it is
+   equivalent to \^`\_xlink{<type>}{<spec>}{<color>}{<text>}`.
+   If `\_<type>action` is not defined then
+   `\link` creates internal link do the \^`\dest[<type>:<spec>]`.
+   You can have more links with the same `<type>:<spec>` but only one \^`\dest`
+   in the document.
+   \nl
+   \`\ilink``[<type>:<spec>]{<text>}` is equivalent to \^`\link` but
+   the `<color>` is used from \^`\hyperlinks` declaration
+   (or it is overwriten by `\def\_<type>linkcolor`).
+   \nl
+   \`\ulink``[<url>]{<text>}` creates external link.
    The `<url>` is detokenized with `\escapechar=-1` before it is used, so
    `\%`, `\#` etc. can be used in the `<url>`.
    \_cod ----------------------------
 
-\_protected\_def\_urlactive[#1:#2]#3#4{\_leavevmode{\_escapechar=-1
-   \_pdfstartlink \_linkdimens attr{\_pdfborder{#1}}%
-      user{/Subtype/Link/A <</Type/Action/S/URI/URI(\_detokenize{#2})>>}\_relax
-      {\_localcolor\_trycs{_#1linkcolor}{#3}#4}\_pdfendlink}%
-}
-\_def\_ulink[#1]#2{\_leavevmode{#2}}
-\_public \ulink ;
+\_def\_link[#1:#2]{\_xlink{#1}{#2}}
+\_def\_ilink[#1:#2]#3{\_xlink{#1}{#2}\_ilinkcolor{#3}}
+\_def\_ulink[#1]#2{{\_escapechar=-1 \_ea}\_expanded
+   {\_noexpand\_xlink{url}{\_detokenize{#1}}}\_elinkcolor{#2}}
 
-   \_doc ----------------------------
-   The `\_pdfstartlink` primitive uses `attr{\_pdfborder{<type>}}` in its parameter
-   (see \^`\_linkactive` or \^`\_urlactive` macros). The \`\_pdfborder``{<type>}`
-   macro expands to `/C[? ? ?] /Border[0 0 .6]` if the
-   `\_<type>border` macro (i.e.\ \`\_refborder`, \`\_citeborder`, \`\_tocborder`,
-   \`\_pgborder`, \`\_urlborder`, \`\_fntborder` or \`\_fnfborder`)
-   is defined. Users can define it in
-   order to create colored frames around active links. For example
-   `\def\_tocborder{1 0 0}` causes red frames in TOC (not printed, only visible
-   in PDF viewers).
-   \_cod ----------------------------
+\_public \ilink \ulink \link ;
 
-\_def\_pdfborder#1{\_ifcsname _#1border\_endcsname
-     /C [\_csname _#1border\_endcsname] /Border [0 0 .6]\_else  /Border [0 0 0]\_fi
-}
-
    \_doc ----------------------------
-   \`\hyperlinks``{<ilink_color>}{<ulink_color>}` activates `\dest`, `\link`,
-   `\ilink`, `\ulink` in order they create links. These macros are redefined
-   here to their \"active" version.
+   \`\hyperlinks``{<ilink_color>}{<ulink_color>}` activates `\dest`, `\xlink`,
+   in order they create links.
    \_cod ----------------------------
 
 \_def\_hyperlinks#1#2{%
-   \_let\_dest=\_destactive \_let\_link=\_linkactive
-   \_def\_ilink[##1]##2{\_link[##1]{#1}{##2}}%
-   \_def\_ulink[##1]##2{\_urlactive[url:##1]{#2}{##2}}%
-   \_public \dest \ilink \ulink \link ;%
+   \_let\_dest=\_destactive \_let\_xlink=\_xlinkactive
+   \_let\_ilinkcolor=#1%
+   \_let\_elinkcolor=#2%
+   \_public \dest \xlink ;%
 }
 \_public \hyperlinks ;
 
@@ -104,10 +107,23 @@
    \`\url``{<url>}` does approximately the same as \^`\ulink``[<url>]{<url>}`, but
    more work is done before the `\ulink` is processed. The link-version of <url>
    is saved to `\_tmpa` and the printed version in `\_tmpb`. The printed
-   version is modified in order to set breakpoints to special places of the
-   `<url>`. For example `//` is replaced by `\_urlskip/\_urlskip/\_urlbskip`
-   where `\urlskip` adds a small nonbreakable glue between these two slashes and
-   before them and `\_urlbskip` adds a breakable glue after them.
+   version is processed in four steps: 1.~the `\|` are replaced by `[||]` (we
+   suppose that such string does not exist in any URL). 2.~it is detokenized with
+   `\escapechar=-1`. 3.~muti-strings and spaces are replaced by strings in
+   braces `{...}`. 4.~internal penalties and skips are put between characters
+   using \`\_urlA`, \`\_urlB` and \`\_urlC`. The step~4 do following:
+   The \`\_urlxskip` is inserted between each pair of \"normal characters",
+   i.e.\ characters not declared by `\sdef{_ur:<character>}`.
+   The special characters declared by `\sdef{_ur:<character>}` are replaced
+   by the body of their corresponding macro.
+   The \`\_urlskip`, \`\_urlbskip`, \`\_urlgskip`
+   are typical skips used for special characters, their meaning is
+   documented in the code below. You can change them.
+   Default values: penalty 9990 is inserted between each pair of normal
+   chararacters, penalty 100 is inserted after special charcters, nobreak before special
+   characters. The URL can be broken at any place using these default
+   values. If you want to disable breaking between normal characters, say
+   `\let\_urlxskip=\nobreak`.
    \nl
    The text version of the `<url>` is printed in \`\_urlfont`.
    \_cod ----------------------------
@@ -114,28 +130,41 @@
 
 \_def\_url#1{{%
    \_def\_tmpa{#1}\_replstring\_tmpa {\|}{}%
-   {\_escapechar=-1 \_ea}\_ea\_edef\_ea\_tmpa\_ea{\_detokenize\_ea{\_tmpa}}%
-   \_def\_tmpb{#1}\_replstring\_tmpb {\|}{\_urlbskip}%
-   \_replstring\_tmpb {//} {{\_urlskip\_urlslashslash\_urlbskip}}%
-   \_replstring\_tmpb {/}  {{\_urlskip/\_urlbskip}}%
-   \_replstring\_tmpb {.}  {{\_urlskip.\_urlbskip}}%
-   \_replstring\_tmpb {?}  {{\_urlskip?\_urlbskip}}%
-   \_replstring\_tmpb {=}  {{\_urlskip=\_urlbskip}}%
-   \_ea\_replstring\_ea\_tmpb \_ea{\_string &} {{\_urlbskip\_char`\& \_urlskip}}%
-   \_ea\_replstring\_ea\_tmpb \_ea{\_bslash|}  {{\_penalty0}}%
-   \_ea\_ulink \_ea[\_tmpa] {\_urlfont\_tmpb\_null}%
+   \_def\_tmpb{#1}\_replstring\_tmpb {\|}{[||]}%
+   {\_escapechar=-1 \_ea}\_ea\_edef\_ea\_tmpb\_ea{\_detokenize\_ea{\_tmpb}}%
+   \_replstring\_tmpb{[||]}{{gb|}}%
+   \_replstring\_tmpb{ }{{ }}%
+   \_replstring\_tmpb{://}{{://}}%
+   \_ea\_ulink \_ea[\_ea{\_tmpa}] {\_urlfont \_ea\_urlA\_tmpb\_end}%
 }}
-\_def\_urlfont{\_tt}
-\_def\_urlskip{\_null\_nobreak\_hskip0pt plus0.05em\_relax}
-\_def\_urlbskip{\_penalty100 \_hskip0pt plus0.05em\_relax}
-\_def\_urlslashslash{/\_urlskip/}
+\_def\_urlA#1{\_ifx\_end#1\_else \_urlC{}{#1}\_fi}
+\_def\_urlB#1{\_ifx\_end#1\_else \_urlC{\_urlxskip}{#1}\_fi}
+\_def\_urlC#1#2{%
+   \_ifcsname _ur:#2\_endcsname \_lastnamedcs \_ea\_ea\_ea \_urlA
+   \_else #1#2\_ea\_ea\_ea \_urlB \_fi
+}
+\_sdef{_ur:://}{\_urlskip:\_urlskip/\_urlskip/\_urlbskip}
+\_sdef{_ur:/}{\_urlskip/\_urlbskip}
+\_sdef{_ur:.}{\_urlskip.\_urlbskip}
+\_sdef{_ur:?}{\_urlskip?\_urlbskip}
+\_sdef{_ur:=}{\_urlskip=\_urlbskip}
+\_sdef{_ur:-}{\_urlskip-\_urlbskip}
+\_sdef{_ur:&}{\_urlskip\_char`\&\_urlbskip}
+\_sdef{_ur:gb|}{\_urlgskip}
 
+\_def\_urlfont{\_tt}                    % url font
+\_def\_urlxskip{\_penalty9990\_hskip0pt plus0.03em\_relax} % skip between normal characters
+\_def\_urlskip{\_null\_nobreak\_hskip0pt plus0.1em\_relax} % skip before :// / . ? = - &
+\_def\_urlbskip{\_penalty100 \_hskip0pt plus0.1em\_relax}  % skip after  :// / . ? = - &
+\_def\_urlgskip{\_penalty-500\_relax}   % "goodbreak" penalty generated by \|
+
 \_public \url ;
 
 \_endcode % ----------------------------------------
 
 
-There are four types of internal links and one type of external link:
+There are six types of internal links and one type of external link used
+in \OpTeX/. They are used in the format <type>:<spec>.
 
 \begitems
 * `ref:<label>`     -- the destination is created when `\label[<label>]` is used,
@@ -146,20 +175,36 @@
                        see also the section \ref[output].
 * `cite:<bibpart>/<bibnum>`   -- the destination is created in bibliography reference,
                        see section \ref[bib].
+* `fnt:<gfnotenum>` -- link form text to footnote, see also section~\ref[fnotes].
+* `fnf:<gfnotenum>` -- link from footnote to text, see also section~\ref[fnotes].
 * `url:<url>`       -- used by `\url` or `\ulink`,
                        see also the end of this section.
 \enditems
 
-The `<tocrefnum>`, `<gpageno>`, and `<bibnum>` are numbers starting from one and
-globally incremented by one in the whole document. The registers \^`\tocrefnum`,
-\^`\gpageno` and \^`\bibnum` are used for these numbers.
+The `<tocrefnum>`, `<gpageno>`, `<bibnum>`, and `<gfnotenum>` are numbers starting
+from one and globally incremented by one in the whole document. The registers \^`\tocrefnum`,
+\^`\gpageno`, \^`\bibnum`, and \^`\_gfnotenum` are used for these numbers.
 
 When a chap/sec/secc title is prefixed by `\label[<label>]`, then both types
 of internal links are created at the same destination place:
 `toc:<tocrefnum>` and `ref:<label>`.
 
+The color for active links can be declared by `\def\_<type>linkcolor`, the
+border around link can be declared by `\def\_<type>border`. These macros are
+not declared by default, so color for active links are given only by
+\^`\hyperlinks` macro and borders are invisible.
+For example `\def\_toclinkcolor{\Red}` means that links from table of
+contents are in red.
+Another example `\def\_tocborder{1 0 0}` causes red frames in TOC
+(not printed, only visible in PDF viewers).
+
+
 \_endinput
 
+2021-05-14 \_xlink introduced, \link, \ilink, \ulink re-implemented.
+2021-05-12 \url: triplet :// instead //, \_urlslashslash removed.
+2021-05-11 \url reimplemented, \_urlxskip added.
+2021-04-30 \url: \detokenize of \tmpb added, bug fix.
 2021-04-17 attr{\_pdfborder{...}} instead expanding \_pdfborder to attr{...}
 2021-04-02 The possibility of \def\_toclinkcolor introduced, \localcolor moved
 2021-01-27 \public \link added to \hyperlinks, bug fixed.

Modified: trunk/Master/texmf-dist/tex/optex/base/languages.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/languages.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/languages.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \_mtext {Languages <2021-01-21>} % preloaded in format
+\_codedecl \_mtext {Languages <2021-05-23>} % preloaded in format
 
    \_doc -----------------------------
    Only four words are generated by \OpTeX/ macros: \"Chapter",
@@ -50,12 +50,12 @@
 
 \_def \_monthw #1 #2 #3 #4 #5 #6 #7 {%
    \_sdef{_mt:m1:#1}{#2}\_sdef{_mt:m2:#1}{#3}\_sdef{_mt:m3:#1}{#4}%
-   \_sdef{_mt:m4:#1}{#5}\_sdef{_mt:m5:#1}{#5}\_sdef{_mt:m6:#1}{#5}%
+   \_sdef{_mt:m4:#1}{#5}\_sdef{_mt:m5:#1}{#6}\_sdef{_mt:m6:#1}{#7}%
    \_monthwB #1
 }
 \_def \_monthwB #1 #2 #3 #4 #5 #6 #7 {%
    \_sdef{_mt:m7:#1}{#2}\_sdef{_mt:m8:#1}{#3}\_sdef{_mt:m9:#1}{#4}%
-   \_sdef{_mt:m10:#1}{#5}\_sdef{_mt:m11:#1}{#5}\_sdef{_mt:m12:#1}{#5}%
+   \_sdef{_mt:m10:#1}{#5}\_sdef{_mt:m11:#1}{#6}\_sdef{_mt:m12:#1}{#7}%
 }
 
 \_monthw en  January February March April May June
@@ -182,6 +182,7 @@
 
 \_endcode % -------------------------------------
 
+2021-05-23 \_monthw: bug fix
 2021-01-21 more robust quotes in outlines
 2020-12-05 bib phrases moved here
 2020-04-29 Obrazek -> Abbildung: bug fixed

Modified: trunk/Master/texmf-dist/tex/optex/base/makeindex.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/makeindex.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/makeindex.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \makeindex {Makeindex and sorting <2021-02-15>} % loaded in format
+\_codedecl \makeindex {Makeindex and sorting <2021-02-15>} % preloaded in format
 
    \_doc -----------------------------
    \^`\makeindex` implements sorting algorithm at \TeX/ macro-language level.

Modified: trunk/Master/texmf-dist/tex/optex/base/math-macros.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/math-macros.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/math-macros.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -321,6 +321,7 @@
 \_protected\_def\cot {\_mathop{\_rm cot}\_nolimits}
 \_protected\_def\coth {\_mathop{\_rm coth}\_nolimits}
 %\_protected\_def\sec {\_mathop{\_rm sec}\_nolimits} % \sec is section
+\_protected\_def\secant {\_mathop{\_rm sec}\_nolimits}
 \_protected\_def\csc {\_mathop{\_rm csc}\_nolimits}
 \_protected\_def\max {\_mathop{\_rm max}}
 \_protected\_def\min {\_mathop{\_rm min}}

Modified: trunk/Master/texmf-dist/tex/optex/base/multicolumns.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/multicolumns.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/multicolumns.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \begmulti {Balanced columns <2020-03-26>} % preloaded in format
+\_codedecl \begmulti {Balanced columns <2021-05-20>} % preloaded in format
 
    \_doc -----------------------------
    This code is documented in detail in the \"\TeX/book naruby", pages 244--246,
@@ -26,7 +26,7 @@
 \_newcount\_mullines
 
 \_def\_begmulti #1 {\_par\_bgroup\_wipeepar\_multiskip\_penalty0 \_def\_Ncols{#1}
-   \_setbox6=\_vbox\_bgroup \_let\_setxhsize=\_relax \_penalty0
+   \_setbox6=\_vbox\_bgroup\_bgroup \_let\_setxhsize=\_relax \_penalty-99
    %% \hsize := column width = (\hsize+\colsep) / n - \colsep
    \_advance\_hsize by\_colsep
    \_divide\_hsize by\_Ncols  \_advance\_hsize by-\_colsep
@@ -34,7 +34,7 @@
    \_def\par{\_ifhmode\_endgraf\_global\_advance\_mullines by\_prevgraf\_fi}%
 }
 \_def\_endmulti{\_vskip-\_prevdepth\_vfil
-   \_ea\_egroup\_ea\_baselineskip\_the\_baselineskip\_relax
+   \_ea\_egroup\_ea\_egroup\_ea\_baselineskip\_the\_baselineskip\_relax
    \_dimen0=.8\_maxdimen \_tmpnum=\_dimen0 \_divide\_tmpnum by\_baselineskip
    \_splittopskip=\_baselineskip
    \_setbox1=\_vsplit6 to0pt
@@ -111,4 +111,5 @@
 
 \_endcode % -------------------------------------
 
-
+2021-05-20 Colors inside \begmulti...\endmuti, bug fixed
+2020-03-26 Introduced

Modified: trunk/Master/texmf-dist/tex/optex/base/optex.ini
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/optex.ini	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/optex.ini	2021-06-03 20:53:13 UTC (rev 59458)
@@ -21,7 +21,7 @@
 
 % OpTeX version
 
-\def\optexversion{1.02 Apr.2021}
+\def\optexversion{1.03 Jun.2021}
 \def\fmtname{OpTeX}
 \let\fmtversion=\optexversion
 

Modified: trunk/Master/texmf-dist/tex/optex/base/optex.lua
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/optex.lua	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/optex.lua	2021-06-03 20:53:13 UTC (rev 59458)
@@ -324,11 +324,9 @@
     elseif new_head ~= true then
         head = new_head
     end
-
     -- mlist_to_hlist means either added functions or standard luatex behavior
     -- of node.mlist_to_hlist (handled by default function)
     head = callback.call_callback("mlist_to_hlist", head, ...)
-
     -- post_mlist_to_hlist_filter
     new_head = callback.call_callback("post_mlist_to_hlist_filter", head, ...)
     if new_head == false then

Modified: trunk/Master/texmf-dist/tex/optex/base/styles.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/styles.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/styles.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -26,9 +26,7 @@
 \_public \boxlines ;
 
    \_doc -----------------------------
-   The \`\report` and \`\letter` style initialization macros are defined here.
-   \nl
-   The `\letter` defines \`\address` and \`\subject` macros.
+   The \`\report` style initialization macro is defined here.
    \_cod -----------------------------
 
 \_def\_report{
@@ -43,6 +41,15 @@
    \_parindent=1.2em \_iindent=\_parindent \_ttindent=\_parindent
    \_footline={\_global\_footline={\_hss\_rmfixed\_folio\_hss}}
 }
+
+   \_doc -----------------------------
+   The \`\letter` style initialization macro is defined here.
+
+   The `\letter` defines \`\address` and \`\subject` macros.
+
+   See the files `demo/op-letter-*.tex` for usage examples.
+   \_cod -----------------------------
+
 \_def\_letter{
    \_def\_address{\_vtop\_bgroup\_boxlines \_parskip=0pt \_let\par=\_egroup}
    \_def\_subject{{\_bf \_mtext{subj}: }}
@@ -65,56 +72,7 @@
 }
 \_public \slides ;
 
-
 \_endcode % -------------------------------------
 
-The example of `\letter` style document follows:
-
-\begtt %-----------------------------------------------------------------
-
-\letter
-\fontfam[bonum]
-\chyph
-
-\address
-  Vážený pan
-  Mgr. Bořek Byrokrat
-  ředitel Ústavu pro další možnosti
-  Úřední 789
-  123 45 Praha 1
-
-\hfill V Praze dne \today
-
-\subject Žádost o možnost další možnosti
-
-Vážený pane řediteli
-
-na základě Vašeho dopisu č.j.~123456/78-dat a elektronické výzvy si dovoluji
-Vás požádat o prozkoumání mé možnosti další možnosti.
-Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
-eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
-veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
-commodo consequat.
-
-Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do
-eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim
-veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea
-commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit
-esse cillum dolore eu fugiat nulla pariatur.
-
-S úctou
-
-\hfill \address
-  {\it Petr Olšák}
-  specialista na \TeX{}
-  Ulice 12345
-  Praha 13
-
-\bye
-
-\endtt %---------------------------------------------------------------------
-
-\endinput
-
 2021-03-10 \ifmmode* added to \adef*
 2020-03-28 released

Modified: trunk/Master/texmf-dist/tex/optex/base/table.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/table.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/table.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \table {Basic macros for OpTeX <2021-04-12>} % preloaded in format
+\_codedecl \table {Basic macros for OpTeX <2021-06-03>} % preloaded in format
 
    \_doc -----------------------------
    The result of the \`\table``{<declaration>}{<data>}` macro is inserted into
@@ -58,10 +58,9 @@
 
    \_doc -----------------------------
    The \`\_tableB` saves `<data>` to `\_tmpb`
-   and does four \^`\replstring`s to prefix each macro \^`\crl` (etc.)
-   by `\_crcr`. The reason is: we want to use macros that scan its parameter
-   to the delimiter written in the right part of the table item declaration.
-   See \^`\fS` for example. The `\crcr` cannot be hidden in another macro in this case.
+   and does \^`\replstring`s to prefix each macro \^`\crl` (etc.)
+   by `\_crcr`. See \^`\_tabreplstrings`. It cannot be used in a `\table` in
+   another `\table`, so \^`\_tabreplstrings` is set to `\relax` locally.
 
    The `\tabskip` value is saved for places between columns
    into the \`\_tabskipmid` macro. Then it runs
@@ -73,8 +72,13 @@
    `<converted declaration>` immediately after each column declarator.
 
    If `pxto` keyword was used, then we set the virtual unit \^`\tsize` to
-   `\hsize` first. Then the first attempt of the table is created in box 0.
-   Then the \^`\tsize` is re-calculated using `\wd0` and the real table is
+   `-\hsize` first. Then the first attempt of the table is created in box 0.
+   All collums where `p{..\tsize}` is used, are created as empty in this first
+   pass. So, the `\wd0` is the width of all other columns.
+   The \^`\_tsizesum` includes the sum of \^`\tsize`'s in `\hsize` units
+   after firts pass. The desired table width is stored in the `\_tmpdim`, so
+   `\_tmpdim-\_wd0` is the rest which have to be filled by \^`\tsize`s.
+   Then the \^`\tsize` is re-calculated and the real table is
    printed by `\halign` in the second pass.
 
    If no `pxto` keyword was used, then we print the table using `\halign`
@@ -96,13 +100,17 @@
    \_cod -----------------------------
 
 \_long\_def\_tableB #1{\_egroup \_def\_tmpb{#1}%
-   \_replstring\_tmpb{\crl}{\_crcr\crl}\_replstring\_tmpb{\crll}{\_crcr\crll}%
-   \_replstring\_tmpb{\crli}{\_crcr\crli}\_replstring\_tmpb{\crlli}{\_crcr\crlli}%
-   \_replstring\_tmpb{\crlp}{\_crcr\crlp}%
+   \_tablereplstrings \_let\_tablereplstrings=\_relax
    \_edef\_tabskipmid{\_the\_tabskip}\_tabskip=\_tabskipl
    \_ifpxto
-      \_tsize=\_hsize \_setbox0 = \_vbox{\_tablepxpreset \_halign \_tableC}%
-      \_tsize=\_dimexpr\_hsize-(\_wd0-\_tmpdim)\_relax
+      \_edef\_tsizes{\_global\_tsizesum=\_the\_tsizesum \_gdef\_noexpand\_tsizelast{\_tsizelast}}%
+      \_tsizesum=\_zo \_def\_tsizelast{0}%
+      \_tsize=-\_hsize \_setbox0=\_vbox{\_tablepxpreset \_halign \_tableC}%
+      \_advance\_tmpdim by-\_wd0
+      \_ifdim \_tmpdim >\_zo \_else \_tsizesum=\_zo \_fi
+      \_ifdim \_tsizesum >\_zo \_tsize =\_expr{\_number\_hsize/\_number\_tsizesum}\_tmpdim
+      \_else \_tsize=\_zo \_fi
+      \_tsizes % retoring values if there is a \table pxto inside a \table pxto.
       \_setbox0=\_null \_halign \_tableC
    \_else
       \_halign\_tablew \_tableC
@@ -111,6 +119,19 @@
 \_def\_tableC{\_ea{\_ea\_bgroup\_the\_tabdata\_egroup\_tabskip=\_tabskipr\_cr
    \_scantextokens\_ea{\_tmpb\_crcr}}}
 
+   \_doc -----------------------------
+   \`\_tabreplstrings` replaces each `\crl` etc. to `\crcr\crl`.
+   The reason is: we want to use macros that scan its parameter
+   to a delimiter written in the right part of the table item declaration.
+   The `\crcr` cannot be hidden in another macro in this case.
+   \_cod -----------------------------
+
+\_def\_tablereplstrings{%
+   \_replstring\_tmpb{\crl}{\_crcr\crl}\_replstring\_tmpb{\crll}{\_crcr\crll}%
+   \_replstring\_tmpb{\crli}{\_crcr\crli}\_replstring\_tmpb{\crlli}{\_crcr\crlli}%
+   \_replstring\_tmpb{\crlp}{\_crcr\crlp}%
+}
+
 \_def\_tablepxpreset{} % can be used to de-activate references to .ref file
 \_newbox\_tstrutbox    % strut used in table rows
 \_newtoks\_tabdata     % the \halign declaration line
@@ -211,12 +232,36 @@
 \_def\_tabdeclarec{\_the\_tabiteml\_hfil##\_unsskip\_hfil\_the\_tabitemr}
 \_def\_tabdeclarel{\_the\_tabiteml\_relax##\_unsskip\_hfil\_the\_tabitemr}
 \_def\_tabdeclarer{\_the\_tabiteml\_hfil##\_unsskip\_the\_tabitemr}
-\_def\_paramtabdeclarep#1{\_the\_tabiteml
-   \_vtop{\_hsize=#1\_relax \_baselineskip=\_normalbaselineskip
-   \_lineskiplimit=\_zo \_noindent \_hskip\_zo \_relax ##\_unsskip
-   \_ifvmode\_vskip\_dp\_tstrutbox \_else\_lower\_dp\_tstrutbox\_hbox{}\_fi}\_the\_tabitemr}
+\_def\_paramtabdeclarep#1{\_the\_tabiteml\_vtop{\_hsize=#1\_relax \_partabitem{##}}\_the\_tabitemr}
 
    \_doc -----------------------------
+   \`\_partabitem``{<data>}` prints the table item in a paragraph format.
+   This macro solves two things. Fist, the setting of parameters for the
+   paragraph formatting. The `\hsize` and parameters from macros
+   \^`\fC`, \^`\fR` etc. are set already.\nl
+   Second thing: if the `\hsize` is negative then first pass of `pxto` table is processed.
+   We print nothing in such case but we advance the \`\_tsizesum`.
+   The auxiliary macro \`\_tsizelast` is used to do advancing
+   only in the first row of the table.
+   \^`\_tsizesum` and \^`\_tsizelast` are initialized in the \^`\_tableB` macro.\nl
+   \`\_partabitemA``{<data>}` only copies <data>, but it is redefined by \^`\fS`.
+   \_cod -----------------------------
+
+\_newdimen \_tsizesum
+\_def \_tsizelast{0}
+\_long\_def\_partabitem#1{%
+   \_ifdim\_hsize<0pt
+      \_ifnum\_tsizelast<\_colnum \_global\_advance\_tsizesum by-\_hsize
+         \_xdef\_tsizelast{\_the\_colnum}\_fi
+   \_else
+      \_baselineskip=\_normalbaselineskip
+      \_lineskiplimit=\_zo \_noindent \_hskip\_zo \_relax \_partabitemA{#1}\_unsskip
+      \_ifvmode\_vskip\_dp\_tstrutbox \_else\_lower\_dp\_tstrutbox\_hbox{}\_fi
+   \_fi
+}
+\_let\_partabitemA=\_useit
+
+   \_doc -----------------------------
    Users put optional spaces around the table item typically, i.e.\ they write
    `& text &` instead `&text&`. The left space is ignored by the internal \TeX/ algorithm but
    the right space must be removed by macros. This is a reason why we recommend to
@@ -238,9 +283,9 @@
 \_def\_fR{\_leftskip=0pt plus 1fill \_relax}
 \_def\_fC{\_leftskip=0pt plus1fill \_rightskip=0pt plus 1fill \_relax}
 \_def\_fX{\_leftskip=0pt plus1fil  \_rightskip=0pt plus-1fil \_parfillskip=0pt plus2fil \_relax}
-\_long\_def\_fS #1\_unsskip{\_noindent \_setbox0 =\_vbox{\_noindent #1\_endgraf \_ea}%
-   \_ifnum\_prevgraf=1 \_hfil \_fi #1\_unsskip
-}
+\_def\_fS{\_long\_def\_partabitemA##1{%
+   \_setbox0=\_vbox{\_noindent ##1\_endgraf \_ea}\_ifnum\_prevgraf=1 \_hfil \_fi ##1%
+}}
 \_public \fL \fR \fC \fX \fS ;
 
    \_doc -----------------------------
@@ -469,14 +514,14 @@
 and the resting space to given `\hsize` is filled by the `p` column.
 
 You can declare more than one `p{<coefficient>\tsize}` columns in the table
-when `pxto` keyword is used. The total sum of <coefficinets> must be exactly one.
-For example,
+when `pxto` keyword is used.
 
 \begtt \catcode`\<=13
-\table pxto13cm {r p{.3\tsize} p{.5\tsize} p{.2\tsize} l}{<data>}
+\table pxto13cm {r p{3.5\tsize} p{2\tsize} p{\tsize} l}{<data>}
 \endtt
 %
-This gives the ratio of widths of individual paragraphs in the table.
+This gives the ratio of widths of individual paragraphs in the table
+3.5\,:\,2\,:\,1.
 
 \secc `\eqbox`: boxes with equal width across the whole document
 
@@ -512,6 +557,9 @@
 
 \_endinput
 
+2021-06-03 \fS corrected, re-implemented.
+2021-06-02 \table in \table allowed, bug fixed.
+2021-06-01 pxto: sum of \tsize's allowed different than 1
 2021-04-12 p declarator: \hskip0pt added to allow first word hyphenated
 2021-03-09 \_tablepxpreset introduced
 2021-02-15 \_expandafter -> \_ea

Modified: trunk/Master/texmf-dist/tex/optex/base/usebib.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/base/usebib.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/base/usebib.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -1,6 +1,6 @@
 %% This is part of the OpTeX project, see http://petr.olsak.net/optex
 
-\_codedecl \MakeReference {Reading bib databases <2021-04-13>} % loaded on demand by \usebib
+\_codedecl \MakeReference {Reading bib databases <2021-04-30>} % loaded on demand by \usebib
 
    \_doc -----------------------------
    Loading the `librarian.tex` macro package. See `texdoc librarian`
@@ -17,7 +17,7 @@
 \_let\newwrite=\_newwrite
 
 \_private \BibFile \ReadList \SortList \SortingOrder \NameCount \AbbreviateFirstname
-   \CreateField \RetrieveFieldInFor \RetrieveFieldIn ;
+   \CreateField \RetrieveFieldInFor \RetrieveFieldIn \RetrieveField ;
 
    \_doc -----------------------------
    The `\usebib` command.
@@ -367,6 +367,7 @@
 
 History:
 --------
+2021-04-30  \RetrieveField declared as private, bug fixed.
 2021-04-13  \bibpart implemented
 2021-04-13  \_bibgl introduced (used by \slides)
 2021-03-12  \_citelistB added before first test.

Modified: trunk/Master/texmf-dist/tex/optex/pkg/emoji.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/pkg/emoji.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/pkg/emoji.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -6,10 +6,10 @@
 % The \emoji{<name>} command is available, see texdoc emoji (from
 % corresponding LaTeX package).
 
+\_codedecl \emoji {Emotikons from the TwemojiMozilla.ttf font}
+
 \_namespace{emoji}
 
-\_codedecl \.emoji {Emotikons from the TwemojiMozilla.ttf font}
-
    \_doc -----------------------------
    Font TwemojiMozilla.ttf is loaded. The font feature +colr is needed.
    The `\emojifont` is implemented using `\_resizethefont` as size-dependent.

Added: trunk/Master/texmf-dist/tex/optex/pkg/mte.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/pkg/mte.opm	                        (rev 0)
+++ trunk/Master/texmf-dist/tex/optex/pkg/mte.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -0,0 +1,685 @@
+% This is macro package used by OpTeX, see http://petr.olsak.net/optex
+% mte.opm, Petr Olšák <petr at olsak.net>, 2021
+% See end of the file for more information
+
+\_codedecl \enablemte {MicroTypographic Extension <2021-05-23>}
+\_namespace{mte}
+
+    \_doc -------------------
+    First, we define default protrusion values. They are
+    saved in the macros
+    \^`\.AlphabetPR`, \^`\.alphabetPR`, \^`\.digitsPR`, \^`\.punctPR`,
+    \^`\.quotPR`, \^`\.othersPR`
+    for regular and bold fonts. The analogous macros
+    \^`\.AlphabetPI`, \^`\.alphabetPI`, \^`\.digitsPI`, \^`\.punctPI`,
+    \^`\.quotPI`, \^`\.othersPI` store data
+    for italic and bold italic fonts.
+    We are using long names of these macros (without the dot shortcut in the
+    code) because user can copy these macros to his/her macro file and do modifications.
+    \nl
+    User (or a font family file) can define other values, for example by
+    `\def\_mte_quotPR{...}`. If such definition is done before
+    loading this package, it has precedence. This is the reason why we are
+    using \`\.trydef` which defines given macro only if it is not defined
+    already.
+    \_cod -------------------
+
+\_def\.trydef #1{\_ifx#1\_undefined \_afterfi{\_def#1}\_else \_ea\_ignoreit \_fi}
+
+    \_doc
+    We want to save size of the following macros with data tables, so we don't write
+    `[<code of char>] =` but only \`\_mte`~`<char> =`. We use \OpTeX/ name space for
+    \^`\_mte` (no package name space) because user may copy these macros to
+    other macro files and modify them. We hope that the name \^`\_mte` will
+    be never used in another meaning in \OpTeX/.
+    \_cod
+
+\_def\_mte #1{[\_immediateassignment\_tmpnum=`#1 \_the\_tmpnum]}
+
+   \_doc --------------------
+   The protrusion data follow.
+   The values are coefficients of total width of declared character.
+   First value gives left protrusion, second value is right protrusion.
+   \`\.AlphabetPR`
+   \_cod --------------------
+
+\.trydef \_mte_AlphabetPR {% Alphabets, Protrusion, Regular fonts
+   \_mte  A = {.05,.05},
+   \_mte  Æ = {.05,  0},
+   \_mte  F = {0  ,.05},
+   \_mte  J = {.05,  0},
+   \_mte  K = {0  ,.05},
+   \_mte  L = {0  ,.05},
+   \_mte  T = {.05,.05},
+   \_mte  V = {.05,.05},
+   \_mte  W = {.05,.05},
+   \_mte  X = {.05,.05},
+   \_mte  Y = {.05,.05},
+}
+   \_doc
+   \`\.alphabetPR`
+   \_cod
+
+\.trydef \_mte_alphabetPR {% alphabets, Protrusion, Regular fonts
+   \_mte  k = {0  ,.05},
+   \_mte  r = {0  ,.05},
+   \_mte  t = {0  ,.07},
+   \_mte  v = {.05,.05},
+   \_mte  w = {.05,.05},
+   \_mte  x = {.05,.05},
+   \_mte  y = {.05,.07},
+}
+   \_doc
+   \`\.digitsPR`
+   \_cod
+
+\.trydef \_mte_digitsPR {% digits, Protrusion, Regular fonts
+   \_mte  0 = {0  ,.05},
+   \_mte  1 = {.1 ,.2 },
+   \_mte  2 = {.05,.05},
+   \_mte  3 = {.05,.05},
+   \_mte  4 = {.07,.07},
+   \_mte  5 = {0  ,.05},
+   \_mte  6 = {0  ,.05},
+   \_mte  7 = {.05,.1 },
+   \_mte  8 = {0  ,.05},
+   \_mte  9 = {0  ,.05},
+   [0xF731] = {.1, .1},   % /one.oldstyle
+   [0xF732] = {.05, .05}, % /two.oldstyle
+   [0xF733] = {.03, .08}, % /three.oldstyle
+   [0xF734] = {.05, .05}, % /four.oldstyle
+   [0xF737] = {.05, .08}, % /seven.oldstyle
+}
+   \_doc
+   \`\.punctPR`
+   \_cod
+
+\.trydef \_mte_punctPR {% punctuations, Protrusion, Regular fonts
+   \_mte  . = {0 , .7},
+   \_mte  , = {0 , .5},
+   \_mte  : = {0 , .5},
+   \_mte  ; = {0 , .5},
+   \_mte  ! = {0 , .1},
+   \_mte  ? = {0 , .2},
+   \_mte  @ = {.05,.05},
+   \_mte  ~ = {.2, .25},
+   \_mte \% = {.05,.05}, % /percent
+   \_mte  * = {.3, .3},
+   \_mte  + = {.25,.25},
+   \_mte  - = {.4, .5},   % /hyphen
+   \_mte  – = {.4, .3},   % /endash
+   \_mte  — = {.3, .2},   % /emdash
+   \_mte  _ = {.2, .2},   % /underscore
+   \_mte  / = {.2, .3},
+   \_mte \\ = {.2, .3},  % /backslash
+   \_mte  ¡ = {.1, 0}, \_mte  ¿ = {.1, 0},
+}
+   \_doc
+   \`\.quotPR`
+   \_cod
+
+\.trydef \_mte_quotPR {% quotation marks, Protrusion, Regular fonts
+   \_mte  ' = {.3,.4},   % /quotesingle
+   \_mte  ‘ = {.5,.7}, \_mte  ’ = {.5,.6},
+   \_mte  “ = {.5,.3}, \_mte  ” = {.2,.6},
+   \_mte  ‚ = {.4,.4}, \_mte  „ = {.4,.4},
+   \_mte  ‹ = {.4,.4}, \_mte  › = {.3,.5},
+   \_mte  « = {.3,.2}, \_mte  » = {.1,.4},
+}
+   \_doc
+   \`\.othersPR`
+   \_cod
+
+\.trydef \_mte_othersPR {% other characters, Protrusion, Regular fonts
+   \_mte  ( = {.3, 0},  \_mte  ) = {0 ,.3},
+   \_mte  < = {.2, .1}, \_mte  > = {.1, .2},
+   \_mte \{ = {.4, .2}, \_mte \} = {.2, .4}, % /braceleft, /braceright
+   [0x2329] = {.4,  0}, [0x232A] = {0 ,.4},  % /angleleft, /angleright
+   \_mte  † = {.1,.1},
+   \_mte  ‡ = {.08, .08},
+   \_mte  • = {.2, .2},
+   \_mte  · = {.4, .45}, % /periodcentered
+   \_mte  ℃ = {.08, .05},
+   \_mte  ₡ = {0 , .05},
+   \_mte  ° = {.4, .4},
+   [0x2122] = {.1, .2}, % /trademark
+   \_mte  © = {.1, .1},
+   \_mte  ® = {.1, .1},
+   \_mte  ª = {.1, .2},
+   \_mte  º = {.1, .2},
+   \_mte  ¹ = {.2, .25},
+   \_mte  ² = {.05, .1},
+   \_mte  ³ = {.05, .1},
+   \_mte  ¬ = {.2,   0},
+   \_mte  − = {.3, .3},
+   \_mte  ± = {.15, .2},
+   \_mte  × = {.15, .25},
+   \_mte  ÷ = {.15, .25},
+   \_mte  € = {.1,   0},
+   \_mte  Γ = {0   ,.180}, % /Gamma
+   \_mte  Δ = {.1, .1},    % /Delta
+   \_mte  Θ = {.05, .05},  % /Theta
+   \_mte  Λ = {.1,.1},     % /Lambda
+   \_mte  Σ = {.05, .05},  % /Sigma
+   \_mte  Υ = {.1,.1},     % /Upsilon
+   \_mte  Φ = {.05, .05},  % /Phi
+   \_mte  Ψ = {.05, .05},  % /Psi
+}
+
+   \_doc
+   The protrusion data for italic and bold italic fonts follow.
+   \`\.AlphabetPI`
+   \_cod
+
+\.trydef \_mte_AlphabetPI {% Alphabets, Protrusion, Italic fonts
+   \_mte  A = {.125,.1},
+   \_mte  Æ = {.125,-.055},
+   \_mte  B = {.09,-.04},
+   \_mte  C = {.145,-.075},
+   \_mte  D = {.075,-.028},
+   \_mte  E = {.08,-.055},
+   \_mte  F = {.085,-.08},
+   \_mte  G = {.153,-.015},
+   \_mte  H = {.073,-.06},
+   \_mte  I = {.14,-.12},
+   [0x0132] = {.14,-.08}, % IJ
+   \_mte  J = {.135,-.08},
+   \_mte  K = {.07,-.03},
+   \_mte  L = {.087,.04},
+   \_mte  M = {.067,-.045},
+   \_mte  N = {.075,-.055},
+   \_mte  O = {.15,-.03},
+   \_mte  Œ = {.15,-.055},
+   \_mte  P = {.082,-.05},
+   \_mte  Q = {.15,-.03},
+   \_mte  R = {.075, .015},
+   \_mte  S = {.09,-.065},
+   \_mte  $ = {.1,-.02}, % $
+   \_mte  T = {.22,-.085},
+   \_mte  U = {.23,-.055},
+   \_mte  V = {.26,-.06},
+   \_mte  W = {.185,-.055},
+   \_mte  X = {.07,-.03},
+   \_mte  Y = {.25,-.06},
+   \_mte  Z = {.09,-.06},
+}
+   \_doc
+   \`\.alphabetPI`
+   \_cod
+
+\.trydef \_mte_alphabetPI {% alphabets, Protrusion, Italic fonts
+   \_mte  a = {.15,-.01},
+   \_mte  b = {.17, 0},
+   \_mte  c = {.173,-.01},
+   \_mte  d = {.15,-.055},
+   \_mte  e = {.18, 0},
+   \_mte  f = {0  ,-.25},
+   \_mte  g = {.15,-.01},
+   \_mte  h = {.1,  0},
+   \_mte  i = {.21, 0},
+   [0x17C9] = {.21,-.04}, % ij
+   \_mte  j = {0  ,-.04},
+   \_mte  k = {.11,-.05},
+   \_mte  l = {.24,-.11},
+   \_mte  m = {.08, 0},
+   \_mte  n = {.115, 0},
+   \_mte  o = {.155, 0},
+   \_mte  q = {.17,-.04},
+   \_mte  r = {.155,-.04},
+   \_mte  s = {.13, 0},
+   \_mte  t = {.23,-.01},
+   \_mte  u = {.12, 0},
+   \_mte  v = {.14,-.025},
+   \_mte  w = {.098,-.02},
+   \_mte  x = {.065,-.04},
+   \_mte  y = {.13,-.02},
+   \_mte  z = {.110,-.08},
+}
+   \_doc
+   \`\.digitsPI`
+   \_cod
+
+\.trydef \_mte_digitsPI {% digits, Protrusion, Italic fonts
+   \_mte  0 = {.17,-.085},
+   \_mte  1 = {.23,.11},
+   \_mte  2 = {.13,-.07},
+   \_mte  3 = {.14,-.07},
+   \_mte  4 = {.13,.08},
+   \_mte  5 = {.16, 0},
+   \_mte  6 = {.175,-.03},
+   \_mte  7 = {.25,-.15},
+   \_mte  8 = {.13,-.04},
+   \_mte  9 = {.155,-.08},
+   [0xF730] = {.05,.05}, % /zero.oldstyle
+   [0xF731] = {.1, .1},  % /one.oldstyle
+   [0xF732] = {.1,.08},  % /two.oldstyle
+   [0xF733] = {.08,.05}, % /three.oldstyle
+   [0xF734] = {.08,.08}, % /four.oldstyle
+   [0xF735] = {.05,  0}, % /five.oldstyle
+   [0xF736] = {.05,  0}, % /six.oldstyle
+   [0xF737] = {.08,.08}, % /seven.oldstyle
+   [0xF738] = {.05,  0}, % /eight.oldstyle
+   [0xF739] = {0  ,.05}, % /nine.oldstyle
+}
+   \_doc
+   \`\.punctPI`
+   \_cod
+
+\.trydef \_mte_punctPI {% punctuations, Protrusion, Italic fonts
+   \_mte  . = {0 ,.5},
+   \_mte  , = {0 ,.45},
+   \_mte  : = {0 ,.3},
+   \_mte  ; = {0 ,.3},
+   \_mte  & = {.13,.03},
+   \_mte \% = {.18,.05},
+   \_mte  * = {.38,.02},
+   \_mte  + = {.18,.2},
+   \_mte  @ = {.18,.01},
+   \_mte  ~ = {.2,.15},
+   \_mte  ( = {.3, 0},   \_mte ) = {0  ,.07},
+   \_mte  / = {.1,.1},
+   \_mte  - = {.5,.3}, % /hyphen
+   \_mte  – = {.5,.3}, % /endash
+   \_mte  — = {.4,.17}, % /emdash
+   \_mte  _ = {.1,.2}, % /underscore
+   \_mte  ¡ = {.2,  0},  \_mte ¿ = {.2,  0},
+}
+   \_doc
+   \`\.quotPI`
+   \_cod
+
+\.trydef \_mte_quotPI {% quotation marks, Protrusion, Italic fonts
+   \_mte  ' = {.3,.4}, % /quotesingle
+   \_mte  " = {.5,.3},
+   \_mte  ‘ = {.8,.2},  \_mte  ’ = {.8,-.02},
+   \_mte  “ = {.54,.1}, \_mte  ” = {.5,.1},
+   \_mte  ‚ = {.3,.7},  \_mte  „ = {.2,.6},
+   \_mte  ‹ = {.5,.3},  \_mte  › = {.4,.4},
+   \_mte  « = {.4,.1},  \_mte  » = {.2,.3},
+}
+   \_doc
+   \`\.othersPI`
+   \_cod
+
+\.trydef \_mte_othersPI {% other characters, Protrusion, Italic fonts
+   \_mte  < = {.3,.1},  \_mte > = {200,100},
+   \_mte \\ = {.3,.3},
+   \_mte \{ = {.4,.1},  \_mte \}  = {200,200},
+   \_mte  † = {.2,.08},
+   \_mte  ‡ = {.12,.08},
+   \_mte  • = {.22,.1},
+   \_mte  · = {.55,.3}, % /periodcentered
+   \_mte  ℃ = {.17, 0},
+   \_mte  ₡ = {.1,.05},
+   \_mte  ¶ = {.2, 0},
+   \_mte  ° = {.5,.3},
+   [0x2122] = {.2,.07}, % /trademark
+   \_mte  © = {.05,.07},
+   \_mte  ® = {.05,.07},
+   \_mte  ª = {.14,.1},
+   \_mte  º = {.14,.1},
+   \_mte  ¹ = {.40,.15},
+   \_mte  ² = {.25,.08},
+   \_mte  ³ = {.25,.08},
+   \_mte  ¬ = {.25,.08},
+   \_mte  − = {.3,.2},
+   \_mte  ± = {.15,.17},
+   \_mte  × = {.2,.2},
+   \_mte  ÷ = {.2,.2},
+   \_mte  € = {.15, 0},
+   \_mte  Γ = {.1,.12}, % /Gamma
+   \_mte  Δ = {.12,.1}, % /Delta
+   \_mte  Θ = {.12,.05}, % /Theta
+   \_mte  Λ = {.13,.1}, % /Lambda
+   \_mte  Ξ = {.1, 0}, % /Xi
+   \_mte  Π = {.1, 0}, % /Pi
+   \_mte  Σ = {.1,.05}, % /Sigma
+   \_mte  Υ = {.18,.1}, % /Upsilon
+   \_mte  Φ = {.13,.07}, % /Phi
+   \_mte  Ψ = {.13,.05}, % /Psi
+   \_mte  Ω = {.05, 0}, % /Omega
+}
+
+   \_doc --------------------
+   The expansion data follow in macros \^`\.AlphabetX`, \^`\.alphabetX`, \^`\.digitsX`
+   and \^`\.othersX`.
+   They are common for all fonts. \`\.AlphabetX`
+   \_cod --------------------
+
+\.trydef \_mte_AlphabetX {% Alphabets, eXpansion
+   \_mte  A = .5,
+   \_mte  Æ = .5,
+   \_mte  B = .7,
+   \_mte  C = .7,
+   \_mte  D = .5,
+   \_mte  E = .7,
+   \_mte  F = .7,
+   \_mte  G = .5,
+   \_mte  H = .7,
+   \_mte  K = .7,
+   \_mte  M = .7,
+   \_mte  N = .7,
+   \_mte  O = .5,
+   \_mte  Œ = .5,
+   \_mte  P = .7,
+   \_mte  Q = .5,
+   \_mte  R = .7,
+   \_mte  S = .7,
+   \_mte  U = .7,
+   \_mte  W = .7,
+   \_mte  Z = .7,
+}
+   \_doc
+   \`\.alphabetX`
+   \_cod
+
+\.trydef \_mte_alphabetX {% alphabets, eXpansion
+   \_mte  a = .7,
+   \_mte  æ = .7,
+   \_mte  b = .7,
+   \_mte  c = .7,
+   \_mte  d = .7,
+   \_mte  e = .7,
+   \_mte  g = .7,
+   \_mte  h = .7,
+   \_mte  k = .7,
+   \_mte  m = .7,
+   \_mte  n = .7,
+   \_mte  o = .7,
+   \_mte  œ = .7,
+   \_mte  p = .7,
+   \_mte  q = .7,
+   \_mte  s = .7,
+   \_mte  u = .7,
+   \_mte  w = .7,
+   \_mte  z = .7,
+}
+   \_doc
+   \`\.digitsX`
+   \_cod
+
+\.trydef \_mte_digitsX {% digits, eXpansion
+   \_mte  2 = .7,
+   \_mte  3 = .7,
+   \_mte  6 = .7,
+   \_mte  8 = .7,
+   \_mte  9 = .7,
+}
+   \_doc
+   \`\.othersX`
+   \_cod
+
+\.trydef \_mte_othersX {% others, eXpansion
+}
+
+   \_doc --------------------
+   The \`\_mte_P` (for protrusion, all fonts) and \`\_mte_X`
+   (for expansion, all fonts) are empty by default but user can
+   declare specific values here. These macros are used last in the
+   \`\.allPR`, \`\.allPI`, \`\.allX` macros
+   (used in the lua code bellow), so it has general precedence.
+   \_cod --------------------
+
+\.trydef \_mte_P {} % user specific, Protrusion
+\.trydef \_mte_X {} % user specific, eXpansion
+
+\_def \.allPR {\.AlphabetPR \.alphabetPR \.digitsPR \.punctPR \.quotPR \.othersPR \.P}
+\_def \.allPI {\.AlphabetPI \.alphabetPI \.digitsPI \.punctPI \.quotPI \.othersPI \.P}
+\_def \.allX  {\.AlphabetX  \.alphabetX  \.digitsX  \.othersX \.X}
+
+   \_doc --------------------
+   We add a new macro \`\.features` to the \OpTeX/'s
+   \olink[fontfeatures]\_fontfeatures. It is empty by
+   default but it will be changed by `\enablemte` to read protrusion and
+   expansion data using Lua code.
+   \_cod --------------------
+
+\_addto\_fontfeatures{\.features}
+\_def\.features{}
+
+   \_doc --------------------
+   \`\enablemte` initializes protrusion data by the \^`\.initprotrusion` macro
+   and expansion data by the \^`\.initexpansion` macro. Then it sets
+   \elink[pdfprotrudechars]{\protrudechars} and \elink[pdfadjustspacing]{\adjustspacing}
+   primitives and sets the \^`\.features` macro to use
+   the protrusion tables `pr` (for regular or bold fonts) or `pi` (for italic
+   or bold italic fonts). The table `ex` is used for expansion data.
+   These tables are declared in the Lua code below.
+   \nl
+   \`\disablemte` disables font \^`\.features` and sets appropriate primitive
+   registers to zero.
+   \_cod --------------------
+
+\_def\.enablemte {%
+   \_initunifonts
+   \.initprotrusion  % luacode, pr and pi tables initialized
+   \.initexpansion   % luacode, ex table initialized
+   \_protrudechars=2
+   \_adjustspacing=2
+   \_def\.features{protrusion=p\.var;expansion=ex}% pr/pi and ex tables used
+   \_reloading \_currvar
+}
+\_def\.disablemte {%
+   \_protrudechars=0
+   \_adjustspacing=0
+   \_def\.features{}%
+   \_reloading \_currvar
+}
+\_nspublic \enablemte \disablemte ;
+
+   \_doc --------------------
+   The \`\.var` macro expands ro `r` when regular or bold font is loaded
+   and it expands to `i` if italic or bold italic font is loaded.
+   The `pr` or `pi` data table is selected using this macro.
+   \_cod --------------------
+
+\_def\.it{it}\_def\.bi{bi}
+\_def\.var{\_ifx\_whatresize\.it i\_else \_ifx\_whatresize\.bi i\_else r\_fi\_fi}
+
+   \_doc -------------------
+   The `pr` and `pi` data tables are created using lua code in
+   the \`\.initprotrusion` macro. The data from \^`\.allPR` or \^`\.allPI`
+   are used here.
+   The analogical concept is used in the \`\.initexpansion` macro.
+   \_cod -------------------
+
+\_def\.initprotrusion {%
+   \_directlua {%
+      fonts.protrusions.setups['pr']={
+         factor=\.fpfactor,
+         \.leftright,
+         \.allPR
+      }
+      fonts.protrusions.setups['pi']={
+         factor=\.fpfactor,
+         \.leftright,
+         \.allPI
+}}}
+\_def\.initexpansion {%
+   \_directlua {%
+      fonts.expansions.setups['ex']={
+         \.stretchshrinkstep,
+         factor=\.fxfactor,
+         \.allX
+}}}
+
+   \_doc --------------------
+   The \`\.leftright`, \`\.stretchshrinkstep`,  \`\.fpfactor`, and \`\.fxfactor`
+   macros are used in the Lua code above and they have following default values
+   (you can re-define them, if you want):
+   \_cod --------------------
+
+\_def \.fpfactor{1}
+\_def \.leftright {left=1, right=1}
+\_def \.fxfactor{1}
+\_def \.stretchshrinkstep {stretch=3, shrink=2, step=.5}
+
+   \_doc --------------------
+   \`\setfpfactor` and \`\setfxfactor` simply define \^`\.fpfactor` and \^`\.fxfactor`.
+   \_cod --------------------
+
+\_def\.setfpfactor #1 {\_def\.fpfactor{#1}}
+\_def\.setfxfactor #1 {\_def\.fxfactor{#1}}
+\_nspublic \setfpfactor \setfxfactor ;
+
+   \_doc --------------------
+   There are similar letters: A, Á, Á, Â, Ã, Ä, Å, they need the same setting.
+   But only the basic letter (A in this example) has protrusion and/or expansion
+   setting using Lua code. The equivalent settings are done by the macro
+   \`\.setequivs``<font-switch>`.
+   This macro is used in \olink[_newfontloaded]{\_newfontloaded} `<font-switch>`
+   which is called by \OpTeX/ if the font is loaded first.
+   The \^`\.setequivs` macro uses data from \^`\.equalcodes` (see bellow)
+   and sets equal
+   \elink[lpcode]{\lpcode}, \elink[rpcode]{\rpcode}, and \elink[efcode]{\efcode}
+   for variant characters.
+   It is called only if \^`\.features` is non-empty, i.e.\ if the font
+   includes mte data.
+   \_cod --------------------
+
+\_def\_newfontloaded#1{\_ifx\.features\_empty \_else \.setequivs#1\_fi}
+
+\_def\.setequivs #1{\_let\.f=#1\_ea\.setequivsA\.equalcodes,,={},}
+\_def\.setequivsA#1#2=#3#4,{\_ifx^#3^\_else
+   \_afterfi{\_tmpnum=`#1 \.setequivsB#3#4\_end\.setequivsA}\_fi}
+\_def\.setequivsB#1{\_ifx\_end#1\_else
+   \_lpcode\.f`#1=\_lpcode\.f\_tmpnum
+   \_rpcode\.f`#1=\_rpcode\.f\_tmpnum
+   \_efcode\.f`#1=\_efcode\.f\_tmpnum
+   \_ea\.setequivsB\_fi
+}
+
+   \_doc --------------------
+   \`\.equalcodes` includes comma separated equivalences. The same
+   \elink[lpcode]{\lpcode}, \elink[rpcode]{\rpcode}, and \elink[efcode]{\efcode}
+   for all characters
+   given at right side is set as these codes of the character given
+   at the left side of equal sign.
+   You can do `\addto\_mte_equalcodes{<your additional settings>}`
+   if you want.
+   \_cod --------------------
+
+\_def\.equalcodes {%
+   A = ÀÁÂÃÄÅĀĂĄǺȀẠẢẤẦẨẪẬẮẰẲẶΑ,
+   B = ฿Β,
+   C = ÇĆĈĊČ,
+   D = ÐĎĐḌḎ,
+   E = ÈÉÊËĒĔĖĘĚȄẸẺẼỀẾỄỂỆΕ,
+   G = ĜĞĠĢǦǴ,
+   H = ĤĦḤḦḪΗ,
+   I = ÌÍÎÏĨĪĬĮİȈỈỊΙ,
+   J = Ĵ,
+   K = ĶΚ,
+   L = ĹĽĻŁḶ,
+   M = Μ,
+   N = ÑŃŅŇṄṆΝ,
+   O = ÒÓÔÕÖØŌŎŐỌƠǪǾȌỎỐỒỔỖỘỚỜỠỞỢΟ,
+   P = Ρ,
+   R = ŔŖŘȐṚṘṜ,
+   S = ŚŜŞŠȘṢ,
+   T = ŢŤȚṬṮΤ,
+   U = ÙÚÛÜŨŪŬŮŰŲƯȔỤỦỨỪỬỮỰ,
+   W = ŴẀẂẄ,
+   X = Χ,
+   Y = ÝŶŸỴỶỸ,
+   Z = ŹŻŽẒΖ,
+   a = àáâãäåāăąǻȁạảấầẩẫậắằẳẵ,
+   æ = ǽ,
+   c = çćĉċč,
+   d = đḍḏ, % ď has different right side
+   e = èéêëēĕėęěȅẹẻẽếềểễệ,
+   g = ĝğġģǧǵ,
+   h = ĥħḥḧḫ,
+   i = ìíîïĩīĭįıȉỉị,
+   j = ĵ,
+   k = ķ,
+   l = ĺļłḷḹ, % ľ has different right side
+   n = ñńņňṅṇ,
+   o = òóôõöøōŏőọơǫǿȍỏốồổỗộớờỡởợ,
+   r = ŕŗřȑṛṙṝ,
+   s = śŝşšșṣ,
+   t = ţțṭṯẗť,
+   u = ùúûüũūŭůűųưȕụủứừửữự,
+   w = ŵẁẃẅ,
+   y = ýŷÿỳỵỷỹ,
+   z = źżžẓ,
+}
+\_endnamespace
+\_endcode
+
+\tit MicroTypographic Extensions for \OpTeX/
+
+\centerline{\it Petr Olšák, 2021}
+\bigskip
+
+You can do `\load[mte]` followed by \^`\enablemte`. The microtypographic
+extensions (protrusions, expansions) of all fonts are available after
+\^`\enablemte`. The \LaTeX/ package Microtype does similar effect.
+
+The \^`\enablemte` macro reloads the current font with microtypographic
+extensions (mte) enabled and all new fonts loaded by the Font Selection System have
+mte enabled too, because they are added to the
+\olink[_fontfeatures]{\_fontfeatures} macro used by \OpTeX/.
+
+The \^`\enablemte` macro does only local settings. If it is used in a group then
+only fonts used in this group have mte.
+
+The \^`\enablemte` macro sets (among other things)
+\elink[pdfprotrudechars]{\protrudechars}`=2` (protrusion is enabled) and
+\elink[pdfadjustspacing]{\adjustspacing}`=2` (font expansion is enabled).
+You can disable these features by setting these primitive registers to zero
+value (it is default if \^`\enablemte` is not used).
+Note, that the values of these registers are checked when
+paragraph is finalized although the fonts were loaded with mte enabled.
+It means that you have to use `\par` before end of group
+if you use \^`\enablemte` inside a group.
+For example:
+
+\begtt
+{\enablemte
+  Roman font with mte enabled, \it italic font with mte enabled.
+  \par % mte features are used
+}
+\endtt
+%
+Or, simply use \^`\enablemte` at beginning of your document.
+
+On the other hand, you can use \^`\disablemte` macro which reloads current
+font with mte disabled and all newly loaded fonts have
+mte disabled too. The macro has local validity. For example,
+`{\disablemte text}` prints `text` by a font with
+mte disabled. It works locally in the middle of the paragraph (unlike setting
+`\protrudechars` and `\adjustspacing` to zero).
+
+You can define your own protrusion or expansion values: copy macros
+`\_mte_AlphabetPR`, `\_mte_quotPR`, etc.\ from this package and define them
+as you wish using `\def`. Such definition has precedence.
+Similar definitions can be in some font family files too, so: do your
+definition after all `\fontfam` if you want to keep the precedence.
+All such definitions must be performed before the `\mteinit` command.
+
+You can use `\def\_mte_P` for data of protrusion for all fonts
+which has general precedence. For example, if you want to protrude hyphen
+char with factor one at the right side and by factor 0.5 at the left side, use
+\begtt
+\def\_mte_P {% user specification, Protrusion, Regular fonts
+ \_mte - = {.5, 1},  % /hyphen
+}
+\endtt
+Analogical macro can be used for expansion data `\_mte_X`.
+
+You can use \^`\setfpfactor` `<factor><space>` to set the factor by which
+all protrusion data are scaled. The <factor> is decimal number and its default
+value is~1. This macro can be used before \^`\enablemte`.
+You can use \^`\setfxfactor` `<factor><space>` with analogical meaning,
+expansion data are scaled by given~<factor>.
+
+If you feel that default microtypographic data are wrong in a particular case,
+please let me know. I can correct it in this package. If you feel
+that a specific font family needs different microtypographic data, please
+let me know. I can add extra definitions to appropriate font family
+file.
+
+\_endinput
+
+Use "optex mte-doc.tex" (twice) to generate documentation from this file.


Property changes on: trunk/Master/texmf-dist/tex/optex/pkg/mte.opm
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Modified: trunk/Master/texmf-dist/tex/optex/pkg/vlna.opm
===================================================================
--- trunk/Master/texmf-dist/tex/optex/pkg/vlna.opm	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/texmf-dist/tex/optex/pkg/vlna.opm	2021-06-03 20:53:13 UTC (rev 59458)
@@ -10,10 +10,10 @@
 % vlna.opm is based on Lua code from the package `luavlna` (by Michal Hoftich
 % and Miro Hrončok). See `texdoc luavlna` or end of this file for more information.
 
+\_codedecl \singlechars {Preventing single-chars prepositions and more <2021-01-08>}
+
 \_namespace{vlna}
 
-\_codedecl \.singlechars {Preventing single-chars prepositions and more <2021-01-08>}
-
    \_doc -----------------------------
    We declare new attribute, register callbacks, and define Lua functions that
    point to Lua functions from `luavlna.lua` package.

Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds	2021-06-03 20:50:26 UTC (rev 59457)
+++ trunk/Master/tlpkg/libexec/ctan2tds	2021-06-03 20:53:13 UTC (rev 59458)
@@ -6875,10 +6875,10 @@
   &SYSTEM ("$MV images $DEST/tex/latex/$package");
 }
 
-sub POSToptex { # its own formats, so directly under tex/ and doc/
+sub POSToptex { # its own format, so under {tex,doc}/base
   print "POST$package - mv base demo pkg doc subdirs\n";
   &mv_with_mkdir ("base", "demo", "pkg", "$DEST/tex/$package");
-  &mv_with_mkdir ("README", "doc/*", "$DEST/doc/$package");
+  &mv_with_mkdir ("README", "doc/*", "$DEST/doc/$package/base");
 }
 
 sub POSTpas_vc {



More information about the tex-live-commits mailing list.