OSDN Git Service

removed libmd5.
[putex/putex.git] / src / texsourc / tex4.c
index 9149cd6..e79d168 100644 (file)
-/* Copyright 2014 Clerk Ma
-
-   This program is free software; you can redistribute it and/or modify
-   it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
-   (at your option) any later version.
-
-   This program is distributed in the hope that it will be useful, but
-   WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   General Public License for more details.
-
-   You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02110-1301 USA.  */
-
-#define EXTERN extern
-
-#include "yandytex.h"
-
-/* sec 0581 */
-void char_warning_(internal_font_number f, eight_bits c)
-{ 
-  if (tracing_lost_chars > 0)
-  {
-    if (show_missing == 0)
-      begin_diagnostic();
-
-    if (show_missing)
-    {
-      print_nl("! ");
-      prints("Missing character: there is no ");
-    }
-    else
-      print_nl("Missing character: there is no ");
-
-    print(c);
-
-    if (show_numeric)
-    {
-      print_char(' ');
-      print_char('(');
-
-      if (c / 100 > 0)
-      {
-        print_char('0' + c / 100);
-        c = c - (c / 100) * 100;
-        print_char('0' + c / 10);
-      }
-      else
-      {
-        c = c - (c / 100) * 100;
-
-        if (c / 10 > 0)
-          print_char('0' + c / 10);
-      }
-
-      print_char('0' + c % 10);
-      print_char(')');
-    }
-
-    prints(" in font ");
-    slow_print(font_name[f]);
-    print_char('!');
-
-    if (show_missing)
-    {
-      if (f != null_font)
-        show_context();
-    }
-
-    if (show_missing == 0)
-      end_diagnostic(false);
-
-    missing_characters++;
-  }
-}
-/* sec 0582 */
-pointer new_character_(internal_font_number f, eight_bits c)
-{
-  pointer p;
-
-  if (font_bc[f] <= c)
-    if (font_ec[f] >= c)
-      if (char_exists(char_info(f, c)))
-      {
-        p = get_avail();
-        font(p) = f;
-        character(p) = c;
-        return p;
-      }
-
-  char_warning(f, c);
-  return 0;
-}
-/* sec 0598 */
-void dvi_swap (void)
-{ 
-  if (trace_flag)
-  {
-    wterm_cr();
-    printf("dvi_swap() %lld", dvi_gone);
-  }
-
-  if (dvi_limit == dvi_buf_size)
-  {
-    write_dvi(0, half_buf - 1);
-    dvi_limit = half_buf;
-    dvi_offset = dvi_offset + dvi_buf_size;
-    dvi_ptr = 0;
-  }
-  else
-  {
-    write_dvi(half_buf, dvi_buf_size - 1);
-    dvi_limit = dvi_buf_size;
-  }
-
-  dvi_gone = dvi_gone + half_buf;
-}
-/* sec 0600 */
-void dvi_four_(integer x)
-{ 
-  if (x >= 0)
-    dvi_out(x / 0100000000);
-  else
-  {
-    x = x + 010000000000;
-    x = x + 010000000000;
-    dvi_out((x / 0100000000) + 128);
-  }
-
-  x = x % 0100000000;
-  dvi_out(x / 0200000);
-  x = x % 0200000;
-  dvi_out(x / 0400);
-  dvi_out(x % 0400);
-}
-/* sec 0601 */
-void dvi_pop_(integer l)
-{
-  if ((l == dvi_offset + dvi_ptr) && (dvi_ptr > 0))
-    decr(dvi_ptr);
-  else
-    dvi_out(pop);
-}
-/* sec 0602 */
-void dvi_font_def (internal_font_number f)
-{
-  pool_pointer k;
-
-#ifdef INCREASEFONTS
-  if (f <= 256)
-  {
-    dvi_out(fnt_def1);
-    dvi_out(f - 1);
-  }
-  else
-  {
-    dvi_out(fnt_def2);
-    dvi_out(((f - 1) >> 8));
-    dvi_out(((f - 1) & 255));
-  }
-#else
-  dvi_out(fnt_def1);
-  dvi_out(f - 1);
-#endif
-
-  dvi_out(font_check[f].b0);
-  dvi_out(font_check[f].b1);
-  dvi_out(font_check[f].b2);
-  dvi_out(font_check[f].b3);
-  dvi_four(font_size[f]); 
-  dvi_four(font_dsize[f]);
-  dvi_out(length(font_area[f]));
-  dvi_out(length(font_name[f]));
-
-  for (k = str_start[font_area[f]]; k <= str_start[font_area[f] + 1] - 1; k++)
-    dvi_out(str_pool[k]);
-
-  for (k = str_start[font_name[f]]; k <= str_start[font_name[f] + 1] - 1; k++)
-    dvi_out(str_pool[k]);
-}
-/* sec 0607 */
-void movement (scaled w, eight_bits o)
-{
-  small_number mstate;
-  pointer p, q;
-  integer k;
-
-  q = get_node(movement_node_size);
-  width(q) = w;
-  location(q) = dvi_offset + dvi_ptr;
-
-  if (o == down1)
-  {
-    link(q) = down_ptr;
-    down_ptr = q;
-  }
-  else
-  {
-    link(q) = right_ptr;
-    right_ptr = q;
-  }
-
-  p = link(q);
-  mstate = none_seen;
-
-  while (p != 0)
-  {
-    if (width(p) == w)
-      switch (mstate + info(p))
-      {
-        case none_seen + yz_OK:
-        case none_seen + y_OK:
-        case z_seen + yz_OK:
-        case z_seen + y_OK:
-          if (location(p) < dvi_gone)
-            goto not_found;
-          else
-          {
-            k = location(p) - dvi_offset;
-
-            if (k < 0)
-              k = k + dvi_buf_size;
-
-            dvi_buf[k] = dvi_buf[k] + y1 - down1;
-            info(p) = y_here;
-            goto found;
-          }
-          break;
-
-        case none_seen + z_OK:
-        case y_seen + yz_OK:
-        case y_seen + z_OK:
-          if (location(p) < dvi_gone)
-            goto not_found;
-          else
-          {
-            k = location(p) - dvi_offset;
-
-            if (k < 0)
-              k = k + dvi_buf_size;
-
-            dvi_buf[k] = dvi_buf[k] + z1 - down1;
-            info(p) = z_here;
-            goto found;
-          }
-          break;
-
-        case none_seen + y_here:
-        case none_seen + z_here:
-        case y_seen + z_here:
-        case z_seen + y_here:
-          goto found;
-          break;
-
-        default:
-          break;
-      }
-    else
-      switch (mstate + info(p))
-      {
-        case none_seen + y_here:
-          mstate = y_seen;
-          break;
-
-        case none_seen + z_here:
-          mstate = z_seen;
-          break;
-
-        case y_seen + z_here:
-        case z_seen + y_here:
-          goto not_found;
-          break;
-
-        default:
-          break;
-      }
-
-    p = link(p);
-  }
-
-not_found:
-
-  info(q) = yz_OK;
-
-  if (abs(w) >= 8388608L) /* 2^23 */
-  {
-    dvi_out(o + 3);
-    dvi_four(w);
-    return;
-  }
-
-  if (abs(w) >= 32768L)
-  {
-    dvi_out(o + 2);
-
-    if (w < 0)
-      w = w + 16777216L;  /* 2^24 */
-    //dvi_out(w / 65536L);
-    dvi_out((w >> 16));
-    //w = w % 65536L;
-    w = w & 65535L;
-    goto lab2;
-  }
-
-  if (abs(w) >= 128)
-  {
-    dvi_out(o + 1);
-
-    if (w < 0)
-      w = w + 65536L;
-
-    goto lab2;
-  }
-
-  dvi_out(o);
-
-  if (w < 0)
-    w = w + 256;
-
-  goto lab1;
-
-lab2:
-  dvi_out(w / 256);
-
-lab1:
-  dvi_out(w % 256);
-  return;
-
-found:
-  info(q) = info(p);
-
-  if (info(q) == y_here)
-  {
-    dvi_out(o + y0 - down1);
-
-    while (link(q) != p)
-    {
-      q = link(q);
-
-      switch (info(q))
-      {
-        case yz_OK:
-          info(q) = z_OK;
-          break;
-
-        case y_OK:
-          info(q) = d_fixed;
-          break;
-
-        default:
-          break;
-      }
-    }
-  }
-  else
-  {
-    dvi_out(o + z0 - down1);
-
-    while (link(q) != p)
-    {
-      q = link(q);
-
-      switch (info(q))
-      {
-        case yz_OK:
-          info(q) = y_OK;
-          break;
-
-        case z_OK:
-          info(q) = d_fixed;
-          break;
-
-        default:
-          break;
-      }
-    }
-  }
-}
-/* sec 0615 */
-void prune_movements (integer l)
-{
-  pointer p;
-
-  while (down_ptr != 0)
-  {
-    if (location(down_ptr) < l)
-      goto done;
-
-    p = down_ptr;
-    down_ptr = link(p);
-    free_node(p, movement_node_size);
-  }
-
-done:
-  while (right_ptr != 0)
-  {
-    if (location(right_ptr) < l)
-      return;
-
-    p = right_ptr;
-    right_ptr = link(p);
-    free_node(p, movement_node_size);
-  }
-}
-/* sec 1368 */
-void special_out (pointer p)
-{
-  char old_setting;
-  pool_pointer k;
-
-  synch_h();
-  synch_v();
-  old_setting = selector;
-  selector = new_string;
-
-#ifdef ALLOCATESTRING
-  if (pool_ptr + 32000 > current_pool_size)
-    str_pool = realloc_str_pool (increment_pool_size);
-
-  show_token_list(link(write_tokens(p)), 0, 10000000L);
-#else
-  show_token_list(link(write_tokens(p)), 0, pool_size - pool_ptr);
-#endif
-
-  selector = old_setting;
-  str_room(1);
-  graphics_mode();
-  spc_exec_special(str_pool + str_start[str_ptr], cur_length, cur_h * 0.000015202, -cur_v * 0.000015202, 1.0);
-/*
-  if (cur_length < 256)
-  {
-    dvi_out(xxx1);
-    dvi_out(cur_length);
-  }
-  else
-  {Mag
-    dvi_out(xxx4);
-    dvi_four(cur_length); 
-  } 
-
-  for (k = str_start[str_ptr]; k <= pool_ptr - 1; k++)
-    dvi_out(str_pool[k]);
-*/
-  pool_ptr = str_start[str_ptr];
-}
-/* sec 1370 */
-void write_out (pointer p)
-{
-  char old_setting;
-  /* integer old_mode; */
-  int old_mode;
-  /* small_number j; */
-  int j;
-  pointer q, r;
-
-  q = get_avail();
-  info(q) = right_brace_token + '}';
-  r = get_avail();
-  link(q) = r;
-  info(r) = end_write_token;
-  ins_list(q);
-  begin_token_list(write_tokens(p), write_text);
-  q = get_avail();
-  info(q) = left_brace_token + '{';
-  ins_list(q);
-  old_mode = mode;
-  mode = 0;
-  cur_cs = write_loc;
-  q = scan_toks(false, true);
-  get_token();
-
-  if (cur_tok != end_write_token)
-  {
-    print_err("Unbalanced write command");
-    help2("On this page there's a \\write with fewer real {'s than }'s.",
-        "I can't handle that very well; good luck.");
-    error();
-
-    do
-      {
-        get_token();
-      }
-    while (!(cur_tok == end_write_token));
-  }
-
-  mode = old_mode;
-  end_token_list();
-  old_setting = selector;
-  j = write_stream(p);
-
-  if (write_open[j])
-    selector = j;
-  else
-  {
-    if ((j == 17) && (selector == term_and_log))
-      selector = log_only;
-
-    print_nl("");
-  }
-
-  token_show(def_ref);
-  print_ln();
-  flush_list(def_ref);
-  selector = old_setting;
-}
-/* sec 1373 */
-void out_what (pointer p)
-{
-  /* small_number j; */
-  int j;
-
-  switch (subtype(p))
-  {
-    case open_node:
-    case write_node:
-    case close_node:
-      if (!doing_leaders)
-      {
-        j = write_stream(p);
-
-        if (subtype(p) == write_node)
-          write_out(p);
-        else
-        {
-          if (write_open[j])
-            a_close(write_file[j]); 
-
-          if (subtype(p) == close_node)
-            write_open[j]= false;
-          else if (j < 16)
-          {
-            cur_name = open_name(p);
-            cur_area = open_area(p);
-            cur_ext = open_ext(p); 
-
-            if (cur_ext == 335) /* "" */
-              cur_ext = 785;    /* ".tex" */
-
-            pack_file_name(cur_name, cur_area, cur_ext);
-
-            while (!a_open_out(write_file[j]))
-              prompt_file_name("output file name", ".tex");
-
-            write_open[j] = true;
-          }
-        }
-      }
-      break;
-
-    case special_node:
-      special_out(p); 
-      break;
-
-    case language_node:
-      do_nothing();
-      break;
-
-    default:
-      {
-        confusion("ext4");
-        return;
-      }
-      break;
-  }
-}
-/* sec 0619 */
-void hlist_out (void)
-{
-  scaled base_line;
-  scaled left_edge;
-  scaled save_h, save_v;
-  pointer this_box;
-  /* glue_ord g_order; */
-  int g_order;
-  /* char g_sign; */
-  int g_sign;
-  pointer p;
-  integer save_loc;
-  pointer leader_box;
-  scaled leader_wd;
-  scaled lx;
-  boolean outer_doing_leaders;
-  scaled edge;
-  real glue_temp;
-  real cur_glue;
-  scaled cur_g;
-
-  cur_g = 0;
-  cur_glue = 0.0;
-  this_box = temp_ptr;
-  g_order = glue_order(this_box);
-  g_sign = glue_sign(this_box);
-  p = list_ptr(this_box);
-  incr(cur_s);
-
-  if (cur_s > 0)
-    dvi_out(push);
-
-  if (cur_s > max_push)
-    max_push = cur_s;
-
-  save_loc = dvi_offset + dvi_ptr;
-  base_line = cur_v;
-  left_edge = cur_h;
-
-  while (p != 0)
-reswitch:
-    if (is_char_node(p))
-    {
-      synch_h();
-      synch_v();
-
-      do
-        {
-          f = font(p);
-          c = character(p);
-
-          if (f != dvi_f)
-          {
-            if (!font_used[f])
-            {
-              dvi_font_def(f);
-              font_used[f] = true;
-            }
-
-            if (f <= 64 + font_base)
-              dvi_out(f - font_base - 1 + fnt_num_0);
-#ifdef INCREASEFONTS
-            else if (f <= 256)
-            {
-              dvi_out(fnt1);
-              dvi_out(f - 1);
-            }
-            else
-            {
-              dvi_out(fnt2);
-              dvi_out(((f - 1) >> 8));
-              dvi_out(((f - 1) & 255));
-            }
-#else
-            else
-            {
-              dvi_out(fnt1);
-              dvi_out(f - 1);
-            }
-#endif
-
-            dvi_f = f;
-          }
-
-          if (c >= 128)
-            dvi_out(set1);
-
-          dvi_out(c);
-          cur_h = cur_h + char_width(f, char_info(f, c));
-          p = link(p);
-        }
-      while (!(!is_char_node(p)));
-
-      dvi_h = cur_h;
-  }
-  else
-  {
-    switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-        if (list_ptr(p) == 0)
-          cur_h = cur_h + width(p);
-        else
-        {
-          save_h = dvi_h;
-          save_v = dvi_v;
-          cur_v = base_line + shift_amount(p);
-          temp_ptr = p;
-          edge = cur_h;
-
-          if (type(p) == vlist_node)
-            vlist_out();
-          else
-            hlist_out();
-
-          dvi_h = save_h;
-          dvi_v = save_v;
-          cur_h = edge + width(p);
-          cur_v = base_line;
-        }
-        break;
-
-      case rule_node:
-        {
-          rule_ht = height(p);
-          rule_dp = depth(p);
-          rule_wd = width(p);
-          goto fin_rule;
-        }
-        break;
-
-      case whatsit_node:
-        out_what(p);
-        break;
-
-      case glue_node:
-        {
-          g = glue_ptr(p);
-          rule_wd = width(g) - cur_g;
-
-          if (g_sign != normal)
-          {
-            if (g_sign == stretching)
-            {
-              if (stretch_order(g) == g_order)
-              {
-                cur_glue = cur_glue + stretch(g);
-                vet_glue(glue_set(this_box) * cur_glue);
-                cur_g = round(glue_temp);
-              }
-            }
-            else if (shrink_order(g) == g_order)
-            {
-              cur_glue = cur_glue - shrink(g);
-              vet_glue(glue_set(this_box) * cur_glue);
-              cur_g = round(glue_temp);
-            }
-          }
-
-          rule_wd = rule_wd + cur_g;
-
-          if (subtype(p) >= a_leaders)
-          {
-            leader_box = leader_ptr(p);
-
-            if (type(leader_box) == rule_node)
-            {
-              rule_ht = height(leader_box);
-              rule_dp = depth(leader_box);
-              goto fin_rule;
-            }
-
-            leader_wd = width(leader_box);
-
-            if ((leader_wd > 0) && (rule_wd > 0))
-            {
-              rule_wd = rule_wd + 10;
-              edge = cur_h + rule_wd;
-              lx = 0;
-
-              if (subtype(p) == a_leaders)
-              {
-                save_h = cur_h;
-                cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);
-
-                if (cur_h < save_h)
-                  cur_h = cur_h + leader_wd;
-              }
-              else
-              {
-                lq = rule_wd / leader_wd;
-                lr = rule_wd % leader_wd;
-
-                if (subtype(p) == c_leaders)
-                  cur_h = cur_h + (lr / 2);
-                else
-                {
-                  lx = (2 * lr + lq + 1) / (2 * lq + 2);
-                  cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);
-                }
-              }
-
-              while (cur_h + leader_wd <= edge)
-              {
-                cur_v = base_line + shift_amount(leader_box);
-                synch_v();
-                save_v = dvi_v;
-                synch_h();
-                save_h = dvi_h;
-                temp_ptr = leader_box;
-                outer_doing_leaders = doing_leaders;
-                doing_leaders = true;
-
-                if (type(leader_box) == vlist_node)
-                  vlist_out();
-                else
-                  hlist_out();
-
-                doing_leaders = outer_doing_leaders;
-                dvi_v = save_v;
-                dvi_h = save_h;
-                cur_v = base_line;
-                cur_h = save_h + leader_wd + lx;
-              }
-
-              cur_h = edge - 10;
-              goto next_p;
-            }
-          }
-
-          goto move_past;
-        }
-        break;
-
-      case kern_node:
-      case math_node:
-        cur_h = cur_h + width(p);
-        break;
-
-      case ligature_node:
-        {
-          mem[lig_trick] = mem[lig_char(p)];
-          link(lig_trick) = link(p);
-          p = lig_trick;
-          goto reswitch;
-        }
-        break;
-
-      default:
-        break;
-    }
-
-    goto next_p;
-
-fin_rule:
-    if (is_running(rule_ht))
-      rule_ht = height(this_box);
-
-    if (is_running(rule_dp))
-      rule_dp = depth(this_box);
-
-    rule_ht = rule_ht + rule_dp;
-
-    if ((rule_ht > 0) && (rule_wd > 0))
-    {
-      synch_h();
-      cur_v = base_line + rule_dp;
-      synch_v();
-      dvi_out(set_rule);
-      dvi_four(rule_ht);
-      dvi_four(rule_wd);
-      cur_v = base_line;
-      dvi_h = dvi_h + rule_wd;
-    }
-
-move_past:
-    cur_h = cur_h + rule_wd;
-
-next_p:
-    p = link(p);
-  }
-
-  prune_movements(save_loc);
-
-  if (cur_s > 0)
-    dvi_pop(save_loc);
-
-  decr(cur_s);
-}
-/* sec 0629 */
-void vlist_out (void)
-{
-  scaled left_edge;
-  scaled top_edge;
-  scaled save_h, save_v;
-  pointer this_box;
-  /* glue_ord g_order; */
-  int g_order;
-  /* char g_sign; */
-  int g_sign;
-  pointer p;
-  integer save_loc;
-  pointer leader_box;
-  scaled leader_ht;
-  scaled lx;
-  boolean outer_doing_leaders;
-  scaled edge;
-  real glue_temp;
-  real cur_glue;
-  scaled cur_g;
-
-  cur_g = 0;
-  cur_glue = 0.0;
-  this_box = temp_ptr;
-  g_order = glue_order(this_box);
-  g_sign = glue_sign(this_box);
-  p = list_ptr(this_box);
-  incr(cur_s);
-
-  if (cur_s > 0)
-    dvi_out(push);
-
-  if (cur_s > max_push)
-    max_push = cur_s;
-
-  save_loc = dvi_offset + dvi_ptr;
-  left_edge = cur_h;
-  cur_v = cur_v - height(this_box);
-  top_edge = cur_v;
-
-  while (p != 0)
-  {
-    if (is_char_node(p))
-    {
-      confusion("vlistout");
-      return;
-    }
-    else
-    {
-      switch (type(p))
-      {
-        case hlist_node:
-        case vlist_node:
-          if (list_ptr(p) == 0)
-            cur_v = cur_v + height(p) + depth(p);
-          else
-          {
-            cur_v = cur_v + height(p);
-            synch_v();
-            save_h = dvi_h;
-            save_v = dvi_v;
-            cur_h = left_edge + shift_amount(p);
-            temp_ptr = p;
-
-            if (type(p) == vlist_node)
-              vlist_out();
-            else
-              hlist_out();
-
-            dvi_h = save_h;
-            dvi_v = save_v;
-            cur_v = save_v + depth(p);
-            cur_h = left_edge;
-          }
-          break;
-
-        case rule_node:
-          {
-            rule_ht = height(p);
-            rule_dp = depth(p);
-            rule_wd = width(p);
-            goto fin_rule;
-          }
-          break;
-
-        case whatsit_node:
-          out_what(p);
-          break;
-
-        case glue_node:
-          {
-            g = glue_ptr(p);
-            rule_ht = width(g) - cur_g;
-
-            if (g_sign != normal)
-            {
-              if (g_sign == stretching)
-              {
-                if (stretch_order(g) == g_order)
-                {
-                  cur_glue = cur_glue + stretch(g);
-                  vet_glue(glue_set(this_box) * cur_glue);
-                  cur_g = round(glue_temp);
-                }
-              }
-              else if (shrink_order(g) == g_order)   /* BUG FIX !!! */
-              {
-                cur_glue = cur_glue - shrink(g);
-                vet_glue(glue_set(this_box) * cur_glue);
-                cur_g = round(glue_temp);
-              }
-            }
-
-            rule_ht = rule_ht + cur_g;
-
-            if (subtype(p) >= a_leaders)
-            {
-              leader_box = leader_ptr(p);
-
-              if (type(leader_box) == rule_node)
-              {
-                rule_wd = width(leader_box);
-                rule_dp = 0;
-                goto fin_rule;
-              }
-
-              leader_ht = height(leader_box) + depth(leader_box);
-
-              if ((leader_ht > 0) && (rule_ht > 0))
-              {
-                rule_ht = rule_ht + 10;
-                edge = cur_v + rule_ht;
-                lx = 0;
-
-                if (subtype(p) == a_leaders)
-                {
-                  save_v = cur_v;
-                  cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);
-
-                  if (cur_v < save_v)
-                    cur_v = cur_v + leader_ht;
-                }
-                else
-                {
-                  lq = rule_ht / leader_ht;
-                  lr = rule_ht % leader_ht;
-
-                  if (subtype(p) == c_leaders)
-                    cur_v = cur_v + (lr / 2);
-                  else
-                  {
-                    lx = (2 * lr + lq + 1) / (2 * lq + 2);
-                    cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);
-                  }
-                }
-
-                while (cur_v + leader_ht <= edge)
-                {
-                  cur_h = left_edge + shift_amount(leader_box);
-                  synch_h();
-                  save_h = dvi_h;
-                  cur_v = cur_v + height(leader_box);
-                  synch_v();
-                  save_v = dvi_v;
-                  temp_ptr = leader_box;
-                  outer_doing_leaders = doing_leaders;
-                  doing_leaders = true;
-
-                  if (type(leader_box) == vlist_node)
-                    vlist_out();
-                  else
-                    hlist_out();
-
-                  doing_leaders = outer_doing_leaders;
-                  dvi_v = save_v;
-                  dvi_h = save_h;
-                  cur_h = left_edge;
-                  cur_v = save_v - height(leader_box) + leader_ht + lx;
-                }
-
-                cur_v = edge - 10;
-                goto next_p;
-              }
-            }
-
-            goto move_past;
-          }
-          break;
-
-        case kern_node:
-          cur_v = cur_v + width(p);
-          break;
-
-        default:
-          break;
-      }
-
-      goto next_p;
-
-fin_rule:
-      if (is_running(rule_wd))
-        rule_wd = width(this_box);
-
-      rule_ht = rule_ht + rule_dp;
-      cur_v = cur_v + rule_ht;
-
-      if ((rule_ht > 0) && (rule_wd > 0))
-      {
-        synch_h();
-        synch_v();
-        dvi_out(put_rule);
-        dvi_four(rule_ht);
-        dvi_four(rule_wd);
-      }
-
-      goto next_p;
-
-move_past:
-      cur_v = cur_v + rule_ht;
-    }
-
-next_p:
-    p = link(p);
-  }
-
-  prune_movements(save_loc);
-
-  if (cur_s > 0)
-    dvi_pop(save_loc);
-
-  decr(cur_s);
-}
-/* sec 0638 */
-void dvi_ship_out_(pointer p)
-{
-  integer page_loc;
-  char j, k;
-  pool_pointer s;
-  char old_setting;
-
-  if (tracing_output > 0)
-  {
-    print_nl("");
-    print_ln();
-    prints("Completed box being shipped out");
-  }
-
-  if (term_offset > max_print_line - 9)
-    print_ln();
-  else if ((term_offset > 0) || (file_offset > 0))
-    print_char(' ');
-
-  print_char('[');
-  j = 9;
-
-  while ((count(j) == 0) && (j > 0))
-    decr(j);
-
-  for (k = 0; k <= j; k++)
-  {
-    print_int(count(k));
-
-    if (k < j)
-      print_char('.');
-  }
-  
-  update_terminal();
-
-  if (tracing_output > 0)
-  {
-    print_char(']');
-    begin_diagnostic();
-    show_box(p);
-    end_diagnostic(true);
-  }
-
-  if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||
-      (height(p) + depth(p) + v_offset > max_dimen) ||
-      (width(p) + h_offset > max_dimen))
-  {
-    print_err("Huge page cannot be shipped out");
-    help2("The page just created is more than 18 feet tall or",
-        "more than 18 feet wide, so I suspect something went wrong.");
-    error();
-
-    if (tracing_output <= 0)
-    {
-      begin_diagnostic();
-      print_nl("The following box has been deleted:");
-      show_box(p);
-      end_diagnostic(true);
-    }
-
-    goto done;
-  }
-
-  if (height(p) + depth(p) + v_offset > max_v)
-    max_v = height(p) + depth(p) + v_offset;
-
-  if (width(p) + h_offset > max_h)
-    max_h = width(p) + h_offset;
-
-  dvi_h = 0;
-  dvi_v = 0;
-  cur_h = h_offset;
-  dvi_f = null_font;
-  ensure_dvi_open();
-
-  if (total_pages == 0)
-  {
-    dvi_out(pre);
-    dvi_out(id_byte);
-    dvi_four(25400000L);
-    dvi_four(473628672L);
-    prepare_mag();
-    dvi_four(mag);
-    old_setting = selector;
-    selector = new_string;
-    prints(" TeX output ");
-    print_int(year);
-    print_char('.');
-    print_two(month);
-    print_char('.');
-    print_two(day);
-    print_char(':');
-    print_two(tex_time / 60);
-    print_two(tex_time % 60);
-    selector = old_setting;
-    dvi_out(cur_length);
-
-    for (s = str_start[str_ptr]; s <= pool_ptr - 1; s++)
-      dvi_out(str_pool[s]);
-
-    pool_ptr = str_start[str_ptr];
-  }
-
-  page_loc = dvi_offset + dvi_ptr;
-  dvi_out(bop);
-
-  for (k = 0; k <= 9; k++)
-    dvi_four(count(k));
-
-  dvi_four(last_bop);
-  last_bop = page_loc;
-  cur_v = height(p) + v_offset;
-  temp_ptr = p;
-
-  if (type(p) == vlist_node)
-    vlist_out();
-  else
-    hlist_out();
-
-  dvi_out(eop);
-  incr(total_pages);
-  cur_s = -1;
-
-done:
-  if (tracing_output <= 0)
-    print_char(']');
-
-  dead_cycles = 0;
-  update_terminal();
-
-#ifdef STAT
-  if (tracing_stats > 1)
-  {
-    print_nl("Memory usage before: ");
-    print_int(var_used);
-    print_char('&');
-    print_int(dyn_used);
-    print_char(';');
-  }
-#endif
-
-  flush_node_list(p);
-
-#ifdef STAT
-  if (tracing_stats > 1)
-  {
-    prints(" after: ");
-    print_int(var_used);
-    print_char('&');
-    print_int(dyn_used);
-    prints("; still utouched: ");
-    print_int(hi_mem_min - lo_mem_max - 1);
-    print_ln();
-  }
-#endif
-}
-void ship_out (pointer p)
-{
-  //printf("init pdf devices.");
-  //dvi_ship_out_(p);
-  //printf("DPX test");
-  pdf_ship_out(p);
-  /*
-  switch (shipout_flag)
-  {
-    case out_dvi_flag:
-    case out_xdv_flag:
-      dvi_ship_out_(p);
-      break;
-    case out_pdf_flag:
-      //pdf_ship_out(p);
-      break;
-  }*/
-}
-/* sec 0645 */
-void scan_spec (group_code c, boolean three_codes)
-{
-  integer s;
-  char spec_code;
-
-  if (three_codes)
-    s = saved(0);
-
-  if (scan_keyword("to"))
-    spec_code = exactly;
-  else if (scan_keyword("spread"))
-    spec_code = additional;
-  else
-  {
-    spec_code = additional;
-    cur_val = 0;
-    goto found;
-  }
-
-  scan_dimen(false, false, false);
-
-found:
-  if (three_codes)
-  {
-    saved(0) = s;
-    incr(save_ptr);
-  }
-
-  saved(0) = spec_code;
-  saved(1) = cur_val;
-  save_ptr = save_ptr + 2;
-  new_save_level(c);
-  scan_left_brace();
-}
-/* sec 0649 */
-pointer hpack_(pointer p, scaled w, small_number m)
-{
-  pointer r;
-  pointer q;
-  scaled h, d, x;
-  scaled s;
-  pointer g;
-  /* glue_ord o; */
-  int o;
-  internal_font_number f;
-  four_quarters i;
-  eight_bits hd;
-
-  last_badness = 0;
-  r = get_node(box_node_size);
-  type(r) = hlist_node;
-  subtype(r) = 0;
-  shift_amount(r) = 0;
-  q = r + list_offset;
-  link(q) = 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 != 0)
-  {
-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 != 0)
-    {
-      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 != 0)
-          {
-            while (link(q) != p)
-              q = link(q);
-
-            if (type(p) == adjust_node)
-            {
-              link(adjust_tail) = adjust_ptr(p);
-
-              while (link(adjust_tail) != 0)
-                adjust_tail = link(adjust_tail);
-
-              p = link(p);
-              free_node(link(q), small_node_size);
-            }
-            else
-            {
-              link(adjust_tail) = p;
-              adjust_tail = p;
-              p = link(p);
-            }
-
-            link(q) = p;
-            p = q;
-          }
-          break;
-
-        case whatsit_node:
-          break;
-
-        case glue_node:
-          {
-            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;
-          }
-          break;
-
-        default:
-          break;
-      }
-      p = link(p);
-    }
-  }
-
-  if (adjust_tail != 0)
-    link(adjust_tail) = 0;
-
-  height(r) = h;
-  depth(r) = d;
-
-  if (m == additional)
-    w = x + w;
-
-  width(r) = w;
-  x = w - x;
-
-  if (x == 0)
-  {
-    glue_sign(r) = normal;
-    glue_order(r) = normal;
-    glue_set(r) = 0.0;
-    goto exit;
-  }
-  else if (x > 0)
-  {
-    if (total_stretch[filll] != 0)
-      o = filll;
-    else if (total_stretch[fill] != 0)
-      o = fill;
-    else if (total_stretch[fil] != 0)
-      o = fil;
-    else
-      o = normal;
-
-    glue_order(r) = o;
-    glue_sign(r) = stretching;
-
-    if (total_stretch[o] != 0)
-      glue_set(r) = x / ((double) total_stretch[o]);
-    else
-    {
-      glue_sign(r) = normal;
-      glue_set(r) = 0.0;
-    }
-
-    if (o == normal)
-      if (list_ptr(r) != 0)
-      {
-        last_badness = badness(x, total_stretch[normal]);
-
-        if (last_badness > hbadness)
-        {
-          print_ln();
-
-          if (last_badness > 100)
-            print_nl("Underfull");
-          else
-            print_nl("Loose");
-
-          prints(" \\hbox (badness ");
-          print_int(last_badness);
-
-          if (last_badness > 100)
-            underfull_hbox++;
-
-          goto common_ending;
-        }
-      }
-
-    goto exit;
-  }
-  else
-  {
-    if (total_shrink[filll] != 0)
-      o = filll;
-    else if (total_shrink[fill] != 0)
-      o = fill;
-    else if (total_shrink[fil] != 0)
-      o = fil;
-    else
-      o = normal;
-
-    glue_order(r) = o;
-    glue_sign(r) = shrinking;
-
-    if (total_shrink[o] != 0)
-      glue_set(r) = ((- (integer) x) / ((double) total_shrink[o]));
-    else
-    {
-      glue_sign(r) = normal;
-      glue_set(r) = 0.0;
-    }
-
-    if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))
-    {
-      last_badness = 1000000L;
-      glue_set(r) = 1.0;
-
-      if ((- (integer) x - total_shrink[normal] > hfuzz) || (hbadness < 100))
-      {
-        if ((overfull_rule > 0) && (- (integer) x - total_shrink[0] > hfuzz))
-        {
-          while (link(q) != 0)
-            q = link(q);
-          
-          link(q) = new_rule();
-          width(link(q)) = overfull_rule;
-        }
-        
-        print_ln();
-        print_nl("Overfull \\hbox (");
-        print_scaled(- (integer) x - total_shrink[normal]);
-        prints("pt too wide");
-        
-        overfull_hbox++;
-        goto common_ending;
-      }
-    }
-    else if (o == normal)
-      if (list_ptr(r) != 0)
-      {
-        last_badness = badness(- (integer) x, total_shrink[normal]);
-
-        if (last_badness > hbadness)
-        {
-          print_ln();
-          print_nl("Tight \\hbox (badness ");
-          print_int(last_badness);
-          goto common_ending;
-        }
-      }
-
-    goto exit;
-  }
-
-common_ending:
-
-  if (output_active)
-    prints(") has occurred while \\output is active");
-  else
-  {
-    if (pack_begin_line != 0)
-    {
-      if (pack_begin_line > 0)
-        prints(") in paragraph at lines ");
-      else
-        prints(") in alignment at lines ");
-
-      print_int(abs(pack_begin_line));
-      prints("--");
-    }
-    else
-      prints(") detected at line ");
-
-    print_int(line);
-  }
-
-  print_ln();
-  font_in_short_display = null_font;
-  short_display(list_ptr(r));
-  print_ln();
-  begin_diagnostic();
-  show_box(r);
-  end_diagnostic(true);
-
-exit:
-  return r;
-}
-/* sec 0668 */
-pointer vpackage_(pointer p, scaled h, small_number m, scaled l)
-{
-  pointer r;
-  scaled w, d, x;
-  scaled s;
-  pointer g;
-  /* glue_ord o; */
-  int o;
-
-  last_badness = 0;
-  r = get_node(box_node_size);
-  type(r) = vlist_node;
-  subtype(r) = min_quarterword;
-  shift_amount(r) = 0;
-  list_ptr(r) = p;
-  w = 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 != 0)
-  {
-    if (is_char_node(p))
-    {
-      confusion("vpack");
-      return 0;
-    }
-    else switch (type(p))
-    {
-      case hlist_node:
-      case vlist_node:
-      case rule_node:
-      case unset_node:
-        {
-          x = x + d + height(p);
-          d = depth(p);
-
-          if (type(p) >= rule_node)
-            s = 0;
-          else
-            s = shift_amount(p);
-
-          if (width(p) + s > w)
-            w = width(p) + s;
-        }
-        break;
-
-      case whatsit_node:
-        break;
-
-      case glue_node:
-        {
-          x = x + d;
-          d = 0;
-          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 (width(g) > w)
-              w = width(g);
-          }
-        }
-        break;
-
-      case kern_node:
-        {
-          x = x + d + width(p);
-          d = 0;
-        }
-        break;
-
-      default:
-        break;
-    }
-
-    p = link(p);
-  }
-
-  width(r) = w;
-
-  if (d > l)
-  {
-    x = x + d - l;
-    depth(r) = l;
-  }
-  else
-    depth(r) = d;
-
-  if (m == additional)
-    h = x + h;
-
-  height(r) = h;
-  x = h - x;
-
-  if (x == 0)
-  {
-    glue_sign(r) = normal;
-    glue_order(r) = normal;
-    glue_set(r) = 0.0;
-    goto exit;
-  }
-  else if (x > 0)
-  {
-    if (total_stretch[filll] != 0)
-      o = filll;
-    else if (total_stretch[fill] != 0)
-      o = fill;
-    else if (total_stretch[fil] != 0)
-      o = fil;
-    else
-      o = normal;
-
-    glue_order(r) = o;
-    glue_sign(r) = stretching;
-
-    if (total_stretch[o] != 0)
-      glue_set(r) = x / ((double) total_stretch[o]);
-    else
-    {
-      glue_sign(r) = normal;
-      glue_set(r) = 0.0;
-    }
-
-    if (o == normal)
-      if (list_ptr(r) != 0)
-      {
-        last_badness = badness(x, total_stretch[normal]);
-
-        if (last_badness > vbadness)
-        {
-          print_ln();
-
-          if (last_badness > 100)
-            print_nl("Underfull");
-          else
-            print_nl("Loose");
-
-          prints(" \\vbox (badness ");
-          print_int(last_badness);
-
-          if (last_badness > 100)
-            underfull_vbox++;
-
-          goto common_ending;
-        }
-      }
-
-    goto exit;
-  }
-  else
-  {
-    if (total_shrink[filll] != 0)
-      o = filll;
-    else if (total_shrink[fill] != 0)
-      o = fill;
-    else if (total_shrink[fil] != 0)
-      o = fil;
-    else
-      o = normal;
-
-    glue_order(r) = o;
-    glue_sign(r) = shrinking;
-
-    if (total_shrink[o] != 0)
-      glue_set(r) = (- (integer) x) / ((double) total_shrink[o]);
-    else
-    {
-      glue_sign(r) = normal;
-      glue_set(r) = 0.0;
-    }
-
-    if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))
-    {
-      last_badness = 1000000L;
-      glue_set(r) = 1.0;
-
-      if ((- (integer) x - total_shrink[0] > vfuzz) || (vbadness < 100))
-      {
-        print_ln();
-        print_nl("Overfull \\vbox (");
-        print_scaled(- (integer) x - total_shrink[0]);
-        prints("pt too high");
-
-        overfull_vbox++;
-
-        goto common_ending;
-      }
-    }
-    else if (o == 0)
-      if (list_ptr(r) != 0)
-      {
-        last_badness = badness(- (integer) x, total_shrink[normal]);
-        if (last_badness > vbadness)
-        {
-          print_ln();
-          print_nl("Tight \\vbox (badness ");
-          print_int(last_badness);
-          goto common_ending;
-        }
-      }
-
-    goto exit;
-  }
-
-common_ending:
-
-  if (output_active)
-    prints(") has occurred while \\output is active");
-  else
-  {
-    if (pack_begin_line != 0)
-    {
-      prints(") in alignment at lines ");
-      print_int(abs(pack_begin_line));
-      prints("--");
-    }
-    else
-      prints(") detected at line ");
-
-    print_int(line);
-    print_ln();
-  }
-
-  begin_diagnostic();
-  show_box(r);
-  end_diagnostic(true);
-
-exit:
-  return r;
-}
-/* sec 0679 */
-void append_to_vlist (pointer b)
-{
-  scaled d;
-  pointer p;
-
-  if (prev_depth > ignore_depth)
-  {
-    d = width(baseline_skip) - prev_depth - height(b);
-
-    if (d < line_skip_limit)
-      p = new_param_glue(line_skip_code);
-    else
-    {
-      p = new_skip_param(baseline_skip_code);
-      width(temp_ptr) = d;
-    }
-
-    link(tail) = p;
-    tail = p;
-  }
-
-  link(tail) = b;
-  tail = b;
-  prev_depth = depth(b);
-}
-/* sec 0686 */
-pointer new_noad (void)
-{
-  pointer p;
-
-  p = get_node(noad_size);
-  type(p) = ord_noad;
-  subtype(p) = normal;
-  mem[nucleus(p)].hh = empty_field;
-  mem[subscr(p)].hh = empty_field;
-  mem[supscr(p)].hh = empty_field;
-
-  return p;
-}
-/* sec 0688 */
-pointer new_style (small_number s)
-{
-  pointer p;
-
-  p = get_node(style_node_size);
-  type(p) = style_node;
-  subtype(p) = s;
-  width(p) = 0;
-  depth(p) = 0;
-
-  return p;
-}
-/* sec 0689 */
-pointer new_choice (void)
-{
-  pointer p;
-
-  p = get_node(style_node_size);
-  type(p) = choice_node;
-  subtype(p) = 0;
-  display_mlist(p) = 0;
-  text_mlist(p) = 0;
-  script_mlist(p) = 0;
-  script_script_mlist(p) = 0;
-
-  return p;
-}
-/* sec 0693 */
-void show_info (void)
-{
-  show_node_list(info(temp_ptr));
-}
-/* sec 0704 */
-pointer fraction_rule (scaled t)
-{
-  pointer p;
-
-  p = new_rule();
-  height(p) = t;
-  depth(p) = 0;
-
-  return p;
-}
-/* sec 0705 */
-pointer overbar (pointer b, scaled k, scaled t)
-{
-  pointer p, q;
-
-  p = new_kern(k);
-  link(p) = b;
-  q = fraction_rule(t);
-  link(q) = p;
-  p = new_kern(t);
-  link(p) = q;
-
-  return vpackage(p, 0, 1, max_dimen);
-}
-/* sec 0709 */
-pointer char_box (internal_font_number f, quarterword c)
-{
-  four_quarters q;
-  eight_bits hd;
-  pointer b, p;
-
-  q = char_info(f, c);
-  hd = height_depth(q);
-  b = new_null_box();
-  width(b) = char_width(f, q) + char_italic(f, q);
-  height(b) = char_height(f, hd);
-  depth(b) = char_depth(f, hd);
-  p = get_avail();
-  character(p) = c;
-  font(p) = f;
-  list_ptr(b) = p;
-
-  return b;
-}
-/* sec 0711 */
-void stack_into_box (pointer b, internal_font_number f, quarterword c)
-{
-  pointer p;
-
-  p = char_box(f, c);
-  link(p) = list_ptr(b);
-  list_ptr(b) = p;
-  height(b) = height(p);
-}
-/* sec 0712 */
-scaled height_plus_depth (internal_font_number f, quarterword c)
-{
-  four_quarters q;
-  eight_bits hd;
-
-  q = char_info(f, c);
-  hd = height_depth(q);
-
-  return char_height(f, hd) + char_depth(f, hd);
-}
-/* sec 0706 */
-pointer var_delimiter (pointer d, small_number s, scaled v)
-{
-  pointer b;
-  internal_font_number f, g;
-  quarterword c, x, y;
-  integer m, n;
-  scaled u;
-  scaled w;
-  four_quarters q;
-  four_quarters r;
-  eight_bits hd;
-  /* small_number z; */
-  int z;
-  boolean large_attempt;
-
-  f = null_font;
-  w = 0;
-  large_attempt = false;
-  z = small_fam(d);
-  x = small_char(d);
-
-  while (true)
-  {
-    if ((z != 0) || (x != 0))
-    {
-      z = z + s + 16;
-
-      do
-        {
-          z = z - 16;
-          g = fam_fnt(z);
-
-          if (g != null_font)
-          {
-            y = x;
-
-            if ((y >= font_bc[g]) && (y <= font_ec[g]))
-            {
-continu:
-              q = char_info(g, y);
-              
-              if (char_exists(q))
-              {
-                if (char_tag(q) == ext_tag)
-                {
-                  f = g;
-                  c = y;
-                  goto found;
-                }
-
-                hd = height_depth(q);
-                u = char_height(g, hd) + char_depth(g, hd);
-
-                if (u > w)
-                {
-                  f = g;
-                  c = y;
-                  w = u;
-
-                  if (u >= v)
-                    goto found;
-                }
-
-                if (char_tag(q) == list_tag)
-                {
-                  y = rem_byte(q);
-                  goto continu;
-                }
-              }
-            }
-          }
-        }
-      while (!(z < 16));
-    }
-
-    if (large_attempt)
-      goto found;
-
-    large_attempt = true;
-    z = large_fam(d);
-    x = large_char(d);
-  }
-
-found:
-  if (f != null_font)
-    if (char_tag(q) == ext_tag)
-    {
-      b = new_null_box();
-      type(b) = vlist_node;
-      r = font_info[exten_base[f] + rem_byte(q)].qqqq;
-      c = ext_rep(r);
-      u = height_plus_depth(f, c);
-      w = 0;
-      q = char_info(f, c);
-      width(b) = char_width(f, q) + char_italic(f, q);
-      c = ext_bot(r);
-
-      if (c != min_quarterword)
-        w = w + height_plus_depth(f, c);
-
-      c = ext_mid(r);
-
-      if (c != min_quarterword)
-        w = w + height_plus_depth(f, c);
-
-      c = ext_top(r);
-
-      if (c != min_quarterword)
-        w = w + height_plus_depth(f, c);
-
-      n = 0;
-
-      if (u > 0)
-        while (w < v)
-        {
-          w = w + u;
-          incr(n);
-
-          if (ext_mid(r) != min_quarterword)
-            w = w + u;
-        }
-
-      c = ext_bot(r);
-
-      if (c != min_quarterword)
-        stack_into_box(b, f, c);
-
-      c = ext_rep(r);
-
-      for (m = 1; m <= n; m++)
-        stack_into_box(b, f, c);
-
-      c = ext_mid(r);
-
-      if (c != min_quarterword)
-      {
-        stack_into_box(b, f, c);
-        c = ext_rep(r);
-
-        for (m = 1; m <= n; m++)
-          stack_into_box(b, f, c);
-      }
-
-      c = ext_top(r);
-
-      if (c != 0)
-        stack_into_box(b, f, c);
-      
-      depth(b) = w - height(b);
-    }
-    else
-      b = char_box(f, c);
-  else
-  {
-    b = new_null_box();
-    width(b) = null_delimiter_space;
-  }
-
-  shift_amount(b) = half(height(b) - depth(b)) - axis_height(s);
-
-  return b;
-}
+/* Copyright 2014 Clerk Ma\r
+\r
+   This program is free software; you can redistribute it and/or modify\r
+   it under the terms of the GNU General Public License as published by\r
+   the Free Software Foundation; either version 2 of the License, or\r
+   (at your option) any later version.\r
+\r
+   This program is distributed in the hope that it will be useful, but\r
+   WITHOUT ANY WARRANTY; without even the implied warranty of\r
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\r
+   General Public License for more details.\r
+\r
+   You should have received a copy of the GNU General Public License\r
+   along with this program; if not, write to the Free Software\r
+   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA\r
+   02110-1301 USA.  */\r
+\r
+#define EXTERN extern\r
+\r
+#include "yandytex.h"\r
+\r
+/* sec 0581 */\r
+void char_warning_(internal_font_number f, eight_bits c)\r
+{ \r
+  if (tracing_lost_chars > 0)\r
+  {\r
+    if (show_missing == 0)\r
+      begin_diagnostic();\r
+\r
+    if (show_missing)\r
+    {\r
+      print_nl("! ");\r
+      prints("Missing character: there is no ");\r
+    }\r
+    else\r
+      print_nl("Missing character: there is no ");\r
+\r
+    print(c);\r
+\r
+    if (show_numeric)\r
+    {\r
+      print_char(' ');\r
+      print_char('(');\r
+\r
+      if (c / 100 > 0)\r
+      {\r
+        print_char('0' + c / 100);\r
+        c = c - (c / 100) * 100;\r
+        print_char('0' + c / 10);\r
+      }\r
+      else\r
+      {\r
+        c = c - (c / 100) * 100;\r
+\r
+        if (c / 10 > 0)\r
+          print_char('0' + c / 10);\r
+      }\r
+\r
+      print_char('0' + c % 10);\r
+      print_char(')');\r
+    }\r
+\r
+    prints(" in font ");\r
+    slow_print(font_name[f]);\r
+    print_char('!');\r
+\r
+    if (show_missing)\r
+    {\r
+      if (f != null_font)\r
+        show_context();\r
+    }\r
+\r
+    if (show_missing == 0)\r
+      end_diagnostic(false);\r
+\r
+    missing_characters++;\r
+  }\r
+}\r
+/* sec 0582 */\r
+pointer new_character_(internal_font_number f, eight_bits c)\r
+{\r
+  pointer p;\r
+\r
+  if (font_bc[f] <= c)\r
+    if (font_ec[f] >= c)\r
+      if (char_exists(char_info(f, c)))\r
+      {\r
+        p = get_avail();\r
+        font(p) = f;\r
+        character(p) = c;\r
+        return p;\r
+      }\r
+\r
+  char_warning(f, c);\r
+  return 0;\r
+}\r
+/* sec 0598 */\r
+void dvi_swap (void)\r
+{ \r
+  if (trace_flag)\r
+  {\r
+    wterm_cr();\r
+    printf("dvi_swap() %lld", dvi_gone);\r
+  }\r
+\r
+  if (dvi_limit == dvi_buf_size)\r
+  {\r
+    write_dvi(0, half_buf - 1);\r
+    dvi_limit = half_buf;\r
+    dvi_offset = dvi_offset + dvi_buf_size;\r
+    dvi_ptr = 0;\r
+  }\r
+  else\r
+  {\r
+    write_dvi(half_buf, dvi_buf_size - 1);\r
+    dvi_limit = dvi_buf_size;\r
+  }\r
+\r
+  dvi_gone = dvi_gone + half_buf;\r
+}\r
+/* sec 0600 */\r
+void dvi_four_(integer x)\r
+{ \r
+  if (x >= 0)\r
+    dvi_out(x / 0100000000);\r
+  else\r
+  {\r
+    x = x + 010000000000;\r
+    x = x + 010000000000;\r
+    dvi_out((x / 0100000000) + 128);\r
+  }\r
+\r
+  x = x % 0100000000;\r
+  dvi_out(x / 0200000);\r
+  x = x % 0200000;\r
+  dvi_out(x / 0400);\r
+  dvi_out(x % 0400);\r
+}\r
+/* sec 0601 */\r
+void dvi_pop_(integer l)\r
+{\r
+  if ((l == dvi_offset + dvi_ptr) && (dvi_ptr > 0))\r
+    decr(dvi_ptr);\r
+  else\r
+    dvi_out(pop);\r
+}\r
+/* sec 0602 */\r
+void dvi_font_def (internal_font_number f)\r
+{\r
+  pool_pointer k;\r
+\r
+#ifdef INCREASEFONTS\r
+  if (f <= 256)\r
+  {\r
+    dvi_out(fnt_def1);\r
+    dvi_out(f - 1);\r
+  }\r
+  else\r
+  {\r
+    dvi_out(fnt_def2);\r
+    dvi_out(((f - 1) >> 8));\r
+    dvi_out(((f - 1) & 255));\r
+  }\r
+#else\r
+  dvi_out(fnt_def1);\r
+  dvi_out(f - 1);\r
+#endif\r
+\r
+  dvi_out(font_check[f].b0);\r
+  dvi_out(font_check[f].b1);\r
+  dvi_out(font_check[f].b2);\r
+  dvi_out(font_check[f].b3);\r
+  dvi_four(font_size[f]); \r
+  dvi_four(font_dsize[f]);\r
+  dvi_out(length(font_area[f]));\r
+  dvi_out(length(font_name[f]));\r
+\r
+  for (k = str_start[font_area[f]]; k <= str_start[font_area[f] + 1] - 1; k++)\r
+    dvi_out(str_pool[k]);\r
+\r
+  for (k = str_start[font_name[f]]; k <= str_start[font_name[f] + 1] - 1; k++)\r
+    dvi_out(str_pool[k]);\r
+}\r
+/* sec 0607 */\r
+void movement (scaled w, eight_bits o)\r
+{\r
+  small_number mstate;\r
+  pointer p, q;\r
+  integer k;\r
+\r
+  q = get_node(movement_node_size);\r
+  width(q) = w;\r
+  location(q) = dvi_offset + dvi_ptr;\r
+\r
+  if (o == down1)\r
+  {\r
+    link(q) = down_ptr;\r
+    down_ptr = q;\r
+  }\r
+  else\r
+  {\r
+    link(q) = right_ptr;\r
+    right_ptr = q;\r
+  }\r
+\r
+  p = link(q);\r
+  mstate = none_seen;\r
+\r
+  while (p != 0)\r
+  {\r
+    if (width(p) == w)\r
+      switch (mstate + info(p))\r
+      {\r
+        case none_seen + yz_OK:\r
+        case none_seen + y_OK:\r
+        case z_seen + yz_OK:\r
+        case z_seen + y_OK:\r
+          if (location(p) < dvi_gone)\r
+            goto not_found;\r
+          else\r
+          {\r
+            k = location(p) - dvi_offset;\r
+\r
+            if (k < 0)\r
+              k = k + dvi_buf_size;\r
+\r
+            dvi_buf[k] = dvi_buf[k] + y1 - down1;\r
+            info(p) = y_here;\r
+            goto found;\r
+          }\r
+          break;\r
+\r
+        case none_seen + z_OK:\r
+        case y_seen + yz_OK:\r
+        case y_seen + z_OK:\r
+          if (location(p) < dvi_gone)\r
+            goto not_found;\r
+          else\r
+          {\r
+            k = location(p) - dvi_offset;\r
+\r
+            if (k < 0)\r
+              k = k + dvi_buf_size;\r
+\r
+            dvi_buf[k] = dvi_buf[k] + z1 - down1;\r
+            info(p) = z_here;\r
+            goto found;\r
+          }\r
+          break;\r
+\r
+        case none_seen + y_here:\r
+        case none_seen + z_here:\r
+        case y_seen + z_here:\r
+        case z_seen + y_here:\r
+          goto found;\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+    else\r
+      switch (mstate + info(p))\r
+      {\r
+        case none_seen + y_here:\r
+          mstate = y_seen;\r
+          break;\r
+\r
+        case none_seen + z_here:\r
+          mstate = z_seen;\r
+          break;\r
+\r
+        case y_seen + z_here:\r
+        case z_seen + y_here:\r
+          goto not_found;\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+\r
+    p = link(p);\r
+  }\r
+\r
+not_found:\r
+\r
+  info(q) = yz_OK;\r
+\r
+  if (abs(w) >= 8388608L) /* 2^23 */\r
+  {\r
+    dvi_out(o + 3);\r
+    dvi_four(w);\r
+    return;\r
+  }\r
+\r
+  if (abs(w) >= 32768L)\r
+  {\r
+    dvi_out(o + 2);\r
+\r
+    if (w < 0)\r
+      w = w + 16777216L;  /* 2^24 */\r
+    //dvi_out(w / 65536L);\r
+    dvi_out((w >> 16));\r
+    //w = w % 65536L;\r
+    w = w & 65535L;\r
+    goto lab2;\r
+  }\r
+\r
+  if (abs(w) >= 128)\r
+  {\r
+    dvi_out(o + 1);\r
+\r
+    if (w < 0)\r
+      w = w + 65536L;\r
+\r
+    goto lab2;\r
+  }\r
+\r
+  dvi_out(o);\r
+\r
+  if (w < 0)\r
+    w = w + 256;\r
+\r
+  goto lab1;\r
+\r
+lab2:\r
+  dvi_out(w / 256);\r
+\r
+lab1:\r
+  dvi_out(w % 256);\r
+  return;\r
+\r
+found:\r
+  info(q) = info(p);\r
+\r
+  if (info(q) == y_here)\r
+  {\r
+    dvi_out(o + y0 - down1);\r
+\r
+    while (link(q) != p)\r
+    {\r
+      q = link(q);\r
+\r
+      switch (info(q))\r
+      {\r
+        case yz_OK:\r
+          info(q) = z_OK;\r
+          break;\r
+\r
+        case y_OK:\r
+          info(q) = d_fixed;\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+    }\r
+  }\r
+  else\r
+  {\r
+    dvi_out(o + z0 - down1);\r
+\r
+    while (link(q) != p)\r
+    {\r
+      q = link(q);\r
+\r
+      switch (info(q))\r
+      {\r
+        case yz_OK:\r
+          info(q) = y_OK;\r
+          break;\r
+\r
+        case z_OK:\r
+          info(q) = d_fixed;\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+    }\r
+  }\r
+}\r
+/* sec 0615 */\r
+void prune_movements (integer l)\r
+{\r
+  pointer p;\r
+\r
+  while (down_ptr != 0)\r
+  {\r
+    if (location(down_ptr) < l)\r
+      goto done;\r
+\r
+    p = down_ptr;\r
+    down_ptr = link(p);\r
+    free_node(p, movement_node_size);\r
+  }\r
+\r
+done:\r
+  while (right_ptr != 0)\r
+  {\r
+    if (location(right_ptr) < l)\r
+      return;\r
+\r
+    p = right_ptr;\r
+    right_ptr = link(p);\r
+    free_node(p, movement_node_size);\r
+  }\r
+}\r
+/* sec 1368 */\r
+void special_out (pointer p)\r
+{\r
+  char old_setting;\r
+  pool_pointer k;\r
+\r
+  synch_h();\r
+  synch_v();\r
+  old_setting = selector;\r
+  selector = new_string;\r
+\r
+#ifdef ALLOCATESTRING\r
+  if (pool_ptr + 32000 > current_pool_size)\r
+    str_pool = realloc_str_pool (increment_pool_size);\r
+\r
+  show_token_list(link(write_tokens(p)), 0, 10000000L);\r
+#else\r
+  show_token_list(link(write_tokens(p)), 0, pool_size - pool_ptr);\r
+#endif\r
+\r
+  selector = old_setting;\r
+  str_room(1);\r
+  graphics_mode();\r
+  spc_exec_special(str_pool + str_start[str_ptr], cur_length, cur_h * 0.000015202, -cur_v * 0.000015202, 1.0);\r
+/*\r
+  if (cur_length < 256)\r
+  {\r
+    dvi_out(xxx1);\r
+    dvi_out(cur_length);\r
+  }\r
+  else\r
+  {Mag\r
+    dvi_out(xxx4);\r
+    dvi_four(cur_length); \r
+  } \r
+\r
+  for (k = str_start[str_ptr]; k <= pool_ptr - 1; k++)\r
+    dvi_out(str_pool[k]);\r
+*/\r
+  pool_ptr = str_start[str_ptr];\r
+}\r
+/* sec 1370 */\r
+void write_out (pointer p)\r
+{\r
+  char old_setting;\r
+  /* integer old_mode; */\r
+  int old_mode;\r
+  /* small_number j; */\r
+  int j;\r
+  pointer q, r;\r
+\r
+  q = get_avail();\r
+  info(q) = right_brace_token + '}';\r
+  r = get_avail();\r
+  link(q) = r;\r
+  info(r) = end_write_token;\r
+  ins_list(q);\r
+  begin_token_list(write_tokens(p), write_text);\r
+  q = get_avail();\r
+  info(q) = left_brace_token + '{';\r
+  ins_list(q);\r
+  old_mode = mode;\r
+  mode = 0;\r
+  cur_cs = write_loc;\r
+  q = scan_toks(false, true);\r
+  get_token();\r
+\r
+  if (cur_tok != end_write_token)\r
+  {\r
+    print_err("Unbalanced write command");\r
+    help2("On this page there's a \\write with fewer real {'s than }'s.",\r
+        "I can't handle that very well; good luck.");\r
+    error();\r
+\r
+    do\r
+      {\r
+        get_token();\r
+      }\r
+    while (!(cur_tok == end_write_token));\r
+  }\r
+\r
+  mode = old_mode;\r
+  end_token_list();\r
+  old_setting = selector;\r
+  j = write_stream(p);\r
+\r
+  if (write_open[j])\r
+    selector = j;\r
+  else\r
+  {\r
+    if ((j == 17) && (selector == term_and_log))\r
+      selector = log_only;\r
+\r
+    print_nl("");\r
+  }\r
+\r
+  token_show(def_ref);\r
+  print_ln();\r
+  flush_list(def_ref);\r
+  selector = old_setting;\r
+}\r
+/* sec 1373 */\r
+void out_what (pointer p)\r
+{\r
+  /* small_number j; */\r
+  int j;\r
+\r
+  switch (subtype(p))\r
+  {\r
+    case open_node:\r
+    case write_node:\r
+    case close_node:\r
+      if (!doing_leaders)\r
+      {\r
+        j = write_stream(p);\r
+\r
+        if (subtype(p) == write_node)\r
+          write_out(p);\r
+        else\r
+        {\r
+          if (write_open[j])\r
+            a_close(write_file[j]); \r
+\r
+          if (subtype(p) == close_node)\r
+            write_open[j]= false;\r
+          else if (j < 16)\r
+          {\r
+            cur_name = open_name(p);\r
+            cur_area = open_area(p);\r
+            cur_ext = open_ext(p); \r
+\r
+            if (cur_ext == 335) /* "" */\r
+              cur_ext = 785;    /* ".tex" */\r
+\r
+            pack_file_name(cur_name, cur_area, cur_ext);\r
+\r
+            while (!a_open_out(write_file[j]))\r
+              prompt_file_name("output file name", ".tex");\r
+\r
+            write_open[j] = true;\r
+          }\r
+        }\r
+      }\r
+      break;\r
+\r
+    case special_node:\r
+      special_out(p); \r
+      break;\r
+\r
+    case language_node:\r
+      do_nothing();\r
+      break;\r
+\r
+    default:\r
+      {\r
+        confusion("ext4");\r
+        return;\r
+      }\r
+      break;\r
+  }\r
+}\r
+/* sec 0619 */\r
+void hlist_out (void)\r
+{\r
+  scaled base_line;\r
+  scaled left_edge;\r
+  scaled save_h, save_v;\r
+  pointer this_box;\r
+  /* glue_ord g_order; */\r
+  int g_order;\r
+  /* char g_sign; */\r
+  int g_sign;\r
+  pointer p;\r
+  integer save_loc;\r
+  pointer leader_box;\r
+  scaled leader_wd;\r
+  scaled lx;\r
+  boolean outer_doing_leaders;\r
+  scaled edge;\r
+  real glue_temp;\r
+  real cur_glue;\r
+  scaled cur_g;\r
+\r
+  cur_g = 0;\r
+  cur_glue = 0.0;\r
+  this_box = temp_ptr;\r
+  g_order = glue_order(this_box);\r
+  g_sign = glue_sign(this_box);\r
+  p = list_ptr(this_box);\r
+  incr(cur_s);\r
+\r
+  if (cur_s > 0)\r
+    dvi_out(push);\r
+\r
+  if (cur_s > max_push)\r
+    max_push = cur_s;\r
+\r
+  save_loc = dvi_offset + dvi_ptr;\r
+  base_line = cur_v;\r
+  left_edge = cur_h;\r
+\r
+  while (p != 0)\r
+reswitch:\r
+    if (is_char_node(p))\r
+    {\r
+      synch_h();\r
+      synch_v();\r
+\r
+      do\r
+        {\r
+          f = font(p);\r
+          c = character(p);\r
+\r
+          if (f != dvi_f)\r
+          {\r
+            if (!font_used[f])\r
+            {\r
+              dvi_font_def(f);\r
+              font_used[f] = true;\r
+            }\r
+\r
+            if (f <= 64 + font_base)\r
+              dvi_out(f - font_base - 1 + fnt_num_0);\r
+#ifdef INCREASEFONTS\r
+            else if (f <= 256)\r
+            {\r
+              dvi_out(fnt1);\r
+              dvi_out(f - 1);\r
+            }\r
+            else\r
+            {\r
+              dvi_out(fnt2);\r
+              dvi_out(((f - 1) >> 8));\r
+              dvi_out(((f - 1) & 255));\r
+            }\r
+#else\r
+            else\r
+            {\r
+              dvi_out(fnt1);\r
+              dvi_out(f - 1);\r
+            }\r
+#endif\r
+\r
+            dvi_f = f;\r
+          }\r
+\r
+          if (c >= 128)\r
+            dvi_out(set1);\r
+\r
+          dvi_out(c);\r
+          cur_h = cur_h + char_width(f, char_info(f, c));\r
+          p = link(p);\r
+        }\r
+      while (!(!is_char_node(p)));\r
+\r
+      dvi_h = cur_h;\r
+  }\r
+  else\r
+  {\r
+    switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+        if (list_ptr(p) == 0)\r
+          cur_h = cur_h + width(p);\r
+        else\r
+        {\r
+          save_h = dvi_h;\r
+          save_v = dvi_v;\r
+          cur_v = base_line + shift_amount(p);\r
+          temp_ptr = p;\r
+          edge = cur_h;\r
+\r
+          if (type(p) == vlist_node)\r
+            vlist_out();\r
+          else\r
+            hlist_out();\r
+\r
+          dvi_h = save_h;\r
+          dvi_v = save_v;\r
+          cur_h = edge + width(p);\r
+          cur_v = base_line;\r
+        }\r
+        break;\r
+\r
+      case rule_node:\r
+        {\r
+          rule_ht = height(p);\r
+          rule_dp = depth(p);\r
+          rule_wd = width(p);\r
+          goto fin_rule;\r
+        }\r
+        break;\r
+\r
+      case whatsit_node:\r
+        out_what(p);\r
+        break;\r
+\r
+      case glue_node:\r
+        {\r
+          g = glue_ptr(p);\r
+          rule_wd = width(g) - cur_g;\r
+\r
+          if (g_sign != normal)\r
+          {\r
+            if (g_sign == stretching)\r
+            {\r
+              if (stretch_order(g) == g_order)\r
+              {\r
+                cur_glue = cur_glue + stretch(g);\r
+                vet_glue(glue_set(this_box) * cur_glue);\r
+                cur_g = round(glue_temp);\r
+              }\r
+            }\r
+            else if (shrink_order(g) == g_order)\r
+            {\r
+              cur_glue = cur_glue - shrink(g);\r
+              vet_glue(glue_set(this_box) * cur_glue);\r
+              cur_g = round(glue_temp);\r
+            }\r
+          }\r
+\r
+          rule_wd = rule_wd + cur_g;\r
+\r
+          if (subtype(p) >= a_leaders)\r
+          {\r
+            leader_box = leader_ptr(p);\r
+\r
+            if (type(leader_box) == rule_node)\r
+            {\r
+              rule_ht = height(leader_box);\r
+              rule_dp = depth(leader_box);\r
+              goto fin_rule;\r
+            }\r
+\r
+            leader_wd = width(leader_box);\r
+\r
+            if ((leader_wd > 0) && (rule_wd > 0))\r
+            {\r
+              rule_wd = rule_wd + 10;\r
+              edge = cur_h + rule_wd;\r
+              lx = 0;\r
+\r
+              if (subtype(p) == a_leaders)\r
+              {\r
+                save_h = cur_h;\r
+                cur_h = left_edge + leader_wd * ((cur_h - left_edge) / leader_wd);\r
+\r
+                if (cur_h < save_h)\r
+                  cur_h = cur_h + leader_wd;\r
+              }\r
+              else\r
+              {\r
+                lq = rule_wd / leader_wd;\r
+                lr = rule_wd % leader_wd;\r
+\r
+                if (subtype(p) == c_leaders)\r
+                  cur_h = cur_h + (lr / 2);\r
+                else\r
+                {\r
+                  lx = (2 * lr + lq + 1) / (2 * lq + 2);\r
+                  cur_h = cur_h + ((lr - (lq - 1)* lx) / 2);\r
+                }\r
+              }\r
+\r
+              while (cur_h + leader_wd <= edge)\r
+              {\r
+                cur_v = base_line + shift_amount(leader_box);\r
+                synch_v();\r
+                save_v = dvi_v;\r
+                synch_h();\r
+                save_h = dvi_h;\r
+                temp_ptr = leader_box;\r
+                outer_doing_leaders = doing_leaders;\r
+                doing_leaders = true;\r
+\r
+                if (type(leader_box) == vlist_node)\r
+                  vlist_out();\r
+                else\r
+                  hlist_out();\r
+\r
+                doing_leaders = outer_doing_leaders;\r
+                dvi_v = save_v;\r
+                dvi_h = save_h;\r
+                cur_v = base_line;\r
+                cur_h = save_h + leader_wd + lx;\r
+              }\r
+\r
+              cur_h = edge - 10;\r
+              goto next_p;\r
+            }\r
+          }\r
+\r
+          goto move_past;\r
+        }\r
+        break;\r
+\r
+      case kern_node:\r
+      case math_node:\r
+        cur_h = cur_h + width(p);\r
+        break;\r
+\r
+      case ligature_node:\r
+        {\r
+          mem[lig_trick] = mem[lig_char(p)];\r
+          link(lig_trick) = link(p);\r
+          p = lig_trick;\r
+          goto reswitch;\r
+        }\r
+        break;\r
+\r
+      default:\r
+        break;\r
+    }\r
+\r
+    goto next_p;\r
+\r
+fin_rule:\r
+    if (is_running(rule_ht))\r
+      rule_ht = height(this_box);\r
+\r
+    if (is_running(rule_dp))\r
+      rule_dp = depth(this_box);\r
+\r
+    rule_ht = rule_ht + rule_dp;\r
+\r
+    if ((rule_ht > 0) && (rule_wd > 0))\r
+    {\r
+      synch_h();\r
+      cur_v = base_line + rule_dp;\r
+      synch_v();\r
+      dvi_out(set_rule);\r
+      dvi_four(rule_ht);\r
+      dvi_four(rule_wd);\r
+      cur_v = base_line;\r
+      dvi_h = dvi_h + rule_wd;\r
+    }\r
+\r
+move_past:\r
+    cur_h = cur_h + rule_wd;\r
+\r
+next_p:\r
+    p = link(p);\r
+  }\r
+\r
+  prune_movements(save_loc);\r
+\r
+  if (cur_s > 0)\r
+    dvi_pop(save_loc);\r
+\r
+  decr(cur_s);\r
+}\r
+/* sec 0629 */\r
+void vlist_out (void)\r
+{\r
+  scaled left_edge;\r
+  scaled top_edge;\r
+  scaled save_h, save_v;\r
+  pointer this_box;\r
+  /* glue_ord g_order; */\r
+  int g_order;\r
+  /* char g_sign; */\r
+  int g_sign;\r
+  pointer p;\r
+  integer save_loc;\r
+  pointer leader_box;\r
+  scaled leader_ht;\r
+  scaled lx;\r
+  boolean outer_doing_leaders;\r
+  scaled edge;\r
+  real glue_temp;\r
+  real cur_glue;\r
+  scaled cur_g;\r
+\r
+  cur_g = 0;\r
+  cur_glue = 0.0;\r
+  this_box = temp_ptr;\r
+  g_order = glue_order(this_box);\r
+  g_sign = glue_sign(this_box);\r
+  p = list_ptr(this_box);\r
+  incr(cur_s);\r
+\r
+  if (cur_s > 0)\r
+    dvi_out(push);\r
+\r
+  if (cur_s > max_push)\r
+    max_push = cur_s;\r
+\r
+  save_loc = dvi_offset + dvi_ptr;\r
+  left_edge = cur_h;\r
+  cur_v = cur_v - height(this_box);\r
+  top_edge = cur_v;\r
+\r
+  while (p != 0)\r
+  {\r
+    if (is_char_node(p))\r
+    {\r
+      confusion("vlistout");\r
+      return;\r
+    }\r
+    else\r
+    {\r
+      switch (type(p))\r
+      {\r
+        case hlist_node:\r
+        case vlist_node:\r
+          if (list_ptr(p) == 0)\r
+            cur_v = cur_v + height(p) + depth(p);\r
+          else\r
+          {\r
+            cur_v = cur_v + height(p);\r
+            synch_v();\r
+            save_h = dvi_h;\r
+            save_v = dvi_v;\r
+            cur_h = left_edge + shift_amount(p);\r
+            temp_ptr = p;\r
+\r
+            if (type(p) == vlist_node)\r
+              vlist_out();\r
+            else\r
+              hlist_out();\r
+\r
+            dvi_h = save_h;\r
+            dvi_v = save_v;\r
+            cur_v = save_v + depth(p);\r
+            cur_h = left_edge;\r
+          }\r
+          break;\r
+\r
+        case rule_node:\r
+          {\r
+            rule_ht = height(p);\r
+            rule_dp = depth(p);\r
+            rule_wd = width(p);\r
+            goto fin_rule;\r
+          }\r
+          break;\r
+\r
+        case whatsit_node:\r
+          out_what(p);\r
+          break;\r
+\r
+        case glue_node:\r
+          {\r
+            g = glue_ptr(p);\r
+            rule_ht = width(g) - cur_g;\r
+\r
+            if (g_sign != normal)\r
+            {\r
+              if (g_sign == stretching)\r
+              {\r
+                if (stretch_order(g) == g_order)\r
+                {\r
+                  cur_glue = cur_glue + stretch(g);\r
+                  vet_glue(glue_set(this_box) * cur_glue);\r
+                  cur_g = round(glue_temp);\r
+                }\r
+              }\r
+              else if (shrink_order(g) == g_order)   /* BUG FIX !!! */\r
+              {\r
+                cur_glue = cur_glue - shrink(g);\r
+                vet_glue(glue_set(this_box) * cur_glue);\r
+                cur_g = round(glue_temp);\r
+              }\r
+            }\r
+\r
+            rule_ht = rule_ht + cur_g;\r
+\r
+            if (subtype(p) >= a_leaders)\r
+            {\r
+              leader_box = leader_ptr(p);\r
+\r
+              if (type(leader_box) == rule_node)\r
+              {\r
+                rule_wd = width(leader_box);\r
+                rule_dp = 0;\r
+                goto fin_rule;\r
+              }\r
+\r
+              leader_ht = height(leader_box) + depth(leader_box);\r
+\r
+              if ((leader_ht > 0) && (rule_ht > 0))\r
+              {\r
+                rule_ht = rule_ht + 10;\r
+                edge = cur_v + rule_ht;\r
+                lx = 0;\r
+\r
+                if (subtype(p) == a_leaders)\r
+                {\r
+                  save_v = cur_v;\r
+                  cur_v = top_edge + leader_ht * ((cur_v - top_edge) / leader_ht);\r
+\r
+                  if (cur_v < save_v)\r
+                    cur_v = cur_v + leader_ht;\r
+                }\r
+                else\r
+                {\r
+                  lq = rule_ht / leader_ht;\r
+                  lr = rule_ht % leader_ht;\r
+\r
+                  if (subtype(p) == c_leaders)\r
+                    cur_v = cur_v + (lr / 2);\r
+                  else\r
+                  {\r
+                    lx = (2 * lr + lq + 1) / (2 * lq + 2);\r
+                    cur_v = cur_v + ((lr - (lq - 1) * lx) / 2);\r
+                  }\r
+                }\r
+\r
+                while (cur_v + leader_ht <= edge)\r
+                {\r
+                  cur_h = left_edge + shift_amount(leader_box);\r
+                  synch_h();\r
+                  save_h = dvi_h;\r
+                  cur_v = cur_v + height(leader_box);\r
+                  synch_v();\r
+                  save_v = dvi_v;\r
+                  temp_ptr = leader_box;\r
+                  outer_doing_leaders = doing_leaders;\r
+                  doing_leaders = true;\r
+\r
+                  if (type(leader_box) == vlist_node)\r
+                    vlist_out();\r
+                  else\r
+                    hlist_out();\r
+\r
+                  doing_leaders = outer_doing_leaders;\r
+                  dvi_v = save_v;\r
+                  dvi_h = save_h;\r
+                  cur_h = left_edge;\r
+                  cur_v = save_v - height(leader_box) + leader_ht + lx;\r
+                }\r
+\r
+                cur_v = edge - 10;\r
+                goto next_p;\r
+              }\r
+            }\r
+\r
+            goto move_past;\r
+          }\r
+          break;\r
+\r
+        case kern_node:\r
+          cur_v = cur_v + width(p);\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+\r
+      goto next_p;\r
+\r
+fin_rule:\r
+      if (is_running(rule_wd))\r
+        rule_wd = width(this_box);\r
+\r
+      rule_ht = rule_ht + rule_dp;\r
+      cur_v = cur_v + rule_ht;\r
+\r
+      if ((rule_ht > 0) && (rule_wd > 0))\r
+      {\r
+        synch_h();\r
+        synch_v();\r
+        dvi_out(put_rule);\r
+        dvi_four(rule_ht);\r
+        dvi_four(rule_wd);\r
+      }\r
+\r
+      goto next_p;\r
+\r
+move_past:\r
+      cur_v = cur_v + rule_ht;\r
+    }\r
+\r
+next_p:\r
+    p = link(p);\r
+  }\r
+\r
+  prune_movements(save_loc);\r
+\r
+  if (cur_s > 0)\r
+    dvi_pop(save_loc);\r
+\r
+  decr(cur_s);\r
+}\r
+/* sec 0638 */\r
+void dvi_ship_out_(pointer p)\r
+{\r
+  integer page_loc;\r
+  char j, k;\r
+  pool_pointer s;\r
+  char old_setting;\r
+\r
+  if (tracing_output > 0)\r
+  {\r
+    print_nl("");\r
+    print_ln();\r
+    prints("Completed box being shipped out");\r
+  }\r
+\r
+  if (term_offset > max_print_line - 9)\r
+    print_ln();\r
+  else if ((term_offset > 0) || (file_offset > 0))\r
+    print_char(' ');\r
+\r
+  print_char('[');\r
+  j = 9;\r
+\r
+  while ((count(j) == 0) && (j > 0))\r
+    decr(j);\r
+\r
+  for (k = 0; k <= j; k++)\r
+  {\r
+    print_int(count(k));\r
+\r
+    if (k < j)\r
+      print_char('.');\r
+  }\r
+  \r
+  update_terminal();\r
+\r
+  if (tracing_output > 0)\r
+  {\r
+    print_char(']');\r
+    begin_diagnostic();\r
+    show_box(p);\r
+    end_diagnostic(true);\r
+  }\r
+\r
+  if ((height(p) > max_dimen) || (depth(p) > max_dimen) ||\r
+      (height(p) + depth(p) + v_offset > max_dimen) ||\r
+      (width(p) + h_offset > max_dimen))\r
+  {\r
+    print_err("Huge page cannot be shipped out");\r
+    help2("The page just created is more than 18 feet tall or",\r
+        "more than 18 feet wide, so I suspect something went wrong.");\r
+    error();\r
+\r
+    if (tracing_output <= 0)\r
+    {\r
+      begin_diagnostic();\r
+      print_nl("The following box has been deleted:");\r
+      show_box(p);\r
+      end_diagnostic(true);\r
+    }\r
+\r
+    goto done;\r
+  }\r
+\r
+  if (height(p) + depth(p) + v_offset > max_v)\r
+    max_v = height(p) + depth(p) + v_offset;\r
+\r
+  if (width(p) + h_offset > max_h)\r
+    max_h = width(p) + h_offset;\r
+\r
+  dvi_h = 0;\r
+  dvi_v = 0;\r
+  cur_h = h_offset;\r
+  dvi_f = null_font;\r
+  ensure_dvi_open();\r
+\r
+  if (total_pages == 0)\r
+  {\r
+    dvi_out(pre);\r
+    dvi_out(id_byte);\r
+    dvi_four(25400000L);\r
+    dvi_four(473628672L);\r
+    prepare_mag();\r
+    dvi_four(mag);\r
+    old_setting = selector;\r
+    selector = new_string;\r
+    prints(" TeX output ");\r
+    print_int(year);\r
+    print_char('.');\r
+    print_two(month);\r
+    print_char('.');\r
+    print_two(day);\r
+    print_char(':');\r
+    print_two(tex_time / 60);\r
+    print_two(tex_time % 60);\r
+    selector = old_setting;\r
+    dvi_out(cur_length);\r
+\r
+    for (s = str_start[str_ptr]; s <= pool_ptr - 1; s++)\r
+      dvi_out(str_pool[s]);\r
+\r
+    pool_ptr = str_start[str_ptr];\r
+  }\r
+\r
+  page_loc = dvi_offset + dvi_ptr;\r
+  dvi_out(bop);\r
+\r
+  for (k = 0; k <= 9; k++)\r
+    dvi_four(count(k));\r
+\r
+  dvi_four(last_bop);\r
+  last_bop = page_loc;\r
+  cur_v = height(p) + v_offset;\r
+  temp_ptr = p;\r
+\r
+  if (type(p) == vlist_node)\r
+    vlist_out();\r
+  else\r
+    hlist_out();\r
+\r
+  dvi_out(eop);\r
+  incr(total_pages);\r
+  cur_s = -1;\r
+\r
+done:\r
+  if (tracing_output <= 0)\r
+    print_char(']');\r
+\r
+  dead_cycles = 0;\r
+  update_terminal();\r
+\r
+#ifdef STAT\r
+  if (tracing_stats > 1)\r
+  {\r
+    print_nl("Memory usage before: ");\r
+    print_int(var_used);\r
+    print_char('&');\r
+    print_int(dyn_used);\r
+    print_char(';');\r
+  }\r
+#endif\r
+\r
+  flush_node_list(p);\r
+\r
+#ifdef STAT\r
+  if (tracing_stats > 1)\r
+  {\r
+    prints(" after: ");\r
+    print_int(var_used);\r
+    print_char('&');\r
+    print_int(dyn_used);\r
+    prints("; still utouched: ");\r
+    print_int(hi_mem_min - lo_mem_max - 1);\r
+    print_ln();\r
+  }\r
+#endif\r
+}\r
+void ship_out (pointer p)\r
+{\r
+  //printf("init pdf devices.");\r
+  //dvi_ship_out_(p);\r
+  //printf("DPX test");\r
+  pdf_ship_out(p);\r
+  /*\r
+  switch (shipout_flag)\r
+  {\r
+    case out_dvi_flag:\r
+    case out_xdv_flag:\r
+      dvi_ship_out_(p);\r
+      break;\r
+    case out_pdf_flag:\r
+      //pdf_ship_out(p);\r
+      break;\r
+  }*/\r
+}\r
+/* sec 0645 */\r
+void scan_spec (group_code c, boolean three_codes)\r
+{\r
+  integer s;\r
+  char spec_code;\r
+\r
+  if (three_codes)\r
+    s = saved(0);\r
+\r
+  if (scan_keyword("to"))\r
+    spec_code = exactly;\r
+  else if (scan_keyword("spread"))\r
+    spec_code = additional;\r
+  else\r
+  {\r
+    spec_code = additional;\r
+    cur_val = 0;\r
+    goto found;\r
+  }\r
+\r
+  scan_dimen(false, false, false);\r
+\r
+found:\r
+  if (three_codes)\r
+  {\r
+    saved(0) = s;\r
+    incr(save_ptr);\r
+  }\r
+\r
+  saved(0) = spec_code;\r
+  saved(1) = cur_val;\r
+  save_ptr = save_ptr + 2;\r
+  new_save_level(c);\r
+  scan_left_brace();\r
+}\r
+/* sec 0649 */\r
+pointer hpack_(pointer p, scaled w, small_number m)\r
+{\r
+  pointer r;\r
+  pointer q;\r
+  scaled h, d, x;\r
+  scaled s;\r
+  pointer g;\r
+  /* glue_ord o; */\r
+  int o;\r
+  internal_font_number f;\r
+  four_quarters i;\r
+  eight_bits hd;\r
+\r
+  last_badness = 0;\r
+  r = get_node(box_node_size);\r
+  type(r) = hlist_node;\r
+  subtype(r) = 0;\r
+  shift_amount(r) = 0;\r
+  q = r + list_offset;\r
+  link(q) = p;\r
+  h = 0;\r
+  d = 0;\r
+  x = 0;\r
+  total_stretch[normal] = 0;\r
+  total_shrink[normal] = 0;\r
+  total_stretch[fil] = 0;\r
+  total_shrink[fil] = 0;\r
+  total_stretch[fill] = 0;\r
+  total_shrink[fill] = 0;\r
+  total_stretch[filll] = 0;\r
+  total_shrink[filll] = 0;\r
+\r
+  while (p != 0)\r
+  {\r
+reswitch:\r
+\r
+    while (is_char_node(p))\r
+    {\r
+      f = font(p);\r
+      i = char_info(f, character(p));\r
+      hd = height_depth(i);\r
+      x = x + char_width(f, i);\r
+      s = char_height(f, hd);\r
+\r
+      if (s > h)\r
+        h = s;\r
+\r
+      s = char_depth(f, hd);\r
+\r
+      if (s > d)\r
+        d = s;\r
+\r
+      p = link(p);\r
+    }\r
+\r
+    if (p != 0)\r
+    {\r
+      switch (type(p))\r
+      {\r
+        case hlist_node:\r
+        case vlist_node:\r
+        case rule_node:\r
+        case unset_node:\r
+          {\r
+            x = x + width(p);\r
+\r
+            if (type(p) >= rule_node)\r
+              s = 0;\r
+            else\r
+              s = shift_amount(p);\r
+\r
+            if (height(p) - s > h)\r
+              h = height(p) - s;\r
+\r
+            if (depth(p) + s > d)\r
+              d = depth(p) + s;\r
+          }\r
+          break;\r
+\r
+        case ins_node:\r
+        case mark_node:\r
+        case adjust_node:\r
+          if (adjust_tail != 0)\r
+          {\r
+            while (link(q) != p)\r
+              q = link(q);\r
+\r
+            if (type(p) == adjust_node)\r
+            {\r
+              link(adjust_tail) = adjust_ptr(p);\r
+\r
+              while (link(adjust_tail) != 0)\r
+                adjust_tail = link(adjust_tail);\r
+\r
+              p = link(p);\r
+              free_node(link(q), small_node_size);\r
+            }\r
+            else\r
+            {\r
+              link(adjust_tail) = p;\r
+              adjust_tail = p;\r
+              p = link(p);\r
+            }\r
+\r
+            link(q) = p;\r
+            p = q;\r
+          }\r
+          break;\r
+\r
+        case whatsit_node:\r
+          break;\r
+\r
+        case glue_node:\r
+          {\r
+            g = glue_ptr(p);\r
+            x = x + width(g);\r
+            o = stretch_order(g);\r
+            total_stretch[o] = total_stretch[o] + stretch(g);\r
+            o = shrink_order(g);\r
+            total_shrink[o] = total_shrink[o] + shrink(g);\r
+\r
+            if (subtype(p) >= a_leaders)\r
+            {\r
+              g = leader_ptr(p);\r
+\r
+              if (height(g) > h)\r
+                h = height(g);\r
+\r
+              if (depth(g) > d)\r
+                d = depth(g);\r
+            }\r
+          }\r
+          break;\r
+\r
+        case kern_node:\r
+        case math_node:\r
+          x = x + width(p);\r
+          break;\r
+\r
+        case ligature_node:\r
+          {\r
+            mem[lig_trick] = mem[lig_char(p)];\r
+            link(lig_trick) = link(p);\r
+            p = lig_trick;\r
+            goto reswitch;\r
+          }\r
+          break;\r
+\r
+        default:\r
+          break;\r
+      }\r
+      p = link(p);\r
+    }\r
+  }\r
+\r
+  if (adjust_tail != 0)\r
+    link(adjust_tail) = 0;\r
+\r
+  height(r) = h;\r
+  depth(r) = d;\r
+\r
+  if (m == additional)\r
+    w = x + w;\r
+\r
+  width(r) = w;\r
+  x = w - x;\r
+\r
+  if (x == 0)\r
+  {\r
+    glue_sign(r) = normal;\r
+    glue_order(r) = normal;\r
+    glue_set(r) = 0.0;\r
+    goto exit;\r
+  }\r
+  else if (x > 0)\r
+  {\r
+    if (total_stretch[filll] != 0)\r
+      o = filll;\r
+    else if (total_stretch[fill] != 0)\r
+      o = fill;\r
+    else if (total_stretch[fil] != 0)\r
+      o = fil;\r
+    else\r
+      o = normal;\r
+\r
+    glue_order(r) = o;\r
+    glue_sign(r) = stretching;\r
+\r
+    if (total_stretch[o] != 0)\r
+      glue_set(r) = x / ((double) total_stretch[o]);\r
+    else\r
+    {\r
+      glue_sign(r) = normal;\r
+      glue_set(r) = 0.0;\r
+    }\r
+\r
+    if (o == normal)\r
+      if (list_ptr(r) != 0)\r
+      {\r
+        last_badness = badness(x, total_stretch[normal]);\r
+\r
+        if (last_badness > hbadness)\r
+        {\r
+          print_ln();\r
+\r
+          if (last_badness > 100)\r
+            print_nl("Underfull");\r
+          else\r
+            print_nl("Loose");\r
+\r
+          prints(" \\hbox (badness ");\r
+          print_int(last_badness);\r
+\r
+          if (last_badness > 100)\r
+            underfull_hbox++;\r
+\r
+          goto common_ending;\r
+        }\r
+      }\r
+\r
+    goto exit;\r
+  }\r
+  else\r
+  {\r
+    if (total_shrink[filll] != 0)\r
+      o = filll;\r
+    else if (total_shrink[fill] != 0)\r
+      o = fill;\r
+    else if (total_shrink[fil] != 0)\r
+      o = fil;\r
+    else\r
+      o = normal;\r
+\r
+    glue_order(r) = o;\r
+    glue_sign(r) = shrinking;\r
+\r
+    if (total_shrink[o] != 0)\r
+      glue_set(r) = ((- (integer) x) / ((double) total_shrink[o]));\r
+    else\r
+    {\r
+      glue_sign(r) = normal;\r
+      glue_set(r) = 0.0;\r
+    }\r
+\r
+    if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))\r
+    {\r
+      last_badness = 1000000L;\r
+      glue_set(r) = 1.0;\r
+\r
+      if ((- (integer) x - total_shrink[normal] > hfuzz) || (hbadness < 100))\r
+      {\r
+        if ((overfull_rule > 0) && (- (integer) x - total_shrink[0] > hfuzz))\r
+        {\r
+          while (link(q) != 0)\r
+            q = link(q);\r
+          \r
+          link(q) = new_rule();\r
+          width(link(q)) = overfull_rule;\r
+        }\r
+        \r
+        print_ln();\r
+        print_nl("Overfull \\hbox (");\r
+        print_scaled(- (integer) x - total_shrink[normal]);\r
+        prints("pt too wide");\r
+        \r
+        overfull_hbox++;\r
+        goto common_ending;\r
+      }\r
+    }\r
+    else if (o == normal)\r
+      if (list_ptr(r) != 0)\r
+      {\r
+        last_badness = badness(- (integer) x, total_shrink[normal]);\r
+\r
+        if (last_badness > hbadness)\r
+        {\r
+          print_ln();\r
+          print_nl("Tight \\hbox (badness ");\r
+          print_int(last_badness);\r
+          goto common_ending;\r
+        }\r
+      }\r
+\r
+    goto exit;\r
+  }\r
+\r
+common_ending:\r
+\r
+  if (output_active)\r
+    prints(") has occurred while \\output is active");\r
+  else\r
+  {\r
+    if (pack_begin_line != 0)\r
+    {\r
+      if (pack_begin_line > 0)\r
+        prints(") in paragraph at lines ");\r
+      else\r
+        prints(") in alignment at lines ");\r
+\r
+      print_int(abs(pack_begin_line));\r
+      prints("--");\r
+    }\r
+    else\r
+      prints(") detected at line ");\r
+\r
+    print_int(line);\r
+  }\r
+\r
+  print_ln();\r
+  font_in_short_display = null_font;\r
+  short_display(list_ptr(r));\r
+  print_ln();\r
+  begin_diagnostic();\r
+  show_box(r);\r
+  end_diagnostic(true);\r
+\r
+exit:\r
+  return r;\r
+}\r
+/* sec 0668 */\r
+pointer vpackage_(pointer p, scaled h, small_number m, scaled l)\r
+{\r
+  pointer r;\r
+  scaled w, d, x;\r
+  scaled s;\r
+  pointer g;\r
+  /* glue_ord o; */\r
+  int o;\r
+\r
+  last_badness = 0;\r
+  r = get_node(box_node_size);\r
+  type(r) = vlist_node;\r
+  subtype(r) = min_quarterword;\r
+  shift_amount(r) = 0;\r
+  list_ptr(r) = p;\r
+  w = 0;\r
+  d = 0;\r
+  x = 0;\r
+  total_stretch[normal] = 0;\r
+  total_shrink[normal] = 0;\r
+  total_stretch[fil] = 0;\r
+  total_shrink[fil] = 0;\r
+  total_stretch[fill] = 0;\r
+  total_shrink[fill] = 0;\r
+  total_stretch[filll] = 0;\r
+  total_shrink[filll] = 0;\r
+\r
+  while (p != 0)\r
+  {\r
+    if (is_char_node(p))\r
+    {\r
+      confusion("vpack");\r
+      return 0;\r
+    }\r
+    else switch (type(p))\r
+    {\r
+      case hlist_node:\r
+      case vlist_node:\r
+      case rule_node:\r
+      case unset_node:\r
+        {\r
+          x = x + d + height(p);\r
+          d = depth(p);\r
+\r
+          if (type(p) >= rule_node)\r
+            s = 0;\r
+          else\r
+            s = shift_amount(p);\r
+\r
+          if (width(p) + s > w)\r
+            w = width(p) + s;\r
+        }\r
+        break;\r
+\r
+      case whatsit_node:\r
+        break;\r
+\r
+      case glue_node:\r
+        {\r
+          x = x + d;\r
+          d = 0;\r
+          g = glue_ptr(p);\r
+          x = x + width(g);\r
+          o = stretch_order(g);\r
+          total_stretch[o] = total_stretch[o] + stretch(g);\r
+          o = shrink_order(g);\r
+          total_shrink[o] = total_shrink[o] + shrink(g);\r
+\r
+          if (subtype(p) >= a_leaders)\r
+          {\r
+            g = leader_ptr(p);\r
+\r
+            if (width(g) > w)\r
+              w = width(g);\r
+          }\r
+        }\r
+        break;\r
+\r
+      case kern_node:\r
+        {\r
+          x = x + d + width(p);\r
+          d = 0;\r
+        }\r
+        break;\r
+\r
+      default:\r
+        break;\r
+    }\r
+\r
+    p = link(p);\r
+  }\r
+\r
+  width(r) = w;\r
+\r
+  if (d > l)\r
+  {\r
+    x = x + d - l;\r
+    depth(r) = l;\r
+  }\r
+  else\r
+    depth(r) = d;\r
+\r
+  if (m == additional)\r
+    h = x + h;\r
+\r
+  height(r) = h;\r
+  x = h - x;\r
+\r
+  if (x == 0)\r
+  {\r
+    glue_sign(r) = normal;\r
+    glue_order(r) = normal;\r
+    glue_set(r) = 0.0;\r
+    goto exit;\r
+  }\r
+  else if (x > 0)\r
+  {\r
+    if (total_stretch[filll] != 0)\r
+      o = filll;\r
+    else if (total_stretch[fill] != 0)\r
+      o = fill;\r
+    else if (total_stretch[fil] != 0)\r
+      o = fil;\r
+    else\r
+      o = normal;\r
+\r
+    glue_order(r) = o;\r
+    glue_sign(r) = stretching;\r
+\r
+    if (total_stretch[o] != 0)\r
+      glue_set(r) = x / ((double) total_stretch[o]);\r
+    else\r
+    {\r
+      glue_sign(r) = normal;\r
+      glue_set(r) = 0.0;\r
+    }\r
+\r
+    if (o == normal)\r
+      if (list_ptr(r) != 0)\r
+      {\r
+        last_badness = badness(x, total_stretch[normal]);\r
+\r
+        if (last_badness > vbadness)\r
+        {\r
+          print_ln();\r
+\r
+          if (last_badness > 100)\r
+            print_nl("Underfull");\r
+          else\r
+            print_nl("Loose");\r
+\r
+          prints(" \\vbox (badness ");\r
+          print_int(last_badness);\r
+\r
+          if (last_badness > 100)\r
+            underfull_vbox++;\r
+\r
+          goto common_ending;\r
+        }\r
+      }\r
+\r
+    goto exit;\r
+  }\r
+  else\r
+  {\r
+    if (total_shrink[filll] != 0)\r
+      o = filll;\r
+    else if (total_shrink[fill] != 0)\r
+      o = fill;\r
+    else if (total_shrink[fil] != 0)\r
+      o = fil;\r
+    else\r
+      o = normal;\r
+\r
+    glue_order(r) = o;\r
+    glue_sign(r) = shrinking;\r
+\r
+    if (total_shrink[o] != 0)\r
+      glue_set(r) = (- (integer) x) / ((double) total_shrink[o]);\r
+    else\r
+    {\r
+      glue_sign(r) = normal;\r
+      glue_set(r) = 0.0;\r
+    }\r
+\r
+    if ((total_shrink[o] < - (integer) x) && (o == 0) && (list_ptr(r) != 0))\r
+    {\r
+      last_badness = 1000000L;\r
+      glue_set(r) = 1.0;\r
+\r
+      if ((- (integer) x - total_shrink[0] > vfuzz) || (vbadness < 100))\r
+      {\r
+        print_ln();\r
+        print_nl("Overfull \\vbox (");\r
+        print_scaled(- (integer) x - total_shrink[0]);\r
+        prints("pt too high");\r
+\r
+        overfull_vbox++;\r
+\r
+        goto common_ending;\r
+      }\r
+    }\r
+    else if (o == 0)\r
+      if (list_ptr(r) != 0)\r
+      {\r
+        last_badness = badness(- (integer) x, total_shrink[normal]);\r
+        if (last_badness > vbadness)\r
+        {\r
+          print_ln();\r
+          print_nl("Tight \\vbox (badness ");\r
+          print_int(last_badness);\r
+          goto common_ending;\r
+        }\r
+      }\r
+\r
+    goto exit;\r
+  }\r
+\r
+common_ending:\r
+\r
+  if (output_active)\r
+    prints(") has occurred while \\output is active");\r
+  else\r
+  {\r
+    if (pack_begin_line != 0)\r
+    {\r
+      prints(") in alignment at lines ");\r
+      print_int(abs(pack_begin_line));\r
+      prints("--");\r
+    }\r
+    else\r
+      prints(") detected at line ");\r
+\r
+    print_int(line);\r
+    print_ln();\r
+  }\r
+\r
+  begin_diagnostic();\r
+  show_box(r);\r
+  end_diagnostic(true);\r
+\r
+exit:\r
+  return r;\r
+}\r
+/* sec 0679 */\r
+void append_to_vlist (pointer b)\r
+{\r
+  scaled d;\r
+  pointer p;\r
+\r
+  if (prev_depth > ignore_depth)\r
+  {\r
+    d = width(baseline_skip) - prev_depth - height(b);\r
+\r
+    if (d < line_skip_limit)\r
+      p = new_param_glue(line_skip_code);\r
+    else\r
+    {\r
+      p = new_skip_param(baseline_skip_code);\r
+      width(temp_ptr) = d;\r
+    }\r
+\r
+    link(tail) = p;\r
+    tail = p;\r
+  }\r
+\r
+  link(tail) = b;\r
+  tail = b;\r
+  prev_depth = depth(b);\r
+}\r
+/* sec 0686 */\r
+pointer new_noad (void)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(noad_size);\r
+  type(p) = ord_noad;\r
+  subtype(p) = normal;\r
+  mem[nucleus(p)].hh = empty_field;\r
+  mem[subscr(p)].hh = empty_field;\r
+  mem[supscr(p)].hh = empty_field;\r
+\r
+  return p;\r
+}\r
+/* sec 0688 */\r
+pointer new_style (small_number s)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(style_node_size);\r
+  type(p) = style_node;\r
+  subtype(p) = s;\r
+  width(p) = 0;\r
+  depth(p) = 0;\r
+\r
+  return p;\r
+}\r
+/* sec 0689 */\r
+pointer new_choice (void)\r
+{\r
+  pointer p;\r
+\r
+  p = get_node(style_node_size);\r
+  type(p) = choice_node;\r
+  subtype(p) = 0;\r
+  display_mlist(p) = 0;\r
+  text_mlist(p) = 0;\r
+  script_mlist(p) = 0;\r
+  script_script_mlist(p) = 0;\r
+\r
+  return p;\r
+}\r
+/* sec 0693 */\r
+void show_info (void)\r
+{\r
+  show_node_list(info(temp_ptr));\r
+}\r
+/* sec 0704 */\r
+pointer fraction_rule (scaled t)\r
+{\r
+  pointer p;\r
+\r
+  p = new_rule();\r
+  height(p) = t;\r
+  depth(p) = 0;\r
+\r
+  return p;\r
+}\r
+/* sec 0705 */\r
+pointer overbar (pointer b, scaled k, scaled t)\r
+{\r
+  pointer p, q;\r
+\r
+  p = new_kern(k);\r
+  link(p) = b;\r
+  q = fraction_rule(t);\r
+  link(q) = p;\r
+  p = new_kern(t);\r
+  link(p) = q;\r
+\r
+  return vpackage(p, 0, 1, max_dimen);\r
+}\r
+/* sec 0709 */\r
+pointer char_box (internal_font_number f, quarterword c)\r
+{\r
+  four_quarters q;\r
+  eight_bits hd;\r
+  pointer b, p;\r
+\r
+  q = char_info(f, c);\r
+  hd = height_depth(q);\r
+  b = new_null_box();\r
+  width(b) = char_width(f, q) + char_italic(f, q);\r
+  height(b) = char_height(f, hd);\r
+  depth(b) = char_depth(f, hd);\r
+  p = get_avail();\r
+  character(p) = c;\r
+  font(p) = f;\r
+  list_ptr(b) = p;\r
+\r
+  return b;\r
+}\r
+/* sec 0711 */\r
+void stack_into_box (pointer b, internal_font_number f, quarterword c)\r
+{\r
+  pointer p;\r
+\r
+  p = char_box(f, c);\r
+  link(p) = list_ptr(b);\r
+  list_ptr(b) = p;\r
+  height(b) = height(p);\r
+}\r
+/* sec 0712 */\r
+scaled height_plus_depth (internal_font_number f, quarterword c)\r
+{\r
+  four_quarters q;\r
+  eight_bits hd;\r
+\r
+  q = char_info(f, c);\r
+  hd = height_depth(q);\r
+\r
+  return char_height(f, hd) + char_depth(f, hd);\r
+}\r
+/* sec 0706 */\r
+pointer var_delimiter (pointer d, small_number s, scaled v)\r
+{\r
+  pointer b;\r
+  internal_font_number f, g;\r
+  quarterword c, x, y;\r
+  integer m, n;\r
+  scaled u;\r
+  scaled w;\r
+  four_quarters q;\r
+  four_quarters r;\r
+  eight_bits hd;\r
+  /* small_number z; */\r
+  int z;\r
+  boolean large_attempt;\r
+\r
+  f = null_font;\r
+  w = 0;\r
+  large_attempt = false;\r
+  z = small_fam(d);\r
+  x = small_char(d);\r
+\r
+  while (true)\r
+  {\r
+    if ((z != 0) || (x != 0))\r
+    {\r
+      z = z + s + 16;\r
+\r
+      do\r
+        {\r
+          z = z - 16;\r
+          g = fam_fnt(z);\r
+\r
+          if (g != null_font)\r
+          {\r
+            y = x;\r
+\r
+            if ((y >= font_bc[g]) && (y <= font_ec[g]))\r
+            {\r
+continu:\r
+              q = char_info(g, y);\r
+              \r
+              if (char_exists(q))\r
+              {\r
+                if (char_tag(q) == ext_tag)\r
+                {\r
+                  f = g;\r
+                  c = y;\r
+                  goto found;\r
+                }\r
+\r
+                hd = height_depth(q);\r
+                u = char_height(g, hd) + char_depth(g, hd);\r
+\r
+                if (u > w)\r
+                {\r
+                  f = g;\r
+                  c = y;\r
+                  w = u;\r
+\r
+                  if (u >= v)\r
+                    goto found;\r
+                }\r
+\r
+                if (char_tag(q) == list_tag)\r
+                {\r
+                  y = rem_byte(q);\r
+                  goto continu;\r
+                }\r
+              }\r
+            }\r
+          }\r
+        }\r
+      while (!(z < 16));\r
+    }\r
+\r
+    if (large_attempt)\r
+      goto found;\r
+\r
+    large_attempt = true;\r
+    z = large_fam(d);\r
+    x = large_char(d);\r
+  }\r
+\r
+found:\r
+  if (f != null_font)\r
+    if (char_tag(q) == ext_tag)\r
+    {\r
+      b = new_null_box();\r
+      type(b) = vlist_node;\r
+      r = font_info[exten_base[f] + rem_byte(q)].qqqq;\r
+      c = ext_rep(r);\r
+      u = height_plus_depth(f, c);\r
+      w = 0;\r
+      q = char_info(f, c);\r
+      width(b) = char_width(f, q) + char_italic(f, q);\r
+      c = ext_bot(r);\r
+\r
+      if (c != min_quarterword)\r
+        w = w + height_plus_depth(f, c);\r
+\r
+      c = ext_mid(r);\r
+\r
+      if (c != min_quarterword)\r
+        w = w + height_plus_depth(f, c);\r
+\r
+      c = ext_top(r);\r
+\r
+      if (c != min_quarterword)\r
+        w = w + height_plus_depth(f, c);\r
+\r
+      n = 0;\r
+\r
+      if (u > 0)\r
+        while (w < v)\r
+        {\r
+          w = w + u;\r
+          incr(n);\r
+\r
+          if (ext_mid(r) != min_quarterword)\r
+            w = w + u;\r
+        }\r
+\r
+      c = ext_bot(r);\r
+\r
+      if (c != min_quarterword)\r
+        stack_into_box(b, f, c);\r
+\r
+      c = ext_rep(r);\r
+\r
+      for (m = 1; m <= n; m++)\r
+        stack_into_box(b, f, c);\r
+\r
+      c = ext_mid(r);\r
+\r
+      if (c != min_quarterword)\r
+      {\r
+        stack_into_box(b, f, c);\r
+        c = ext_rep(r);\r
+\r
+        for (m = 1; m <= n; m++)\r
+          stack_into_box(b, f, c);\r
+      }\r
+\r
+      c = ext_top(r);\r
+\r
+      if (c != 0)\r
+        stack_into_box(b, f, c);\r
+      \r
+      depth(b) = w - height(b);\r
+    }\r
+    else\r
+      b = char_box(f, c);\r
+  else\r
+  {\r
+    b = new_null_box();\r
+    width(b) = null_delimiter_space;\r
+  }\r
+\r
+  shift_amount(b) = half(height(b) - depth(b)) - axis_height(s);\r
+\r
+  return b;\r
+}\r