Source file BuildLaTeX.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
open Prelude.Shell
open Render
let tex_fp name =
Format.sprintf "%s.tex" name
let dvi_fp name =
Format.sprintf "%s.dvi" name
let pdf_fp name =
Format.sprintf "%s.pdf" name
let write_tex_file ~name ~packages ~source =
let tex_ch = open_out @@ tex_fp name in
Fun.protect ~finally:(fun _ -> close_out tex_ch) @@ fun _ ->
LaTeXTemplate.write tex_ch ~source ~packages
let render_dvi_file ~name ~source =
let tex_fp = tex_fp name in
let dvi_fp = dvi_fp name in
let pdf_fp = pdf_fp name in
ensure_remove_file dvi_fp;
ensure_remove_file pdf_fp;
Proc.run "latex" ["-halt-on-error"; "-interaction=nonstopmode"; tex_fp]
let render_pdf_file ~name ~source =
let tex_fp = tex_fp name in
let pdf_fp = pdf_fp name in
ensure_remove_file pdf_fp;
Proc.run "pdflatex" ["-halt-on-error"; "-interaction=nonstopmode"; tex_fp]
let render_svg_file ~name ~source =
let dvi_fp = dvi_fp name in
Proc.run "dvisvgm"
["--exact";
"--clipjoin";
"--font-format=woff";
"--bbox=papersize";
"--zoom=1.5";
dvi_fp;
"--output=%f"];
ensure_remove_file dvi_fp
let build_latex ~name ~packages ~source =
let web_name = name ^ "-web" in
let print_name = name ^ "-print" in
begin
if not @@ Sys.file_exists @@ web_name ^ ".svg" then
begin
write_tex_file ~name:web_name ~packages ~source;
render_dvi_file ~name:web_name ~source;
render_svg_file ~name:web_name ~source
end
end;
begin
if not @@ Sys.file_exists @@ print_name ^ ".pdf" then
begin
write_tex_file ~name:print_name ~packages:(packages @ ["newpxtext"; "newpxmath"]) ~source;
render_pdf_file ~name:print_name ~source
end
end