【问题标题】:Rendering Math Formulas渲染数学公式
【发布时间】:2011-01-07 20:14:16
【问题描述】:

在 Cocoa 应用程序中实现数学公式渲染的最佳方法是什么?

MacOS X 中包含一个名为 Grapher 的实用程序,它完全按照我的需要 (/Applications/Utilities/Grapher.app)。

【问题讨论】:

    标签: objective-c cocoa macos


    【解决方案1】:

    如果您只需要排版方程式而不是构建交互式方程式编辑器,您可能想看看使用troff。它有一个相当简单的方程式语法,输出 postscript,并且是 OS X 的一部分。使用它的最简单方法还需要 ghostscript。

    作为一个例子(基于手册页):

    创建文件文件fib.tr:

    .EQ
    x sub i = x sub {i-1} + x sub {i-2}
    .EN
    

    使用eqngroff 转换为附言:

    $ eqn fib.tr | groff -P-b16 > fib.ps
    

    用ghostscript计算并提取边界框:

    $ gs -dNOPAUSE -sDEVICE=bbox -- fib.ps 2> fib.bbox
    

    在ps文件中添加边界框信息,生成eps文件:

    $ cat fib.ps | sed -e '/%%Orientation/rfib.bbox' > fib.eps
    

    使用包含在大多数 TeX 发行版中的 perl 脚本将 eps 文件转换为 pdf(可在 http://tug.org/epstopdf/ 获得)

    $ epstopdf fib.eps
    

    现在您有一个 pdf 图像,其中仅包含具有最小填充的渲染方程。

    或者,如果您的用户安装了 TeX(或者您想解决将 a minimal TeX distribution 与您的应用程序捆绑在一起的麻烦),那么 LaTeXiT 提供了一项服务来排版方程并将它们作为 PDF 图像返回。您可以使用NSPerformService 调用它。

    【讨论】:

    • 不知道troff,不过听起来很有希望。我试试看。
    • 当我尝试渲染第 2 步发出的 PS(使用 OSX 上的 Preview.app 或 Photoshop)时,它会显示一个空图像。有什么问题吗?
    • 是的,但我不知道是什么。这就是我使用epstopdf 的原因——它生成的 PDF 看起来不错,而如果让 Preview.app 生成 PDF,它会给你一个空白页。
    【解决方案2】:

    正如我在my answerthis similar question 中描述的那样,我在my iPhone application 中构建了一个系统来执行此操作(它也适用于Mac,但我还没有完成该版本的应用程序)。

    我使用 Core Animation 层来表示方程的层次结构,并为各种操作类型使用 Quartz 绘制的元素。这让我以相对轻量级的方式对排版进行动画处理,即使在第一代 iPhone 硬件上也很流畅。

    与评估任意方程一样,将布局拆分为分层层可以使布局计算变得非常简单和灵活。然而,我仍然花了几个月的时间才把一切都做好。

    如果您想使用现有的解决方案,您可以查看 Matt Gallagher 的优秀开源项目Magic Number Machineat least one developer 已将其用作具有方程式排版功能的商业 Mac 计算器的基础。

    【讨论】:

    • 谢谢,我已经找到你的答案了。我已经开始使用表达式树进行自己的实现。最初我想使用 mimetex 库,但不幸的是它是在 (cancer-)GPL 下获得许可的。
    • @Erik - Matt 的东西是 BSD 风格的,所以你可以先看看他做了什么。相信我,这听起来很简单,但如果你自己动手做对的话,会很费时间。
    • 是的。问题是我需要类似 LaTeX 的渲染(最好是几乎完美的像素)。不过,实时可编辑性是一个巨大的优势。
    • 你有机会提供你的吗? :D
    • @Dave - 如果我能找到一种有意义的方法。它与应用程序紧密集成,并且是它的主要钩子,很难将两者分开。在该项目开始时,我向 Core Plot 贡献了一些基本布局代码,但没有太具体。然而,已经有足够多的人表达了兴趣,我推测他们会组建一个 Kickstarter 项目来抵消我可能会因为开放这个项目而失去的收入。它似乎适用于 Glyphish,但具有更广泛的吸引力。
    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 2020-10-29
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多