Skip to content

Commit 9b6e85a

Browse files
authored
Merge pull request #1139 from mathjax/issue1137
Fix incorrect handling of user-defined environments introduced in #856 (#1137)
2 parents 117d0e8 + b40232a commit 9b6e85a

1 file changed

Lines changed: 17 additions & 14 deletions

File tree

ts/input/tex/newcommand/NewcommandMethods.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -257,18 +257,20 @@ const NewcommandMethods: { [key: string]: ParseMethod } = {
257257
if (begin.getProperty('end') && parser.stack.env['closing'] === name) {
258258
// @test Newenvironment Empty, Newenvironment Content
259259
delete parser.stack.env['closing'];
260-
if (edef && parser.stack.env['processing'] !== name) {
261-
// Parse the commands in the end environment definition, and do the \end again
262-
parser.stack.env['processing'] = name;
263-
parser.string = ParseUtil.addArgs(
264-
parser,
265-
`${edef}\\end{${begin.getName()}}`,
266-
parser.string.slice(parser.i)
267-
);
268-
parser.i = 0;
269-
return null;
260+
const beginN = parser.stack.global['beginEnv'] as number;
261+
if (beginN) {
262+
(parser.stack.global['beginEnv'] as number)--;
263+
if (edef) {
264+
// Parse the commands in the end environment definition.
265+
let rest = parser.string.slice(parser.i);
266+
parser.string = edef;
267+
parser.i = 0;
268+
parser.Parse();
269+
// Reset to parsing the remainder of the expression.
270+
parser.string = rest;
271+
parser.i = 0;
272+
}
270273
}
271-
delete parser.stack.env['processing'];
272274
// Close this environment.
273275
return parser.itemFactory.create('end').setProperty('name', name);
274276
}
@@ -277,12 +279,12 @@ const NewcommandMethods: { [key: string]: ParseMethod } = {
277279
const args: string[] = [];
278280
if (def != null) {
279281
// @test Newenvironment Optional, Newenvironment Arg Optional
280-
const optional = parser.GetBrackets('\\begin{' + begin.getName() + '}');
282+
const optional = parser.GetBrackets(`\\begin{${name}}`);
281283
args.push(optional == null ? def : optional);
282284
}
283285
for (let i = args.length; i < n; i++) {
284286
// @test Newenvironment Arg Optional
285-
args.push(parser.GetArgument('\\begin{' + begin.getName() + '}'));
287+
args.push(parser.GetArgument(`\\begin{${name}}`));
286288
}
287289
bdef = ParseUtil.substituteArgs(parser, args, bdef);
288290
edef = ParseUtil.substituteArgs(parser, [], edef); // no args, but get errors for #n in edef
@@ -293,9 +295,10 @@ const NewcommandMethods: { [key: string]: ParseMethod } = {
293295
parser.string.slice(parser.i)
294296
);
295297
parser.i = 0;
298+
parser.stack.global['beginEnv'] = (parser.stack.global['beginEnv'] as number || 0) + 1;
296299
return parser.itemFactory
297300
.create('beginEnv')
298-
.setProperty('name', begin.getName());
301+
.setProperty('name', name);
299302
},
300303

301304
Macro: BaseMethods.Macro,

0 commit comments

Comments
 (0)