texlive[61117] Build/source/texk/web2c/hitexdir: fixing various

commits+mruckert at tug.org commits+mruckert at tug.org
Mon Nov 22 17:45:59 CET 2021


Revision: 61117
          http://tug.org/svn/texlive?view=revision&revision=61117
Author:   mruckert
Date:     2021-11-22 17:45:58 +0100 (Mon, 22 Nov 2021)
Log Message:
-----------
fixing various options: (-g -a --help --version)

Modified Paths:
--------------
    trunk/Build/source/texk/web2c/hitexdir/hiformat.w
    trunk/Build/source/texk/web2c/hitexdir/hilexer.c
    trunk/Build/source/texk/web2c/hitexdir/hilexer.l
    trunk/Build/source/texk/web2c/hitexdir/hiparser.c
    trunk/Build/source/texk/web2c/hitexdir/hiparser.h
    trunk/Build/source/texk/web2c/hitexdir/hiparser.y
    trunk/Build/source/texk/web2c/hitexdir/hitex.w
    trunk/Build/source/texk/web2c/hitexdir/tests/hello.test
    trunk/Build/source/texk/web2c/hitexdir/tests/rule.test

Added Paths:
-----------
    trunk/Build/source/texk/web2c/hitexdir/tex/ifhitex.tex

Modified: trunk/Build/source/texk/web2c/hitexdir/hiformat.w
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hiformat.w	2021-11-22 00:49:10 UTC (rev 61116)
+++ trunk/Build/source/texk/web2c/hitexdir/hiformat.w	2021-11-22 16:45:58 UTC (rev 61117)
@@ -47,9 +47,9 @@
 
 
 \def\setrevision$#1: #2 ${\gdef\lastrevision{#2}}
-\setrevision$Revision: 2541 $
+\setrevision$Revision: 2571 $
 \def\setdate$#1(#2) ${\gdef\lastdate{#2}}
-\setdate$Date: 2021-10-26 09:03:28 +0200 (Tue, 26 Oct 2021) $
+\setdate$Date: 2021-11-22 17:37:05 +0100 (Mon, 22 Nov 2021) $
 
 \null
 
@@ -3403,9 +3403,11 @@
 \subsection{Boxes}\label{boxnodes}
 The central structuring elements of \TeX\ are boxes\index{box}.
 Boxes have a height |h|, a depth |d|, and a width |w|. 
-The shift amount |a| shifts the contents of the box, the glue ratio\index{glue ratio} |r| is a factor
-applied to the glue inside the box, the glue order |o| is its order of stretchability\index{stretchability},
-and the glue sign |s| is $-1$ for shrinking\index{shrinkability}, 0 for rigid, and $+1$ for stretching.
+The shift amount |a| shifts the contents of the box, 
+the glue ratio\index{glue ratio} |r| is a factor applied to the glue inside the box,
+the glue order |o| is its order of stretchability\index{stretchability},
+and the glue sign |s| is $-1$ for shrinking\index{shrinkability},
+0 for rigid, and $+1$ for stretching.
 Most importantly, a box contains a list |l| of content nodes inside the box.
 
 
@@ -6834,13 +6836,13 @@
 @
 
 
-Writing the auxiliary files depends on the {\tt -n}, {\tt -f} and {\tt -g}
+Writing the auxiliary files depends on the {\tt -a}, {\tt -g} and {\tt -f}
 options.
 
 @<without {\tt -f} skip writing an existing file@>=
-    if ( !option_force && access(file_name,F_OK)==0)
+    if ( !option_force && access(aux_name,F_OK)==0)
     { MESSAGE("File '%s' exists.\n"@| "To rewrite the file use the -f option.\n",
-              file_name);
+              aux_name);
       continue;
     }
 @
@@ -6864,7 +6866,7 @@
 {\tt stretch}ed on another system, this is usually not the desired behavior.
 Without the {\tt -g} option,\label{absrel} the files will be written in two local directories.
 The names of these directories are derived from the output file name,
-replacing the extension ``{\tt .HINT}'' with ``{\tt .abs}'' if the original
+replacing the extension ``{\tt .hint}'' with ``{\tt .abs}'' if the original
 filename contained an absolute path, and  replacing it with ``{\tt .rel}''
 if the original filename contained a relative path. Inside these directories,
 the path as given in the filename is retained.
@@ -6871,56 +6873,70 @@
 When {\tt shrink}ing a \HINT\ file without the {\tt -g} option,
 the original filenames can be reconstructed.
 
-@<without {\tt -g} compute a local |file_name|@>=
-if (!option_global)
-{ int path_length=(int)strlen(file_name);
-  @<determine whether |file_name| is absolute or relative@>@;
-  if (file_name_length<stem_length+ext_length+path_length)
-  { file_name_length=stem_length+ext_length+path_length;
-    REALLOCATE(stem_name, file_name_length+1,char);
-  }
-  strcpy(stem_name+stem_length,aux_ext[name_type]);
-  strcpy(stem_name+stem_length+ext_length,file_name);
-  DBG(DBGDIR,"Replacing auxiliary file name:\n\t%s\n->\t%s\n",file_name,stem_name);
-  file_name=stem_name;
+@<compute a local |aux_name|@>=
+{ char *path=dir[i].file_name;
+  int path_length=(int)strlen(path);
+  int aux_length;
+  @<determine whether |path| is absolute or relative@>@;
+  aux_length=stem_length+ext_length+path_length;
+  ALLOCATE(aux_name,aux_length+1,char);
+  strcpy(aux_name,stem_name);
+  strcpy(aux_name+stem_length,aux_ext[name_type]);
+  strcpy(aux_name+stem_length+ext_length,path);
+  @<replace links to the parent directory@>@; 
+  DBG(DBGDIR,"Replacing auxiliary file name:\n\t%s\n->\t%s\n",path,aux_name);
 }
 @
 
-@<determine whether |file_name| is absolute or relative@>=
+@<determine whether |path| is absolute or relative@>=
   enum {absolute=0, relative=1} name_type;
   char *aux_ext[2]={".abs/",".rel/"};
   int ext_length=5;
-  if (file_name[0]=='/')
-  {  name_type=absolute;
-    file_name++; path_length--;
+  if (path[0]=='/')
+  { name_type=absolute;
+    path++; path_length--;
   }
-  else if (path_length>3 && isalpha(file_name[0]) &&
-           file_name[1]==':' && file_name[2]=='/')
+  else if (path_length>3 && isalpha(path[0]) &&
+           path[1]==':' && path[2]=='/')
   { name_type=absolute;
-    file_name[1]='_';
+    path[1]='_';
   }      
   else
     name_type=relative;
 @
+
+When the {\tt -g}  is not given, auxiliar files are written into
+special subdirectories. To prevent them from escaping into the global
+file system, we replace links to the parent direcory ``{\tt ../}'' by 
+``{\tt \_\,\_/}''.
+
+@<replace links to the parent directory@>=
+{ int k;
+  for (k=0; k<aux_length-3;k++) 
+    if (aux_name[k]=='.'&& aux_name[k+1]=='.'&& aux_name[k+2]=='/')
+    { aux_name[k]=aux_name[k+1]='_';k=k+2;}
+}
+@
+
 It remains to create the directories along the path we might have constructed.
-@<make sure the path in |file_name| exists@>=
+@<make sure the path in |aux_name| exists@>=
 { char *path_end;
-  path_end=file_name+1;
+  path_end=aux_name+1;
   while (*path_end!=0)
   { if(*path_end=='/')
     { struct stat s;
      *path_end=0;   
-      if (stat(file_name,&s)==-1)
+      if (stat(aux_name,&s)==-1)
       {
 #ifdef WIN32
-      if (mkdir(file_name)!=0)
+      if (mkdir(aux_name)!=0)
 #else
-      @t\2\kern-1em@>if (mkdir(file_name,0777)!=0)
+      @t\2\kern-1em@>if (mkdir(aux_name,0777)!=0)
 #endif
-           QUIT("Unable to create directory %s",file_name);
-         DBG(DBGDIR,"Creating directory %s\n",file_name);
+           QUIT("Unable to create directory %s",aux_name);
+         DBG(DBGDIR,"Creating directory %s\n",aux_name);
       } else if (!(S_IFDIR&s.st_mode))
-        QUIT("Unable to create directory %s, file exists",file_name);
+        QUIT("Unable to create directory %s, file exists",aux_name);
       *path_end='/';
     }
     path_end++;
@@ -6939,28 +6955,30 @@
 void hget_section(uint16_t n);
 void hwrite_aux_files(void)
 { int i;
-  if (option_no_aux) return;
+  if (!option_aux) return;
   DBG(DBGBASIC|DBGDIR,"Writing %d aux files\n",max_section_no-2);
   for (i=3;i<=max_section_no;i++)
   { FILE *f;
-    char * file_name=dir[i].file_name;
-    int file_name_length=0;
-
-    @<without {\tt -g} compute a local |file_name|@>@;
+    char *aux_name=NULL;
+    if (option_global)
+      aux_name=strdup(dir[i].file_name);
+    else
+      @<compute a local |aux_name|@>@; 
     @<without {\tt -f} skip writing an existing file@>@;
-    @<make sure the path in |file_name| exists@>@;
+    @<make sure the path in |aux_name| exists@>@;
 
-    f=fopen(file_name,"wb");
+    f=fopen(aux_name,"wb");
     if (f==NULL) 
-      QUIT("Unable to open file '%s' for writing",file_name);
+      QUIT("Unable to open file '%s' for writing",aux_name);
     else
     { size_t s;
       hget_section(i);
-      DBG(DBGDIR,"Writing file %s\n",file_name);
+      DBG(DBGDIR,"Writing file %s\n",aux_name);
       s=fwrite(hstart,1,dir[i].size,f);
-      if (s!=dir[i].size) QUIT("writing file %s",file_name);
+      if (s!=dir[i].size) QUIT("writing file %s",aux_name);
       fclose(f);
     }
+    free(aux_name);
   }
 }
 @
@@ -7059,6 +7077,7 @@
 and we set its position to the position of the
 entry for section 1 (which might already be compressed).
 The name of the directory section must be the empty string.
+
 \gdef\subcodetitle{Directory Section}%
 \getcode
 @<get file functions@>=
@@ -7097,28 +7116,6 @@
 
 @
 
-When the \.{shrink} program writes the directory section in the short format,
-it needs to know the sizes of all the  sections---including the optional sections.
-These sizes are not provided in the long format because it is safer and more 
-convenient to let the machine figure out the file sizes\index{file size}. 
-
-@<set the file sizes for optional sections@>=
-{ int i; 
-  for (i=3;i<=max_section_no;i++)
-    { struct stat s;
-      char *file_name=dir[i].file_name;
-      int file_name_length=0;
-      @<without {\tt -g} compute a local |file_name|@>@;     
-      if (stat(file_name,&s)!=0)
-        QUIT("Unable to obtain file size for '%s'",dir[i].file_name);
-      dir[i].size=s.st_size;
-      dir[i].xsize=0;
-    }
-}
-@
-
-The computation of the sizes of the mandatory sections will be 
-explained later.
 Armed with these preparations, we can put the directory into the \HINT\ file.
 
 \gdef\subcodetitle{Directory Section}%
@@ -7173,9 +7170,11 @@
 }
 
 extern int option_compress;
+static char **aux_names;
 void hput_directory(void)
 { int i;
-  @<set the file sizes for optional sections@>@;
+  @<update the file sizes of optional sections@>@;
+
   if (option_compress) { hcompress(1); @+hcompress(2); @+}
   hput_directory_start();
   for (i=1; i<=max_section_no; i++)
@@ -7189,15 +7188,67 @@
 
 @
 
+Now let us look at the optional sections described in the directory entries 3 and above
+Where these files are found depends on the {\tt -g} and {\tt -a} options.
 
+With the {\tt -g} option given, only the file names as given in the directory entries are used.
+With the {\tt -a} option given, the file names are translated to filenames in the {|hin_name|\tt .abs} and  {|hin_name|\tt .rel} directories, as described in section~\secref{absrel}.
+If neither the {\tt -a} nor the {\tt -g} option is given, {\tt shrink} first trys the translated
+filename and then the global filename before it gives up.
+
+When the \.{shrink} program writes the directory section in the short format,
+it needs to know the sizes of all the  sections---including the optional sections.
+These sizes are not provided in the long format because it is safer and more 
+convenient to let the machine figure out the file sizes\index{file size}.
+But before we can determine the size, we need to determine the file.
+
+@<update the file sizes of optional sections@>=
+{ int i;
+  ALLOCATE(aux_names,max_section_no+1,char *); 
+  for (i=3;i<=max_section_no;i++)
+  { struct stat s; 
+
+    if (!option_global)
+    { char * aux_name=NULL;
+      @<compute a local |aux_name|@>@;
+      if (stat(aux_name,&s)==0)
+        aux_names[i]=aux_name;
+      else 
+      { if (option_aux) QUIT("Unable to find file '%s'",aux_name); 
+        free(aux_name);
+      } 
+    }
+    if ((aux_names[i]==NULL && !option_aux) || option_global)
+    { if (stat(dir[i].file_name,&s)!=0)
+        QUIT("Unable to find file '%s'",dir[i].file_name); 
+    }
+    dir[i].size=s.st_size;
+    dir[i].xsize=0;
+    DBG(DBGDIR,"section %i: found file %s size %u\n",i,aux_names[i]?aux_names[i]:dir[i].file_name, dir[i].size);
+  }
+}
+@
+
+@<rewrite the file names of optional sections@>=
+{ int i;
+  for (i=3;i<=max_section_no;i++)
+    if (aux_names[i]!=NULL)
+    { free(dir[i].file_name);
+      dir[i].file_name=aux_names[i];
+      aux_names[i]=NULL;
+    }
+} 
+@
+
+
+The computation of the sizes of the mandatory sections will be 
+explained later.
+
+
+\gdef\subcodetitle{Optional Sections}%
 To conclude this section, here is the function that  adds the files that
 are described in the directory entries 3 and above to a \HINT\ file in short format.
-Where these files are found depends on the {\tt -g} option.
-With that option given, the file names of the directory entries are used unchanged.
-Without that option, the files are found in the {|hin_name|\tt .abs} and  {|hin_name|\tt .rel}
-directories, as described in section~\secref{absrel}.
 
-\gdef\subcodetitle{Optional Sections}%
 \putcode
 @<put functions@>=
 static void hput_optional_sections(void)
@@ -7207,11 +7258,9 @@
    { FILE *f;
      size_t fsize;
      char *file_name=dir[i].file_name;
-     int file_name_length=0;
-     DBG(DBGDIR,"file %d: %s\n",dir[i].section_no,file_name);
+     DBG(DBGDIR,"adding file %d: %s\n",dir[i].section_no,file_name);
      if (dir[i].xsize!=0) @/
        DBG(DBGDIR,"Compressing of auxiliary files currently not supported");
-     @<without {\tt -g} compute a local |file_name|@>@;
      f=fopen(file_name,"rb");
      if (f==NULL) QUIT("Unable to read section %d, file %s",
        dir[i].section_no,file_name);
@@ -7226,7 +7275,7 @@
      }
      fclose(f);
      if (fsize!=dir[i].size) 
-       QUIT(@["File size " SIZE_F " does not match directory size %u"@],@|fsize,dir[i].size);
+       QUIT(@["File size " SIZE_F " does not match section[0] size %u"@],@|fsize,dir[i].size);
    }
 }
 @
@@ -8516,39 +8565,40 @@
 It tells us what to expect in the rest of this section.
 {\def\SP{\hskip .5em}
 @<explain usage@>=
-  fprintf(stderr,
-  "Usage: %s [options] filename%s\n",prog_name, in_ext);@/
-  fprintf(stderr,
+  fprintf(stdout,
+  "Usage: %s [OPTION]... FILENAME%s\n",prog_name, in_ext);@/
+  fprintf(stdout,DESCRIPTION);
+  fprintf(stdout,
   "Options:\n"@/
   "\t --help \t display this message\n"@/
   "\t --version\t display the HINT version\n"@/
   "\t -o file\t specify an output file name\n"@/
-  "\t -g     \t assume global names for auxiliary files\n"@/
-  "\t -f     \t force overwriting auxiliary files\n"@/
-  "\t -n     \t do not write auxiliary files\n"@/
+  "\t -a     \t write auxiliary files\n"@/
+  "\t -g     \t use global names of auxiliary files (implies -a)\n"@/
+  "\t -f     \t force overwriting existing auxiliary files\n"@/
   "\t -l     \t redirect stderr to a log file\n"@/
   "\t -u     \t enable writing utf8 character codes\n"@/
   "\t -x     \t enable writing hexadecimal character codes\n"@/
   "\t -c     \t enable compression of section 1 and 2\n");@/
 #ifdef DEBUG
-fprintf(stderr,"\t -d XXXX \t set debug flag to hexadecimal value XXXX.\n"
+fprintf(stdout,"\t -d XXXX \t set debug flag to hexadecimal value XXXX.\n"
                "\t\t\t OR together these values:\n");@/
-fprintf(stderr,"\t\t\t XX=%03X   basic debugging\n", DBGBASIC);@/
-fprintf(stderr,"\t\t\t XX=%03X   tag debugging\n", DBGTAGS);@/
-fprintf(stderr,"\t\t\t XX=%03X   node debugging\n",DBGNODE);@/
-fprintf(stderr,"\t\t\t XX=%03X   definition debugging\n", DBGDEF);@/
-fprintf(stderr,"\t\t\t XX=%03X   directory debugging\n", DBGDIR);@/
-fprintf(stderr,"\t\t\t XX=%03X   range debugging\n",DBGRANGE);@/
-fprintf(stderr,"\t\t\t XX=%03X   float debugging\n", DBGFLOAT);@/
-fprintf(stderr,"\t\t\t XX=%03X   compression debugging\n", DBGCOMPRESS);@/
-fprintf(stderr,"\t\t\t XX=%03X   buffer debugging\n", DBGBUFFER);@/
-fprintf(stderr,"\t\t\t XX=%03X   flex debugging\n", DBGFLEX);@/
-fprintf(stderr,"\t\t\t XX=%03X   bison debugging\n", DBGBISON);@/
-fprintf(stderr,"\t\t\t XX=%03X   TeX debugging\n", DBGTEX);@/
-fprintf(stderr,"\t\t\t XX=%03X   Page debugging\n", DBGPAGE);@/
-fprintf(stderr,"\t\t\t XX=%03X   Font debugging\n", DBGFONT);@/
-fprintf(stderr,"\t\t\t XX=%03X   Render debugging\n", DBGRENDER);@/
-fprintf(stderr,"\t\t\t XX=%03X   Label debugging\n", DBGLABEL);@/
+fprintf(stdout,"\t\t\t XX=%03X   basic debugging\n", DBGBASIC);@/
+fprintf(stdout,"\t\t\t XX=%03X   tag debugging\n", DBGTAGS);@/
+fprintf(stdout,"\t\t\t XX=%03X   node debugging\n",DBGNODE);@/
+fprintf(stdout,"\t\t\t XX=%03X   definition debugging\n", DBGDEF);@/
+fprintf(stdout,"\t\t\t XX=%03X   directory debugging\n", DBGDIR);@/
+fprintf(stdout,"\t\t\t XX=%03X   range debugging\n",DBGRANGE);@/
+fprintf(stdout,"\t\t\t XX=%03X   float debugging\n", DBGFLOAT);@/
+fprintf(stdout,"\t\t\t XX=%03X   compression debugging\n", DBGCOMPRESS);@/
+fprintf(stdout,"\t\t\t XX=%03X   buffer debugging\n", DBGBUFFER);@/
+fprintf(stdout,"\t\t\t XX=%03X   flex debugging\n", DBGFLEX);@/
+fprintf(stdout,"\t\t\t XX=%03X   bison debugging\n", DBGBISON);@/
+fprintf(stdout,"\t\t\t XX=%03X   TeX debugging\n", DBGTEX);@/
+fprintf(stdout,"\t\t\t XX=%03X   Page debugging\n", DBGPAGE);@/
+fprintf(stdout,"\t\t\t XX=%03X   Font debugging\n", DBGFONT);@/
+fprintf(stdout,"\t\t\t XX=%03X   Render debugging\n", DBGRENDER);@/
+fprintf(stdout,"\t\t\t XX=%03X   Label debugging\n", DBGLABEL);@/
 #endif
 @
 }
@@ -8582,7 +8632,7 @@
 int option_hex=false;
 int option_force=false;
 int option_global=false;
-int option_no_aux=false;
+int option_aux=false;
 int option_compress=false;
 char *stem_name=NULL;
 int stem_length=0;
@@ -8591,7 +8641,7 @@
 not including the extension. The space allocated for it
 is large enough to append an extension with up to five characters.
 It can be used with the extension {\tt .log} for the log file,
-with {\tt .HINT} or {\tt .hnt} for the output file,
+with {\tt .hint} or {\tt .hnt} for the output file,
 and with {\tt .abs} or {\tt .rel} when writing or reading the auxiliary sections.
 The {\tt stretch} program will overwrite the |stem_name|
 using the name of the output file if it is set with the {\tt -o}
@@ -8616,7 +8666,12 @@
 @<process the command line@>=
   debugflags=DBGBASIC;
   prog_name=argv[0];
-  if (argc < 2) goto explain_usage;
+  if (argc < 2) 
+  { fprintf(stderr,
+    "%s: no input file given\n"
+    "Try '%s --help' for more information\n",prog_name, prog_name);
+    exit(1);
+  }
   argv++; /* skip the program name */
   while (*argv!=NULL)
   { if ((*argv)[0]=='-')
@@ -8627,7 +8682,11 @@
           { fprintf(stderr,"%s version %d.%d\n",prog_name, HINT_VERSION, HINT_SUB_VERSION);
             exit(0);
           }
-        default: goto explain_usage; 
+          else if (strcmp(*argv,"--help")==0) 
+          { @<explain usage@>@;
+  fprintf(stdout,"\nFor further information and reporting bugs see https://hint.userweb.mwn.de/\n");
+            exit(0);
+          } 
         case 'o': argv++;
           file_name_length=(int)strlen(*argv);
           ALLOCATE(file_name,file_name_length+6,char); /*plus extension*/
@@ -8636,13 +8695,24 @@
         case 'u': option_utf8=true;@+break;
         case 'x': option_hex=true;@+break;
         case 'f': option_force=true; @+break;
-        case 'g': option_global=true; @+break;
-        case 'n': option_no_aux=true; @+break;
+        case 'g': option_global=option_aux=true; @+break;
+        case 'a': option_aux=true; @+break;
         case 'c': option_compress=true; @+break;
         case 'd': @/
-          argv++; if (*argv==NULL) goto explain_usage;
+          argv++; if (*argv==NULL)
+          { fprintf(stderr,
+             "%s: option -d expects an argument\n"
+             "Try '%s --help' for more information\n",prog_name, prog_name);
+             exit(1);
+           }
           debugflags=strtol(*argv,NULL,16);
           break;
+        default:
+        { fprintf(stderr,
+            "%s: unrecognized option '%s'\n"
+            "Try '%s --help' for more information\n",prog_name,*argv,prog_name);
+            exit(1);
+        }  
       }
     }
     else /* the input file name */
@@ -8659,11 +8729,21 @@
       ALLOCATE(stem_name,stem_length+6,char);
       strncpy(stem_name,hin_name,stem_length);
       stem_name[stem_length]=0;
-      if (*(argv+1)!=NULL) goto explain_usage;
+      if (*(argv+1)!=NULL) 
+      { fprintf(stderr,
+        "%s: extra argument after input file name:  '%s'\n"
+        "Try '%s --help' for more information\n",prog_name,*(argv+1),prog_name);
+        exit(1);
+      }
     }
     argv++;
   }
-  if (hin_name==NULL) goto explain_usage;
+  if (hin_name==NULL) 
+  { fprintf(stderr,
+      "%s: missing input file name\n"
+      "Try '%s --help' for more information\n",prog_name,prog_name);
+      exit(1);
+  }
 @
 
 After the command line has been processed, three file streams need to be opened:
@@ -8721,7 +8801,10 @@
     strcpy(file_name,stem_name);@+
     strcpy(file_name+stem_length,out_ext);
   }
-  @<make sure the path in |file_name| exists@>@;
+  { char *aux_name=file_name;
+    @<make sure the path in |aux_name| exists@>@;
+    aux_name=NULL;
+  }
   hout=fopen(file_name,"wb");
   if (hout==NULL) QUIT("Unable to open output file %s",file_name);
 @
@@ -10290,9 +10373,11 @@
 @<function to write the banner@>@;
 @<put functions@>@;
 
+#define DESCRIPTION "\nShrinking converts a 'long' ASCII HINT file into a`short' binary HINT file .\n"
+
 int main(int argc, char *argv[])
 { @<local variables in |main|@>@;
-   in_ext=".HINT";
+   in_ext=".hint";
    out_ext=".hnt";
   @<process the command line@>@;
 
@@ -10314,16 +10399,13 @@
   yyparse();
 
   hput_directory();
-
-  hput_hint("shrink");
+  @<rewrite the file names of optional sections@>@;
+  hput_hint("created by shrink");
   
   @<close the output file@>@;
   @<close the input file@>@;
   @<close the log file@>@;
   return 0;
-explain_usage:
-  @<explain usage@>@;
-  return 1;
 }
 @
 
@@ -10365,11 +10447,13 @@
 @<shared get functions@>@;
 @<get functions@>@;
 
+#define DESCRIPTION "\nStretching converts a `short' binary HINT file into a 'long' ASCII HINT file.\n"
+
 int main(int argc, char *argv[])
 { @<local variables in |main|@>@;
 
   in_ext=".hnt";
-  out_ext=".HINT";
+  out_ext=".hint";
   @<process the command line@>@;
   @<open the log file@>@;
   @<open the output file@>@;
@@ -10379,7 +10463,7 @@
   hend=hstart+hin_size;
   hget_banner();
   if (!hcheck_banner("hint")) QUIT("Invalid banner");
-  hput_banner("HINT","stretch");
+  hput_banner("HINT","created by stretch");
   hget_directory();
   hwrite_directory();
   hget_definition_section();
@@ -10390,9 +10474,7 @@
   DBG(DBGBASIC,"End of Program\n");
   @<close the log file@>@;
   return 0;
-explain_usage:
-  @<explain usage@>@;
-  return 1;}
+}
 @
 
 In the above program, the get functions call the write functions
@@ -10445,6 +10527,8 @@
 @<shared skip functions@>@;
 @<skip functions@>@;
 
+#define DESCRIPTION "\n This program tests parsing a binary HINT file in reverse direction.\n"
+
 int main(int argc, char *argv[])
 { @<local variables in |main|@>@;
   in_ext=".hnt";
@@ -10477,9 +10561,6 @@
   hget_unmap();
   @<close the log file@>@;
   return 0;
-explain_usage:
-  @<explain usage@>@;
-  return 1;
 }
 @
 

Modified: trunk/Build/source/texk/web2c/hitexdir/hilexer.c
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hilexer.c	2021-11-22 00:49:10 UTC (rev 61116)
+++ trunk/Build/source/texk/web2c/hitexdir/hilexer.c	2021-11-22 16:45:58 UTC (rev 61117)
@@ -843,8 +843,8 @@
 char *yytext;
 #line 1 "lexer.l"
 #line 2 "lexer.l"
-	/*509:*/
-	#line 10175 "format.w"
+	/*511:*/
+	#line 10258 "format.w"
 	
 #include "hibasetypes.h"
 #include "hierror.h"
@@ -851,7 +851,7 @@
 #include "hiformat.h"
 #include "hiput.h"
 
-	/*423:*/
+	/*425:*/
 #ifdef DEBUG
 #define  YYDEBUG 1
 extern int yydebug;
@@ -858,7 +858,7 @@
 #else
 #define YYDEBUG 0
 #endif
-	/*:423*/
+	/*:425*/
 #include "hiparser.h"
 
 	/*22:*/
@@ -980,7 +980,7 @@
 	}
 	/*:61*/
 int yywrap(void){
-	#line 10186 "format.w"
+	#line 10269 "format.w"
 	return 1;}
 #ifdef _MSC_VER
 #pragma  warning( disable : 4267)
@@ -2013,37 +2013,37 @@
 #line 338 "lexer.l"
 return SECTION;
 	YY_BREAK
-/*:323*/	/*342:*/
+/*:323*/	/*344:*/
 case 119:
 YY_RULE_SETUP
 #line 340 "lexer.l"
 return DEFINITIONS;
 	YY_BREAK
-/*:342*/	/*350:*/
+/*:344*/	/*352:*/
 case 120:
 YY_RULE_SETUP
 #line 342 "lexer.l"
 return MAX;
 	YY_BREAK
-/*:350*/	/*365:*/
+/*:352*/	/*367:*/
 case 121:
 YY_RULE_SETUP
 #line 344 "lexer.l"
 return PARAM;
 	YY_BREAK
-/*:365*/	/*374:*/
+/*:367*/	/*376:*/
 case 122:
 YY_RULE_SETUP
 #line 346 "lexer.l"
 return FONT;
 	YY_BREAK
-/*:374*/	/*402:*/
+/*:376*/	/*404:*/
 case 123:
 YY_RULE_SETUP
 #line 348 "lexer.l"
 return CONTENT;
 	YY_BREAK
-/*:402*/
+/*:404*/
 case 124:
 YY_RULE_SETUP
 #line 350 "lexer.l"
@@ -3226,5 +3226,5 @@
 
 #line 353 "lexer.l"
 
-	/*:509*/
+	/*:511*/
 

Modified: trunk/Build/source/texk/web2c/hitexdir/hilexer.l
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hilexer.l	2021-11-22 00:49:10 UTC (rev 61116)
+++ trunk/Build/source/texk/web2c/hitexdir/hilexer.l	2021-11-22 16:45:58 UTC (rev 61117)
@@ -1,6 +1,6 @@
-	/*509:*/
+	/*511:*/
 %{
-	#line 10175 "format.w"
+	#line 10258 "format.w"
 	
 #include "hibasetypes.h"
 #include "hierror.h"
@@ -7,7 +7,7 @@
 #include "hiformat.h"
 #include "hiput.h"
 
-	/*423:*/
+	/*425:*/
 #ifdef DEBUG
 #define  YYDEBUG 1
 extern int yydebug;
@@ -14,7 +14,7 @@
 #else
 #define YYDEBUG 0
 #endif
-	/*:423*/
+	/*:425*/
 #include "hiparser.h"
 
 	/*22:*/
@@ -136,7 +136,7 @@
 	}
 	/*:61*/
 int yywrap(void){
-	#line 10186 "format.w"
+	#line 10269 "format.w"
 	return 1;}
 #ifdef _MSC_VER
 #pragma  warning( disable : 4267)
@@ -335,19 +335,19 @@
 	/*:296*/	/*323:*/
 directory	return DIRECTORY;
 section	return SECTION;
-	/*:323*/	/*342:*/
+	/*:323*/	/*344:*/
 definitions	return DEFINITIONS;
-	/*:342*/	/*350:*/
+	/*:344*/	/*352:*/
 max	return MAX;
-	/*:350*/	/*365:*/
+	/*:352*/	/*367:*/
 param	return PARAM;
-	/*:365*/	/*374:*/
+	/*:367*/	/*376:*/
 font	return FONT;
-	/*:374*/	/*402:*/
+	/*:376*/	/*404:*/
 content	return CONTENT;
-	/*:402*/
+	/*:404*/
 [a-z]+	QUIT("Unexpected keyword '%s' in line %d",yytext,yylineno);
 .	QUIT("Unexpected character '%c' (0x%02X) in line %d",yytext[0]>' '?yytext[0]:' ',yytext[0],yylineno);
 
 %%
-	/*:509*/
+	/*:511*/

Modified: trunk/Build/source/texk/web2c/hitexdir/hiparser.c
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hiparser.c	2021-11-22 00:49:10 UTC (rev 61116)
+++ trunk/Build/source/texk/web2c/hitexdir/hiparser.c	2021-11-22 16:45:58 UTC (rev 61117)
@@ -69,7 +69,7 @@
 /* First part of user prologue.  */
 #line 2 "parser.y"
 
-	#line 10216 "format.w"
+	#line 10299 "format.w"
 	
 #include "hibasetypes.h"
 #include <string.h>
@@ -79,9 +79,9 @@
 #include "hiput.h"
 extern char**hfont_name;
 
-	/*356:*/
+	/*358:*/
 uint32_t definition_bits[0x100/32][32]= {
-	#line 7578 "format.w"
+	#line 7627 "format.w"
 	{0}};
 
 #define SET_DBIT(N,K) ((N)>0xFF?1:(definition_bits[N/32][K]	|= (1<<((N)&(32-1)))))
@@ -91,16 +91,16 @@
  RNG("Definition",(D).n,max_fixed[(D).k]+1,max_ref[(D).k]);
 #define REF(K,N) REF_RNG(K,N);if(!GET_DBIT(N,K)) \
  QUIT("Reference %d to %s before definition",(N),definition_name[K])
-	/*:356*/	/*360:*/
+	/*:358*/	/*362:*/
 #define DEF_REF(D,K,M,N)  DEF(D,K,M);\
 if ((M)>max_default[K]) QUIT("Defining non default reference %d for %s",M,definition_name[K]); \
 if ((N)>max_fixed[K]) QUIT("Defining reference %d for %s by non fixed reference %d",M,definition_name[K],N);
-	/*:360*/
+	/*:362*/
 
 extern void hset_entry(entry_t*e,uint16_t i,uint32_t size,
 uint32_t xsize,char*file_name);
 
-	/*423:*/
+	/*425:*/
 #ifdef DEBUG
 #define  YYDEBUG 1
 extern int yydebug;
@@ -107,36 +107,36 @@
 #else
 #define YYDEBUG 0
 #endif
-	/*:423*/
+	/*:425*/
 extern int yylex(void);
 
-	/*352:*/
+	/*354:*/
 void hset_max(kind_t k,int n)
 {
-	#line 7421 "format.w"
+	#line 7470 "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])
 	max_ref[k]= n;
 	}
-	/*:352*/	/*363:*/
+	/*:354*/	/*365:*/
 void check_param_def(ref_t*df)
 {
-	#line 7727 "format.w"
+	#line 7776 "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)
 	QUIT("Parameter %d for %s not allowed in parameter list",df->n,definition_name[df->k]);
 	}
-	/*:363*/	/*422:*/
+	/*:365*/	/*424:*/
 extern int yylineno;
 int yyerror(const char*msg)
 {
-	#line 8803 "format.w"
+	#line 8886 "format.w"
 	QUIT(" in line %d %s",yylineno,msg);
 	return 0;
 	}
-	/*:422*/
+	/*:424*/
 
 
 
@@ -2428,7 +2428,7 @@
   case 63: /* box_dimen: dimension dimension dimension  */
 #line 449 "parser.y"
 {
-	#line 3470 "format.w"
+	#line 3472 "format.w"
 	(yyval.info)= hput_box_dimen((yyvsp[-2].d),(yyvsp[-1].d),(yyvsp[0].d));}
 #line 2434 "parser.c"
     break;
@@ -2436,7 +2436,7 @@
   case 64: /* box_shift: %empty  */
 #line 452 "parser.y"
           {
-	#line 3471 "format.w"
+	#line 3473 "format.w"
 	(yyval.info)= b000;}
 #line 2442 "parser.c"
     break;
@@ -2444,7 +2444,7 @@
   case 65: /* box_shift: "shifted" dimension  */
 #line 455 "parser.y"
                           {
-	#line 3472 "format.w"
+	#line 3474 "format.w"
 	(yyval.info)= hput_box_shift((yyvsp[0].d));}
 #line 2450 "parser.c"
     break;
@@ -2452,7 +2452,7 @@
   case 66: /* box_glue_set: %empty  */
 #line 459 "parser.y"
              {
-	#line 3474 "format.w"
+	#line 3476 "format.w"
 	(yyval.info)= b000;}
 #line 2458 "parser.c"
     break;
@@ -2460,7 +2460,7 @@
   case 67: /* box_glue_set: "plus" stretch  */
 #line 462 "parser.y"
                      {
-	#line 3475 "format.w"
+	#line 3477 "format.w"
 	(yyval.info)= hput_box_glue_set(+1,(yyvsp[0].st).f,(yyvsp[0].st).o);}
 #line 2466 "parser.c"
     break;
@@ -2468,7 +2468,7 @@
   case 68: /* box_glue_set: "minus" stretch  */
 #line 465 "parser.y"
                       {
-	#line 3476 "format.w"
+	#line 3478 "format.w"
 	(yyval.info)= hput_box_glue_set(-1,(yyvsp[0].st).f,(yyvsp[0].st).o);}
 #line 2474 "parser.c"
     break;
@@ -2476,7 +2476,7 @@
   case 69: /* box: box_dimen box_shift box_glue_set list  */
 #line 470 "parser.y"
                                          {
-	#line 3479 "format.w"
+	#line 3481 "format.w"
 	(yyval.info)= (yyvsp[-3].info)	|(yyvsp[-2].info)	|(yyvsp[-1].info);}
 #line 2482 "parser.c"
     break;
@@ -2484,7 +2484,7 @@
   case 70: /* hbox_node: start "hbox" box ">"  */
 #line 474 "parser.y"
                             {
-	#line 3481 "format.w"
+	#line 3483 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(hbox_kind,(yyvsp[-1].info)));}
 #line 2490 "parser.c"
     break;
@@ -2492,7 +2492,7 @@
   case 71: /* vbox_node: start "vbox" box ">"  */
 #line 477 "parser.y"
                             {
-	#line 3482 "format.w"
+	#line 3484 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(vbox_kind,(yyvsp[-1].info)));}
 #line 2498 "parser.c"
     break;
@@ -2500,7 +2500,7 @@
   case 74: /* box_flex: plus minus  */
 #line 482 "parser.y"
                    {
-	#line 3663 "format.w"
+	#line 3665 "format.w"
 	hput_stretch(&((yyvsp[-1].st)));hput_stretch(&((yyvsp[0].st)));}
 #line 2506 "parser.c"
     break;
@@ -2508,7 +2508,7 @@
   case 75: /* xbox: box_dimen box_shift box_flex xdimen_ref list  */
 #line 485 "parser.y"
                                                  {
-	#line 3664 "format.w"
+	#line 3666 "format.w"
 	(yyval.info)= (yyvsp[-4].info)	|(yyvsp[-3].info);}
 #line 2514 "parser.c"
     break;
@@ -2516,7 +2516,7 @@
   case 76: /* xbox: box_dimen box_shift box_flex xdimen_node list  */
 #line 488 "parser.y"
                                                       {
-	#line 3665 "format.w"
+	#line 3667 "format.w"
 	(yyval.info)= (yyvsp[-4].info)	|(yyvsp[-3].info)	|b100;}
 #line 2522 "parser.c"
     break;
@@ -2524,7 +2524,7 @@
   case 77: /* box_goal: "to" xdimen_ref  */
 #line 492 "parser.y"
                       {
-	#line 3667 "format.w"
+	#line 3669 "format.w"
 	(yyval.info)= b000;}
 #line 2530 "parser.c"
     break;
@@ -2532,7 +2532,7 @@
   case 78: /* box_goal: "add" xdimen_ref  */
 #line 495 "parser.y"
                        {
-	#line 3668 "format.w"
+	#line 3670 "format.w"
 	(yyval.info)= b001;}
 #line 2538 "parser.c"
     break;
@@ -2540,7 +2540,7 @@
   case 79: /* box_goal: "to" xdimen_node  */
 #line 498 "parser.y"
                        {
-	#line 3669 "format.w"
+	#line 3671 "format.w"
 	(yyval.info)= b100;}
 #line 2546 "parser.c"
     break;
@@ -2548,7 +2548,7 @@
   case 80: /* box_goal: "add" xdimen_node  */
 #line 501 "parser.y"
                         {
-	#line 3670 "format.w"
+	#line 3672 "format.w"
 	(yyval.info)= b101;}
 #line 2554 "parser.c"
     break;
@@ -2556,7 +2556,7 @@
   case 81: /* hpack: box_shift box_goal list  */
 #line 505 "parser.y"
                              {
-	#line 3672 "format.w"
+	#line 3674 "format.w"
 	(yyval.info)= (yyvsp[-1].info);}
 #line 2562 "parser.c"
     break;
@@ -2564,7 +2564,7 @@
   case 82: /* $@3: %empty  */
 #line 508 "parser.y"
                                    {
-	#line 3673 "format.w"
+	#line 3675 "format.w"
 	HPUT32((yyvsp[0].d));}
 #line 2570 "parser.c"
     break;
@@ -2572,7 +2572,7 @@
   case 83: /* vpack: box_shift "max" "depth" dimension $@3 box_goal list  */
 #line 510 "parser.y"
                                  {
-	#line 3673 "format.w"
+	#line 3675 "format.w"
 	(yyval.info)= (yyvsp[-6].info)	|(yyvsp[-1].info);}
 #line 2578 "parser.c"
     break;
@@ -2580,7 +2580,7 @@
   case 84: /* vxbox_node: start "vset" xbox ">"  */
 #line 514 "parser.y"
                               {
-	#line 3675 "format.w"
+	#line 3677 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(vset_kind,(yyvsp[-1].info)));}
 #line 2586 "parser.c"
     break;
@@ -2588,7 +2588,7 @@
   case 85: /* vxbox_node: start "vpack" vpack ">"  */
 #line 517 "parser.y"
                               {
-	#line 3676 "format.w"
+	#line 3678 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(vpack_kind,(yyvsp[-1].info)));}
 #line 2594 "parser.c"
     break;
@@ -2596,7 +2596,7 @@
   case 86: /* hxbox_node: start "hset" xbox ">"  */
 #line 522 "parser.y"
                               {
-	#line 3679 "format.w"
+	#line 3681 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(hset_kind,(yyvsp[-1].info)));}
 #line 2602 "parser.c"
     break;
@@ -2604,7 +2604,7 @@
   case 87: /* hxbox_node: start "hpack" hpack ">"  */
 #line 525 "parser.y"
                               {
-	#line 3680 "format.w"
+	#line 3682 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(hpack_kind,(yyvsp[-1].info)));}
 #line 2610 "parser.c"
     break;
@@ -2612,7 +2612,7 @@
   case 90: /* ltype: %empty  */
 #line 531 "parser.y"
       {
-	#line 3790 "format.w"
+	#line 3792 "format.w"
 	(yyval.info)= 1;}
 #line 2618 "parser.c"
     break;
@@ -2620,7 +2620,7 @@
   case 91: /* ltype: "align"  */
 #line 533 "parser.y"
                       {
-	#line 3790 "format.w"
+	#line 3792 "format.w"
 	(yyval.info)= 1;}
 #line 2626 "parser.c"
     break;
@@ -2628,7 +2628,7 @@
   case 92: /* ltype: "center"  */
 #line 535 "parser.y"
                        {
-	#line 3790 "format.w"
+	#line 3792 "format.w"
 	(yyval.info)= 2;}
 #line 2634 "parser.c"
     break;
@@ -2636,7 +2636,7 @@
   case 93: /* ltype: "expand"  */
 #line 537 "parser.y"
                        {
-	#line 3790 "format.w"
+	#line 3792 "format.w"
 	(yyval.info)= 3;}
 #line 2642 "parser.c"
     break;
@@ -2644,7 +2644,7 @@
   case 94: /* leaders: glue_node ltype rule_node  */
 #line 540 "parser.y"
                                  {
-	#line 3791 "format.w"
+	#line 3793 "format.w"
 	if((yyvsp[-2].b))(yyval.info)= (yyvsp[-1].info)	|b100;else (yyval.info)= (yyvsp[-1].info);}
 #line 2650 "parser.c"
     break;
@@ -2652,7 +2652,7 @@
   case 95: /* leaders: glue_node ltype hbox_node  */
 #line 543 "parser.y"
                                   {
-	#line 3792 "format.w"
+	#line 3794 "format.w"
 	if((yyvsp[-2].b))(yyval.info)= (yyvsp[-1].info)	|b100;else (yyval.info)= (yyvsp[-1].info);}
 #line 2658 "parser.c"
     break;
@@ -2660,7 +2660,7 @@
   case 96: /* leaders: glue_node ltype vbox_node  */
 #line 546 "parser.y"
                                   {
-	#line 3793 "format.w"
+	#line 3795 "format.w"
 	if((yyvsp[-2].b))(yyval.info)= (yyvsp[-1].info)	|b100;else (yyval.info)= (yyvsp[-1].info);}
 #line 2666 "parser.c"
     break;
@@ -2668,7 +2668,7 @@
   case 97: /* content_node: start "leaders" leaders ">"  */
 #line 549 "parser.y"
                                       {
-	#line 3794 "format.w"
+	#line 3796 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(leaders_kind,(yyvsp[-1].info)));}
 #line 2674 "parser.c"
     break;
@@ -2676,7 +2676,7 @@
   case 98: /* $@4: %empty  */
 #line 553 "parser.y"
                   {
-	#line 3900 "format.w"
+	#line 3902 "format.w"
 	if((yyvsp[0].d)!=0)HPUT32((yyvsp[0].d));}
 #line 2682 "parser.c"
     break;
@@ -2684,7 +2684,7 @@
   case 99: /* baseline: dimension $@4 glue_node glue_node  */
 #line 556 "parser.y"
                    {
-	#line 3901 "format.w"
+	#line 3903 "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;
@@ -2695,7 +2695,7 @@
   case 100: /* content_node: start "baseline" baseline ">"  */
 #line 563 "parser.y"
 {
-	#line 3906 "format.w"
+	#line 3908 "format.w"
 	if((yyvsp[-1].info)==b000)HPUT8(0);hput_tags((yyvsp[-3].u),TAG(baseline_kind,(yyvsp[-1].info)));}
 #line 2701 "parser.c"
     break;
@@ -2703,7 +2703,7 @@
   case 102: /* cc_list: cc_list TXT_CC  */
 #line 567 "parser.y"
                                {
-	#line 3989 "format.w"
+	#line 3991 "format.w"
 	hput_utf8((yyvsp[0].u));}
 #line 2709 "parser.c"
     break;
@@ -2711,7 +2711,7 @@
   case 103: /* lig_cc: UNSIGNED  */
 #line 570 "parser.y"
                {
-	#line 3990 "format.w"
+	#line 3992 "format.w"
 	RNG("UTF-8 code",(yyvsp[0].u),0,0x1FFFFF);(yyval.u)= hpos-hstart;hput_utf8((yyvsp[0].u));}
 #line 2717 "parser.c"
     break;
@@ -2719,7 +2719,7 @@
   case 104: /* lig_cc: CHARCODE  */
 #line 573 "parser.y"
                {
-	#line 3991 "format.w"
+	#line 3993 "format.w"
 	(yyval.u)= hpos-hstart;hput_utf8((yyvsp[0].u));}
 #line 2725 "parser.c"
     break;
@@ -2727,7 +2727,7 @@
   case 105: /* ref: REFERENCE  */
 #line 576 "parser.y"
              {
-	#line 3992 "format.w"
+	#line 3994 "format.w"
 	HPUT8((yyvsp[0].u));(yyval.u)= (yyvsp[0].u);}
 #line 2733 "parser.c"
     break;
@@ -2735,7 +2735,7 @@
   case 106: /* $@5: %empty  */
 #line 579 "parser.y"
             {
-	#line 3993 "format.w"
+	#line 3995 "format.w"
 	REF(font_kind,(yyvsp[0].u));}
 #line 2741 "parser.c"
     break;
@@ -2743,7 +2743,7 @@
   case 107: /* ligature: ref $@5 lig_cc TXT_START cc_list TXT_END  */
 #line 582 "parser.y"
 {
-	#line 3994 "format.w"
+	#line 3996 "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 2750 "parser.c"
@@ -2752,7 +2752,7 @@
   case 108: /* content_node: start "ligature" ligature ">"  */
 #line 586 "parser.y"
                                         {
-	#line 3996 "format.w"
+	#line 3998 "format.w"
 	hput_tags((yyvsp[-3].u),hput_ligature(&((yyvsp[-1].lg))));}
 #line 2758 "parser.c"
     break;
@@ -2760,7 +2760,7 @@
   case 109: /* replace_count: explicit  */
 #line 590 "parser.y"
                       {
-	#line 4106 "format.w"
+	#line 4108 "format.w"
 	if((yyvsp[0].b)){(yyval.u)= 0x80;HPUT8(0x80);}else (yyval.u)= 0x00;}
 #line 2766 "parser.c"
     break;
@@ -2768,7 +2768,7 @@
   case 110: /* replace_count: explicit UNSIGNED  */
 #line 593 "parser.y"
                           {
-	#line 4107 "format.w"
+	#line 4109 "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 2775 "parser.c"
@@ -2777,7 +2777,7 @@
   case 111: /* disc: replace_count list list  */
 #line 597 "parser.y"
                             {
-	#line 4109 "format.w"
+	#line 4111 "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 2784 "parser.c"
@@ -2786,7 +2786,7 @@
   case 112: /* disc: replace_count list  */
 #line 601 "parser.y"
                            {
-	#line 4111 "format.w"
+	#line 4113 "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 2792 "parser.c"
     break;
@@ -2794,7 +2794,7 @@
   case 113: /* disc: replace_count  */
 #line 604 "parser.y"
                       {
-	#line 4112 "format.w"
+	#line 4114 "format.w"
 	(yyval.dc).r= (yyvsp[0].u);(yyval.dc).p.s= 0;(yyval.dc).q.s= 0;}
 #line 2800 "parser.c"
     break;
@@ -2802,7 +2802,7 @@
   case 114: /* disc_node: start "disc" disc ">"  */
 #line 610 "parser.y"
 {
-	#line 4116 "format.w"
+	#line 4118 "format.w"
 	hput_tags((yyvsp[-3].u),hput_disc(&((yyvsp[-1].dc))));}
 #line 2808 "parser.c"
     break;
@@ -2810,7 +2810,7 @@
   case 116: /* par_dimen: xdimen  */
 #line 616 "parser.y"
                 {
-	#line 4268 "format.w"
+	#line 4270 "format.w"
 	hput_xdimen_node(&((yyvsp[0].xd)));}
 #line 2816 "parser.c"
     break;
@@ -2818,7 +2818,7 @@
   case 117: /* par: xdimen_ref param_ref list  */
 #line 619 "parser.y"
                              {
-	#line 4269 "format.w"
+	#line 4271 "format.w"
 	(yyval.info)= b000;}
 #line 2824 "parser.c"
     break;
@@ -2826,7 +2826,7 @@
   case 118: /* par: xdimen_ref empty_param_list non_empty_param_list list  */
 #line 622 "parser.y"
                                                               {
-	#line 4270 "format.w"
+	#line 4272 "format.w"
 	(yyval.info)= b010;}
 #line 2832 "parser.c"
     break;
@@ -2834,7 +2834,7 @@
   case 119: /* par: xdimen_ref empty_param_list list  */
 #line 625 "parser.y"
                                          {
-	#line 4271 "format.w"
+	#line 4273 "format.w"
 	(yyval.info)= b010;}
 #line 2840 "parser.c"
     break;
@@ -2842,7 +2842,7 @@
   case 120: /* $@6: %empty  */
 #line 628 "parser.y"
                          {
-	#line 4272 "format.w"
+	#line 4274 "format.w"
 	hput_xdimen_node(&((yyvsp[-1].xd)));}
 #line 2848 "parser.c"
     break;
@@ -2850,7 +2850,7 @@
   case 121: /* par: xdimen param_ref $@6 list  */
 #line 630 "parser.y"
                                      {
-	#line 4272 "format.w"
+	#line 4274 "format.w"
 	(yyval.info)= b100;}
 #line 2856 "parser.c"
     break;
@@ -2858,7 +2858,7 @@
   case 122: /* par: par_dimen empty_param_list non_empty_param_list list  */
 #line 633 "parser.y"
                                                              {
-	#line 4273 "format.w"
+	#line 4275 "format.w"
 	(yyval.info)= b110;}
 #line 2864 "parser.c"
     break;
@@ -2866,7 +2866,7 @@
   case 123: /* par: par_dimen empty_param_list list  */
 #line 636 "parser.y"
                                         {
-	#line 4274 "format.w"
+	#line 4276 "format.w"
 	(yyval.info)= b110;}
 #line 2872 "parser.c"
     break;
@@ -2874,7 +2874,7 @@
   case 124: /* content_node: start "par" par ">"  */
 #line 640 "parser.y"
                               {
-	#line 4276 "format.w"
+	#line 4278 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(par_kind,(yyvsp[-1].info)));}
 #line 2880 "parser.c"
     break;
@@ -2882,7 +2882,7 @@
   case 125: /* math: param_ref list  */
 #line 644 "parser.y"
                    {
-	#line 4342 "format.w"
+	#line 4344 "format.w"
 	(yyval.info)= b000;}
 #line 2888 "parser.c"
     break;
@@ -2890,7 +2890,7 @@
   case 126: /* math: param_ref list hbox_node  */
 #line 647 "parser.y"
                                  {
-	#line 4343 "format.w"
+	#line 4345 "format.w"
 	(yyval.info)= b001;}
 #line 2896 "parser.c"
     break;
@@ -2898,7 +2898,7 @@
   case 127: /* math: param_ref hbox_node list  */
 #line 650 "parser.y"
                                  {
-	#line 4344 "format.w"
+	#line 4346 "format.w"
 	(yyval.info)= b010;}
 #line 2904 "parser.c"
     break;
@@ -2906,7 +2906,7 @@
   case 128: /* math: empty_param_list list  */
 #line 653 "parser.y"
                               {
-	#line 4345 "format.w"
+	#line 4347 "format.w"
 	(yyval.info)= b100;}
 #line 2912 "parser.c"
     break;
@@ -2914,7 +2914,7 @@
   case 129: /* math: empty_param_list list hbox_node  */
 #line 656 "parser.y"
                                         {
-	#line 4346 "format.w"
+	#line 4348 "format.w"
 	(yyval.info)= b101;}
 #line 2920 "parser.c"
     break;
@@ -2922,7 +2922,7 @@
   case 130: /* math: empty_param_list hbox_node list  */
 #line 659 "parser.y"
                                         {
-	#line 4347 "format.w"
+	#line 4349 "format.w"
 	(yyval.info)= b110;}
 #line 2928 "parser.c"
     break;
@@ -2930,7 +2930,7 @@
   case 131: /* math: empty_param_list non_empty_param_list list  */
 #line 662 "parser.y"
                                                    {
-	#line 4348 "format.w"
+	#line 4350 "format.w"
 	(yyval.info)= b100;}
 #line 2936 "parser.c"
     break;
@@ -2938,7 +2938,7 @@
   case 132: /* math: empty_param_list non_empty_param_list list hbox_node  */
 #line 665 "parser.y"
                                                              {
-	#line 4349 "format.w"
+	#line 4351 "format.w"
 	(yyval.info)= b101;}
 #line 2944 "parser.c"
     break;
@@ -2946,7 +2946,7 @@
   case 133: /* math: empty_param_list non_empty_param_list hbox_node list  */
 #line 668 "parser.y"
                                                              {
-	#line 4350 "format.w"
+	#line 4352 "format.w"
 	(yyval.info)= b110;}
 #line 2952 "parser.c"
     break;
@@ -2954,7 +2954,7 @@
   case 134: /* content_node: start "math" math ">"  */
 #line 672 "parser.y"
                                 {
-	#line 4352 "format.w"
+	#line 4354 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(math_kind,(yyvsp[-1].info)));}
 #line 2960 "parser.c"
     break;
@@ -2962,7 +2962,7 @@
   case 135: /* on_off: "on"  */
 #line 676 "parser.y"
          {
-	#line 4402 "format.w"
+	#line 4404 "format.w"
 	(yyval.i)= 1;}
 #line 2968 "parser.c"
     break;
@@ -2970,7 +2970,7 @@
   case 136: /* on_off: "off"  */
 #line 678 "parser.y"
                     {
-	#line 4402 "format.w"
+	#line 4404 "format.w"
 	(yyval.i)= 0;}
 #line 2976 "parser.c"
     break;
@@ -2978,7 +2978,7 @@
   case 137: /* math: on_off  */
 #line 681 "parser.y"
            {
-	#line 4403 "format.w"
+	#line 4405 "format.w"
 	(yyval.info)= b011	|((yyvsp[0].i)<<2);}
 #line 2984 "parser.c"
     break;
@@ -2986,7 +2986,7 @@
   case 138: /* content_node: start "adjust" list ">"  */
 #line 685 "parser.y"
                                   {
-	#line 4434 "format.w"
+	#line 4436 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(adjust_kind,1));}
 #line 2992 "parser.c"
     break;
@@ -2994,7 +2994,7 @@
   case 139: /* span_count: UNSIGNED  */
 #line 689 "parser.y"
                    {
-	#line 4533 "format.w"
+	#line 4535 "format.w"
 	(yyval.info)= hput_span_count((yyvsp[0].u));}
 #line 3000 "parser.c"
     break;
@@ -3002,7 +3002,7 @@
   case 140: /* content_node: start "item" content_node ">"  */
 #line 692 "parser.y"
                                         {
-	#line 4534 "format.w"
+	#line 4536 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(item_kind,1));}
 #line 3008 "parser.c"
     break;
@@ -3010,7 +3010,7 @@
   case 141: /* content_node: start "item" span_count content_node ">"  */
 #line 695 "parser.y"
                                                    {
-	#line 4535 "format.w"
+	#line 4537 "format.w"
 	hput_tags((yyvsp[-4].u),TAG(item_kind,(yyvsp[-2].info)));}
 #line 3016 "parser.c"
     break;
@@ -3018,7 +3018,7 @@
   case 142: /* content_node: start "item" list ">"  */
 #line 698 "parser.y"
                                 {
-	#line 4536 "format.w"
+	#line 4538 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(item_kind,b000));}
 #line 3024 "parser.c"
     break;
@@ -3026,7 +3026,7 @@
   case 143: /* table: "h" box_goal list list  */
 #line 702 "parser.y"
                           {
-	#line 4538 "format.w"
+	#line 4540 "format.w"
 	(yyval.info)= (yyvsp[-2].info);}
 #line 3032 "parser.c"
     break;
@@ -3034,7 +3034,7 @@
   case 144: /* table: "v" box_goal list list  */
 #line 705 "parser.y"
                           {
-	#line 4539 "format.w"
+	#line 4541 "format.w"
 	(yyval.info)= (yyvsp[-2].info)	|b010;}
 #line 3040 "parser.c"
     break;
@@ -3042,7 +3042,7 @@
   case 145: /* content_node: start "table" table ">"  */
 #line 709 "parser.y"
                                   {
-	#line 4541 "format.w"
+	#line 4543 "format.w"
 	hput_tags((yyvsp[-3].u),TAG(table_kind,(yyvsp[-1].info)));}
 #line 3048 "parser.c"
     break;
@@ -3050,7 +3050,7 @@
   case 146: /* image_dimen: dimension dimension  */
 #line 713 "parser.y"
                                {
-	#line 4629 "format.w"
+	#line 4631 "format.w"
 	(yyval.x).w= (yyvsp[-1].d);(yyval.x).h= (yyvsp[0].d);}
 #line 3056 "parser.c"
     break;
@@ -3058,7 +3058,7 @@
   case 147: /* image_dimen: %empty  */
 #line 715 "parser.y"
                                  {
-	#line 4629 "format.w"
+	#line 4631 "format.w"
 	(yyval.x).w= (yyval.x).h= 0;}
 #line 3064 "parser.c"
     break;
@@ -3066,7 +3066,7 @@
   case 148: /* image: UNSIGNED image_dimen plus minus  */
 #line 718 "parser.y"
                                      {
-	#line 4630 "format.w"
+	#line 4632 "format.w"
 	(yyval.x).w= (yyvsp[-2].x).w;(yyval.x).h= (yyvsp[-2].x).h;(yyval.x).p= (yyvsp[-1].st);(yyval.x).m= (yyvsp[0].st);RNG("Section number",(yyvsp[-3].u),3,max_section_no);(yyval.x).n= (yyvsp[-3].u);}
 #line 3072 "parser.c"
     break;
@@ -3074,7 +3074,7 @@
   case 149: /* content_node: start "image" image ">"  */
 #line 721 "parser.y"
                                   {
-	#line 4631 "format.w"
+	#line 4633 "format.w"
 	hput_tags((yyvsp[-3].u),hput_image(&((yyvsp[-1].x))));}
 #line 3080 "parser.c"
     break;
@@ -3082,7 +3082,7 @@
   case 150: /* max_value: "outline" UNSIGNED  */
 #line 725 "parser.y"
                           {
-	#line 4868 "format.w"
+	#line 4870 "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);
@@ -3093,7 +3093,7 @@
   case 151: /* placement: "top"  */
 #line 732 "parser.y"
              {
-	#line 4960 "format.w"
+	#line 4962 "format.w"
 	(yyval.i)= LABEL_TOP;}
 #line 3099 "parser.c"
     break;
@@ -3101,7 +3101,7 @@
   case 152: /* placement: "bot"  */
 #line 734 "parser.y"
                             {
-	#line 4960 "format.w"
+	#line 4962 "format.w"
 	(yyval.i)= LABEL_BOT;}
 #line 3107 "parser.c"
     break;
@@ -3109,7 +3109,7 @@
   case 153: /* placement: "mid"  */
 #line 736 "parser.y"
                             {
-	#line 4960 "format.w"
+	#line 4962 "format.w"
 	(yyval.i)= LABEL_MID;}
 #line 3115 "parser.c"
     break;
@@ -3117,7 +3117,7 @@
   case 154: /* placement: %empty  */
 #line 738 "parser.y"
                          {
-	#line 4960 "format.w"
+	#line 4962 "format.w"
 	(yyval.i)= LABEL_MID;}
 #line 3123 "parser.c"
     break;
@@ -3125,7 +3125,7 @@
   case 155: /* content_node: "<" "label" REFERENCE placement ">"  */
 #line 742 "parser.y"
 {
-	#line 4962 "format.w"
+	#line 4964 "format.w"
 	hset_label((yyvsp[-2].u),(yyvsp[-1].i));}
 #line 3131 "parser.c"
     break;
@@ -3133,7 +3133,7 @@
   case 156: /* content_node: start "link" REFERENCE on_off ">"  */
 #line 747 "parser.y"
 {
-	#line 5220 "format.w"
+	#line 5222 "format.w"
 	hput_tags((yyvsp[-4].u),hput_link((yyvsp[-2].u),(yyvsp[-1].i)));}
 #line 3139 "parser.c"
     break;
@@ -3141,7 +3141,7 @@
   case 157: /* def_node: "<" "outline" REFERENCE integer position list ">"  */
 #line 751 "parser.y"
                                                           {
-	#line 5350 "format.w"
+	#line 5352 "format.w"
 	
 	static int outline_no= -1;
 	(yyval.rf).k= outline_kind;(yyval.rf).n= (yyvsp[-4].u);
@@ -3155,7 +3155,7 @@
   case 158: /* stream_link: ref  */
 #line 761 "parser.y"
                {
-	#line 5765 "format.w"
+	#line 5767 "format.w"
 	REF_RNG(stream_kind,(yyvsp[0].u));}
 #line 3161 "parser.c"
     break;
@@ -3163,7 +3163,7 @@
   case 159: /* stream_link: "*"  */
 #line 763 "parser.y"
                                                     {
-	#line 5765 "format.w"
+	#line 5767 "format.w"
 	HPUT8(255);}
 #line 3169 "parser.c"
     break;
@@ -3171,7 +3171,7 @@
   case 160: /* stream_split: stream_link stream_link UNSIGNED  */
 #line 766 "parser.y"
                                              {
-	#line 5766 "format.w"
+	#line 5768 "format.w"
 	RNG("split ratio",(yyvsp[0].u),0,1000);HPUT16((yyvsp[0].u));}
 #line 3177 "parser.c"
     break;
@@ -3179,7 +3179,7 @@
   case 161: /* $@7: %empty  */
 #line 769 "parser.y"
                                 {
-	#line 5767 "format.w"
+	#line 5769 "format.w"
 	RNG("magnification factor",(yyvsp[0].u),0,1000);HPUT16((yyvsp[0].u));}
 #line 3185 "parser.c"
     break;
@@ -3187,7 +3187,7 @@
   case 163: /* stream_type: stream_info  */
 #line 773 "parser.y"
                        {
-	#line 5769 "format.w"
+	#line 5771 "format.w"
 	(yyval.info)= 0;}
 #line 3193 "parser.c"
     break;
@@ -3195,7 +3195,7 @@
   case 164: /* stream_type: "first"  */
 #line 775 "parser.y"
                       {
-	#line 5769 "format.w"
+	#line 5771 "format.w"
 	(yyval.info)= 1;}
 #line 3201 "parser.c"
     break;
@@ -3203,7 +3203,7 @@
   case 165: /* stream_type: "last"  */
 #line 777 "parser.y"
                      {
-	#line 5769 "format.w"
+	#line 5771 "format.w"
 	(yyval.info)= 2;}
 #line 3209 "parser.c"
     break;
@@ -3211,7 +3211,7 @@
   case 166: /* stream_type: "top"  */
 #line 779 "parser.y"
                     {
-	#line 5769 "format.w"
+	#line 5771 "format.w"
 	(yyval.info)= 3;}
 #line 3217 "parser.c"
     break;
@@ -3219,7 +3219,7 @@
   case 167: /* stream_def_node: start "stream (definition)" ref stream_type list xdimen_node glue_node list glue_node ">"  */
 #line 785 "parser.y"
 {
-	#line 5773 "format.w"
+	#line 5775 "format.w"
 	DEF((yyval.rf),stream_kind,(yyvsp[-7].u));hput_tags((yyvsp[-9].u),TAG(stream_kind,(yyvsp[-6].info)	|b100));}
 #line 3225 "parser.c"
     break;
@@ -3227,7 +3227,7 @@
   case 168: /* stream_ins_node: start "stream (definition)" ref ">"  */
 #line 790 "parser.y"
 {
-	#line 5776 "format.w"
+	#line 5778 "format.w"
 	RNG("Stream insertion",(yyvsp[-1].u),0,max_ref[stream_kind]);hput_tags((yyvsp[-3].u),TAG(stream_kind,b100));}
 #line 3233 "parser.c"
     break;
@@ -3235,7 +3235,7 @@
   case 171: /* stream: empty_param_list list  */
 #line 796 "parser.y"
                             {
-	#line 5871 "format.w"
+	#line 5873 "format.w"
 	(yyval.info)= b010;}
 #line 3241 "parser.c"
     break;
@@ -3243,7 +3243,7 @@
   case 172: /* stream: empty_param_list non_empty_param_list list  */
 #line 799 "parser.y"
                                                    {
-	#line 5872 "format.w"
+	#line 5874 "format.w"
 	(yyval.info)= b010;}
 #line 3249 "parser.c"
     break;
@@ -3251,7 +3251,7 @@
   case 173: /* stream: param_ref list  */
 #line 802 "parser.y"
                        {
-	#line 5873 "format.w"
+	#line 5875 "format.w"
 	(yyval.info)= b000;}
 #line 3257 "parser.c"
     break;
@@ -3259,7 +3259,7 @@
   case 174: /* content_node: start "stream" stream_ref stream ">"  */
 #line 806 "parser.y"
 {
-	#line 5875 "format.w"
+	#line 5877 "format.w"
 	hput_tags((yyvsp[-4].u),TAG(stream_kind,(yyvsp[-1].info)));}
 #line 3265 "parser.c"
     break;
@@ -3267,7 +3267,7 @@
   case 175: /* page_priority: %empty  */
 #line 810 "parser.y"
               {
-	#line 5978 "format.w"
+	#line 5980 "format.w"
 	HPUT8(1);}
 #line 3273 "parser.c"
     break;
@@ -3275,7 +3275,7 @@
   case 176: /* page_priority: UNSIGNED  */
 #line 813 "parser.y"
                  {
-	#line 5979 "format.w"
+	#line 5981 "format.w"
 	RNG("page priority",(yyvsp[0].u),0,255);HPUT8((yyvsp[0].u));}
 #line 3281 "parser.c"
     break;
@@ -3283,7 +3283,7 @@
   case 179: /* $@8: %empty  */
 #line 819 "parser.y"
            {
-	#line 5983 "format.w"
+	#line 5985 "format.w"
 	hput_string((yyvsp[0].s));}
 #line 3289 "parser.c"
     break;
@@ -3291,7 +3291,7 @@
   case 180: /* $@9: %empty  */
 #line 821 "parser.y"
                                                           {
-	#line 5983 "format.w"
+	#line 5985 "format.w"
 	HPUT32((yyvsp[0].d));}
 #line 3297 "parser.c"
     break;
@@ -3299,7 +3299,7 @@
   case 182: /* content_node: "<" "range" REFERENCE "on" ">"  */
 #line 828 "parser.y"
                                          {
-	#line 6095 "format.w"
+	#line 6097 "format.w"
 	REF(page_kind,(yyvsp[-2].u));hput_range((yyvsp[-2].u),true);}
 #line 3305 "parser.c"
     break;
@@ -3307,7 +3307,7 @@
   case 183: /* content_node: "<" "range" REFERENCE "off" ">"  */
 #line 831 "parser.y"
                                       {
-	#line 6096 "format.w"
+	#line 6098 "format.w"
 	REF(page_kind,(yyvsp[-2].u));hput_range((yyvsp[-2].u),false);}
 #line 3313 "parser.c"
     break;
@@ -3315,7 +3315,7 @@
   case 185: /* $@10: %empty  */
 #line 837 "parser.y"
                                           {
-	#line 6786 "format.w"
+	#line 6788 "format.w"
 	new_directory((yyvsp[0].u)+1);new_output_buffers();}
 #line 3321 "parser.c"
     break;
@@ -3323,7 +3323,7 @@
   case 189: /* entry: "<" "entry" UNSIGNED string ">"  */
 #line 842 "parser.y"
 {
-	#line 6789 "format.w"
+	#line 6791 "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 3329 "parser.c"
     break;
@@ -3331,7 +3331,7 @@
   case 190: /* $@11: %empty  */
 #line 846 "parser.y"
                                     {
-	#line 7277 "format.w"
+	#line 7326 "format.w"
 	hput_definitions_start();}
 #line 3337 "parser.c"
     break;
@@ -3339,7 +3339,7 @@
   case 191: /* definition_section: "<" "definitions" $@11 max_definitions definition_list ">"  */
 #line 850 "parser.y"
    {
-	#line 7279 "format.w"
+	#line 7328 "format.w"
 	hput_definitions_end();}
 #line 3345 "parser.c"
     break;
@@ -3347,7 +3347,7 @@
   case 194: /* max_definitions: "<" "max" max_list ">"  */
 #line 856 "parser.y"
 {
-	#line 7395 "format.w"
+	#line 7444 "format.w"
 		/*245:*/
 	if(max_ref[label_kind]>=0)
 	ALLOCATE(labels,max_ref[label_kind]+1,label_t);
@@ -3357,7 +3357,7 @@
 		/*:266*/	/*293:*/
 	ALLOCATE(page_on,max_ref[page_kind]+1,int);
 	ALLOCATE(range_pos,2*(max_ref[range_kind]+1),range_pos_t);
-		/*:293*/	/*357:*/
+		/*:293*/	/*359:*/
 	definition_bits[0][int_kind]= (1<<(MAX_INT_DEFAULT+1))-1;
 	definition_bits[0][dimen_kind]= (1<<(MAX_DIMEN_DEFAULT+1))-1;
 	definition_bits[0][xdimen_kind]= (1<<(MAX_XDIMEN_DEFAULT+1))-1;
@@ -3366,9 +3366,9 @@
 	definition_bits[0][page_kind]= (1<<(MAX_PAGE_DEFAULT+1))-1;
 	definition_bits[0][stream_kind]= (1<<(MAX_STREAM_DEFAULT+1))-1;
 	definition_bits[0][range_kind]= (1<<(MAX_RANGE_DEFAULT+1))-1;
-		/*:357*/	/*372:*/
+		/*:359*/	/*374:*/
 	ALLOCATE(hfont_name,max_ref[font_kind]+1,char*);
-		/*:372*/hput_max_definitions();}
+		/*:374*/hput_max_definitions();}
 #line 3373 "parser.c"
     break;
 
@@ -3375,7 +3375,7 @@
   case 197: /* max_value: "font" UNSIGNED  */
 #line 882 "parser.y"
                        {
-	#line 7399 "format.w"
+	#line 7448 "format.w"
 	hset_max(font_kind,(yyvsp[0].u));}
 #line 3381 "parser.c"
     break;
@@ -3383,7 +3383,7 @@
   case 198: /* max_value: "int" UNSIGNED  */
 #line 885 "parser.y"
                          {
-	#line 7400 "format.w"
+	#line 7449 "format.w"
 	hset_max(int_kind,(yyvsp[0].u));}
 #line 3389 "parser.c"
     break;
@@ -3391,7 +3391,7 @@
   case 199: /* max_value: "dimen" UNSIGNED  */
 #line 888 "parser.y"
                        {
-	#line 7401 "format.w"
+	#line 7450 "format.w"
 	hset_max(dimen_kind,(yyvsp[0].u));}
 #line 3397 "parser.c"
     break;
@@ -3399,7 +3399,7 @@
   case 200: /* max_value: "ligature" UNSIGNED  */
 #line 891 "parser.y"
                           {
-	#line 7402 "format.w"
+	#line 7451 "format.w"
 	hset_max(ligature_kind,(yyvsp[0].u));}
 #line 3405 "parser.c"
     break;
@@ -3407,7 +3407,7 @@
   case 201: /* max_value: "disc" UNSIGNED  */
 #line 894 "parser.y"
                       {
-	#line 7403 "format.w"
+	#line 7452 "format.w"
 	hset_max(disc_kind,(yyvsp[0].u));}
 #line 3413 "parser.c"
     break;
@@ -3415,7 +3415,7 @@
   case 202: /* max_value: "glue" UNSIGNED  */
 #line 897 "parser.y"
                       {
-	#line 7404 "format.w"
+	#line 7453 "format.w"
 	hset_max(glue_kind,(yyvsp[0].u));}
 #line 3421 "parser.c"
     break;
@@ -3423,7 +3423,7 @@
   case 203: /* max_value: "language" UNSIGNED  */
 #line 900 "parser.y"
                           {
-	#line 7405 "format.w"
+	#line 7454 "format.w"
 	hset_max(language_kind,(yyvsp[0].u));}
 #line 3429 "parser.c"
     break;
@@ -3431,7 +3431,7 @@
   case 204: /* max_value: "rule" UNSIGNED  */
 #line 903 "parser.y"
                       {
-	#line 7406 "format.w"
+	#line 7455 "format.w"
 	hset_max(rule_kind,(yyvsp[0].u));}
 #line 3437 "parser.c"
     break;
@@ -3439,7 +3439,7 @@
   case 205: /* max_value: "image" UNSIGNED  */
 #line 906 "parser.y"
                        {
-	#line 7407 "format.w"
+	#line 7456 "format.w"
 	hset_max(image_kind,(yyvsp[0].u));}
 #line 3445 "parser.c"
     break;
@@ -3447,7 +3447,7 @@
   case 206: /* max_value: "leaders" UNSIGNED  */
 #line 909 "parser.y"
                          {
-	#line 7408 "format.w"
+	#line 7457 "format.w"
 	hset_max(leaders_kind,(yyvsp[0].u));}
 #line 3453 "parser.c"
     break;
@@ -3455,7 +3455,7 @@
   case 207: /* max_value: "baseline" UNSIGNED  */
 #line 912 "parser.y"
                           {
-	#line 7409 "format.w"
+	#line 7458 "format.w"
 	hset_max(baseline_kind,(yyvsp[0].u));}
 #line 3461 "parser.c"
     break;
@@ -3463,7 +3463,7 @@
   case 208: /* max_value: "xdimen" UNSIGNED  */
 #line 915 "parser.y"
                         {
-	#line 7410 "format.w"
+	#line 7459 "format.w"
 	hset_max(xdimen_kind,(yyvsp[0].u));}
 #line 3469 "parser.c"
     break;
@@ -3471,7 +3471,7 @@
   case 209: /* max_value: "param" UNSIGNED  */
 #line 918 "parser.y"
                        {
-	#line 7411 "format.w"
+	#line 7460 "format.w"
 	hset_max(param_kind,(yyvsp[0].u));}
 #line 3477 "parser.c"
     break;
@@ -3479,7 +3479,7 @@
   case 210: /* max_value: "stream (definition)" UNSIGNED  */
 #line 921 "parser.y"
                            {
-	#line 7412 "format.w"
+	#line 7461 "format.w"
 	hset_max(stream_kind,(yyvsp[0].u));}
 #line 3485 "parser.c"
     break;
@@ -3487,7 +3487,7 @@
   case 211: /* max_value: "page" UNSIGNED  */
 #line 924 "parser.y"
                       {
-	#line 7413 "format.w"
+	#line 7462 "format.w"
 	hset_max(page_kind,(yyvsp[0].u));}
 #line 3493 "parser.c"
     break;
@@ -3495,7 +3495,7 @@
   case 212: /* max_value: "range" UNSIGNED  */
 #line 927 "parser.y"
                        {
-	#line 7414 "format.w"
+	#line 7463 "format.w"
 	hset_max(range_kind,(yyvsp[0].u));}
 #line 3501 "parser.c"
     break;
@@ -3503,7 +3503,7 @@
   case 213: /* max_value: "label" UNSIGNED  */
 #line 930 "parser.y"
                        {
-	#line 7415 "format.w"
+	#line 7464 "format.w"
 	hset_max(label_kind,(yyvsp[0].u));}
 #line 3509 "parser.c"
     break;
@@ -3511,7 +3511,7 @@
   case 214: /* def_node: start "font" ref font ">"  */
 #line 936 "parser.y"
                        {
-	#line 7612 "format.w"
+	#line 7661 "format.w"
 	DEF((yyval.rf),font_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),(yyvsp[-1].info));}
 #line 3517 "parser.c"
     break;
@@ -3519,7 +3519,7 @@
   case 215: /* def_node: start "int" ref integer ">"  */
 #line 939 "parser.y"
                                       {
-	#line 7613 "format.w"
+	#line 7662 "format.w"
 	DEF((yyval.rf),int_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_int((yyvsp[-1].i)));}
 #line 3525 "parser.c"
     break;
@@ -3527,7 +3527,7 @@
   case 216: /* def_node: start "dimen" ref dimension ">"  */
 #line 942 "parser.y"
                                       {
-	#line 7614 "format.w"
+	#line 7663 "format.w"
 	DEF((yyval.rf),dimen_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_dimen((yyvsp[-1].d)));}
 #line 3533 "parser.c"
     break;
@@ -3535,7 +3535,7 @@
   case 217: /* def_node: start "language" ref string ">"  */
 #line 945 "parser.y"
                                       {
-	#line 7615 "format.w"
+	#line 7664 "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 3541 "parser.c"
     break;
@@ -3543,7 +3543,7 @@
   case 218: /* def_node: start "glue" ref glue ">"  */
 #line 948 "parser.y"
                                 {
-	#line 7616 "format.w"
+	#line 7665 "format.w"
 	DEF((yyval.rf),glue_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_glue(&((yyvsp[-1].g))));}
 #line 3549 "parser.c"
     break;
@@ -3551,7 +3551,7 @@
   case 219: /* def_node: start "xdimen" ref xdimen ">"  */
 #line 951 "parser.y"
                                     {
-	#line 7617 "format.w"
+	#line 7666 "format.w"
 	DEF((yyval.rf),xdimen_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_xdimen(&((yyvsp[-1].xd))));}
 #line 3557 "parser.c"
     break;
@@ -3559,7 +3559,7 @@
   case 220: /* def_node: start "rule" ref rule ">"  */
 #line 954 "parser.y"
                                 {
-	#line 7618 "format.w"
+	#line 7667 "format.w"
 	DEF((yyval.rf),rule_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_rule(&((yyvsp[-1].r))));}
 #line 3565 "parser.c"
     break;
@@ -3567,7 +3567,7 @@
   case 221: /* def_node: start "leaders" ref leaders ">"  */
 #line 957 "parser.y"
                                       {
-	#line 7619 "format.w"
+	#line 7668 "format.w"
 	DEF((yyval.rf),leaders_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),TAG(leaders_kind,(yyvsp[-1].info)));}
 #line 3573 "parser.c"
     break;
@@ -3575,7 +3575,7 @@
   case 222: /* def_node: start "baseline" ref baseline ">"  */
 #line 960 "parser.y"
                                         {
-	#line 7620 "format.w"
+	#line 7669 "format.w"
 	DEF((yyval.rf),baseline_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),TAG(baseline_kind,(yyvsp[-1].info)));}
 #line 3581 "parser.c"
     break;
@@ -3583,7 +3583,7 @@
   case 223: /* def_node: start "ligature" ref ligature ">"  */
 #line 963 "parser.y"
                                         {
-	#line 7621 "format.w"
+	#line 7670 "format.w"
 	DEF((yyval.rf),ligature_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_ligature(&((yyvsp[-1].lg))));}
 #line 3589 "parser.c"
     break;
@@ -3591,7 +3591,7 @@
   case 224: /* def_node: start "disc" ref disc ">"  */
 #line 966 "parser.y"
                                 {
-	#line 7622 "format.w"
+	#line 7671 "format.w"
 	DEF((yyval.rf),disc_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_disc(&((yyvsp[-1].dc))));}
 #line 3597 "parser.c"
     break;
@@ -3599,7 +3599,7 @@
   case 225: /* def_node: start "image" ref image ">"  */
 #line 969 "parser.y"
                                   {
-	#line 7623 "format.w"
+	#line 7672 "format.w"
 	DEF((yyval.rf),image_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),hput_image(&((yyvsp[-1].x))));}
 #line 3605 "parser.c"
     break;
@@ -3607,7 +3607,7 @@
   case 226: /* def_node: start "param" ref parameters ">"  */
 #line 972 "parser.y"
                                        {
-	#line 7624 "format.w"
+	#line 7673 "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 3613 "parser.c"
     break;
@@ -3615,7 +3615,7 @@
   case 227: /* def_node: start "page" ref page ">"  */
 #line 975 "parser.y"
                                 {
-	#line 7625 "format.w"
+	#line 7674 "format.w"
 	DEF((yyval.rf),page_kind,(yyvsp[-2].u));hput_tags((yyvsp[-4].u),TAG(page_kind,0));}
 #line 3621 "parser.c"
     break;
@@ -3623,7 +3623,7 @@
   case 228: /* def_node: start "int" ref ref ">"  */
 #line 980 "parser.y"
                          {
-	#line 7644 "format.w"
+	#line 7693 "format.w"
 	DEF_REF((yyval.rf),int_kind,(yyvsp[-2].u),(yyvsp[-1].u));hput_tags((yyvsp[-4].u),TAG(int_kind,0));}
 #line 3629 "parser.c"
     break;
@@ -3631,7 +3631,7 @@
   case 229: /* def_node: start "dimen" ref ref ">"  */
 #line 983 "parser.y"
                                 {
-	#line 7645 "format.w"
+	#line 7694 "format.w"
 	DEF_REF((yyval.rf),dimen_kind,(yyvsp[-2].u),(yyvsp[-1].u));hput_tags((yyvsp[-4].u),TAG(dimen_kind,0));}
 #line 3637 "parser.c"
     break;
@@ -3639,7 +3639,7 @@
   case 230: /* def_node: start "glue" ref ref ">"  */
 #line 986 "parser.y"
                                {
-	#line 7646 "format.w"
+	#line 7695 "format.w"
 	DEF_REF((yyval.rf),glue_kind,(yyvsp[-2].u),(yyvsp[-1].u));hput_tags((yyvsp[-4].u),TAG(glue_kind,0));}
 #line 3645 "parser.c"
     break;
@@ -3647,7 +3647,7 @@
   case 232: /* def_list: def_list def_node  */
 #line 991 "parser.y"
                           {
-	#line 7760 "format.w"
+	#line 7809 "format.w"
 	check_param_def(&((yyvsp[0].rf)));}
 #line 3653 "parser.c"
     break;
@@ -3655,7 +3655,7 @@
   case 233: /* parameters: estimate def_list  */
 #line 994 "parser.y"
                             {
-	#line 7761 "format.w"
+	#line 7810 "format.w"
 	(yyval.l).p= (yyvsp[0].u);(yyval.l).k= param_kind;(yyval.l).s= (hpos-hstart)-(yyvsp[0].u);}
 #line 3661 "parser.c"
     break;
@@ -3663,7 +3663,7 @@
   case 234: /* empty_param_list: position  */
 #line 998 "parser.y"
                          {
-	#line 7782 "format.w"
+	#line 7831 "format.w"
 	HPUTX(2);hpos++;hput_tags((yyvsp[0].u),TAG(param_kind,1));}
 #line 3669 "parser.c"
     break;
@@ -3671,7 +3671,7 @@
   case 235: /* $@12: %empty  */
 #line 1001 "parser.y"
                                 {
-	#line 7783 "format.w"
+	#line 7832 "format.w"
 	hpos= hpos-2;}
 #line 3677 "parser.c"
     break;
@@ -3679,7 +3679,7 @@
   case 236: /* non_empty_param_list: start "param" $@12 parameters ">"  */
 #line 1004 "parser.y"
 {
-	#line 7784 "format.w"
+	#line 7833 "format.w"
 	hput_tags((yyvsp[-4].u)-2,hput_list((yyvsp[-4].u)-1,&((yyvsp[-1].l))));}
 #line 3685 "parser.c"
     break;
@@ -3687,7 +3687,7 @@
   case 238: /* font_head: string dimension UNSIGNED UNSIGNED  */
 #line 1012 "parser.y"
 {
-	#line 7926 "format.w"
+	#line 7975 "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 3693 "parser.c"
     break;
@@ -3695,7 +3695,7 @@
   case 241: /* font_param: start "penalty" fref penalty ">"  */
 #line 1019 "parser.y"
                               {
-	#line 7931 "format.w"
+	#line 7980 "format.w"
 	hput_tags((yyvsp[-4].u),hput_int((yyvsp[-1].i)));}
 #line 3701 "parser.c"
     break;
@@ -3703,7 +3703,7 @@
   case 242: /* font_param: start "kern" fref kern ">"  */
 #line 1022 "parser.y"
                                  {
-	#line 7932 "format.w"
+	#line 7981 "format.w"
 	hput_tags((yyvsp[-4].u),hput_kern(&((yyvsp[-1].kt))));}
 #line 3709 "parser.c"
     break;
@@ -3711,7 +3711,7 @@
   case 243: /* font_param: start "ligature" fref ligature ">"  */
 #line 1025 "parser.y"
                                          {
-	#line 7933 "format.w"
+	#line 7982 "format.w"
 	hput_tags((yyvsp[-4].u),hput_ligature(&((yyvsp[-1].lg))));}
 #line 3717 "parser.c"
     break;
@@ -3719,7 +3719,7 @@
   case 244: /* font_param: start "disc" fref disc ">"  */
 #line 1028 "parser.y"
                                  {
-	#line 7934 "format.w"
+	#line 7983 "format.w"
 	hput_tags((yyvsp[-4].u),hput_disc(&((yyvsp[-1].dc))));}
 #line 3725 "parser.c"
     break;
@@ -3727,7 +3727,7 @@
   case 245: /* font_param: start "glue" fref glue ">"  */
 #line 1031 "parser.y"
                                  {
-	#line 7935 "format.w"
+	#line 7984 "format.w"
 	hput_tags((yyvsp[-4].u),hput_glue(&((yyvsp[-1].g))));}
 #line 3733 "parser.c"
     break;
@@ -3735,7 +3735,7 @@
   case 246: /* font_param: start "language" fref string ">"  */
 #line 1034 "parser.y"
                                        {
-	#line 7936 "format.w"
+	#line 7985 "format.w"
 	hput_string((yyvsp[-1].s));hput_tags((yyvsp[-4].u),TAG(language_kind,0));}
 #line 3741 "parser.c"
     break;
@@ -3743,7 +3743,7 @@
   case 247: /* font_param: start "rule" fref rule ">"  */
 #line 1037 "parser.y"
                                  {
-	#line 7937 "format.w"
+	#line 7986 "format.w"
 	hput_tags((yyvsp[-4].u),hput_rule(&((yyvsp[-1].r))));}
 #line 3749 "parser.c"
     break;
@@ -3751,7 +3751,7 @@
   case 248: /* font_param: start "image" fref image ">"  */
 #line 1040 "parser.y"
                                    {
-	#line 7938 "format.w"
+	#line 7987 "format.w"
 	hput_tags((yyvsp[-4].u),hput_image(&((yyvsp[-1].x))));}
 #line 3757 "parser.c"
     break;
@@ -3759,7 +3759,7 @@
   case 249: /* fref: ref  */
 #line 1044 "parser.y"
         {
-	#line 7940 "format.w"
+	#line 7989 "format.w"
 	RNG("Font parameter",(yyvsp[0].u),0,MAX_FONT_PARAMS);}
 #line 3765 "parser.c"
     break;
@@ -3767,7 +3767,7 @@
   case 250: /* xdimen_ref: ref  */
 #line 1048 "parser.y"
               {
-	#line 8013 "format.w"
+	#line 8062 "format.w"
 	REF(xdimen_kind,(yyvsp[0].u));}
 #line 3773 "parser.c"
     break;
@@ -3775,7 +3775,7 @@
   case 251: /* param_ref: ref  */
 #line 1051 "parser.y"
              {
-	#line 8014 "format.w"
+	#line 8063 "format.w"
 	REF(param_kind,(yyvsp[0].u));}
 #line 3781 "parser.c"
     break;
@@ -3783,7 +3783,7 @@
   case 252: /* stream_ref: ref  */
 #line 1054 "parser.y"
               {
-	#line 8015 "format.w"
+	#line 8064 "format.w"
 	REF_RNG(stream_kind,(yyvsp[0].u));}
 #line 3789 "parser.c"
     break;
@@ -3791,7 +3791,7 @@
   case 253: /* content_node: start "penalty" ref ">"  */
 #line 1060 "parser.y"
                      {
-	#line 8019 "format.w"
+	#line 8068 "format.w"
 	REF(penalty_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(penalty_kind,0));}
 #line 3797 "parser.c"
     break;
@@ -3799,7 +3799,7 @@
   case 254: /* content_node: start "kern" explicit ref ">"  */
 #line 1064 "parser.y"
 {
-	#line 8021 "format.w"
+	#line 8070 "format.w"
 	REF(dimen_kind,(yyvsp[-1].u));hput_tags((yyvsp[-4].u),TAG(kern_kind,((yyvsp[-2].b))?b100:b000));}
 #line 3805 "parser.c"
     break;
@@ -3807,7 +3807,7 @@
   case 255: /* content_node: start "kern" explicit "xdimen" ref ">"  */
 #line 1068 "parser.y"
 {
-	#line 8023 "format.w"
+	#line 8072 "format.w"
 	REF(xdimen_kind,(yyvsp[-1].u));hput_tags((yyvsp[-5].u),TAG(kern_kind,((yyvsp[-3].b))?b101:b001));}
 #line 3813 "parser.c"
     break;
@@ -3815,7 +3815,7 @@
   case 256: /* content_node: start "glue" ref ">"  */
 #line 1071 "parser.y"
                            {
-	#line 8024 "format.w"
+	#line 8073 "format.w"
 	REF(glue_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(glue_kind,0));}
 #line 3821 "parser.c"
     break;
@@ -3823,7 +3823,7 @@
   case 257: /* content_node: start "ligature" ref ">"  */
 #line 1074 "parser.y"
                                {
-	#line 8025 "format.w"
+	#line 8074 "format.w"
 	REF(ligature_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(ligature_kind,0));}
 #line 3829 "parser.c"
     break;
@@ -3831,7 +3831,7 @@
   case 258: /* content_node: start "disc" ref ">"  */
 #line 1077 "parser.y"
                            {
-	#line 8026 "format.w"
+	#line 8075 "format.w"
 	REF(disc_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(disc_kind,0));}
 #line 3837 "parser.c"
     break;
@@ -3839,7 +3839,7 @@
   case 259: /* content_node: start "rule" ref ">"  */
 #line 1080 "parser.y"
                            {
-	#line 8027 "format.w"
+	#line 8076 "format.w"
 	REF(rule_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(rule_kind,0));}
 #line 3845 "parser.c"
     break;
@@ -3847,7 +3847,7 @@
   case 260: /* content_node: start "image" ref ">"  */
 #line 1083 "parser.y"
                             {
-	#line 8028 "format.w"
+	#line 8077 "format.w"
 	REF(image_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(image_kind,0));}
 #line 3853 "parser.c"
     break;
@@ -3855,7 +3855,7 @@
   case 261: /* content_node: start "leaders" ref ">"  */
 #line 1086 "parser.y"
                               {
-	#line 8029 "format.w"
+	#line 8078 "format.w"
 	REF(leaders_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(leaders_kind,0));}
 #line 3861 "parser.c"
     break;
@@ -3863,7 +3863,7 @@
   case 262: /* content_node: start "baseline" ref ">"  */
 #line 1089 "parser.y"
                                {
-	#line 8030 "format.w"
+	#line 8079 "format.w"
 	REF(baseline_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),TAG(baseline_kind,0));}
 #line 3869 "parser.c"
     break;
@@ -3871,7 +3871,7 @@
   case 263: /* content_node: start "language" REFERENCE ">"  */
 #line 1092 "parser.y"
                                      {
-	#line 8031 "format.w"
+	#line 8080 "format.w"
 	REF(language_kind,(yyvsp[-1].u));hput_tags((yyvsp[-3].u),hput_language((yyvsp[-1].u)));}
 #line 3877 "parser.c"
     break;
@@ -3879,7 +3879,7 @@
   case 264: /* glue_node: start "glue" ref ">"  */
 #line 1096 "parser.y"
                             {
-	#line 8033 "format.w"
+	#line 8082 "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;}}
@@ -3889,7 +3889,7 @@
   case 265: /* $@13: %empty  */
 #line 1103 "parser.y"
                              {
-	#line 8464 "format.w"
+	#line 8513 "format.w"
 	hput_content_start();}
 #line 3895 "parser.c"
     break;
@@ -3897,7 +3897,7 @@
   case 266: /* content_section: "<" "content" $@13 content_list ">"  */
 #line 1106 "parser.y"
 {
-	#line 8465 "format.w"
+	#line 8514 "format.w"
 	hput_content_end();hput_range_defs();hput_label_defs();}
 #line 3903 "parser.c"
     break;
@@ -4129,4 +4129,4 @@
 
 #line 1110 "parser.y"
 
-	/*:510*/
+	/*:512*/

Modified: trunk/Build/source/texk/web2c/hitexdir/hiparser.h
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hiparser.h	2021-11-22 00:49:10 UTC (rev 61116)
+++ trunk/Build/source/texk/web2c/hitexdir/hiparser.h	2021-11-22 16:45:58 UTC (rev 61117)
@@ -147,7 +147,7 @@
 {
 #line 79 "parser.y"
 
-	#line 10241 "format.w"
+	#line 10324 "format.w"
 	uint32_t u;  int32_t i;  char *s;  float64_t f;  glyph_t c;
 	dimen_t d;stretch_t st;xdimen_t xd;kern_t kt;
 	rule_t r;glue_t g;image_t x;

Modified: trunk/Build/source/texk/web2c/hitexdir/hiparser.y
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hiparser.y	2021-11-22 00:49:10 UTC (rev 61116)
+++ trunk/Build/source/texk/web2c/hitexdir/hiparser.y	2021-11-22 16:45:58 UTC (rev 61117)
@@ -1,6 +1,6 @@
-	/*510:*/
+	/*512:*/
 %{
-	#line 10216 "format.w"
+	#line 10299 "format.w"
 	
 #include "hibasetypes.h"
 #include <string.h>
@@ -10,9 +10,9 @@
 #include "hiput.h"
 extern char**hfont_name;
 
-	/*356:*/
+	/*358:*/
 uint32_t definition_bits[0x100/32][32]= {
-	#line 7578 "format.w"
+	#line 7627 "format.w"
 	{0}};
 
 #define SET_DBIT(N,K) ((N)>0xFF?1:(definition_bits[N/32][K]	|= (1<<((N)&(32-1)))))
@@ -22,16 +22,16 @@
  RNG("Definition",(D).n,max_fixed[(D).k]+1,max_ref[(D).k]);
 #define REF(K,N) REF_RNG(K,N);if(!GET_DBIT(N,K)) \
  QUIT("Reference %d to %s before definition",(N),definition_name[K])
-	/*:356*/	/*360:*/
+	/*:358*/	/*362:*/
 #define DEF_REF(D,K,M,N)  DEF(D,K,M);\
 if ((M)>max_default[K]) QUIT("Defining non default reference %d for %s",M,definition_name[K]); \
 if ((N)>max_fixed[K]) QUIT("Defining reference %d for %s by non fixed reference %d",M,definition_name[K],N);
-	/*:360*/
+	/*:362*/
 
 extern void hset_entry(entry_t*e,uint16_t i,uint32_t size,
 uint32_t xsize,char*file_name);
 
-	/*423:*/
+	/*425:*/
 #ifdef DEBUG
 #define  YYDEBUG 1
 extern int yydebug;
@@ -38,36 +38,36 @@
 #else
 #define YYDEBUG 0
 #endif
-	/*:423*/
+	/*:425*/
 extern int yylex(void);
 
-	/*352:*/
+	/*354:*/
 void hset_max(kind_t k,int n)
 {
-	#line 7421 "format.w"
+	#line 7470 "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])
 	max_ref[k]= n;
 	}
-	/*:352*/	/*363:*/
+	/*:354*/	/*365:*/
 void check_param_def(ref_t*df)
 {
-	#line 7727 "format.w"
+	#line 7776 "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)
 	QUIT("Parameter %d for %s not allowed in parameter list",df->n,definition_name[df->k]);
 	}
-	/*:363*/	/*422:*/
+	/*:365*/	/*424:*/
 extern int yylineno;
 int yyerror(const char*msg)
 {
-	#line 8803 "format.w"
+	#line 8886 "format.w"
 	QUIT(" in line %d %s",yylineno,msg);
 	return 0;
 	}
-	/*:422*/
+	/*:424*/
 
 
 %}
@@ -77,7 +77,7 @@
 
 
 %union {
-	#line 10241 "format.w"
+	#line 10324 "format.w"
 	uint32_t u;  int32_t i;  char *s;  float64_t f;  glyph_t c;
 	dimen_t d;stretch_t st;xdimen_t xd;kern_t kt;
 	rule_t r;glue_t g;image_t x;
@@ -242,23 +242,23 @@
 	/*:295*/	/*322:*/
 %token DIRECTORY "directory"
 %token SECTION "entry"
-	/*:322*/	/*341:*/
+	/*:322*/	/*343:*/
 %token DEFINITIONS "definitions"
-	/*:341*/	/*349:*/
+	/*:343*/	/*351:*/
 %token MAX "max"
-	/*:349*/	/*358:*/
+	/*:351*/	/*360:*/
 
 %type <rf> def_node
-	/*:358*/	/*364:*/
+	/*:360*/	/*366:*/
 %token PARAM "param"
 %type <u> def_list
 %type <l> parameters
-	/*:364*/	/*373:*/
+	/*:366*/	/*375:*/
 %token FONT     "font"
 %type <info> font font_head
-	/*:373*/	/*401:*/
+	/*:375*/	/*403:*/
 %token CONTENT "content"
-	/*:401*/
+	/*:403*/
 %%
 	/*5:*/
 glyph:UNSIGNED REFERENCE{
@@ -447,114 +447,114 @@
 
 box_dimen:dimension dimension dimension
 {
-	#line 3470 "format.w"
+	#line 3472 "format.w"
 	$$= hput_box_dimen($1,$2,$3);};
 box_shift:{
-	#line 3471 "format.w"
+	#line 3473 "format.w"
 	$$= b000;}
 	|SHIFTED dimension{
-	#line 3472 "format.w"
+	#line 3474 "format.w"
 	$$= hput_box_shift($2);};
 
 box_glue_set:{
-	#line 3474 "format.w"
+	#line 3476 "format.w"
 	$$= b000;}
 	|PLUS stretch{
-	#line 3475 "format.w"
+	#line 3477 "format.w"
 	$$= hput_box_glue_set(+1,$2.f,$2.o);}
 	|MINUS stretch{
-	#line 3476 "format.w"
+	#line 3478 "format.w"
 	$$= hput_box_glue_set(-1,$2.f,$2.o);};
 
 
 box:box_dimen box_shift box_glue_set list{
-	#line 3479 "format.w"
+	#line 3481 "format.w"
 	$$= $1	|$2	|$3;};
 
 hbox_node:start HBOX box END{
-	#line 3481 "format.w"
+	#line 3483 "format.w"
 	hput_tags($1,TAG(hbox_kind,$3));};
 vbox_node:start VBOX box END{
-	#line 3482 "format.w"
+	#line 3484 "format.w"
 	hput_tags($1,TAG(vbox_kind,$3));};
 content_node:hbox_node	|vbox_node;
 	/*:163*/	/*171:*/
 box_flex:plus minus{
-	#line 3663 "format.w"
+	#line 3665 "format.w"
 	hput_stretch(&($1));hput_stretch(&($2));};
 xbox:box_dimen box_shift box_flex xdimen_ref list{
-	#line 3664 "format.w"
+	#line 3666 "format.w"
 	$$= $1	|$2;}
 	|box_dimen box_shift box_flex xdimen_node list{
-	#line 3665 "format.w"
+	#line 3667 "format.w"
 	$$= $1	|$2	|b100;};
 
 box_goal:TO xdimen_ref{
-	#line 3667 "format.w"
+	#line 3669 "format.w"
 	$$= b000;}
 	|ADD xdimen_ref{
-	#line 3668 "format.w"
+	#line 3670 "format.w"
 	$$= b001;}
 	|TO xdimen_node{
-	#line 3669 "format.w"
+	#line 3671 "format.w"
 	$$= b100;}
 	|ADD xdimen_node{
-	#line 3670 "format.w"
+	#line 3672 "format.w"
 	$$= b101;};
 
 hpack:box_shift box_goal list{
-	#line 3672 "format.w"
+	#line 3674 "format.w"
 	$$= $2;};
 vpack:box_shift MAX DEPTH dimension{
-	#line 3673 "format.w"
+	#line 3675 "format.w"
 	HPUT32($4);}box_goal list{
-	#line 3673 "format.w"
+	#line 3675 "format.w"
 	$$= $1	|$6;};
 
 vxbox_node:start VSET xbox END{
-	#line 3675 "format.w"
+	#line 3677 "format.w"
 	hput_tags($1,TAG(vset_kind,$3));}
 	|start VPACK vpack END{
-	#line 3676 "format.w"
+	#line 3678 "format.w"
 	hput_tags($1,TAG(vpack_kind,$3));};
 
 
 hxbox_node:start HSET xbox END{
-	#line 3679 "format.w"
+	#line 3681 "format.w"
 	hput_tags($1,TAG(hset_kind,$3));}
 	|start HPACK hpack END{
-	#line 3680 "format.w"
+	#line 3682 "format.w"
 	hput_tags($1,TAG(hpack_kind,$3));};
 
 content_node:vxbox_node	|hxbox_node;
 	/*:171*/	/*176:*/
 ltype:{
-	#line 3790 "format.w"
+	#line 3792 "format.w"
 	$$= 1;}	|ALIGN{
-	#line 3790 "format.w"
+	#line 3792 "format.w"
 	$$= 1;}	|CENTER{
-	#line 3790 "format.w"
+	#line 3792 "format.w"
 	$$= 2;}	|EXPAND{
-	#line 3790 "format.w"
+	#line 3792 "format.w"
 	$$= 3;};
 leaders:glue_node ltype rule_node{
-	#line 3791 "format.w"
+	#line 3793 "format.w"
 	if($1)$$= $2	|b100;else $$= $2;}
 	|glue_node ltype hbox_node{
-	#line 3792 "format.w"
+	#line 3794 "format.w"
 	if($1)$$= $2	|b100;else $$= $2;}
 	|glue_node ltype vbox_node{
-	#line 3793 "format.w"
+	#line 3795 "format.w"
 	if($1)$$= $2	|b100;else $$= $2;};
 content_node:start LEADERS leaders END{
-	#line 3794 "format.w"
+	#line 3796 "format.w"
 	hput_tags($1,TAG(leaders_kind,$3));}
 	/*:176*/	/*183:*/
 baseline:dimension{
-	#line 3900 "format.w"
+	#line 3902 "format.w"
 	if($1!=0)HPUT32($1);}
 glue_node glue_node{
-	#line 3901 "format.w"
+	#line 3903 "format.w"
 	$$= b000;if($1!=0)$$	|= b001;
 	if($3)$$	|= b100;
 	if($4)$$	|= b010;
@@ -561,169 +561,169 @@
 	};
 content_node:start BASELINE baseline END
 {
-	#line 3906 "format.w"
+	#line 3908 "format.w"
 	if($3==b000)HPUT8(0);hput_tags($1,TAG(baseline_kind,$3));};
 	/*:183*/	/*190:*/
 cc_list:	|cc_list TXT_CC{
-	#line 3989 "format.w"
+	#line 3991 "format.w"
 	hput_utf8($2);};
 lig_cc:UNSIGNED{
-	#line 3990 "format.w"
+	#line 3992 "format.w"
 	RNG("UTF-8 code",$1,0,0x1FFFFF);$$= hpos-hstart;hput_utf8($1);};
 lig_cc:CHARCODE{
-	#line 3991 "format.w"
+	#line 3993 "format.w"
 	$$= hpos-hstart;hput_utf8($1);};
 ref:REFERENCE{
-	#line 3992 "format.w"
+	#line 3994 "format.w"
 	HPUT8($1);$$= $1;};
 ligature:ref{
-	#line 3993 "format.w"
+	#line 3995 "format.w"
 	REF(font_kind,$1);}lig_cc TXT_START cc_list TXT_END
 {
-	#line 3994 "format.w"
+	#line 3996 "format.w"
 	$$.f= $1;$$.l.p= $3;$$.l.s= (hpos-hstart)-$3;
 	RNG("Ligature size",$$.l.s,0,255);};
 content_node:start LIGATURE ligature END{
-	#line 3996 "format.w"
+	#line 3998 "format.w"
 	hput_tags($1,hput_ligature(&($3)));};
 	/*:190*/	/*198:*/
 replace_count:explicit{
-	#line 4106 "format.w"
+	#line 4108 "format.w"
 	if($1){$$= 0x80;HPUT8(0x80);}else $$= 0x00;}
 	|explicit UNSIGNED{
-	#line 4107 "format.w"
+	#line 4109 "format.w"
 	RNG("Replace count",$2,0,31);
 	$$= ($2)	|(($1)?0x80:0x00);if($$!=0)HPUT8($$);};
 disc:replace_count list list{
-	#line 4109 "format.w"
+	#line 4111 "format.w"
 	$$.r= $1;$$.p= $2;$$.q= $3;
 	if($3.s==0){hpos= hpos-2;if($2.s==0)hpos= hpos-2;}}
 	|replace_count list{
-	#line 4111 "format.w"
+	#line 4113 "format.w"
 	$$.r= $1;$$.p= $2;if($2.s==0)hpos= hpos-2;$$.q.s= 0;}
 	|replace_count{
-	#line 4112 "format.w"
+	#line 4114 "format.w"
 	$$.r= $1;$$.p.s= 0;$$.q.s= 0;};
 
 
 disc_node:start DISC disc END
 {
-	#line 4116 "format.w"
+	#line 4118 "format.w"
 	hput_tags($1,hput_disc(&($3)));};
 
 content_node:disc_node;
 	/*:198*/	/*206:*/
 par_dimen:xdimen{
-	#line 4268 "format.w"
+	#line 4270 "format.w"
 	hput_xdimen_node(&($1));};
 par:xdimen_ref param_ref list{
-	#line 4269 "format.w"
+	#line 4271 "format.w"
 	$$= b000;}
 	|xdimen_ref empty_param_list non_empty_param_list list{
-	#line 4270 "format.w"
+	#line 4272 "format.w"
 	$$= b010;}
 	|xdimen_ref empty_param_list list{
-	#line 4271 "format.w"
+	#line 4273 "format.w"
 	$$= b010;}
 	|xdimen param_ref{
-	#line 4272 "format.w"
+	#line 4274 "format.w"
 	hput_xdimen_node(&($1));}list{
-	#line 4272 "format.w"
+	#line 4274 "format.w"
 	$$= b100;}
 	|par_dimen empty_param_list non_empty_param_list list{
-	#line 4273 "format.w"
+	#line 4275 "format.w"
 	$$= b110;}
 	|par_dimen empty_param_list list{
-	#line 4274 "format.w"
+	#line 4276 "format.w"
 	$$= b110;};
 
 content_node:start PAR par END{
-	#line 4276 "format.w"
+	#line 4278 "format.w"
 	hput_tags($1,TAG(par_kind,$3));};
 	/*:206*/	/*211:*/
 math:param_ref list{
-	#line 4342 "format.w"
+	#line 4344 "format.w"
 	$$= b000;}
 	|param_ref list hbox_node{
-	#line 4343 "format.w"
+	#line 4345 "format.w"
 	$$= b001;}
 	|param_ref hbox_node list{
-	#line 4344 "format.w"
+	#line 4346 "format.w"
 	$$= b010;}
 	|empty_param_list list{
-	#line 4345 "format.w"
+	#line 4347 "format.w"
 	$$= b100;}
 	|empty_param_list list hbox_node{
-	#line 4346 "format.w"
+	#line 4348 "format.w"
 	$$= b101;}
 	|empty_param_list hbox_node list{
-	#line 4347 "format.w"
+	#line 4349 "format.w"
 	$$= b110;}
 	|empty_param_list non_empty_param_list list{
-	#line 4348 "format.w"
+	#line 4350 "format.w"
 	$$= b100;}
 	|empty_param_list non_empty_param_list list hbox_node{
-	#line 4349 "format.w"
+	#line 4351 "format.w"
 	$$= b101;}
 	|empty_param_list non_empty_param_list hbox_node list{
-	#line 4350 "format.w"
+	#line 4352 "format.w"
 	$$= b110;};
 
 content_node:start MATH math END{
-	#line 4352 "format.w"
+	#line 4354 "format.w"
 	hput_tags($1,TAG(math_kind,$3));};
 	/*:211*/	/*216:*/
 on_off:ON{
-	#line 4402 "format.w"
+	#line 4404 "format.w"
 	$$= 1;}	|OFF{
-	#line 4402 "format.w"
+	#line 4404 "format.w"
 	$$= 0;};
 math:on_off{
-	#line 4403 "format.w"
+	#line 4405 "format.w"
 	$$= b011	|($1<<2);};
 	/*:216*/	/*220:*/
 content_node:start ADJUST list END{
-	#line 4434 "format.w"
+	#line 4436 "format.w"
 	hput_tags($1,TAG(adjust_kind,1));};
 	/*:220*/	/*224:*/
 span_count:UNSIGNED{
-	#line 4533 "format.w"
+	#line 4535 "format.w"
 	$$= hput_span_count($1);};
 content_node:start ITEM content_node END{
-	#line 4534 "format.w"
+	#line 4536 "format.w"
 	hput_tags($1,TAG(item_kind,1));};
 content_node:start ITEM span_count content_node END{
-	#line 4535 "format.w"
+	#line 4537 "format.w"
 	hput_tags($1,TAG(item_kind,$3));};
 content_node:start ITEM list END{
-	#line 4536 "format.w"
+	#line 4538 "format.w"
 	hput_tags($1,TAG(item_kind,b000));};
 
 table:H box_goal list list{
-	#line 4538 "format.w"
+	#line 4540 "format.w"
 	$$= $2;};
 table:V box_goal list list{
-	#line 4539 "format.w"
+	#line 4541 "format.w"
 	$$= $2	|b010;};
 
 content_node:start TABLE table END{
-	#line 4541 "format.w"
+	#line 4543 "format.w"
 	hput_tags($1,TAG(table_kind,$3));};
 	/*:224*/	/*231:*/
 image_dimen:dimension dimension{
-	#line 4629 "format.w"
+	#line 4631 "format.w"
 	$$.w= $1;$$.h= $2;}	|{
-	#line 4629 "format.w"
+	#line 4631 "format.w"
 	$$.w= $$.h= 0;};
 image:UNSIGNED image_dimen plus minus{
-	#line 4630 "format.w"
+	#line 4632 "format.w"
 	$$.w= $2.w;$$.h= $2.h;$$.p= $3;$$.m= $4;RNG("Section number",$1,3,max_section_no);$$.n= $1;};
 content_node:start IMAGE image END{
-	#line 4631 "format.w"
+	#line 4633 "format.w"
 	hput_tags($1,hput_image(&($3)));}
 	/*:231*/	/*241:*/
 max_value:OUTLINE UNSIGNED{
-	#line 4868 "format.w"
+	#line 4870 "format.w"
 	max_outline= $2;
 	RNG("max outline",max_outline,0,0xFFFF);
 	DBG(DBGDEF	|DBGLABEL,"Setting max outline to %d\n",max_outline);
@@ -730,26 +730,26 @@
 	};
 	/*:241*/	/*248:*/
 placement:TOP{
-	#line 4960 "format.w"
+	#line 4962 "format.w"
 	$$= LABEL_TOP;}	|BOT{
-	#line 4960 "format.w"
+	#line 4962 "format.w"
 	$$= LABEL_BOT;}	|MID{
-	#line 4960 "format.w"
+	#line 4962 "format.w"
 	$$= LABEL_MID;}	|{
-	#line 4960 "format.w"
+	#line 4962 "format.w"
 	$$= LABEL_MID;};
 content_node:START LABEL REFERENCE placement END
 {
-	#line 4962 "format.w"
+	#line 4964 "format.w"
 	hset_label($3,$4);}
 	/*:248*/	/*262:*/
 content_node:start LINK REFERENCE on_off END
 {
-	#line 5220 "format.w"
+	#line 5222 "format.w"
 	hput_tags($1,hput_link($3,$4));};
 	/*:262*/	/*272:*/
 def_node:START OUTLINE REFERENCE integer position list END{
-	#line 5350 "format.w"
+	#line 5352 "format.w"
 	
 	static int outline_no= -1;
 	$$.k= outline_kind;$$.n= $3;
@@ -759,67 +759,67 @@
 	};
 	/*:272*/	/*279:*/
 stream_link:ref{
-	#line 5765 "format.w"
+	#line 5767 "format.w"
 	REF_RNG(stream_kind,$1);}	|NOREFERENCE{
-	#line 5765 "format.w"
+	#line 5767 "format.w"
 	HPUT8(255);};
 stream_split:stream_link stream_link UNSIGNED{
-	#line 5766 "format.w"
+	#line 5768 "format.w"
 	RNG("split ratio",$3,0,1000);HPUT16($3);};
 stream_info:xdimen_node UNSIGNED{
-	#line 5767 "format.w"
+	#line 5769 "format.w"
 	RNG("magnification factor",$2,0,1000);HPUT16($2);}stream_split;
 
 stream_type:stream_info{
-	#line 5769 "format.w"
+	#line 5771 "format.w"
 	$$= 0;}	|FIRST{
-	#line 5769 "format.w"
+	#line 5771 "format.w"
 	$$= 1;}	|LAST{
-	#line 5769 "format.w"
+	#line 5771 "format.w"
 	$$= 2;}	|TOP{
-	#line 5769 "format.w"
+	#line 5771 "format.w"
 	$$= 3;};
 
 stream_def_node:start STREAMDEF ref stream_type
 list xdimen_node glue_node list glue_node END
 {
-	#line 5773 "format.w"
+	#line 5775 "format.w"
 	DEF($$,stream_kind,$3);hput_tags($1,TAG(stream_kind,$4	|b100));};
 
 stream_ins_node:start STREAMDEF ref END
 {
-	#line 5776 "format.w"
+	#line 5778 "format.w"
 	RNG("Stream insertion",$3,0,max_ref[stream_kind]);hput_tags($1,TAG(stream_kind,b100));};
 
 content_node:stream_def_node	|stream_ins_node;
 	/*:279*/	/*284:*/
 stream:empty_param_list list{
-	#line 5871 "format.w"
+	#line 5873 "format.w"
 	$$= b010;}
 	|empty_param_list non_empty_param_list list{
-	#line 5872 "format.w"
+	#line 5874 "format.w"
 	$$= b010;}
 	|param_ref list{
-	#line 5873 "format.w"
+	#line 5875 "format.w"
 	$$= b000;};
 content_node:start STREAM stream_ref stream END
 {
-	#line 5875 "format.w"
+	#line 5877 "format.w"
 	hput_tags($1,TAG(stream_kind,$4));};
 	/*:284*/	/*289:*/
 page_priority:{
-	#line 5978 "format.w"
+	#line 5980 "format.w"
 	HPUT8(1);}
 	|UNSIGNED{
-	#line 5979 "format.w"
+	#line 5981 "format.w"
 	RNG("page priority",$1,0,255);HPUT8($1);};
 
 stream_def_list:	|stream_def_list stream_def_node;
 
 page:string{
-	#line 5983 "format.w"
+	#line 5985 "format.w"
 	hput_string($1);}page_priority glue_node dimension{
-	#line 5983 "format.w"
+	#line 5985 "format.w"
 	HPUT32($5);}
 xdimen_node xdimen_node
 list stream_def_list;
@@ -826,35 +826,35 @@
 	/*:289*/	/*297:*/
 
 content_node:START RANGE REFERENCE ON END{
-	#line 6095 "format.w"
+	#line 6097 "format.w"
 	REF(page_kind,$3);hput_range($3,true);}
 	|START RANGE REFERENCE OFF END{
-	#line 6096 "format.w"
+	#line 6098 "format.w"
 	REF(page_kind,$3);hput_range($3,false);};
 	/*:297*/	/*308:*/
 hint:directory_section definition_section content_section;
 	/*:308*/	/*324:*/
 directory_section:START DIRECTORY UNSIGNED{
-	#line 6786 "format.w"
+	#line 6788 "format.w"
 	new_directory($3+1);new_output_buffers();}entry_list END;
 entry_list:	|entry_list entry;
 entry:START SECTION UNSIGNED string END
 {
-	#line 6789 "format.w"
+	#line 6791 "format.w"
 	RNG("Section number",$3,3,max_section_no);hset_entry(&(dir[$3]),$3,0,0,$4);};
-	/*:324*/	/*343:*/
+	/*:324*/	/*345:*/
 definition_section:START DEFINITIONS{
-	#line 7277 "format.w"
+	#line 7326 "format.w"
 	hput_definitions_start();}
 max_definitions definition_list
 END{
-	#line 7279 "format.w"
+	#line 7328 "format.w"
 	hput_definitions_end();};
 definition_list:	|definition_list def_node;
-	/*:343*/	/*351:*/
+	/*:345*/	/*353:*/
 max_definitions:START MAX max_list END
 {
-	#line 7395 "format.w"
+	#line 7444 "format.w"
 		/*245:*/
 	if(max_ref[label_kind]>=0)
 	ALLOCATE(labels,max_ref[label_kind]+1,label_t);
@@ -864,7 +864,7 @@
 		/*:266*/	/*293:*/
 	ALLOCATE(page_on,max_ref[page_kind]+1,int);
 	ALLOCATE(range_pos,2*(max_ref[range_kind]+1),range_pos_t);
-		/*:293*/	/*357:*/
+		/*:293*/	/*359:*/
 	definition_bits[0][int_kind]= (1<<(MAX_INT_DEFAULT+1))-1;
 	definition_bits[0][dimen_kind]= (1<<(MAX_DIMEN_DEFAULT+1))-1;
 	definition_bits[0][xdimen_kind]= (1<<(MAX_XDIMEN_DEFAULT+1))-1;
@@ -873,144 +873,144 @@
 	definition_bits[0][page_kind]= (1<<(MAX_PAGE_DEFAULT+1))-1;
 	definition_bits[0][stream_kind]= (1<<(MAX_STREAM_DEFAULT+1))-1;
 	definition_bits[0][range_kind]= (1<<(MAX_RANGE_DEFAULT+1))-1;
-		/*:357*/	/*372:*/
+		/*:359*/	/*374:*/
 	ALLOCATE(hfont_name,max_ref[font_kind]+1,char*);
-		/*:372*/hput_max_definitions();};
+		/*:374*/hput_max_definitions();};
 
 max_list:	|max_list START max_value END;
 
 max_value:FONT UNSIGNED{
-	#line 7399 "format.w"
+	#line 7448 "format.w"
 	hset_max(font_kind,$2);}
 	|INTEGER UNSIGNED{
-	#line 7400 "format.w"
+	#line 7449 "format.w"
 	hset_max(int_kind,$2);}
 	|DIMEN UNSIGNED{
-	#line 7401 "format.w"
+	#line 7450 "format.w"
 	hset_max(dimen_kind,$2);}
 	|LIGATURE UNSIGNED{
-	#line 7402 "format.w"
+	#line 7451 "format.w"
 	hset_max(ligature_kind,$2);}
 	|DISC UNSIGNED{
-	#line 7403 "format.w"
+	#line 7452 "format.w"
 	hset_max(disc_kind,$2);}
 	|GLUE UNSIGNED{
-	#line 7404 "format.w"
+	#line 7453 "format.w"
 	hset_max(glue_kind,$2);}
 	|LANGUAGE UNSIGNED{
-	#line 7405 "format.w"
+	#line 7454 "format.w"
 	hset_max(language_kind,$2);}
 	|RULE UNSIGNED{
-	#line 7406 "format.w"
+	#line 7455 "format.w"
 	hset_max(rule_kind,$2);}
 	|IMAGE UNSIGNED{
-	#line 7407 "format.w"
+	#line 7456 "format.w"
 	hset_max(image_kind,$2);}
 	|LEADERS UNSIGNED{
-	#line 7408 "format.w"
+	#line 7457 "format.w"
 	hset_max(leaders_kind,$2);}
 	|BASELINE UNSIGNED{
-	#line 7409 "format.w"
+	#line 7458 "format.w"
 	hset_max(baseline_kind,$2);}
 	|XDIMEN UNSIGNED{
-	#line 7410 "format.w"
+	#line 7459 "format.w"
 	hset_max(xdimen_kind,$2);}
 	|PARAM UNSIGNED{
-	#line 7411 "format.w"
+	#line 7460 "format.w"
 	hset_max(param_kind,$2);}
 	|STREAMDEF UNSIGNED{
-	#line 7412 "format.w"
+	#line 7461 "format.w"
 	hset_max(stream_kind,$2);}
 	|PAGE UNSIGNED{
-	#line 7413 "format.w"
+	#line 7462 "format.w"
 	hset_max(page_kind,$2);}
 	|RANGE UNSIGNED{
-	#line 7414 "format.w"
+	#line 7463 "format.w"
 	hset_max(range_kind,$2);}
 	|LABEL UNSIGNED{
-	#line 7415 "format.w"
+	#line 7464 "format.w"
 	hset_max(label_kind,$2);};
 
-	/*:351*/	/*359:*/
+	/*:353*/	/*361:*/
 def_node:
 start FONT ref font END{
-	#line 7612 "format.w"
+	#line 7661 "format.w"
 	DEF($$,font_kind,$3);hput_tags($1,$4);}
 	|start INTEGER ref integer END{
-	#line 7613 "format.w"
+	#line 7662 "format.w"
 	DEF($$,int_kind,$3);hput_tags($1,hput_int($4));}
 	|start DIMEN ref dimension END{
-	#line 7614 "format.w"
+	#line 7663 "format.w"
 	DEF($$,dimen_kind,$3);hput_tags($1,hput_dimen($4));}
 	|start LANGUAGE ref string END{
-	#line 7615 "format.w"
+	#line 7664 "format.w"
 	DEF($$,language_kind,$3);hput_string($4);hput_tags($1,TAG(language_kind,0));}
 	|start GLUE ref glue END{
-	#line 7616 "format.w"
+	#line 7665 "format.w"
 	DEF($$,glue_kind,$3);hput_tags($1,hput_glue(&($4)));}
 	|start XDIMEN ref xdimen END{
-	#line 7617 "format.w"
+	#line 7666 "format.w"
 	DEF($$,xdimen_kind,$3);hput_tags($1,hput_xdimen(&($4)));}
 	|start RULE ref rule END{
-	#line 7618 "format.w"
+	#line 7667 "format.w"
 	DEF($$,rule_kind,$3);hput_tags($1,hput_rule(&($4)));}
 	|start LEADERS ref leaders END{
-	#line 7619 "format.w"
+	#line 7668 "format.w"
 	DEF($$,leaders_kind,$3);hput_tags($1,TAG(leaders_kind,$4));}
 	|start BASELINE ref baseline END{
-	#line 7620 "format.w"
+	#line 7669 "format.w"
 	DEF($$,baseline_kind,$3);hput_tags($1,TAG(baseline_kind,$4));}
 	|start LIGATURE ref ligature END{
-	#line 7621 "format.w"
+	#line 7670 "format.w"
 	DEF($$,ligature_kind,$3);hput_tags($1,hput_ligature(&($4)));}
 	|start DISC ref disc END{
-	#line 7622 "format.w"
+	#line 7671 "format.w"
 	DEF($$,disc_kind,$3);hput_tags($1,hput_disc(&($4)));}
 	|start IMAGE ref image END{
-	#line 7623 "format.w"
+	#line 7672 "format.w"
 	DEF($$,image_kind,$3);hput_tags($1,hput_image(&($4)));}
 	|start PARAM ref parameters END{
-	#line 7624 "format.w"
+	#line 7673 "format.w"
 	DEF($$,param_kind,$3);hput_tags($1,hput_list($1+2,&($4)));}
 	|start PAGE ref page END{
-	#line 7625 "format.w"
+	#line 7674 "format.w"
 	DEF($$,page_kind,$3);hput_tags($1,TAG(page_kind,0));};
-	/*:359*/	/*361:*/
+	/*:361*/	/*363:*/
 def_node:
 start INTEGER ref ref END{
-	#line 7644 "format.w"
+	#line 7693 "format.w"
 	DEF_REF($$,int_kind,$3,$4);hput_tags($1,TAG(int_kind,0));}
 	|start DIMEN ref ref END{
-	#line 7645 "format.w"
+	#line 7694 "format.w"
 	DEF_REF($$,dimen_kind,$3,$4);hput_tags($1,TAG(dimen_kind,0));}
 	|start GLUE ref ref END{
-	#line 7646 "format.w"
+	#line 7695 "format.w"
 	DEF_REF($$,glue_kind,$3,$4);hput_tags($1,TAG(glue_kind,0));};
-	/*:361*/	/*366:*/
+	/*:363*/	/*368:*/
 def_list:position
 	|def_list def_node{
-	#line 7760 "format.w"
+	#line 7809 "format.w"
 	check_param_def(&($2));};
 parameters:estimate def_list{
-	#line 7761 "format.w"
+	#line 7810 "format.w"
 	$$.p= $2;$$.k= param_kind;$$.s= (hpos-hstart)-$2;};
-	/*:366*/	/*367:*/
+	/*:368*/	/*369:*/
 empty_param_list:position{
-	#line 7782 "format.w"
+	#line 7831 "format.w"
 	HPUTX(2);hpos++;hput_tags($1,TAG(param_kind,1));};
 non_empty_param_list:start PARAM{
-	#line 7783 "format.w"
+	#line 7832 "format.w"
 	hpos= hpos-2;}parameters END
 {
-	#line 7784 "format.w"
+	#line 7833 "format.w"
 	hput_tags($1-2,hput_list($1-1,&($4)));};
-	/*:367*/	/*375:*/
+	/*:369*/	/*377:*/
 
 font:font_head font_param_list;
 
 font_head:string dimension UNSIGNED UNSIGNED
 {
-	#line 7926 "format.w"
+	#line 7975 "format.w"
 	uint8_t f= $<u>0;SET_DBIT(f,font_kind);hfont_name[f]= strdup($1);$$= hput_font_head(f,hfont_name[f],$2,$3,$4);};
 
 font_param_list:glue_node disc_node	|font_param_list font_param;
@@ -1017,95 +1017,95 @@
 
 font_param:
 start PENALTY fref penalty END{
-	#line 7931 "format.w"
+	#line 7980 "format.w"
 	hput_tags($1,hput_int($4));}
 	|start KERN fref kern END{
-	#line 7932 "format.w"
+	#line 7981 "format.w"
 	hput_tags($1,hput_kern(&($4)));}
 	|start LIGATURE fref ligature END{
-	#line 7933 "format.w"
+	#line 7982 "format.w"
 	hput_tags($1,hput_ligature(&($4)));}
 	|start DISC fref disc END{
-	#line 7934 "format.w"
+	#line 7983 "format.w"
 	hput_tags($1,hput_disc(&($4)));}
 	|start GLUE fref glue END{
-	#line 7935 "format.w"
+	#line 7984 "format.w"
 	hput_tags($1,hput_glue(&($4)));}
 	|start LANGUAGE fref string END{
-	#line 7936 "format.w"
+	#line 7985 "format.w"
 	hput_string($4);hput_tags($1,TAG(language_kind,0));}
 	|start RULE fref rule END{
-	#line 7937 "format.w"
+	#line 7986 "format.w"
 	hput_tags($1,hput_rule(&($4)));}
 	|start IMAGE fref image END{
-	#line 7938 "format.w"
+	#line 7987 "format.w"
 	hput_tags($1,hput_image(&($4)));};
 
 fref:ref{
-	#line 7940 "format.w"
+	#line 7989 "format.w"
 	RNG("Font parameter",$1,0,MAX_FONT_PARAMS);};
-	/*:375*/	/*378:*/
+	/*:377*/	/*380:*/
 xdimen_ref:ref{
-	#line 8013 "format.w"
+	#line 8062 "format.w"
 	REF(xdimen_kind,$1);};
 param_ref:ref{
-	#line 8014 "format.w"
+	#line 8063 "format.w"
 	REF(param_kind,$1);};
 stream_ref:ref{
-	#line 8015 "format.w"
+	#line 8064 "format.w"
 	REF_RNG(stream_kind,$1);};
 
 
 content_node:
 start PENALTY ref END{
-	#line 8019 "format.w"
+	#line 8068 "format.w"
 	REF(penalty_kind,$3);hput_tags($1,TAG(penalty_kind,0));}
 	|start KERN explicit ref END
 {
-	#line 8021 "format.w"
+	#line 8070 "format.w"
 	REF(dimen_kind,$4);hput_tags($1,TAG(kern_kind,($3)?b100:b000));}
 	|start KERN explicit XDIMEN ref END
 {
-	#line 8023 "format.w"
+	#line 8072 "format.w"
 	REF(xdimen_kind,$5);hput_tags($1,TAG(kern_kind,($3)?b101:b001));}
 	|start GLUE ref END{
-	#line 8024 "format.w"
+	#line 8073 "format.w"
 	REF(glue_kind,$3);hput_tags($1,TAG(glue_kind,0));}
 	|start LIGATURE ref END{
-	#line 8025 "format.w"
+	#line 8074 "format.w"
 	REF(ligature_kind,$3);hput_tags($1,TAG(ligature_kind,0));}
 	|start DISC ref END{
-	#line 8026 "format.w"
+	#line 8075 "format.w"
 	REF(disc_kind,$3);hput_tags($1,TAG(disc_kind,0));}
 	|start RULE ref END{
-	#line 8027 "format.w"
+	#line 8076 "format.w"
 	REF(rule_kind,$3);hput_tags($1,TAG(rule_kind,0));}
 	|start IMAGE ref END{
-	#line 8028 "format.w"
+	#line 8077 "format.w"
 	REF(image_kind,$3);hput_tags($1,TAG(image_kind,0));}
 	|start LEADERS ref END{
-	#line 8029 "format.w"
+	#line 8078 "format.w"
 	REF(leaders_kind,$3);hput_tags($1,TAG(leaders_kind,0));}
 	|start BASELINE ref END{
-	#line 8030 "format.w"
+	#line 8079 "format.w"
 	REF(baseline_kind,$3);hput_tags($1,TAG(baseline_kind,0));}
 	|start LANGUAGE REFERENCE END{
-	#line 8031 "format.w"
+	#line 8080 "format.w"
 	REF(language_kind,$3);hput_tags($1,hput_language($3));};
 
 glue_node:start GLUE ref END{
-	#line 8033 "format.w"
+	#line 8082 "format.w"
 	REF(glue_kind,$3);
 	if($3==zero_skip_no){hpos= hpos-2;$$= false;}
 	else{hput_tags($1,TAG(glue_kind,0));$$= true;}};
 
-	/*:378*/	/*403:*/
+	/*:380*/	/*405:*/
 content_section:START CONTENT{
-	#line 8464 "format.w"
+	#line 8513 "format.w"
 	hput_content_start();}content_list END
 {
-	#line 8465 "format.w"
+	#line 8514 "format.w"
 	hput_content_end();hput_range_defs();hput_label_defs();};
-	/*:403*/
+	/*:405*/
 %%
-	/*:510*/
+	/*:512*/

Modified: trunk/Build/source/texk/web2c/hitexdir/hitex.w
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/hitex.w	2021-11-22 00:49:10 UTC (rev 61116)
+++ trunk/Build/source/texk/web2c/hitexdir/hitex.w	2021-11-22 16:45:58 UTC (rev 61117)
@@ -202,7 +202,7 @@
 @s dotdot TeX
 @* Introduction.
 This is Hi\TeX, a program derived from and extending the capabilities
-of \TeX\ plus \eTeX\ plus \Prote\ plus k\TeX,
+of \TeX\ plus \eTeX\ plus \Prote\ plus the \TeX\ Live extensions.
 a document compiler intended to produce typesetting of high
 quality.
 The \PASCAL\ program that follows is the definition of \TeX82, a standard
@@ -324,9 +324,7 @@
 @d Prote_banner "This is Prote, Version " Prote_version_string
    /*printed when \Prote\ starts*/
 @#
- at d HiTeX_version_string Prote_version_string "-1.0"
-@#
- at d banner "This is HiTeX, Version 3.141592653" HiTeX_version_string  /*printed when \TeX\ starts*/
+ at d banner "This is HiTeX, Version 3.141592653-" HiTeX_version_string  /*printed when \TeX\ starts*/
 
 @ Different \PASCAL s have slightly different conventions, and the present
 @!@:PASCAL H}{\ph@>
@@ -8075,7 +8073,6 @@
 @p @t\4@>@<Declare the procedure called |macro_call|@>@;@/
 @t\4@>@<Declare the procedure called |insert_relax|@>@;@/
 @t\4@>@<Declare \eTeX\ procedures for expanding@>@;@/
- at t\4@>@<Declare \Prote\ procedures for expanding@>@;@/
 static void pass_text(void);
 static void start_input(void);
 static void conditional(void);
@@ -8713,7 +8710,6 @@
 @p static void scan_int(void); /*scans an integer value*/
 @t\4\4@>@<Declare procedures that scan restricted classes of integers@>@;
 @t\4\4@>@<Declare \eTeX\ procedures for scanning@>@;
- at t\4\4@>@<Declare \Prote\ procedures for scanning@>@;
 @t\4\4@>@<Declare procedures that scan font-related stuff@>@;
 
 @ \TeX\ doesn't know exactly what to expect when |scan_something_internal|
@@ -14911,7 +14907,9 @@
 {@+pointer v; /*the box that should be centered vertically*/
 scaled @!delta; /*its height plus depth*/
 v=info(nucleus(q));
-if (type(v)!=vlist_node) confusion("vcenter");
+if (type(v)!=vlist_node &&
+    !(type(v)==whatsit_node && (subtype(v)==vset_node || subtype(v)==vpack_node)))
+   confusion("vcenter");
 @:this can't happen vcenter}{\quad vcenter@>
 delta=height(v)+depth(v);
 height(v)=axis_height(cur_size)+half(delta);
@@ -23047,25 +23045,17 @@
   display_no_bs(q)= prev_depth <= ignore_depth;
   tail_append(q);
 }
-/* this is from |resume_after_display| */
-if (cur_group!=math_shift_group) confusion("display");
-@:this can't happen display}{\quad display@>
-unsave();
-mode=hmode;space_factor=1000;set_cur_lang;clang=cur_lang;
-prev_graf=(norm_min(left_hyphen_min)*0100+norm_min(right_hyphen_min))
-             *0200000+cur_lang;
-@<Scan an optional space@>;
+resume_after_display()
 
 @ @<Declare act...@>=
 static void resume_after_display(void)
 {@+if (cur_group!=math_shift_group) confusion("display");
 @:this can't happen display}{\quad display@>
-unsave();prev_graf=prev_graf+3;
-push_nest();mode=hmode;space_factor=1000;set_cur_lang;clang=cur_lang;
+unsave();
+mode=hmode;space_factor=1000;set_cur_lang;clang=cur_lang;
 prev_graf=(norm_min(left_hyphen_min)*0100+norm_min(right_hyphen_min))
              *0200000+cur_lang;
 @<Scan an optional space@>;
-if (nest_ptr==1) build_page();
 }
 
 @ The user can force the equation number to go on a separate line
@@ -25779,11 +25769,12 @@
   print_char(':');print_int(par_value(p).i);
   break;
 case graf_node: print_esc("paragraf(");
+  print_xdimen(graf_extent(p));
+  print(", ");
   print_int(graf_penalty(p));
   print_char(')');
   node_list_display(graf_params(p));
   node_list_display(graf_list(p));
-  print_xdimen(graf_extent(p));
   break;
 case disp_node: print_esc("display ");
   node_list_display(display_eqno(p));
@@ -26331,7 +26322,7 @@
   if (buffer[loc]=='*') incr(loc);
   eTeX_mode=1; /*enter extended mode*/
   @<Initialize variables for \eTeX\ extended mode@>@;
-  if (buffer[loc]=='*'||protep) {@+
+  if (buffer[loc]=='*'||ltxp) {@+
     @<Check \Prote\ ``constant'' values for consistency@>@;
     @<Generate all \Prote\ primitives@>@;
     if (buffer[loc]=='*')incr(loc);
@@ -28574,7 +28565,7 @@
 tail in |info(garbage)| and if the two are equals, the list is empty.
 User must keep in mind that this has to be flushed when done with!
 
-@<Declare \Prote\ procedures for expanding@>=
+@<Forward declarations@>=
 static void scan_general_x_text(void);
 
 @ @<Declare \Prote\ procedures for token lists@>=
@@ -28589,7 +28580,8 @@
 and converts it to a string number that is returned in |info(garbage)|.
 Neither the token list nor the string (obviously) are flushed.
 
-@<Declare \Prote\ procedures for scanning@>=
+
+@<Forward declarations@>=
 static void toks_to_str(void);
 
 @ Here we are using |token_show| that has to take a reference count.
@@ -31071,6 +31063,9 @@
 { if (bot_mark!=null) delete_token_ref(bot_mark);
   bot_mark=mark_ptr(p);add_token_ref(bot_mark);
 }
+
+
+
 @*1 Replacing {\tt hpack} and {\tt vpack}.
 The following routines extend \TeX's original routines. They check for
 any dependency of the box size on {\tt hsize} or {\tt vsize} and
@@ -31082,202 +31077,89 @@
 static pointer hpack(pointer p,scaled w, scaled hf, scaled vf, small_number m)
 {
   pointer r; /*the box node that will be returned*/
-  pointer prev_p; /*trails behind |p|*/
+  pointer q; /*trails behind |p|*/
   scaled h,d,x; /*height, depth, and natural width*/
   scaled s; /*shift amount*/
   pointer g; /*points to a glue specification*/
-  glue_ord sto, sho; /*order of infinity*/
+  glue_ord o, sto, sho; /*order of infinity*/
   internal_font_number f; /*the font in a |char_node|*/
   four_quarters i;  /*font information about a |char_node|*/
   eight_bits hd; /*height and depth indices for a character*/
+  bool repack=false; /* whether repacking is necessary */
   last_badness= 0;r= get_node(box_node_size);type(r)= hlist_node;
   subtype(r)= min_quarterword;shift_amount(r)= 0;
-  prev_p= r+list_offset;link(prev_p)= p;
-  h= 0; d= 0; x= 0;
-  total_stretch[normal]= 0;total_shrink[normal]= 0;
-  total_stretch[fil]= 0;total_shrink[fil]= 0;
-  total_stretch[fill]= 0;total_shrink[fill]= 0;
-  total_stretch[filll]= 0;total_shrink[filll]= 0;
-  while(p!=null)
-    {
-    reswitch:
-      while(is_char_node(p))
-	{ f= font(p);i= char_info(f, character(p));hd= height_depth(i);
-	  x= x+char_width(f, i);
-	  s= char_height(f, hd);if (s> h)h= s;
-	  s= char_depth(f, hd);if (s> d)d= s;
-	  p= link(p);
-	}
-      if (p!=null)
-	{ switch(type(p)){
-	  case hlist_node:case vlist_node:case rule_node:case unset_node:
-	    { x= x+width(p);
-	      if (type(p)>=rule_node)s= 0;else s= shift_amount(p);
-	      if (height(p)-s> h)h= height(p)-s;
-	      if (depth(p)+s> d)d= depth(p)+s;
-	    }
-	    break;
-	  case ins_node:case mark_node:case adjust_node:if (adjust_tail!=null)
-	      { while(link(prev_p)!=p)prev_p= link(prev_p);
-		if (type(p)==adjust_node)
-                  { link(adjust_tail)= adjust_ptr(p);
-		    while(link(adjust_tail)!=null)adjust_tail= link(adjust_tail);
-		    p= link(p);free_node(link(prev_p),small_node_size);
-		  }
-		else
-		  { link(adjust_tail)= p;adjust_tail= p;p= link(p);
-		  }
-		link(prev_p)= p;p= prev_p;
-	      }
-	    break;
-	  case whatsit_node:
-            if (subtype(p)==graf_node)
-			  goto repack;
-			else if (subtype(p)==disp_node )
-			  goto repack;
-			else if (subtype(p)==vpack_node )
-			  goto repack;
-			else if (subtype(p)==hpack_node )
-			  goto repack;
-			else if (subtype(p)==hset_node )
-			  goto repack;
-			else if (subtype(p)==vset_node )
-			  goto repack;
-			else if (subtype(p)==stream_node )
-			  goto repack;
-			else if (subtype(p)==image_node)
-			{ glue_ord o;
-			  if (image_height(p)> h) h= image_height(p);
-                          x= x+image_width(p);
-			  o= image_stretch_order(p);total_stretch[o]= total_stretch[o]+image_stretch(p);
-	                  o= image_shrink_order(p);total_shrink[o]= total_shrink[o]+image_shrink(p);
-			}
-            break;
-		break;
-	  case glue_node:
-	    { glue_ord o;
-		  g= glue_ptr(p);x= x+width(g);
-	      o= stretch_order(g);total_stretch[o]= total_stretch[o]+stretch(g);
-	      o= shrink_order(g);total_shrink[o]= total_shrink[o]+shrink(g);
-	      if (subtype(p)>=a_leaders)
-		{ g= leader_ptr(p);
-		  if (height(g)> h)h= height(g);
-		  if (depth(g)> d)d= depth(g);
-		}
-	    }
-	    break;
-	  case kern_node:case math_node:x= x+width(p);break;
-	  case ligature_node:
-	    { mem[lig_trick]= mem[lig_char(p)];link(lig_trick)= link(p);
-	      p= lig_trick;goto reswitch;
-	    }
-	  default:do_nothing;
-	  }
-	  p= link(p);
-	}
+  q= r+list_offset;link(q)= p;
+  h= 0;@<Clear dimensions to zero@>;
+  while(p!=null) {
+reswitch:
+    while(is_char_node(p))
+      @<Incorporate character dimensions into the dimensions of the hbox that will contain~it,
+then move to the next node@>;
+    if (p!=null)
+    { switch(type(p)){
+      case hlist_node: case vlist_node: case rule_node: case unset_node: case unset_set_node: case unset_pack_node:
+        @<Incorporate box dimensions into the dimensions of the hbox that will contain~it@>@;@+break;
+      case ins_node: case mark_node: case adjust_node: if (adjust_tail!=null)
+        @<Transfer node |p| to the adjustment list@>@;@+break;
+      case glue_node: @<Incorporate glue into the horizontal totals@>@;@+break;
+      case kern_node: case math_node: x=x+width(p);@+break;
+      case ligature_node: @<Make node |p| look like a |char_node| and |goto reswitch|@>@;
+      case whatsit_node: @<Incorporate the various extended boxes into an hbox@>@;@+break;
+      default:do_nothing;
+      }
+      p= link(p);
     }
+  }
+
   if (adjust_tail!=null) link(adjust_tail)= null;
   height(r)= h;depth(r)= d;
-      if (total_stretch[filll]!=0)sto= filll;
-      else if (total_stretch[fill]!=0)sto= fill;
-      else if (total_stretch[fil]!=0)sto= fil;
-      else sto= normal;
+  if (repack) /* convert to a |hpack_node| */
+  { q=new_pack_node();
+    height(q)=h;
+    depth(q)=d;
+    width(q)=x;
+    subtype(q)=hpack_node;
+    list_ptr(q)=list_ptr(r);
+    list_ptr(r)=null;
+    free_node(r, box_node_size);
+    pack_limit(q)=max_dimen; /* no limit, not used */
+    pack_m(q)=m;
+    pack_extent(q)=new_xdimen(w,hf,vf);
+    return q;
+  }
+  else if (hf!=0 || vf!=0 )  /* convert to a hset node */
+  { if (total_stretch[filll]!=0)sto= filll;
+    else if (total_stretch[fill]!=0)sto= fill;
+    else if (total_stretch[fil]!=0)sto= fil;
+    else sto= normal;
 
-	  if (total_shrink[filll]!=0)sho= filll;
-      else if (total_shrink[fill]!=0)sho= fill;
-      else if (total_shrink[fil]!=0)sho= fil;
-      else sho= normal;
+    if (total_shrink[filll]!=0)sho= filll;
+    else if (total_shrink[fill]!=0)sho= fill;
+    else if (total_shrink[fil]!=0)sho= fil;
+    else sho= normal;
+    q=new_set_node();
+    subtype(q)=hset_node;
+    height(q)=h;
+    depth(q)=d;
+    width(q)=x; /* the natural width */
+    shift_amount(q)=shift_amount(r);
+    list_ptr(q)=list_ptr(r);
+    list_ptr(r)=null;
+    free_node(r, box_node_size);
+    if (m==exactly)
+      set_extent(q)=new_xdimen(w,hf,vf);
+    else
+      set_extent(q)=new_xdimen(x+w,hf,vf);
+    set_stretch_order(q)=sto;
+    set_shrink_order(q)=sho;
+    set_stretch(q)=total_stretch[sto];
+    set_shrink(q)=total_shrink[sho];
+    return q;
+  }
 
-  if (hf!=0 || vf!=0 )  /* convert to a hset node */
-	{ pointer q;
-	  q=new_set_node();
-	  subtype(q)=hset_node;
-      height(q)=h;
-	  depth(q)=d;
-	  width(q)=x; /* the natural width */
-	  shift_amount(q)=shift_amount(r);
-	  list_ptr(q)=list_ptr(r);
-	  list_ptr(r)=null;
-      free_node(r, box_node_size);
-      if (m==exactly)
-	    set_extent(q)=new_xdimen(w,hf,vf);
-	  else
-	    set_extent(q)=new_xdimen(x+w,hf,vf);
-      set_stretch_order(q)=sto;
-      set_shrink_order(q)=sho;
-      set_stretch(q)=total_stretch[sto];
-      set_shrink(q)=total_shrink[sho];
-	  return q;
-	}
-
-
-
-
- if (m==additional) w= x+w;
- width(r)= w;x= w-x; /*now |x| is the excess to be made up*/
-
-  if (x==0)
-    { glue_sign(r)= normal; glue_order(r)= normal;
-      set_glue_ratio_zero(glue_set(r));
-      goto end;
-    }
-  else if (x> 0)
-    {
-      glue_order(r)= sto;glue_sign(r)= stretching;
-      if (total_stretch[sto]!=0)glue_set(r)= unfloat(x/(double)total_stretch[sto]);
-      else
-	{ glue_sign(r)= normal;
-	  set_glue_ratio_zero(glue_set(r));
-	}
-      if (sto==normal)
-	{ if (list_ptr(r)!=null)
-	    { last_badness= badness(x,total_stretch[normal]);
-	      if (last_badness> hbadness)
-		{ print_ln();
-		  if (last_badness> 100)
-		    print_nl("Underfull");else print_nl("Loose");
-		  print(" \\hbox (badness ");print_int(last_badness);
-		  goto common_ending;
-		}
-	    }
-	}
-      goto end;
-    }
-  else
-    {
-      glue_order(r)= sho;glue_sign(r)= shrinking;
-      if (total_shrink[sho]!=0)
-	glue_set(r)= unfloat((-x)/(double)total_shrink[sho]);
-      else
-	{ glue_sign(r)= normal;
-	  set_glue_ratio_zero(glue_set(r));
-	}
-      if ((total_shrink[sho]<-x)&&(sho==normal)&&(list_ptr(r)!=null))
-	{ last_badness= 1000000;
-	  set_glue_ratio_one(glue_set(r));
-	  if ((-x-total_shrink[normal]> hfuzz)||(hbadness<100))
-	    { if ((overfull_rule> 0)&&(-x-total_shrink[normal]> hfuzz))
-		{ while(link(prev_p)!=null)prev_p= link(prev_p);
-		  link(prev_p)= new_rule();
-		  width(link(prev_p))= overfull_rule;
-		}
-	      print_ln();print_nl("Overfull \\hbox (");
-	      print_scaled(-x-total_shrink[normal]);print("pt too wide");
-	      goto common_ending;
-	    }
-	}
-      else if (sho==normal)
-	{ if (list_ptr(r)!=null)
-	    { last_badness= badness(-x,total_shrink[normal]);
-	      if (last_badness> hbadness)
-		{ print_ln();print_nl("Tight \\hbox (badness ");print_int(last_badness);
-		  goto common_ending;
-		}
-	    }
-	}
-      goto end;
-    }
- common_ending:
+@<Determine the value of |width(r)| and the appropriate glue setting; then |return|
+or |goto common_ending|@>;
+common_ending:
   if (pack_begin_line!=0)
 	{ if (pack_begin_line> 0)print(") in paragraph at lines ");
 	  else print(") in alignment at lines ");
@@ -31289,25 +31171,38 @@
   print_ln();
   font_in_short_display= null_font;short_display(list_ptr(r));print_ln();
   begin_diagnostic();show_box(r);end_diagnostic(true);
- end:return r;
+end:return r;
+}
 
+@ Now we consider the various whatsit nodes that are new in Hi\TeX.
+In most cases, it is no longer possible to determine the dimensions so that
+the |hpack| function is forced to return a hpack node. The hpack nodes cause
+special trouble when converting mlists to hlists because there the dimensions
+are necessary for positioning the parts of the formulas.
+A clean solution requires to postpone such computations to the \HINT\ viewer.
+For now we adopt a simpler solution and supply an educated guess which is
+reasonable since the boxes that occur in math formulas are often not very
+complicated. | graph_node|s should not be in a horizontal list, and |disp_node|s
+should be only inside |graph_node|s.
 
-repack:
-  {  /* convert the box to a |hpack_node| */
-	  pointer q;
-	  q=new_pack_node();
-	  height(q)=h;
-	  depth(q)=d;
-	  width(q)=x;
-	  subtype(q)=hpack_node;
-      list_ptr(q)=list_ptr(r);
-	  list_ptr(r)=null;
-      free_node(r, box_node_size);
-	  pack_limit(q)=max_dimen; /* no limit, not used */
-	  pack_m(q)=m;
-	  pack_extent(q)=new_xdimen(w,hf,vf);
-	  return q;
-  }
+@<Incorporate the various extended boxes into an hbox@>=
+switch (subtype(p))
+{ case graf_node:  break;
+  case disp_node:  break;
+  case vpack_node:
+  case hpack_node:
+  case hset_node:
+  case vset_node:
+    @<Incorporate box dimensions into the dimensions of the hbox...@>@;
+    repack=true; break;
+  case stream_node: repack=true; break; /* streams are for page templates only */
+  case image_node:
+    if (image_height(p)> h) h= image_height(p);
+    x= x+image_width(p);
+    o= image_stretch_order(p);total_stretch[o]= total_stretch[o]+image_stretch(p);
+    o= image_shrink_order(p);total_shrink[o]= total_shrink[o]+image_shrink(p);
+    break;
+  default: break;
 }
 
 @ @<Hi\TeX\ routines@>=
@@ -31740,7 +31635,6 @@
 @ The default values are replaced by parameters given to the {\tt\BS setpage}
 primitive and by the current values of certain
 \TeX\ registers when finishing the page template.
-page template itself,
 
 @<Hi\TeX\ routines@>=
 static void hfinish_page_group(void)
@@ -33896,7 +33790,7 @@
 static void usage_help(void)
 {@+@<explain the command line@>@;
   @<explain the options@>@;
-  fprintf(stderr,"\nEmail bug reports to ruckert@@cs.hm.edu.\n");
+  fprintf(stdout,"\nFor further information and reporting bugs see https://hint.userweb.mwn.de/\n");
   exit(0);
 }
 
@@ -33903,13 +33797,13 @@
 @ The command line commes in three slightly different versions:
 
 @<explain the command line@>=
-  fprintf(stderr,@/
+  fprintf(stdout,@/
     "Usage: %s [OPTION]... [TEXNAME[.tex]] [COMMANDS]\n"@/
     "   or: %s [OPTION]... \\FIRST-LINE\n"@/
     "   or: %s [OPTION]... &FMT ARGS\n\n",@/
     argv[0],argv[0],argv[0]);@/
-  fprintf(stderr,@/
-    "  Run TeX on TEXNAME, creating TEXNAME.dvi.\n"@/
+  fprintf(stdout,@/
+    "  Run HiTeX on TEXNAME, creating TEXNAME.hnt.\n"@/
     "  Any remaining COMMANDS are processed\n"@/
     "  as TeX input after TEXNAME is read.\n"@/
     "  If the first line of TEXNAME starts with %%&FMT, and FMT is\n"@/
@@ -33931,7 +33825,7 @@
 @ Here is the list of possible options and their explanation:
 
 @<explain the options@>=
-  fprintf(stderr,
+  fprintf(stdout,
   "Options:\n"@/
   " -help                 "@/
   @t\qquad@>"\t display this help and exit\n"@/
@@ -33939,8 +33833,8 @@
   @t\qquad@>"\t output version information and exit\n"@/
   " -etex                 "@/
   @t\qquad@>"\t enable e-TeX extensions\n"@/
-  " -prote                 "@/
-  @t\qquad@>"\t enable prote extensions\n"@/
+  " -ltx                 "@/
+  @t\qquad@>"\t enable extensions required for LaTeX\n"@/
   " -ini                  "@/
   @t\qquad@>"\t be initex for dumping formats; this is\n"@/
   @t\qquad@>"\t\t\t also true if the program name is `kinitex'\n"@/
@@ -33971,8 +33865,8 @@
   @t\qquad@>"\t enable compression of section 1 and 2\n"@/
   " [-no]-empty-page      "@/
   @t\qquad@>"\t Disable/Enable empty pages\n"@/
-  " -hyphenate-first-word "@/
-  @t\qquad@>"\t hyphenate the first word of a paragraph\n"@/
+  " -no-hyphenate-first-word "@/
+  @t\qquad@>"\t don't hyphenate the first word of a paragraph\n"@/
   " -resolution=NUMBER    "@/
   @t\qquad@>"\t set the resolution to NUMBER dpi\n"@/
   " -mfmode=MODE          "@/
@@ -34003,12 +33897,12 @@
 @<Global...@>=
 static int iniversion=0;
 static int etexp=0;
-static int protep=0;
+static int ltxp=0;
 static int parsefirstlinep=-1;
 static int filelineerrorstylep=-1;
 static const char *user_progname=NULL, *output_directory=NULL, *c_job_name=NULL;
 static char *dump_name=NULL;@#
-int option_no_empty_page=true, option_hyphen_first=false;
+int option_no_empty_page=true, option_hyphen_first=true;
 int option_dpi=600;
 const char *option_mfmode="ljfour", *option_dpi_str="600";
 extern int option_compress;
@@ -34028,7 +33922,7 @@
       { "cnf-line",                  1, 0, 0 },@/
       { "ini",                       0, &iniversion, 1 },@/
       { "etex",                      0, &etexp, 1 },@/
-      { "prote",                     0, &protep, 1 },@/
+      { "ltx",                     0, &ltxp, 1 },@/
       { "parse-first-line",          0, &parsefirstlinep, 1 },@/
       { "no-parse-first-line",       0, &parsefirstlinep, 0 },@/
       { "file-line-error",           0, &filelineerrorstylep, 1 },@/
@@ -34036,7 +33930,7 @@
       { "compress",                  0, &option_compress, 1 },@/
       { "no-empty-page",             0, &option_no_empty_page, 1 },@/
       { "empty-page",                0, &option_no_empty_page, 0 },@/
-      { "hyphenate-first-word",      0, &option_hyphen_first, 1 },@/
+      { "no-hyphenate-first-word",   0, &option_hyphen_first, 0 },@/
       { "resolution",                1, 0, 0 },@/
       { "mfmode",                    1, 0, 0 },@/
 #ifdef DEBUG
@@ -34058,6 +33952,10 @@
     int g = getopt_long_only (argc, argv, "+", long_options, &option_index);
     if (g==0)
     { @<handle the option at |option_index|@>@;@+ }
+    else if (g == '?')
+    { fprintf(stderr,"Try '%s --help' for more information\n",argv[0]);
+      exit(1);
+    }
     else if (g == -1) return;
   }
 }
@@ -34081,10 +33979,15 @@
 #define ARGUMENT_IS(S) argument_is(long_options+option_index,S)
 
 @ Now we can handle the first two options:
+
+ at d HiTeX_version 1
+ at d HiTeX_revision 0
+ at d HiTeX_version_string "1.0"
+
 @<handle the option at |option_index|@>=
 if (ARGUMENT_IS("help")) usage_help();
 else if (ARGUMENT_IS("version")){@+
-       printf("Version 0.0\n");
+       printf("Version " HiTeX_version_string "\n");
        exit(0);@+
 }
 
@@ -34389,8 +34292,8 @@
 { fprintf(stderr,"-etex requires -ini\n");
   exit(1);
 }
-if (protep && !etexp )
-{ fprintf(stderr,"-prote requires -etex\n");
+if (ltxp && !etexp )
+{ fprintf(stderr,"-ltx requires -etex\n");
   exit(1);
 }
 
@@ -34862,14 +34765,12 @@
 the new engine returns a version number as an integer
 extending the cases for |last_item|.
 
- at d HiTeX_version 1
- at d HiTeX_revision 0
 @d HiTeX_version_code (eTeX_last_last_item_cmd_mod+7) /* \.{\\HiTeXversion} */
 @d HiTeX_revision_code (eTeX_last_last_item_cmd_mod+8) /* \.{\\HiTeXrevision} */
 
 @<Generate all \Prote\ primitives@>=
 primitive("HiTeXversion", last_item, HiTeX_version_code);
-@!@:Hi\TeX\_version\_}{\.{\\HiTeXversion} primitive@>
+@!@:HiTeX\_version\_}{\.{\\HiTeXversion} primitive@>
 primitive("HiTeXrevision", last_item, HiTeX_revision_code);
 @!@:HiTeX\_revision\_}{\.{\\HiTeXrevision} primitive@>
 

Modified: trunk/Build/source/texk/web2c/hitexdir/tests/hello.test
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/tests/hello.test	2021-11-22 00:49:10 UTC (rev 61116)
+++ trunk/Build/source/texk/web2c/hitexdir/tests/hello.test	2021-11-22 16:45:58 UTC (rev 61117)
@@ -20,13 +20,13 @@
 ./hitex -ini -interaction=nonstopmode -output-directory=$OUTDIR hello.tex \
 || exit $?
 
-./histretch -n $OUTDIR/hello.hnt || exit $?
+./histretch $OUTDIR/hello.hnt || exit $?
 
-if grep "<section 3 '../../../texk/web2c/tests/cmr10.tfm'>" \
-        $OUTDIR/hello.HINT >/dev/null; then
+if grep "<section 3 .*cmr10.tfm'>" \
+        $OUTDIR/hello.hint >/dev/null; then
   : # OK
 else
-  echo "hello.HINT does not contain the proper <section with" \
+  echo "hello.hint does not contain the proper <section with" \
        " cmr10.tfm, goodbye." >&2
   exit 1
 fi

Modified: trunk/Build/source/texk/web2c/hitexdir/tests/rule.test
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/tests/rule.test	2021-11-22 00:49:10 UTC (rev 61116)
+++ trunk/Build/source/texk/web2c/hitexdir/tests/rule.test	2021-11-22 16:45:58 UTC (rev 61117)
@@ -12,20 +12,20 @@
 ./hitex -ini --interaction=nonstopmode -output-directory=$OUTDIR rule.tex \
 || exit $?
 ./histretch $OUTDIR/rule.hnt || exit $?
-./hishrink -o $OUTDIR/rule.out.hnt $OUTDIR/rule.HINT || exit $?
+./hishrink -o $OUTDIR/rule.out.hnt $OUTDIR/rule.hint || exit $?
 ./histretch $OUTDIR/rule.out.hnt || exit $?
 
-if grep "<rule 0x48.451Ept 1pt 0x1C.73E7pt>" $OUTDIR/rule.HINT >/dev/null; then
+if grep "<rule 0x48.451Ept 1pt 0x1C.73E7pt>" $OUTDIR/rule.hint >/dev/null; then
   : # OK
 else
-  echo "rule.HINT does not contain the proper <rule, goodbye." >&2
+  echo "rule.hint does not contain the proper <rule, goodbye." >&2
   exit 1
 fi
 
-if diff $OUTDIR/rule.out.HINT $OUTDIR/rule.HINT; then # -w?
+if diff $OUTDIR/rule.out.hint $OUTDIR/rule.hint; then # -w?
   : # OK
 else
-  echo "rule.out.HINT and rule.HINT differ, goodbye." >&2
+  echo "rule.out.hint and rule.hint differ, goodbye." >&2
   exit 1
 fi
 

Added: trunk/Build/source/texk/web2c/hitexdir/tex/ifhitex.tex
===================================================================
--- trunk/Build/source/texk/web2c/hitexdir/tex/ifhitex.tex	                        (rev 0)
+++ trunk/Build/source/texk/web2c/hitexdir/tex/ifhitex.tex	2021-11-22 16:45:58 UTC (rev 61117)
@@ -0,0 +1,7 @@
+% How to test for the HiTeX engine
+\newif\ifHiTeX
+\expandafter\ifx\csname HiTeXversion\endcsname\relax
+  \HiTeXfalse
+\else
+  \HiTeXtrue
+\fi


Property changes on: trunk/Build/source/texk/web2c/hitexdir/tex/ifhitex.tex
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property


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