# Re: Behaviour of \latinfamily

• To: rebecca@astrid.u-net.com
• Subject: Re: Behaviour of \latinfamily
• From: Ulrik Vieth <vieth@thphy.uni-duesseldorf.de>
• Date: Thu, 28 May 1998 12:43:35 +0200
• CC: s.rahtz@elsevier.co.uk, fontinst@cogs.susx.ac.uk
• In-reply-to: <l03130300b191f8c36e0f@[194.119.133.49]> (message from Rebeccaand Rowland on Wed, 27 May 1998 18:23:53 +0100)


>> because shape ui is not requested by \latin_family. it only asks for
>>
>> \def\latin_shapes{
>> \latin_shape{} {} {} {n}
>> \latin_shape{c}{c}{} {sc}
>> \latin_shape{o}{o}{} {sl}
>> \latin_shape{i}{i}{i}{it}
>> }
>>
>> so the ui=it substitution is never activated.
>>
>> you are screaming now, aren't you?

> Very nearly...   Yes, I've looked at the source code and I'm none the
> wiser.  Can you explain two things:

> 1) What calls \latin_shapes and when.
> 2) What \latin_shapes does.

That's what I tried to explain last time.

You call e.g. \latinfamily{ptm}{}, which calls \parse_family to
intialize some variables such as \font_familly and \latex_family.

Then it calls \latin_weights, which does a number of calls such as

\latin_weight{r}{m}
\latin_weight{s}{sb}
\latin_weight{b}{b}

Each of these calls stores the arguments in the variables \font_weight
and \latex_weight and continues to call \latin_widths.

\latin_widths, in turn, does a number of calls such

\latin_width{}{}
\latin_width{n}{c}

Each of these calls stores the arguments in the variables \font_width
and \latex_width and continues to call \latin_shapes.

\latin_shapes, in turn, does a number of calls such

\latin_shape{} {} {} {n}
\latin_shape{c}{c}{} {sc}
\latin_shape{o}{o}{} {sl}
\latin_shape{i}{i}{i}{it}

Each of these calls stores the arguments in the variables \font_shape,
\raw_shape, \encoding_shape and \latex_shape and continues to do some
actual processing for some particular combination of family, weight,
width, and shape.

What is eventually needed to install a T1 or OT1 encoded font shape,
is an 8r-encoded .mtx file for this combination of attributes.
Before trying to open that .mtx file and calling \latin_encodings,
two macros \fake_width_<width> and \fake_shape_<shape> are called,
which do quite a lot of work.

Let's ignore the effect of \fake_width_ for a moment and just look
at the effect of \fake_shape_<shape>.

* For the normal shape, \fake_shape_ is called, which looks for an
8a-encoded .afm files, and if so, it calls

\transformfont{<font>8r}{\reencodefont{8r}{\fromafm{<font>8a}}}

Internally, this runs

\afmtomtx{<font>8a}{<font>8a}
\mtxtopl{<font>8a}{<font>8a}
\mtxtomtx{<font>8a}{<font>8r}
\mtxtopl{<font>8r}{<font>8r}

and produces the files <font>8a.mtx, <font>8a.pl, <font>8r.mtx
and <font>8r.pl.

Then it calls \installrawfont for <font>8r, which adds an entry to
the internal token list, which is eventually written to 8r<fam>.fd
at the end of the job.

* For the oblique shape, \fake_shape_o is called, which first looks
for a corresponding 8a-encoded .afm file of a real obliuqe font.
If it exists, it calls \fake_shape_ to do the same steps as above,
which implies running

\afmtomtx{<font>o8a}{<font>o8a}
\mtxtopl{<font>o8a}{<font>o8a}
\mtxtomtx{<font>o8a}{<font>o8r}
\mtxtopl{<font>o8r}{<font>o8r}

If a real oblique font isn't found, \fake_shape_o_raw_encoding
is called, which does

\transformfont{<font>o8r}{\slantfont{167}{\frommtx{<font>8r}}}

Internally, this runs

\mtxtomtx{<font>o8r}{<font>8r}
\mtxtopl{<font>o8r}{<font>o8r}

and produces the files <font>o8r.mtx and <font>o8r.pl.
Then it calls \installrawfont for <font>o8r, as above.

* For the small caps shape, \fake_shape_c is called, which first looks
for a corresponding 8a-encoded .afm file of a real small caps font.
If it exists, it calls \fake_shape_ to do the same steps as above,
which implies running

\afmtomtx{<font>c8a}{<font>c8a}
\mtxtopl{<font>c8a}{<font>c8a}
\mtxtomtx{<font>c8a}{<font>c8r}
\mtxtopl{<font>c8r}{<font>c8r}

If a real small caps font isn't found.  \raw_shape and \encoding_shape
are redefined to {} to {c}, before calling \fake_shape_ once again.
This wil produce an 8r-encoded .mtx file for the default shape,
if that hasn't been done already before.

The effect of setting \encoding_shape will come into play later when
\latin_encodings is called, in which case it will use a different .etx
file (T1c.etx or OT1c.etx) to generate a faked small caps font.

* Finally, for an italic shape \fake_shape_i is called, which does
the same steps as \fake_shape_ for the default shape.  If a real
italics fonts exists, it will look for an 8a-encoded .mtx file and
produce an 8r-encoded .mtx file.

\afmtomtx{<font>i8a}{<font>i8a}
\mtxtopl{<font>i8a}{<font>i8a}
\mtxtomtx{<font>i8a}{<font>i8r}
\mtxtopl{<font>i8r}{<font>i8r}

If it doesn't exists, there's no way to fake it, and \latin_shape will
return without calling \latin_encodings.  Similarly, if a font weight
doesn't exists, all the \fake_shape_<shape> macros will return without
doing anything, since a missing weight can't be faked.

Hope this explanation was a little clearer this time.  Still, so far
we have only dealt with .mtx and .pl files for 8r-encoded raw fonts.
I haven't looked at what happens, when \latin_encodings is called to
produce .vpl files for the OT1 or T1 encoding.

Cheers, Ulrik.
{"extraction_info": {"found_math": true, "script_math_tex": 0, "script_math_asciimath": 0, "math_annotations": 0, "math_alttext": 0, "mathml": 0, "mathjax_tag": 0, "mathjax_inline_tex": 0, "mathjax_display_tex": 0, "mathjax_asciimath": 1, "img_math": 0, "codecogs_latex": 0, "wp_latex": 0, "mimetex.cgi": 0, "/images/math/codecogs": 0, "mathtex.cgi": 0, "katex": 0, "math-container": 0, "wp-katex-eq": 0, "align": 0, "equation": 0, "x-ck12": 0, "texerror": 0, "math_score": 0.7512735724449158, "perplexity": 15349.034404809863}, "config": {"markdown_headings": true, "markdown_code": true, "boilerplate_config": {"ratio_threshold": 0.18, "absolute_threshold": 10, "end_threshold": 15, "enable": true}, "remove_buttons": true, "remove_image_figures": true, "remove_link_clusters": true, "table_config": {"min_rows": 2, "min_cols": 3, "format": "plain"}, "remove_chinese": true, "remove_edit_buttons": true, "extract_latex": true}, "warc_path": "s3://commoncrawl/crawl-data/CC-MAIN-2018-09/segments/1518891816351.97/warc/CC-MAIN-20180225090753-20180225110753-00240.warc.gz"}