diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /systems/msdos/utilities/vfcomb/vfc-eng.tex |
Initial commit
Diffstat (limited to 'systems/msdos/utilities/vfcomb/vfc-eng.tex')
-rw-r--r-- | systems/msdos/utilities/vfcomb/vfc-eng.tex | 2421 |
1 files changed, 2421 insertions, 0 deletions
diff --git a/systems/msdos/utilities/vfcomb/vfc-eng.tex b/systems/msdos/utilities/vfcomb/vfc-eng.tex new file mode 100644 index 0000000000..348e560f9e --- /dev/null +++ b/systems/msdos/utilities/vfcomb/vfc-eng.tex @@ -0,0 +1,2421 @@ +\documentstyle{article} +\title{\VFC{} 1.3 \\[1.5ex] +the program for the designers of the virtual fonts} + +\author{A.S.Berdnikov\\ +Institute of Analytical Instrumentation\\ +Rizsky pr. 26, 198103 St.Petersburg, Russia\\ +email: {\tt berd{\sl @}ianin.spb.su}} + +\date{June 22, 1996} + +\newcommand{\VFC}{{\sl VFComb\/}} +\newcommand{\bs}{\char '134 } % char \ +\renewcommand{\contentsname}{} + +\begin{document} +\maketitle +\tableofcontents +\clearpage + +\section*{Introduction\label{Sect-Intr}}% +\addcontentsline{toc}{section}{Introduction} + +The MS DOS program \VFC\ enables to design the virtual +fonts for \TeX, \LaTeX, etc., using already +existing real or virtual fonts \cite{VF}\footnote{It is assumed +that you are familiar with the concept of the virtual fonts and with the +article \cite{VF}. If it is not so, it is highly recommended +to read \cite{VF} before you proceed further.} in a more flexible +manner than the direct manipulations with {\tt .vpl} files. +It simplifies the process of combining real fonts into the virtual font +and makes the debugging of the virtual fonts more simple +and less time consuming. The main purpose of this program was to +facilitate the integration of CM-fonts with cyrillic LL-fonts +created by O.Lapko and A.Khodulev \cite{LL,LH} but it can be used for +other applications too\footnote{Since this MS DOS program is written +on {\sl Borland Pascal} and uses some specific features +of this language, it is hardly portable ``as it is'' to any other platform, +but to my mind it is not too difficult to transfer it to portable ANSI C +(volunteers are welcome).}. + +The characteristic feature of the program is that it can assemble +the ligature tables and metric information from various fonts +and combine it with the user-defined metric information +and ligature/kerning data. +The program uses the information from {\tt .tfm} files +(converted to ASCII format by the utility {\sl TFtoPL}) and the ASCII +data files created by the User, and produces +the ASCII {\tt .vpl} file on its output. +The {\tt .vpl} file can be converted later to the +virtual font using the utility {\sl VPtoVF}. + +\VFC{} supports the full syntaxis of {\tt .pl} and {\tt .vpl} +files as it was defined by D.E.Knuth \cite{VF} and adds +new commands like numerical variables, pseudo-arithmetics +operations and conditional operators, +which simplifies the design of the virtual fonts. +The typical virtual font operations are performed automatically +and require a compact \VFC{} script file. +The \VFC{} script files have flexible structure +so that just the same script files can be used +to create the full generic font family. + +The commands from the \VFC{} script file enables: +\begin{itemize} +\item + specify the information about the mapping table + between the characters of the virtual font and the + real fonts; +\item + specify the explicit sequences of {\sl DVI}-commands + substituted instead of some characters of the virtual + font; +\item + extract metric information and ligature tables + from the {\tt .pl} files (converted from {\tt .tfm} files) + which describe the properties of the real fonts; +\item + add user-defined metric information and ligature tables + (for example, the ligature and kerning data for the pairs + of characters corresponding to different real fonts); +\item + include automatically new characters + if these characters are connected by the attributes {\tt VARCHAR}, + {\tt NEXTLARGER} or ligature table data with the characters + already included into the virtual font; +\item + insert automatically the {\tt DVI}-commands which + correct the {\tt DVI}-cursor position if the metric + information from the virtual font is different from that + for the real font; +\item + create the output {\tt .vpl} file which combines all these data. +\end{itemize} + +All input and output files are the ordinary ASCII files. +The command line of the program specifies +the name of the script file (the script file contains +the commands which control the work of the program), +and, may be, defines some variables which are analyzed and used later +inside the script file. +The output of the program is the {\tt .vpl} file which contains +all information necessary to create the virtual font using +the utility {\sl VPtoVF} and the {\tt .log} file which summarizes +all printed messages and all operations +performed by {\sl VFComb}. + +\section{Command-line parameters\label{Sect-CL}} + +The command line contains the list of parameters +which are separated by spaces (the body of the parameter +should contain {\em no} spaces). +The following parameters can be specified: +\begin{itemize} +\item +the name of the script file (the obligatory parameter); +\item +the definition of some variables which are used later in the script file +(variable specifications always contain the character `{\tt =}' +in its body); +\item +the name of the log-file, the names of the +directories which used as a source for the input files, +the directory for the output files, etc. +(these parameters start with the character +`{\tt /}'\footnote{The characters `{\tt !}', `{\tt -}', `{\tt +}' +can be used as well.}). +\end{itemize} +The order of the parameters is of no sence\footnote{% +The {\em only} exception: if the {\tt .log} file name specified +by the command line parameter {\tt /o} does not contain the explicit +directory specification, the directory specified by the parameter +{\tt /o} is used only if this parameter is specified {\em before} +the parameter {\tt /l} (the command line parameters {\tt /l} and {\tt /o} +are described in section~\ref{Sect-CL-Other}).}. +The {\em responce files} (see section~\ref{Sect-CL-RFiles}) +specified in a form `{\tt @{\em filename}}' +and DOS environment variable {\tt VFCOMB} +(see section \ref{Sect-CL-VFCOMB}) +can be used to define the parameters +which are too long or which are specified too often +to be typed manually at the command line. + +\subsection{Script file name\label{Sect-CL-Script}} + +The parameters which specify +the name of the log-file, the names of the +directories which are used as a source for the input files, +the directory for the output files, etc., +start with the character `{\tt /}' +(the characters `{\tt !}', `{\tt -}', `{\tt +}' can be used as well). +The values of variables specified at the command line +contain the character `{\tt =}' in its body. +The {\em responce file} name starts with the character `{\tt @}'. +All other constructions are recognized as the {\em script file} name. + +The {\em script file} is the main source of the commands +which are processed by \VFC{} and which control the creation +of the output {\tt .vpl} file. +If the script file name has no extension, the extension {\tt .tbf} +is added automatically. If the script file name has no explicit +directory specification and it is not found in the current directory, +\VFC{} looks for it in the directories specified by the parameter +{\tt /u}. + +The User should specify only {\em one} script file at the command line +(previous versions of \VFC{} enabled to specify {\em several} script files +in the command line). +If several script files are specified (or if there are the command line +parameters which are not recognized by \VFC{} properly as the variable +specifications, responce file names, etc.), the new name redefines +the previous one after the warning message. +If one needs to combine several {\tt .tbf} files into one stream +of commands, the command {\tt LOADFILE} (section~\ref{Sect-VFC-OTHER}) +specified inside the script file can be used to do it. + +\subsection{Variables\label{Sect-CL-Var}} + +The script file commands can use the variables to specify +the numerical and text data. +Usually the variables and their values are specified by the +script file commands described in section~\ref{Sect-VFC-VAR}. +This section considers how it is possible +to specify the variables and their values {\em at the command line} so +that they can be analyzed by the script file commands when the script file +is processed by \VFC. + +The definition of the {\em string} variable +and its initial value is performed by the construction +``{\tt {\em name}={\em value}}'' +--- when such parameter is encountered in the command line, +a new string variable {\em name} is allocated, and the text string +{\em value} is assigned to it. + +The {\em numerical} variables can be specified if the special suffix +is added at the end of the field {\em value}\footnote{Usually it is +not necessary since the User can allocate the +numerical variables and assign the numerical values to them +just by analyzing the contents of the string variables +specified at the command line.}: +\begin{itemize} +\item {\tt /r} or {\tt /R} +corresponds to {\em real variable}; +\item +{\tt /F}, {\tt /D}, {\tt /H}, {\tt /O}, {\tt /B}, {\tt /C} +correspond to {\em 32-bit integer} variable where +{\tt /F} means {\em face code} value, +{\tt /D} means {\em decimal} value, +{\tt /H} means {\em hexadecimal} value, +{\tt /O} means {\em octal} value, +{\tt /B} means {\em binary} value, +{\tt /C} means {\em character code} (integer value); +\item +{\tt /f}, {\tt /d}, {\tt /h}, {\tt /o}, {\tt /b}, {\tt /c} +correspond to the {\em byte} (8-bit integer) variable which are usually +used to define the character codes --- similarly to integers, +{\tt /f} means {\em face code}, +{\tt /d} means {\em decimal} value, +{\tt /h} means {\em hexadecimal} value, +{\tt /o} means {\em octal} value, +{\tt /b} means {\em binary} value, +and {\tt /c} means {\em character code}; +\item +{\tt /@F}, {\tt /@D}, {\tt /@H}, {\tt /@O}, {\tt /@B}, {\tt /@C} +and their lowercase forms +define the string variable with the contents equal to decimal representation +of corresponding integer value --- for example, the parameter +`{\tt tmp=377/@O}' is equivalent to `{\tt tmp=255}' +(octal number 377 has the decimal representation 255). +The suffix `{\tt @}' is equivalent to `{\tt @D}' and `{\tt @d}', +and all three specifications are of no use since `{\tt S=12345/@D}' +is just the same as `{\tt S=12345}'. +\end{itemize} +The contents of the field {\em value} is to be +in agreement with the suffix specification +(see section~\ref{Sect-VFC-NUM} for more details). +Examples: +\begin{description} +\item[\quad{\tt vfcomb fntnam=CMR10 ...}] --- string variable; +\item[\quad{\tt vfcomb rval=3.14159/r ...}] --- real variable; +\item[\quad{\tt vfcomb ival=CDEF/H ...}] --- integer variable with hexadecimal value; +\item[\quad{\tt vfcomb cval=X/c ...}] --- byte variable which is +the character code for {\tt "X"}. +\end{description} + +\subsection{Other parameters\label{Sect-CL-Other}} + +The parameters which specify the log-file name, etc., start +with one of the characters `{\tt /}', `{\tt !}', `{\tt -}', `{\tt +}' +followed by the {\em parameter identifier} (a single character) and the +parameter value. The parameter identifier and the parameter +value can be separated by `{\tt :}' or `{\tt =}' to achieve better +readability. Example: +\begin{itemize} +\item[] +{\tt vfcomb ... /l:vfcomb.log -u=c:\bs{}myinput;c:\bs{} !oOUTPUT\bs{} ...} +\end{itemize} +The previous version of \VFC{} used a lot of such parameters +but now most of them are moved inside the script file. +The following parameters can be specified at the command line: +\begin{itemize} + +\item {\tt /u={\em list-of-dirs}} --- specifies the list of directories + separated by `{\tt ;}' which are used to search for the + input files if the input file is absent in the currect directory. + Several parameters {\tt /u} can be specified --- in this case + they are joined together. The maximum number of the search + directories is 20, and the new {\sf em\TeX} + directory search algorithm (see {\sf em\TeX} documentation) + is not implemented. + +\item {\tt /l={\em log-file-name}} --- specifies the name for the + {\tt .log} file which summarizes the operations performed + by {\sl VFComb}. + By default the name {\tt {\em scriptfile}.LOG} is used, but + if the script file is unknown when the first \VFC{} message is printed, + the {\tt .log} file has the name {\tt VFCOMB.LOG}. + +\item {\tt /o={\em output-dir}} --- specifies the directory + where the output files ({\tt .vpl} and {\tt .log} files) + are to be placed if their directories are not specified explicitly. + +\end{itemize} + +\subsection{Responce files\label{Sect-CL-RFiles}} + +The User can specify the construction +`{\tt @{\em filename}}' among the list of the command line +parameters which means that the contents of the file {\em filename} +is added to the contents the command line. + +Each line of the responce file is interpreted as +a separate parameter. The initial spaces +of the line are omitted, and the characters after +the first space which terminates the parameter are omitted too. +The lines which start from the characters +{\tt '\%'}, {\tt ';'}, {\tt '*'} and the empty lines are ignored. + +The responce files can be nested in each other +(that is, the responce file can have the line {\tt @}{\em filename$1$} +again) but the depth of their nesting cannot be greater than 5. + +\subsection{Environment variable {\tt VFCOMB}\label{Sect-CL-VFCOMB}} + +The User can define the DOS environment variable {\tt VFCOMB} +using the command +\begin{itemize} +\item[] {\tt SET VFCOMB=......} +\end{itemize} +The contents of this variable is added +{\em at the beginning} of the command line. +As a result, the contents of the command line redefines +the default specifications established by +the environment variable {\tt VFCOMB} +if some parameters are specified twice. + +\section{Script file commands\label{Sect-VFC}} + +The \VFC{} syntaxis is very close to the syntaxis of {\tt .vpl} +files (it enables to economize the program code +since \VFC{} is to read and to analyze the {\tt .vpl} files +in any case). +That is, the {\tt .tbf}, {\tt .pl} and {\tt .vpl} files are composed +from the entries specified in a form +\begin{itemize} +\item[] {\tt (PROPERTYNAME VALUE)} +\end{itemize} +where the {\tt VALUE} can contain nested list structures as well. + +\bigskip + +The following extensions of {\tt .pl} and {\tt .vpl} syntaxis +\cite{VF} are used by \VFC: +\begin{itemize} +\item new types of numerical constants; +\item numerical variables; +\item pseudo-arithmetical expressions; +\item string variables and string expressions; +\item conditional operators. +\end{itemize} +These commands are described in details in section~\ref{Sect-VFC-VPL}. + +\bigskip + +The commands specific to \VFC{} {\tt .tbf} files enable to +specify the following data: +\begin{itemize} +\item the name of the virtual font (actually the name + of the output {\tt .vpl} file); +\item the header data which is specified at the + beginning of the virtual font; +\item the assignment (if necessary) the numerical values to + symbolic variables used in specification of other + user defined data; +\item the table(s) for mapping + the characters of the real fonts into + the characters of the virtual font; +\item the additional ligature table(s) (if present) which + contain the ligature and kerning information + for the pairs of characters corresponding + to different real fonts; +\item the metric information, + ligature and kerning tables, etc., + for the characters of the real fonts; +\item the options which control the process + of creation of the virtual font. +\end{itemize} + +\subsection{Extensions of {\tt .vpl} files\label{Sect-VFC-VPL}} + +The following commands and extensions of numerical data specifications +are valid for \VFC{} script files ({\tt .tbf} files) and for {\tt .pl} +and {\tt .vpl} files as well. These commands are processed inside +\VFC{} ``mouth'' subroutines, and as a result they are invisible +for the subroutines which analyze the syntaxis of {\tt .tbf}, {\tt .pl} +and {\tt .vpl} files. + +The structure of the algorithm which analyzes the +syntaxis of the input commands implies some restrictions on the way +these {\em preprocessor} commands can be used in the source files. +The {\em preprocessor} commands can be inserted at any point +where the argument {\tt (......)} is suitable. +So, they can be specified on the upper level of braces, +they can be specified as the argument of the command +{\tt (CHARACTER ...)} since it {\em has} the sub-list arguments, +but they cannot be specified inside the command +{\tt (CHECKSUM ...)} since there are {\em no} sub-list +agruments for this command. + +\subsubsection{Numerical values\label{Sect-VFC-NUM}} + +The syntaxis of {\tt .vpl} files enables to use +the numerical data of different forms. +The numerical data can be specified as real (floating point) values, +32-bit integer values and 8-bit integer values. +Depending of the context, real or integer values +should be used, and the range if the accepted +integer values depends on context also (say, character code +cannot be greater than 255 while the {\tt checksum} parameter +is a full 32-bit integer). + +Each value starts with the prefix letter preceeded by a space +and separated from the following actual value by a space +(as usually, there may be as many spaces as you need +at any place where at least one space is allowed). +The prefix character defines the type of the numerical +value, and the following types can be used: +\begin{description} +\item[\quad{\tt R} {\em value}] --- real values ({\tt R 0.27182}); +\item[\quad{\tt D} {\em value}] --- decimal integer values ({\tt D 123456}); +\item[\quad{\tt O} {\em value}] --- octal integer values ({\tt O 377}); +\item[\quad{\tt H} {\em value}] --- hexadecimal integer value ({\tt H 07FA}); +\item[\quad{\tt C} {\em character}] --- character numerical code ({\tt C x} + is the code value for character `{\tt x}'); +\item[\quad{\tt F} {\em ident}] --- Xerox {\em face code}, i.e., + an integer value which is substituted by + a 3-letter identifier ({\tt F LIE} = {\tt D 17}) + where the full list of the face codes assigned + to the integers from 0 to 17 + is: MRR, MIR, BRR, BIR, LRR, LIR, + MRC, MIC, BRC, BIC, LRC, LIC, + MRE, MIE, BRE, BIE, LRE, LIE. +\end{description} + +For \VFC{} input files in all places where the real values can be used, +the integer values can be used also, +and in all places where 32-bit integers are accepted, 8-bit +integers are accepted too. +\VFC{} also extends the set of prefix letters so that +more general and more flexible expressions can be constructed: +\begin{description} +\item[\quad{\tt B} {\em value}] --- binary integer value ({\tt B 011111111010}); +\item[\quad{\tt V} {\em var-name}] --- the value of some numerical + (real or integer) variable ({\tt V FntSize}); +\item[\quad{\tt V-} {\em var-name}] --- the {\em negated} value + of some numerical + (real or integer) variable ({\tt V- FntSize}); +\item[\quad{\tt V+} {\em var-name}] (unary `$+$') --- just the same as + {\tt V} {\em var-name} ({\tt V+ FntSize}); +\item[\quad{\tt V\~{}} {\em var-name}] --- bit-by-bit {\em negated} + value of an integer variable ({\tt V\~{} FntSize}); +\item[\quad{\tt A+} {\em value1} {\em value2}] + --- addition of two (real or integer) values (`{\tt A+ D 2 D 2}' = 4); +\item[\quad{\tt A-} {\em value1} {\em value2}] + --- subtraction of two (real or integer) values (`{\tt A- D 5 D 3}' = 2); +\item[\quad{\tt A*} {\em value1} {\em value2}] + --- multiplication of two (real or integer) values + (`{\tt A* D 5 D 3}' = 8); +\item[\quad{\tt A/} {\em value1} {\em value2}] + --- division (real or integer) of two (real or integer) values + (`{\tt A/ D 5 D 2}' = 2 for integers, + `{\tt A/ R 5.0 R 2.0}' = 2.5 for real values); +\item[\quad{\tt A\%} {\em value1} {\em value2}] + --- the residue of integer division (mod) of two integer or real values + (`{\tt A\% R 5.0 R 2.0}' = 1.0); +\item[\quad{\tt A!} {\em value1} {\em value2}] + --- bit-by-bit {\bf or} operation between two integer values + (`{\tt A! B 1010 B 0011}' = {\tt B 1011} = 11); +\item[\quad{\tt A\&} {\em value1} {\em value2}] + --- bit-by-bit {\bf and} operation between two integer values + (`{\tt A\& B 1010 B 0011}' = {\tt B 0010} = 2); +\item[\quad{\tt A\^{}} {\em value1} {\em value2}] + --- bit-by-bit {\bf xor} operation between two integer values + (`{\tt A\^{} B 1010 B 0011}' = {\tt B 1001} = 9); +\item[\quad{\tt A>} {\em value1} {\em value2}] + --- right shift of integer {\em value1} by {\em value2} bits + (`{\tt A> B 1010 D 2}' = {\tt B 10} = 2); +\item[\quad{\tt A<} {\em value1} {\em value2}] + --- left shift of integer {\em value1} by {\em value2} bits + (`{\tt A< B 1010 D 2}' = {\tt B 101000} = 40); +\item[\quad{\tt -A} {\em value}] + --- unary `$-$' + (`{\tt -A D 5}' = -5, `{\tt -A D -5}' = 5); +\item[\quad{\tt +A} {\em value}] --- unary `$+$' + (`{\tt +A {\em value}}' = {\em value}); +\item[\quad{\tt \~{}A} {\em value}] + --- bit-to-bit negated integer {\em value} + (`{\tt \~{}A B 1010}' = {\tt B 0101} = 5). +\end{description} +The arguments of the arithmetic expressions can be the arithmetic +expressions again which enables to build complex arithmetic forms +(similar to {\em polish notation}) --- unfortunately these forms +are not suitable for fast human recognition. +The arithmetic operations {\tt A!}, {\tt A\&}, +{\tt A\^{}}, {\tt A>}, {\tt A<}, {\tt \~{}A}, {\tt V\~{}} +can be used for integer arguments and only at the places +where the integer expression is required. + +\bigskip + +Although \VFC{} syntaxis enables to use complex string +constructions (see section~\ref{Sect-VFC-STRING}), +the values specified as the arguments +of the prefix commands {\tt R}, {\tt D}, {\tt O}, {\tt F}, {\tt C}, +{\tt H}, {\tt B}, {\tt V} are always the primitive text strings +(i.e., the sequences of characters terminated by a space +or the closing braces `{\tt)}'). +It means that the expression `{\tt D @V ABC}' where +{\tt ABC} is the string variable with the value {\tt "99"} is illegal +although one can assume that it is to be equivalent +to `{\tt D 99}'. + +There are some serious reasons not to allow the string expressions +to be the arguments of the arithmetic constants. +The simplest one is, for example, that in this case +it is impossible to convert the {\em legal} expression {\tt C @} into +numerical value {\tt D 64} as it is required by the rules +of {\tt .vpl} files. +Nevertheless, to enable to use such possibilities if necessary, +the following prefix commands are added +which enable to perform the conversion of +the string expressions into numerical values: +\begin{description} +\item[\quad{\tt D@} {\em string}] + --- interprete string expression as a decimal integer value; +\item[\quad{\tt O@} {\em string}] + --- interprete string expression as an octal integer value; +\item[\quad{\tt H@} {\em string}] + --- interprete string expression as a hexadecimal integer value; +\item[\quad{\tt B@} {\em string}] + --- interprete string expression as a binary integer value; +\item[\quad{\tt F@} {\em string}] + --- interprete string expression as an integer {\em face code}; +\item[\quad{\tt C@} {\em string}] + --- interprete string expression as a {\em character code} + (string is to be a single character); +\item[\quad{\tt R@} {\em string}] + --- interprete string expression as a real value; +\item[\quad{\tt V@} {\em string}] + --- interprete string expression as a name of a variable + (real or integer). +\end{description} + + +\subsubsection{String values\label{Sect-VFC-STRING}} + +Some {\tt .pl} and {\tt .vpl} commands require text strings as their +arguments (commands {\tt CODINGSCHEME}, {\tt FAMILY}, +{\tt VTITLE}, for example). +\VFC{} extends the set of numerical values +so that the string values, string variables and string +expressions can be used together with the numerical ones. +The specification of the {\em string variables} +and {\em string expressions} makes the specification of +some commands more flexible and +enables to prepare efficient and compact \VFC{} scripts. + +The string constants (contrary to the numerical constants) +have no special prefix --- they are just the sequences +of characters which can be surrounded by spaces. + Contrary to that +the string expressions start with the prefix `{\tt @}' --- +which means that a string constant {\em cannot} starts +from this letter but it does not restrict the flexibility +in specification of the string constants too much. + +The following string operations can be used: +\begin{description} +\item[\quad{\tt @V} {\em var-name}] + --- the value of some string variable defined previously + ({\tt @V HlpString}) + (essential note: the argument of the prefix command {\tt @V} + {\em can be} the string expression itself like that of the + prefix command {\tt V@} described at the previous section); +\item[\quad{\tt @R} {\em real-value}] + --- the real numerical value converted to a text string + (`{\tt @R A/ R 1 R 7}' = {\tt "0.14285714286"} + since `{\tt A/ R 1 R 7}' = $1/7$); +\item[\quad{\tt @D} {\em integer-value}] + --- the integer numerical value converted to decimal text + representation + (`{\tt @D O 377}' = {\tt "255"}); +\item[\quad{\tt @O} {\em integer-value}] + --- the integer numerical value converted to octal text + representation + (`{\tt @O D 255}' = {\tt "377"}); +\item[\quad{\tt @H} {\em integer-value}] + --- the integer numerical value converted to hexadecimal text + representation + (`{\tt @H D 255}' = {\tt "FF"}); +\item[\quad{\tt @B} {\em integer-value}] + --- the integer numerical value converted to binary text + representation + (`{\tt @H D 255}' = {\tt "11111111"}); +\item[\quad{\tt @F} {\em string-value}] + --- extract font name from the string + (`{\tt @F cmr10}' = {\tt "cmr"}); +\item[\quad{\tt @P} {\em string-value}] + --- extract the string part after the font name from the string + which for legal font names is the font design size in {\tt pt} + (`{\tt @P cmr10}' = {\tt "10"}); +\item[\quad{\tt @U} {\em string-value}] + --- convert the string value to uppercase form + (`{\tt @U cMr10}' = {\tt "CMR10"}); +\item[\quad{\tt @L} {\em string-value}] + --- convert the string value to lowercase form + (`{\tt @L cMr10}' = {\tt "cmr10"}); +\item[\quad{\tt @+} {\em string1} {\em string2}] + --- combines two strings into one string + (`{\tt @+ CMR 10}' = {\tt "CMR10"}); +\item[\quad{\tt @} {\em integer-value}] --- string which consists + from a single character with a specified code + ({\em integer-value} is in a range 0--255); +\item[\quad{\tt @@} {\em integer-value}] --- string + of the specified length composed from spaces; +\item[\quad{\tt @.}] --- empty string + (just the same as {\tt @@ D 0}). +\end{description} +As usually the numerical and string values can be the complex +expressions, not only the elementary constants. + +The sequences of string constants and string expressions +separated by spaces can be specified as the argument of +the commands like {\tt FAMILY}, {\tt CODINGSCHEME}, {\tt VTITLE}. +In this case the \VFC{} inserts a space +between individual string element and expands string expressions +to a form of a string constants. As a result the string composed +from a sequence of words separated by spaces (where multiple subsequent +spaces are compressed into one space) can be constructed +and written into the output {\tt .vpl} file. + + +\subsubsection{Variables\label{Sect-VFC-VAR}} + +As it was mentioned in sections \ref{Sect-VFC-NUM} and \ref{Sect-VFC-STRING}, +it is possible to allocate {\em variables} and to assign +the {\em values} for them so that these values can be analysed and used +later. The variables have different types: real, integer, character (byte) +and string. The usage of the variables and the values assigned +to the variables are to be in agreement with their type. + +The operator which allocates a new variable has a form: +\begin{itemize} +\item[] {\tt (VARIABLE ({\em var-type} {\em var-name} {\em var-value}))} +\end{itemize} +where +\begin{itemize} +\item {\em var-type} is one of the identifiers + {\tt REAL}, {\tt INTEGER}, {\tt CHARACTER} + ({\tt CHAR}, {\tt BYTE}) or {\tt STRING}, + which define the type of the variable; +\item {\em var-name} is the name of the variable + which is to be different from the names of the other + variables; +\item {\em var-value} is the real, 32-bit integer, + 8-bit integer or string expression which defines + the initial value of the variable. +\end{itemize} +Example: +\begin{itemize} +\item[] {\tt (VARIABLE (CHARACTER Del D 127))}\\ + {\tt (VARIABLE (REAL Kern\#KKK R -0.3333))} +\end{itemize} + +It is possible to allocate more than one variable +inside one operator {\tt VARIABLE} by specifying +several sublists inside it: +\begin{itemize} +\item[] {\tt (VARIABLE}\\ + \phantom{.}\qquad{\tt (CHARACTER Del D 127)}\\ + \phantom{.}\qquad{\tt (REAL Kern\#KKK R -0.3333)}\\ + \phantom{.}\qquad{\tt ......}\\ + {\tt )} +\end{itemize} + +The variable names are case-sensitive: the variables +with the names {\tt Var} and {\tt vAr} are different. +The variable names can be composed using {\em arbitrary} characters, +not only latin letters and digits. +Nevertheless, it is better not to use the names started from `{\tt @}' --- +otherwise it is possible to get a strange behaviour +for the prefix commands {\tt V@} and {\tt @V} (the arguments +of these commands are analyzed as string expressions, and in this case +the first letter `{\tt @}' is recognized as the prefix of string +operastion). + +If the operator {\tt VARIABLE} uses the name which was already +used, the warning message is printed and the old variable +is deleted. +The variable value can be changed without the warning message +by the operator {\tt ASSIGN} which has the form +\begin{itemize} +\item[] {\tt (ASSIGN {\em var-name} {\em var-value})} +\end{itemize} +The type of the value {\em var-value} is to be in agreement +with the trype of the variable defined earlier. +Only one variable can be changed in one operator {\tt ASSIGN}. +Example: +\begin{itemize} +\item[] {\tt (ASSIGN Del D 255)}\\ + {\tt (ASSIGN Kern\#KKK R +1.51134)} +\end{itemize} + +It is possible also to allocate new vartiables and to assign +their initial values directly from the command line --- +see section~\ref{Sect-CL-Var} for more details. + +\subsubsection{Conditional operators\label{Sect-VFC-IFF}} + +\VFC{} script files can contain the conditional +{\tt IF-THEN-ELSE} operators. The following groups +of conditional operators can be used: +\begin{itemize} +\item comparison of integer values; +\item comparison of real values; +\item comparison of string values; +\item operators which check the existance of the variables; +\item integer {\tt IF-CASE} operators; +\item string {\tt IF-CASE} operators. +\end{itemize} +The depth of {\tt IF-THEN-ELSE}-operators cannot exceed 50. + +\bigskip + +The general form of {\tt IF}-operators is the following: +\begin{itemize} +\item[]{\tt (IF-{\em condition} {\em if-data})}\\ + \phantom{WWW}{\tt .........}\\ + \phantom{WWW}{\em commands}\\ + \phantom{WWW}{\tt .........}\\ + {\tt (ELSE)}\\ + \phantom{WWW}{\tt .........}\\ + \phantom{WWW}{\em commands}\\ + \phantom{WWW}{\tt .........}\\ + {\tt (ENDIF)} +\end{itemize} +The general form of {\tt IF-CASE}-operators is the following: +\begin{itemize} +\item[]{\tt (IF-CASE-{\em condition} {\em if-case-data})}\\ + \phantom{WWW}{\tt (CASE {\em case-value1})}\\ + \phantom{WWW}{\tt .........}\\ + \phantom{WWW}{\em commands}\\ + \phantom{WWW}{\tt .........}\\ + \phantom{WWW}{\tt (BREAK)}\\ + \phantom{WWW}{\tt (CASE {\em case-value2})}\\ + \phantom{WWW}{\tt .........}\\ + \phantom{WWW}{\em commands}\\ + \phantom{WWW}{\tt .........}\\ + \phantom{WWW}{\tt (BREAK)}\\ + \phantom{WWW}{\tt .........}\\ + {\tt (ELSE)}\\ + \phantom{WWW}{\tt .........}\\ + \phantom{WWW}{\em commands}\\ + \phantom{WWW}{\tt .........}\\ + {\tt (ENDIF)} +\end{itemize} +As usually, the {\tt ELSE}-block can be skipped together +with the command {\tt (ELSE)}. + +\bigskip + +Actually {\tt IF-}commands and {\tt IF-CASE}-commands are the preprocessor +operators which are used by \VFC{} read-data subroutines +to skip some blocks of input data. +{\tt IF}-commands transfer the block after {\tt IF-}command if some +condition is fulfilled, and transfer {\tt ELSE}-block if it is not +fulfilled. +{\tt IF-CASE}-operators check that {\em if-case-data} is equal to +{\em case-value} and transfer the corresponding block of commands +further. The {\tt CASE}-block is to be +terminated by {\tt (BREAK)} --- like {\sl C} conditional +operators the {\tt CASE}-block is not terminated automatically +when the next {\tt (CASE ...)} is encountered. + +\bigskip +The following {\tt IF}-conditions and {\tt IF-CASE}-conditions can be used: +\begin{description} +\item[\quad\tt(IF {\em integer-value})] + --- checks that some integer expression is not equal to zero; +\item[\quad\tt(IF-NOT {\em integer-value})] + --- checks that some integer expression is equal to zero; +\item[\quad{\tt(IF-ONE {\em integer-value})}, + {\tt(IF-TRUE {\em integer-value})}] + --- just the same as the command {\tt(IF {\em integer-value})}; +\item[\quad{\tt(IF-ZERO {\em integer-value})}, + {\tt(IF-FALSE {\em integer-value})}] + --- just the same as the command {\tt(IF-NOT {\em integer-value})}; +\item[\quad\tt(IF-DEF {\em var-name})] + --- checks that some variable is defined already; +\item[\quad\tt(IF-NDEF {\em var-name})] + --- checks that some variable is not defined still; +\item[\quad{\tt(IF-EQ {\em integer$_1$} {\em integer$_2$})}] + --- checks that $\hbox{\em integer}_1=\hbox{\em integer}_2$; +\item[\quad{\tt(IF-NE {\em integer$_1$} {\em integer$_2$})}] + --- checks that $\hbox{\em integer}_1\ne\hbox{\em integer}_2$; +\item[\quad{\tt(IF-GT {\em integer$_1$} {\em integer$_2$})}] + --- checks that $\hbox{\em integer}_1>\hbox{\em integer}_2$; +\item[\quad{\tt(IF-LT {\em integer$_1$} {\em integer$_2$})}] + --- checks that $\hbox{\em integer}_1<\hbox{\em integer}_2$; +\item[\quad{\tt(IF-GE {\em integer$_1$} {\em integer$_2$})}] + --- checks that $\hbox{\em integer}_1\ge\hbox{\em integer}_2$; +\item[\quad{\tt(IF-LE {\em integer$_1$} {\em integer$_2$})}] + --- checks that $\hbox{\em integer}_1\le\hbox{\em integer}_2$; +\item[\quad{\tt(IFR-EQ {\em real$_1$} {\em real$_2$})}] + --- compare two real values: $\hbox{\em real}_1=\hbox{\em real}_2$; +\item[\quad{\tt(IFR-NE {\em real$_1$} {\em real$_2$})}] + --- compare two real values: $\hbox{\em real}_1\ne\hbox{\em real}_2$; +\item[\quad{\tt(IFR-GT {\em real$_1$} {\em real$_2$})}] + --- compare two real values: $\hbox{\em real}_1>\hbox{\em real}_2$; +\item[\quad{\tt(IFR-LT {\em real$_1$} {\em real$_2$})}] + --- compare two real values: $\hbox{\em real}_1<\hbox{\em real}_2$; +\item[\quad{\tt(IFR-GE {\em real$_1$} {\em real$_2$})}] + --- compare two real values: $\hbox{\em real}_1\ge\hbox{\em real}_2$; +\item[\quad{\tt(IFR-LE {\em real$_1$} {\em real$_2$})}] + --- compare two real values: $\hbox{\em real}_1\le\hbox{\em real}_2$; +\item[\quad{\tt(IFS-EQ {\em string$_1$} {\em string$_2$})}] + --- compare two text strings: $\hbox{\em string}_1=\hbox{\em string}_2$; +\item[\quad{\tt(IFS-NE {\em string$_1$} {\em string$_2$})}] + --- compare two text strings: $\hbox{\em string}_1\ne\hbox{\em string}_2$; +\item[\quad{\tt(IFS-GT {\em string$_1$} {\em string$_2$})}] + --- compare two text strings: $\hbox{\em string}_1>\hbox{\em string}_2$; +\item[\quad{\tt(IFS-LT {\em string$_1$} {\em string$_2$})}] + --- compare two text strings: $\hbox{\em string}_1<\hbox{\em string}_2$; +\item[\quad{\tt(IFS-GE {\em string$_1$} {\em string$_2$})}] + --- compare two text strings: $\hbox{\em string}_1\ge\hbox{\em string}_2$; +\item[\quad{\tt(IFS-LE {\em string$_1$} {\em string$_2$})}] + --- compare two text strings: $\hbox{\em string}_1\le\hbox{\em string}_2$; +\item[\quad{\tt(IF-CASE {\em integer-value})}] + --- integer {\tt IF-CASE}-operator that checks that + the {\em integer-value} is equal to the argument of some + {\tt (CASE {\em integer})} command in its body; +\item[\quad{\tt(IF-CASE {\em integer-value})}] + --- integer {\tt IF-CASE}-operator that checks that + the {\em integer-value} is equal to the argument of some + {\tt (CASE {\em int-value})} command specified + after it and before closing {\tt (ENDIF)} operator; +\item[\quad{\tt(IFS-CASE {\em string-value})}] + --- string {\tt IF-CASE}-operator that checks that + the {\em string-value} is equal to the argument of some + {\tt (CASE {\em string})} command specified + after it and before closing {\tt (ENDIF)} operator. +\end{description} +Similarly to prefix commands {\tt V@} and {\tt @V} +(see sections \ref{Sect-VFC-NUM} and \ref{Sect-VFC-STRING}), +the arguments of the conditions {\tt IF-DEF} and {\tt IF-NDEF} are +analyzed as the string expressions, not as the string constants +(see section~\ref{Sect-VFC-STRING}). +The arguments of the string {\tt IFS}-commands +and {\tt IFS-CASE}-command are also processed as the string expressions +and the strings are converted to uppercase form before comparison. + +\bigskip +Examples: +\begin{itemize} +\item[] + {\tt (IF-DEF FONTNAME)}\\ + \phantom{WWW}{\tt (MESSAGE The variable FONTNAME = @V FONT)}\\ + {\tt (ELSE)}\\ + \phantom{WWW}{\tt (VARIABLE (STRING FONTNAME CMR10))}\\ + {\tt (ENDIF)} +\item[] + {\tt (IF-TRUE V monospace)}\\ + \phantom{WWW}{\tt (MESSAGE `MONOSPACE' mode is active)}\\ + {\tt (ELSE)} + \phantom{WWW}{\tt (LOADFILE kerndata.tbf)}\\ + {\tt (ENDIF)} +\item[]{\tt (IF-CASE V FONTPITCH)}\\ + \phantom{}{\tt (CASE D 5)}\\ + \phantom{WWW}{\tt (ASSIGN u\# R 12.5}\\ + \phantom{WWW}{\tt (BREAK)}\\ + \phantom{}{\tt (CASE D 6)}\\ + \phantom{WWW}{\tt (ASSIGN u\# R 14.0}\\ + \phantom{WWW}{\tt (BREAK)}\\ + \phantom{}{\tt .........}\\ + {\tt (ELSE)}\\ + \phantom{WWW}{\tt (MESSAGE Unknown FONTPITCH value)}\\ + \phantom{WWW}{\tt (HALTPGM)}\\ + {\tt (ENDIF)} +\end{itemize} + + +\subsubsection{Other operators\label{Sect-VFC-OTHER}} + +There are other commands +which can be useful for the logical structuring +of the input stream of \VFC{} commands: +\begin{description} +\item[\quad\tt(COMMENT {\em text})] --- skip the {\em text} + which can include arbitrary \VFC{} commands + provided that the opening and closing braces + `{\tt (}' and `{\tt )}' are balanced correctly. +\item[\quad\tt(MESSAGE {\em text})] --- print the {\em text} + which may be the combination of string elements and + string expressions (see section~\ref{Sect-VFC-STRING}) + separated by spaces, and can include opening and closing + braces `{\tt (}' and `{\tt )}' if they are balanced + correctly, but it cannot exceed 255 characters. +\item[\quad\tt(TYPEOUT {\em text})] --- just the same as + {\tt (MESSAGE {\em text})}. +\item[\quad{\tt(LOADFILE {\em filename})} or {\tt(LOAD {\em filename})}] + --- insert at this place the contents of the file {\em filemane} + ({\em filename} can be a string expression) + from the beginning and up to the end or up to the first command + {\tt (ENDLOAD)} encountered in it. + If the extension of the {\em filename} is not specified + explicitly, + the extension {\tt .tbf} is added if the command {\tt LOADFILE} + is encountered during the processing of script file {\tt .tbf}, + and the extension {\tt .pl} is added if the command {\tt LOADFILE} + is encountered during the processing of the {\tt .pl} + corresponding to a real font metric data. +\item[\quad\tt(ENDLOAD)] --- stop to read the contents + of the current input file and return the the previous file. +\item[\quad\tt(ENDINPUT)] --- stop to read the input data stream; +\item[\quad\tt(HALTPGM)] --- stop the program. +\end{description} + + +\subsection{{\tt MAPFONT} or {\tt FONT}\label{Sect-VFC-MAPFONT}} + +The command {\tt MAPFONT} describes the real fonts which are +used in the virtual font. One {\tt MAPFONT} command should be +specified for each real font used in the virtual font. + +The command {\tt MAPFONT} assignes the integer {\em index} +to the real font, and all the commands which use the references to +the real fonts refer to this {\em index} value. It can also +specify the processing modes for this font +(some of them overwrites the modes specified at the command +{\tt OPTION} described at the section~\ref{Sect-VFC-OPTION}) +and the standard mapping table for the characters +extracted from this font --- so that the commands +{\tt CHARACTER} deascribed at section~\ref{Sect-VFC-CHAR} +becomes unnecessary to great extend. + +The command {\tt MAPFONT} has the format: +\begin{itemize} +\item[] +{\tt (MAPFONT {\em index} +({\em option}$_1$) ({\em option}$_2$)... )} +\end{itemize} +where the {\em index} is the integer value. +The valid {\em options} are: +\begin{description} + +\item[\quad{\tt(FONTNAME {\em filename})} or {\tt(NAME {\em filename})}] + --- specifies the name of the real font (obligatory parameter). + +\item[\quad{\tt(TFMINPUT {\em filename})}] + --- specifies the name of the {\tt .pl} file which is used + to load data about this font. The {\tt .pl} file {\tt $<$fontname$>$.tbf} + is used if this parameter is not specified where {\tt $<$fontname$>$} + is value of the parameter {\tt FONTNAME} defined above. + + The command {\tt (TFMINPUT EMPTY)} means that this is the font + which contains no characters at all. + The command {\tt (TFMINPUT DUMMY)} means that this is the font + which contains all the characters but with zero metric information + and without {\tt VARCHAR} and {\tt NEXTLARGER} attributes. + In both cases no {\tt .pl} file is read by \VFC{} --- the + necessary font information is generated automatically. + +\item[\quad{\tt(FONTAT {\em real-value})}] --- specifies the parameter + {\tt FONTAT} transferred to {\tt .vpl} file + (the default value {\tt (FONTAT R 1.0)}). + This parameter is also used to re-calculate {\em dimensional} + parameters from the {\tt .pl} file according to + {\tt DESIGNUNITS} and {\tt DESIGNSIZE} from the + header of the {\tt .vpl} file. + +\item[\quad{\tt(FONTAREA {\em text-string})}] --- specifies the parameter + {\tt FONTAREA} transferred to {\tt .vpl} file. + This parameter specifies the explicit directory + for corresponding real font, and as a rule is not used + since it restricts the flexibility of font + specification \cite{VF}. + +\item[\quad{\tt(CHECKSUM {\em 32-bit-integer})}] --- specifies + explicitly the value {\tt FONTCHECKSUM} --- the {\em checksum} + of the {\tt .tfm} file of this real font stored in the {\tt .vpl} file. + Usually it is not necessary to specify this parameter + explicitly since its correct value is copied from the {\tt .pl} file + with the font metric data. + When the {\sl DVI}-driver loads the virtual and the real fonts, + the {\tt FONTCHECKSUM} from the {\tt .vpl} file is compared + with the {\em checksum} calculated for the {\tt .tfm} files, + and the warning message is printed if these values are different + (this message shows that the versions of {\tt .vf} and {\tt .tfm} + files may be different or that the {\tt .tfm} file may be damaged). + +\item[\quad{\tt(FULL)}], {\tt(7TO8)}, {\tt(8TO7)}, {\tt(7TO7)}, {\tt(8TO8)}, + {\tt(JWNCYR)}, {\tt(CYRTUG)} --- these parameters specify + the default mapping table for this real font: + according to some rule the characters of the virtual font + are mapped into the characters of this real font if + these characters of the real font are defined and if the + corresponding positions of the virtual font are not + occupied still. +\begin{description} +\item[\quad{\tt(FULL)}] --- include in the virtual font + all the characters from this font so that the character codes + are mapped to themselves; +\item[\quad{\tt(7TO8)}] --- include in the virtual font + the characters 0--127 from the real font so that + the character {\tt D 0} of the real font corresponds to + the character {\tt D 128} of the virtual font, + the character {\tt D 1} of the real font corresponds to + the character {\tt D 129} of the virtual font, etc.; +\item[\quad{\tt(8TO7)}] --- include in the virtual font + the characters 128--255 from the real font so that + the character {\tt D 128} of the real font corresponds to + the character {\tt D 0} of the virtual font, + the character {\tt D 129} of the real font corresponds to + the character {\tt D 1} of the virtual font, etc.; +\item[\quad{\tt(7TO7)}] --- include in the virtual font + the characters 0--127 from this font so that the character codes + are mapped to themselves; +\item[\quad{\tt(8TO8)}] --- include in the virtual font + the characters 128--255 from this font so that the character codes + are mapped to themselves; +\item[\quad{\tt(CYRTUG)}] --- include in the virtual font + the characters 128--175, 224--244 from this font + so that the character codes + are mapped to themselves ({\sl CYRTUG} coding scheme + for cyrillic characters); +\item[\quad{\tt(JWNCYR)}] --- include in the virtual font + the characters 128--175, 224--244 from this font + so that the cyrillic characters for {\sl WNCYR} coding + scheme are mapped to cyrillic characters + for {\sl CYRTUG} coding scheme. +\end{description} + +\item[\quad{\tt (TRACE)}, {\tt (NOTRACE)}, {\tt (TRACE D {\em integer})}] --- +specifies the level for printing of the debugging information +when the ligature tables of this font are processed by \VFC. + +\item[\quad{\tt(LIGTABLE)} and {\tt(NOLIGTABLE)}] --- include + or do not include in the virtual font + the ligature tables of this font. + +\item[\quad\tt(PHANTOM)] --- assign attribute {\tt PHANTOM} + to all characters which are mapped to this font, + for which the attributes {\tt PHANTOM} or {\tt NOPHANTOM} + are not specified explicitly. + +\item[\quad\tt(NOPHANTOM)] --- switches off for this font the option + {\tt PHANTOM} specified by the command {\tt OPTION} + (see section~\ref{Sect-VFC-OPTION}). + +\item[\quad{\tt(AUTOTFMWIDTH)} and {\tt(NOAUTOTFMWIDTH)}] + --- for the characters which are mapped to this font + and for which the attributes {\tt SIZECHAR} and {\tt SIZEFONT} + are specified, \VFC{} adds automatically the attribute {\tt AUTOTFMWIDTH} + or the attribute {\tt NOAUTOTFMWIDTH}, respectively, + if such attribute is not specified explicitly + (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR} + for more details). + +\item[\quad\tt(AUTOTFMCHAR {\em font-index})] + --- for the characters which are mapped to this font + without explicit attributes + {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA} + (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR} + for more details), the attributes + \begin{itemize} + \item[] + {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em char-code})} + \end{itemize} + are added automatically. + +\item[\quad\tt(AUTOTFMMAPCHAR {\em font-index})] + --- for the characters which are mapped to this font + without explicit attributes + {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA} + (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR} + for more details), the attributes + \begin{itemize} + \item[] + {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em mapchar-code})} + \end{itemize} + are added automatically. + +\item[\quad\tt(INCLUDECHAR ({\em ident$_1$})({\em ident$_2$}) ...)] + --- specifies for this font the mode of automatical including + new charascters. + The following {\em ident} values can be used: + \begin{description} + \item[\quad\tt ALLCHAR] --- include automatically + all the characters from the real fonts even it is not + specified explicitly in {\tt CHARACTER} or {\tt MAPFONT} + commands; + \item[\quad\tt LIGTABLE] --- include in the virtual font + the characters which are listed in + the ligature tables specified for already included characters; + \item[\quad\tt KRNDATA] --- include in the virtual font + the characters which are listed in a kerning data + of the ligature tables specified for already included characters; + \item[\quad\tt LIGDATA] --- include in the virtual font + the characters which are listed in a ligature data + of the ligature tables specified for already included characters; + \item[\quad\tt NOLIGTABLE] --- do not include in the virtual font + automatically the characters from the ligature table; + \item[\quad\tt NEXTCHAR] --- include automatically + new characters which are are connected + by the attribute {\tt NEXTLARGER} with the + already included characters; + \item[\quad\tt NONEXTCHAR] --- do not include + new characters from the real fonts which are connected + by the attribute {\tt NEXTLARGER} with the + already included characters. + \end{description} + +\item[\quad\tt(NEWDISCARD)] --- the underfined characters of this font + are marked automatically by the attribute {\tt DISCRAD} + in the global mapping table (see commands {\tt CHARACTER} + (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR} + (section~\ref{Sect-VFC-DISCARD})). + +\item[\quad\tt(NONEWDISCARD)] --- the underfined characters of this font + are {\em not} marked automatically by the attribute {\tt DISCRAD} + in the global mapping table (see commands {\tt CHARACTER} + (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR} + (section~\ref{Sect-VFC-DISCARD})). + +\end{description} +Examples: +\begin{itemize} +\item[]{\tt (MAPFONT D 0 (NAME CMR10) (7TO7) (NOLIGTABLE) ... )}\\ + {\tt (MAPFONT D 1 (NAME LHR10) (JWRCYR) (INCLUDELIG) ... )}\\ + {\tt ......} +\end{itemize} + + +\subsection{{\tt CHARACTER} or {\tt CHAR}\label{Sect-VFC-CHAR}} + +The command {\tt CHARACTER} specifies the mapping table between +the characters of the real fonts and the characters of the +virtual fonts. It can also specify +\begin{itemize} +\item +the sequence of {\sl DVI}-commands substituted +instead of the character from the virtual font; +\item +the ``phantom'' output for some characters of the virtual font; +\item +the dimensional parameters (width, height, depth, italic correction) +of the character if they are not copied from the real font metric data +and are not calculated automatically for the sequences of {\sl DVI}-commands; +\item +the correction of the {\sl DVI}-pen position if the width of +the character from the real font is not equal to the +width specified in {\tt .tfm} file of the virtual font; +\item +special attributes which are treated by \VFC{} then +the default mapping tables +(see command {\tt MAPFONT} from the section~\ref{Sect-VFC-MAPFONT}) +and the automatical including of new characters +joined with already included characters +(see the commands {\tt MAPFONT/INCLUDECHAR} (section~\ref{Sect-VFC-MAPFONT}) +and {\tt OPTION/INCLUDECHAR} (section~\ref{Sect-VFC-OPTION}) +are used. +\end{itemize} + +The command {\tt CHARACTER} has the following format: +\begin{itemize} +\item[]{\tt (CHARACTER {\em char-code} ({\em parm$_1$}) ({\em parm$_2$}) + ({\em parm$_3$}) ...)} +\end{itemize} +The 8-bit integer value {\em char-code} +(see section~\ref{Sect-VFC-NUM}) defines +the character of the virtual font which properties +are defined by the sub-list {\em parameters}. +The {\em parameters} can be distributed among +several {\tt CHARACTER} commands with the same +8-bit code --- in this case they are joined together +in one list. + +The following {\em parameters} can be used: +\begin{description} + +\item[\quad{\tt (FONT {\em index})} or {\tt (SELECTFONT {\em index})}] + --- specifies the real font into which this character is mapped. + The real font is identified by the integer value + {\em index}, and the relation between the {\em index} and + the name of the real font is defined by the command {\tt MAPFONT} + (see section~\ref{Sect-VFC-MAPFONT}). + The default value for {\tt FONT} is set by the command {\tt SETMAPFONT} + (see section~\ref{Sect-VFC-SETTFMFONT}). + +\item[\quad{\tt (CHAR {\em char-code})} or {\tt (SETCHAR {\em char-code})}] + --- specifies the character of the real font into which this character + is mapped (the real font is defined by the command {\tt FONT} + described above). If the metric data for this character + are not specified explicitly in {\tt .tbf} file + (see the commands below), it is copied from the {\tt .pl} + file corresponding to the real font --- or from the + character from the real font which is specified by the + commands {\tt TFMFONT} and {\tt TFMCHAR} if these + attributes are defined. + +\item[\quad{\tt (CHARWD {\em real-value})}] --- + specifies the {\em width} of the virtual character. + +\item[\quad{\tt (CHARHT {\em real-value})}] --- + specifies the {\em height} of the virtual character. + +\item[\quad{\tt (CHARDP {\em real-value})}] --- + specifies the {\em depth} of the virtual character. + +\item[\quad{\tt (CHARIC {\em real-value})}] --- + specifies the {\em italic correction} of the virtual character. + +\item[\quad{\tt (TFMFONT {\em index})} and {\tt (TFMCHAR {\em char-code})}] + --- these two commands specify the real font and the + character from which the metric information is copied. + Their syntaxis is similar to the commands {\tt FONT}/{\tt CHAR} + described above. The default value for {\tt TFMFONT} is + set by the command {\tt SETTFMFONT} + (see section~\ref{Sect-VFC-SETTFMFONT}). + + The attributes {\tt TFMFONT}/{\tt TFMCHAR} are useful + if it is necessary to make the virtual fonts which are used + for visualization of the {\tt .dvi} file with PostScript fonts + which are substituted by some {\tt .pk} fonts with a different + metric properties (see section~\ref{Sect-PostScript} for more details). + The commands {\tt MAPFONT} (section~\ref{Sect-VFC-MAPFONT}) + and {\tt OPTION} (section~\ref{Sect-VFC-OPTION}) can specify + these atributes by default for the character if there are no + explicit commands {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}. + +\item[\quad{\tt (NOTFMDATA)}] + --- specifies that the attributes {\tt TFMFONT} and + {\tt TFMCHAR} cannot be added automatically to this character + (see corresponding arguments of the commands + {\tt MAPFONT} (section~\ref{Sect-VFC-MAPFONT}) + and {\tt OPTION} (section~\ref{Sect-VFC-OPTION})). + +\item[\quad{\tt (AUTOTFMWIDTH)} and {\tt (NOUTOTFMWIDTH)}] --- + these commands switch on/off the automatic correction + of the width of the virtual character if the metric information + from {\tt .vpl} and {\tt .tfm} files for the virtual font + is different from that specified for the real font characters + (see the commands {\tt TFMFONT}/{\tt TFMCHAR} described above + and the section~\ref{Sect-PostScript} for more information). + + The default value of this attribute can be specified using + the commands {\tt MAPFONT} (section~\ref{Sect-VFC-MAPFONT}) + and {\tt OPTION} (section~\ref{Sect-VFC-OPTION}). + If no {\tt (AUTOTFMWIDTH)} and {\tt (NOAUTOTFMWIDTH)} + attributes are specified using these commands, + the attribute {\tt (AUTOTFMWIDTH)} is assumed. + +\item[\quad{\tt (PKWIDTH {\em width})}] --- + specifies the width of the character + ({\em width} is the positive real value) + which is used to correct the {\sl DVI}-pen position + when the attribute {\tt AUTOTFMWIDTH} is active + and the commands {\tt TFMFONT}/{\tt TFMCHAR} are specified. + The value specified by {\tt PKWIDTH} substitutes the data taken from + the character referenced by the commands + {\tt FONT}/{\tt CHAR} or the data calculated by \VFC{} + for the sequence of {\sl DVI}-commands + (see the command {\tt SETDVI} described below). + +\item[\quad{\tt (DVI {\em list-of-arguments})} or + {\tt (SETDVI {\em list-of-arguments})}] + --- specifies the sequence of {\sl DVI}-commands substituted + instead of the character of the virtual font. + The arguments of this command are described in + section~\ref{Sect-VFC-CHAR1}. + + The metric data for this virtual character can be + specified explicitly by the commands {\tt CHARWD}, + {\tt CHARHT}, {\tt CHARDP}, {\tt CHARIC} described above. + if these data are absent, + \begin{itemize} + \item + if the commands {\tt FONT} and {\tt CHAR} + or if the commands {\tt TFMFONT} and {\tt TFMCHAR} are defined, + the metric data for the virtual character + is copied from corresponding character of the + corresponding {\tt .pl} file. + \item + if commands {\tt FONT}/{\tt CHAR} and {\tt TFMFONT}/{\tt TFMCHAR} + are absent, the values {\tt CHARWD}, + {\tt CHARHT} and {\tt CHARDP} are calculated + automatically according to the sequence of {\sl DVI}-commands, + and {\tt CHARIC} is set to zero. + \end{itemize} + If the commands {\tt TFMFONT}/{\tt TFMCHAR} are specified + and if {\tt AUTOTFMWIDTH} mode is active + (by default or explicitly specified), the correction of + the width of the virtual character is is performed using + \begin{itemize} + \item the value of the parameter {\tt PKWIDTH} + if it is specified explicitly; + \item the width of the character specified by the + commands {\tt FONT}/{\tt CHAR} if these commands are + defined for the virtual character; + \item the width of the the sequence of {\sl DVI}-commands + which is calculated automatically by \VFC. + \end{itemize} + +\item[\quad{\tt (VARCHAR {\em list-of-arguments})}] + --- specifies the extensible character + (usually the mathematical delimiter). + The arguments of this command are described in + section~\ref{Sect-VFC-CHAR2}. + The command {\tt VARCHAR} cannot be used together with the + command {\tt NEXTLARGER}. + +\item[\quad{\tt (NEXTLARGER {\em char-code})}] --- + specifies the character (usually the mathematical delimiter) + which is ``larger'' than the current character. + The references {\tt NEXTLARGER} cannot form the infinite cycles. + The command {\tt NEXTLARGER} cannot be used together with the + command {\tt VARCHAR}. + +\item[\quad{\tt (DISCARD)}] --- + specify the attribute {\tt DISCARD} for the virtual font character + which means that this character cannot be used by default + mapping tables (see command {\tt MAPFONT}) + and by automatic including of new virtual font characters + (see commands {\tt MAPFONT/INCLUDECHAR} + (section~\ref{Sect-VFC-MAPFONT}) + and {\tt OPTION/INCLUDECHAR} + (section~\ref{Sect-VFC-OPTION}). + +\item[\quad{\tt (UNKNOWN)}] --- + default attribute which means that the character is not used + by the virtual font, but it can be added automatically + when the default mapping table is used (see command {\tt MAPFONT} + described at the section~\ref{Sect-VFC-OPTION}) + or during the automatic including of new characters to the + virtual font. + +\item[\quad{\tt (PHANTOM)}] --- specifies that the virtual + character is displayed as a blank space. + It means that instead of the output of the real font character + or of the sequence of {\sl DVI}-commands, the shift of + the {\sl DVI}-pen position at a distance equal to + the width of the virtual character is performed. + Corresponding {\sl DVI}-commands are generated and inserted + in {\tt .vpl} file automatically by \VFC. + The attribute {\tt PHANTOM} can be specified by + defaul using the commands {\tt MAPFONT} + (see section~\ref{Sect-VFC-MAPFONT}) + and {\tt OPTION} (see section~\ref{Sect-VFC-OPTION}). + +\item[\quad{\tt (NOPHANTOM)}] --- swithches off the + attribute {\tt PHANTOM} specified by default + with the help of the commands {\tt MAPFONT/PHANTOM} and + {\tt OPTION/PHANTOM}. + +\end{description} +Similar to dimensional data specified +for the {\tt .tbf} commands {\tt LIGTABLE}, {\tt HEADER}, etc., +the dimensional parameters of the commands +{\tt CHARWD}, {\tt CHARHT}, {\tt CHARDP}, {\tt CHARIC}, +{\tt PKWIDTH} and of the sub-commands of the command {\tt SETDVI} +are specified using the values {\tt TBFUNITS} and {\tt TBFSIZE} +from the {\tt .tbf} file (see section~\ref{Sect-VFC-LUNIT}). + +\subsubsection{{\tt CHARACTER/SETDVI}\label{Sect-VFC-CHAR1}} + +The parameter {\tt DVI} of the command {\tt CHARACTER} specifies +the the sequence of {\sl DVI}-commands substituted +instead of the character from the virtual font. +It has the format +\begin{itemize} +\item[]{\tt (SETDVI}\\ +\phantom{WWW}{\tt({\em command$_1$})}\\ +\phantom{WWW}{\tt({\em command$_2$})}\\ +\phantom{WWW}{\tt ......}\\ + {\tt )} +\end{itemize} +where the following {\em commands} can be used: +\begin{description} +\item[\quad{\tt (FONT {\em index})} or {\tt (SELECTFONT {\em index})}] + --- makes this font active for the subsequent + {\tt CHAR} commands. The font is identified by the + integer value {\em index}, and the name of the + font with this index is defined using the command + {\tt MAPFONT} (see section~\ref{Sect-VFC-MAPFONT}). + if there are commands {\tt CHAR} in the sequence + of {\sl DVI}-commands, the command {\tt FONT} + is to be used before the first {\tt CHAR}. +\item[\quad{\tt (CHAR {\em char-code})} or {\tt (SETCHAR {\em char-code})}] + --- output the character {\em char-co\-de} from the real + font specified by the last command {\tt FONT} starting + from the current {\sl DVI}-pen position and to move + the {\sl DVI}-pen position to the right at the distance equal + to the width of the character. +\item[\quad{\tt (RULE {\em height} {\em width})} + or {\tt (SETRULE {\em height} {\em width})}] + --- output the {\em rule} (i.e., a black rectangle) + with the specified height and width ({\em height} and {\em width} + are positive real values) starting + from the current {\sl DVI}-pen position and to move + the {\sl DVI}-pen position to the right at the distance equal + to the rule width. +\item[\quad{\tt (RIGHT {\em dist})} or {\tt (MOVERIGHT {\em dist})}] + --- move current {\sl DVI}-pen position to the {\em right} at the + specified distance {\em dist} which is to be a real + (positive or negative) value. +\item[\quad{\tt (LEFT {\em dist})} or {\tt (MOVELEFT {\em dist})}] + --- move current {\sl DVI}-pen position to the {\em left} at the + specified distance {\em dist} which is to be a real + (positive or negative) value. +\item[\quad{\tt (UP {\em dist})} or {\tt (MOVEUP {\em dist})}] + --- move current {\sl DVI}-pen position {\em up} at the + specified distance {\em dist} which is to be a real + (positive or negative) value. +\item[\quad{\tt (DOWN {\em dist})} or {\tt (MOVEDOWN {\em dist})}] + --- move current {\sl DVI}-pen position {\em down} at the + specified distance {\em dist} which is to be a real + (positive or negative) value. +\item[\quad{\tt (PUSH)}] --- remember the current + {\sl DVI}-pen position (to be restored by the subsequent + command {\tt (POP)}. +\item[\quad{\tt (POP)}] --- restore the + {\sl DVI}-pen position saved earlier by the + command {\tt (PUSH)}. The commands {\tt (PUSH)} and + {\tt (POP)} should be properly nested and balanced like + the parentheses. +\item[\quad{\tt (SPECIAL {\em text-string})}] + --- the {\em text-string} is interpreted similar to + the command {\tt\bs{}special\{...\}} from {\tt .dvi} file. +\item[\quad{\tt (HEX {\em hex-text-string})} + or {\tt (SPECIALHEX {\em hex-text-string})}] + --- the sequence of bytes identified by hexadecimal codes + is treated as the argument of the command + {\tt\bs{}special\{...\}} from {\tt .dvi} file. + The {\em hex-text-string} cannot contain spaces, + it should contain only hexadecimal digits + `{\tt 0}'--`{\tt 9}' and `{\tt A}'--`{\tt F}' or `{\tt a}'--`{\tt f}' + and it should contain the even number of such digits. +\end{description} +Similar to dimensional data specified +for the commands {\tt CHARACTER}, {\tt LIGTABLE}, {\tt HEADER}, +the dimensional parameters of the commands +{\tt RULE}, {\tt RIGHT}, {\tt LEFT}, {\tt UP}, {\tt DOWN} +are specified using the values {\tt TBFUNITS} and {\tt TBFSIZE} +from the {\tt .tbf} file (see section~\ref{Sect-VFC-LUNIT}). + + +\subsubsection{{\tt CHARACTER/VARCHAR}\label{Sect-VFC-CHAR2}} + +The parameter {\tt VARCHAR} of the command {\tt CHARACTER} specifies +the extensible character (usually the mathematical delimiter). +Its parameters define the character codes which are used as the +top of the delimiter, middle of the delimiter, bottom of the delimiter +and the replicated part of the delimiter. The zero value of +corresponding character codes (except replicated part) +means that this part of the extensible character is absent. + + +The command has the format +\begin{itemize} +\item[]{\tt (VARCHAR ({\em parm$_1$}) ({\em parm$_2$}) ...)} +\end{itemize} +where the following parameters can be used: +\begin{description} +\item[\quad{\tt (TOP {\em char-code})}] --- specifies + the character which is used as the top element of the + extensible character; +\item[\quad{\tt (MID {\em char-code})}] --- specifies + the character which is used as the middle element of the + extensible character; +\item[\quad{\tt (BOT {\em char-code})}] --- specifies + the character which is used as the bottom element of the + extensible character; +\item[\quad{\tt (REP {\em char-code})}] --- specifies + the character which is used as the replicated part of the + extensible character. +\end{description} + +\subsection{{\tt LIGTABLE}\label{Sect-VFC-LIGTABLE}} + +The command {\tt LIGTABLE} specifies the additional +ligature and kerning data for the virtual font characters +--- mainly the ligature and kerning data +for the pairs of characters selected from different +real fonts. Notot too much {\tt LIGTABLE} +commands are necessary in the {\tt .tbf} file since the ligature data +for the pairs of characters selected from the same +real font are usually copied from corresponding {\tt .pl} files. + +The command {\tt LIGTABLE} has the format: +\begin{itemize} +\item[] {\tt (LIGTABLE}\\ + \phantom{WWW}{\tt ({\em ligature-command$_1$})}\\ + \phantom{WWW}{\tt ({\em ligature-command$_2$})}\\ + \phantom{WWW}{\tt ......}\\ + {\tt )} +\end{itemize} +It several {\tt LIGTABLE} commands are specified, they are +joined together after reading the {\tt .tbf} file. + +The {\em ligature-commands} are similar to that specified at +{\tt .pl} files except the fact that the {\em dimensional} +parameter of the command {\tt KRN} is specified using the +values {\tt TBFUNITS} and {\tt TBFSIZE} +(see section~\ref{Sect-VFC-LUNIT}). +The following commands are valid here: +\begin{description} +\item[\quad{\tt (LABEL {\em char-code})}] + --- start the list of ligature commands for + the character {\em char-code} of the virtual font; +\item[\quad{\tt (LABEL BOUNDARYCHAR)} or {\tt (LABEL BCHAR)}] + --- start the list of ligature commands for + the special character ``{\em end-of-word}''; +\item[\quad{\tt (SKIP {\em integer})}] + --- jump over specified {\tt LIGTABLE} commands + {\tt LIG} and {\tt KRN}; +\item[\quad{\tt (STOP)}] + --- stop the {\em LIGTABLE} commands started + by the command {\em (LABEL {\em char-code})}; +\item[\quad{\tt (KRN {\em char-code$'$} {\em shift})}] + --- the kerning data {\em shift} (real value) + specified for the pair of characters + {\em char-code} and {\em char-code$'$} + (the value {\em char-code} is specified at the command {\tt LABEL} + which starts the sequence of ligature and kerning commands + for this character); +\item[\quad{\tt (LIG {\em char-code$'$} {\em char-code$''$})}] + --- the ligature data for the pair of characters + {\em char-code} and {\em char-code$'$} + (the value {\em char-code} is specified at the command {\tt LABEL} + which starts the sequence of ligature and kerning commands + for this character) --- these two characters are + substituted by the character {\em char-code$''$}. + The identifiers + \begin{itemize} + \item[] + \begin{flushleft} + {\tt /LIG}, {\tt /LIG>}, {\tt LIG/}, {\tt LIG/>}, + {\tt /LIG/}, {\tt /LIG/>}, {\tt /LIG/>>} + \end{flushleft} + \end{itemize} + can be used instead of {\tt LIG} which defines + various ways of the substitution of the character + {\em char-code$''$} + instead of the pair of characters + {\em char-code} and {\em char-code$'$} + (see \cite{VF} for more details). +\end{description} +Example: +\begin{itemize} +\item[] {\tt (LIGTABLE}\\ + \phantom{}{\tt (LABEL C <)}\\ + \phantom{WWW}{\tt (LIG C < V CYR\_open\_quote)}\\ + \phantom{WWW}{\tt (STOP)}\\ + \phantom{}{\tt (LABEL C >)}\\ + \phantom{WWW}{\tt (LIG C > V CYR\_close\_quote)}\\ + \phantom{WWW}{\tt (STOP)}\\ + \phantom{}{\tt (LABEL V CYR\_GHE)}\\ + \phantom{WWW}{\tt (KRN C . V kk\#)}\\ + \phantom{WWW}{\tt (KRN C , V kk\#)}\\ + \phantom{WWW}{\tt (KRN C : V kk\#)}\\ + \phantom{WWW}{\tt (KRN C ; V kk\#)}\\ + \phantom{WWW}{\tt (STOP)}\\ + {\tt )} +\end{itemize} + +\subsection{{\tt OUTPUT}\label{Sect-VFC-OUTPUT}} + +The command {\tt OUTPUT} defines the name of the output +{\tt .vpl} file and, may be, the way how the character codes +for the {\tt .vpl} commands are to be printed. +It has the form +\begin{itemize} +\item[] {\tt (OUTPUT {\em filename} + ({\em option$_1$}) ({\em option$_2$}) ... )} +\end{itemize} +where {\em filename} is the name of the output +{\em virtual font}, and the optional {\em options} +can be the following: +\begin{description} +\item[\quad{\tt(ALLCHAR)}] --- print all printable characters + in a form {\tt C {\em letter}}; +\item[\quad{\tt(ALPHA)}] --- print in a form {\tt C {\em letter}} + only the letters of the latin alphabet; +\item[\quad{\tt(ALPHANUM)}] --- print in a form {\tt C {\em letter}} + the digits and the letters of the latin alphabet; +\item[\quad{\tt(ALLCODE)}] --- print all characters + as the character codes; +\item[\quad{\tt(DEC)} or {\tt(DECIMAL)}] --- print character codes + as decimal integers; +\item[\quad{\tt(OCT)} or {\tt(OCTAL)}] --- print character codes + as octal integers; +\item[\quad{\tt(HEX)} or {\tt(HEXADECIMAL)}] --- print character codes + as hexadecimal integers. +\end{description} +Example (default value): +\begin{itemize} +\item[] {\tt (OUTPUT noname.tbf (ALPHANUM) (OCTAL))} +\end{itemize} + +\subsection{{\tt HEADER}\label{Sect-VFC-HEADER}} + +The virtual font has the header with the header parameters: +\begin{itemize} +\item {\tt DESIGNSIZE} +\item {\tt DESIGNUNITS} +\item {\tt CODINGSCHEME} +\item {\tt FAMILY} +\item {\tt FACE} +\item {\tt FONTDIMEN} and its sub-parameters + ({\tt SLANT}, {\tt SPACE}, {\tt QUAD}, ¨ â.¤.) +\end{itemize} +The header parameters can be get from: +\begin{itemize} +\item +the header of one of the real fonts used in virtual font; +\item +the header of some separate {\tt .pl} file; +\item +\VFC{} the explicit commands from the {\tt .tbf} file. +\end{itemize} + +The following parameters of the command {\tt HEADER} +are valid: +\begin{description} +\item[\quad{\tt(FONT {\em integer})}] + --- defines index of the font which is used as a source + for the header parameters. The real name of the font is + taken from the {\tt MAPFONT} command with the corresponding + index value. Default value for this parameter is {\tt (FONT D 0)} + which means that if nor {\tt FONT} nor {\tt FILE} dat are specified + by the User, the font {\tt MAPFONT D 0} is used as a source + for the header parameters. + If {\tt FONT} argument is $<$0 or if the parameter {\tt FILE} + is specified, the {\tt MAPFONT} fonts are not used as a source + for the header. +\item[\quad{\tt(FILE {\em filename})}] + --- defines the name of the {\tt .pl} file + which is used as a source for the header + parameters. Only one of the parameters --- {\tt FONT} or {\tt FILE} --- + can be specified among the parameters of the command {\tt HEADER}. + If both parameters are specified, the last one is used and + the warning message is generated. +\item[\quad{\tt(CHECKSUM {\em 32-bit integer})}] + --- specifies the {\tt CHECKSUM} of the {\tt .tfm} file + which will be generated after the processing of + {\tt .vpl} file by the utility {\sl VPtpVF}. + Usually this parameter is not necessary --- if it is not + specified, the correct {\tt CHECKSUM} value is substituted + by {\sl VPtoVF} automatically, and it is a rare chance + that the User can guess the proper value (see comments below). +\item[\quad{\tt(DESIGNSIZE {\em real-value})}] + --- specifies the value of the {\tt DESIGNSIZE} which + is used as a unit of measure for nearly all + dimensional {\tt .vpl} data (see comments below). +\item[\quad{\tt(DESIGNUNITS {\em real-value})}] + --- specifies the value of the {\tt DESIGNUNITS} which + is used as a unit of measure for nearly all + dimensional {\tt .vpl} data (see comments below). +\item[\quad{\tt(CODINGSCHEME {\em text-string})}] + --- specifies the text which identifies uniquely + the arrangement of the characters in the coding table + of this font. + For example, for Computer Modern Roman except {\tt cmr5} + it is equal to + \begin{itemize} + \item[] {\tt (CODINGSCHEME TeX text)} + \end{itemize} + while for {\tt cmr5} it is equal to + \begin{itemize} + \item[] {\tt (CODINGSCHEME TeX text without f-ligatures)} + \end{itemize} + (the {\em f-ligatures} are absent in this font since + the characters are too small). + This parameter cannot contain + internal braces `{\tt (}' and `{\tt )}' + and but can be the string expression + (see section~\ref{Sect-VFC-STRING} for more details). +\item[\quad{\tt(FAMILY {\em text-string})}] + --- specifies the {\tt FAMILY} identifying + string. This parameter cannot contain + internal braces `{\tt (}' and `{\tt )}' + but can be the string expression + (see section~\ref{Sect-VFC-STRING} for more details). +\item[\quad{\tt(FACE {\em 8-bit-integer})}] + --- specifies the Xerox face code for the virtual font. +\item[\quad{\tt(SEVENBITSAFEFLAG)}] + --- this command is of no use and its is skipped after printing the + warning message. The attribute + {\tt SEVENBITSAFEFLAG} was used in earlier versions of \TeX{} + to specify that the font contains only the characters in a range 0--127, + and now this flag is obsolete. Although the corresponding field is + conserved in {\tt .tfm} file, the utility {\sl VPtoVF} inserts the + proper value automatically (after the check that the virtual font + contains no characters outside the range 0--127) irregardless of + the command {\tt SEVENBITSAFEFLAG} encountered in {\tt .vpl} file. +\item[\quad{\tt(FONTDIMEN {\em parm-list})}] + --- defines the following header parameters: + \begin{itemize} + \item[] + {\tt(SLANT {\em real-value})}\\ + {\tt(SPACE {\em real-value})}\\ + {\tt(STRETCH {\em real-value})}\\ + {\tt(SHRINK {\em real-value})}\\ + {\tt(XHEIGHT {\em real-value})}\\ + {\tt(QUAD {\em real-value})}\\ + {\tt(EXTRASPACE {\em real-value})}\\ + {\tt(NUM1 {\em real-value})} + or {\tt(DEFAULTRULETHICKNESS {\em real-value})}\\ + {\tt(NUM2 {\em real-value})} + or {\tt(BIGOPSPACING1 {\em real-value})}\\ + {\tt(NUM3 {\em real-value})} + or {\tt(BIGOPSPACING2 {\em real-value})}\\ + {\tt(DENOM1 {\em real-value})} + or {\tt(BIGOPSPACING3 {\em real-value})}\\ + {\tt(DENOM2 {\em real-value})} + or {\tt(BIGOPSPACING4 {\em real-value})}\\ + {\tt(SUP1 {\em real-value})} + or {\tt(BIGOPSPACING5 {\em real-value})}\\ + {\tt(SUP2 {\em real-value})}\\ + {\tt(SUP3 {\em real-value})}\\ + {\tt(SUB1 {\em real-value})}\\ + {\tt(SUB2 {\em real-value})}\\ + {\tt(SUPDROP {\em real-value})}\\ + {\tt(SUBDROP {\em real-value})}\\ + {\tt(DELIM1 {\em real-value})}\\ + {\tt(DELIM2 {\em real-value})}\\ + {\tt(AXISHEIGHT {\em real-value})}\\ + {\tt(AXISHEIGHT {\em real-value})} + \end{itemize} + (the parameters specified in a form + {\tt (PARAMETER {\em index} {\em value})} are skipped + and the warning message is printed). + + All these parameters are {\em dimensional} parameter + except the parameter {\tt SLANT} and they are defined using + {\tt TBFUNITS} and {\tt TBFSIZE} data + from the {\tt .tbf} file (see section~\ref{Sect-VFC-LUNIT}). + They are re-calculated properly so that they fit to + the header parameters {\tt DESIGNUNITS} and {\tt DESIGNSIZE} + when the header data of the output {\tt .vpl} file are known. +\end{description} +The parameters are specified as the sub-lists of the list +defined by the identifier {\tt HEADER}. +Example: +\begin{itemize} +\item[] {\tt (HEADER}\\ + \phantom{WWW}{\tt (FONT D 1)}\\ + \phantom{WWW}{\tt (FAMILY LHTT)}\\ + \phantom{WWW}{\tt (CODINGSCHEME LH Cyrillic TeX text)}\\ + \phantom{WWW}{\tt ......}\\ + {\tt )} +\end{itemize} + +\bigskip + +\VFC{} generates the header parameters in a following way. +The commands from the {\tt .tbf} file are read, +and the dimensional parameters from the command {\tt HEADER} +are treated using the units defined by +{\tt TBFSIZE} and {\tt TBFUNITS} +(see section~\ref{Sect-VFC-LUNIT}) --- as well as the other dimensional +parameters like that from the commands {\tt LIGTABLE} +and {\tt CHARACTER}. +After it the {\tt .pl} file specified by the {\tt HEADER} +commands {\tt FONT} or {\tt FILE} is read, and the parameters +which were not defined explicitly at the command {\tt HEADER} +are added from it. +Finally, all the dimensional parameters +which vere read from the {\tt .tbf} file +(namely, specified at the commands {\tt LIGTABLE}, +{\tt CHARACTER}, {\tt HEADER/FONTDIMEN}) +are converted to +{\tt DESIGNSIZE} and {\tt DESIGNUNITS} values from the +resulting header of the {\tt .vpl} file. + +The {\tt .pl} file header parameters +\begin{itemize} +\item[] {\tt DESIGNSIZE}\\ + {\tt DESIGNUNITS}\\ + {\tt CODINGSCHEME}\\ + {\tt FAMILY}\\ + {\tt FACE}\\ + {\tt FONTDIMEN} sub-parameters except {\tt PARAMETER} +\end{itemize} +are processed by \VFC. +The {\tt .pl} file header parameters +\begin{itemize} +\item[] {\tt SEVENBITSAFEFLAG}\\ + {\tt HEADER}\\ + sub-parameter {\tt PARAMETER} of the parameter {\tt FONTDIMEN} +\end{itemize} +are ignored after printing the warning messages. +All other {\em legal} {\tt .pl} commands are +skipped without processing when \VFC{} reads the header parameters. + +\bigskip + +The header parameters which are read from {\tt .pl} file +are added to {\tt .vpl} header data if +corresponding parameters are not specified explicitly +in {\tt .tbf} file. +Usually {\em all} header parameters +(including {\tt DESIGNUNITS} and {\tt DESIGNSIZE}) +are copied from some {\tt .pl} file, and only the parameters +{\tt FAMILY}, {\tt FACE}, {\tt CODINGSCHEME} are substituted +by their explicit specifications from {\tt .tbf} file. + +The exception is the header parameter {\tt CHECKSUM} which is ignored +when it is read from {\tt .pl} file and which value can be +set by the User only if it is specified explicitly in {\tt .tbf} file. +Usually this parameter is not necessary --- if it is not +specified by the User, it is not inserted into the output +{\tt .vpl} file, and as a result the correct {\tt CHECKSUM} value +is calculated by {\sl VPtoVF} automatically. +It is a rare chance that the User can guess the proper value, +and if the {\tt CHECKSUM} from the {\tt .vf} file and +the {\em checksum} calculated for the {\tt .tfm} file +of the virtual font do not coincide, the {\sl DVI}-driver +prints the warning message --- this message shows that the versions of +{\tt .vf} and {\tt .tfm} files may be different or that +the {\tt .tfm} file may be damaged. +The exception from this rule (and the only case +when the explicit parameter {\tt CHECKSUM} can be useful) +is the {\em zero} value specified for the parameter {\tt CHECKSUM} +of the virtual font. In this case the comparison +of {\tt CHECKSUM} from {\tt .vf} file with the +the {\em checksum} of the {\tt .tfm} file +of the virtual font is not performed at all +when this font is loaded by the {\sl DVI}-driver. + +\subsection{Additional commands\label{Sect-VFC-Other}} + +The following \VFC{} commands are considered +in this section: +\begin{itemize} +\item {\tt VTITLE} --- the title of the virtual font; +\item {\tt TBFUNITS} and {\tt TBFSIZE} --- the scale factors + for the lengths specified in {\tt .tbf} file; +\item {\tt BOUNDARYCHAR} --- character code which is used + in the {\tt .vpl} ligature table to specify the ``end-of-word'' + character; +\item {\tt SETTFMFONT} --- default value for the attribute {\tt TFMFONT} + if for some commands {\tt CHARACTER} only the attribute {\tt TFMCHAR} + is specified; +\item {\tt SETMAPFONT} --- default value for the attribute {\tt FONT} + if for some commands {\tt CHARACTER} only the attribute {\tt CHAR} + is specified; +\item {\tt DISCARDCHAR} --- the list of characters which are not + included in the virtual font; +\item {\tt NOTAUTOADDCHAR} --- the list of characters which cannot be used + for automatically characters; +\item {\tt OPTION} --- modes of \VFC; +\item {\tt SAVETABLE} --- printing of the mapping table + into ASCII file; +\end{itemize} + +\subsubsection{{\tt VTITLE}\label{Sect-VFC-TITLE}} + +The command {\tt VTITLE} of the {\tt .vpl} file defines the +title of the file which is actually the comment inserted in +the binary {\tt .vf} file after processing by the utility +{\sl VPtoVF}. The command {\tt VTITLE} has the form +\begin{itemize} +\item[] {\tt (VTITLE {\em text-string})} +\end{itemize} +where the {\em text string} +is the combination of string elements and +string expressions (see section~\ref{Sect-VFC-STRING}) +separated by spaces, and can include opening and closing +braces `{\tt (}' and `{\tt )}' if they are balanced +correctly. The result of the expansion of +string expressions cannot exceed 255 characters. + +Example: +\begin{itemize} +\item[] {\tt (VTITLE Created by VFComb (Version 1.3))} +\end{itemize} + +\subsubsection{{\tt TBFUNITS} + and {\tt TBFSIZE}\label{Sect-VFC-LUNIT}} + +All the length data in {\tt .vpl} file are defined in +units specified by the parameters {\tt DESIGNUNITS} +and {\tt DESIGNSIZE} from the {\tt HEADER} command +(see section~\ref{Sect-VFC-HEADER}). Nethertheless, +when the User prepares the {\tt .tbf} file, these +parameters are not known yet since they can be read +later from the {\tt HEADER} file. For this reason +all the length and size data in {\tt .tbf} file +are specified using internal scaling factors +specified bu the commands {\tt TBFUNITS} +and {\tt TBFSIZE} with the default values +\begin{itemize} +\item[] {\tt (TBFSIZE R 1.0) (TBFUNITS R 1.0)} +\end{itemize} +which are the analogs of the commands {\tt DESIGNUNITS} +and {\tt DESIGNSIZE} from {\tt .pl} and {\tt .vpl} files. +The length and size data specified into {\tt .tbf} file +are recalculated to the proper values +{\tt DESIGNUNITS} and {\tt DESIGNSIZE} +from the command {\tt HEADER} when the output {\tt .vpl} +file is generated. + +\subsubsection{{\tt BOUNDARYCHAR} + or {\tt BCHAR}\label{Sect-VFC-BCHAR}} + +The LIGTABLE entries can contain ligature +and kerning data with a special character ``end-of-word'' +which defines the beginning of the word when encountered +in the command {\tt LABEL}, and the end of the word +when encountered in the commands {\tt LIG} and {\tt KRN}. +The command {\tt BOUNDARYCHAR} defines the code assigned +to this special character (usually this is the code {\tt D 255}). +As a result: +\begin{itemize} +\item +inside {\tt .tbf} file the {\tt LIGTABLE} entries which contain this code +are recognized as the entries with ``end-of-word'' character; +\item +inside {\tt .pl} files the {\tt LIGTABLE} entries with their own +{\tt BOUNDARYCHAR} codes are mapped to the code specified +in {\tt .tbf} file. +\end{itemize} +Example: +\begin{itemize} +\item[] {\tt (BOUNDARYCHAR D 255)}\\ + {\tt (BCHAR D 255)} +\end{itemize} + +\subsubsection{{\tt SETMAPFONT} and + {\tt SETTFMFONT}\label{Sect-VFC-SETTFMFONT}} + +The command {\tt SETMAPFOMT} specifies the default value +for the attribute {\tt FONT} if only the attribute +{\tt CHAR} is defined (see description of the \VFC{} +command {\tt CHARACTER} in section~\ref{Sect-VFC-CHAR}). +It has the form +\begin{itemize} +\item[] {\tt (SETMAPFONT {\em ineger})} +\end{itemize} +where {\em integer} is the index of the font listed in +{\tt MAPFONT} command which is used for {\tt FONT} +attribute. + +Similarly, if the command {\tt SETTFMFOMT} specifies the default value +for the attribute {\tt TFMFONT} if only the attribute +{\tt TFMCHAR} is defined (see description of the \VFC{} +command {\tt CHARACTER} in section~\ref{Sect-VFC-CHAR}). +It has the form +\begin{itemize} +\item[] {\tt (SETTFMFONT {\em ineger})} +\end{itemize} +where {\em integer} is the index of the font listed in +{\tt MAPFONT} command which is used for {\tt TFMFONT} +attribute. + +The important difference of \VFC{} {\tt CHARACTER} command is +that if the parameter {\tt FONT} is not specified although +the parameter {\tt CHAR} {\em is} specified, the value +specified by the command {\tt SETMAPFONT} is used +(see section~\ref{Sect-VFC-SETTFMFONT}). The syntaxis of +{\tt .vpl} files assumes that the parameter {\tt FONT} +specified for the previous command {\tt CHARACTER} is used +while for \VFC{} commands it is not so. + +Similarly, if the parameter {\tt TFMFONT} is not specified although +the parameter {\tt TFMCHAR} {\em is} specified, the value +specified by the command {\tt SETTFMFONT} is used +(see section~\ref{Sect-VFC-SETTFMFONT}). + +Example (default values): +\begin{itemize} +\item[] {\tt (SETMAPFONT D 0)}\\ + {\tt (SETTFMFONT D 0)} +\end{itemize} + +\subsubsection{{\tt DISCARDCHAR} + and {\tt NOTAUTOADDCHAR}\label{Sect-VFC-DISCARD}} + +The command {\tt DISCARDCHAR} defines the characters from the +real fonts which are not included in the virtual font. +This command is useful if the mapping to some font is defined +by one of the options +{\tt FULL}, {\tt 7TO8}, {\tt 8TO7}, {\tt 8BIT}, {\tt 7BIT}, +{\tt JWNCYR}, {\tt CYRTUG} (see command {\tt MAPFONT} in +section~\ref{Sect-VFC-MAPFONT}) but there are some characters +which are to be excluded from the mapping list. + +The command has the form: +\begin{itemize} +\item[] {\tt (DISCARDCHAR}\\ + \phantom{WWW} {\tt (FONT {\em font$_1$}) (CHAR {\em char$_1$})}\\ + \phantom{WWW} {\tt (FONT {\em font$_2$}) (CHAR {\em char$_2$})}\\ + \phantom{WWW} {\tt ......}\\ + {\tt )} +\end{itemize} +Actually one command {\tt (FONT ...)} can be followed by several +commands {\tt (CHAR ...)} if these characters belong to the same +real font. Instead of several commands {\tt (CHAR {\em charcode})} +it is possible to use one command +{\tt (RANGE {\em charcode$_1$} {\em charcode$_2$})} --- in this case +all the characters from the range {\em charcode$_1$}--{\em charcode$_2$} +get the attribute {\tt DISCARD}. + +Example: +\begin{itemize} +\item[] {\tt (DISCARDCHAR}\\ + \phantom{WWW} {\tt (FONT D 0) (CHAR D 250) (CHAR D 251) ...}\\ + \phantom{WWW} {\tt (FONT D 1) (RANGE D 128 D 255) ...}\\ + \phantom{WWW} {\tt ......}\\ + {\tt )} +\end{itemize} + +The command {\tt NOAUTOADDCHAR} defines the characters from the +virtual font which cannot be used for character mapping +when \VFC{} adds automatically characters since they are connected +with other characters by the attribute {\tt NEXTLARGER} +or through {\tt LIGTABLE} data +(see sections \ref{Sect-VFC-MAPFONT} and \ref{Sect-VFC-OPTION} +for more details) --- these characters get the attribute +{\tt DISCARD} if this character is not used explicitly +in mapping table. + +The command has the form: +\begin{itemize} +\item[] {\tt (NOAUTOADDCHAR (CHAR {\em char$_1$}) + (CHAR {\em char$_2$}) (CHAR {\em char$_3$}) ...)} +\end{itemize} +Similarly to {\tt DISCARDCHAR}, +instead of several commands {\tt (CHAR {\em charcode})} +it is possible to use one command +{\tt (RANGE {\em charcode$_1$} {\em charcode$_2$})} --- in this case +all the characters of the virtual font +from the range {\em charcode$_1$}--{\em charcode$_2$} +get the attribute {\tt DISCARD} +if these characters are not used explicitly +in mapping table. + +\subsubsection{{\tt OPTION}\label{Sect-VFC-OPTION}} + +The command {\tt OPTION} defines some modes of \VFC{} operations. +It consists of identifiers where only {\tt TRACE} and {\tt INCLUDECHAR} +can have a non-empty argument: +\begin{description} +\item[\quad\tt(TRACE {\em integer})] --- specifies the level + of tracing messages printed during the processing + of the ligature tables ({\em integer} should be in a range 0--3); +\item[\quad\tt(TRACE)] --- just the same as + {\tt (TRACE D 2)}; +\item[\quad\tt(NOTRACE)] --- just the same as + {\tt (TRACE D 0)}; +\item[\quad\tt(SCREEN)] --- print the \VFC{} messages + on the display screen; +\item[\quad\tt(NOSCREEN)] --- print the \VFC{} messages + only into {\tt .log} file; +\item[\quad\tt(PHANTOM)] --- assign attribute {\tt PHANTOM} + to all characters, for which the attributes + {\tt PHANTOM} or {\tt NOPHANTOM} + are not specified explicitly; +\item[\quad\tt(INCLUDECHAR ({\em ident$_1$})({\em ident$_2$}) ...)] + --- specifies how \VFC{} should automatically add characters to the + virtual font. The following {\em ident} values can + be used: + \begin{description} + \item[\quad\tt ALLCHAR] --- include automatically + all the characters from the real fonts even it is not + specified explicitly in {\tt CHARACTER} or {\tt MAPFONT} + commands; + \item[\quad\tt LIGTABLE] --- include in the virtual font + the characters which are listed in + the ligature tables specified for already included characters; + \item[\quad\tt KRNDATA] --- include in the virtual font + the characters which are listed in a kerning data + of the ligature tables specified for already included characters; + \item[\quad\tt LIGDATA] --- include in the virtual font + the characters which are listed in a ligature data + of the ligature tables specified for already included characters; + \item[\quad\tt NOLIGTABLE] --- do not include in the virtual font + automatically the characters from the ligature table; + \item[\quad\tt NEXTCHAR] --- include automatically + new characters which are are connected + by the attribute {\tt NEXTLARGER} with the + already included characters; + \item[\quad\tt NONEXTCHAR] --- do not include + new characters from the real fonts which are connected + by the attribute {\tt NEXTLARGER} with the + already included characters. + \end{description} +\item[\quad\tt(LIGTABLE)] --- include in the virtual font + the ligature tables of the real fonts; +\item[\quad\tt(NOLIGTABLE)] --- do not include in the virtual font + the ligature tables of the real fonts; +\item[\quad\tt(NEWDISCARD)] --- the underfined characters of the real font + are marked automatically by the attribute {\tt DISCRAD} + in the global mapping table (see commands {\tt CHARACTER} + (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR} + (section~\ref{Sect-VFC-DISCARD})); +\item[\quad\tt(NONEWDISCARD)] --- the underfined characters of the real font + are {\em not} marked automatically by the attribute {\tt DISCRAD} + in the global mapping table (see commands {\tt CHARACTER} + (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR} + (section~\ref{Sect-VFC-DISCARD})); +\item[\quad\tt(AUTOTFMWIDTH)] --- add automatically for the + characters with the attributes {\tt SIZECHAR} and {\tt SIZEFONT} + the attribute {\tt AUTOTFMWIDTH} if it is + not specified explicitly (see command {\tt CHARACTER}); +\item[\quad\tt(NOAUTOTFMWIDTH)] --- add automatically for the + characters with the attributes {\tt SIZECHAR} and {\tt SIZEFONT} + the attribute {\tt NOAUTOTFMWIDTH} if it is + not specified explicitly (see command {\tt CHARACTER}); +\item[\quad\tt(AUTOTFMCHAR {\em font-index})] + --- for the characters without explicitly specified attributes + {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA} + (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR} + for more details) the attributes + \begin{itemize} + \item[] + {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em char-code})} + \end{itemize} + are added automatically; +\item[\quad\tt(AUTOTFMMAPCHAR {\em font-index})] + --- for the characters without explicitly specified attributes + {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA} + (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR} + for more details) the attributes + \begin{itemize} + \item[] + {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em mapchar-code})} + \end{itemize} + are added automatically. +\end{description} +Example (default values): +\begin{itemize} +\item[] + {\tt (OPTION}\\ + \phantom{WWW}{\tt (TRACE D 0)}\\ + \phantom{WWW}{\tt (SCREEN)}\\ + \phantom{WWW}{\tt (INCLUDECHAR (NOLIGTABLE))}\\ + \phantom{WWW}{\tt (INCLUDECHAR (NEXTCHAR))}\\ + \phantom{WWW}{\tt (LIGTABLE)}\\ + \phantom{WWW}{\tt (NONEWDISCARD)}\\ + \phantom{WWW}{\tt (AUTOTFMWIDTH)}\\ + {\tt )} +\end{itemize} + +\subsubsection{{\tt SAVETABLE}\label{Sect-VFC-SAVE}} + +The command {\tt SAVETABLE} is used when it is desirable +to have \VFC{} commands which are equivalent to the +mapping table equivalent to that used to generate {\tt .vpl} file. +It can have the following forms: +\begin{itemize} +\item[] {\tt (SAVETABLE {\em filename})}\\ + {\tt (SAVETABLE {\em filename} (SHORT))}\\ + {\tt (SAVETABLE {\em filename} (FULL))} +\end{itemize} +where the options {\tt FULL} and {\tt SAVE} +defines the format of the output. + +\section{\VFC{} applications} + +\subsection{Virtual fonts for \TeX{} formats with national + alphabets\label{Sect-CyrTeX}} + +Although everything which can be done by \VFC{} +could be realized also by explicit usage of {\tt .pl} and {\tt .vpl} +file syntaxis (as well as everything which can be +done manually by {\tt .pl} and {\tt .vpl} files can be done with \VFC), +some typical operations with the virtual fonts +are performed with its help {\em easier} +than by manual editing of {\tt .pl} and {\tt .vpl} files. +The typical problem of this type is the adaptation of +standard \TeX{} formats to national alphabets +--- this problem is especially important for cyrillic alphabets +since most cyrillic letters {\em cannot} be created as the combination +of the latin (english) letters with some accents. + +The standard solution of this problem is to combine the english part +taken from Computer Modern family with the +national fonts which extend the Computer Modern family +and which contain in the upper part of ASCII table +(codes 128--255) the national symbols. The best way +how to do it is to create +the {\em virtual font} whose lower part refers to original +CM fonts, and upper part refers to the national fonts --- +it is just the way which was recommended by D.Knuth in \cite{VF}. +The advantage of this approach is that it is possible +to keep the changes in CM fonts and in national fonts separately, +and in addition it is possible to economize +disk space since it is not necessary to +keep {\em two} copies of each Computer Modern character --- one as the +original CM font which is necessary for original \TeX{} +formats, and the second one as the lower part in +the combined national font. + +The combination of the lower part of one font and the upper +part of another font, or even the joining all the characters +from one font and all the characters from another font +(provided that {\em no} character code is encountered twice) +can be done by \VFC{} using few commands. +If some characters are to be discarded from the +font or moved to the different positions of the ASCII table, +it does not makes the command script more complicated. The output +virtual font contains proper metric information for +each character borrowed from the source metric information +and the correct mapping of the characters into individual +real fonts. + +The similar operation can be performed also +by the program {\sl TFMerge} (IHEP \TeX{}ware, Protvino), +but \VFC{} enables to perform additional +operation. +That is, except joining metric and ligature/kerning +information from each font into one virtual font, +it is necessary to add {\em cross}-ligature +and {\em cross}-kerning information for the pairs +of characters taken from different fonts. +\VFC{} enables to add +metric, ligature and kerning data taken from its script file +(which makes the original script a little bit +more complicated). The important feature is that +this additional data can contain {\em variables} +and {\em logical structures}, +which enables to generate the whole CM family of +the virtual typefaces with national characters +using just the same pseudo-program +written on \VFC{} command language. + +Except the operations described above, \VFC{} +is capable to perform the following operations +if it is specified by the User in its script: +\begin{itemize} +\item discard the ligature tables of some real fonts; +\item include in the virtual font the full ligature + table of the real font; +\item include in the virtual font only those characters + which are declared explicitly in user defined data, + and discard the elements of the ligature tables + which correspond to non-included characters of + the real font; +\item automatically add to the virtual fonts the characters + which are not included explicitly by the User + but which are joined with the already included characters + through ligature table data, or + by specifications inside the command {\tt CHARACTER} + the attributes {\tt NEXTLARGER} and/or {\tt VARCHAR}. +\end{itemize} +These features enable to create the desired virtual fonts +for national alphabets with less efforts and with more realibility +than by manual manipulations with {\tt .pl} and {\tt .vpl} files. + +\subsection{Virtual fonts for colored printing\label{Sect-Color}} + +The other problem is the application of the +virtual fonts to multi-colored printing. +Suppose that it is necessary to print the text +where different characters have different colors. +From \TeX-compiler's point of view it means +that the characters with different colors are +assigned to different fonts, and it is a task for +DVI driver to decide how to print these fonts +in desired colors. + +The colored printing is collected from the overlapped +sheets where each sheet of text or graphics is printed +by individual monocolor pass. To make the templates for +monocolor printing it is necessary to organize the output of +the DVI file so that in one pass only yellow characters are printed, +in another pass only blue characters are printed, etc., +while the characters which have the green color are to be printed twice --- +in blue as well as in yellow. The easiest way to teach +{\sl DVI}-driver how to do it is to create different subdirectories +with virtual fonts --- one subdirectory for each elementary +color. The virtual font files placed in the +subdirectory for yellow printing which correspond to the yellow fonts +will refer to the actual {\tt *.pk}-files if and only if the yellow color +is assigned to this character --- otherwise it will +refer to {\em emty} character. The subdirectories for other +colors are organized analogously. As soon as the yellow printing +is performed, the {\sl DVI}-driver is configured so that it takes +the virtual fonts from the ``yellow'' subdirectory, and for +the output in other colors the corresponding reconfiguration +of the {\sl DVI}-driver is performed. + +If the mapping of the empty characters into the {\tt dummy} +font is performed, it results to a wrong behaviour +of the {\sl DVI}-driver: the characters in {\tt dummy} +font have zero size, and it means that the next character after +the empty character is shifted to the left +(as compared with the desired behaviour) +on the distance equal to the width of the skipped character. +To prefent this effect it is necessary to insert in the virtual font +the explicit {\sl DVI}-commands which +move the current output position to the right +by the distance which is the width of the +skipped character. This operation is performed +by \VFC{} by a single command: the User can +\begin{itemize} +\item +assign the attribute {\tt PHANTOM} to each {\em phantom} character; +\item +assign the attribute {\t PHANTOM} to the font +which is used to mark colored letters; +\item +specify the global option {\tt PHANTOM}; +\end{itemize} +and as a result for the necessary characters +the {\em empty mapping} will be performed instead of mapping into +the real font characters. + +\subsection{Substitution of {\tt .pk} fonts + instead of {\sl Postscript} fonts\label{Sect-PostScript}} + +The next problem where the usage of the virtual fonts +is advantageous is the visualization of the document +which was compiled using PostScript fonts. +Generally the scren viewer {\em cannot} +process the Postscript characters, and it is necessary +to remap the PostScript font characters into some {\tt pk}-font +which {\em can} be displayed by the viewer --- say, some typefaces +from the Computer Modern family. + +Such remapping can be performed +using virtual font mechanism, but if it is done without +special precautions the screen view can be far from the +printed output. The reason is that CM characters have +the width different from the PostScript font (the fact that they have +different graphical image is not so essential). +Like the previous case the screen output will be shifted +to the left on the distance which is the difference +between the width of the PostScript character and the +CM character if no special precautions are taken. +To make the correct output, it is necessary to add +to the virtual font the explicit {\sl DVI}-commands +which correct the current output position. + +To make corresponding virtual font automatically, +\VFC{} enables to specify for the real fonts +{\em two} PL-files with the metric information: the first one +for the nominal characters which is used by \TeX{} +to compile the {\sl DVI}-file (in our case it is the PostScript +{\tt afm}-file converted to {\tt tfm} format), and the second one +for the real characters which are used when the {\sl DVI}-file +is displayed (or printed). If such information is +specified by the User, the commands which correct +properly the current output position are inserted in the +virtual font. + +This operation works if both fonts have the same coding +scheme --- namely, the characters used by \TeX{} +and the characters used by {\sl DVI}-viewer +have the same code value. +If it is not so, the operation of re-mapping inside +already mapped font ir required which could be very complicated +and result to a very complicated scheme of virtual vont generation. +To solve this difficulty it is assumed that the correct +metric information for the ``true'' font (i.e., for the font +used in compilation of the {\sl DVI}-file) is already available. +The special operators in \VFC{} enable to load +this information and to correct the proper character width. + +\section*{Acknowledgements}% +\addcontentsline{toc}{section}{Acknowledgements} + +\subsection*{Acknowledgement I}% +\addcontentsline{toc}{subsection}{Acknowledgement I} + +All new improvements of \VFC{} (except English manual) +are the results of the contacts and discussions which were held during +the {\sl Euro\TeX-95} meeting. So I would like to thank Dr.\ Kees +van der Laan for his giant efforts to organise the +visit to the {\sl Euro\TeX-95} the delegation from Russia +and for his patient attention to russian colleagues before, +during and after the {\sl Euro\TeX-95}. + +It is not so easy to recall {\em all} participants of this +conference whose opinion makes an impact in preparing the +new version of \VFC{}. +Among other persons I would like to thank Dr.\ Ph.Taylor and +Dr.\ S.Znamensky for their valuable suggestions which enable to improve +the program. +I would like also to thank O.A.Lapko, S.A.Strelkov and I.A.Mahovaya +for their efforts spent on the Cyrillic \TeX{} project +which actually inspired our work. + +\subsection*{Acknowledgement II}% +\addcontentsline{toc}{subsection}{Acknowledgement II} + +I would like to express +my warmest thanks to Dr. A.Compagner (Delft University of +Technology), who {\em did not} contributed something to this work +but spent a lot of his time and efforts explaining the Phylosophy +of Randomness and his approach to RNG. + +\subsection*{Acknowledgement III}% +\addcontentsline{toc}{subsection}{Acknowledgement III} + + +?????? + +\subsection*{Acknowledgement IV}% +\addcontentsline{toc}{subsection}{Acknowledgement IV} + +This research was partially supported by a grant +from the Dutch Organization for Scientific Research +(NWO grant No 07-30-007). + + + +\def\refname{} +\def\bibname{} +\section*{References}% +\addcontentsline{toc}{section}{References} + +\begin{thebibliography}{00} +\bibitem{VF} D.Knuth, {\em Virtual Fonts: More Fun for Grand Wizards}, + TUGBoat {\bf 11} (1990), No. 1, pp.13--23. +\bibitem{LL} A.Khodulev, I.Mahovaya. +{\em On \TeX{} experience in MIR Publishers}. + Proceedings of the 7th Euro\TeX{} Conference, Prague, 1992. +\bibitem{LH} O.Lapko. + {\em MAKEFONT as a part of CurTUG--Em\TeX{} package}. + Proceedings of the 8th Euro\TeX{} Conference, Gda\'nsk, 1994. +\bibitem{VFC} A.S.Berdnikov, S.B.Turtia. {\em +{\sl VFComb} --- a program for design of virtual fonts}. + Proceedings of the 9th Euro\TeX{} Conference, Arnhem, 1995. +\end{thebibliography} + + +\end{document} + |