@@ -300,18 +300,33 @@ sub readToken {
300300 return T_CS(' \special_relax' ); }
301301 else {
302302 last ; } }
303+ if ($token ) {
304+ $cc = $$token [1];
305+ if ($cc == CC_BEGIN) { $LaTeXML::ALIGN_STATE ++; }
306+ elsif ($cc == CC_END) { $LaTeXML::ALIGN_STATE --; }
307+ }
303308 return $token ; }
304309
305310# Unread tokens are assumed to be not-yet expanded.
306311sub unread {
307312 my ($self , @tokens ) = @_ ;
308- my $r ;
309- unshift (@{ $$self {pushback } },
310- map { (!defined $_ ? ()
311- : (($r = ref $_ ) eq ' LaTeXML::Core::Token' ? $_
312- : ($r eq ' LaTeXML::Core::Tokens' ? @$_
313- : Error(' misdefined' , $r , undef , " Expected a Token, got " . Stringify($_ )) || T_OTHER(Stringify($_ ))))) }
314- @tokens );
313+ my $level = 0;
314+ my $pb = $$self {pushback };
315+ while (@tokens ) {
316+ my $token = pop (@tokens );
317+ my $r = ref $token ;
318+ if (!defined $token ) { }
319+ elsif ($r eq ' LaTeXML::Core::Tokens' ) {
320+ push (@tokens , @$token ); }
321+ elsif ($r eq ' LaTeXML::Core::Token' ) {
322+ my $cc = $$token [1];
323+ if ($cc == CC_BEGIN) { $level --; } # Retract scanned braces
324+ elsif ($cc == CC_END) { $level ++; }
325+ unshift (@$pb , $token ); }
326+ else {
327+ Error(' misdefined' , $r , undef , " Expected a Token, got " . Stringify($_ ));
328+ unshift (@$pb , T_OTHER($token )); } }
329+ $LaTeXML::ALIGN_STATE += $level ;
315330 return ; }
316331
317332# Read the next non-expandable token (expanding tokens until there's a non-expandable one).
@@ -368,11 +383,13 @@ sub readXToken {
368383 no warnings ' recursion' ;
369384 my $expansion = $defn -> invoke($self );
370385 # add the newly expanded tokens back into the gullet stream, in the ordinary case.
371- unshift (@{ $$ self{ pushback } }, @ $expansion ) if $expansion ; } }
386+ unread( $ self, $expansion ) if $expansion ; } }
372387 elsif ($$token [1] == CC_CS && !(defined $defn )) {
373388 $STATE -> generateErrorStub($self , $token ); # cs SHOULD have defn by now; report early!
374389 return $token ; }
375390 else {
391+ if ($cc == CC_BEGIN) { $LaTeXML::ALIGN_STATE ++; }
392+ elsif ($cc == CC_END) { $LaTeXML::ALIGN_STATE --; }
376393 return $token ; } # just return it
377394 }
378395 return ; } # never get here.
@@ -392,6 +409,7 @@ our $DEFERRED_COMMANDS = {
392409
393410sub readBalanced {
394411 my ($self , $expanded , $macrodef , $require_open ) = @_ ;
412+ $LaTeXML::ALIGN_STATE -- unless $require_open ; # assume matching } [BEFORE masking ALIGN_STATE]
395413 local $LaTeXML::ALIGN_STATE = 1000000;
396414 my $startloc = ($$self {verbosity } > 0) && getLocator($self );
397415 # Does we need to expand to get the { ???
@@ -423,11 +441,13 @@ sub readBalanced {
423441 elsif (($cc == CC_CS) && ($$token [0] eq ' \dont_expand' )) {
424442 push (@tokens , readToken($self )); } # Pass on NEXT token, unchanged.
425443 elsif ($cc == CC_END) {
444+ $LaTeXML::ALIGN_STATE --;
426445 $level --;
427446 if (!$level ) {
428447 last ; }
429448 push (@tokens , $token ); }
430449 elsif ($cc == CC_BEGIN) {
450+ $LaTeXML::ALIGN_STATE ++;
431451 $level ++;
432452 push (@tokens , $token ); }
433453 # # Wow!!!!! See TeX the Program \S 309
@@ -460,7 +480,7 @@ sub readBalanced {
460480 push (@tokens , $t ); } }
461481 }
462482 else { # otherwise, prepend to pushback to be expanded further.
463- unshift (@{ $$ self{ pushback } }, @ $expansion ); } }
483+ unread( $ self, $expansion ) if $expansion ; } }
464484 else {
465485 if ($expanded && ($$token [1] == CC_CS) && !(defined $defn )) {
466486 $STATE -> generateErrorStub($self , $token ); } # cs SHOULD have defn by now; report early!
@@ -520,15 +540,15 @@ sub readXNonSpace {
520540sub skipSpaces {
521541 my ($self ) = @_ ;
522542 my $tok = readNonSpace($self );
523- unshift (@{ $$ self{ pushback } } , $tok ) if defined $tok ; # Unread
543+ unread( $ self , $tok ) if defined $tok ;
524544 return ; }
525545
526546# Skip one space
527547# if $expanded is true, it acts like <one optional space>, expanding the next token.
528548sub skip1Space {
529549 my ($self , $expanded ) = @_ ;
530550 my $token = ($expanded ? readXToken($self ) : readToken($self ));
531- unshift (@{ $$ self{ pushback } } , $token ) if $token && !$token -> defined_as(T_SPACE);
551+ unread( $ self , $token ) if $token && !$token -> defined_as(T_SPACE);
532552 return ; }
533553
534554# <filler> = <optional spaces> | <filler>\relax<optional spaces>
@@ -539,15 +559,15 @@ sub skipFiller {
539559 return unless defined $tok ;
540560 # Should \foo work too (where \let\foo\relax) ??
541561 if (!$tok -> equals(T_CS(' \relax' ))) {
542- unshift (@{ $$ self{ pushback } } , $tok ); # Unread
562+ unread( $ self , $tok );
543563 return ; }
544564 }
545565 return ; }
546566
547567sub ifNext {
548568 my ($self , $token ) = @_ ;
549569 if (my $tok = readToken($self )) {
550- unshift (@{ $$ self{ pushback } } , $tok ); # Unread
570+ unread( $ self , $tok );
551571 return $tok -> equals($token ); }
552572 else { return 0; } }
553573
@@ -564,10 +584,9 @@ sub readMatch {
564584 if ($$token [1] == CC_SPACE) { # If this was space, SKIP any following!!!
565585 while (defined ($token = readToken($self )) && ($$token [1] == CC_SPACE)) {
566586 push (@matched , $token ); }
567- unshift (@{ $$self {pushback } }, $token ) if $token ; } # Unread
568- }
569- return $choice unless @tomatch ; # All matched!!!
570- unshift (@{ $$self {pushback } }, @matched ); # Put 'em back and try next!
587+ unread($self , $token ) if defined $token ; } }
588+ return $choice unless @tomatch ; # All matched!!!
589+ unread($self , @matched ); # Put 'em back and try next!
571590 }
572591 return ; }
573592
@@ -585,9 +604,8 @@ sub readKeyword {
585604 while (@tomatch && defined ($tok = readXToken($self , 0)) && push (@matched , $tok )
586605 && (uc ($$tok [0]) eq $tomatch [0])) {
587606 shift (@tomatch ); }
588- return $keyword unless @tomatch ; # All matched!!!
589- unshift (@{ $$self {pushback } }, @matched ); # Put 'em back and try next!
590- }
607+ return $keyword unless @tomatch ; # All matched!!!
608+ unread($self , @matched ); } # Put 'em back tand try next!
591609 return ; }
592610
593611# Return a (balanced) sequence tokens until a match against one of the Tokens in @delims.
@@ -603,9 +621,7 @@ sub readUntil {
603621 my $ntomatch = scalar (@want );
604622 if ($ntomatch == 1) { # Common, easy case: read till we match a single token
605623 my $want = $want [0];
606- # while(($token = readToken($self)) && !$token->equals($want)){
607- while (($token = shift (@{ $$self {pushback } }) || $$self {mouth }-> readToken())
608- && !$token -> equals($want )) {
624+ while (($token = readToken($self )) && !$token -> equals($want )) {
609625 my $cc = $$token [1];
610626 if ($cc == CC_MARKER) { # would have been handled by readToken, but we're bypassing
611627 handleMarker($self , $token ); }
@@ -647,6 +663,7 @@ sub readUntilBrace {
647663 my $token ;
648664 while (defined ($token = readToken($self ))) {
649665 if ($$token [1] == CC_BEGIN) { # INLINE Catcode
666+ $LaTeXML::ALIGN_STATE --;
650667 unshift (@{ $$self {pushback } }, $token ); # Unread
651668 last ; }
652669 push (@tokens , $token ); }
@@ -700,7 +717,7 @@ sub readOptional {
700717 elsif (($tok -> equals(T_OTHER(' [' )))) {
701718 return readUntil($self , T_OTHER(' ]' )); }
702719 else {
703- unshift (@{ $$ self{ pushback } } , $tok ); # Unread
720+ unread( $ self , $tok );
704721 return $default ; } }
705722
706723# **********************************************************************
@@ -752,7 +769,7 @@ sub readRegisterValue {
752769 else {
753770 return &$coercer ($sign * $value -> valueOf); } }
754771 else {
755- unshift (@{ $$ self{ pushback } } , $token ); # Unread
772+ unread( $ self , $token );
756773 return ; } }
757774
758775# Apparent behaviour of a token value (ie \toks#=<arg>)
@@ -791,7 +808,7 @@ sub readOptionalSigns {
791808 while (defined ($t = readXToken($self ))
792809 && (($$t [0] eq ' +' ) || ($$t [0] eq ' -' ) || $t -> defined_as(T_SPACE))) {
793810 $sign = -$sign if ($$t [0] eq ' -' ); }
794- unshift (@{ $$ self{ pushback } } , $t ) if $t ; # Unread
811+ unread( $ self , $t ) if $t ;
795812 return $sign ; }
796813
797814# Read digits (within $range), while expanding and if $skip, skip <one optional space> (expanded!)
@@ -801,7 +818,7 @@ sub readDigits {
801818 my ($token , $digit );
802819 while (($token = readXToken($self )) && (($digit = $$token [0]) =~ / ^[$range ]$ / )) {
803820 $string .= $digit ; }
804- unshift (@{ $$ self{ pushback } } , $token ) if $token && !($skip && $token -> defined_as(T_SPACE)); # Inline
821+ unread( $ self , $token ) if $token && !($skip && $token -> defined_as(T_SPACE)); # Inline
805822 return $string ; }
806823
807824# <factor> = <normal integer> | <decimal constant>
@@ -815,10 +832,10 @@ sub readFactor {
815832 $string .= ' .' . readDigits($self , ' 0-9' );
816833 $token = readXToken($self ); }
817834 if (length ($string ) > 0) {
818- unshift (@{ $$ self{ pushback } } , $token ) if $token && $$token [1] != CC_SPACE; # Inline ->getCatcode, unread
835+ unread( $ self , $token ) if $token && $$token [1] != CC_SPACE;
819836 return $string ; }
820837 else {
821- unshift (@{ $$ self{ pushback } } , $token ); # Unread
838+ unread( $ self , $token );
822839 my $n = readNormalInteger($self );
823840 return (defined $n ? $n -> valueOf : undef ); } }
824841
@@ -836,7 +853,7 @@ sub readNumber {
836853 elsif (defined ($n = readRegisterValue($self , ' Number' , $s , 1))) { return $n ; }
837854 else {
838855 my $next = readToken($self );
839- unshift (@{ $$ self{ pushback } } , $next ); # Unread
856+ unread( $ self , $next );
840857 Warn(' expected' , ' <number>' , $self , " Missing number, treated as zero" ,
841858 " while processing " . ToString($LaTeXML::CURRENT_TOKEN ), showUnexpected($self ));
842859 return Number(0); } }
@@ -863,7 +880,7 @@ sub readNormalInteger {
863880 skip1Space($self , 1);
864881 return Number(ord ($s )); } # Only a character token!!! NOT expanded!!!!
865882 else {
866- unshift (@{ $$ self{ pushback } } , $token ); # Unread
883+ unread( $ self , $token );
867884 return readRegisterValue($self , ' Number' ); } }
868885
869886# ======================================================================
@@ -880,10 +897,10 @@ sub readFloat {
880897 $token = readXToken($self ); }
881898 my $n ;
882899 if (length ($string ) > 0) {
883- unshift (@{ $$ self{ pushback } } , $token ) if $token && $$token [1] != CC_SPACE; # Inline ->getCatcode, unread
900+ unread( $ self , $token ) if $token && $$token [1] != CC_SPACE;
884901 $n = $string ; }
885902 else {
886- unshift (@{ $$ self{ pushback } } , $token ) if $token ; # Unread
903+ unread( $ self , $token ) if $token ;
887904 $n = readNormalInteger($self );
888905 $n = $n -> valueOf if defined $n ; }
889906 return (defined $n ? Float($s * $n ) : undef ); }
0 commit comments