【问题标题】:LaTeX renderer for .NET?.NET 的 LaTeX 渲染器?
【发布时间】:2023-03-14 02:50:01
【问题描述】:

我很好奇是否存在用于 TeX/LaTeX 的本机 .NET 渲染器。我能找到的最接近的匹配是 Java 实现,JMathTeX。我很想将它移植到 C#,但在此之前,我只想检查是否有人知道那里的 .NET 实现。

我目前的想法是使用 MiKTeX 和 dvipng 来编译 TeX 源并将生成的 DVI 渲染为 PNG,但我仍然担心这可能会产生不可接受的开销,更不用说需要将 MiKTeX 与给定程序捆绑在一起。

【问题讨论】:

  • 我发现自己想知道你为什么要这样做。 Knuth 的版本几乎没有错误(他为确认的错误提供现金奖励,并且很长一段时间没有人领取)。重写可能不会那么好。
  • @dmckee:在 .NET 应用程序中呈现的替代方法是使用 MiKTeX 等编译器,然后使用 dvipng 将其转换为 PNG。这是一种相当间接的方法,我希望有更简单的方法。
  • 我希望它是使用(优秀的)pdf[la]tex 的更好选择,因为结果已经是(相对)容易显示的格式。
  • @stephentyrone:在我看来,dvipng 会是一个更好的选择。无论哪种方式,仍然涉及大量开销。
  • 一个用例是在应用程序窗口中显示数学公式,而无需安装 100 MB 的乳胶材料 :-),这是一种轻量级的在线数学格式。如果你决定继续移植,我自愿提供帮助。

标签: .net math latex tex renderer


【解决方案1】:

如果我没记错的话,TeX 是用 Pascal 方言编写的,今天编译时,它通常首先编译成标准 C,然后用 C 编译器编译以生成最终的二进制文件。将原始 Pascal 代码编译成 C# 并在 C# 中围绕它编写一个包装器以便能够将其用作库可能是可行的。

当然,这是一个相当大的项目,对于你手头的问题来说可能是多余的。

【讨论】:

  • 有趣的建议。我在想,它可能值得编译成 C,然后包装在一个托管的 C++/CLI 库中。
  • 看来你是对的。 TeX 是用 WEB 编写的,Pascal 的一种变体,然后使用 tug.org/web2c 编译成 C。
【解决方案2】:

A pure C# implementation of Latex by verybadcat.

这是出色的 iosMath LaTeX 引擎的 C# 端口。

它现在在大多数情况下都可以正常工作。下面是一些例子。讽刺地 够了,第一个前端是iOS。但是,如果您想添加一个 前端,例如 Xamarin.Forms 或 Windows 环境,它应该 成为可能。您必须定义自己的 TypesettingContext 和 编写 IGraphicsContext 的实现。 TypesettingContext 中的 turn 有几个组件,包括选择字体。希望你 不需要接触核心排版引擎。 (如果你这样做,我 会认为这是一个错误。)

【讨论】:

    【解决方案3】:

    这是非常迟的,但我想我会发布一个链接到WPF-Math 项目的恢复和扩展端口,我在这个最初的问题之后不久就开始了,并且仍然有助于保持较小的容量。它最初是 JMathTex 的一个端口,但后来扩展到包含更多内容。目前正在获取WPF以外的渲染器。

    【讨论】:

      【解决方案4】:

      使用此代码!!!

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

      【讨论】:

      • 你应该解释你的代码以及为什么要使用它,这会让它对未来的用户更有用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-05
      • 1970-01-01
      • 1970-01-01
      • 2018-07-13
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      相关资源
      最近更新 更多