// @flow // Horizontal overlap functions 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) => { // Treat under accents much like underlines. const innerGroup = html.buildGroup(group.base, options); const accentBody = stretchy.svgSpan(group, options); const kern = group.label === "\\utilde" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns 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; }, });