问题描述
问题
我正在开发一个Rust程序,该程序具有使用给定rust-gtk-binding的GTK3 GUI。 该程序应该是跨平台的(至少是Linux和Windows)。 GUI应该能够显示自定义纯文本和小的LaTeX片段,以允许使用数学环境(小的表示一个公式的大小作为要显示的元素)。 因此,我需要一种将LaTeX代码转换为GUI可以显示的内容的方法。
想法及其问题
- 将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
。
以下行应足以将test.tex
转换为test.png
,并在Windows下项目目录的子文件夹中包含可移植的TinyTex安装和Ghostscripts gswin64c.exe
:(如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());
}
当然,这在现阶段并不是特别好的和有用的代码,但是它显示了如何解决给定的问题,我想把它留在这里,以防遇到类似问题的任何人找到这篇文章。