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