diff options
author | Karl Berry <karl@freefriends.org> | 2006-01-11 23:03:17 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2006-01-11 23:03:17 +0000 |
commit | ecf966f305f6aeff2bbdf42c82d8425921aa9eda (patch) | |
tree | db606a57e3619610e4c35cae849d41cf4e0937d5 /Master/texmf-dist/source/fontinst/base/ficonv.dtx | |
parent | ac3c55a3216b5988f0e48ba9414ddb059f19a699 (diff) |
source 1
git-svn-id: svn://tug.org/texlive/trunk@105 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/fontinst/base/ficonv.dtx')
-rw-r--r-- | Master/texmf-dist/source/fontinst/base/ficonv.dtx | 2807 |
1 files changed, 2807 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/fontinst/base/ficonv.dtx b/Master/texmf-dist/source/fontinst/base/ficonv.dtx new file mode 100644 index 00000000000..e1fee953b8c --- /dev/null +++ b/Master/texmf-dist/source/fontinst/base/ficonv.dtx @@ -0,0 +1,2807 @@ +% \CheckSum{2221} +% \iffalse meta-comment +% +% Copyright 1993, 1994, 1995, 1996 Alan Jeffrey, +% hacked and maintained 1997, 1998 Sebastian Rahtz, +% copyright 1998, 1999, 2000 the fontinst maintenance team and any +% individual authors listed elsewhere in this file. All rights reserved. +% +% This file is part of the fontinst system version 1.9. +% ----------------------------------------------------- +% +% It may be distributed under the terms of the LaTeX Project Public +% License, as described in lppl.txt in the base LaTeX distribution. +% Either version 1.1 or, at your option, any later version. +% +%%% From file: ficonv.dtx +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{fisource} +\title{The \package{fontinst} utility} +\author{Alan Jeffrey, Sebastian Rahtz, Ulrik Vieth, Lars Hellstr\"om} +\begin{document} +\maketitle +\tableofcontents +\DocInput{ficonv.dtx} +\end{document} +%</driver> +% \fi +% +% \StopEventually{} +% +% \section{Basic file format conversions} +% \label{Sec:Conv. input} +% \changes{1.902}{1999/05/01}{Collected the material in Section +% \thesection\space and moved it to \texttt{ficonv.dtx}. (LH)} +% \changes{1.926}{2003/07/12}{Added some missing \textasciitilde's +% at ends of lines. (LH)} +% +% \subsection{Converting an ENC file to an ETX file} +% +% \DescribeMacro{\enctoetx} +% The macro +% \begin{quote} +% |\enctoetx|\marg{encfile}\marg{etxfile} +% \end{quote} +% reads \meta{encfile}|.enc| and writes the same information to +% \meta{etxfile}|.etx|, in a format \TeX{} can read more easily. +% +% Each |/|\meta{glyph} command is recorded in a macro |\o-|\meta{glyph}, +% which expands to a corresponding |\setslot|\marg{glyph} +% \textellipsis\ |\endslot| +% statement. +% +% \begin{macrocode} +%<*misc> +\newif\ifmissingslots +\x_cs\def{o-.notdef}#1{\global\missingslotstrue} +% \end{macrocode} +% +% \begin{macro}{\enctoetx} +% \begin{macrocode} +{ + \catcode`\/=\active + \catcode`\]=\active + \gdef\enctoetx#1#2{{ + \catcode`\/=\active + \catcode`\]=\active + \def/##1[{ + \a_count=0 + \global\missingslotsfalse + \def/####1~{ + \csname~o-####1\endcsname{ + \ifmissingslots + \out_line{\string\nextslot{\the\a_count}} + \fi + \global\missingslotsfalse + \out_line{\string\setslot{####1}} + \out_line{\string\endsetslot} + \out_line{} + } + \advance\a_count by 1 + } + } + \def]~def{} + \make_etx{#1}{#2} + }} +} +% \end{macrocode} +% \end{macro} +% +% |\make_etx| finishes the job of |\enctoetx|. +% +% \begin{macrocode} +\def\make_etx#1#2{ + \open_out{\temp_prefix#2.etx} + \out_line{\percent_char~Filename:~#2.etx} + \out_line{\percent_char~Created~by:~tex~\jobname} + \out_line{\percent_char~Created~using:~\string\enctoetx{#1}{#2}} + \out_line{} + \out_line{\percent_char~This~file~contains~the~ + information~of~#1.enc~in~a~form} + \out_line{\percent_char~more~easily~read~by~TeX.~ + It~is~used~by~the~fontinst~package.} + \out_line{} + \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.} + \out_line{} + \out_line{\string\relax} + \out_line{} + \out_line{\string\documentclass[twocolumn]{article}} + \out_line{\string\usepackage{fontdoc}} + \out_line{} + \out_line{\string\begin{document}} + \out_line{} + \out_line{This~document~describes~the~#1~encoding.} + \out_line{It~was~automatically~generated~by~the} + \out_line{{\string\tt\space~fontinst}~package.} + \out_line{} + \out_line{\string\encoding} + \out_line{} + \out_line{\string\needsfontinstversion{\fontinstversion}} + \out_line{} + \primitiveinput #1.enc\x_relax + \out_line{} + \out_line{\string\end encoding} + \out_line{} + \out_line{\string\end{document}} + \close_out{Encoding~vector} +} +% \end{macrocode} +% +% +% \subsection{Converting an ETX file to an ENC file} +% \changes{1.911}{1999/11/21}{ETX to ENC converter added. (LH)} +% +% \DescribeMacro{\etxtoenc} +% The command +% \begin{quote} +% |\etxtoenc|\marg{etxfile}\marg{encfile} +% \end{quote} +% reads \meta{etxfile}|.etx| and generates a postscript encoding file +% \meta{encfile}|.enc| that specifies the same encoding vector. +% +% +% \begin{macro}{\notdef_name} +% This macro holds the name of the \texttt{.notdef} glyph, which must +% be put in all encoding positions where there is no other glyph. +% \begin{macrocode} +\def\notdef_name{.notdef} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\etxtoenc} +% The conversion has three steps. First the \texttt{.notdef} glyph is +% assigned to every slot in the encoding, then the ETX file is read +% and the assignments are changed for the slots which are not +% unassigned in the encoding, and finally the ENC file is written. +% The first two steps are carried out by |\etxtoenc|, but the final +% step is handled by |\make_enc|. +% \changes{1.927}{2004/07/12}{Made the \meta{etxfile} argument a +% comma-separated list of ETX files. Changed \cs{do_slot} definition +% to get set rather than reset semantics. (LH) Feature requested +% by Werner Lemberg.} +% \begin{macrocode} +\def\etxtoenc#1#2{\begingroup + \a_count=\z@ + \loop + \x_cs\let{name-\the\a_count}=\notdef_name + \ifnum \@cclv>\a_count + \advance \a_count \@ne + \repeat + \def\do_slot{ + \x_cs\ifx{name-\the\slot_number}\notdef_name + \x_cs\edef{name-\the\slot_number}{\slot_name} + \fi + } + \process_csep_list\inputetx #1,\process_csep_list, + \make_enc{#1}{#2} +\endgroup} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\make_enc} +% The command +% \begin{quote} +% |\make_enc|\marg{etxfiles}\marg{encfile} +% \end{quote} +% creates the file \meta{encfile}|.enc| and writes to that file the +% definition of the postscript encoding vector which corresponds to +% the encoding currently stored in the |\name-|\meta{slot} family of +% macros. That encoding is assumed to be defined by the files listed +% in the \meta{etxfiles}. +% +% \changes{1.911}{1999/12/02}{Storing encoding name in string +% \texttt{encodingname}, thus allowing the ETX file to override +% the default. (LH)} +% \changes{1.912}{2000/02/12}{Also calling \cs{declarepsencoding} +% once the encoding file has been written. (LH)} +% \changes{1.914}{2000/05/14}{Not writing an \texttt{address} entry +% if that string isn't set. (LH)} +% \changes{1.919}{2001/08/02}{Added DSC comments. (LH)} +% \changes{1.927}{2004/07/12}{Modified to handle a comma-separated +% list of ETX files. (LH)} +% \begin{macrocode} +\def\make_enc#1#2{ + \setstr{encodingname}{fontinst-autoenc-#1} + \def\a_macro##1{ + \add_to\b_macro{##1.etx} + \def\a_macro####1{ + \add_to\b_macro{,~####1.etx} + } + } + \let\b_macro\empty_command + \process_csep_list\a_macro #1,\process_csep_list, + \open_out{#2.enc} + \out_line{\percent_char !PS-Adobe-3.0~Resource-Encoding} + \out_line{\percent_char\space @psencodingfile\left_brace_char} + \ref_to_sourcefile{author}\b_macro + \ref_to_sourcefile{version}\b_macro + \out_line{\percent_char\four_spaces date~=~"generated~ + \the\year/ + \ifnum10>\month0\fi\the\month/ + \ifnum10>\day0\fi\the\day",} + \out_line{\percent_char\four_spaces filename~=~"\out_filename",} + \ref_to_sourcefile{email}\b_macro + \ifisstr{address}\then + \out_line{\percent_char\four_spaces address~=~\str{address}} + \fi + \out_line{\percent_char\four_spaces codetable~=~"ISO/ASCII",} + \out_line{\percent_char\four_spaces checksum~=~"",} + \out_line{\percent_char\four_spaces abstract~=~" + This~is~a~postscript~encoding~file,~automatically~ + generated~by~fontinst~from~\b_macro."} + \out_line{\percent_char\space\right_brace_char} + \out_line{} + \out_line{\percent_char\space Created~by:~tex~\jobname} + \out_line{\percent_char\space Created~using:~ + \string\etxtoenc{#1}{#2}} + \out_line{} + \out_line{\percent_char\space This~file~should~be~installed~ + somewhere~that~your~DVI} + \out_line{\percent_char\space to~postscript~driver~looks~for~files.~ + It~is~needed~for} + \out_line{\percent_char\space reencoding~some~font~you~have~ + transformed.} + \out_line{} + \out_line{\percent_char\space After~installing~this~file,~you~ + should~add~the~following} + \out_line{\percent_char\space line~(minus~\percent_char)~ + to~your~finstmsc.rc~file:} + \out_line{\percent_char\space\string\declarepsencoding + {#1}{\str{encodingname}}{\string\download{\out_filename}}} + \edef\a_macro{ + \noexpand\declarepsencoding{#1}{\str{encodingname}} + {\noexpand\download{\out_filename}} + } + \a_macro + \out_line{} + \out_line{\percent_char\percent_char BeginResource:~ + encoding~\str{encodingname}} + \out_line{/\str{encodingname}\space[} + \b_count=8 + \a_count=\z@ + \loop + \ifnum 8=\b_count + \b_count=\z@ + \out_line{\percent_char\space\the\a_count} + \fi + \out_line{/\csname name-\the\a_count \endcsname} + \ifnum \@cclv>\a_count + \advance \a_count \@ne + \advance \b_count \@ne + \repeat + \out_line{]~def} + \out_line{\percent_char\percent_char EndResource} + \out_line{} + \out_line{\percent_char\space End~of~file~\out_filename.} + \close_out{Encoding~vector} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ref_to_sourcefile} +% The command +% \begin{quote} +% |\ref_to_sourcefile|\marg{field}\marg{sourcefile} +% \end{quote} +% writes a \meta{field} field of a \BibTeX-style header to the +% current main output file. If the string named \meta{field} is set +% then the value for this field will be that string, and if it isn't +% set then the value will be the string \texttt{"See file }^^A +% \meta{sourcefile}\texttt{"}. Note that the string \#1 is not +% quoted, so it must contain the quotes if it isn't simply an integer. +% \begin{macrocode} +\def\ref_to_sourcefile#1#2{ + \ifisstr{#1}\then + \out_line{\percent_char\four_spaces #1~=~\str{#1},} + \else + \out_line{\percent_char\four_spaces #1~=~"See~file~#2",} + \fi +} +%</misc> +% \end{macrocode} +% \end{macro} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \subsection{Converting an AFM file to an MTX file} +% +% \DescribeMacro{\afmtomtx} +% The macro +% \begin{quote} +% |\afmtomtx|\marg{afmfile}\marg{mtxfile} +% \end{quote} +% reads \meta{afmfile}|.afm|, and writes the same information out to +% \meta{mtxfile}|.mtx|. +% +% \begin{macro}{\afmtomtx} +% \changes{1.911}{1999/11/18}{Changed setting of \cs{raw_font_name} +% to \cs{edef} and added setting of \cs{source_font_name}. (LH)} +% \changes{1.917}{2001/03/13}{Added resetting of +% \cs{setsomething_global}---assignments made here must be +% local. (LH)} +% \begin{macrocode} +%<*pkg> +\def\afmtomtx#1#2{{ + \let\setsomething_global=\x_relax + \open_out{\temp_prefix#2.mtx} + \edef\raw_font_name{#2} + \edef\source_font_name{#1} + \x_resetint{italicslant}{0} + \let\italcorr_expression=\uprightitalcorr + \x_setint{minimumkern}{0} + \minimum_kern=\int{minimumkern} + \out_line{\percent_char~Filename:~#2.mtx} + \out_line{\percent_char~Created~by:~tex~\jobname} + \out_line{\percent_char~Created~using:~\string\afmtomtx{#1}{#2}} + \out_line{} + \out_line{\percent_char~This~file~contains~the~ + information~of~#1.afm~in~a~form} + \out_line{\percent_char~more~easily~read~by~TeX.~ + It~is~used~by~the~fontinst~package.} + \out_line{} + \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.} + \out_line{} + \out_line{\string\relax} + \out_line{\string\metrics} + \out_line{} + \out_line{\string\needsfontinstversion{\fontinstversion}} + \out_line{} + \catcode`\^^M=12 + \catcode`\ =10 + \expandafter\afm_line\primitiveinput #1.afm\x_relax + \out_line{} + \out_line{\endmetrics_text} + \close_out{Metrics} +}} +% \end{macrocode} +% \end{macro} +% +% Kerns below this value are ignored. +% +% \begin{macrocode} +\newcount\minimum_kern +% \end{macrocode} +% +% +% \begin{macro}{\afm_length} +% \changes{1.900}{1998/12/28}{Macro added, other macros modified to +% use it. (LH)} +% \begin{macro}{\afm_unit_dimen} +% The call |\afm_length|\meta{count}\marg{real} +% interprets the \meta{real} as a real number, rounds it to the +% nearest integer, and sets the \meta{count} (a |\count| register) +% to that integer. In this process, |\a_dimen| is used as a temporary +% storage. +% \begin{macrocode} +\def\afm_length#1#2{ + \a_dimen=#2\afm_unit_dimen + #1=\a_dimen + \divide #1 by \afm_unit_dimen + \advance \a_dimen by -#1\afm_unit_dimen + \ifdim \a_dimen>0.5\afm_unit_dimen + \advance #1 by 1 + \else \ifdim \a_dimen<-0.5\afm_unit_dimen + \advance #1 by -1 + \fi\fi + \x_relax +} +% \end{macrocode} +% The dimen |\afm_unit_dimen| is used to keep track of how long an AFM +% unit is interpreted as being in this routine. Lowering its value +% makes |\afm_length| capable of handling greater lengths but looses +% some very slight precision in the rounding, increasing the value +% has the opposite effects. The current value of 1000\thinspace sp +% means it reads lengths with three decimals accuracy (not very much +% use for them though as the number is rounded to zero decimals +% accuracy anyway, but it does make a difference when deciding how +% a \meta{real} like |0.502| should be rounded) and can handle lengths +% of an absolute value of a good million AFM units. This should be +% adequate in most cases. It is, by the way, probably wisest to keep +% it a power of ten scaled points in all cases, as this should reduce +% the rounding errors caused by various base conversions. +% \begin{macrocode} +\newdimen\afm_unit_dimen +\afm_unit_dimen=1000sp +% \end{macrocode} +% \end{macro}\end{macro} +% +% +% The command |\afm_line| reads to the end of the line, calls +% |\afm_command| on that line, then calls |\afm_line| again. +% +% \begin{macrocode} +{\catcode`\^^M=12 \gdef\afm_line#1 +{\afm_command#1~\end_of_line\afm_line}} +% \end{macrocode} +% +% The command |\afm_command| reads the first word |FOO|, and calls +% |afm-FOO|. If this does not exist, then |\gobble_one_line| will +% eat up the rest of the line. +% +% \begin{macrocode} +\def\afm_command#1~{\csname~afm-#1\endcsname\gobble_one_line} +\def\gobble_one_line#1\end_of_line{} +% \end{macrocode} +% +% This all stops when we reach the command |EndFontMetrics|. +% +% \begin{macrocode} +\x_cs\def{afm-EndFontMetrics}#1\afm_line{\endinput} +% \end{macrocode} +% +% \begin{macro}{\afm_def} +% To define an AFM command, you say |\afm_def|\marg{command}^^A +% \parg{pattern}\marg{result} +% \begin{macrocode} +\def\afm_def#1(#2)#3{\x_cs\def{afm-#1} + \gobble_one_line#2\end_of_line{#3}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\afm_let} +% Saying |\afm_let|\marg{dest-command}\marg{source-command} copies +% the definition of one AFM command to another. +% \begin{macrocode} +\def\afm_let#1#2{ + \expandafter\let \csname afm-#1\expandafter\endcsname + \csname afm-#2\endcsname +} +% \end{macrocode} +% \end{macro} +% +% For example, we can define the following AFM commands: +% \changes{1.6}{1997/02/07}{AFM commands fixed, to get fontdimens +% comparable to EC fonts. (Thierry Bouche)} +% ^^A (Fixed by Thierry Bouche +% ^^A 1997/02/07, to get fontdimens comparable to EC fonts.) +% \changes{1.912}{2000/02/20}{AFM command \texttt{StdVW} now +% interpreted: generates \cs{setint} for integer +% \texttt{verticalstem}. (LH)} +% +% \begin{macrocode} +\afm_def{CharWidth}(#1){\afm_length\char_x_width{#1}} +\afm_def{ItalicAngle}(#1~){\calculate_it_slant{#1}} +\afm_def{XHeight}(#1){ + \afm_length\a_count{#1} + \out_line{\string\setint{xheight}{\the\a_count}}} +\afm_def{CapHeight}(#1){ + \afm_length\a_count{#1} + \out_line{\string\setint{capheight}{\the\a_count}}} +\afm_def{Ascender}(#1){ + \afm_length\a_count{#1} + \out_line{\string\setint{ascender}{\the\a_count}}} +\afm_def{Descender}(#1){ + \afm_length\a_count{#1} + \out_line{\string\setint{descender_neg}{\the\a_count}}} +\afm_def{UnderlineThickness}(#1){ + \afm_length\a_count{#1} + \out_line{\string\setint{underlinethickness}{\the\a_count}}} +\afm_def{FontBBox}(#1~#2~#3~#4){ + \afm_length\a_count{#4} + \out_line{\string\setint{maxheight}{\the\a_count}} + \afm_length\a_count{#2} + \out_line{\string\setint{maxdepth_neg}{\the\a_count}}} +\afm_def{StdVW}(#1){ + \afm_length\a_count{#1} + \out_line{\string\setint{verticalstem}{\the\a_count}}} +\afm_def{IsFixedPitch}(#1){ + \if\first_char#1=f + \else\out_line{\string\setint{monowidth}{1}} + \fi +} +% \end{macrocode} +% +% \multchanges{\cs{afm_font_name}}{1.901}{1999/03/06}{Macro added. (LH)} +% \multchanges{\cs{afm_font_name}}{1.911}{1999/11/18}{Macro removed, +% since no longer needed. (LH)} +% +% \begin{macro}{\afm-FontName} +% The |FontName| of a font is needed for the |\storemapdata| command, +% so it is when that is encountered that this is written. This +% information is of no use when making TFMs and VFs, but it is likely +% to be of use for generation of map files, so it will be included in +% a file of recorded transforms, if such a file is being generated. +% \begin{macrocode} +\afm_def{FontName}(#1~){ + \record_transform{\raw_font_name} + {\string\fromafm{\source_font_name}{#1}}{}\iftrue +} +% \end{macrocode} +% \end{macro} +% +% Processing kern pairs. If one of the glyph name starts with +% a dot as in |.notdef| or |.null| the kern pair is ignored. +% +% \begin{macrocode} +\afm_def{KP}(#1~#2~#3~#4){ + \if\first_char#1=.\else + \if\first_char#2=.\else + \afm_length\a_count{#3} + \ifnum \a_count>\minimum_kern + \out_line{\string\setkern{#1}{#2}{\the\a_count}} + \else\ifnum \a_count<-\minimum_kern + \out_line{\string\setkern{#1}{#2}{\the\a_count}} + \fi\fi + \fi\fi +} +\afm_let{KPX}{KP} +% \end{macrocode} +% +% Processing char metrics. +% +% \begin{macrocode} +\afm_def{C}(#1~;#2){\init_afm{#1}\do_list[#2]\afm_char} +\afm_let{CH}{C} +% \end{macrocode} +% +% Processing composite chars. +% +% \begin{macrocode} +\afm_def{CC}(#1~#2~;#3){\init_cc{#1}\do_list[#3]\cc_char} +% \end{macrocode} +% +% When parsing a character, we set the values of the following +% variables: +% +% \begin{macrocode} +\newcount\char_slot +\newcount\char_x_width +\newcount\x_width +\newcount\bbox_llx +\newcount\bbox_lly +\newcount\bbox_urx +\newcount\bbox_ury +\let\char_name=\empty_command +% \end{macrocode} +% +% |\init_afm| initializes the variables the AFM character list writes to. +% +% \begin{macrocode} +\def\init_afm#1{ + \char_slot=#1\x_relax + \x_width=\char_x_width + \bbox_llx=0 + \bbox_lly=0 + \bbox_urx=0 + \bbox_ury=0 + \let\char_name=\empty_command +} +% \end{macrocode} +% +% ^^A Commented out, since it describes the way of things before +% ^^A v1.308 (this comment has been wrong for over five years!): +% ^^A +% ^^A |\afm_char| writes the values of these variables to the |.mtx| +% ^^A file, and saves them in a macro |\g-GLYPHNAME|, in the form: +% ^^A \begin{quote} +% ^^A |{WIDTH}{HEIGHT}{DEPTH}{ITALIC}| +% ^^A \end{quote} +% ^^A +% ^^A These are needed, because the (grumble grumble) syntax of |CC| +% ^^A commands doesn't include the glyph measurements, so we have to +% ^^A remember them. +% +% \begin{macrocode} +\def\afm_char{ + \a_count=-\bbox_lly + \eval_expr{ + \italcorr_expression\x_width\bbox_llx\bbox_urx\bbox_lly\bbox_ury + } + \out_line{ + \ifnum -1<\char_slot + \string\setrawglyph + \else + \string\setnotglyph + \fi + {\char_name} + {\raw_font_name} + {10pt} + {\the\char_slot} + {\the\x_width} + {\the\bbox_ury} + {\the\a_count} + {\the\result} + } +} +% \end{macrocode} +% +% |\init_cc| and |\cc_char| write out a composite character glyph. +% +% \begin{macrocode} +\def\init_cc#1{% + \out_line{\string\setglyph{#1}} + \def\char_name{#1} +} +\def\cc_char{% + \out_lline{\string\samesize{\char_name-not}} + \out_line{\string\endsetglyph} +} +% \end{macrocode} +% +% +% \changes{1.900}{1998/12/28}{Method of computing italic corrections +% changed to using an integer expression. (LH)} +% \DescribeMacro{\italcorr_expression} +% The way the italic correction is computed has been changed +% quite a bit, although the computed values are still the same. +% The point is that it is much simpler to modify the formula according +% to which the value is computed using this method than using the +% previous method. +% +% The call +% \begin{quote} +% |\italcorr_expression|\marg{width}\marg{left}^^A +% \marg{right}\marg{bottom}\marg{top}, +% \end{quote} +% where the arguments are \TeX\ \meta{number}s, should expand to an +% integer expression. The value of that expression will be taken as the +% italic correction of the current character. +% +% \meta{width} is the width of the character. \meta{left}, +% \meta{right}, \meta{bottom}, and \meta{top} are the respective +% coordinates of the sides of the bounding box of the character. A +% quantity which is not given as an argument, but which nontheless +% might be of interest for a calculation of italic correction, is the +% italic slant of the font. This quantity can be found in the fontinst +% integer \texttt{italicslant}. (The MTX file written will also set +% the integer \texttt{italicslant} to this value.) +% +% \begin{macro}{\uprightitalcorr} +% \begin{macro}{\slanteditalcorr} +% These two commands are what |\italcorr_expression| will get set +% to---the slanted version is used if the italic slant is positive and +% the upright version is used otherwise. The default definitions +% compute the same values as in fontinst v\,1.8, but the definitions +% can easily be modified using |\resetcommand|. +% \begin{macrocode} +\def\uprightitalcorr#1#2#3#4#5{0} +\def\slanteditalcorr#1#2#3#4#5{\max{\sub{#3}{#1}}{0}} +% \end{macrocode} +% \end{macro}\end{macro} +% +% +% \begin{macro}{\calculate_it_slant} +% To set the italic angle, we need to calculate the tangent of the +% angle that the |.afm| file contains. This is done with David +% Carlisle's \package{trig} macros. Note that the \package{trig} +% macros don't like a space at the end of their argument. +% +% \changes{1.911}{1999/11/18}{Stripping off the space in +% \cs{afm-ItalicAngle}. (LH)} +% ^^A\question{\cs{afm_line} always inserts a space at the end of the line.} +% ^^ACould we therefore save us a bit of trouble by simply changing the +% ^^Apattern for |\ItalicAngle| to |(#1~)|? /LH +% +% \begin{macrocode} +\def\calculate_it_slant#1{ + \edef\theangle{#1} + \CalculateTan{\theangle} + \a_dimen=-\one_thousand sp + \a_dimen=\UseTan{\theangle}\a_dimen + \a_count=\a_dimen + \out_line{\string\setint{italicslant}{\the\a_count}} + \x_resetint{italicslant}{\a_count} + \ifnum 0<\a_count + \let\italcorr_expression=\slanteditalcorr + \else + \let\italcorr_expression=\uprightitalcorr + \fi +} +% \end{macrocode} +% \begin{macrocode} +% \def\strip_spaces#1~#2\end_strip_spaces{#1} +% \end{macrocode} +% \end{macro} +% +% To process a list of commands separated by semi-colons, we call +% |\do_list[LIST]|. This works in a similar way to |\afm_line|. +% +% \begin{macrocode} +\def\do_list[~#1~#2;~#3]{ + \csname~list-#1\endcsname\gobble_one_semi#2; + \ifx\x_relax#3\x_relax\expandafter\gobble_one + \else\expandafter\identity_one\fi + {\do_list[~#3]} +} +\def\gobble_one_semi#1;{} +% \end{macrocode} +% +% There is an analagous |\list_def| for defining commands to be used +% inside lists. +% +% \begin{macrocode} +\def\list_def#1(#2)#3{\x_cs\def{list-#1}\gobble_one_semi#2~;{#3}} +% \end{macrocode} +% +% For example, these are the commands that are used in giving +% character metrics: +% +% \begin{macrocode} +\list_def{W}(#1~#2){\afm_length\x_width{#1}} +\list_def{WX}(#1){\afm_length\x_width{#1}} +\list_def{WY}(#1){} +\list_def{N}(#1){\def\char_name{#1}} +\list_def{B}(#1~#2~#3~#4){ + \afm_length\bbox_llx{#1} + \afm_length\bbox_lly{#2} + \afm_length\bbox_urx{#3} + \afm_length\bbox_ury{#4} +} +\list_def{PCC}(#1~#2~#3){ + \afm_length\a_count{#2} + \afm_length\b_count{#3} + \out_lline{\string\glyphpcc{#1}{\the\a_count}{\the\b_count}} +} +% \end{macrocode} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \subsection{Converting a PL file to an MTX file} +% +% \DescribeMacro{\generalpltomtx}The macro +% \begin{quote} +% |\generalpltomtx|\marg{plfile}\marg{mtxfile}\marg{plsuffix}\relax +% \marg{opt-enc} +% \end{quote} +% reads \meta{plfile}|.|\meta{plsuffix}, interprets it as having the +% encoding specified by the file \meta{opt-enc}|.etx|, and writes the +% same metric information out to \meta{mtxfile}|.mtx|. In case +% \meta{opt-enc} is empty, the encoding will be determined using the +% |CODINGSCHEME| property of the file being read. +% \DescribeMacro{\pltomtx}The macro +% \begin{quote} +% |\pltomtx|\marg{plfile}\marg{mtxfile} +% \end{quote} +% reads \meta{plfile}|.pl|, uses the |CODINGSCHEME| property in that +% file to determine its encoding, and writes the same metric information +% out to \meta{mtxfile}|.mtx|. +% +% None of these commands can cope with |SKIP| properties in the (V)PL +% file. +% +% \begin{macro}{\generalpltomtx} +% \changes{1.902}{1999/05/01}{Command added, removed +% \cs{pltomtxgivenetx}. (LH)} +% \changes{1.910}{1999/11/01}{Made this command the standard one, +% which \cs{pltomtx} calls. (UV\&LH)} +% \changes{1.917}{2001/03/13}{Added resetting of +% \cs{setsomething_global}---assignments made here must be +% local. (LH)} +% \changes{1.923}{2002/12/03}{Changed test of fourth argument to +% instead of \cs{ifx} use \cs{if}. This is more versatile. (LH)} +% \begin{macrocode} +\def\generalpltomtx#1#2#3#4{{ + \let\setsomething_global=\x_relax + \let\setfontdimen=\pl_setfontdimen + \if _#4_ \else + \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name} + \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name} + \inputetx{#4} + \let\CODINGSCHEME=\ignore_parens + \fi + \pl_to_mtx{#1}{#2}{#3}{\string\generalpltomtx{#1}{#2}{#3}{#4}} +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pltomtx} +% \begin{macrocode} +\def\pltomtx#1#2{\generalpltomtx{#1}{#2}{pl}{}} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\pl_to_mtx} +% \changes{1.911}{1999/11/19}{\cs{edef}ing \cs{raw_font_name}. (LH)} +% The |\pl_to_mtx| macro contains all code that was common to +% |\pltomtx| and |\general|\-|pltomtx| before the former was redefined +% to a call of the latter. The structure of a call of |\pl_to_mtx| is +% \begin{quote} +% |\pl_to_mtx|\marg{plfile}\marg{mtxfile}\marg{plsuffix}\marg{call} +% \end{quote} +% \meta{call} is what should be written in the ``Created using:'' +% comment at the top of the MTX file written. +% \changes{1.921}{2002/07/27}{\cs{fromvpl} in \cs{storemapdata} does +% not have an argument. Fixed a bug that produced such an argument +% anyway. (LH)} +% \begin{macrocode} +\def\pl_to_mtx#1#2#3#4{ + \edef\raw_font_name{#1} + \open_out{\temp_prefix#2.mtx} + \out_line{\percent_char~Filename:~#2.mtx} + \out_line{\percent_char~Created~by:~tex~\jobname} + \out_line{\percent_char~Created~using:~#4} + \out_line{} + \out_line{\percent_char~This~file~contains~the~ + information~of~#1.#3~in~a~form} + \out_line{\percent_char~more~easily~read~by~TeX.~ + It~is~used~by~the~fontinst~package.} + \out_line{} + \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.} + \out_line{} + \out_line{\string\relax} + \out_line{\string\metrics} + \out_line{} + \out_line{\string\needsfontinstversion{\fontinstversion}} + \out_line{} + \lowercase{ + \record_transform{#2}{ + \string\from#3 \x_cs\ifx{from#3}\frompl {#1} \fi + }{}\iftrue + } + \out_line{} + \catcode`\(=0 \catcode`\)=9 + \let\/=\ignore_parens + \let\do_pl_glyph=\x_relax + \primitiveinput #1.#3\x_relax + \do_pl_glyph + \out_line{} + \ifisint{\percent_char boundarychar}\then + \f_count=\int{\percent_char boundarychar} + \x_cs\ifx{name-\the\f_count}\x_relax \else + \out_line{\string\setstr{rightboundary} + {\csname name-\the\f_count\endcsname} + } + \out_line{} + \fi + \fi + \out_line{\endmetrics_text} + \close_out{Metrics} +} +% \end{macrocode} +% \end{macro} +% +% To parse a |.pl| file, we first make |(| the escape character, make |)| +% ignored, then define the various PL commands as \TeX\ control sequences. +% We can ignore a parenthesis matched string by making |(| and |)| the +% group delimiters, then gobbling them up. +% +% \begin{macrocode} +\def\ignore_parens{\bgroup\catcode`(=1 \catcode`)=2 \x_relax + \expandafter\expandafter\expandafter\gobble_parens + \iftrue\expandafter{\else}\fi} +\def\gobble_parens#1{\egroup} +% \end{macrocode} +% +% \begin{macro}{\pl_real} +% \begin{macro}{\pl_realer} +% Convert a PL real to an AFM unit, assuming it contains a decimal point. +% \begin{macrocode} +\def\pl_real#1{\pl_realer(#1000)} +\def\pl_realer(#1.#2#3#4#5){#1#2#3#4} +% \end{macrocode} +% \cs{pl_real} only works if the \texttt{DESIGNUNITS} +% setting is at the default value 1. Luckily, this is what +% \package{TFtoPL} and \package{VFtoVP} use in all (V)PL files they +% create, so you can always get a (V)PL file that will work by +% converting first to TFM (+\,VF) and then back again. As of v\,1.913, +% that is also the value \package{fontinst} uses for all VPL files it +% generates, so the problem isn't particularly important. +% \end{macro}\end{macro} +% +% \begin{macro}{\pl_rounded_real} +% \changes{1.921}{2002/07/26}{Macro added and is used instead of +% \cs{pl_real}. (LH)} +% The |\pl_rounded_real| macro is like |\pl_realer| in that it converts +% a PL unit containing a decimal point to an AFM unit. The difference +% is (i) that it rounds the number rather than truncating it and (ii) +% that it stores the result in |\result| rather than expanding to it. +% Note that the actual real (character string) to convert must be +% followed by at least four zeros for the conversion to work +% correctly in all cases. +% \begin{macrocode} +\def\pl_rounded_real(#1.#2#3#4#5){ + \global\result=#1#2#3#4\relax + \ifnum \first_char#5= >4 + \global\advance \result + \if - \first_char#1= \m@ne \else \@ne \fi + \fi +} +% \end{macrocode} +% \end{macro} +% +% +% \begin{macro}{\pl_int} +% Convert a PL int to a \TeX{} int, assuming it's prefixed +% by |C|, |D|, |O|, or |H|. +% \begin{macrocode} +\def\pl_int#1#2{ + \ifx#1C `#2 + \else\ifx#1D #2 + \else\ifx#1O '#2 + \else\ifx#1H "#2 + \else -1\errmessage{Unknown~PL~number~prefix~`#1'} + \fi\fi\fi\fi +} +% \end{macrocode} +% \end{macro} +% +% Many of the PL commands are ignored, and I'm assuming the |R|s are in +% the places \texttt{tftopl} puts them, which is a bit naughty of me. +% +% \begin{PLproperty}{FAMILY} +% \begin{PLproperty}{FACE} +% \begin{PLproperty}{CHECKSUM} +% \begin{PLproperty}{HEADER} +% \begin{PLproperty}{SEVENBITSAFEFLAG} +% \begin{macrocode} +\let\FAMILY=\ignore_parens +\let\FACE=\ignore_parens +\let\CHECKSUM=\ignore_parens +\def\HEADER~#1~#2~#3~#4~{} +\def\SEVENBITSAFEFLAG~#1~{} +% \end{macrocode} +% \end{PLproperty}\end{PLproperty}\end{PLproperty}\end{PLproperty} +% \end{PLproperty} +% +% \begin{PLproperty}{COMMENT} +% \begin{PLproperty}{LIG} +% \begin{PLproperty}{NEXTLARGER} +% \begin{PLproperty}{VARCHAR} +% \begin{macrocode} +\let\COMMENT=\ignore_parens +\let\LIG=\ignore_parens +\let\NEXTLARGER=\ignore_parens +\let\VARCHAR=\ignore_parens +% \end{macrocode} +% \end{PLproperty}\end{PLproperty}\end{PLproperty}\end{PLproperty} +% +% +% \begin{PLproperty}{VTITLE} +% \begin{PLproperty}{MAPFONT} +% \begin{PLproperty}{MAP} +% \begin{flushleft} +% ^^A Flushed left since the paragraph is so hard to break +% ^^A correctly. +% \changes{1.900}{1998/12/04}{VPL-specific properties added to +% those which are ignored by \cs{pltomtx}. (LH)} +% The properties which are unique for VPL files---|VTITLE|, +% |MAPFONT|, |MAP|, |FONTNAME|, |FONTAREA|, |FONTCHECKSUM|, +% |FONTAT|, |FONTDSIZE|, |SELECTFONT|, |SETCHAR|, |SETRULE|, +% |MOVERIGHT|, |MOVELEFT|, |MOVEUP|, |MOVEDOWN|, |PUSH|, |POP|, +% |SPECIAL|, and |SPECIALHEX|---should also be ignored, but it is +% actually sufficient to ignore the first three since the others +% are only allowed inside |MAP| or |MAPFONT| property lists. +% \end{flushleft} +% +% \begin{macrocode} +\let\VTITLE=\ignore_parens +\let\MAPFONT=\ignore_parens +\let\MAP=\ignore_parens +% \end{macrocode} +% \end{PLproperty}\end{PLproperty}\end{PLproperty} +% +% +% \begin{PLproperty}{CODINGSCHEME} +% \begin{macro}{\CODINGSCHEME_cont} +% When we reach a |CODINGSCHEME| instruction, we read the coding string, +% and read in the corresponding \meta{encoding}|.etx| file. +% +% The corresponding \meta{encoding} is specified by |\declareencoding| +% statements (see below). Each |\declare_encoding| defines a macro +% |\enc-|\meta{codingscheme} which expands to \meta{encoding}. +% +% If the PL file is converted using the |\generalpltomtx| command with +% a nonempty \meta{opt-enc} argument then the |CODINGSCHEME| instruction +% is ignored since an encoding file has already been read in. +% +% \begin{macrocode} +\def\CODINGSCHEME{\bgroup\catcode`\)=12\x_relax\CODINGSCHEME_cont} +\def\CODINGSCHEME_cont#1){ + \egroup + \if_undefined{enc-#1}\then + \errhelp{The~encoding~for~`#1'~has~not~been~declared.^^J + You~should~declare~it~with~ + \string\declareencoding{#1}{ETXFILE}.^^J + Press~<RETURN>~to~carry~on~with~fingers~crossed,^^J + or~X~<RETURN>~to~exit.} + \errmessage{Undeclared~encoding~`#1'} + \else + \def\do_slot{\x_cs\let{name-\the\slot_number}\slot_name} + \def\do_boundary{\x_cs\let{name-BOUNDARYCHAR}\slot_name} + \catcode`\(=12 \catcode`\)=12 + \x_cs\inputetx{enc-#1}\x_relax + \catcode`\(=0 \catcode`\)=9 + \fi +} +% \end{macrocode} +% \end{macro}\end{PLproperty} +% +% \begin{PLproperty}{DESIGNSIZE} +% The |DESIGNSIZE| is needed because the |FONTDSIZE| specified in a +% |MAPFONT| property list has to be the same as the |DESIGNSIZE| of +% the corresponding base font. +% \begin{macrocode} +\def\DESIGNSIZE~#1~#2~{ + \a_dimen=#2pt + \out_line{\string\setdim{designsize}{\the\a_dimen}} +} +% \end{macrocode} +% \end{PLproperty} +% +% \begin{PLproperty}{DESIGNUNITS} +% \changes{1.905}{1999/06/30}{Error message added. (LH)} +% \changes{1.912}{2000/02/20}{Store designunits value in +% \cs{b_dimen} rather than \cs{a_dimen}. \cs{a_dimen} holds the +% design size throughout PL-to-MTX. (LH)} +% The PL to MTX converter assumes that the (V)PL files to convert +% look like the ones created by \texttt{TFtoPL}\slash\texttt{VFtoVP}, +% and the interpretation of the \texttt{DESIGNUNITS} property is one +% thing specifically affected by this. The TFM file format does not +% store the \texttt{DESIGNUNITS} value used, so the two above +% programs always generate (V)PL files with the default setting of +% design unit equal to the design size. Hence any occurence of the +% \texttt{DESIGNUNITS} property with a nondefault value is an +% indication of an error. +% +% The incorrect metrics can be corrected by scaling by a suitable +% amount (1000 divided by the \texttt{designunits} dimen), but it is +% much simpler to convert the PL to a TFM and then convert it back, +% that will also fix the units. +% +% \begin{macrocode} +\def\DESIGNUNITS~#1~#2~{ + \b_dimen=#2pt\x_relax + \ifdim 1pt=\b_dimen \else + \fontinsterror{PL-to-MTX}{Nondefault~unit~used~in~PL~file} + {You~may~continue,~but~the~metrics~for~this~font~will~be~wrong.} + \fi + \out_line{\string\setdim{designunits}{\the\b_dimen}} +} +% \end{macrocode} +% \end{PLproperty} +% +% \begin{PLproperty}{BOUNDARYCHAR} +% \begin{macrocode} +\def\BOUNDARYCHAR~#1~#2~{ + \x_setint{\percent_char boundarychar}{\pl_int{#1}{#2}} +} +% \end{macrocode} +% \end{PLproperty} +% +% \changes{1.917}{2001/03/16}{Rewrote the fontdimen part of the +% (V)PL-to-MTX converter so that the ETX can specify the +% fontdimens. (LH)} +% +% Declared fontdimens are converted to |\setint| commands in the MTX +% file. A fontdimen declaration for fontdimen $n$ is stored in the +% control sequence \describecsfamily{fdimen-\meta{n}}|\fdimen-|$n$; if +% this control sequence is undefined then the fontdimen is not declared +% and if it is set then it is a macro which expands to the name of the +% corresponding integer variable. +% +% \begin{macro}{\pl_setfontdimen} +% Fontdimens are declared by the |\pl_setfontdimen| macro, which is a +% definition of |\setfontdimen| that is used during (V)PL-to-MTX +% conversion. +% \begin{macrocode} +\def\pl_setfontdimen#1#2{\x_cs\def{fdimen-#1}{#2}} +% \end{macrocode} +% \end{macro} +% +% \begin{PLproperty}{PARAMETER} +% The |PARAMETER| property is the generic specifier of fontdimens in +% (V)PL files. It takes two arguments: the fontdimen number (integer) +% and value (real). +% \begin{macrocode} +\def\PARAMETER~#1~#2~R~#3~{ + \f_count=\pl_int{#1}{#2}\x_relax + \if_defined{fdimen-\the\f_count}\then + \pl_rounded_real(#3 0000) + \out_line{\string\setint{\csname fdimen-\the\f_count\endcsname} + {\the\result}} + \fi +} +% \end{macrocode} +% \end{PLproperty} +% +% \begin{PLproperty}{FONTDIMEN} +% No special processing is required for the |FONTDIMEN| property. +% \begin{macrocode} +\let\FONTDIMEN=\x_relax +% \end{macrocode} +% \end{PLproperty} +% +% \begin{PLproperty}{SLANT} +% \begin{PLproperty}{SPACE} +% \begin{PLproperty}{STRETCH} +% \begin{PLproperty}{SHRINK} +% \begin{PLproperty}{XHEIGHT} +% \begin{PLproperty}{QUAD} +% \begin{PLproperty}{EXTRASPACE} +% The properties for the seven mandatory fontdimens are converted +% to the corresponding |PARAMETER| properties but their meanings are +% predeclared. The effect of these predeclarations is that even ETX +% files that don't use |\setfontdimen| to set the fontdimens have +% these fontdimens converted to |\setint|s. +% +% A scan shows that the current (2001/03/17) MTX and ETX files aren't +% using the integers \texttt{stretchword}, \texttt{shrinkword}, +% \texttt{quad}, and \texttt{extraspace}. They probably should. +% \begin{macrocode} +\def\SLANT{\PARAMETER D~1~} +\pl_setfontdimen{1}{italicslant} +\def\SPACE{\PARAMETER D~2~} +\pl_setfontdimen{2}{interword} +\def\STRETCH{\PARAMETER D~3~} +\pl_setfontdimen{3}{stretchword} +\def\SHRINK{\PARAMETER D~4~} +\pl_setfontdimen{4}{shrinkword} +\def\XHEIGHT{\PARAMETER D~5~} +\pl_setfontdimen{5}{xheight} +\def\QUAD{\PARAMETER D~6~} +\pl_setfontdimen{6}{quad} +\def\EXTRASPACE{\PARAMETER D~7~} +\pl_setfontdimen{7}{extraspace} +% \end{macrocode} +% \end{PLproperty}\end{PLproperty}\end{PLproperty}\end{PLproperty} +% \end{PLproperty}\end{PLproperty}\end{PLproperty} +% +% \begin{numPLproperty}{NUM}{1,2,3} +% \begin{numPLproperty}{DENOM}{1,2} +% The |NUM|$*$ and |DENOM|$*$ properties are for fontdimens 8--10 +% and 11--12. They have to do with positioning numerator and +% denominator in fractions. +% \begin{macrocode} +\def\NUM#1~#2~#3~{ + \ifcase #1\or + \PARAMETER D~8~#2~#3~ + \or + \PARAMETER D~9~#2~#3~ + \or + \PARAMETER D~10~#2~#3~ + \fi +} +\def\DENOM#1~#2~#3~{ + \ifcase #1\or + \PARAMETER D~11~#2~#3~ + \or + \PARAMETER D~12~#2~#3~ + \fi +} +% \end{macrocode} +% \end{numPLproperty}\end{numPLproperty} +% +% \begin{numPLproperty}{SUP}{1,2,3} +% \begin{numPLproperty}{SUB}{1,2} +% The |SUP|$*$ and |SUB|$*$ properties are for fontdimens 13--15 +% and 16--17. They have to do with positioning superscripts and +% subscripts. +% \begin{macrocode} +\def\SUP#1~#2~#3~{ + \ifcase #1\or + \PARAMETER D~13~#2~#3~ + \or + \PARAMETER D~14~#2~#3~ + \or + \PARAMETER D~15~#2~#3~ + \fi +} +\def\SUB#1~#2~#3~{ + \ifcase #1\or + \PARAMETER D~16~#2~#3~ + \or + \PARAMETER D~17~#2~#3~ + \fi +} +% \end{macrocode} +% \end{numPLproperty}\end{numPLproperty} +% +% \begin{PLproperty}{SUPDROP} +% \begin{PLproperty}{SUBDROP} +% \begin{PLproperty}{AXISHEIGHT} +% These are fontdimens 18, 19, and 22. +% \begin{macrocode} +\def\SUPDROP{\PARAMETER D~18~} +\def\SUBDROP{\PARAMETER D~19~} +\def\AXISHEIGHT{\PARAMETER D~22~} +% \end{macrocode} +% \end{PLproperty}\end{PLproperty}\end{PLproperty} +% +% \begin{numPLproperty}{DELIM}{1,2} +% The |DELIM|$*$ fondimens have number 20 and 21. They have to do with +% the size of delimiters put around a generalised fraction. +% \begin{macrocode} +\def\DELIM#1~#2~#3~{ + \ifcase #1\or + \PARAMETER D~20~#2~#3~ + \or + \PARAMETER D~21~#2~#3~ + \fi +} +% \end{macrocode} +% \end{numPLproperty} +% +% \begin{PLproperty}{DEFAULTRULETHICKNESS} +% \begin{numPLproperty}{BIGOPSPACING}{1,2,3,4,5} +% The fontdimen properties that are special for math extension fonts +% are |DEFAULT|\-|RULE|\-|THICKNESS| and the various +% |BIG|\-|OP|\-|SPACING|$*$. +% \begin{macrocode} +\def\DEFAULTRULETHICKNESS{\PARAMETER D~8~} +\def\BIGOPSPACING#1~#2~#3~{ + \ifcase #1\or + \PARAMETER D~9~#2~#3~ + \or + \PARAMETER D~10~#2~#3~ + \or + \PARAMETER D~11~#2~#3~ + \or + \PARAMETER D~12~#2~#3~ + \or + \PARAMETER D~13~#2~#3~ + \fi +} +% \end{macrocode} +% This is the old definition of |\DEFAULTRULETHICKNESS| for historical +% references (since its behaviour has changed). +% \begin{macrocode} +% \def\DEFAULTRULETHICKNESS~R~#1~{ +% \out_line{\string\setint{underlinethickness}{\pl_real{#1}}} +% } +% \end{macrocode} +% \end{numPLproperty}\end{PLproperty} +% +% +% \begin{PLproperty}{LABEL} +% \begin{macro}{\LABEL_slot} +% \begin{macro}{\LABEL_boundarychar} +% \begin{macro}{\do_if_defined} +% The most complicated part of the processing of the |LIGTABLE| +% property list is that it has to keep track of which glyphs the +% current ligature\slash kerning program applies to. This stored as +% a |\do|\marg{glyph} list in |\a_macro| and building this list +% is the job of the |LABEL| property. +% +% It is assumed that |\do| is |\never_do| whenever some element is +% added to |\a_macro|. +% \begin{macrocode} +\def\LABEL~#1{\ifx #1B + \expandafter\LABEL_boundarychar + \else + \expandafter\LABEL_slot \expandafter#1 + \fi +} +\def\LABEL_slot #1~#2~{ + \f_count=\pl_int{#1}{#2} + \edef\a_macro{\a_macro + \x_cs\do_if_defined{name-\the\f_count} + } +} +\def\LABEL_boundarychar OUNDARYCHAR{ + \edef\a_macro{\a_macro + \x_cs\do_if_defined{name-BOUNDARYCHAR} + } +} +\def\do_if_defined#1{\ifx #1\x_relax \else \do{#1} \fi} +% \end{macrocode} +% \end{macro}\end{macro}\end{macro}\end{PLproperty} +% +% +% \begin{PLproperty}{LIGTABLE} +% \begin{PLproperty}{STOP} +% \begin{PLproperty}{SKIP} +% The |LIGTABLE|, |STOP|, and |SKIP| properties are the remaining +% properties involved in managing the |\a_macro| list. |SKIP| +% properties are \emph{not} processed. +% \begin{macrocode} +\def\LIGTABLE{\let\do=\never_do\let\a_macro\empty_command} +\def\STOP{\let\a_macro\empty_command} +\def\SKIP~#1~#2~{\immediate\write16{Warning:~SKIP~instruction~ignored.}} +% \end{macrocode} +% \end{PLproperty}\end{PLproperty}\end{PLproperty} +% +% \begin{PLproperty}{KRN} +% \begin{macro}{\write_pl_krn} +% |KRN| properties are converted to |\setkern| instructions. +% \begin{macrocode} +\def\KRN~#1~#2~R~#3~{ + \pl_rounded_real(#3 0000) + \edef\do{\noexpand\write_pl_krn{\pl_int{#1}{#2}}{\the\result}} + \a_macro + \let\do=\never_do +} +\def\write_pl_krn#1#2#3{ + \f_count=#1\x_relax + \x_cs\ifx{name-\the\f_count}\x_relax \else + \out_line{\string\setkern{#3} + {\csname name-\the\f_count\endcsname}{#2} + } + \fi +} +% \end{macrocode} +% \end{macro}\end{PLproperty} +% +% \begin{PLproperty}{CHARACTER} +% \begin{PLproperty}{CHARWD} +% \begin{PLproperty}{CHARHT} +% \begin{PLproperty}{CHARDP} +% \begin{PLproperty}{CHARIC} +% The character metrics that are processed are |CHARWD|, |CHARHT|, +% |CHARDP|, and |CHARIC|. The |CHARACTER| property takes care of +% writing the information to the MTX file, but note that each new +% |CHARACTER| property writes the information from the preceeding +% |CHARACTER| property. +% \begin{macrocode} +\def\CHARWD~R~#1~{\pl_rounded_real(#1 0000) \b_count=\result} +\def\CHARHT~R~#1~{\pl_rounded_real(#1 0000) \c_count=\result} +\def\CHARDP~R~#1~{\pl_rounded_real(#1 0000) \d_count=\result} +\def\CHARIC~R~#1~{\pl_rounded_real(#1 0000) \e_count=\result} +\def\CHARACTER~#1~#2~{ + \do_pl_glyph + \a_count=\pl_int{#1}{#2} + \b_count=0 + \c_count=0 + \d_count=0 + \e_count=0 + \let\do_pl_glyph=\write_pl_glyph +} +% \end{macrocode} +% \end{PLproperty}\end{PLproperty}\end{PLproperty}\end{PLproperty} +% \end{PLproperty} +% +% \begin{macro}{\write_pl_glyph} +% The |\write_pl_glyph| actually writes the information contained in +% a |CHARACTER| property list to the MTX file as a |\setrawglyph| +% command. +% \begin{macrocode} +\def\write_pl_glyph{ + \x_cs\ifx{name-\the\a_count}\x_relax\else + \out_line{\string\setrawglyph + {\csname~name-\the\a_count\endcsname} + {\raw_font_name} + {\the\a_dimen} + {\the\a_count} + {\the\b_count} + {\the\c_count} + {\the\d_count} + {\the\e_count}} + \fi + } +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Converting an MTX file to a PL file} +% +% \DescribeMacro{\mtxtopl} +% The macro +% \begin{quote} +% |\mtxtopl|\marg{mtxfile}\marg{plfile} +% \end{quote} +% writes a font from the |\setrawglyph| instructions in \meta{mtxfile} +% to \meta{plfile}. It ignores any font dimensions and kerning, so the +% resulting font is only useful for generating virtual fonts from. +% (This macro is called by |\transformfont|.) +% +% \begin{macro}{\mtxtopl} +% \changes{1.911}{1999/11/19}{Added `ligless' to one of the comment +% lines. (LH) Clarification requested by Walter Schmidt.} +% \changes{1.917}{2001/03/13}{Added resetting of +% \cs{setsomething_global}---assignments made here must be +% local. (LH)} +% \begin{macrocode} +\def\mtxtopl#1#2{{ + \let\setsomething_global=\x_relax + \open_out{#2.pl} + \top_of_pl_hook + \out_line{(COMMENT~raw~font~#2~created~by~fontinst~ + v\fontinstversion)} + \out_line{} + \out_line{(COMMENT~Filename:~#2.pl)} + \out_line{(COMMENT~Created~by:~tex~\jobname)} + \out_line{(COMMENT~Created~using:~\string\mtxtopl{#1}{#2})} + \out_line{} + \out_line{(COMMENT~This~file~can~be~turned~into~ + a~ligless~TeX~font~with)} + \out_line{(COMMENT~pltotfm~#2.pl~#2.tfm)} + \out_line{} + \out_line{(COMMENT~THIS~FILE~CAN~THEN~BE~DELETED.)} + \out_line{} + \out_line{(DESIGNSIZE~R~10.0)} + \out_line{} + \let\setglyph=\iffalse + \let\endsetglyph=\fi + \let\setkern=\gobble_three + \let\setscaledrawglyph=\first_pl_raw_glyph + \def\setscalednotglyph##1##2##3##4##5##6##7##8##9{} + \inputmtx{#1} + \out_line{} + \out_line{(COMMENT~END~OF~FILE~#2.pl)} + \close_out{Raw~font} +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\first_pl_raw_glyph} +% The |\first_pl_raw_glyph| writes the \texttt{DESIGNUNITS} property +% for the font when the first |\setscaledrawglyph| is encountered. +% This is to undo the scaling that has already been applied to the +% metrics, so that the metrics will match the actual font. +% \begin{macrocode} +\def\first_pl_raw_glyph#1#2#3#4{ + \out_line{(DESIGNUNITS~R~\make_factor{#4})} + \let\setscaledrawglyph=\pl_raw_glyph + \pl_raw_glyph{#1}{#2}{#3}{#4} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\pl_raw_glyph} +% \begin{macrocode} +\def\pl_raw_glyph#1#2#3#4#5#6#7#8#9{ + \out_line{(CHARACTER~D~\number#5~\space(COMMENT~#1)} + \out_lline{(CHARWD~R~\make_factor{#6})} + \out_lline{(CHARHT~R~\make_factor{#7})} + \out_lline{(CHARDP~R~\make_factor{#8})} + \out_lline{(CHARIC~R~\make_factor{#9})} + \out_lline{)} +} +% \end{macrocode} +% \end{macro} +% +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \section{Font transformations} +% \label{Sec:Font.trans} +% \changes{1.902}{1999/05/01}{Moved Section \thesection\space to +% \texttt{ficonv.dtx}. (LH)} +% +% \subsection{Transformable metric files} +% \label{Ssec:TransMTX} +% +% \changes{1.901}{1999/02/28}{Definition of transformable metric file +% added. (LH)} +% \changes{1.913}{2000/03/10}{Definition of transformable metric file +% changed to include the \cs{setscaledrawglyph} and +% \cs{setscalednotglyph} commands. (LH)} +% \changes{1.915}{2000/09/09}{Added description of \cs{aliased} macro +% to the definition of transformable metric files. (LH)} +% A \emph{transformable metric file} is a metric file +% which complies with certain restrictions in its syntax. The only +% metric commands allowed are +% \begin{isyntax} +% |\setscaledrawglyph|\marg{glyph}\marg{font}\marg{size}^^A +% \marg{scale}\marg{slot}\marg{width}\penalty0 +% \marg{height}\penalty0\marg{depth}\penalty0\marg{italic}\\ +% |\setrawglyph|\marg{glyph}\marg{font}\marg{size}\marg{slot}^^A +% \marg{width}\marg{height}\penalty0\marg{depth}\penalty0 +% \marg{italic}\\ +% |\setscalednotglyph|\marg{glyph}\marg{font}\marg{size}^^A +% \marg{scale}\marg{slot}\marg{width}\penalty0 +% \marg{height}\penalty0\marg{depth}\penalty0\marg{italic}\\ +% |\setnotglyph|\marg{glyph}\marg{font}\marg{size}\marg{slot}^^A +% \marg{width}\marg{height}\penalty0\marg{depth}\penalty0 +% \marg{italic}\\ +% |\setkern|\marg{glyph1}\marg{glyph2}\marg{amount}\\ +% |\setglyph|\marg{glyph} \meta{glyph commands} |\endsetglyph| +% \end{isyntax} +% where \meta{glyph}, \meta{glyph1}, \meta{glyph2}, and \meta{font} are +% strings without any variable references (no |\str| or |\strint| are +% allowed), \meta{scale}, \meta{slot}, \meta{width}, \meta{height}, +% \meta{depth}, \meta{italic}, and \meta{amount} are \TeX\ numbers, and +% \meta{size} is a \TeX\ dimen. (More accurately, all dimens in a +% transformable metric file should be on the form \meta{optional +% signs}\penalty0 \meta{decimal constant}\penalty0 \meta{physical unit}, +% but that's at the ``dangerous bend'' level.) The \meta{glyph}s may be +% of the form +% \begin{quote} +% |\aliased|\marg{font's name}\marg{alias name} +% \end{quote} +% Such \meta{glyph}s are interpreted as \meta{alias name} for all +% purposes except reencoding, when they are interpreted as \meta{font's +% name}. \meta{glyph}s of this form are furthermore copied as they are +% to MTX files created by |\transform|\-|font| (|\mtxtomtx|). +% +% The only \meta{glyph commands} allowed are +% \begin{quote} +% |\samesize|\marg{glyph}\\ +% |\glyphpcc|\marg{glyph}\marg{xoffset}\marg{yoffset} +% \end{quote} +% where \meta{glyph} is as above, and \meta{xoffset} and \meta{yoffset} +% are \TeX\ numbers. +% +% The only general commands allowed are +% \begin{quote} +% |\needsfontinstversion|\marg{version}\\ +% |\setint|\marg{name}\marg{number}\\ +% |\setdim|\marg{name}\marg{dimen}\\ +% |\setstr|\marg{name}\marg{string}\\ +% |\storemapdata|\marg{font}\marg{source}\marg{transformations} +% \end{quote} +% where \meta{name} and \meta{string} are strings without variable +% references, \meta{number} is a \TeX\ number, and \meta{dimen} is a +% \TeX\ dimen. The arguments of |\needs|\-|fontinst|\-|version| and +% |\store|\-|map|\-|data| are as usual, but these commands do not get +% copied in a font transformation. +% +% The metric files produced by |\afmtomtx| and |\generalpltomtx| are +% meant to be transformable. If they are not then there is a bug +% somewhere. +% +% The name of the integer in |\setint| commands is interpreted. This +% name is used to determine how the number should be transformed, see +% the implementation of |\mtxtomtx_setint| below. +% +% +% \subsection{Making font transformations} +% +% \changes{1.911}{1999/11/19}{Recording of transformations moved to the +% macros that actually write the MTX files. (LH)} +% \changes{1.911}{1999/11/19}{Flag for that source font wasn't found +% changed to \texttt{afm-name}. \texttt{transform-source} string +% completely removed. (LH)} +% \changes{1.913}{2000/03/11}{New implementation of \cs{scalefont} and +% \cs{yscalefont}, using the new \cs{setscaledrawglyph} and +% \cs{setscalednotglyph} commands. (LH)} +% \changes{1.913}{2000/03/12}{Using \cs{slots-}\meta{glyph} control +% sequences for storing encoding positions of glyphs in reencoded +% fonts. (LH)} +% +% \DescribeMacro{\transformfont} +% The macro: +% \begin{quote} +% |\transformfont|\marg{font-name}\marg{transformed font} +% \end{quote} +% transforms the metrics of a raw font. As far as \TeX\ is concerned, +% \meta{font-name} will be a new font. Actually doing the +% transformation and providing the transformed font (as opposed to the +% metrics of the transformed font) is for most transforms up to some +% other piece of software, in most cases the DVI driver, but +% \package{fontinst} will handle isotropic scaling itself. +% +% The easiest way to find out which transformations need to be carried +% out is to generate a map file for the \texttt{debug} ``driver'' (see +% Section~\ref{Sec:Mapfiles}). Of course, if \package{fontinst} can +% generate a mapfile for the target driver then you probably don't need +% to find out which transformations were necessary\,\textellipsis +% \spacefactor=\sfcode`\.\space\space +% In any case, the arguments of |\storemapdata| in the MTX file +% generated will tell which transformations of this |\transformfont| +% command that must be performed by some other software. +% +% \DescribeMacro{\fromafm} +% \DescribeMacro{\frommtx} +% \DescribeMacro{\frompl} +% \DescribeMacro{\scalefont} +% \DescribeMacro{\xscalefont} +% \DescribeMacro{\yscalefont} +% \DescribeMacro{\slantfont} +% \DescribeMacro{\reencodefont} +% The \meta{transformed font} commands are: +% \begin{quote} +% |\fromafm|\marg{AFM file}\\ +% |\frompl|\marg{PL file}\\ +% |\fromplgivenetx|\marg{PL file}\marg{etx}\\ +% |\frommtx|\marg{MTX file}\\ +% |\fromany|\marg{file}\\ +% |\scalefont|\marg{integer expression}\marg{transformed font}\\ +% |\xscalefont|\marg{integer expression}\marg{transformed font}\\ +% |\yscalefont|\marg{integer expression}\marg{transformed font}\\ +% |\slantfont|\marg{integer expression}\marg{transformed font}\\ +% |\reencodefont|\marg{etx}\marg{transformed font} +% \end{quote} +% +% Each |\transformfont| command generates an |.mtx| file for +% \meta{font-name} and a corresponding raw |.pl| file, which is written +% out by |\mtxtopl|. +% +% Each |\fromafm|, |\frompl|, or |\fromplgivenetx| command also generates +% an |.mtx| file for the source font, which is written out by |\afmtomtx| +% or |\generalpltomtx|. In addition, |\fromafm| also uses |\mtxtopl| +% to generate a corresponding raw |.pl| file. +% +% |\fromany| reads an MTX, PL, AFM, or VPL file depending on what it can +% find. It tries them in the order first MTX, then PL, then AFM, and +% last VPL. +% +% \begin{macro}{\transformfont} +% \changes{1.912}{2000/01/15}{Added local resetting of +% \cs{setsomething_global} to \cs{relax}, since \cs{transformfont} +% assumes such assignments are local. (LH)} +% \begin{macrocode} +\def\transformfont#1#2{{ + \let\setsomething_global=\x_relax + \unsetstr{afm-name} + \unsetstr{etx-name} + \x_resetint{x-scale}{\one_thousand} + \x_resetint{y-scale}{\one_thousand} + \x_resetint{slant-scale}{0} + #2 +% \end{macrocode} +% \changes{1.903}{1999/06/01}{Added behaviour for the case source file +% not found. (LH)} +% \changes{1.921}{2002/07/31}{Corrected an error message that tried +% to use a variable that wasn't set! (LH)} +% \begin{macrocode} + \ifisstr{afm-name}\then + \mtxtomtx{\str{afm-name}}{#1} + \mtxtopl{#1}{#1} + \else + \fontinsterror{Transformfont}{ + Failed~to~make~transformed~font~#1;\messagebreak + source~font~metrics~file~not~found + }\error_help_a + \fi +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\fromafm} +% \changes{1.904}{1999/06/17}{Added call of \cs{record_transform}. (LH)} +% \changes{1.911}{1999/11/19}{Added test for file existence. (LH)} +% \begin{macrocode} +\def\fromafm#1{ + \if_file_exists{#1.afm}\then + \x_setstr{afm-name}{#1} + \afmtomtx{#1}{#1} + \mtxtopl{#1}{#1} + \fi +} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\frommtx} +% \changes{1.911}{1999/11/19}{Added test for file existence. (LH)} +% \begin{macrocode} +\def\frommtx#1{ + \if_file_exists{#1.mtx}\then \x_setstr{afm-name}{#1} \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\frompl} +% \changes{1.904}{1999/06/17}{Added call of \cs{record_transform}. (LH)} +% \changes{1.911}{1999/11/19}{Added test for file existence. (LH)} +% \begin{macro}{\fromplgivenetx} +% \changes{1.902}{1999/05/02}{Command added. (LH)} +% \changes{1.904}{1999/06/17}{Added call of \cs{record_transform}. (LH)} +% \changes{1.911}{1999/11/19}{Added test for file existence. (LH)} +% \begin{macrocode} +\def\frompl#1{ + \if_file_exists{#1.pl}\then + \x_setstr{afm-name}{#1} + \generalpltomtx{#1}{#1}{pl}{} + \fi +} +% \end{macrocode} +% \begin{macrocode} +\def\fromplgivenetx#1#2{ + \if_file_exists{#1.pl}\then + \x_setstr{afm-name}{#1} + \generalpltomtx{#1}{#1}{pl}{#2} + \fi +} +% \end{macrocode} +% \end{macro} \end{macro} +% +% \multchanges{\cs{fromvpl}\cs{fromvplgivenetx}}{1.902}{1999/05/02} +% {Commands added. (LH)} +% \multchanges{\cs{fromvpl}\cs{fromvplgivenetx}}{1.904}{1999/06/16} +% {Commands removed. (LH)} +% Regarding \cs{fromvpl} and \cs{fromvplgivenetx}: I realized that +% there isn't any point in reading metrics for a font that is to be +% transformed from a VPL file, since no driver I know of can transform +% virtual fonts. If someone has a problem with this then I suppose he +% or she should send word about it. /LH +% +% +% \begin{macro}{\fromany} +% \changes{1.903}{1999/05/20}{Command added. (LH) Based on a +% suggestion by Vladimir Volovich.} +% \changes{1.903}{1999/06/01}{Added behaviour for AFM not found case. +% (LH)} +% \changes{1.904}{1999/06/16}{Added search for VPL file and calls to +% \cs{record_transform}. (LH)} +% \changes{1.923}{2002/12/03}{Added \cs{pl_encoding}. (LH)} +% \changes{1.926}{2003/07/10}{Removed \cs{pl_encoding}; it is better +% to provide that functionality in a separate macro. (LH)} +% \changes{1.926}{2003/07/10}{Has to reset the \texttt{afm-name} +% string, since \cs{input_mtx_file} now uses the value. (LH)} +% The |\fromany| transformed font command searches for font metrics +% for \#1 by looking for, in turn, the files \#1|.mtx|, \#1|.pl|, +% \#1|.afm|, and \#1|.vpl|. If an MTX file doesn't exist, it is +% generated, and if the MTX is generated from an AFM then a +% corresponding (non-ligful) PL file is generated as well. |\fromany| +% also sets the fontinst string \texttt{afm-name} according +% to what kind of font it found. If none of the fonts existed then +% |afm-name| is unset. +% \begin{macrocode} +\def\fromany#1{ + \x_cs\edef{s-afm-name}{#1} + \if_file_exists{#1.mtx}\then\else +% \end{macrocode} +% +% \changes{1.6}{1997/01/15}{Search order changed to PL before AFM. +% (SPQR) The code wasn't in \cs{fromany} back then, though.} +% 1997/01/15 SPQR changed the below search order to |.pl| before |.afm| +% because of the |cmr*.afm| files found in the |TEXMF|\slash +% |fonts|\slash|afm| hierarchy. +% \begin{macrocode} + \if_file_exists{#1.pl}\then + \generalpltomtx{#1}{#1}{pl}{} + \else + \if_file_exists{#1.afm}\then + \afmtomtx{#1}{#1} + \mtxtopl{#1}{#1} + \else + \if_file_exists{#1.vpl}\then + \generalpltomtx{#1}{#1}{vpl}{} + \else + \unsetstr{afm-name} + \fi\fi\fi\fi +} +% \end{macrocode} +% \end{macro} +% +% +% \subsubsection*{The mathematical basis for the metric font transformations} +% +% Mathematically, all the metric font transformations (|\scale|\-|font|, +% |\xscale|\-|font|, |\yscale|\-|font|, and |\slant|\-|font|) are linear +% mappings of the real plane onto itself. All quantities in a +% transformable metric file are interpreted as being determined by some +% point in this plane and hence their transformation depends on how that +% point would be moved by the metric font transformations performed. +% This is usually simpler than it sounds, since all quantities except +% |italicslant| are interpreted as either the $x$- or the $y$-coordinate +% of some point. |italicslant| is interpreted as the quotient +% $\frac{x}{y}$ for a point. +% +% The best way to describe a linear mapping of the real plane to itself +% is by a \(2 \times 2\) matrix whose components are real numbers. Since +% true real numbers are not available in \TeX, integers are used instead, +% with the convention that they are in units of thousandths. In a +% concrete form this means that $0$ represents $0$, $500$ represents +% $\frac{1}{2}$, $1000$ represents $1$, etc. This works just as for the +% scaling factors used in |\scale|. It also means that the matrix +% $$ +% \left(\begin{array}{cc} 1000 & 0 \\ 0 & 1000 \end{array}\right) +% $$ +% represents the identity mapping (the mapping taking everything to +% itself). +% +% Thinking of points as column vectors (\(2 \times 1\) matrices) with +% the $x$-coordinate in the first component and the $y$-coordinate in +% the second, the respective elementary metric font transformations +% correspond to the following matrices: +% \begin{eqnarray*} +% \mbox{\cs{scalefont}\marg{n}} & \mbox{is} & +% \left( \begin{array}{cc} +% \mbox{\meta{n}}& 0 \\ +% 0 & \mbox{\meta{n}} +% \end{array} \right) \\ +% \mbox{\cs{xscalefont}\marg{n}} & \mbox{is} & +% \left( \begin{array}{cc} +% \mbox{\meta{n}}& 0 \\ +% 0 & 1000 +% \end{array} \right) \\ +% \mbox{\cs{yscalefont}\marg{n}} & \mbox{is} & +% \left( \begin{array}{cc} +% 1000 & 0 \\ +% 0 & \mbox{\meta{n}} +% \end{array} \right) \\ +% \mbox{\cs{slantfont}\marg{n}} & \mbox{is} & +% \left( \begin{array}{cc} +% 1000 & \mbox{\meta{n}} \\ +% 0 & 1000 +% \end{array} \right) +% \end{eqnarray*} +% Since all these matrices are upper triangular, all products of such +% matrices (corresponding to compositions of the linear mappings) will be +% upper triangular as well. It is therefore unnecessary to store the +% subdiagonal component anywhere (it is always zero), and hence +% \package{fontinst} represents an arbitrary metric transform by the +% matrix +% $$ +% \left( \begin{array}{cc} +% \mbox{\texttt{x-scale}} & \mbox{\texttt{slant-scale}} \\ +% 0 & \mbox{\texttt{y-scale}} +% \end{array} \right) +% $$ +% where \texttt{x-scale}, \texttt{y-scale}, and \texttt{slant-scale} +% are fontinst integers. +% +% The reason there is a representation of arbitrary metric transforms +% is that all the elementary metric transforms listed in the second +% argument of |\transformfont| are concatenated before the actual font +% file conversion is made. This reduces the amount of calculations +% performed in case there are many transformations of the font. +% +% Why do we only consider transformations that correspond to upper +% triangular matrices? Well, a transformation corresponds to an upper +% triangular matrix if and only if it leaves horizontal lines horizontal. +% Since in particular the baseline must always be horizontal in \TeX, +% there is no point in considering other linear transformations. +% +% \begin{macro}{\scalefont} +% \begin{macro}{\xscalefont} +% \begin{macro}{\yscalefont} +% \begin{macro}{\slantfont} +% \begin{macro}{\reencodefont} +% \begin{macrocode} +\def\scalefont#1#2{ + \eval_expr_to\d_count{#1} + \x_resetint{x-scale}{\scale{\d_count}{\int{x-scale}}} + \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}} + \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}} + #2 +} +\def\xscalefont#1#2{ + \x_resetint{x-scale}{\scale{#1}{\int{x-scale}}} + #2 +} +\def\yscalefont#1#2{ + \eval_expr_to\d_count{#1} + \x_resetint{y-scale}{\scale{\d_count}{\int{y-scale}}} + \x_resetint{slant-scale}{\scale{\d_count}{\int{slant-scale}}} + #2 +} +\def\slantfont#1#2{ + \x_resetint{slant-scale}{ + \add{\scale{#1}{\int{x-scale}}}{\int{slant-scale}} + } + #2 +} +\def\reencodefont#1#2{ + #2 + \resetstr{etx-name}{#1} +} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% That's only half the story, however. It is true that the transformation +% matrix, as computed by |\scalefont|, |\slantfont|, |\xscalefont|, and +% |\yscalefont| above, is used for transforming the font metrics, but it +% is not directly used for transforming the font itself. Instead it is +% factorized as +% $$ +% \left( \begin{array}{cc} +% x & s \\ 0 & y +% \end{array} \right) = +% y \left( \begin{array}{cc} +% x/y & s/y \\ 0 & 1 +% \end{array} \right) +% $$ +% Here the scalar factor $y$ will be used to scale the \meta{scale} +% argument of |\set|\-|scaled|\-|raw|\-|glyph| and +% |\set|\-|scaled|\-|not|\-|glyph| commands, whereas the matrix +% factor will be put in the third argument of |\store|\-|map|\-|data| +% in the MTX file written. Thus \package{fontinst} will handle the +% scalar factor of the transformation itself, but leave the matrix +% factor for some other software to take care of. +% +% \bigskip +% +% +% \DescribeMacro{\mtxtomtx} +% The macro: +% \begin{quote} +% |\mtxtomtx|\marg{source MTX}\marg{destination MTX} +% \end{quote} +% converts the first |.mtx| file to the second, using the current values +% of |\int{x-scale}|, |\int{y-scale}|, |\int{slant-scale}|, and +% |\str{etx-name}|. +% +% NOTE: this doesn't convert arbitrary |.mtx| files, just the +% transformable ones. +% +% \begin{macro}{\mtxtomtx} +% \changes{1.911}{1999/11/19}{\cs{edef}ing \cs{raw_font_name}. (LH)} +% \changes{1.915}{2000/09/09}{Locally redefining \cs{aliased}. (LH)} +% \changes{1.924}{2003/02/08}{Added \cs{directfalse}. (LH)} +% \begin{macrocode} +\def\mtxtomtx#1#2{{ + \ifisstr{etx-name}\then + \def\do_slot{\x_cs\edef{slots-\slot_name}{\the\slot_number}} + \directfalse + \inputetx{\str{etx-name}} + \edef\a_macro{\string\reencodefont{\str{etx-name}}} + \else + \let\a_macro=\empty_command + \fi + \_a_true + \ifnum \int{x-scale}=\int{y-scale} + \ifnum \int{slant-scale}=\z@ + \_a_false + \fi \fi + \if_a_ + \a_count=\int{x-scale} + \l_inv_scale\a_count{\int{y-scale}} + \b_count=\int{slant-scale} + \l_inv_scale\b_count{\int{y-scale}} + \edef\a_macro{\a_macro + \string\transformfont{\the\a_count}{\the\b_count} + } + \fi + \open_out{\temp_prefix#2.mtx} + \edef\raw_font_name{#2} + \out_line{\percent_char~Filename:~#2.mtx} + \out_line{\percent_char~Created~by:~tex~\jobname} + \out_line{\percent_char~Created~using:~\string\mtxtomtx{#1}{#2}} + \out_line{} + \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.} + \out_line{} + \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.} + \out_line{} + \out_line{\string\relax} + \out_line{\string\metrics} + \out_line{} + \out_line{\string\needsfontinstversion{\fontinstversion}} + \out_line{} + \record_transform{#2}{\string\frommtx{#1}}{\a_macro}\iftrue + \out_line{} + \mtxtomtx_redefinitions + \inputmtx{#1} + \out_line{} + \out_line{\endmetrics_text} + \close_out{Transformed~metrics} +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mtxtomtx_redefinitions} +% This macro serves as a hook. One can make additional commands +% transformable by appending suitable redefenitions of them to this +% macro. +% \changes{1.927}{2003/12/08}{Macro added. The code used to be in +% \cs{mtxtomtx}. (LH)} +% \begin{macrocode} +\def\mtxtomtx_redefinitions{ + \let\setint=\mtxtomtx_setint + \let\setdim=\mtxtomtx_setdim + \let\setstr=\mtxtomtx_setstr + \let\setscaledrawglyph=\mtxtomtx_setscaledrawglyph + \let\setscalednotglyph=\mtxtomtx_setscaledrawglyph + \let\setkern=\mtxtomtx_setkern + \let\setglyph=\mtxtomtx_setglyph + \let\glyphpcc=\mtxtomtx_glyphpcc + \let\samesize=\mtxtomtx_samesize + \let\endsetglyph=\mtxtomtx_endsetglyph + \def\aliased{\string\aliased} +} +%</pkg> +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\aliased} +% \changes{1.915}{2000/09/09}{Macro added. (LH)} +% The |\aliased| macro has the syntax +% \begin{quote} +% |\aliased|\marg{font's name}\marg{alias name} +% \end{quote} +% This normally expands to \meta{alias name}, but in |\mtxtomtx| it +% normally expands to +% \begin{quote} +% |\string\aliased|\marg{font's name}\marg{alias name} +% \end{quote} +% and when |\mtxtomtx_setscaledrawglyph| is reencoding it uses +% \meta{font's name} to determine the new slot position. +% \begin{macrocode} +%<pkg|misc>\let\aliased=\second_of_two +%<doc>\let\aliased=\@secondoftwo +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mtxtomtx_setint} +% \changes{1.917}{2001/03/24}{Redefined to allow an extensible list +% \cs{width_ints_list} of integers that should be transformed as +% widths. (LH)} +% \begin{macro}{\italicslant_name} +% \begin{macro}{\width_ints_list} +% \changes{1.917}{2001/03/24}{Macro added. \cs{verticalstem_name} +% removed. (LH)} +% Most integers are transformed as if they are the $y$-coordinates of +% some points, but |italicslant| and the integers in the +% |\width_ints_list| are treated differently. |italicslant| is +% interpreted as the quotient $\frac{x}{y}$ for a point $(x,y)$, but +% represented as a real number (i.e., the \TeX\ number is really a +% thousand times the actual quotient). The integers in the +% |\width_ints_list| are transformed as if they are the +% $x$-coordinates of some points on the baseline. +% +% The |\width_ints_list| macro is an ordinary |\do|-type list where +% each |\do| has precisely one argument. These arguments are the names +% of the integers which should be transformed as widths. Elements can +% be added to the list using the |\add_to| macro. +% +% The test for whether a specific integer is in the |\width_ints_list| +% exploits that |\if_true| and |\if_false| only matter in |\if|--|\fi| +% matching after they have been expanded, whereas +% |\gobble_one|\,|\iftrue| only matters before it is expanded. +% \begin{macrocode} +%<*pkg> +\def\mtxtomtx_setint#1#2{ + \def\a_macro{#1} + \ifx \a_macro\italicslant_name + \eval_expr{#2} + \global\multiply \result \int{x-scale} + \a_count=\int{slant-scale} + \multiply \a_count \one_thousand + \advance \a_count \result + \divide \a_count \int{y-scale}\x_relax + \else + \def\do##1{ + \def\b_macro{##1} + \ifx \a_macro\b_macro \expandafter\if_false \fi + } + \gobble_one\iftrue \width_ints_list \if_true + \eval_expr_to\a_count{\scale{#2}{\int{y-scale}}} + \else + \eval_expr_to\a_count{\scale{#2}{\int{x-scale}}} + \fi + \fi + \out_line{\string\setint{#1}{\the\a_count}} +} +\def\italicslant_name{italicslant} +\def\width_ints_list{ + \do{interword}\do{stretchword}\do{shrinkword}\do{quad} + \do{extraspace}\do{digitwidth}\do{verticalstem} +} +% \end{macrocode} +% \end{macro}\end{macro}\end{macro} +% +% \begin{macro}{\mtxtomtx_setdim} +% \begin{macro}{\mtxtomtx_setstr} +% Strings and dimens are not affected by the |\mtxtomtx| transforms. +% \begin{macrocode} +\def\mtxtomtx_setdim#1#2{ + \out_line{\string\setdim{#1}{#2}} +} +% \end{macrocode} +% \begin{macrocode} +\def\mtxtomtx_setstr#1#2{ + \out_line{\string\setstr{#1}{#2}} +} +% \end{macrocode} +% \end{macro} \end{macro} +% +% \begin{macro}{\mtxtomtx_setscaledrawglyph} +% \changes{1.915}{2000/09/09}{Added local redefinition of +% \cs{aliased}. (LH)} +% |#6| (the width) is transformed as the $x$-coordinate of a point on +% the baseline. |#7| and |#8| (the height and depth respectively) are +% transformed as $y$-coordinates. The depth should probably really have +% been transformed as the negative of a $y$-coordinate, but it comes +% out the same in the end anyway. |#9| (the italic correction) is +% transformed as the $x$-coordinate of a point whose $y$-coordinate +% equals the height of the character. |#4| (the scaling) is +% transformed as a $y$-coordinate. +% +% If the italic slant of the font is negative then the italic +% correction should possibly be transformed as the $x$-coordinate of +% a point whose $y$-coordinate equals the negative of the depth +% instead (as that is the part of the box that is sticking out to the +% right), but it is hard to say for sure how that case should be +% treated. +% +% \begin{macrocode} +\def\mtxtomtx_setscaledrawglyph#1#2#3#4#5#6#7#8#9{ + \eval_expr_to\a_count{\scale{#6}{\int{x-scale}}} + \eval_expr_to\b_count{\scale{#7}{\int{y-scale}}} + \eval_expr_to\c_count{\scale{#8}{\int{y-scale}}} + \eval_expr_to\d_count{#9} \eval_expr{#7} + \multiply \d_count \int{x-scale} + \global\multiply \result \int{slant-scale} + \global\advance \result \d_count + \rounded_thousandths + \d_count=\result + \eval_expr{\scale{#4}{\int{y-scale}}} + \ifisstr{etx-name}\then + \bgroup + \let\aliased=\first_of_two + \if_undefined{slots-#1}\then + \egroup \e_count=\m@ne + \else + \expandafter\egroup \expandafter\e_count + \csname slots-#1\endcsname + \fi + \else + \e_count=#5 + \fi + \out_line{ + \ifnum \e_count>\m@ne + \string\setscaledrawglyph + \else + \string\setscalednotglyph + \fi + {#1}{\raw_font_name}{#3}{\the\result}{\the\e_count} + {\the\a_count}{\the\b_count}{\the\c_count}{\the\d_count} + } +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mtxtomtx_setkern} +% Kerns are transformed as the $x$-coordinate of a point on the +% baseline. +% +% \begin{macrocode} +\def\mtxtomtx_setkern#1#2#3{ + \eval_expr{\scale{\int{x-scale}}{#3}} + \out_line{\string\setkern{#1}{#2}{\the\result}} +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\mtxtomtx_setglyph} +% \begin{macro}{\mtxtomtx_samesize} +% \begin{macro}{\mtxtomtx_endsetglyph} +% \begin{macrocode} +\def\mtxtomtx_setglyph#1{\out_line{\string\setglyph{#1}}} +\def\mtxtomtx_samesize#1{\out_lline{\string\samesize{#1}}} +\def\mtxtomtx_endsetglyph{\out_line{\string\endsetglyph}} +% \end{macrocode} +% \end{macro} \end{macro} \end{macro} +% +% \begin{macro}{\mtxtomtx_glyphpcc} +% |#2| is transformed as the $x$-coordinate and |#3| is transformed +% as the $y$-coordinate of a point---the same point for both +% parameters. +% +% \begin{macrocode} +\def\mtxtomtx_glyphpcc#1#2#3{ + \eval_expr_to\b_count{\scale{\int{y-scale}}{#3}} + \eval_expr_to\a_count{#2} \eval_expr{#3} + \multiply \a_count \int{x-scale} + \global\multiply \result \int{slant-scale} + \global\advance \result \a_count + \rounded_thousandths + \out_lline{\string\glyphpcc{#1}{\the\result}{\the\b_count}} +} +% \end{macrocode} +% \end{macro} +% +% +% \subsection{Changing glyph names} +% \label{Ssec:Reglyph} +% +% \package{fontinst} uses names to identify glyphs, and if for example +% the font in question is a postscript font, then names will also be used +% to identify glyphs in the printer. Between those two points however, +% and in particular inside \TeX\ itself, glyphs are represented with +% numbers (slots). Therefore there is no real need for the glyph names +% used within \package{fontinst} and the glyph names used in the printer +% (the names gotten from the AFM file) to be equal, but they usually are. +% There are some cases though where the glyph names of a font are +% unsuitable for use with \package{fontinst}---mainly because +% \package{fontinst} can mix glyphs from different printer fonts---and +% therefore \package{fontinst} also offers the ability to automatically +% change the names of glyphs in transformable metric files. +% +% \begin{macro}{\reglyphfonts} +% \changes{1.912}{2000/01/15}{Added local resetting of +% \cs{setsomething_global} to \cs{relax}. It shouldn't be needed, +% since \cs{reglyphfonts} should not occur between \cs{installfonts} +% and \cs{endinstallfonts}, but I bet someone will try. (LH)} +% \begin{macro}{\endreglyphfonts} +% \begin{quote} +% |\reglyphfonts| \meta{reglyphing commands} |\endreglyphfonts| +% \end{quote} +% \begin{macrocode} +\def\reglyphfonts{ + \begingroup + \let\setsomething_global=\x_relax + \x_setint{renameweight}{1} + \x_setint{killweight}{-10} + \setcommand\iftokeep##1\then{\ifnum -1<##1} +} +\def\endreglyphfonts{\endgroup} +% \end{macrocode} +% \end{macro} \end{macro} +% +% +% The \meta{reglyphing commands} are +% \begin{quote} +% |\renameglyph|\marg{to}\marg{from}\\ +% |\renameglyphweighted|\marg{to}\marg{from}\marg{weight}\\ +% |\killglyph|\marg{glyph}\\ +% |\killglyphweighted|\marg{glyph}\marg{weight}\\ +% |\offmtxcommand|\marg{command}\\ +% |\onmtxcommand|\marg{command}\\ +% |\reglyphfont|\marg{destination font}\marg{source font} +% \end{quote} +% The only reglyphing command that actually convert the names of any +% glyphs is \DescribeMacro{\reglyphfont}|\reglyph|\-|font|; it reads a font +% \meta{source font} (which may be of type MTX, PL, AFM, or VPL) and +% writes another font \meta{destination font} in which the names of +% glyphs have been converted. All the other commands control \emph{how} +% this conversion should be made, and these settings get cleared at the +% closing |\endreglyphfonts|. +% +% The conversion works in two ways. First of all, the names of the +% glyphs can be changed. This works as a general mapping and is +% controlled by the \DescribeMacro{\renameglyph}|\renameglyph| and +% \DescribeMacro{\renameglyphweighted}|\renameglyphweighted| +% commands. Any mensioning of the glyph \meta{from} in a command will be +% converted to a mensioning of the glyph \meta{to}, if that command +% survives the conversion. The other way the conversion works is that it +% can selectively kill---refrain from including in \meta{destination +% font}---commands in the metric file. This part weighs in several +% factors. +% +% For one thing, one can specify that all metric commands of a certain +% type should be killed, and this is done with the +% \DescribeMacro{\offmtxcommand}|\offmtxcommand| command. For example, +% one can see to that all kerning commands are killed by +% \begin{quote} +% |\offmtxcommand{\setkern}| +% \end{quote} +% The effect is the same as that of saying +% \begin{quote} +% |offkern,|\meta{destination font}|,onkern| +% \end{quote} +% rather than just \meta{destination font} in the second argument to +% |\installfont|, but it is somewhat faster since less text is written +% to and subsequently read from the \meta{destination font}|.mtx| file. +% The effect of a previous |\offmtxcommand| can be canceled by a call to +% \DescribeMacro{\onmtxcommand}|\onmtxcommand|, just like with +% |\offcommand| and |\oncommand|. +% +% The survivance of a command is also affected by the glyphs it refers to. +% Each glyph has a \emph{weight} associated with it and the sum of the +% weights for all glyphs mensioned by a command is also used to decide +% whether that command should survive. The test here is performed by the +% macro \DescribeMacro{\iftokeep}|\iftokeep|, whose parameter text +% must be |#1\then|, where |#1| will be a |\count| register. This +% macro must eventually expand to an if of some sort and that if +% evaluating to true is interpreted as that the command should be kept. +% The default replacement text is |\ifnum -1<#1|, which causes a command +% to be killed (not kept) iff the sum of weights for it is negative. +% +% The weight of a glyph is set by |\rename|\-|glyph|, +% |\rename|\-|glyph|\-|weighted|, +% \DescribeMacro{\killglyph}|\kill|\-|glyph|, and +% \DescribeMacro{\killglyphweighted}|\kill|\-|glyph|\-|weighted|. The +% |\rename|\textellipsis\ commands also set a new name for the glyph if +% it survives, whereas the |\kill|\textellipsis\ commands will keep the +% old name. Since the standard settings are that a +% |\rename|\textellipsis\ weight is small and positive and a +% |\kill|\textellipsis\ weight is large and negative, glyphs for which +% a |\kill|\textellipsis\ has been done will usually not survive. +% +% Any one of |\rename|\-|glyph|, |\rename|\-|glyph|\-|weighted|, +% |\kill|\-|glyph|, and |\kill|\-|glyph|\-|weighted| for a glyph will +% override all previous settings +% by any of these four commands for that glyph. The equivalent of the +% neutral state for a glyph (no settings by any of these commands have +% been made for that glyph) is achieved by the command +% \begin{quote} +% |\killglyphweighted|\marg{glyph}|{0}| +% \end{quote} +% +% +% \begin{macro}{\offmtxcommand} +% \begin{macro}{\onmtxcommand} +% These two are just special forms of |\offcommand| and |\oncommand|. +% \begin{macrocode} +\def\offmtxcommand#1{ + \x_cs\offcommand{reglyph_\expandafter\gobble_one\string#1} +} +\def\onmtxcommand#1{ + \x_cs\oncommand{reglyph_\expandafter\gobble_one\string#1} +} +% \end{macrocode} +% \end{macro} \end{macro} +% +% +% \describecsfamily{slots-\meta{glyph}}Inside a |\reglyphfonts| +% \textellipsis\ |\endreglyphfonts| block, the family +% |\slots-|\meta{glyph} of control sequences is used to store the +% information about how glyph \meta{glyph} should be converted. These +% control sequences are either undefined or parameterless macros +% whose replacement texts are of one of the forms +% \begin{quote} +% |\rename_glyph|\marg{to}\marg{weight}\\ +% |\rename_glyph|\marg{to}|\i-renameweight|\\ +% |\kill_glyph|\marg{weight}\\ +% |\kill_glyph\i-killweight| +% \end{quote} +% \meta{to} is what the glyph will be renamed to and \meta{weight} is +% the associated weight. These four different forms are generated by +% the four different commands |\renameglyphweighted|, |\renameglyph|, +% |\killglyphweighted|, and |\killglyph| respectively. +% +% \begin{macro}{\renameglyph} +% \begin{macro}{\renameglyphweighted} +% The difference between the commands |\renameglyphweighted| and +% |\renameglyph| is that the former lets one specify the weight exactly +% while the latter will use the value of the integer |renameweight| +% \emph{at the time of conversion}. By changing the value of +% |renameweight| between two conversions, one changes the weights +% used for all glyph renamings declared using |\renameglyph|. +% \begin{macrocode} +\begingroup + \catcode`\-=11 + \gdef\renameglyph#1#2{ + \x_cs\edef{slots-#2}{ + \noexpand\rename_glyph{#1}\noexpand\i-renameweight + } + } +\endgroup +% \end{macrocode} +% \begin{macrocode} +\def\renameglyphweighted#1#2#3{ + \eval_expr{#3} + \x_cs\edef{slots-#2}{\noexpand\rename_glyph{#1}{\the\result}} +} +% \end{macrocode} +% \end{macro} \end{macro} +% +% \begin{macro}{\killglyph} +% \begin{macro}{\killglyphweighted} +% The difference between the commands |\killglyphweighted| and +% |\killglyph| is that the former lets one specify the weight exactly +% while the latter will use the value of the integer |killweight| +% \emph{at the time of conversion}. By changing the value of +% |killweight| between two conversions, one changes the weights +% used for all glyph killings declared using |\killglyph|. +% \begin{macrocode} +\begingroup + \catcode`\-=11 + \gdef\killglyph#1{ + \x_cs\def{slots-#1}{\kill_glyph\i-killweight} + } +\endgroup +% \end{macrocode} +% \begin{macrocode} +\def\killglyphweighted#1#2{ + \eval_expr{#2} + \x_cs\edef{slots-#1}{\noexpand\kill_glyph{\the\result}} +} +% \end{macrocode} +% \end{macro} \end{macro} +% +% +% \begin{macro}{\reglyphfont} +% The command +% \begin{quote} +% |\reglyphfont|\marg{destination font}\marg{source font} +% \end{quote} +% reads the font metric file \meta{source font}|.mtx| (which must be +% transformable), \meta{source font}|.pl|, or \meta{source font}|.afm| +% (the possibilities are tried in that order) and writes out a font +% metric file \meta{destination font}|.mtx| that is the converted (as +% described above) form of the source font. +% +% \meta{destination font} and \meta{source font} may not be equal. +% \changes{1.903}{1999/06/01}{Using \cs{fromany} for locating font. +% (LH)} +% \changes{1.904}{1999/06/16}{Added \cs{record_transform}. (LH)} +% \begin{macrocode} +\def\reglyphfont#1#2{ + \fromany{#2} + \ifisstr{afm-name}\then + \reglyph_font{#1}{#2} + \else + \fontinsterror{Reglyph}{Could~not~find~font~metrics~for~#2.} + \error_help_a + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\reglyph_font} +% This macro does the actual conversion. +% \begin{macrocode} +\def\reglyph_font#1#2{{ + \open_out{\temp_prefix#1.mtx} + \out_line{\percent_char~Filename:~#1.mtx} + \out_line{\percent_char~Created~by:~tex~\jobname} + \out_line{\percent_char~Created~using:~\string\reglyphfont{#1}{#2}} + \out_line{} + \out_line{\percent_char~This~file~is~used~by~the~fontinst~package.} + \out_line{} + \out_line{\percent_char~THIS~FILE~CAN~BE~DELETED.} + \out_line{} + \out_line{\string\relax} + \out_line{\string\metrics} + \out_line{} + \out_line{\string\needsfontinstversion{\fontinstversion}} + \out_line{} + \record_transform{#1}{\string\frommtx{#2}}{\string\reglyphfont} + \iftrue + \out_line{} + \reglyph_redefinitions + \inputmtx{#2} + \out_line{} + \out_line{\endmetrics_text} + \close_out{Reglyphed~metrics} +}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\reglyph_redefinitions} +% This macro serves as a hook. One can make additional commands +% transformable by appending suitable redefenitions of them to this +% macro. +% \changes{1.927}{2003/12/08}{Macro added. The code used to be in +% \cs{reglyph_font}. (LH)} +% \begin{macrocode} +\def\reglyph_redefinitions{ + \let\setint=\reglyph_setint + \let\setdim=\reglyph_setdim + \let\setstr=\reglyph_setstr + \let\setscaledrawglyph=\reglyph_setscaledrawglyph + \let\setscalednotglyph=\reglyph_setscaledrawglyph + \let\setkern=\reglyph_setkern + \let\setglyph=\reglyph_setglyph + \let\glyphpcc=\reglyph_glyphpcc + \let\samesize=\reglyph_samesize + \let\endsetglyph=\reglyph_endsetglyph +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\reglyph_setint} +% \begin{macro}{\reglyph_setdim} +% \begin{macro}{\reglyph_setstr} +% These are just copied to the file generated. +% \begin{macrocode} +\def\reglyph_setint#1#2{\out_line{\string\setint{#1}{#2}}} +\def\reglyph_setdim#1#2{\out_line{\string\setdim{#1}{#2}}} +\def\reglyph_setstr#1#2{\out_line{\string\setstr{#1}{#2}}} +% \end{macrocode} +% \end{macro} \end{macro} \end{macro} +% +% \begin{macro}{\command_survivance} +% This |\count| register stores the sum of the weights associated +% with the glyphs considered so far. It is updated by |\rename_glyph| +% and |\kill_glyph|. +% \begin{macrocode} +\newcount\command_survivance +% \end{macrocode} +% \end{macro} +% +% The macro \DescribeMacro{\glyphname}|\glyphname| holds the name of +% the glyph currently under consideration. It is altered by +% |\rename_glyph|. +% +% \begin{macro}{\rename_glyph} +% \begin{macro}{\kill_glyph} +% \begin{macrocode} +\def\rename_glyph#1{\def\glyphname{#1}\kill_glyph} +\def\kill_glyph#1{\advance \command_survivance #1\x_relax} +% \end{macrocode} +% \end{macro} \end{macro} +% +% +% \begin{macro}{\reglyph_setscaledrawglyph} +% \changes{1.915}{2000/06/25}{Corrected bug in the \cs{ifnum}: it +% should test argument \#5, not \#4. (LH) Encountered by Thierry +% Bouche.} +% The |\reglyph_|\-|setscaled|\-|rawglyph| macro is straightforward. +% Whether it writes a |\setscaled|\-|rawglyph| or a |\setscaled|\-^^A +% |notglyph| command depends on the fifth parameter, just like with +% |\mtxtomtx_|\-|setscaled|\-|rawglyph|. +% \begin{macrocode} +\def\reglyph_setscaledrawglyph#1#2#3#4#5#6#7#8#9{ + \command_survivance=0 + \def\glyphname{#1} + \csname slots-#1\endcsname + \iftokeep\command_survivance\then + \out_line{ + \ifnum #5<\z@ + \string\setscalednotglyph + \else + \string\setscaledrawglyph + \fi + {\glyphname}{#2}{#3}{\number#4}{#5}{#6}{#7}{#8}{#9} + } + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\reglyph_setkern} +% \begin{macrocode} +\def\reglyph_setkern#1#2#3{ + \command_survivance=0 + \def\glyphname{#1} + \csname slots-#1\endcsname + \let\a_macro=\glyphname + \def\glyphname{#2} + \csname slots-#2\endcsname + \iftokeep\command_survivance\then + \out_line{\string\setkern{\a_macro}{\glyphname}{#3}} + \fi +} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\reglyph_setglyph} +% \multchanges{\cs{reglyph_glyphpcc}\cs{reglyph_samesize}^^A +% \cs{reglyph_setglyph}}{1.911}{1999/12/10}{\cs{string} +% which should be \cs{noexpand} corrected. (LH) Reported by +% Rolf Lindgren.} +% \begin{macro}{\off-\reglyph_setglyph} +% \begin{macro}{\reglyph_glyphpcc} +% \changes{1.911}{1999/12/10}{Typo corrected. (LH) Spotted by Rolf +% Lindgren.} +% \begin{macro}{\reglyph_samesize} +% \begin{macro}{\reglyph_endsetglyph} +% In |\setglyph| \textellipsis\ |\endsetglyph| constructions (which +% are written for composite characters in AFM files), the decision of +% whether to write a command or not due to glyph weights is done +% only once for the entire construction. This means that the commands +% must be saved until the |\endsetglyph| where the result is finally +% known. The token list register |\a_toks| is used for this purpose. +% \begin{macrocode} +\def\reglyph_setglyph#1{ + \command_survivance=0 + \def\glyphname{#1} + \csname slots-#1\endcsname + \edef\a_macro{\noexpand\out_line{\string\setglyph{\glyphname}}} + \a_toks=\expandafter{\a_macro} +} +\x_cs\def{off-\string\reglyph_setglyph}#1{\gobble_glyph} +% \end{macrocode} +% \begin{macrocode} +\def\reglyph_glyphpcc#1#2#3{ + \def\glyphname{#1} + \csname slots-#1\endcsname + \edef\a_macro{\noexpand\out_lline{ + \string\glyphpcc{\glyphname}{#2}{#3} + }} + \a_toks=\expandafter{\the\expandafter\a_toks \a_macro} +} +% \end{macrocode} +% \begin{macrocode} +\def\reglyph_samesize#1{ + \def\glyphname{#1} + \csname slots-#1\endcsname + \edef\a_macro{\noexpand\out_lline{ + \string\samesize{\glyphname} + }} + \a_toks=\expandafter{\the\expandafter\a_toks \a_macro} +} +% \end{macrocode} +% \begin{macrocode} +\def\reglyph_endsetglyph{ + \iftokeep\command_survivance\then + \the\a_toks + \out_line{\string\endsetglyph} + \fi + \a_toks={} +} +%</pkg> +% \end{macrocode} +% \end{macro} \end{macro} \end{macro} \end{macro} \end{macro} +% +% +% \subsubsection*{Three common reglyphing schemes} +% +% As is mensioned elsewhere, the most common reglyphing operation is to +% take a caps and small caps font produced by some major foundry and +% change the glyph names so that they agree with the glyph names used in +% expert fonts. The following code contains the modifying reglyphing +% commands to set up this reglyphing, in two different variants. +% +% The commands are currently based on a comparision of Adobe Garamond +% Small Caps \& Oldstyle Figures (\texttt{padrc8a} in the Berry +% scheme) with Adobe Garamond Regular Expert (\texttt{padr8x} in the +% Berry scheme), so they should be correct for a fair amount of Adobe +% font families, but it is also highly probable that there are lots of +% fonts out there for which it doesn't work quite right. In case you do +% find such a font, please write to tell the \package{fontinst} mailing +% list about it---it would be rather easy to add various alternative +% set-up schemes, controlled by switches, to these files. Just make sure +% first (by checking the newest version of \package{fontinst}) that the +% alternative setting you have found hasn't already been included. +% +% As mentioned, there are two different reglyphing schemes that are set +% up by the code below---one has \package{docstrip} guard \Module{glyphs}, +% the other has guard \Module{!glyphs}---but they both change SC names +% to Expert names. The difference lies instead in what information is +% copied from source font to destination font: the \Module{glyphs} +% variant copies everything, whereas the \Module{!glyphs} variant +% doesn't copy |\setrawglyph| commands, |\setnotglyph| commands, +% |\setscaledrawglyph| commands, |\setscalednotglyph| commands or +% |\setglyph| constructions. The \Module{!glyphs} variant also +% suppresses kerns between two glyphs that doesn't change name. +% +% The motive for having such a curious set-up naturally lies in how the +% files are meant to be used. If you have SC fonts, but no Expert +% fonts, then you should definitely use the \Module{glyphs} variant. If +% on the other hand you have both SC and Expert fonts for a family, +% then it is worth considering using the \Module{!glyphs} variant instead. +% The observation this is based on is that within a triad of the +% corresponding regular, expert, and SC fonts, almost all glyphs present +% in the SC font can also be found in either the regular or the expert +% font; furthermore the only missing glyphs were \texttt{FIsmall}, +% \texttt{FLsmall}, and \texttt{SSsmall}, which (i) were included in the +% SC font only to complete the \texttt{8a} encoding vector and (ii) are +% identical to \package{fontinst}'s fakes for them. +% +% Thus by constructing the \texttt{sc} shape fonts from the regular and +% expert variants, instead of the SC variant, one can get away with +% using one raw font less, thus reducing the time needed for downloading +% the fonts to the printer and the size of the corresponding postscript +% file. One thing not found in either of the regular or expert font in +% the triad is however the kerns between capitals and small capitals, but +% these can be extracted from the metrics of the SC font, and doing this +% is the primary objective for the \Module{!glyphs} variant. +% +% \bigskip +% \changes{1.906}{1999/08/01}{Reglyphing settings files added. (LH)} +% +% First there is the English alphabet: +% \begin{macrocode} +%<*reglyphletters> +\renameglyph{Asmall}{a} +\renameglyph{Bsmall}{b} +\renameglyph{Csmall}{c} +\renameglyph{Dsmall}{d} +\renameglyph{Esmall}{e} +\renameglyph{Fsmall}{f} +\renameglyph{Gsmall}{g} +\renameglyph{Hsmall}{h} +\renameglyph{Ismall}{i} +\renameglyph{Jsmall}{j} +\renameglyph{Ksmall}{k} +\renameglyph{Lsmall}{l} +\renameglyph{Msmall}{m} +\renameglyph{Nsmall}{n} +\renameglyph{Osmall}{o} +\renameglyph{Psmall}{p} +\renameglyph{Qsmall}{q} +\renameglyph{Rsmall}{r} +\renameglyph{Ssmall}{s} +\renameglyph{Tsmall}{t} +\renameglyph{Usmall}{u} +\renameglyph{Vsmall}{v} +\renameglyph{Wsmall}{w} +\renameglyph{Xsmall}{x} +\renameglyph{Ysmall}{y} +\renameglyph{Zsmall}{z} +%</reglyphletters> +% \end{macrocode} +% +% Then there are the figures: +% \multchanges{\notcs{Reglyphing}}{1.911}{1999/12/10} +% {\texttt{eightoldstyle} typo corrected. (LH) Spotted by +% Rolf Lindgren.} +% \multchanges{\notcs{Reglyphing}}{1.927}{2004/07/12} +% {Placed commands for letters and figures in separate modules, +% so that they can be separated in generation. (LH)} +% \begin{macrocode} +%<*reglyphfigures> +\renameglyph{zerooldstyle}{zero} +\renameglyph{oneoldstyle}{one} +\renameglyph{twooldstyle}{two} +\renameglyph{threeoldstyle}{three} +\renameglyph{fouroldstyle}{four} +\renameglyph{fiveoldstyle}{five} +\renameglyph{sixoldstyle}{six} +\renameglyph{sevenoldstyle}{seven} +\renameglyph{eightoldstyle}{eight} +\renameglyph{nineoldstyle}{nine} +%</reglyphfigures> +% \end{macrocode} +% +% Then there are the accents and a couple of miscellaneous symbols. You +% might want to check these carefully, as there might not always be a +% distinction. +% \changes{1.925}{2003/05/13}{Added \cs{renameglyph} for +% \texttt{Hungarumlautsmall}. Walter Schmidt noticed it was missing. +% (LH)} +% \begin{macrocode} +%<*reglyphletters> +\renameglyph{Acutesmall}{acute} +\renameglyph{Brevesmall}{breve} +\renameglyph{Caronsmall}{caron} +\renameglyph{Cedillasmall}{cedilla} +\renameglyph{Circumflexsmall}{circumflex} +\renameglyph{Dieresissmall}{dieresis} +\renameglyph{Dotaccentsmall}{dotaccent} +\renameglyph{Gravesmall}{grave} +\renameglyph{Hungarumlautsmall}{hungarumlaut} +\renameglyph{Macronsmall}{macron} +\renameglyph{Ogoneksmall}{ogonek} +\renameglyph{Ringsmall}{ring} +\renameglyph{Tildesmall}{tilde} +\renameglyph{ampersandsmall}{ampersand} +\renameglyph{centoldstyle}{cent} +\renameglyph{dollaroldstyle}{dollar} +% \end{macrocode} +% +% There are also all the non-English letters: +% \begin{macrocode} +\renameglyph{AEsmall}{ae} +\renameglyph{Ethsmall}{eth} +\renameglyph{Lslashsmall}{lslash} +\renameglyph{Oslashsmall}{oslash} +\renameglyph{OEsmall}{oe} +\renameglyph{Thornsmall}{thorn} +% \end{macrocode} +% \begin{macrocode} +\renameglyph{Agravesmall}{agrave} +\renameglyph{Egravesmall}{egrave} +\renameglyph{Igravesmall}{igrave} +\renameglyph{Ogravesmall}{ograve} +\renameglyph{Ugravesmall}{ugrave} +% \end{macrocode} +% \begin{macrocode} +\renameglyph{Aacutesmall}{aacute} +\renameglyph{Eacutesmall}{eacute} +\renameglyph{Iacutesmall}{iacute} +\renameglyph{Oacutesmall}{oacute} +\renameglyph{Uacutesmall}{uacute} +\renameglyph{Yacutesmall}{yacute} +% \end{macrocode} +% \begin{macrocode} +\renameglyph{Acircumflexsmall}{acircumflex} +\renameglyph{Ecircumflexsmall}{ecircumflex} +\renameglyph{Icircumflexsmall}{icircumflex} +\renameglyph{Ocircumflexsmall}{ocircumflex} +\renameglyph{Ucircumflexsmall}{ucircumflex} +% \end{macrocode} +% \begin{macrocode} +\renameglyph{Atildesmall}{atilde} +\renameglyph{Ntildesmall}{ntilde} +\renameglyph{Otildesmall}{otilde} +% \end{macrocode} +% \begin{macrocode} +\renameglyph{Adieresissmall}{adieresis} +\renameglyph{Edieresissmall}{edieresis} +\renameglyph{Idieresissmall}{idieresis} +\renameglyph{Odieresissmall}{odieresis} +\renameglyph{Ydieresissmall}{ydieresis} +\renameglyph{Udieresissmall}{udieresis} +% \end{macrocode} +% \begin{macrocode} +\renameglyph{Aringsmall}{aring} +\renameglyph{Ccedillasmall}{ccedilla} +\renameglyph{Scaronsmall}{scaron} +\renameglyph{Zcaronsmall}{zcaron} +% \end{macrocode} +% +% The following four glyphs aren't really necessary, since they are +% usually identical to another glyph or to their fakes. +% \begin{macrocode} +\killglyph{dotlessi} +%<*glyphs> +\renameglyph{FIsmall}{fi} +\renameglyph{FLsmall}{fl} +\renameglyph{SSsmall}{germandbls} +%</glyphs> +%<*!glyphs> +\killglyph{fi} +\killglyph{fl} +\killglyph{germandbls} +%</!glyphs> +%</reglyphletters> +% \end{macrocode} +% +% The \Module{!glyphs} settings have no need for |\setrawglyph|, +% |\setscaledrawglyph|, or |\setglyph| commands, and no need for the +% kerns between capitals either, since these are already known from the +% regular variant. Note that it is pointless to say |\offmtxcommand|^^A +% \penalty0|\setrawglyph| as of v\,1.913 since |\setrawglyph| is now +% simply syntactic sugar for the equivalent |\set|\-|scaled|\-|raw|\-^^A +% |glyph|. +% \begin{macrocode} +%<*(reglyphletters|reglyphfigures)&!glyphs> +\offmtxcommand\setscaledrawglyph +\offmtxcommand\setglyph +\resetcommand\iftokeep#1\then{\ifnum 0<#1} +%</(reglyphletters|reglyphfigures)&!glyphs> +% \end{macrocode} +% +% +% \changes{1.904}{1999/06/13}{Font transformation recordings moved to +% \texttt{fimapgen.dtx}, so that the interface will be specified +% in a single place. (LH)} +% +% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% \Finale +\endinput
\ No newline at end of file |