summaryrefslogtreecommitdiff
path: root/macros/luatex/optex/base/f-heros.opm
diff options
context:
space:
mode:
Diffstat (limited to 'macros/luatex/optex/base/f-heros.opm')
-rw-r--r--macros/luatex/optex/base/f-heros.opm124
1 files changed, 76 insertions, 48 deletions
diff --git a/macros/luatex/optex/base/f-heros.opm b/macros/luatex/optex/base/f-heros.opm
index d369ec8936..3a4518e1c3 100644
--- a/macros/luatex/optex/base/f-heros.opm
+++ b/macros/luatex/optex/base/f-heros.opm
@@ -44,25 +44,25 @@ If you want to write such font file, you need to keep following rules.
existence of `<font-for-testing>` in your system. If it doesn't exist, the
file loading is skipped with a warning on the terminal.
The \^`\_ifexistfam` macro returns false in such case.
- The `\_fontnamegen` macro must be defined in the last parameter of the
- `\_famdecl`. More about it is documented below.
-* You can use `\_wlog{\_detokenize{...` to write aditional information into
+ The \^`\_fontnamegen` macro must be defined in the last parameter of the
+ \^`\_famdecl`. More about it is documented below.
+* You can use `\_wlog{\_detokenize{...` to write additional information into
log file.
-* You can declare optical sizes using `\_regoptsizes` if there are more font files
- with different optical sizes (like in Latin Modern). See `f-lmfonts.ofm`
+* You can declare optical sizes using \~`\_regoptsizes` if there are more font files
+ with different optical sizes (like in Latin Modern). See `f-lmfonts.opm`
file for more information about this special feature.
-* Declare font modifiers using `\_moddef` if they are present. The \`\resetmod`
+* Declare font modifiers using \~`\moddef` if they are present. The \`\resetmod`
must be declared in each font family.
* Check if all your declared modifiers does not produce any space in
horizontal mode. For example check: `X\caps Y`, the letters `XY` must
be printed without any space.
* Optionally, declare new variants by the \^`\famvardef` macro.
-* Run `\_initfontfamily` in order to start the family.
+* Run `\_initfontfamily` in order to start the family (it is mandatory).
* If math font should be loaded, use `\_loadmath{<math font>}`.
\enditems
{\noindent \bf The \`\_fontnamegen` macro}
-(declared in the last parameter of the `\_famdecl`)
+(declared in the last parameter of the \^`\_famdecl`)
must expand (at expand processor level only) to a file name of loaded font (or to its font
name) and to optional font features appended. The Font Selection
System uses this macro at primitive level in the following sense:
@@ -76,22 +76,22 @@ Note that the extended `\font` syntax
`\font\<selector> {[<font file name>]:<font features>} <size spec.>`
is expected here.
-\bigskip
-{\noindent\bf Example.}
+\seccc Example 1
+
Assume an abstract font family with fonts `xx-Regular.otf`,
`xx-Bold.otf`, `xx-Italic.otf` and `xx-BoldItalic.otf`. Then you can declare
-the `\resetmod` (for initializing the family) by:
+the \^`\resetmod` (for initializing the family) by:
\begtt
\_moddef\resetmod{\_fvars Regular Bold Italic BoldItalic }
\endtt
-and define the `\_fontnamegen` in the last parameter of the `\_famdecl` by:
+and define the \^`\_fontnamegen` in the last parameter of the \^`\_famdecl` by:
\begtt
\_famdecl ...
{\def\_fontnamegen{[xx-\_currV]}}
\endtt
The following auxiliary macros are used here:
\begitems
-* \^`\moddef` declares the family dependent modifier. The `\resetmod` saves
+* \^`\moddef` declares the family dependent modifier. The \^`\resetmod` saves
initial values for the family.
* \^`\_fvars` saves four names to the memory, they are used by the \^`\_currV` macro.
* \^`\_currV` expands to one of the four names dependent on `\rm` or `\bf` or
@@ -102,28 +102,31 @@ Assume that the user needs `\it` variant in this family. Then the
`[xx-Italic]`. The Font Selection System uses `\font {[xx-Italic]}`.
This command loads the `xx-Italic.otf` font file.
-See more advanced examples in `f-<family>.opm` files. The `f-heros.opm` is listed
-here. When Heros family is selected and `\bf` is asked then
-\begtt
-\font {[texgyreheros-bold]:+tlig;} at10pt
-\endtt
-%
+See more advanced examples are in `f-<family>.opm` files.
+
+\seccc Example 2
+
+The `f-heros.opm` is listed here. Look at it.
+When Heros family is selected and `\bf` is asked then
+`\font {[texgyreheros-bold]:+tlig;} at10pt`
is processed.
You can use any expandable macros or expandable primitives in the `\_fontnamegen`
macro. The simple macros in our example with names `\_<word>V` are preferred. They
-expand typically to their content. The macro `\_fsetV <word>=<content>`
+expand typically to their content. The macro \^`\_fsetV` `<word>=<content>`
(terminated by a space) is equivalent to `\def\_<word>V{<content>}` and you
-can use it in font modifiers. You can use the `\_fsetV` macro in more
+can use it in font modifiers. You can use the \^`\_fsetV` macro in more
general form:
\begtt \catcode`\<=13
\_fsetV <word-a>=<value-a>,<word-b>=<value-b> ...etc. terminated by a space
\endtt
%
-with obvious result `\def \_<word-a>V {<value-a>}\def \_<word-b>V {<value-b>}` etc.
+with obvious result `\def\_<word-a>V {<value-a>}\def\_<word-b>V {<value-b>}` etc.
+
+\seccc Example 3
-Example: if both font modifiers `\caps` and `\cond` were applied from the Heros
+If both font modifiers `\caps`, `\cond` were applied in Heros
family, then `\def\_capsV{+smcp;+onum}` and `\def\_condV{cn}` were processed
by these font modifiers. If user needs the `\bf` variant at 11\,pt now then
the
@@ -133,19 +136,28 @@ the
\endtt
%
is processed. We assume that a font file `texgyreheroscn-bold.otf` is present
-in your TeX system.
+in your \TeX/ system.
+
+\seccc The \code{\\_onlyif} macro
-Recommendation: the \^`\_fontfeatures` macro at the end of the `\_fontnamegen`
+has the syntax \^`\_onlyif` `<word>=<value-a>,<value-b>,...<value-n>: {<what>}`. It can
+be used inside `\moddef` as simple IF statement: the `<what>` is processed only
+if `<word>` has `<value-a>` or `<value-b>` \dots or `<value-n>`. See
+`f-roboto.opm` for examples of usage of many `\_onlyif`'s.
+
+Recommendation: use the \^`\_fontfeatures` macro at the end of the `\_fontnamegen`
macro in order to the \^`\setff`, \^`\setfontcolor`, \^`\setletterspace`
macros can work.
-\bigskip
-{\noindent\bf The \^`\moddef` macro}
-does more things than simple `\_def`:
+\seccc The \code{\\moddef} macro
+
+has the syntax \^`\moddef\<modifier>{<what to do>}`. It does more things than simple `\_def`:
\begitems
* The modifier macros are defined as `\_protected`.
* The modifier macros are defined as family-dependent.
+* If the declared control sequence is defined already (and it is not font
+ modifier) then it is re-defined with warning.
\enditems
\noindent
The \^`\famvardef` macro has the same features.
@@ -156,42 +168,58 @@ is defined by the \^`\_famdecl` macro as:
\begtt \catcode`<=13
\protected\def\<Familyselector> {%
\_def\_currfamily {<Familyselector>}%
- \_def\_fontnamegen {<font name or font file name generated>}%
+ \_def\_fontnamegen {...}% this is copied from 7-th parameter of \_famdecl
\resetmod
+ <run all family-dependent font modifiers used before Familyselector without warnings>
\endtt
-{\noindent\bf The font context} consists from
- \begitems
- * Family context, i.\,e.\ \^`\_currfamily` and \^`\_fontnamegen` values
- saved by the `\<Familyselector>`,
- * \^`\_sizespec` value saved by the \^`\setfontsize` macro,
- * whatever what influences the expansion of the `\_fontnamegen` macro,
- they are typically macros `\_<key>V` saved by the font modifiers.
- \enditems
+{\noindent\bf The \^`\_initfontfamily`}\nl
+must be run after modifers decaration.
+It runs the `\<Familyselector>` and it runs `\_rm`,
+so first font from new family is loaded and it is ready to use it.
-{\noindent\bf The \^`\_initfontfamily` must be run} after modifers decaration.
-It sets `\_let\_resetmod=\resetmod` and runs the `\<Familyselector>`.
-Finally, it runs `\_rm`, so first font from new family is loaded and it
-is ready to use it.
+\seccc Name conventions
-\bigskip
-{\noindent\bf Name conventions.}
Create font modifiers, new variants and the `\<Familyselector>` only as public, i.e.
-without `_` prefix. We assume that if user re-defines them then he/she needs
-not them, so we have no problems.
+in user name space without `_` prefix. We assume that if user re-defines them then he/she needs
+not them, so we have no problems. If user's definition done before loading
+font family file is re-defined then \OpTeX/ warns about it. See the end of
+section~\ref[fontcommands].
The name of `\<Familyselector>` should begin with uppercase letter.
+Please, look at
+\ulink[http://petr.olsak.net/ftp/olsak/optex/op-catalog.pdf]{\OpTeX/ font catalogue}
+before you will create your own font family file and use the same names for
+analogical font modifiers (like `\cond`, `\caps`, `\sans`, `\mono` etc.)\
+and for extra variant selectors (like `\lf`, `\li`, `\kf`, `\ki` etc.\ used in
+Roboto font family).
+
+If you are using the same font modifier names to analogical font shapes then
+such modifiers are kept when family is changend. For example:
+
+\begtt
+\fontfam [Termes] \fontfam[Heros]
+\caps\cond\it Caps+Cond italic in Heros \Termes\currvar Caps italic in Termes.
+\endtt
+%
+The family selector first resets all modifiers data by
+\^`\resetmod` and then it tries to run all currently used family-dependent modifiers
+before the family switching (without warnings if such modifier is
+unavailable in the new family).
+In this example, `\Termes` does `\resetmod` followed by `\caps\cond`.
+The `\caps` is applied and `\cond` is silently ignored in Termes family.
+
If you need to declare your private modifier (because it is used in another
modifiers or macros, for example), use the name `\_wordM`. You can be
sure that such name does not influence the private name space used by \OpTeX/.
-\bigskip
-{\noindent\bf Additional notes.}
+\seccc Additional notes
+
See the font family file `f-libertine-s.opm` which is another example where no
font files but font names are used.
-See the font family file `f-lmfonts.opm` where you can find the
+See the font family file `f-lmfonts.opm` or `f-poltawski.opm` where you can find the
the example of the optical sizes declaration including a documentation about
it.