56 lines
1.9 KiB
TypeScript
56 lines
1.9 KiB
TypeScript
// Horizontal spacing commands
|
|
|
|
import defineFunction from "../defineFunction";
|
|
import {makeGlue} from "../buildCommon";
|
|
import {SpaceNode} from "../mathMLTree";
|
|
import {calculateSize} from "../units";
|
|
import {assertNodeType} from "../parseNode";
|
|
|
|
// TODO: \hskip and \mskip should support plus and minus in lengths
|
|
|
|
defineFunction({
|
|
type: "kern",
|
|
names: ["\\kern", "\\mkern", "\\hskip", "\\mskip"],
|
|
props: {
|
|
numArgs: 1,
|
|
argTypes: ["size"],
|
|
primitive: true,
|
|
allowedInText: true,
|
|
},
|
|
handler({parser, funcName}, args) {
|
|
const size = assertNodeType(args[0], "size");
|
|
if (parser.settings.strict) {
|
|
const mathFunction = (funcName[1] === 'm'); // \mkern, \mskip
|
|
const muUnit = (size.value.unit === 'mu');
|
|
if (mathFunction) {
|
|
if (!muUnit) {
|
|
parser.settings.reportNonstrict("mathVsTextUnits",
|
|
`LaTeX's ${funcName} supports only mu units, ` +
|
|
`not ${size.value.unit} units`);
|
|
}
|
|
if (parser.mode !== "math") {
|
|
parser.settings.reportNonstrict("mathVsTextUnits",
|
|
`LaTeX's ${funcName} works only in math mode`);
|
|
}
|
|
} else { // !mathFunction
|
|
if (muUnit) {
|
|
parser.settings.reportNonstrict("mathVsTextUnits",
|
|
`LaTeX's ${funcName} doesn't support mu units`);
|
|
}
|
|
}
|
|
}
|
|
return {
|
|
type: "kern",
|
|
mode: parser.mode,
|
|
dimension: size.value,
|
|
};
|
|
},
|
|
htmlBuilder(group, options) {
|
|
return makeGlue(group.dimension, options);
|
|
},
|
|
mathmlBuilder(group, options) {
|
|
const dimension = calculateSize(group.dimension, options);
|
|
return new SpaceNode(dimension);
|
|
},
|
|
});
|