Skip to content

Commit c5b841b

Browse files
committed
Fix incorrect handling of user-defined environments introduced in #856 (#1137)
1 parent 43bb7d9 commit c5b841b

1 file changed

Lines changed: 22 additions & 15 deletions

File tree

ts/input/tex/newcommand/NewcommandMethods.ts

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -257,18 +257,22 @@ 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+
const beginItem = parser.stack.Top(parser.stack.height - beginN);
263+
const prevBegin = beginItem.getProperty('prev-begin') as number;
264+
parser.stack.global['beginEnv'] = prevBegin || 0;
265+
if (edef) {
266+
// Parse the commands in the end environment definition.
267+
let rest = parser.string.slice(parser.i);
268+
parser.string = edef;
269+
parser.i = 0;
270+
parser.Parse();
271+
// Reset to parsing the remainder of the expression.
272+
parser.string = rest;
273+
parser.i = 0;
274+
}
270275
}
271-
delete parser.stack.env['processing'];
272276
// Close this environment.
273277
return parser.itemFactory.create('end').setProperty('name', name);
274278
}
@@ -277,12 +281,12 @@ const NewcommandMethods: { [key: string]: ParseMethod } = {
277281
const args: string[] = [];
278282
if (def != null) {
279283
// @test Newenvironment Optional, Newenvironment Arg Optional
280-
const optional = parser.GetBrackets('\\begin{' + begin.getName() + '}');
284+
const optional = parser.GetBrackets(`\\begin{${name}}`);
281285
args.push(optional == null ? def : optional);
282286
}
283287
for (let i = args.length; i < n; i++) {
284288
// @test Newenvironment Arg Optional
285-
args.push(parser.GetArgument('\\begin{' + begin.getName() + '}'));
289+
args.push(parser.GetArgument(`\\begin{${name}}`));
286290
}
287291
bdef = ParseUtil.substituteArgs(parser, args, bdef);
288292
edef = ParseUtil.substituteArgs(parser, [], edef); // no args, but get errors for #n in edef
@@ -293,9 +297,12 @@ const NewcommandMethods: { [key: string]: ParseMethod } = {
293297
parser.string.slice(parser.i)
294298
);
295299
parser.i = 0;
296-
return parser.itemFactory
300+
const item = parser.itemFactory
297301
.create('beginEnv')
298-
.setProperty('name', begin.getName());
302+
.setProperty('name', name)
303+
.setProperty('prev-begin', parser.stack.global['beginEnv']);
304+
parser.stack.global['beginEnv'] = parser.stack.height;
305+
return item;
299306
},
300307

301308
Macro: BaseMethods.Macro,

0 commit comments

Comments
 (0)