使用 Rust 在 GTK GUI 上渲染小的 LaTeX 片段

Render small LaTeX-Snippets on GTK GUI using Rust

问题

我正在开发一个 Rust 程序,它使用给定的 rust-gtk-binding 具有 GTK3 GUI。 该程序应该是跨平台的(至少 Linux 和 Windows)。 GUI 应该能够显示自定义纯文本和小的 LaTeX 片段,以允许使用数学环境(小意味着一个公式的大小作为要显示的元素)。 因此,我需要一种方法将 LaTeX 代码转换成可以由 GUI 显示的代码。

想法及其问题

我可以看到两种显示 LaTeX 的方法:

现在我有两种方法都使用中间步骤,其中对于普通 LaTeX,第一步很困难,对于 KaTeX,第二步显示问题。对于这两种方法的困难步骤,我找不到任何可行的解决方案。 有没有我找不到的图书馆或类似图书馆,或者有什么不同的方法吗? 能够呈现单个公式就足够了,我只是想避免使用完整的 LaTeX 编译器或半个浏览器来呈现 HTML.

在搜索和评估更多方法后,我得到了一个不错的解决方案,但也有一些主要缺点:

首先,我使用TinyTex作为LaTeX环境。我没有限制 LaTeX 的使用,例如数学环境。 TinyTex 提供对主要平台的支持,同时轻巧便携。必须手动安装额外的 LaTeX 包,这使我可以决定哪些包随我的应用程序一起提供。 不利的一面是,虽然 TinyTex 对于 LaTeX 环境来说是轻量级的,但对于这里的用途来说仍然相当大(大约 250MB)。

我安装了所需的软件包以使用 \documentclass[preview]{standalone} 获取已裁剪的 pdf。 之后,我使用 Ghostscript 为生成的 pdf 获取 png-image。我没有使用语言绑定,而是直接去了 std::process::Command.

以下几行应该足以将 test.tex 转换为 test.png,其中包含便携式 TinyTex 安装和 Windows 下项目目录子文件夹中的 Ghostscripts gswin64c.exe: (由于 TinyTex 和 Ghostscript 也适用于其他系统 OS,因此可以轻松更改给定的示例以在其他系统上运行)

use std::process::Command;

fn main() {
    let output = Command::new("TinyTex\bin\win32\pdflatex.exe")
        .args(&["test.tex"])
        .output()
        .expect("Some error message 1");

    println!("{}", String::from_utf8(output.stdout).unwrap());

    let output = Command::new("gs\gswin64c.exe")
        .args(&[
            "-dNOPAUSE",
            "-dBATCH",
            "-sDEVICE=png16m",
            "-r1000",
            "-sOutputFile=test.png",
            "test.pdf",
        ])
        .output()
        .expect("Some error message 2");

    println!("{}", String::from_utf8(output.stdout).unwrap());
}

当然,在这个阶段这不是特别好的和有用的代码,但它显示了如何处理给定的问题,我想把它留在这里以防有类似问题的人发现这个 post。