ÖḾḾĻ Ḿàţĥ Çöñṽéŕšîöñ
Îḿþļéḿéñţàţîöñ đéţàîļš ƒöŕ ţĥé ḿàţĥ-çöñṽéŕšîöñ šüƃšýšţéḿ đéçîđéđ îñ
Ḿ-04: Ḿàţĥ àñđ Éǫüàţîöñš.
Ţĥé þàçķàĝé core/math (Ĝö îḿþöŕţ github.com/neokapi/neokapi/core/math,
þàçķàĝé ñàḿé math) îš à çĝö-ƒŕéé, ŴÀŠḾ-šàƒé çöñṽéŕţéŕ ƃéţŵééñ ÉÇḾÀ-376
Þàŕţ 1 §22.1 Öƒƒîçé Ḿàţĥ Ḿàŕķüþ Ļàñĝüàĝé (ÖḾḾĻ) àñđ ţŵö þöŕţàƃļé ñöţàţîöñš,
Þŕéšéñţàţîöñ ḾàţĥḾĻ àñđ ĻàŢéẊ, ƃý ŵàý öƒ à šḿàļļ îñţéŕḿéđîàţé ÀŠŢ. Ţĥé ĥöšţ
ƒöŕḿàţ ŕéàđéŕ ķééþš ţĥé öŕîĝîñàļ ÖḾḾĻ ƃýţéš ṽéŕƃàţîḿ ƒöŕ ţĥé ƃýţé-éẋàçţ
ŕöüñđ-ţŕîþ (šéé Šķéļéţöñ Šţöŕé);
ţĥîš þàçķàĝé öñļý þŕöđüçéš ţĥé àđđîţîöñàļ þöŕţàƃļé ŕéñđéŕîñĝš ţĥàţ
çŕöšš-ƒöŕḿàţ ŵŕîţéŕš (ḿàŕķđöŵñ, ĐöçĻàñĝ, à ƒüţüŕé ĤŢḾĻ ŵŕîţéŕ) éḿîţ, àñđ ţĥé
ñöŕ-þŕöšé šþļîçé ţĥàţ ŵŕîţéš éǫüàţîöñ þŕöšé ţŕàñšļàţîöñš ƃàçķ îñţö ţĥé öŕîĝîñàļ
ƃýţéš.
Ţĥé þàçķàĝé îš đéļîƃéŕàţéļý ţöļéŕàñţ: àñ ÖḾḾĻ éļéḿéñţ îţ đöéš ñöţ ḿöđéļ đéĝŕàđéš
ţö à ƃéšţ-郃öŕţ ŕöŵ öŕ îš đŕöþþéđ, ñéṽéŕ ƒàîļîñĝ à đöçüḿéñţ ŕéàđ. FromOMML
ŕéţüŕñš à ƒàţàļ éŕŕöŕ öñļý ƒöŕ ḿàļƒöŕḿéđ ẊḾĻ.
Ţĥé Éẋþ ÀŠŢ
Exp îš à çļöšéđ îñţéŕƒàçé, à šéàļéđ šüḿ ţýþé ĝüàŕđéđ ƃý ţĥé üñéẋþöŕţéđ ḿàŕķéŕ
ḿéţĥöđ isExp(), šö öñļý ţĥé ñöđé ţýþéš đéçļàŕéđ îñ math.go çàñ šàţý îţ.
Ţĥé šéŕîàļîžéŕš ţýþé-šŵîţçĥ öṽéŕ ţĥîš çļöšéđ šéţ, éàçĥ ŵîţĥ à đéƒéñšîṽé
default ƃŕàñçĥ (àñ éḿþţý šţŕîñĝ ƒöŕ àñ üñéẋþéçţéđ ñöđé). Ţĥé ñöđé šéţ:
| Ñöđé | Šĥàþé | Ŕéñđéŕš àš |
|---|---|---|
Number | Text string | <mn> / đîĝîţš |
Ident | Text string | <mi> / ļéţţéŕš |
Operator | Text string | <mo> / öþéŕàţöŕ ĝļýþĥ |
Text | Content string; Normal bool | <mtext> / \text{}; Normal ţŕüé ḿàŕķš <m:nor/> þŕöšé |
Row | Items []Exp | çöñçàţéñàţîöñ / <mrow> ŵĥéñ üšéđ àš àñ àŕĝüḿéñţ |
Fraction | Num, Den Exp; NoBar bool | <mfrac> / \frac (öŕ \atop ŵĥéñ NoBar) |
Superscript | Base, Sup Exp | <msup> / ^{} |
Subscript | Base, Sub Exp | <msub> / _{} |
SubSup | Base, Sub, Sup Exp | <msubsup> / _{}^{} |
Radical | Degree, Body Exp (Degree ñîļ = šǫüàŕé ŕööţ) | <msqrt>/<mroot> / \sqrt |
Nary | Chr string; Sub, Sup, Body Exp | <munder/over/underover> + ƃöđý / \sum éţç. |
Delimited | Open, Close string; Body Exp ("" = îñṽîšîƃļé ƒéñçé) | ƒéñçéđ <mrow> / \left…\right |
Function | Name string; Arg Exp | <mi>name</mi> + àþþļîç. / \sin öŕ \operatorname |
Matrix | Rows [][]Exp | <mtable> / \begin{matrix} |
Accent | Accent string; Body Exp | <mover accent> / \hat éţç. |
Bar | Body Exp; Top bool | <mover>/<munder> / \overline/\underline |
GroupChr | Chr string; Pos string; Body Exp | <mover>/<munder> / \overbrace/\underbrace |
Raw | Content 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, é.ĝ. à ƒŕàçţîöñ'šfPrtype="noBar"öŕ ànaryPrchr, îš ŕéàđ ƃý ṽàļüé.skip(end): đéþţĥ-çöüñţéđ çöñšüḿþţîöñ öƒ àñ éñţîŕé šüƃţŕéé.
node îš ţĥé šţŕüçţüŕàļ đîšþàţçĥ ţàƃļé, ķéýéđ öñ ţĥé éļéḿéñţ'š ļöçàļ ñàḿé:
r→run, f→fraction, sSup/sSub/sSubSup→script, rad→radical,
nary, d→delim, func→function, m→matrix, acc→accent, bar,
groupChr, limLow/limUpp→limit, 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 ƃļöçķš; ţĥé þŕöšé àļŕéàđý ŕîđéš
îñšîđé ţĥé ƒöŕḿüļà'š ĻàŢéẊ.
Ţĥîš ŕéàļîžéš ţĥé šàḿé þàŕîţý ĝüàŕàñţéé ţĥé çöñṽéŕţéŕ'š þüŕé šþļîçé đöéš, ṽîà ţĥé þŕöĵéçţ'š ĝéñéŕàļ šķéļéţöñ ḿàçĥîñéŕý ŕàţĥéŕ ţĥàñ à ƃéšþöķé ŕéŵŕîţé.
Þüƃļîç ÀÞÎ šüŕƒàçé
| Šýḿƃöļ | Šîĝñàţüŕé | Ŕöļé | Ŵîŕéđ îñţö |
|---|---|---|---|
FromOMML | func([]byte) (*Math, error) | Þàŕšé <m:oMath>/<m:oMathPara> îñţö ţĥé ÀŠŢ; éŕŕöŕ öñļý öñ ḿàļƒöŕḿéđ ẊḾĻ | openxml ommlToMathEquiv |
(*Math).ToLaTeX | func() string | ĻàŢéẊ, ñö $/$$ đéļîḿîţéŕš | openxml (ḿàŕķđöŵñ $..$/$$..$$ Éǫüîṽ, ĐöçĻàñĝ <formula> Đîšþ) |
(*Math).ToMathML | func() string | Þŕéšéñţàţîöñ ḾàţĥḾĻ <math> éļéḿéñţ (display="block" ŵĥéñ Block) | ŵîŕéđ-ƃüţ-üñçàļļéđ; ŕéšéŕṽéđ ƒöŕ à ƒüţüŕé ĤŢḾĻ ŵŕîţéŕ |
(*Math).TranslatableText | func() string | Çöñçàţéñàţéđ <m:nor/> þŕöšé, šþàçé-ĵöîñéđ, ŕéàđîñĝ öŕđéŕ; éḿþţý ƒöŕ þüŕé ḿàţĥ | üñŵîŕéđ (ŕöüñđ-ţŕîþ ţéšţš öñļý); ţĥé đöçẋ þàţĥ šüŕƒàçéš þŕöšé ṽîà NorSpans |
(*Math).Block | bool ƒîéļđ | Đîšþļàý (oMathPara) ṽš îñļîñé (oMath) | šéļéçţš $$/$ đéļîḿîţéŕš àñđ ḾàţĥḾĻ display |
NorTexts | func([]byte) []string | Éàçĥ <m:nor/> ŕüñ'š ţéẋţ, đöçüḿéñţ öŕđéŕ | üñŵîŕéđ (ţéšţš öñļý); éñüḿéŕàţîöñ çöñṽéñîéñçé |
NorSpans | func([]byte) []NorSpan | Þŕöšé ţéẋţ + ƃýţé öƒƒšéţš îñţö raw, đöçüḿéñţ öŕđéŕ | ÖþéñẊḾĻ šüƃ-šķéļéţöñ (writeOMathSubSkeleton) |
SpliceNorText | func([]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 đéƒàüļţ çàšé đŕöþš ţĥé éļéḿéñţ (skip → nil). Raw îš đéƒîñéđ àš ţĥé "ĝŕàçéƒüļ ƒàļļƃàçķ" ļîţéŕàļ àñđ îš ŕéñđéŕéđ ƃý ƃöţĥ šéŕîàļîžéŕš, ƃüţ ţĥé ŕéàđéŕ ñéṽéŕ çöñšţŕüçţš îţ: ĝŕàçéƒüļ đéĝŕàđàţîöñ îš "đŕöþ", ñöţ "ķééþ àš Raw". | omml.go node đéƒàüļţ; math.go Raw; mathml.go/latex.go Raw çàšéš (üñŕéàçĥàƃļé ƒŕöḿ FromOMML) |
| 2 | limLow / limUpp | Ḿöđéļéđ àš à þļàîñ Subscript / Superscript. Üñđéŕ-/öṽéŕ-ļîḿîţ þöšîţîöñîñĝ çöļļàþšéš ţö àñ îñļîñé šçŕîþţ (base_{lim} / base^{lim}), ļöšîñĝ \underset/\overset-šţýļé šţàçķîñĝ. | omml.go limit |
| 3 | sPre (þŕé-šçŕîþţš) | Ḿöđéļéđ àš 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 |
| 6 | box / borderBox / phant | Ŕéđüçéđ ţö ţĥéîŕ îññéŕ <m:e>; ƃöŕđéŕ-ƃöẋ ŕéñđéŕîñĝ àñđ þĥàñţöḿ (îñṽîšîƃļé-šþàçîñĝ) šéḿàñţîçš àŕé đŕöþþéđ. | omml.go node (box/borderBox/phant → arg) |
| 7 | Ŕüñ-ţéẋţ ţöķéñîžàţîöñ | Ŵĥîţéšþàçé îñšîđé à ḿàţĥ <m:t> îš đŕöþþéđ; à ḿàẋîḿàļ ļéţţéŕ ŕüñ ƃéçöḿéš à šîñĝļé Ident, šö à ţýþéđ ḿüļţî-ļéţţéŕ ţöķéñ (é.ĝ. sin ñöţ ŵŕàþþéđ îñ <m:func>) ŕéñđéŕš àš öñé îđéñţîƒîéŕ ŕàţĥéŕ ţĥàñ à ŕéçöĝñîžéđ ƒüñçţîöñ. | opdict.go classifyRunText |
| 8 | Üñķñöŵñ àççéñţ ĝļýþĥ | Àñ àççéñţ ĝļýþĥ àƃšéñţ ƒŕöḿ accentLaTeX ƒàļļš ƃàçķ ţö \hat îñ ĻàŢéẊ (ļöššý đéƒàüļţ). | latex.go Accent; opdict.go accentLaTeX |
| 9 | GroupChr îñ ĻàŢéẊ | Ţĥé àçţüàļ ĝŕöüþ çĥàŕàçţéŕ (Chr) îš îĝñöŕéđ îñ ĻàŢéẊ; öüţþüţ îš àļŵàýš \overbrace/\underbrace çĥöšéñ ƃý Pos. (ḾàţĥḾĻ þŕéšéŕṽéš ţĥé ĝļýþĥ.) | latex.go GroupChr ṽš. mathml.go GroupChr |
Ŕéļàţéđ
- Ḿ-04 Ḿàţĥ àñđ Éǫüàţîöñš: ţĥé đéçîšîöñ ţĥîš ñöţé îḿþļéḿéñţš
- Ƒ-02 Çöñţéñţ Ḿöđéļ:
Block,Run,Ph(þļàçéĥöļđéŕEquiv/Disp), àñđSemanticRole - À-02 Þàŕîţý ţéšţîñĝ àĝàîñšţ Okapi: ŵĥý
Ph.Equiv/Ph.DispàñđSemanticRoleàŕé þàŕîţý-šàƒé çàŕŕîéŕš - Šķéļéţöñ Šţöŕé àñđ Šţŕéàḿîñĝ ĤŢḾĻ: ţĥé šķéļéţöñ ḿéçĥàñîšḿ ţĥé ÖḾḾĻ šüƃ-šķéļéţöñ ŕîđéš öñ