SwiftMath

SwiftMath 提供了 iosMath 的完整 Swift 实现,用于在 iOS 和 MacOS 应用程序中显示精美渲染的数学公式。它使用 UILabel 等效类排版用 LaTeX 编写的公式。它使用与 LaTeX 相同的排版规则,因此公式的渲染效果与 LaTeX 渲染的效果完全相同。

请同时查看 SwiftMathDemo,了解如何从 SwiftUI 中使用 SwiftMath 的示例。

SwiftMath 类似于 Web 上的 MathJaxKaTeX,但适用于原生 iOS 或 MacOS 应用程序,而无需使用 UIWebView 和 Javascript。 更重要的是,它比使用 UIWebView 快得多。

SwiftMath 是最新 iosMath v0.9.5 版本的 Swift 翻译,但包含错误修复和增强功能,例如新的 \lbar (lambda bar) 字符和西里尔字母支持。原始的 iosMath 测试套件也已翻译成 Swift 并运行无误。 注意:错误测试条件被忽略,以避免使用愚蠢的 throw 来标记所有内容。 请告诉我您发现的任何错误或错误修复。

SwiftMath 预先打包了通过 Swift Package Manager 直接访问所需的一切。

示例

以下是使用此库渲染的一些公式的屏幕截图

x = \frac{-b \pm \sqrt{b^2-4ac}}{2a}

Quadratic Formula Quadratic Formula

f(x) = \int\limits_{-\infty}^\infty\!\hat f(\xi)\,e^{2 \pi i \xi x}\,\mathrm{d}\xi

Calculus Calculus

\frac{1}{n}\sum_{i=1}^{n}x_i \geq \sqrt[n]{\prod_{i=1}^{n}x_i}

AM-GM AM-GM

\frac{1}{\left(\sqrt{\phi \sqrt{5}}-\phi\\right) e^{\frac25 \pi}}
= 1+\frac{e^{-2\pi}} {1 +\frac{e^{-4\pi}} {1+\frac{e^{-6\pi}} {1+\frac{e^{-8\pi}} {1+\cdots} } } }

Ramanujan Identity Ramanujan Identity

更多示例包含在 EXAMPLES

字体

以下是包含的字体的预览

要求

SwiftMath 在 iOS 11+ 或 MacOS 12+ 上运行。它依赖于以下 Apple 框架

此外,对于 iOS,它需要

此外,对于 MacOS,它需要

安装

Swift 包

SwiftMath 可从 SwiftMath 获得。 要在您的代码中使用它,只需将 https://github.com/mgriebling/SwiftMath.git 路径添加到 XCode 的包管理器。

用法

该库提供了一个类 MTMathUILabel,它是一个 UIView,支持渲染数学公式。 要显示公式,只需创建一个 MTMathUILabel,如下所示

import SwiftMath

let label = MTMathUILabel()
label.latex = "x = \\frac{-b \\pm \\sqrt{b^2-4ac}}{2a}"

MTMathUILabel 作为您的 UIView 的子视图添加将渲染上面显示的二次公式示例。

以下代码创建了一个名为 MathView 的 SwiftUI 组件,它封装了 MTMathUILabel

import SwiftUI
import SwiftMath

struct MathView: UIViewRepresentable {
    var equation: String
    var font: MathFont = .latinModernFont
    var textAlignment: MTTextAlignment = .center
    var fontSize: CGFloat = 30
    var labelMode: MTMathUILabelMode = .text
    var insets: MTEdgeInsets = MTEdgeInsets()
    
    func makeUIView(context: Context) -> MTMathUILabel {
        let view = MTMathUILabel()
        return view
    }
    func updateUIView(_ view: MTMathUILabel, context: Context) {
        view.latex = equation
        view.font = MTFontManager().font(withName: font.rawValue, size: fontSize)
        view.textAlignment = textAlignment
        view.labelMode = labelMode
        view.textColor = MTColor(Color.primary)
        view.contentInsets = insets
    }
}

对于在 MacOS 下以原生方式运行的 SwiftUI 代码,请使用以下代码

import SwiftUI
import SwiftMath

struct MathView: NSViewRepresentable {
    var equation: String
    var font: MathFont = .latinModernFont
    var textAlignment: MTTextAlignment = .center
    var fontSize: CGFloat = 30
    var labelMode: MTMathUILabelMode = .text
    var insets: MTEdgeInsets = MTEdgeInsets()
    
    func makeNSView(context: Context) -> MTMathUILabel {
        let view = MTMathUILabel()
        return view
    }
    
    func updateNSView(_ view: MTMathUILabel, context: Context) {
        view.latex = equation
        view.font = MTFontManager().font(withName: font.rawValue, size: fontSize)
        view.textAlignment = textAlignment
        view.labelMode = labelMode
        view.textColor = MTColor(Color.primary)
        view.contentInsets = insets
    }
}

包含的功能

以下是该库当前支持的公式类型列表

注意:SwiftMath 仅支持 LaTeX 数学模式中的命令。 也没有对西欧语言和一些西里尔字符以外的其他语言的支持。 有两种方法可以支持更多语言

  1. 找到与 SwiftMath 兼容的数学字体,其中包含该语言的所有字形。
  2. SwiftMath 添加对包含所有语言字形的标准 Unicode 字体的支持。

在这两者中,第一个要容易得多。 但是,如果您想挑战一下,请尝试解决第二个选项。

示例

SwiftMathDemoiosMath 中包含的 Objective-C 演示的 SwiftUI 版本,它使用 SwiftMath 作为 Swift 包依赖项。

高级配置

MTMathUILabel 支持一些高级配置选项

数学模式

您可以更改 MTMathUILabel 的模式,使其在显示模式(相当于 LaTeX 中的 $$\[)和文本模式(相当于 LaTeX 中的 $\()之间切换。 默认样式是 Display。 要切换到 Text,只需

label.labelMode = .text
文本对齐

方程的默认对齐方式为左对齐。 可以将其更改为居中或右对齐,如下所示

label.textAlignment = .center
字体大小

默认字体大小为 30pt。 您可以更改它,如下所示

label.fontSize = 25
字体

默认字体是Latin Modern Math。 可以将其更改为

label.font = MTFontManager.fontmanager.termesFont(withSize:20)

此项目捆绑了 12 种字体,但您可以使用任何 OTF 数学字体。 其中包含一个 Python 脚本,用于生成 .otf 字体与 SwiftMath 一起使用所需的 .plist 文件。 如果您生成(和测试)任何其他字体,请将它们贡献回此项目,以使其他人受益。

注意:KpMath-LightKpMath-SansAsana 字体当前错误地渲染非常大的根式。 似乎字体文件未正确定义排版这些字形所需的偏移量。 如果有人可以解决此问题,我们将不胜感激。

文本颜色

渲染方程的默认颜色为黑色。 您可以将其更改为任何其他颜色,如下所示

label.textColor = .red

也可以为方程的不同部分设置不同的颜色。 只需访问 displayList 字段并设置要更改颜色的基础显示的 textColor

自定义命令

您可以定义自己尚未预定义的命令。 这类似于 LaTeX 中的宏。 要定义您自己的命令,请使用

MTMathAtomFactory.addLatexSymbol("lcm", value: MTMathAtomFactory.operator(withName: "lcm", limits: false))

这将创建一个 \lcm 命令,可以在 LaTeX 中使用。

内容插图

MTMathUILabel 具有 contentInsets,可用于更精细地控制方程相对于视图的位置。

如果您需要设置它,可以这样做

label.contentInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 20)
错误处理

如果提供给 MTMathUILabel 的 LaTeX 文本无效,或者它包含当前不支持的命令,则将显示一条错误消息而不是标签。

此错误可以编程方式检索为 label.error。 如果您不想显示任何内容,请设置

label.displayErrorInline = true

未来的增强

注意,这并不是 LaTeX 数学模式的完整实现。 缺少一些重要的部分,这些部分将在未来的更新中包含。 这包括

许可

SwiftMath 在 MIT 许可下可用。 有关更多信息,请参见 LICENSE 文件。

字体

此发行版包含以下字体。 这些字体的许可如下