使用 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 源代码编译成 pdf,然后再编译成某种图像类型。应该可以使用 Ghostscript 来获取图像。但我不知道如何以轻量级(不包括像 miktex 这样的大包)和跨平台的方式生成 pdf。这个选项也可能有点矫枉过正,因为不需要动态下载特殊包,良好的数学支持就足够了。积极的一面是在 GTK 中渲染图像应该很容易。
- 使用 KaTeX,这对于数学环境应该足够了。我能够安装匹配的箱子并从一些公式生成 HTML 源代码。但是这里很难呈现结果,因为 GTK 没有显示 HTML 的本地方式。由于很难将 HTML 引擎集成到 GUI 中,因此最好找到一种能够将 HTML 渲染为可以显示的图像类型的工具。
现在我有两种方法都使用中间步骤,其中对于普通 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。
问题
我正在开发一个 Rust 程序,它使用给定的 rust-gtk-binding 具有 GTK3 GUI。 该程序应该是跨平台的(至少 Linux 和 Windows)。 GUI 应该能够显示自定义纯文本和小的 LaTeX 片段,以允许使用数学环境(小意味着一个公式的大小作为要显示的元素)。 因此,我需要一种方法将 LaTeX 代码转换成可以由 GUI 显示的代码。
想法及其问题
我可以看到两种显示 LaTeX 的方法:
- 将 LaTeX 源代码编译成 pdf,然后再编译成某种图像类型。应该可以使用 Ghostscript 来获取图像。但我不知道如何以轻量级(不包括像 miktex 这样的大包)和跨平台的方式生成 pdf。这个选项也可能有点矫枉过正,因为不需要动态下载特殊包,良好的数学支持就足够了。积极的一面是在 GTK 中渲染图像应该很容易。
- 使用 KaTeX,这对于数学环境应该足够了。我能够安装匹配的箱子并从一些公式生成 HTML 源代码。但是这里很难呈现结果,因为 GTK 没有显示 HTML 的本地方式。由于很难将 HTML 引擎集成到 GUI 中,因此最好找到一种能够将 HTML 渲染为可以显示的图像类型的工具。
现在我有两种方法都使用中间步骤,其中对于普通 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。