Skip to main content

bake_format/
bake_format.rs

1//! Bakes a LaTeX format with amsmath and unicode-math from a local TeX Live tree.
2
3use std::path::PathBuf;
4use std::process::ExitCode;
5
6use mathtex_engine::{FormatBuilder, ResourceFontLoader, TexmfResources};
7
8/// Everything a fragment may use must be loaded here, the sandbox refuses file access while typesetting.
9const PREAMBLE: &str = r"\nonstopmode\documentclass{article}\usepackage{amsmath}\usepackage{unicode-math}\setmathfont{latinmodern-math.otf}\begin{document}";
10
11fn main() -> ExitCode {
12    let mut args = std::env::args_os().skip(1);
13    let (Some(output), None) = (args.next().map(PathBuf::from), args.next()) else {
14        eprintln!("usage: bake_format <output.pkg>");
15        return ExitCode::FAILURE;
16    };
17    let texmf = match TexmfResources::discover() {
18        Ok(texmf) => texmf,
19        Err(error) => {
20            eprintln!("bake_format: {error}");
21            return ExitCode::FAILURE;
22        }
23    };
24    let fonts = ResourceFontLoader::new(&texmf);
25    let format = match FormatBuilder::new(PREAMBLE)
26        .kernel("latex.ltx")
27        .build(&texmf, &fonts)
28    {
29        Ok(format) => format,
30        Err(error) => {
31            eprintln!("bake_format: {error}");
32            return ExitCode::FAILURE;
33        }
34    };
35    if let Err(error) = std::fs::write(&output, &format) {
36        eprintln!("bake_format: cannot write {}: {error}", output.display());
37        return ExitCode::FAILURE;
38    }
39    eprintln!(
40        "bake_format: wrote {} bytes to {}",
41        format.len(),
42        output.display()
43    );
44    ExitCode::SUCCESS
45}