Šķîþ ţö ḿàîñ çöñţéñţ

ÖḾḾĻ Ḿàţĥ Çöñṽéŕšîöñ

Îḿþļéḿéñţàţîöñ đéţàîļš ƒöŕ ţĥé ḿàţĥ-çöñṽéŕšîöñ šüƃšýšţéḿ đéçîđéđ îñ Ḿ-04: Ḿàţĥ àñđ Éǫüàţîöñš. Ţĥé þàçķàĝé core/math (Ĝö îḿþöŕţ github.com/neokapi/neokapi/core/math, þàçķàĝé ñàḿé math) îš à çĝö-ƒŕéé, ŴÀŠḾ-šàƒé çöñṽéŕţéŕ ƃéţŵééñ ÉÇḾÀ-376 Þàŕţ 1 §22.1 Öƒƒîçé Ḿàţĥ Ḿàŕķüþ Ļàñĝüàĝé (ÖḾḾĻ) àñđ ţŵö þöŕţàƃļé ñöţàţîöñš, Þŕéšéñţàţîöñ ḾàţĥḾĻ àñđ ĻàŢéẊ, ƃý ŵàý öƒ à šḿàļļ îñţéŕḿéđîàţé ÀŠŢ. Ţĥé ĥöšţ ƒöŕḿàţ ŕéàđéŕ ķééþš ţĥé öŕîĝîñàļ ÖḾḾĻ ƃýţéš ṽéŕƃàţîḿ ƒöŕ ţĥé ƃýţé-éẋàçţ ŕöüñđ-ţŕîþ (šéé Šķéļéţöñ Šţöŕé); ţĥîš þàçķàĝé öñļý þŕöđüçéš ţĥé àđđîţîöñàļ þöŕţàƃļé ŕéñđéŕîñĝš ţĥàţ çŕöšš-ƒöŕḿàţ ŵŕîţéŕš (ḿàŕķđöŵñ, ĐöçĻàñĝ, à ƒüţüŕé ĤŢḾĻ ŵŕîţéŕ) éḿîţ, àñđ ţĥé ñöŕ-þŕöšé šþļîçé ţĥàţ ŵŕîţéš éǫüàţîöñ þŕöšé ţŕàñšļàţîöñš ƃàçķ îñţö ţĥé öŕîĝîñàļ ƃýţéš.

Ţĥé þàçķàĝé îš đéļîƃéŕàţéļý ţöļéŕàñţ: àñ ÖḾḾĻ éļéḿéñţ îţ đöéš ñöţ ḿöđéļ đéĝŕàđéš ţö à ƃéšţ-郃öŕţ ŕöŵ öŕ îš đŕöþþéđ, ñéṽéŕ ƒàîļîñĝ à đöçüḿéñţ ŕéàđ. FromOMML ŕéţüŕñš à ƒàţàļ éŕŕöŕ öñļý ƒöŕ ḿàļƒöŕḿéđ ẊḾĻ.

Ţĥé Éẋþ ÀŠŢ

Exp îš à çļöšéđ îñţéŕƒàçé, à šéàļéđ šüḿ ţýþé ĝüàŕđéđ ƃý ţĥé üñéẋþöŕţéđ ḿàŕķéŕ ḿéţĥöđ isExp(), šö öñļý ţĥé ñöđé ţýþéš đéçļàŕéđ îñ math.go çàñ šàţý îţ. Ţĥé šéŕîàļîžéŕš ţýþé-šŵîţçĥ öṽéŕ ţĥîš çļöšéđ šéţ, éàçĥ ŵîţĥ à đéƒéñšîṽé default ƃŕàñçĥ (àñ éḿþţý šţŕîñĝ ƒöŕ àñ üñéẋþéçţéđ ñöđé). Ţĥé ñöđé šéţ:

ÑöđéŠĥàþéŔéñđéŕš àš
NumberText string<mn> / đîĝîţš
IdentText string<mi> / ļéţţéŕš
OperatorText string<mo> / öþéŕàţöŕ ĝļýþĥ
TextContent string; Normal bool<mtext> / \text{}; Normal ţŕüé ḿàŕķš <m:nor/> þŕöšé
RowItems []Expçöñçàţéñàţîöñ / <mrow> ŵĥéñ üšéđ àš àñ àŕĝüḿéñţ
FractionNum, Den Exp; NoBar bool<mfrac> / \frac (öŕ \atop ŵĥéñ NoBar)
SuperscriptBase, Sup Exp<msup> / ^{}
SubscriptBase, Sub Exp<msub> / _{}
SubSupBase, Sub, Sup Exp<msubsup> / _{}^{}
RadicalDegree, Body Exp (Degree ñîļ = šǫüàŕé ŕööţ)<msqrt>/<mroot> / \sqrt
NaryChr string; Sub, Sup, Body Exp<munder/over/underover> + ƃöđý / \sum éţç.
DelimitedOpen, Close string; Body Exp ("" = îñṽîšîƃļé ƒéñçé)ƒéñçéđ <mrow> / \left…\right
FunctionName string; Arg Exp<mi>name</mi> + àþþļîç. / \sin öŕ \operatorname
MatrixRows [][]Exp<mtable> / \begin{matrix}
AccentAccent string; Body Exp<mover accent> / \hat éţç.
BarBody Exp; Top bool<mover>/<munder> / \overline/\underline
GroupChrChr string; Pos string; Body Exp<mover>/<munder> / \overbrace/\underbrace
RawContent string<mtext> / \text{}; ĝŕàçéƒüļ-ƒàļļƃàçķ ļîţéŕàļ

Math îš ţĥé þàŕšé ŕéšüļţ: Body Exp þļüš Block bool, ŵĥéŕé Block đîšţîñĝüîšĥéš à đîšþļàý éǫüàţîöñ (<m:oMathPara>) ƒŕöḿ àñ îñļîñé öñé (<m:oMath>). Ţĥé îñţéŕñàļ ĥéļþéŕ row(items) çöļļàþšéš à šîñĝļé-éļéḿéñţ šļîçé ţö îţš éļéḿéñţ, öţĥéŕŵîšé ŕéţüŕñš à Row.

Ñöţé ţĥàţ Raw îš đéƒîñéđ àñđ šéŕîàļîžéđ ƃüţ ñéṽéŕ çöñšţŕüçţéđ ƃý ţĥé ŕéàđéŕ; šéé ţĥé çöṽéŕàĝé ļéđĝéŕ ƃéļöŵ.

Ţĥé ÖḾḾĻ ţöķéñ-šţŕéàḿ ŕéàđéŕ

Ţĥé ŕéàđéŕ (omml.go) îš à ĥàñđ-ŵŕîţţéñ ŕéçüŕšîṽé đéšçéñţ öṽéŕ encoding/xml.Decoder ţöķéñš ŕàţĥéŕ ţĥàñ à šţŕüçţ-üñḿàŕšĥàļ, ƃéçàüšé ÖḾḾĻ ḿîẋéš öŕđéŕéđ šţŕüçţüŕàļ çĥîļđŕéñ ŵîţĥ þŕöþéŕţý éļéḿéñţš àñđ ƒöŕéîĝñ ŴöŕđþŕöçéššîñĝḾĻ ŕüñš ţĥàţ ḿüšţ ƃé šķîþþéđ ŵîţĥöüţ đîšţüŕƃîñĝ þöšîţîöñ.

Šýñţĥéţîç ñàḿéšþàçé ŵŕàþþîñĝ

Àñ ÖḾḾĻ šüƃţŕéé çàþţüŕéđ ƒŕöḿ à .docx çàŕŕîéš ñö ñàḿéšþàçé đéçļàŕàţîöñš öƒ îţš öŵñ: xmlns:m àñđ xmlns:w šîţ öñ à đîšţàñţ àñçéšţöŕ (ţĥé đöçüḿéñţ þàŕţ) ţĥàţ ţĥé çàþţüŕéđ ƒŕàĝḿéñţ đöéš ñöţ îñçļüđé. Đéçöđîñĝ ţĥé ƃàŕé ƒŕàĝḿéñţ ļéàṽéš ţĥé m:/w: þŕéƒîẋéš üñƃöüñđ, šö ñöţĥîñĝ ŕéšöļṽéš ţö ţĥé ḿàţĥ ñàḿéšþàçé. Ƃöţĥ ţĥé þàŕšéŕ àñđ ţĥé ñöŕ-šçàññéŕ ţĥéŕéƒöŕé ŵŕàþ ţĥé ŕàŵ ƒŕàĝḿéñţ îñ à šýñţĥéţîç ŕööţ ţĥàţ ƃîñđš ţĥé ţŵö þŕéƒîẋéš ƃéƒöŕé đéçöđîñĝ:

const mathNS = "http://schemas.openxmlformats.org/officeDocument/2006/math"
const wprNS = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"

wrapped := `<ommlRoot xmlns:m="`+mathNS+`" xmlns:w="`+wprNS+`">` + string(raw) + `</ommlRoot>`

Ţĥé þàŕšéŕ ţĥéñ đŕîṽéš ţĥé đéçöđéŕ ţö ţĥé ƒîŕšţ oMathPara/oMath šţàŕţ éļéḿéñţ îñ ţĥé ḿàţĥ ñàḿéšþàçé (se.Name.Space == mathNS) àñđ ŕéàđš îţš çĥîļđ šéǫüéñçé. Éļéḿéñţ ḿàţçĥîñĝ îš ƃý ŕéšöļṽéđ xml.Name (ñàḿéšþàçé + ļöçàļ), ṽîà ţĥé mn(local) ĥéļþéŕ, ñéṽéŕ ƃý ŕàŵ þŕéƒîẋ šţŕîñĝ, šö à ƒŕàĝḿéñţ ţĥàţ ĥàþþéñéđ ţö ƃîñđ à đéŕéñţ þŕéƒîẋ ŵöüļđ šţîļļ þàŕšé.

Šéǫüéñçé, àŕĝüḿéñţ, þŕöþéŕţý, àñđ šķîþ þŕîḿîţîṽéš

Ƒöüŕ þŕîḿîţîṽéš šţŕüçţüŕé ţĥé đéšçéñţ:

  • seq(end): ŕéàđš šîƃļîñĝ ḿàţĥ ñöđéš üñţîļ ţĥé ḿàţçĥîñĝ éñđ éļéḿéñţ, đîšþàţçĥîñĝ éàçĥ ḿàţĥ-ñàḿéšþàçé šţàŕţ éļéḿéñţ ţĥŕöüĝĥ node àñđ çöñšüḿîñĝ àñý ƒöŕéîĝñ éļéḿéñţ (é.ĝ. w:rPr) ŵîţĥ skip.
  • arg(end): ŕéàđš öñé àŕĝüḿéñţ çöñţàîñéŕ (e, num, den, sub, sup, deg, fName, lim, …) àš à šîñĝļé éẋþŕéššîöñ ṽîà row(seq(...)).
  • props(end): ŕéàđš à …Pr þŕöþéŕţý éļéḿéñţ, ŕéţüŕñîñĝ îţš đîŕéçţ ḿàţĥ-ñàḿéšþàçé çĥîļđŕéñ ķéýéđ ƃý ļöçàļ ñàḿé ţö ţĥéîŕ m:val àţţŕîƃüţé (é.ĝ. naryPr{chr: "∑"}); ṽàļüéļéšš çĥîļđŕéñ àþþéàŕ ŵîţĥ àñ éḿþţý-šţŕîñĝ ṽàļüé, ŵĥîçĥ îš ĥöŵ þŕéšéñçé ƒļàĝš ļîķé degHide, subHide, supHide, àñđ ţĥé <m:nor/> ḿàŕķéŕ àŕé đéţéçţéđ (_, ok := pr["degHide"]). À þŕöþéŕţý ţĥàţ îñšţéàđ çàŕŕîéš àñ m:val, é.ĝ. à ƒŕàçţîöñ'š fPr type="noBar" öŕ à naryPr chr, îš ŕéàđ ƃý ṽàļüé.
  • skip(end): đéþţĥ-çöüñţéđ çöñšüḿþţîöñ öƒ àñ éñţîŕé šüƃţŕéé.

node îš ţĥé šţŕüçţüŕàļ đîšþàţçĥ ţàƃļé, ķéýéđ öñ ţĥé éļéḿéñţ'š ļöçàļ ñàḿé: rrun, ffraction, sSup/sSub/sSubSupscript, radradical, nary, ddelim, funcfunction, mmatrix, accaccent, bar, groupChr, limLow/limUpplimit, eqArr, sPre, àñđ ţĥé ŵŕàþþéŕ ţŕîö box/borderBox/phant (ŵĥîçĥ ŕéđüçé ţö ţĥéîŕ îññéŕ <m:e>). Ţĥé đéƒàüļţ çàšé çöñšüḿéš àñđ đŕöþš ţĥé éļéḿéñţ.

Ţĥé öþéŕàţöŕ đîçţîöñàŕý àñđ ḿ:ñöŕ đîšţîñçţîöñ

opdict.go ĥöļđš ƃöţĥ ţĥé ŕüñ-ţéẋţ ţöķéñîžéŕ àñđ ţĥé ĝļýþĥ→ĻàŢéẊ ḿàþš.

Ḿàţĥ ţýþöĝŕàþĥý ṽš. ñöŕḿàļ-ţéẋţ þŕöšé

Ţĥé đéçîšîṽé šþļîţ ĥàþþéñš îñ run (þàŕšîñĝ <m:r>): ţĥé ŕüñ'š öþţîöñàļ <m:rPr> îš îñšþéçţéđ ƒöŕ àñ <m:nor/> çĥîļđ. Ţĥé öüţçöḿé ŕöüţéš ţĥé ŕüñ'š <m:t> ţéẋţ đöŵñ öñé öƒ ţŵö þàţĥš:

  • Ñöŕḿàļ ţéẋţ (<m:nor/> þŕéšéñţ): ţĥé ţéẋţ îš ñàţüŕàļ-ļàñĝüàĝé þŕöšé éḿƃéđđéđ îñ ţĥé éǫüàţîöñ ("ŵĥéŕé", "öţĥéŕŵîšé", à üñîţ). Îţ îš ķéþţ ŵĥöļé àš Text{Normal: true} àñđ îš ţĥé öñļý ţŕàñšļàţàƃļé šüŕƒàçé. Îţ ƃýþàššéš ţĥé ţöķéñîžéŕ éñţîŕéļý.
  • Ḿàţĥ ţéẋţ (ñö <m:nor/>): ţĥé ţéẋţ îš ḿàţĥéḿàţîçàļ ţýþöĝŕàþĥý. Îţ îš ţöķéñîžéđ ƃý classifyRunText îñţö Number / Ident / Operator ñöđéš: à ḿàẋîḿàļ ŕüñ öƒ đîĝîţš (àļļöŵîñĝ àñ éḿƃéđđéđ . ƃéţŵééñ đîĝîţš) ƃéçöḿéš à Number; à ḿàẋîḿàļ ŕüñ öƒ ļéţţéŕš ƃéçöḿéš à šîñĝļé Ident; àñý öţĥéŕ ñöñ-šþàçé ŕüñé ƃéçöḿéš àñ Operator. Ŵĥîţéšþàçé îš đŕöþþéđ; ḿàţĥ ļàýöüţ šüþþļîéš šþàçîñĝ.

TranslatableText() / collectNormalText ŵàļķš ţĥé ÀŠŢ àñđ çöñçàţéñàţéš öñļý Text ñöđéš ŵîţĥ Normal == true (àñđ ñöñ-ƃļàñķ çöñţéñţ), šþàçé-ĵöîñéđ, îñ ŕéàđîñĝ öŕđéŕ. À þüŕé-ţýþöĝŕàþĥý éǫüàţîöñ ţĥéŕéƒöŕé ýîéļđš ţĥé éḿþţý šţŕîñĝ àñđ çöñţŕîƃüţéš ñö ţŕàñšļàţàƃļé ƃļöçķ.

Ĝļýþĥ ḿàþš

ĻàŢéẊ šéŕîàļîžàţîöñ çöñšüļţš ţĥŕéé ļööķüþ ţàƃļéš, àļļ îñ opdict.go:

  • naryLaTeX: ñ-àŕý öþéŕàţöŕ ĝļýþĥ → çöḿḿàñđ (\sum, \int, \bigcup, …), çöñšüļţéđ ƒîŕšţ ƒöŕ à Nary.Chr.
  • symbolLaTeX: öþéŕàţöŕš, ŕéļàţîöñš, Ĝŕééķ ļéţţéŕš, àñđ šéţ/ļöĝîç ĝļýþĥš àüţĥöŕš ţýþé àš Üñîçöđé îñšîđé ḿàţĥ ŕüñš (\leq, \to, π\pi, …), üšéđ ƃý latexOp/latexSymbol àñđ àš ţĥé Nary ƒàļļƃàçķ.
  • accentLaTeX: çöḿƃîñîñĝ öŕ šþàçîñĝ àççéñţ ĝļýþĥ → çöḿḿàñđ (̂/^\hat, ̄\bar, \vec, …).

À ĝļýþĥ àƃšéñţ ƒŕöḿ à ţàƃļé ƒàļļš ţĥŕöüĝĥ ţö îţš ļîţéŕàļ ţéẋţ (öþéŕàţöŕš) öŕ ţö à đöçüḿéñţéđ đéƒàüļţ (àççéñţš → \hat). knownFuncs (îñ latex.go) ĝöṽéŕñš ŵĥéţĥéŕ à Function.Name ŕéñđéŕš àš à ƃàçķšļàšĥ çöḿḿàñđ (\sin) öŕ \operatorname{…}.

Ţĥé ñöŕ-šþļîçé àļĝöŕîţĥḿ

Ţŕàñšļàţîñĝ éǫüàţîöñ þŕöšé ŕéǫüîŕéš ŵŕîţîñĝ à ţŕàñšļàţîöñ ƃàçķ îñţö ţĥé éẋàçţ ƃýţéš öƒ ţĥé öŕîĝîñàļ ÖḾḾĻ šö ţĥé šüŕŕöüñđîñĝ ḿàţĥ šţŕüçţüŕé îš üñţöüçĥéđ. Ţĥîš îš à ƃýţé-öƒƒšéţ šþļîçé, îḿþļéḿéñţéđ îñ nor.go.

Ƃýţé-öƒƒšéţ çàþţüŕé

scanNorTexts šţŕéàḿš ţĥé ñàḿéšþàçé-ŵŕàþþéđ ƒŕàĝḿéñţ ŵîţĥ à šéçöñđ, îñđéþéñđéñţ xml.Decoder àñđ ţŕàçķš ţĥŕéé ƃööļéàñš: inRun (îñšîđé <m:r>), isNor (àñ <m:nor/> šééñ îñšîđé ţĥé çüŕŕéñţ ŕüñ), àñđ inMT (îñšîđé <m:t>). Ŵĥéñ çĥàŕàçţéŕ đàţà àŕŕîṽéš îñšîđé à ñöŕ-ƒļàĝĝéđ <m:t>, îţ ŕéçöŕđš ţĥé šþàñ. Ţĥé ƃýţé ŕàñĝé îš ţàķéñ ƒŕöḿ xml.Decoder.InputOffset():

  • mtStart îš çàþţüŕéđ àţ ţĥé <m:t> šţàŕţ éļéḿéñţ, î.é. ţĥé öƒƒšéţ ĵüšţ àƒţéŕ <m:t>, ţĥé ƒîŕšţ ƃýţé öƒ éļéḿéñţ çöñţéñţ;
  • ţĥé éñđ öƒƒšéţ îš InputOffset() àţ ţĥé CharData ţöķéñ, ţĥé ƃýţé ĵüšţ þàšţ ţĥé çöñţéñţ.

Öƒƒšéţš àŕé îñţö ţĥé ŵŕàþþéđ ƃýţéš. wrapOMML ŕéţüŕñš ƃöţĥ ţĥé ŵŕàþþéđ šļîçé àñđ ţĥé þŕéƒîẋ ļéñĝţĥ, šö ţĥé þüƃļîç NorSpans šüƃţŕàçţš prefixLen ţö ŕéþöŕţ ŕàñĝéš îñţö ţĥé çàļļéŕ'š ŕàŵ ƒŕàĝḿéñţ. Ţĥé nor_test.go çöñţŕàçţ àššéŕţš éẋàçţļý ţĥîš: raw[span.Start:span.End] == span.Text.

Ƃýţé-éẋàçţ ŕéþļàçéḿéñţ

SpliceNorText(raw, translations) ŕé-šçàñš ƒöŕ ţĥé šþàñš, ƃüîļđš à ŕéþļàçéḿéñţ ļîšţ (šķîþþîñĝ éñţŕîéš ţĥàţ àŕé éḿþţý, ƃéýöñđ ţĥé šļîçé ļéñĝţĥ, öŕ éǫüàļ ţö ţĥé öŕîĝîñàļ ţéẋţ), ẊḾĻ-éšçàþéš éàçĥ ŕéþļàçéḿéñţ ŵîţĥ ţĥé šàḿé esc üšéđ ƒöŕ éļéḿéñţ çöñţéñţ, ţĥéñ ŕéƃüîļđš ţĥé öüţþüţ ƃý çöþýîñĝ ṽéŕƃàţîḿ ƃéţŵééñ šþàñš àñđ šüƃšţîţüţîñĝ îñšîđé ţĥéḿ. Ţĥé šýñţĥéţîç ŵŕàþþéŕ îš šţŕîþþéđ öñ ŕéţüŕñ (out[prefixLen : len(out)-len(ommlSuffix)]). Çöñšéǫüéñçéš, àļļ àššéŕţéđ îñ ţéšţš:

  • À nil öŕ àļļ-éḿþţý translations, öŕ ţŕàñšļàţîöñš éǫüàļ ţö ţĥé öŕîĝîñàļš, ŕéţüŕñš raw ƃýţé-îđéñţîçàļ (ţĥé ŕéþļàçéḿéñţ ļîšţ îš éḿþţý → éàŕļý ŕéţüŕñ öƒ raw).
  • À translations šļîçé šĥöŕţéŕ ţĥàñ ţĥé šþàñ çöüñţ ļéàṽéš üñçöṽéŕéđ šþàñš ṽéŕƃàţîḿ.
  • Éṽéŕý ñöñ-þŕöšé ƃýţé (ţàĝš, rPr, ţĥé <m:nor/> ḿàŕķéŕš, ḿàţĥ ŕüñš) îš þŕéšéŕṽéđ éẋàçţļý.

Ĥöŵ ţĥé ÖþéñẊḾĻ šüƃ-šķéļéţöñ çöñšüḿéš ţĥé šþàñš

Ţĥé ÖþéñẊḾĻ ŵŕîţéŕ đöéš ñöţ çàļļ SpliceNorText đîŕéçţļý; îţ đŕîṽéš ţĥé šàḿé šþàñ šéţ ţĥŕöüĝĥ ţĥé šķéļéţöñ ḿéçĥàñîšḿ šö à ţŕàñšļàţéđ éǫüàţîöñ ŕéþŕöđüçéš ţĥé öŕîĝîñàļ ƃýţéš éẋçéþţ ŵĥéŕé þŕöšé çĥàñĝéš. writeOMathSubSkeleton (core/formats/openxml/omml_math.go) çàļļš NorSpans(raw), ṽàļîđàţéš ţĥé öƒƒšéţš (ḿöñöţöñîç, îñ ŕàñĝé, Start ≤ End) ƃéƒöŕé éḿîţţîñĝ àñýţĥîñĝ, ƃàîļîñĝ öüţ ţö à ṽéŕƃàţîḿ ŵŕîţé îƒ ţĥéý ļööķ ŵŕöñĝ, ţĥéñ ŵŕîţéš ţĥé éǫüàţîöñ ţö ţĥé šķéļéţöñ àš àļţéŕñàţîñĝ ṽéŕƃàţîḿ ÖḾḾĻ šéĝḿéñţš (raw[cursor:span.Start]) àñđ šķéļéţöñ ŕ郚 ţö öñé model.Block þéŕ šþàñ, éàçĥ ţýþéđ omml-nor. Öñ ŵŕîţé, ţĥé ÖþéñẊḾĻ ŵŕîţéŕ'š renderBlock ŕéñđéŕš àñ omml-nor ƃļöçķ àš ƃàŕé xmlEscape'đ éļéḿéñţ-çöñţéñţ ţéẋţ (ḿàţçĥîñĝ captureRawElement'š ÇĥàŕĐàţà éšçàþîñĝ), šö ţĥé ŕéƒ ŕéšöļṽéš îñšîđé ţĥé <m:t>…</m:t>: üñţŕàñšļàţéđ ⇒ ƃýţé-éẋàçţ, ţŕàñšļàţéđ ⇒ îñ-þļàçé šþļîçé, ḿàţĥ šţŕüçţüŕé üñţöüçĥéđ. Ţĥé ḿàŕķđöŵñ àñđ ĐöçĻàñĝ ŵŕîţéŕš šķîþ omml-nor ƃļöçķš; ţĥé þŕöšé àļŕéàđý ŕîđéš îñšîđé ţĥé ƒöŕḿüļà'š ĻàŢéẊ.

Ţĥîš ŕéàļîžéš ţĥé šàḿé þàŕîţý ĝüàŕàñţéé ţĥé çöñṽéŕţéŕ'š þüŕé šþļîçé đöéš, ṽîà ţĥé þŕöĵéçţ'š ĝéñéŕàļ šķéļéţöñ ḿàçĥîñéŕý ŕàţĥéŕ ţĥàñ à ƃéšþöķé ŕéŵŕîţé.

Þüƃļîç ÀÞÎ šüŕƒàçé

ŠýḿƃöļŠîĝñàţüŕéŔöļéŴîŕéđ îñţö
FromOMMLfunc([]byte) (*Math, error)Þàŕšé <m:oMath>/<m:oMathPara> îñţö ţĥé ÀŠŢ; éŕŕöŕ öñļý öñ ḿàļƒöŕḿéđ ẊḾĻopenxml ommlToMathEquiv
(*Math).ToLaTeXfunc() stringĻàŢéẊ, ñö $/$$ đéļîḿîţéŕšopenxml (ḿàŕķđöŵñ $..$/$$..$$ Éǫüîṽ, ĐöçĻàñĝ <formula> Đîšþ)
(*Math).ToMathMLfunc() stringÞŕéšéñţàţîöñ ḾàţĥḾĻ <math> éļéḿéñţ (display="block" ŵĥéñ Block)ŵîŕéđ-ƃüţ-üñçàļļéđ; ŕéšéŕṽéđ ƒöŕ à ƒüţüŕé ĤŢḾĻ ŵŕîţéŕ
(*Math).TranslatableTextfunc() stringÇöñçàţéñàţéđ <m:nor/> þŕöšé, šþàçé-ĵöîñéđ, ŕéàđîñĝ öŕđéŕ; éḿþţý ƒöŕ þüŕé ḿàţĥüñŵîŕéđ (ŕöüñđ-ţŕîþ ţéšţš öñļý); ţĥé đöçẋ þàţĥ šüŕƒàçéš þŕöšé ṽîà NorSpans
(*Math).Blockbool ƒîéļđĐîšþļàý (oMathPara) ṽš îñļîñé (oMath)šéļéçţš $$/$ đéļîḿîţéŕš àñđ ḾàţĥḾĻ display
NorTextsfunc([]byte) []stringÉàçĥ <m:nor/> ŕüñ'š ţéẋţ, đöçüḿéñţ öŕđéŕüñŵîŕéđ (ţéšţš öñļý); éñüḿéŕàţîöñ çöñṽéñîéñçé
NorSpansfunc([]byte) []NorSpanÞŕöšé ţéẋţ + ƃýţé öƒƒšéţš îñţö raw, đöçüḿéñţ öŕđéŕÖþéñẊḾĻ šüƃ-šķéļéţöñ (writeOMathSubSkeleton)
SpliceNorTextfunc([]byte, []string) []byteƂýţé-éẋàçţ ŕéþļàçéḿéñţ öƒ ñöŕ-þŕöšé ƃý đöçüḿéñţ öŕđéŕüñŵîŕéđ (ţéšţš öñļý); ţĥé đöçẋ þàţĥ šþļîçéš ṽîà ţĥé šüƃ-šķéļéţöñ öṽéŕ NorSpans

ToMathML îš ƒüļļý îḿþļéḿéñţéđ àñđ üñîţ-ţéšţéđ (math_test.go àššéŕţš îţš <mfrac>, <msup>, <munderover>, display="block" öüţþüţ), ƃüţ ñö ŵŕîţéŕ çàļļš îţ ýéţ; îţ éẋîšţš šö àñ ĤŢḾĻ/ḾàţĥḾĻ ŵŕîţéŕ çàñ àđöþţ îţ ŵîţĥöüţ ƒüŕţĥéŕ ŵöŕķ îñ core/math. NorTexts, TranslatableText, àñđ SpliceNorText àŕé ļîķéŵîšé þàŕţ öƒ ţĥé þüƃļîç šüŕƒàçé ŵîţĥ ñö çüŕŕéñţ þŕöđüçţîöñ çàļļéŕ: ţĥé đöçẋ ŵŕîţé-ƃàçķ þàţĥ éñüḿéŕàţéš àñđ šþļîçéš þŕöšé ţĥŕöüĝĥ NorSpans àñđ ţĥé šüƃ-šķéļéţöñ (àƃöṽé), šö ţĥéšé šţàñđàļöñé ĥéļþéŕš šéŕṽé çàļļéŕš ţĥàţ ŵàñţ ţĥé çöñṽéŕšîöñ ŵîţĥöüţ ţĥé šķéļéţöñ ḿàçĥîñéŕý àñđ àŕé éẋéŕçîšéđ ƃý nor_test.go / math_test.go.

Çöṽéŕàĝé-ĝàþ ļéđĝéŕ

Ţĥé çöñṽéŕţéŕ ţŕàđéš çöḿþļéţéñéšš ƒöŕ ţöļéŕàñçé àñđ à šḿàļļ ÀŠŢ. Ţĥé àþþŕöẋîḿàţîöñš ƃéļöŵ àŕé þŕéšéñţ îñ ţĥé çöđé ţöđàý; éàçĥ îš çîţéđ ţö îţš šöüŕçé. Ñöñé ƃŕéàķš à ŕéàđ; ţĥéý àƒƒéçţ öñļý ţĥé ƒîđéļîţý öƒ ţĥé þöŕţàƃļé ŕéñđéŕîñĝ, ñöţ ţĥé ṽéŕƃàţîḿ ÖḾḾĻ ŕöüñđ-ţŕîþ (ŵĥîçĥ ţĥé ĥöšţ ķééþš îñđéþéñđéñţļý).

#ÇöñšţŕüçţÀþþŕöẋîḿàţîöñŠöüŕçé
1Üñḿöđéļéđ éļéḿéñţšŢĥé node đéƒàüļţ çàšé đŕöþš ţĥé éļéḿéñţ (skipnil). Raw îš đéƒîñéđ àš ţĥé "ĝŕàçéƒüļ ƒàļļƃàçķ" ļîţéŕàļ àñđ îš ŕéñđéŕéđ ƃý ƃöţĥ šéŕîàļîžéŕš, ƃüţ ţĥé ŕéàđéŕ ñéṽéŕ çöñšţŕüçţš îţ: ĝŕàçéƒüļ đéĝŕàđàţîöñ îš "đŕöþ", ñöţ "ķééþ àš Raw".omml.go node đéƒàüļţ; math.go Raw; mathml.go/latex.go Raw çàšéš (üñŕéàçĥàƃļé ƒŕöḿ FromOMML)
2limLow / limUppḾöđéļéđ àš à þļàîñ Subscript / Superscript. Üñđéŕ-/öṽéŕ-ļîḿîţ þöšîţîöñîñĝ çöļļàþšéš ţö àñ îñļîñé šçŕîþţ (base_{lim} / base^{lim}), ļöšîñĝ \underset/\overset-šţýļé šţàçķîñĝ.omml.go limit
3sPre (þŕé-šçŕîþţš)Ḿöđéļéđ àš SubSup{Base: Row{}} éḿîţţéđ ƃéƒöŕé ţĥé ƃàšé; ýîéļđš {}_{sub}^{sup}base, àñ àþþŕöẋîḿàţîöñ öƒ ţŕüé þŕé-šçŕîþţ / ţéñšöŕ þöšîţîöñîñĝ.omml.go sPre
4Đéļîḿîţéŕ šéþàŕàţöŕšḾüļţîþļé <m:e> öþéŕàñđš îñ <m:d> àŕé àļŵàýš ĵöîñéđ ŵîţĥ à ļîţéŕàļ | öþéŕàţöŕ (Operator{Text: "|"}); ţĥé dPr sepChr îš ñöţ ŕéàđ đéšþîţé ţĥé îñļîñé çöḿḿéñţ ḿéñţîöñîñĝ îţ.omml.go delim
5Ḿàţŕîẋ / eqArr àļîĝñḿéñţḾàţŕîẋ çöļüḿñ þŕöþéŕţîéš àñđ çéļļ ĵüšţîƒîçàţîöñ (mPr/mcJc) àŕé šķîþþéđ; eqArr îš ḿöđéļéđ àš à öñé-çöļüḿñ Matrix, ļöšîñĝ îţš & àļîĝñḿéñţ þöîñţš. ĻàŢéẊ îš àļŵàýš \begin{matrix} (ñö ƒéñçé/àļîĝñḿéñţ ṽàŕîàñţ).omml.go matrix, eqArr; latex.go Matrix
6box / borderBox / phantŔéđüçéđ ţö ţĥéîŕ îññéŕ <m:e>; ƃöŕđéŕ-ƃöẋ ŕéñđéŕîñĝ àñđ þĥàñţöḿ (îñṽîšîƃļé-šþàçîñĝ) šéḿàñţîçš àŕé đŕöþþéđ.omml.go node (box/borderBox/phantarg)
7Ŕüñ-ţéẋţ ţöķéñîžàţîöñŴĥîţéšþàçé îñšîđé à ḿàţĥ <m:t> îš đŕöþþéđ; à ḿàẋîḿàļ ļéţţéŕ ŕüñ ƃéçöḿéš à šîñĝļé Ident, šö à ţýþéđ ḿüļţî-ļéţţéŕ ţöķéñ (é.ĝ. sin ñöţ ŵŕàþþéđ îñ <m:func>) ŕéñđéŕš àš öñé îđéñţîƒîéŕ ŕàţĥéŕ ţĥàñ à ŕéçöĝñîžéđ ƒüñçţîöñ.opdict.go classifyRunText
8Üñķñöŵñ àççéñţ ĝļýþĥÀñ àççéñţ ĝļýþĥ àƃšéñţ ƒŕöḿ accentLaTeX ƒàļļš ƃàçķ ţö \hat îñ ĻàŢéẊ (ļöššý đéƒàüļţ).latex.go Accent; opdict.go accentLaTeX
9GroupChr îñ ĻàŢéẊŢĥé àçţüàļ ĝŕöüþ çĥàŕàçţéŕ (Chr) îš îĝñöŕéđ îñ ĻàŢéẊ; öüţþüţ îš àļŵàýš \overbrace/\underbrace çĥöšéñ ƃý Pos. (ḾàţĥḾĻ þŕéšéŕṽéš ţĥé ĝļýþĥ.)latex.go GroupChr ṽš. mathml.go GroupChr

Ŕéļàţéđ