texlive[62308] Build/source/texk/web2c/hitexdir: HiTeX: Adding

commits+mruckert at tug.org commits+mruckert at tug.org
Tue Mar 1 17:58:02 CET 2022


Revision: 62308
          http://tug.org/svn/texlive?view=revision&revision=62308
Author:   mruckert
Date:     2022-03-01 17:58:02 +0100 (Tue, 01 Mar 2022)
Log Message:
-----------
HiTeX: Adding \savinghyphcodes to hitex

Modified Paths:
--------------
    trunk/Build/source/texk/web2c/hitexdir/hiformat.hnt
    trunk/Build/source/texk/web2c/hitexdir/hiformat.pdf
    trunk/Build/source/texk/web2c/hitexdir/hiformat.w
    trunk/Build/source/texk/web2c/hitexdir/hilexer.c
    trunk/Build/source/texk/web2c/hitexdir/hiparser.c
    trunk/Build/source/texk/web2c/hitexdir/hiparser.h
    trunk/Build/source/texk/web2c/hitexdir/hitex.w

Modified: trunk/Build/source/texk/web2c/hitexdir/hiformat.hnt
===================================================================
(Binary files differ)

Modified: trunk/Build/source/texk/web2c/hitexdir/hiformat.pdf
===================================================================
(Binary files differ)

Modified: trunk/Build/source/texk/web2c/hitexdir/hiformat.w
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hiformat.w	2022-03-01 02:25:21 UTC (rev 62307)
+++ trunk/Build/source/texk/web2c/hitexdir/hiformat.w	2022-03-01 16:58:02 UTC (rev 62308)
@@ -24,7 +24,8 @@
 % dealings in this Software without prior written authorization from the
 % copyright holders.
 
-\input ../hint.sty
+\input btxmac.tex
+\input hint.sty
 
 %% defining how to display certain C identifiers
 

Modified: trunk/Build/source/texk/web2c/hitexdir/hilexer.c
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hilexer.c	2022-03-01 02:25:21 UTC (rev 62307)
+++ trunk/Build/source/texk/web2c/hitexdir/hilexer.c	2022-03-01 16:58:02 UTC (rev 62308)
@@ -849,7 +849,7 @@
 #line 1 "lexer.l"
 #line 2 "lexer.l"
 	/*519:*/
-	#line 10722 "format.w"
+	#line 10723 "format.w"
 	
 #include "hibasetypes.h"
 #include "hierror.h"
@@ -905,7 +905,7 @@
 
 float64_t xtof(char*x)
 {
-	#line 1379 "format.w"
+	#line 1380 "format.w"
 	int sign,digits,exp;
 	uint64_t mantissa= 0;
 	DBG(DBGFLOAT,"converting %s:\n",x);
@@ -985,7 +985,7 @@
 	}
 	/*:61*/
 int yywrap(void){
-	#line 10733 "format.w"
+	#line 10734 "format.w"
 	return 1;}
 #ifdef _MSC_VER
 #pragma  warning( disable : 4267)

Modified: trunk/Build/source/texk/web2c/hitexdir/hiparser.c
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hiparser.c	2022-03-01 02:25:21 UTC (rev 62307)
+++ trunk/Build/source/texk/web2c/hitexdir/hiparser.c	2022-03-01 16:58:02 UTC (rev 62308)
@@ -69,7 +69,7 @@
 /* First part of user prologue.  */
 #line 2 "parser.y"
 
-	#line 10763 "format.w"
+	#line 10764 "format.w"
 	
 #include "hibasetypes.h"
 #include <string.h>
@@ -81,7 +81,7 @@
 
 	/*366:*/
 uint32_t definition_bits[0x100/32][32]= {
-	#line 8067 "format.w"
+	#line 8068 "format.w"
 	{0}};
 
 #define SET_DBIT(N,K) ((N)>0xFF?1:(definition_bits[N/32][K]	|= (1<<((N)&(32-1)))))
@@ -113,7 +113,7 @@
 	/*362:*/
 void hset_max(Kind k,int n)
 {
-	#line 7910 "format.w"
+	#line 7911 "format.w"
 	DBG(DBGDEF,"Setting max %s to %d\n",definition_name[k],n);
 	RNG("Maximum",n,max_fixed[k]+1,MAX_REF(k));
 	if(n>max_ref[k])
@@ -122,7 +122,7 @@
 	/*:362*/	/*373:*/
 void check_param_def(Ref*df)
 {
-	#line 8216 "format.w"
+	#line 8217 "format.w"
 	if(df->k!=int_kind&&df->k!=dimen_kind&&df->k!=glue_kind)
 	QUIT("Kind %s not allowed in parameter list",definition_name[df->k]);
 	if(df->n<=max_fixed[df->k]||max_default[df->k]<df->n)
@@ -132,7 +132,7 @@
 extern int yylineno;
 int yyerror(const char*msg)
 {
-	#line 9337 "format.w"
+	#line 9338 "format.w"
 	QUIT(" in line %d %s",yylineno,msg);
 	return 0;
 	}
@@ -2022,7 +2022,7 @@
   case 2: /* glyph: UNSIGNED REFERENCE  */
 #line 268 "parser.y"
                         {
-	#line 423 "format.w"
+	#line 424 "format.w"
 	(yyval.c).c= (yyvsp[-1].u);REF(font_kind,(yyvsp[0].u));(yyval.c).f= (yyvsp[0].u);}
 #line 2028 "parser.c"
     break;
@@ -2030,7 +2030,7 @@
   case 3: /* content_node: start "glyph" glyph ">"  */
 #line 271 "parser.y"
                                   {
-	#line 424 "format.w"
+	#line 425 "format.w"
 	hput_tags((yyvsp[-3].u),hput_glyph(&((yyvsp[-1].c))));}
 #line 2036 "parser.c"
     break;
@@ -2038,7 +2038,7 @@
   case 4: /* start: "<"  */
 #line 274 "parser.y"
            {
-	#line 425 "format.w"
+	#line 426 "format.w"
 	HPUTNODE;(yyval.u)= (uint32_t)(hpos++-hstart);}
 #line 2044 "parser.c"
     break;
@@ -2046,7 +2046,7 @@
   case 6: /* integer: UNSIGNED  */
 #line 278 "parser.y"
                          {
-	#line 946 "format.w"
+	#line 947 "format.w"
 	RNG("number",(yyvsp[0].u),0,0x7FFFFFFF);}
 #line 2052 "parser.c"
     break;
@@ -2054,7 +2054,7 @@
   case 7: /* glyph: CHARCODE REFERENCE  */
 #line 282 "parser.y"
                         {
-	#line 1087 "format.w"
+	#line 1088 "format.w"
 	(yyval.c).c= (yyvsp[-1].u);REF(font_kind,(yyvsp[0].u));(yyval.c).f= (yyvsp[0].u);}
 #line 2060 "parser.c"
     break;
@@ -2062,7 +2062,7 @@
   case 9: /* string: CHARCODE  */
 #line 286 "parser.y"
                          {
-	#line 1192 "format.w"
+	#line 1193 "format.w"
 	static char s[2];
 	RNG("String element",(yyvsp[0].u),0x20,0x7E);
 	s[0]= (yyvsp[0].u);s[1]= 0;(yyval.s)= s;}
@@ -2072,7 +2072,7 @@
   case 10: /* number: UNSIGNED  */
 #line 292 "parser.y"
                {
-	#line 1345 "format.w"
+	#line 1346 "format.w"
 	(yyval.f)= (float64_t)(yyvsp[0].u);}
 #line 2078 "parser.c"
     break;
@@ -2080,7 +2080,7 @@
   case 11: /* number: SIGNED  */
 #line 294 "parser.y"
                                        {
-	#line 1345 "format.w"
+	#line 1346 "format.w"
 	(yyval.f)= (float64_t)(yyvsp[0].i);}
 #line 2086 "parser.c"
     break;
@@ -2088,7 +2088,7 @@
   case 13: /* dimension: number "pt"  */
 #line 298 "parser.y"
                    {
-	#line 1696 "format.w"
+	#line 1697 "format.w"
 	(yyval.d)= ROUND((yyvsp[-1].f)*ONE);RNG("Dimension",(yyval.d),-MAX_DIMEN,MAX_DIMEN);}
 #line 2094 "parser.c"
     break;
@@ -2096,7 +2096,7 @@
   case 14: /* dimension: number "in"  */
 #line 301 "parser.y"
                     {
-	#line 1697 "format.w"
+	#line 1698 "format.w"
 	(yyval.d)= ROUND((yyvsp[-1].f)*ONE*72.27);RNG("Dimension",(yyval.d),-MAX_DIMEN,MAX_DIMEN);}
 #line 2102 "parser.c"
     break;
@@ -2104,7 +2104,7 @@
   case 15: /* dimension: number "mm"  */
 #line 304 "parser.y"
                   {
-	#line 1698 "format.w"
+	#line 1699 "format.w"
 	(yyval.d)= ROUND((yyvsp[-1].f)*ONE*(72.27/25.4));RNG("Dimension",(yyval.d),-MAX_DIMEN,MAX_DIMEN);}
 #line 2110 "parser.c"
     break;
@@ -2112,7 +2112,7 @@
   case 16: /* xdimen: dimension number "h" number "v"  */
 #line 308 "parser.y"
                                   {
-	#line 1776 "format.w"
+	#line 1777 "format.w"
 	(yyval.xd).w= (yyvsp[-4].d);(yyval.xd).h= (yyvsp[-3].f);(yyval.xd).v= (yyvsp[-1].f);}
 #line 2118 "parser.c"
     break;
@@ -2120,7 +2120,7 @@
   case 17: /* xdimen: dimension number "h"  */
 #line 311 "parser.y"
                            {
-	#line 1777 "format.w"
+	#line 1778 "format.w"
 	(yyval.xd).w= (yyvsp[-2].d);(yyval.xd).h= (yyvsp[-1].f);(yyval.xd).v= 0.0;}
 #line 2126 "parser.c"
     break;
@@ -2128,7 +2128,7 @@
   case 18: /* xdimen: dimension number "v"  */
 #line 314 "parser.y"
                            {
-	#line 1778 "format.w"
+	#line 1779 "format.w"
 	(yyval.xd).w= (yyvsp[-2].d);(yyval.xd).h= 0.0;(yyval.xd).v= (yyvsp[-1].f);}
 #line 2134 "parser.c"
     break;
@@ -2136,7 +2136,7 @@
   case 19: /* xdimen: dimension  */
 #line 317 "parser.y"
                   {
-	#line 1779 "format.w"
+	#line 1780 "format.w"
 	(yyval.xd).w= (yyvsp[0].d);(yyval.xd).h= 0.0;(yyval.xd).v= 0.0;}
 #line 2142 "parser.c"
     break;
@@ -2144,7 +2144,7 @@
   case 20: /* xdimen_node: start "xdimen" xdimen ">"  */
 #line 321 "parser.y"
                                    {
-	#line 1781 "format.w"
+	#line 1782 "format.w"
 	hput_tags((yyvsp[-3].u),hput_xdimen(&((yyvsp[-1].xd))));}
 #line 2150 "parser.c"
     break;
@@ -2152,7 +2152,7 @@
   case 21: /* order: "pt"  */
 #line 326 "parser.y"
         {
-	#line 1960 "format.w"
+	#line 1961 "format.w"
 	(yyval.o)= normal_o;}
 #line 2158 "parser.c"
     break;
@@ -2160,7 +2160,7 @@
   case 22: /* order: "fil"  */
 #line 328 "parser.y"
                             {
-	#line 1960 "format.w"
+	#line 1961 "format.w"
 	(yyval.o)= fil_o;}
 #line 2166 "parser.c"
     break;
@@ -2168,7 +2168,7 @@
   case 23: /* order: "fill"  */
 #line 330 "parser.y"
                              {
-	#line 1960 "format.w"
+	#line 1961 "format.w"
 	(yyval.o)= fill_o;}
 #line 2174 "parser.c"
     break;
@@ -2176,7 +2176,7 @@
   case 24: /* order: "filll"  */
 #line 332 "parser.y"
                               {
-	#line 1960 "format.w"
+	#line 1961 "format.w"
 	(yyval.o)= filll_o;}
 #line 2182 "parser.c"
     break;
@@ -2184,7 +2184,7 @@
   case 25: /* stretch: number order  */
 #line 336 "parser.y"
                     {
-	#line 1962 "format.w"
+	#line 1963 "format.w"
 	(yyval.st).f= (yyvsp[-1].f);(yyval.st).o= (yyvsp[0].o);}
 #line 2190 "parser.c"
     break;
@@ -2192,7 +2192,7 @@
   case 26: /* penalty: integer  */
 #line 340 "parser.y"
                {
-	#line 2016 "format.w"
+	#line 2017 "format.w"
 	RNG("Penalty",(yyvsp[0].i),-20000,+20000);(yyval.i)= (yyvsp[0].i);}
 #line 2198 "parser.c"
     break;
@@ -2200,7 +2200,7 @@
   case 27: /* content_node: start "penalty" penalty ">"  */
 #line 343 "parser.y"
                                       {
-	#line 2017 "format.w"
+	#line 2018 "format.w"
 	hput_tags((yyvsp[-3].u),hput_int((yyvsp[-1].i)));}
 #line 2206 "parser.c"
     break;
@@ -2208,7 +2208,7 @@
   case 29: /* rule_dimension: "|"  */
 #line 347 "parser.y"
                                         {
-	#line 2192 "format.w"
+	#line 2193 "format.w"
 	(yyval.d)= RUNNING_DIMEN;}
 #line 2214 "parser.c"
     break;
@@ -2216,7 +2216,7 @@
   case 30: /* rule: rule_dimension rule_dimension rule_dimension  */
 #line 351 "parser.y"
 {
-	#line 2194 "format.w"
+	#line 2195 "format.w"
 	(yyval.r).h= (yyvsp[-2].d);(yyval.r).d= (yyvsp[-1].d);(yyval.r).w= (yyvsp[0].d);
 	if((yyvsp[0].d)==RUNNING_DIMEN&&((yyvsp[-2].d)==RUNNING_DIMEN||(yyvsp[-1].d)==RUNNING_DIMEN))
 	QUIT("Incompatible running dimensions 0x%x 0x%x 0x%x",(yyvsp[-2].d),(yyvsp[-1].d),(yyvsp[0].d));}
@@ -2226,7 +2226,7 @@
   case 31: /* rule_node: start "rule" rule ">"  */
 #line 356 "parser.y"
                              {
-	#line 2197 "format.w"
+	#line 2198 "format.w"
 	hput_tags((yyvsp[-3].u),hput_rule(&((yyvsp[-1].r))));}
 #line 2232 "parser.c"
     break;
@@ -2234,7 +2234,7 @@
   case 33: /* explicit: %empty  */
 #line 361 "parser.y"
          {
-	#line 2305 "format.w"
+	#line 2306 "format.w"
 	(yyval.b)= false;}
 #line 2240 "parser.c"
     break;
@@ -2242,7 +2242,7 @@
   case 34: /* explicit: "!"  */
 #line 363 "parser.y"
                                  {
-	#line 2305 "format.w"
+	#line 2306 "format.w"
 	(yyval.b)= true;}
 #line 2248 "parser.c"
     break;
@@ -2250,7 +2250,7 @@
   case 35: /* kern: explicit xdimen  */
 #line 366 "parser.y"
                     {
-	#line 2306 "format.w"
+	#line 2307 "format.w"
 	(yyval.kt).x= (yyvsp[-1].b);(yyval.kt).d= (yyvsp[0].xd);}
 #line 2256 "parser.c"
     break;
@@ -2258,7 +2258,7 @@
   case 36: /* content_node: start "kern" kern ">"  */
 #line 369 "parser.y"
                                 {
-	#line 2307 "format.w"
+	#line 2308 "format.w"
 	hput_tags((yyvsp[-3].u),hput_kern(&((yyvsp[-1].kt))));}
 #line 2264 "parser.c"
     break;
@@ -2266,7 +2266,7 @@
   case 37: /* plus: %empty  */
 #line 373 "parser.y"
      {
-	#line 2517 "format.w"
+	#line 2518 "format.w"
 	(yyval.st).f= 0.0;(yyval.st).o= 0;}
 #line 2272 "parser.c"
     break;
@@ -2274,7 +2274,7 @@
   case 38: /* plus: "plus" stretch  */
 #line 375 "parser.y"
                                              {
-	#line 2517 "format.w"
+	#line 2518 "format.w"
 	(yyval.st)= (yyvsp[0].st);}
 #line 2280 "parser.c"
     break;
@@ -2282,7 +2282,7 @@
   case 39: /* minus: %empty  */
 #line 378 "parser.y"
       {
-	#line 2518 "format.w"
+	#line 2519 "format.w"
 	(yyval.st).f= 0.0;(yyval.st).o= 0;}
 #line 2288 "parser.c"
     break;
@@ -2290,7 +2290,7 @@
   case 40: /* minus: "minus" stretch  */
 #line 380 "parser.y"
                                               {
-	#line 2518 "format.w"
+	#line 2519 "format.w"
 	(yyval.st)= (yyvsp[0].st);}
 #line 2296 "parser.c"
     break;
@@ -2298,7 +2298,7 @@
   case 41: /* glue: xdimen plus minus  */
 #line 383 "parser.y"
                       {
-	#line 2519 "format.w"
+	#line 2520 "format.w"
 	(yyval.g).w= (yyvsp[-2].xd);(yyval.g).p= (yyvsp[-1].st);(yyval.g).m= (yyvsp[0].st);}
 #line 2304 "parser.c"
     break;
@@ -2306,7 +2306,7 @@
   case 42: /* content_node: start "glue" glue ">"  */
 #line 386 "parser.y"
                                 {
-	#line 2520 "format.w"
+	#line 2521 "format.w"
 	if(ZERO_GLUE((yyvsp[-1].g))){HPUT8(zero_skip_no);
 	hput_tags((yyvsp[-3].u),TAG(glue_kind,0));}else hput_tags((yyvsp[-3].u),hput_glue(&((yyvsp[-1].g))));}
 #line 2313 "parser.c"
@@ -2315,7 +2315,7 @@
   case 43: /* glue_node: start "glue" glue ">"  */
 #line 391 "parser.y"
 {
-	#line 2523 "format.w"
+	#line 2524 "format.w"
 	if(ZERO_GLUE((yyvsp[-1].g))){hpos--;(yyval.b)= false;}
 	else{hput_tags((yyvsp[-3].u),hput_glue(&((yyvsp[-1].g))));(yyval.b)= true;}}
 #line 2322 "parser.c"
@@ -2324,7 +2324,7 @@
   case 44: /* position: %empty  */
 #line 396 "parser.y"
          {
-	#line 2799 "format.w"
+	#line 2800 "format.w"
 	(yyval.u)= hpos-hstart;}
 #line 2330 "parser.c"
     break;
@@ -2332,7 +2332,7 @@
   case 47: /* estimate: %empty  */
 #line 401 "parser.y"
          {
-	#line 2802 "format.w"
+	#line 2803 "format.w"
 	hpos+= 2;}
 #line 2338 "parser.c"
     break;
@@ -2340,7 +2340,7 @@
   case 48: /* estimate: UNSIGNED  */
 #line 404 "parser.y"
                  {
-	#line 2803 "format.w"
+	#line 2804 "format.w"
 	hpos+= hsize_bytes((yyvsp[0].u))+1;}
 #line 2346 "parser.c"
     break;
@@ -2348,7 +2348,7 @@
   case 49: /* list: start estimate content_list ">"  */
 #line 408 "parser.y"
 {
-	#line 2805 "format.w"
+	#line 2806 "format.w"
 	(yyval.l).k= list_kind;(yyval.l).p= (yyvsp[-1].u);(yyval.l).s= (hpos-hstart)-(yyvsp[-1].u);
 	hput_tags((yyvsp[-3].u),hput_list((yyvsp[-3].u)+1,&((yyval.l))));}
 #line 2355 "parser.c"
@@ -2357,7 +2357,7 @@
   case 50: /* $@1: %empty  */
 #line 414 "parser.y"
 {
-	#line 3212 "format.w"
+	#line 3213 "format.w"
 	hpos+= 4;}
 #line 2363 "parser.c"
     break;
@@ -2365,7 +2365,7 @@
   case 51: /* list: TXT_START position $@1 text TXT_END  */
 #line 418 "parser.y"
 {
-	#line 3214 "format.w"
+	#line 3215 "format.w"
 	(yyval.l).k= text_kind;(yyval.l).p= (yyvsp[-1].u);(yyval.l).s= (hpos-hstart)-(yyvsp[-1].u);
 	hput_tags((yyvsp[-3].u),hput_list((yyvsp[-3].u)+1,&((yyval.l))));}
 #line 2372 "parser.c"
@@ -2374,7 +2374,7 @@
   case 54: /* txt: TXT_CC  */
 #line 424 "parser.y"
           {
-	#line 3218 "format.w"
+	#line 3219 "format.w"
 	hput_txt_cc((yyvsp[0].u));}
 #line 2380 "parser.c"
     break;
@@ -2382,7 +2382,7 @@
   case 55: /* txt: TXT_FONT  */
 #line 427 "parser.y"
                  {
-	#line 3219 "format.w"
+	#line 3220 "format.w"
 	REF(font_kind,(yyvsp[0].u));hput_txt_font((yyvsp[0].u));}
 #line 2388 "parser.c"
     break;
@@ -2390,7 +2390,7 @@
   case 56: /* txt: TXT_GLOBAL  */
 #line 430 "parser.y"
                    {
-	#line 3220 "format.w"
+	#line 3221 "format.w"
 	REF((yyvsp[0].rf).k,(yyvsp[0].rf).n);hput_txt_global(&((yyvsp[0].rf)));}
 #line 2396 "parser.c"
     break;
@@ -2398,7 +2398,7 @@
   case 57: /* txt: TXT_LOCAL  */
 #line 433 "parser.y"
                   {
-	#line 3221 "format.w"
+	#line 3222 "format.w"
 	RNG("Font parameter",(yyvsp[0].u),0,11);hput_txt_local((yyvsp[0].u));}
 #line 2404 "parser.c"
     break;
@@ -2406,7 +2406,7 @@
   case 58: /* txt: TXT_FONT_GLUE  */
 #line 436 "parser.y"
                       {
-	#line 3222 "format.w"
+	#line 3223 "format.w"
 	HPUTX(1);HPUT8(txt_glue);}
 #line 2412 "parser.c"
     break;
@@ -2414,7 +2414,7 @@
   case 59: /* txt: TXT_FONT_HYPHEN  */
 #line 439 "parser.y"
                         {
-	#line 3223 "format.w"
+	#line 3224 "format.w"
 	HPUTX(1);HPUT8(txt_hyphen);}
 #line 2420 "parser.c"
     break;
@@ -2422,7 +2422,7 @@
   case 60: /* txt: TXT_IGNORE  */
 #line 442 "parser.y"
                    {
-	#line 3224 "format.w"
+	#line 3225 "format.w"
 	HPUTX(1);HPUT8(txt_ignore);}
 #line 2428 "parser.c"
     break;
@@ -2430,7 +2430,7 @@
   case 61: /* $@2: %empty  */
 #line 445 "parser.y"
          {
-	#line 3225 "format.w"
+	#line 3226 "format.w"
 	HPUTX(1);HPUT8(txt_node);}
 #line 2436 "parser.c"
     break;
@@ -2438,7 +2438,7 @@
   case 63: /* box_dimen: dimension dimension dimension  */
 #line 451 "parser.y"
 {
-	#line 3485 "format.w"
+	#line 3486 "format.w"
 	(yyval.info)= hput_box_dimen((yyvsp[-2].d),(yyvsp[-1].d),(yyvsp[0].d));}
 #line 2444 "parser.c"
     break;
@@ -2446,7 +2446,7 @@
   case 64: /* box_shift: %empty  */
 #line 454 "parser.y"
           {
-	#line 3486 "format.w"
+	#line 3487 "format.w"
 	(yyval.info)= b000;}
 #line 2452 "parser.c"
     break;
@@ -2454,7 +2454,7 @@
   case 65: /* box_shift: "shifted" dimension  */
 #line 457 "parser.y"
                           {
-	#line 3487 "format.w"
+	#line 3488 "format.w"
 	(yyval.info)= hput_box_shift((yyvsp[0].d));}
 #line 2460 "parser.c"
     break;
@@ -2462,7 +2462,7 @@
   case 66: /* box_glue_set: %empty  */
 #line 461 "parser.y"
              {
-	#line 3489 "format.w"
+	#line 3490 "format.w"
 	(yyval.info)= b000;}
 #line 2468 "parser.c"
     break;
@@ -2470,7 +2470,7 @@
   case 67: /* box_glue_set: "plus" stretch  */
 #line 464 "parser.y"
                      {
-	#line 3490 "format.w"
+	#line 3491 "format.w"
 	(yyval.info)= hput_box_glue_set(+1,(yyvsp[0].st).f,(yyvsp[0].st).o);}
 #line 2476 "parser.c"
     break;
@@ -2478,7 +2478,7 @@
   case 68: /* box_glue_set: "minus" stretch  */
 #line 467 "parser.y"
                       {
-	#line 3491 "format.w"
+	#line 3492 "format.w"
 	(yyval.info)= hput_box_glue_set(-1,(yyvsp[0].st).f,(yyvsp[0].st).o);}
 #line 2484 "parser.c"
     break;
@@ -2486,7 +2486,7 @@
   case 69: /* box: box_dimen box_shift box_glue_set list  */
 #line 472 "parser.y"
                                          {
-	#line 3494 "format.w"
+	#line 3495 "format.w"
 	(yyval.info)= (yyvsp[-3].info)	|(yyvsp[-2].info)	|(yyvsp[-1].info);}
 #line 2492 "parser.c"
     break;
@@ -2494,7 +2494,7 @@
   case 70: /* hbox_node: start "hbox" box ">"  */
 #line 476 "parser.y"
                             {
-	#line 3496 "format.w"
+	#line 3497 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(hbox_kind,(yyvsp[-1].info)));}
 #line 2500 "parser.c"
     break;
@@ -2502,7 +2502,7 @@
   case 71: /* vbox_node: start "vbox" box ">"  */
 #line 479 "parser.y"
                             {
-	#line 3497 "format.w"
+	#line 3498 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(vbox_kind,(yyvsp[-1].info)));}
 #line 2508 "parser.c"
     break;
@@ -2510,7 +2510,7 @@
   case 74: /* box_flex: plus minus  */
 #line 484 "parser.y"
                    {
-	#line 3678 "format.w"
+	#line 3679 "format.w"
 	hput_stretch(&((yyvsp[-1].st)));hput_stretch(&((yyvsp[0].st)));}
 #line 2516 "parser.c"
     break;
@@ -2518,7 +2518,7 @@
   case 75: /* xbox: box_dimen box_shift box_flex xdimen_ref list  */
 #line 487 "parser.y"
                                                  {
-	#line 3679 "format.w"
+	#line 3680 "format.w"
 	(yyval.info)= (yyvsp[-4].info)	|(yyvsp[-3].info);}
 #line 2524 "parser.c"
     break;
@@ -2526,7 +2526,7 @@
   case 76: /* xbox: box_dimen box_shift box_flex xdimen_node list  */
 #line 490 "parser.y"
                                                       {
-	#line 3680 "format.w"
+	#line 3681 "format.w"
 	(yyval.info)= (yyvsp[-4].info)	|(yyvsp[-3].info)	|b100;}
 #line 2532 "parser.c"
     break;
@@ -2534,7 +2534,7 @@
   case 77: /* box_goal: "to" xdimen_ref  */
 #line 494 "parser.y"
                       {
-	#line 3682 "format.w"
+	#line 3683 "format.w"
 	(yyval.info)= b000;}
 #line 2540 "parser.c"
     break;
@@ -2542,7 +2542,7 @@
   case 78: /* box_goal: "add" xdimen_ref  */
 #line 497 "parser.y"
                        {
-	#line 3683 "format.w"
+	#line 3684 "format.w"
 	(yyval.info)= b001;}
 #line 2548 "parser.c"
     break;
@@ -2550,7 +2550,7 @@
   case 79: /* box_goal: "to" xdimen_node  */
 #line 500 "parser.y"
                        {
-	#line 3684 "format.w"
+	#line 3685 "format.w"
 	(yyval.info)= b100;}
 #line 2556 "parser.c"
     break;
@@ -2558,7 +2558,7 @@
   case 80: /* box_goal: "add" xdimen_node  */
 #line 503 "parser.y"
                         {
-	#line 3685 "format.w"
+	#line 3686 "format.w"
 	(yyval.info)= b101;}
 #line 2564 "parser.c"
     break;
@@ -2566,7 +2566,7 @@
   case 81: /* hpack: box_shift box_goal list  */
 #line 507 "parser.y"
                              {
-	#line 3687 "format.w"
+	#line 3688 "format.w"
 	(yyval.info)= (yyvsp[-1].info);}
 #line 2572 "parser.c"
     break;
@@ -2574,7 +2574,7 @@
   case 82: /* $@3: %empty  */
 #line 510 "parser.y"
                                    {
-	#line 3688 "format.w"
+	#line 3689 "format.w"
 	HPUT32((yyvsp[0].d));}
 #line 2580 "parser.c"
     break;
@@ -2582,7 +2582,7 @@
   case 83: /* vpack: box_shift "max" "depth" dimension $@3 box_goal list  */
 #line 512 "parser.y"
                                  {
-	#line 3688 "format.w"
+	#line 3689 "format.w"
 	(yyval.info)= (yyvsp[-6].info)	|(yyvsp[-1].info);}
 #line 2588 "parser.c"
     break;
@@ -2590,7 +2590,7 @@
   case 84: /* vxbox_node: start "vset" xbox ">"  */
 #line 516 "parser.y"
                               {
-	#line 3690 "format.w"
+	#line 3691 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(vset_kind,(yyvsp[-1].info)));}
 #line 2596 "parser.c"
     break;
@@ -2598,7 +2598,7 @@
   case 85: /* vxbox_node: start "vpack" vpack ">"  */
 #line 519 "parser.y"
                               {
-	#line 3691 "format.w"
+	#line 3692 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(vpack_kind,(yyvsp[-1].info)));}
 #line 2604 "parser.c"
     break;
@@ -2606,7 +2606,7 @@
   case 86: /* hxbox_node: start "hset" xbox ">"  */
 #line 524 "parser.y"
                               {
-	#line 3694 "format.w"
+	#line 3695 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(hset_kind,(yyvsp[-1].info)));}
 #line 2612 "parser.c"
     break;
@@ -2614,7 +2614,7 @@
   case 87: /* hxbox_node: start "hpack" hpack ">"  */
 #line 527 "parser.y"
                               {
-	#line 3695 "format.w"
+	#line 3696 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(hpack_kind,(yyvsp[-1].info)));}
 #line 2620 "parser.c"
     break;
@@ -2622,7 +2622,7 @@
   case 90: /* ltype: %empty  */
 #line 533 "parser.y"
       {
-	#line 3805 "format.w"
+	#line 3806 "format.w"
 	(yyval.info)= 1;}
 #line 2628 "parser.c"
     break;
@@ -2630,7 +2630,7 @@
   case 91: /* ltype: "align"  */
 #line 535 "parser.y"
                       {
-	#line 3805 "format.w"
+	#line 3806 "format.w"
 	(yyval.info)= 1;}
 #line 2636 "parser.c"
     break;
@@ -2638,7 +2638,7 @@
   case 92: /* ltype: "center"  */
 #line 537 "parser.y"
                        {
-	#line 3805 "format.w"
+	#line 3806 "format.w"
 	(yyval.info)= 2;}
 #line 2644 "parser.c"
     break;
@@ -2646,7 +2646,7 @@
   case 93: /* ltype: "expand"  */
 #line 539 "parser.y"
                        {
-	#line 3805 "format.w"
+	#line 3806 "format.w"
 	(yyval.info)= 3;}
 #line 2652 "parser.c"
     break;
@@ -2654,7 +2654,7 @@
   case 94: /* leaders: glue_node ltype rule_node  */
 #line 542 "parser.y"
                                  {
-	#line 3806 "format.w"
+	#line 3807 "format.w"
 	if((yyvsp[-2].b))(yyval.info)= (yyvsp[-1].info)	|b100;else (yyval.info)= (yyvsp[-1].info);}
 #line 2660 "parser.c"
     break;
@@ -2662,7 +2662,7 @@
   case 95: /* leaders: glue_node ltype hbox_node  */
 #line 545 "parser.y"
                                   {
-	#line 3807 "format.w"
+	#line 3808 "format.w"
 	if((yyvsp[-2].b))(yyval.info)= (yyvsp[-1].info)	|b100;else (yyval.info)= (yyvsp[-1].info);}
 #line 2668 "parser.c"
     break;
@@ -2670,7 +2670,7 @@
   case 96: /* leaders: glue_node ltype vbox_node  */
 #line 548 "parser.y"
                                   {
-	#line 3808 "format.w"
+	#line 3809 "format.w"
 	if((yyvsp[-2].b))(yyval.info)= (yyvsp[-1].info)	|b100;else (yyval.info)= (yyvsp[-1].info);}
 #line 2676 "parser.c"
     break;
@@ -2678,7 +2678,7 @@
   case 97: /* content_node: start "leaders" leaders ">"  */
 #line 551 "parser.y"
                                       {
-	#line 3809 "format.w"
+	#line 3810 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(leaders_kind,(yyvsp[-1].info)));}
 #line 2684 "parser.c"
     break;
@@ -2686,7 +2686,7 @@
   case 98: /* $@4: %empty  */
 #line 555 "parser.y"
                   {
-	#line 3915 "format.w"
+	#line 3916 "format.w"
 	if((yyvsp[0].d)!=0)HPUT32((yyvsp[0].d));}
 #line 2692 "parser.c"
     break;
@@ -2694,7 +2694,7 @@
   case 99: /* baseline: dimension $@4 glue_node glue_node  */
 #line 558 "parser.y"
                    {
-	#line 3916 "format.w"
+	#line 3917 "format.w"
 	(yyval.info)= b000;if((yyvsp[-3].d)!=0)(yyval.info)	|= b001;
 	if((yyvsp[-1].b))(yyval.info)	|= b100;
 	if((yyvsp[0].b))(yyval.info)	|= b010;
@@ -2705,7 +2705,7 @@
   case 100: /* content_node: start "baseline" baseline ">"  */
 #line 565 "parser.y"
 {
-	#line 3921 "format.w"
+	#line 3922 "format.w"
 	if((yyvsp[-1].info)==b000)HPUT8(0);hput_tags((yyvsp[-3].u),TAG(baseline_kind,(yyvsp[-1].info)));}
 #line 2711 "parser.c"
     break;
@@ -2713,7 +2713,7 @@
   case 102: /* cc_list: cc_list TXT_CC  */
 #line 569 "parser.y"
                                {
-	#line 4004 "format.w"
+	#line 4005 "format.w"
 	hput_utf8((yyvsp[0].u));}
 #line 2719 "parser.c"
     break;
@@ -2721,7 +2721,7 @@
   case 103: /* lig_cc: UNSIGNED  */
 #line 572 "parser.y"
                {
-	#line 4005 "format.w"
+	#line 4006 "format.w"
 	RNG("UTF-8 code",(yyvsp[0].u),0,0x1FFFFF);(yyval.u)= hpos-hstart;hput_utf8((yyvsp[0].u));}
 #line 2727 "parser.c"
     break;
@@ -2729,7 +2729,7 @@
   case 104: /* lig_cc: CHARCODE  */
 #line 575 "parser.y"
                {
-	#line 4006 "format.w"
+	#line 4007 "format.w"
 	(yyval.u)= hpos-hstart;hput_utf8((yyvsp[0].u));}
 #line 2735 "parser.c"
     break;
@@ -2737,7 +2737,7 @@
   case 105: /* ref: REFERENCE  */
 #line 578 "parser.y"
              {
-	#line 4007 "format.w"
+	#line 4008 "format.w"
 	HPUT8((yyvsp[0].u));(yyval.u)= (yyvsp[0].u);}
 #line 2743 "parser.c"
     break;
@@ -2745,7 +2745,7 @@
   case 106: /* $@5: %empty  */
 #line 581 "parser.y"
             {
-	#line 4008 "format.w"
+	#line 4009 "format.w"
 	REF(font_kind,(yyvsp[0].u));}
 #line 2751 "parser.c"
     break;
@@ -2753,7 +2753,7 @@
   case 107: /* ligature: ref $@5 lig_cc TXT_START cc_list TXT_END  */
 #line 584 "parser.y"
 {
-	#line 4009 "format.w"
+	#line 4010 "format.w"
 	(yyval.lg).f= (yyvsp[-5].u);(yyval.lg).l.p= (yyvsp[-3].u);(yyval.lg).l.s= (hpos-hstart)-(yyvsp[-3].u);
 	RNG("Ligature size",(yyval.lg).l.s,0,255);}
 #line 2760 "parser.c"
@@ -2762,7 +2762,7 @@
   case 108: /* content_node: start "ligature" ligature ">"  */
 #line 588 "parser.y"
                                         {
-	#line 4011 "format.w"
+	#line 4012 "format.w"
 	hput_tags((yyvsp[-3].u),hput_ligature(&((yyvsp[-1].lg))));}
 #line 2768 "parser.c"
     break;
@@ -2770,7 +2770,7 @@
   case 109: /* replace_count: explicit  */
 #line 592 "parser.y"
                       {
-	#line 4121 "format.w"
+	#line 4122 "format.w"
 	if((yyvsp[0].b)){(yyval.u)= 0x80;HPUT8(0x80);}else (yyval.u)= 0x00;}
 #line 2776 "parser.c"
     break;
@@ -2778,7 +2778,7 @@
   case 110: /* replace_count: explicit UNSIGNED  */
 #line 595 "parser.y"
                           {
-	#line 4122 "format.w"
+	#line 4123 "format.w"
 	RNG("Replace count",(yyvsp[0].u),0,31);
 	(yyval.u)= ((yyvsp[0].u))	|(((yyvsp[-1].b))?0x80:0x00);if((yyval.u)!=0)HPUT8((yyval.u));}
 #line 2785 "parser.c"
@@ -2787,7 +2787,7 @@
   case 111: /* disc: replace_count list list  */
 #line 599 "parser.y"
                             {
-	#line 4124 "format.w"
+	#line 4125 "format.w"
 	(yyval.dc).r= (yyvsp[-2].u);(yyval.dc).p= (yyvsp[-1].l);(yyval.dc).q= (yyvsp[0].l);
 	if((yyvsp[0].l).s==0){hpos= hpos-2;if((yyvsp[-1].l).s==0)hpos= hpos-2;}}
 #line 2794 "parser.c"
@@ -2796,7 +2796,7 @@
   case 112: /* disc: replace_count list  */
 #line 603 "parser.y"
                            {
-	#line 4126 "format.w"
+	#line 4127 "format.w"
 	(yyval.dc).r= (yyvsp[-1].u);(yyval.dc).p= (yyvsp[0].l);if((yyvsp[0].l).s==0)hpos= hpos-2;(yyval.dc).q.s= 0;}
 #line 2802 "parser.c"
     break;
@@ -2804,7 +2804,7 @@
   case 113: /* disc: replace_count  */
 #line 606 "parser.y"
                       {
-	#line 4127 "format.w"
+	#line 4128 "format.w"
 	(yyval.dc).r= (yyvsp[0].u);(yyval.dc).p.s= 0;(yyval.dc).q.s= 0;}
 #line 2810 "parser.c"
     break;
@@ -2812,7 +2812,7 @@
   case 114: /* disc_node: start "disc" disc ">"  */
 #line 612 "parser.y"
 {
-	#line 4131 "format.w"
+	#line 4132 "format.w"
 	hput_tags((yyvsp[-3].u),hput_disc(&((yyvsp[-1].dc))));}
 #line 2818 "parser.c"
     break;
@@ -2820,7 +2820,7 @@
   case 116: /* par_dimen: xdimen  */
 #line 618 "parser.y"
                 {
-	#line 4285 "format.w"
+	#line 4286 "format.w"
 	hput_xdimen_node(&((yyvsp[0].xd)));}
 #line 2826 "parser.c"
     break;
@@ -2828,7 +2828,7 @@
   case 117: /* par: xdimen_ref param_ref list  */
 #line 621 "parser.y"
                              {
-	#line 4286 "format.w"
+	#line 4287 "format.w"
 	(yyval.info)= b000;}
 #line 2834 "parser.c"
     break;
@@ -2836,7 +2836,7 @@
   case 118: /* par: xdimen_ref empty_param_list non_empty_param_list list  */
 #line 624 "parser.y"
                                                               {
-	#line 4287 "format.w"
+	#line 4288 "format.w"
 	(yyval.info)= b010;}
 #line 2842 "parser.c"
     break;
@@ -2844,7 +2844,7 @@
   case 119: /* par: xdimen_ref empty_param_list list  */
 #line 627 "parser.y"
                                          {
-	#line 4288 "format.w"
+	#line 4289 "format.w"
 	(yyval.info)= b010;}
 #line 2850 "parser.c"
     break;
@@ -2852,7 +2852,7 @@
   case 120: /* $@6: %empty  */
 #line 630 "parser.y"
                          {
-	#line 4289 "format.w"
+	#line 4290 "format.w"
 	hput_xdimen_node(&((yyvsp[-1].xd)));}
 #line 2858 "parser.c"
     break;
@@ -2860,7 +2860,7 @@
   case 121: /* par: xdimen param_ref $@6 list  */
 #line 632 "parser.y"
                                      {
-	#line 4289 "format.w"
+	#line 4290 "format.w"
 	(yyval.info)= b100;}
 #line 2866 "parser.c"
     break;
@@ -2868,7 +2868,7 @@
   case 122: /* par: par_dimen empty_param_list non_empty_param_list list  */
 #line 635 "parser.y"
                                                              {
-	#line 4290 "format.w"
+	#line 4291 "format.w"
 	(yyval.info)= b110;}
 #line 2874 "parser.c"
     break;
@@ -2876,7 +2876,7 @@
   case 123: /* par: par_dimen empty_param_list list  */
 #line 638 "parser.y"
                                         {
-	#line 4291 "format.w"
+	#line 4292 "format.w"
 	(yyval.info)= b110;}
 #line 2882 "parser.c"
     break;
@@ -2884,7 +2884,7 @@
   case 124: /* content_node: start "par" par ">"  */
 #line 642 "parser.y"
                               {
-	#line 4293 "format.w"
+	#line 4294 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(par_kind,(yyvsp[-1].info)));}
 #line 2890 "parser.c"
     break;
@@ -2892,7 +2892,7 @@
   case 125: /* math: param_ref list  */
 #line 646 "parser.y"
                    {
-	#line 4359 "format.w"
+	#line 4360 "format.w"
 	(yyval.info)= b000;}
 #line 2898 "parser.c"
     break;
@@ -2900,7 +2900,7 @@
   case 126: /* math: param_ref list hbox_node  */
 #line 649 "parser.y"
                                  {
-	#line 4360 "format.w"
+	#line 4361 "format.w"
 	(yyval.info)= b001;}
 #line 2906 "parser.c"
     break;
@@ -2908,7 +2908,7 @@
   case 127: /* math: param_ref hbox_node list  */
 #line 652 "parser.y"
                                  {
-	#line 4361 "format.w"
+	#line 4362 "format.w"
 	(yyval.info)= b010;}
 #line 2914 "parser.c"
     break;
@@ -2916,7 +2916,7 @@
   case 128: /* math: empty_param_list list  */
 #line 655 "parser.y"
                               {
-	#line 4362 "format.w"
+	#line 4363 "format.w"
 	(yyval.info)= b100;}
 #line 2922 "parser.c"
     break;
@@ -2924,7 +2924,7 @@
   case 129: /* math: empty_param_list list hbox_node  */
 #line 658 "parser.y"
                                         {
-	#line 4363 "format.w"
+	#line 4364 "format.w"
 	(yyval.info)= b101;}
 #line 2930 "parser.c"
     break;
@@ -2932,7 +2932,7 @@
   case 130: /* math: empty_param_list hbox_node list  */
 #line 661 "parser.y"
                                         {
-	#line 4364 "format.w"
+	#line 4365 "format.w"
 	(yyval.info)= b110;}
 #line 2938 "parser.c"
     break;
@@ -2940,7 +2940,7 @@
   case 131: /* math: empty_param_list non_empty_param_list list  */
 #line 664 "parser.y"
                                                    {
-	#line 4365 "format.w"
+	#line 4366 "format.w"
 	(yyval.info)= b100;}
 #line 2946 "parser.c"
     break;
@@ -2948,7 +2948,7 @@
   case 132: /* math: empty_param_list non_empty_param_list list hbox_node  */
 #line 667 "parser.y"
                                                              {
-	#line 4366 "format.w"
+	#line 4367 "format.w"
 	(yyval.info)= b101;}
 #line 2954 "parser.c"
     break;
@@ -2956,7 +2956,7 @@
   case 133: /* math: empty_param_list non_empty_param_list hbox_node list  */
 #line 670 "parser.y"
                                                              {
-	#line 4367 "format.w"
+	#line 4368 "format.w"
 	(yyval.info)= b110;}
 #line 2962 "parser.c"
     break;
@@ -2964,7 +2964,7 @@
   case 134: /* content_node: start "math" math ">"  */
 #line 674 "parser.y"
                                 {
-	#line 4369 "format.w"
+	#line 4370 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(math_kind,(yyvsp[-1].info)));}
 #line 2970 "parser.c"
     break;
@@ -2972,7 +2972,7 @@
   case 135: /* on_off: "on"  */
 #line 678 "parser.y"
          {
-	#line 4419 "format.w"
+	#line 4420 "format.w"
 	(yyval.i)= 1;}
 #line 2978 "parser.c"
     break;
@@ -2980,7 +2980,7 @@
   case 136: /* on_off: "off"  */
 #line 680 "parser.y"
                     {
-	#line 4419 "format.w"
+	#line 4420 "format.w"
 	(yyval.i)= 0;}
 #line 2986 "parser.c"
     break;
@@ -2988,7 +2988,7 @@
   case 137: /* math: on_off  */
 #line 683 "parser.y"
            {
-	#line 4420 "format.w"
+	#line 4421 "format.w"
 	(yyval.info)= b011	|((yyvsp[0].i)<<2);}
 #line 2994 "parser.c"
     break;
@@ -2996,7 +2996,7 @@
   case 138: /* content_node: start "adjust" list ">"  */
 #line 687 "parser.y"
                                   {
-	#line 4451 "format.w"
+	#line 4452 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(adjust_kind,1));}
 #line 3002 "parser.c"
     break;
@@ -3004,7 +3004,7 @@
   case 139: /* span_count: UNSIGNED  */
 #line 691 "parser.y"
                    {
-	#line 4550 "format.w"
+	#line 4551 "format.w"
 	(yyval.info)= hput_span_count((yyvsp[0].u));}
 #line 3010 "parser.c"
     break;
@@ -3012,7 +3012,7 @@
   case 140: /* content_node: start "item" content_node ">"  */
 #line 694 "parser.y"
                                         {
-	#line 4551 "format.w"
+	#line 4552 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(item_kind,1));}
 #line 3018 "parser.c"
     break;
@@ -3020,7 +3020,7 @@
   case 141: /* content_node: start "item" span_count content_node ">"  */
 #line 697 "parser.y"
                                                    {
-	#line 4552 "format.w"
+	#line 4553 "format.w"
 	hput_tags((yyvsp[-4].u),TAG(item_kind,(yyvsp[-2].info)));}
 #line 3026 "parser.c"
     break;
@@ -3028,7 +3028,7 @@
   case 142: /* content_node: start "item" list ">"  */
 #line 700 "parser.y"
                                 {
-	#line 4553 "format.w"
+	#line 4554 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(item_kind,b000));}
 #line 3034 "parser.c"
     break;
@@ -3036,7 +3036,7 @@
   case 143: /* table: "h" box_goal list list  */
 #line 704 "parser.y"
                           {
-	#line 4555 "format.w"
+	#line 4556 "format.w"
 	(yyval.info)= (yyvsp[-2].info);}
 #line 3042 "parser.c"
     break;
@@ -3044,7 +3044,7 @@
   case 144: /* table: "v" box_goal list list  */
 #line 707 "parser.y"
                           {
-	#line 4556 "format.w"
+	#line 4557 "format.w"
 	(yyval.info)= (yyvsp[-2].info)	|b010;}
 #line 3050 "parser.c"
     break;
@@ -3052,7 +3052,7 @@
   case 145: /* content_node: start "table" table ">"  */
 #line 711 "parser.y"
                                   {
-	#line 4558 "format.w"
+	#line 4559 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(table_kind,(yyvsp[-1].info)));}
 #line 3058 "parser.c"
     break;
@@ -3060,7 +3060,7 @@
   case 146: /* image_aspect: number  */
 #line 715 "parser.y"
                    {
-	#line 4692 "format.w"
+	#line 4693 "format.w"
 	(yyval.f)= (yyvsp[0].f);}
 #line 3066 "parser.c"
     break;
@@ -3068,7 +3068,7 @@
   case 147: /* image_aspect: %empty  */
 #line 717 "parser.y"
                          {
-	#line 4692 "format.w"
+	#line 4693 "format.w"
 	(yyval.f)= 0.0;}
 #line 3074 "parser.c"
     break;
@@ -3076,7 +3076,7 @@
   case 148: /* image_width: "width" xdimen  */
 #line 720 "parser.y"
                         {
-	#line 4693 "format.w"
+	#line 4694 "format.w"
 	(yyval.xd)= (yyvsp[0].xd);}
 #line 3082 "parser.c"
     break;
@@ -3084,7 +3084,7 @@
   case 149: /* image_width: %empty  */
 #line 723 "parser.y"
          {
-	#line 4694 "format.w"
+	#line 4695 "format.w"
 	(yyval.xd)= xdimen_defaults[zero_xdimen_no];}
 #line 3090 "parser.c"
     break;
@@ -3092,7 +3092,7 @@
   case 150: /* image_height: "height" xdimen  */
 #line 726 "parser.y"
                           {
-	#line 4695 "format.w"
+	#line 4696 "format.w"
 	(yyval.xd)= (yyvsp[0].xd);}
 #line 3098 "parser.c"
     break;
@@ -3100,7 +3100,7 @@
   case 151: /* image_height: %empty  */
 #line 729 "parser.y"
          {
-	#line 4696 "format.w"
+	#line 4697 "format.w"
 	(yyval.xd)= xdimen_defaults[zero_xdimen_no];}
 #line 3106 "parser.c"
     break;
@@ -3108,7 +3108,7 @@
   case 152: /* image_spec: UNSIGNED image_aspect image_width image_height  */
 #line 734 "parser.y"
 {
-	#line 4699 "format.w"
+	#line 4700 "format.w"
 	(yyval.info)= hput_image_spec((yyvsp[-3].u),(yyvsp[-2].f),0,&((yyvsp[-1].xd)),0,&((yyvsp[0].xd)));}
 #line 3114 "parser.c"
     break;
@@ -3116,7 +3116,7 @@
   case 153: /* image_spec: UNSIGNED image_aspect "width" REFERENCE image_height  */
 #line 738 "parser.y"
 {
-	#line 4701 "format.w"
+	#line 4702 "format.w"
 	(yyval.info)= hput_image_spec((yyvsp[-4].u),(yyvsp[-3].f),(yyvsp[-1].u),NULL,0,&((yyvsp[0].xd)));}
 #line 3122 "parser.c"
     break;
@@ -3124,7 +3124,7 @@
   case 154: /* image_spec: UNSIGNED image_aspect image_width "height" REFERENCE  */
 #line 742 "parser.y"
 {
-	#line 4703 "format.w"
+	#line 4704 "format.w"
 	(yyval.info)= hput_image_spec((yyvsp[-4].u),(yyvsp[-3].f),0,&((yyvsp[-2].xd)),(yyvsp[0].u),NULL);}
 #line 3130 "parser.c"
     break;
@@ -3132,7 +3132,7 @@
   case 155: /* image_spec: UNSIGNED image_aspect "width" REFERENCE "height" REFERENCE  */
 #line 746 "parser.y"
 {
-	#line 4705 "format.w"
+	#line 4706 "format.w"
 	(yyval.info)= hput_image_spec((yyvsp[-5].u),(yyvsp[-4].f),(yyvsp[-2].u),NULL,(yyvsp[0].u),NULL);}
 #line 3138 "parser.c"
     break;
@@ -3140,7 +3140,7 @@
   case 156: /* image: image_spec list  */
 #line 750 "parser.y"
                      {
-	#line 4707 "format.w"
+	#line 4708 "format.w"
 	(yyval.info)= (yyvsp[-1].info);}
 #line 3146 "parser.c"
     break;
@@ -3148,7 +3148,7 @@
   case 157: /* content_node: start "image" image ">"  */
 #line 754 "parser.y"
                                   {
-	#line 4709 "format.w"
+	#line 4710 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(image_kind,(yyvsp[-1].info)));}
 #line 3154 "parser.c"
     break;
@@ -3156,7 +3156,7 @@
   case 158: /* max_value: "outline" UNSIGNED  */
 #line 758 "parser.y"
                           {
-	#line 5309 "format.w"
+	#line 5310 "format.w"
 	max_outline= (yyvsp[0].u);
 	RNG("max outline",max_outline,0,0xFFFF);
 	DBG(DBGDEF	|DBGLABEL,"Setting max outline to %d\n",max_outline);
@@ -3167,7 +3167,7 @@
   case 159: /* placement: "top"  */
 #line 765 "parser.y"
              {
-	#line 5401 "format.w"
+	#line 5402 "format.w"
 	(yyval.i)= LABEL_TOP;}
 #line 3173 "parser.c"
     break;
@@ -3175,7 +3175,7 @@
   case 160: /* placement: "bot"  */
 #line 767 "parser.y"
                             {
-	#line 5401 "format.w"
+	#line 5402 "format.w"
 	(yyval.i)= LABEL_BOT;}
 #line 3181 "parser.c"
     break;
@@ -3183,7 +3183,7 @@
   case 161: /* placement: "mid"  */
 #line 769 "parser.y"
                             {
-	#line 5401 "format.w"
+	#line 5402 "format.w"
 	(yyval.i)= LABEL_MID;}
 #line 3189 "parser.c"
     break;
@@ -3191,7 +3191,7 @@
   case 162: /* placement: %empty  */
 #line 771 "parser.y"
                          {
-	#line 5401 "format.w"
+	#line 5402 "format.w"
 	(yyval.i)= LABEL_MID;}
 #line 3197 "parser.c"
     break;
@@ -3199,7 +3199,7 @@
   case 163: /* content_node: "<" "label" REFERENCE placement ">"  */
 #line 775 "parser.y"
 {
-	#line 5403 "format.w"
+	#line 5404 "format.w"
 	hset_label((yyvsp[-2].u),(yyvsp[-1].i));}
 #line 3205 "parser.c"
     break;
@@ -3207,7 +3207,7 @@
   case 164: /* content_node: start "link" REFERENCE on_off ">"  */
 #line 780 "parser.y"
 {
-	#line 5661 "format.w"
+	#line 5662 "format.w"
 	hput_tags((yyvsp[-4].u),hput_link((yyvsp[-2].u),(yyvsp[-1].i)));}
 #line 3213 "parser.c"
     break;
@@ -3215,7 +3215,7 @@
   case 165: /* def_node: "<" "outline" REFERENCE integer position list ">"  */
 #line 784 "parser.y"
                                                           {
-	#line 5791 "format.w"
+	#line 5792 "format.w"
 	
 	static int outline_no= -1;
 	(yyval.rf).k= outline_kind;(yyval.rf).n= (yyvsp[-4].u);
@@ -3229,7 +3229,7 @@
   case 166: /* stream_link: ref  */
 #line 794 "parser.y"
                {
-	#line 6206 "format.w"
+	#line 6207 "format.w"
 	REF_RNG(stream_kind,(yyvsp[0].u));}
 #line 3235 "parser.c"
     break;
@@ -3237,7 +3237,7 @@
   case 167: /* stream_link: "*"  */
 #line 796 "parser.y"
                                                     {
-	#line 6206 "format.w"
+	#line 6207 "format.w"
 	HPUT8(255);}
 #line 3243 "parser.c"
     break;
@@ -3245,7 +3245,7 @@
   case 168: /* stream_split: stream_link stream_link UNSIGNED  */
 #line 799 "parser.y"
                                              {
-	#line 6207 "format.w"
+	#line 6208 "format.w"
 	RNG("split ratio",(yyvsp[0].u),0,1000);HPUT16((yyvsp[0].u));}
 #line 3251 "parser.c"
     break;
@@ -3253,7 +3253,7 @@
   case 169: /* $@7: %empty  */
 #line 802 "parser.y"
                                 {
-	#line 6208 "format.w"
+	#line 6209 "format.w"
 	RNG("magnification factor",(yyvsp[0].u),0,1000);HPUT16((yyvsp[0].u));}
 #line 3259 "parser.c"
     break;
@@ -3261,7 +3261,7 @@
   case 171: /* stream_type: stream_info  */
 #line 806 "parser.y"
                        {
-	#line 6210 "format.w"
+	#line 6211 "format.w"
 	(yyval.info)= 0;}
 #line 3267 "parser.c"
     break;
@@ -3269,7 +3269,7 @@
   case 172: /* stream_type: "first"  */
 #line 808 "parser.y"
                       {
-	#line 6210 "format.w"
+	#line 6211 "format.w"
 	(yyval.info)= 1;}
 #line 3275 "parser.c"
     break;
@@ -3277,7 +3277,7 @@
   case 173: /* stream_type: "last"  */
 #line 810 "parser.y"
                      {
-	#line 6210 "format.w"
+	#line 6211 "format.w"
 	(yyval.info)= 2;}
 #line 3283 "parser.c"
     break;
@@ -3285,7 +3285,7 @@
   case 174: /* stream_type: "top"  */
 #line 812 "parser.y"
                     {
-	#line 6210 "format.w"
+	#line 6211 "format.w"
 	(yyval.info)= 3;}
 #line 3291 "parser.c"
     break;
@@ -3293,7 +3293,7 @@
   case 175: /* stream_def_node: start "stream (definition)" ref stream_type list xdimen_node glue_node list glue_node ">"  */
 #line 818 "parser.y"
 {
-	#line 6214 "format.w"
+	#line 6215 "format.w"
 	DEF((yyval.rf),stream_kind,(yyvsp[-7].u));hput_tags((yyvsp[-9].u),TAG(stream_kind,(yyvsp[-6].info)	|b100));}
 #line 3299 "parser.c"
     break;
@@ -3301,7 +3301,7 @@
   case 176: /* stream_ins_node: start "stream (definition)" ref ">"  */
 #line 823 "parser.y"
 {
-	#line 6217 "format.w"
+	#line 6218 "format.w"
 	RNG("Stream insertion",(yyvsp[-1].u),0,max_ref[stream_kind]);hput_tags((yyvsp[-3].u),TAG(stream_kind,b100));}
 #line 3307 "parser.c"
     break;
@@ -3309,7 +3309,7 @@
   case 179: /* stream: empty_param_list list  */
 #line 829 "parser.y"
                             {
-	#line 6312 "format.w"
+	#line 6313 "format.w"
 	(yyval.info)= b010;}
 #line 3315 "parser.c"
     break;
@@ -3317,7 +3317,7 @@
   case 180: /* stream: empty_param_list non_empty_param_list list  */
 #line 832 "parser.y"
                                                    {
-	#line 6313 "format.w"
+	#line 6314 "format.w"
 	(yyval.info)= b010;}
 #line 3323 "parser.c"
     break;
@@ -3325,7 +3325,7 @@
   case 181: /* stream: param_ref list  */
 #line 835 "parser.y"
                        {
-	#line 6314 "format.w"
+	#line 6315 "format.w"
 	(yyval.info)= b000;}
 #line 3331 "parser.c"
     break;
@@ -3333,7 +3333,7 @@
   case 182: /* content_node: start "stream" stream_ref stream ">"  */
 #line 839 "parser.y"
 {
-	#line 6316 "format.w"
+	#line 6317 "format.w"
 	hput_tags((yyvsp[-4].u),TAG(stream_kind,(yyvsp[-1].info)));}
 #line 3339 "parser.c"
     break;
@@ -3341,7 +3341,7 @@
   case 183: /* page_priority: %empty  */
 #line 843 "parser.y"
               {
-	#line 6419 "format.w"
+	#line 6420 "format.w"
 	HPUT8(1);}
 #line 3347 "parser.c"
     break;
@@ -3349,7 +3349,7 @@
   case 184: /* page_priority: UNSIGNED  */
 #line 846 "parser.y"
                  {
-	#line 6420 "format.w"
+	#line 6421 "format.w"
 	RNG("page priority",(yyvsp[0].u),0,255);HPUT8((yyvsp[0].u));}
 #line 3355 "parser.c"
     break;
@@ -3357,7 +3357,7 @@
   case 187: /* $@8: %empty  */
 #line 852 "parser.y"
            {
-	#line 6424 "format.w"
+	#line 6425 "format.w"
 	hput_string((yyvsp[0].s));}
 #line 3363 "parser.c"
     break;
@@ -3365,7 +3365,7 @@
   case 188: /* $@9: %empty  */
 #line 854 "parser.y"
                                                           {
-	#line 6424 "format.w"
+	#line 6425 "format.w"
 	HPUT32((yyvsp[0].d));}
 #line 3371 "parser.c"
     break;
@@ -3373,7 +3373,7 @@
   case 190: /* content_node: "<" "range" REFERENCE "on" ">"  */
 #line 861 "parser.y"
                                          {
-	#line 6536 "format.w"
+	#line 6537 "format.w"
 	REF(page_kind,(yyvsp[-2].u));hput_range((yyvsp[-2].u),true);}
 #line 3379 "parser.c"
     break;
@@ -3381,7 +3381,7 @@
   case 191: /* content_node: "<" "range" REFERENCE "off" ">"  */
 #line 864 "parser.y"
                                       {
-	#line 6537 "format.w"
+	#line 6538 "format.w"
 	REF(page_kind,(yyvsp[-2].u));hput_range((yyvsp[-2].u),false);}
 #line 3387 "parser.c"
     break;
@@ -3389,7 +3389,7 @@
   case 193: /* $@10: %empty  */
 #line 870 "parser.y"
                                           {
-	#line 7228 "format.w"
+	#line 7229 "format.w"
 	new_directory((yyvsp[0].u)+1);new_output_buffers();}
 #line 3395 "parser.c"
     break;
@@ -3397,7 +3397,7 @@
   case 197: /* entry: "<" "entry" UNSIGNED string ">"  */
 #line 875 "parser.y"
 {
-	#line 7231 "format.w"
+	#line 7232 "format.w"
 	RNG("Section number",(yyvsp[-2].u),3,max_section_no);hset_entry(&(dir[(yyvsp[-2].u)]),(yyvsp[-2].u),0,0,(yyvsp[-1].s));}
 #line 3403 "parser.c"
     break;
@@ -3405,7 +3405,7 @@
   case 198: /* $@11: %empty  */
 #line 879 "parser.y"
                                     {
-	#line 7766 "format.w"
+	#line 7767 "format.w"
 	hput_definitions_start();}
 #line 3411 "parser.c"
     break;
@@ -3413,7 +3413,7 @@
   case 199: /* definition_section: "<" "definitions" $@11 max_definitions definition_list ">"  */
 #line 883 "parser.y"
    {
-	#line 7768 "format.w"
+	#line 7769 "format.w"
 	hput_definitions_end();}
 #line 3419 "parser.c"
     break;
@@ -3421,7 +3421,7 @@
   case 202: /* max_definitions: "<" "max" max_list ">"  */
 #line 889 "parser.y"
 {
-	#line 7884 "format.w"
+	#line 7885 "format.w"
 		/*253:*/
 	if(max_ref[label_kind]>=0)
 	ALLOCATE(labels,max_ref[label_kind]+1,Label);
@@ -3449,7 +3449,7 @@
   case 205: /* max_value: "font" UNSIGNED  */
 #line 915 "parser.y"
                        {
-	#line 7888 "format.w"
+	#line 7889 "format.w"
 	hset_max(font_kind,(yyvsp[0].u));}
 #line 3455 "parser.c"
     break;
@@ -3457,7 +3457,7 @@
   case 206: /* max_value: "int" UNSIGNED  */
 #line 918 "parser.y"
                          {
-	#line 7889 "format.w"
+	#line 7890 "format.w"
 	hset_max(int_kind,(yyvsp[0].u));}
 #line 3463 "parser.c"
     break;
@@ -3465,7 +3465,7 @@
   case 207: /* max_value: "dimen" UNSIGNED  */
 #line 921 "parser.y"
                        {
-	#line 7890 "format.w"
+	#line 7891 "format.w"
 	hset_max(dimen_kind,(yyvsp[0].u));}
 #line 3471 "parser.c"
     break;
@@ -3473,7 +3473,7 @@
   case 208: /* max_value: "ligature" UNSIGNED  */
 #line 924 "parser.y"
                           {
-	#line 7891 "format.w"
+	#line 7892 "format.w"
 	hset_max(ligature_kind,(yyvsp[0].u));}
 #line 3479 "parser.c"
     break;
@@ -3481,7 +3481,7 @@
   case 209: /* max_value: "disc" UNSIGNED  */
 #line 927 "parser.y"
                       {
-	#line 7892 "format.w"
+	#line 7893 "format.w"
 	hset_max(disc_kind,(yyvsp[0].u));}
 #line 3487 "parser.c"
     break;
@@ -3489,7 +3489,7 @@
   case 210: /* max_value: "glue" UNSIGNED  */
 #line 930 "parser.y"
                       {
-	#line 7893 "format.w"
+	#line 7894 "format.w"
 	hset_max(glue_kind,(yyvsp[0].u));}
 #line 3495 "parser.c"
     break;
@@ -3497,7 +3497,7 @@
   case 211: /* max_value: "language" UNSIGNED  */
 #line 933 "parser.y"
                           {
-	#line 7894 "format.w"
+	#line 7895 "format.w"
 	hset_max(language_kind,(yyvsp[0].u));}
 #line 3503 "parser.c"
     break;
@@ -3505,7 +3505,7 @@
   case 212: /* max_value: "rule" UNSIGNED  */
 #line 936 "parser.y"
                       {
-	#line 7895 "format.w"
+	#line 7896 "format.w"
 	hset_max(rule_kind,(yyvsp[0].u));}
 #line 3511 "parser.c"
     break;
@@ -3513,7 +3513,7 @@
   case 213: /* max_value: "image" UNSIGNED  */
 #line 939 "parser.y"
                        {
-	#line 7896 "format.w"
+	#line 7897 "format.w"
 	hset_max(image_kind,(yyvsp[0].u));}
 #line 3519 "parser.c"
     break;
@@ -3521,7 +3521,7 @@
   case 214: /* max_value: "leaders" UNSIGNED  */
 #line 942 "parser.y"
                          {
-	#line 7897 "format.w"
+	#line 7898 "format.w"
 	hset_max(leaders_kind,(yyvsp[0].u));}
 #line 3527 "parser.c"
     break;
@@ -3529,7 +3529,7 @@
   case 215: /* max_value: "baseline" UNSIGNED  */
 #line 945 "parser.y"
                           {
-	#line 7898 "format.w"
+	#line 7899 "format.w"
 	hset_max(baseline_kind,(yyvsp[0].u));}
 #line 3535 "parser.c"
     break;
@@ -3537,7 +3537,7 @@
   case 216: /* max_value: "xdimen" UNSIGNED  */
 #line 948 "parser.y"
                         {
-	#line 7899 "format.w"
+	#line 7900 "format.w"
 	hset_max(xdimen_kind,(yyvsp[0].u));}
 #line 3543 "parser.c"
     break;
@@ -3545,7 +3545,7 @@
   case 217: /* max_value: "param" UNSIGNED  */
 #line 951 "parser.y"
                        {
-	#line 7900 "format.w"
+	#line 7901 "format.w"
 	hset_max(param_kind,(yyvsp[0].u));}
 #line 3551 "parser.c"
     break;
@@ -3553,7 +3553,7 @@
   case 218: /* max_value: "stream (definition)" UNSIGNED  */
 #line 954 "parser.y"
                            {
-	#line 7901 "format.w"
+	#line 7902 "format.w"
 	hset_max(stream_kind,(yyvsp[0].u));}
 #line 3559 "parser.c"
     break;
@@ -3561,7 +3561,7 @@
   case 219: /* max_value: "page" UNSIGNED  */
 #line 957 "parser.y"
                       {
-	#line 7902 "format.w"
+	#line 7903 "format.w"
 	hset_max(page_kind,(yyvsp[0].u));}
 #line 3567 "parser.c"
     break;
@@ -3569,7 +3569,7 @@
   case 220: /* max_value: "range" UNSIGNED  */
 #line 960 "parser.y"
                        {
-	#line 7903 "format.w"
+	#line 7904 "format.w"
 	hset_max(range_kind,(yyvsp[0].u));}
 #line 3575 "parser.c"
     break;
@@ -3577,7 +3577,7 @@
   case 221: /* max_value: "label" UNSIGNED  */
 #line 963 "parser.y"
                        {
-	#line 7904 "format.w"
+	#line 7905 "format.w"
 	hset_max(label_kind,(yyvsp[0].u));}
 #line 3583 "parser.c"
     break;
@@ -3585,7 +3585,7 @@
   case 222: /* def_node: start "font" ref font ">"  */
 #line 969 "parser.y"
                        {
-	#line 8101 "format.w"
+	#line 8102 "format.w"
 	DEF((yyval.rf),font_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),(yyvsp[-1].info));}
 #line 3591 "parser.c"
     break;
@@ -3593,7 +3593,7 @@
   case 223: /* def_node: start "int" ref integer ">"  */
 #line 972 "parser.y"
                                       {
-	#line 8102 "format.w"
+	#line 8103 "format.w"
 	DEF((yyval.rf),int_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_int((yyvsp[-1].i)));}
 #line 3599 "parser.c"
     break;
@@ -3601,7 +3601,7 @@
   case 224: /* def_node: start "dimen" ref dimension ">"  */
 #line 975 "parser.y"
                                       {
-	#line 8103 "format.w"
+	#line 8104 "format.w"
 	DEF((yyval.rf),dimen_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_dimen((yyvsp[-1].d)));}
 #line 3607 "parser.c"
     break;
@@ -3609,7 +3609,7 @@
   case 225: /* def_node: start "language" ref string ">"  */
 #line 978 "parser.y"
                                       {
-	#line 8104 "format.w"
+	#line 8105 "format.w"
 	DEF((yyval.rf),language_kind,(yyvsp[-2].u));hput_string((yyvsp[-1].s));hput_tags((yyvsp[-4].u),TAG(language_kind,0));}
 #line 3615 "parser.c"
     break;
@@ -3617,7 +3617,7 @@
   case 226: /* def_node: start "glue" ref glue ">"  */
 #line 981 "parser.y"
                                 {
-	#line 8105 "format.w"
+	#line 8106 "format.w"
 	DEF((yyval.rf),glue_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_glue(&((yyvsp[-1].g))));}
 #line 3623 "parser.c"
     break;
@@ -3625,7 +3625,7 @@
   case 227: /* def_node: start "xdimen" ref xdimen ">"  */
 #line 984 "parser.y"
                                     {
-	#line 8106 "format.w"
+	#line 8107 "format.w"
 	DEF((yyval.rf),xdimen_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_xdimen(&((yyvsp[-1].xd))));}
 #line 3631 "parser.c"
     break;
@@ -3633,7 +3633,7 @@
   case 228: /* def_node: start "rule" ref rule ">"  */
 #line 987 "parser.y"
                                 {
-	#line 8107 "format.w"
+	#line 8108 "format.w"
 	DEF((yyval.rf),rule_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_rule(&((yyvsp[-1].r))));}
 #line 3639 "parser.c"
     break;
@@ -3641,7 +3641,7 @@
   case 229: /* def_node: start "leaders" ref leaders ">"  */
 #line 990 "parser.y"
                                       {
-	#line 8108 "format.w"
+	#line 8109 "format.w"
 	DEF((yyval.rf),leaders_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),TAG(leaders_kind,(yyvsp[-1].info)));}
 #line 3647 "parser.c"
     break;
@@ -3649,7 +3649,7 @@
   case 230: /* def_node: start "baseline" ref baseline ">"  */
 #line 993 "parser.y"
                                         {
-	#line 8109 "format.w"
+	#line 8110 "format.w"
 	DEF((yyval.rf),baseline_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),TAG(baseline_kind,(yyvsp[-1].info)));}
 #line 3655 "parser.c"
     break;
@@ -3657,7 +3657,7 @@
   case 231: /* def_node: start "ligature" ref ligature ">"  */
 #line 996 "parser.y"
                                         {
-	#line 8110 "format.w"
+	#line 8111 "format.w"
 	DEF((yyval.rf),ligature_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_ligature(&((yyvsp[-1].lg))));}
 #line 3663 "parser.c"
     break;
@@ -3665,7 +3665,7 @@
   case 232: /* def_node: start "disc" ref disc ">"  */
 #line 999 "parser.y"
                                 {
-	#line 8111 "format.w"
+	#line 8112 "format.w"
 	DEF((yyval.rf),disc_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_disc(&((yyvsp[-1].dc))));}
 #line 3671 "parser.c"
     break;
@@ -3673,7 +3673,7 @@
   case 233: /* def_node: start "image" ref image ">"  */
 #line 1002 "parser.y"
                                   {
-	#line 8112 "format.w"
+	#line 8113 "format.w"
 	DEF((yyval.rf),image_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),TAG(image_kind,(yyvsp[-1].info)));}
 #line 3679 "parser.c"
     break;
@@ -3681,7 +3681,7 @@
   case 234: /* def_node: start "param" ref parameters ">"  */
 #line 1005 "parser.y"
                                        {
-	#line 8113 "format.w"
+	#line 8114 "format.w"
 	DEF((yyval.rf),param_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_list((yyvsp[-4].u)+2,&((yyvsp[-1].l))));}
 #line 3687 "parser.c"
     break;
@@ -3689,7 +3689,7 @@
   case 235: /* def_node: start "page" ref page ">"  */
 #line 1008 "parser.y"
                                 {
-	#line 8114 "format.w"
+	#line 8115 "format.w"
 	DEF((yyval.rf),page_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),TAG(page_kind,0));}
 #line 3695 "parser.c"
     break;
@@ -3697,7 +3697,7 @@
   case 236: /* def_node: start "int" ref ref ">"  */
 #line 1013 "parser.y"
                          {
-	#line 8133 "format.w"
+	#line 8134 "format.w"
 	DEF_REF((yyval.rf),int_kind,(yyvsp[-2].u),(yyvsp[-1].u));hput_tags((yyvsp[-4].u),TAG(int_kind,0));}
 #line 3703 "parser.c"
     break;
@@ -3705,7 +3705,7 @@
   case 237: /* def_node: start "dimen" ref ref ">"  */
 #line 1016 "parser.y"
                                 {
-	#line 8134 "format.w"
+	#line 8135 "format.w"
 	DEF_REF((yyval.rf),dimen_kind,(yyvsp[-2].u),(yyvsp[-1].u));hput_tags((yyvsp[-4].u),TAG(dimen_kind,0));}
 #line 3711 "parser.c"
     break;
@@ -3713,7 +3713,7 @@
   case 238: /* def_node: start "glue" ref ref ">"  */
 #line 1019 "parser.y"
                                {
-	#line 8135 "format.w"
+	#line 8136 "format.w"
 	DEF_REF((yyval.rf),glue_kind,(yyvsp[-2].u),(yyvsp[-1].u));hput_tags((yyvsp[-4].u),TAG(glue_kind,0));}
 #line 3719 "parser.c"
     break;
@@ -3721,7 +3721,7 @@
   case 240: /* def_list: def_list def_node  */
 #line 1024 "parser.y"
                           {
-	#line 8249 "format.w"
+	#line 8250 "format.w"
 	check_param_def(&((yyvsp[0].rf)));}
 #line 3727 "parser.c"
     break;
@@ -3729,7 +3729,7 @@
   case 241: /* parameters: estimate def_list  */
 #line 1027 "parser.y"
                             {
-	#line 8250 "format.w"
+	#line 8251 "format.w"
 	(yyval.l).p= (yyvsp[0].u);(yyval.l).k= param_kind;(yyval.l).s= (hpos-hstart)-(yyvsp[0].u);}
 #line 3735 "parser.c"
     break;
@@ -3737,7 +3737,7 @@
   case 242: /* empty_param_list: position  */
 #line 1031 "parser.y"
                          {
-	#line 8271 "format.w"
+	#line 8272 "format.w"
 	HPUTX(2);hpos++;hput_tags((yyvsp[0].u),TAG(param_kind,1));}
 #line 3743 "parser.c"
     break;
@@ -3745,7 +3745,7 @@
   case 243: /* $@12: %empty  */
 #line 1034 "parser.y"
                                 {
-	#line 8272 "format.w"
+	#line 8273 "format.w"
 	hpos= hpos-2;}
 #line 3751 "parser.c"
     break;
@@ -3753,7 +3753,7 @@
   case 244: /* non_empty_param_list: start "param" $@12 parameters ">"  */
 #line 1037 "parser.y"
 {
-	#line 8273 "format.w"
+	#line 8274 "format.w"
 	hput_tags((yyvsp[-4].u)-2,hput_list((yyvsp[-4].u)-1,&((yyvsp[-1].l))));}
 #line 3759 "parser.c"
     break;
@@ -3761,7 +3761,7 @@
   case 246: /* font_head: string dimension UNSIGNED UNSIGNED  */
 #line 1045 "parser.y"
 {
-	#line 8415 "format.w"
+	#line 8416 "format.w"
 	uint8_t f= (yyvsp[-4].u);SET_DBIT(f,font_kind);hfont_name[f]= strdup((yyvsp[-3].s));(yyval.info)= hput_font_head(f,hfont_name[f],(yyvsp[-2].d),(yyvsp[-1].u),(yyvsp[0].u));}
 #line 3767 "parser.c"
     break;
@@ -3769,7 +3769,7 @@
   case 249: /* font_param: start "penalty" fref penalty ">"  */
 #line 1052 "parser.y"
                               {
-	#line 8420 "format.w"
+	#line 8421 "format.w"
 	hput_tags((yyvsp[-4].u),hput_int((yyvsp[-1].i)));}
 #line 3775 "parser.c"
     break;
@@ -3777,7 +3777,7 @@
   case 250: /* font_param: start "kern" fref kern ">"  */
 #line 1055 "parser.y"
                                  {
-	#line 8421 "format.w"
+	#line 8422 "format.w"
 	hput_tags((yyvsp[-4].u),hput_kern(&((yyvsp[-1].kt))));}
 #line 3783 "parser.c"
     break;
@@ -3785,7 +3785,7 @@
   case 251: /* font_param: start "ligature" fref ligature ">"  */
 #line 1058 "parser.y"
                                          {
-	#line 8422 "format.w"
+	#line 8423 "format.w"
 	hput_tags((yyvsp[-4].u),hput_ligature(&((yyvsp[-1].lg))));}
 #line 3791 "parser.c"
     break;
@@ -3793,7 +3793,7 @@
   case 252: /* font_param: start "disc" fref disc ">"  */
 #line 1061 "parser.y"
                                  {
-	#line 8423 "format.w"
+	#line 8424 "format.w"
 	hput_tags((yyvsp[-4].u),hput_disc(&((yyvsp[-1].dc))));}
 #line 3799 "parser.c"
     break;
@@ -3801,7 +3801,7 @@
   case 253: /* font_param: start "glue" fref glue ">"  */
 #line 1064 "parser.y"
                                  {
-	#line 8424 "format.w"
+	#line 8425 "format.w"
 	hput_tags((yyvsp[-4].u),hput_glue(&((yyvsp[-1].g))));}
 #line 3807 "parser.c"
     break;
@@ -3809,7 +3809,7 @@
   case 254: /* font_param: start "language" fref string ">"  */
 #line 1067 "parser.y"
                                        {
-	#line 8425 "format.w"
+	#line 8426 "format.w"
 	hput_string((yyvsp[-1].s));hput_tags((yyvsp[-4].u),TAG(language_kind,0));}
 #line 3815 "parser.c"
     break;
@@ -3817,7 +3817,7 @@
   case 255: /* font_param: start "rule" fref rule ">"  */
 #line 1070 "parser.y"
                                  {
-	#line 8426 "format.w"
+	#line 8427 "format.w"
 	hput_tags((yyvsp[-4].u),hput_rule(&((yyvsp[-1].r))));}
 #line 3823 "parser.c"
     break;
@@ -3825,7 +3825,7 @@
   case 256: /* font_param: start "image" fref image ">"  */
 #line 1073 "parser.y"
                                    {
-	#line 8427 "format.w"
+	#line 8428 "format.w"
 	hput_tags((yyvsp[-4].u),TAG(image_kind,(yyvsp[-1].info)));}
 #line 3831 "parser.c"
     break;
@@ -3833,7 +3833,7 @@
   case 257: /* fref: ref  */
 #line 1077 "parser.y"
         {
-	#line 8429 "format.w"
+	#line 8430 "format.w"
 	RNG("Font parameter",(yyvsp[0].u),0,MAX_FONT_PARAMS);}
 #line 3839 "parser.c"
     break;
@@ -3841,7 +3841,7 @@
   case 258: /* xdimen_ref: ref  */
 #line 1081 "parser.y"
               {
-	#line 8502 "format.w"
+	#line 8503 "format.w"
 	REF(xdimen_kind,(yyvsp[0].u));}
 #line 3847 "parser.c"
     break;
@@ -3849,7 +3849,7 @@
   case 259: /* param_ref: ref  */
 #line 1084 "parser.y"
              {
-	#line 8503 "format.w"
+	#line 8504 "format.w"
 	REF(param_kind,(yyvsp[0].u));}
 #line 3855 "parser.c"
     break;
@@ -3857,7 +3857,7 @@
   case 260: /* stream_ref: ref  */
 #line 1087 "parser.y"
               {
-	#line 8504 "format.w"
+	#line 8505 "format.w"
 	REF_RNG(stream_kind,(yyvsp[0].u));}
 #line 3863 "parser.c"
     break;
@@ -3865,7 +3865,7 @@
   case 261: /* content_node: start "penalty" ref ">"  */
 #line 1093 "parser.y"
                      {
-	#line 8508 "format.w"
+	#line 8509 "format.w"
 	REF(penalty_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(penalty_kind,0));}
 #line 3871 "parser.c"
     break;
@@ -3873,7 +3873,7 @@
   case 262: /* content_node: start "kern" explicit ref ">"  */
 #line 1097 "parser.y"
 {
-	#line 8510 "format.w"
+	#line 8511 "format.w"
 	REF(dimen_kind,(yyvsp[-1].u));hput_tags((yyvsp[-4].u),TAG(kern_kind,((yyvsp[-2].b))?b100:b000));}
 #line 3879 "parser.c"
     break;
@@ -3881,7 +3881,7 @@
   case 263: /* content_node: start "kern" explicit "xdimen" ref ">"  */
 #line 1101 "parser.y"
 {
-	#line 8512 "format.w"
+	#line 8513 "format.w"
 	REF(xdimen_kind,(yyvsp[-1].u));hput_tags((yyvsp[-5].u),TAG(kern_kind,((yyvsp[-3].b))?b101:b001));}
 #line 3887 "parser.c"
     break;
@@ -3889,7 +3889,7 @@
   case 264: /* content_node: start "glue" ref ">"  */
 #line 1104 "parser.y"
                            {
-	#line 8513 "format.w"
+	#line 8514 "format.w"
 	REF(glue_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(glue_kind,0));}
 #line 3895 "parser.c"
     break;
@@ -3897,7 +3897,7 @@
   case 265: /* content_node: start "ligature" ref ">"  */
 #line 1107 "parser.y"
                                {
-	#line 8514 "format.w"
+	#line 8515 "format.w"
 	REF(ligature_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(ligature_kind,0));}
 #line 3903 "parser.c"
     break;
@@ -3905,7 +3905,7 @@
   case 266: /* content_node: start "disc" ref ">"  */
 #line 1110 "parser.y"
                            {
-	#line 8515 "format.w"
+	#line 8516 "format.w"
 	REF(disc_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(disc_kind,0));}
 #line 3911 "parser.c"
     break;
@@ -3913,7 +3913,7 @@
   case 267: /* content_node: start "rule" ref ">"  */
 #line 1113 "parser.y"
                            {
-	#line 8516 "format.w"
+	#line 8517 "format.w"
 	REF(rule_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(rule_kind,0));}
 #line 3919 "parser.c"
     break;
@@ -3921,7 +3921,7 @@
   case 268: /* content_node: start "image" ref ">"  */
 #line 1116 "parser.y"
                             {
-	#line 8517 "format.w"
+	#line 8518 "format.w"
 	REF(image_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(image_kind,0));}
 #line 3927 "parser.c"
     break;
@@ -3929,7 +3929,7 @@
   case 269: /* content_node: start "leaders" ref ">"  */
 #line 1119 "parser.y"
                               {
-	#line 8518 "format.w"
+	#line 8519 "format.w"
 	REF(leaders_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(leaders_kind,0));}
 #line 3935 "parser.c"
     break;
@@ -3937,7 +3937,7 @@
   case 270: /* content_node: start "baseline" ref ">"  */
 #line 1122 "parser.y"
                                {
-	#line 8519 "format.w"
+	#line 8520 "format.w"
 	REF(baseline_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(baseline_kind,0));}
 #line 3943 "parser.c"
     break;
@@ -3945,7 +3945,7 @@
   case 271: /* content_node: start "language" REFERENCE ">"  */
 #line 1125 "parser.y"
                                      {
-	#line 8520 "format.w"
+	#line 8521 "format.w"
 	REF(language_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),hput_language((yyvsp[-1].u)));}
 #line 3951 "parser.c"
     break;
@@ -3953,7 +3953,7 @@
   case 272: /* glue_node: start "glue" ref ">"  */
 #line 1129 "parser.y"
                             {
-	#line 8522 "format.w"
+	#line 8523 "format.w"
 	REF(glue_kind,(yyvsp[-1].u));
 	if((yyvsp[-1].u)==zero_skip_no){hpos= hpos-2;(yyval.b)= false;}
 	else{hput_tags((yyvsp[-3].u),TAG(glue_kind,0));(yyval.b)= true;}}
@@ -3963,7 +3963,7 @@
   case 273: /* $@13: %empty  */
 #line 1136 "parser.y"
                              {
-	#line 8953 "format.w"
+	#line 8954 "format.w"
 	hput_content_start();}
 #line 3969 "parser.c"
     break;
@@ -3971,7 +3971,7 @@
   case 274: /* content_section: "<" "content" $@13 content_list ">"  */
 #line 1139 "parser.y"
 {
-	#line 8954 "format.w"
+	#line 8955 "format.w"
 	hput_content_end();hput_range_defs();hput_label_defs();}
 #line 3977 "parser.c"
     break;

Modified: trunk/Build/source/texk/web2c/hitexdir/hiparser.h
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hiparser.h	2022-03-01 02:25:21 UTC (rev 62307)
+++ trunk/Build/source/texk/web2c/hitexdir/hiparser.h	2022-03-01 16:58:02 UTC (rev 62308)
@@ -149,7 +149,7 @@
 {
 #line 79 "parser.y"
 
-	#line 10788 "format.w"
+	#line 10789 "format.w"
 	uint32_t u;  int32_t i;  char *s;  float64_t f;  Glyph c;
 	Dimen d;Stretch st;Xdimen xd;Kern kt;
 	Rule r;Glue g;Image x;

Modified: trunk/Build/source/texk/web2c/hitexdir/hitex.w
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hitex.w	2022-03-01 02:25:21 UTC (rev 62307)
+++ trunk/Build/source/texk/web2c/hitexdir/hitex.w	2022-03-01 16:58:02 UTC (rev 62308)
@@ -5175,8 +5175,9 @@
 @d tracing_scan_tokens_code (etex_int_base+3) /*show pseudo file open and close*/
 @d tracing_nesting_code (etex_int_base+4) /*show incomplete groups and ifs within files*/
 @d saving_vdiscards_code (etex_int_base+5) /*save items discarded from vlists*/
- at d expand_depth_code (etex_int_base+6) /*maximum depth for expansion---\eTeX*/
- at d eTeX_state_code (etex_int_base+7) /*\eTeX\ state variables*/
+ at d saving_hyph_codes_code (etex_int_base+6) /*save hyphenation codes for languages*/
+ at d expand_depth_code (etex_int_base+7) /*maximum depth for expansion---\eTeX*/
+ at d eTeX_state_code (etex_int_base+8) /*\eTeX\ state variables*/
 @d etex_int_pars (eTeX_state_code+eTeX_states) /*total number of \eTeX's integer parameters*/
 @#
 @d int_pars etex_int_pars /*total number of integer parameters*/
@@ -5248,8 +5249,9 @@
 @d tracing_ifs int_par(tracing_ifs_code)
 @d tracing_scan_tokens int_par(tracing_scan_tokens_code)
 @d tracing_nesting int_par(tracing_nesting_code)
+ at d saving_vdiscards int_par(saving_vdiscards_code)
+ at d saving_hyph_codes int_par(saving_hyph_codes_code)
 @d expand_depth int_par(expand_depth_code)
- at d saving_vdiscards int_par(saving_vdiscards_code)
 
 @<Assign the values |depth_threshold:=show_box_depth|...@>=
 depth_threshold=show_box_depth;
@@ -18137,6 +18139,7 @@
 #endif
 @;@/
 cur_lang=init_cur_lang;l_hyf=init_l_hyf;r_hyf=init_r_hyf;
+set_hyph_index;
 }
 
 @ The letters $c_1\ldots c_n$ that are candidates for hyphenation are placed
@@ -18210,8 +18213,9 @@
     goto resume;
     }
   else goto done1;
-  if (lc_code(c)!=0)
-    if ((lc_code(c)==c)||(uc_hyph > 0)) goto done2;
+  set_lc_code(c);
+  if (hc[0]!=0)
+    if ((hc[0]==c)||(uc_hyph > 0)) goto done2;
     else goto done1;
 resume: prev_s=s;s=link(prev_s);
   }
@@ -18227,9 +18231,10 @@
 loop at +{@+if (is_char_node(s))
     {@+if (font(s)!=hf) goto done3;
     hyf_bchar=character(s);c=qo(hyf_bchar);
-    if (lc_code(c)==0) goto done3;
+    set_lc_code(c);
+    if (hc[0]==0) goto done3;
     if (hn==63) goto done3;
-    hb=s;incr(hn);hu[hn]=c;hc[hn]=lc_code(c);hyf_bchar=non_char;
+    hb=s;incr(hn);hu[hn]=c;hc[hn]=hc[0];hyf_bchar=non_char;
     }
   else if (type(s)==ligature_node)
     @<Move the characters of a ligature node to |hu| and |hc|; but |goto done3|
@@ -18253,9 +18258,10 @@
 j=hn;q=lig_ptr(s);@+if (q > null) hyf_bchar=character(q);
 while (q > null)
   {@+c=qo(character(q));
-  if (lc_code(c)==0) goto done3;
+  set_lc_code(c);
+  if (hc[0]==0) goto done3;
   if (j==63) goto done3;
-  incr(j);hu[j]=c;hc[j]=lc_code(c);@/
+  incr(j);hu[j]=c;hc[j]=hc[0];@/
   q=link(q);
   }
 hb=s;hn=j;
@@ -18907,6 +18913,13 @@
 pool_pointer @!u, @!v; /*indices into |str_pool|*/
 scan_left_brace(); /*a left brace must follow \.{\\hyphenation}*/
 set_cur_lang;
+#ifdef @!INIT
+if (trie_not_ready)
+  {@+hyph_index=0;goto not_found1;
+  }
+#endif
+set_hyph_index;
+not_found1:
 @<Enter as many hyphenation exceptions as are listed, until coming to a right
 brace; then |return|@>;
 }
@@ -18939,7 +18952,8 @@
 
 @ @<Append a new letter or hyphen@>=
 if (cur_chr=='-') @<Append the value |n| to list |p|@>@;
-else{@+if (lc_code(cur_chr)==0)
+else{@+set_lc_code(cur_chr);
+  if (hc[0]==0)
     {@+print_err("Not a letter");
 @.Not a letter@>
     help2("Letters in \\hyphenation words must have \\lccode>0.",@/
@@ -18947,7 +18961,7 @@
     error();
     }
   else if (n < 63)
-    {@+incr(n);hc[n]=lc_code(cur_chr);
+    {@+incr(n);hc[n]=hc[0];
     }
   }
 
@@ -19243,6 +19257,7 @@
 @<Get ready to compress the trie@>=
 @<Sort \(t)the hyphenation...@>;
 for (p=0; p<=trie_size; p++) trie_hash[p]=0;
+hyph_root=compress_trie(hyph_root);
 trie_root=compress_trie(trie_root); /*identify equivalent subtries*/
 for (p=0; p<=trie_ptr; p++) trie_ref[p]=0;
 for (p=0; p<=255; p++) trie_min[p]=p+1;
@@ -19331,11 +19346,12 @@
 @<Move the data into |trie|@>=
 h.rh=0;h.b0=min_quarterword;h.b1=min_quarterword; /*|trie_link=0|,
   |trie_op=min_quarterword|, |trie_char=qi(0)|*/
-if (trie_root==0)  /*no patterns were given*/
+if (trie_max==0)  /*no patterns were given*/
   {@+for (r=0; r<=256; r++) trie[r]=h;
   trie_max=256;
   }
-else{@+trie_fix(trie_root); /*this fixes the non-holes in |trie|*/
+else{@+if (hyph_root > 0) trie_fix(hyph_root);
+  if (trie_root > 0) trie_fix(trie_root); /*this fixes the non-holes in |trie|*/
   r=0; /*now we will zero out all the holes*/
   @/do at +{s=trie_link(r);trie[r]=h;r=s;
   }@+ while (!(r > trie_max));
@@ -19374,11 +19390,13 @@
 quarterword @!v; /*trie op code*/
 trie_pointer @!p, @!q; /*nodes of trie traversed during insertion*/
 bool @!first_child; /*is |p==trie_l[q]|?*/
-ASCII_code @!c; /*character being inserted*/
+int @!c; /*character being inserted*/
 if (trie_not_ready)
   {@+set_cur_lang;scan_left_brace(); /*a left brace must follow \.{\\patterns}*/
   @<Enter all of the patterns into a linked trie, until coming to a right
 brace@>;
+  if (saving_hyph_codes > 0)
+    @<Store hyphenation codes for current language@>;
   }
 else{@+print_err("Too late for ");print_esc("patterns");
   help1("All patterns must be given before typesetting begins.");
@@ -19484,6 +19502,7 @@
 if (trie_root!=0)
   {@+first_fit(trie_root);trie_pack(trie_root);
   }
+if (hyph_root!=0) @<Pack all stored |hyph_codes|@>;
 @<Move the data into |trie|@>;
 trie_not_ready=false;
 }
@@ -24932,6 +24951,7 @@
 if (hyph_count!=1) print_char('s');
 if (trie_not_ready) init_trie();
 dump_int(trie_max);
+dump_int(hyph_start);
 for (k=0; k<=trie_max; k++) dump_hh(trie[k]);
 dump_int(trie_op_ptr);
 for (k=1; k<=trie_op_ptr; k++)
@@ -24963,6 +24983,7 @@
 #ifdef @!INIT
 trie_max=j;
 #endif
+undump(0, j, hyph_start);
 for (k=0; k<=j; k++) undump_hh(trie[k]);
 undump_size(0, trie_op_size,"trie op size", j);
 #ifdef @!INIT
@@ -26267,7 +26288,9 @@
 @ @<Let |d| be the width of the whatsit |p|@>=d=0
 
 @ @d adv_past(A) @+if (subtype(A)==language_node)
-    {@+cur_lang=what_lang(A);l_hyf=what_lhm(A);r_hyf=what_rhm(A);@+}
+    {@+cur_lang=what_lang(A);l_hyf=what_lhm(A);r_hyf=what_rhm(A);
+    set_hyph_index;
+    }
 
 @<Advance \(p)past a whatsit node in the \(l)|line_break| loop@>=@+
 adv_past(cur_p)
@@ -26583,6 +26606,8 @@
 @!@:tracing\_nesting\_}{\.{\\tracingnesting} primitive@>
 primitive("savingvdiscards", assign_int, int_base+saving_vdiscards_code);@/
 @!@:saving\_vdiscards\_}{\.{\\savingvdiscards} primitive@>
+primitive("savinghyphcodes", assign_int, int_base+saving_hyph_codes_code);@/
+@!@:saving\_hyph\_codes\_}{\.{\\savinghyphcodes} primitive@>
 
 @ @d every_eof equiv(every_eof_loc)
 
@@ -26596,6 +26621,7 @@
 case tracing_scan_tokens_code: print_esc("tracingscantokens");@+break;
 case tracing_nesting_code: print_esc("tracingnesting");@+break;
 case saving_vdiscards_code: print_esc("savingvdiscards");@+break;
+case saving_hyph_codes_code: print_esc("savinghyphcodes");@+break;
 
 @ In order to handle \.{\\everyeof} we need an array |eof_seen| of
 boolean variables.
@@ -28489,6 +28515,76 @@
 }@+ while (!(sa_chain==null));
 }
 
+@ When reading \.{\\patterns} while \.{\\savinghyphcodes} is positive
+the current |lc_code| values are stored together with the hyphenation
+patterns for the current language.  They will later be used instead of
+the |lc_code| values for hyphenation purposes.
+
+The |lc_code| values are stored in the linked trie analogous to patterns
+$p_1$ of length~1, with |hyph_root==trie_r[0]| replacing |trie_root| and
+|lc_code(p_1)| replacing the |trie_op| code.  This allows to compress
+and pack them together with the patterns with minimal changes to the
+existing code.
+
+ at d hyph_root trie_r[0] /*root of the linked trie for |hyph_codes|*/
+
+@<Initialize table entries...@>=
+hyph_root=0;hyph_start=0;
+
+@ @<Store hyphenation codes for current language@>=
+{@+c=cur_lang;first_child=false;p=0;
+@/do at +{q=p;p=trie_r[q];
+}@+ while (!((p==0)||(c <= so(trie_c[p]))));
+if ((p==0)||(c < so(trie_c[p])))
+  @<Insert a new trie node between |q| and |p|, and make |p| point to it@>;
+q=p; /*now node |q| represents |cur_lang|*/
+@<Store all current |lc_code| values@>;
+}
+
+@ We store all nonzero |lc_code| values, overwriting any previously
+stored values (and possibly wasting a few trie nodes that were used
+previously and are not needed now).  We always store at least one
+|lc_code| value such that |hyph_index| (defined below) will not be zero.
+
+@<Store all current |lc_code| values@>=
+p=trie_l[q];first_child=true;
+for (c=0; c<=255; c++)
+  if ((lc_code(c) > 0)||((c==255)&&first_child))
+    {@+if (p==0)
+      @<Insert a new trie node between |q| and |p|, and make |p| point to
+it@>@;
+    else trie_c[p]=si(c);
+    trie_o[p]=qi(lc_code(c));
+    q=p;p=trie_r[q];first_child=false;
+    }
+if (first_child) trie_l[q]=0;@+else trie_r[q]=0
+
+@ We must avoid to ``take'' location~1, in order to distinguish between
+|lc_code| values and patterns.
+
+@<Pack all stored |hyph_codes|@>=
+{@+if (trie_root==0) for (p=0; p<=255; p++) trie_min[p]=p+2;
+first_fit(hyph_root);trie_pack(hyph_root);
+hyph_start=trie_ref[hyph_root];
+}
+
+@ The global variable |hyph_index| will point to the hyphenation codes
+for the current language.
+
+ at d set_hyph_index  /*set |hyph_index| for current language*/
+  if (trie_char(hyph_start+cur_lang)!=qi(cur_lang)
+    ) hyph_index=0; /*no hyphenation codes for |cur_lang|*/
+  else hyph_index=trie_link(hyph_start+cur_lang)
+@#
+ at d set_lc_code(A)  /*set |hc[0]| to hyphenation or lc code for |A|*/
+  if (hyph_index==0) hc[0]=lc_code(A);
+  else if (trie_char(hyph_index+A)!=qi(A)) hc[0]=0;
+  else hc[0]=qo(trie_op(hyph_index+A))
+
+@<Glob...@>=
+static trie_pointer @!hyph_start; /*root of the packed trie for |hyph_codes|*/
+static trie_pointer @!hyph_index; /*pointer to hyphenation codes for |cur_lang|*/
+
 @ When |saving_vdiscards| is positive then the glue, kern, and penalty
 nodes removed by the page builder or by \.{\\vsplit} from the top of a
 vertical list are saved in special lists instead of being discarded.



More information about the tex-live-commits mailing list.