| author | Fabian Huch <huch@in.tum.de> | 
| Fri, 15 Mar 2024 17:57:03 +0100 | |
| changeset 79899 | c73a36081b1c | 
| parent 79503 | c67b47cd41dc | 
| child 80789 | bcecb69f72fa | 
| permissions | -rw-r--r-- | 
| 79503 | 1 | (* Title: Pure/General/latex.ML | 
| 73754 | 2 | Author: Makarius | 
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 3 | |
| 79503 | 4 | Support for LaTeX. | 
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 5 | *) | 
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 6 | |
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 7 | signature LATEX = | 
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 8 | sig | 
| 73780 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73779diff
changeset | 9 | type text = XML.body | 
| 67194 
1c0a6a957114
positions as postlude: avoid intrusion of odd %-forms into main tex source;
 wenzelm parents: 
67189diff
changeset | 10 | val text: string * Position.T -> text | 
| 73780 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73779diff
changeset | 11 | val string: string -> text | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73779diff
changeset | 12 | val block: text -> XML.tree | 
| 74784 
d2522bb4db1b
symbolic latex_output via XML, interpreted in Isabelle/Scala;
 wenzelm parents: 
74781diff
changeset | 13 | val output: text -> text | 
| 74790 | 14 | val macro0: string -> text | 
| 15 | val macro: string -> text -> text | |
| 16 | val environment: string -> text -> text | |
| 76371 
1ac2416e8432
tuned signature (again, amending f32ac01aef5e), e.g. relevant for Isabelle/DOF;
 wenzelm parents: 
74884diff
changeset | 17 | val output_name: string -> string | 
| 58716 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 18 | val output_ascii: string -> string | 
| 71899 | 19 | val output_ascii_breakable: string -> string -> string | 
| 11719 | 20 | val output_symbols: Symbol.symbol list -> string | 
| 67145 | 21 | val output_syms: string -> string | 
| 67461 | 22 | val symbols: Symbol_Pos.T list -> text | 
| 23 | val symbols_output: Symbol_Pos.T list -> text | |
| 73780 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73779diff
changeset | 24 | val isabelle_body: string -> text -> text | 
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 25 | val theory_entry: string -> string | 
| 76956 
e47fb5cfef41
clarified Latex markup: optional cite "location" consists of nested document text;
 wenzelm parents: 
76955diff
changeset | 26 |   val cite: {kind: string, citations: (string * Position.T) list, location: text} -> text
 | 
| 73754 | 27 |   type index_item = {text: text, like: string}
 | 
| 28 |   type index_entry = {items: index_item list, def: bool}
 | |
| 29 | val index_entry: index_entry -> text | |
| 73763 
eccc4a13216d
clarified index antiquotation for ML: more ambitious type-setting, more accurate syntax;
 wenzelm parents: 
73754diff
changeset | 30 | val index_variants: (binding -> bool option -> 'a -> 'a) -> binding -> 'a -> 'a | 
| 66021 | 31 | val latexN: string | 
| 69346 
3c29edccf739
expose latex mode operations, to facilitate adhoc changes to it;
 wenzelm parents: 
67462diff
changeset | 32 | val latex_markup: string * Properties.T -> Markup.output | 
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 33 | end; | 
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 34 | |
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 35 | structure Latex: LATEX = | 
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 36 | struct | 
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 37 | |
| 67194 
1c0a6a957114
positions as postlude: avoid intrusion of odd %-forms into main tex source;
 wenzelm parents: 
67189diff
changeset | 38 | (* text with positions *) | 
| 
1c0a6a957114
positions as postlude: avoid intrusion of odd %-forms into main tex source;
 wenzelm parents: 
67189diff
changeset | 39 | |
| 73780 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73779diff
changeset | 40 | type text = XML.body; | 
| 73754 | 41 | |
| 74779 | 42 | fun text (s, pos) = | 
| 43 | if s = "" then [] | |
| 44 | else if pos = Position.none then [XML.Text s] | |
| 45 | else [XML.Elem (Position.markup pos Markup.document_latex, [XML.Text s])]; | |
| 67194 
1c0a6a957114
positions as postlude: avoid intrusion of odd %-forms into main tex source;
 wenzelm parents: 
67189diff
changeset | 46 | |
| 73780 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73779diff
changeset | 47 | fun string s = text (s, Position.none); | 
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73779diff
changeset | 48 | |
| 
466fae6bf22e
compose Latex text as XML, output exported YXML in Isabelle/Scala;
 wenzelm parents: 
73779diff
changeset | 49 | fun block body = XML.Elem (Markup.document_latex, body); | 
| 67195 | 50 | |
| 74784 
d2522bb4db1b
symbolic latex_output via XML, interpreted in Isabelle/Scala;
 wenzelm parents: 
74781diff
changeset | 51 | fun output body = [XML.Elem (Markup.latex_output, body)]; | 
| 
d2522bb4db1b
symbolic latex_output via XML, interpreted in Isabelle/Scala;
 wenzelm parents: 
74781diff
changeset | 52 | |
| 74790 | 53 | fun macro0 name = [XML.Elem (Markup.latex_macro0 name, [])]; | 
| 54 | fun macro name body = [XML.Elem (Markup.latex_macro name, body)]; | |
| 55 | fun environment name body = [XML.Elem (Markup.latex_environment name, body)]; | |
| 56 | ||
| 67194 
1c0a6a957114
positions as postlude: avoid intrusion of odd %-forms into main tex source;
 wenzelm parents: 
67189diff
changeset | 57 | |
| 67145 | 58 | (* output name for LaTeX macros *) | 
| 59 | ||
| 60 | val output_name = | |
| 61 | translate_string | |
| 62 | (fn "_" => "UNDERSCORE" | |
| 63 | | "'" => "PRIME" | |
| 64 | | "0" => "ZERO" | |
| 65 | | "1" => "ONE" | |
| 66 | | "2" => "TWO" | |
| 67 | | "3" => "THREE" | |
| 68 | | "4" => "FOUR" | |
| 69 | | "5" => "FIVE" | |
| 70 | | "6" => "SIX" | |
| 71 | | "7" => "SEVEN" | |
| 72 | | "8" => "EIGHT" | |
| 73 | | "9" => "NINE" | |
| 74 | | s => s); | |
| 75 | ||
| 76 | fun enclose_name bg en = enclose bg en o output_name; | |
| 77 | ||
| 78 | ||
| 61455 | 79 | (* output verbatim ASCII *) | 
| 58716 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 80 | |
| 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 81 | val output_ascii = | 
| 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 82 | translate_string | 
| 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 83 | (fn " " => "\\ " | 
| 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 84 | | "\t" => "\\ " | 
| 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 85 | | "\n" => "\\isanewline\n" | 
| 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 86 | | s => | 
| 72315 
8162ca81ea8a
suppress ligatures more robustly, notably for lualatex;
 wenzelm parents: 
71899diff
changeset | 87 | s | 
| 77851 | 88 |           |> member_string "\"#$%&',-<>\\^_`{}~" s ? enclose "{\\char`\\" "}"
 | 
| 72315 
8162ca81ea8a
suppress ligatures more robustly, notably for lualatex;
 wenzelm parents: 
71899diff
changeset | 89 |           |> suffix "{\\kern0pt}");
 | 
| 58716 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 90 | |
| 71899 | 91 | fun output_ascii_breakable sep = | 
| 92 | space_explode sep | |
| 93 | #> map output_ascii | |
| 94 |   #> space_implode (output_ascii sep ^ "\\discretionary{}{}{}");
 | |
| 95 | ||
| 58716 
23a380cc45f4
official support for "tt" style variants, avoid fragile \verb in LaTeX;
 wenzelm parents: 
55828diff
changeset | 96 | |
| 61455 | 97 | (* output symbols *) | 
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 98 | |
| 7900 | 99 | local | 
| 100 | ||
| 40402 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 101 | val char_table = | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 102 | Symtab.make | 
| 63590 
4854f7ee0987
proper latex rendering of abbrevs templates (e.g. src/HOL/Nonstandard_Analysis/HLim.thy);
 wenzelm parents: 
61595diff
changeset | 103 |    [("\007", "{\\isacharbell}"),
 | 
| 
4854f7ee0987
proper latex rendering of abbrevs templates (e.g. src/HOL/Nonstandard_Analysis/HLim.thy);
 wenzelm parents: 
61595diff
changeset | 104 |     ("!", "{\\isacharbang}"),
 | 
| 40402 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 105 |     ("\"", "{\\isachardoublequote}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 106 |     ("#", "{\\isacharhash}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 107 |     ("$", "{\\isachardollar}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 108 |     ("%", "{\\isacharpercent}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 109 |     ("&", "{\\isacharampersand}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 110 |     ("'", "{\\isacharprime}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 111 |     ("(", "{\\isacharparenleft}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 112 |     (")", "{\\isacharparenright}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 113 |     ("*", "{\\isacharasterisk}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 114 |     ("+", "{\\isacharplus}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 115 |     (",", "{\\isacharcomma}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 116 |     ("-", "{\\isacharminus}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 117 |     (".", "{\\isachardot}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 118 |     ("/", "{\\isacharslash}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 119 |     (":", "{\\isacharcolon}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 120 |     (";", "{\\isacharsemicolon}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 121 |     ("<", "{\\isacharless}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 122 |     ("=", "{\\isacharequal}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 123 |     (">", "{\\isachargreater}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 124 |     ("?", "{\\isacharquery}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 125 |     ("@", "{\\isacharat}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 126 |     ("[", "{\\isacharbrackleft}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 127 |     ("\\", "{\\isacharbackslash}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 128 |     ("]", "{\\isacharbrackright}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 129 |     ("^", "{\\isacharcircum}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 130 |     ("_", "{\\isacharunderscore}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 131 |     ("`", "{\\isacharbackquote}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 132 |     ("{", "{\\isacharbraceleft}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 133 |     ("|", "{\\isacharbar}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 134 |     ("}", "{\\isacharbraceright}"),
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 135 |     ("~", "{\\isachartilde}")];
 | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 136 | |
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 137 | fun output_chr " " = "\\ " | 
| 43709 
717e96cf9527
discontinued special treatment of hard tabulators;
 wenzelm parents: 
43485diff
changeset | 138 | | output_chr "\t" = "\\ " | 
| 40402 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 139 | | output_chr "\n" = "\\isanewline\n" | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 140 | | output_chr c = | 
| 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 141 | (case Symtab.lookup char_table c of | 
| 72315 
8162ca81ea8a
suppress ligatures more robustly, notably for lualatex;
 wenzelm parents: 
71899diff
changeset | 142 |         SOME s => s ^ "{\\kern0pt}"
 | 
| 40402 
b646316f8b3c
basic setup for literal replacement text in PDF, to support copy/paste of Isabelle symbols;
 wenzelm parents: 
39666diff
changeset | 143 |       | NONE => if Symbol.is_ascii_digit c then enclose "{\\isadigit{" "}}" c else c);
 | 
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 144 | |
| 67263 | 145 | fun output_sym sym = | 
| 14874 | 146 | (case Symbol.decode sym of | 
| 147 | Symbol.Char s => output_chr s | |
| 37533 
d775bd70f571
explicit treatment of UTF8 character sequences as Isabelle symbols;
 wenzelm parents: 
36959diff
changeset | 148 | | Symbol.UTF8 s => s | 
| 67263 | 149 |   | Symbol.Sym s => enclose_name "{\\isasym" "}" s
 | 
| 150 | | Symbol.Control s => enclose_name "\\isactrl" " " s | |
| 43485 | 151 | | Symbol.Malformed s => error (Symbol.malformed_msg s) | 
| 152 | | Symbol.EOF => error "Bad EOF symbol"); | |
| 7900 | 153 | |
| 67428 | 154 | open Basic_Symbol_Pos; | 
| 155 | ||
| 64526 
01920e390645
embedded latex has 0 length -- imitating \<^raw> before aa1fe1103ab8;
 wenzelm parents: 
63936diff
changeset | 156 | val scan_latex_length = | 
| 67428 | 157 | Scan.many1 (fn (s, _) => s <> Symbol.latex andalso Symbol.not_eof s) | 
| 64526 
01920e390645
embedded latex has 0 length -- imitating \<^raw> before aa1fe1103ab8;
 wenzelm parents: 
63936diff
changeset | 158 | >> (Symbol.length o map Symbol_Pos.symbol) || | 
| 67428 | 159 | $$ Symbol.latex -- Scan.option (Scan.permissive Symbol_Pos.scan_cartouche "") >> K 0; | 
| 64526 
01920e390645
embedded latex has 0 length -- imitating \<^raw> before aa1fe1103ab8;
 wenzelm parents: 
63936diff
changeset | 160 | |
| 67263 | 161 | val scan_latex = | 
| 67428 | 162 | $$ Symbol.latex |-- Symbol_Pos.scan_cartouche_content "Embedded LaTeX: " | 
| 163 | >> (implode o map Symbol_Pos.symbol) || | |
| 67263 | 164 | Scan.one (Symbol.not_eof o Symbol_Pos.symbol) >> (output_sym o Symbol_Pos.symbol); | 
| 63935 
aa1fe1103ab8
raw control symbols are superseded by Latex.embed_raw;
 wenzelm parents: 
63590diff
changeset | 165 | |
| 64526 
01920e390645
embedded latex has 0 length -- imitating \<^raw> before aa1fe1103ab8;
 wenzelm parents: 
63936diff
changeset | 166 | fun read scan syms = | 
| 
01920e390645
embedded latex has 0 length -- imitating \<^raw> before aa1fe1103ab8;
 wenzelm parents: 
63936diff
changeset | 167 | Scan.read Symbol_Pos.stopper (Scan.repeat scan) (map (rpair Position.none) syms); | 
| 63935 
aa1fe1103ab8
raw control symbols are superseded by Latex.embed_raw;
 wenzelm parents: 
63590diff
changeset | 168 | |
| 7900 | 169 | in | 
| 170 | ||
| 77768 | 171 | val length_symbols = | 
| 172 | Integer.build o fold Integer.add o these o read scan_latex_length; | |
| 64526 
01920e390645
embedded latex has 0 length -- imitating \<^raw> before aa1fe1103ab8;
 wenzelm parents: 
63936diff
changeset | 173 | |
| 67263 | 174 | fun output_symbols syms = | 
| 67428 | 175 | if member (op =) syms Symbol.latex then | 
| 67263 | 176 | (case read scan_latex syms of | 
| 64526 
01920e390645
embedded latex has 0 length -- imitating \<^raw> before aa1fe1103ab8;
 wenzelm parents: 
63936diff
changeset | 177 | SOME ss => implode ss | 
| 
01920e390645
embedded latex has 0 length -- imitating \<^raw> before aa1fe1103ab8;
 wenzelm parents: 
63936diff
changeset | 178 |     | NONE => error ("Malformed embedded LaTeX: " ^ quote (Symbol.beginning 10 syms)))
 | 
| 67263 | 179 | else implode (map output_sym syms); | 
| 63935 
aa1fe1103ab8
raw control symbols are superseded by Latex.embed_raw;
 wenzelm parents: 
63590diff
changeset | 180 | |
| 8192 | 181 | val output_syms = output_symbols o Symbol.explode; | 
| 7900 | 182 | |
| 183 | end; | |
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 184 | |
| 67461 | 185 | fun symbols syms = text (Symbol_Pos.content syms, #1 (Symbol_Pos.range syms)); | 
| 186 | fun symbols_output syms = | |
| 187 | text (output_symbols (map Symbol_Pos.symbol syms), #1 (Symbol_Pos.range syms)); | |
| 188 | ||
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 189 | |
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 190 | (* theory presentation *) | 
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 191 | |
| 67263 | 192 | fun isabelle_body name = | 
| 74881 | 193 | XML.enclose | 
| 67263 | 194 |    ("%\n\\begin{isabellebody}%\n\\setisabellecontext{" ^ output_syms name ^ "}%\n")
 | 
| 195 |    "%\n\\end{isabellebody}%\n";
 | |
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 196 | |
| 9038 
63d20536971f
session.tex: nsert blank lines in order to guarantee new paragraphs
 wenzelm parents: 
8965diff
changeset | 197 | fun theory_entry name = "\\input{" ^ name ^ ".tex}\n\n";
 | 
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 198 | |
| 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 199 | |
| 76955 | 200 | (* cite: references to bibliography *) | 
| 201 | ||
| 202 | fun cite {kind, location, citations} =
 | |
| 203 | let | |
| 204 | val _ = | |
| 205 | citations |> List.app (fn (s, pos) => | |
| 77851 | 206 | if member_string s "," | 
| 76955 | 207 |         then error ("Single citation expected, without commas" ^ Position.here pos)
 | 
| 208 | else ()); | |
| 76957 
deb7dffb3340
avoid confusion of markup element vs. property names;
 wenzelm parents: 
76956diff
changeset | 209 | val citations' = space_implode "," (map #1 citations); | 
| 
deb7dffb3340
avoid confusion of markup element vs. property names;
 wenzelm parents: 
76956diff
changeset | 210 |     val markup = Markup.latex_cite {kind = kind, citations = citations'};
 | 
| 76956 
e47fb5cfef41
clarified Latex markup: optional cite "location" consists of nested document text;
 wenzelm parents: 
76955diff
changeset | 211 | in [XML.Elem (markup, location)] end; | 
| 76955 | 212 | |
| 213 | ||
| 73754 | 214 | (* index entries *) | 
| 215 | ||
| 216 | type index_item = {text: text, like: string};
 | |
| 217 | type index_entry = {items: index_item list, def: bool};
 | |
| 218 | ||
| 219 | fun index_item (item: index_item) = | |
| 74786 | 220 | XML.wrap_elem ((Markup.latex_index_item, #text item), XML.string (#like item)); | 
| 73754 | 221 | |
| 222 | fun index_entry (entry: index_entry) = | |
| 74786 | 223 | [XML.Elem (Markup.latex_index_entry (if #def entry then "isaindexdef" else "isaindexref"), | 
| 224 | map index_item (#items entry))]; | |
| 73754 | 225 | |
| 73763 
eccc4a13216d
clarified index antiquotation for ML: more ambitious type-setting, more accurate syntax;
 wenzelm parents: 
73754diff
changeset | 226 | fun index_binding NONE = I | 
| 
eccc4a13216d
clarified index antiquotation for ML: more ambitious type-setting, more accurate syntax;
 wenzelm parents: 
73754diff
changeset | 227 | | index_binding (SOME def) = Binding.map_name (suffix (if def then "_def" else "_ref")); | 
| 
eccc4a13216d
clarified index antiquotation for ML: more ambitious type-setting, more accurate syntax;
 wenzelm parents: 
73754diff
changeset | 228 | |
| 
eccc4a13216d
clarified index antiquotation for ML: more ambitious type-setting, more accurate syntax;
 wenzelm parents: 
73754diff
changeset | 229 | fun index_variants setup binding = | 
| 
eccc4a13216d
clarified index antiquotation for ML: more ambitious type-setting, more accurate syntax;
 wenzelm parents: 
73754diff
changeset | 230 | fold (fn index => setup (index_binding index binding) index) [NONE, SOME true, SOME false]; | 
| 
eccc4a13216d
clarified index antiquotation for ML: more ambitious type-setting, more accurate syntax;
 wenzelm parents: 
73754diff
changeset | 231 | |
| 
eccc4a13216d
clarified index antiquotation for ML: more ambitious type-setting, more accurate syntax;
 wenzelm parents: 
73754diff
changeset | 232 | |
| 8460 | 233 | (* print mode *) | 
| 234 | ||
| 8965 | 235 | val latexN = "latex"; | 
| 236 | ||
| 74884 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 237 | local | 
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 238 | |
| 8460 | 239 | fun latex_output str = | 
| 240 | let val syms = Symbol.explode str | |
| 64526 
01920e390645
embedded latex has 0 length -- imitating \<^raw> before aa1fe1103ab8;
 wenzelm parents: 
63936diff
changeset | 241 | in (output_symbols syms, length_symbols syms) end; | 
| 19265 | 242 | |
| 74884 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 243 | val command_markup = YXML.output_markup (Markup.latex_macro "isacommand"); | 
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 244 | val keyword_markup = YXML.output_markup (Markup.latex_macro "isakeyword"); | 
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 245 | val indent_markup = YXML.output_markup (Markup.latex_macro "isaindent"); | 
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 246 | |
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 247 | in | 
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 248 | |
| 69346 
3c29edccf739
expose latex mode operations, to facilitate adhoc changes to it;
 wenzelm parents: 
67462diff
changeset | 249 | fun latex_markup (s, _: Properties.T) = | 
| 74884 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 250 | if member (op =) [Markup.commandN, Markup.keyword1N, Markup.keyword3N] s then command_markup | 
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 251 | else if s = Markup.keyword2N then keyword_markup | 
| 29325 | 252 | else Markup.no_output; | 
| 10955 | 253 | |
| 67428 | 254 | val _ = Output.add_mode latexN latex_output (prefix Symbol.latex o cartouche); | 
| 23703 | 255 | val _ = Markup.add_mode latexN latex_markup; | 
| 74884 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 256 | |
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 257 | val _ = Pretty.add_mode latexN | 
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 258 | (fn s => fn _ => if s = "" then s else uncurry enclose indent_markup s); | 
| 8460 | 259 | |
| 7726 
2c7fc0ba1e12
Simple LaTeX presentation primitives (based on outer lexical syntax).
 wenzelm parents: diff
changeset | 260 | end; | 
| 74884 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 261 | |
| 
229d7ea628c2
more symbolic latex_output via XML (using YXML within text);
 wenzelm parents: 
74883diff
changeset | 262 | end; |