File Coverage

blib/lib/LaTeX/ToUnicode/Tables.pm
Criterion Covered Total %
statement 10 10 100.0
branch n/a
condition n/a
subroutine 4 4 100.0
pod n/a
total 14 14 100.0


line stmt bran cond sub pod time code
1             package LaTeX::ToUnicode::Tables;
2             BEGIN {
3 1     1   29 $LaTeX::ToUnicode::Tables::VERSION = '0.53';
4             }
5 1     1   6 use strict;
  1         2  
  1         20  
6 1     1   5 use warnings;
  1         2  
  1         25  
7             #ABSTRACT: Character tables for LaTeX::ToUnicode
8              
9 1     1   5 use utf8; # just for the german support
  1         2  
  1         5  
10              
11             # Technically not all of these are ligatures, but close enough.
12             # Order is important, so has to be a list, not a hash.
13             #
14             our @LIGATURES = (
15             "---" => '\x{2014}', # em dash
16             "--" => '\x{2013}', # en dash
17             "!`" => '\x{00A1}', # inverted exclam
18             "?`" => '\x{00A1}', # inverted question
19             "``" => '\x{201c}', # left double
20             "''" => '\x{201d}', # right double
21             "`" => '\x{2018}', # left single
22             "'" => '\x{2019}', # right single
23             );
24             # test text: em---dash, en--dash, exc!`am, quest?`ion, ``ld, rd'', `ls, rs'.
25             #
26             # Some additional ligatures supported in T1 encoding, but we won't (from
27             # tex-text.map):
28             # U+002C U+002C <> U+201E ; ,, -> DOUBLE LOW-9 QUOTATION MARK
29             # U+003C U+003C <> U+00AB ; << -> LEFT POINTING GUILLEMET
30             # U+003E U+003E <> U+00BB ; >> -> RIGHT POINTING GUILLEMET
31              
32             # for {\MARKUP(shape) ...} and \textMARKUP{...}; although not all
33             # command names are defined in LaTeX for all markups, we translate them
34             # anyway. Also, LaTeX has more font axes not included here: md, ulc, sw,
35             # ssc, etc. See ltfntcmd.dtx and ltfssaxes.dtx if we ever want to try
36             # for completeness.
37             #
38             our %MARKUPS = (
39             'bf' => 'b',
40             'cal' => '',
41             'em' => 'em',
42             'it' => 'i',
43             'rm' => '',
44             'sc' => '', # qqq should uppercasify
45             'sf' => '',
46             'sl' => 'i',
47             'small' => '',
48             'subscript' => 'sub',
49             'superscript' => 'sup',
50             'tt' => 'tt',
51             );
52              
53             # More commands taking arguments that we want to handle.
54             #
55             our %ARGUMENT_COMMANDS = (
56             'emph' => ['\textem{', '}'], # \textem doesn't exist, but is processed
57             'enquote' => ["`", "'"],
58             'path' => ['\texttt{', '}'], # ugh, might not be a braced argument
59             );
60              
61             # Non-alphabetic \COMMANDs, other than accents and special cases.
62             #
63             our %CONTROL_SYMBOLS = (
64             ' ' => ' ', # control space
65             "\t" => ' ', # control space
66             "\n" => '\x{0020}', # control space; use entity to avoid being trimmed
67             '!' => '', # negative thin space
68             # " umlaut
69             '#' => '#', # sharp sign
70             '$' => '$', # dollar sign
71             '%' => '%', # percent sign
72             '&' => '\x{0026}', # ampersand, entity to avoid html conflict
73             # ' acute accent
74             '(' => '', # start inline math
75             ')' => '', # end inline math
76             '*' => '', # discretionary multiplication
77             '+' => '', # tabbing: tab stop to right
78             ',' => '', # thin space
79             '-' => '', # discretionary hyphenation
80             # . overdot accent
81             '/' => '', # italic correction
82             # 0..9 undefined
83             ':' => '', # medium space
84             ';' => ' ', # thick space
85             '<' => '', # tabbing: text to left of margin
86             # = macron accent
87             '>' => '', # tabbing: next tab stop
88             # ? undefined
89             '@' => '#', # end of sentence
90             # A..Z control words, not symbols
91             '[' => '', # start display math
92             '\\' => ' ', # line break
93             ']' => '', # end display math
94             # ^ circumflex accent
95             '_' => '_', # underscore
96             # ` grave accent
97             # a..z control words, not symbols
98             '{' => '\x{007b}', # lbrace
99             '|' => '\x{2225}', # parallel
100             '}' => '\x{007d}', # rbrace
101             # ~ tilde accent
102             );
103              
104             # Alphabetic \COMMANDs that map to nothing. This is simply
105             # interpolated into %CONTROL_WORDS (next), not used directly, so we
106             # redundantly specify the '' on every line.
107             #
108             our %CONTROL_WORDS_EMPTY = (
109             'begingroup' => '',
110             'bgroup' => '',
111             'checkcomma' => '',
112             #'cite' => '', # keep \cite undefined since it needs manual work
113             'clearpage' => '',
114             'doi' => '',
115             'egroup' => '',
116             'endgroup' => '',
117             'hbox' => '',
118             'ignorespaces' => '',
119             'mbox' => '',
120             'medspace' => '',
121             'negmedspace' => '',
122             'negthickspace' => '',
123             'negthinspace' => '',
124             'newblock' => '',
125             'newpage' => '',
126             'noindent' => '',
127             'nolinkurl' => '',
128             'oldstylenums' => '',
129             'pagebreak' => '',
130             'protect' => '',
131             'raggedright' => '',
132             'relax' => '',
133             'thinspace' => '',
134             'unskip' => '',
135             'urlprefix' => '',
136             );
137              
138             # Alphabetic commands, that expand to nothing (above) and to
139             # something (below).
140             #
141             our %CONTROL_WORDS = (
142             %CONTROL_WORDS_EMPTY,
143             'BibLaTeX' => 'BibLaTeX',
144             'BibTeX' => 'BibTeX',
145             'LaTeX' => 'LaTeX',
146             'LuaLaTeX' => 'LuaLaTeX',
147             'LuaTeX' => 'LuaTeX',
148             'MF' => 'Metafont',
149             'MP' => 'MetaPost',
150             'Omega' => '\x{03A9}',
151             'TeX' => 'TeX',
152             'XeLaTeX' => 'XeLaTeX',
153             'XeTeX' => 'XeTeX',
154             'bullet' => '\x{2022}',
155             'dag' => '\x{2020}',
156             'ddag' => '\x{2021}',
157             'dots' => '\x{2026}',
158             'epsilon' => '\x{03F5}',
159             'hookrightarrow' => '\x{2194}',
160             'ldots' => '\x{2026}',
161             'log' => 'log',
162             'omega' => '\x{03C9}',
163             'par' => "\n\n",
164             'qquad' => ' ', # 2em space
165             'quad' => ' ', # em space
166             'textbackslash' => '\x{005C}', # entities so \ in output indicates
167             # untranslated TeX source
168             'textbraceleft' => '\x{007B}', # entities so our bare-brace removal
169             'textbraceright' => '\x{007D}', # skips them
170             'textgreater' => '\x{003E}',
171             'textless' => '\x{003C}',
172             'textquotedbl' => '"',
173             'thickspace' => ' ',
174             'varepsilon' => '\x{03B5}',
175             );
176              
177             # Control words (not symbols) that generate various non-English
178             # letters and symbols. Lots more could be added.
179             #
180             our %SYMBOLS = ( # Table 3.2 in Lamport, plus more
181             'AA' => '\x{00C5}', # A with ring
182             'aa' => '\x{00E5}',
183             'AE' => '\x{00C6}', # AE
184             'ae' => '\x{00E6}',
185             'DH' => '\x{00D0}', # ETH
186             'dh' => '\x{00F0}',
187             'DJ' => '\x{0110}', # D with stroke
188             'dj' => '\x{0111}',
189             'i' => '\x{0131}', # small dotless i
190             'L' => '\x{0141}', # L with stroke
191             'l' => '\x{0142}',
192             'NG' => '\x{014A}', # ENG
193             'ng' => '\x{014B}',
194             'OE' => '\x{0152}', # OE
195             'oe' => '\x{0153}',
196             'O' => '\x{00D8}', # O with stroke
197             'o' => '\x{00F8}',
198             'SS' => 'SS', # lately also U+1E9E, but SS seems good enough
199             'ss' => '\x{00DF}',
200             'TH' => '\x{00DE}', # THORN
201             'textordfeminine' => '\x{00AA}',
202             'textordmasculine' => '\x{00BA}',
203             'textregistered' => '\x{00AE}',
204             'th' => '\x{00FE}',
205             'TM' => '\x{2122}', # trade mark sign
206             );
207              
208             # Accent commands that are not alphabetic.
209             #
210             our %ACCENT_SYMBOLS = (
211             "\"" => { # with diaresis
212             A => '\x{00C4}',
213             E => '\x{00CB}',
214             H => '\x{1E26}',
215             I => '\x{00CF}',
216             O => '\x{00D6}',
217             U => '\x{00DC}',
218             W => '\x{1E84}',
219             X => '\x{1E8c}',
220             Y => '\x{0178}',
221             "\\I" => '\x{00CF}',
222             "\\i" => '\x{00EF}',
223             a => '\x{00E4}',
224             e => '\x{00EB}',
225             h => '\x{1E27}',
226             i => '\x{00EF}',
227             o => '\x{00F6}',
228             t => '\x{1E97}',
229             u => '\x{00FC}',
230             w => '\x{1E85}',
231             x => '\x{1E8d}',
232             y => '\x{00FF}',
233             },
234             "'" => { # with acute
235             A => '\x{00C1}',
236             AE => '\x{01FC}',
237             C => '\x{0106}',
238             E => '\x{00C9}',
239             G => '\x{01F4}',
240             I => '\x{00CD}',
241             K => '\x{1E30}',
242             L => '\x{0139}',
243             M => '\x{1E3E}',
244             N => '\x{0143}',
245             O => '\x{00D3}',
246             P => '\x{1E54}',
247             R => '\x{0154}',
248             S => '\x{015A}',
249             U => '\x{00DA}',
250             W => '\x{1E82}',
251             Y => '\x{00DD}',
252             Z => '\x{0179}',
253             "\\I" => '\x{00CD}',
254             "\\i" => '\x{00ED}',
255             a => '\x{00E1}',
256             ae => '\x{01FD}',
257             c => '\x{0107}',
258             e => '\x{00E9}',
259             g => '\x{01F5}',
260             i => '\x{00ED}',
261             k => '\x{1E31}',
262             l => '\x{013A}',
263             m => '\x{1E3f}',
264             n => '\x{0144}',
265             o => '\x{00F3}',
266             p => '\x{1E55}',
267             r => '\x{0155}',
268             s => '\x{015B}',
269             u => '\x{00FA}',
270             w => '\x{1E83}',
271             y => '\x{00FD}',
272             z => '\x{017A}',
273             },
274             "^" => { # with circumflex
275             A => '\x{00C2}',
276             C => '\x{0108}',
277             E => '\x{00CA}',
278             G => '\x{011C}',
279             H => '\x{0124}',
280             I => '\x{00CE}',
281             J => '\x{0134}',
282             O => '\x{00D4}',
283             R => 'R\x{0302}',
284             S => '\x{015C}',
285             U => '\x{00DB}',
286             W => '\x{0174}',
287             Y => '\x{0176}',
288             Z => '\x{1E90}',
289             "\\I" => '\x{00CE}',
290             "\\J" => '\x{0134}',
291             "\\i" => '\x{00EE}',
292             "\\j" => '\x{0135}',
293             a => '\x{00E2}',
294             c => '\x{0109}',
295             e => '\x{00EA}',
296             g => '\x{011D}',
297             h => '\x{0125}',
298             i => '\x{00EE}',
299             j => '\x{0135}',
300             o => '\x{00F4}',
301             s => '\x{015D}',
302             u => '\x{00FB}',
303             w => '\x{0175}',
304             y => '\x{0177}',
305             z => '\x{1E91}',
306             },
307             "`" => { # with grave
308             A => '\x{00C0}',
309             E => '\x{00C8}',
310             I => '\x{00CC}',
311             N => '\x{01F8}',
312             O => '\x{00D2}',
313             U => '\x{00D9}',
314             W => '\x{1E80}',
315             Y => '\x{1Ef2}',
316             "\\I" => '\x{00CC}',
317             "\\i" => '\x{00EC}',
318             a => '\x{00E0}',
319             e => '\x{00E8}',
320             i => '\x{00EC}',
321             n => '\x{01F9}',
322             o => '\x{00F2}',
323             u => '\x{00F9}',
324             w => '\x{1E81}',
325             y => '\x{1EF3}',
326             },
327             "." => { # with dot above
328             A => '\x{0226}',
329             B => '\x{1E02}',
330             C => '\x{010A}',
331             D => '\x{1E0A}',
332             E => '\x{0116}',
333             F => '\x{1E1E}',
334             G => '\x{0120}',
335             H => '\x{1E22}',
336             I => '\x{0130}',
337             M => '\x{1E40}',
338             N => '\x{1E44}',
339             O => '\x{022E}',
340             P => '\x{1E56}',
341             R => '\x{1E58}',
342             S => '\x{1E60}',
343             T => '\x{1E6a}',
344             W => '\x{1E86}',
345             X => '\x{1E8A}',
346             Y => '\x{1E8E}',
347             Z => '\x{017B}',
348             "\\I" => '\x{0130}',
349             a => '\x{0227}',
350             b => '\x{1E03}',
351             c => '\x{010B}',
352             d => '\x{1E0B}',
353             e => '\x{0117}',
354             f => '\x{1e1f}',
355             g => '\x{0121}',
356             h => '\x{1E23}',
357             m => '\x{1E41}',
358             n => '\x{1E45}',
359             o => '\x{022F}',
360             p => '\x{1E57}',
361             r => '\x{1E59}',
362             s => '\x{1E61}',
363             t => '\x{1E6b}',
364             w => '\x{1E87}',
365             x => '\x{1E8b}',
366             y => '\x{1E8f}',
367             z => '\x{017C}',
368             },
369             '=' => { # with macron
370             A => '\x{0100}',
371             AE => '\x{01E2}',
372             E => '\x{0112}',
373             G => '\x{1E20}',
374             I => '\x{012A}',
375             O => '\x{014C}',
376             U => '\x{016A}',
377             Y => '\x{0232}',
378             "\\I" => '\x{012A}',
379             "\\i" => '\x{012B}',
380             a => '\x{0101}',
381             ae => '\x{01E3}',
382             e => '\x{0113}',
383             g => '\x{1E21}',
384             i => '\x{012B}',
385             o => '\x{014D}',
386             u => '\x{016B}',
387             y => '\x{0233}',
388             },
389             "~" => { # with tilde
390             A => '\x{00C3}',
391             E => '\x{1EBC}',
392             I => '\x{0128}',
393             N => '\x{00D1}',
394             O => '\x{00D5}',
395             U => '\x{0168}',
396             V => '\x{1E7C}',
397             Y => '\x{1EF8}',
398             "\\I" => '\x{0128}',
399             "\\i" => '\x{0129}',
400             a => '\x{00E3}',
401             e => '\x{1EBD}',
402             i => '\x{0129}',
403             n => '\x{00F1}',
404             o => '\x{00F5}',
405             u => '\x{0169}',
406             v => '\x{1E7D}',
407             y => '\x{1EF9}',
408             },
409             );
410              
411             # Accent commands that are alphabetic.
412             #
413             our %ACCENT_LETTERS = (
414             "H" => { # with double acute
415             O => '\x{0150}',
416             U => '\x{0170}',
417             o => '\x{0151}',
418             u => '\x{0171}',
419             },
420             "c" => { # with cedilla
421             C => '\x{00C7}',
422             D => '\x{1E10}',
423             E => '\x{0228}',
424             G => '\x{0122}',
425             H => '\x{1E28}',
426             K => '\x{0136}',
427             L => '\x{013B}',
428             N => '\x{0145}',
429             R => '\x{0156}',
430             S => '\x{015E}',
431             T => '\x{0162}',
432             c => '\x{00E7}',
433             d => '\x{1E11}',
434             e => '\x{0229}',
435             g => '\x{0123}',
436             h => '\x{1E29}',
437             k => '\x{0137}',
438             l => '\x{013C}',
439             n => '\x{0146}',
440             r => '\x{0157}',
441             s => '\x{015F}',
442             t => '\x{0163}',
443             },
444             "d" => { # with dot below
445             A => '\x{1EA0}',
446             B => '\x{1E04}',
447             D => '\x{1E0C}',
448             E => '\x{1EB8}',
449             H => '\x{1E24}',
450             I => '\x{1ECA}',
451             K => '\x{1E32}',
452             L => '\x{1E36}',
453             M => '\x{1E42}',
454             N => '\x{1E46}',
455             O => '\x{1ECC}',
456             R => '\x{1E5A}',
457             S => '\x{1E62}',
458             T => '\x{1E6C}',
459             U => '\x{1EE4}',
460             V => '\x{1E7E}',
461             W => '\x{1E88}',
462             Y => '\x{1Ef4}',
463             Z => '\x{1E92}',
464             "\\I" => '\x{1ECA}',
465             "\\i" => '\x{1ECB}',
466             a => '\x{1EA1}',
467             b => '\x{1E05}',
468             d => '\x{1E0D}',
469             e => '\x{1EB9}',
470             h => '\x{1E25}',
471             i => '\x{1ECB}',
472             k => '\x{1E33}',
473             l => '\x{1E37}',
474             m => '\x{1E43}',
475             n => '\x{1E47}',
476             o => '\x{1ECD}',
477             r => '\x{1E5b}',
478             s => '\x{1E63}',
479             t => '\x{1E6D}',
480             u => '\x{1EE5}',
481             v => '\x{1E7F}',
482             w => '\x{1E89}',
483             y => '\x{1EF5}',
484             z => '\x{1E93}',
485             },
486             "h" => { # with hook above
487             A => '\x{1EA2}',
488             E => '\x{1EBA}',
489             I => '\x{1EC8}',
490             O => '\x{1ECe}',
491             U => '\x{1EE6}',
492             Y => '\x{1EF6}',
493             "\\I" => '\x{1EC8}',
494             "\\i" => '\x{1EC9}',
495             a => '\x{1EA3}',
496             e => '\x{1EBB}',
497             i => '\x{1EC9}',
498             o => '\x{1ECF}',
499             u => '\x{1EE7}',
500             y => '\x{1EF7}',
501             },
502             "k" => { # with ogonek
503             A => '\x{0104}',
504             E => '\x{0118}',
505             I => '\x{012E}',
506             O => '\x{01EA}',
507             U => '\x{0172}',
508             "\\I" => '\x{012E}',
509             "\\i" => '\x{012F}',
510             a => '\x{0105}',
511             e => '\x{0119}',
512             i => '\x{012F}',
513             o => '\x{01EB}',
514             u => '\x{0173}',
515             },
516             "r" => { # with ring above
517             A => '\x{00C5}',
518             U => '\x{016E}',
519             a => '\x{00E5}',
520             u => '\x{016F}',
521             w => '\x{1E98}',
522             y => '\x{1E99}',
523             },
524             "u" => { # with breve
525             A => '\x{0102}',
526             E => '\x{0114}',
527             G => '\x{011E}',
528             I => '\x{012C}',
529             O => '\x{014E}',
530             U => '\x{016C}',
531             "\\I" => '\x{012C}',
532             "\\i" => '\x{012D}',
533             a => '\x{0103}',
534             e => '\x{0115}',
535             g => '\x{011F}',
536             i => '\x{012D}',
537             o => '\x{014F}',
538             u => '\x{016D}',
539             },
540             "v" => { # with caron
541             A => '\x{01CD}',
542             C => '\x{010C}',
543             D => '\x{010E}',
544             DZ => '\x{01C4}',
545             E => '\x{011A}',
546             G => '\x{01E6}',
547             H => '\x{021E}',
548             I => '\x{01CF}',
549             K => '\x{01E8}',
550             L => '\x{013D}',
551             N => '\x{0147}',
552             O => '\x{01D1}',
553             R => '\x{0158}',
554             S => '\x{0160}',
555             T => '\x{0164}',
556             U => '\x{01D3}',
557             Z => '\x{017D}',
558             "\\I" => '\x{01CF}',
559             "\\i" => '\x{01D0}',
560             "\\j" => '\x{01F0}',
561             a => '\x{01CE}',
562             c => '\x{010D}',
563             d => '\x{010F}',
564             dz => '\x{01C6}',
565             e => '\x{011B}',
566             g => '\x{01E7}',
567             h => '\x{021F}',
568             i => '\x{01D0}',
569             j => '\x{01F0}',
570             k => '\x{01E9}',
571             l => '\x{013E}',
572             n => '\x{0148}',
573             o => '\x{01D2}',
574             r => '\x{0159}',
575             s => '\x{0161}',
576             t => '\x{0165}',
577             u => '\x{01D4}',
578             z => '\x{017E}',
579             },
580             );
581              
582             #
583             our %GERMAN = ( # for package `german'/`ngerman'
584             '"a' => 'ä',
585             '"A' => 'Ä',
586             '"e' => 'ë',
587             '"E' => 'Ë',
588             '"i' => 'ï',
589             '"I' => 'Ï',
590             '"o' => 'ö',
591             '"O' => 'Ö',
592             '"u' => 'ü',
593             '"U' => 'Ü',
594             '"s' => 'ß',
595             '"S' => 'SS',
596             '"z' => 'ß',
597             '"Z' => 'SZ',
598             '"ck' => 'ck', # old spelling: ck -> k-k
599             '"ff' => 'ff', # old spelling: ff -> ff-f
600             '"`' => '„',
601             "\"'" => '“',
602             '"<' => '«',
603             '">' => '»',
604             '"-' => '\x{AD}', # soft hyphen
605             '""' => '\x{200B}', # zero width space
606             '"~' => '\x{2011}', # non-breaking hyphen
607             '"=' => '-',
608             '\glq' => '‚', # left german single quote
609             '\grq' => '‘', # right german single quote
610             '\flqq' => '«',
611             '\frqq' => '»',
612             '\dq' => '"',
613             );
614              
615             1;
616              
617             __END__