Neuron®
The Neuron® is the basis for the creation of open and secure federated networks for smart societies.
Loading...
Searching...
No Matches
LatexRenderer.cs
1using SkiaSharp;
2using System;
4using System.Text;
5using System.Threading.Tasks;
6using System.Xml;
13using Waher.Events;
15using Waher.Script;
19
21{
25 public class LatexRenderer : Renderer
26 {
31
32 private bool inAbstract = false;
33 private bool abstractOutput = false;
34
40 : base()
41 {
42 this.LatexSettings = LatexSettings;
43 }
44
51 : base(Output)
52 {
53 this.LatexSettings = LatexSettings;
54 }
55
59 public override Task RenderDocumentHeader()
60 {
61 bool MakeTitle = false;
62
63 this.Output.Append("\\documentclass[");
64 this.Output.Append(this.LatexSettings.DefaultFontSize.ToString());
65 this.Output.Append("pt, ");
66
67 switch (this.LatexSettings.PaperFormat)
68 {
69 case LaTeXPaper.A4:
70 default:
71 this.Output.Append("a4paper");
72 break;
73
74 case LaTeXPaper.Letter:
75 this.Output.Append("letterpaper");
76 break;
77 }
78
79 this.Output.Append("]{");
80 switch (this.LatexSettings.DocumentClass)
81 {
82 case LaTeXDocumentClass.Article:
83 default:
84 this.Output.Append("article");
85 break;
86
87 case LaTeXDocumentClass.Report:
88 this.Output.Append("report");
89 break;
90
91 case LaTeXDocumentClass.Book:
92 this.Output.Append("book");
93 break;
94
95 case LaTeXDocumentClass.Standalone:
96 this.Output.Append("standalone");
97 break;
98 }
99 this.Output.AppendLine("}");
100
101 // Strike-out cf. https://tex.stackexchange.com/questions/546884/strikethrough-command-in-latex
102 this.Output.AppendLine("\\newlength{\\wdth}");
103 this.Output.AppendLine("\\newcommand{\\strike}[1]{\\settowidth{\\wdth}{#1}\\rlap{\\rule[.5ex]{\\wdth}{.4pt}}#1}");
104
105 if (this.Document.TryGetMetaData("TITLE", out KeyValuePair<string, bool>[] Values))
106 {
107 MakeTitle = true;
108
109 foreach (KeyValuePair<string, bool> P in Values)
110 {
111 this.Output.Append("\\title{");
112 this.Output.Append(P.Key);
113 this.Output.AppendLine("}");
114 }
115
116 if (this.Document.TryGetMetaData("SUBTITLE", out Values))
117 {
118 foreach (KeyValuePair<string, bool> P2 in Values)
119 {
120 this.Output.Append("\\subtitle{");
121 this.Output.Append(P2.Key);
122 this.Output.AppendLine("}");
123 }
124 }
125 }
126
127 if (this.Document.TryGetMetaData("AUTHOR", out Values))
128 {
129 MakeTitle = true;
130
131 bool First = true;
132
133 foreach (KeyValuePair<string, bool> P in Values)
134 {
135 if (First)
136 {
137 this.Output.AppendLine("\\author{");
138 First = false;
139 }
140 else
141 this.Output.AppendLine("\\and");
142
143 this.Output.AppendLine(P.Key);
144 }
145
146 this.Output.AppendLine("}");
147 }
148
149 if (this.Document.TryGetMetaData("DATE", out Values))
150 {
151 MakeTitle = true;
152
153 foreach (KeyValuePair<string, bool> P in Values)
154 {
155 this.Output.Append("\\date{");
156 this.Output.Append(P.Key);
157 this.Output.AppendLine("}");
158 }
159 }
160
161 // Todo-lists in LaTeX, cf. https://tex.stackexchange.com/questions/247681/how-to-create-checkbox-todo-list
162
163 this.Output.AppendLine("\\usepackage[utf8]{inputenc}");
164 this.Output.AppendLine("\\usepackage[T1]{fontenc}");
165 this.Output.AppendLine("\\usepackage{enumitem}");
166 this.Output.AppendLine("\\usepackage{amsmath}");
167 this.Output.AppendLine("\\usepackage{amssymb}");
168
169 this.Output.Append("\\usepackage");
170 if (!string.IsNullOrEmpty(this.LatexSettings.Language))
171 {
172 this.Output.Append("[");
173 this.Output.Append(EscapeLaTeX(this.LatexSettings.Language));
174 this.Output.Append("]");
175 }
176 this.Output.AppendLine("{babel}");
177
178 this.Output.AppendLine("\\usepackage{graphicx}");
179 this.Output.AppendLine("\\usepackage{pifont}");
180 this.Output.AppendLine("\\usepackage{multirow}");
181 this.Output.AppendLine("\\usepackage{ragged2e}");
182 this.Output.AppendLine("\\usepackage{textcomp}");
183 this.Output.AppendLine("\\usepackage{spverbatim}");
184 this.Output.AppendLine("\\newlist{tasklist}{itemize}{2}");
185 this.Output.AppendLine("\\setlist[tasklist]{label=$\\square$}");
186 this.Output.AppendLine("\\newcommand{\\checkmarksymbol}{\\ding{51}}");
187 this.Output.AppendLine("\\newcommand{\\checked}{\\rlap{$\\square$}{\\raisebox{2pt}{\\large\\hspace{1pt}\\checkmarksymbol}}\\hspace{-2.5pt}}");
188 this.Output.AppendLine("\\begin{document}");
189
190 if (MakeTitle)
191 this.Output.AppendLine("\\maketitle");
192
193 this.inAbstract = false;
194 this.abstractOutput = false;
195
196 return Task.CompletedTask;
197 }
198
202 public override Task RenderDocumentFooter()
203 {
204 if (this.inAbstract)
205 {
206 this.Output.AppendLine("\\end{abstract}");
207 this.inAbstract = false;
208 }
209
210 this.Output.AppendLine("\\end{document}");
211
212 return Task.CompletedTask;
213 }
214
220 public static string EscapeLaTeX(string s)
221 {
222 return CommonTypes.Escape(s, latexCharactersToEscape, latexCharacterEscapes);
223 }
224
225 private static readonly char[] latexCharactersToEscape = new char[]
226 {
227 '\\',
228 '#',
229 '$',
230 '%',
231 '&',
232 '{',
233 '}',
234 '_',
235 '~',
236 '^'
237 };
238
239 private static readonly string[] latexCharacterEscapes = new string[]
240 {
241 "\\textbackslash",
242 "\\#",
243 "\\$",
244 "\\%",
245 "\\&",
246 "\\{",
247 "\\}",
248 "\\_",
249 "\\textasciitilde",
250 "\\textasciicircum"
251 };
252
253 #region Span Elements
254
259 public override Task Render(Abbreviation Element)
260 {
261 return this.RenderChildren(Element);
262 }
263
268 public override Task Render(AutomaticLinkMail Element)
269 {
270 this.Output.AppendLine(EscapeLaTeX(Element.EMail));
271
272 return Task.CompletedTask;
273 }
274
279 public override Task Render(AutomaticLinkUrl Element)
280 {
281 this.Output.AppendLine(EscapeLaTeX(Element.URL));
282
283 return Task.CompletedTask;
284 }
285
290 public override async Task Render(Delete Element)
291 {
292 this.Output.Append("\\strike{");
293 await this.RenderChildren(Element);
294 this.Output.Append('}');
295 }
296
301 public override Task Render(DetailsReference Element)
302 {
303 if (!(this.Document.Detail is null))
304 return this.RenderDocument(this.Document.Detail, true);
305 else
306 return this.Render((MetaReference)Element);
307 }
308
313 public override Task Render(EmojiReference Element)
314 {
315 this.Output.AppendLine(EscapeLaTeX(Element.Emoji.Unicode));
316
317 return Task.CompletedTask;
318 }
319
324 public override async Task Render(Emphasize Element)
325 {
326 this.Output.Append("\\emph{");
327 await this.RenderChildren(Element);
328 this.Output.Append('}');
329 }
330
335 public override async Task Render(FootnoteReference Element)
336 {
337 if (this.Document?.TryGetFootnote(Element.Key, out Footnote Footnote) ?? false)
338 {
339 if (Element.AutoExpand)
340 await this.Render(Footnote);
341 else
342 {
343 this.Output.Append("\\footnote");
344
345 if (this.Document?.TryGetFootnoteNumber(Element.Key, out int Nr) ?? false)
346 {
347 this.Output.Append('[');
348 this.Output.Append(Nr.ToString());
349 this.Output.Append(']');
350 }
351
352 this.Output.Append('{');
353 await this.Render(Footnote);
354 this.Output.Append('}');
355 }
356 }
357 }
358
363 public override Task Render(HashTag Element)
364 {
365 this.Output.Append("\\#");
366 this.Output.Append(Element.Tag);
367
368 return Task.CompletedTask;
369 }
370
375 public override Task Render(HtmlEntity Element)
376 {
377 string s = GetLaTeXEscapeCommand(Element.Entity);
378 if (string.IsNullOrEmpty(s))
379 this.Output.Append(EscapeLaTeX(Html.HtmlEntity.EntityToCharacter(Element.Entity)));
380 else if (IsEquationCommand(s))
381 {
382 this.Output.Append('$');
383 this.Output.Append(s);
384 this.Output.Append('$');
385 }
386 else if (AllSymbols(s))
387 this.Output.Append(s);
388 else
389 {
390 this.Output.Append('{');
391 this.Output.Append(s);
392 this.Output.Append('}');
393 }
394
395 return Task.CompletedTask;
396 }
397
398 private static bool AllSymbols(string Command)
399 {
400 foreach (char ch in Command)
401 {
402 if (!char.IsLetter(ch) || char.IsDigit(ch))
403 return false;
404 }
405
406 return true;
407 }
408
409 private static bool IsEquationCommand(string Command)
410 {
411 switch (Command)
412 {
413 // Relational Operators
414 case "\\leq":
415 case "\\geq":
416 case "\\neq":
417 case "\\approx":
418 case "\\equiv":
419 case "\\propto":
420 case "\\sim":
421 case "\\simeq":
422 case "\\cong":
423 case "\\asymp":
424 case "\\doteq":
425 case "\\bowtie":
426 case "\\models":
427 case "\\perp":
428 case "\\parallel":
429 case "\\nparallel":
430 case "\\subset":
431 case "\\supset":
432 case "\\subseteq":
433 case "\\supseteq":
434 case "\\nsubseteq":
435 case "\\nsupseteq":
436 case "\\subsetneq":
437 case "\\supsetneq":
438 case "\\in":
439 case "\\ni":
440 case "\\notin":
441 case "\\vdash":
442 case "\\dashv":
443 case "\\Vdash":
444 case "\\vDash":
445 case "\\nvdash":
446 case "\\nvDash":
447 case "\\nVdash":
448 case "\\nVDash":
449
450 // Arithmetic Operators
451 case "\\pm":
452 case "\\mp":
453 case "\\times":
454 case "\\div":
455 case "\\cdot":
456 case "\\ast":
457 case "\\star":
458 case "\\circ":
459 case "\\bullet":
460 case "\\oplus":
461 case "\\ominus":
462 case "\\otimes":
463 case "\\oslash":
464 case "\\odot":
465 case "\\bigoplus":
466 case "\\bigotimes":
467 case "\\bigodot":
468 case "\\sum":
469 case "\\prod":
470 case "\\coprod":
471 case "\\int":
472 case "\\iint":
473 case "\\iiint":
474 case "\\oint":
475 case "\\bigcup":
476 case "\\bigcap":
477 case "\\bigsqcup":
478 case "\\biguplus":
479 case "\\bigvee":
480 case "\\bigwedge":
481
482 // Greek Letters
483 case "\\alpha":
484 case "\\beta":
485 case "\\gamma":
486 case "\\delta":
487 case "\\epsilon":
488 case "\\zeta":
489 case "\\eta":
490 case "\\theta":
491 case "\\iota":
492 case "\\kappa":
493 case "\\lambda":
494 case "\\mu":
495 case "\\nu":
496 case "\\xi":
497 case "\\pi":
498 case "\\rho":
499 case "\\sigma":
500 case "\\tau":
501 case "\\upsilon":
502 case "\\phi":
503 case "\\chi":
504 case "\\psi":
505 case "\\omega":
506 case "\\Gamma":
507 case "\\Delta":
508 case "\\Theta":
509 case "\\Lambda":
510 case "\\Xi":
511 case "\\Pi":
512 case "\\Sigma":
513 case "\\Upsilon":
514 case "\\Phi":
515 case "\\Psi":
516 case "\\Omega":
517
518 // Miscellaneous Symbols
519 case "\\infty":
520 case "\\partial":
521 case "\\nabla":
522 case "\\forall":
523 case "\\exists":
524 case "\\neg":
525 case "\\land":
526 case "\\lor":
527 case "\\Rightarrow":
528 case "\\Leftarrow":
529 case "\\Leftrightarrow":
530 case "\\rightarrow":
531 case "\\leftarrow":
532 case "\\leftrightarrow":
533 case "\\uparrow":
534 case "\\downarrow":
535 case "\\updownarrow":
536 case "\\Uparrow":
537 case "\\Downarrow":
538 case "\\Updownarrow":
539 case "\\square":
540 case "\\blacksquare":
541 case "\\triangle":
542 case "\\blacktriangle":
543 case "\\diamond":
544 case "\\blacklozenge":
545 case "\\lozenge":
546 case "\\angle":
547 case "\\measuredangle":
548 case "\\sphericalangle":
549 case "\\perthousand":
550 case "\\degree":
551 case "\\prime":
552 case "\\doubleprime":
553 case "\\backslash":
554 case "\\setminus":
555 case "\\cup":
556 case "\\cap":
557 case "\\uplus":
558 case "\\sqcup":
559 case "\\sqcap":
560 case "\\vee":
561 case "\\wedge":
562 case "\\cdots":
563 case "\\vdots":
564 case "\\ddots":
565 case "\\aleph":
566 case "\\beth":
567 case "\\gimel":
568 case "\\daleth":
569 case "\\hbar":
570 case "\\imath":
571 case "\\jmath":
572 case "\\ell":
573 case "\\wp":
574 case "\\Re":
575 case "\\Im":
576 case "\\mho":
577 case "\\eth":
578 case "\\textmu":
579 case "\\textpm":
580 case "\\textdiv":
581 case "\\texttimes":
582 case "\\textdegree":
583 case "\\textasciicircum":
584 case "\\textasciitilde":
585 case "\\textbackslash":
586 case "\\textbar":
587 case "\\textbraceleft":
588 case "\\textbraceright":
589 case "\\textbullet":
590 case "\\textdagger":
591 case "\\textdaggerdbl":
592 case "\\textellipsis":
593 case "\\textemdash":
594 case "\\textendash":
595 case "\\textgreater":
596 case "\\textless":
597 case "\\textquotedblleft":
598 case "\\textquotedblright":
599 case "\\textquoteleft":
600 case "\\textquoteright":
601 case "\\textsection":
602 case "\\textsterling":
603 case "\\textunderscore":
604 case "\\textvisiblespace":
605 case "\\textcent":
606 case "\\textcurrency":
607 case "\\textyen":
608 case "\\textnumero":
609 case "\\textcircledP":
610 case "\\textregistered":
611 case "\\texttrademark":
612 case "\\textcopyright":
613 case "\\textordfeminine":
614 case "\\textordmasculine":
615 case "\\textparagraph":
616 return true;
617
618 default:
619 return false;
620 }
621 }
622
623 private static string GetLaTeXEscapeCommand(string Entity)
624 {
625 // Ref (with alterations): https://gist.github.com/adityam/1431606
626
627 switch (Entity)
628 {
629 case "cups": return "\\cup";
630 case "boxplus": return "\\boxplus";
631 case "DoubleLongLeftRightArrow": return "\\Longleftrightarrow";
632 case "szlig": return "\\ssharp";
633 case "xoplus": return "\\bigoplus";
634 case "ensp": return "\\space";
635 case "upharpoonleft": return "\\upharpoonleft";
636 case "ClockwiseContourIntegral": return "\\ointclockwise";
637 case "THgr": return "\\greekTheta";
638 case "nbsp": return "\\breakspace";
639 case "YUcy": return "\\ cyrillicYU";
640 case "excl": return "\\ot defined";
641 case "GreaterLess": return "\\gtrless";
642 case "PHgr": return "\\greekPhi";
643 case "OHgr": return "\\ greekOmega";
644 case "KHgr": return "\\ greekChi";
645 case "NotExists": return "\\nexists";
646 case "lne": return "\\lneq";
647 case "prnE": return "\\precneqq";
648 case "eqsim": return "\\eqsim";
649 case "bne": return "\\eq";
650 case "prE": return "\\preceqq";
651 case "gne": return "\\rneq";
652 case "Vdash": return "\\Vdash";
653 case "plusmn": return "\\textpm";
654 case "nexist": return "\\nexists";
655 case "succneqq": return "\\succneqq";
656 case "nsubseteq": return "\\nsubseteq";
657 case "leftarrow": return "\\leftarrow";
658 case "nges": return "\\geqslant";
659 case "TScy": return "\\cyrillicC";
660 case "NotLeftTriangleEqual": return "\\ntrianglelefteq";
661 case "lowast": return "\\ast";
662 case "gneqq": return "\\gneqq";
663 case "rang": return "\\rangle";
664 case "plusdo": return "\\dotplus";
665 case "lneqq": return "\\lneqq";
666 case "nang": return "\\angle";
667 case "lang": return "\\langle";
668 case "NotLessGreater": return "\\nlessgtr";
669 case "ngeqslant": return "\\geqslant";
670 case "Leftarrow": return "\\Leftarrow";
671 case "DoubleLongRightArrow": return "\\Longrightarrow";
672 case "gtreqqless": return "\\gtreqqless";
673 case "npre": return "\\preceq";
674 case "Rang": return "\\rrangle";
675 case "DScy": return "\\ cyrillicDZE";
676 case "Lang": return "\\llangle";
677 case "emsp": return "\\space";
678 case "infin": return "\\infty";
679 case "leqq": return "\\leqq";
680 case "cent": return "\\textcent";
681 case "PlusMinus": return "\\textpm";
682 case "nleqq": return "\\leqq";
683 case "dotplus": return "\\dotplus";
684 case "PrecedesSlantEqual": return "\\preccurlyeq";
685 case "gtrsim": return "\\gtrsim";
686 case "lvnE": return "\\lneqq";
687 case "TRADE": return "\\trademark";
688 case "brvbar": return "\\textbrokenbar";
689 case "rightsquigarrow": return "\\rightwavearrow";
690 case "DownArrow": return "\\downarrow";
691 case "nVDash": return "\\nVDash";
692 case "Hat": return "\\textasciicircum";
693 case "sup3": return "\\threesuperior";
694 case "EEgr": return "\\greekEta";
695 case "bepsi": return "\\backepsilon";
696 case "gnsim": return "\\gnsim";
697 case "upharpoonright": return "\\upharpoonright";
698 case "lnsim": return "\\lnsim";
699 case "Sum": return "\\sum";
700 case "gvnE": return "\\gneqq";
701 case "prnsim": return "\\precnsim";
702 case "fork": return "\\pitchfork";
703 case "Vee": return "\\bigvee";
704 case "NotPrecedes": return "\\nprec";
705 case "Wedge": return "\\bigwedge";
706 case "rightharpoondown": return "\\rightharpoondown";
707 case "ETH": return "\\Eth";
708 case "eqslantgtr": return "\\eqslantgtr";
709 case "vee": return "\\vee";
710 case "supsetneqq": return "\\supsetneqq";
711 case "PrecedesTilde": return "\\precsim";
712 case "UpperRightArrow": return "\\nearrow";
713 case "ngE": return "\\geqq";
714 case "Downarrow": return "\\Downarrow";
715 case "NegativeVeryThinSpace": return "\\zerowidthspace";
716 case "isinv": return "\\in";
717 case "Sqrt": return "\\surd";
718 case "xuplus": return "\\biguplus";
719 case "sum": return "\\sum";
720 case "ngeqq": return "\\geqq";
721 case "lAarr": return "\\Lleftarrow";
722 case "Phi": return "\\greekPhi";
723 case "downarrow": return "\\downarrow";
724 case "prsim": return "\\precsim";
725 case "cap": return "\\cap";
726 case "rAarr": return "\\Rrightarrow";
727 case "ring": return "\\textring";
728 case "map": return "\\mapsto";
729 case "nap": return "\\napprox";
730 case "lap": return "\\lessapprox";
731 case "vdash": return "\\vdash";
732 case "gap": return "\\gtrapprox";
733 case "Chi": return "\\greekChi";
734 case "hksearow": return "\\lhooksearrow";
735 case "Idigr": return "\\greekIotadialytika";
736 case "trade": return "\\trademark";
737 case "mdash": return "\\emdash";
738 case "ndash": return "\\endash";
739 case "odash": return "\\circleddash";
740 case "mapstoleft": return "\\mapsfrom";
741 case "DD": return "\\differentialD";
742 case "Bumpeq": return "\\Bumpeq";
743 case "Cap": return "\\Cap";
744 case "curlyvee": return "\\curlyvee";
745 case "coloneq": return "\\colonequals";
746 case "kappa": return "\\ greekkappa";
747 case "mapsto": return "\\mapsto";
748 case "chi": return "\\greekchi";
749 case "nlE": return "\\leqq";
750 case "nlsim": return "\\nlesssim";
751 case "inodot": return "\\dotlessi";
752 case "sharp": return "\\sharp";
753 case "Omicron": return "\\ greekOmicron";
754 case "therefore": return "\\therefore";
755 case "udigr": return "\\greekupsilondiaeresis";
756 case "mnplus": return "\\mp";
757 case "wedge": return "\\wedge";
758 case "Kappa": return "\\greekKappa";
759 case "supset": return "\\supset";
760 case "lessdot": return "\\lessdot";
761 case "CounterClockwiseContourIntegral": return "\\ointctrclockwise";
762 case "bigwedge": return "\\bigwedge";
763 case "eeacgr": return "\\greeketatonos";
764 case "NotSubsetEqual": return "\\nsubseteq";
765 case "lE": return "\\leqq";
766 case "Therefore": return "\\therefore";
767 case "Udigr": return "\\greekUpsilondialytika";
768 case "gE": return "\\geqq";
769 case "gnE": return "\\gneqq";
770 case "vnsup": return "\\supset";
771 case "Supset": return "\\Supset";
772 case "lnE": return "\\lneqq";
773 case "idigr": return "\\greekiotadialytika";
774 case "hkswarow": return "\\rhookswarrow";
775 case "Copf": return "\\ complexes";
776 case "Nopf": return "\\ naturalnumbers";
777 case "Ropf": return "\\ reals";
778 case "Popf": return "\\ primes";
779 case "Qopf": return "\\rationals";
780 case "Otilde": return "\\ Otilde";
781 case "oS": return "\\circledS";
782 case "para": return "\\paragraphmark";
783 case "utilde": return "\\ utilde";
784 case "NotPrecedesSlantEqual": return "\\npreccurlyeq";
785 case "bigotimes": return "\\bigotimes";
786 case "LeftVector": return "\\leftharpoonup";
787 case "geq": return "\\geq";
788 case "checkmark": return "\\checkmark";
789 case "leq": return "\\leq";
790 case "scnE": return "\\succneqq";
791 case "Conint": return "\\oiint";
792 case "RightVector": return "\\rightharpoonup";
793 case "ffllig": return "\\fflligature";
794 case "bowtie": return "\\bowtie";
795 case "nrightarrow": return "\\nrightarrow";
796 case "UpArrowDownArrow": return "\\updownarrows";
797 case "veeeq": return "\\veeeq";
798 case "Zopf": return "\\integers";
799 case "Itilde": return "\\Itilde";
800 case "nearhk": return "\\rhooknearrow";
801 case "PartialD": return "\\partial";
802 case "Atilde": return "\\Atilde";
803 case "Rrightarrow": return "\\Rrightarrow";
804 case "Succeeds": return "\\succ";
805 case "Auml": return "\\Adiaeresis";
806 case "nhArr": return "\\nLeftrightarrow";
807 case "upsi": return "\\greekupsilon";
808 case "xhArr": return "\\Longleftrightarrow";
809 case "Ouml": return "\\Odiaeresis";
810 case "quot": return "\\quotedbl";
811 case "epsi": return "\\greekepsilon";
812 case "Iuml": return "\\Idiaeresis";
813 case "Euml": return "\\Ediaeresis";
814 case "precsim": return "\\precsim";
815 case "notni": return "\\nni";
816 case "nvdash": return "\\nvdash";
817 case "notinva": return "\\nin";
818 case "backepsilon": return "\\backepsilon";
819 case "Rightarrow": return "\\Rightarrow";
820 case "LeftTeeArrow": return "\\mapsfrom";
821 case "OverParenthesis": return "\\overparent";
822 case "NotCongruent": return "\\nequiv";
823 case "ohacgr": return "\\greekomegatonos";
824 case "Assign": return "\\colonequals";
825 case "rhov": return "\\greekrhoalt";
826 case "yuml": return "\\ydiaeresis";
827 case "cuepr": return "\\curlyeqprec";
828 case "uuml": return "\\udiaeresis";
829 case "lsqb": return "\\lbrack";
830 case "rsqb": return "\\rbrack";
831 case "rbrack": return "\\rbrack";
832 case "lbrack": return "\\lbrack";
833 case "efDot": return "\\fallingdotseq";
834 case "pre": return "\\preceq";
835 case "auml": return "\\adiaeresis";
836 case "Intersection": return "\\bigcap";
837 case "DoubleRightArrow": return "\\Rightarrow";
838 case "Yuml": return "\\Ydiaeresis";
839 case "Uuml": return "\\Udiaeresis";
840 case "ouml": return "\\odiaeresis";
841 case "leftrightharpoons": return "\\leftrightharpoons";
842 case "iuml": return "\\idiaeresis";
843 case "euml": return "\\ediaeresis";
844 case "LongLeftRightArrow": return "\\longleftrightarrow";
845 case "DoubleVerticalBar": return "\\parallel";
846 case "vsubnE": return "\\subsetneqq";
847 case "abreve": return "\\abreve";
848 case "NotLessLess": return "\\ll";
849 case "eta": return "\\greeketa";
850 case "gvertneqq": return "\\gneqq";
851 case "UpArrow": return "\\uparrow";
852 case "nge": return "\\ngeq";
853 case "NotSucceeds": return "\\nsucc";
854 case "Ubreve": return "\\Ubreve";
855 case "VerticalBar": return "\\divides";
856 case "Updownarrow": return "\\Updownarrow";
857 case "gbreve": return "\\gbreve";
858 case "Abreve": return "\\Abreve";
859 case "part": return "\\partial";
860 case "oint": return "\\oint";
861 case "Eta": return "\\greekEta";
862 case "RightTeeArrow": return "\\mapsto";
863 case "NotRightTriangle": return "\\ntriangleleft";
864 case "updownarrow": return "\\updownarrow";
865 case "Gbreve": return "\\Gbreve";
866 case "LeftFloor": return "\\lfloor";
867 case "sqcup": return "\\sqcup";
868 case "zwnj": return "\\zwnj";
869 case "subseteqq": return "\\subseteqq";
870 case "circledast": return "\\circledast";
871 case "dblac": return "\\texthungarumlaut";
872 case "VeryThinSpace  ": return "\\irspace";
873 case "thicksim": return "\\sim";
874 case "SquareUnion": return "\\sqcup";
875 case "ubreve": return "\\ubreve";
876 case "zigrarr": return "\\rightsquigarrow";
877 case "NonBreakingSpace ": return "\\breakspace";
878 case "gEl": return "\\gtreqqless";
879 case "npart": return "\\partial";
880 case "ShortRightArrow": return "\\rightarrow";
881 case "nLl": return "\\lll";
882 case "npr": return "\\nprec";
883 case "ulcorn": return "\\ulcorner";
884 case "period": return "\\mathperiod";
885 case "SuchThat": return "\\ni";
886 case "MinusPlus": return "\\mp";
887 case "NotLessTilde": return "\\nlesssim";
888 case "Element": return "\\in";
889 case "precapprox": return "\\precapprox";
890 case "ShortDownArrow": return "\\downarrow";
891 case "THORN": return "\\Thorn";
892 case "omacr": return "\\omacron";
893 case "LT": return "\\lt";
894 case "vartheta": return "\\greekthetaalt";
895 case "nle": return "\\nleq";
896 case "PSgr": return "\\greekPsi";
897 case "GT": return "\\gt";
898 case "dlcorn": return "\\llcorner";
899 case "DoubleLongLeftArrow": return "\\Longleftarrow";
900 case "CircleTimes": return "\\otimes";
901 case "QUOT": return "\\quotedbl";
902 case "Imacr": return "\\Imacron";
903 case "Omacr": return "\\Omacron";
904 case "DDotrahd": return "\\dottedrightarrow";
905 case "angle": return "\\angle";
906 case "Umacr": return "\\Umacron";
907 case "xvee": return "\\bigvee";
908 case "die": return "\\textdiaeresis";
909 case "Vert": return "\\Vert";
910 case "emacr": return "\\emacron";
911 case "nparallel": return "\\nparallel";
912 case "nsccue": return "\\nsucccurlyeq";
913 case "Amacr": return "\\Amacron";
914 case "Emacr": return "\\Emacron";
915 case "ThickSpace   ": return "\\dspace";
916 case "Iota": return "\\greekIota";
917 case "blacktriangleright": return "\\blacktriangleleft";
918 case "scnsim": return "\\succnsim";
919 case "nlArr": return "\\nLeftarrow";
920 case "circeq": return "\\circeq";
921 case "acute": return "\\textacute";
922 case "Backslash": return "\\setminus";
923 case "ncong": return "\\approxnEq";
924 case "leftleftarrows": return "\\leftleftarrows";
925 case "varkappa": return "\\varkappa";
926 case "LongRightArrow": return "\\longrightarrow";
927 case "plusb": return "\\boxplus";
928 case "longmapsto": return "\\longmapsto";
929 case "circlearrowleft": return "\\circlearrowright";
930 case "CloseCurlyQuote": return "\\textquoteright";
931 case "bnequiv": return "\\equiv";
932 case "iota": return "\\greekiota";
933 case "compfn": return "\\circ";
934 case "nrarrw": return "\\rightwavearrow";
935 case "and": return "\\wedge";
936 case "ntriangleleft": return "\\ntriangleright";
937 case "varsubsetneq": return "\\subsetneq";
938 case "Gdot": return "\\Gdotaccent";
939 case "middot": return "\\periodcentered";
940 case "Idot": return "\\Idotaccent";
941 case "lEg": return "\\lesseqqgtr";
942 case "bigcirc": return "\\bigcirc";
943 case "Cdot": return "\\Cdotaccent";
944 case "CloseCurlyDoubleQuote": return "\\quotedblright";
945 case "Edot": return "\\Edotaccent";
946 case "langle": return "\\langle";
947 case "pitchfork": return "\\pitchfork";
948 case "rationals": return "\\rationals";
949 case "numsp  ": return "\\gurespace";
950 case "mapstoup": return "\\mapsup";
951 case "Square": return "\\square";
952 case "omega": return "\\greekomega";
953 case "rangle": return "\\rangle";
954 case "cdot": return "\\cdotaccent";
955 case "edot": return "\\edotaccent";
956 case "zdot": return "\\zdotaccent";
957 case "odot": return "\\odot";
958 case "eqslantless": return "\\eqslantless";
959 case "DiacriticalTilde": return "\\texttilde";
960 case "Omega": return "\\greekOmega";
961 case "TildeEqual": return "\\simeq";
962 case "bullet": return "\\textbullet";
963 case "ubrcy": return "\\cyrillicushrt";
964 case "PrecedesEqual": return "\\preceq";
965 case "equals": return "\\eq";
966 case "nsqsube": return "\\nsqsubseteq";
967 case "VerticalTilde": return "\\wr";
968 case "nvDash": return "\\nvDash";
969 case "Leftrightarrow": return "\\Leftrightarrow";
970 case "planck": return "\\hslash";
971 case "comma": return "\\textcomma";
972 case "GreaterSlantEqual": return "\\geqslant";
973 case "permil": return "\\perthousand";
974 case "Ubrcy": return "\\cyrillicUSHRT";
975 case "DoubleUpArrow": return "\\Uparrow";
976 case "NotGreaterGreater": return "\\gg";
977 case "harrw": return "\\leftrightsquigarrow";
978 case "bigoplus": return "\\bigoplus";
979 case "rarrw": return "\\rightwavearrow";
980 case "nshortparallel": return "\\nparallel";
981 case "SmallCircle": return "\\circ";
982 case "bigcup": return "\\bigcup";
983 case "Integral": return "\\intop";
984 case "ntrianglerighteq": return "\\ntrianglerighteq";
985 case "Exists": return "\\exists";
986 case "angsph": return "\\sphericalangle";
987 case "NotLessSlantEqual": return "\\leqslant";
988 case "Xi": return "\\greekXi";
989 case "COPY": return "\\copyright";
990 case "oplus": return "\\oplus";
991 case "nsupseteq": return "\\nsupseteq";
992 case "Jsercy": return "\\cyrillicJE";
993 case "pi": return "\\greekpi";
994 case "Psi": return "\\greekPsi";
995 case "uplus": return "\\uplus";
996 case "ii": return "\\imaginaryi";
997 case "lesseqqgtr": return "\\lesseqqgtr";
998 case "approx": return "\\approx";
999 case "NegativeThinSpace": return "\\zerowidthspace";
1000 case "Superset": return "\\supset";
1001 case "nwArr": return "\\Nwarrow";
1002 case "daleth": return "\\daleth";
1003 case "NotGreaterTilde": return "\\ngtrsim";
1004 case "NotReverseElement": return "\\nni";
1005 case "jsercy": return "\\cyrillicje";
1006 case "OpenCurlyDoubleQuote": return "\\quotedblleft";
1007 case "euro": return "\\texteuro";
1008 case "leftharpoondown": return "\\leftharpoondown";
1009 case "ZeroWidthSpace": return "\\zerowidthspace";
1010 case "frown": return "\\frown";
1011 case "Dcaron": return "\\Dcaron";
1012 case "Ecaron": return "\\Ecaron";
1013 case "Ccaron": return "\\Ccaron";
1014 case "Ncaron": return "\\Ncaron";
1015 case "Tcaron": return "\\Tcaron";
1016 case "gg": return "\\gg";
1017 case "Rcaron": return "\\Rcaron";
1018 case "Scaron": return "\\Scaron";
1019 case "Lcaron": return "\\Lcaron";
1020 case "leftrightarrows": return "\\leftrightarrows";
1021 case "flat": return "\\flat";
1022 case "kgreen": return "\\kkra";
1023 case "nLt": return "\\ll";
1024 case "af": return "\\relax";
1025 case "psi": return "\\greekpsi";
1026 case "Gg": return "\\ggg";
1027 case "cire": return "\\circeq";
1028 case "EEacgr": return "\\greekEtatonos";
1029 case "simeq": return "\\simeq";
1030 case "nGg": return "\\ggg";
1031 case "ne": return "\\neq";
1032 case "nsubseteqq": return "\\subseteqq";
1033 case "le": return "\\leq";
1034 case "succcurlyeq": return "\\succcurlyeq";
1035 case "ge": return "\\geq";
1036 case "xrArr": return "\\Longrightarrow";
1037 case "vDash": return "\\vDash";
1038 case "iexcl": return "\\exclamdown";
1039 case "dcaron": return "\\dcaron";
1040 case "UpTeeArrow": return "\\mapsup";
1041 case "ccaron": return "\\ccaron";
1042 case "lambda": return "\\greeklambda";
1043 case "EqualTilde": return "\\eqsim";
1044 case "Zcaron": return "\\Zcaron";
1045 case "RightDoubleBracket": return "\\rrbracket";
1046 case "ntriangleright": return "\\ntriangleleft";
1047 case "NotTildeFullEqual": return "\\approxnEq";
1048 case "commat": return "\\textat";
1049 case "Re": return "\\Re";
1050 case "VDash": return "\\VDash";
1051 case "frac23": return "\\twothirds";
1052 case "Breve": return "\\textbreve";
1053 case "NotSucceedsEqual": return "\\succeq";
1054 case "iukcy": return "\\cyrillicii";
1055 case "Lambda": return "\\greekLambda";
1056 case "CHcy": return "\\cyrillicCH";
1057 case "jukcy": return "\\cyrillicie";
1058 case "Dstrok": return "\\Dstroke";
1059 case "Gamma": return "\\greekGamma";
1060 case "Lstrok": return "\\Lstroke";
1061 case "Hstrok": return "\\Hstroke";
1062 case "Tstrok": return "\\Tstroke";
1063 case "breve": return "\\textbreve";
1064 case "Iukcy": return "\\cyrillicII";
1065 case "napprox": return "\\napprox";
1066 case "downharpoonleft": return "\\downharpoonleft";
1067 case "Jukcy": return "\\cyrillicIE";
1068 case "UpTee": return "\\bot";
1069 case "dstrok": return "\\dstroke";
1070 case "gamma": return "\\greekgamma";
1071 case "lstrok": return "\\lstroke";
1072 case "supsetneq": return "\\supsetneq";
1073 case "nsucc": return "\\nsucc";
1074 case "NotGreaterSlantEqual": return "\\geqslant";
1075 case "nvap": return "\\asymp";
1076 case "upuparrows": return "\\upuparrows";
1077 case "wp": return "\\wp";
1078 case "IEcy": return "\\cyrillicE";
1079 case "reals": return "\\reals";
1080 case "prcue": return "\\preccurlyeq";
1081 case "Uogon": return "\\Uogonek";
1082 case "apos": return "\\quotesingle";
1083 case "rightrightarrows": return "\\rightrightarrows";
1084 case "Aogon": return "\\Aogonek";
1085 case "Eogon": return "\\Eogonek";
1086 case "LessTilde": return "\\lesssim";
1087 case "Iogon": return "\\Iogonek";
1088 case "ap": return "\\approx";
1089 case "RightArrow": return "\\rightarrow";
1090 case "rbrace": return "\\textbraceright";
1091 case "DownTee": return "\\top";
1092 case "amalg": return "\\amalg";
1093 case "Ll": return "\\lll";
1094 case "rthree": return "\\rightthreetimes";
1095 case "check": return "\\checkmark";
1096 case "DownArrowUpArrow": return "\\downuparrows";
1097 case "xi": return "\\greekxi";
1098 case "ntlg": return "\\nlessgtr";
1099 case "empty": return "\\emptyset";
1100 case "SubsetEqual": return "\\subseteq";
1101 case "emptyset": return "\\emptyset";
1102 case "in": return "\\in";
1103 case "frac14": return "\\onequarter";
1104 case "LeftDoubleBracket": return "\\llbracket";
1105 case "YAcy": return "\\cyrillicYA";
1106 case "tstrok": return "\\tstroke";
1107 case "scE": return "\\succeqq";
1108 case "urcorn": return "\\urcorner";
1109 case "CircleMinus": return "\\ominus";
1110 case "OHacgr": return "\\greekOmegatonos";
1111 case "DoubleUpDownArrow": return "\\Updownarrow";
1112 case "clubs": return "\\clubsuit";
1113 case "pm": return "\\textpm";
1114 case "Lmidot": return "\\Ldotmiddle";
1115 case "drcorn": return "\\lrcorner";
1116 case "divonx": return "\\divideontimes";
1117 case "ZHcy": return "\\cyrillicZH";
1118 case "Cconint": return "\\oiiint";
1119 case "GreaterTilde": return "\\gtrsim";
1120 case "squ": return "\\square";
1121 case "straightepsilon": return "\\greekepsilonalt";
1122 case "KHcy": return "\\cyrillicH";
1123 case "lmidot": return "\\ldotmiddle";
1124 case "ll": return "\\ll";
1125 case "Im": return "\\Im";
1126 case "SHcy": return "\\cyrillicSH";
1127 case "napos": return "\\napostrophe";
1128 case "circlearrowright": return "\\circlearrowleft";
1129 case "IOcy": return "\\cyrillicYO";
1130 case "longleftrightarrow": return "\\longleftrightarrow";
1131 case "ngt": return "\\ngtr";
1132 case "larrlp": return "\\looparrowleft";
1133 case "nleq": return "\\nleq";
1134 case "SOFTcy": return "\\cyrillicSFTSN";
1135 case "curlyeqprec": return "\\curlyeqprec";
1136 case "midast": return "\\ast";
1137 case "NotEqualTilde": return "\\eqsim";
1138 case "sfrown": return "\\frown";
1139 case "geqq": return "\\geqq";
1140 case "Longleftrightarrow": return "\\Longleftrightarrow";
1141 case "NotGreater": return "\\ngtr";
1142 case "UpDownArrow": return "\\updownarrow";
1143 case "NotSuperset": return "\\supset";
1144 case "angmsd": return "\\measuredangle";
1145 case "ReverseEquilibrium": return "\\leftrightharpoons";
1146 case "gnap": return "\\gnapprox";
1147 case "gel": return "\\gtreqless";
1148 case "ImaginaryI": return "\\imaginaryi";
1149 case "lnap": return "\\lnapprox";
1150 case "nrtri": return "\\ntriangleleft";
1151 case "thickapprox": return "\\approx";
1152 case "igrave": return "\\igrave";
1153 case "dzigrarr": return "\\longrightsquigarrow";
1154 case "egrave": return "\\egrave";
1155 case "rmoust": return "\\rmoustache";
1156 case "nsupe": return "\\nsupseteq";
1157 case "there4": return "\\therefore";
1158 case "ugrave": return "\\ugrave";
1159 case "lmoust": return "\\lmoustache";
1160 case "wedgeq": return "\\wedgeeq";
1161 case "Ograve": return "\\Ograve";
1162 case "Igrave": return "\\Igrave";
1163 case "Egrave": return "\\Egrave";
1164 case "agrave": return "\\agrave";
1165 case "supseteqq": return "\\supseteqq";
1166 case "Ugrave": return "\\Ugrave";
1167 case "Eacute": return "\\Eacute";
1168 case "Cacute": return "\\Cacute";
1169 case "Aacute": return "\\Aacute";
1170 case "DoubleDot": return "\\textdiaeresis";
1171 case "maltese": return "\\maltese";
1172 case "Nacute": return "\\Nacute";
1173 case "Lacute": return "\\Lacute";
1174 case "Iacute": return "\\Iacute";
1175 case "succnsim": return "\\succnsim";
1176 case "Lt": return "\\ll";
1177 case "Uacute": return "\\Uacute";
1178 case "Tilde": return "\\sim";
1179 case "Agrave": return "\\Agrave";
1180 case "Racute": return "\\Racute";
1181 case "Oacute": return "\\Oacute";
1182 case "NotCupCap": return "\\nasymp";
1183 case "Yacute": return "\\Yacute";
1184 case "Zacute": return "\\Zacute";
1185 case "eacute": return "\\eacute";
1186 case "ell": return "\\ell";
1187 case "cacute": return "\\cacute";
1188 case "NJcy": return "\\cyrillicNJE";
1189 case "nacute": return "\\nacute";
1190 case "LJcy": return "\\cyrillicLJE";
1191 case "KJcy": return "\\cyrillicKJE";
1192 case "iacute": return "\\iacute";
1193 case "GJcy": return "\\cyrillicGJE";
1194 case "rarrb": return "\\rightarrowbar";
1195 case "SucceedsEqual": return "\\succeq";
1196 case "DifferentialD": return "\\differentiald";
1197 case "racute": return "\\racute";
1198 case "GreaterEqualLess": return "\\gtreqless";
1199 case "lharu": return "\\leftharpoonup";
1200 case "ApplyFunction": return "\\relax";
1201 case "LessSlantEqual": return "\\leqslant";
1202 case "smid": return "\\divides";
1203 case "mid": return "\\divides";
1204 case "nu": return "\\greeknu";
1205 case "mu": return "\\greekmu";
1206 case "xutri": return "\\triangle";
1207 case "DJcy": return "\\cyrillicDJE";
1208 case "delta": return "\\greekdelta";
1209 case "YIcy": return "\\cyrillicYI";
1210 case "vprop": return "\\propto";
1211 case "lneq": return "\\lneq";
1212 case "prap": return "\\precapprox";
1213 case "twoheadleftarrow": return "\\twoheadleftarrow";
1214 case "backsim": return "\\backsim";
1215 case "comp": return "\\complement";
1216 case "frac35": return "\\threefifths";
1217 case "DoubleLeftRightArrow": return "\\Leftrightarrow";
1218 case "Mu": return "\\greekMu";
1219 case "osol": return "\\oslash";
1220 case "diams": return "\\blacklozenge";
1221 case "geqslant": return "\\geqslant";
1222 case "bsol": return "\\textbackslash";
1223 case "Delta": return "\\greekDelta";
1224 case "Longleftarrow": return "\\Longleftarrow";
1225 case "forall": return "\\forall";
1226 case "leqslant": return "\\leqslant";
1227 case "frac78": return "\\seveneighths";
1228 case "frac58": return "\\fiveeighths";
1229 case "prod": return "\\prod";
1230 case "Alpha": return "\\greekAlpha";
1231 case "sstarf": return "\\star";
1232 case "CircleDot": return "\\odot";
1233 case "CupCap": return "\\asymp";
1234 case "ReverseElement": return "\\ni";
1235 case "NotSquareSuperset": return "\\sqsupset";
1236 case "asymp": return "\\approx";
1237 case "ldsh": return "\\Ldsh";
1238 case "gtreqless": return "\\gtreqless";
1239 case "alpha": return "\\greekalpha";
1240 case "bump": return "\\Bumpeq";
1241 case "realpart": return "\\Re";
1242 case "natural": return "\\natural";
1243 case "ordf": return "\\ordfeminine";
1244 case "ast": return "\\ast";
1245 case "copysr": return "\\textcircledP";
1246 case "circledR": return "\\registered";
1247 case "subset": return "\\subset";
1248 case "rarrhk": return "\\hookrightarrow";
1249 case "TSHcy": return "\\cyrillicTSHE";
1250 case "larrhk": return "\\hookleftarrow";
1251 case "frac34": return "\\threequarter";
1252 case "straightphi": return "\\greekphialt";
1253 case "eDot": return "\\doteqdot";
1254 case "Verbar": return "\\Vert";
1255 case "rhard": return "\\rightharpoondown";
1256 case "VerticalLine": return "\\textbar";
1257 case "nltri": return "\\ntriangleright";
1258 case "LeftArrow": return "\\leftarrow";
1259 case "dashv": return "\\dashv";
1260 case "NotSucceedsSlantEqual": return "\\nsucccurlyeq";
1261 case "TripleDot": return "\\dddot";
1262 case "intcal": return "\\intercal";
1263 case "Congruent": return "\\equiv";
1264 case "biguplus": return "\\biguplus";
1265 case "uharl": return "\\upharpoonleft";
1266 case "rmoustache": return "\\rmoustache";
1267 case "gnapprox": return "\\gnapprox";
1268 case "deg": return "\\textdegree";
1269 case "lnapprox": return "\\lnapprox";
1270 case "rho": return "\\greekrho";
1271 case "mho": return "\\textmho";
1272 case "DoubleDownArrow": return "\\Downarrow";
1273 case "xmap": return "\\longmapsto";
1274 case "sbquo": return "\\quotesinglebase";
1275 case "micro": return "\\textmu";
1276 case "rcub": return "\\textbraceright";
1277 case "lcub": return "\\textbraceleft";
1278 case "Theta": return "\\greekTheta";
1279 case "leg": return "\\lesseqgtr";
1280 case "reg": return "\\registered";
1281 case "nleftarrow": return "\\nleftarrow";
1282 case "lhard": return "\\leftharpoondown";
1283 case "ForAll": return "\\forall";
1284 case "curlywedge": return "\\curlywedge";
1285 case "looparrowleft": return "\\looparrowleft";
1286 case "cuvee": return "\\curlyvee";
1287 case "copy": return "\\copyright";
1288 case "vsubne": return "\\subsetneq";
1289 case "NotRightTriangleEqual": return "\\ntrianglerighteq";
1290 case "Lleftarrow": return "\\Lleftarrow";
1291 case "lesseqgtr": return "\\lesseqgtr";
1292 case "NotLess": return "\\nless";
1293 case "gtrdot": return "\\gtrdot";
1294 case "shortmid": return "\\divides";
1295 case "cup": return "\\cup";
1296 case "setmn": return "\\setminus";
1297 case "thetav": return "\\greekthetaalt";
1298 case "DiacriticalAcute": return "\\textacute";
1299 case "Sup": return "\\Supset";
1300 case "ocir": return "\\circledcirc";
1301 case "nlt": return "\\nless";
1302 case "bigodot": return "\\bigodot";
1303 case "ecir": return "\\eqcirc";
1304 case "LeftArrowRightArrow": return "\\leftrightarrows";
1305 case "race": return "\\backsim";
1306 case "ltimes": return "\\ltimes";
1307 case "sup": return "\\supset";
1308 case "rtimes": return "\\rtimes";
1309 case "otimes": return "\\otimes";
1310 case "supne": return "\\supsetneq";
1311 case "SquareSupersetEqual": return "\\sqsupseteq";
1312 case "ShortUpArrow": return "\\uparrow";
1313 case "preceq": return "\\preceq";
1314 case "Uacgr": return "\\greekUpsilontonos";
1315 case "aacgr": return "\\greekalphatonos";
1316 case "Prime": return "\\doubleprime";
1317 case "Iacgr": return "\\greekIotatonos";
1318 case "Eacgr": return "\\greekEpsilontonos";
1319 case "Oacgr": return "\\greekOmicrontonos";
1320 case "ntrianglelefteq": return "\\ntrianglelefteq";
1321 case "cedil": return "\\textcedilla";
1322 case "Cup": return "\\Cup";
1323 case "idiagr": return "\\greekiotadialytikatonos";
1324 case "nsmid": return "\\ndivides";
1325 case "xcap": return "\\bigcap";
1326 case "Aacgr": return "\\greekAlphatonos";
1327 case "Colon": return "\\squaredots";
1328 case "scap": return "\\succapprox";
1329 case "between": return "\\between";
1330 case "bigcap": return "\\bigcap";
1331 case "diamondsuit": return "\\blacklozenge";
1332 case "shchcy": return "\\cyrillicshch";
1333 case "crarr": return "\\carriagereturn";
1334 case "ominus": return "\\ominus";
1335 case "rdsh": return "\\Rdsh";
1336 case "nsime": return "\\nsimeq";
1337 case "nrarr": return "\\nrightarrow";
1338 case "NotHumpDownHump": return "\\Bumpeq";
1339 case "srarr": return "\\rightarrow";
1340 case "plankv": return "\\hslash";
1341 case "phiv": return "\\greekphialt";
1342 case "angrt": return "\\rightangle";
1343 case "xdtri": return "\\bigtriangledown";
1344 case "NegativeMediumSpace": return "\\zerowidthspace";
1345 case "par": return "\\parallel";
1346 case "diam": return "\\diamond";
1347 case "laquo": return "\\leftguillemot";
1348 case "sigmav": return "\\greekfinalsigma";
1349 case "supe": return "\\supseteq";
1350 case "SucceedsTilde": return "\\succsim";
1351 case "ffilig": return "\\ffiligature";
1352 case "IJlig": return "\\IJligature";
1353 case "Rsh": return "\\Rsh";
1354 case "lsh": return "\\Lsh";
1355 case "DiacriticalGrave": return "\\textgrave";
1356 case "Equilibrium": return "\\rightleftharpoons";
1357 case "downdownarrows": return "\\downdownarrows";
1358 case "egs": return "\\eqslantgtr";
1359 case "cwint": return "\\intclockwise";
1360 case "Dot": return "\\textdiaeresis";
1361 case "Beta": return "\\greekBeta";
1362 case "malt": return "\\maltese";
1363 case "ges": return "\\geqslant";
1364 case "lobrk": return "\\llbracket";
1365 case "Product": return "\\prod";
1366 case "trie": return "\\triangleq";
1367 case "sqsupset": return "\\sqsupset";
1368 case "aleph": return "\\aleph";
1369 case "DiacriticalDoubleAcute": return "\\texthungarumlaut";
1370 case "supE": return "\\supseteqq";
1371 case "uacgr": return "\\greekupsilontonos";
1372 case "approxeq": return "\\approxeq";
1373 case "robrk": return "\\rrbracket";
1374 case "UnionPlus": return "\\uplus";
1375 case "Lsh": return "\\Lsh";
1376 case "iacgr": return "\\greekiotatonos";
1377 case "eth": return "\\eth";
1378 case "eacgr": return "\\greekepsilontonos";
1379 case "intercal": return "\\intercal";
1380 case "imagpart": return "\\Im";
1381 case "ctdot": return "\\cdots";
1382 case "dtdot": return "\\ddots";
1383 case "gtdot": return "\\gtrdot";
1384 case "lessapprox": return "\\lessapprox";
1385 case "AElig": return "\\AEligature";
1386 case "colone": return "\\colonequals";
1387 case "circleddash": return "\\circleddash";
1388 case "models": return "\\models";
1389 case "NotDoubleVerticalBar": return "\\nparallel";
1390 case "uml": return "\\textdiaeresis";
1391 case "udblac": return "\\uhungarumlaut";
1392 case "SucceedsSlantEqual": return "\\succcurlyeq";
1393 case "utdot": return "\\udots";
1394 case "LeftCeiling": return "\\lceiling";
1395 case "top": return "\\top";
1396 case "ltdot": return "\\lessdot";
1397 case "LowerRightArrow": return "\\searrow";
1398 case "gtrapprox": return "\\gtrapprox";
1399 case "Udblac": return "\\Uhungarumlaut";
1400 case "LessEqualGreater": return "\\lesseqgtr";
1401 case "Int": return "\\iintop";
1402 case "Odblac": return "\\Ohungarumlaut";
1403 case "nsupset": return "\\supset";
1404 case "nwarrow": return "\\nwarrow";
1405 case "nsube": return "\\nsubseteq";
1406 case "swarrow": return "\\swarrow";
1407 case "int": return "\\intop";
1408 case "sol": return "\\textslash";
1409 case "REG": return "\\registered";
1410 case "ShortLeftArrow": return "\\leftarrow";
1411 case "alefsym": return "\\aleph";
1412 case "Uarr": return "\\twoheaduparrow";
1413 case "Rarr": return "\\twoheadrightarrow";
1414 case "darr": return "\\downarrow";
1415 case "percnt": return "\\percent";
1416 case "harr": return "\\leftrightarrow";
1417 case "RightArrowBar": return "\\rightarrowbar";
1418 case "uarr": return "\\uparrow";
1419 case "Uparrow": return "\\Uparrow";
1420 case "eqcolon": return "\\equalscolon";
1421 case "succapprox": return "\\succapprox";
1422 case "notin": return "\\nin";
1423 case "varphi": return "\\greekphialt";
1424 case "Rho": return "\\greekRho";
1425 case "bottom": return "\\bot";
1426 case "curarr": return "\\curvearrowright";
1427 case "exponentiale": return "\\exponentiale";
1428 case "nrtrie": return "\\ntrianglerighteq";
1429 case "SquareSuperset": return "\\sqsupset";
1430 case "lmoustache": return "\\lmoustache";
1431 case "propto": return "\\propto";
1432 case "nsupseteqq": return "\\supseteqq";
1433 case "dharl": return "\\downharpoonleft";
1434 case "varnothing": return "\\emptyset";
1435 case "GreaterFullEqual": return "\\geqq";
1436 case "nLtv": return "\\ll";
1437 case "fallingdotseq": return "\\fallingdotseq";
1438 case "smile": return "\\smile";
1439 case "bigsqcup": return "\\bigsqcup";
1440 case "sime": return "\\simeq";
1441 case "NotSucceedsTilde": return "\\succsim";
1442 case "Darr": return "\\twoheaddownarrow";
1443 case "Larr": return "\\twoheadleftarrow";
1444 case "ggg": return "\\ggg";
1445 case "SquareSubset": return "\\sqsubset";
1446 case "Subset": return "\\Subset";
1447 case "rightleftarrows": return "\\rightleftarrows";
1448 case "dzcy": return "\\cyrillicdzhe";
1449 case "HumpDownHump": return "\\Bumpeq";
1450 case "hookrightarrow": return "\\hookrightarrow";
1451 case "beta": return "\\greekbeta";
1452 case "Zeta": return "\\greekZeta";
1453 case "RightUpVector": return "\\upharpoonright";
1454 case "HARDcy": return "\\cyrillicHRDSN";
1455 case "MediumSpace  ": return "\\dspace";
1456 case "RightFloor": return "\\rfloor";
1457 case "uparrow": return "\\uparrow";
1458 case "image": return "\\Im";
1459 case "dotsquare": return "\\boxdot";
1460 case "scnap": return "\\succnapprox";
1461 case "ssetmn": return "\\setminus";
1462 case "CenterDot": return "\\periodcentered";
1463 case "Coproduct": return "\\coprod";
1464 case "eng": return "\\neng";
1465 case "supseteq": return "\\supseteq";
1466 case "NotGreaterFullEqual": return "\\geqq";
1467 case "softcy": return "\\cyrillicsftsn";
1468 case "iiota": return "\\turnediota";
1469 case "NotVerticalBar": return "\\ndivides";
1470 case "puncsp  ": return "\\nctuationspace";
1471 case "ENG": return "\\Neng";
1472 case "ang": return "\\angle";
1473 case "RightDownVector": return "\\downharpoonright";
1474 case "natur": return "\\natural";
1475 case "boxminus": return "\\boxminus";
1476 case "Tab": return "\\t defined";
1477 case "ogon": return "\\textogonek";
1478 case "ddarr": return "\\downdownarrows";
1479 case "beth": return "\\beth";
1480 case "NotLeftTriangle": return "\\ntriangleright";
1481 case "khgr": return "\\greekchi";
1482 case "starf": return "\\bigstar";
1483 case "thgr": return "\\greektheta";
1484 case "imath": return "\\dotlessi";
1485 case "jmath": return "\\dotlessj";
1486 case "nvsim": return "\\sim";
1487 case "rbarr": return "\\dashedrightarrow";
1488 case "isin": return "\\in";
1489 case "iocy": return "\\cyrillicyo";
1490 case "circledcirc": return "\\circledcirc";
1491 case "DoubleContourIntegral": return "\\oiint";
1492 case "minusd": return "\\dotminus";
1493 case "nearrow": return "\\nearrow";
1494 case "CapitalDifferentialD": return "\\differentialD";
1495 case "NestedLessLess": return "\\ll";
1496 case "erDot": return "\\risingdotseq";
1497 case "cdots": return "\\textellipsis";
1498 case "minusplus": return "\\mp";
1499 case "plusminus": return "\\textpm";
1500 case "real": return "\\Re";
1501 case "searr": return "\\searrow";
1502 case "nltrie": return "\\ntrianglelefteq";
1503 case "zgr": return "\\greekzeta";
1504 case "ograve": return "\\ograve";
1505 case "zeta": return "\\greekzeta";
1506 case "xrarr": return "\\longrightarrow";
1507 case "Bcy": return "\\cyrillicB";
1508 case "Acy": return "\\cyrillicA";
1509 case "zcaron": return "\\zcaron";
1510 case "Gcy": return "\\cyrillicG";
1511 case "Fcy": return "\\cyrillicF";
1512 case "Ecy": return "\\cyrillicEREV";
1513 case "Dcy": return "\\cyrillicD";
1514 case "Kcy": return "\\cyrillicK";
1515 case "Jcy": return "\\cyrillicISHRT";
1516 case "Icy": return "\\cyrillicI";
1517 case "zacute": return "\\zacute";
1518 case "Ocy": return "\\cyrillicO";
1519 case "Ncy": return "\\cyrillicN";
1520 case "Mcy": return "\\cyrillicM";
1521 case "Lcy": return "\\cyrillicL";
1522 case "Scy": return "\\cyrillicS";
1523 case "Rcy": return "\\cyrillicR";
1524 case "yucy": return "\\cyrillicyu";
1525 case "Pcy": return "\\cyrillicP";
1526 case "Vcy": return "\\cyrillicV";
1527 case "Ucy": return "\\cyrillicU";
1528 case "Tcy": return "\\cyrillicT";
1529 case "sacute": return "\\sacute";
1530 case "Zcy": return "\\cyrillicZ";
1531 case "Ycy": return "\\cyrillicERY";
1532 case "yen": return "\\textyen";
1533 case "xotime": return "\\bigotimes";
1534 case "Longrightarrow": return "\\Longrightarrow";
1535 case "bcy": return "\\cyrillicb";
1536 case "acy": return "\\cyrillica";
1537 case "nharr": return "\\nleftrightarrow";
1538 case "gcy": return "\\cyrillicg";
1539 case "bsim": return "\\backsim";
1540 case "ecy": return "\\cyrillicerev";
1541 case "dcy": return "\\cyrillicd";
1542 case "kcy": return "\\cyrillick";
1543 case "jcy": return "\\cyrillicishrt";
1544 case "icy": return "\\cyrillici";
1545 case "nprec": return "\\nprec";
1546 case "ocy": return "\\cyrillico";
1547 case "lcy": return "\\cyrillicl";
1548 case "scy": return "\\cyrillics";
1549 case "rcy": return "\\cyrillicr";
1550 case "yacute": return "\\yacute";
1551 case "xwedge": return "\\bigwedge";
1552 case "vcy": return "\\cyrillicv";
1553 case "ucy": return "\\cyrillicu";
1554 case "tcy": return "\\cyrillict";
1555 case "xsqcup": return "\\bigsqcup";
1556 case "zcy": return "\\cyrillicz";
1557 case "ycy": return "\\cyrillicery";
1558 case "LeftAngleBracket": return "\\langle";
1559 case "bkarow": return "\\dashedrightarrow";
1560 case "xodot": return "\\bigodot";
1561 case "xlarr": return "\\longleftarrow";
1562 case "xlArr": return "\\Longleftarrow";
1563 case "ugr": return "\\greekupsilon";
1564 case "xgr": return "\\greekxi";
1565 case "omicron": return "\\greekomicron";
1566 case "xcup": return "\\bigcup";
1567 case "xcirc": return "\\bigcirc";
1568 case "wr": return "\\wr";
1569 case "weierp": return "\\wp";
1570 case "primes": return "\\primes";
1571 case "shy": return "\\softhyphen";
1572 case "amacr": return "\\amacron";
1573 case "Tau": return "\\greekTau";
1574 case "vsupne": return "\\supsetneq";
1575 case "vsupnE": return "\\supsetneqq";
1576 case "nsim": return "\\nsim";
1577 case "vnsub": return "\\subset";
1578 case "Cedilla": return "\\textcedilla";
1579 case "lsim": return "\\lesssim";
1580 case "vert": return "\\textbar";
1581 case "NotElement": return "\\nin";
1582 case "egr": return "\\greekepsilon";
1583 case "dscy": return "\\cyrillicdze";
1584 case "vellip": return "\\vdots";
1585 case "parallel": return "\\parallel";
1586 case "nequiv": return "\\nequiv";
1587 case "varsupsetneqq": return "\\supsetneqq";
1588 case "varsupsetneq": return "\\supsetneq";
1589 case "eegr": return "\\greeketa";
1590 case "square": return "\\square";
1591 case "varsigma": return "\\greekfinalsigma";
1592 case "varr": return "\\updownarrow";
1593 case "varpropto": return "\\propto";
1594 case "varpi": return "\\greekpialt";
1595 case "tau": return "\\greektau";
1596 case "sfgr": return "\\greekfinalsigma";
1597 case "iff": return "\\Leftrightarrow";
1598 case "vArr": return "\\Updownarrow";
1599 case "dotminus": return "\\dotminus";
1600 case "uuarr": return "\\upuparrows";
1601 case "NotSquareSupersetEqual": return "\\nsqsupseteq";
1602 case "lessgtr": return "\\lessgtr";
1603 case "gesl": return "\\gtreqless";
1604 case "OpenCurlyQuote": return "\\textquoteleft";
1605 case "sqsubseteq": return "\\sqsubseteq";
1606 case "lfloor": return "\\lfloor";
1607 case "urcorner": return "\\urcorner";
1608 case "NotSubset": return "\\subset";
1609 case "LeftArrowBar": return "\\barleftarrow";
1610 case "uogon": return "\\uogonek";
1611 case "umacr": return "\\umacron";
1612 case "TildeFullEqual": return "\\approxEq";
1613 case "ulcorner": return "\\ulcorner";
1614 case "dharr": return "\\downharpoonright";
1615 case "naturals": return "\\naturalnumbers";
1616 case "xharr": return "\\longleftrightarrow";
1617 case "uharr": return "\\upharpoonright";
1618 case "udiagr": return "\\greekupsilondialytikatonos";
1619 case "NegativeThickSpace": return "\\zerowidthspace";
1620 case "udarr": return "\\updownarrows";
1621 case "ucirc": return "\\ucircumflex";
1622 case "uacute": return "\\uacute";
1623 case "uArr": return "\\Uparrow";
1624 case "twoheadrightarrow": return "\\twoheadrightarrow";
1625 case "twixt": return "\\between";
1626 case "hardcy": return "\\cyrillichrdsn";
1627 case "tshcy": return "\\cyrillictshe";
1628 case "tscy": return "\\cyrillicc";
1629 case "triangleq": return "\\triangleq";
1630 case "tprime": return "\\tripleprime";
1631 case "curren": return "\\textcurrency";
1632 case "tint": return "\\iiintop";
1633 case "timesb": return "\\boxtimes";
1634 case "times": return "\\textmultiply";
1635 case "RightArrowLeftArrow": return "\\rightleftarrows";
1636 case "tilde": return "\\texttilde";
1637 case "thorn": return "\\thorn";
1638 case "thksim": return "\\sim";
1639 case "kgr": return "\\greekkappa";
1640 case "iecy": return "\\cyrillice";
1641 case "thinsp  ": return "\\eakablethinspace";
1642 case "thetasym": return "\\greekthetaalt";
1643 case "theta": return "\\greektheta";
1644 case "tgr": return "\\greektau";
1645 case "iiint": return "\\iiintop";
1646 case "tdot": return "\\dddot";
1647 case "lesssim": return "\\lesssim";
1648 case "tcaron": return "\\tcaron";
1649 case "nGt": return "\\gg";
1650 case "swarhk": return "\\rhookswarrow";
1651 case "swArr": return "\\Swarrow";
1652 case "supnE": return "\\supsetneqq";
1653 case "divideontimes": return "\\divideontimes";
1654 case "awconint": return "\\ointctrclockwise";
1655 case "conint": return "\\oint";
1656 case "sup2": return "\\twosuperior";
1657 case "succsim": return "\\succsim";
1658 case "NotLessEqual": return "\\nleq";
1659 case "succnapprox": return "\\succnapprox";
1660 case "succeq": return "\\succeq";
1661 case "succ": return "\\succ";
1662 case "subsetneqq": return "\\subsetneqq";
1663 case "subsetneq": return "\\subsetneq";
1664 case "LongLeftArrow": return "\\longleftarrow";
1665 case "subseteq": return "\\subseteq";
1666 case "subne": return "\\subsetneq";
1667 case "subnE": return "\\subsetneqq";
1668 case "sube": return "\\subseteq";
1669 case "subE": return "\\subseteqq";
1670 case "DownTeeArrow": return "\\mapsdown";
1671 case "coprod": return "\\coprod";
1672 case "Ntilde": return "\\Ntilde";
1673 case "ssmile": return "\\smile";
1674 case "varsubsetneqq": return "\\subsetneqq";
1675 case "circ": return "\\textcircumflex";
1676 case "sqsupseteq": return "\\sqsupseteq";
1677 case "sqsupe": return "\\sqsupseteq";
1678 case "sqsup": return "\\sqsupset";
1679 case "sqsubset": return "\\sqsubset";
1680 case "LeftRightArrow": return "\\leftrightarrow";
1681 case "DiacriticalDot": return "\\textdotaccent";
1682 case "sqsube": return "\\sqsubseteq";
1683 case "sqsub": return "\\sqsubset";
1684 case "ngr": return "\\greeknu";
1685 case "sqcaps": return "\\sqcap";
1686 case "sqcap": return "\\sqcap";
1687 case "ee": return "\\exponentiale";
1688 case "leftthreetimes": return "\\leftthreetimes";
1689 case "Precedes": return "\\prec";
1690 case "spadesuit": return "\\spadesuit";
1691 case "divide": return "\\textdiv";
1692 case "spades": return "\\spadesuit";
1693 case "boxtimes": return "\\boxtimes";
1694 case "smallsetminus": return "\\setminus";
1695 case "slarr": return "\\leftarrow";
1696 case "zhcy": return "\\cyrilliczh";
1697 case "simne": return "\\napproxEq";
1698 case "sim": return "\\sim";
1699 case "sigmaf": return "\\greekfinalsigma";
1700 case "shortparallel": return "\\parallel";
1701 case "chcy": return "\\cyrillicch";
1702 case "SHCHcy": return "\\cyrillicSHCH";
1703 case "shcy": return "\\cyrillicsh";
1704 case "sgr": return "\\greeksigma";
1705 case "otilde": return "\\otilde";
1706 case "bigstar": return "\\bigstar";
1707 case "khcy": return "\\cyrillich";
1708 case "sect": return "\\sectionmark";
1709 case "searrow": return "\\searrow";
1710 case "searhk": return "\\lhooksearrow";
1711 case "seArr": return "\\Searrow";
1712 case "sdot": return "\\cdot";
1713 case "DoubleRightTee": return "\\vDash";
1714 case "scsim": return "\\succsim";
1715 case "Proportion": return "\\squaredots";
1716 case "hellip": return "\\textellipsis";
1717 case "Zdot": return "\\Zdotaccent";
1718 case "ExponentialE": return "\\exponentiale";
1719 case "sce": return "\\succeq";
1720 case "sccue": return "\\succcurlyeq";
1721 case "scaron": return "\\scaron";
1722 case "angst": return "\\Aring";
1723 case "sc": return "\\succ";
1724 case "yicy": return "\\cyrillicyi";
1725 case "rtrif": return "\\blacktriangleleft";
1726 case "notniva": return "\\nni";
1727 case "rsquo": return "'";
1728 case "rsh": return "\\Rsh";
1729 case "ordm": return "\\ordmasculine";
1730 case "OverBrace": return "\\overbrace";
1731 case "rsaquo": return "\\guilsingleright";
1732 case "rrarr": return "\\rightrightarrows";
1733 case "rpar": return "\\rparent";
1734 case "ngtr": return "\\ngtr";
1735 case "ljcy": return "\\cyrilliclje";
1736 case "kjcy": return "\\cyrillickje";
1737 case "roarr": return "\\rightarrowtriangle";
1738 case "gjcy": return "\\cyrillicgje";
1739 case "rceil": return "\\rceiling";
1740 case "djcy": return "\\cyrillicdje";
1741 case "eogon": return "\\eogonek";
1742 case "rlarr": return "\\rightleftarrows";
1743 case "ecolon": return "\\equalscolon";
1744 case "risingdotseq": return "\\risingdotseq";
1745 case "rightthreetimes": return "\\rightthreetimes";
1746 case "rightleftharpoons": return "\\rightleftharpoons";
1747 case "nGtv": return "\\gg";
1748 case "lceil": return "\\lceiling";
1749 case "rightharpoonup": return "\\rightharpoonup";
1750 case "rightarrowtail": return "\\rightarrowtail";
1751 case "rightarrow": return "\\rightarrow";
1752 case "wreath": return "\\wr";
1753 case "rharu": return "\\rightharpoonup";
1754 case "cuesc": return "\\curlyeqsucc";
1755 case "bigtriangledown": return "\\bigtriangledown";
1756 case "njcy": return "\\cyrillicnje";
1757 case "rgr": return "\\greekrho";
1758 case "oslash": return "\\ostroke";
1759 case "rfloor": return "\\rfloor";
1760 case "rdquo": return "\"";
1761 case "lsquor": return "\\quotesinglebase";
1762 case "veebar": return "\\veebar";
1763 case "rcedil": return "\\rcommaaccent";
1764 case "rcaron": return "\\rcaron";
1765 case "rsquor": return "\\textquoteright";
1766 case "prec": return "\\prec";
1767 case "mgr": return "\\greekmu";
1768 case "rarrtl": return "\\rightarrowtail";
1769 case "rarrlp": return "\\looparrowright";
1770 case "rarr": return "\\rightarrow";
1771 case "becaus": return "\\because";
1772 case "raquo": return "\\rightguillemot";
1773 case "radic": return "\\surd";
1774 case "sup1": return "\\onesuperior";
1775 case "rArr": return "\\Rightarrow";
1776 case "nles": return "\\leqslant";
1777 case "ncy": return "\\cyrillicn";
1778 case "leftharpoonup": return "\\leftharpoonup";
1779 case "larr": return "\\leftarrow";
1780 case "UnderBrace": return "\\underbrace";
1781 case "prnap": return "\\precnapprox";
1782 case "setminus": return "\\setminus";
1783 case "prime": return "\\prime";
1784 case "NotSquareSubset": return "\\sqsubset";
1785 case "SquareIntersection": return "\\sqcap";
1786 case "LeftDownVector": return "\\downharpoonleft";
1787 case "precneqq": return "\\precneqq";
1788 case "precnapprox": return "\\precnapprox";
1789 case "pr": return "\\prec";
1790 case "pound": return "\\textsterling";
1791 case "planckh": return "\\Plankconst";
1792 case "piv": return "\\greekpialt";
1793 case "phi": return "\\greekphi";
1794 case "phgr": return "\\greekphi";
1795 case "pgr": return "\\greekpi";
1796 case "NotSupersetEqual": return "\\nsupseteq";
1797 case "perp": return "\\bot";
1798 case "pcy": return "\\cyrillicp";
1799 case "nLeftrightarrow": return "\\nLeftrightarrow";
1800 case "ijlig": return "\\ijligature";
1801 case "NotPrecedesEqual": return "\\preceq";
1802 case "Because": return "\\because";
1803 case "ogr": return "\\greekomicron";
1804 case "orarr": return "\\circlearrowleft";
1805 case "or": return "\\vee";
1806 case "Rarrtl": return "\\twoheadrightarrowtail";
1807 case "ohm": return "\\greekOmega";
1808 case "ohgr": return "\\greekomega";
1809 case "Rfr": return "\\Re";
1810 case "Ifr": return "\\Im";
1811 case "TildeTilde": return "\\approx";
1812 case "Aring": return "\\Aring";
1813 case "complexes": return "\\complexes";
1814 case "Pgr": return "\\greekPi";
1815 case "odblac": return "\\ohungarumlaut";
1816 case "Ngr": return "\\greekNu";
1817 case "Ogr": return "\\greekOmicron";
1818 case "Tgr": return "\\greekTau";
1819 case "Ugr": return "\\greekUpsilon";
1820 case "Rgr": return "\\greekRho";
1821 case "Sgr": return "\\greekSigma";
1822 case "Igr": return "\\greekIota";
1823 case "Ggr": return "\\greekGamma";
1824 case "Lgr": return "\\greekLambda";
1825 case "Mgr": return "\\greekMu";
1826 case "oast": return "\\circledast";
1827 case "Kgr": return "\\greekKappa";
1828 case "agr": return "\\greekalpha";
1829 case "oacute": return "\\oacute";
1830 case "oacgr": return "\\greekomicrontonos";
1831 case "Xgr": return "\\greekXi";
1832 case "epsilon": return "\\greekepsilon";
1833 case "mapstodown": return "\\mapsdown";
1834 case "mumap": return "\\multimap";
1835 case "nleqslant": return "\\leqslant";
1836 case "nwarhk": return "\\lhooknwarrow";
1837 case "Zgr": return "\\greekZeta";
1838 case "bdquo": return "\\quotedblbase";
1839 case "hslash": return "\\hslash";
1840 case "llcorner": return "\\llcorner";
1841 case "nvgt": return "\\gt";
1842 case "nvge": return "\\geq";
1843 case "frac13": return "\\onethird";
1844 case "frac25": return "\\twofifths";
1845 case "numero": return "\\textnumero";
1846 case "ntilde": return "\\ntilde";
1847 case "equest": return "\\questionedeq";
1848 case "ntgl": return "\\ngtrless";
1849 case "nsupE": return "\\supseteqq";
1850 case "leftarrowtail": return "\\leftarrowtail";
1851 case "nsucceq": return "\\succeq";
1852 case "Agr": return "\\greekAlpha";
1853 case "lacute": return "\\lacute";
1854 case "nsubE": return "\\subseteqq";
1855 case "Dgr": return "\\greekDelta";
1856 case "Egr": return "\\greekEpsilon";
1857 case "Bgr": return "\\greekBeta";
1858 case "iquest": return "\\questiondown";
1859 case "nsub": return "\\nsubset";
1860 case "nsqsupe": return "\\nsqsupseteq";
1861 case "nspar": return "\\nparallel";
1862 case "Oslash": return "\\Ostroke";
1863 case "asympeq": return "\\asymp";
1864 case "nRightarrow": return "\\nRightarrow";
1865 case "nsimeq": return "\\nsimeq";
1866 case "nshortmid": return "\\ndivides";
1867 case "frac38": return "\\threeeighths";
1868 case "cong": return "\\approxEq";
1869 case "nsce": return "\\succeq";
1870 case "nsc": return "\\nsucc";
1871 case "nrArr": return "\\nRightarrow";
1872 case "npreceq": return "\\preceq";
1873 case "yacy": return "\\cyrillicya";
1874 case "dagger": return "\\textdag";
1875 case "nprcue": return "\\npreccurlyeq";
1876 case "Gammad": return "\\digamma";
1877 case "dollar": return "\\textdollar";
1878 case "NotGreaterEqual": return "\\ngeq";
1879 case "not": return "\\textlognot";
1880 case "nmid": return "\\ndivides";
1881 case "nless": return "\\nless";
1882 case "nleftrightarrow": return "\\nleftrightarrow";
1883 case "DownLeftVector": return "\\leftharpoondown";
1884 case "ni": return "\\ni";
1885 case "ngsim": return "\\ngtrsim";
1886 case "sqcups": return "\\sqcup";
1887 case "ngeq": return "\\ngeq";
1888 case "frac45": return "\\fourfifths";
1889 case "nexists": return "\\nexists";
1890 case "nesim": return "\\eqsim";
1891 case "nearr": return "\\nearrow";
1892 case "fnof": return "\\fhook";
1893 case "neArr": return "\\Nearrow";
1894 case "questeq": return "\\questionedeq";
1895 case "ncaron": return "\\ncaron";
1896 case "frasl": return "\\textfraction";
1897 case "nbump": return "\\Bumpeq";
1898 case "nVdash": return "\\nVdash";
1899 case "nLeftarrow": return "\\nLeftarrow";
1900 case "swarr": return "\\swarrow";
1901 case "nwarr": return "\\nwarrow";
1902 case "multimap": return "\\multimap";
1903 case "gimel": return "\\gimel";
1904 case "mp": return "\\mp";
1905 case "mldr": return "\\textellipsis";
1906 case "because": return "\\because";
1907 case "ratio": return "\\colon";
1908 case "measuredangle": return "\\measuredangle";
1909 case "mcy": return "\\cyrillicm";
1910 case "cwconint": return "\\ointclockwise";
1911 case "Utilde": return "\\Utilde";
1912 case "Uring": return "\\Uring";
1913 case "lvertneqq": return "\\lneqq";
1914 case "UnderParenthesis": return "\\underparent";
1915 case "nsubset": return "\\subset";
1916 case "lthree": return "\\leftthreetimes";
1917 case "lt": return "\\lt";
1918 case "lsquo": return "'";
1919 case "strns": return "\\textmacron";
1920 case "DownRightVector": return "\\rightharpoondown";
1921 case "Sub": return "\\Subset";
1922 case "lrarr": return "\\leftrightarrows";
1923 case "lpar": return "\\lparent";
1924 case "lozenge": return "\\lozenge";
1925 case "loz": return "\\lozenge";
1926 case "aring": return "\\aring";
1927 case "lowbar": return "\\textunderscore";
1928 case "looparrowright": return "\\looparrowright";
1929 case "longrightarrow": return "\\longrightarrow";
1930 case "longleftarrow": return "\\longleftarrow";
1931 case "llarr": return "\\leftleftarrows";
1932 case "lgr": return "\\greeklambda";
1933 case "lg": return "\\lessgtr";
1934 case "uring": return "\\uring";
1935 case "lesg": return "\\lesseqgtr";
1936 case "curlyeqsucc": return "\\curlyeqsucc";
1937 case "sigma": return "\\greeksigma";
1938 case "les": return "\\leqslant";
1939 case "leftrightsquigarrow": return "\\leftrightsquigarrow";
1940 case "bull": return "\\textbullet";
1941 case "Dagger": return "\\textddag";
1942 case "leftrightarrow": return "\\leftrightarrow";
1943 case "gammad": return "\\greekdigamma";
1944 case "nsup": return "\\nsupset";
1945 case "sub": return "\\subset";
1946 case "ldquo": return "\"";
1947 case "aacute": return "\\aacute";
1948 case "lcaron": return "\\lcaron";
1949 case "LessFullEqual": return "\\leqq";
1950 case "ContourIntegral": return "\\oint";
1951 case "lbrace": return "\\textbraceleft";
1952 case "lbarr": return "\\dashedleftarrow";
1953 case "larrtl": return "\\leftarrowtail";
1954 case "bigtriangleup": return "\\triangle";
1955 case "varepsilon": return "\\greekepsilonalt";
1956 case "lArr": return "\\Leftarrow";
1957 case "larrb": return "\\barleftarrow";
1958 case "sdotb": return "\\boxdot";
1959 case "hArr": return "\\Leftrightarrow";
1960 case "nlarr": return "\\nleftarrow";
1961 case "olarr": return "\\circlearrowright";
1962 case "thkap": return "\\approx";
1963 case "Star": return "\\star";
1964 case "aogon": return "\\aogonek";
1965 case "CirclePlus": return "\\oplus";
1966 case "kappav": return "\\varkappa";
1967 case "itilde": return "\\itilde";
1968 case "iogon": return "\\iogonek";
1969 case "Ccedil": return "\\Ccedilla";
1970 case "imped": return "\\Zstroke";
1971 case "imacr": return "\\imacron";
1972 case "Gcedil": return "\\Gcommaaccent";
1973 case "gneq": return "\\rneq";
1974 case "igr": return "\\greekiota";
1975 case "icirc": return "\\icircumflex";
1976 case "hstrok": return "\\hstroke";
1977 case "lrhar": return "\\leftrightharpoons";
1978 case "lrcorner": return "\\lrcorner";
1979 case "niv": return "\\ni";
1980 case "hoarr": return "\\leftrightarrowtriangle";
1981 case "hcirc": return "\\hcircumflex";
1982 case "hbar": return "\\hslash";
1983 case "half": return "\\onehalf";
1984 case "hairsp  ": return "\\irspace";
1985 case "ThinSpace  ": return "\\eakablethinspace";
1986 case "gtrless": return "\\gtrless";
1987 case "gt": return "\\gt";
1988 case "gsim": return "\\gtrsim";
1989 case "grave": return "\\textgrave";
1990 case "gl": return "\\gtrless";
1991 case "caron": return "\\textcaron";
1992 case "ggr": return "\\greekgamma";
1993 case "dArr": return "\\Downarrow";
1994 case "preccurlyeq": return "\\preccurlyeq";
1995 case "gdot": return "\\gdotaccent";
1996 case "frac15": return "\\onefifth";
1997 case "gacute": return "\\gacute";
1998 case "frac56": return "\\fivesixths";
1999 case "frac18": return "\\oneeighth";
2000 case "ecirc": return "\\ecircumflex";
2001 case "frac16": return "\\onesixth";
2002 case "gcirc": return "\\gcircumflex";
2003 case "LessGreater": return "\\lessgtr";
2004 case "jcirc": return "\\jcircumflex";
2005 case "frac12": return "\\onehalf";
2006 case "fllig": return "\\flligature";
2007 case "filig": return "\\filigature";
2008 case "ocirc": return "\\ocircumflex";
2009 case "fcy": return "\\cyrillicf";
2010 case "exist": return "\\exists";
2011 case "esim": return "\\eqsim";
2012 case "scirc": return "\\scircumflex";
2013 case "Hacek": return "\\textcaron";
2014 case "Ucirc": return "\\Ucircumflex";
2015 case "Wcirc": return "\\Wcircumflex";
2016 case "eqcirc": return "\\eqcirc";
2017 case "Ycirc": return "\\Ycircumflex";
2018 case "epsiv": return "\\greekepsilonalt";
2019 case "emsp14  ": return "\\urperemspace";
2020 case "rlhar": return "\\rightleftharpoons";
2021 case "acirc": return "\\acircumflex";
2022 case "emsp13  ": return "\\reeperemspace";
2023 case "ccirc": return "\\ccircumflex";
2024 case "emptyv": return "\\emptyset";
2025 case "Ecirc": return "\\Ecircumflex";
2026 case "Gcirc": return "\\Gcircumflex";
2027 case "Hcirc": return "\\Hcircumflex";
2028 case "Icirc": return "\\Icircumflex";
2029 case "Jcirc": return "\\Jcircumflex";
2030 case "NotTildeEqual": return "\\nsimeq";
2031 case "verbar": return "\\textbar";
2032 case "spar": return "\\parallel";
2033 case "LeftTee": return "\\dashv";
2034 case "ecaron": return "\\ecaron";
2035 case "duarr": return "\\downuparrows";
2036 case "Scirc": return "\\Scircumflex";
2037 case "els": return "\\eqslantless";
2038 case "downharpoonright": return "\\downharpoonright";
2039 case "doteqdot": return "\\doteqdot";
2040 case "dot": return "\\textdotaccent";
2041 case "npar": return "\\nparallel";
2042 case "div": return "\\textdiv";
2043 case "digamma": return "\\greekdigamma";
2044 case "UpperLeftArrow": return "\\nwarrow";
2045 case "Acirc": return "\\Acircumflex";
2046 case "dgr": return "\\greekdelta";
2047 case "Ccirc": return "\\Ccircumflex";
2048 case "ddagger": return "\\textddag";
2049 case "dd": return "\\differentiald";
2050 case "cuwed": return "\\curlywedge";
2051 case "curvearrowright": return "\\curvearrowright";
2052 case "cularr": return "\\curvearrowleft";
2053 case "varrho": return "\\greekrhoalt";
2054 case "ldquor": return "\\quotedblbase";
2055 case "complement": return "\\complement";
2056 case "clubsuit": return "\\clubsuit";
2057 case "DZcy": return "\\cyrillicDZHE";
2058 case "rdquor": return "\\quotedblright";
2059 case "centerdot": return "\\periodcentered";
2060 case "fflig": return "\\ffligature";
2061 case "ccedil": return "\\ccedilla";
2062 case "caps": return "\\cap";
2063 case "circledS": return "\\circledS";
2064 case "oelig": return "\\oeligature";
2065 case "bot": return "\\bot";
2066 case "bigvee": return "\\bigvee";
2067 case "prop": return "\\propto";
2068 case "bgr": return "\\greekbeta";
2069 case "minusb": return "\\boxminus";
2070 case "nvle": return "\\leq";
2071 case "loarr": return "\\leftarrowtriangle";
2072 case "horbar": return "\\texthorizontalbar";
2073 case "Diamond": return "\\diamond";
2074 case "wcirc": return "\\wcircumflex";
2075 case "aelig": return "\\aeligature";
2076 case "ycirc": return "\\ycircumflex";
2077 case "SupersetEqual": return "\\supseteq";
2078 case "curvearrowleft": return "\\curvearrowleft";
2079 case "zwj": return "\\zwj";
2080 case "psgr": return "\\greekpsi";
2081 case "atilde": return "\\atilde";
2082 case "ape": return "\\approxeq";
2083 case "NotSquareSubsetEqual": return "\\nsqsubseteq";
2084 case "kcedil": return "\\kcommaaccent";
2085 case "upsilon": return "\\greekupsilon";
2086 case "NotTildeTilde": return "\\napprox";
2087 case "ncedil": return "\\ncommaaccent";
2088 case "lcedil": return "\\lcommaaccent";
2089 case "scedil": return "\\scedilla";
2090 case "equiv": return "\\equiv";
2091 case "Vvdash": return "\\Vvdash";
2092 case "DoubleLeftArrow": return "\\Leftarrow";
2093 case "macr": return "\\textmacron";
2094 case "tcedil": return "\\tcedilla";
2095 case "RightCeiling": return "\\rceiling";
2096 case "diamond": return "\\diamond";
2097 case "UnderBar": return "\\textunderscore";
2098 case "Tcedil": return "\\Tcedilla";
2099 case "Nu": return "\\greekNu";
2100 case "precnsim": return "\\precnsim";
2101 case "Sigma": return "\\greekSigma";
2102 case "Proportional": return "\\propto";
2103 case "Sacute": return "\\Sacute";
2104 case "integers": return "\\integers";
2105 case "RightTee": return "\\vdash";
2106 case "Kcedil": return "\\Kcommaaccent";
2107 case "Upsilon": return "\\greekUpsilon";
2108 case "RightAngleBracket": return "\\rangle";
2109 case "Pi": return "\\greekPi";
2110 case "Ncedil": return "\\Ncommaaccent";
2111 case "Lcedil": return "\\Lcommaaccent";
2112 case "Scedil": return "\\Scedilla";
2113 case "Rcedil": return "\\Rcommaaccent";
2114 case "hookleftarrow": return "\\hookleftarrow";
2115 case "NotGreaterLess": return "\\ngtrless";
2116 case "Ocirc": return "\\Ocircumflex";
2117 case "OElig": return "\\OEligature";
2118 case "SquareSubsetEqual": return "\\sqsubseteq";
2119 case "Epsilon": return "\\greekEpsilon";
2120 case "lsaquo": return "\\guilsingleleft";
2121 case "NotTilde": return "\\nsim";
2122 case "LeftUpVector": return "\\upharpoonleft";
2123 case "NestedGreaterGreater": return "\\gg";
2124 case "Union": return "\\bigcup";
2125 case "LowerLeftArrow": return "\\swarrow";
2126 case "NotEqual": return "\\neq";
2127 case "Implies": return "\\Rightarrow";
2128 case "Gt": return "\\gg";
2129 case "GreaterEqual": return "\\geq";
2130 }
2131
2132 return null;
2133 }
2134
2139 public override Task Render(HtmlEntityUnicode Element)
2140 {
2141 this.Output.Append(EscapeLaTeX(new string((char)Element.Code, 1)));
2142
2143 return Task.CompletedTask;
2144 }
2145
2150 public override Task Render(InlineCode Element)
2151 {
2152 this.Output.Append("\\texttt{");
2153 this.Output.Append(EscapeLaTeX(Element.Code));
2154 this.Output.Append('}');
2155
2156 return Task.CompletedTask;
2157 }
2158
2163 public override Task Render(InlineHTML Element)
2164 {
2165 return Task.CompletedTask;
2166 }
2167
2172 public override async Task Render(InlineScript Element)
2173 {
2174 object Result = await Element.EvaluateExpression();
2175
2176 await this.RenderObject(Result, Element.AloneInParagraph, Element.Variables);
2177 }
2178
2185 public async Task RenderObject(object Result, bool AloneInParagraph, Variables Variables)
2186 {
2187 if (Result is null)
2188 return;
2189
2190 if (Result is XmlDocument Xml)
2191 Result = await MarkdownDocument.TransformXml(Xml, Variables);
2192 else if (Result is IToMatrix ToMatrix)
2193 Result = ToMatrix.ToMatrix();
2194
2195 if (Result is Graph G)
2196 {
2197 PixelInformation Pixels = G.CreatePixels(out GraphSettings GraphSettings);
2198 byte[] Bin = Pixels.EncodeAsPng();
2199 string FileName = await ImageContent.GetTemporaryFile(Bin, ImageCodec.FileExtensionPng);
2200
2201 if (AloneInParagraph)
2202 {
2203 this.Output.AppendLine("\\begin{figure}[!hb]");
2204 this.Output.AppendLine("\\centering");
2205 }
2206
2207 this.Output.Append("\\fbox{\\includegraphics[width=");
2208 this.Output.Append(((GraphSettings.Width * 3) / 4).ToString());
2209 this.Output.Append("pt, height=");
2210 this.Output.Append(((GraphSettings.Height * 3) / 4).ToString());
2211 this.Output.Append("pt]{");
2212 this.Output.Append(FileName.Replace('\\', '/'));
2213 this.Output.Append("}}");
2214
2215 if (AloneInParagraph)
2216 {
2217 this.Output.AppendLine();
2218 this.Output.AppendLine("\\end{figure}");
2219 this.Output.AppendLine();
2220 }
2221 }
2222 else if (Result is PixelInformation Pixels)
2223 {
2224 byte[] Bin = Pixels.EncodeAsPng();
2225 string FileName = await ImageContent.GetTemporaryFile(Bin, ImageCodec.FileExtensionPng);
2226
2227 if (AloneInParagraph)
2228 {
2229 this.Output.AppendLine("\\begin{figure}[!hb]");
2230 this.Output.AppendLine("\\centering");
2231 }
2232
2233 this.Output.Append("\\fbox{\\includegraphics[width=");
2234 this.Output.Append(((Pixels.Width * 3) / 4).ToString());
2235 this.Output.Append("pt, height=");
2236 this.Output.Append(((Pixels.Height * 3) / 4).ToString());
2237 this.Output.Append("pt]{");
2238 this.Output.Append(FileName.Replace('\\', '/'));
2239 this.Output.Append("}}");
2240
2241 if (AloneInParagraph)
2242 {
2243 this.Output.AppendLine();
2244 this.Output.AppendLine("\\end{figure}");
2245 this.Output.AppendLine();
2246 }
2247 }
2248 else if (Result is SKImage Img)
2249 {
2250 using (SKData Data = Img.Encode(SKEncodedImageFormat.Png, 100))
2251 {
2252 byte[] Bin = Data.ToArray();
2253 string FileName = await ImageContent.GetTemporaryFile(Bin, ImageCodec.FileExtensionPng);
2254
2255 if (AloneInParagraph)
2256 {
2257 this.Output.AppendLine("\\begin{figure}[!hb]");
2258 this.Output.AppendLine("\\centering");
2259 }
2260
2261 this.Output.Append("\\fbox{\\includegraphics[width=");
2262 this.Output.Append(((Img.Width * 3) / 4).ToString());
2263 this.Output.Append("pt, height=");
2264 this.Output.Append(((Img.Height * 3) / 4).ToString());
2265 this.Output.Append("pt]{");
2266 this.Output.Append(FileName.Replace('\\', '/'));
2267 this.Output.Append("}}");
2268
2269 if (AloneInParagraph)
2270 {
2271 this.Output.AppendLine();
2272 this.Output.AppendLine("\\end{figure}");
2273 this.Output.AppendLine();
2274 }
2275 }
2276 }
2277 else if (Result is MarkdownDocument Doc)
2278 {
2279 await this.RenderDocument(Doc, true); // Does not call ProcessAsyncTasks()
2280 Doc.ProcessAsyncTasks();
2281 }
2282 else if (Result is MarkdownContent Markdown)
2283 {
2284 Doc = await MarkdownDocument.CreateAsync(Markdown.Markdown, Markdown.Settings ?? new MarkdownSettings());
2285 await this.RenderDocument(Doc, true); // Does not call ProcessAsyncTasks()
2286 Doc.ProcessAsyncTasks();
2287 }
2288 else if (Result is Exception ex)
2289 {
2290 bool First = true;
2291
2292 ex = Log.UnnestException(ex);
2293
2294 this.Output.AppendLine("\\texttt{\\color{red}");
2295
2296 if (ex is AggregateException ex2)
2297 {
2298 foreach (Exception ex3 in ex2.InnerExceptions)
2299 {
2300 foreach (string Row in ex3.Message.Replace("\r\n", "\n").
2301 Replace('\r', '\n').Split('\n'))
2302 {
2303 if (First)
2304 First = false;
2305 else
2306 this.Output.AppendLine("\\\\");
2307
2308 this.Output.Append(EscapeLaTeX(Row));
2309 }
2310 }
2311 }
2312 else
2313 {
2314 foreach (string Row in ex.Message.Replace("\r\n", "\n").
2315 Replace('\r', '\n').Split('\n'))
2316 {
2317 if (First)
2318 First = false;
2319 else
2320 this.Output.AppendLine("\\\\");
2321
2322 this.Output.Append(EscapeLaTeX(Row));
2323 }
2324 }
2325
2326 this.Output.AppendLine("}");
2327
2328 if (AloneInParagraph)
2329 {
2330 this.Output.AppendLine();
2331 this.Output.AppendLine();
2332 }
2333 }
2334 else if (Result is ObjectMatrix M && !(M.ColumnNames is null))
2335 {
2336 this.Output.AppendLine("\\begin{table}[!hb]");
2337 this.Output.AppendLine("\\centering");
2338 this.Output.Append("\\begin{tabular}{");
2339 foreach (string _ in M.ColumnNames)
2340 this.Output.Append("|c");
2341
2342 this.Output.AppendLine("|}");
2343 this.Output.AppendLine("\\hline");
2344
2345 bool First = true;
2346
2347 foreach (string Name in M.ColumnNames)
2348 {
2349 if (First)
2350 First = false;
2351 else
2352 this.Output.Append(" & ");
2353
2354 this.Output.Append(EscapeLaTeX(Name));
2355 }
2356
2357 this.Output.AppendLine("\\\\");
2358 this.Output.AppendLine("\\hline");
2359
2360 int x, y;
2361
2362 for (y = 0; y < M.Rows; y++)
2363 {
2364 for (x = 0; x < M.Columns; x++)
2365 {
2366 if (x > 0)
2367 this.Output.Append(" & ");
2368
2369 object Item = M.GetElement(x, y).AssociatedObjectValue;
2370 if (!(Item is null))
2371 {
2372 if (Item is string s2)
2373 this.Output.Append(EscapeLaTeX(s2));
2374 else if (Item is MarkdownElement Element)
2375 {
2376 this.Output.Append('{');
2377 await Element.Render(this);
2378 this.Output.Append('}');
2379 }
2380 else
2381 {
2382 this.Output.Append('{');
2383 this.Output.Append(EscapeLaTeX(Expression.ToExpressionString(Item)));
2384 this.Output.Append('}');
2385 }
2386 }
2387
2388 this.Output.Append("</td>");
2389 }
2390
2391 this.Output.AppendLine("\\\\");
2392 }
2393
2394 this.Output.AppendLine("\\hline");
2395 this.Output.AppendLine("\\end{tabular}");
2396 this.Output.AppendLine("\\end{table}");
2397 this.Output.AppendLine();
2398 }
2399 else if (Result is Array A)
2400 {
2401 foreach (object Item in A)
2402 await this.RenderObject(Item, false, Variables);
2403 }
2404 else
2405 this.Output.Append(EscapeLaTeX(Result?.ToString() ?? string.Empty));
2406
2407 if (AloneInParagraph)
2408 {
2409 this.Output.AppendLine();
2410 this.Output.AppendLine();
2411 }
2412 }
2413
2418 public override Task Render(InlineText Element)
2419 {
2420 this.Output.Append(EscapeLaTeX(Element.Value));
2421 return Task.CompletedTask;
2422 }
2423
2428 public override async Task Render(Insert Element)
2429 {
2430 this.Output.Append("\\emph{");
2431 await this.RenderChildren(Element);
2432 this.Output.Append('}');
2433 }
2434
2439 public override Task Render(LineBreak Element)
2440 {
2441 this.Output.AppendLine("\\newline");
2442 return Task.CompletedTask;
2443 }
2444
2449 public override Task Render(Link Element)
2450 {
2451 return this.RenderChildren(Element);
2452 }
2453
2458 public override Task Render(LinkReference Element)
2459 {
2460 return this.RenderChildren(Element);
2461 }
2462
2467 public override Task Render(MetaReference Element)
2468 {
2469 bool FirstOnRow = true;
2470
2471 if (Element.TryGetMetaData(out KeyValuePair<string, bool>[] Values))
2472 {
2473 foreach (KeyValuePair<string, bool> P in Values)
2474 {
2475 if (FirstOnRow)
2476 FirstOnRow = false;
2477 else
2478 this.Output.Append(' ');
2479
2480 this.Output.Append(EscapeLaTeX(P.Key));
2481
2482 if (P.Value)
2483 {
2484 this.Output.AppendLine();
2485 FirstOnRow = true;
2486 }
2487 }
2488 }
2489
2490 return Task.CompletedTask;
2491 }
2492
2497 public override Task Render(Model.SpanElements.Multimedia Element)
2498 {
2499 IMultimediaLatexRenderer Renderer = Element.MultimediaHandler<IMultimediaLatexRenderer>();
2500 if (Renderer is null)
2501 return this.RenderChildren(Element);
2502 else
2503 return Renderer.RenderLatex(this, Element.Items, Element.Children, Element.AloneInParagraph, Element.Document);
2504 }
2505
2510 public override Task Render(MultimediaReference Element)
2511 {
2513
2514 if (!(Multimedia is null))
2515 {
2517 if (!(Renderer is null))
2518 return Renderer.RenderLatex(this, Multimedia.Items, Element.Children, Element.AloneInParagraph, Element.Document);
2519 }
2520
2521 return this.RenderChildren(Element);
2522 }
2523
2528 public override async Task Render(StrikeThrough Element)
2529 {
2530 this.Output.Append("\\strike{");
2531 await this.RenderChildren(Element);
2532 this.Output.Append('}');
2533 }
2534
2539 public override async Task Render(Strong Element)
2540 {
2541 this.Output.Append("\\textbf{");
2542 await this.RenderChildren(Element);
2543 this.Output.Append('}');
2544 }
2545
2550 public override async Task Render(SubScript Element)
2551 {
2552 this.Output.Append("\\textsubscript{");
2553 await this.RenderChildren(Element);
2554 this.Output.Append('}');
2555 }
2556
2561 public override async Task Render(SuperScript Element)
2562 {
2563 this.Output.Append("\\textsuperscript{");
2564 await this.RenderChildren(Element);
2565 this.Output.Append('}');
2566 }
2567
2572 public override async Task Render(Underline Element)
2573 {
2574 this.Output.Append("\\underline{");
2575 await this.RenderChildren(Element);
2576 this.Output.Append('}');
2577 }
2578
2579 #endregion
2580
2581 #region Block elements
2582
2587 public override async Task Render(BlockQuote Element)
2588 {
2589 this.Output.AppendLine("\\begin{quote}");
2590
2591 await this.RenderChildren(Element);
2592
2593 this.Output.AppendLine("\\end{quote}");
2594 this.Output.AppendLine();
2595 }
2596
2601 public override async Task Render(BulletList Element)
2602 {
2603 this.Output.AppendLine("\\begin{itemize}");
2604
2605 await this.RenderChildren(Element);
2606
2607 this.Output.AppendLine("\\end{itemize}");
2608 this.Output.AppendLine();
2609 }
2610
2615 public override async Task Render(CenterAligned Element)
2616 {
2617 this.Output.AppendLine("\\begin{center}");
2618
2619 await this.RenderChildren(Element);
2620
2621 this.Output.AppendLine("\\end{center}");
2622 this.Output.AppendLine();
2623 }
2624
2629 public override async Task Render(CodeBlock Element)
2630 {
2631 ICodeContentLatexRenderer Renderer = Element.CodeContentHandler<ICodeContentLatexRenderer>();
2632
2633 if (!(Renderer is null))
2634 {
2635 try
2636 {
2637 if (await Renderer.RenderLatex(this, Element.Rows, Element.Language, Element.Indent, Element.Document))
2638 return;
2639 }
2640 catch (Exception ex)
2641 {
2642 bool First = true;
2643
2644 ex = Log.UnnestException(ex);
2645
2646 this.Output.AppendLine("\\texttt{\\color{red}");
2647
2648 if (ex is AggregateException ex2)
2649 {
2650 foreach (Exception ex3 in ex2.InnerExceptions)
2651 {
2652 foreach (string Row in ex3.Message.Replace("\r\n", "\n").
2653 Replace('\r', '\n').Split('\n'))
2654 {
2655 if (First)
2656 First = false;
2657 else
2658 this.Output.AppendLine("\\\\");
2659
2660 this.Output.Append(EscapeLaTeX(Row));
2661 }
2662 }
2663 }
2664 else
2665 {
2666 foreach (string Row in ex.Message.Replace("\r\n", "\n").
2667 Replace('\r', '\n').Split('\n'))
2668 {
2669 if (First)
2670 First = false;
2671 else
2672 this.Output.AppendLine("\\\\");
2673
2674 this.Output.Append(EscapeLaTeX(Row));
2675 }
2676 }
2677
2678 this.Output.AppendLine("}");
2679 this.Output.AppendLine();
2680 }
2681 }
2682
2683 this.Output.AppendLine("\\begin{spverbatim}");
2684
2685 int i;
2686
2687 for (i = Element.Start; i <= Element.End; i++)
2688 {
2689 this.Output.Append(Element.IndentString);
2690 this.Output.AppendLine(Element.Rows[i]);
2691 }
2692
2693 this.Output.AppendLine();
2694 this.Output.AppendLine("\\end{spverbatim}");
2695 this.Output.AppendLine();
2696 }
2697
2702 public override Task Render(CommentBlock Element)
2703 {
2704 return Task.CompletedTask;
2705 }
2706
2711 public override Task Render(DefinitionDescriptions Element)
2712 {
2713 return this.RenderChildren(Element);
2714 }
2715
2720 public override async Task Render(DefinitionList Element)
2721 {
2722 int State = 0;
2725 int i, c;
2726
2727 this.Output.AppendLine("\\begin{description}");
2728
2729 while (!(Loop is null))
2730 {
2731 for (i = Loop.Start, c = Loop.Pos; i < c; i++)
2732 {
2733 E = Loop[i];
2734
2735 if (E is DefinitionTerms Terms)
2736 {
2737 switch (State)
2738 {
2739 case 0:
2740 this.Output.Append("\\item[");
2741 await Terms.Render(this);
2742 State++;
2743 break;
2744
2745 case 1:
2746 this.Output.Append(", ");
2747 await Terms.Render(this);
2748 break;
2749
2750 case 2:
2751 this.Output.AppendLine("}");
2752 this.Output.Append("\\item[");
2753 State--;
2754 await Terms.Render(this);
2755 break;
2756 }
2757 }
2758 else if (E is DefinitionDescriptions Descriptions)
2759 {
2760 switch (State)
2761 {
2762 case 0:
2763 this.Output.Append("\\item{");
2764 await Descriptions.Render(this);
2765 State += 2;
2766 break;
2767
2768 case 1:
2769 this.Output.Append("]{");
2770 await Descriptions.Render(this);
2771 State++;
2772 break;
2773
2774 case 2:
2775 this.Output.AppendLine();
2776 await Descriptions.Render(this);
2777 break;
2778 }
2779 }
2780 }
2781
2782 Loop = Loop.Next;
2783 }
2784
2785 switch (State)
2786 {
2787 case 1:
2788 this.Output.AppendLine("]{}");
2789 break;
2790
2791 case 2:
2792 this.Output.AppendLine("}");
2793 break;
2794 }
2795
2796 this.Output.AppendLine("\\end{description}");
2797 this.Output.AppendLine();
2798 }
2799
2804 public override Task Render(DefinitionTerms Element)
2805 {
2806 return this.RenderChildren(Element);
2807 }
2808
2813 public override async Task Render(DeleteBlocks Element)
2814 {
2815 this.Output.Append("\\strike{");
2816 await this.RenderChildren(Element);
2817 this.Output.Append('}');
2818 }
2819
2824 public override Task Render(Footnote Element)
2825 {
2826 return this.RenderChildren(Element);
2827 }
2828
2833 public override async Task Render(Header Element)
2834 {
2835 string Command;
2836
2837 if (!this.abstractOutput)
2838 {
2839 if (Element.HasOneChild &&
2840 Element.FirstChild is InlineText Text &&
2841 string.Compare(Text.Value, "abstract", true) == 0)
2842 {
2843 this.Output.AppendLine("\\begin{abstract}");
2844 this.abstractOutput = true;
2845 this.inAbstract = true;
2846 return;
2847 }
2848 else
2849 {
2850 if (this.Document.TryGetMetaData("DESCRIPTION", out KeyValuePair<string, bool>[] Values))
2851 {
2852 this.Output.AppendLine("\\begin{abstract}");
2853
2854 foreach (KeyValuePair<string, bool> P in Values)
2855 this.Output.AppendLine(EscapeLaTeX(P.Key));
2856
2857 this.Output.AppendLine("\\end{abstract}");
2858 this.abstractOutput = true;
2859 }
2860 }
2861 }
2862
2863 switch (this.LatexSettings.DocumentClass)
2864 {
2865 case LaTeXDocumentClass.Book:
2866 case LaTeXDocumentClass.Report:
2867 switch (Element.Level)
2868 {
2869 case 1:
2870 Command = "part";
2871 break;
2872
2873 case 2:
2874 Command = "chapter";
2875 break;
2876
2877 case 3:
2878 Command = "section";
2879 break;
2880
2881 case 4:
2882 Command = "subsection";
2883 break;
2884
2885 case 5:
2886 Command = "subsubsection";
2887 break;
2888
2889 case 6:
2890 Command = "paragraph";
2891 break;
2892
2893 case 7:
2894 default:
2895 Command = "subparagraph";
2896 break;
2897 }
2898 break;
2899
2900 case LaTeXDocumentClass.Article:
2901 case LaTeXDocumentClass.Standalone:
2902 default:
2903 switch (Element.Level)
2904 {
2905 case 1:
2906 Command = "section";
2907 break;
2908
2909 case 2:
2910 Command = "subsection";
2911 break;
2912
2913 case 3:
2914 Command = "subsubsection";
2915 break;
2916
2917 case 4:
2918 Command = "paragraph";
2919 break;
2920
2921 case 5:
2922 default:
2923 Command = "subparagraph";
2924 break;
2925 }
2926 break;
2927 }
2928
2929 if (this.inAbstract)
2930 {
2931 this.Output.AppendLine("\\end{abstract}");
2932 this.inAbstract = false;
2933 }
2934
2935 this.Output.Append('\\');
2936 this.Output.Append(Command);
2937 this.Output.Append("*{");
2938
2939 await this.RenderChildren(Element);
2940
2941 this.Output.AppendLine("}");
2942 this.Output.AppendLine();
2943 }
2944
2949 public override Task Render(HorizontalRule Element)
2950 {
2951 this.Output.AppendLine("\\hrulefill");
2952 return Task.CompletedTask;
2953 }
2954
2959 public override async Task Render(HtmlBlock Element)
2960 {
2961 await this.RenderChildren(Element);
2962
2963 this.Output.AppendLine();
2964 this.Output.AppendLine();
2965 }
2966
2971 public override async Task Render(InsertBlocks Element)
2972 {
2973 this.Output.Append("\\emph{");
2974 await this.RenderChildren(Element);
2975 this.Output.Append('}');
2976 }
2977
2982 public override Task Render(InvisibleBreak Element)
2983 {
2984 return Task.CompletedTask;
2985 }
2986
2991 public override async Task Render(LeftAligned Element)
2992 {
2993 this.Output.AppendLine("\\begin{flushleft}");
2994
2995 await this.RenderChildren(Element);
2996
2997 this.Output.AppendLine("\\end{flushleft}");
2998 this.Output.AppendLine();
2999 }
3000
3005 public override async Task Render(MarginAligned Element)
3006 {
3007 this.Output.AppendLine("\\begin{justify}");
3008
3009 await this.RenderChildren(Element);
3010
3011 this.Output.AppendLine("\\end{justify}");
3012 this.Output.AppendLine();
3013 }
3014
3019 public override Task Render(NestedBlock Element)
3020 {
3021 return this.RenderChildren(Element);
3022 }
3023
3028 public override async Task Render(NumberedItem Element)
3029 {
3030 if (Element.NumberExplicit)
3031 {
3032 this.Output.Append("\\item[");
3033 this.Output.Append(Element.Number.ToString());
3034 this.Output.Append("]{");
3035 }
3036 else
3037 this.Output.Append("\\item{");
3038
3039 await this.RenderChild(Element);
3040
3041 this.Output.AppendLine("}");
3042 }
3043
3048 public override async Task Render(NumberedList Element)
3049 {
3050 this.Output.AppendLine("\\begin{enumerate}");
3051
3052 await this.RenderChildren(Element);
3053
3054 this.Output.AppendLine("\\end{enumerate}");
3055 this.Output.AppendLine();
3056 }
3057
3062 public override async Task Render(Paragraph Element)
3063 {
3064 await this.RenderChildren(Element);
3065
3066 this.Output.AppendLine();
3067 this.Output.AppendLine();
3068 }
3069
3074 public override async Task Render(RightAligned Element)
3075 {
3076 this.Output.AppendLine("\\begin{flushright}");
3077
3078 await this.RenderChildren(Element);
3079
3080 this.Output.AppendLine("\\end{flushright}");
3081 this.Output.AppendLine();
3082 }
3083
3088 public override Task Render(Sections Element)
3089 {
3090 return this.RenderChildren(Element);
3091 }
3092
3097 public override Task Render(SectionSeparator Element)
3098 {
3099 this.Output.AppendLine();
3100 this.Output.AppendLine("\\newpage");
3101 this.Output.AppendLine();
3102
3103 return Task.CompletedTask;
3104 }
3105
3110 public override async Task Render(Table Element)
3111 {
3113 MarkdownElement[] Row;
3114 TextAlignment?[] CellAlignments;
3115 int NrRows, RowIndex;
3116 int NrColumns = Element.Columns;
3117 string s;
3118 int i, j, k;
3119
3120 this.Output.AppendLine("\\begin{table}[!hb]");
3121 this.Output.AppendLine("\\centering");
3122 this.Output.Append("\\begin{tabular}{");
3123 foreach (TextAlignment Alignment in Element.ColumnAlignments)
3124 {
3125 this.Output.Append('|');
3126 this.RenderAlignment(Alignment);
3127 }
3128
3129 this.Output.AppendLine("|}");
3130 this.Output.AppendLine("\\hline");
3131
3132 NrRows = Element.Headers.Length;
3133 for (RowIndex = 0; RowIndex < NrRows; RowIndex++)
3134 {
3135 Row = Element.Headers[RowIndex];
3136 CellAlignments = Element.HeaderCellAlignments[RowIndex];
3137
3138 for (i = 0; i < NrColumns; i++)
3139 {
3140 if (i > 0)
3141 this.Output.Append(" & ");
3142
3143 k = 1;
3144 j = i + 1;
3145 while (j < NrColumns && Row[j++] is null)
3146 k++;
3147
3148 if (k > 1)
3149 {
3150 this.Output.Append("\\multicolumn{");
3151 this.Output.Append(k.ToString());
3152 this.Output.Append("}{|");
3153 this.RenderAlignment(CellAlignments[i] ?? Element.ColumnAlignments[i]);
3154 this.Output.Append("|}{");
3155 }
3156
3157 E = Row[i];
3158 if (!(E is null))
3159 await E.Render(this);
3160
3161 if (k > 1)
3162 {
3163 this.Output.Append('}');
3164 i += k - 1;
3165 }
3166 }
3167
3168 this.Output.AppendLine("\\\\");
3169 }
3170
3171 this.Output.AppendLine("\\hline");
3172
3173 NrRows = Element.Rows.Length;
3174 for (RowIndex = 0; RowIndex < NrRows; RowIndex++)
3175 {
3176 Row = Element.Rows[RowIndex];
3177 CellAlignments = Element.RowCellAlignments[RowIndex];
3178
3179 for (i = 0; i < NrColumns; i++)
3180 {
3181 if (i > 0)
3182 this.Output.Append(" & ");
3183
3184 k = 1;
3185 j = i + 1;
3186 while (j < NrColumns && Row[j++] is null)
3187 k++;
3188
3189 if (k > 1)
3190 {
3191 this.Output.Append("\\multicolumn{");
3192 this.Output.Append(k.ToString());
3193 this.Output.Append("}{|");
3194 this.RenderAlignment(CellAlignments[i] ?? Element.ColumnAlignments[i]);
3195 this.Output.Append("|}{");
3196 }
3197
3198 E = Row[i];
3199 if (!(E is null))
3200 await E.Render(this);
3201
3202 if (k > 1)
3203 this.Output.Append('}');
3204 }
3205
3206 this.Output.AppendLine("\\\\");
3207 }
3208
3209 this.Output.AppendLine("\\hline");
3210 this.Output.AppendLine("\\end{tabular}");
3211
3212 if (!string.IsNullOrEmpty(Element.Id))
3213 {
3214 this.Output.Append("\\caption{");
3215
3216 s = string.IsNullOrEmpty(Element.Caption) ? Element.Id : Element.Caption;
3217
3218 this.Output.Append(EscapeLaTeX(s));
3219
3220 this.Output.AppendLine("}");
3221 this.Output.Append("\\label{");
3222
3223 this.Output.Append(EscapeLaTeX(Element.Id));
3224
3225 this.Output.AppendLine("}");
3226 }
3227
3228 this.Output.AppendLine("\\end{table}");
3229 this.Output.AppendLine();
3230 }
3231
3232 private void RenderAlignment(TextAlignment Alignment)
3233 {
3234 switch (Alignment)
3235 {
3236 case TextAlignment.Left:
3237 default:
3238 this.Output.Append('l');
3239 break;
3240
3241 case TextAlignment.Center:
3242 this.Output.Append('c');
3243 break;
3244
3245 case TextAlignment.Right:
3246 this.Output.Append('r');
3247 break;
3248 }
3249 }
3250
3255 public override async Task Render(TaskItem Element)
3256 {
3257 this.Output.Append("\\item");
3258
3259 if (Element.IsChecked)
3260 this.Output.Append("[\\checked]");
3261
3262 this.Output.Append('{');
3263 await this.RenderChild(Element);
3264 this.Output.AppendLine("}");
3265 }
3266
3271 public override async Task Render(TaskList Element)
3272 {
3273 this.Output.AppendLine("\\begin{tasklist}");
3274
3275 await this.RenderChildren(Element);
3276
3277 this.Output.AppendLine("\\end{tasklist}");
3278 this.Output.AppendLine();
3279 }
3280
3285 public override async Task Render(UnnumberedItem Element)
3286 {
3287 this.Output.Append("\\item{");
3288 await this.RenderChild(Element);
3289 this.Output.AppendLine("}");
3290 }
3291
3292 #endregion
3293
3294 }
3295}
Helps with parsing of commong data types.
Definition: CommonTypes.cs:15
static string Escape(string s, char[] CharactersToEscape, string EscapeSequence)
Escapes a set of characters in a string.
Definition: CommonTypes.cs:830
Image encoder/decoder.
Definition: ImageCodec.cs:14
const string FileExtensionPng
png
Definition: ImageCodec.cs:75
Contains settings that the LaTeX export uses to customize LaTeX output.
Renders LaTeX from a Markdown document.
override Task Render(HtmlEntity Element)
Renders Element .
override async Task Render(SubScript Element)
Renders Element .
override async Task Render(BlockQuote Element)
Renders Element .
override Task Render(EmojiReference Element)
Renders Element .
override async Task Render(InsertBlocks Element)
Renders Element .
override async Task Render(Insert Element)
Renders Element .
override async Task Render(Strong Element)
Renders Element .
override Task Render(NestedBlock Element)
Renders Element .
LatexRenderer(LaTeXSettings LatexSettings)
Renders LaTeX from a Markdown document.
override async Task Render(CenterAligned Element)
Renders Element .
override Task Render(LinkReference Element)
Renders Element .
override Task Render(InlineText Element)
Renders Element .
override Task Render(HtmlEntityUnicode Element)
Renders Element .
override async Task Render(FootnoteReference Element)
Renders Element .
override async Task Render(InlineScript Element)
Renders Element .
override async Task Render(TaskItem Element)
Renders Element .
override Task Render(LineBreak Element)
Renders Element .
override Task Render(Footnote Element)
Renders Element .
override Task Render(Sections Element)
Renders Element .
override async Task Render(RightAligned Element)
Renders Element .
override Task Render(InlineCode Element)
Renders Element .
override async Task Render(StrikeThrough Element)
Renders Element .
override Task Render(Link Element)
Renders Element .
async Task RenderObject(object Result, bool AloneInParagraph, Variables Variables)
Generates HTML from Script output.
override async Task Render(BulletList Element)
Renders Element .
override Task Render(AutomaticLinkUrl Element)
Renders Element .
override Task Render(DefinitionTerms Element)
Renders Element .
override async Task Render(Table Element)
Renders Element .
override async Task Render(Emphasize Element)
Renders Element .
override async Task Render(MarginAligned Element)
Renders Element .
override Task Render(Model.SpanElements.Multimedia Element)
Renders Element .
override async Task Render(HtmlBlock Element)
Renders Element .
override Task Render(InvisibleBreak Element)
Renders Element .
override Task Render(Abbreviation Element)
Renders Element .
override async Task Render(DefinitionList Element)
Renders Element .
override Task Render(MetaReference Element)
Renders Element .
override async Task Render(TaskList Element)
Renders Element .
override Task RenderDocumentHeader()
Renders the document header.
LatexRenderer(StringBuilder Output, LaTeXSettings LatexSettings)
Renders LaTeX from a Markdown document.
override Task Render(MultimediaReference Element)
Renders Element .
override async Task Render(UnnumberedItem Element)
Renders Element .
override Task Render(DefinitionDescriptions Element)
Renders Element .
override Task Render(AutomaticLinkMail Element)
Renders Element .
static string EscapeLaTeX(string s)
Escapes text for output in a LaTeX document.
override Task Render(InlineHTML Element)
Renders Element .
override async Task Render(LeftAligned Element)
Renders Element .
override async Task Render(Delete Element)
Renders Element .
readonly LaTeXSettings LatexSettings
LaTeX settings.
override async Task Render(NumberedList Element)
Renders Element .
override async Task Render(DeleteBlocks Element)
Renders Element .
override async Task Render(Underline Element)
Renders Element .
override Task Render(HashTag Element)
Renders Element .
override Task RenderDocumentFooter()
Renders the document header.
override async Task Render(SuperScript Element)
Renders Element .
override async Task Render(Header Element)
Renders Element .
override async Task Render(Paragraph Element)
Renders Element .
override async Task Render(NumberedItem Element)
Renders Element .
override Task Render(CommentBlock Element)
Renders Element .
override Task Render(SectionSeparator Element)
Renders Element .
override Task Render(DetailsReference Element)
Renders Element .
override Task Render(HorizontalRule Element)
Renders Element .
override async Task Render(CodeBlock Element)
Renders Element .
Class that can be used to encapsulate Markdown to be returned from a Web Service, bypassing any encod...
Contains a markdown document. This markdown document class supports original markdown,...
static async Task< object > TransformXml(XmlDocument Xml, Variables Variables)
Transforms XML to an object that is easier to visualize.
bool TryGetMetaData(string Key, out KeyValuePair< string, bool >[] Value)
Tries to get a meta-data value given its key.
MarkdownDocument Detail
Detail document of a master document.
Multimedia GetReference(string Label)
Gets the multimedia information referenced by a label.
static Task< MarkdownDocument > CreateAsync(string MarkdownText, params Type[] TransparentExceptionTypes)
Contains a markdown document. This markdown document class supports original markdown,...
Contains settings that the Markdown parser uses to customize its behavior.
Represents a block quote in a markdown document.
Definition: BlockQuote.cs:11
Represents a bullet list in a markdown document.
Definition: BulletList.cs:11
Represents a center-aligned set of blocks in a markdown document.
Represents a code block in a markdown document.
Definition: CodeBlock.cs:17
string IndentString
String used for indentation.
Definition: CodeBlock.cs:279
Represents a comment block in a markdown document.
Definition: CommentBlock.cs:10
Represents a definition list in a markdown document.
Represents inserted blocks in a markdown document.
Definition: DeleteBlocks.cs:11
Represents a header in a markdown document.
Definition: Header.cs:15
Represents a block of HTML in a markdown document.
Definition: HtmlBlock.cs:11
Represents inserted blocks in a markdown document.
Definition: InsertBlocks.cs:11
Represents a left-aligned set of blocks in a markdown document.
Definition: LeftAligned.cs:11
Represents a margin-aligned set of blocks in a markdown document.
Represents a nested block with no special formatting rules in a markdown document.
Definition: NestedBlock.cs:12
Represents a numbered item in an ordered list.
Definition: NumberedItem.cs:10
bool NumberExplicit
If number is explicitly provided (true) or inferred (false).
Definition: NumberedItem.cs:40
Represents a numbered list in a markdown document.
Definition: NumberedList.cs:11
Represents a paragraph in a markdown document.
Definition: Paragraph.cs:11
Represents a right-aligned set of blocks in a markdown document.
Definition: RightAligned.cs:11
Represents a sequence of sections.
Definition: Sections.cs:11
Represents a table in a markdown document.
Definition: Table.cs:11
Represents a task item in a task list.
Definition: TaskItem.cs:10
bool IsChecked
If the item is checked or not.
Definition: TaskItem.cs:31
Represents a task list in a markdown document.
Definition: TaskList.cs:11
Represents an unnumbered item in an ordered list.
override ChunkedList< MarkdownElement > Children
Any children of the element.
bool HasOneChild
If the element has only one child.
MarkdownElement FirstChild
First child, or null if none.
Abstract base class for all markdown elements.
MarkdownDocument Document
Markdown document.
static Task< string > GetTemporaryFile(byte[] BinaryImage)
Stores an image in binary form as a temporary file. Files will be deleted when application closes.
Definition: ImageContent.cs:89
bool AutoExpand
If the footnote should automatically be expanded when rendered, if format supports auto-expansion.
Represents an HTML entity in Unicode format.
bool AloneInParagraph
If the element is alone in a paragraph.
Definition: InlineScript.cs:55
async Task< object > EvaluateExpression()
Evaluates the script expression.
Definition: InlineScript.cs:71
bool TryGetMetaData(out KeyValuePair< string, bool >[] Values)
Tries to get meta-data from the document.
MultimediaItem[] Items
Multimedia items.
Definition: Multimedia.cs:41
bool AloneInParagraph
If the element is alone in a paragraph.
Abstract base class for Markdown renderers.
Definition: Renderer.cs:15
readonly StringBuilder Output
Renderer output.
Definition: Renderer.cs:19
Task RenderChild(MarkdownElementSingleChild Element)
Renders the child of Element .
Definition: Renderer.cs:178
virtual async Task RenderDocument(MarkdownDocument Document, bool Inclusion)
Renders a document.
Definition: Renderer.cs:76
Task RenderChildren(MarkdownElementChildren Element)
Renders the children of Element .
Definition: Renderer.cs:147
override string ToString()
Returns the renderer output.
Definition: Renderer.cs:130
MarkdownDocument Document
Reference to Markdown document being processed.
Definition: Renderer.cs:24
Static class managing the application event log. Applications and services log events on this static ...
Definition: Log.cs:14
static Exception UnnestException(Exception Exception)
Unnests an exception, to extract the relevant inner exception.
Definition: Log.cs:828
Node referencing a chunk in a ChunkedList<T>
Definition: ChunkNode.cs:11
ChunkNode< T > Next
Next chunk
Definition: ChunkNode.cs:26
int Pos
Index after the last element in chunk.
Definition: ChunkNode.cs:51
int Start
Index of first element in chunk.
Definition: ChunkNode.cs:46
ChunkNode< T > FirstChunk
First chunk
Definition: ChunkedList.cs:259
Class managing a script expression.
Definition: Expression.cs:41
static string ToExpressionString(object Value)
Converts an object to a string, that can be parsed as part of an expression.
Definition: Expression.cs:5052
Base class for graphs.
Definition: Graph.cs:88
Contains pixel information
virtual byte[] EncodeAsPng()
Encodes the pixels into a binary PNG image.
ToMatrix(ScriptNode Operand, bool NullCheck, int Start, int Length, Expression Expression)
To-Matrix operator.
Definition: ToMatrix.cs:22
Collection of variables.
Definition: Variables.cs:25
Interface for multimedia content LaTeX renderers.
Interface for objects that can be converted into matrices.
Definition: IToMatrix.cs:9
Definition: ImplTypes.g.cs:58
LaTeXDocumentClass
Document class of LaTeX output.
Definition: LaTeXSettings.cs:7
LaTeXPaper
LaTeX output paper format
TextAlignment
Text alignment of contents.