Add ~ space support and complex formula tests
Agent-Logs-Url: https://github.com/wesleyel/swiftui-math/sessions/6740d67f-473b-43b8-87ba-25d9469f5757 Co-authored-by: wesleyel <48174882+wesleyel@users.noreply.github.com>
This commit is contained in:
committed by
GitHub
parent
569db11ed5
commit
348f75ccea
@@ -537,8 +537,10 @@ extension Math {
|
|||||||
return atom(fromAccentedCharacter: ch)
|
return atom(fromAccentedCharacter: ch)
|
||||||
case _ where ch.utf32 < 0x0021 || ch.utf32 > 0x007E:
|
case _ where ch.utf32 < 0x0021 || ch.utf32 > 0x007E:
|
||||||
return nil
|
return nil
|
||||||
case "$", "%", "#", "&", "~", "\'", "^", "_", "{", "}", "\\":
|
case "$", "%", "#", "&", "\'", "^", "_", "{", "}", "\\":
|
||||||
return nil
|
return nil
|
||||||
|
case "~":
|
||||||
|
return Space(amount: 3)
|
||||||
case "(", "[":
|
case "(", "[":
|
||||||
return Atom(type: .open, nucleus: stringValue)
|
return Atom(type: .open, nucleus: stringValue)
|
||||||
case ")", "]", "!", "?":
|
case ")", "]", "!", "?":
|
||||||
|
|||||||
@@ -2568,4 +2568,41 @@ struct ParserTests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
func complexFormulas() throws {
|
||||||
|
// Formula 1: limit with integral in denominator, using \mathrm{~d} for the differential
|
||||||
|
let formula1 =
|
||||||
|
"\\lim _{x \\rightarrow 0} \\frac{a x-\\sin x}{\\int_{b}^{x} \\frac{\\ln \\left(1+t^{3}\\right)}{t} \\mathrm{~d} t}=c, c \\neq 0"
|
||||||
|
// Formula 2: double sum with nested fractions and grouped terms
|
||||||
|
let formula2 =
|
||||||
|
"\\lim _{n \\rightarrow \\infty} \\sum_{i=1}^{n} \\sum_{j=1}^{n} \\frac{n}{(n+i)\\left(n^{2}+j^{2}\\right)}="
|
||||||
|
// Formula 3: nested integrals with arctan and \mathrm{d} differentials
|
||||||
|
let formula3 =
|
||||||
|
"\\lim _{x \\rightarrow 0} \\frac{\\int_{0}^{x}\\left[\\int_{0}^{u^{2}} \\arctan (1+t) \\mathrm{d} t\\right] \\mathrm{d} u}{x(1-\\cos x)}"
|
||||||
|
|
||||||
|
for formula in [formula1, formula2, formula3] {
|
||||||
|
var error: Math.ParserError? = nil
|
||||||
|
let list = Math.Parser.build(fromString: formula, error: &error)
|
||||||
|
#expect(error == nil, "Unexpected parse error for formula: \(formula)")
|
||||||
|
let unwrappedList = try #require(list)
|
||||||
|
#expect(!unwrappedList.atoms.isEmpty)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
func tildeAsSpace() throws {
|
||||||
|
// ~ in math mode should produce a thin space, not an error
|
||||||
|
let testCases: [(String, String)] = [
|
||||||
|
("a~b", "a\\, b"),
|
||||||
|
("\\mathrm{~d}", "\\mathrm{\\, d}"),
|
||||||
|
]
|
||||||
|
for (input, expected) in testCases {
|
||||||
|
var error: Math.ParserError? = nil
|
||||||
|
let list = Math.Parser.build(fromString: input, error: &error)
|
||||||
|
#expect(error == nil)
|
||||||
|
let latex = Math.Parser.atomListToString(list)
|
||||||
|
#expect(latex == expected, "Round-trip mismatch for input '\(input)'")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -74,6 +74,33 @@
|
|||||||
assertSnapshot(of: view, as: .image(layout: layout))
|
assertSnapshot(of: view, as: .image(layout: layout))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
func complexIntegralFormulas() {
|
||||||
|
let view = VStack(alignment: .leading, spacing: 16) {
|
||||||
|
Math(
|
||||||
|
"\\lim _{x \\rightarrow 0} \\frac{a x-\\sin x}{\\int_{b}^{x} \\frac{\\ln \\left(1+t^{3}\\right)}{t} \\mathrm{~d} t}=c, c \\neq 0"
|
||||||
|
)
|
||||||
|
.mathTypesettingStyle(.display)
|
||||||
|
.mathFont(Math.Font(name: .latinModern, size: 20))
|
||||||
|
|
||||||
|
Math(
|
||||||
|
"\\lim _{n \\rightarrow \\infty} \\sum_{i=1}^{n} \\sum_{j=1}^{n} \\frac{n}{(n+i)\\left(n^{2}+j^{2}\\right)}="
|
||||||
|
)
|
||||||
|
.mathTypesettingStyle(.display)
|
||||||
|
.mathFont(Math.Font(name: .latinModern, size: 20))
|
||||||
|
|
||||||
|
Math(
|
||||||
|
"\\lim _{x \\rightarrow 0} \\frac{\\int_{0}^{x}\\left[\\int_{0}^{u^{2}} \\arctan (1+t) \\mathrm{d} t\\right] \\mathrm{d} u}{x(1-\\cos x)}"
|
||||||
|
)
|
||||||
|
.mathTypesettingStyle(.display)
|
||||||
|
.mathFont(Math.Font(name: .latinModern, size: 20))
|
||||||
|
}
|
||||||
|
.background(Color.guide)
|
||||||
|
.padding(.horizontal)
|
||||||
|
|
||||||
|
assertSnapshot(of: view, as: .image(layout: layout))
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
func inlineTextWrapping() {
|
func inlineTextWrapping() {
|
||||||
let view = VStack(alignment: .leading, spacing: 16) {
|
let view = VStack(alignment: .leading, spacing: 16) {
|
||||||
|
|||||||
Reference in New Issue
Block a user