temml 0.10.19 → 0.10.20

Sign up to get free protection for your applications and to get access to all the features.
package/dist/temml.mjs CHANGED
@@ -2070,20 +2070,22 @@ const consolidateNumbers = expression => {
2070
2070
  * Wrap the given array of nodes in an <mrow> node if needed, i.e.,
2071
2071
  * unless the array has length 1. Always returns a single node.
2072
2072
  */
2073
- const makeRow = function(body) {
2073
+ const makeRow = function(body, semisimple = false) {
2074
2074
  if (body.length === 1 && !(body[0] instanceof DocumentFragment)) {
2075
2075
  return body[0];
2076
- } else {
2076
+ } else if (!semisimple) {
2077
2077
  // Suppress spacing on <mo> nodes at both ends of the row.
2078
2078
  if (body[0] instanceof MathNode && body[0].type === "mo" && !body[0].attributes.fence) {
2079
2079
  body[0].attributes.lspace = "0em";
2080
+ body[0].attributes.rspace = "0em";
2080
2081
  }
2081
2082
  const end = body.length - 1;
2082
2083
  if (body[end] instanceof MathNode && body[end].type === "mo" && !body[end].attributes.fence) {
2084
+ body[end].attributes.lspace = "0em";
2083
2085
  body[end].attributes.rspace = "0em";
2084
2086
  }
2085
- return new mathMLTree.MathNode("mrow", body);
2086
2087
  }
2088
+ return new mathMLTree.MathNode("mrow", body);
2087
2089
  };
2088
2090
 
2089
2091
  const isRel = item => {
@@ -2097,10 +2099,10 @@ const isRel = item => {
2097
2099
  * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}.
2098
2100
  * (2) Suppress spacing between two adjacent relations.
2099
2101
  */
2100
- const buildExpression = function(expression, style, isOrdgroup) {
2101
- if (expression.length === 1) {
2102
+ const buildExpression = function(expression, style, semisimple = false) {
2103
+ if (!semisimple && expression.length === 1) {
2102
2104
  const group = buildGroup$1(expression[0], style);
2103
- if (isOrdgroup && group instanceof MathNode && group.type === "mo") {
2105
+ if (group instanceof MathNode && group.type === "mo") {
2104
2106
  // When TeX writers want to suppress spacing on an operator,
2105
2107
  // they often put the operator by itself inside braces.
2106
2108
  group.setAttribute("lspace", "0em");
@@ -2130,8 +2132,8 @@ const buildExpression = function(expression, style, isOrdgroup) {
2130
2132
  * Equivalent to buildExpression, but wraps the elements in an <mrow>
2131
2133
  * if there's more than one. Returns a single node instead of an array.
2132
2134
  */
2133
- const buildExpressionRow = function(expression, style, isOrdgroup) {
2134
- return makeRow(buildExpression(expression, style, isOrdgroup));
2135
+ const buildExpressionRow = function(expression, style, semisimple = false) {
2136
+ return makeRow(buildExpression(expression, style, semisimple), semisimple);
2135
2137
  };
2136
2138
 
2137
2139
  /**
@@ -2816,7 +2818,8 @@ function cdArrow(arrowChar, labels, parser) {
2816
2818
  const arrowGroup = {
2817
2819
  type: "ordgroup",
2818
2820
  mode: "math",
2819
- body: [leftLabel, sizedArrow, rightLabel]
2821
+ body: [leftLabel, sizedArrow, rightLabel],
2822
+ semisimple: true
2820
2823
  };
2821
2824
  return parser.callFunction("\\\\cdparent", [arrowGroup], []);
2822
2825
  }
@@ -3938,20 +3941,12 @@ const mathmlBuilder$8 = (group, style) => {
3938
3941
  node.style.borderBottom = "0.065em solid";
3939
3942
  break
3940
3943
  case "\\cancel":
3941
- node.style.background = `linear-gradient(to top left,
3942
- rgba(0,0,0,0) 0%,
3943
- rgba(0,0,0,0) calc(50% - 0.06em),
3944
- rgba(0,0,0,1) 50%,
3945
- rgba(0,0,0,0) calc(50% + 0.06em),
3946
- rgba(0,0,0,0) 100%);`;
3944
+ // We can't use an inline background-gradient. It does not work client-side.
3945
+ // So set a class and put the rule in the external CSS file.
3946
+ node.classes.push("tml-cancel");
3947
3947
  break
3948
3948
  case "\\bcancel":
3949
- node.style.background = `linear-gradient(to top right,
3950
- rgba(0,0,0,0) 0%,
3951
- rgba(0,0,0,0) calc(50% - 0.06em),
3952
- rgba(0,0,0,1) 50%,
3953
- rgba(0,0,0,0) calc(50% + 0.06em),
3954
- rgba(0,0,0,0) 100%);`;
3949
+ node.classes.push("tml-bcancel");
3955
3950
  break
3956
3951
  /*
3957
3952
  case "\\longdiv":
@@ -3998,18 +3993,7 @@ rgba(0,0,0,0) 100%);`;
3998
3993
  break
3999
3994
  }
4000
3995
  case "\\xcancel":
4001
- node.style.background = `linear-gradient(to top left,
4002
- rgba(0,0,0,0) 0%,
4003
- rgba(0,0,0,0) calc(50% - 0.06em),
4004
- rgba(0,0,0,1) 50%,
4005
- rgba(0,0,0,0) calc(50% + 0.06em),
4006
- rgba(0,0,0,0) 100%),
4007
- linear-gradient(to top right,
4008
- rgba(0,0,0,0) 0%,
4009
- rgba(0,0,0,0) calc(50% - 0.06em),
4010
- rgba(0,0,0,1) 50%,
4011
- rgba(0,0,0,0) calc(50% + 0.06em),
4012
- rgba(0,0,0,0) 100%);`;
3996
+ node.classes.push("tml-xcancel");
4013
3997
  break
4014
3998
  }
4015
3999
  if (group.backgroundColor) {
@@ -4207,7 +4191,7 @@ const getTag = (group, style, rowNum) => {
4207
4191
  if (tagContents) {
4208
4192
  // The author has written a \tag or a \notag in this row.
4209
4193
  if (tagContents.body) {
4210
- tag = buildExpressionRow(tagContents.body, style);
4194
+ tag = buildExpressionRow(tagContents.body, style, true);
4211
4195
  tag.classes = ["tml-tag"];
4212
4196
  } else {
4213
4197
  // \notag. Return an empty span.
@@ -4254,7 +4238,9 @@ function parseArray(
4254
4238
  parser.gullet.macros.set("\\cr", "\\\\\\relax");
4255
4239
  }
4256
4240
  if (addEqnNum) {
4257
- parser.gullet.macros.set("\\tag", "\\env@tag{\\text{#1}}");
4241
+ parser.gullet.macros.set("\\tag", "\\@ifstar\\envtag@literal\\envtag@paren");
4242
+ parser.gullet.macros.set("\\envtag@paren", "\\env@tag{{(\\text{#1})}}");
4243
+ parser.gullet.macros.set("\\envtag@literal", "\\env@tag{\\text{#1}}");
4258
4244
  parser.gullet.macros.set("\\notag", "\\env@notag");
4259
4245
  parser.gullet.macros.set("\\nonumber", "\\env@notag");
4260
4246
  }
@@ -4295,7 +4281,8 @@ function parseArray(
4295
4281
  cell = {
4296
4282
  type: "ordgroup",
4297
4283
  mode: parser.mode,
4298
- body: cell
4284
+ body: cell,
4285
+ semisimple: true
4299
4286
  };
4300
4287
  row.push(cell);
4301
4288
  const next = parser.fetch().text;
@@ -5128,7 +5115,7 @@ const mathmlBuilder$6 = (group, style) => {
5128
5115
  const mathGroup = buildGroup$1(group.body, newStyle);
5129
5116
 
5130
5117
  if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \mathrm{}
5131
- if (font === "boldsymbol" && ["mo", "mpadded"].includes(mathGroup.type)) {
5118
+ if (font === "boldsymbol" && ["mo", "mpadded", "mrow"].includes(mathGroup.type)) {
5132
5119
  mathGroup.style.fontWeight = "bold";
5133
5120
  return mathGroup
5134
5121
  }
@@ -6485,10 +6472,10 @@ defineFunction({
6485
6472
  },
6486
6473
  mathmlBuilder(group, style) {
6487
6474
  if (group.isCharacterBox) {
6488
- const inner = buildExpression(group.body, style);
6475
+ const inner = buildExpression(group.body, style, true);
6489
6476
  return inner[0]
6490
6477
  } else {
6491
- return buildExpressionRow(group.body, style, true)
6478
+ return buildExpressionRow(group.body, style)
6492
6479
  }
6493
6480
  }
6494
6481
  });
@@ -6508,6 +6495,13 @@ const ordTypes = ["textord", "mathord", "ordgroup", "close", "leftright"];
6508
6495
  // NOTE: Unlike most `builders`s, this one handles not only "op", but also
6509
6496
  // "supsub" since some of them (like \int) can affect super/subscripting.
6510
6497
 
6498
+ const setSpacing = node => {
6499
+ // The user wrote a \mathop{…} function. Change spacing from default to OP spacing.
6500
+ // The most likely spacing for an OP is a thin space per TeXbook p170.
6501
+ node.attributes.lspace = "0.1667em";
6502
+ node.attributes.rspace = "0.1667em";
6503
+ };
6504
+
6511
6505
  const mathmlBuilder$2 = (group, style) => {
6512
6506
  let node;
6513
6507
 
@@ -6519,9 +6513,11 @@ const mathmlBuilder$2 = (group, style) => {
6519
6513
  } else {
6520
6514
  node.setAttribute("movablelimits", "false");
6521
6515
  }
6516
+ if (group.fromMathOp) { setSpacing(node); }
6522
6517
  } else if (group.body) {
6523
6518
  // This is an operator with children. Add them.
6524
6519
  node = new MathNode("mo", buildExpression(group.body, style));
6520
+ if (group.fromMathOp) { setSpacing(node); }
6525
6521
  } else {
6526
6522
  // This is a text operator. Add all of the characters from the operator's name.
6527
6523
  node = new MathNode("mi", [new TextNode(group.name.slice(1))]);
@@ -6641,6 +6637,7 @@ defineFunction({
6641
6637
  limits: true,
6642
6638
  parentIsSupSub: false,
6643
6639
  symbol: isSymbol,
6640
+ fromMathOp: true,
6644
6641
  stack: false,
6645
6642
  name: isSymbol ? arr[0].text : null,
6646
6643
  body: isSymbol ? null : ordargument(body)
@@ -6974,7 +6971,7 @@ defineMacro("\\operatorname",
6974
6971
  defineFunctionBuilders({
6975
6972
  type: "ordgroup",
6976
6973
  mathmlBuilder(group, style) {
6977
- return buildExpressionRow(group.body, style, true);
6974
+ return buildExpressionRow(group.body, style, group.semisimple);
6978
6975
  }
6979
6976
  });
6980
6977
 
@@ -12003,6 +12000,8 @@ var unicodeSymbols = {
12003
12000
 
12004
12001
  /* eslint no-constant-condition:0 */
12005
12002
 
12003
+ const binLeftCancellers = ["bin", "op", "open", "punct", "rel"];
12004
+
12006
12005
  /**
12007
12006
  * This file contains the parser used to parse out a TeX expression from the
12008
12007
  * input. Since TeX isn't context-free, standard parsers don't work particularly
@@ -12772,8 +12771,7 @@ class Parser {
12772
12771
  body: expression,
12773
12772
  // A group formed by \begingroup...\endgroup is a semi-simple group
12774
12773
  // which doesn't affect spacing in math mode, i.e., is transparent.
12775
- // https://tex.stackexchange.com/questions/1930/when-should-one-
12776
- // use-begingroup-instead-of-bgroup
12774
+ // https://tex.stackexchange.com/questions/1930/
12777
12775
  semisimple: text === "\\begingroup" || undefined
12778
12776
  };
12779
12777
  } else {
@@ -12887,7 +12885,11 @@ class Parser {
12887
12885
  // Recognize base symbol
12888
12886
  let symbol;
12889
12887
  if (symbols[this.mode][text]) {
12890
- const group = symbols[this.mode][text].group;
12888
+ let group = symbols[this.mode][text].group;
12889
+ if (group === "bin" && binLeftCancellers.includes(this.prevAtomType)) {
12890
+ // Change from a binary operator to a unary (prefix) operator
12891
+ group = "open";
12892
+ }
12891
12893
  const loc = SourceLocation.range(nucleus);
12892
12894
  let s;
12893
12895
  if (Object.prototype.hasOwnProperty.call(ATOMS, group )) {
@@ -13157,7 +13159,7 @@ class Style {
13157
13159
  * https://mit-license.org/
13158
13160
  */
13159
13161
 
13160
- const version = "0.10.19";
13162
+ const version = "0.10.20";
13161
13163
 
13162
13164
  function postProcess(block) {
13163
13165
  const labelMap = {};
@@ -14,7 +14,7 @@
14
14
  * https://mit-license.org/
15
15
  */
16
16
 
17
- const version = "0.10.19";
17
+ const version = "0.10.20";
18
18
 
19
19
  function postProcess(block) {
20
20
  const labelMap = {};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "temml",
3
- "version": "0.10.19",
3
+ "version": "0.10.20",
4
4
  "description": "TeX to MathML conversion in JavaScript.",
5
5
  "main": "dist/temml.js",
6
6
  "engines": {
package/src/Parser.js CHANGED
@@ -15,6 +15,8 @@ import { isDelimiter } from "./functions/delimsizing"
15
15
  import unicodeAccents from /*preval*/ "./unicodeAccents";
16
16
  import unicodeSymbols from /*preval*/ "./unicodeSymbols";
17
17
 
18
+ const binLeftCancellers = ["bin", "op", "open", "punct", "rel"];
19
+
18
20
  /**
19
21
  * This file contains the parser used to parse out a TeX expression from the
20
22
  * input. Since TeX isn't context-free, standard parsers don't work particularly
@@ -784,8 +786,7 @@ export default class Parser {
784
786
  body: expression,
785
787
  // A group formed by \begingroup...\endgroup is a semi-simple group
786
788
  // which doesn't affect spacing in math mode, i.e., is transparent.
787
- // https://tex.stackexchange.com/questions/1930/when-should-one-
788
- // use-begingroup-instead-of-bgroup
789
+ // https://tex.stackexchange.com/questions/1930/
789
790
  semisimple: text === "\\begingroup" || undefined
790
791
  };
791
792
  } else {
@@ -899,7 +900,11 @@ export default class Parser {
899
900
  // Recognize base symbol
900
901
  let symbol;
901
902
  if (symbols[this.mode][text]) {
902
- const group = symbols[this.mode][text].group;
903
+ let group = symbols[this.mode][text].group;
904
+ if (group === "bin" && binLeftCancellers.includes(this.prevAtomType)) {
905
+ // Change from a binary operator to a unary (prefix) operator
906
+ group = "open"
907
+ }
903
908
  const loc = SourceLocation.range(nucleus);
904
909
  let s;
905
910
  if (Object.prototype.hasOwnProperty.call(ATOMS, group )) {
@@ -135,20 +135,22 @@ const consolidateNumbers = expression => {
135
135
  * Wrap the given array of nodes in an <mrow> node if needed, i.e.,
136
136
  * unless the array has length 1. Always returns a single node.
137
137
  */
138
- export const makeRow = function(body) {
138
+ export const makeRow = function(body, semisimple = false) {
139
139
  if (body.length === 1 && !(body[0] instanceof DocumentFragment)) {
140
140
  return body[0];
141
- } else {
141
+ } else if (!semisimple) {
142
142
  // Suppress spacing on <mo> nodes at both ends of the row.
143
143
  if (body[0] instanceof MathNode && body[0].type === "mo" && !body[0].attributes.fence) {
144
144
  body[0].attributes.lspace = "0em"
145
+ body[0].attributes.rspace = "0em"
145
146
  }
146
147
  const end = body.length - 1
147
148
  if (body[end] instanceof MathNode && body[end].type === "mo" && !body[end].attributes.fence) {
149
+ body[end].attributes.lspace = "0em"
148
150
  body[end].attributes.rspace = "0em"
149
151
  }
150
- return new mathMLTree.MathNode("mrow", body);
151
152
  }
153
+ return new mathMLTree.MathNode("mrow", body);
152
154
  };
153
155
 
154
156
  const isRel = item => {
@@ -162,10 +164,10 @@ const isRel = item => {
162
164
  * (1) Suppress spacing when an author wraps an operator w/braces, as in {=}.
163
165
  * (2) Suppress spacing between two adjacent relations.
164
166
  */
165
- export const buildExpression = function(expression, style, isOrdgroup) {
166
- if (expression.length === 1) {
167
+ export const buildExpression = function(expression, style, semisimple = false) {
168
+ if (!semisimple && expression.length === 1) {
167
169
  const group = buildGroup(expression[0], style);
168
- if (isOrdgroup && group instanceof MathNode && group.type === "mo") {
170
+ if (group instanceof MathNode && group.type === "mo") {
169
171
  // When TeX writers want to suppress spacing on an operator,
170
172
  // they often put the operator by itself inside braces.
171
173
  group.setAttribute("lspace", "0em");
@@ -195,8 +197,8 @@ export const buildExpression = function(expression, style, isOrdgroup) {
195
197
  * Equivalent to buildExpression, but wraps the elements in an <mrow>
196
198
  * if there's more than one. Returns a single node instead of an array.
197
199
  */
198
- export const buildExpressionRow = function(expression, style, isOrdgroup) {
199
- return makeRow(buildExpression(expression, style, isOrdgroup));
200
+ export const buildExpressionRow = function(expression, style, semisimple = false) {
201
+ return makeRow(buildExpression(expression, style, semisimple), semisimple);
200
202
  };
201
203
 
202
204
  /**
@@ -44,7 +44,7 @@ const getTag = (group, style, rowNum) => {
44
44
  if (tagContents) {
45
45
  // The author has written a \tag or a \notag in this row.
46
46
  if (tagContents.body) {
47
- tag = mml.buildExpressionRow(tagContents.body, style)
47
+ tag = mml.buildExpressionRow(tagContents.body, style, true)
48
48
  tag.classes = ["tml-tag"]
49
49
  } else {
50
50
  // \notag. Return an empty span.
@@ -91,7 +91,9 @@ function parseArray(
91
91
  parser.gullet.macros.set("\\cr", "\\\\\\relax");
92
92
  }
93
93
  if (addEqnNum) {
94
- parser.gullet.macros.set("\\tag", "\\env@tag{\\text{#1}}");
94
+ parser.gullet.macros.set("\\tag", "\\@ifstar\\envtag@literal\\envtag@paren")
95
+ parser.gullet.macros.set("\\envtag@paren", "\\env@tag{{(\\text{#1})}}");
96
+ parser.gullet.macros.set("\\envtag@literal", "\\env@tag{\\text{#1}}")
95
97
  parser.gullet.macros.set("\\notag", "\\env@notag");
96
98
  parser.gullet.macros.set("\\nonumber", "\\env@notag")
97
99
  }
@@ -132,7 +134,8 @@ function parseArray(
132
134
  cell = {
133
135
  type: "ordgroup",
134
136
  mode: parser.mode,
135
- body: cell
137
+ body: cell,
138
+ semisimple: true
136
139
  };
137
140
  row.push(cell);
138
141
  const next = parser.fetch().text;
@@ -49,7 +49,8 @@ function cdArrow(arrowChar, labels, parser) {
49
49
  const arrowGroup = {
50
50
  type: "ordgroup",
51
51
  mode: "math",
52
- body: [leftLabel, sizedArrow, rightLabel]
52
+ body: [leftLabel, sizedArrow, rightLabel],
53
+ semisimple: true
53
54
  };
54
55
  return parser.callFunction("\\\\cdparent", [arrowGroup], []);
55
56
  }
@@ -34,20 +34,12 @@ const mathmlBuilder = (group, style) => {
34
34
  node.style.borderBottom = "0.065em solid"
35
35
  break
36
36
  case "\\cancel":
37
- node.style.background = `linear-gradient(to top left,
38
- rgba(0,0,0,0) 0%,
39
- rgba(0,0,0,0) calc(50% - 0.06em),
40
- rgba(0,0,0,1) 50%,
41
- rgba(0,0,0,0) calc(50% + 0.06em),
42
- rgba(0,0,0,0) 100%);`
37
+ // We can't use an inline background-gradient. It does not work client-side.
38
+ // So set a class and put the rule in the external CSS file.
39
+ node.classes.push("tml-cancel")
43
40
  break
44
41
  case "\\bcancel":
45
- node.style.background = `linear-gradient(to top right,
46
- rgba(0,0,0,0) 0%,
47
- rgba(0,0,0,0) calc(50% - 0.06em),
48
- rgba(0,0,0,1) 50%,
49
- rgba(0,0,0,0) calc(50% + 0.06em),
50
- rgba(0,0,0,0) 100%);`
42
+ node.classes.push("tml-bcancel")
51
43
  break
52
44
  /*
53
45
  case "\\longdiv":
@@ -94,18 +86,7 @@ rgba(0,0,0,0) 100%);`
94
86
  break
95
87
  }
96
88
  case "\\xcancel":
97
- node.style.background = `linear-gradient(to top left,
98
- rgba(0,0,0,0) 0%,
99
- rgba(0,0,0,0) calc(50% - 0.06em),
100
- rgba(0,0,0,1) 50%,
101
- rgba(0,0,0,0) calc(50% + 0.06em),
102
- rgba(0,0,0,0) 100%),
103
- linear-gradient(to top right,
104
- rgba(0,0,0,0) 0%,
105
- rgba(0,0,0,0) calc(50% - 0.06em),
106
- rgba(0,0,0,1) 50%,
107
- rgba(0,0,0,0) calc(50% + 0.06em),
108
- rgba(0,0,0,0) 100%);`
89
+ node.classes.push("tml-xcancel")
109
90
  break
110
91
  }
111
92
  if (group.backgroundColor) {
@@ -8,7 +8,7 @@ const mathmlBuilder = (group, style) => {
8
8
  const mathGroup = mml.buildGroup(group.body, newStyle)
9
9
 
10
10
  if (mathGroup.children.length === 0) { return mathGroup } // empty group, e.g., \mathrm{}
11
- if (font === "boldsymbol" && ["mo", "mpadded"].includes(mathGroup.type)) {
11
+ if (font === "boldsymbol" && ["mo", "mpadded", "mrow"].includes(mathGroup.type)) {
12
12
  mathGroup.style.fontWeight = "bold"
13
13
  return mathGroup
14
14
  }
@@ -37,10 +37,10 @@ defineFunction({
37
37
  },
38
38
  mathmlBuilder(group, style) {
39
39
  if (group.isCharacterBox) {
40
- const inner = mml.buildExpression(group.body, style);
40
+ const inner = mml.buildExpression(group.body, style, true);
41
41
  return inner[0]
42
42
  } else {
43
- return mml.buildExpressionRow(group.body, style, true)
43
+ return mml.buildExpressionRow(group.body, style)
44
44
  }
45
45
  }
46
46
  });
@@ -17,6 +17,13 @@ export const ordTypes = ["textord", "mathord", "ordgroup", "close", "leftright"]
17
17
  // NOTE: Unlike most `builders`s, this one handles not only "op", but also
18
18
  // "supsub" since some of them (like \int) can affect super/subscripting.
19
19
 
20
+ const setSpacing = node => {
21
+ // The user wrote a \mathop{…} function. Change spacing from default to OP spacing.
22
+ // The most likely spacing for an OP is a thin space per TeXbook p170.
23
+ node.attributes.lspace = "0.1667em"
24
+ node.attributes.rspace = "0.1667em"
25
+ }
26
+
20
27
  const mathmlBuilder = (group, style) => {
21
28
  let node;
22
29
 
@@ -28,9 +35,11 @@ const mathmlBuilder = (group, style) => {
28
35
  } else {
29
36
  node.setAttribute("movablelimits", "false")
30
37
  }
38
+ if (group.fromMathOp) { setSpacing(node) }
31
39
  } else if (group.body) {
32
40
  // This is an operator with children. Add them.
33
41
  node = new mathMLTree.MathNode("mo", mml.buildExpression(group.body, style));
42
+ if (group.fromMathOp) { setSpacing(node) }
34
43
  } else {
35
44
  // This is a text operator. Add all of the characters from the operator's name.
36
45
  node = new mathMLTree.MathNode("mi", [new mathMLTree.TextNode(group.name.slice(1))]);
@@ -150,6 +159,7 @@ defineFunction({
150
159
  limits: true,
151
160
  parentIsSupSub: false,
152
161
  symbol: isSymbol,
162
+ fromMathOp: true,
153
163
  stack: false,
154
164
  name: isSymbol ? arr[0].text : null,
155
165
  body: isSymbol ? null : ordargument(body)
@@ -4,6 +4,6 @@ import * as mml from "../buildMathML";
4
4
  defineFunctionBuilders({
5
5
  type: "ordgroup",
6
6
  mathmlBuilder(group, style) {
7
- return mml.buildExpressionRow(group.body, style, true);
7
+ return mml.buildExpressionRow(group.body, style, group.semisimple);
8
8
  }
9
9
  });
@@ -8,7 +8,7 @@
8
8
  * https://mit-license.org/
9
9
  */
10
10
 
11
- export const version = "0.10.19";
11
+ export const version = "0.10.20";
12
12
 
13
13
  export function postProcess(block) {
14
14
  const labelMap = {}
package/src/svg.js DELETED
@@ -1,110 +0,0 @@
1
- import mathMLTree from "./mathMLTree"
2
- import { Span, Svg } from "./domTree"
3
-
4
- const pathGeometry = {
5
- // tilde1 is a modified version of a glyph from the MnSymbol package
6
- tilde1: `M200 55.538c-77 0-168 73.953-177 73.953-3 0-7
7
- -2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0
8
- 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0
9
- 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128
10
- -68.267.847-113-73.952-191-73.952z`,
11
-
12
- // ditto tilde2, tilde3, & tilde4
13
- tilde2: `M344 55.266c-142 0-300.638 81.316-311.5 86.418
14
- -8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9
15
- 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114
16
- c1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751
17
- 181.476 676 181.476c-149 0-189-126.21-332-126.21z`,
18
-
19
- tilde3: `M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457
20
- -11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0
21
- 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697
22
- 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696
23
- -338 0-409-156.573-744-156.573z`,
24
-
25
- tilde4: `M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345
26
- -11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409
27
- 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9
28
- 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409
29
- -175.236-744-175.236z`,
30
-
31
- // widehat1 is a modified version of a glyph from the MnSymbol package
32
- widehat1: `M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22
33
- c-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z`,
34
-
35
- // ditto widehat2, widehat3, & widehat4
36
- widehat2: `M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10
37
- -11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,
38
-
39
- widehat3: `M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10
40
- -11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,
41
-
42
- widehat4: `M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10
43
- -11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z`,
44
-
45
- // widecheck paths are all inverted versions of widehat
46
- widecheck1: `M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,
47
- -5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z`,
48
-
49
- widecheck2: `M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
50
- -11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,
51
-
52
- widecheck3: `M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
53
- -11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`,
54
-
55
- widecheck4: `M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,
56
- -11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z`
57
-
58
- }
59
-
60
- export const svgAccent = group => {
61
- const label = group.label.slice(1)
62
- const numChars = group.base.type === "ordgroup" ? group.base.body.length : 1
63
- let viewBoxWidth
64
- let viewBoxHeight
65
- let pathName
66
- let height
67
-
68
- if (numChars > 5) {
69
- if (label === "widehat" || label === "widecheck") {
70
- viewBoxHeight = 420;
71
- viewBoxWidth = 2364;
72
- height = 0.42;
73
- pathName = label + "4";
74
- } else {
75
- viewBoxHeight = 312;
76
- viewBoxWidth = 2340;
77
- height = 0.34;
78
- pathName = "tilde4";
79
- }
80
- } else {
81
- const imgIndex = [1, 1, 2, 2, 3, 3][numChars];
82
- if (label === "widehat" || label === "widecheck") {
83
- viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex];
84
- viewBoxHeight = [0, 239, 300, 360, 420][imgIndex];
85
- height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex];
86
- pathName = label + imgIndex;
87
- } else {
88
- viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex];
89
- viewBoxHeight = [0, 260, 286, 306, 312][imgIndex];
90
- height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex];
91
- pathName = "tilde" + imgIndex;
92
- }
93
- }
94
- const svg = new Svg(
95
- { width: "100%",
96
- height: `${height}em`,
97
- viewBox: `0 0 ${viewBoxWidth} ${viewBoxHeight}`,
98
- preserveAspectRatio: "none"
99
- },
100
- pathGeometry[pathName],
101
- null
102
- )
103
- const span = new Span([], [svg],
104
- { display: "inline-block", position: "relative", width: "100%", height: `${height}em` }
105
- )
106
- const node = new mathMLTree.MathNode("mo", [span], [], { "math-depth":1 })
107
- node.setAttribute("stretchy", "true")
108
- return node
109
-
110
- }