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

