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