|
|
|
|
|
import defineFunction from "../defineFunction"; |
|
import buildCommon from "../buildCommon"; |
|
import mathMLTree from "../mathMLTree"; |
|
import stretchy from "../stretchy"; |
|
|
|
import * as html from "../buildHTML"; |
|
import * as mml from "../buildMathML"; |
|
|
|
import type {ParseNode} from "../parseNode"; |
|
|
|
defineFunction({ |
|
type: "accentUnder", |
|
names: [ |
|
"\\underleftarrow", "\\underrightarrow", "\\underleftrightarrow", |
|
"\\undergroup", "\\underlinesegment", "\\utilde", |
|
], |
|
props: { |
|
numArgs: 1, |
|
}, |
|
handler: ({parser, funcName}, args) => { |
|
const base = args[0]; |
|
return { |
|
type: "accentUnder", |
|
mode: parser.mode, |
|
label: funcName, |
|
base: base, |
|
}; |
|
}, |
|
htmlBuilder: (group: ParseNode<"accentUnder">, options) => { |
|
|
|
const innerGroup = html.buildGroup(group.base, options); |
|
|
|
const accentBody = stretchy.svgSpan(group, options); |
|
const kern = group.label === "\\utilde" ? 0.12 : 0; |
|
|
|
|
|
const vlist = buildCommon.makeVList({ |
|
positionType: "top", |
|
positionData: innerGroup.height, |
|
children: [ |
|
{type: "elem", elem: accentBody, wrapperClasses: ["svg-align"]}, |
|
{type: "kern", size: kern}, |
|
{type: "elem", elem: innerGroup}, |
|
], |
|
}, options); |
|
|
|
return buildCommon.makeSpan(["mord", "accentunder"], [vlist], options); |
|
}, |
|
mathmlBuilder: (group, options) => { |
|
const accentNode = stretchy.mathMLnode(group.label); |
|
const node = new mathMLTree.MathNode( |
|
"munder", |
|
[mml.buildGroup(group.base, options), accentNode] |
|
); |
|
node.setAttribute("accentunder", "true"); |
|
return node; |
|
}, |
|
}); |
|
|