AmsMethods.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341
  1. "use strict";
  2. var __assign = (this && this.__assign) || function () {
  3. __assign = Object.assign || function(t) {
  4. for (var s, i = 1, n = arguments.length; i < n; i++) {
  5. s = arguments[i];
  6. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
  7. t[p] = s[p];
  8. }
  9. return t;
  10. };
  11. return __assign.apply(this, arguments);
  12. };
  13. var __read = (this && this.__read) || function (o, n) {
  14. var m = typeof Symbol === "function" && o[Symbol.iterator];
  15. if (!m) return o;
  16. var i = m.call(o), r, ar = [], e;
  17. try {
  18. while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  19. }
  20. catch (error) { e = { error: error }; }
  21. finally {
  22. try {
  23. if (r && !r.done && (m = i["return"])) m.call(i);
  24. }
  25. finally { if (e) throw e.error; }
  26. }
  27. return ar;
  28. };
  29. var __importDefault = (this && this.__importDefault) || function (mod) {
  30. return (mod && mod.__esModule) ? mod : { "default": mod };
  31. };
  32. Object.defineProperty(exports, "__esModule", { value: true });
  33. exports.NEW_OPS = exports.AmsMethods = void 0;
  34. var ParseUtil_js_1 = __importDefault(require("../ParseUtil.js"));
  35. var ParseMethods_js_1 = __importDefault(require("../ParseMethods.js"));
  36. var NodeUtil_js_1 = __importDefault(require("../NodeUtil.js"));
  37. var TexConstants_js_1 = require("../TexConstants.js");
  38. var TexParser_js_1 = __importDefault(require("../TexParser.js"));
  39. var TexError_js_1 = __importDefault(require("../TexError.js"));
  40. var Symbol_js_1 = require("../Symbol.js");
  41. var BaseMethods_js_1 = __importDefault(require("../base/BaseMethods.js"));
  42. var MmlNode_js_1 = require("../../../core/MmlTree/MmlNode.js");
  43. exports.AmsMethods = {};
  44. exports.AmsMethods.AmsEqnArray = function (parser, begin, numbered, taggable, align, spacing, style) {
  45. var args = parser.GetBrackets('\\begin{' + begin.getName() + '}');
  46. var array = BaseMethods_js_1.default.EqnArray(parser, begin, numbered, taggable, align, spacing, style);
  47. return ParseUtil_js_1.default.setArrayAlign(array, args);
  48. };
  49. exports.AmsMethods.AlignAt = function (parser, begin, numbered, taggable) {
  50. var name = begin.getName();
  51. var n, valign, align = '', spacing = [];
  52. if (!taggable) {
  53. valign = parser.GetBrackets('\\begin{' + name + '}');
  54. }
  55. n = parser.GetArgument('\\begin{' + name + '}');
  56. if (n.match(/[^0-9]/)) {
  57. throw new TexError_js_1.default('PositiveIntegerArg', 'Argument to %1 must me a positive integer', '\\begin{' + name + '}');
  58. }
  59. var count = parseInt(n, 10);
  60. while (count > 0) {
  61. align += 'rl';
  62. spacing.push('0em 0em');
  63. count--;
  64. }
  65. var spaceStr = spacing.join(' ');
  66. if (taggable) {
  67. return exports.AmsMethods.EqnArray(parser, begin, numbered, taggable, align, spaceStr);
  68. }
  69. var array = exports.AmsMethods.EqnArray(parser, begin, numbered, taggable, align, spaceStr);
  70. return ParseUtil_js_1.default.setArrayAlign(array, valign);
  71. };
  72. exports.AmsMethods.Multline = function (parser, begin, numbered) {
  73. parser.Push(begin);
  74. ParseUtil_js_1.default.checkEqnEnv(parser);
  75. var item = parser.itemFactory.create('multline', numbered, parser.stack);
  76. item.arraydef = {
  77. displaystyle: true,
  78. rowspacing: '.5em',
  79. columnspacing: '100%',
  80. width: parser.options.ams['multlineWidth'],
  81. side: parser.options['tagSide'],
  82. minlabelspacing: parser.options['tagIndent'],
  83. framespacing: parser.options.ams['multlineIndent'] + ' 0',
  84. frame: '',
  85. 'data-width-includes-label': true
  86. };
  87. return item;
  88. };
  89. exports.AmsMethods.XalignAt = function (parser, begin, numbered, padded) {
  90. var n = parser.GetArgument('\\begin{' + begin.getName() + '}');
  91. if (n.match(/[^0-9]/)) {
  92. throw new TexError_js_1.default('PositiveIntegerArg', 'Argument to %1 must me a positive integer', '\\begin{' + begin.getName() + '}');
  93. }
  94. var align = (padded ? 'crl' : 'rlc');
  95. var width = (padded ? 'fit auto auto' : 'auto auto fit');
  96. var item = exports.AmsMethods.FlalignArray(parser, begin, numbered, padded, false, align, width, true);
  97. item.setProperty('xalignat', 2 * parseInt(n));
  98. return item;
  99. };
  100. exports.AmsMethods.FlalignArray = function (parser, begin, numbered, padded, center, align, width, zeroWidthLabel) {
  101. if (zeroWidthLabel === void 0) { zeroWidthLabel = false; }
  102. parser.Push(begin);
  103. ParseUtil_js_1.default.checkEqnEnv(parser);
  104. align = align
  105. .split('')
  106. .join(' ')
  107. .replace(/r/g, 'right')
  108. .replace(/l/g, 'left')
  109. .replace(/c/g, 'center');
  110. var item = parser.itemFactory.create('flalign', begin.getName(), numbered, padded, center, parser.stack);
  111. item.arraydef = {
  112. width: '100%',
  113. displaystyle: true,
  114. columnalign: align,
  115. columnspacing: '0em',
  116. columnwidth: width,
  117. rowspacing: '3pt',
  118. side: parser.options['tagSide'],
  119. minlabelspacing: (zeroWidthLabel ? '0' : parser.options['tagIndent']),
  120. 'data-width-includes-label': true,
  121. };
  122. item.setProperty('zeroWidthLabel', zeroWidthLabel);
  123. return item;
  124. };
  125. exports.NEW_OPS = 'ams-declare-ops';
  126. exports.AmsMethods.HandleDeclareOp = function (parser, name) {
  127. var star = (parser.GetStar() ? '*' : '');
  128. var cs = ParseUtil_js_1.default.trimSpaces(parser.GetArgument(name));
  129. if (cs.charAt(0) === '\\') {
  130. cs = cs.substr(1);
  131. }
  132. var op = parser.GetArgument(name);
  133. parser.configuration.handlers.retrieve(exports.NEW_OPS).
  134. add(cs, new Symbol_js_1.Macro(cs, exports.AmsMethods.Macro, ["\\operatorname".concat(star, "{").concat(op, "}")]));
  135. };
  136. exports.AmsMethods.HandleOperatorName = function (parser, name) {
  137. var star = parser.GetStar();
  138. var op = ParseUtil_js_1.default.trimSpaces(parser.GetArgument(name));
  139. var mml = new TexParser_js_1.default(op, __assign(__assign({}, parser.stack.env), { font: TexConstants_js_1.TexConstant.Variant.NORMAL, multiLetterIdentifiers: /^[-*a-z]+/i, operatorLetters: true }), parser.configuration).mml();
  140. if (!mml.isKind('mi')) {
  141. mml = parser.create('node', 'TeXAtom', [mml]);
  142. }
  143. NodeUtil_js_1.default.setProperties(mml, { movesupsub: star, movablelimits: true, texClass: MmlNode_js_1.TEXCLASS.OP });
  144. if (!star) {
  145. var c = parser.GetNext(), i = parser.i;
  146. if (c === '\\' && ++parser.i && parser.GetCS() !== 'limits') {
  147. parser.i = i;
  148. }
  149. }
  150. parser.Push(mml);
  151. };
  152. exports.AmsMethods.SideSet = function (parser, name) {
  153. var _a = __read(splitSideSet(parser.ParseArg(name)), 2), preScripts = _a[0], preRest = _a[1];
  154. var _b = __read(splitSideSet(parser.ParseArg(name)), 2), postScripts = _b[0], postRest = _b[1];
  155. var base = parser.ParseArg(name);
  156. var mml = base;
  157. if (preScripts) {
  158. if (preRest) {
  159. preScripts.replaceChild(parser.create('node', 'mphantom', [
  160. parser.create('node', 'mpadded', [ParseUtil_js_1.default.copyNode(base, parser)], { width: 0 })
  161. ]), NodeUtil_js_1.default.getChildAt(preScripts, 0));
  162. }
  163. else {
  164. mml = parser.create('node', 'mmultiscripts', [base]);
  165. if (postScripts) {
  166. NodeUtil_js_1.default.appendChildren(mml, [
  167. NodeUtil_js_1.default.getChildAt(postScripts, 1) || parser.create('node', 'none'),
  168. NodeUtil_js_1.default.getChildAt(postScripts, 2) || parser.create('node', 'none')
  169. ]);
  170. }
  171. NodeUtil_js_1.default.setProperty(mml, 'scriptalign', 'left');
  172. NodeUtil_js_1.default.appendChildren(mml, [
  173. parser.create('node', 'mprescripts'),
  174. NodeUtil_js_1.default.getChildAt(preScripts, 1) || parser.create('node', 'none'),
  175. NodeUtil_js_1.default.getChildAt(preScripts, 2) || parser.create('node', 'none')
  176. ]);
  177. }
  178. }
  179. if (postScripts && mml === base) {
  180. postScripts.replaceChild(base, NodeUtil_js_1.default.getChildAt(postScripts, 0));
  181. mml = postScripts;
  182. }
  183. var mrow = parser.create('node', 'TeXAtom', [], { texClass: MmlNode_js_1.TEXCLASS.OP, movesupsub: true, movablelimits: true });
  184. if (preRest) {
  185. preScripts && mrow.appendChild(preScripts);
  186. mrow.appendChild(preRest);
  187. }
  188. mrow.appendChild(mml);
  189. postRest && mrow.appendChild(postRest);
  190. parser.Push(mrow);
  191. };
  192. function splitSideSet(mml) {
  193. if (!mml || (mml.isInferred && mml.childNodes.length === 0))
  194. return [null, null];
  195. if (mml.isKind('msubsup') && checkSideSetBase(mml))
  196. return [mml, null];
  197. var child = NodeUtil_js_1.default.getChildAt(mml, 0);
  198. if (!(mml.isInferred && child && checkSideSetBase(child)))
  199. return [null, mml];
  200. mml.childNodes.splice(0, 1);
  201. return [child, mml];
  202. }
  203. function checkSideSetBase(mml) {
  204. var base = mml.childNodes[0];
  205. return base && base.isKind('mi') && base.getText() === '';
  206. }
  207. exports.AmsMethods.operatorLetter = function (parser, c) {
  208. return parser.stack.env.operatorLetters ? ParseMethods_js_1.default.variable(parser, c) : false;
  209. };
  210. exports.AmsMethods.MultiIntegral = function (parser, name, integral) {
  211. var next = parser.GetNext();
  212. if (next === '\\') {
  213. var i = parser.i;
  214. next = parser.GetArgument(name);
  215. parser.i = i;
  216. if (next === '\\limits') {
  217. if (name === '\\idotsint') {
  218. integral = '\\!\\!\\mathop{\\,\\,' + integral + '}';
  219. }
  220. else {
  221. integral = '\\!\\!\\!\\mathop{\\,\\,\\,' + integral + '}';
  222. }
  223. }
  224. }
  225. parser.string = integral + ' ' + parser.string.slice(parser.i);
  226. parser.i = 0;
  227. };
  228. exports.AmsMethods.xArrow = function (parser, name, chr, l, r) {
  229. var def = { width: '+' + ParseUtil_js_1.default.Em((l + r) / 18), lspace: ParseUtil_js_1.default.Em(l / 18) };
  230. var bot = parser.GetBrackets(name);
  231. var first = parser.ParseArg(name);
  232. var dstrut = parser.create('node', 'mspace', [], { depth: '.25em' });
  233. var arrow = parser.create('token', 'mo', { stretchy: true, texClass: MmlNode_js_1.TEXCLASS.REL }, String.fromCodePoint(chr));
  234. arrow = parser.create('node', 'mstyle', [arrow], { scriptlevel: 0 });
  235. var mml = parser.create('node', 'munderover', [arrow]);
  236. var mpadded = parser.create('node', 'mpadded', [first, dstrut], def);
  237. NodeUtil_js_1.default.setAttribute(mpadded, 'voffset', '-.2em');
  238. NodeUtil_js_1.default.setAttribute(mpadded, 'height', '-.2em');
  239. NodeUtil_js_1.default.setChild(mml, mml.over, mpadded);
  240. if (bot) {
  241. var bottom = new TexParser_js_1.default(bot, parser.stack.env, parser.configuration).mml();
  242. var bstrut = parser.create('node', 'mspace', [], { height: '.75em' });
  243. mpadded = parser.create('node', 'mpadded', [bottom, bstrut], def);
  244. NodeUtil_js_1.default.setAttribute(mpadded, 'voffset', '.15em');
  245. NodeUtil_js_1.default.setAttribute(mpadded, 'depth', '-.15em');
  246. NodeUtil_js_1.default.setChild(mml, mml.under, mpadded);
  247. }
  248. NodeUtil_js_1.default.setProperty(mml, 'subsupOK', true);
  249. parser.Push(mml);
  250. };
  251. exports.AmsMethods.HandleShove = function (parser, _name, shove) {
  252. var top = parser.stack.Top();
  253. if (top.kind !== 'multline') {
  254. throw new TexError_js_1.default('CommandOnlyAllowedInEnv', '%1 only allowed in %2 environment', parser.currentCS, 'multline');
  255. }
  256. if (top.Size()) {
  257. throw new TexError_js_1.default('CommandAtTheBeginingOfLine', '%1 must come at the beginning of the line', parser.currentCS);
  258. }
  259. top.setProperty('shove', shove);
  260. };
  261. exports.AmsMethods.CFrac = function (parser, name) {
  262. var lr = ParseUtil_js_1.default.trimSpaces(parser.GetBrackets(name, ''));
  263. var num = parser.GetArgument(name);
  264. var den = parser.GetArgument(name);
  265. var lrMap = {
  266. l: TexConstants_js_1.TexConstant.Align.LEFT, r: TexConstants_js_1.TexConstant.Align.RIGHT, '': ''
  267. };
  268. var numNode = new TexParser_js_1.default('\\strut\\textstyle{' + num + '}', parser.stack.env, parser.configuration).mml();
  269. var denNode = new TexParser_js_1.default('\\strut\\textstyle{' + den + '}', parser.stack.env, parser.configuration).mml();
  270. var frac = parser.create('node', 'mfrac', [numNode, denNode]);
  271. lr = lrMap[lr];
  272. if (lr == null) {
  273. throw new TexError_js_1.default('IllegalAlign', 'Illegal alignment specified in %1', parser.currentCS);
  274. }
  275. if (lr) {
  276. NodeUtil_js_1.default.setProperties(frac, { numalign: lr, denomalign: lr });
  277. }
  278. parser.Push(frac);
  279. };
  280. exports.AmsMethods.Genfrac = function (parser, name, left, right, thick, style) {
  281. if (left == null) {
  282. left = parser.GetDelimiterArg(name);
  283. }
  284. if (right == null) {
  285. right = parser.GetDelimiterArg(name);
  286. }
  287. if (thick == null) {
  288. thick = parser.GetArgument(name);
  289. }
  290. if (style == null) {
  291. style = ParseUtil_js_1.default.trimSpaces(parser.GetArgument(name));
  292. }
  293. var num = parser.ParseArg(name);
  294. var den = parser.ParseArg(name);
  295. var frac = parser.create('node', 'mfrac', [num, den]);
  296. if (thick !== '') {
  297. NodeUtil_js_1.default.setAttribute(frac, 'linethickness', thick);
  298. }
  299. if (left || right) {
  300. NodeUtil_js_1.default.setProperty(frac, 'withDelims', true);
  301. frac = ParseUtil_js_1.default.fixedFence(parser.configuration, left, frac, right);
  302. }
  303. if (style !== '') {
  304. var styleDigit = parseInt(style, 10);
  305. var styleAlpha = ['D', 'T', 'S', 'SS'][styleDigit];
  306. if (styleAlpha == null) {
  307. throw new TexError_js_1.default('BadMathStyleFor', 'Bad math style for %1', parser.currentCS);
  308. }
  309. frac = parser.create('node', 'mstyle', [frac]);
  310. if (styleAlpha === 'D') {
  311. NodeUtil_js_1.default.setProperties(frac, { displaystyle: true, scriptlevel: 0 });
  312. }
  313. else {
  314. NodeUtil_js_1.default.setProperties(frac, { displaystyle: false,
  315. scriptlevel: styleDigit - 1 });
  316. }
  317. }
  318. parser.Push(frac);
  319. };
  320. exports.AmsMethods.HandleTag = function (parser, name) {
  321. if (!parser.tags.currentTag.taggable && parser.tags.env) {
  322. throw new TexError_js_1.default('CommandNotAllowedInEnv', '%1 not allowed in %2 environment', parser.currentCS, parser.tags.env);
  323. }
  324. if (parser.tags.currentTag.tag) {
  325. throw new TexError_js_1.default('MultipleCommand', 'Multiple %1', parser.currentCS);
  326. }
  327. var star = parser.GetStar();
  328. var tagId = ParseUtil_js_1.default.trimSpaces(parser.GetArgument(name));
  329. parser.tags.tag(tagId, star);
  330. };
  331. exports.AmsMethods.HandleNoTag = BaseMethods_js_1.default.HandleNoTag;
  332. exports.AmsMethods.HandleRef = BaseMethods_js_1.default.HandleRef;
  333. exports.AmsMethods.Macro = BaseMethods_js_1.default.Macro;
  334. exports.AmsMethods.Accent = BaseMethods_js_1.default.Accent;
  335. exports.AmsMethods.Tilde = BaseMethods_js_1.default.Tilde;
  336. exports.AmsMethods.Array = BaseMethods_js_1.default.Array;
  337. exports.AmsMethods.Spacer = BaseMethods_js_1.default.Spacer;
  338. exports.AmsMethods.NamedOp = BaseMethods_js_1.default.NamedOp;
  339. exports.AmsMethods.EqnArray = BaseMethods_js_1.default.EqnArray;
  340. exports.AmsMethods.Equation = BaseMethods_js_1.default.Equation;
  341. //# sourceMappingURL=AmsMethods.js.map