Merge pull request #659 from dominique-unruh/langle-rangle-vert
Support for brackets \langle,\rangle, \lVert,\rVert
diff --git a/src/commands/math/commands.js b/src/commands/math/commands.js
index 61b89c0..2b9baf8 100644
--- a/src/commands/math/commands.js
+++ b/src/commands/math/commands.js
@@ -688,7 +688,9 @@
'⟩': '⟨',
'\\langle ': '\\rangle ',
'\\rangle ': '\\langle ',
- '|': '|'
+ '|': '|',
+ '\\lVert ' : '\\rVert ',
+ '\\rVert ' : '\\lVert ',
};
function bindCharBracketPair(open, ctrlSeq) {
@@ -702,6 +704,8 @@
LatexCmds.langle = bind(Bracket, L, '⟨', '⟩', '\\langle ', '\\rangle ');
LatexCmds.rangle = bind(Bracket, R, '⟨', '⟩', '\\langle ', '\\rangle ');
CharCmds['|'] = bind(Bracket, L, '|', '|', '|', '|');
+LatexCmds.lVert = bind(Bracket, L, '∥', '∥', '\\lVert ', '\\rVert ');
+LatexCmds.rVert = bind(Bracket, R, '∥', '∥', '\\lVert ', '\\rVert ');
LatexCmds.left = P(MathCommand, function(_) {
_.parser = function() {
@@ -710,13 +714,17 @@
var succeed = Parser.succeed;
var optWhitespace = Parser.optWhitespace;
- return optWhitespace.then(regex(/^(?:[([|]|\\\{)/))
- .then(function(ctrlSeq) { // TODO: \langle, \rangle
+ return optWhitespace.then(regex(/^(?:[([|]|\\\{|\\langle\b|\\lVert\b)/))
+ .then(function(ctrlSeq) {
var open = (ctrlSeq.charAt(0) === '\\' ? ctrlSeq.slice(1) : ctrlSeq);
+ if (ctrlSeq=="\\langle") { open = '⟨'; ctrlSeq = ctrlSeq + ' '; }
+ if (ctrlSeq=="\\lVert") { open = '∥'; ctrlSeq = ctrlSeq + ' '; }
return latexMathParser.then(function (block) {
return string('\\right').skip(optWhitespace)
- .then(regex(/^(?:[\])|]|\\\})/)).map(function(end) {
+ .then(regex(/^(?:[\])|]|\\\}|\\rangle\b|\\rVert\b)/)).map(function(end) {
var close = (end.charAt(0) === '\\' ? end.slice(1) : end);
+ if (end=="\\rangle") { close = '⟩'; end = end + ' '; }
+ if (end=="\\rVert") { close = '∥'; end = end + ' '; }
var cmd = Bracket(0, open, close, ctrlSeq, end);
cmd.blocks = [ block ];
block.adopt(cmd, 0, 0);
diff --git a/test/unit/latex.test.js b/test/unit/latex.test.js
index 4cf59fa..ab6d925 100644
--- a/test/unit/latex.test.js
+++ b/test/unit/latex.test.js
@@ -85,6 +85,24 @@
assert.equal(tree.join('latex'), '\\left(123\\right)');
});
+ test('langle/rangle (issue #508)', function() {
+ var tree = latexMathParser.parse('\\left\\langle 123\\right\\rangle)');
+
+ assert.ok(tree.ends[L] instanceof Bracket);
+ var contents = tree.ends[L].ends[L].join('latex');
+ assert.equal(contents, '123');
+ assert.equal(tree.join('latex'), '\\left\\langle 123\\right\\rangle )');
+ });
+
+ test('lVert/rVert', function() {
+ var tree = latexMathParser.parse('\\left\\lVert 123\\right\\rVert)');
+
+ assert.ok(tree.ends[L] instanceof Bracket);
+ var contents = tree.ends[L].ends[L].join('latex');
+ assert.equal(contents, '123');
+ assert.equal(tree.join('latex'), '\\left\\lVert 123\\right\\rVert )');
+ });
+
test('parens with whitespace', function() {
assertParsesLatex('\\left ( 123 \\right ) ', '\\left(123\\right)');
});
@@ -308,5 +326,7 @@
testCantParse('unmatched close brace', '}', ' 1 + 2 } ', '1 - {2 + 3} }', '\\sqrt{ x }} + \\sqrt{y}');
testCantParse('unmatched open brace', '{', '1 * { 2 + 3', '\\frac{ \\sqrt x }{{ \\sqrt y}');
testCantParse('unmatched \\left/\\right', '\\left ( 1 + 2 )', ' [ 1, 2 \\right ]');
+ testCantParse('langlerfish/ranglerfish (checking for confusion with langle/rangle)',
+ '\\left\\langlerfish 123\\right\\ranglerfish)');
});
});