SwiftMath
提供了 iosMath 的完整 Swift 实现,用于在 iOS 和 MacOS 应用程序中显示精美渲染的数学公式。它使用 UILabel
等效类排版用 LaTeX 编写的公式。它使用与 LaTeX 相同的排版规则,因此公式的渲染效果与 LaTeX 渲染的效果完全相同。
请同时查看 SwiftMathDemo,了解如何从 SwiftUI 中使用 SwiftMath
的示例。
SwiftMath
类似于 Web 上的 MathJax 或 KaTeX,但适用于原生 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}
f(x) = \int\limits_{-\infty}^\infty\!\hat f(\xi)\,e^{2 \pi i \xi x}\,\mathrm{d}\xi
\frac{1}{n}\sum_{i=1}^{n}x_i \geq \sqrt[n]{\prod_{i=1}^{n}x_i}
\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} } } }
更多示例包含在 EXAMPLES 中
以下是包含的字体的预览
SwiftMath
在 iOS 11+ 或 MacOS 12+ 上运行。它依赖于以下 Apple 框架
此外,对于 iOS,它需要
此外,对于 MacOS,它需要
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 数学模式中的命令。 也没有对西欧语言和一些西里尔字符以外的其他语言的支持。 有两种方法可以支持更多语言
SwiftMath
兼容的数学字体,其中包含该语言的所有字形。SwiftMath
添加对包含所有语言字形的标准 Unicode 字体的支持。在这两者中,第一个要容易得多。 但是,如果您想挑战一下,请尝试解决第二个选项。
SwiftMathDemo 是 iosMath
中包含的 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-Light
、KpMath-Sans
、Asana
字体当前错误地渲染非常大的根式。 似乎字体文件未正确定义排版这些字形所需的偏移量。 如果有人可以解决此问题,我们将不胜感激。
渲染方程的默认颜色为黑色。 您可以将其更改为任何其他颜色,如下所示
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 文件。
此发行版包含以下字体。 这些字体的许可如下