maruku 0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. data/bin/maruku +25 -0
  2. data/bin/marutex +29 -0
  3. data/docs/Makefile +25 -0
  4. data/docs/char_codes.xml +884 -0
  5. data/docs/color-package-demo.aux +1 -0
  6. data/docs/color-package-demo.log +127 -0
  7. data/docs/color-package-demo.tex +149 -0
  8. data/docs/index.html +74 -0
  9. data/docs/markdown_syntax.aux +13 -0
  10. data/docs/markdown_syntax.html +266 -0
  11. data/docs/markdown_syntax.log +287 -0
  12. data/docs/markdown_syntax.md +920 -0
  13. data/docs/markdown_syntax.out +0 -0
  14. data/docs/markdown_syntax.pdf +0 -0
  15. data/docs/markdown_syntax.tex +1203 -0
  16. data/docs/maruku.aux +13 -0
  17. data/docs/maruku.html +74 -0
  18. data/docs/maruku.log +294 -0
  19. data/docs/maruku.md +394 -0
  20. data/docs/maruku.out +0 -0
  21. data/docs/maruku.pdf +0 -0
  22. data/docs/maruku.tex +548 -0
  23. data/docs/style.css +65 -0
  24. data/docs/todo.md +12 -0
  25. data/lib/maruku.rb +20 -0
  26. data/lib/maruku/parse_block.rb +577 -0
  27. data/lib/maruku/parse_span.rb +336 -0
  28. data/lib/maruku/string_utils.rb +270 -0
  29. data/lib/maruku/structures.rb +31 -0
  30. data/lib/maruku/to_html.rb +430 -0
  31. data/lib/maruku/to_latex.rb +345 -0
  32. data/lib/maruku/to_latex_strings.rb +330 -0
  33. data/tests/abbreviations.md +11 -0
  34. data/tests/blank.md +4 -0
  35. data/tests/code.md +5 -0
  36. data/tests/code2.md +8 -0
  37. data/tests/code3.md +16 -0
  38. data/tests/email.md +4 -0
  39. data/tests/entities.md +19 -0
  40. data/tests/escaping.md +14 -0
  41. data/tests/extra_dl.md +101 -0
  42. data/tests/extra_header_id.md +13 -0
  43. data/tests/extra_table1.md +40 -0
  44. data/tests/footnotes.md +17 -0
  45. data/tests/headers.md +10 -0
  46. data/tests/hrule.md +10 -0
  47. data/tests/images.md +20 -0
  48. data/tests/inline_html.md +35 -0
  49. data/tests/links.md +31 -0
  50. data/tests/list1.md +4 -0
  51. data/tests/list2.md +5 -0
  52. data/tests/list3.md +8 -0
  53. data/tests/lists.md +32 -0
  54. data/tests/lists_ol.md +39 -0
  55. data/tests/misc_sw.md +105 -0
  56. data/tests/one.md +1 -0
  57. data/tests/paragraphs.md +13 -0
  58. data/tests/sss06.md +352 -0
  59. data/tests/test.md +4 -0
  60. metadata +113 -0
@@ -0,0 +1,345 @@
1
+
2
+
3
+ class Maruku
4
+
5
+ # Render as a LaTeX fragment
6
+ def to_latex
7
+ children_to_latex
8
+ end
9
+
10
+ # Render as a complete LaTeX document
11
+ def to_latex_document
12
+ header = ""
13
+
14
+ if @doc.meta[:latex_use_listings]
15
+ header += "\\usepackage{listings}\n"
16
+ end
17
+
18
+ body = to_latex
19
+
20
+ # I found a fix!! :-)
21
+ # ## xxx only if `...` is used in footnotes
22
+ # header += "\\usepackage{fancyvrb}\n"
23
+ # body = "\\VerbatimFootnotes\n"+body
24
+
25
+ "\\documentclass{article}
26
+
27
+ #{header}
28
+ \\usepackage{hyperref}
29
+ %\\usepackage[x11names]{xcolor}
30
+ \\usepackage[usenames,dvipsnames]{color}
31
+ \\hypersetup{colorlinks=true}
32
+ \\begin{document}
33
+ #{body}
34
+ \\end{document}
35
+ "
36
+ end
37
+
38
+ end
39
+
40
+ class MDElement
41
+ DEFAULT_CODE_COLOR = '#f0f0e0'
42
+ end
43
+
44
+ class MDElement
45
+
46
+ def to_latex_hrule; "\n\\vspace{.5em} \\hrule \\vspace{.5em}\n" end
47
+ def to_latex_linebreak; "\\linebreak " end
48
+
49
+ def to_latex_paragraph;
50
+ children_to_latex+"\n\n"
51
+ end
52
+
53
+ def get_setting(name, default=nil)
54
+ self.meta[name] || @doc.meta[name] || default
55
+ end
56
+
57
+ # Returns the name to use and possibly a declaration to append
58
+ def define_color_if_necessary(color)
59
+ if color =~ /^\#(\w\w)(\w\w)(\w\w)$/
60
+ # init colors hash in document
61
+ hash = (@doc.meta[:defined_colors] ||= {})
62
+ if hash[color] then
63
+ return hash[color], nil
64
+ else
65
+ r = $1.hex; g = $2.hex; b=$3.hex
66
+
67
+ colorname = "maruku_color#{hash.size}"
68
+
69
+ # convert from 0-255 to 0.0-1.0
70
+ r = r / 255.0
71
+ g = g / 255.0
72
+ b = b / 255.0
73
+ declaration = "\\definecolor{#{colorname}}{rgb}{#{r},#{g},#{b}}\n"
74
+ hash[color] = colorname
75
+
76
+ return colorname, declaration
77
+ end
78
+ else
79
+ color
80
+ end
81
+
82
+ end
83
+
84
+ def to_latex_code;
85
+ raw_code = @meta[:raw_code]
86
+
87
+ if @doc.meta[:latex_use_listings]
88
+ # puts @meta.inspect
89
+ s = "\\lstset{columns=fixed,frame=shadowbox}"
90
+
91
+ show_spaces = get_setting(:code_show_spaces)
92
+ if show_spaces
93
+ s+= "\\lstset{showspaces=true,showtabs=true}\n"
94
+ else
95
+ s+= "\\lstset{showspaces=false,showtabs=false}\n"
96
+ end
97
+
98
+ color = get_setting(:code_background_color,DEFAULT_CODE_COLOR)
99
+ if color
100
+ colorname, declaration = define_color_if_necessary(color)
101
+ s+= declaration if declaration
102
+ s+= "\\lstset{backgroundcolor=\\color{#{colorname}}}\n"
103
+ end
104
+
105
+ s+= "\\lstset{basicstyle=\\ttfamily\\footnotesize}\n"
106
+
107
+
108
+ lang = self.meta[:lang] || @doc.meta[:code_lang] || '{}'
109
+ if lang
110
+ s += "\\lstset{language=#{lang}}\n"
111
+ end
112
+
113
+ "#{s}\n\\begin{lstlisting}\n#{raw_code}\n\\end{lstlisting}"
114
+ else
115
+ "\\begin{verbatim}#{raw_code}\\end{verbatim}\n"
116
+ end
117
+ end
118
+
119
+ TexHeaders = {
120
+ 1=>'section',
121
+ 2=>'subsection',
122
+ 3=>'subsubsection',
123
+ 4=>'paragraph'}
124
+
125
+ def to_latex_header
126
+ h = TexHeaders[@meta[:level]] || 'paragraph'
127
+ s =
128
+ # \hyperdef{category}{name}{text}
129
+
130
+ if @meta[:id]
131
+ id = @meta[:id]
132
+ if id[0,1] == '#' then id = [1,id.size] end
133
+ %{\\hypertarget{%s}{}\\%s*{{%s}}\n\n} % [ id,h, children_to_latex]
134
+
135
+ # s + "\\hypertarget{user}{#{id}}{link}"
136
+ else
137
+ %{\\%s*{%s}\n\n} % [ h, children_to_latex]
138
+ end
139
+ end
140
+
141
+ def to_latex_quote; wrap_as_environment('quote') end
142
+
143
+ def to_latex_ul; wrap_as_environment('itemize') end
144
+ def to_latex_ol; wrap_as_environment('enumerate') end
145
+ def to_latex_li;
146
+ "\\item #{children_to_latex}\n"
147
+ end
148
+ def to_latex_li_span;
149
+ "\\item #{children_to_latex}\n"
150
+ end
151
+
152
+ def to_latex_strong; wrap_as_span('\bf') end
153
+ def to_latex_emphasis; wrap_as_span('\em') end
154
+ # def to_html_header; wrap_as_element "h#{@meta[:level]}" end
155
+
156
+ def wrap_as_span(c)
157
+ "{#{c} #{children_to_latex}}"
158
+ end
159
+ def wrap_as_environment(name)
160
+ "\\begin{#{name}}%
161
+ #{children_to_latex}
162
+ \\end{#{name}}\n"
163
+ end
164
+
165
+ # the ultimate escaping
166
+ def latex_escape(source)
167
+ s="";
168
+ source.each_byte do |b| s+= "\\char%d" % b end
169
+ s
170
+ end
171
+
172
+ def to_latex_inline_code;
173
+ source = self.meta[:raw_code]
174
+
175
+ # Convert to printable latex chars (is much better than using \verb)
176
+ s=latex_escape(source)
177
+
178
+ color = get_setting(:code_background_color,DEFAULT_CODE_COLOR)
179
+ colorname, declaration = define_color_if_necessary(color)
180
+ (declaration||'')+
181
+ "\\colorbox{#{colorname}}{\\tt #{s}}"
182
+ end
183
+
184
+ def to_latex_immediate_link
185
+ url = @meta[:url]
186
+ return "\\href{#{url}}{#{url.to_latex}}"
187
+ end
188
+
189
+ def to_latex_link
190
+ id = @meta[:ref_id]
191
+ ref = @doc.refs[id]
192
+ if not ref
193
+ $stderr.puts "Could not find id = '#{id}'"
194
+ return title.to_latex
195
+ else
196
+ url = ref[:url]
197
+ #title = ref[:title] || 'no title'
198
+
199
+ if url[0,1] == '#'
200
+ url = url[1,url.size]
201
+ return "\\hyperlink{#{url}}{#{children_to_latex}}"
202
+ else
203
+ return "\\href{#{url}}{#{children_to_latex}}"
204
+ end
205
+ end
206
+ end
207
+
208
+ def to_latex_email_address
209
+ email = @meta[:email]
210
+ "\\href{mailto:#{email}}{#{latex_escape(email)}}"
211
+ end
212
+
213
+
214
+ def to_latex_table
215
+ align = @meta[:align]
216
+ num_columns = align.size
217
+
218
+ head = @children.slice(0, num_columns)
219
+ rows = []
220
+ i = num_columns
221
+ while i<@children.size
222
+ rows << @children.slice(i, num_columns)
223
+ i+=num_columns
224
+ end
225
+
226
+ h = {:center=>'c',:left=>'l',:right=>'r'}
227
+ align_string = align.map{|a| h[a]}.join('|')
228
+
229
+ s = "\\begin{tabular}{#{align_string}}\n"
230
+
231
+ s += array_to_latex(head, '&') + "\\\\" +"\n"
232
+
233
+ s += "\\hline \n"
234
+
235
+ rows.each do |row|
236
+ s += array_to_latex(row, '&') + "\\\\" +"\n"
237
+ end
238
+
239
+ s += "\\end{tabular}"
240
+
241
+ # puts table in its own paragraph
242
+ s += "\n\n"
243
+
244
+ s
245
+ end
246
+
247
+
248
+ def to_latex_head_cell; children_to_latex end
249
+ def to_latex_cell; children_to_latex end
250
+
251
+
252
+ def to_latex_footnote_reference
253
+ id = @meta[:footnote_id]
254
+ f = @doc.footnotes[id]
255
+ if f
256
+ "\\footnote{#{f.children_to_latex.strip}} "
257
+ else
258
+ $stderr.puts "Could not find footnote '#{fid}'"
259
+ end
260
+ end
261
+
262
+ def to_latex_raw_html
263
+ '{\bf Raw HTML removed in latex version }'
264
+ end
265
+
266
+ ## Definition lists ###
267
+ def to_latex_definition_list
268
+ s = "\\begin{description}\n"
269
+ s += children_to_latex
270
+ s += "\\end{description}\n"
271
+ s
272
+ end
273
+
274
+ def to_latex_definition
275
+ terms = @meta[:terms]
276
+ definitions = @meta[:definitions]
277
+
278
+ s = ""
279
+ terms.each do |t|
280
+ s +="\n\\item[#{t.children_to_latex}] "
281
+ end
282
+
283
+ definitions.each do |d|
284
+ s += "#{d.children_to_latex} \n"
285
+ end
286
+
287
+ s
288
+ end
289
+ # def to_latex_definition_term; "" end
290
+ # def to_latex_definition_data; "" end
291
+
292
+ def to_latex_abbreviation
293
+ children_to_latex
294
+ end
295
+
296
+ def to_latex_image
297
+ id = @meta[:ref_id]
298
+ ref = @doc.refs[id]
299
+ if not ref
300
+ $stderr.puts "Could not find id = '#{id}'"
301
+ ""
302
+ else
303
+ url = ref[:url]
304
+ "{\\bf Images not supported yet (#{latex_escape(url)})}"
305
+ end
306
+
307
+ end
308
+ end
309
+
310
+
311
+ # Some utilities
312
+ class MDElement
313
+
314
+ # Convert each child to html
315
+ def children_to_latex
316
+ array_to_latex(@children)
317
+ end
318
+
319
+ def array_to_latex(array, join_char='')
320
+ e = []
321
+ array.each do |c|
322
+ method = c.kind_of?(MDElement) ?
323
+ "to_latex_#{c.node_type}" : "to_latex"
324
+
325
+ if not c.respond_to?(method)
326
+ raise "Object does not answer to #{method}: #{c.class} #{c.inspect[0,100]}"
327
+ end
328
+
329
+ h = c.send(method)
330
+
331
+ if h.nil?
332
+ raise "Nil html for #{c.inspect} created with method #{method}"
333
+ end
334
+
335
+ if h.kind_of?Array
336
+ e = e + h
337
+ else
338
+ e << h
339
+ end
340
+ end
341
+ e.join(join_char)
342
+ end
343
+
344
+ end
345
+
@@ -0,0 +1,330 @@
1
+ require 'rexml/document'
2
+
3
+
4
+ class String
5
+ # escapes special characters
6
+ def to_latex
7
+ s = self
8
+ # We escape '{' before, so we can use it in convert_entities
9
+ s = s.gsub(/([\{\}])/) { |m| "\\#{m}" }
10
+ # better yet, we should use the catcode for {}
11
+ s = String.convert_entities(s)
12
+ s = s.gsub(/([\$\&\%\#\_])/) { |m| "\\#{m}" }
13
+ # s = s.gsub(/([\$\&\%\#\_\{\}])/) { |m| "\\#{m}" }
14
+ s
15
+ end
16
+
17
+ def String.convert_entities(s)
18
+ init_tables
19
+
20
+ r = s.gsub(/&([\w\d]+);/) do |match|
21
+ replace = @@entity_to_latex[match]
22
+ if replace
23
+ # puts "#{match} -> #{replace}"
24
+ replace
25
+ else
26
+ $stderr.puts "Cannot translate #{match}"
27
+ match
28
+ end
29
+ end
30
+ end
31
+
32
+ include REXML
33
+ # create hash @@entity_to_latex
34
+ def String.init_tables
35
+ ## why can't I use a class variable?
36
+ if not $conversion_table_inited
37
+ doc = Document.new XML_TABLE
38
+ @@entity_to_latex = {}
39
+ doc.elements.each("//char") do |c|
40
+ num = c.attributes['num']
41
+ name = c.attributes['name']
42
+ convert = c.attributes['convertTo']
43
+
44
+ # add space after commands
45
+ if convert[0,1] == "\\" then
46
+ convert += " "
47
+ end
48
+
49
+ convert.gsub!(/^\$/, "\\begin{math}")
50
+ convert.gsub!(/\$$/, "\\end{math}")
51
+
52
+ @@entity_to_latex["&#{num};"] = convert
53
+ @@entity_to_latex["&#{name};"] = convert
54
+
55
+ end
56
+ # puts @@entity_to_latex.inspect
57
+ $conversion_table_inited = true
58
+ end
59
+ end
60
+
61
+ # The following is a conversion chart for html elements, courtesy of ??
62
+
63
+ XML_TABLE =<<EOF
64
+ <chars>
65
+ <char num='913' name='Alpha' convertTo='$A$' />
66
+ <char num='914' name='Beta' convertTo='$B$' />
67
+ <char num='915' name='Gamma' convertTo='$\\Gamma$' />
68
+ <char num='916' name='Delta' convertTo='$\\Delta$' />
69
+ <char num='917' name='Epsilon' convertTo='$E$' />
70
+ <char num='918' name='Zeta' convertTo='$Z$' />
71
+ <char num='919' name='Eta' convertTo='$H$' />
72
+ <char num='920' name='Theta' convertTo='$\\Theta$' />
73
+ <char num='921' name='Iota' convertTo='$I$' />
74
+
75
+ <char num='922' name='Kappa' convertTo='$K$' />
76
+ <char num='923' name='Lambda' convertTo='$\\Lambda$' />
77
+ <char num='924' name='Mu' convertTo='$M$' />
78
+ <char num='925' name='Nu' convertTo='$N$' />
79
+ <char num='926' name='Xi' convertTo='$\\Xi$' />
80
+ <char num='927' name='Omicron' convertTo='$O$' />
81
+ <char num='928' name='Pi' convertTo='$\\Pi$' />
82
+ <char num='929' name='Rho' convertTo='$P$' />
83
+ <char num='931' name='Sigma' convertTo='$\\Sigma$' />
84
+
85
+ <char num='932' name='Tau' convertTo='$T$' />
86
+ <char num='933' name='Upsilon' convertTo='$Y$' />
87
+ <char num='934' name='Phi' convertTo='$\\Phi$' />
88
+ <char num='935' name='Chi' convertTo='$X$' />
89
+ <char num='936' name='Psi' convertTo='$\\Psi$' />
90
+ <char num='937' name='Omega' convertTo='$\\Omega$' />
91
+ <char num='945' name='alpha' convertTo='$\\alpha$' />
92
+ <char num='946' name='beta' convertTo='$\\beta$' />
93
+ <char num='947' name='gamma' convertTo='$\\gamma$' />
94
+
95
+ <char num='948' name='delta' convertTo='$\\delta$' />
96
+ <char num='949' name='epsilon' convertTo='$\\epsilon$' />
97
+ <char num='950' name='zeta' convertTo='$\\zeta$' />
98
+ <char num='951' name='eta' convertTo='$\\eta$' />
99
+ <char num='952' name='theta' convertTo='$\\theta$' />
100
+ <char num='953' name='iota' convertTo='$\\iota$' />
101
+ <char num='954' name='kappa' convertTo='$\\kappa$' />
102
+ <char num='955' name='lambda' convertTo='$\\lambda$' />
103
+ <char num='956' name='mu' convertTo='$\\mu$' />
104
+
105
+ <char num='957' name='nu' convertTo='$\\nu$' />
106
+ <char num='958' name='xi' convertTo='$\\xi$' />
107
+ <char num='959' name='omicron' convertTo='$o$' />
108
+ <char num='960' name='pi' convertTo='$\\pi$' />
109
+ <char num='961' name='rho' convertTo='$\\rho$' />
110
+ <char num='963' name='sigma' convertTo='$\\sigma$' />
111
+ <char num='964' name='tau' convertTo='$\\tau$' />
112
+ <char num='965' name='upsilon' convertTo='$\\upsilon$' />
113
+ <char num='966' name='phi' convertTo='$\\phi$' />
114
+
115
+ <char num='967' name='chi' convertTo='$\\chi$' />
116
+ <char num='968' name='psi' convertTo='$\\psi$' />
117
+ <char num='969' name='omega' convertTo='$\\omega$' />
118
+ <char num='962' name='sigmaf' convertTo='$\\varsigma$' />
119
+ <char num='977' name='thetasym' convertTo='$\\vartheta$' />
120
+ <char num='982' name='piv' convertTo='$\\varpi$' />
121
+ <char num='8230' name='hellip' convertTo='\\ldots' />
122
+ <char num='8242' name='prime' convertTo='$\\prime$' />
123
+ <char num='8254' name='oline' convertTo='-' />
124
+
125
+ <char num='8260' name='frasl' convertTo='/' />
126
+ <char num='8472' name='weierp' convertTo='$\\wp$' />
127
+ <char num='8465' name='image' convertTo='$\\Im$' />
128
+ <char num='8476' name='real' convertTo='$\\Re$' />
129
+ <char num='8501' name='alefsym' convertTo='$\\aleph$' />
130
+ <char num='8226' name='bull' convertTo='$\\bullet$' />
131
+ <char num='8482' name='trade' convertTo='$^{\\rm TM}$' /> <!-- \texttrademark -->
132
+ <char num='8592' name='larr' convertTo='$\\leftarrow$' />
133
+
134
+ <char num='8594' name='rarr' convertTo='$\\rightarrow$' />
135
+ <char num='8593' name='uarr' convertTo='$\\uparrow$' />
136
+ <char num='8595' name='darr' convertTo='$\\downarrow$' />
137
+ <char num='8596' name='harr' convertTo='$\\leftrightarrow$' />
138
+ <char num='8629' name='crarr' convertTo='$\\hookleftarrow$' />
139
+ <char num='8657' name='uArr' convertTo='$\\Uparrow$' />
140
+ <char num='8659' name='dArr' convertTo='$\\Downarrow$' />
141
+ <char num='8656' name='lArr' convertTo='$\\Leftarrow$' />
142
+ <char num='8658' name='rArr' convertTo='$\\Rightarrow$' />
143
+
144
+ <char num='8660' name='hArr' convertTo='$\\Leftrightarrow$' />
145
+ <char num='8704' name='forall' convertTo='$\\forall$' />
146
+ <char num='8706' name='part' convertTo='$\\partial$' />
147
+ <char num='8707' name='exist' convertTo='$\\exists$' />
148
+ <char num='8709' name='empty' convertTo='$\\emptyset$' />
149
+ <char num='8711' name='nabla' convertTo='$\\nabla$' />
150
+ <char num='8712' name='isin' convertTo='$\\in$' />
151
+ <char num='8715' name='ni' convertTo='$\\ni$' />
152
+ <char num='8713' name='notin' convertTo='$\\notin$' />
153
+
154
+ <char num='8721' name='sum' convertTo='$\\sum$' />
155
+ <char num='8719' name='prod' convertTo='$\\prod$' />
156
+ <char num='8722' name='minus' convertTo='$-$' />
157
+ <char num='8727' name='lowast' convertTo='$\\ast$' />
158
+ <char num='8730' name='radic' convertTo='$\\surd$' />
159
+ <char num='8733' name='prop' convertTo='$\\propto$' />
160
+ <char num='8734' name='infin' convertTo='$\\infty$' />
161
+ <char num='8736' name='ang' convertTo='$\\angle$' />
162
+ <char num='8743' name='and' convertTo='$\\wedge$' />
163
+
164
+ <char num='8744' name='or' convertTo='$\\vee$' />
165
+ <char num='8745' name='cup' convertTo='$\\cup$' />
166
+ <char num='8746' name='cap' convertTo='$\\cap$' />
167
+ <char num='8747' name='int' convertTo='$\\int$' />
168
+ <char num='8756' name='there4' convertTo='$\\therefore$' /> <!-- only AMS -->
169
+ <char num='8764' name='sim' convertTo='$\\sim$' />
170
+ <char num='8776' name='asymp' convertTo='$\\approx$' />
171
+ <char num='8773' name='cong' convertTo='$\\cong$' />
172
+
173
+ <char num='8800' name='ne' convertTo='$\\neq$' />
174
+ <char num='8801' name='equiv' convertTo='$\\equiv$' />
175
+ <char num='8804' name='le' convertTo='$\\leq$' />
176
+ <char num='8805' name='ge' convertTo='$\\geq$' />
177
+ <char num='8834' name='sub' convertTo='$\\subset$' />
178
+ <char num='8835' name='sup' convertTo='$\\supset$' />
179
+ <char num='8838' name='sube' convertTo='$\\subseteq$' />
180
+ <char num='8839' name='supe' convertTo='$\\supseteq$' />
181
+ <char num='8836' name='nsub' convertTo='$\\nsubset$' /> <!-- only AMS -->
182
+
183
+ <char num='8853' name='oplus' convertTo='$\\oplus$' />
184
+ <char num='8855' name='otimes' convertTo='$\\otimes$' />
185
+ <char num='8869' name='perp' convertTo='$\\perp$' />
186
+ <char num='8901' name='sdot' convertTo='$\\cdot$' />
187
+ <char num='8968' name='rceil' convertTo='$\\rceil$' />
188
+ <char num='8969' name='lceil' convertTo='$\\lceil$' />
189
+ <char num='8970' name='lfloor' convertTo='$\\lfloor$' />
190
+ <char num='8971' name='rfloor' convertTo='$\\rfloor$' />
191
+ <char num='9001' name='rang' convertTo='$\\rangle$' />
192
+
193
+ <char num='9002' name='lang' convertTo='$\\langle$' />
194
+ <char num='9674' name='loz' convertTo='$\\lozenge$' /> <!-- only AMS -->
195
+ <char num='9824' name='spades' convertTo='$\\spadesuit$' />
196
+ <char num='9827' name='clubs' convertTo='$\\clubsuit$' />
197
+ <char num='9829' name='hearts' convertTo='$\\heartsuit$' />
198
+ <char num='9830' name='diams' convertTo='$\\diamondsuit$' />
199
+ <char num='38' name='amp' convertTo='\\@AMP' />
200
+ <char num='34' name='quot' convertTo='@DOUBLEQUOT' />
201
+ <char num='169' name='copy' convertTo='\\copyright' />
202
+
203
+ <char num='60' name='lt' convertTo='$@LT$' />
204
+ <char num='62' name='gt' convertTo='$@GT$' />
205
+ <char num='338' name='OElig' convertTo='\\OE' />
206
+ <char num='339' name='oelig' convertTo='\\oe' />
207
+ <char num='352' name='Scaron' convertTo='\\v{S}' />
208
+ <char num='353' name='scaron' convertTo='\\v{s}' />
209
+ <char num='376' name='Yuml' convertTo='\\"Y' />
210
+ <char num='710' name='circ' convertTo='\\textasciicircum' />
211
+ <char num='732' name='tilde' convertTo='\\textasciitilde' />
212
+
213
+ <char num='8211' name='ndash' convertTo='--' />
214
+ <char num='8212' name='mdash' convertTo='---' />
215
+ <char num='8216' name='lsquo' convertTo='`' />
216
+ <char num='8217' name='rsquo' convertTo='@QUOT' />
217
+ <char num='8220' name='ldquo' convertTo='``' />
218
+ <char num='8221' name='rdquo' convertTo='@QUOT@QUOT' />
219
+ <char num='8224' name='dagger' convertTo='\\dag' />
220
+ <char num='8225' name='Dagger' convertTo='\\ddag' />
221
+ <char num='8240' name='permil' convertTo='\\permil' /> <!-- wasysym package -->
222
+
223
+ <char num='8364' name='euro' convertTo='\\euro' /> <!-- eurosym package -->
224
+ <char num='8249' name='lsaquo' convertTo='\\guilsinglleft' />
225
+ <char num='8250' name='rsaquo' convertTo='\\guilsinglright' />
226
+ <!-- <char num='160' name='nbsp' convertTo='\\nolinebreak' />-->
227
+ <char num='160' name='nbsp' convertTo='~' />
228
+ <char num='161' name='iexcl' convertTo='\\textexclamdown' />
229
+ <char num='163' name='pound' convertTo='\\pounds' />
230
+ <char num='164' name='curren' convertTo='\\currency' /> <!-- wasysym package -->
231
+ <char num='165' name='yen' convertTo='\\textyen' /> <!-- textcomp -->
232
+
233
+ <char num='166' name='brvbar' convertTo='\\brokenvert' /> <!-- wasysym -->
234
+ <char num='167' name='sect' convertTo='\\S' />
235
+ <char num='171' name='laquo' convertTo='\\guillemotleft' />
236
+ <char num='187' name='raquo' convertTo='\\guillemotright' />
237
+ <char num='174' name='reg' convertTo='\\textregistered' />
238
+ <char num='170' name='ordf' convertTo='\\textordfeminine' />
239
+ <char num='172' name='not' convertTo='$\\neg$' />
240
+ <char num='176' name='deg' convertTo='$\\degree$' /> <!-- mathabx -->
241
+
242
+ <char num='177' name='plusmn' convertTo='$\\pm$' />
243
+ <char num='180' name='acute' convertTo='@QUOT' />
244
+ <char num='181' name='micro' convertTo='$\\mu$' />
245
+ <char num='182' name='para' convertTo='\\P' />
246
+ <char num='183' name='middot' convertTo='$\\cdot$' />
247
+ <char num='186' name='ordm' convertTo='\\textordmasculine' />
248
+ <char num='162' name='cent' convertTo='\\cent' /> <!-- wasysym -->
249
+ <char num='185' name='sup1' convertTo='$^1$' />
250
+
251
+ <char num='178' name='sup2' convertTo='$^2$' />
252
+ <char num='179' name='sup3' convertTo='$^3$' />
253
+ <char num='189' name='frac12' convertTo='$\\frac{1}{2}$' />
254
+ <char num='188' name='frac14' convertTo='$\\frac{1}{4}$' />
255
+ <char num='190' name='frac34' convertTo='$\\frac{3}{4}' />
256
+ <char num='192' name='Agrave' convertTo='\\`A' />
257
+ <char num='193' name='Aacute' convertTo='\\@QUOTA' />
258
+ <char num='194' name='Acirc' convertTo='\\^A' />
259
+ <char num='195' name='Atilde' convertTo='\\~A' />
260
+
261
+ <char num='196' name='Auml' convertTo='\\@DOUBLEQUOTA' />
262
+ <char num='197' name='Aring' convertTo='\\AA' />
263
+ <char num='198' name='AElig' convertTo='\\AE' />
264
+ <char num='199' name='Ccedil' convertTo='\\cC' />
265
+ <char num='200' name='Egrave' convertTo='\\`E' />
266
+ <char num='201' name='Eacute' convertTo='\\@QUOTE' />
267
+ <char num='202' name='Ecirc' convertTo='\\^E' />
268
+ <char num='203' name='Euml' convertTo='\\@DOUBLEQUOTE' />
269
+ <char num='204' name='Igrave' convertTo='\\`I' />
270
+
271
+ <char num='205' name='Iacute' convertTo='\\@QUOTI' />
272
+ <char num='206' name='Icirc' convertTo='\\^I' />
273
+ <char num='207' name='Iuml' convertTo='\\"I' />
274
+ <char num='208' name='ETH' convertTo='$\\eth$' /> <!-- AMS -->
275
+ <char num='209' name='Ntilde' convertTo='\\~N' />
276
+ <char num='210' name='Ograve' convertTo='\\`O' />
277
+ <char num='211' name='Oacute' convertTo='\\@QUOTO' />
278
+ <char num='212' name='Ocirc' convertTo='\\^O' />
279
+ <char num='213' name='Otilde' convertTo='\\~O' />
280
+
281
+ <char num='214' name='Ouml' convertTo='\\@DOUBLEQUOTO' />
282
+ <char num='215' name='times' convertTo='$\\times$' />
283
+ <char num='216' name='Oslash' convertTo='\\O' />
284
+ <char num='217' name='Ugrave' convertTo='\\`U' />
285
+ <char num='218' name='Uacute' convertTo='\\@QUOTU' />
286
+ <char num='219' name='Ucirc' convertTo='\\^U' />
287
+ <char num='220' name='Uuml' convertTo='\\@DOUBLEQUOTU' />
288
+ <char num='221' name='Yacute' convertTo='\\@QUOTY' />
289
+ <char num='222' name='THORN' convertTo='\\Thorn' /> <!-- wasysym -->
290
+
291
+ <char num='223' name='szlig' convertTo='\\ss' />
292
+ <char num='224' name='agrave' convertTo='\\`a' />
293
+ <char num='225' name='aacute' convertTo='\\@QUOTa' />
294
+ <char num='226' name='acirc' convertTo='\\^a' />
295
+ <char num='227' name='atilde' convertTo='\\~a' />
296
+ <char num='228' name='auml' convertTo='\\@DOUBLEQUOTa' />
297
+ <char num='229' name='aring' convertTo='\\aa' />
298
+ <char num='230' name='aelig' convertTo='\\ae' />
299
+ <char num='231' name='ccedil' convertTo='\\cc' />
300
+
301
+ <char num='232' name='egrave' convertTo='\\`e' />
302
+ <char num='233' name='eacute' convertTo='\\@QUOTe' />
303
+ <char num='234' name='ecirc' convertTo='\\^e' />
304
+ <char num='235' name='euml' convertTo='\\@DOUBLEQUOTe' />
305
+ <char num='236' name='igrave' convertTo='\\`i' />
306
+ <char num='237' name='iacute' convertTo='\\@QUOTi' />
307
+ <char num='238' name='icirc' convertTo='\\^i' />
308
+ <char num='239' name='iuml' convertTo='\\@DOUBLEQUOTi' />
309
+ <char num='240' name='eth' convertTo='$\\eth$' /> <!-- -->
310
+
311
+ <char num='241' name='ntilde' convertTo='\\~n' />
312
+ <char num='242' name='ograve' convertTo='\\`o' />
313
+ <char num='243' name='oacute' convertTo='\\@QUOTo' />
314
+ <char num='244' name='ocirc' convertTo='\\^o' />
315
+ <char num='245' name='otilde' convertTo='\\~o' />
316
+ <char num='246' name='ouml' convertTo='\\@DOUBLEQUOTo' />
317
+ <char num='247' name='divide' convertTo='$\\divide$' />
318
+ <char num='248' name='oslash' convertTo='\\o' />
319
+ <char num='249' name='ugrave' convertTo='\\`u' />
320
+ <char num='250' name='uacute' convertTo='\\@QUOTu' />
321
+
322
+ <char num='251' name='ucirc' convertTo='\\^u' />
323
+ <char num='252' name='uuml' convertTo='\\@DOUBLEQUOTu' />
324
+ <char num='253' name='yacute' convertTo='\\@QUOTy' />
325
+ <char num='254' name='thorn' convertTo='\\thorn' /> <!-- wasysym -->
326
+ <char num='255' name='yuml' convertTo='\\@DOUBLEQUOTy' />
327
+ </chars>
328
+ EOF
329
+
330
+ end