%% This is part of OpTeX project, see http://petr.olsak.net/optex \_codedecl \setfontsize {Font resizing macros <2020-03-17>} % preloaded in format %% resizefont variant-name \fontswitch, for example \resizefont{bf}\_tenbf \_def\_resizefont#1#2{% \_edef\_whatresize{#1}% \_ifx \_fontselector \_undefined \_doresizefont#2% \_else \_ea \_doresizefont \_fontselector \_fi \_lastmagsize=0pt \_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}} %% \setfontsize{at} or \setfontsize{scaled} \_newdimen \_optsize \_optsize=10pt \_newdimen \_defaultoptsize \_defaultoptsize=10pt \_def\_setfontsize #1{% \_edef\_sizespec{#1}% \_ea \_setoptsize \_sizespec\_relax \_reloading } \_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} \_def\_setoptsize {\_isnextchar a{\_setoptsizeA} {\_isnextchar m{\_setoptsizeC}{\_setoptsizeB}}} \_def\_setoptsizeA at#1\_relax{\_optsize=#1\_relax\_lastmagsize=\_optsize} % at \_def\_setoptsizeB scaled#1\_relax{\_optsize=\_defaultoptsize\_relax} % scaled \_def\_setoptsizeC mag#1\_relax{% \_ifdim\_lastmagsize>0pt \_optsize=\_lastmagsize \_else \_optsize=\_pdffontsize\_font \_fi \_optsize=#1\_optsize \_lastmagsize=\_optsize \_edef\_sizespec{at\_the\_optsize}} \_newdimen\_lastmagsize \_setfontsize{at10pt} % default size \_let\_tryloadrm=\_relax \_let\_tryloadbf=\_relax \_let\_tryloadit=\_relax \_let\_tryloadbi=\_relax \_def\_regtfm #1 0 #2 *{\_ea\_def \_csname _#1:reg\_endcsname{#2 16380 \_relax}% \_def\_tmpa{#1}\_reversetfm #2 * % } \_def\_reversetfm #1 #2 {% we need this data for \_setmathfamily \_ea\_let\_csname _#1:reg\_ea\_endcsname \_csname _\_tmpa:reg\_endcsname \_if*#2\_else \_ea\_reversetfm \_fi } \_def\_whichtfm #1{% \_ifcsname _#1:reg\_endcsname \_ea\_ea\_ea \_dowhichtfm \_csname _#1:reg\_ea\_endcsname \_else #1% \_fi } \_def\_dowhichtfm #1 #2 {% \_ifdim\_optsize<#2pt #1\_ea\_ignoretfm\_else \_ea\_dowhichtfm \_fi } \_def\_ignoretfm #1\_relax{} % \fontdef \new {\\} \_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 } \_def \_keepmeaning #1#2{\_global\_let\_keepmeaningdata=#1% #2\_let#1=\_keepmeaningdata \_global\_let\_keepmeaningdata=\_undefined } \_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} \_def \_newcurrfontsize #1{% \newcurrfontsize{at25pt} \_edef\_tmp{\_ea\_csstring \_the\_font}% \_ea \_fontlet \_csname \_tmp\_ea\_endcsname \_the\_font \_space #1\_relax \_csname \_tmp\_endcsname } \_def \_rmfixed {% used in default \footline {\_ifdim\_mainfosize=0pt \_mainfosize=10pt \_fi \_fontdef\_rmfixed{\_setfontsize{at\mainfosize}\_resetmod\_rm}% \_global\_let\_rmfixed=\_rmfixed} % next use will be font switch only \_rmfixed } \_let \rmfixed = \_tenrm % user can redefine it %% Optical sizes data for preloaded Latin Modern fonts: \_regtfm lmr 0 ec-lmr5 5.5 ec-lmr6 6.5 ec-lmr7 7.5 ec-lmr8 8.5 ec-lmr9 9.5 ec-lmr10 11.1 ec-lmr12 15 ec-lmr17 * \_regtfm lmbx 0 ec-lmbx5 5.5 ec-lmbx6 6.5 ec-lmbx7 7.5 ec-lmbx8 8.5 ec-lmbx9 9.5 ec-lmbx10 11.1 ec-lmbx12 * \_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-lmtt10 11.1 ec-lmtt12 * \_public \setfontsize \newcurrfontsize \fontdef \fontlet \currvar \defaultoptsize ; \_endcode %--------------------------------------------------- This code is inspired from csfontsm.tex file. \sec Scaling fonts to diferent sizes in text mode (low-level macros) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% There are four basic font-variant selectors `\rm`, `\bf`, `\it`, `\bi`. Once a font family is loaded (for example fonts decalred in the format in the `fonts-preloaded.opm` or loaded by `\fontfam`) then you can resize these fonts using `\setfontsize{}`, for example `\setfontsize{at12pt}` or `\setfontsize{scaled1300}`. Note that the word `at` or `scaled` must be present here. This command itself does not rescaling, this is done at the first moment you use next `\rm`, `\bf`, `\it` or `\bi` selectors. Example. Assume that we are printing at 10pt and we use: \begtt \setfontsize{at15pt} ...still at 10pt... \rm ...now the text is at15pt... \bf bold is at 15pt too ... \endtt More meaningful is to use first variant selector immediatelly after `\setfontsize` command. There is a special "variant selector" `\currvar` which reloads the font from current variant, for example \begtt \it italics at10pt \setfontsize{at7pt}\currvar italics at 7pt. \endtt If you are using font families by `\fontfam` then you can use more "font modifiers". The `\setfontsize` command is only one of such font modifier. All font modifiers does not actual change of fonts but first usage of a variant selector takes this setting. See `fonts-select.opm` for more information about it. You can declare `\` which behaves as natural font switch declared by `\font`: \begtt \fontdef \ { \} example: \fontdef \bigfont {\setfontsize{at15pt}\bf} \endtt This command runs ` \` in a group and sets the resulting current font as `\`. The parameter of the `\fontdef` macro needs to be finalized by one of the four standard variant selectors (or `\currvar`). We have another command for scaling: `\fontlet` which is able to resize arbitrary font. The font must be presented by \, i.e. by `\_tenrm`, `\_tenbf` etc. or arbitrary font switch you declared it by `\font` primitive or `\fontdef` macro. The usage is: \begtt \fontlet \ = \ example: \fontlet \bigfont = \_tenbf at15pt \endtt The resulted `\bigfont` is the same as in previous example where `\fontdef` was used. The advantage of `\fontdef` macro will be more clear when you load font families by `\fontfam` and you are using more font modifiers declared in such families. The `\newcurrfontsize{}` resizes immediatelly current font. No others fonts are resized. The parameter of `\setfontsize` should be in the format `at` or `scaled` or `mag`. The first two are know from classical \TeX/. The third sets new font size to multiplied by current font size (declared by at or mag). For example if we have do `\setfontsize{at12pt}` and next we write `\setfontsize{mag1.5}\rm` then the current font size is `at19pt`. You can define a funny macro `\bigger`: \begtt \def\bigger {\setfontsize{mag1.3}\currvar} text \bigger text \bigger text \bigger text... \endtt \secc Optical sizes There are font families with more font files where almost the same font is implemented in various design sizes: `cmr5`, `cmr6`, `cmr7`, `cmr8`, `cmr9`, `cmr10`, `cmr12`, `cmr17` for example. This feature is called "optical sizes". \OpTeX/ chooses a font with an optical size closest to desired size specified by `\setfontsize`, when `at` or `mag` is used. When `scaled` is used then optical size is choosen using the value of the `\defaultoptsize` register and such font is scaled by the specified . There is `\defaultoptsize=10pt` by default. \secc Implementation notes ... to do ...