ProgTutorial/output_tutorial.ML
author Christian Urban <urbanc@in.tum.de>
Thu, 23 May 2019 00:56:39 +0100
changeset 576 b78c4fab81a9
parent 562 daf404920ab9
permissions -rw-r--r--
small typo
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     1
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
     2
structure OutputTutorial =
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     3
struct
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     4
438
d9a223c023f6 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 373
diff changeset
     5
(* rebuilding the output function from Thy_Output in order to *)
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
     6
(* enable the options [gray, linenos]                        *)
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
     7
562
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
     8
val thy_output_linenos = Attrib.setup_config_bool @{binding linenos} (K false)
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
     9
val thy_output_gray = Attrib.setup_config_bool @{binding gray} (K false)
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    10
562
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    11
fun output_raw ctxt txt =
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    12
let
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    13
  val prts = map Pretty.str txt
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    14
in   
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    15
  prts
562
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    16
  |> (if Config.get ctxt Document_Antiquotation.thy_output_quotes then map Pretty.quote else I)
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    17
  |> (if Config.get ctxt Document_Antiquotation.thy_output_display then
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    18
    map (Output.output o Pretty.string_of o Pretty.indent (Config.get ctxt Document_Antiquotation.thy_output_indent))
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    19
    #> space_implode "\\isasep\\isanewline%\n"
562
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    20
    #> (if Config.get ctxt thy_output_linenos then (enclose "\\begin{linenos}%\n" "%\n\\end{linenos}") else I) 
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    21
    #> (if  Config.get ctxt thy_output_gray then (enclose "\\begin{graybox}%\n" "%\n\\end{graybox}") else I) 
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    22
    #> enclose "\\begin{isabelle}%\n" "%\n\\end{isabelle}"
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    23
  else
562
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    24
    map (Output.output o (if Config.get ctxt Document_Antiquotation.thy_output_break then Pretty.string_of else Pretty.unformatted_string_of))
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    25
    #> space_implode "\\isasep\\isanewline%\n"
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    26
    #> enclose "\\isa{" "}")
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    27
end
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    28
562
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    29
fun output ctxt txt = Latex.string (output_raw ctxt txt)
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    30
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    31
datatype indstring =
258
03145998190b slightly modified index generation
Christian Urban <urbanc@in.tum.de>
parents: 256
diff changeset
    32
  NoString
302
Christian Urban <urbanc@in.tum.de>
parents: 261
diff changeset
    33
| Plain   of string
Christian Urban <urbanc@in.tum.de>
parents: 261
diff changeset
    34
| Code    of string
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    35
| Struct  of string
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    36
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    37
fun translate_string f = Symbol.explode #> map f #> implode;
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    38
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    39
val clean_string = translate_string
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    40
  (fn "_" => "\\_"
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    41
    | "#" => "\\#"
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    42
    | "<" => "\\isacharless"
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    43
    | ">" => "\\isachargreater"
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    44
    | "{" => "\\{"
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    45
    | "|" => "\\isacharbar"
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    46
    | "}" => "\\}"
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    47
    | "$" => "\\isachardollar"
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    48
    | "!" => "\\isacharbang"
261
358f325f4db6 updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 258
diff changeset
    49
    | "\<dash>" => "-"
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    50
    | c => c)
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    51
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    52
fun get_word str =
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    53
let 
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    54
  fun only_letters [] = true
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    55
    | only_letters (x::xs) = 
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    56
        if (Symbol.is_ascii_blank x) then false else only_letters xs
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    57
in
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    58
  if only_letters (Symbol.explode str) 
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    59
  then clean_string str
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    60
  else error ("Only single word allowed! Error with " ^ quote str)
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    61
end  
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    62
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    63
fun get_indstring NoString = ""
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    64
  | get_indstring (Plain s) = get_word s
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    65
  | get_indstring (Code s) = let val w = get_word s in implode[w, "@{\\tt\\slshape{}", w, "}"] end
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    66
  | get_indstring (Struct s) =  implode ["in {\\tt\\slshape{}", get_word s, "}"]
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    67
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    68
fun get_index {main = m, minor = n} = 
258
03145998190b slightly modified index generation
Christian Urban <urbanc@in.tum.de>
parents: 256
diff changeset
    69
 (if n = NoString
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    70
  then implode ["\\index{", get_indstring m, "}"]  
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    71
  else implode ["\\index{", get_indstring m, " (", get_indstring n, ")}"])  
256
1fb8d62c88a0 added some first index-information
Christian Urban <urbanc@in.tum.de>
parents: 255
diff changeset
    72
    
373
28a49fe024c9 added structure index
Christian Urban <urbanc@in.tum.de>
parents: 351
diff changeset
    73
fun get_str_index {main = m, minor = n} = 
28a49fe024c9 added structure index
Christian Urban <urbanc@in.tum.de>
parents: 351
diff changeset
    74
 (case n of
28a49fe024c9 added structure index
Christian Urban <urbanc@in.tum.de>
parents: 351
diff changeset
    75
   Struct s => implode ["\\index[str]{{\\tt\\slshape{}", get_word s, "}!", get_indstring m, "}"]
28a49fe024c9 added structure index
Christian Urban <urbanc@in.tum.de>
parents: 351
diff changeset
    76
  | _ => "")
28a49fe024c9 added structure index
Christian Urban <urbanc@in.tum.de>
parents: 351
diff changeset
    77
449
f952f2679a11 updated to new isabelle
Christian Urban <urbanc@in.tum.de>
parents: 438
diff changeset
    78
fun output_indexed ctxt ind txt =
562
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    79
 txt |> output_raw ctxt
316
74f0a06f751f further polishing of index generation
Christian Urban <urbanc@in.tum.de>
parents: 315
diff changeset
    80
     |> prefix (get_index ind)
373
28a49fe024c9 added structure index
Christian Urban <urbanc@in.tum.de>
parents: 351
diff changeset
    81
     |> prefix (get_str_index ind)
562
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    82
     |> Latex.string
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    83
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    84
fun boolean "" = true
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    85
  | boolean "true" = true
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    86
  | boolean "false" = false
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    87
  | boolean s = error ("Bad boolean value: " ^ quote s);
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    88
562
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    89
val _ = Theory.setup 
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    90
  (Document_Antiquotation.setup_option @{binding gray} (Config.put thy_output_gray o boolean) #> 
daf404920ab9 Accomodate to Isabelle 2018
Norbert Schirmer <norbert.schirmer@web.de>
parents: 471
diff changeset
    91
   Document_Antiquotation.setup_option @{binding linenos} (Config.put thy_output_linenos o boolean) ); 
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    92
471
f65b9f14d5de updated to new Isabelle
Christian Urban <urbanc@in.tum.de>
parents: 470
diff changeset
    93
255
ef1da1abee46 added infrastructure for index; antiquotations have now the options [index] and [indexc]
Christian Urban <urbanc@in.tum.de>
parents:
diff changeset
    94
end