%% This is part of the OpTeX project, see http://petr.olsak.net/optex

\_famdecl [Latin Modern] \LMfonts {TeX Gyre fonts based on Computer Modern}
        {\roman \sans \quotset \ttset \ttprop \ttlight \ttcond \upital
         \dunhill submods:\caps \slant \nbold \bolder} {\rm \bf \it \bi \tt} {LM}
        {[lmroman10-regular]}
        {\_def\_fontnamegen {[\_optname{lm\_subfamV.\_currV}]:\_fontfeatures}}

\_wlog{\_detokenize{%
Modifiers (selects subfamily):^^J
 \modreset .. implicit values (serif, bold extended, nocaps)^^J
 \sans ...... sans serif subfamily^^J
 \quotset ... quotation subfamily^^J
 \ttset ..... typewriter subfamily^^J
 \ttprop .... proportional typewriter-like subfamily^^J
 \ttlight ... light typewriter subfamily^^J
 \ttcond .... condensed typewriter subfamily^^J
 \upital .... upright italic (only \rm)^^J
 \dunhill ... dunhill roman subfamily (only \rm, \it)^^J%
Sub-modifiers (selects special variants of given subfamily):^^J
 \caps ...... caps & small caps (available only at limited shapes)^^J
 \slant ..... slanted (default in some subfamilies)^^J
 \nbold ..... normal bold (extended bold is default)^^J
 \bolder .... extended bold^^J%
Note: Text fonts support optical sizes, but LatinModern-Math only for scripts.^^J
 Use another CM-like family if optical sizes not wanted: \fontfam[NewCM].
}}

\_def\_LMregfont #1 #2 #3{%
   \_edef\_tmp {\_noexpand\_regoptsizes #1 #2 \_ea\_detokenize\_ea{#3}}%
   \_lowercase\_ea{\_tmp}% OTF file names are lowercase
}
\_def \_regoptFS {5 <5.5 6 <6.5 7 <7.5 8 <8.5 9 <9.5 10 <11.1 12 <15 17 <*}
\_def \_regoptFT {5 <5.5 6 <6.5 7 <7.5 8 <8.5 9 <9.5 10 <11.1 12 <*}
\_def \_regoptST {7 <7.5 8 <8.5 9 <9.5 10 <11.1 12 <*}
\_def \_regoptES {8 <8.5 9 <9.5 10 <11.1 12 <15 17 <*}
\_def \_regoptET {8 <8.5 9 <9.5 10 <11.1 12 <*}
\_def \_regoptT  {10 <*}
\_def \_regoptE  {8 <*}

\_LMregfont lmrm.r     LMRoman?-Regular        \_regoptFS  % 5-17
\_LMregfont lmrm.bx    LMRoman?-Bold           \_regoptFT  % 5-12
\_LMregfont lmrm.i     LMRoman?-Italic         \_regoptST  % 7-12
\_LMregfont lmrm.bxi   LMRoman?-BoldItalic     \_regoptT   % 10
\_LMregfont lmrm.isl   LMRomanSlant?-Regular   \_regoptES  % 8-17
\_LMregfont lmrm.bxisl LMRomanSlant?-Bold      \_regoptT   % 10
\_LMregfont lmrm.b     LMRomanDemi?-Regular    \_regoptT   % 10
\_LMregfont lmrm.bi    LMRomanDemi?-Oblique    \_regoptT   % 10

\_LMregfont lmss.r     LMSans?-Regular          \_regoptES  % 8-17
\_LMregfont lmss.bx    LMSans?-Bold             \_regoptT   % 10
\_LMregfont lmss.i     LMSans?-Oblique          \_regoptES  % 8-17
\_LMregfont lmss.bxi   LMSans?-BoldOblique      \_regoptT   % 10
\_LMregfont lmss.b     LMSansDemiCond?-Regular  \_regoptT   % 10
\_LMregfont lmss.bi    LMSansDemiCond?-Oblique  \_regoptT   % 10

\_LMregfont lmsq.r     LMSansQuot?-Regular      \_regoptE  % 8
\_LMregfont lmsq.b     LMSansQuot?-Bold         \_regoptE  % 8
\_LMregfont lmsq.i     LMSansQuot?-Oblique      \_regoptE  % 8
\_LMregfont lmsq.bi    LMSansQuot?-BoldOblique  \_regoptE  % 8

\_LMregfont lmtt.r     LMMono?-Regular        \_regoptET  % 8-12
\_LMregfont lmtt.b     LMMonoLt?-Bold         \_regoptT   % 10
\_LMregfont lmtt.i     LMMono?-Italic         \_regoptT   % 10
\_LMregfont lmtt.bi    LMMonoLt?-BoldOblique  \_regoptT   % 10
\_LMregfont lmtt.isl   LMMonoSlant?-Regular   \_regoptT   % 10
\_optfontalias {lmtt.bisl} {lmtt.bi}

\_LMregfont lmtp.r     LMMonoPropLt?-Regular      \_regoptT  % 10
\_LMregfont lmtp.bx    LMMonoPropLt?-Bold         \_regoptT  % 10
\_LMregfont lmtp.i     LMMonoPropLt?-Oblique      \_regoptT  % 10
\_LMregfont lmtp.bxi   LMMonoPropLt?-BoldOblique  \_regoptT  % 10
\_LMregfont lmtp.b     LMMonoProp?-Regular        \_regoptT  % 10
\_LMregfont lmtp.bi    LMMonoProp?-Oblique        \_regoptT  % 10

\_LMregfont lmtl.r     LMMonoLt?-Regular  \_regoptT  % 10
\_LMregfont lmtl.i     LMMonoLt?-Oblique  \_regoptT  % 10

\_LMregfont lmtc.r     LMMonoLtCond?-Regular  \_regoptT  % 10
\_LMregfont lmtc.i     LMMonoLtCond?-Oblique  \_regoptT  % 10

\_LMregfont lmrm.rc    LMRomanCaps?-Regular \_regoptT  % 10
\_LMregfont lmrm.ic    LMRomanCaps?-Oblique \_regoptT  % 10
\_LMregfont lmtt.rc    LMMonoCaps?-Regular  \_regoptT  % 10
\_LMregfont lmtt.ic    LMMonoCaps?-Oblique  \_regoptT  % 10

\_LMregfont lmmu.r     LMRomanUnsl?-Regular    \_regoptT  % 10
\_LMregfont lmdu.r     LMRomanDunh?-Regular    \_regoptT  % 10
\_LMregfont lmdu.sl    LMRomanDunh?-Oblique    \_regoptT  % 10

% main modifiers (they select a subfamily)
\_moddef \resetmod {\_fsetV subfam=rm \_fvars r bx i bxi }
\_moddef \sans     {\_fsetV subfam=ss \_fvars r bx i bxi }
\_moddef \quotset  {\_fsetV subfam=sq \_fvars r b i bi }
\_moddef \ttset    {\_fsetV subfam=tt \_fvars r b i bi }
\_moddef \ttprop   {\_fsetV subfam=tp \_fvars r b i bi }
\_moddef \ttlight  {\_fsetV subfam=tl \_fvars r . i . }
\_moddef \ttcond   {\_fsetV subfam=tc \_fvars r . i . }
\_moddef \upital   {\_fsetV subfam=mu \_fvars r . . . }
\_moddef \dunhill  {\_fsetV subfam=du \_fvars r . sl . }

% submodifiers (they select special variants in a subfamily)
\_moddef \nbold    {\_onlyif subfam=rm,ss,tp: {\_fvars r b i bi }}
\_moddef \bolder   {\_onlyif subfam=rm,ss,tp: {\_fvars r bx i bxi }}
\_moddef \slant    {\_onlyif subfam=rm:       {\_fvars r bx isl bxisl }%
                    \_onlyif subfam=tt:       {\_fvars r b isl bisl }}
\_moddef \caps     {\_onlyif subfam=rm,tt:    {\_fvars rc . ic . }}

%\_famvardef\tt{\_LMfonts \_addto\_fontfeatures{-tlig;}\_ttset \_rm}
%\_private \LMfonts \ttset ; % used in \tt, % removed 2022-02-22

\_initfontfamily % new font family must be initialized

\_loadmath {[latinmodern-math]}

\_endcode

\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
part of the font file name `<size-dependent-template>` with respect to given
optical size.

You can declare a collection of `<size-dependent-template>`s for one
given `<internal-template>` by the \^`\_regoptsizes` macro.
The syntax is shown for one real case:

\begtt
\_regoptsizes lmr.r lmroman?-regular
    5 <5.5 6 <6.5 7 <7.5 8 <8.5 9 <9.5 10 <11.1 12 <15 17 <*
\endtt

In general:

\begtt \catcode`\<=13
\_regoptsizes <internal-template> <general-ouput-template> <resizing-data>
\endtt

Suppose our example above. Then `\_optname{lmr.r}` expands to
lmroman?-regular where the question mark is substituted by a number
depending on current `\_optsize`. If the `\_optsize` lies between two boundary
values (they are prefixed by \code{<} character) then the number written between
them is used. For example if $11.1 \lt `\_optsize` \le 15$ then 12 is
substituted instead question mark. The <resizing-data> virtually begins
with zero \code{<0}, but it is not explicitly written. The right part of
<resizing-data> must be terminated by \code{<*} which means "less than infinity".

If `\_optname` gets an argument which is not registered <internal-template>
then it expands to `\_failedoptname` which typically ends with an error message
about missing font. You can redefine `\_failedoptname` macro to some
existing font if you find it useful.

We are using a special macro `\_LMregfont` in `f-lmfonts.opm`.
It sets the file names to
lowercase and enables us to use shortcuts instead of real <resizing-data>.
There are shortcuts `\_regoptFS`, `\_regoptT`, etc. here. The collection of
`<internal-templates>` are declared, each of them covers a collection of real
file names.

The \^`\_optfontalias` `{<new-template>} {<internal-template>}` declares
`<new-template>` with the same meaning as previously declared
`<internal-template>`.

The `\_optname` macro can be used even if no otical sizes are provided by
a font family. Suppose that font file names are much more chaotic (because
artists are very creative people), so you need to declare more systematic
`<internal-templates>` and do an alias from each `<internal-template>` to
`<real-font-name>`. For example, you can do it as follows:

\begtt
\def\fontalias #1 #2 {\_regoptsizes #1 ?#2 {} <*}
%          alias name           real font name
\fontalias crea-a-regular       {Creative Font}
\fontalias crea-a-bold          {Creative FontBold}
\fontalias crea-a-italic        {Creative olique}
\fontalias crea-a-bolditalic    {Creative Bold plus italic}
\fontalias crea-b-regular       {Creative Regular subfam}
\fontalias crea-b-bold          {Creative subfam bold}
\fontalias crea-b-italic        {Creative-subfam Oblique}
\fontalias crea-b-bolditalic    {Creative Bold subfam Oblique}
\endtt

Another example of a font family with optical sizes is Antykwa Półtawskiego.
The optical sizes feature is deactivated by default and it is switched on by
`\osize` font modifier:

\printdoc f-poltawski.opm
