|
|
|
var fontMetrics = require("./fontMetrics"); |
|
var parseData = require("./parseData"); |
|
var ParseError = require("./ParseError"); |
|
|
|
var ParseNode = parseData.ParseNode; |
|
|
|
|
|
|
|
|
|
|
|
|
|
var q = 0 ; |
|
function parseArray(parser, result) { |
|
var row = []; |
|
var body = [row]; |
|
var rowGaps = []; |
|
|
|
while (true) { |
|
|
|
|
|
try { |
|
var cell = parser.parseExpression(false, null); |
|
} catch (e) { |
|
|
|
exit(); |
|
} |
|
|
|
row.push(new ParseNode("ordgroup", cell, parser.mode)); |
|
var next = parser.nextToken.text; |
|
if (next === "&") { |
|
parser.consume(); |
|
} else if (next === "\\end" || next == "}") { |
|
break; |
|
} else if (next === "\\\\" || next === "\\cr") { |
|
|
|
var cr = parser.parseFunction(); |
|
|
|
rowGaps.push(cr.value.size); |
|
row = []; |
|
body.push(row); |
|
} else { |
|
|
|
var pos = Math.min(parser.pos + 1, parser.lexer._input.length); |
|
throw new ParseError("Expected & or \\\\ or \\end", |
|
parser.lexer, pos); |
|
} |
|
} |
|
result.body = body; |
|
result.rowGaps = rowGaps; |
|
|
|
var node = new ParseNode(result.type, result, parser.mode); |
|
return node; |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function defineEnvironment(names, props, handler) { |
|
if (typeof names === "string") { |
|
names = [names]; |
|
} |
|
if (typeof props === "number") { |
|
props = { numArgs: props }; |
|
} |
|
|
|
var data = { |
|
numArgs: props.numArgs || 0, |
|
argTypes: props.argTypes, |
|
greediness: 1, |
|
allowedInText: !!props.allowedInText, |
|
numOptionalArgs: props.numOptionalArgs || 0, |
|
handler: handler, |
|
}; |
|
for (var i = 0; i < names.length; ++i) { |
|
module.exports[names[i]] = data; |
|
} |
|
} |
|
|
|
|
|
|
|
defineEnvironment("array", { |
|
numArgs: 1, |
|
}, function(context, args) { |
|
var colalign = args[0]; |
|
colalign = colalign.value.map ? colalign.value : [colalign]; |
|
var cols = colalign.map(function(node) { |
|
var ca = node.value; |
|
if ("lcr".indexOf(ca) !== -1) { |
|
return { |
|
type: "align", |
|
align: ca, |
|
}; |
|
} else if (ca === "|") { |
|
return { |
|
type: "separator", |
|
separator: "|", |
|
}; |
|
} |
|
|
|
|
|
|
|
}); |
|
var res = { |
|
type: "array", |
|
cols: cols, |
|
hskipBeforeAndAfter: true, |
|
}; |
|
res = parseArray(context.parser, res); |
|
return res; |
|
}); |
|
|
|
defineEnvironment("tabular", { |
|
numArgs: 1, |
|
}, function(context, args) { |
|
var colalign = args[0]; |
|
colalign = colalign.value.map ? colalign.value : [colalign]; |
|
var cols = colalign.map(function(node) { |
|
var ca = node.value; |
|
if ("lcr".indexOf(ca) !== -1) { |
|
return { |
|
type: "align", |
|
align: ca, |
|
}; |
|
} else if (ca === "|") { |
|
return { |
|
type: "separator", |
|
separator: "|", |
|
}; |
|
} |
|
|
|
|
|
|
|
}); |
|
var res = { |
|
type: "array", |
|
style: "tabular", |
|
cols: cols, |
|
hskipBeforeAndAfter: true, |
|
}; |
|
res = parseArray(context.parser, res); |
|
return res; |
|
}); |
|
|
|
|
|
|
|
defineEnvironment([ |
|
"matrix", |
|
"pmatrix", |
|
"bmatrix", |
|
"Bmatrix", |
|
"vmatrix", |
|
"Vmatrix", |
|
], { |
|
}, function(context) { |
|
var delimiters = { |
|
"matrix": null, |
|
"pmatrix": ["(", ")"], |
|
"bmatrix": ["[", "]"], |
|
"Bmatrix": ["\\{", "\\}"], |
|
"vmatrix": ["|", "|"], |
|
"Vmatrix": ["\\Vert", "\\Vert"], |
|
}[context.envName]; |
|
var res = { |
|
type: "array", |
|
hskipBeforeAndAfter: false, |
|
}; |
|
q = 1; |
|
res = parseArray(context.parser, res); |
|
|
|
if (delimiters) { |
|
res = new ParseNode("leftright", { |
|
body: [res], |
|
left: delimiters[0], |
|
right: delimiters[1], |
|
}, context.mode); |
|
} |
|
return res; |
|
}); |
|
|
|
|
|
|
|
|
|
defineEnvironment("picture", { |
|
}, function(context) { |
|
var res = { |
|
type: "array", |
|
arraystretch: 1.2, |
|
cols: [{ |
|
type: "align", |
|
align: "l", |
|
pregap: 0, |
|
postgap: fontMetrics.metrics.quad, |
|
}, { |
|
type: "align", |
|
align: "l", |
|
pregap: 0, |
|
postgap: 0, |
|
}], |
|
}; |
|
res = parseArray(context.parser, res); |
|
res = new ParseNode("leftright", { |
|
body: [res], |
|
left: "\\{", |
|
right: ".", |
|
}, context.mode); |
|
return res; |
|
}); |
|
|
|
defineEnvironment("cases", { |
|
}, function(context) { |
|
var res = { |
|
type: "array", |
|
arraystretch: 1.2, |
|
cols: [{ |
|
type: "align", |
|
align: "l", |
|
pregap: 0, |
|
postgap: fontMetrics.metrics.quad, |
|
}, { |
|
type: "align", |
|
align: "l", |
|
pregap: 0, |
|
postgap: 0, |
|
}], |
|
}; |
|
res = parseArray(context.parser, res); |
|
res = new ParseNode("leftright", { |
|
body: [res], |
|
left: "\\{", |
|
right: ".", |
|
}, context.mode); |
|
return res; |
|
}); |
|
|
|
|
|
|
|
|
|
|
|
defineEnvironment("aligned", { |
|
}, function(context) { |
|
var res = { |
|
type: "array", |
|
cols: [], |
|
}; |
|
res = parseArray(context.parser, res); |
|
var emptyGroup = new ParseNode("ordgroup", [], context.mode); |
|
var numCols = 0; |
|
res.value.body.forEach(function(row) { |
|
var i; |
|
for (i = 1; i < row.length; i += 2) { |
|
row[i].value.unshift(emptyGroup); |
|
} |
|
if (numCols < row.length) { |
|
numCols = row.length; |
|
} |
|
}); |
|
for (var i = 0; i < numCols; ++i) { |
|
var align = "r"; |
|
var pregap = 0; |
|
if (i % 2 === 1) { |
|
align = "l"; |
|
} else if (i > 0) { |
|
pregap = 2; |
|
} |
|
res.value.cols[i] = { |
|
type: "align", |
|
align: align, |
|
pregap: pregap, |
|
postgap: 0, |
|
}; |
|
} |
|
return res; |
|
}); |
|
|