0

问题

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

想法及其问题

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

  • 将 LaTeX 源代码编译为 pdf,然后编译为某种图像类型。应该可以使用 Ghostscript 来获取图像。但我不知道如何以轻量级(不包括像 miktex 之类的相当大的包)和跨平台的方式生成 pdf。这个选项也可能是多余的,因为不需要动态下载特殊的包,一个好的数学支持就足够了。积极的一面是在 GTK 中渲染图像应该很容易。
  • 使用足以满足数学环境的 KaTeX。我能够安装匹配的 crate 并从一些公式生成 HTML 源代码。但是在这里渲染结果变得很困难,因为 GTK 没有显示 HTML 的本地方式。由于很难将 HTML 引擎集成到 GUI 中,因此最好找到一个能够将 HTML 呈现为然后可以显示的图像类型的工具。

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

4

1 回答 1

0

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

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

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

以下几行应该足以转换test.textest.png可移植的 TinyTex 安装和gswin64c.exe存在于 Windows 下项目目录的子文件夹中的 Ghostscripts:(由于 TinyTex 和 Ghostscript 也存在于其他操作系统,因此可以轻松更改给定示例以在其他系统上工作)

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());
}

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

于 2020-09-28T18:05:05.120 回答