问题
我正在开发一个Rust程序,它有一个GTK3 GUI,使用给定的Rust-gtk绑定。该程序应该是跨平台的(至少是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图像。我没有使用语言绑定,而是使用std::process::Command
。
以下几行应该足以通过可移植TinyTex安装将test.tex
转换为test.png
,并且Ghostscriptgswin64c.exe
存在于Windows下项目目录的子文件夹中:(由于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());
}
当然,在现阶段,这并不是特别好和有用的代码,但它展示了如何处理给定的问题,我想把它留在这里,以防有类似问题的人发现这篇文章。