%% This is part of OpTeX project, see http://petr.olsak.net/optex \_fontdecl [Latin Modern] \LMfonts {TeX Gyre fonts based on Coputer Modern} {\roman \sans \quotset \ttset \ttprop \ttlight \ttcond \upital \dunhill submods:\caps \slant \nbold \bolder} {\rm \bf \it \bi \tt} {LM} "[lmroman10-regular]" \_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 Submodifiers (setlects special variants of given subfamily):^^J \caps ...... caps & small caps (available only at limited shapes)^^J \slant ..... slanted (default in some subfamilies)^^J \nbold ..... normal bold (\roman gives extended bold by default)^^J \bolder .... extended bold^^J }} \_protected\_def \LMfonts {% \_def \_currfamily {LMfonts}% \_def \_fontnamegen {[\_optname{lm\_subfamV.\_currV}]:\_fontfeatures}% \_resetmod } \_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 vaiants 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 . }} \_def \_tryloadtt {\_fontdef\_tentt{\_LMfonts \_addto\_fontfeatures{-tlig;}\_ttset \_rm}} \_private \LMfonts \ttset ; % \tt variant selector re-defined \_initfontfamily % new font family must be initialized \_loadmath {[latinmodern-math]} \_endcode \sec How to wite font-macro-file with optical sizes for \OpTeX/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% First, look at more clear example in `f-hermes.opm`. The basic documentation is there. You can use `\_optname` macro in upur `\_fontnamegen`. This macro is fully expandable and its input is `` and its output is a part of your `\_fontnamegen`, i.e. it is a part of a real font file name with `.otf` extension. Shortly speaking: \begtt \_optname{} -> \endtt You can declare a collection of file names for only one by `\_regoptsizes`. 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 \_regoptsizes {} \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 `<` 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 virtually begins with zero `<0`, but it is not explicitly written. The right part of must be terminated by `<*` which means "less than infinity". If `\_optname` gets an argument which is not registered then it expands to `\_failedoptname` which typically ends to error message about missing font. You can redefine `\_failedoptname` macro to some existing font if you fint it useful. We are using a special macro \_LMregfont which sets the file names to lowercase and enables to use a shortcasts isntead real . There are shortcats `\_regoptFS`, `\_regoptT`, etc. here. THe collection of are declared, each of them covers a collection of real file names. The modifiers redefines \_subfamV and \_currV ouput in this file `f-lmfonts.opm`. These outputs are used in the paramater of `\_optname`, so they decalre parts of , no parts of real file name. The `\optfontalias {} {} decales wit the same meaning as previously . 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 and do an alias from each to . For example, you can do it as folows: \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