\svnInfo $Id$ \section{Legacy Information} \label{legacy} \subsection{MetaPost Versus \MF} \label{MPvsMF} Since the \MF\index{metafont?\MF} and MetaPost languages have so much in common, expert users of \MF\ will want to skip most of the explanations in this document and concentrate on concepts that are unique to MetaPost. The comparisons in this appendix are intended to help experts that are familiar with {\sl The\ \MF book} as well as other users that want to benefit from Knuth's more detailed explanations \cite{kn:c}. Since \MF\ is intended for making \TeX\ fonts, it has a number of primitives for generating the {\tt tfm}\index{tfm file?{\tt tfm} file}\index{files!tfm?{\tt tfm}} files that \TeX\ needs for character dimensions, spacing information, ligatures\index{ligatures} and kerning\index{kerning}. MetaPost can also be used for generating fonts, and it also has \MF's primitives for making {\tt tfm} files. These are listed in Table~\ref{tfmprim}. Explanations can be found in the \MF\ documentation \cite{kn:c,kn:mf3}. \begin{table}[htp] $$\begin{tabular}{|l|l|} \hline commands& {\tt charlist}, {\tt extensible}, {\tt fontdimen}, {\tt headerbyte} \\ & {\tt kern}, {\tt ligtable} \\ \hline ligtable operators& \verb!::!, \verb!=:!, \verb!=:|!, \verb!=:|>!, \verb!|=:!, \verb!|=:>!, \\ & \verb!|=:|!, \verb!|=:|>!, \verb!|=:|>>!, \verb!||:! \\ \hline internal variables\index{internal variables}\index{variables!internal}& {\tt boundarychar}, {\tt chardp}, {\tt charext}, {\tt charht}, \\ & {\tt charic}, {\tt charwd}, {\tt designsize}, {\tt fontmaking} \\ \hline other operators& {\tt charexists} \\ \hline \end{tabular} $$ \caption{MetaPost primitives for making {\tt tfm} files.} \label{tfmprim} \end{table} Even though MetaPost has the primitives for generating fonts, many of the font-making primitives and internal variables that are part of Plain \MF\index{metafont?\MF} are not defined in Plain MetaPost\index{Plain macros}. Instead, there is a separate macro package called {\tt mfplain}\index{mfplain?\texttt{mfplain}} that defines the macros required to allow MetaPost to process Knuth's Computer Modern fonts as shown in Table~\ref{mfponly} \cite{kn:e}. To load these macros, put ``\verb|&mfplain|'' before the name of the input file. This can be done at the {\tt **} prompt after invoking the MetaPost interpreter with no arguments, or on a command line that looks something like this:\footnote{Command line syntax is system dependent. Quotes are needed on most Unix systems to protect special characters like {\tt\&}.} $$ \hbox{\verb|mpost '&mfplain' cmr10|} $$ The analog of a \MF\ command line like $$ \hbox{\verb|mf '\mode=lowres; mag=1.2; input cmr10'|} $$ is $$ \hbox{\verb|mpost '&mfplain \mode=lowres; mag=1.2; input cmr10'|} $$ The result is a set of PostScript\index{PostScript} files, one for each character in the font. Some editing would be required in order to merge them into a downloadable Type~3 PostScript font~\cite{ad:red2}. \begin{table}[htp] $$ \renewcommand{\FancyVerbFormatLine}[1]{\hbox{#1}\strut} \begin{tabular}{|l|} \hline \multicolumn 1{|c|} {Defined in the {\tt mfplain} package} \\ \hline \begin{verbatim} beginchar font_identifier blacker font_normal_shrink capsule_def font_normal_space change_width font_normal_stretch define_blacker_pixels font_quad define_corrected_pixels font_size define_good_x_pixels font_slant define_good_y_pixels font_x_height define_horizontal_corrected_pixels italcorr define_pixels labelfont define_whole_blacker_pixels makebox define_whole_pixels makegrid define_whole_vertical_blacker_pixels maketicks define_whole_vertical_pixels mode_def endchar mode_setup extra_beginchar o_correction extra_endchar proofrule extra_setup proofrulethickness font_coding_scheme rulepen font_extra_space smode \end{verbatim} \\ \hline \multicolumn 1{|c|} {Defined as no-ops in the {\tt mfplain} package}\\ \hline \begin{verbatim} cullit proofoffset currenttransform screenchars gfcorners screenrule grayfont screenstrokes hround showit imagerules slantfont lowres_fix titlefont nodisplays unitpixel notransforms vround openit \end{verbatim} \\ \hline \end{tabular} \renewcommand{\FancyVerbFormatLine}[1]{#1} $$ \caption{Macros and internal variables defined only in the {\tt mfplain} package.} \label{mfponly} \end{table} \begin{table} \centering \begin{tabular}{|c|}\hline MetaPost primitives not found in \MF\\\hline \begin{minipage}[b]{.75\linewidth}\ttfamily \begin{multicols}{3} blackpart\\ bluepart\\ bounded\\ btex\\ clip\\ clipped\\ closefrom\\ cmykcolor\\ color\\ colormodel\\ cyanpart\\ dashed\\ dashpart\\ defaultcolormodel\\ etex\\ filenametemplate\\ filled\\ fontmapfile\\ fontmapline\\ fontpart\\ fontsize\\ for within\\ glyph of\\ greenpart\\ greypart\\ hour\\ infont\\ jobname\\ linecap\\ linejoin\\ llcorner\\ lrcorner\\ magentapart\\ minute\\ miterlimit\\ mpprocset\\ mpxbreak\\ numberprecision\\ numbersystem\\ outputfilename\\ outputformat\\ outputformatoptions\\ outputtemplate\\ pathpart\\ penpart\\ prologues\\ readfrom\\ redpart\\ restoreclipcolor\\ rgbcolor\\ setbounds\\ stroked\\ textpart\\ textual\\ tracinglostchars\\ troffmode\\ truecorners\\ ulcorner\\ urcorner\\ verbatimtex\\ withcmykcolor\\ withcolor\\ withgreyscale\\ withoutcolor\\ withpostscript\\ withprescript\\ withrgbcolor\\ write to\\ yellowpart \end{multicols} \end{minipage}\\\hline Variables and Macros defined only in Plain MetaPost\\\hline \begin{minipage}[b]{.75\linewidth}\ttfamily \begin{multicols}{3} ahangle\\ ahlength\\ background\\ bbox\\ bboxmargin\\ beginfig\\ beveled\\ black\\ blue\\ buildcycle\\ butt\\ center\\ colorpart\\ cutafter\\ cutbefore\\ cuttings\\ dashpattern\\ defaultfont\\ defaultpen\\ defaultscale\\ dotlabel\\ dotlabels\\ drawarrow\\ drawdblarrow\\ drawoptions\\ endfig\\ EOF\\ evenly\\ extra\_beginfig\\ extra\_endfig\\ green\\ image\\ label\\ labeloffset\\ mitered\\ red\\ rounded\\ squared\\ thelabel\\ white \end{multicols} \end{minipage}\\\hline \end{tabular} \caption{Macros and internal variables defined in MetaPost but not \MF.} \label{mponly} \end{table} Another limitation of the {\tt mfplain} package is that certain internal variables from Plain \MF\index{metafont?\MF} cannot be given reasonable MetaPost definitions. These include {\tt displaying}, {\tt currentwindow}, \verb|screen_rows|, and \verb|screen_cols| which depend on \MF's ability to display images on the computer screen. In addition, \verb|pixels_per_inch| is irrelevant since MetaPost uses fixed units of PostScript\index{PostScript!point}\index{point!PostScript} points. The reason why some macros and internal variables\index{internal variables}\index{variables!internal} are not meaningful in MetaPost is that \MF\ primitive commands {\tt cull}, {\tt display}, {\tt openwindow}, {\tt numspecial} and {\tt totalweight} are not implemented in MetaPost. Also not implemented are a number of internal variables as well as the \tdescr{drawing option} {\tt withweight}. Here is a complete listing of the internal variables whose primitive meanings in \MF\ do not make sense in MetaPost: $$\begin{verbatim} autorounding fillin smoothing turningcheck chardx granularity tracingedges xoffset chardy proofing tracingpens yoffset \end{verbatim} $$ There is also one \MF\ primitive that has a slightly different meaning in MetaPost. Both languages allow statements of the form\index{special?\texttt{special}}\label{Dspecl} $$ {\tt special}\, \descr{string expression} \hbox{\tt;} $$ but \MF\ copies the string into its ``generic font'' output file, while MetaPost interprets the string as a sequence of PostScript\index{PostScript} commands that are to be placed at the beginning of the next output file. In this regard, it is worth mentioning that rules in \TeX\ material included via {\tt btex..etex} in MetaPost are rounded to the correct number of pixels according to PostScript\index{PostScript!conversion rules} conversion rules~\cite{ad:red2}. In \MF, rules are not generated directly, but simply included in specials and interpreted later by other programs, such as {\tt gftodvi}\index{gftodvi?\ttt{gftodvi}}, so there is no special conversion. All the other differences between \MF\ and MetaPost are features found only in MetaPost. These are listed in Table~\ref{mponly}. The only commands listed in this table that the preceding sections do not discuss are \verb|extra_beginfig|\index{extra_beginfig?\texttt{extra\_beginfig}}\label{Dxbfig}, \verb|extra_endfig|\index{extra_endfig?\texttt{extra\_endfig}}\label{Dxefig}, and {\tt mpxbreak}. The first two are strings that contain extra commands to be processed by {\tt beginfig}\index{beginfig?\texttt{beginfig}} and {\tt endfig}\index{endfig?\texttt{endfig}} just as \verb|extra_beginchar| and \verb|extra_endchar| are processed by {\tt beginchar} and {\tt endchar}. (The file {\tt boxes.mp}\index{boxes.mp?\texttt{boxes.mp}} uses these features). The other new feature listed in Table~\ref{mponly} not listed in the index is {\tt mpxbreak}\index{mpxbreak?\texttt{mpxbreak}}. This is used to separate blocks of translated \TeX\index{TeX?\TeX} or troff\index{troff} commands in {\tt mpx}\index{mpx file?{\tt mpx} file}\index{files!mpx?{\tt mpx}} files. It should be of no concern to users since {\tt mpx} files are generated automatically. \subsection{File Name Templates} \label{Dfilenametemplate} The output file naming template mechanism introduced in MetaPost version~1.000 originally used a primitive called \ttindex{filenametemplate}, as opposed to the internal string variable \ttt{outputtemplate}\index{outputtemplate?\texttt{outputtemplate}} described in section~\ref{Doutputtemplate}. This primitive took a string argument with the same syntax as \ttt{outputtemplate}, except that it didn't know about the \verb|%{...}| escape sequence for evaluating internal variables, e.g.,: $$\begin{verbatim} filenametemplate "%j-%c.mps"; \end{verbatim} $$ The \verb|filenametemplate| primitive has been deprecated since the introduction of \verb|outputtemplate| (version~1.200), but is still supported. If you happen to need writing future-proof source files, that at the same time are backwards compatible to MetaPost versions between 1.000 and~1.200, this output filename template declaration might help: $$\begin{verbatim} if scantokens(mpversion) < 1.200: filenametemplate else: outputtemplate := fi "%j-%c.mps"; \end{verbatim} $$ %%% Local Variables: %%% mode: latex %%% TeX-PDF-mode: t %%% TeX-master: "mpman" %%% End: