\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}