diff -r cb86bf5658e4 -r ef1da1abee46 ProgTutorial/outputfn.ML --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/ProgTutorial/outputfn.ML Sat May 30 11:12:46 2009 +0200 @@ -0,0 +1,79 @@ + +structure OutputFN = +struct + +(* rebuilding the output function from ThyOutput in order to *) +(* enable the options [gray, linenos, index] *) + +val gray = ref false +val linenos = ref false + +datatype entry = + No_Entry + | Code_Entry of string + | String_Entry of string + +val index = ref No_Entry + +fun string_entry s = prefix ("\\index{" ^ s ^ "}") +fun code_entry s = prefix ("\\index{" ^ s ^ "@{\\tt\\slshape{}" ^ s ^ "}}") + +fun get_word str = +let + fun only_letters [] = true + | only_letters (x::xs) = + if (Symbol.is_ascii_blank x) then false else only_letters xs +in + if (only_letters (Symbol.explode str)) then str + else error ("Underspecified index entry only for single words allowed! Error with " ^ str) +end + +fun index_entry entry txt = + case entry of + No_Entry => I + | String_Entry "" => string_entry (get_word (implode txt)) + | String_Entry s => string_entry s + | Code_Entry "" => code_entry (get_word (implode txt)) + | Code_Entry s => code_entry s + + +fun translate f = Symbol.explode #> map f #> implode; + +val clean_string = translate + (fn "_" => "\\_" + | c => c); + +fun output txt = +let + val prts = map Pretty.str txt +in + prts + |> (if ! ThyOutput.quotes then map Pretty.quote else I) + |> (if ! ThyOutput.display then + map (Output.output o Pretty.string_of o Pretty.indent (! ThyOutput.indent)) + #> space_implode "\\isasep\\isanewline%\n" + #> (if ! linenos then (enclose "\\begin{linenos}%\n" "%\n\\end{linenos}") else I) + #> (if ! gray then (enclose "\\begin{graybox}%\n" "%\n\\end{graybox}") else I) + #> enclose "\\begin{isabelle}%\n" "%\n\\end{isabelle}" + #> index_entry (!index) txt + else + map (Output.output o (if ! ThyOutput.break then Pretty.string_of else Pretty.str_of)) + #> space_implode "\\isasep\\isanewline%\n" + #> enclose "\\isa{" "}" + #> index_entry (!index) txt) +end + + +fun boolean "" = true + | boolean "true" = true + | boolean "false" = false + | boolean s = error ("Bad boolean value: " ^ quote s); + +val _ = ThyOutput.add_options + [("gray", Library.setmp gray o boolean), + ("linenos", Library.setmp linenos o boolean), + ("index", Library.setmp index o String_Entry o clean_string), + ("indexc", Library.setmp index o Code_Entry o clean_string)] + + +end \ No newline at end of file