@@ -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