Add a TeX driver
[pspp] / src / output / tex-glyphs.c
1 /* PSPP - a program for statistical analysis.
2    Copyright (C) 2020 Free Software Foundation, Inc.
3
4    This program is free software: you can redistribute it and/or modify
5    it under the terms of the GNU General Public License as published by
6    the Free Software Foundation, either version 3 of the License, or
7    (at your option) any later version.
8
9    This program is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12    GNU General Public License for more details.
13
14    You should have received a copy of the GNU General Public License
15    along with this program.  If not, see <http://www.gnu.org/licenses/>. */
16
17 #include <config.h>
18
19 #include "tex-glyphs.h"
20
21 const char *tex_macro[] =
22   {
23    /* TEX_NONE */
24    "",
25    /* TEX_VULGAR_FRAC */
26    "%% Typset a vulgar fraction (without a /).  The lack\n"
27    "%% of / is common in many typefaces (e.g. `Transport') and is easier to read.\n"
28    "\\def\\vulgarfrac#1/#2{\\leavevmode"
29    "\\raise.5ex\\hbox{\\the\\scriptfont0 #1}\\kern-.1em"
30    "\\lower.25ex\\hbox{\\the\\scriptfont0 #2}}",
31    /* TEX_OGONEK */
32   "\\def\\ogonekx#1#2{#1\\hskip -#2\\llap{\\smash{\\lower1ex\\hbox{\\the\\textfont1 \\char\"2C}}}}\n"
33    "\\def\\ogonek#1{\\ogonekx{#1}{0pt}}",
34    /* TEX_THORN_UC */
35    "\\def\\Thorn{{\\font\\xx=cmr7 \\xx \\rlap{\\raise 0.74ex\\hbox{I}}P}}",
36    /* TEX_THORN_LC */
37    "\\def\\thorn{{\\rlap {\\lower 0.7ex \\hbox{l}}b}}",
38    /* TEX_GUILLEMET_LEFT */
39    "\\def\\lguillemet{{\\raise0.5ex\\hbox{\\font\\xx=cmsy5 \\xx \\char\"1C}}}",
40    /* TEX_GUILLEMET_RIGHT */
41    "\\def\\rguillemet{{\\raise0.5ex\\hbox{\\font\\xx=cmsy5 \\xx \\char\"1D}}}",
42    /* TEX_ETH */
43    "\\def\\eth{\\rlap{\\hskip 0.08em\\raise 0.5ex\\hbox{\\the\\textfont0 \\char\"20}}"
44    "\\rlap{\\raise 1.5ex\\hbox{\\hskip -0.04em\\vbox to 0pt{\\hbox{\\font\\xx=cmr17 \\xx \\`\\ }\\vss}}}o}",
45    /* TEX_DOT */
46    "\\def\\dotabove#1{{\\ifnum\\fam=7 \\raise1.5ex\\rlap{.}#1\\else\\.#1\\fi}}",
47    /* TEX_DOUBLE_ACUTE */
48    "\\def\\doubleacute#1{\\ifnum\\fam=7 {\\setbox0=\\hbox{#1}\\setbox1=\\hbox{o}\\dimen0=\\ht0\\advance\\dimen0 -\\ht1"
49    " \\raise\\dimen0\\rlap{\\kern -0.25ex\\char\"13\\kern -0.8ex\\char\"13}#1}\\else\\H{#1}\\fi}"
50 };
51
52
53
54 const char *unsupported_glyph = "{\\tt\\char\"20}";
55
56
57 static const struct glyph control_codes [] =
58   {
59    {0x0009, "TAB", TEX_NONE, " "},
60    {0x000A, "LINE FEED", TEX_NONE, "{\\hfil\\break}"}
61   };
62
63 static const struct glyph basic_latin [] =
64   {
65    {0x0020, "SPACE", TEX_NONE, " "},
66    {0x0021, "EXCLAMATION MARK", TEX_NONE, "!"},
67    {0x0022, "QUOTATION MARK", TEX_NONE, "``"},
68    {0x0023, "NUMBER SIGN", TEX_NONE, "\\#"},
69    /* In the italic family, $ shows up as pound sterling.  So use
70       the slanted typeface which is close enough.  */
71    {0x0024, "DOLLAR SIGN", TEX_NONE, "{\\ifnum\\fam=4{\\sl\\$}\\else\\$\\fi}"},
72    {0x0025, "PERCENT SIGN", TEX_NONE, "\\%"},
73    {0x0026, "AMPERSAND", TEX_NONE, "\\&"},
74    {0x0027, "APOSTROPHE", TEX_NONE, "'"},
75    {0x0028, "LEFT PARENTHESIS", TEX_NONE, "("},
76    {0x0029, "RIGHT PARENTHESIS", TEX_NONE, ")"},
77    {0x002A, "ASTERISK", TEX_NONE, "*"},
78    {0x002B, "PLUS SIGN", TEX_NONE, "+"},
79    {0x002C, "COMMA", TEX_NONE, ","},
80    {0x002D, "HYPHEN-MINUS", TEX_NONE, "-"},
81    {0x002E, "FULL STOP", TEX_NONE, "."},
82    {0x002F, "SOLIDUS", TEX_NONE, "/"},
83    {0x0030, "DIGIT ZERO", TEX_NONE,  "0"},
84    {0x0031, "DIGIT ONE", TEX_NONE,   "1"},
85    {0x0032, "DIGIT TWO", TEX_NONE,   "2"},
86    {0x0033, "DIGIT THREE", TEX_NONE, "3"},
87    {0x0034, "DIGIT FOUR", TEX_NONE,  "4"},
88    {0x0035, "DIGIT FIVE", TEX_NONE,  "5"},
89    {0x0036, "DIGIT SIX", TEX_NONE,   "6"},
90    {0x0037, "DIGIT SEVEN", TEX_NONE, "7"},
91    {0x0038, "DIGIT EIGHT", TEX_NONE, "8"},
92    {0x0039, "DIGIT NINE", TEX_NONE,  "9"},
93    {0x003A, "COLON", TEX_NONE, ":"},
94    {0x003B, "SEMICOLON", TEX_NONE, ";"},
95    {0x003C, "LESS-THAN SIGN", TEX_NONE, "{\\ifnum\\fam=7 \\char\"3C\\else $<$\\fi}"},
96    {0x003D, "EQUALS SIGN", TEX_NONE, "="},
97    {0x003E, "GREATER-THAN SIGN", TEX_NONE, "{\\ifnum\\fam=7 \\char\"3E\\else $>$\\fi}"},
98    {0x003F, "QUESTION MARK", TEX_NONE, "?"},
99    {0x0040, "COMMERCIAL AT", TEX_NONE, "@"},
100    {0x0041, "LATIN CAPITAL LETTER A", TEX_NONE, "A"},
101    {0X0042, "LATIN CAPITAL LETTER B", TEX_NONE, "B"},
102    {0X0043, "LATIN CAPITAL LETTER C", TEX_NONE, "C"},
103    {0X0044, "LATIN CAPITAL LETTER D", TEX_NONE, "D"},
104    {0X0045, "LATIN CAPITAL LETTER E", TEX_NONE, "E"},
105    {0X0046, "LATIN CAPITAL LETTER F", TEX_NONE, "F"},
106    {0X0047, "LATIN CAPITAL LETTER G", TEX_NONE, "G"},
107    {0X0048, "LATIN CAPITAL LETTER H", TEX_NONE, "H"},
108    {0X0049, "LATIN CAPITAL LETTER I", TEX_NONE, "I"},
109    {0X004A, "LATIN CAPITAL LETTER J", TEX_NONE, "J"},
110    {0X004B, "LATIN CAPITAL LETTER K", TEX_NONE, "K"},
111    {0X004C, "LATIN CAPITAL LETTER L", TEX_NONE, "L"},
112    {0X004D, "LATIN CAPITAL LETTER M", TEX_NONE, "M"},
113    {0X004E, "LATIN CAPITAL LETTER N", TEX_NONE, "N"},
114    {0X004F, "LATIN CAPITAL LETTER O", TEX_NONE, "O"},
115    {0X0050, "LATIN CAPITAL LETTER P", TEX_NONE, "P"},
116    {0X0051, "LATIN CAPITAL LETTER Q", TEX_NONE, "Q"},
117    {0X0052, "LATIN CAPITAL LETTER R", TEX_NONE, "R"},
118    {0X0053, "LATIN CAPITAL LETTER S", TEX_NONE, "S"},
119    {0X0054, "LATIN CAPITAL LETTER T", TEX_NONE, "T"},
120    {0X0055, "LATIN CAPITAL LETTER U", TEX_NONE, "U"},
121    {0X0056, "LATIN CAPITAL LETTER V", TEX_NONE, "V"},
122    {0X0057, "LATIN CAPITAL LETTER W", TEX_NONE, "W"},
123    {0X0058, "LATIN CAPITAL LETTER X", TEX_NONE, "X"},
124    {0X0059, "LATIN CAPITAL LETTER Y", TEX_NONE, "Y"},
125    {0X005A, "LATIN CAPITAL LETTER Z", TEX_NONE, "Z"},
126    {0x005B, "LEFT SQUARE BRACKET", TEX_NONE, "["},
127    {0x005C, "REVERSE SOLIDUS", TEX_NONE, "{\\ifnum\\fam=7 \\char\"5C\\else $\\backslash$\\fi}" },
128    {0x005D, "RIGHT SQUARE BRACKET", TEX_NONE, "]"},
129    {0x005E, "CIRCUMFLEX ACCENT", TEX_NONE, "\\^{}"},
130    {0x005F, "LOW LINE", TEX_NONE, "\\_"},
131    {0x0060, "GRAVE ACCENT", TEX_NONE, "\\`{}"},
132    {0x0061, "LATIN SMALL LETTER A", TEX_NONE, "a"},
133    {0x0062, "LATIN SMALL LETTER B", TEX_NONE, "b"},
134    {0x0063, "LATIN SMALL LETTER C", TEX_NONE, "c"},
135    {0x0064, "LATIN SMALL LETTER D", TEX_NONE, "d"},
136    {0x0065, "LATIN SMALL LETTER E", TEX_NONE, "e"},
137    {0x0066, "LATIN SMALL LETTER F", TEX_NONE, "f"},
138    {0x0067, "LATIN SMALL LETTER G", TEX_NONE, "g"},
139    {0x0068, "LATIN SMALL LETTER H", TEX_NONE, "h"},
140    {0x0069, "LATIN SMALL LETTER I", TEX_NONE, "i"},
141    {0x006A, "LATIN SMALL LETTER J", TEX_NONE, "j"},
142    {0x006B, "LATIN SMALL LETTER K", TEX_NONE, "k"},
143    {0x006C, "LATIN SMALL LETTER L", TEX_NONE, "l"},
144    {0x006D, "LATIN SMALL LETTER M", TEX_NONE, "m"},
145    {0x006E, "LATIN SMALL LETTER N", TEX_NONE, "n"},
146    {0x006F, "LATIN SMALL LETTER O", TEX_NONE, "o"},
147    {0x0070, "LATIN SMALL LETTER P", TEX_NONE, "p"},
148    {0x0071, "LATIN SMALL LETTER Q", TEX_NONE, "q"},
149    {0x0072, "LATIN SMALL LETTER R", TEX_NONE, "r"},
150    {0x0073, "LATIN SMALL LETTER S", TEX_NONE, "s"},
151    {0x0074, "LATIN SMALL LETTER T", TEX_NONE, "t"},
152    {0x0075, "LATIN SMALL LETTER U", TEX_NONE, "u"},
153    {0x0076, "LATIN SMALL LETTER V", TEX_NONE, "v"},
154    {0x0077, "LATIN SMALL LETTER W", TEX_NONE, "w"},
155    {0x0078, "LATIN SMALL LETTER X", TEX_NONE, "x"},
156    {0x0079, "LATIN SMALL LETTER Y", TEX_NONE, "y"},
157    {0x007A, "LATIN SMALL LETTER Z", TEX_NONE, "z"},
158    {0x007B, "LEFT CURLY BRACKET", TEX_NONE, "{\\ifnum\\fam=7 \\char\"7B\\else $\\{$\\fi}" },
159    {0x007C, "VERTICAL LINE", TEX_NONE,  "{\\ifnum\\fam=7 \\char\"7C\\else {\\the\\textfont2 \\char\"6A}\\fi}" },
160    {0x007D, "RIGHT CURLY BRACKET", TEX_NONE, "{\\ifnum\\fam=7 \\char\"7D\\else $\\}$\\fi}" },
161    {0x007E, "TILDE", TEX_NONE, "{\\ifnum\\fam=7 \\char\"7E\\else {\\the\\textfont2 \\char\"18}\\fi}" },
162   };
163
164
165 static const struct glyph extended_latin [] =
166   {
167    { 0x00A0, "NO-BREAK SPACE", TEX_NONE, "~" },
168    { 0x00A1, "INVERTED EXCLAMATION MARK", TEX_NONE, "!`" },
169    { 0x00A2, "CENT SIGN", TEX_NONE, "\\rlap /c" },
170    { 0x00A3, "POUND SIGN", TEX_NONE, "{\\it \\$}" },
171    { 0x00A4, "CURRENCY SIGN", TEX_NONE,
172      "\\rlap{\\kern 0.028em\\raise 0.2ex\\hbox{\\the\\textfont2\\char\"0E}}"
173      "{\\ifnum\\fam=7\\kern -0.3ex\\fi"
174      "\\rlap{\\raise 1.05ex\\hbox{.}}\\rlap{\\kern 0.28em\\raise 1.05ex\\hbox{.}}"
175      "\\rlap{\\raise 0.28ex\\hbox{.}}{\\kern 0.28em\\raise 0.28ex\\hbox{.}}"
176      "}" },
177    { 0x00A5, "YEN SIGN", TEX_NONE, "\\rlap Y=" },
178    { 0x00A6, "BROKEN BAR", TEX_NONE, "{\\thinspace\\rlap{\\hbox{\\vrule height 0.7ex depth 0pt}}{\\raise 0.9ex\\hbox{\\vrule height 0.7ex depth 0pt}}}" },
179    { 0x00A7, "SECTION SIGN", TEX_NONE, "{\\S}" },
180    { 0x00A8, "DIAERESIS", TEX_NONE, "\\\"{}" },
181    { 0x00A9, "COPYRIGHT SIGN", TEX_NONE, "{\\copyright}" },
182    { 0x00AA, "FEMININE ORDINAL INDICATOR", TEX_NONE, "$\\rm ^{\\b a}$" },
183    { 0x00AB, "LEFT-POINTING DOUBLE ANGLE QUOTATION MARK", TEX_GUILLEMET_LEFT, "{\\lguillemet}" },
184    { 0x00AC, "NOT SIGN", TEX_NONE, "$\\neg$" },
185    { 0x00AD, "SOFT HYPHEN", TEX_NONE, "\\-" },
186    { 0x00AE, "REGISTERED SIGN", TEX_NONE, "{\\font\\sc=cmr7 \\rlap {\\sc \\hskip 2pt\\relax R}$\\bigcirc$}" },
187    { 0x00AF, "MACRON", TEX_NONE, "\\={}" },
188    { 0x00B0, "DEGREE SIGN", TEX_NONE, "$^\\circ$" },
189    { 0x00B1, "PLUS-MINUS SIGN", TEX_NONE, "$\\pm$" },
190    { 0x00B2, "SUPERSCRIPT TWO", TEX_NONE, "$^2$" },
191    { 0x00B3, "SUPERSCRIPT THREE", TEX_NONE, "$^3$" },
192    { 0x00B4, "ACUTE ACCENT", TEX_NONE, "\\'{}" },
193    { 0x00B5, "MICRO SIGN", TEX_NONE, "{\\the\\textfont1\\char\"16}" },
194    { 0x00B6, "PILCROW SIGN", TEX_NONE, "{\\P}" },
195    { 0x00B7, "MIDDLE DOT", TEX_NONE, "$\\cdot$" },
196    { 0x00B8, "CEDILLA", TEX_NONE, "\\c{}" },
197    { 0x00B9, "SUPERSCRIPT ONE", TEX_NONE, "$^1$" },
198    { 0x00BA, "MASCULINE ORDINAL INDICATOR", TEX_NONE, "$\\rm ^{\\b o}$" },
199    { 0x00BB, "RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK", TEX_GUILLEMET_RIGHT, "{\\rguillemet}" },
200    { 0x00BC, "VULGAR FRACTION ONE QUARTER", TEX_VULGAR_FRAC, "\\vulgarfrac 1/4" },
201    { 0x00BD, "VULGAR FRACTION ONE HALF", TEX_VULGAR_FRAC, "\\vulgarfrac 1/2" },
202    { 0x00BE, "VULGAR FRACTION THREE QUARTERS", TEX_VULGAR_FRAC, "\\vulgarfrac 3/4" },
203    { 0x00BF, "INVERTED QUESTION MARK", TEX_NONE, "?`" },
204    { 0x00C0, "LATIN CAPITAL LETTER A WITH GRAVE", TEX_NONE, "\\`A" },
205    { 0x00C1, "LATIN CAPITAL LETTER A WITH ACUTE", TEX_NONE, "\\'A" },
206    { 0x00C2, "LATIN CAPITAL LETTER A WITH CIRCUMFLEX", TEX_NONE, "\\^A" },
207    { 0x00C3, "LATIN CAPITAL LETTER A WITH TILDE", TEX_NONE, "\\~A" },
208    { 0x00C4, "LATIN CAPITAL LETTER A WITH DIAERESIS", TEX_NONE, "\\\"A" },
209    { 0x00C5, "LATIN CAPITAL LETTER A WITH RING ABOVE", TEX_NONE, "{\\AA}" },
210    { 0x00C6, "LATIN CAPITAL LETTER AE", TEX_NONE, "{\\AE}" },
211    { 0x00C7, "LATIN CAPITAL LETTER C WITH CEDILLA", TEX_NONE, "\\c C" },
212    { 0x00C8, "LATIN CAPITAL LETTER E WITH GRAVE", TEX_NONE, "\\`E" },
213    { 0x00C9, "LATIN CAPITAL LETTER E WITH ACUTE", TEX_NONE, "\\'E" },
214    { 0x00CA, "LATIN CAPITAL LETTER E WITH CIRCUMFLEX", TEX_NONE, "\\^E" },
215    { 0x00CB, "LATIN CAPITAL LETTER E WITH DIAERESIS", TEX_NONE, "\\\"E" },
216    { 0x00CC, "LATIN CAPITAL LETTER I WITH GRAVE", TEX_NONE, "\\`I" },
217    { 0x00CD, "LATIN CAPITAL LETTER I WITH ACUTE", TEX_NONE, "\\'I" },
218    { 0x00CE, "LATIN CAPITAL LETTER I WITH CIRCUMFLEX", TEX_NONE, "\\^I" },
219    { 0x00CF, "LATIN CAPITAL LETTER I WITH DIAERESIS", TEX_NONE, "\\\"I" },
220    /* 0x00D0 and 0x0110 are indistinguishable */
221    { 0x00D0, "LATIN CAPITAL LETTER ETH", TEX_NONE, "\\rlap{\\raise0.4ex\\hbox{-}}D" },
222    { 0x00D1, "LATIN CAPITAL LETTER N WITH TILDE", TEX_NONE, "\\~N" },
223    { 0x00D2, "LATIN CAPITAL LETTER O WITH GRAVE", TEX_NONE, "\\`O" },
224    { 0x00D3, "LATIN CAPITAL LETTER O WITH ACUTE", TEX_NONE, "\\'O" },
225    { 0x00D4, "LATIN CAPITAL LETTER O WITH CIRCUMFLEX", TEX_NONE, "\\^O" },
226    { 0x00D5, "LATIN CAPITAL LETTER O WITH TILDE", TEX_NONE, "\\~O" },
227    { 0x00D6, "LATIN CAPITAL LETTER O WITH DIAERESIS", TEX_NONE, "\\\"O" },
228    { 0x00D7, "MULTIPLICATION SIGN", TEX_NONE, "{\\the\\textfont2\\char\"02}" },
229    { 0x00D8, "LATIN CAPITAL LETTER O WITH STROKE", TEX_NONE, "{\\O}" },
230    { 0x00D9, "LATIN CAPITAL LETTER U WITH GRAVE", TEX_NONE, "\\`U" },
231    { 0x00DA, "LATIN CAPITAL LETTER U WITH ACUTE", TEX_NONE, "\\'U" },
232    { 0x00DB, "LATIN CAPITAL LETTER U WITH CIRCUMFLEX", TEX_NONE, "\\^U" },
233    { 0x00DC, "LATIN CAPITAL LETTER U WITH DIAERESIS", TEX_NONE, "\\\"U" },
234    { 0x00DD, "LATIN CAPITAL LETTER Y WITH ACUTE", TEX_NONE, "\\'Y" },
235    { 0x00DE, "LATIN CAPITAL LETTER THORN", TEX_THORN_UC, "{\\Thorn}" },
236    { 0x00DF, "LATIN SMALL LETTER SHARP S", TEX_NONE, "{\\ss}" },
237    { 0x00E0, "LATIN SMALL LETTER A WITH GRAVE", TEX_NONE, "\\`a" },
238    { 0x00E1, "LATIN SMALL LETTER A WITH ACUTE", TEX_NONE, "\\'a" },
239    { 0x00E2, "LATIN SMALL LETTER A WITH CIRCUMFLEX", TEX_NONE, "\\^a" },
240    { 0x00E3, "LATIN SMALL LETTER A WITH TILDE", TEX_NONE, "\\~a" },
241    { 0x00E4, "LATIN SMALL LETTER A WITH DIAERESIS", TEX_NONE, "\\\"a" },
242    { 0x00E5, "LATIN SMALL LETTER A WITH RING ABOVE", TEX_NONE, "{\\aa}" },
243    { 0x00E6, "LATIN SMALL LETTER AE", TEX_NONE, "{\\ae}" },
244    { 0x00E7, "LATIN SMALL LETTER C WITH CEDILLA", TEX_NONE, "\\c c" },
245    { 0x00E8, "LATIN SMALL LETTER E WITH GRAVE", TEX_NONE, "\\`e" },
246    { 0x00E9, "LATIN SMALL LETTER E WITH ACUTE", TEX_NONE, "\\'e" },
247    { 0x00EA, "LATIN SMALL LETTER E WITH CIRCUMFLEX", TEX_NONE, "\\^e" },
248    { 0x00EB, "LATIN SMALL LETTER E WITH DIAERESIS", TEX_NONE, "\\\"e" },
249    { 0x00EC, "LATIN SMALL LETTER I WITH GRAVE", TEX_NONE, "{\\`\\i}" },
250    { 0x00ED, "LATIN SMALL LETTER I WITH ACUTE", TEX_NONE, "{\\'\\i}" },
251    { 0x00EE, "LATIN SMALL LETTER I WITH CIRCUMFLEX", TEX_NONE, "{\\^\\i}" },
252    { 0x00EF, "LATIN SMALL LETTER I WITH DIAERESIS", TEX_NONE, "{\\\"\\i}" },
253    { 0x00F0, "LATIN SMALL LETTER ETH", TEX_ETH, "{\\eth}" },
254    { 0x00F1, "LATIN SMALL LETTER N WITH TILDE", TEX_NONE, "\\~n" },
255    { 0x00F2, "LATIN SMALL LETTER O WITH GRAVE", TEX_NONE, "\\`o" },
256    { 0x00F3, "LATIN SMALL LETTER O WITH ACUTE", TEX_NONE, "\\'o" },
257    { 0x00F4, "LATIN SMALL LETTER O WITH CIRCUMFLEX", TEX_NONE, "\\^o" },
258    { 0x00F5, "LATIN SMALL LETTER O WITH TILDE", TEX_NONE, "\\~o" },
259    { 0x00F6, "LATIN SMALL LETTER O WITH DIAERESIS", TEX_NONE, "\\\"o" },
260    { 0x00F7, "DIVISION SIGN", TEX_NONE, "{\\the\\textfont2\\char\"04}" },
261    { 0x00F8, "LATIN SMALL LETTER O WITH STROKE", TEX_NONE, "{\\o}" },
262    { 0x00F9, "LATIN SMALL LETTER U WITH GRAVE", TEX_NONE, "\\`u" },
263    { 0x00FA, "LATIN SMALL LETTER U WITH ACUTE", TEX_NONE, "\\'u" },
264    { 0x00FB, "LATIN SMALL LETTER U WITH CIRCUMFLEX", TEX_NONE, "\\^u" },
265    { 0x00FC, "LATIN SMALL LETTER U WITH DIAERESIS", TEX_NONE, "\\\"u" },
266    { 0x00FD, "LATIN SMALL LETTER Y WITH ACUTE", TEX_NONE, "\\'y" },
267    { 0x00FE, "LATIN SMALL LETTER THORN", TEX_THORN_LC, "{\\thorn}" },
268    { 0x00FF, "LATIN SMALL LETTER Y WITH DIAERESIS", TEX_NONE, "\\\"y" },
269    { 0x0100, "LATIN CAPITAL LETTER A WITH MACRON", TEX_NONE, "\\=A" },
270    { 0x0101, "LATIN SMALL LETTER A WITH MACRON", TEX_NONE, "\\=a" },
271    { 0x0102, "LATIN CAPITAL LETTER A WITH BREVE", TEX_NONE, "\\u A" },
272    { 0x0103, "LATIN SMALL LETTER A WITH BREVE", TEX_NONE, "\\u a" },
273    { 0x0104, "LATIN CAPITAL LETTER A WITH OGONEK", TEX_OGONEK, "\\ogonek{A}" },
274    { 0x0105, "LATIN SMALL LETTER A WITH OGONEK", TEX_OGONEK, "\\ogonek{a}" },
275    { 0x0106, "LATIN CAPITAL LETTER C WITH ACUTE", TEX_NONE, "\\'C" },
276    { 0x0107, "LATIN SMALL LETTER C WITH ACUTE", TEX_NONE, "\\'c" },
277    { 0x0108, "LATIN CAPITAL LETTER C WITH CIRCUMFLEX", TEX_NONE, "\\^C" },
278    { 0x0109, "LATIN SMALL LETTER C WITH CIRCUMFLEX", TEX_NONE, "\\^c" },
279    { 0x010A, "LATIN CAPITAL LETTER C WITH DOT ABOVE", TEX_DOT, "\\dotabove{C}" },
280    { 0x010B, "LATIN SMALL LETTER C WITH DOT ABOVE", TEX_DOT, "\\dotabove{c}" },
281    { 0x010C, "LATIN CAPITAL LETTER C WITH CARON", TEX_NONE, "\\v C" },
282    { 0x010D, "LATIN SMALL LETTER C WITH CARON", TEX_NONE, "\\v c" },
283    { 0x010E, "LATIN CAPITAL LETTER D WITH CARON", TEX_NONE, "\\v D" },
284    { 0x010F, "LATIN SMALL LETTER D WITH CARON", TEX_NONE, "\\v d" },
285    { 0x0110, "LATIN CAPITAL LETTER D WITH STROKE", TEX_NONE, "\\rlap{\\raise0.4ex\\hbox{-}}D" },
286    { 0x0111, "LATIN SMALL LETTER D WITH STROKE", TEX_NONE, "\\hbox{d\\kern-0.32em{\\raise0.8ex\\hbox{-}}}" },
287    { 0x0112, "LATIN CAPITAL LETTER E WITH MACRON", TEX_NONE, "\\=E" },
288    { 0x0113, "LATIN SMALL LETTER E WITH MACRON", TEX_NONE, "\\=e" },
289    { 0x0114, "LATIN CAPITAL LETTER E WITH BREVE", TEX_NONE, "\\u E" },
290    { 0x0115, "LATIN SMALL LETTER E WITH BREVE", TEX_NONE, "\\u e" },
291    { 0x0116, "LATIN CAPITAL LETTER E WITH DOT ABOVE", TEX_DOT, "\\dotabove{E}" },
292    { 0x0117, "LATIN SMALL LETTER E WITH DOT ABOVE", TEX_DOT, "\\dotabove{e}" },
293    { 0x0118, "LATIN CAPITAL LETTER E WITH OGONEK", TEX_OGONEK, "\\ogonek{E}" },
294    { 0x0119, "LATIN SMALL LETTER E WITH OGONEK", TEX_OGONEK, "\\ogonek{e}" },
295    { 0x011A, "LATIN CAPITAL LETTER E WITH CARON", TEX_NONE, "\\v E" },
296    { 0x011B, "LATIN SMALL LETTER E WITH CARON", TEX_NONE, "\\v e" },
297    { 0x011C, "LATIN CAPITAL LETTER G WITH CIRCUMFLEX", TEX_NONE, "\\^G" },
298    { 0x011D, "LATIN SMALL LETTER G WITH CIRCUMFLEX", TEX_NONE, "\\^g" },
299    { 0x011E, "LATIN CAPITAL LETTER G WITH BREVE", TEX_NONE, "\\u G" },
300    { 0x011F, "LATIN SMALL LETTER G WITH BREVE", TEX_NONE, "\\u g" },
301    { 0x0120, "LATIN CAPITAL LETTER G WITH DOT ABOVE", TEX_DOT, "\\dotabove{G}" },
302    { 0x0121, "LATIN SMALL LETTER G WITH DOT ABOVE", TEX_DOT, "\\dotabove{g}" },
303    { 0x0122, "LATIN CAPITAL LETTER G WITH CEDILLA", TEX_NONE, "\\c G" },
304    /* Because of the descender, a conventional cedilla on a 'g' looks ugly.  */
305    { 0x0123, "LATIN SMALL LETTER G WITH CEDILLA", TEX_NONE, "{\\accent96 g}" },
306    { 0x0124, "LATIN CAPITAL LETTER H WITH CIRCUMFLEX", TEX_NONE, "\\^H" },
307    { 0x0125, "LATIN SMALL LETTER H WITH CIRCUMFLEX", TEX_NONE, "\\^h" },
308    { 0x0126, "LATIN CAPITAL LETTER H WITH STROKE", TEX_NONE, "\\rlap{\\raise 1.1ex\\vbox{\\hrule width 0.77em\\vss}}H" },
309    { 0x0127, "LATIN SMALL LETTER H WITH STROKE", TEX_NONE, "\\hbox{{\\raise0.8ex\\hbox{-}}\\kern-0.35em h}" },
310    { 0x0128, "LATIN CAPITAL LETTER I WITH TILDE", TEX_NONE, "\\~I" },
311    { 0x0129, "LATIN SMALL LETTER I WITH TILDE", TEX_NONE, "{\\~\\i}" },
312    { 0x012A, "LATIN CAPITAL LETTER I WITH MACRON", TEX_NONE, "\\=I" },
313    { 0x012B, "LATIN SMALL LETTER I WITH MACRON", TEX_NONE, "{\\=\\i}" },
314    { 0x012C, "LATIN CAPITAL LETTER I WITH BREVE", TEX_NONE, "\\u I" },
315    { 0x012D, "LATIN SMALL LETTER I WITH BREVE", TEX_NONE, "{\\u \\i}" },
316    { 0x012E, "LATIN CAPITAL LETTER I WITH OGONEK", TEX_OGONEK, "\\ogonek{I}" },
317    { 0x012F, "LATIN SMALL LETTER I WITH OGONEK", TEX_OGONEK, "\\ogonek{i}" },
318    { 0x0130, "LATIN CAPITAL LETTER I WITH DOT ABOVE", TEX_DOT, "\\dotabove{I}" },
319    { 0x0131, "LATIN SMALL LETTER DOTLESS I", TEX_NONE, "{\\i}" },
320    { 0x0132, "LATIN CAPITAL LIGATURE IJ", TEX_NONE, "\\hbox{I\\kern -0.05em J}" },
321    { 0x0133, "LATIN SMALL LIGATURE IJ", TEX_NONE, "\\hbox{i\\kern -0.1em j}" },
322    { 0x0134, "LATIN CAPITAL LETTER J WITH CIRCUMFLEX", TEX_NONE, "\\^J" },
323    { 0x0135, "LATIN SMALL LETTER J WITH CIRCUMFLEX", TEX_NONE, "{\\^\\j}" },
324    { 0x0136, "LATIN CAPITAL LETTER K WITH CEDILLA", TEX_NONE, "\\c K" },
325    { 0x0137, "LATIN SMALL LETTER K WITH CEDILLA", TEX_NONE, "\\c k" },
326    { 0x0138, "LATIN SMALL LETTER KRA", TEX_NONE, "{\\font\\xx=cmr7\\xx K}" },
327    { 0x0139, "LATIN CAPITAL LETTER L WITH ACUTE", TEX_NONE, "\\'L" },
328    { 0x013A, "LATIN SMALL LETTER L WITH ACUTE", TEX_NONE, "\\'l" },
329    { 0x013B, "LATIN CAPITAL LETTER L WITH CEDILLA", TEX_NONE, "\\c L" },
330    { 0x013C, "LATIN SMALL LETTER L WITH CEDILLA", TEX_NONE, "\\c l" },
331    { 0x013D, "LATIN CAPITAL LETTER L WITH CARON", TEX_NONE, "\\v L" },
332    { 0x013E, "LATIN SMALL LETTER L WITH CARON", TEX_NONE, "\\v l" },
333    { 0x013F, "LATIN CAPITAL LETTER L WITH MIDDLE DOT", TEX_NONE, "\\hbox{\\rlap{\\kern0.27em\\raise0.3ex\\hbox{$\\cdot$}}L}" },
334    { 0x0140, "LATIN SMALL LETTER L WITH MIDDLE DOT", TEX_NONE,   "\\hbox{l\\kern-0.12em\\raise0.3ex\\hbox{$\\cdot$}}" },
335    { 0x0141, "LATIN CAPITAL LETTER L WITH STROKE", TEX_NONE, "{\\ifnum\\fam=7 \\lower 0.4ex\\rlap{\\kern -0.13em\\'{}}L\\else\\L\\fi}" },
336    { 0x0142, "LATIN SMALL LETTER L WITH STROKE", TEX_NONE, "{\\ifnum\\fam=7 \\lower 0.4ex\\rlap{\\kern -0.05em\\'{}}l\\else\\l\\fi}" },
337    { 0x0143, "LATIN CAPITAL LETTER N WITH ACUTE", TEX_NONE, "\\'N" },
338    { 0x0144, "LATIN SMALL LETTER N WITH ACUTE", TEX_NONE, "\\'n" },
339    { 0x0145, "LATIN CAPITAL LETTER N WITH CEDILLA", TEX_NONE, "\\c N" },
340    { 0x0146, "LATIN SMALL LETTER N WITH CEDILLA", TEX_NONE, "\\c n" },
341    { 0x0147, "LATIN CAPITAL LETTER N WITH CARON", TEX_NONE, "\\v N" },
342    { 0x0148, "LATIN SMALL LETTER N WITH CARON", TEX_NONE, "\\v n" },
343    { 0x0149, "LATIN SMALL LETTER N PRECEDED BY APOSTROPHE", TEX_NONE, "\\hbox{'\\kern -0.1em n}" },
344    { 0x014A, "LATIN CAPITAL LETTER ENG", TEX_NONE, 0 },
345    { 0x014B, "LATIN SMALL LETTER ENG", TEX_NONE, 0 },
346    { 0x014C, "LATIN CAPITAL LETTER O WITH MACRON", TEX_NONE, "\\=O" },
347    { 0x014D, "LATIN SMALL LETTER O WITH MACRON", TEX_NONE, "\\=o" },
348    { 0x014E, "LATIN CAPITAL LETTER O WITH BREVE", TEX_NONE, "\\u O" },
349    { 0x014F, "LATIN SMALL LETTER O WITH BREVE", TEX_NONE, "\\u o" },
350    { 0x0150, "LATIN CAPITAL LETTER O WITH DOUBLE ACUTE", TEX_DOUBLE_ACUTE, "\\doubleacute{O}" },
351    { 0x0151, "LATIN SMALL LETTER O WITH DOUBLE ACUTE", TEX_DOUBLE_ACUTE, "\\doubleacute{o}" },
352    { 0x0152, "LATIN CAPITAL LIGATURE OE", TEX_NONE, "{\\OE}" },
353    { 0x0153, "LATIN SMALL LIGATURE OE", TEX_NONE, "{\\oe}" },
354    { 0x0154, "LATIN CAPITAL LETTER R WITH ACUTE", TEX_NONE, "\\'R" },
355    { 0x0155, "LATIN SMALL LETTER R WITH ACUTE", TEX_NONE, "\\'r" },
356    { 0x0156, "LATIN CAPITAL LETTER R WITH CEDILLA", TEX_NONE, "\\c R" },
357    { 0x0157, "LATIN SMALL LETTER R WITH CEDILLA", TEX_NONE, "\\c r" },
358    { 0x0158, "LATIN CAPITAL LETTER R WITH CARON", TEX_NONE, "\\v R" },
359    { 0x0159, "LATIN SMALL LETTER R WITH CARON", TEX_NONE, "\\v r" },
360    { 0x015A, "LATIN CAPITAL LETTER S WITH ACUTE", TEX_NONE, "\\'S" },
361    { 0x015B, "LATIN SMALL LETTER S WITH ACUTE", TEX_NONE, "\\'s" },
362    { 0x015C, "LATIN CAPITAL LETTER S WITH CIRCUMFLEX", TEX_NONE, "\\^S" },
363    { 0x015D, "LATIN SMALL LETTER S WITH CIRCUMFLEX", TEX_NONE, "\\^s" },
364    { 0x015E, "LATIN CAPITAL LETTER S WITH CEDILLA", TEX_NONE, "\\c S" },
365    { 0x015F, "LATIN SMALL LETTER S WITH CEDILLA", TEX_NONE, "\\c s" },
366    { 0x0160, "LATIN CAPITAL LETTER S WITH CARON", TEX_NONE, "\\v S" },
367    { 0x0161, "LATIN SMALL LETTER S WITH CARON", TEX_NONE, "\\v s" },
368    { 0x0162, "LATIN CAPITAL LETTER T WITH CEDILLA", TEX_NONE, "\\c T" },
369    { 0x0163, "LATIN SMALL LETTER T WITH CEDILLA", TEX_NONE, "\\c t" },
370    { 0x0164, "LATIN CAPITAL LETTER T WITH CARON", TEX_NONE, "\\v T" },
371    { 0x0165, "LATIN SMALL LETTER T WITH CARON", TEX_NONE, "\\v t" },
372    { 0x0166, "LATIN CAPITAL LETTER T WITH STROKE", TEX_NONE, "\\rlap{\\raise 0.35ex\\hbox{\\kern0.22em -}}T" },
373    { 0x0167, "LATIN SMALL LETTER T WITH STROKE", TEX_NONE, "\\hbox{{\\raise0.16ex\\hbox{-}}\\kern-0.35em t}" },
374    { 0x0168, "LATIN CAPITAL LETTER U WITH TILDE", TEX_NONE, "\\~U" },
375    { 0x0169, "LATIN SMALL LETTER U WITH TILDE", TEX_NONE, "\\~u" },
376    { 0x016A, "LATIN CAPITAL LETTER U WITH MACRON", TEX_NONE, "\\=U" },
377    { 0x016B, "LATIN SMALL LETTER U WITH MACRON", TEX_NONE, "\\=u" },
378    { 0x016C, "LATIN CAPITAL LETTER U WITH BREVE", TEX_NONE, "\\u U" },
379    { 0x016D, "LATIN SMALL LETTER U WITH BREVE", TEX_NONE, "\\u u" },
380    { 0x016E, "LATIN CAPITAL LETTER U WITH RING ABOVE", TEX_NONE, "\\accent23 U" },
381    { 0x016F, "LATIN SMALL LETTER U WITH RING ABOVE", TEX_NONE, "\\accent23 u" },
382    { 0x0170, "LATIN CAPITAL LETTER U WITH DOUBLE ACUTE", TEX_DOUBLE_ACUTE, "\\doubleacute{U}" },
383    { 0x0171, "LATIN SMALL LETTER U WITH DOUBLE ACUTE", TEX_DOUBLE_ACUTE, "\\doubleacute{u}" },
384    { 0x0172, "LATIN CAPITAL LETTER U WITH OGONEK", TEX_OGONEK, "\\ogonekx{U}{0.08em}" },
385    { 0x0173, "LATIN SMALL LETTER U WITH OGONEK", TEX_OGONEK, "\\ogonek{u}" },
386    { 0x0174, "LATIN CAPITAL LETTER W WITH CIRCUMFLEX", TEX_NONE, "\\^W" },
387    { 0x0175, "LATIN SMALL LETTER W WITH CIRCUMFLEX", TEX_NONE, "\\^w" },
388    { 0x0176, "LATIN CAPITAL LETTER Y WITH CIRCUMFLEX", TEX_NONE, "\\^Y" },
389    { 0x0177, "LATIN SMALL LETTER Y WITH CIRCUMFLEX", TEX_NONE, "\\^y" },
390    { 0x0178, "LATIN CAPITAL LETTER Y WITH DIAERESIS", TEX_NONE, "\\\"Y" },
391    { 0x0179, "LATIN CAPITAL LETTER Z WITH ACUTE", TEX_NONE, "\\'Z" },
392    { 0x017A, "LATIN SMALL LETTER Z WITH ACUTE", TEX_NONE, "\\'z" },
393    { 0x017B, "LATIN CAPITAL LETTER Z WITH DOT ABOVE", TEX_DOT, "\\dotabove{Z}" },
394    { 0x017C, "LATIN SMALL LETTER Z WITH DOT ABOVE", TEX_DOT, "\\dotabove{z}" },
395    { 0x017D, "LATIN CAPITAL LETTER Z WITH CARON", TEX_NONE, "\\v Z" },
396    { 0x017E, "LATIN SMALL LETTER Z WITH CARON", TEX_NONE, "\\v z" },
397    { 0x017F, "LATIN SMALL LETTER LONG S", TEX_NONE, 0 },
398   };
399
400
401
402 static const struct glyph punctuation [] =
403 {
404    {0x2000, "EN QUAD", TEX_NONE, "\\kern.5em" },
405    {0x2001, "EM QUAD", TEX_NONE, "\\kern1em" },
406    {0x2002, "EN SPACE", TEX_NONE, "\\kern.5em" },
407    {0x2003, "EM SPACE", TEX_NONE, "\\kern1em" },
408    {0x2004, "THREE-PER-EM SPACE", TEX_NONE, "\\kern0.333em" },
409    {0x2005, "FOUR-PER-EM SPACE", TEX_NONE, "\\kern0.250em" },
410    {0x2006, "SIX-PER-EM SPACE", TEX_NONE, "\\kern0.166em" },
411    {0x2007, "FIGURE SPACE", TEX_NONE, "\\kern1ex" },
412    {0x2008, "PUNCTUATION SPACE", TEX_NONE, "{\\thinspace}" },
413    {0x2009, "THIN SPACE", TEX_NONE, "{\\thinspace}" },
414    {0x200A, "HAIR SPACE", TEX_NONE, "{\\hskip 1pt}" },
415    {0x200B, "ZERO WIDTH SPACE", TEX_NONE, "{}" },
416    {0x200C, "ZERO WIDTH NON-JOINER", TEX_NONE, "{}" },
417    {0x200D, "ZERO WIDTH JOINER", TEX_NONE, "{}" },
418    {0x200E, "LEFT-TO-RIGHT MARK", TEX_NONE, 0 },
419    {0x200F, "RIGHT-TO-LEFT MARK", TEX_NONE, 0 },
420    {0x2010, "HYPHEN", TEX_NONE, "-" },
421    {0x2011, "NON-BREAKING HYPHEN", TEX_NONE, "\\hbox{-}" },
422    {0x2012, "FIGURE DASH", TEX_NONE, "--" },
423    {0x2013, "EN DASH", TEX_NONE, "--" },
424    {0x2014, "EM DASH", TEX_NONE, "---" },
425    {0x2015, "HORIZONTAL BAR", TEX_NONE, "---" },
426    {0x2016, "DOUBLE VERTICAL LINE", TEX_NONE, "{\\the\\textfont2 \\char\"6B}" },
427    {0x2017, "DOUBLE LOW LINE", TEX_NONE, "{\\the\\textfont2 \\lower0.4ex\\rlap{\\char\"00}\\lower0.8ex\\hbox{\\char\"00}}" },
428    {0x2018, "LEFT SINGLE QUOTATION MARK", TEX_NONE, "`" },
429    {0x2019, "RIGHT SINGLE QUOTATION MARK", TEX_NONE, "'" },
430    {0x201A, "SINGLE LOW-9 QUOTATION MARK", TEX_NONE, "," },
431    {0x201B, "SINGLE HIGH-REVERSED-9 QUOTATION MARK", TEX_NONE, 0 },
432    {0x201C, "LEFT DOUBLE QUOTATION MARK", TEX_NONE, "``" },
433    {0x201D, "RIGHT DOUBLE QUOTATION MARK", TEX_NONE, "''" },
434    {0x201E, "DOUBLE LOW-9 QUOTATION MARK", TEX_NONE, ",," },
435    {0x201F, "DOUBLE HIGH-REVERSED-9 QUOTATION MARK", TEX_NONE, 0 },
436    {0x2020, "DAGGER", TEX_NONE, "{\\dag}" },
437    {0x2021, "DOUBLE DAGGER", TEX_NONE, "{\\ddag}" },
438    {0x2022, "BULLET", TEX_NONE, "{\\the\\textfont2 \\char\"0F}" },
439    {0x2023, "TRIANGULAR BULLET", TEX_NONE, "{\\the\\textfont1 \\char\"2E}" },
440    {0x2024, "ONE DOT LEADER", TEX_NONE, "\\hbox{.}" },
441    {0x2025, "TWO DOT LEADER", TEX_NONE, "\\hbox{.\\kern 0.15em.}" },
442    /* Ellipsis could be done with $\dots$ but that means a font change which we
443       want to avoid if possible.  */
444    {0x2026, "HORIZONTAL ELLIPSIS", TEX_NONE, "\\hbox{.\\kern 0.15em.\\kern 0.15em.}" },
445    {0x2027, "HYPHENATION POINT", TEX_NONE, "$\\cdot$" },
446    {0x2028, "LINE SEPARATOR", TEX_NONE, "{\\break}" },
447    {0x2029, "PARAGRAPH SEPARATOR", TEX_NONE, "{\\par}" },
448    {0x202A, "LEFT-TO-RIGHT EMBEDDING", TEX_NONE, 0 },
449    {0x202B, "RIGHT-TO-LEFT EMBEDDING", TEX_NONE, 0 },
450    {0x202C, "POP DIRECTIONAL FORMATTING", TEX_NONE, 0 },
451    {0x202D, "LEFT-TO-RIGHT OVERRIDE", TEX_NONE, 0 },
452    {0x202E, "RIGHT-TO-LEFT OVERRIDE", TEX_NONE, 0 },
453    {0x202F, "NARROW NO-BREAK SPACE", TEX_NONE, "\\hbox{\\thinspace}" },
454    {0x2030, "PER MILLE SIGN", TEX_NONE, "{\\font\\xx=\\ifnum\\fam=6 wasyb10\\else wasy10\\fi \\xx \\char\"68}" },
455    {0x2031, "PER TEN THOUSAND SIGN", TEX_NONE, 0 },
456    {0x2032, "PRIME", TEX_NONE, "$'$" },
457    {0x2033, "DOUBLE PRIME", TEX_NONE, "$''$" },
458    {0x2034, "TRIPLE PRIME", TEX_NONE, "$'''$" },
459    {0x2035, "REVERSED PRIME", TEX_NONE, 0 },
460    {0x2036, "REVERSED DOUBLE PRIME", TEX_NONE, 0 },
461    {0x2037, "REVERSED TRIPLE PRIME", TEX_NONE, 0 },
462    {0x2038, "CARET", TEX_NONE, "\\^{ }" },
463    {0x2039, "SINGLE LEFT-POINTING ANGLE QUOTATION MARK", TEX_NONE, "{\\raise0.5ex\\hbox{\\font\\xx=cmmi5 \\xx \\char\"3C}}" },
464    {0x203A, "SINGLE RIGHT-POINTING ANGLE QUOTATION MARK", TEX_NONE, "{\\raise0.5ex\\hbox{\\font\\xx=cmmi5 \\xx \\char\"3E}}" },
465    {0x203B, "REFERENCE MARK", TEX_NONE,
466     "\\rlap{\\ifnum\\fam=7\\kern -0.3ex\\fi"
467     "\\rlap{\\raise 1.2ex\\hbox{\\kern 1ex.}}"
468     "\\rlap{\\raise 0.2ex\\hbox{\\kern 1ex.}}"
469     "\\rlap{\\raise 0.7ex\\hbox{\\kern 1.5ex.}}"
470     "\\rlap{\\raise 0.7ex\\hbox{\\kern 0.5ex.}}"
471     "}"
472     "{\\font\\xx=cmsy10 scaled\\magstep2\\xx\\char\"02}"
473    },
474    {0x203C, "DOUBLE EXCLAMATION MARK", TEX_NONE, "\\hbox{!\\kern -0.1em!}" },
475    {0x203D, "INTERROBANG", TEX_NONE, "\\rlap{\\ifnum\\fam=7 \\else\\kern 0.1em\\fi!}?" },
476    {0x203E, "OVERLINE", TEX_NONE, "\\raise 1ex \\hbox{\\the\\textfont0 \\char\"7B}"},
477    {0x203F, "UNDERTIE", TEX_NONE, "{\\the\\textfont1 \\char\"05E}" },
478    {0x2040, "CHARACTER TIE", TEX_NONE, "{\\the\\textfont1 \\char\"05F}" },
479    {0x2041, "CARET INSERTION POINT", TEX_NONE, 0 },
480    {0x2042, "ASTERISM", TEX_NONE, "\\vtop to 0pt{\\hbox{\\lower .8ex\\hbox{*}}\\vss}\\kern-0.55ex"
481     "*\\kern-0.55ex\\vtop to 0pt{\\hbox{\\lower .8ex\\hbox{*}}\\vss}" },
482    {0x2043, "HYPHEN BULLET", TEX_NONE, "\\raise 0.6ex\\hbox to 0.3em{\\leaders\\hrule height 1pt\\hfil}" },
483    {0x2044, "FRACTION SLASH", TEX_NONE, "{\\it /\\/}" },
484    {0x2045, "LEFT SQUARE BRACKET WITH QUILL", TEX_NONE, "\\rlap{[}{\\raise 0.1ex\\hbox{-}}" },
485    {0x2046, "RIGHT SQUARE BRACKET WITH QUILL", TEX_NONE, "\\rlap{]}{\\raise 0.1ex\\hbox{-}}" },
486    {0x2047, "DOUBLE QUESTION MARK", TEX_NONE, "?\\kern-0.2ex?" },
487    {0x2048, "QUESTION EXCLAMATION MARK", TEX_NONE, "?\\kern-0.2ex!" },
488    {0x2049, "EXCLAMATION QUESTION MARK", TEX_NONE, "!\\kern-0.2ex?" },
489    {0x204A, "TIRONIAN SIGN ET", TEX_NONE, "\\raise 1ex\\rlap{\\the\\textfont3 \\char\"7D}/" },
490    {0x204B, "REVERSED PILCROW SIGN", TEX_NONE, 0 },
491    {0x204C, "BLACK LEFTWARDS BULLET", TEX_NONE, 0 },
492    {0x204D, "BLACK RIGHTWARDS BULLET", TEX_NONE, 0 },
493    {0x204E, "LOW ASTERISK", TEX_NONE, "\\lower 0.8ex\\hbox{*}" },
494    {0x204F, "REVERSED SEMICOLON", TEX_NONE, 0 },
495    {0x2050, "CLOSE UP", TEX_NONE,  "\\rlap{\\lower 0.8ex\\hbox{\\the\\textfont1 \\char\"05E}}\\raise 1.ex\\hbox{\\the\\textfont1 \\char\"05F}"},
496    {0x2051, "TWO ASTERISKS ALIGNED VERTICALLY", TEX_NONE, "\\vtop to 0pt{\\rlap{\\lower 0.8ex\\hbox{*}}\\vss}*" },
497    {0x2052, "COMMERCIAL MINUS SIGN", TEX_NONE, "{\\raise 1.3ex\\hbox{.}\\rlap{\\raise 0.2ex\\hbox{\\kern-0.25em/}}.}" },
498    {0x2053, "SWUNG DASH", TEX_NONE, "\\lower 0.5ex\\hbox{\\the\\textfont3 \\char\"65}" },
499    {0x2054, "INVERTED UNDERTIE", TEX_NONE, "\\lower 0.3ex\\hbox{\\the\\textfont1 \\char\"05F}" },
500    {0x2055, "FLOWER PUNCTUATION MARK", TEX_NONE, 0 },
501    {0x2056, "THREE DOT PUNCTUATION", TEX_NONE, "\\raise 0.25\\baselineskip\\hbox{.}\\raise 0.5\\baselineskip\\rlap{.}." },
502    {0x2057, "QUADRUPLE PRIME", TEX_NONE, "$''''$" },
503    {0x2058, "FOUR DOT PUNCTUATION", TEX_NONE,
504     "\\raise 0.2\\baselineskip\\rlap{.}"
505     "\\kern 0.22\\baselineskip"
506     "\\lower 0.0\\baselineskip\\rlap{.}"
507     "\\raise 0.4\\baselineskip\\rlap{.}"
508     "\\kern 0.22\\baselineskip"
509     "\\raise 0.2\\baselineskip\\hbox{.}"
510    },
511    {0x2059, "FIVE DOT PUNCTUATION", TEX_NONE,
512     "\\lower 0.0\\baselineskip\\rlap{.}"
513     "\\raise 0.4\\baselineskip\\rlap{.}"
514     "\\kern 0.2\\baselineskip"
515     "\\raise 0.2\\baselineskip\\rlap{.}"
516     "\\kern 0.2\\baselineskip"
517     "\\lower 0.0\\baselineskip\\rlap{.}"
518     "\\raise 0.4\\baselineskip\\hbox{.}"
519    },
520    {0x205A, "TWO DOT PUNCTUATION", TEX_NONE, "\\raise 0.5\\baselineskip\\rlap{.}." },
521    {0x205B, "FOUR DOT MARK", TEX_NONE,
522     "\\raise 0.3\\baselineskip\\hbox{.}"
523     "\\lower 0.1\\baselineskip\\rlap{.}"
524     "\\raise 0.7\\baselineskip\\hbox{.}"
525     "\\raise 0.3\\baselineskip\\hbox{.}"
526    },
527    {0x205C, "DOTTED CROSS", TEX_NONE,
528     "\\rlap{\\ifnum\\fam=7\\kern -0.3ex\\fi"
529     "\\raise 0.07\\baselineskip\\rlap{.}"
530     "\\raise 0.31\\baselineskip\\rlap{.}"
531     "\\kern 0.25\\baselineskip"
532     "\\raise 0.07\\baselineskip\\rlap{.}"
533     "\\raise 0.31\\baselineskip\\rlap{.}"
534     "}\\kern 0.01\\baselineskip"
535     "\\hbox to 0.5\\baselineskip{"
536     "\\rlap{\\raise 0.225\\baselineskip\\hbox to 0.5\\baselineskip{\\leaders\\hrule height 0.5pt\\hfil}}"
537     "\\kern 0.225\\baselineskip"
538     "\\vbox to 0.5\\baselineskip{\\leaders\\vrule width 0.5pt\\vfil}"
539     "\\hss}"
540    },
541    /* According to  https://unicode.org/charts/PDF/U2000.pdf  the vertical extent
542     of the next two is the whole height of the line. */
543    {0x205D, "TRICOLON", TEX_NONE,
544     "\\smash{"
545       "\\setbox0=\\hbox{.}"
546       "\\dimen255=\\baselineskip \\advance\\dimen255 by -\\lineskip \\advance\\dimen255 by -\\ht255"
547     "\\rlap{\\raise 1.0\\dimen255\\hbox{.}}"
548     "\\rlap{\\raise 0.5\\dimen255\\hbox{.}}"
549     "\\raise 0\\dimen255\\hbox{.}}" },
550    {0x205E, "VERTICAL FOUR DOTS", TEX_NONE,
551     "\\smash{"
552       "\\setbox0=\\hbox{.}"
553       "\\dimen255=\\baselineskip \\advance\\dimen255 by -\\lineskip \\advance\\dimen255 by -\\ht255"
554     "\\rlap{\\raise 1.0\\dimen255\\hbox{.}}"
555     "\\rlap{\\raise 0.666666\\dimen255\\hbox{.}}"
556     "\\rlap{\\raise 0.333333\\dimen255\\hbox{.}}"
557     "\\raise 0\\dimen255\\hbox{.}}" },
558    {0x205F, "MEDIUM MATHEMATICAL SPACE", TEX_NONE, "{\\hskip 0.2222222em}" },
559    {0x2060, "WORD JOINER", TEX_NONE, "{}" },
560    {0x2061, "FUNCTION APPLICATION", TEX_NONE, "$$" },
561    {0x2062, "INVISIBLE TIMES", TEX_NONE, "$$" },
562    {0x2063, "INVISIBLE SEPARATOR", TEX_NONE, "$$" },
563    {0x2064, "INVISIBLE PLUS", TEX_NONE, "$$" },
564   };
565
566 static const struct glyph mathematical [] =
567   {
568    {0x2264, "LESS-THAN OR EQUAL TO", TEX_NONE, "$\\leq$" },
569    {0x2265, "GREATER-THAN OR EQUAL TO", TEX_NONE, "$\\geq$" },
570   };
571
572
573 static const struct glyph greek [] =
574   {
575    {0x0391, "GREEK CAPITAL LETTER ALPHA", TEX_NONE, "{\\the\\textfont1 \\char\"41}" },
576    {0x0392, "GREEK CAPITAL LETTER BETA", TEX_NONE, "{\\the\\textfont1 \\char\"42}" },
577    {0x0393, "GREEK CAPITAL LETTER GAMMA", TEX_NONE,"{\\the\\textfont1 \\char\"00}" },
578    {0x0394, "GREEK CAPITAL LETTER DELTA", TEX_NONE, "{\\the\\textfont1 \\char\"01}" },
579    {0x0395, "GREEK CAPITAL LETTER EPSILON", TEX_NONE, "{\\the\\textfont1 \\char\"45}" },
580    {0x0396, "GREEK CAPITAL LETTER ZETA", TEX_NONE, "{\\the\\textfont1 \\char\"5A}" },
581    {0x0397, "GREEK CAPITAL LETTER ETA", TEX_NONE, "{\\the\\textfont1 \\char\"48}" },
582    {0x0398, "GREEK CAPITAL LETTER THETA", TEX_NONE, "{\\the\\textfont1 \\char\"02}" },
583    {0x0399, "GREEK CAPITAL LETTER IOTA", TEX_NONE, "{\\the\\textfont1 \\char\"49}" },
584    {0x039A, "GREEK CAPITAL LETTER KAPPA", TEX_NONE, "{\\the\\textfont1 \\char\"4B}" },
585    {0x039B, "GREEK CAPITAL LETTER LAMDA", TEX_NONE, "{\\the\\textfont1 \\char\"03}" },
586    {0x039C, "GREEK CAPITAL LETTER MU", TEX_NONE, "{\\the\\textfont1 \\char\"4D}" },
587    {0x039D, "GREEK CAPITAL LETTER NU", TEX_NONE, "{\\the\\textfont1 \\char\"4E}" },
588    {0x039E, "GREEK CAPITAL LETTER XI", TEX_NONE, "{\\the\\textfont1 \\char\"04}" },
589    {0x039F, "GREEK CAPITAL LETTER OMICRON", TEX_NONE, "{\\the\\textfont1 \\char\"4F}" },
590    {0x03A0, "GREEK CAPITAL LETTER PI", TEX_NONE, "{\\the\\textfont1 \\char\"05}" },
591    {0x03A1, "GREEK CAPITAL LETTER RHO", TEX_NONE, "{\\the\\textfont1 \\char\"50}" },
592    {0x03A2, "reserved", TEX_NONE, 0 },
593    {0x03A3, "GREEK CAPITAL LETTER SIGMA", TEX_NONE, "{\\the\\textfont1 \\char\"06}" },
594    {0x03A4, "GREEK CAPITAL LETTER TAU", TEX_NONE, "{\\the\\textfont1 \\char\"54}" },
595    {0x03A5, "GREEK CAPITAL LETTER UPSILON", TEX_NONE, "{\\the\\textfont1 \\char\"59}" },
596    {0x03A6, "GREEK CAPITAL LETTER PHI", TEX_NONE, "{\\the\\textfont1 \\char\"08}" },
597    {0x03A7, "GREEK CAPITAL LETTER CHI", TEX_NONE, "{\\the\\textfont1 \\char\"58}" },
598    {0x03A8, "GREEK CAPITAL LETTER PSI", TEX_NONE, "{\\the\\textfont1 \\char\"09}" },
599    {0x03A9, "GREEK CAPITAL LETTER OMEGA", TEX_NONE, "{\\the\\textfont1 \\char\"0A}" },
600    {0x03AA, "GREEK CAPITAL LETTER IOTA WITH DIALYTIKA", TEX_NONE, 0 },
601    {0x03AB, "GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA", TEX_NONE, 0 },
602    {0x03AC, "GREEK SMALL LETTER ALPHA WITH TONOS", TEX_NONE, "\\rlap{\\kern -0.25ex\\it \\char\"13}{\\the\\textfont1 \\char\"0B}"},
603    {0x03AD, "GREEK SMALL LETTER EPSILON WITH TONOS", TEX_NONE, "\\rlap{\\kern -0.25ex\\it \\char\"13}{\\the\\textfont1 \\char\"22}"},
604    {0x03AE, "GREEK SMALL LETTER ETA WITH TONOS", TEX_NONE, "\\rlap{\\kern -0.25ex\\it \\char\"13}{\\the\\textfont1 \\char\"11}"},
605    {0x03AF, "GREEK SMALL LETTER IOTA WITH TONOS", TEX_NONE, "\\rlap{\\the\\textfont1 \\char\"13}{\\kern -0.35ex\\it \\char\"13\\kern 0.1ex}" },
606    {0x03B0, "GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS", TEX_NONE, 0 },
607    {0x03B1, "GREEK SMALL LETTER ALPHA", TEX_NONE, "{\\the\\textfont1 \\char\"0B}" },
608    {0x03B2, "GREEK SMALL LETTER BETA", TEX_NONE,  "{\\the\\textfont1 \\char\"0C}" },
609    {0x03B3, "GREEK SMALL LETTER GAMMA", TEX_NONE, "{\\the\\textfont1 \\char\"0D}" },
610    {0x03B4, "GREEK SMALL LETTER DELTA", TEX_NONE, "{\\the\\textfont1 \\char\"0E}" },
611    /* Unicode prefers the squiggly epsilon */
612    {0x03B5, "GREEK SMALL LETTER EPSILON", TEX_NONE, "{\\the\\textfont1 \\char\"22}" },
613    {0x03B6, "GREEK SMALL LETTER ZETA", TEX_NONE,  "{\\the\\textfont1 \\char\"10}" },
614    {0x03B7, "GREEK SMALL LETTER ETA", TEX_NONE,   "{\\the\\textfont1 \\char\"11}" },
615    {0x03B8, "GREEK SMALL LETTER THETA", TEX_NONE, "{\\the\\textfont1 \\char\"12}" },
616    {0x03B9, "GREEK SMALL LETTER IOTA", TEX_NONE,  "{\\the\\textfont1 \\char\"13}" },
617    {0x03BA, "GREEK SMALL LETTER KAPPA", TEX_NONE, "{\\the\\textfont1 \\char\"14}" },
618    {0x03BB, "GREEK SMALL LETTER LAMDA", TEX_NONE, "{\\the\\textfont1 \\char\"15}" },
619    {0x03BC, "GREEK SMALL LETTER MU", TEX_NONE,    "{\\the\\textfont1 \\char\"16}" },
620    {0x03BD, "GREEK SMALL LETTER NU", TEX_NONE,    "{\\the\\textfont1 \\char\"17}" },
621    {0x03BE, "GREEK SMALL LETTER XI", TEX_NONE,    "{\\the\\textfont1 \\char\"18}" },
622    {0x03BF, "GREEK SMALL LETTER OMICRON", TEX_NONE, "{\\the\\textfont1 \\char\"6F}" },
623    {0x03C0, "GREEK SMALL LETTER PI", TEX_NONE, "{\\the\\textfont1 \\char\"19}" },
624    {0x03C1, "GREEK SMALL LETTER RHO", TEX_NONE, "{\\the\\textfont1 \\char\"1A}" },
625    {0x03C2, "GREEK SMALL LETTER FINAL SIGMA", TEX_NONE, "{\\the\\textfont1 \\char\"26}" },
626    {0x03C3, "GREEK SMALL LETTER SIGMA", TEX_NONE, "{\\the\\textfont1 \\char\"1B}" },
627    {0x03C4, "GREEK SMALL LETTER TAU", TEX_NONE, "{\\the\\textfont1 \\char\"1C}" },
628    {0x03C5, "GREEK SMALL LETTER UPSILON", TEX_NONE, "{\\the\\textfont1 \\char\"1D}" },
629    {0x03C6, "GREEK SMALL LETTER PHI", TEX_NONE, "{\\the\\textfont1 \\char\"27}" },
630    {0x03C7, "GREEK SMALL LETTER CHI", TEX_NONE, "{\\the\\textfont1 \\char\"1F}" },
631    {0x03C8, "GREEK SMALL LETTER PSI", TEX_NONE, "{\\the\\textfont1 \\char\"20}" },
632    {0x03C9, "GREEK SMALL LETTER OMEGA", TEX_NONE, "{\\the\\textfont1 \\char\"21}" },
633    {0x03CA, "GREEK SMALL LETTER IOTA WITH DIALYTIKA", TEX_NONE, 0 },
634    {0x03CB, "GREEK SMALL LETTER UPSILON WITH DIALYTIKA", TEX_NONE, 0 },
635    {0x03CC, "GREEK SMALL LETTER OMICRON WITH TONOS", TEX_NONE, "\\rlap{\\kern -0.25ex\\it \\char\"13}{\\the\\textfont1 \\char\"6F}"},
636    {0x03CD, "GREEK SMALL LETTER UPSILON WITH TONOS", TEX_NONE, "\\rlap{\\kern -0.25ex\\it \\char\"13}{\\the\\textfont1 \\char\"1D}"},
637    {0x03CE, "GREEK SMALL LETTER OMEGA WITH TONOS", TEX_NONE, "\\rlap{\\kern -0.25ex\\it \\char\"13}{\\the\\textfont1 \\char\"21}"},
638    {0x03CF, "GREEK CAPITAL KAI SYMBOL", TEX_NONE, 0 }
639   };
640
641 const struct glyph_block defined_blocks[] =
642   {
643    { control_codes, 2 },
644    { basic_latin, 0x7F - 0x20 },
645    { extended_latin, 0x180 - 0xA0 },
646    { greek, 0x3D0 - 0x391},
647    { punctuation, 0x65},
648    { mathematical, 2},
649    { 0, 0}
650   };