% \CheckSum{916} % \iffalse meta-comment % % Copyright 1999 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.0 or, at your option, any later version. % %%% From file: fimapgen.dtx % %<*driver> \documentclass{ltxdoc} \usepackage{fisource} \title{\texttt{fimapgen.dtx}} \author{Lars Hellstr\"om} \begin{document} \maketitle \DocInput{fimapgen.dtx} \end{document} % % \fi % % % \section{Generating map file fragments} % \label{Sec:Mapfiles} % \changes{1.904}{1999/06/15}{Completed rudimentary map file fragment % generator, made it part of \texttt{finstmsc.sty}. (LH)} % \newcommand\OzTeX{O\kern-.03em z\kern-.15em\TeX} % % A \emph{map file} is a file which is used by some DVI driver to link % various kinds of font information to each other, as is needed for the % driver's operation. Examples of such files are the file % \texttt{psfonts.map} used by \texttt{dvips} and the config files of % \OzTeX. There are however many other such files around in the \TeX\ % world. % % Not all of a map file need to be related to linking specific kinds of % font information to each other. \OzTeX\ config files can for example % be used to set the values of \TeX\ implementation parameters\footnote % {The kind of things that were Pascal constants in the original \Web\ % sources for \TeX.} and there need not be any font-related information % at all in them. The important thing is however that there can be map % information in them---that information could be automatically written % by the routines described here. % % Since there may be other kinds of information in these files (and often % enough need to be for everthing to work right), the routines described % here will only generate map file \emph{fragments}. These fragments % will then have to be inserted in the final map files somehow, usually % through manual editing. The purpose of the routines described here is % only to save the user a good deal of (often quite boring) typing, not % to actually install everything where it needs to be. % % \StopEventually{} % % \begin{macro}{\mapfrags_subsystem} % This macro holds the name of the automatic map file fragments % writer subsystem of \package{fontinst}, as it appears in error % messages. % \begin{macrocode} \def\mapfrags_subsystem{Map~fragments~writer} % \end{macrocode} % \end{macro} % % \subsection{Interface to main \package{fontinst}} % \label{Ssec:interface} % % The automatic generation of map file fragments is based on the two % commands |\storemapdata| and |\makemapentry|. Their respective % syntaxes are % \begin{quote} % |\storemapdata|\marg{\TeX\ font name}\marg{source}^^A % \marg{transforms}\\ % |\makemapentry|\marg{\TeX\ font name} % \end{quote} % % \DescribeMacro{\storemapdata}|\storemapdata| commands are written when % a metric file \meta{\TeX\ font name}|.mtx| is generated. The purpose % of these commands is to record where the data for that file came from, % and what was done to these data. The source of the data is specified % in the \meta{source} argument, which can contain one of % \begin{quote} % |\fromafm|\marg{AFM name}\marg{PS name}\\ % |\frompl|\marg{PL name}\\ % |\frommtx|\marg{MTX name}\\ % |\fromvpl| % \end{quote} % The only real difference between |\fromafm| and |\frompl| at this % stage is that the former specifies the PS name of the font, but the % latter does not. If you write a |\store|\-|map|\-|data| command yourself % and want to supply the PS name then you should use |\fromafm| even if % you took the font metrics from a PL. % There is an important difference between |\fromvpl| and the first three % in that virtual fonts need no map file entry (and hence there should % not be any either). Besides some error checking, |\fromvpl| causes a % |\makemapentry| to do essentially nothing. % % What was done to the data is specified by the \meta{transforms} % argument, which is a possibly empty sequence of commands, in which % each item is one of % \begin{isyntax} % |\transformfont|\marg{x-scale}\marg{slant-scale}\\ % |\reencodefont|\marg{etx}\\ % |\reglyphfont| % \end{isyntax} % The order is interpreted so that the thing done first appear first in % the sequence. In normal cases there is at most one of each, and then % the order is not important. \meta{x-scale}, \meta{slant-scale}, and % \meta{y-scale} are the values of these variables used for the % transformation, as \TeX\ numbers. \meta{etx} is the name of the ETX % file used for the font reencoding. % |\reglyphfont| is an error marker. It will not be encountered (but % it may well get stored in some table) unless a metric font transform % is applied to a font that has been reglyphed, which is illegal. % % \changes{1.911}{1999/11/17}{\cs{storemapdata} commands are also % written to metric files when they are generated. (LH)} % In addition to being written to a transforms record file (if one is % open), |\storemapdata| commands are also written to the actual metric % file. This makes it possible to find out where the data for a file % comes from even if the file was made on a previous \package{fontinst} % run, but since it requires reading an additional file just to find one % command, it will be slower than if the |\storemapdata| appeared in a % transforms records file. % % \DescribeMacro{\makemapentry}|\makemapentry| commands are written when % a VPL that uses or a ligfull PL for a font is generated. These % commands are the ones which actually cause the map file fragment % generator to write an entry, but entries are only written if they % haven't been written before. |\makemapentry| uses information that % was stored by a previous call to |\storemapdata|. % % |\storemapdata| stores its arguments in one of the control sequences % \describecsfamily{Tf-\meta{font}}|\Tf-|\meta{font}, where \meta{font} % is the same thing as \meta{\TeX\ font name} above. |Tf| stands for % ``\TeX\ font''. The control sequences in this family are paramterless % macros whose replacement texts have the following form: % \changes{1.914}{2000/05/30}{Contents of \cs{Tf-\meta{font}} control % sequences changed to allow processing the same file of recorded % transformations several times on the same run. (LH)} % \begin{quote} % \marg{made}\marg{source}\marg{transforms} % \end{quote} % Here \meta{source} and \meta{transforms} are exactly as above. % \meta{made} is a number which describes the current status of this font. % If \meta{made} is even then the font has been defined but no entry for % it has subsequently been written to the map file, whereas if it is odd % then an entry for it has been written to the map file. If the value of % \meta{made} is less than |\process_generation| then the data in the % other two arguments is from a previous run and should be ignored. % The |\Tf-|\meta{font} control sequences should always be set globally. % % \begin{macro}{\process_generation} % \begin{macro}{\process_generation_succ} % |\process_generation| is a counter which stores the number of the % current ``entry generation''. It starts at 0 and is increased by % two at each |\donedrivers|. |\process_generation_succ| is a macro % which expands to a number one larger than that in |\process_generation|. % \multchanges{\cs{process_generation}\cs{process_generation_succ}} % {1.914}{2000/05/30}{Control sequences added. (LH)} % \begin{macrocode} %<*map> \newcount\process_generation \process_generation=0 \def\process_generation_succ{1} % % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\recordtransforms} % \begin{macro}{\endrecordtransforms} % \begin{macro}{\transform_record_file} % In main \package{fontinst}, the command % \begin{quote} % |\recordtransforms|\marg{filename} % \end{quote} % starts a block of code within which font transforms will be recorded % in the file \meta{filename}. |\endrecordtransforms| ends such a block. % \begin{macrocode} %<*pkg> \def\recordtransforms#1{\open_pout\transform_record_file{#1}} \def\endrecordtransforms{ \close_pout\transform_record_file{Font~transformation~records} } \chardef\transform_record_file=\closed_stream % % \end{macrocode} % \end{macro} \end{macro} \end{macro} % % % \begin{macro}{\extract_font_generation} % The |\extract_font_generation| macro takes the name of a font and % returns the \meta{made} component from the |\Tf-|\meta{font} macro % for that font, or minus one if that macro hasn't been defined. % \changes{1.914}{2000/05/30}{Macro added. (LH)} % \begin{macrocode} %<*map> \def\extract_font_generation#1{ \if_defined{Tf-#1}\then \expandafter\expandafter \expandafter\first_of_three \csname Tf-#1\endcsname \else \m@ne \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\storemapdata} % There should not be two |\storemapdata| for the same font, hence % the check below. (Note that a `font' in this case is an MTX file. % It is quite possible (and legal) to generate the PL file for that % MTX file more than once.) % \changes{1.927}{2004/07/12}{Improved wording of warning message % and downgraded it to an info in the case when the two % definitions are the same. (LH)} % \begin{macrocode} \def\storemapdata#1#2#3{ \expandafter\def \expandafter\a_macro \expandafter{ \expandafter{ \the\process_generation}{#2}{#3}} \ifnum \extract_font_generation{#1}<\process_generation \else \x_cs\ifx{Tf-#1}\a_macro \fontinstinfo\mapfrags_subsystem {Repeated~definition~of~font~#1} \else \fontinstwarning\mapfrags_subsystem {Inconsistent~redefinition~of~font~#1} \fi \fi \x_cs\let{Tf-#1}=\a_macro } % % \end{macrocode} % In main \package{fontinst}, |\storemapdata| should be a noop so % that it can appear in metric files. % \begin{macrocode} %\let\storemapdata=\gobble_three % \end{macrocode} % \end{macro} % % \begin{macro}{\record_transform} % \changes{1.911}{1999/11/18}{\cs{storemapdata} lines are optionally % written to the main output file as well. (LH)} % In main \package{fontinst}, the call % \begin{quote} % |\record_transform|\marg{TFM name}\marg{source}^^A % \marg{transforms}\marg{if} % \end{quote} % writes % \begin{quote} % |\storemapdata|\marg{TFM name}\marg{source}\marg{transforms} % \end{quote} % to the transformation recordings file (if font transforms are being % recorded) and to the main output file (if the \meta{if} evaluates % to true). Note that the caller of |\record_transform| must see to % that macros in \meta{source} and \meta{transforms} are written % correctly to the file (this is usually accomplished by adding % |\string| in suitable places of these arguments during their % construction). % % \begin{macrocode} %<*pkg> \def\record_transform#1#2#3#4{ \ifnum \transform_record_file=\closed_stream \else \pout_line\transform_record_file{\string\storemapdata{#1}{#2}{#3}} \fi #4 \out_line{\string\storemapdata{#1}{#2}{#3}} \fi } % % \end{macrocode} % \end{macro} % % % \begin{macro}{\transformfont} % \changes{1.913}{2000/03/11}{Third argument removed, since it isn't % used anymore. This change is harmless, since the worst thing % that can happen to this argument is that it is typeset. (LH)} % \begin{macro}{\reencodefont} % \begin{macro}{\reglyphfont} % These are initially |\relax|, so they can be |\edef|ed with safely. % \begin{macrocode} %<*map> \let\transformfont\x_relax \let\reencodefont\x_relax \let\reglyphfont\x_relax % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % % \changes{1.914}{2000/05/30}{The total transform applied for a font is % determined before the entry makers are called. (LH)} % \begin{macro}{\makemapentry} % |\makemapentry| sets |\TeX_font_name|, checks if any map data have % been stored for the font in question, and passes them on to % |\make_map_entry| if they have; otherwise it raises an error. There % is also a group which is begun and ended by |\makemapentry|, to stop % values deduced for one entry to interfere with the deduction of values % in the following. % \changes{1.911}{1999/11/20}{When map data are not known, try to % get them from the MTX file before declaring the source unknown. % (LH)} % \begin{macrocode} \def\makemapentry#1{\begingroup \def\TeX_font_name{#1} \ifnum \extract_font_generation{#1}<\process_generation \if_file_exists{#1.mtx}\then \inputmtx{#1} \fi\fi \ifnum \extract_font_generation{#1}<\process_generation \from_unknown{#1} \x_cs\xdef{Tf-#1}{ {\process_generation_succ}{\noexpand\from_unknown{#1}}{} } \else \expandafter\expandafter \expandafter\make_map_entry \csname Tf-#1\endcsname \fi \endgroup } % \end{macrocode} % % \begin{macro}{\make_map_entry} % |\make_map_entry| oversees the interpretation of the % \meta{source} part of the map data, something which sets % |\source_font_TeX_name| and possibly |\PS_font_name|. It also % collects the transforms applied in |\font_transforms|, % concatenates them, and calls a list macro |\entry_makers_list| which % causes the actual entries to be written, and records in % |\Tf-|\meta{\TeX\ font name} that the entries have been written. % \begin{macrocode} \def\make_map_entry#1#2#3{ \ifnum #1=\process_generation \def\font_transforms{#3} #2 \_a_false \let\transformfont\concat_transformfont \let\reencodefont\concat_reencodefont \let\reglyphfont\_a_true \font_transforms \if_a_ \fontinsterror\mapfrags_subsystem{ \string\makemapentry\space for~reglyphed~font }{ No~entry~for~font~\TeX_font_name\space can~be~written,\messagebreak since~it~had~been~reglyphed!~\error_help_a } \else \entry_makers_list \fi \expandafter\gdef \csname Tf-\TeX_font_name \expandafter\endcsname \expandafter{\expandafter{\process_generation_succ}{#2}{#3}} \fi } % % \end{macrocode} % \end{macro}\end{macro} % % % \begin{macro}{\record_usage} % In main \package{fontinst}, the call % \begin{quote} % |\record_usage|\marg{TFM name} % \end{quote} % writes % \begin{quote} % |\makemapentry|\marg{TFM name} % \end{quote} % to the transformation recordings file, if font transforms are being % recorded. The |\record_usage| command is, roughly speaking, only used % by |\installfont| and |\installrawfont|. % \begin{macrocode} %<*pkg> \def\record_usage#1{ \ifnum \transform_record_file=\closed_stream \else \pout_line\transform_record_file{\string\makemapentry{#1}} \fi } % % \end{macrocode} % \end{macro} % % % \begin{macro}{\fromafm} % |\fromafm| saves its two arguments in the suitable string macros. % \begin{macrocode} %<*map> \def\fromafm#1#2{ \def\source_font_TeX_name{#1} \def\PS_font_name{#2} } % \end{macrocode} % \end{macro} % % \begin{macro}{\frompl} % |\frompl| saves its argument in the suitable string macro. % \begin{macrocode} \def\frompl#1{ \def\source_font_TeX_name{#1} } % \end{macrocode} % \end{macro} % % \begin{macro}{\frommtx} % This one is tricky, since it will have to work recursively, % fetching data that were stored for some other font. If it cannot % find those data in memory, then it tries to get them from the % metric file itself. % \changes{1.911}{1999/11/17}{When map data are not known, try to % get them from the MTX file before declaring the source unknown. % (LH)} % \begin{macrocode} \def\frommtx#1{% \ifnum \extract_font_generation{#1}<\process_generation \if_file_exists{#1.mtx}\then \inputmtx{#1} \fi\fi \ifnum \extract_font_generation{#1}<\process_generation \from_unknown{#1} \x_cs\xdef{Tf-#1}{ {\the\process_generation}{\noexpand\from_unknown{#1}}{} } \else \expandafter\expandafter \expandafter\from_mtx \csname Tf-#1\endcsname \fi } % \end{macrocode} % \begin{macro}{\from_mtx} % \begin{macrocode} \def\from_mtx#1#2#3{ \edef\font_transforms{#3\font_transforms} #2 } % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\fromvpl} % The |\fromvpl| command checks if |\font_transforms| is empty. If it % is then everything is fine, but no entry should be written for this % font. If it isn't then someone has tried to make a transformation of % a virtual font, which doesn't work. % \begin{macrocode} \def\fromvpl{ \ifx \empty_command\font_transforms \else \fontinsterror\mapfrags_subsystem{ Font~is~virtual,~it~cannot~be~transformed}{ No~entry~for~font~\TeX_font_name\space can~be~written. \messagebreak\error_help_a } \fi \let\maker_do\gobble_one } % \end{macrocode} % \end{macro} % % \begin{macro}{\AssumeMetafont} % The |\AssumeMetafont| general settings command makes |\frompl| % behave like |\fromvpl|. % \begin{macrocode} \def\AssumeMetafont{ \def\frompl{ \ifx \empty_command\font_transforms \else \fontinsterror\mapfrags_subsystem{ A~Metafont~cannot~be~transformed}{ No~entry~for~font~\TeX_font_name\space can~be~written. \messagebreak\error_help_a } \fi \let\maker_do\gobble_one } } % \end{macrocode} % \end{macro} % % \begin{macro}{\from_unknown} % This special value for \meta{source} is used for fonts that are % referenced by some |\frommtx| but which have no |\storemapdata| % themselves. % \begin{macrocode} \def\from_unknown#1{ \fontinstwarningnoline\mapfrags_subsystem{ No~map~data~stored~for~font~#1.\messagebreak No~entry~for~\TeX_font_name\space will~be~written,\messagebreak due~to~insufficient~information} \includewarning\warn_unknown_source \let\maker_do\gobble_one } % \end{macrocode} % \end{macro} % % % \begin{macro}{\font_transforms} % This macro is used to collect all transformations that have been % applied to a font in, before they are concatenated. % \begin{macrocode} \let\font_transforms\empty_command % \end{macrocode} % \end{macro} % % \begin{macro}{\xscale_factor} % \begin{macro}{\slant_factor} % \begin{macro}{\reencode_etx} % |\xscale_factor| and |\slant_factor| are dimens which the entry % makers can inspect to check the amount of horizontal scaling and % slanting should be applied to the current font. 1\,pt equals the % factor~1. % \begin{quote} % |\expandafter\lose_measure\the\xscale_factor| % \end{quote} % will produce the corresponding factor. % % |\reencode_etx| is a macro which contains the name of the (last) % ETX file used to reencode the font; it is empty if the font hasn't % been reencoded. % \multchanges{\cs{xscale_factor}\cs{slant_factor}\cs{reencode_etx}} % {1.914}{2000/05/30}{Control sequences added. (LH)} % \begin{macrocode} \newdimen\xscale_factor \newdimen\slant_factor \xscale_factor=\p@ \slant_factor=\z@ \let\reencode_etx\empty_command % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % \multchanges{\cs{concat_transformfont}\cs{concat_reencodefont}} % {1.914}{2000/05/30}{Macros added. (LH)} % \begin{macro}{\concat_transformfont} % The |\concat_transformfont| macro is a definition of |\transformfont| % which concatenates the transformation expressed by the arguments % with the one in |\xscale_factor| and |\slant_factor|. % Mathematically, it performs the multiplication % $$ % \left( \begin{array}{cc} f(\#1)& f(\#2)\\ 0& 1 \end{array} \right) % \left( \begin{array}{cc} % \mbox{\cs{xscale_factor}}& \mbox{\cs{slant_factor}} \\ % 0& 1 % \end{array} \right) % $$ % where $f$ stands for |\make_factor|. % \begin{macrocode} \def\concat_transformfont#1#2{ \edef\a_macro{\make_factor{#1}} \xscale_factor=\a_macro\xscale_factor \slant_factor=\a_macro\slant_factor \advance \slant_factor \make_factor{#2}\p@ } % \end{macrocode} % \end{macro} % % % \begin{macro}{\concat_reencodefont} % The |\concat_reencodefont| macro is a definition of |\reencodefont| % which concatenates the reencoding expressed by the argument with % the one in |\reencode_etx|. Since reencoding ignores the previous % encoding, concatenating is the same thing as remembering the last % reencoding. % \begin{macrocode} \def\concat_reencodefont#1{\def\reencode_etx{#1}} % \end{macrocode} % \end{macro} % % % \subsection{User interface} % % The basic usage of the automatic map file fragment generator consists % of specifying for which driver(s) entries should be generated, % |\input|ing a file of recorded transformations generated by main % \package{fontinst}, and signaling that there isn't anything more to % write. This can be done with the commands % \begin{quote} % |\adddriver|\marg{driver name}\marg{fragment file name}\\ % \meta{possible additional \cs{adddriver} commands}\\ % |\input |\meta{recorded transforms file}\\ % |\donedrivers|\\ % |\bye| % \end{quote} % It should however be noted that this is the \emph{basic} usage. The % map fragments that work for one \TeX\ system need not work for % another (even if the driver is the same), and therefore it is % necessary to make the whole process of writing map file fragments % configurable. A few examples of things you may have to inform the map % fragment writer about are (and these are for \package{dvips} alone; % that's the driver I know best): % \begin{itemize} % \item % Is the font resident on the printer or must it be downloaded? % \item % If the font must be downloaded, what is the name of the file it % is in? Here one must take into account not only the possibility % that the font file might have to be shared with some other % software (such as a GUI) and thus cannot be named according to % the Berry scheme---even if it is named according to the Berry % scheme one still has the question of its extension: \texttt{.pfa}, % \texttt{.pfb}, or something else? For instances of Multiple Master % fonts, you (at least sometimes) have to download more than one file. % \item % Again if the font must be downloaded, can/should it be partially % downloaded? % \item % In case the font has been reencoded, what is the name of the file % which defines this encoding, and by what name does that file make % the encoding known to the postscript interpreter? % \end{itemize} % The mechanisms available for such configuration are described in % Subsection~\ref{Sssec:Config-interface}. % Note that map files for DVI viewers are on average more likely to need % various platform-specific information about the fonts than map files % for DVI printer drivers are, and hence once can expect that % generation of these will need more extensive configuration than that % for the printer drivers. % % % \subsubsection{Interface for basic usage} % % An \emph{entry maker} is a group of macros which write the entry for % the font currently under consideration to a map fragments file each % time they are called. The macro to call must have a name of the form % \describecsfamily{make_\meta{driver}}|\make_|\meta{driver} for % |\adddriver| to recognise it. Each entry maker has a separate output % file (opened using |\open_pout|) and the identifier connected to that % file is called \describecsfamily{output_\meta{driver}}\relax % |\output_|\meta{driver}. % % A list of all entry makers currently active is maintined in the macro % |\entry_makers_list|. Each item in this list has the form % \begin{quote} % |\maker_do|\,|\make_|\meta{driver} % \end{quote} % |\maker_do| is usually |\relax|, but it does occationally get set to % other values. % \par\bigskip % % % \begin{macro}{\adddriver} % The |\adddriver| command adds the named driver to the list of % drivers to write entries for and opens an output file where the % entries for that particular driver will go. Repeated calls to % |\adddriver| for the same driver have no effect. % \begin{macrocode} \def\adddriver#1#2{ \x_cs\ifx{make_#1}\x_relax \fontinsterror\mapfrags_subsystem {There~is~no~entry~maker~for~#1}\error_help_a \else \x_cs\ifx{output_#1}\x_relax \_a_true \else \x_cs\ifx{output_#1}\closed_stream \_a_true \else \_a_false \fi\fi \if_a_ \x_cs\open_pout{output_#1}{#2} \expandafter\add_to \expandafter\entry_makers_list \expandafter{ \expandafter\maker_do \csname make_#1\endcsname} \fi \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\entry_makers_list} % \begin{macro}{\maker_do} % \begin{macrocode} \let\entry_makers_list\empty_command \let\maker_do\x_relax % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\donedrivers} % The main function performed by the |\donedrivers| command is to % close all the open output files. It might also print some warning % messages. % \begin{macrocode} \def\donedrivers{ \def\maker_do##1{ \x_cs\close_pout{output\expandafter\gobble_five\string##1} {Map~file~fragments} } \entry_makers_list \let\maker_do\x_relax \let\entry_makers_list\empty_command \errorstopmode \reportwarnings \advance \process_generation \thr@@ \edef\process_generation_succ{\the\process_generation} \advance \process_generation \m@ne } % \end{macrocode} % \end{macro} % % \begin{macro}{\gobble_five} % \begin{macrocode} \def\gobble_five#1#2#3#4#5{} % \end{macrocode} % \end{macro} % % % It is appropriate that the map file writer writes a summary of the % kinds of risky things which happened when it is done writing data to % files. To simplify implementing such things, there is a command % \DescribeMacro{\includewarning}|\includewarning| that takes care of % the bookkeeping involved. After the call % \begin{quote} % |\includewarning|\meta{command} % \end{quote} % the \meta{command} will be executed exactly once the next time % |\reportwarnings| is executed. The \meta{command} usually expands to % something like % \begin{quote} % \small|\fontinstwarningnoline\mapfrags_subsystem{|\\ % | Check~the~output~file(s)--some~data~was~considered~uncertain}| % \end{quote} % % \begin{macro}{\warnings_list} % The |\warnings_list| macro contains a list of all warnings that % should be made. It expands to a sequence of % \begin{quote} % |\warning_do|\meta{command} % \end{quote} % |\warnings_list| is always assigned globally. % \begin{macrocode} \g_let\warnings_list=\empty_command % \end{macrocode} % \end{macro} % % \begin{macro}{\includewarning} % \begin{macro}{\warning_do} % The |\includewarning| command adds an entry for its argument to the % |\warnings_list| list, provided there wasn't already such an entry. % |\includewarning| is based on the macro |\warning_do|, which does % most of the bookkeeping for making sure the list contains at most % one entry of each kind. |\warning_do| normally expects to be % expanded in the context % \begin{quote} % |\warning_do|\meta{new command}\meta{old command}\meta{next} % \end{quote} % The \meta{new command} is the command that is being added to the % list, and the \meta{old command} is a command that is already in the % list. \meta{next} is the first token in the next item in the % list---in most cases another |\warning_do|. If \meta{new command} % and \meta{old command} are not equal, this should expand to % \begin{quote} % |\noexpand\warning_do|\,|\noexpand|\meta{old command}\,^^A % \meta{next}\,\meta{new command} % \end{quote} % If on the other hand they are equal, this should expand to % \begin{quote} % |\noexpand\warning_do|\,|\noexpand|\meta{old command}\,^^A % \meta{next}\,|\x_relax| % \end{quote} % The reason for this is that the last \meta{next} will not be a % |\warning_do|, but an |\ifx| which tests whether a new item should % be added to the list. % \begin{macrocode} \def\warning_do#1#2#3{ \noexpand\warning_do \noexpand#2 \ifx #1#2 \expandafter#3 \expandafter\x_relax \else \expandafter#3 \expandafter#1 \fi } \def\includewarning#1{ \xdef\warnings_list{ \expandafter\swap_two \expandafter#1 \warnings_list \if_equal\x_relax\then \else \noexpand\warning_do \noexpand#1 \fi } } % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\reportwarnings} % The |\reportwarnings| command reports all the warnings and empties % the |\warnings_list|. % \begin{macrocode} \def\reportwarnings{ \begingroup \let\warning_do=\x_relax \warnings_list \endgroup \g_let\warnings_list=\empty_command } % \end{macrocode} % \end{macro} % % \begin{macro}{\warn_unknown_source} % \begin{macro}{\warn_undecided_data} % \begin{macro}{\warn_uncertain_data} % These macros are used to output warnings at the |\reportwarnings| at % the end of |\donedrivers|. % \begin{macrocode} \def\warn_unknown_source{ \fontinstwarningnoline\mapfrags_subsystem{ Some~font~is~missing~from~the~output~file(s),\messagebreak since~its~source~is~unknown} } \def\warn_undecided_data{ \fontinstwarningnoline\mapfrags_subsystem{ Check~the~output~file(s)--some~data~could~not~be~determined} } \def\warn_uncertain_data{ \fontinstwarningnoline\mapfrags_subsystem{ Check~the~output~file(s)--some~data~was~considered~uncertain} } % \end{macrocode} % \end{macro}\end{macro}\end{macro} % % % % \subsubsection{Configuration interface} % \label{Sssec:Config-interface} % % To correctly format reencodings, the map file writer must know what % the ETX encodings correspond to. In the case of drivers which % generate postscript output, this information is stored in the % \describecsfamily{pse-\meta{etx}}|\pse-|\meta{etx} family of macros. % \meta{etx} is the name (suffix excluded) of the ETX file that the % information pertains to. The expansion of these macros are of the form % \begin{quote} % \marg{postscript name}\marg{action} % \end{quote} % \meta{postscript name} is the name by which the encoding is known to % the postscript interpreter, and \meta{action} lists any additional % action that must be taken before the encoding can be used. % ^^A So far the only actions known is % ^^A \DescribeMacro{\download}|\download|\marg{file}, % ^^A which will cause code for downloading the file by the name % ^^A \meta{file} (suffix included) to be inserted in the output. % % \begin{macro}{\declarepsencoding} % Data is entered in a |\pse-|\meta{etx} macro using the % |\declare|\-|ps|\-|encoding| command. Its syntax is % \begin{quote} % |\declarepsencoding|\marg{etx}\marg{postscript name}\marg{action} % \end{quote} % \begin{macrocode} \def\declarepsencoding#1#2#3{\x_cs\gdef{pse-#1}{{#2}{#3}}} % % \end{macrocode} % In main \package{fontinst}, |\declarepsencoding| should be a noop so % that it can appear in encoding files. It's probably a good idea to % show it when typesetting as well. % \changes{1.931}{2005/05/13}{Added main \package{fontinst} and % \package{fontdoc} definitions. (LH)} % \begin{macrocode} %\let\declarepsencoding=\gobble_three %<*doc> \def\declarepsencoding#1#2#3{\comment{% This file corresponds to the \FD@typeset@string{#2} encoding vector.}} % % \end{macrocode} % \end{macro} % % \begin{macro}{\providepsencoding} % This command is basically the same as |\declarepsencoding|, but it % checks whether the encoding has already been set and does nothing % if that is the case. It is used for autogenerated declarations, to % allow the user to override the setting. % \changes{1.931}{2005/05/13}{Command added. (LH)} % \begin{macrocode} %<*map> \def\providepsencoding#1#2#3{ \if_undefined{pse-#1}\then \declarepsencoding{#1}{#2}{#3} \fi } % %\let\providepsencoding=\gobble_three %\newcommand\providepsencoding[3]{} % \end{macrocode} % \end{macro} % % \begin{macro}{\download} % By default |\download| gobbles its argument. It should be redefined % when that is not the desired effect. % \begin{macrocode} %<*map> \let\download=\gobble_one % \end{macrocode} % \end{macro} % % \begin{macro}{\fulldownload} % By default this defaults to being a synonym of |\download|, to % simplify matters for drivers where the distinction is not relevant. % They should be redefined when that is not the desired effect. % \changes{1.928}{2004/12/13}{Command added. (LH)} % \begin{macrocode} \def\fulldownload#1{\download{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\encodingdownload} % By default this defaults to being a synonym of |\download|, to % simplify matters for drivers where the distinction is not relevant. % They should be redefined when that is not the desired effect. % \changes{1.931}{2005/05/04}{Command added. (LH)} % \begin{macrocode} \def\encodingdownload#1{\download{#1}} % \end{macrocode} % \end{macro} % % Some encodings seem to always be present, so they can be declared here. % \begin{macrocode} \declarepsencoding{8r}{TeXBase1Encoding}{\encodingdownload{8r.enc}} \declarepsencoding{8a}{StandardEncoding}{} % \end{macrocode} % \package{fontinst} must be told about other postscript encodings (if you % have them installed). The \texttt{finstmsc.rc} file is the right place % for these declarations.\relax % \SortIndex{finstmsc.rc file}{\texttt{finstmsc.rc} file} % % Next we have the cofiguration for fonts, which works in a similar % fashion. The main problem here seems to be to determine which files (if % any) should be downloaded to the printer, and this can be specified % using |\download| commands as for the encodings. The family % \describecsfamily{psf-\meta{PS font name}}|\psf-|\meta{PS font name} % of macros expand to a sequence of \meta{actions} as for the encodings. % If there is such a macro for a font then the instructions found there % should be followed. % % It is recommended that the contents of a |\psf-|\meta{PS font name} % macro is executed before the map file entry is written, and that % commands like |\download| are temporarily redefined to build the text % for the entry, rather than having the |\write| in |\pout_line| expand % the contents of |\psf-|\meta{PS font name}. % % \begin{macro}{\specifypsfont} % The |\specifypsfont| command is used as % \begin{quote} % |\specifypsfont|\marg{PS font name}\marg{actions} % \end{quote} % It can be used to specify the actions that should be done to make a % Postscript font known to the printer, when the automatic guessing % would not be right. % \begin{macrocode} \def\specifypsfont#1#2{\x_cs\def{psf-#1}{#2}} % \end{macrocode} % \end{macro} % % Examples of cases where |\specifypsfont| would be needed are: % \begin{itemize} % \item Fonts which are resident on the printer. In this case the % \meta{actions} argument should be empty, e.g. % \begin{quote} % |\specifypsfont{Times-Roman}{}| % \end{quote} % \item Instances of multiple master fonts. In this case one must % download both the multiple master font and the stub file that % defines the instance. % % Subsection~10.6.1 in The \LaTeX\ graphics companion~\cite % {LaTeX-graph-comp} contains an example with an instance of the % \texttt{MinionMM} multiple master font. Both the \TeX\ and % (what is of interest here) the PS name for this instance is % \texttt{zmnl8ac6}, the base multiple master font is stored in the % file \texttt{MinionMM.pfb}, and the stub file is called % \texttt{zmnl8ac6.pro}. The |\specifypsfont| command for this is % \begin{quote} % |\specifypsfont{zmnl8ac6}{%|\\ % | \download{MinionMM.pfb}\download{zmnl8ac6.pro}%|\\ % |}| % \end{quote} % (It should probably be remarked that the most common method of % defining a multiple master font instance is not to explicitly % create it as in this example, but to simply use it as any ordinary % PS font and then rely on the PS \textsf{findfont} operator to % automagically create it for you. This requires using a special % naming scheme for instances of multiple master fonts.) % \item Fonts which do not fit any of the general naming schemes. % \end{itemize} % % % \begin{macro}{\AssumeLWFN} % This command makes \mbox{MacOS} \texttt{LWFN} style abbreviated % Postscript font names the default for fonts that have no % |\psf-| entry. % \begin{macrocode} \def\AssumeLWFN{\let\get_PS_font_file\LWFN_get_PS_font_file} % \end{macrocode} % \end{macro} % % % % \subsection{Deducing values for the map file entries} % % % \subsubsection{Basic principles} % % The automatic generation of map file fragments mainly consists of % determining various text strings and writing these to a file as the % format of the map file being written requires. The complicated part is % usually to determine what these text strings should be, since the only % restriction imposed by the output format often is that the strings % should be written in the right order and with separating whitespace. % % It is furthermore the case that some of these text strings seem to be % hard to deduce from the information primarily given in the command to % write the entry, but somewhat easier to deduce from some other deduced % text string. % % Therefore the following model seems appropriate. For each text string % that may need to be deduced, there is one macro which is used to store % the string (if it has been deduced) and one macro which can be called % to set the former macro to an appropriate value. Thus there is one % macro |\PS_font_name| which stores the postscript name for the font % currently in question and one macro % \describecsfamily{get_\meta{string name}}|\get_PS_font_name| which % determines the proper value for |\PS_font_name|. There is also a macro % \DescribeMacro{\unknown_str}|\unknown_str| to which all the % string storing macros should initially be |\let|, so that it can be % easily tested whether a string storing macro has been given its proper % value or not. % % Typically, if |\PS_font_name| is used somewhere, one would first have % a piece of code that says % \begin{quote} % \small % |\ifx\PS_font_name\unknown_str|\\ % | \get_PS_font_name|\\ % |\fi| % \end{quote} % to ensure that it is known when it is used. % % \begin{macro}{\unknown_str} % A suitable value for this macro seems to be |?????|. % \begin{macrocode} \def\unknown_str{?????} % \end{macrocode} % \end{macro} % % \begin{macro}{\clueless_str} % To further support this model, there is also a macro |\clueless_str| % which a string storing macro should be |\let| equal to if its proper % value could not be determined. This distinction is useful for the % |\get_|\textellipsis\ macros, since if |\get_|$A$ can determine the % correct value of $A$ from $B$, but also from $C$, then it helps if % |\get_|$A$ can easily check whether it has previously turned out to % be impossible to determine the value of $B$, because then it can % simply deduce $A$ from $C$ instead. % % \begin{macrocode} \edef\clueless_str{\unknown_str ?} % \end{macrocode} % \end{macro} % % An example of how |\clueless_str| should be used is the following % skeleton of a |\get_|$A$ macro: % \begin{quote}\small % |\def\get_|$A$|{|\\ % | \ifx\unknown_str\|$B$| \get_|$B$| \fi|\\ % | \ifx\clueless_str\|$B$\\ % | \ifx\unknown_str\|$C$| \get_|$C$| \fi|\\ % | \ifx\clueless_str\|$C$\\ % | \let\|$A$|\clueless_str|\\ % | \else|\\ % | |\meta{Deduce $A$ from $C$}\\ % | \fi|\\ % | \else|\\ % | |\meta{Deduce $A$ from $B$}\\ % | \fi|\\ % |}| % \end{quote} % % % \subsubsection{Implementation} % % \begin{macro}{\TeX_font_name} % This is the name (as appearing in a DVI or VF file) of the font for % which an entry should be made. It is set by |\makemapentry|, so no % |\get_|\textellipsis\ macro is needed. % \begin{macrocode} \let\TeX_font_name\unknown_str % \end{macrocode} % \end{macro} % % \begin{macro}{\source_font_TeX_name} % This is the name (as AFM or PL) of the font whose metrics were % used by \package{fontinst}. It is set by |\fromafm| or |\frompl|, % so no |\get_|\textellipsis\ macro is needed. % \begin{macrocode} \let\source_font_TeX_name\unknown_str % \end{macrocode} % \end{macro} % % \begin{macro}{\PS_font_name} % This is the name (as FontName entry in an AFM or correspondingly) of % the font in question. % \begin{macrocode} \let\PS_font_name\unknown_str % \end{macrocode} % \begin{macro}{\get_PS_font_name} % I expect this to become one of the central macros in the map file % generation (at least when entries are generated for postscript % fonts), but for the moment it does the closest thing to nothing a % |\get_|\textellipsis\ macro is allowed to do; it admits it hasn't % got a clue about what the proper value is. % \begin{macrocode} \def\get_PS_font_name{\let\PS_font_name\clueless_str} % \end{macrocode} % \end{macro}\end{macro} % % \begin{macro}{\AssumeAMSBSYY} % \begin{macro}{\AssumeBaKoMa} % These commands redefine |\get_PS_font_name| so that it returns the % PS name this font would have if it was part of the AMS\slash % Blue~Sky\slash Y\&Y and BaKoMa respectively distribution of the % Computer Modern fonts---the \TeX\ font name in all upper case and % all lower case respectively. % \begin{macrocode} \def\AssumeAMSBSYY{\def\get_PS_font_name{ \uppercase \expandafter{ \expandafter\def \expandafter\PS_font_name \expandafter{ \source_font_TeX_name} } }} % \end{macrocode} % \begin{macrocode} \def\AssumeBaKoMa{\def\get_PS_font_name{ \lowercase \expandafter{ \expandafter\def \expandafter\PS_font_name \expandafter{ \source_font_TeX_name} } }} % \end{macrocode} % \end{macro}\end{macro} % % % \begin{macro}{\PS_font_file} % This is the name of the file (suffix included) in which the PS font % is expected to be found. % \begin{macrocode} \let\PS_font_file\unknown_str % \end{macrocode} % \end{macro} % % \begin{macro}{\get_PS_font_file} % \begin{macro}{\normal_get_PS_font_file} % \begin{fistring}{PSfontsuffix} % The macro |\normal_get_PS_font_file| is (hardly surprisingly) the % normal |\get_PS_font_file|. It simply uses |\source_font_TeX_name| % plus the suffix specified by the |PSfontsuffix| string. % \begin{macrocode} \resetstr{PSfontsuffix}{.pfa} \def\normal_get_PS_font_file{ \edef\PS_font_file{\source_font_TeX_name\str{PSfontsuffix}} } \let\get_PS_font_file=\normal_get_PS_font_file % \end{macrocode} % \end{fistring}\end{macro}\end{macro} % % \begin{macro}{\LWFN_get_PS_font_file} % \begin{macro}{\abbreviate_PS_font_name} % In MacOS, Postscript fonts file names are usually abbreviated forms of % the Postscript font names, formed using the so called % \(5+3+3+\cdots\) rule---keep the first five letters of the first % subword, keep the first three letters of all following subwords. The % |\LWFN_get_PS_font_file| macro uses this scheme if the Postscript % name for the font is known, otherwise it calls the % |\normal_get_PS_font_file|. The LWFN in the macro name is the type % code for such files. % % The algorithm is based on using |\aftergroup| to construct the % wanted |\def| statement, only |\aftergroup|ing the letters that are % not to be removed in the abbreviation. |\a_count| is used as a % counter of how many more letters in the current subword should be % kept. % \begin{macrocode} \def\LWFN_get_PS_font_file{ \ifx \PS_font_name\unknown_str \get_PS_font_name \fi \ifx \PS_font_name\clueless_str \normal_get_PS_font_file \includewarning\warn_uncertain_data \else \begingroup \aftergroup\def \aftergroup\PS_font_file \aftergroup{ \a_count=4~ \expandafter\expandafter \expandafter\aftergroup \expandafter\swap_two \expandafter\abbreviate_PS_font_name \PS_font_name \x_relax \aftergroup} \endgroup \fi } % \end{macrocode} % \begin{macrocode} \def\abbreviate_PS_font_name#1{ \ifx \x_relax#1 \else \ifnum \uccode`#1=`#1 \a_count=2 \aftergroup#1 \else\ifx -#1 \a_count=\z@ \else\ifnum \a_count>\z@ \advance \a_count \m@ne \aftergroup#1 \fi\fi\fi \expandafter\abbreviate_PS_font_name \fi } % \end{macrocode} % \end{macro}\end{macro} % % % % \subsection{Driver makers} % % This subsection contains the definitions of macros that makes up the % driver makers. % % % \subsubsection{The \texttt{debug} driver} % % The \texttt{debug} driver maker doesn't really generate entries for % any DVI driver map file, it just prints the data that was available. % It is mainly intended for debugging purposes, but it might also serve % as a basic model for other driver makers. % % \begin{macro}{\make_debug} % \begin{macrocode} \def\make_debug{ \pout_line\output_debug{Driver~data~for~font~\TeX_font_name:} \pout_lline\output_debug{Source~font~TeX~name:~\source_font_TeX_name} \ifx \reencode_etx\empty_command \else \pout_lline\output_debug{Font~reencoded~using~\reencode_etx.etx.} \fi \ifdim \xscale_factor=\p@ \else \pout_lline\output_debug{Font~x-scaled~by~ \expandafter\lose_measure\the\xscale_factor. } \fi \ifdim \slant_factor=\z@ \else \pout_lline\output_debug{Font~slanted~by~ \expandafter\lose_measure\the\slant_factor. } \fi \debug_values_hook } % \end{macrocode} % \end{macro} % % % \begin{macro}{\debug_value} % The |\debug_value| macro can be used to print the name and contents % of an arbitrary value macro in the |debug| driver. It is called with % the value macro as argument, e.g. % \begin{quote} % |\debug_value\PS_font_name| % \end{quote} % % \begin{macrocode} \def\debug_value#1{ \ifx #1\unknown_str \csname get_ \expandafter\gobble_one \string#1 \endcsname \fi \pout_lline\output_debug{\string#1:~#1} \ifx #1\clueless_str \includewarning\warn_undecided_data \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\debugvalue} % \begin{macro}{\debug_values_hook} % The |\debugvalue| command is a user level interface for adding % value macros to the list of those that are displayed by the % \texttt{debug} driver. The argument is the name of the value in % question, e.g. % \begin{quote} % |\debugvalue{PS_font_name}| % \end{quote} % Note that the name given to |\debugvalue| is not the control % sequence in which the name is stored. % \begin{macrocode} \def\debugvalue#1{ \expandafter\add_to \expandafter\debug_values_hook \expandafter{ \expandafter\debug_value \csname#1\endcsname} } % \end{macrocode} % \begin{macrocode} \let\debug_values_hook\empty_command \debugvalue{PS_font_name} % \end{macrocode} % \end{macro}\end{macro} % % % \subsubsection{The \texttt{dvips} driver} % % \changes{1.912}{2000/02/19}{\texttt{dvips} mapfile fragments writer % added. (LH)} % Before constructing an entry for a \package{dvips} mapfile, it should % be sorted out how such an entry should look. The \package{dvips} % manual says % \begin{quotation} % The parsing of the \texttt{psfonts.map} file should be explained to % eliminate all confusion. If a line is empty or begins with a space, % asterisk, semicolon, or hash mark, it is ignored. Each remaining % line is separated into words, where words are separated by spaces or % tabs. If a word begins with a double quote, it extends until the % next double quote or the end of the line. If a word starts with a % less than character, it is treated as a font header file (or a % downloaded PostScript font). There can be more than one such header % for a given font. If a word starts with a double quote, it is a % special instruction for generating that font. Otherwise it is a % name. The first such name is always the name \TeX\ uses for the % font and is also the name of the raw \texttt{tfm} file. If there is % another name word, that name is used as the PostScript name; if % there is only one name word, it is used for both the \TeX\ name and % the PostScript name. % \end{quotation} % % A \package{fontinst}-generated map file entry for the \texttt{dvips} % driver has the following structure: % \begin{isyntax} % \meta{\TeX{} font name} \meta{PS font name} \meta{downloads} % \meta{font transformations} % \end{isyntax} % \meta{\TeX{} font name} is simply the value of |\TeX_font_name| and % \meta{PS font name} is simply the value of |\PS_font_name|. % \meta{downloads} is a possibly empty sequence in which each item % has the form % \begin{quote} % \meta{prefix}\meta{filename} % \end{quote} % The \meta{prefix} values I've came across are empty,\footnote{I think % this is only used for files that \package{dvips} should ignore, but % which certain other programs that read the same \texttt{psfonts.map} % need.} |<|, |<<|, and |<[|. Currently |<| is always used. % \meta{filename} is a filename with suffix. \meta{font transformations} % is either empty or has the form % \begin{quote} % |"| \meta{Postscript code} |"| % \end{quote} % % Should support for the |<<| or |<[| prefixes be needed, then this % should be done by adding some new variant of the |\download| % command---|\fullldownload|, maybe---rather than adding the extra % character to the \meta{filename}. To simplify matters for other drivers, % such new variants should by default expand to |\download|, rather than % |\gobble_one|. % % % \begin{macro}{\downloads_list} % \begin{macro}{\append_download} % The |\downloads_list| is a token list register which is especially % used for accumulating |\download| commands. Each driver maker which % uses it should begin by emptying it. The command % \begin{quote} % |\append_download|\marg{cseq}\marg{string expression} % \end{quote} % \changes{1.931}{2005/05/10}{New syntax (two arguments)! The second % is expanded, whereas the first is protected by a \cs{noexpand}. % (LH)} % appends % \begin{quote} % \meta{cseq}\marg{expanded string expression} % \end{quote} % to |\downloads_list|. It overwrites |\a_macro|. % \begin{macrocode} \newtoks\downloads_list \def\append_download#1#2{ \edef\a_macro{ \downloads_list = \noexpand\expandafter{ \noexpand\the \downloads_list \noexpand#1 {#2} } } \a_macro } % \end{macrocode} % \end{macro}\end{macro} % % % \begin{macro}{\make_dvips} % This macro gathers the information for a \texttt{dvips} driver entry % and writes it to the corresponding output file. As a \texttt{dvips} % mapfile entry is on one line, the entire entry is written at once. % The \meta{font transformations} is collected as explicit text in the % macro |\postscript_code|. The \meta{downloads} is collected as a % sequence of |\|\dots|download| commands in the |\downloads_list| % token register. % \changes{1.931}{2005/05/10}{Supporting \cs{fulldownload} and % \cs{encodingdownload}. (LH)} % \begin{macrocode} \def\make_dvips{ \downloads_list={} \let\postscript_code\empty_command \def\download{\append_download\download} \def\fulldownload{\append_download\fulldownload} \def\encodingdownload{\append_download\encodingdownload} \ifx \reencode_etx\empty_command \else \if_undefined{pse-\reencode_etx}\then \etxtoenc{\reencode_etx}{\reencode_etx} \fi \expandafter\expandafter \expandafter\second_of_two \csname pse-\reencode_etx\endcsname \edef\postscript_code{\postscript_code\space \expandafter\expandafter \expandafter\first_of_two \csname pse-\reencode_etx\endcsname \space ReEncodeFont } \fi \ifdim \xscale_factor=\p@ \else \edef\postscript_code{\postscript_code \space\expandafter\lose_measure\the\xscale_factor \space ExtendFont } \fi \ifdim \slant_factor=\z@ \else \edef\postscript_code{\postscript_code \space\expandafter\lose_measure\the\slant_factor \space SlantFont } \fi % \end{macrocode} % After constructing the \meta{Postscript code} and having appended % the necessary download (if any) for that code, the next problem is % to determine the actual \meta{PS font name} and append the downloads % needed to actually define the font to the Postscript interpreter. If % there is no special entry for this font in the |\psf-|\meta{PS font % name} table, or if its \meta{PS font name} is unknown, then it is % assumed that exactly one file should be downloaded. As the name of % that file is taken the value of |\PS_font_file|. % \begin{macrocode} \ifx \PS_font_name\unknown_str \get_PS_font_name \fi \ifx \PS_font_name\clueless_str \includewarning\warn_undecided_data \_a_true \else \if_undefined{psf-\PS_font_name}\then \_a_true \else \csname psf-\PS_font_name \endcsname \_a_false \fi\fi \if_a_ \ifx \PS_font_file\unknown_str \get_PS_font_file \fi \append_download\download{\PS_font_file} \ifx \PS_font_file\clueless_str \includewarning\warn_undecided_data \fi \fi % \end{macrocode} % Finally, the entire entry is written to the file. The point with % expanding past an empty command is that \TeX\ in a |\write| normally % jumps past the expansion of a |\the|\meta{token list register} % without expanding it further, but this effect can be prevented by % expanding the |\the| with an |\expandafter|. % \begin{macrocode} \def\download##1{~<##1} \def\fulldownload##1{~<<##1} \def\encodingdownload##1{~<[##1} \pout_line\output_dvips{ \TeX_font_name\space\PS_font_name \expandafter\empty_command \the\downloads_list \ifx \postscript_code\empty_command \else \space"\postscript_code\space" \fi } } % \end{macrocode} % \end{macro} % % % % \subsubsection{The \texttt{dvipdfm} driver} % % \changes{1.912}{2000/02/22}{\texttt{dvipdfm} mapfile fragments writer % added. (LH)} % % A mapfile entry for the \texttt{dvipdfm} driver has the following % structure: % \begin{isyntax} % \meta{\TeX{} font name} \meta{encoding} \meta{PS font} % \meta{options} % \end{isyntax} % \meta{\TeX{} font name} is simply the value of |\TeX_font_name|. % \meta{encoding} is the name of the encoding file which should be used % to reencode the font, or \texttt{default} if there is none. \meta{PS % font} is the value of |\PS_font_name| for the standard 35 fonts % (i.e., fonts which will not be included in the PDF generated), but for % other fonts it is the name of the file which contains the % font.\footnote{The documentation seems to say that \texttt{dvipdfm} % can only understand fonts in PFB format; I have chosen to ignore this % potential problem.} \meta{options}, finally, is a possibly empty % sequence of space-separated options. Each option is one of the % following % \begin{quote} % |-e |\meta{number}\\ % |-s |\meta{number}\\ % |-r| % \end{quote} % The |-e| and |-s| options extend and slant by the given amounts. The % |-r| option is a workaround for some Acrobat bugs; it is currently not % generated by \package{fontinst}. % % \begin{macro}{\make_dvipdfm} % This macro gathers the information for a \texttt{dvipdfm} driver entry % and writes it to the corresponding output file. As a \texttt{dvipdfm} % mapfile entry is on one line, the entire entry is written at once. % The \meta{options} text is collected as explicit text in the % macro |\options_text|. The \meta{downloads} is collected as a % sequence of |\download| commands in the |\downloads_list| token % register. % \begin{macrocode} \def\make_dvipdfm{ \def\font_encoding{default} \ifx \reencode_etx\empty_command \else \if_undefined{pse-\reencode_etx}\then \etxtoenc{\reencode_etx}{\reencode_etx} \fi \def\download##1{\def\font_encoding{##1}} \expandafter\expandafter \expandafter\second_of_two \csname pse-\reencode_etx\endcsname \fi \let\options_text\empty_command \ifdim \xscale_factor=\p@ \else \edef\options_text{\options_text\space -e~\expandafter\lose_measure\the\xscale_factor } \fi \ifdim \slant_factor=\z@ \else \edef\options_text{\options_text\space -s~\expandafter\lose_measure\the\slant_factor } \fi % \end{macrocode} % After constructing the \meta{options} and having determined % \meta{encoding}, the next problem is to determine the actual % \meta{PS font}, which will be put in |\a_macro|. If there is no % special entry for this font in the |\psf-|\meta{PS font name} table, % or if its \meta{PS font name} is unknown, then it is assumed that % exactly one file should be downloaded. As the name of that file is % taken the value of |\PS_font_file|. % \begin{macrocode} \ifx \PS_font_name\unknown_str \get_PS_font_name \fi \if_or \if_equal\PS_font_name\clueless_str \or_else \if_undefined{psf-\PS_font_name} \then \ifx \PS_font_file\unknown_str \get_PS_font_file \fi \ifx \PS_font_file\clueless_str \includewarning\warn_undecided_data \fi \let\a_macro=\PS_font_file \else \let\a_macro=\PS_font_name \def\download##1{\def\a_macro{##1}} \csname psf-\PS_font_name \endcsname \fi % \end{macrocode} % Finally, the entire entry is written to the file. % \begin{macrocode} \pout_line\output_dvipdfm{ \TeX_font_name\space\font_encoding\space\a_macro \options_text } } % \end{macrocode} % \end{macro} % % % \subsubsection{The \texttt{pltotf} ``driver''} % \changes{1.915}{2000/06/27}{\texttt{pltotf} ``driver'' support % added. (LH)} % % It can sometimes be hard to determine which of all the PL files that % \package{fontinst} creates need to be converted to TFM files. In most % cases no \texttt{8a}-encoded PLs need to be converted as they aren't % used as base fonts or installed in an FD file, but to automatically % exclude them isn't a trivial task (even though it probably could be % done by a regular expression filter for fonts named according to the % \texttt{fontname} scheme). There furthermore seems to be some systems % on which it for various reasons isn't easy to convert all PLs in a % directory. The \texttt{pltotf} ``driver'' support is meant to help with % both these problems, as the ``map file'' it creates really is a shell % script (batch file) for converting precisely those PL files that need % a map file entry to TFM format. I believe the shell script will work % both for UNIX and DOS systems. % % \begin{macro}{\make_pltotf} % \begin{fistring}{TFMfileprefix} % |\make_pltotf| writes a \package{PLtoTF} command for converting the % current font's PL file to a TFM file. If set, the string % \texttt{TFMfileprefix} will be prepended to the TFM file name---this % could be used for putting the TFMs in some directory other than the % current. % \begin{macrocode} \def\make_pltotf{ \pout_line\output_pltotf{pltotf~\TeX_font_name.pl~ \ifisstr{TFMfileprefix}\then \str{TFMfileprefix}\fi \TeX_font_name.tfm } } % \end{macrocode} % \end{fistring}\end{macro} % % % \begin{macrocode} % % \end{macrocode} % \Finale \endinput