You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.9 KiB
60 lines
1.9 KiB
// @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; |
|
}, |
|
});
|
|
|