summaryrefslogtreecommitdiff
path: root/systems/msdos/utilities/vfcomb/vfc-eng.tex
blob: 348e560f9e0bc1b818d86107beb679c4e65a0bc0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
\documentstyle{article}
\title{\VFC{} 1.3 \\[1.5ex]
the program for the designers of the virtual fonts}

\author{A.S.Berdnikov\\
Institute of Analytical Instrumentation\\
Rizsky pr. 26, 198103 St.Petersburg, Russia\\
email: {\tt berd{\sl @}ianin.spb.su}}

\date{June 22, 1996}

\newcommand{\VFC}{{\sl VFComb\/}}
\newcommand{\bs}{\char '134 }  % char \
\renewcommand{\contentsname}{}

\begin{document}
\maketitle
\tableofcontents
\clearpage

\section*{Introduction\label{Sect-Intr}}%
\addcontentsline{toc}{section}{Introduction}

The MS DOS program \VFC\ enables to design the virtual
fonts for \TeX, \LaTeX, etc., using already
existing real or virtual fonts \cite{VF}\footnote{It is assumed
that you are familiar with the concept of the virtual fonts and with the
article \cite{VF}. If it is not so, it is highly recommended
to read \cite{VF} before you proceed further.} in a more flexible
manner than the direct manipulations with {\tt .vpl} files.
It simplifies the process of combining real fonts into the virtual font
and makes the debugging of the virtual fonts more simple
and less time consuming. The main purpose of this program was to
facilitate the integration of CM-fonts with cyrillic LL-fonts
created by O.Lapko and A.Khodulev \cite{LL,LH} but it can be used for
other applications too\footnote{Since this MS DOS program is written
on {\sl Borland Pascal} and uses some specific features
of this language, it is hardly portable ``as it is'' to any other platform,
but to my mind it is not too difficult to transfer it to portable ANSI C
(volunteers are welcome).}.

The characteristic feature of the program is that it can assemble
the ligature tables and metric information from various fonts
and combine it with the user-defined metric information
and ligature/kerning data.
The program uses the information from {\tt .tfm} files
(converted to ASCII format by the utility {\sl TFtoPL}) and the ASCII
data files created by the User, and produces
the ASCII {\tt .vpl} file on its output.
The {\tt .vpl} file can be converted later to the
virtual font using the utility {\sl VPtoVF}.

\VFC{} supports the full syntaxis of {\tt .pl} and {\tt .vpl}
files as it was defined by D.E.Knuth \cite{VF} and adds
new commands like numerical variables, pseudo-arithmetics
operations and conditional operators,
which simplifies the design of the virtual fonts.
The typical virtual font operations are performed automatically
and require a compact \VFC{} script file.
The \VFC{} script files have flexible structure
so that just the same script files can be used
to create the full generic font family.

The commands from the \VFC{} script file enables:
\begin{itemize}
\item
      specify the information about the mapping table
      between the characters of the virtual font and the
      real fonts;
\item
      specify the explicit sequences of {\sl DVI}-commands
      substituted instead of some characters of the virtual
      font;
\item
      extract metric information and ligature tables
      from the {\tt .pl} files (converted from {\tt .tfm} files)
      which describe the properties of the real fonts;
\item
      add user-defined metric information and ligature tables
      (for example, the ligature and kerning data for the pairs
      of characters corresponding to different real fonts);
\item
      include automatically new characters
      if these characters are connected by the attributes {\tt VARCHAR},
      {\tt NEXTLARGER} or ligature table data with the characters
      already included into the virtual font;
\item
      insert automatically the {\tt DVI}-commands which
      correct the {\tt DVI}-cursor position if the metric
      information from the virtual font is different from that
      for the real font;
\item
      create the output {\tt .vpl} file which combines all these data.
\end{itemize}

All input and output files are the ordinary ASCII files.
The command line of the program specifies
the name of the script file (the script file contains
the commands which control the work of the program),
and, may be, defines some variables which are analyzed and used later
inside the script file.
The output of the program is the {\tt .vpl} file which contains
all information necessary to create the virtual font using
the utility {\sl VPtoVF} and the {\tt .log} file which summarizes
all printed messages and all operations
performed by {\sl VFComb}.

\section{Command-line parameters\label{Sect-CL}}

The command line contains the list of parameters
which are separated by spaces (the body of the parameter
should contain {\em no} spaces).
The following parameters can be specified:
\begin{itemize}
\item
the name of the script file (the obligatory parameter);
\item
the definition of some variables which are used later in the script file
(variable specifications always contain the character `{\tt =}'
in its body);
\item
the name of the log-file, the names of the
directories which used as a source for the input files,
the directory for the output files, etc.
(these parameters start with the character
`{\tt /}'\footnote{The characters `{\tt !}', `{\tt -}', `{\tt +}'
can be used as well.}).
\end{itemize}
The order of the parameters is of no sence\footnote{%
The {\em only} exception: if the {\tt .log} file name specified
by the command line parameter {\tt /o} does not contain the explicit
directory specification, the directory  specified by the parameter
{\tt /o} is used only if this parameter is specified {\em before}
the parameter {\tt /l} (the command line parameters {\tt /l} and {\tt /o}
are described in section~\ref{Sect-CL-Other}).}.
The {\em responce files} (see section~\ref{Sect-CL-RFiles})
specified in a form `{\tt @{\em filename}}'
and DOS environment variable {\tt VFCOMB}
(see section \ref{Sect-CL-VFCOMB})
can be used to define the parameters
which are too long or which are specified too often
to be typed manually at the command line.

\subsection{Script file name\label{Sect-CL-Script}}

The parameters which specify
the name of the log-file, the names of the
directories which are used as a source for the input files,
the directory for the output files, etc.,
start with the character `{\tt /}'
(the characters `{\tt !}', `{\tt -}', `{\tt +}' can be used as well).
The values of variables specified at the command line
contain the character `{\tt =}' in its body.
The {\em responce file} name starts with the character `{\tt @}'.
All other constructions are recognized as the {\em script file} name.

The {\em script file} is the main source of the commands
which are processed by \VFC{} and which control the creation
of the output {\tt .vpl} file.
If the script file name has no extension, the extension {\tt .tbf}
is added automatically. If the script file name has no explicit
directory specification and it is not found in the current directory,
\VFC{} looks for it in the directories specified by the parameter
{\tt /u}.

The User should specify only {\em one} script file at the command line
(previous versions of \VFC{} enabled to specify {\em several} script files
in the command line).
If several script files are specified (or if there are the command line
parameters which are not recognized by \VFC{} properly as the variable
specifications, responce file names, etc.), the new name redefines
the previous one after the warning message.
If one needs to combine several {\tt .tbf} files into one stream
of commands, the command {\tt LOADFILE} (section~\ref{Sect-VFC-OTHER})
specified inside the script file can be used to do it.

\subsection{Variables\label{Sect-CL-Var}}

The script file commands can use the variables to specify
the numerical and text data.
Usually the variables and their values are specified by the
script file commands described in section~\ref{Sect-VFC-VAR}.
This section considers how it is possible
to specify the variables and their values {\em at the command line} so
that they can be analyzed by the script file commands when the script file
is processed by \VFC.

The definition of the {\em string} variable
and its initial value is performed by the construction
``{\tt {\em name}={\em value}}''
--- when such parameter is encountered in the command line,
a new string variable {\em name} is allocated, and the text string
{\em value} is assigned to it.

The {\em numerical} variables can be specified if the special suffix
is added at the end of the field {\em value}\footnote{Usually it is
not necessary since the User can allocate the
numerical variables and assign the numerical values to them
just by analyzing the contents of the string variables
specified at the command line.}:
\begin{itemize}
\item {\tt /r} or {\tt /R}
corresponds to {\em real variable};
\item
{\tt /F}, {\tt /D}, {\tt /H}, {\tt /O}, {\tt /B}, {\tt /C}
correspond to {\em 32-bit integer} variable where
{\tt /F} means {\em face code} value,
{\tt /D} means {\em decimal} value,
{\tt /H} means {\em hexadecimal} value,
{\tt /O} means {\em octal} value,
{\tt /B} means {\em binary} value,
{\tt /C} means {\em character code} (integer value);
\item
{\tt /f}, {\tt /d}, {\tt /h}, {\tt /o}, {\tt /b}, {\tt /c}
correspond to the {\em byte} (8-bit integer) variable which are usually
used to define the character codes --- similarly to integers,
{\tt /f} means {\em face code},
{\tt /d} means {\em decimal} value,
{\tt /h} means {\em hexadecimal} value,
{\tt /o} means {\em octal} value,
{\tt /b} means {\em binary} value,
and {\tt /c} means {\em character code};
\item
{\tt /@F}, {\tt /@D}, {\tt /@H}, {\tt /@O}, {\tt /@B}, {\tt /@C}
and their lowercase forms
define the string variable with the contents equal to decimal representation
of corresponding integer value --- for example, the parameter
`{\tt tmp=377/@O}' is equivalent to `{\tt tmp=255}'
(octal number 377 has the decimal representation 255).
The suffix `{\tt @}' is equivalent to `{\tt @D}' and `{\tt @d}',
and all three specifications are of no use since `{\tt S=12345/@D}'
is just the same as `{\tt S=12345}'.
\end{itemize}
The contents of the field {\em value} is to be
in agreement with the suffix specification
(see section~\ref{Sect-VFC-NUM} for more details).
Examples:
\begin{description}
\item[\quad{\tt vfcomb  fntnam=CMR10 ...}] --- string variable;
\item[\quad{\tt vfcomb  rval=3.14159/r ...}] --- real variable;
\item[\quad{\tt vfcomb  ival=CDEF/H ...}] --- integer variable with hexadecimal value;
\item[\quad{\tt vfcomb  cval=X/c ...}] --- byte variable which is
the character code for {\tt "X"}.
\end{description}

\subsection{Other parameters\label{Sect-CL-Other}}

The parameters which specify the log-file name, etc., start
with one of the characters `{\tt /}', `{\tt !}', `{\tt -}', `{\tt +}'
followed by the {\em parameter identifier} (a single character) and the
parameter value. The parameter identifier and the parameter
value can be separated by `{\tt :}' or `{\tt =}' to achieve better
readability. Example:
\begin{itemize}
\item[]
{\tt vfcomb ... /l:vfcomb.log -u=c:\bs{}myinput;c:\bs{} !oOUTPUT\bs{} ...}
\end{itemize}
The previous version of \VFC{} used a lot of such parameters
but now most of them are moved inside the script file.
The following parameters can be specified at the command line:
\begin{itemize}

\item {\tt /u={\em list-of-dirs}} --- specifies the list of directories
      separated by `{\tt ;}' which are used to search for the
      input files if the input file is absent in the currect directory.
      Several parameters {\tt /u} can be specified --- in this case
      they are joined together. The maximum number of the search
      directories is 20, and the new {\sf em\TeX}
      directory search algorithm (see {\sf em\TeX} documentation)
      is not implemented.

\item {\tt /l={\em log-file-name}} --- specifies the name for the
      {\tt .log} file which summarizes the operations performed
      by {\sl VFComb}.
      By default the name {\tt {\em scriptfile}.LOG} is used, but
      if the script file is unknown when the first \VFC{} message is printed,
      the {\tt .log} file has the name {\tt VFCOMB.LOG}.

\item {\tt /o={\em output-dir}} --- specifies the directory
      where the output files ({\tt .vpl} and {\tt .log} files)
      are to be placed if their directories are not specified explicitly.

\end{itemize}

\subsection{Responce files\label{Sect-CL-RFiles}}

The User can specify the construction
`{\tt @{\em filename}}' among the list of the command line
parameters which means that the contents of the file {\em filename}
is added to the contents the command line.

Each line of the responce file is interpreted as
a separate parameter. The initial spaces
of the line are omitted, and the characters after
the first space which terminates the parameter are omitted too.
The lines which start from the characters
{\tt '\%'}, {\tt ';'}, {\tt '*'} and the empty lines are ignored.

The responce files can be nested in each other
(that is, the responce file can have the line {\tt @}{\em filename$1$}
again) but the depth of their nesting cannot be greater than 5.

\subsection{Environment variable {\tt VFCOMB}\label{Sect-CL-VFCOMB}}

The User can define the DOS environment variable {\tt VFCOMB}
using the command
\begin{itemize}
\item[] {\tt SET VFCOMB=......}
\end{itemize}
The  contents of this variable is added
{\em at the beginning} of the command line.
As a result, the contents of the command line redefines
the default specifications established by
the environment variable {\tt VFCOMB}
if some parameters are specified twice.

\section{Script file commands\label{Sect-VFC}}

The \VFC{} syntaxis is very close to the syntaxis of {\tt .vpl}
files (it enables to economize the program code
since \VFC{} is to read and to analyze the {\tt .vpl} files
in any case).
That is, the {\tt .tbf}, {\tt .pl} and {\tt .vpl} files are composed
from the entries specified in a form
\begin{itemize}
\item[] {\tt (PROPERTYNAME VALUE)}
\end{itemize}
where the {\tt VALUE} can contain nested list structures as well.

\bigskip

The following extensions of {\tt .pl} and {\tt .vpl} syntaxis
\cite{VF} are used by \VFC:
\begin{itemize}
\item new types of numerical constants;
\item numerical variables;
\item pseudo-arithmetical expressions;
\item string variables and string expressions;
\item conditional operators.
\end{itemize}
These commands are described in details in section~\ref{Sect-VFC-VPL}.

\bigskip

The commands specific to \VFC{} {\tt .tbf} files enable to
specify the following data:
\begin{itemize}
\item the name of the virtual font (actually the name
      of the output {\tt .vpl} file);
\item the header data which is specified at the
      beginning of the virtual font;
\item the assignment (if necessary) the numerical values to
      symbolic variables used in specification of other
      user defined data;
\item the table(s) for mapping
      the characters of the real fonts into
      the characters of the virtual font;
\item the additional ligature table(s) (if present) which
      contain the ligature and kerning information
      for the pairs of characters corresponding
      to different real fonts;
\item the metric information,
      ligature and kerning tables, etc.,
      for the characters of the real fonts;
\item the options which control the process
      of creation of the virtual font.
\end{itemize}

\subsection{Extensions of {\tt .vpl} files\label{Sect-VFC-VPL}}

The following commands and extensions of numerical data specifications
are valid for \VFC{} script files ({\tt .tbf} files) and for {\tt .pl}
and {\tt .vpl} files as well. These commands are processed inside
\VFC{} ``mouth'' subroutines, and as a result they are invisible
for the subroutines which analyze the syntaxis of {\tt .tbf}, {\tt .pl}
and {\tt .vpl} files.

The structure of the algorithm which analyzes the
syntaxis of the input commands implies some restrictions on the way
these {\em preprocessor} commands can be used in the source files.
The {\em preprocessor} commands can be inserted at any point
where the argument {\tt (......)} is suitable.
So, they can be specified on the upper level of braces,
they can be specified as the argument of the command
{\tt (CHARACTER ...)} since it {\em has} the sub-list arguments,
but they cannot be specified inside the command
{\tt (CHECKSUM ...)} since there are {\em no} sub-list
agruments for this command.

\subsubsection{Numerical values\label{Sect-VFC-NUM}}

The syntaxis of {\tt .vpl} files enables to use
the numerical data of different forms.
The numerical data can be specified as real (floating point) values,
32-bit integer values and 8-bit integer values.
Depending of the context, real or integer values
should be used, and the range if the accepted
integer values depends on context also (say, character code
cannot be greater than 255 while the {\tt checksum} parameter
is a full 32-bit integer).

Each value starts with the prefix letter preceeded by a space
and separated from the following actual value by a space
(as usually, there may be as many spaces as you need
at any place where at least one space is allowed).
The prefix character defines the type of the numerical
value, and the following types can be used:
\begin{description}
\item[\quad{\tt R} {\em value}] --- real values ({\tt R 0.27182});
\item[\quad{\tt D} {\em value}] --- decimal integer values ({\tt D 123456});
\item[\quad{\tt O} {\em value}] --- octal integer values ({\tt O 377});
\item[\quad{\tt H} {\em value}] --- hexadecimal integer value ({\tt H 07FA});
\item[\quad{\tt C} {\em character}] --- character numerical code ({\tt C x}
                    is the code value for character `{\tt x}');
\item[\quad{\tt F} {\em ident}] --- Xerox {\em face code}, i.e.,
                    an integer value which is substituted by
                    a 3-letter identifier ({\tt F LIE} = {\tt D 17})
                    where the full list of the face codes assigned
                    to the integers from 0 to 17
                    is: MRR, MIR, BRR, BIR, LRR, LIR,
                        MRC, MIC, BRC, BIC, LRC, LIC,
                        MRE, MIE, BRE, BIE, LRE, LIE.
\end{description}

For \VFC{} input files in all places where the real values can be used,
the integer values can be used also,
and in all places where 32-bit integers are accepted, 8-bit
integers are accepted too.
\VFC{} also extends the set of prefix letters so that
more general and more flexible expressions can be constructed:
\begin{description}
\item[\quad{\tt B} {\em value}] --- binary integer value ({\tt B 011111111010});
\item[\quad{\tt V} {\em var-name}] --- the value of some numerical
                 (real or integer) variable ({\tt V FntSize});
\item[\quad{\tt V-} {\em var-name}] --- the {\em negated} value
                of some numerical
                 (real or integer) variable ({\tt V- FntSize});
\item[\quad{\tt V+} {\em var-name}] (unary `$+$') --- just the same as
                 {\tt V} {\em var-name} ({\tt V+ FntSize});
\item[\quad{\tt V\~{}} {\em var-name}] --- bit-by-bit {\em negated}
                  value of an integer variable ({\tt V\~{} FntSize});
\item[\quad{\tt A+}  {\em value1}  {\em value2}]
  --- addition of two (real or integer) values (`{\tt A+ D 2 D 2}' = 4);
\item[\quad{\tt A-}  {\em value1}  {\em value2}]
  --- subtraction of two (real or integer) values (`{\tt A- D 5 D 3}' = 2);
\item[\quad{\tt A*}  {\em value1}  {\em value2}]
  ---  multiplication of two (real or integer) values
   (`{\tt A* D 5 D 3}' = 8);
\item[\quad{\tt A/}  {\em value1}  {\em value2}]
  --- division (real or integer) of two (real or integer) values
   (`{\tt A/ D 5 D 2}' = 2 for integers,
    `{\tt A/ R 5.0 R 2.0}' = 2.5 for real values);
\item[\quad{\tt A\%}  {\em value1}  {\em value2}]
  --- the residue of integer division (mod) of two integer or real values
   (`{\tt A\% R 5.0 R 2.0}' = 1.0);
\item[\quad{\tt A!}  {\em value1}  {\em value2}]
  --- bit-by-bit {\bf or} operation between two integer values
   (`{\tt A! B 1010 B 0011}' = {\tt B 1011} = 11);
\item[\quad{\tt A\&}  {\em value1}  {\em value2}]
  --- bit-by-bit {\bf and} operation between two integer values
   (`{\tt A\& B 1010 B 0011}' = {\tt B 0010} = 2);
\item[\quad{\tt A\^{}}  {\em value1}  {\em value2}]
  --- bit-by-bit {\bf xor} operation between two integer values
   (`{\tt A\^{} B 1010 B 0011}' = {\tt B 1001} = 9);
\item[\quad{\tt A>}  {\em value1}  {\em value2}]
  --- right shift of integer {\em value1} by {\em value2} bits
   (`{\tt A> B 1010 D 2}' = {\tt B 10} = 2);
\item[\quad{\tt A<}  {\em value1}  {\em value2}]
  --- left shift of integer {\em value1} by {\em value2} bits
   (`{\tt A< B 1010 D 2}' = {\tt B 101000} = 40);
\item[\quad{\tt -A}  {\em value}]
  --- unary `$-$'
   (`{\tt -A D 5}' = -5, `{\tt -A D -5}' = 5);
\item[\quad{\tt +A}  {\em value}] --- unary `$+$'
   (`{\tt +A {\em value}}' = {\em value});
\item[\quad{\tt \~{}A}  {\em value}]
  --- bit-to-bit negated integer {\em value}
   (`{\tt \~{}A B 1010}' = {\tt B 0101} = 5).
\end{description}
The arguments of the arithmetic expressions can be the arithmetic
expressions again which enables to build complex arithmetic forms
(similar to {\em polish notation}) ---  unfortunately these forms
are not suitable for fast human recognition.
The arithmetic operations {\tt A!}, {\tt A\&},
{\tt A\^{}}, {\tt A>}, {\tt A<}, {\tt \~{}A}, {\tt V\~{}}
can be used for integer arguments and only at the places
where the integer expression is required.

\bigskip

Although \VFC{} syntaxis enables to use complex string
constructions (see section~\ref{Sect-VFC-STRING}),
the values specified as the arguments
of the prefix commands {\tt R}, {\tt D}, {\tt O}, {\tt F}, {\tt C},
{\tt H}, {\tt B}, {\tt V} are always the primitive text strings
(i.e., the sequences of characters terminated by a space
or the closing braces `{\tt)}').
It means that the expression `{\tt D @V ABC}' where
{\tt ABC} is the string variable with the value {\tt "99"} is illegal
although one can assume that it is to be equivalent
to `{\tt D 99}'.

There are some serious reasons not to allow the string expressions
to be the arguments of the arithmetic constants.
The simplest one is, for example, that in this case
it is impossible to convert the {\em legal} expression {\tt C @} into
numerical value {\tt D 64} as it is required by the rules
of {\tt .vpl} files.
Nevertheless, to enable to use such possibilities if necessary,
the following prefix commands are added
which enable to perform the conversion of
the string expressions into numerical values:
\begin{description}
\item[\quad{\tt D@} {\em string}]
  --- interprete string expression as a decimal integer value;
\item[\quad{\tt O@} {\em string}]
  --- interprete string expression as an octal integer value;
\item[\quad{\tt H@} {\em string}]
  --- interprete string expression as a hexadecimal integer value;
\item[\quad{\tt B@} {\em string}]
  --- interprete string expression as a binary integer value;
\item[\quad{\tt F@} {\em string}]
  --- interprete string expression as an integer {\em face code};
\item[\quad{\tt C@} {\em string}]
  --- interprete string expression as a {\em character code}
      (string is to be a single character);
\item[\quad{\tt R@} {\em string}]
  --- interprete string expression as a real value;
\item[\quad{\tt V@} {\em string}]
  --- interprete string expression as a name of a variable
      (real or integer).
\end{description}


\subsubsection{String values\label{Sect-VFC-STRING}}

Some {\tt .pl} and {\tt .vpl} commands require text strings as their
arguments (commands {\tt CODINGSCHEME}, {\tt FAMILY},
{\tt VTITLE}, for example).
\VFC{} extends the set of numerical values
so that the string values, string variables and string
expressions can be used together with the numerical ones.
The specification of the {\em string variables}
and {\em string expressions} makes the specification of
some commands more flexible and
enables to prepare efficient and compact \VFC{} scripts.

The string constants (contrary to the numerical constants)
have no special prefix --- they are just the sequences
of characters which can be surrounded by spaces.
 Contrary to that
the string expressions start with the prefix `{\tt @}' ---
which means that a string constant {\em cannot} starts
from this letter but it does not restrict the flexibility
in specification of the string constants too much.

The following string operations can be used:
\begin{description}
\item[\quad{\tt @V} {\em var-name}]
     --- the value of some string variable defined previously
     ({\tt @V HlpString})
     (essential note: the argument of the prefix command {\tt @V}
     {\em can be} the string expression itself like that of the
     prefix command {\tt V@} described at the previous section);
\item[\quad{\tt @R} {\em real-value}]
     --- the real numerical value converted to a text string
     (`{\tt @R A/ R 1 R 7}' = {\tt "0.14285714286"}
      since `{\tt A/ R 1 R 7}' = $1/7$);
\item[\quad{\tt @D} {\em integer-value}]
     --- the integer numerical value converted to decimal text
         representation
     (`{\tt @D O 377}' = {\tt "255"});
\item[\quad{\tt @O} {\em integer-value}]
     --- the integer numerical value converted to octal text
         representation
     (`{\tt @O D 255}' = {\tt "377"});
\item[\quad{\tt @H} {\em integer-value}]
     --- the integer numerical value converted to hexadecimal text
         representation
     (`{\tt @H D 255}' = {\tt "FF"});
\item[\quad{\tt @B} {\em integer-value}]
     --- the integer numerical value converted to binary text
         representation
     (`{\tt @H D 255}' = {\tt "11111111"});
\item[\quad{\tt @F} {\em string-value}]
     --- extract font name from the string
     (`{\tt @F cmr10}' = {\tt "cmr"});
\item[\quad{\tt @P} {\em string-value}]
     --- extract the string part after the font name from the string
     which for legal font names is the font design size in {\tt pt}
     (`{\tt @P cmr10}' = {\tt "10"});
\item[\quad{\tt @U} {\em string-value}]
     --- convert the string value to uppercase form
     (`{\tt @U cMr10}' = {\tt "CMR10"});
\item[\quad{\tt @L} {\em string-value}]
     --- convert the string value to lowercase form
     (`{\tt @L cMr10}' = {\tt "cmr10"});
\item[\quad{\tt @+} {\em string1} {\em string2}]
     --- combines two strings into one string
     (`{\tt @+ CMR 10}' = {\tt "CMR10"});
\item[\quad{\tt @} {\em integer-value}] --- string which consists
  from a single character with a specified code
  ({\em integer-value} is in a range 0--255);
\item[\quad{\tt @@} {\em integer-value}] --- string
     of the specified length composed from spaces;
\item[\quad{\tt @.}] --- empty string
     (just the same as {\tt @@ D 0}).
\end{description}
As usually the numerical and string values can be the complex
expressions, not only the elementary constants.

The sequences of string constants and string expressions
separated by spaces can be specified as the argument of
the commands like {\tt FAMILY}, {\tt CODINGSCHEME}, {\tt VTITLE}.
In this case the \VFC{} inserts a space
between individual string element and expands string expressions
to a form of a string constants. As a result the string composed
from a sequence of words separated by spaces (where multiple subsequent
spaces are compressed into one space) can be constructed
and written into the output {\tt .vpl} file.


\subsubsection{Variables\label{Sect-VFC-VAR}}

As it was mentioned in sections \ref{Sect-VFC-NUM} and \ref{Sect-VFC-STRING},
it is possible to allocate {\em variables} and to assign
the {\em values} for them so that these values can be analysed and used
later. The variables have different types: real, integer, character (byte)
and string. The usage of the variables and the values assigned
to the variables are to be in agreement with their type.

The operator which allocates a new variable has a form:
\begin{itemize}
\item[] {\tt (VARIABLE ({\em var-type} {\em var-name} {\em var-value}))}
\end{itemize}
where
\begin{itemize}
\item {\em var-type} is one of the identifiers
      {\tt REAL}, {\tt INTEGER}, {\tt CHARACTER}
      ({\tt CHAR}, {\tt BYTE}) or {\tt STRING},
      which define the type of the variable;
\item {\em var-name} is the name of the variable
      which is to be different from the names of the other
      variables;
\item {\em var-value} is the real, 32-bit integer,
      8-bit integer or string expression which defines
      the initial value of the variable.
\end{itemize}
Example:
\begin{itemize}
\item[] {\tt (VARIABLE (CHARACTER Del D 127))}\\
        {\tt (VARIABLE (REAL Kern\#KKK R -0.3333))}
\end{itemize}

It is possible to allocate more than one variable
inside one operator {\tt VARIABLE} by specifying
several sublists inside it:
\begin{itemize}
\item[] {\tt (VARIABLE}\\
        \phantom{.}\qquad{\tt (CHARACTER Del D 127)}\\
        \phantom{.}\qquad{\tt (REAL Kern\#KKK R -0.3333)}\\
        \phantom{.}\qquad{\tt ......}\\
        {\tt )}
\end{itemize}

The variable names are case-sensitive: the variables
with the names {\tt Var} and {\tt vAr} are different.
The variable names can be composed using {\em arbitrary} characters,
not only latin letters and digits.
Nevertheless, it is better not to use the names started from `{\tt @}' ---
otherwise it is possible to get a strange behaviour
for the prefix commands {\tt V@} and {\tt @V} (the arguments
of these commands are analyzed as string expressions, and in this case
the first letter `{\tt @}' is recognized as the prefix of string
operastion).

If the operator {\tt VARIABLE} uses the name which was already
used, the warning message is printed and the old variable
is deleted.
The variable value can be changed without the warning message
by the operator {\tt ASSIGN} which has the form
\begin{itemize}
\item[] {\tt (ASSIGN {\em var-name} {\em var-value})}
\end{itemize}
The type of the value {\em var-value} is to be in agreement
with the trype of the variable defined earlier.
Only one variable can be changed in one operator {\tt ASSIGN}.
Example:
\begin{itemize}
\item[] {\tt (ASSIGN Del D 255)}\\
        {\tt (ASSIGN Kern\#KKK R +1.51134)}
\end{itemize}

It is possible also to allocate new vartiables and to assign
their initial values directly from the command line ---
see section~\ref{Sect-CL-Var} for more details.

\subsubsection{Conditional operators\label{Sect-VFC-IFF}}

\VFC{} script files can contain the conditional
{\tt IF-THEN-ELSE} operators. The following groups
of conditional operators can be used:
\begin{itemize}
\item comparison of integer values;
\item comparison of real values;
\item comparison of string values;
\item operators which check the existance of the variables;
\item integer {\tt IF-CASE} operators;
\item string {\tt IF-CASE} operators.
\end{itemize}
The depth of {\tt IF-THEN-ELSE}-operators cannot exceed 50.

\bigskip

The general form of {\tt IF}-operators is the following:
\begin{itemize}
\item[]{\tt (IF-{\em condition} {\em if-data})}\\
       \phantom{WWW}{\tt .........}\\
       \phantom{WWW}{\em commands}\\
       \phantom{WWW}{\tt .........}\\
       {\tt (ELSE)}\\
       \phantom{WWW}{\tt .........}\\
       \phantom{WWW}{\em commands}\\
       \phantom{WWW}{\tt .........}\\
       {\tt (ENDIF)}
\end{itemize}
The general form of {\tt IF-CASE}-operators is the following:
\begin{itemize}
\item[]{\tt (IF-CASE-{\em condition} {\em if-case-data})}\\
       \phantom{WWW}{\tt (CASE {\em case-value1})}\\
       \phantom{WWW}{\tt .........}\\
       \phantom{WWW}{\em commands}\\
       \phantom{WWW}{\tt .........}\\
       \phantom{WWW}{\tt (BREAK)}\\
       \phantom{WWW}{\tt (CASE {\em case-value2})}\\
       \phantom{WWW}{\tt .........}\\
       \phantom{WWW}{\em commands}\\
       \phantom{WWW}{\tt .........}\\
       \phantom{WWW}{\tt (BREAK)}\\
       \phantom{WWW}{\tt .........}\\
       {\tt (ELSE)}\\
       \phantom{WWW}{\tt .........}\\
       \phantom{WWW}{\em commands}\\
       \phantom{WWW}{\tt .........}\\
       {\tt (ENDIF)}
\end{itemize}
As usually, the {\tt ELSE}-block can be skipped together
with the command {\tt (ELSE)}.

\bigskip

Actually {\tt IF-}commands and {\tt IF-CASE}-commands are the preprocessor
operators which are used by \VFC{} read-data subroutines
to skip some blocks of input data.
{\tt IF}-commands transfer the block after {\tt IF-}command if some
condition is fulfilled, and transfer {\tt ELSE}-block if it is not
fulfilled.
{\tt IF-CASE}-operators check that {\em if-case-data} is equal to
{\em case-value} and transfer the corresponding block of commands
further. The {\tt CASE}-block is to be
terminated by {\tt (BREAK)} --- like {\sl C} conditional
operators the {\tt CASE}-block is not terminated automatically
when the next {\tt (CASE ...)} is encountered.

\bigskip
The following {\tt IF}-conditions and {\tt IF-CASE}-conditions can be used:
\begin{description}
\item[\quad\tt(IF {\em integer-value})]
    --- checks that some integer expression is not equal to zero;
\item[\quad\tt(IF-NOT {\em integer-value})]
    --- checks that some integer expression is equal to zero;
\item[\quad{\tt(IF-ONE {\em integer-value})},
           {\tt(IF-TRUE {\em integer-value})}]
    --- just the same as the command {\tt(IF {\em integer-value})};
\item[\quad{\tt(IF-ZERO {\em integer-value})},
           {\tt(IF-FALSE {\em integer-value})}]
    --- just the same as the command {\tt(IF-NOT {\em integer-value})};
\item[\quad\tt(IF-DEF {\em var-name})]
    --- checks that some variable is defined already;
\item[\quad\tt(IF-NDEF {\em var-name})]
    --- checks that some variable is not defined still;
\item[\quad{\tt(IF-EQ {\em integer$_1$} {\em integer$_2$})}]
    --- checks that $\hbox{\em integer}_1=\hbox{\em integer}_2$;
\item[\quad{\tt(IF-NE {\em integer$_1$} {\em integer$_2$})}]
    --- checks that $\hbox{\em integer}_1\ne\hbox{\em integer}_2$;
\item[\quad{\tt(IF-GT {\em integer$_1$} {\em integer$_2$})}]
    --- checks that $\hbox{\em integer}_1>\hbox{\em integer}_2$;
\item[\quad{\tt(IF-LT {\em integer$_1$} {\em integer$_2$})}]
    --- checks that $\hbox{\em integer}_1<\hbox{\em integer}_2$;
\item[\quad{\tt(IF-GE {\em integer$_1$} {\em integer$_2$})}]
    --- checks that $\hbox{\em integer}_1\ge\hbox{\em integer}_2$;
\item[\quad{\tt(IF-LE {\em integer$_1$} {\em integer$_2$})}]
    --- checks that $\hbox{\em integer}_1\le\hbox{\em integer}_2$;
\item[\quad{\tt(IFR-EQ {\em real$_1$} {\em real$_2$})}]
    --- compare two real values: $\hbox{\em real}_1=\hbox{\em real}_2$;
\item[\quad{\tt(IFR-NE {\em real$_1$} {\em real$_2$})}]
    --- compare two real values: $\hbox{\em real}_1\ne\hbox{\em real}_2$;
\item[\quad{\tt(IFR-GT {\em real$_1$} {\em real$_2$})}]
    --- compare two real values: $\hbox{\em real}_1>\hbox{\em real}_2$;
\item[\quad{\tt(IFR-LT {\em real$_1$} {\em real$_2$})}]
    --- compare two real values: $\hbox{\em real}_1<\hbox{\em real}_2$;
\item[\quad{\tt(IFR-GE {\em real$_1$} {\em real$_2$})}]
    --- compare two real values: $\hbox{\em real}_1\ge\hbox{\em real}_2$;
\item[\quad{\tt(IFR-LE {\em real$_1$} {\em real$_2$})}]
    --- compare two real values: $\hbox{\em real}_1\le\hbox{\em real}_2$;
\item[\quad{\tt(IFS-EQ {\em string$_1$} {\em string$_2$})}]
    --- compare two text strings: $\hbox{\em string}_1=\hbox{\em string}_2$;
\item[\quad{\tt(IFS-NE {\em string$_1$} {\em string$_2$})}]
    --- compare two text strings: $\hbox{\em string}_1\ne\hbox{\em string}_2$;
\item[\quad{\tt(IFS-GT {\em string$_1$} {\em string$_2$})}]
    --- compare two text strings: $\hbox{\em string}_1>\hbox{\em string}_2$;
\item[\quad{\tt(IFS-LT {\em string$_1$} {\em string$_2$})}]
    --- compare two text strings: $\hbox{\em string}_1<\hbox{\em string}_2$;
\item[\quad{\tt(IFS-GE {\em string$_1$} {\em string$_2$})}]
    --- compare two text strings: $\hbox{\em string}_1\ge\hbox{\em string}_2$;
\item[\quad{\tt(IFS-LE {\em string$_1$} {\em string$_2$})}]
    --- compare two text strings: $\hbox{\em string}_1\le\hbox{\em string}_2$;
\item[\quad{\tt(IF-CASE {\em integer-value})}]
    --- integer {\tt IF-CASE}-operator that checks that
    the {\em integer-value} is equal to the argument of some
    {\tt (CASE {\em integer})} command in its body;
\item[\quad{\tt(IF-CASE {\em integer-value})}]
    --- integer {\tt IF-CASE}-operator that checks that
    the {\em integer-value} is equal to the argument of some
    {\tt (CASE {\em int-value})} command specified
    after it and before closing {\tt (ENDIF)} operator;
\item[\quad{\tt(IFS-CASE {\em string-value})}]
    --- string {\tt IF-CASE}-operator that checks that
    the {\em string-value} is equal to the argument of some
    {\tt (CASE {\em string})} command specified
    after it and before closing {\tt (ENDIF)} operator.
\end{description}
Similarly to prefix commands {\tt V@} and {\tt @V}
(see sections \ref{Sect-VFC-NUM} and \ref{Sect-VFC-STRING}),
the arguments of the conditions {\tt IF-DEF} and {\tt IF-NDEF} are
analyzed as the string expressions, not as the string constants
(see section~\ref{Sect-VFC-STRING}).
The arguments of the string {\tt IFS}-commands
and {\tt IFS-CASE}-command are also processed as the string expressions
and the strings are converted to uppercase form before comparison.

\bigskip
Examples:
\begin{itemize}
\item[]
       {\tt (IF-DEF FONTNAME)}\\
       \phantom{WWW}{\tt (MESSAGE The variable FONTNAME = @V FONT)}\\
       {\tt (ELSE)}\\
       \phantom{WWW}{\tt (VARIABLE (STRING FONTNAME CMR10))}\\
       {\tt (ENDIF)}
\item[]
      {\tt (IF-TRUE V monospace)}\\
      \phantom{WWW}{\tt (MESSAGE `MONOSPACE' mode is active)}\\
      {\tt (ELSE)}
      \phantom{WWW}{\tt (LOADFILE kerndata.tbf)}\\
      {\tt (ENDIF)}
\item[]{\tt (IF-CASE V FONTPITCH)}\\
       \phantom{}{\tt (CASE D 5)}\\
       \phantom{WWW}{\tt (ASSIGN u\# R 12.5}\\
       \phantom{WWW}{\tt (BREAK)}\\
       \phantom{}{\tt (CASE D 6)}\\
       \phantom{WWW}{\tt (ASSIGN u\# R 14.0}\\
       \phantom{WWW}{\tt (BREAK)}\\
       \phantom{}{\tt .........}\\
       {\tt (ELSE)}\\
       \phantom{WWW}{\tt (MESSAGE Unknown FONTPITCH value)}\\
       \phantom{WWW}{\tt (HALTPGM)}\\
       {\tt (ENDIF)}
\end{itemize}


\subsubsection{Other operators\label{Sect-VFC-OTHER}}

There are other commands
which can be useful for the logical structuring
of the input stream of \VFC{} commands:
\begin{description}
\item[\quad\tt(COMMENT {\em text})] --- skip the {\em text}
     which can include arbitrary \VFC{} commands
     provided that the opening and closing braces
     `{\tt (}' and `{\tt )}' are balanced correctly.
\item[\quad\tt(MESSAGE {\em text})] --- print the {\em text}
     which may be the combination of string elements and
     string expressions (see section~\ref{Sect-VFC-STRING})
     separated by spaces, and can include opening and closing
     braces `{\tt (}' and `{\tt )}' if they are balanced
     correctly, but it cannot exceed 255 characters.
\item[\quad\tt(TYPEOUT {\em text})] --- just the same as
     {\tt (MESSAGE {\em text})}.
\item[\quad{\tt(LOADFILE {\em filename})} or {\tt(LOAD {\em filename})}]
    --- insert at this place the contents of the file {\em filemane}
    ({\em filename} can be a string expression)
    from the beginning and up to the end or up to the first command
    {\tt (ENDLOAD)} encountered in it.
    If the extension of the {\em filename} is not specified
    explicitly,
    the extension {\tt .tbf} is added if the command {\tt LOADFILE}
    is encountered during the processing of script file {\tt .tbf},
    and the extension {\tt .pl} is added if the command {\tt LOADFILE}
    is encountered during the processing of the {\tt .pl}
    corresponding to a real font metric data.
\item[\quad\tt(ENDLOAD)] --- stop to read the contents
    of the current input file and return the the previous file.
\item[\quad\tt(ENDINPUT)] --- stop to read the input data stream;
\item[\quad\tt(HALTPGM)] --- stop the program.
\end{description}


\subsection{{\tt MAPFONT} or {\tt FONT}\label{Sect-VFC-MAPFONT}}

The command {\tt MAPFONT} describes the real fonts which are
used in the virtual font. One {\tt MAPFONT} command should be
specified for each real font used in the virtual font.

The command {\tt MAPFONT} assignes the integer {\em index}
to the real font, and all the commands which use the references to
the real fonts refer to this {\em index} value. It can also
specify the processing modes for this font
(some of them overwrites the modes specified at the command
{\tt OPTION} described at the section~\ref{Sect-VFC-OPTION})
and the standard mapping table for the characters
extracted from this font --- so that the commands
{\tt CHARACTER} deascribed at section~\ref{Sect-VFC-CHAR}
becomes unnecessary to great extend.

The command {\tt MAPFONT} has the format:
\begin{itemize}
\item[]
{\tt (MAPFONT {\em index}
({\em option}$_1$) ({\em option}$_2$)... )}
\end{itemize}
where the {\em index} is the integer value.
The valid {\em options} are:
\begin{description}

\item[\quad{\tt(FONTNAME {\em filename})} or {\tt(NAME {\em filename})}]
   --- specifies the name of the real font (obligatory parameter).

\item[\quad{\tt(TFMINPUT {\em filename})}]
   --- specifies the name of the {\tt .pl} file which is used
   to load data about this font. The {\tt .pl} file {\tt $<$fontname$>$.tbf}
   is used if this parameter is not specified where {\tt $<$fontname$>$}
   is value of the parameter {\tt FONTNAME} defined above.

   The command {\tt (TFMINPUT EMPTY)} means that this is the font
   which contains no characters at all.
   The command {\tt (TFMINPUT DUMMY)} means that this is the font
   which contains all the characters but with zero metric information
   and without {\tt VARCHAR} and {\tt NEXTLARGER} attributes.
   In both cases no {\tt .pl} file is read by \VFC{} --- the
   necessary font information is generated automatically.

\item[\quad{\tt(FONTAT {\em real-value})}] --- specifies the parameter
   {\tt FONTAT} transferred to {\tt .vpl} file
   (the default value {\tt (FONTAT R 1.0)}).
   This parameter is also used to re-calculate {\em dimensional}
   parameters from the {\tt .pl} file according to
   {\tt DESIGNUNITS} and {\tt DESIGNSIZE} from the
   header of the {\tt .vpl} file.

\item[\quad{\tt(FONTAREA {\em text-string})}] --- specifies the parameter
   {\tt FONTAREA} transferred to {\tt .vpl} file.
   This parameter specifies the explicit directory
   for corresponding real font, and as a rule is not used
   since it restricts the flexibility of font
   specification \cite{VF}.

\item[\quad{\tt(CHECKSUM {\em 32-bit-integer})}] --- specifies
   explicitly the value {\tt FONTCHECKSUM} --- the {\em checksum}
   of the {\tt .tfm} file of this real font stored in the {\tt .vpl} file.
   Usually it is not necessary to specify this parameter
   explicitly since its correct value is copied from the {\tt .pl} file
   with the font metric data.
   When the {\sl DVI}-driver loads the virtual and the real fonts,
   the {\tt FONTCHECKSUM} from the {\tt .vpl} file is compared
   with the {\em checksum} calculated for the {\tt .tfm} files,
   and the warning message is printed if these values are different
   (this message shows that the versions of {\tt .vf} and {\tt .tfm}
   files may be different or that the {\tt .tfm} file may be damaged).

\item[\quad{\tt(FULL)}], {\tt(7TO8)}, {\tt(8TO7)}, {\tt(7TO7)}, {\tt(8TO8)},
      {\tt(JWNCYR)}, {\tt(CYRTUG)} --- these parameters specify
      the default mapping table for this real font:
      according to some rule the characters of the virtual font
      are mapped into the characters of this real font if
      these characters of the real font are defined and if the
      corresponding positions of the virtual font are not
      occupied still.
\begin{description}
\item[\quad{\tt(FULL)}] --- include in the virtual font
     all the characters from this font  so that the character codes
     are mapped to themselves;
\item[\quad{\tt(7TO8)}] ---  include in the virtual font
     the characters 0--127 from the real font so that
     the character {\tt D 0} of the real font corresponds to
     the character {\tt D 128} of the virtual font,
     the character {\tt D 1} of the real font corresponds to
     the character {\tt D 129} of the virtual font, etc.;
\item[\quad{\tt(8TO7)}] --- include in the virtual font
     the characters 128--255 from the real font so that
     the character {\tt D 128} of the real font corresponds to
     the character {\tt D 0} of the virtual font,
     the character {\tt D 129} of the real font corresponds to
     the character {\tt D 1} of the virtual font, etc.;
\item[\quad{\tt(7TO7)}] --- include in the virtual font
     the characters 0--127 from this font  so that the character codes
     are mapped to themselves;
\item[\quad{\tt(8TO8)}] --- include in the virtual font
     the characters 128--255 from this font  so that the character codes
     are mapped to themselves;
\item[\quad{\tt(CYRTUG)}] --- include in the virtual font
     the characters 128--175, 224--244 from this font
     so that the character codes
     are mapped to themselves ({\sl CYRTUG} coding scheme
     for cyrillic characters);
\item[\quad{\tt(JWNCYR)}] --- include in the virtual font
     the characters 128--175, 224--244 from this font
     so that the cyrillic characters for {\sl WNCYR} coding
     scheme are mapped to cyrillic characters
     for {\sl CYRTUG} coding scheme.
\end{description}

\item[\quad{\tt (TRACE)}, {\tt (NOTRACE)}, {\tt (TRACE D {\em integer})}] ---
specifies the level for printing of the debugging information
when the ligature tables of this font are processed by \VFC.

\item[\quad{\tt(LIGTABLE)} and {\tt(NOLIGTABLE)}] --- include
     or do not include in the virtual font
     the ligature tables of this font.

\item[\quad\tt(PHANTOM)] --- assign attribute {\tt PHANTOM}
     to all characters which are mapped to this font,
     for which the attributes {\tt PHANTOM} or {\tt NOPHANTOM}
     are not specified explicitly.

\item[\quad\tt(NOPHANTOM)] --- switches off for this font the option
     {\tt PHANTOM} specified by the command {\tt OPTION}
     (see section~\ref{Sect-VFC-OPTION}).

\item[\quad{\tt(AUTOTFMWIDTH)} and {\tt(NOAUTOTFMWIDTH)}]
     --- for the characters which are mapped to this font
     and for which the attributes {\tt SIZECHAR} and {\tt SIZEFONT}
     are specified, \VFC{} adds automatically the attribute {\tt AUTOTFMWIDTH}
     or the attribute {\tt NOAUTOTFMWIDTH}, respectively,
     if such attribute is not specified explicitly
     (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
     for more details).

\item[\quad\tt(AUTOTFMCHAR {\em font-index})]
     --- for the characters which are mapped to this font
     without explicit attributes
     {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}
     (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
     for more details), the attributes
     \begin{itemize}
     \item[]
     {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em char-code})}
     \end{itemize}
     are added automatically.

\item[\quad\tt(AUTOTFMMAPCHAR {\em font-index})]
     --- for the characters which are mapped to this font
     without explicit attributes
     {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}
     (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
     for more details), the attributes
     \begin{itemize}
     \item[]
     {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em mapchar-code})}
     \end{itemize}
     are added automatically.

\item[\quad\tt(INCLUDECHAR ({\em ident$_1$})({\em ident$_2$}) ...)]
     --- specifies for this font the mode of automatical including
     new charascters.
     The following {\em ident} values can be used:
     \begin{description}
     \item[\quad\tt ALLCHAR] --- include automatically
          all the characters from the real fonts even it is not
          specified explicitly in {\tt CHARACTER} or {\tt MAPFONT}
          commands;
     \item[\quad\tt LIGTABLE] --- include in the virtual font
          the characters which are listed in
          the ligature tables specified for already included characters;
     \item[\quad\tt KRNDATA] --- include in the virtual font
          the characters which are listed in a kerning data
          of the ligature tables specified for already included characters;
     \item[\quad\tt LIGDATA] --- include in the virtual font
          the characters which are listed in a ligature data
          of the ligature tables specified for already included characters;
     \item[\quad\tt NOLIGTABLE] --- do not include in the virtual font
          automatically the characters from the ligature table;
     \item[\quad\tt NEXTCHAR] --- include automatically
          new characters which are are connected
          by the attribute {\tt NEXTLARGER} with the
          already included characters;
     \item[\quad\tt NONEXTCHAR] --- do not include
          new characters from the real fonts which are connected
          by the attribute {\tt NEXTLARGER} with the
          already included characters.
     \end{description}

\item[\quad\tt(NEWDISCARD)] --- the underfined characters of this font
     are marked automatically by the attribute {\tt DISCRAD}
     in the global mapping table (see commands {\tt CHARACTER}
     (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR}
     (section~\ref{Sect-VFC-DISCARD})).

\item[\quad\tt(NONEWDISCARD)] --- the underfined characters of this font
     are {\em not} marked automatically by the attribute {\tt DISCRAD}
     in the global mapping table (see commands {\tt CHARACTER}
     (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR}
     (section~\ref{Sect-VFC-DISCARD})).

\end{description}
Examples:
\begin{itemize}
\item[]{\tt (MAPFONT D 0 (NAME CMR10) (7TO7) (NOLIGTABLE) ... )}\\
       {\tt (MAPFONT D 1 (NAME LHR10) (JWRCYR) (INCLUDELIG) ... )}\\
       {\tt ......}
\end{itemize}


\subsection{{\tt CHARACTER} or {\tt CHAR}\label{Sect-VFC-CHAR}}

The command {\tt CHARACTER} specifies the mapping table between
the characters of the real fonts and the characters of the
virtual fonts. It can also specify
\begin{itemize}
\item
the sequence of {\sl DVI}-commands substituted
instead of the character from the virtual font;
\item
the ``phantom'' output for some characters of the virtual font;
\item
the dimensional parameters (width, height, depth, italic correction)
of the character if they are not copied from the real font metric data
and are not calculated automatically for the sequences of {\sl DVI}-commands;
\item
the correction of the {\sl DVI}-pen position if the width of
the character from the real font is not equal to the
width specified in {\tt .tfm} file of the virtual font;
\item
special attributes which are treated by \VFC{} then
the default mapping tables
(see command {\tt MAPFONT} from the section~\ref{Sect-VFC-MAPFONT})
and the automatical including of new characters
joined with already included characters
(see the commands {\tt MAPFONT/INCLUDECHAR} (section~\ref{Sect-VFC-MAPFONT})
and {\tt OPTION/INCLUDECHAR} (section~\ref{Sect-VFC-OPTION})
are used.
\end{itemize}

The command {\tt CHARACTER} has the following format:
\begin{itemize}
\item[]{\tt (CHARACTER {\em char-code} ({\em parm$_1$}) ({\em parm$_2$})
       ({\em parm$_3$}) ...)}
\end{itemize}
The 8-bit integer value {\em char-code}
(see section~\ref{Sect-VFC-NUM}) defines
the character of the virtual font which properties
are defined by the sub-list {\em parameters}.
The {\em parameters} can be distributed among
several {\tt CHARACTER} commands with the same
8-bit code --- in this case they are joined together
in one list.

The following {\em parameters} can be used:
\begin{description}

\item[\quad{\tt (FONT {\em index})} or {\tt (SELECTFONT {\em index})}]
   --- specifies the real font into which this character is mapped.
   The real font is identified by the integer value
   {\em index}, and the relation between the {\em index} and
   the name of the real font is defined by the command {\tt MAPFONT}
   (see section~\ref{Sect-VFC-MAPFONT}).
   The default value for {\tt FONT} is set by the command {\tt SETMAPFONT}
   (see section~\ref{Sect-VFC-SETTFMFONT}).

\item[\quad{\tt (CHAR {\em char-code})} or {\tt (SETCHAR {\em char-code})}]
  --- specifies the character of the real font into which this character
  is mapped   (the real font is defined by the command {\tt FONT}
  described above). If the metric data for this character
  are not specified explicitly in {\tt .tbf} file
  (see the commands below), it is copied from the {\tt .pl}
  file corresponding to the real font --- or from the
  character from the real font which is specified by the
  commands {\tt TFMFONT} and {\tt TFMCHAR} if these
  attributes are defined.

\item[\quad{\tt (CHARWD {\em real-value})}] ---
   specifies the {\em width} of the virtual character.

\item[\quad{\tt (CHARHT {\em real-value})}] ---
   specifies the {\em height} of the virtual character.

\item[\quad{\tt (CHARDP {\em real-value})}] ---
   specifies the {\em depth} of the virtual character.

\item[\quad{\tt (CHARIC {\em real-value})}] ---
   specifies the {\em italic correction} of the virtual character.

\item[\quad{\tt (TFMFONT {\em index})} and {\tt (TFMCHAR {\em char-code})}]
   --- these two commands specify the real font and the
   character from which the metric information is copied.
   Their syntaxis is similar to the commands {\tt FONT}/{\tt CHAR}
   described above. The default value for {\tt TFMFONT} is
   set by the command {\tt SETTFMFONT}
   (see section~\ref{Sect-VFC-SETTFMFONT}).

   The attributes {\tt TFMFONT}/{\tt TFMCHAR} are useful
   if it is necessary to make the virtual fonts which are used
   for visualization of the {\tt .dvi} file with PostScript fonts
   which are substituted by some {\tt .pk} fonts with a different
   metric properties (see section~\ref{Sect-PostScript} for more details).
   The commands {\tt MAPFONT} (section~\ref{Sect-VFC-MAPFONT})
   and {\tt OPTION} (section~\ref{Sect-VFC-OPTION}) can specify
   these atributes by default for the character if there are no
   explicit commands {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}.

\item[\quad{\tt (NOTFMDATA)}]
   --- specifies that the attributes {\tt TFMFONT} and
   {\tt TFMCHAR} cannot be added automatically to this character
   (see corresponding arguments of the commands
   {\tt MAPFONT} (section~\ref{Sect-VFC-MAPFONT})
   and {\tt OPTION} (section~\ref{Sect-VFC-OPTION})).

\item[\quad{\tt (AUTOTFMWIDTH)} and {\tt (NOUTOTFMWIDTH)}] ---
  these commands switch on/off the automatic correction
  of the width of the virtual character if the metric information
  from {\tt .vpl} and {\tt .tfm} files for the virtual font
  is different from that specified for the real font characters
  (see the commands {\tt TFMFONT}/{\tt TFMCHAR} described above
  and the section~\ref{Sect-PostScript} for more information).

  The default value of this attribute can be specified using
  the commands {\tt MAPFONT} (section~\ref{Sect-VFC-MAPFONT})
  and {\tt OPTION} (section~\ref{Sect-VFC-OPTION}).
  If no {\tt (AUTOTFMWIDTH)} and {\tt (NOAUTOTFMWIDTH)}
  attributes are specified using these commands,
  the attribute {\tt (AUTOTFMWIDTH)} is assumed.

\item[\quad{\tt (PKWIDTH {\em width})}] ---
  specifies the width of the character
  ({\em width} is the positive real value)
  which is used to correct the {\sl DVI}-pen position
  when the attribute {\tt AUTOTFMWIDTH} is active
  and the commands {\tt TFMFONT}/{\tt TFMCHAR} are specified.
  The value specified by {\tt PKWIDTH} substitutes the data taken from
  the character referenced by the commands
  {\tt FONT}/{\tt CHAR} or the data calculated by \VFC{}
  for the sequence of {\sl DVI}-commands
  (see the command {\tt SETDVI} described below).

\item[\quad{\tt (DVI {\em list-of-arguments})} or
    {\tt (SETDVI {\em list-of-arguments})}]
    --- specifies the sequence of {\sl DVI}-commands substituted
     instead of the character of the virtual font.
     The arguments of this command are described in
     section~\ref{Sect-VFC-CHAR1}.

     The metric data for this virtual character can be
     specified explicitly by the commands {\tt CHARWD},
     {\tt CHARHT}, {\tt CHARDP}, {\tt CHARIC} described above.
     if these data are absent,
     \begin{itemize}
     \item
     if the commands {\tt FONT} and {\tt CHAR}
     or if the commands {\tt TFMFONT} and {\tt TFMCHAR} are defined,
     the metric data for the virtual character
     is copied from corresponding character of the
     corresponding {\tt .pl} file.
     \item
     if commands {\tt FONT}/{\tt CHAR} and {\tt TFMFONT}/{\tt TFMCHAR}
     are absent, the values {\tt CHARWD},
     {\tt CHARHT} and {\tt CHARDP} are calculated
     automatically according to the sequence of {\sl DVI}-commands,
     and {\tt CHARIC} is set to zero.
     \end{itemize}
     If the commands {\tt TFMFONT}/{\tt TFMCHAR} are specified
     and if {\tt AUTOTFMWIDTH} mode is active
     (by default or explicitly specified), the correction of
     the width of the virtual character is is performed using
     \begin{itemize}
     \item the value of the parameter {\tt PKWIDTH}
     if it is specified explicitly;
     \item the width of the character specified by the
     commands {\tt FONT}/{\tt CHAR} if these commands are
     defined for the virtual character;
     \item the width of the the sequence of {\sl DVI}-commands
     which is calculated automatically by \VFC.
     \end{itemize}

\item[\quad{\tt (VARCHAR {\em list-of-arguments})}]
    --- specifies the extensible character
    (usually the mathematical delimiter).
     The arguments of this command are described in
     section~\ref{Sect-VFC-CHAR2}.
     The command {\tt VARCHAR} cannot be used together with the
     command {\tt NEXTLARGER}.

\item[\quad{\tt (NEXTLARGER {\em char-code})}] ---
     specifies the character (usually the mathematical delimiter)
     which is ``larger'' than the current character.
     The references {\tt NEXTLARGER} cannot form the infinite cycles.
     The command {\tt NEXTLARGER} cannot be used together with the
     command {\tt VARCHAR}.

\item[\quad{\tt (DISCARD)}] ---
    specify the attribute {\tt DISCARD} for the virtual font character
    which means that this character cannot be used by default
    mapping tables (see command {\tt MAPFONT})
    and by automatic including of new virtual font characters
    (see commands {\tt MAPFONT/INCLUDECHAR}
    (section~\ref{Sect-VFC-MAPFONT})
    and {\tt OPTION/INCLUDECHAR}
        (section~\ref{Sect-VFC-OPTION}).

\item[\quad{\tt (UNKNOWN)}] ---
    default attribute which means that the character is not used
    by the virtual font, but it can be added automatically
    when the default mapping table is used (see command {\tt MAPFONT}
    described at the section~\ref{Sect-VFC-OPTION})
    or during the automatic including of new characters to the
    virtual font.

\item[\quad{\tt (PHANTOM)}] --- specifies that the virtual
    character is displayed as a blank space.
    It means that instead of the output of the real font character
    or of the sequence of {\sl DVI}-commands, the shift of
    the {\sl DVI}-pen position at a distance equal to
    the width of the virtual character is performed.
    Corresponding {\sl DVI}-commands are generated and inserted
    in {\tt .vpl} file automatically by \VFC.
    The attribute {\tt PHANTOM} can be specified by
    defaul using the commands {\tt MAPFONT}
    (see section~\ref{Sect-VFC-MAPFONT})
    and {\tt OPTION} (see section~\ref{Sect-VFC-OPTION}).

\item[\quad{\tt (NOPHANTOM)}] --- swithches off the
    attribute {\tt PHANTOM} specified by default
    with the help of the commands {\tt MAPFONT/PHANTOM} and
    {\tt OPTION/PHANTOM}.

\end{description}
Similar to dimensional data specified
for the {\tt .tbf} commands {\tt LIGTABLE}, {\tt HEADER}, etc.,
the dimensional parameters of the commands
{\tt CHARWD}, {\tt CHARHT}, {\tt CHARDP}, {\tt CHARIC},
{\tt PKWIDTH} and of the sub-commands of the command {\tt SETDVI}
are specified using the values {\tt TBFUNITS} and {\tt TBFSIZE}
from the {\tt .tbf} file (see section~\ref{Sect-VFC-LUNIT}).

\subsubsection{{\tt CHARACTER/SETDVI}\label{Sect-VFC-CHAR1}}

The parameter {\tt DVI} of the command {\tt CHARACTER} specifies
the the sequence of {\sl DVI}-commands substituted
instead of the character from the virtual font.
It has the format
\begin{itemize}
\item[]{\tt (SETDVI}\\
\phantom{WWW}{\tt({\em command$_1$})}\\
\phantom{WWW}{\tt({\em command$_2$})}\\
\phantom{WWW}{\tt ......}\\
       {\tt )}
\end{itemize}
where the following {\em commands} can be used:
\begin{description}
\item[\quad{\tt (FONT {\em index})} or {\tt (SELECTFONT {\em index})}]
    --- makes this font active for the subsequent
    {\tt CHAR} commands. The font is identified by the
    integer value {\em index}, and the name of the
    font with this index is defined using the command
    {\tt MAPFONT} (see section~\ref{Sect-VFC-MAPFONT}).
    if there are commands {\tt CHAR} in the sequence
    of {\sl DVI}-commands, the command {\tt FONT}
    is to be used before the first {\tt CHAR}.
\item[\quad{\tt (CHAR {\em char-code})} or {\tt (SETCHAR {\em char-code})}]
  --- output the character {\em char-co\-de} from the real
  font specified by the last command {\tt FONT} starting
  from the current {\sl DVI}-pen position and to move
  the {\sl DVI}-pen position to the right at the distance equal
  to the width of the character.
\item[\quad{\tt (RULE {\em height} {\em width})}
      or {\tt (SETRULE {\em height} {\em width})}]
  --- output the {\em rule} (i.e., a black rectangle)
  with the specified height and width ({\em height} and {\em width}
  are positive real values) starting
  from the current {\sl DVI}-pen position and to move
  the {\sl DVI}-pen position to the right at the distance equal
  to the rule width.
\item[\quad{\tt (RIGHT {\em dist})} or {\tt (MOVERIGHT {\em dist})}]
  --- move current {\sl DVI}-pen position to the {\em right} at the
  specified distance {\em dist} which is to be a real
  (positive or negative) value.
\item[\quad{\tt (LEFT {\em dist})} or {\tt (MOVELEFT {\em dist})}]
  --- move current {\sl DVI}-pen position to the {\em left} at the
  specified distance {\em dist} which is to be a real
  (positive or negative) value.
\item[\quad{\tt (UP {\em dist})} or {\tt (MOVEUP {\em dist})}]
  --- move current {\sl DVI}-pen position {\em up} at the
  specified distance {\em dist} which is to be a real
  (positive or negative) value.
\item[\quad{\tt (DOWN {\em dist})} or {\tt (MOVEDOWN {\em dist})}]
  --- move current {\sl DVI}-pen position {\em down} at the
  specified distance {\em dist} which is to be a real
  (positive or negative) value.
\item[\quad{\tt (PUSH)}] --- remember the current
  {\sl DVI}-pen position (to be restored by the subsequent
  command {\tt (POP)}.
\item[\quad{\tt (POP)}] --- restore the
  {\sl DVI}-pen position saved earlier by the
  command {\tt (PUSH)}. The commands {\tt (PUSH)} and
  {\tt (POP)} should be properly nested and balanced like
  the parentheses.
\item[\quad{\tt (SPECIAL {\em text-string})}]
  --- the {\em text-string} is interpreted similar to
  the command {\tt\bs{}special\{...\}} from {\tt .dvi} file.
\item[\quad{\tt (HEX {\em hex-text-string})}
     or {\tt (SPECIALHEX {\em hex-text-string})}]
  --- the sequence of bytes identified by hexadecimal codes
  is treated as the argument of the command
  {\tt\bs{}special\{...\}} from {\tt .dvi} file.
  The {\em hex-text-string} cannot contain spaces,
  it should contain only hexadecimal digits
  `{\tt 0}'--`{\tt 9}' and `{\tt A}'--`{\tt F}' or `{\tt a}'--`{\tt f}'
  and it should contain the even number of such digits.
\end{description}
Similar to dimensional data specified
for the commands {\tt CHARACTER}, {\tt LIGTABLE}, {\tt HEADER},
the dimensional parameters of the commands
{\tt RULE}, {\tt RIGHT}, {\tt LEFT}, {\tt UP}, {\tt DOWN}
are specified using the values {\tt TBFUNITS} and {\tt TBFSIZE}
from the {\tt .tbf} file (see section~\ref{Sect-VFC-LUNIT}).


\subsubsection{{\tt CHARACTER/VARCHAR}\label{Sect-VFC-CHAR2}}

The parameter {\tt VARCHAR} of the command {\tt CHARACTER} specifies
the extensible character (usually the mathematical delimiter).
Its parameters define the character codes which are used as the
top of the delimiter, middle of the delimiter, bottom of the delimiter
and the replicated part of the delimiter. The zero value of
corresponding character codes (except replicated part)
means that this part of the extensible character is absent.


The command has the format
\begin{itemize}
\item[]{\tt (VARCHAR ({\em parm$_1$}) ({\em parm$_2$}) ...)}
\end{itemize}
where the following parameters can be used:
\begin{description}
\item[\quad{\tt (TOP {\em char-code})}] --- specifies
     the character which is used as the top element of the
     extensible character;
\item[\quad{\tt (MID {\em char-code})}] --- specifies
     the character which is used as the middle element of the
     extensible character;
\item[\quad{\tt (BOT {\em char-code})}] --- specifies
     the character which is used as the bottom element of the
     extensible character;
\item[\quad{\tt (REP {\em char-code})}] --- specifies
     the character which is used as the replicated part of the
     extensible character.
\end{description}

\subsection{{\tt LIGTABLE}\label{Sect-VFC-LIGTABLE}}

The command {\tt LIGTABLE} specifies the additional
ligature and kerning data for the virtual font characters
--- mainly the ligature and kerning data
for the pairs of characters selected from different
real fonts. Notot too much {\tt LIGTABLE}
commands are necessary in the {\tt .tbf} file since the ligature data
for the pairs of characters selected from the same
real font are usually copied from corresponding {\tt .pl} files.

The command {\tt LIGTABLE} has the format:
\begin{itemize}
\item[] {\tt (LIGTABLE}\\
        \phantom{WWW}{\tt ({\em ligature-command$_1$})}\\
        \phantom{WWW}{\tt ({\em ligature-command$_2$})}\\
        \phantom{WWW}{\tt ......}\\
        {\tt )}
\end{itemize}
It several {\tt LIGTABLE} commands are specified, they are
joined together after reading the {\tt .tbf} file.

The {\em ligature-commands} are similar to that specified at
{\tt .pl} files except the fact that the {\em dimensional}
parameter of the command {\tt KRN} is specified using the
values {\tt TBFUNITS} and {\tt TBFSIZE}
(see section~\ref{Sect-VFC-LUNIT}).
The following commands are valid here:
\begin{description}
\item[\quad{\tt (LABEL {\em char-code})}]
   --- start the list of ligature commands for
   the character {\em char-code} of the virtual font;
\item[\quad{\tt (LABEL BOUNDARYCHAR)} or {\tt (LABEL BCHAR)}]
   --- start the list of ligature commands for
   the special character ``{\em end-of-word}'';
\item[\quad{\tt (SKIP {\em integer})}]
   --- jump over specified {\tt LIGTABLE} commands
   {\tt LIG} and {\tt KRN};
\item[\quad{\tt (STOP)}]
   --- stop the {\em LIGTABLE} commands started
   by the command {\em (LABEL {\em char-code})};
\item[\quad{\tt (KRN {\em char-code$'$} {\em shift})}]
  --- the kerning data {\em shift} (real value)
  specified for the pair of characters
  {\em char-code} and {\em char-code$'$}
  (the value {\em char-code} is specified at the command {\tt LABEL}
  which starts the sequence of ligature and kerning commands
  for this character);
\item[\quad{\tt (LIG {\em char-code$'$} {\em char-code$''$})}]
  --- the ligature data for the pair of characters
  {\em char-code} and {\em char-code$'$}
  (the value {\em char-code} is specified at the command {\tt LABEL}
  which starts the sequence of ligature and kerning commands
  for this character) --- these two characters are
  substituted by the character {\em char-code$''$}.
  The identifiers
  \begin{itemize}
  \item[]
  \begin{flushleft}
  {\tt /LIG},  {\tt /LIG>}, {\tt LIG/}, {\tt LIG/>},
  {\tt /LIG/}, {\tt /LIG/>},  {\tt /LIG/>>}
  \end{flushleft}
  \end{itemize}
  can be used instead of {\tt LIG} which defines
  various ways of the substitution of the character
  {\em char-code$''$}
  instead of the pair of characters
  {\em char-code} and {\em char-code$'$}
  (see \cite{VF} for more details).
\end{description}
Example:
\begin{itemize}
\item[] {\tt (LIGTABLE}\\
        \phantom{}{\tt (LABEL C <)}\\
        \phantom{WWW}{\tt (LIG C < V CYR\_open\_quote)}\\
        \phantom{WWW}{\tt (STOP)}\\
        \phantom{}{\tt (LABEL C >)}\\
        \phantom{WWW}{\tt (LIG C > V CYR\_close\_quote)}\\
        \phantom{WWW}{\tt (STOP)}\\
        \phantom{}{\tt (LABEL V CYR\_GHE)}\\
        \phantom{WWW}{\tt (KRN C . V kk\#)}\\
        \phantom{WWW}{\tt (KRN C , V kk\#)}\\
        \phantom{WWW}{\tt (KRN C : V kk\#)}\\
        \phantom{WWW}{\tt (KRN C ; V kk\#)}\\
        \phantom{WWW}{\tt (STOP)}\\
        {\tt )}
\end{itemize}

\subsection{{\tt OUTPUT}\label{Sect-VFC-OUTPUT}}

The command {\tt OUTPUT} defines the name of the output
{\tt .vpl} file and, may be, the way how the character codes
for the {\tt .vpl} commands are to be printed.
It has the form
\begin{itemize}
\item[] {\tt (OUTPUT {\em filename}
            ({\em option$_1$}) ({\em option$_2$}) ... )}
\end{itemize}
where {\em filename} is the name of the output
{\em virtual font}, and the optional {\em options}
can be the following:
\begin{description}
\item[\quad{\tt(ALLCHAR)}] --- print all printable characters
           in a form {\tt C {\em letter}};
\item[\quad{\tt(ALPHA)}] --- print in a form {\tt C {\em letter}}
           only the letters of the latin alphabet;
\item[\quad{\tt(ALPHANUM)}] --- print in a form {\tt C {\em letter}}
           the digits and the letters of the latin alphabet;
\item[\quad{\tt(ALLCODE)}] --- print all characters
           as the character codes;
\item[\quad{\tt(DEC)} or {\tt(DECIMAL)}] --- print character codes
           as decimal integers;
\item[\quad{\tt(OCT)} or {\tt(OCTAL)}] --- print character codes
           as octal integers;
\item[\quad{\tt(HEX)} or {\tt(HEXADECIMAL)}] --- print character codes
           as hexadecimal integers.
\end{description}
Example (default value):
\begin{itemize}
\item[] {\tt (OUTPUT noname.tbf (ALPHANUM) (OCTAL))}
\end{itemize}

\subsection{{\tt HEADER}\label{Sect-VFC-HEADER}}

The virtual font has the header with the header parameters:
\begin{itemize}
\item {\tt DESIGNSIZE}
\item {\tt DESIGNUNITS}
\item {\tt CODINGSCHEME}
\item {\tt FAMILY}
\item {\tt FACE}
\item {\tt FONTDIMEN} and its sub-parameters
        ({\tt SLANT}, {\tt SPACE}, {\tt QUAD}, ¨ â.¤.)
\end{itemize}
The header parameters can be get from:
\begin{itemize}
\item
the header of one of the real fonts used in virtual font;
\item
the header of some separate {\tt .pl} file;
\item
\VFC{} the explicit commands from the {\tt .tbf} file.
\end{itemize}

The following parameters of the command {\tt HEADER}
are valid:
\begin{description}
\item[\quad{\tt(FONT {\em integer})}]
   --- defines index of the font which is used as a source
   for the header parameters. The real name of the font is
   taken from the {\tt MAPFONT} command with the corresponding
   index value. Default value for this parameter is {\tt (FONT D 0)}
   which means that if nor {\tt FONT} nor {\tt FILE} dat are specified
   by the User, the font {\tt MAPFONT D 0} is used as a source
   for the header parameters.
   If {\tt FONT} argument is $<$0 or if the parameter {\tt FILE}
   is specified, the {\tt MAPFONT} fonts are not used as a source
   for the header.
\item[\quad{\tt(FILE {\em filename})}]
   --- defines the name of the {\tt .pl} file
   which is used as a source for the header
   parameters. Only one of the parameters --- {\tt FONT} or {\tt FILE} ---
   can be specified among the parameters of the command {\tt HEADER}.
   If both parameters are specified, the last one is used and
   the warning message is generated.
\item[\quad{\tt(CHECKSUM {\em 32-bit integer})}]
   --- specifies the {\tt CHECKSUM} of the {\tt .tfm} file
   which will be generated after the processing of
   {\tt .vpl} file by the utility {\sl VPtpVF}.
   Usually this parameter is not necessary --- if it is not
   specified, the correct {\tt CHECKSUM} value is substituted
   by {\sl VPtoVF} automatically, and it is a rare chance
   that the User can guess the proper value (see comments below).
\item[\quad{\tt(DESIGNSIZE {\em real-value})}]
   --- specifies the value of the {\tt DESIGNSIZE} which
   is used as a unit of measure for nearly all
   dimensional {\tt .vpl} data (see comments below).
\item[\quad{\tt(DESIGNUNITS {\em real-value})}]
   --- specifies the value of the {\tt DESIGNUNITS} which
   is used as a unit of measure for nearly all
   dimensional {\tt .vpl} data (see comments below).
\item[\quad{\tt(CODINGSCHEME {\em text-string})}]
   --- specifies the text which identifies uniquely
   the arrangement of the characters in the coding table
   of this font.
   For example, for Computer Modern Roman except {\tt cmr5}
   it is equal to
   \begin{itemize}
   \item[] {\tt (CODINGSCHEME TeX text)}
   \end{itemize}
   while for {\tt cmr5} it is equal to
   \begin{itemize}
   \item[] {\tt (CODINGSCHEME TeX text without f-ligatures)}
   \end{itemize}
   (the {\em f-ligatures} are absent in this font since
   the characters are too small).
   This parameter cannot contain
   internal braces `{\tt (}' and `{\tt )}'
   and but can be the string expression
   (see section~\ref{Sect-VFC-STRING} for more details).
\item[\quad{\tt(FAMILY {\em text-string})}]
   --- specifies the {\tt FAMILY} identifying
   string. This parameter cannot contain
   internal braces `{\tt (}' and `{\tt )}'
   but can be the string expression
   (see section~\ref{Sect-VFC-STRING} for more details).
\item[\quad{\tt(FACE {\em 8-bit-integer})}]
  --- specifies the Xerox face code for the virtual font.
\item[\quad{\tt(SEVENBITSAFEFLAG)}]
  --- this command is of no use and its is skipped after printing the
  warning message. The attribute
  {\tt SEVENBITSAFEFLAG} was used in earlier versions of \TeX{}
  to specify that the font contains only the characters in a range 0--127,
  and now this flag is obsolete. Although the corresponding field is
  conserved in {\tt .tfm} file, the utility {\sl VPtoVF} inserts the
  proper value automatically (after the check that the virtual font
  contains no characters outside the range 0--127) irregardless of
  the command {\tt SEVENBITSAFEFLAG} encountered in {\tt .vpl} file.
\item[\quad{\tt(FONTDIMEN {\em parm-list})}]
   --- defines the following header parameters:
  \begin{itemize}
  \item[]
         {\tt(SLANT {\em real-value})}\\
         {\tt(SPACE {\em real-value})}\\
         {\tt(STRETCH {\em real-value})}\\
         {\tt(SHRINK {\em real-value})}\\
         {\tt(XHEIGHT {\em real-value})}\\
         {\tt(QUAD {\em real-value})}\\
         {\tt(EXTRASPACE {\em real-value})}\\
         {\tt(NUM1 {\em real-value})}
              or {\tt(DEFAULTRULETHICKNESS {\em real-value})}\\
         {\tt(NUM2 {\em real-value})}
              or {\tt(BIGOPSPACING1 {\em real-value})}\\
         {\tt(NUM3 {\em real-value})}
              or {\tt(BIGOPSPACING2 {\em real-value})}\\
         {\tt(DENOM1 {\em real-value})}
              or {\tt(BIGOPSPACING3 {\em real-value})}\\
         {\tt(DENOM2 {\em real-value})}
              or {\tt(BIGOPSPACING4 {\em real-value})}\\
         {\tt(SUP1 {\em real-value})}
              or {\tt(BIGOPSPACING5 {\em real-value})}\\
         {\tt(SUP2 {\em real-value})}\\
         {\tt(SUP3 {\em real-value})}\\
         {\tt(SUB1 {\em real-value})}\\
         {\tt(SUB2 {\em real-value})}\\
         {\tt(SUPDROP {\em real-value})}\\
         {\tt(SUBDROP {\em real-value})}\\
         {\tt(DELIM1 {\em real-value})}\\
         {\tt(DELIM2 {\em real-value})}\\
         {\tt(AXISHEIGHT {\em real-value})}\\
         {\tt(AXISHEIGHT {\em real-value})}
  \end{itemize}
  (the parameters specified in a form
  {\tt (PARAMETER {\em index} {\em value})} are skipped
  and the warning message is printed).

  All these parameters are {\em dimensional} parameter
  except the parameter {\tt SLANT} and they are defined using
  {\tt TBFUNITS} and {\tt TBFSIZE} data
  from the {\tt .tbf} file (see section~\ref{Sect-VFC-LUNIT}).
  They are re-calculated properly so that they fit to
  the header parameters {\tt DESIGNUNITS} and {\tt DESIGNSIZE}
  when the header data of the output {\tt .vpl} file are known.
\end{description}
The parameters are specified as the sub-lists of the list
defined by the identifier {\tt HEADER}.
Example:
\begin{itemize}
\item[] {\tt (HEADER}\\
        \phantom{WWW}{\tt (FONT D 1)}\\
        \phantom{WWW}{\tt (FAMILY LHTT)}\\
        \phantom{WWW}{\tt (CODINGSCHEME LH Cyrillic TeX text)}\\
        \phantom{WWW}{\tt ......}\\
        {\tt )}
\end{itemize}

\bigskip

\VFC{} generates the header parameters in a following way.
The commands from the {\tt .tbf} file are read,
and the dimensional parameters from the command {\tt HEADER}
are treated using the units defined by
{\tt TBFSIZE} and {\tt TBFUNITS}
(see section~\ref{Sect-VFC-LUNIT}) --- as well as the other dimensional
parameters like that from the commands {\tt LIGTABLE}
and {\tt CHARACTER}.
After it the {\tt .pl} file specified by the {\tt HEADER}
commands {\tt FONT} or {\tt FILE} is read, and the parameters
which were not defined explicitly at the command {\tt HEADER}
are added from it.
Finally, all the dimensional parameters
which vere read from the {\tt .tbf} file
(namely, specified at the commands {\tt LIGTABLE},
{\tt CHARACTER}, {\tt HEADER/FONTDIMEN})
are converted to
{\tt DESIGNSIZE} and {\tt DESIGNUNITS} values from the
resulting header of the {\tt .vpl} file.

The {\tt .pl} file header parameters
\begin{itemize}
\item[] {\tt DESIGNSIZE}\\
        {\tt DESIGNUNITS}\\
        {\tt CODINGSCHEME}\\
        {\tt FAMILY}\\
        {\tt FACE}\\
        {\tt FONTDIMEN} sub-parameters except {\tt PARAMETER}
\end{itemize}
are processed by \VFC.
The {\tt .pl} file header parameters
\begin{itemize}
\item[] {\tt SEVENBITSAFEFLAG}\\
        {\tt HEADER}\\
        sub-parameter {\tt PARAMETER} of the parameter {\tt FONTDIMEN}
\end{itemize}
are ignored after printing the warning messages.
All other {\em legal} {\tt .pl} commands are
skipped without processing when \VFC{} reads the header parameters.

\bigskip

The header parameters which are read from {\tt .pl} file
are added to {\tt .vpl} header data if
corresponding parameters are not specified explicitly
in {\tt .tbf} file.
Usually {\em all} header parameters
(including {\tt DESIGNUNITS} and {\tt DESIGNSIZE})
are copied from some {\tt .pl} file, and only the parameters
{\tt FAMILY}, {\tt FACE}, {\tt CODINGSCHEME} are substituted
by their explicit specifications from {\tt .tbf} file.

The exception is the header parameter {\tt CHECKSUM} which is ignored
when it is read from {\tt .pl} file and which value can be
set by the User only if it is specified explicitly in {\tt .tbf} file.
Usually this parameter is not necessary --- if it is not
specified by the User, it is not inserted into the output
{\tt .vpl} file, and as a result the correct {\tt CHECKSUM} value
is calculated by {\sl VPtoVF} automatically.
It is a rare chance that the User can guess the proper value,
and if the {\tt CHECKSUM} from the {\tt .vf} file and
the {\em checksum} calculated for the {\tt .tfm} file
of the virtual font do not coincide, the {\sl DVI}-driver
prints the warning message --- this message shows that the versions of
{\tt .vf} and {\tt .tfm} files may be different or that
the {\tt .tfm} file may be damaged.
The exception from this rule (and the only case
when the explicit parameter {\tt CHECKSUM} can be useful)
is the {\em zero} value specified for the parameter {\tt CHECKSUM}
of the virtual font. In this case the comparison
of {\tt CHECKSUM} from {\tt .vf} file with the
the {\em checksum} of the {\tt .tfm} file
of the virtual font is not performed at all
when this font is loaded by the {\sl DVI}-driver.

\subsection{Additional commands\label{Sect-VFC-Other}}

The following \VFC{} commands are considered
in this section:
\begin{itemize}
\item {\tt VTITLE} --- the title of the virtual font;
\item {\tt TBFUNITS} and {\tt TBFSIZE} --- the scale factors
      for the lengths specified in {\tt .tbf} file;
\item {\tt BOUNDARYCHAR} --- character code which is used
      in the {\tt .vpl} ligature table to specify the ``end-of-word''
      character;
\item {\tt SETTFMFONT} --- default value for the attribute {\tt TFMFONT}
      if for some commands {\tt CHARACTER} only the attribute {\tt TFMCHAR}
      is specified;
\item {\tt SETMAPFONT} --- default value for the attribute {\tt FONT}
      if for some commands {\tt CHARACTER} only the attribute {\tt CHAR}
      is specified;
\item {\tt DISCARDCHAR} --- the list of characters which are not
      included in the virtual font;
\item {\tt NOTAUTOADDCHAR} --- the list of characters which cannot be used
      for automatically characters;
\item {\tt OPTION} --- modes of \VFC;
\item {\tt SAVETABLE} --- printing of the mapping table
                into ASCII file;
\end{itemize}

\subsubsection{{\tt VTITLE}\label{Sect-VFC-TITLE}}

The command {\tt VTITLE} of the {\tt .vpl} file defines the
title of the file which is actually the comment inserted in
the binary {\tt .vf} file after processing by the utility
{\sl VPtoVF}. The command {\tt VTITLE} has the form
\begin{itemize}
\item[] {\tt (VTITLE {\em text-string})}
\end{itemize}
where the {\em text string}
is the combination of string elements and
string expressions (see section~\ref{Sect-VFC-STRING})
separated by spaces, and can include opening and closing
braces `{\tt (}' and `{\tt )}' if they are balanced
correctly. The result of the expansion of
string expressions cannot exceed 255 characters.

Example:
\begin{itemize}
\item[] {\tt (VTITLE Created by VFComb (Version 1.3))}
\end{itemize}

\subsubsection{{\tt TBFUNITS}
               and {\tt TBFSIZE}\label{Sect-VFC-LUNIT}}

All the length data in {\tt .vpl} file are defined in
units specified by the parameters {\tt DESIGNUNITS}
and {\tt DESIGNSIZE} from the {\tt HEADER} command
(see section~\ref{Sect-VFC-HEADER}). Nethertheless,
when the User prepares the {\tt .tbf} file, these
parameters are not known yet since they can be read
later from the {\tt HEADER} file. For this reason
all the length and size data in {\tt .tbf} file
are specified using internal scaling factors
specified bu the commands {\tt TBFUNITS}
and {\tt TBFSIZE} with the default values
\begin{itemize}
\item[] {\tt (TBFSIZE R 1.0) (TBFUNITS R 1.0)}
\end{itemize}
which are the analogs of the commands {\tt DESIGNUNITS}
and {\tt DESIGNSIZE} from {\tt .pl} and {\tt .vpl} files.
The length and size data specified into {\tt .tbf} file
are recalculated to the proper values
{\tt DESIGNUNITS} and {\tt DESIGNSIZE}
from the command {\tt HEADER} when the output {\tt .vpl}
file is generated.

\subsubsection{{\tt BOUNDARYCHAR}
               or {\tt BCHAR}\label{Sect-VFC-BCHAR}}

The LIGTABLE entries can contain ligature
and kerning data with a special character ``end-of-word''
which defines the beginning of the word when encountered
in the command {\tt LABEL}, and the end of the word
when encountered in the commands {\tt LIG} and {\tt KRN}.
The command {\tt BOUNDARYCHAR} defines the code assigned
to this special character (usually this is the code {\tt D 255}).
As a result:
\begin{itemize}
\item
inside {\tt .tbf} file the {\tt LIGTABLE} entries which contain this code
are recognized as the entries with ``end-of-word'' character;
\item
inside {\tt .pl} files the {\tt LIGTABLE} entries with their own
{\tt BOUNDARYCHAR} codes are mapped to the code specified
in {\tt .tbf} file.
\end{itemize}
Example:
\begin{itemize}
\item[] {\tt (BOUNDARYCHAR D 255)}\\
        {\tt (BCHAR D 255)}
\end{itemize}

\subsubsection{{\tt SETMAPFONT} and
               {\tt SETTFMFONT}\label{Sect-VFC-SETTFMFONT}}

The command {\tt SETMAPFOMT} specifies the default value
for the attribute {\tt FONT} if only the attribute
{\tt CHAR} is defined (see description of the \VFC{}
command {\tt CHARACTER} in section~\ref{Sect-VFC-CHAR}).
It has the form
\begin{itemize}
\item[] {\tt (SETMAPFONT {\em ineger})}
\end{itemize}
where {\em integer} is the index of the font listed in
{\tt MAPFONT} command which is used for {\tt FONT}
attribute.

Similarly, if the command {\tt SETTFMFOMT} specifies the default value
for the attribute {\tt TFMFONT} if only the attribute
{\tt TFMCHAR} is defined (see description of the \VFC{}
command {\tt CHARACTER} in section~\ref{Sect-VFC-CHAR}).
It has the form
\begin{itemize}
\item[] {\tt (SETTFMFONT {\em ineger})}
\end{itemize}
where {\em integer} is the index of the font listed in
{\tt MAPFONT} command which is used for {\tt TFMFONT}
attribute.

The important difference of \VFC{} {\tt CHARACTER} command is
that if the parameter {\tt FONT} is not specified although
the parameter {\tt CHAR} {\em is} specified, the value
specified by the command {\tt SETMAPFONT} is used
(see section~\ref{Sect-VFC-SETTFMFONT}). The syntaxis of
{\tt .vpl} files assumes that the parameter {\tt FONT}
specified for the previous command {\tt CHARACTER} is used
while for \VFC{} commands it is not so.

Similarly, if the parameter {\tt TFMFONT} is not specified although
the parameter {\tt TFMCHAR} {\em is} specified, the value
specified by the command {\tt SETTFMFONT} is used
(see section~\ref{Sect-VFC-SETTFMFONT}).

Example (default values):
\begin{itemize}
\item[] {\tt (SETMAPFONT D 0)}\\
        {\tt (SETTFMFONT D 0)}
\end{itemize}

\subsubsection{{\tt DISCARDCHAR}
               and {\tt NOTAUTOADDCHAR}\label{Sect-VFC-DISCARD}}

The command {\tt DISCARDCHAR} defines the characters from the
real fonts which are not included in the virtual font.
This command is useful if the mapping to some font is defined
by one of the options
{\tt FULL}, {\tt 7TO8}, {\tt 8TO7}, {\tt 8BIT}, {\tt 7BIT},
{\tt JWNCYR}, {\tt CYRTUG} (see command {\tt MAPFONT} in
section~\ref{Sect-VFC-MAPFONT}) but there are some characters
which are to be excluded from the mapping list.

The command has the form:
\begin{itemize}
\item[] {\tt (DISCARDCHAR}\\
        \phantom{WWW} {\tt (FONT {\em font$_1$}) (CHAR {\em char$_1$})}\\
        \phantom{WWW} {\tt (FONT {\em font$_2$}) (CHAR {\em char$_2$})}\\
        \phantom{WWW} {\tt ......}\\
        {\tt )}
\end{itemize}
Actually one command {\tt (FONT ...)} can be followed by several
commands {\tt (CHAR ...)} if these characters belong to the same
real font. Instead of several commands {\tt (CHAR {\em charcode})}
it is possible to use one command
{\tt (RANGE {\em charcode$_1$} {\em charcode$_2$})} --- in this case
all the characters from the range {\em charcode$_1$}--{\em charcode$_2$}
get the attribute {\tt DISCARD}.

Example:
\begin{itemize}
\item[] {\tt (DISCARDCHAR}\\
        \phantom{WWW} {\tt (FONT D 0) (CHAR D 250) (CHAR D 251) ...}\\
        \phantom{WWW} {\tt (FONT D 1) (RANGE D 128 D 255) ...}\\
        \phantom{WWW} {\tt ......}\\
        {\tt )}
\end{itemize}

The command {\tt NOAUTOADDCHAR} defines the characters from the
virtual font which cannot be used for character mapping
when \VFC{} adds automatically characters since they are connected
with other characters by the attribute {\tt NEXTLARGER}
or through {\tt LIGTABLE} data
(see sections \ref{Sect-VFC-MAPFONT} and \ref{Sect-VFC-OPTION}
for more details) --- these characters get the attribute
{\tt DISCARD} if this character is not used explicitly
in mapping table.

The command has the form:
\begin{itemize}
\item[] {\tt (NOAUTOADDCHAR (CHAR {\em char$_1$})
               (CHAR {\em char$_2$}) (CHAR {\em char$_3$}) ...)}
\end{itemize}
Similarly to {\tt DISCARDCHAR},
instead of several commands {\tt (CHAR {\em charcode})}
it is possible to use one command
{\tt (RANGE {\em charcode$_1$} {\em charcode$_2$})} --- in this case
all the characters of the virtual font
from the range {\em charcode$_1$}--{\em charcode$_2$}
get the attribute {\tt DISCARD}
if these characters are not used explicitly
in mapping table.

\subsubsection{{\tt OPTION}\label{Sect-VFC-OPTION}}

The command {\tt OPTION} defines some modes of \VFC{} operations.
It consists of identifiers where only {\tt TRACE} and {\tt INCLUDECHAR}
can have a non-empty argument:
\begin{description}
\item[\quad\tt(TRACE {\em integer})] --- specifies the level
     of tracing messages printed during the processing
     of the ligature tables ({\em integer} should be in a range 0--3);
\item[\quad\tt(TRACE)] --- just the same as
     {\tt (TRACE D 2)};
\item[\quad\tt(NOTRACE)] --- just the same as
     {\tt (TRACE D 0)};
\item[\quad\tt(SCREEN)] --- print the \VFC{} messages
     on the display screen;
\item[\quad\tt(NOSCREEN)] --- print the \VFC{} messages
     only into {\tt .log} file;
\item[\quad\tt(PHANTOM)] --- assign attribute {\tt PHANTOM}
     to all characters, for which the attributes
     {\tt PHANTOM} or {\tt NOPHANTOM}
     are not specified explicitly;
\item[\quad\tt(INCLUDECHAR ({\em ident$_1$})({\em ident$_2$}) ...)]
     --- specifies how \VFC{} should automatically add characters to the
     virtual font. The following {\em ident} values can
     be used:
     \begin{description}
     \item[\quad\tt ALLCHAR] --- include automatically
          all the characters from the real fonts even it is not
          specified explicitly in {\tt CHARACTER} or {\tt MAPFONT}
          commands;
     \item[\quad\tt LIGTABLE] --- include in the virtual font
          the characters which are listed in
          the ligature tables specified for already included characters;
     \item[\quad\tt KRNDATA] --- include in the virtual font
          the characters which are listed in a kerning data
          of the ligature tables specified for already included characters;
     \item[\quad\tt LIGDATA] --- include in the virtual font
          the characters which are listed in a ligature data
          of the ligature tables specified for already included characters;
     \item[\quad\tt NOLIGTABLE] --- do not include in the virtual font
          automatically the characters from the ligature table;
     \item[\quad\tt NEXTCHAR] --- include automatically
          new characters which are are connected
          by the attribute {\tt NEXTLARGER} with the
          already included characters;
     \item[\quad\tt NONEXTCHAR] --- do not include
          new characters from the real fonts which are connected
          by the attribute {\tt NEXTLARGER} with the
          already included characters.
     \end{description}
\item[\quad\tt(LIGTABLE)] --- include in the virtual font
     the ligature tables of the real fonts;
\item[\quad\tt(NOLIGTABLE)] --- do not include in the virtual font
     the ligature tables of the real fonts;
\item[\quad\tt(NEWDISCARD)] --- the underfined characters of the real font
     are marked automatically by the attribute {\tt DISCRAD}
     in the global mapping table (see commands {\tt CHARACTER}
     (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR}
     (section~\ref{Sect-VFC-DISCARD}));
\item[\quad\tt(NONEWDISCARD)] --- the underfined characters of the real font
     are {\em not} marked automatically by the attribute {\tt DISCRAD}
     in the global mapping table (see commands {\tt CHARACTER}
     (section~\ref{Sect-VFC-CHAR}) and {\tt DISCARDCHAR}
     (section~\ref{Sect-VFC-DISCARD}));
\item[\quad\tt(AUTOTFMWIDTH)] --- add automatically for the
     characters with the attributes {\tt SIZECHAR} and {\tt SIZEFONT}
     the attribute {\tt AUTOTFMWIDTH} if it is
     not specified explicitly (see command {\tt CHARACTER});
\item[\quad\tt(NOAUTOTFMWIDTH)] --- add automatically for the
     characters with the attributes {\tt SIZECHAR} and {\tt SIZEFONT}
     the attribute {\tt NOAUTOTFMWIDTH} if it is
     not specified explicitly (see command {\tt CHARACTER});
\item[\quad\tt(AUTOTFMCHAR {\em font-index})]
     --- for the characters without explicitly specified attributes
     {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}
     (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
     for more details) the attributes
     \begin{itemize}
     \item[]
     {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em char-code})}
     \end{itemize}
     are added automatically;
\item[\quad\tt(AUTOTFMMAPCHAR {\em font-index})]
     --- for the characters without explicitly specified attributes
     {\tt TFMFONT}, {\tt TFMCHAR} or {\tt NOTFMDATA}
     (see command {\tt CHARACTER} (section~\ref{Sect-VFC-CHAR}
     for more details) the attributes
     \begin{itemize}
     \item[]
     {\tt (TFMFONT D {\em font-index})} {\tt (TFMCHAR D {\em mapchar-code})}
     \end{itemize}
     are added automatically.
\end{description}
Example (default values):
\begin{itemize}
\item[]
      {\tt (OPTION}\\
      \phantom{WWW}{\tt (TRACE D 0)}\\
      \phantom{WWW}{\tt (SCREEN)}\\
      \phantom{WWW}{\tt (INCLUDECHAR (NOLIGTABLE))}\\
      \phantom{WWW}{\tt (INCLUDECHAR (NEXTCHAR))}\\
      \phantom{WWW}{\tt (LIGTABLE)}\\
      \phantom{WWW}{\tt (NONEWDISCARD)}\\
      \phantom{WWW}{\tt (AUTOTFMWIDTH)}\\
      {\tt )}
\end{itemize}

\subsubsection{{\tt SAVETABLE}\label{Sect-VFC-SAVE}}

The command {\tt SAVETABLE} is used when it is desirable
to have \VFC{} commands which are equivalent to the
mapping table equivalent to that used to generate {\tt .vpl} file.
It can have the following forms:
\begin{itemize}
\item[] {\tt (SAVETABLE {\em filename})}\\
        {\tt (SAVETABLE {\em filename} (SHORT))}\\
        {\tt (SAVETABLE {\em filename} (FULL))}
\end{itemize}
where the options {\tt FULL} and {\tt SAVE}
defines the format of the output.

\section{\VFC{} applications}

\subsection{Virtual fonts for \TeX{} formats with national
            alphabets\label{Sect-CyrTeX}}

Although everything which can be done by \VFC{}
could be realized also by explicit usage of {\tt .pl} and {\tt .vpl}
file syntaxis (as well as everything which can be
done manually by {\tt .pl} and {\tt .vpl} files can be done with \VFC),
some typical operations with the virtual fonts
are performed with its help {\em easier}
than by manual editing of {\tt .pl} and {\tt .vpl} files.
The typical problem of this type is the adaptation of
standard \TeX{} formats to national alphabets
--- this problem is especially important for cyrillic alphabets
since most cyrillic letters {\em cannot} be created as the combination
of the latin (english) letters with some accents.

The standard solution of this problem is to combine the english part
taken from Computer Modern family with the
national fonts which extend the Computer Modern family
and which contain in the upper part of ASCII table
(codes 128--255) the national symbols. The best way
how to do it is to create
the {\em virtual font} whose lower part refers to original
CM fonts, and upper part refers to the national fonts ---
it is just the way which was recommended by D.Knuth in \cite{VF}.
The advantage of this approach is that it is possible
to keep the changes in CM fonts and in national fonts separately,
and in addition it is possible to economize
disk space since it is not necessary to
keep {\em two} copies of each Computer Modern character --- one as the
original CM font which is necessary for original \TeX{}
formats, and the second one as the lower part in
the combined national font.

The combination of the lower part of one font and the upper
part of another font, or even the joining all the characters
from one font and all the characters from another font
(provided that {\em no} character code is encountered twice)
can be done by \VFC{} using few commands.
If some characters are to be discarded from the
font or moved to the different positions of the ASCII table,
it does not makes the command script more complicated. The output
virtual font contains proper metric information for
each character borrowed from the source metric information
and the correct mapping of the characters into individual
real fonts.

The similar operation can be performed also
by the program {\sl TFMerge} (IHEP \TeX{}ware, Protvino),
but \VFC{} enables to perform additional
operation.
That is, except joining metric and ligature/kerning
information from each font into one virtual font,
it is necessary to add {\em cross}-ligature
and {\em cross}-kerning information for the pairs
of characters taken from different fonts.
\VFC{} enables to add
metric, ligature and kerning data taken from its script file
(which makes the original script a little bit
more complicated). The important feature is that
this additional data can contain {\em variables}
and {\em logical structures},
which enables to generate the whole CM family of
the virtual typefaces with national characters
using just the same pseudo-program
written on \VFC{} command language.

Except the operations described above, \VFC{}
is capable to perform the following operations
if it is specified by the User in its script:
\begin{itemize}
\item discard the ligature tables of some real fonts;
\item include in the virtual font the full ligature
      table of the real font;
\item include in the virtual font only those characters
      which are declared explicitly in user defined data,
      and discard the elements of the ligature tables
      which correspond to non-included characters of
      the real font;
\item automatically add to the virtual fonts the characters
      which are not included explicitly by the User
      but which are joined with the already included characters
      through ligature table data, or
      by specifications inside the command {\tt CHARACTER}
      the attributes {\tt NEXTLARGER} and/or {\tt VARCHAR}.
\end{itemize}
These features enable to create the desired virtual fonts
for national alphabets with less efforts and with more realibility
than by manual manipulations with {\tt .pl} and {\tt .vpl} files.

\subsection{Virtual fonts for colored printing\label{Sect-Color}}

The other problem is the application of the
virtual fonts to multi-colored printing.
Suppose that it is necessary to print the text
where different characters have different colors.
From \TeX-compiler's  point of view it means
that the characters with different colors are
assigned to different fonts, and it is a task for
DVI driver to decide how to print these fonts
in desired colors.

The colored printing is collected from the overlapped
sheets where each sheet of text or graphics is printed
by individual monocolor pass. To make the templates for
monocolor printing it is necessary to organize the output of
the DVI file so that in one pass only yellow characters are printed,
in another pass only blue characters are printed, etc.,
while the characters which have the green color are to be printed twice ---
in blue as well as in yellow. The easiest way to teach
{\sl DVI}-driver how to do it is to create different subdirectories
with virtual fonts --- one subdirectory for each elementary
color. The virtual font files placed in the
subdirectory for yellow printing which correspond to the yellow fonts
will refer to the actual {\tt *.pk}-files if and only if the yellow color
is assigned to this character --- otherwise it will
refer to {\em emty} character. The subdirectories for other
colors are organized analogously. As soon as the yellow printing
is performed, the {\sl DVI}-driver is configured so that it takes
the virtual fonts from the ``yellow'' subdirectory, and for
the output in other colors the corresponding reconfiguration
of the {\sl DVI}-driver is performed.

If the mapping of the empty characters into the {\tt dummy}
font is performed, it results to a wrong behaviour
of the {\sl DVI}-driver: the characters in {\tt dummy}
font have zero size, and it means that the next character after
the empty character is shifted to the left
(as compared with the desired behaviour)
on the distance equal to the width of the skipped character.
To prefent this effect it is necessary to insert in the virtual font
the explicit {\sl DVI}-commands which
move the current output position to the right
by the distance which is the width of the
skipped character. This operation is performed
by \VFC{} by a single command: the User can
\begin{itemize}
\item
assign the attribute {\tt PHANTOM} to each {\em phantom} character;
\item
assign the attribute {\t PHANTOM} to the font
which is used to mark colored letters;
\item
specify the global option {\tt PHANTOM};
\end{itemize}
and as a result for the necessary characters
the {\em empty mapping} will be performed instead of mapping into
the real font characters.

\subsection{Substitution of {\tt .pk} fonts
            instead of {\sl Postscript} fonts\label{Sect-PostScript}}

The next problem where the usage of the virtual fonts
is advantageous is the visualization of the document
which was compiled using PostScript fonts.
Generally the scren viewer {\em cannot}
process the Postscript characters, and it is necessary
to remap the PostScript font characters into some {\tt pk}-font
which {\em can} be displayed by the viewer --- say, some typefaces
from the Computer Modern family.

Such remapping can be performed
using virtual font mechanism, but if it is done without
special precautions the screen view can be far from the
printed output. The reason is that CM characters have
the width different from the PostScript font (the fact that they have
different graphical image is not so essential).
Like the previous case the screen output will be shifted
to the left on the distance which is the difference
between the width of the PostScript character and the
CM character if no special precautions are taken.
To make the correct output, it is necessary to add
to the virtual font the explicit {\sl DVI}-commands
which correct the current output position.

To make corresponding virtual font automatically,
\VFC{} enables to specify for the real fonts
{\em two} PL-files with the metric information: the first one
for the nominal characters which is used by \TeX{}
to compile the {\sl DVI}-file (in our case it is the PostScript
{\tt afm}-file converted to {\tt tfm} format), and the second one
for the real characters which are used when the {\sl DVI}-file
is displayed (or printed). If such information is
specified by the User, the commands which correct
properly the current output position are inserted in the
virtual font.

This operation works if both fonts have the same coding
scheme --- namely, the characters used by \TeX{}
and the characters used by {\sl DVI}-viewer
have the same code value.
If it is not so, the operation of re-mapping inside
already mapped font ir required which could be very complicated
and result to a very complicated scheme of virtual vont generation.
To solve this difficulty it is assumed that the correct
metric information for the ``true'' font (i.e., for the font
used in compilation of the {\sl DVI}-file) is already available.
The special operators in \VFC{} enable to load
this information and to correct the proper character width.

\section*{Acknowledgements}%
\addcontentsline{toc}{section}{Acknowledgements}

\subsection*{Acknowledgement I}%
\addcontentsline{toc}{subsection}{Acknowledgement I}

All new improvements of \VFC{} (except English manual)
are the results of the contacts and discussions which were held during
the {\sl Euro\TeX-95} meeting. So I would like to thank Dr.\ Kees
van der Laan for his giant efforts to organise the
visit to the {\sl Euro\TeX-95} the delegation from Russia
and for his patient attention to russian colleagues before,
during and after the {\sl Euro\TeX-95}.

It is not so easy to recall {\em all} participants of this
conference whose opinion makes an impact in preparing the
new version of \VFC{}.
Among other persons I would like to thank Dr.\ Ph.Taylor and
Dr.\ S.Znamensky for their valuable suggestions which enable to improve
the program.
I would like also to thank O.A.Lapko, S.A.Strelkov and I.A.Mahovaya
for their efforts spent on the Cyrillic \TeX{} project
which actually inspired our work.

\subsection*{Acknowledgement II}%
\addcontentsline{toc}{subsection}{Acknowledgement II}

I would like to express
my warmest thanks to Dr. A.Compagner (Delft University of
Technology), who {\em did not} contributed something to this work
but spent a lot of his time and efforts explaining the Phylosophy
of Randomness and his approach to RNG.

\subsection*{Acknowledgement III}%
\addcontentsline{toc}{subsection}{Acknowledgement III}


??????

\subsection*{Acknowledgement IV}%
\addcontentsline{toc}{subsection}{Acknowledgement IV}

This research was partially supported by a grant
from the Dutch Organization for Scientific Research
(NWO grant No 07-30-007).



\def\refname{}
\def\bibname{}
\section*{References}%
\addcontentsline{toc}{section}{References}

\begin{thebibliography}{00}
\bibitem{VF} D.Knuth, {\em  Virtual Fonts: More Fun for Grand Wizards},
  TUGBoat {\bf 11} (1990), No. 1, pp.13--23.
\bibitem{LL} A.Khodulev, I.Mahovaya.
{\em On \TeX{} experience in MIR Publishers}.
  Proceedings of the 7th Euro\TeX{} Conference, Prague, 1992.
\bibitem{LH} O.Lapko.
  {\em  MAKEFONT as a part of CurTUG--Em\TeX{} package}.
  Proceedings of the 8th Euro\TeX{} Conference, Gda\'nsk, 1994.
\bibitem{VFC} A.S.Berdnikov, S.B.Turtia. {\em
{\sl VFComb} --- a program for design of virtual fonts}.
  Proceedings of the 9th Euro\TeX{} Conference, Arnhem, 1995.
\end{thebibliography}


\end{document}