Ben Alpert
2016-04-10 20:32:24 -07:00
parent a33fa4fd64
commit 965b8a6164
9 changed files with 68 additions and 18 deletions

View File

@@ -51,6 +51,7 @@ var groupToType = {
op: "mop",
katex: "mord",
overline: "mord",
underline: "mord",
rule: "mord",
leftright: "minner",
sqrt: "mord",
@@ -928,6 +929,32 @@ groupTypes.overline = function(group, options, prev) {
return makeSpan(["overline", "mord"], [vlist], options.getColor());
};
groupTypes.underline = function(group, options, prev) {
// Underlines are handled in the TeXbook pg 443, Rule 10.
// Build the inner group.
var innerGroup = buildGroup(group.value.body, options);
var ruleWidth = fontMetrics.metrics.defaultRuleThickness /
options.style.sizeMultiplier;
// Create the line above the body
var line = makeSpan(
[options.style.reset(), Style.TEXT.cls(), "underline-line"]);
line.height = ruleWidth;
line.maxFontSize = 1.0;
// Generate the vlist, with the appropriate kerns
var vlist = buildCommon.makeVList([
{type: "kern", size: ruleWidth},
{type: "elem", elem: line},
{type: "kern", size: 3 * ruleWidth},
{type: "elem", elem: innerGroup},
], "top", innerGroup.height, options);
return makeSpan(["underline", "mord"], [vlist], options.getColor());
};
groupTypes.sqrt = function(group, options, prev) {
// Square roots are handled in the TeXbook pg. 443, Rule 11.

View File

@@ -422,6 +422,20 @@ groupTypes.overline = function(group, options) {
return node;
};
groupTypes.underline = function(group, options) {
var operator = new mathMLTree.MathNode(
"mo", [new mathMLTree.TextNode("\u203e")]);
operator.setAttribute("stretchy", "true");
var node = new mathMLTree.MathNode(
"munder",
[buildGroup(group.value.body, options),
operator]);
node.setAttribute("accentunder", "true");
return node;
};
groupTypes.rule = function(group) {
// TODO(emily): Figure out if there's an actual way to draw black boxes
// in MathML.

View File

@@ -170,6 +170,17 @@ defineFunction("\\overline", {
};
});
// An underline
defineFunction("\\underline", {
numArgs: 1,
}, function(context, args) {
var body = args[0];
return {
type: "underline",
body: body,
};
});
// A box of the width and height
defineFunction("\\rule", {
numArgs: 2,