[tex-k] Length of Computer Modern TFM files

Jonathan Kew jfkthame at gmail.com
Fri Feb 9 14:43:10 CET 2018

On 09/02/2018 12:06, Heiko Theißen wrote:
> It is, however, necessitated by the `eof' check that TeX makes when
> reading a TFM file, according to the following section of tex.web:
> @<Read font parameters@>=
> begin for k:=1 to np do
>    if k=1 then {the |slant| parameter is a pure number}
>      begin fget; sw:=fbyte; if sw>127 then sw:=sw-256;
>      fget; sw:=sw*@'400+fbyte; fget; sw:=sw*@'400+fbyte;
>      fget; font_info[param_base[f]].sc:=
>        (sw*@'20)+(fbyte div@'20);
>      end
>    else store_scaled(font_info[param_base[f]+k-1].sc);
> if eof(tfm_file) then abort; {this abort will be triggered for
> cmfi10.tfm and cmmi5.tfm}
> for k:=np+1 to 7 do font_info[param_base[f]+k-1].sc:=0;
> end

I don't think this is a correct interpretation. TeX reads from the TFM 
file by accessing |fbyte|, which (by default) is defined as tfm_file^, 
i.e. the "current" byte of the file. The file pointer is advanced by 
|fget| _before_ reading each byte; it is not advanced _after_ reading 
the last byte of the file.

Therefore, when the above for-loop finishes reading the last font 
parameter, the file pointer will still be pointing at the last byte of 
the (expected length of the) file; it will _not_ have been advanced past 
that byte. And so |eof(tfm_file)| will be true only if the file was 
actually shorter than expected, not if its length was exactly correct. 
(And as §575 says, no error message is given for files having more than 
|lf| words.)


More information about the tex-k mailing list