LaTeX渲染器适用于.NET平台?

17

我想知道是否存在一个本地的.NET渲染器用于TeX/LaTeX。我找到的最接近的匹配是Java实现的JMathTeX。虽然我很想将其移植到C#,但在此之前,我只想检查一下是否有人了解是否存在.NET实现。

我的当前想法是使用MiKTeX和dvipng编译TeX源代码,并将生成的DVI呈现为PNG,但我仍然担心这可能会产生不可接受的开销,更不用说需要将MiKTeX捆绑到给定程序中。


1
我发现自己想知道为什么要这样做。Knuth的版本几乎没有bug(他提供现金奖励来确认错误,而且已经有一段时间没有被认领了)。重写不太可能达到那么好的效果。 - dmckee --- ex-moderator kitten
@dmckee:在.NET应用程序中进行渲染的替代方法是使用编译器,如MiKTeX,然后使用dvipng将其转换为PNG。这是一种相当间接的方法,我希望有更简单的方法。 - Noldorin
1
我认为更好的选择是使用(出色的)pdf[la]tex,因为结果已经是一个(相对)易于显示的格式。 - Stephen Canon
在我看来,dvipng将是更好的选择。不管怎样,仍然存在大量开销。 - Noldorin
1
一个应用场景是在应用窗口中显示数学公式,而不需要安装一百 MB 的 LaTeX 软件包 :-) ,使用轻量级的在线数学格式化工具。如果您决定继续移植,我愿意提供帮助。 - jdehaan
@jdehann:确实,这将是主要原因。将MiKTeX与您的程序捆绑在一起并不是非常方便。我仍在考虑中 - 但感谢您提供帮助 - 我会告诉您我做出的决定。 :) - Noldorin
4个回答

6

一个纯C#实现的LaTex引擎,由verybadcat开发。

这是一个基于iosMath LaTeX引擎的C#移植版。

它现在在大多数情况下都可以工作。以下是一些示例。具有讽刺意味的是,第一个前端是iOS。但是,如果您想添加前端(如Xamarin.Forms或Windows环境),应该也是可能的。您需要定义自己的TypesettingContext并编写IGraphicsContext的实现。TypesettingContext又包含多个组件,包括选择字体。希望您不需要接触核心排版引擎。(如果您需要,那我认为那是一个bug。)

CSharpMath示例


5
这篇文章有些过时了,但我想发布一个链接,介绍一下WPF-Math项目的复兴和扩展。我在原问题提出不久后开始了这个项目,并在某种程度上帮助维护它。最初它是JMathTex的移植版,但现在已经扩展到包括更多内容。目前,它正在增加除WPF外的其他渲染器。

2

如果我没记错的话,TeX是用Pascal方言编写的,当今它通常首先被编译成标准C,然后再使用C编译器编译为最终二进制文件。也许将原始的Pascal代码编译成C#,并在C#中编写一个包装器来使用它作为库可能是可行的。

当然,这是一个相当庞大的项目,可能对你手头的问题来说有些过度。


有趣的建议。也许值得编译成C,然后封装在托管的C++/CLI库中,我在思考。 - Noldorin
看起来你是对的。TeX是用Pascal的变体WEB编写的,然后使用http://www.tug.org/web2c/编译成C。 - Noldorin

-2

使用这段代码!!!

        const string latex = @"\frac{2+2}{2}";
        const string fileName = @"formula.png";

        File.Open(fileName, FileMode.OpenOrCreate).Close();

        var parser = new WpfMath.TexFormulaParser();
        var formula = parser.Parse(latex);
        var renderer = formula.GetRenderer(WpfMath.TexStyle.Display, 20.0, "Arial");
        var bitmapSource = renderer.RenderToBitmap(0, 0);

        var encoder = new System.Windows.Media.Imaging.PngBitmapEncoder();
        encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bitmapSource));
        using (var target = new FileStream(fileName, FileMode.Create))
        {
            encoder.Save(target);
        }

        pictureBox2.Image = Image.FromFile(fileName);

4
你应该解释你的代码以及为什么应该使用它,这会让未来的用户更容易理解和使用。 - Kevin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接