summaryrefslogtreecommitdiff
path: root/systems/parsitex
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /systems/parsitex
Initial commit
Diffstat (limited to 'systems/parsitex')
-rw-r--r--systems/parsitex/README7
-rw-r--r--systems/parsitex/parsitex.change9736
-rw-r--r--systems/parsitex/parsitex.pdfbin0 -> 1530713 bytes
3 files changed, 9743 insertions, 0 deletions
diff --git a/systems/parsitex/README b/systems/parsitex/README
new file mode 100644
index 0000000000..26cd7aee36
--- /dev/null
+++ b/systems/parsitex/README
@@ -0,0 +1,7 @@
+The ParsiTeX engine
+
+The ParsiTeX engine is a localized Persian and bidirectional ex­ten­sion of TeX.
+It is based on TeX--XeT algorithm of Knuth but does not have any of the limitations of
+the TeX--XeT included in etex. For the details of changes please look at parsitex.pdf.
+
+
diff --git a/systems/parsitex/parsitex.change b/systems/parsitex/parsitex.change
new file mode 100644
index 0000000000..ee975e5cba
--- /dev/null
+++ b/systems/parsitex/parsitex.change
@@ -0,0 +1,9736 @@
+
+% Change file for TeX 3.14159 in C, derived from various other change files
+% by Tim Morgan, UC Irvine ICS Department, and many others
+%
+% NOTE: the module numbers in this change file refer to the published
+% text in TeX, the Program, Volume B. 1986
+%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Hints:
+% To add a new command do:
+% 1) determine its command or modifier code
+% 2) add a primitive call for it
+% 3) add a case to prnt_cmd_chr for it
+% 4) add a case to big switch of main control
+% 5) add a case to Assignment switch of prefixed_command if approperiate
+% 6) change version in banner and add a Version line below
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Version 3.10 move shift_amount negation to hlist_out routine (1383/6/15)
+% Version 3.11 extend buf_size (3000->16384), fixed left right skips (1383/8/9)
+% Version 3.12 extend adding LR to halign columns (1383/8/25)
+% Version 3.13 adding param_size from 60 to 120 (1383/10/5)
+% Version 3.014 fixing \eqnotname anomalies (1383/10/10)
+% Version 3.015 adding ignrautoLR (1383/12/8)
+% Version 3.016 adding \ifsplited (1384/1/31)
+% Version 3.017 fixing space in printing ҽ (1384/7/14)
+% Version 3.018 adding some comments (1384/12/16)
+% Version 3.019 reorganizing \pTeX changes (1384/12/26)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [0] WEAVE: only print changes
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x Tell WEAVE to print only the changes:
+ \def\?##1]{\hbox to 1in{\hfil##1.\ }}
+ }
+@y
+ \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }}
+ }
+\let\maybe=\iffalse
+\inputR RtoLmac
+\def\pTeXaltstr{\pTeXchg{Print alternate strings.}}
+\def\pTeXnewprt{\pTeXchg{Use newly defined printing macros.}}
+\def\pTeXusechr{\pTeXchg{Use semitic characters same as latin's.}}
+\def\pTeXeqnm{\pTeXchg{Deal with equated commands.}}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.2] banner line
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 2
+@d banner=='This is TeX, Version 3.141592' {printed when \TeX\ starts}
+@y 2==============
+\beginRt{\:}
+ѠսĝýĠ̠
+ս՝נὠýĠ
+
+ʠϠýĠĝýĠ Ϡՠ
+ὠ
+נѽȠϠѾʾĽ
+ΠϠנ
+
+ҽѾĠϠĝýĠ
+
+ϠѾξ
+
+Ϡҽ
+
+
+
+
+ýĠ
+\endRt
+\pTeXchg{Change \TeX{} to \TeX-e-Parsi.}
+@d banner=="This is TeX-e-Parsi (Parsi-TeX) 3.019, Version 3.141592 "
+ {printed when \TeX\ starts}
+@d initex==" (INITEX)"
+@d noformat==" (no format preloaded)"
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.4] program header
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+program TEX; {all file names are defined dynamically}
+label @<Labels in the outer block@>@/
+@y
+program TEX; {all file names are defined dynamically}
+@z
+@x
+@<Labels in the out...@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+@y
+@<Labels in the outer block@>=
+start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.7] debug..gubed, stat..tats
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Here we change these WEB symbols, which are used much as #ifdef's
+% in C, into something which will get translated into actual #ifdef's.
+@x
+@d debug==@{ {change this to `$\\{debug}\equiv\null$' when debugging}
+@d gubed==@t@>@} {change this to `$\\{gubed}\equiv\null$' when debugging}
+@y
+@d debug==ifdef('DEBUG')
+@d gubed==endif('DEBUG')
+@z
+@x
+@d stat==@{ {change this to `$\\{stat}\equiv\null$' when gathering
+ usage statistics}
+@d tats==@t@>@} {change this to `$\\{tats}\equiv\null$' when gathering
+ usage statistics}
+@y
+@d stat==ifdef('STAT')
+@d tats==endif('STAT')
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.8] init..tini
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d init== {change this to `$\\{init}\equiv\.{@@\{}$' in the production version}
+@d tini== {change this to `$\\{tini}\equiv\.{@@\}}$' in the production version}
+@y
+@d init==ifdef('INITEX')
+@d tini==endif('INITEX')
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.9] compiler directives
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead}
+@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging}
+@y
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.11] compile-time constants, use logical names
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% doubled mem_max for C since UCI people are memory hogs
+% made dvi_buf_size=2*8192 for better BSD Unix I/O performance
+% enlarged various other datastructures
+@x
+@!mem_max=30000; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=500; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=72; {width of context lines on terminal error messages}
+@!half_error_line=42; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=200; {maximum number of simultaneous input sources}
+@!max_in_open=6; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=75; {maximum internal font number; must not exceed |max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=20000; {number of words of |font_info| for all fonts}
+@!param_size=60; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=3000; {maximum number of strings; must not exceed |max_halfword|}
+@!string_vacancies=8000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=32000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=600; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=8000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=500; {space for ``opcodes'' in the hyphenation patterns}
+@!dvi_buf_size=800; {size of the output buffer; must be a multiple of 8}
+@!file_name_size=40; {file names shouldn't be longer than this}
+@!pool_name='TeXformats:TEX.POOL ';
+ {string of length |file_name_size|; tells where the string pool appears}
+@y
+@!mem_max=524800; {greatest index in \TeX's internal |mem| array;
+ must be strictly less than |max_halfword|;
+ must be equal to |mem_top| in \.{INITEX}, otherwise |>=mem_top|}
+@!mem_min=0; {smallest index in \TeX's internal |mem| array;
+ must be |min_halfword| or more;
+ must be equal to |mem_bot| in \.{INITEX}, otherwise |<=mem_bot|}
+@!buf_size=16384; {maximum number of characters simultaneously present in
+ current lines of open files and in control sequences between
+ \.{\\csname} and \.{\\endcsname}; must not exceed |max_halfword|}
+@!error_line=79; {width of context lines on terminal error messages}
+@!half_error_line=50; {width of first lines of contexts in terminal
+ error messages; should be between 30 and |error_line-15|}
+@!max_print_line=79; {width of longest text lines output; should be at least 60}
+@!stack_size=300; {maximum number of simultaneous input sources}
+@!max_in_open=15; {maximum number of input files and error insertions that
+ can be going on simultaneously}
+@!font_max=255; {maximum internal font number; must not exceed|max_quarterword|
+ and must be at most |font_base+256|}
+@!font_mem_size=72000; {number of words of |font_info| for all fonts}
+@!param_size=120; {maximum number of simultaneous macro parameters}
+@!nest_size=40; {maximum number of semantic levels simultaneously active}
+@!max_strings=17000; {maximum number of strings;
+ must not exceed |max_halfword|}
+@!string_vacancies=150000; {the minimum number of characters that should be
+ available for the user's control sequences and font names,
+ after \TeX's own error messages are stored}
+@!pool_size=250000; {maximum number of characters in strings, including all
+ error messages and help texts, and the names of all fonts and
+ control sequences; must exceed |string_vacancies| by the total
+ length of \TeX's own strings, which is currently about 23000}
+@!save_size=4000; {space for saving values outside of current group; must be
+ at most |max_halfword|}
+@!trie_size=8000; {space for hyphenation patterns; should be larger for
+ \.{INITEX} than it is in production versions of \TeX}
+@!trie_op_size=751; {space for ``opcodes'' in the hyphenation patterns;
+ best if relatively prime to 313, 361, and 1009, according to {\tt
+ rocky@@watson.ibm.com}.}
+@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8}
+@!file_name_size=1024; {file names shouldn't be longer than this}
+@!pool_name='tex.pool';
+ {string of length |file_name_size|; tells where the string pool appears}
+@!mem_top=524800; {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@!max_buf_line=1000; {width of longest text lines output; should be at least60}
+@!neg_trie_op_size=-751; {for lower |trie_op_hash| array bound;
+ must be equal to |-trie_op_size|.}
+@!neg_max_strings=-11000; {|-max_strings|}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.12] sensitive compile-time constants
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% For C we change mem_base and hi_mem_base to reflect our use of
+% 0-origin vs pc's use of negative-origin. Despite the fact that
+% these are "sensitive" constants, we're going to make mem_top a
+% #define in the C code for readability and ease of modification
+% (it's up above). Beware!
+@x
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d mem_top==30000 {largest index in the |mem| array dumped by \.{INITEX};
+ must be substantially larger than |mem_bot|
+ and not greater than |mem_max|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=2100 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|}
+@d hash_prime=1777 {a prime number equal to about 85\pct! of |hash_size|}
+@d hyph_size=307 {another prime; the number of \.{\\hyphenation} exceptions}
+@y
+@d mem_bot=0 {smallest index in the |mem| array dumped by \.{INITEX};
+ must not be less than |mem_min|}
+@d font_base=0 {smallest internal font number; must not be less
+ than |min_quarterword|}
+@d hash_size=11000 {maximum number of control sequences; it should be at most
+ about |(mem_max-mem_min)/10|, so we can be really generous}
+@d hash_prime=9349 {The thousandth in a list of 1000 primes. Run the primes
+ program in LiterateProgramming to find out. It is reasonably close to
+ 85\% of a |hash_size| of 9500}
+@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [1.16] Use C macros for incr()/decr()
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% By not defining these, they slip through into the C code, where we
+% use macros, which we hope generate more efficient code
+@x
+@d incr(#) == #:=#+1 {increase a variable by unity}
+@d decr(#) == #:=#-1 {decrease a variable by unity}
+@y
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2.19] increasing character set
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 19
+@d text_char == char {the data type of characters in text files}
+@y 19===================
+@d text_char == ASCII_code {the data type of characters in text files}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2.21] using setup_xchrs
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 21
+@<Set init...@>=
+xchr[@'40]:=' ';
+xchr[@'41]:='!';
+xchr[@'42]:='"';
+xchr[@'43]:='#';
+xchr[@'44]:='$';
+xchr[@'45]:='%';
+xchr[@'46]:='&';
+xchr[@'47]:='''';@/
+xchr[@'50]:='(';
+xchr[@'51]:=')';
+xchr[@'52]:='*';
+xchr[@'53]:='+';
+xchr[@'54]:=',';
+xchr[@'55]:='-';
+xchr[@'56]:='.';
+xchr[@'57]:='/';@/
+xchr[@'60]:='0';
+xchr[@'61]:='1';
+xchr[@'62]:='2';
+xchr[@'63]:='3';
+xchr[@'64]:='4';
+xchr[@'65]:='5';
+xchr[@'66]:='6';
+xchr[@'67]:='7';@/
+xchr[@'70]:='8';
+xchr[@'71]:='9';
+xchr[@'72]:=':';
+xchr[@'73]:=';';
+xchr[@'74]:='<';
+xchr[@'75]:='=';
+xchr[@'76]:='>';
+xchr[@'77]:='?';@/
+xchr[@'100]:='@@';
+xchr[@'101]:='A';
+xchr[@'102]:='B';
+xchr[@'103]:='C';
+xchr[@'104]:='D';
+xchr[@'105]:='E';
+xchr[@'106]:='F';
+xchr[@'107]:='G';@/
+xchr[@'110]:='H';
+xchr[@'111]:='I';
+xchr[@'112]:='J';
+xchr[@'113]:='K';
+xchr[@'114]:='L';
+xchr[@'115]:='M';
+xchr[@'116]:='N';
+xchr[@'117]:='O';@/
+xchr[@'120]:='P';
+xchr[@'121]:='Q';
+xchr[@'122]:='R';
+xchr[@'123]:='S';
+xchr[@'124]:='T';
+xchr[@'125]:='U';
+xchr[@'126]:='V';
+xchr[@'127]:='W';@/
+xchr[@'130]:='X';
+xchr[@'131]:='Y';
+xchr[@'132]:='Z';
+xchr[@'133]:='[';
+xchr[@'134]:='\';
+xchr[@'135]:=']';
+xchr[@'136]:='^';
+xchr[@'137]:='_';@/
+xchr[@'140]:='`';
+xchr[@'141]:='a';
+xchr[@'142]:='b';
+xchr[@'143]:='c';
+xchr[@'144]:='d';
+xchr[@'145]:='e';
+xchr[@'146]:='f';
+xchr[@'147]:='g';@/
+xchr[@'150]:='h';
+xchr[@'151]:='i';
+xchr[@'152]:='j';
+xchr[@'153]:='k';
+xchr[@'154]:='l';
+xchr[@'155]:='m';
+xchr[@'156]:='n';
+xchr[@'157]:='o';@/
+xchr[@'160]:='p';
+xchr[@'161]:='q';
+xchr[@'162]:='r';
+xchr[@'163]:='s';
+xchr[@'164]:='t';
+xchr[@'165]:='u';
+xchr[@'166]:='v';
+xchr[@'167]:='w';@/
+xchr[@'170]:='x';
+xchr[@'171]:='y';
+xchr[@'172]:='z';
+xchr[@'173]:='{';
+xchr[@'174]:='|';
+xchr[@'175]:='}';
+xchr[@'176]:='~';@/
+@y 21===================
+\pTeXchg{We use an external function to deal with diversity of Farsi character
+sets.}
+@<Set init...@>=
+@<Use |setup_xchrs|@>;@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [2.23] all characters are legal
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Unlike the standard Unix TeX distribution, we allow all characters
+% as legal input, to support SAIL and MIT input files on occasion.
+@x
+@<Set init...@>=
+for i:=0 to @'37 do xchr[i]:=' ';
+for i:=@'177 to @'377 do xchr[i]:=' ';
+@y
+\pTeXchg{Here we don't initialize anything, because |xchr| is supposed to be
+ read from external file |filter|. (see Setup |xchr| above)}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.25] file types
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+The program actually makes use also of a third kind of file, called a
+|word_file|, when dumping and reloading base information for its own
+initialization. We shall define a word file later; but it will be possible
+for us to specify simple operations on word files before they are defined.
+
+@y
+I/O in C is done using standard I/O. We will define the path numbers
+in an include file for C which are used in searching for files to be
+read. We'll define all the file types in C also.
+@z
+@x
+@!alpha_file=packed file of text_char; {files that contain textual data}
+@!byte_file=packed file of eight_bits; {files that contain binary data}
+@y
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.26] add real_name_of_file array
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|name_of_file|.
+@^system dependencies@>
+
+@<Glob...@>=
+@!name_of_file:packed array[1..file_name_size] of char;@;@/
+ {on some systems this may be a \&{record} variable}
+@y
+|name_of_file|.
+
+The C version uses search paths to look for files to open.
+We use |real_name_of_file| to hold the |name_of_file| with a directory
+name from the path in front of it.
+@^system dependencies@>
+
+@<Glob...@>=
+@!name_of_file,@!real_name_of_file:packed array[1..file_name_size] of char;
+@;@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.27] file opening
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The \ph\ compiler with which the present version of \TeX\ was prepared has
+extended the rules of \PASCAL\ in a very convenient way. To open file~|f|,
+we can write
+$$\vbox{\halign{#\hfil\qquad&#\hfil\cr
+|reset(f,@t\\{name}@>,'/O')|&for input;\cr
+|rewrite(f,@t\\{name}@>,'/O')|&for output.\cr}}$$
+The `\\{name}' parameter, which is of type `{\bf packed array
+$[\langle\\{any}\rangle]$ of \\{char}}', stands for the name of
+the external file that is being opened for input or output.
+Blank spaces that might appear in \\{name} are ignored.
+
+The `\.{/O}' parameter tells the operating system not to issue its own
+error messages if something goes wrong. If a file of the specified name
+cannot be found, or if such a file cannot be opened for some other reason
+(e.g., someone may already be trying to write the same file), we will have
+|@!erstat(f)<>0| after an unsuccessful |reset| or |rewrite|. This allows
+\TeX\ to undertake appropriate corrective action.
+@:PASCAL H}{\ph@>
+@^system dependencies@>
+
+\TeX's file-opening procedures return |false| if no file identified by
+|name_of_file| could be opened.
+
+@d reset_OK(#)==erstat(#)=0
+@d rewrite_OK(#)==erstat(#)=0
+
+@p function a_open_in(var f:alpha_file):boolean;
+ {open a text file for input}
+begin reset(f,name_of_file,'/O'); a_open_in:=reset_OK(f);
+end;
+@#
+function a_open_out(var f:alpha_file):boolean;
+ {open a text file for output}
+begin rewrite(f,name_of_file,'/O'); a_open_out:=rewrite_OK(f);
+end;
+@#
+function b_open_in(var f:byte_file):boolean;
+ {open a binary file for input}
+begin reset(f,name_of_file,'/O'); b_open_in:=reset_OK(f);
+end;
+@#
+function b_open_out(var f:byte_file):boolean;
+ {open a binary file for output}
+begin rewrite(f,name_of_file,'/O'); b_open_out:=rewrite_OK(f);
+end;
+@#
+function w_open_in(var f:word_file):boolean;
+ {open a word file for input}
+begin reset(f,name_of_file,'/O'); w_open_in:=reset_OK(f);
+end;
+@#
+function w_open_out(var f:word_file):boolean;
+ {open a word file for output}
+begin rewrite(f,name_of_file,'/O'); w_open_out:=rewrite_OK(f);
+end;
+@y
+@ All of the file opening functions will be defined as macros in C.
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.28] reserve file closure for C routines
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Files can be closed with the \ph\ routine `|close(f)|', which
+@^system dependencies@>
+should be used when all input or output with respect to |f| has been completed.
+This makes |f| available to be opened again, if desired; and if |f| was used for
+output, the |close| operation makes the corresponding external file appear
+on the user's area, ready to be read.
+
+These procedures should not generate error messages if a file is
+being closed before it has been successfully opened.
+
+@p procedure a_close(var f:alpha_file); {close a text file}
+begin close(f);
+end;
+@#
+procedure b_close(var f:byte_file); {close a binary file}
+begin close(f);
+end;
+@#
+procedure w_close(var f:word_file); {close a word file}
+begin close(f);
+end;
+@y
+@ And all file closing as well.
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.31] Make input_ln an external C routine
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function input_ln(var f:alpha_file;@!bypass_eoln:boolean):boolean;
+ {inputs the next line or returns |false|}
+var last_nonblank:0..buf_size; {|last| with trailing blanks removed}
+begin if bypass_eoln then if not eof(f) then get(f);
+ {input the first character of the line into |f^|}
+last:=first; {cf.\ Matthew 19\thinspace:\thinspace30}
+if eof(f) then input_ln:=false
+else begin last_nonblank:=first;
+ while not eoln(f) do
+ begin if last>=max_buf_stack then
+ begin max_buf_stack:=last+1;
+ if max_buf_stack=buf_size then
+ @<Report overflow of the input buffer, and abort@>;
+ end;
+ buffer[last]:=xord[f^]; get(f); incr(last);
+ if buffer[last-1]<>" " then last_nonblank:=last;
+ end;
+ last:=last_nonblank; input_ln:=true;
+ end;
+end;
+@y
+We'll get |input_ln| from an external C module, coded for efficiency
+directly in C.
+%%\pTeXchg{We define directional types here.}
+@<Types...@>=
+@<\pTeX{} Types@>@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.32] term_in/out are input,output
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+is considered an output file the file variable is |term_out|.
+@^system dependencies@>
+
+@<Glob...@>=
+@!term_in:alpha_file; {the terminal as an input file}
+@!term_out:alpha_file; {the terminal as an output file}
+@y
+is considered an output file the file is |term_out|. In C, these
+files will be defined as ``stdin'' and ``stdout,'' respectively.
+@^system dependencies@>
+
+@d term_in==stdin {the terminal as an input file}
+@d term_out==stdout {the terminal as an output file}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.33] don't need to open terminal files
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Here is how to open the terminal files
+in \ph. The `\.{/I}' switch suppresses the first |get|.
+@^system dependencies@>
+
+@d t_open_in==reset(term_in,'TTY:','/O/I') {open the terminal for text input}
+@d t_open_out==rewrite(term_out,'TTY:','/O') {open the terminal for text output}
+@y
+@ Here is how to open the terminal files. |t_open_out| does nothing.
+|t_open_in|, on the other hand, does the work of "rescanning", or getting
+any command line arguments the user has provided.
+It's coded in C externally.
+@^system dependencies@>
+
+@d t_open_out == {output already open for text output}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.34] flushing output
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+these operations can be specified in \ph:
+@^system dependencies@>
+
+@d update_terminal == break(term_out) {empty the terminal output buffer}
+@d clear_terminal == break_in(term_in,true) {clear the terminal input buffer}
+@d wake_up_terminal == do_nothing {cancel the user's cancellation of output}
+@y
+these operations can be specified with {\mc UNIX}. |update_terminal|
+does an fflush, since that's easy. |wake_up_terminal| and |clear_terminal|
+are specified in external C routines, if desired. We call fflush()
+termflush() here, and fix it with a macro in C, so we can cast it to (void)
+to keep lint quiet.
+@^system dependencies@>
+
+@z
+@x remove |input_ln| details
+@<Report overflow of the input buffer, and abort@>=
+if format_ident=0 then
+ begin write_ln(term_out,'Buffer size exceeded!'); goto final_end;
+@.Buffer size exceeded@>
+ end
+else begin cur_input.loc_field:=first; cur_input.limit_field:=last-1;
+ overflow("buffer size",buf_size);
+@:TeX capacity exceeded buffer size}{\quad buffer size@>
+ end
+@y
+
+Remove |input_ln| details.
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.37] rescanning the command line
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ The following program does the required initialization
+without retrieving a possible command line.
+It should be clear how to modify this routine to deal with command lines,
+if the system permits them.
+@^system dependencies@>
+
+@p function init_terminal:boolean; {gets the terminal input started}
+@y
+@ The following program does the required initialization.
+Iff anything has been specified on the command line, then |t_open_in|
+will return with |last > first|.
+@^system dependencies@>
+\pTeXchg{Ignoring semitic spaces same as latin's.}
+
+@p function init_terminal:boolean; {gets the terminal input started}
+@z
+@x
+loop@+begin wake_up_terminal; write(term_out,'**'); update_terminal;
+@.**@>
+ if not input_ln(term_in,true) then {this shouldn't happen}
+ begin write_ln(term_out);
+ write(term_out,'! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false; return;
+ end;
+ loc:=first;
+ while (loc<last)and(buffer[loc]=" ") do incr(loc);
+@y first check command line
+if last > first then
+ begin loc := first;
+ while (loc < last) and (buffer[loc]=' ') do incr(loc);
+ if loc < last then
+ begin init_terminal := true;
+ goto exit;
+ end;
+ end;
+loop@+begin wake_up_terminal;
+ if format_ident=0 then bwterm('**')
+ else begin print_nl("**"); end;
+update_terminal;
+@.**@>
+ left_input := true;
+ if not input_ln(term_in,true) then {this shouldn't happen}
+ begin write_ln(term_out);
+ write(term_out, '! End of file on the terminal... why?');
+@.End of file on the terminal@>
+ init_terminal:=false;
+ return;
+ end;
+ loc:=first;
+ while (loc<last)and((buffer[loc]=" ")or(buffer[loc]="")) do incr(loc);
+@z
+@x
+ write_ln(term_out,'Please type the name of your input file.');
+@y
+ print_nl("Please type the name of your input file.");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.49]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 49
+@<Character |k| cannot be printed@>=
+ (k<" ")or(k>"~")
+@y 49===================
+\pTeXchg{In raw printing all characters are printable.}
+@<Character |k| cannot be printed@>=
+ ((not rawprtchr) and ((k<" ")or(k=127)))
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51] a_open_in of pool file needs path specifier
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+name_of_file:=pool_name; {we needn't set |name_length|}
+if a_open_in(pool_file) then
+@y
+vstrcpy(name_of_file+1, pool_name); {this is how you copy strings in C}
+if a_open_in(pool_file,pool_path_spec) then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [4.51,52,53] make TEX.POOL lowercase in messages; fix reading it
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else bad_pool('! I can''t read TEX.POOL.')
+@y
+else begin
+ {Like |bad_pool|, but must not close file if we never opened it}
+ wake_up_terminal; write_ln(term_out, '! I can''t read tex.pool.');
+ get_strings_started:= false; return;
+end
+@z
+@x
+begin if eof(pool_file) then bad_pool('! TEX.POOL has no check sum.');
+@.TEX.POOL has no check sum@>
+read(pool_file,m,n); {read two digits of string length}
+@y
+begin if eof(pool_file) then bad_pool('! tex.pool has no check sum.');
+@.TEX.POOL has no check sum@>
+rread(pool_file,m); rread(pool_file,n); {read two digits of string length}
+@z
+@x
+ bad_pool('! TEX.POOL line doesn''t begin with two digits.');
+@y
+ bad_pool('! tex.pool line doesn''t begin with two digits.');
+@z
+@x
+ begin if eoln(pool_file) then m:=' '@+else read(pool_file,m);
+@y
+ begin if eoln(pool_file) then m:=' '@+else rread(pool_file,m);
+@z
+@x
+ bad_pool('! TEX.POOL check sum doesn''t have nine digits.');
+@y
+ bad_pool('! tex.pool check sum doesn''t have nine digits.');
+@z
+@x
+ incr(k); read(pool_file,n);
+@y
+ incr(k); rread(pool_file,n);
+@z
+@x
+done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.');
+@y
+done: if a<>@$ then bad_pool('! tex.pool doesn''t match; tangle me again.');
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.56]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d wterm(#)==write(term_out,#)
+@d wterm_ln(#)==write_ln(term_out,#)
+@d wterm_cr==write_ln(term_out)
+@d wlog(#)==write(log_file,#)
+@d wlog_ln(#)==write_ln(log_file,#)
+@d wlog_cr==write_ln(log_file)
+@y
+\pTeXchg{We use external C function to write bidirectional strings.
+ To prevent ad hoc misusing original macros, we rename some of them.}
+@d bwterm_ln(#)==write_ln(term_out,#)
+@d bwlog_ln(#)==write_ln(log_file,#)
+@d bwlog(#)==write(log_file,#)
+@d bwterm==b_w_term {external C definition}
+@d cwlog==c_w_log {external C definition}
+@d cwlog_cr==c_w_log_cr {external C definition}
+@d cwterm==c_w_term {external C definition}
+@d cwterm_cr==c_w_term_cr {external C definition}
+@d cwfile==c_w_file {external C definition}
+@d cwfile_cr==c_w_file_cr {external C definition}
+
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.57]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |print_ln|
+@<Basic print...@>=
+procedure print_ln; {prints an end-of-line}
+begin case selector of
+term_and_log: begin wterm_cr; wlog_cr;
+ term_offset:=0; file_offset:=0;
+ end;
+log_only: begin wlog_cr; file_offset:=0;
+ end;
+term_only: begin wterm_cr; term_offset:=0;
+ end;
+no_print,pseudo,new_string: do_nothing;
+othercases write_ln(write_file[selector])
+@y
+\pTeXnewprt
+@<Basic print...@>=
+procedure print_ln; {prints an end-of-line}
+begin @<Reset directinal variables@>;
+case selector of
+term_and_log: begin cwterm_cr; cwlog_cr; end;
+log_only: cwlog_cr;
+term_only: cwterm_cr;
+no_print,pseudo,new_string: do_nothing;
+othercases cwfile_cr;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [3.58]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |print_char|
+@<Basic printing...@>=
+procedure print_char(@!s:ASCII_code); {prints a single character}
+label exit;
+begin if @<Character |s| is the current new-line character@> then
+ if selector<pseudo then
+ begin print_ln; return;
+ end;
+case selector of
+term_and_log: begin wterm(xchr[s]); wlog(xchr[s]);
+ incr(term_offset); incr(file_offset);
+ if term_offset=max_print_line then
+ begin wterm_cr; term_offset:=0;
+ end;
+ if file_offset=max_print_line then
+ begin wlog_cr; file_offset:=0;
+ end;
+ end;
+log_only: begin wlog(xchr[s]); incr(file_offset);
+ if file_offset=max_print_line then print_ln;
+ end;
+term_only: begin wterm(xchr[s]); incr(term_offset);
+@y
+\pTeXchg{To print strings in approperiate language we use |strequiv| macro.}
+@<Basic printing...@>=
+@<Define |get_streq|@>@/
+@#
+procedure print_char(@!s:ASCII_code); {prints a single character}
+label exit;
+begin if @<Character |s| is the current new-line character@> then
+ if selector<pseudo then
+ begin print_ln; return;
+ end;
+ strequiv(s); @<Reset directinal variables@>;
+case selector of
+term_and_log: begin cwterm(s); cwlog(s);
+ if term_offset=max_print_line then cwterm_cr;
+ if file_offset=max_print_line then cwlog_cr;
+ end;
+log_only: begin cwlog(s);
+ if file_offset=max_print_line then print_ln;
+ end;
+term_only: begin cwterm(s);
+@z
+@x
+othercases write(write_file[selector],xchr[s])
+@y
+othercases cwfile (s)
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.59] printing string variant in latin or semitic
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Basic print...@>=
+procedure print(@!s:integer); {prints string |s|}
+label exit;
+var j:pool_pointer; {current character code position}
+@!nl:integer; {new-line character to restore}
+@y
+\pTeXnewprt
+@<Basic print...@>=
+@<Define |pprint|@>@/
+@#
+procedure print(@!s:integer); {prints string |s|}
+label exit;
+var nl:integer; {new-line character to restore}
+@z
+@x
+ begin print_char(s); return; {internal strings are not expanded}
+@y
+ begin pushprinteq; print_char(s); popprinteq;
+ return; {internal strings are not expanded}
+@z
+@x
+ j:=str_start[s];
+ while j<str_start[s+1] do
+ begin print_char(so(str_pool[j])); incr(j);
+ end;
+@y
+ pprint(s);
+@z
+@x
+j:=str_start[s];
+while j<str_start[s+1] do
+ begin print_char(so(str_pool[j])); incr(j);
+ end;
+exit:end;
+@y
+pprint(s);
+exit:end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.60] slow_print
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Basic print...@>=
+@y
+\pTeXnewprt
+@<Basic print...@>=
+@z
+@x
+else begin j:=str_start[s];
+@y
+else begin strequiv(s); j:=str_start[s];
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.61]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Initialize the output...@>=
+wterm(banner);
+if format_ident=0 then wterm_ln(' (no format preloaded)')
+else begin slow_print(format_ident); print_ln;
+ end;
+update_terminal;
+@y
+\pTeXchg{We use external function |initonterm| to show \pTeX{} cover page.}
+@<Initialize the output...@>=
+initonterm;
+virtex_ident:=format_ident;
+if format_ident<>0 then
+ begin print(banner);
+ if format_ident <> initex then print_ln;
+ slow_print(format_ident); print_ln;
+ update_terminal;
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.62] print_nl
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Basic print...@>=
+@y
+\pTeXnewprt
+@<Basic print...@>=
+@z
+@x
+print(s);
+end;
+@y
+strequiv(s); print(s);
+end;
+@#
+@<Define |LorRprt| procedures@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.64] print_the_digs
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ An array of digits in the range |0..15| is printed by |print_the_digs|.
+@y
+@ An array of digits in the range |0..15| is printed by |print_the_digs|.
+\pTeXchg{Print numbers in current language.}
+@z
+@x
+begin while k>0 do
+ begin decr(k);
+ if dig[k]<10 then print_char("0"+dig[k])
+ else print_char("A"-10+dig[k]);
+ end;
+@y
+var @!i:eight_bits; {a loop index}
+begin @<Print the |dig| array in approperiate direction@>;@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.67]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure print_two(@!n:integer); {prints two least significant digits}
+begin n:=abs(n) mod 100; print_char("0"+(n div 10));
+print_char("0"+(n mod 10));
+end;
+@y
+\pTeXchg{Print numbers in current language.}
+@p procedure print_two(@!n:integer); {prints two least significant digits}
+begin n:=abs(n) mod 100;
+@<Print two digit in approperiate direction@>;@/
+end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.68]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 68
+@d print_ASCII == print
+@y 68===================
+\pTeXchg{|semichrout| will be defined as a C macro.}
+@d print_ASCII == print
+@d print_s_ASCII(#) == print(semichrout(#))
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.69]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure print_roman_int(@!n:integer);
+@y
+\pTeXchg{Roman numbers should be printed in latin language.}
+@p procedure print_roman_int(@!n:integer);
+@z
+@x
+begin j:=str_start["m2d5c2l5x2v5i"]; v:=1000;
+@y
+begin pushprinteq; j:=str_start["m2d5c2l5x2v5i"]; v:=1000;
+@z
+@x
+ if n<=0 then return; {nonpositive input produces no output}
+@y
+ if n<=0 then begin popprinteq; return; end;
+@z
+@x
+exit:end;
+@y
+exit: popprinteq; end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [5.70]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure print_current_string; {prints a yet-unmade string}
+@y
+\pTeXnewprt
+@p procedure print_current_string; {prints a yet-unmade string}
+@z
+@x
+begin j:=str_start[str_ptr];
+while j<pool_ptr do
+ begin print_char(so(str_pool[j])); incr(j);
+ end;
+@y
+begin pushprinteq; j:=str_start[str_ptr];
+while j<pool_ptr do
+ begin print_char(so(str_pool[j])); incr(j);
+ end;
+popprinteq;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.81] Eliminate nonlocal goto
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% C cannot do non-local goto's.
+% Plus, it's nicer just to do an exit with the appropriate status code
+% under Unix. We call it "uexit" because there's a WEB symbol called
+% "exit" already. We use a C macro to change uexit() back to exit().
+% RESET_KEYBORD
+@x
+@<Error hand...@>=
+procedure jump_out;
+begin goto end_of_TEX;
+end;
+@y
+@d do_final_end==begin
+ update_terminal;
+ @= resetkeyboard@>;
+ ready_already:=0;
+ if (history <> spotless) and (history <> warning_issued) then
+ uexit(1)
+ else
+ uexit(0);
+ end
+@<Error hand...@>=
+procedure jump_out;
+begin
+close_files_and_terminate;
+do_final_end;
+end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.83]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Get user's advice...@>=
+@y
+@
+\pTeXchg{Don't use uppercase for semitic characters.}
+@<Get user's advice...@>=
+@z
+@x
+ if c>="a" then c:=c+"A"-"a"; {convert to uppercase}
+@y
+ if not issemichr(c) then if c>="a" then c:=c+"A"-"a"; {convert to uppercase}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.84] switch-to-editor option
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Interpret code |c| and |return| if done@>=
+case c of
+"0","1","2","3","4","5","6","7","8","9": if deletions_allowed then
+ @<Delete \(c)|c-"0"| tokens and |goto continue|@>;
+@t\4\4@>@;@+@!debug "D": begin debug_help; goto continue;@+end;@+gubed@/
+"E": if base_ptr>0 then
+ begin print_nl("You want to edit file ");
+@.You want to edit file x@>
+ slow_print(input_stack[base_ptr].name_field);
+ print(" at line "); print_int(line);
+ interaction:=scroll_mode; jump_out;
+ end;
+"H": @<Print the help information and |goto continue|@>;
+"I":@<Introduce new material from the terminal and |return|@>;
+"Q","R","S":@<Change the interaction level and |return|@>;
+"X":begin interaction:=scroll_mode; jump_out;
+@y
+\pTeXusechr
+@d edit_file==input_stack[base_ptr]
+
+@<Interpret code |c| and |return| if done@>=
+case c of
+"0","1","2","3","4","5","6","7","8","9",
+"","","","","","","","","","": if deletions_allowed then
+ @<Delete \(c)|c-"0"| tokens and |goto continue|@>;
+@t\4\4@>@;@+@!debug "D","","": begin debug_help;goto continue;@+end;@+gubed@/
+"E","": if base_ptr>0 then
+ begin edit_name_length := 0;
+ if edit_file.area_field = (edit_file.name_field - 1) then
+ begin edit_name_start:=str_start[edit_file.area_field];
+ edit_name_length:=length (edit_file.area_field);
+ end
+ else edit_name_start:=str_start[edit_file.name_field];
+ edit_name_length:=edit_name_length + length (edit_file.name_field);
+ if edit_file.ext_field = (edit_file.name_field + 1) then
+ edit_name_length:=edit_name_length + length (edit_file.ext_field);
+ edit_line:=line;
+ edit_direction:=direction_stack[in_open];
+ jump_out;
+ end;
+"H","","": @<Print the help information and |goto continue|@>;
+"I","":@<Introduce new material from the terminal and |return|@>;
+"Q","R","S","","","","","","":
+ @<Change the interaction level and |return|@>;
+"X","","":begin interaction:=scroll_mode; jump_out;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.86]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Change the interaction...@>=
+begin error_count:=0; interaction:=batch_mode+c-"Q";
+print("OK, entering ");
+case c of
+"Q":begin print_esc("batchmode"); decr(selector);
+ end;
+"R":print_esc("nonstopmode");
+"S":print_esc("scrollmode");
+end; {there are no other cases}
+print("..."); print_ln; update_terminal; return;
+end
+@y
+\pTeXusechr
+@<Change the interaction...@>=
+begin error_count:=0;
+if not issemichr(c) then interaction:=batch_mode+c-"Q"
+else case c of
+ "","": interaction:=batch_mode;
+ "","": interaction:=nonstop_mode;
+ "","": interaction:=scroll_mode;
+ endcases; {there are no other cases}
+print("OK, entering ");
+case c of
+"Q","","":begin print_esc("batchmode"); decr(selector);
+ end;
+"R","","":print_esc("nonstopmode");
+"S","","":print_esc("scrollmode");
+end; {there are no other cases}
+LorRprt("...",""); print_ln; update_terminal;
+help_ptr:=0;
+return;
+end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.87]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Introduce new material...@>=
+@y
+\pTeXchg{Insert language dependent space.}
+@<Introduce new material...@>=
+@z
+@x
+ begin loc:=first+1; buffer[first]:=" ";
+@y
+ begin loc:=first+1; L_or_S(buffer[first]:=" ")(buffer[first]:="");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.88]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Delete \(c)|c-"0"| tokens...@>=
+@y
+\pTeXusechr
+@<Delete \(c)|c-"0"| tokens...@>=
+@z
+@x
+if (last>first+1) and (buffer[first+1]>="0")and(buffer[first+1]<="9") then
+@y
+if (c>="")and(c<="") then c:=c-""+"0"; if (last>first+1) and
+(buffer[first+1]>="")and(buffer[first+1]<="") then
+ buffer[first+1]:=buffer[first+1]-""+"0";
+if (last>first+1) and (buffer[first+1]>="0")and(buffer[first+1]<="9") then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [6.98] Rename interrup variable to interruptoccured
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d check_interrupt==begin if interrupt<>0 then pause_for_instructions;
+@y
+@d interrupt==interruptoccured
+@d check_interrupt==begin if interrupt<>0 then pause_for_instructions;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.103]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure print_scaled(@!s:scaled); {prints scaled real, rounded to five
+@y
+\pTeXchg{Print numbers in approperiate language. Here we rename
+ |print_scaled| for latin printing, and redefine the procedure to
+ check language befor printing.}
+@p procedure print_scaled_Lft (@!s:scaled); {prints scaled real, rounded to five
+@z
+@x
+end;
+@y
+end;
+@#
+@<Redefine |print_scaled|@>@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [7.109] Handle definition of glue_ratio in an include file as a typedef
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Types...@>=
+@!glue_ratio=real; {one-word representation of a glue expansion factor}
+@y
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.110] Make it easy to build a bigger TeX.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=255 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==65535 {largest allowable value in a |halfword|}
+@y
+@d min_quarterword=0 {smallest allowable value in a |quarterword|}
+@d max_quarterword=1023 {largest allowable value in a |quarterword|}
+@d min_halfword==0 {smallest allowable value in a |halfword|}
+@d max_halfword==@"3FFFFFFF {largest allowable value in a |halfword|}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.112] Efficiency!
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==#+min_quarterword
+ {to put an |eight_bits| item into a quarterword}
+@d qo(#)==#-min_quarterword
+ {to take an |eight_bits| item out of a quarterword}
+@d hi(#)==#+min_halfword
+ {to put a sixteen-bit item into a halfword}
+@d ho(#)==#-min_halfword
+ {to take a sixteen-bit item from a halfword}
+@y
+So they have been simplified here in the obvious way.
+@^inner loop@>@^system dependencies@>
+
+@d qi(#)==# {to put an |eight_bits| item into a quarterword}
+@d qo(#)==# {to take an |eight_bits| item from a quarterword}
+@d hi(#)==# {to put a sixteen-bit item into a halfword}
+@d ho(#)==# {to take a sixteen-bit item from a halfword}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [8.113] Hand-code some more things in C
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!two_halves = packed record@;@/
+ @!rh:halfword;
+ case two_choices of
+ 1: (@!lh:halfword);
+ 2: (@!b0:quarterword; @!b1:quarterword);
+ end;
+@!four_quarters = packed record@;@/
+ @!b0:quarterword;
+ @!b1:quarterword;
+ @!b2:quarterword;
+ @!b3:quarterword;
+ end;
+@!memory_word = record@;@/
+ case four_choices of
+ 1: (@!int:integer);
+ 2: (@!gr:glue_ratio);
+ 3: (@!hh:two_halves);
+ 4: (@!qqqq:four_quarters);
+ end;
+@!word_file = file of memory_word;
+@y
+@=#include "texmemory.h";@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.116] Change mem to zmem
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% We do this so that we can define mem to be a register pointer to the
+% memory array for speed.
+@x
+@!mem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@y
+@!zmem : array[mem_min..mem_max] of memory_word; {the big dynamic storage area}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [9.127] Fix casting problem in C
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% There are several of these. They come from the rules C uses for
+% comparing signed and unsigned quantities. Just doing the comparison
+% can result in incorrect evaluation wrt the way Pascal would do it.
+@x
+if r>p+1 then @<Allocate from the top of node |p| and |goto found|@>;
+@y
+if r>toint(p+1) then @<Allocate from the top of node |p| and |goto found|@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [10.149] Adding |mid_rule| feature
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+in a subscript.
+@y
+in a subscript.
+
+\pTeXchg{We also use glue node for adding |mid_rule| and introduce two more
+subtypes.
+The |leader_ptr| in this cases hold font number of |mid_rule| for computing
+ |rule_ht| in accordance with character fonts.}
+@z
+@x 149
+@d x_leaders=102 {|subtype| for expanded leaders}
+@y 149===================
+@d x_leaders=102 {|subtype| for expanded leaders}
+
+@d active_mid_rule=103 {|subtype| for active |mid_rule| leaders}
+@d suprsd_mid_rule=104 {|subtype| for supressed |mid_rule| leaders}
+
+@d activate_mid_rule(#)==begin
+ if (mrule_init>=0) and (subtype(#)>active_mid_rule) then
+ subtype(#):=active_mid_rule; end
+@d suppress_mid_rule(#)==begin
+ if subtype(#)=active_mid_rule then subtype(#):=suprsd_mid_rule; end
+@d is_mrule(#)==(subtype(#)>=active_mid_rule)
+@d is_not_mrule(#)==(subtype(#)<active_mid_rule)
+@d is_active_rule(#)==(subtype(#)=active_mid_rule)
+@d is_supressed(#)==(subtype(#)=suprsd_mid_rule)
+@d is_not_supressed(#)==(subtype(#)<>suprsd_mid_rule)
+@z
+@x
+@d unset_node=13 {|type| for an unset node}
+@d glue_stretch(#)==mem[#+glue_offset].sc {total stretch in an unset node}
+@d glue_shrink==shift_amount {total shrink in an unset node}
+@d span_count==subtype {indicates the number of spanned columns}
+@y
+\pTeXchg{But we use |span_count| (as |subtype| of a box node) with special
+values for
+left or right justification. (|right_justify| and |left_justify|).}
+
+@d unset_node=13 {|type| for an unset node}
+@d glue_stretch(#)==mem[#+glue_offset].sc {total stretch in an unset node}
+@d glue_shrink==shift_amount {total shrink in an unset node}
+@d span_count==subtype {indicates the number of spanned columns}
+@d right_justify=max_quarterword
+@d left_justify=max_quarterword-1
+
+@p @<Declare functions needed for special kinds of nodes@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [11.165] fix the word "free" so that it doesn't conflict with the C routine
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+are debugging.)
+@y
+are debugging.)
+
+@d free==free_arr
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [11.168]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Check single-word...@>=
+@y
+@
+\pTeXchg{Print language alternates message.}
+@<Check single-word...@>=
+@z
+@x
+ print_int(q); goto done1;
+@y
+ print_int(q); or_S(print("սѠ")); goto done1;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [11.169]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Check variable-size...@>=
+@y
+@
+\pTeXchg{Print language alternates message.}
+@<Check variable-size...@>=
+@z
+@x
+ print_int(q); goto done2;
+@y
+ print_int(q); or_S(print("սѠ")); goto done2;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.174]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure short_display(@!p:integer); {prints highlights of list |p|}
+@y
+\pTeXchg{Check semitic (twin) fonts.}
+@p procedure short_display(@!p:integer); {prints highlights of list |p|}
+@z
+@x
+ begin if font(p)<>font_in_short_display then
+ begin if (font(p)<font_base)or(font(p)>font_max) then
+@y
+ begin if (font(p)<>font_in_short_display) and
+ (font(p)<>fontwin[font_in_short_display]) then
+ begin if (font(p)>font_max) then
+@z
+@x
+ print_ASCII(qo(character(p)));
+@y
+ @<Print |p| according to |fontwin[font(p)]|@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.175]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Print a short indication of the contents of node |p|@>=
+@y
+@
+\pTeXchg{Check |mid_rule| glues.}
+@<Print a short indication of the contents of node |p|@>=
+@z
+@x
+glue_node: if glue_ptr(p)<>zero_glue then print_char(" ");
+@y
+glue_node: if is_active_rule(p) then print_char("")
+ else if is_not_supressed(p) then
+ if glue_ptr(p)<>zero_glue then print_char(" ");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.176] Eliminate some unsigned comparisons to zero (continued)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+@y
+\pTeXchg{Check semitic (twin) fonts.}
+@p procedure print_font_and_char(@!p:integer); {prints |char_node| data}
+@z
+@x
+else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*")
+@y
+else begin if (font(p)>font_max) then print_char("*")
+@z
+@x
+ print_char(" "); print_ASCII(qo(character(p)));
+@y
+ print_char(" "); @<Print |p| according to |fontwin[font(p)]|@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.180]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d node_list_display(#)==
+ begin append_char("."); show_node_list(#); flush_char;
+@y
+\pTeXaltstr
+@d node_list_display(#)==
+ begin L_or_S(append_char("."))(append_char(""));
+ show_node_list(#); flush_char;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.184]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Display box |p|@>=
+begin if type(p)=hlist_node then print_esc("h")
+else if type(p)=vlist_node then print_esc("v")
+else print_esc("unset");
+print("box("); print_scaled(height(p)); print_char("+");
+print_scaled(depth(p)); print(")x"); print_scaled(width(p));
+if type(p)=unset_node then
+ @<Display special fields of the unset node |p|@>
+else begin @<Display the value of |glue_set(p)|@>;
+ if shift_amount(p)<>0 then
+ begin print(", shifted "); print_scaled(shift_amount(p));
+ end;
+ end;
+@y
+@
+\pTeXaltstr
+@<Display box |p|@>=
+begin if latin_speech then
+ begin if type(p)=hlist_node then print_esc("h")
+ else if type(p)=vlist_node then print_esc("v") else print_esc("unset");
+ print("box(");
+ end
+else begin print_esc("Ͼ");
+ if type(p)=hlist_node then print_char("")
+ else if type(p)=vlist_node then print_char("") else print("");
+ print_char("");
+ end;
+print_scaled(height(p)); print_char("+");
+print_scaled(depth(p)); print(")x"); print_scaled(width(p));
+if type(p)=unset_node then @<Display special fields of the unset node |p|@>
+else begin @<Display the value of |glue_set(p)|@>;
+ if shift_amount(p)<>0 then
+ begin print(", shifted "); print_scaled(shift_amount(p)); end;
+ if subtype(p)=right_justify then print(", right justified")
+ else if subtype(p)=left_justify then print(", left justified");
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.185]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Display special fields of the unset node |p|@>=
+begin if span_count(p)<>min_quarterword then
+ begin print(" ("); print_int(qo(span_count(p))+1);
+ print(" columns)");
+ end;
+if glue_stretch(p)<>0 then
+ begin print(", stretch "); print_glue(glue_stretch(p),glue_order(p),0);
+ end;
+if glue_shrink(p)<>0 then
+ begin print(", shrink "); print_glue(glue_shrink(p),glue_sign(p),0);
+ end;
+end
+@y
+@
+\pTeXchg{Using |glue_order| values |> 3| for left or right justifications.}
+@<Display special fields of the unset node |p|@>=
+begin if span_count(p)<left_justify then
+ if span_count(p)<>min_quarterword then
+ begin print(" ("); print_int(qo(span_count(p))+1); print(" columns)"); end;
+if glue_stretch(p)<>0 then
+ begin print(", stretch "); print_glue(glue_stretch(p),glue_order(p) mod 4,0);
+ {in case |glue_order|(p)>4}
+ end;
+if glue_shrink(p)<>0 then
+ begin print(", shrink "); print_glue(glue_shrink(p),glue_sign(p),0); end;
+if (subtype(p)=right_justify) or (glue_order(p)>7) then
+ print(", right justified")
+else if (subtype(p)=left_justify) or (glue_order(p)>3) then
+ print(", left justified");
+end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.187]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Display rule |p|@>=
+@y
+@
+\pTeXchg{Check |rule| direction.}
+@<Display rule |p|@>=
+@z
+@x
+print_rule_dimen(depth(p)); print(")x"); print_rule_dimen(width(p));
+@y
+print_rule_dimen(depth(p)); print(")x"); print_rule_dimen(width(p));
+if subtype(p)=right_justify then print(", right justified")
+else if subtype(p)=left_justify then print(", left justified");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.190]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Display leaders |p|@>=
+@y
+@
+\pTeXaltstr
+@<Display leaders |p|@>=
+@z
+@x
+begin print_esc("");
+if subtype(p)=c_leaders then print_char("c")
+else if subtype(p)=x_leaders then print_char("x");
+print("leaders "); print_spec(glue_ptr(p),0);
+node_list_display(leader_ptr(p)); {recursive call}
+@y
+begin if is_not_mrule(p) then
+ begin L_or_S(print_esc(""))(print_esc(""));
+ if subtype(p)=c_leaders then LorRprt("c","")
+ else if subtype(p)=x_leaders then LorRprt("x","");
+ L_or(print("leaders "));
+ end
+ else begin or_S(print_esc(""));
+ if is_supressed(p) then print("supressed ")
+ else print("active ");
+ L_or(print_esc("midrule "));
+ end;
+if is_not_supressed(p) then print_spec(glue_ptr(p),0);
+if is_not_mrule(p) then node_list_display(leader_ptr(p)); {recursive call}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.192]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Display math node |p|@>=
+@y
+@
+\pTeXaltstr
+@<Display math node |p|@>=
+@z
+@x
+begin print_esc("math");
+if subtype(p)=before then print("on")
+else print("off");
+@y
+begin L_or(print_esc("math"));
+if subtype(p)=before then print("on") else print("off");
+or_S(print_esc("۾"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [12.195]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Display discretionary |p|@>=
+@y
+\pTeXaltstr
+@<Display discretionary |p|@>=
+@z
+@x
+append_char("|"); show_node_list(post_break(p)); flush_char; {recursive call}
+@y
+L_or_S(append_char("|"))(append_char(""));
+show_node_list(post_break(p)); flush_char; {recursive call}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [13.202]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure flush_node_list(@!p:pointer); {erase list of nodes starting at |p|}
+@y
+\pTeXchg{Check |mid_rule| glues.}
+@p procedure flush_node_list(@!p:pointer); {erase list of nodes starting at |p|}
+@z
+@x 202
+ glue_node: begin fast_delete_glue_ref(glue_ptr(p));
+ if leader_ptr(p)<>null then flush_node_list(leader_ptr(p));
+ end;
+@y 202===================
+ glue_node: begin fast_delete_glue_ref(glue_ptr(p));
+ if is_mrule(p) then leader_ptr(p):=null
+ else if leader_ptr(p)<>null then flush_node_list(leader_ptr(p));
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [14.206]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Case statement to copy...@>=
+@y
+@
+\pTeXchg{Check |mid_rule| glues.}
+@<Case statement to copy...@>=
+@z
+@x 206
+ glue_ptr(r):=glue_ptr(p); leader_ptr(r):=copy_node_list(leader_ptr(p));
+ end;
+@y 206===================
+ glue_ptr(r):=glue_ptr(p);
+ if is_not_mrule(p) then leader_ptr(r):=copy_node_list(leader_ptr(p))
+ else leader_ptr(r):=leader_ptr(p);
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [15.208]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d char_num=16 {character specified numerically ( \.{\\char} )}
+@y
+\pTeXchg{We have such commands namely |semi_given| and |LR|.}
+@d char_num=16 {character specified numerically ( \.{\\char} )}
+@z
+@x 208
+@d max_non_prefixed_command=70 {largest command code that can't be \.{\\global}}
+@y 208===================
+@d semi_given=71 {character code defined by \.{\\semichardef}}
+@d LR=72 {text direction (\.{\\beginL},\.{\\beginR},\.{\\endL},\.{\\endR})}
+@d max_non_prefixed_command=72 {largest command code that can't be \.{\\global}}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [15.209]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 209
+@d toks_register=71 {token list register ( \.{\\toks} )}
+@d assign_toks=72 {special token list ( \.{\\output}, \.{\\everypar}, etc.~)}
+@d assign_int=73 {user-defined integer ( \.{\\tolerance}, \.{\\day}, etc.~)}
+@d assign_dimen=74 {user-defined length ( \.{\\hsize}, etc.~)}
+@d assign_glue=75 {user-defined glue ( \.{\\baselineskip}, etc.~)}
+@d assign_mu_glue=76 {user-defined muglue ( \.{\\thinmuskip}, etc.~)}
+@d assign_font_dimen=77 {user-defined font dimension ( \.{\\fontdimen} )}
+@d assign_font_int=78 {user-defined font integer ( \.{\\hyphenchar},
+ \.{\\skewchar} )}
+@d set_aux=79 {specify state info ( \.{\\spacefactor}, \.{\\prevdepth} )}
+@d set_prev_graf=80 {specify state info ( \.{\\prevgraf} )}
+@d set_page_dimen=81 {specify state info ( \.{\\pagegoal}, etc.~)}
+@d set_page_int=82 {specify state info ( \.{\\deadcycles},
+ \.{\\insertpenalties} )}
+@d set_box_dimen=83 {change dimension of box ( \.{\\wd}, \.{\\ht}, \.{\\dp} )}
+@d set_shape=84 {specify fancy paragraph shape ( \.{\\parshape} )}
+@d def_code=85 {define a character code ( \.{\\catcode}, etc.~)}
+@d def_family=86 {declare math fonts ( \.{\\textfont}, etc.~)}
+@d set_font=87 {set current font ( font identifiers )}
+@d def_font=88 {define a font file ( \.{\\font} )}
+@d register=89 {internal register ( \.{\\count}, \.{\\dimen}, etc.~)}
+@d max_internal=89 {the largest code that can follow \.{\\the}}
+@d advance=90 {advance a register or parameter ( \.{\\advance} )}
+@d multiply=91 {multiply a register or parameter ( \.{\\multiply} )}
+@d divide=92 {divide a register or parameter ( \.{\\divide} )}
+@d prefix=93 {qualify a definition ( \.{\\global}, \.{\\long}, \.{\\outer} )}
+@d let=94 {assign a command code ( \.{\\let}, \.{\\futurelet} )}
+@d shorthand_def=95 {code definition ( \.{\\chardef}, \.{\\countdef}, etc.~)}
+@d read_to_cs=96 {read into a control sequence ( \.{\\read} )}
+@d def=97 {macro definition ( \.{\\def}, \.{\\gdef}, \.{\\xdef}, \.{\\edef} )}
+@d set_box=98 {set a box ( \.{\\setbox} )}
+@d hyph_data=99 {hyphenation data ( \.{\\hyphenation}, \.{\\patterns} )}
+@d set_interaction=100 {define level of interaction ( \.{\\batchmode}, etc.~)}
+@d max_command=100 {the largest command code seen at |big_switch|}
+@y 209===================
+\pTeXchg{We also introduce new such commands namely, |LR_setting|,
+ |LR_getting|, |switch_font|, |let_name|, |eq_name|.}
+@d toks_register=73 {token list register ( \.{\\toks} )}
+@d assign_toks=74 {special token list ( \.{\\output}, \.{\\everypar}, etc.~)}
+@d assign_int=75 {user-defined integer ( \.{\\tolerance}, \.{\\day}, etc.~)}
+@d assign_dimen=76 {user-defined length ( \.{\\hsize}, etc.~)}
+@d assign_glue=77 {user-defined glue ( \.{\\baselineskip}, etc.~)}
+@d assign_mu_glue=78 {user-defined muglue ( \.{\\thinmuskip}, etc.~)}
+@d assign_font_dimen=79 {user-defined font dimension ( \.{\\fontdimen} )}
+@d assign_font_int=80 {user-defined font integer ( \.{\\hyphenchar},
+ \.{\\skewchar} )}
+@d set_aux=81 {specify state info ( \.{\\spacefactor}, \.{\\prevdepth} )}
+@d set_prev_graf=82 {specify state info ( \.{\\prevgraf} )}
+@d set_page_dimen=83 {specify state info ( \.{\\pagegoal}, etc.~)}
+@d set_page_int=84 {specify state info ( \.{\\deadcycles},
+ \.{\\insertpenalties} )}
+@d set_box_dimen=85 {change dimension of box ( \.{\\wd}, \.{\\ht}, \.{\\dp} )}
+@d set_shape=86 {specify fancy paragraph shape ( \.{\\parshape} )}
+@d def_code=87 {define a character code ( \.{\\catcode}, etc.~)}
+@d def_family=88 {declare math fonts ( \.{\\textfont}, etc.~)}
+@d set_font=89 {set current latin or semitic font ( font identifiers )}
+@d def_font=90 {define a latin or semitic font file ( \.{\\font},
+ \.{\\semifont}, \.{\\activefont} )}
+@d register=91 {internal register ( \.{\\count}, \.{\\dimen}, etc.~)}
+@d max_internal=91 {the largest code that can follow \.{\\the}}
+@d advance=92 {advance a register or parameter ( \.{\\advance} )}
+@d multiply=93 {multiply a register or parameter ( \.{\\multiply} )}
+@d divide=94 {divide a register or parameter ( \.{\\divide} )}
+@d prefix=95 {qualify a definition ( \.{\\global}, \.{\\long}, \.{\\outer} )}
+@d let=96 {assign a command code ( \.{\\let}, \.{\\futurelet} )}
+@d shorthand_def=97 {code definition ( \.{\\chardef}, \.{\\countdef}, etc.~)}
+@d read_to_cs=98 {read into a control sequence ( \.{\\read} )}
+@d def=99 {macro definition ( \.{\\def}, \.{\\gdef}, \.{\\xdef}, \.{\\edef} )}
+@d set_box=100 {set a box ( \.{\\setbox} )}
+@d hyph_data=101 {hyphenation data ( \.{\\hyphenation}, \.{\\patterns} )}
+@d set_interaction=102 {define level of interaction ( \.{\\batchmode}, etc.~)}
+@d LR_setting=103 {define directional things (e.g. \.{\\LtoR}, $\ldots$ )}
+@d LR_getting=104 {get directional things (e.g. \.{\\curdirection},
+ $\ldots$ )}
+@d switch_font=105 {set current semitic font to base or twin font}
+@d let_name=106 {set command names equal for semitic or latin mode}
+@d eq_name=107 {command name for equivalent control sequence}
+@d max_command=107 {the largest command code seen at |big_switch|}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [16.211]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d vmode=1 {vertical mode}
+@d hmode=vmode+max_command+1 {horizontal mode}
+@d mmode=hmode+max_command+1 {math mode}
+
+@p procedure print_mode(@!m:integer); {prints the mode represented by |m|}
+begin if m>0 then
+@y
+\pTeXaltstr
+@d vmode=1 {vertical mode}
+@d hmode=vmode+max_command+1 {horizontal mode}
+@d mmode=hmode+max_command+1 {math mode}
+
+@p procedure print_mode(@!m:integer); {prints the mode represented by |m|}
+begin or_S(print(""));
+if m>0 then
+@z
+@x
+print(" mode");
+@y
+L_or(print(" mode"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [16.212]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+be pushed onto |nest| if necessary.
+@y
+be pushed onto |nest| if necessary.
+\pTeXchg{We should add a field to deal with properly nested |LR| states.}
+@z
+@x 212
+ @!head_field,@!tail_field: pointer;
+ @!pg_field,@!ml_field: integer;@+
+ @!aux_field: memory_word;
+@y 212==================
+ @!head_field,@!tail_field: pointer;
+ @!pg_field,@!ml_field: integer;@+
+ @!aux_field,@!LR_aux_field: memory_word;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [16.216]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 216
+@p procedure push_nest; {enter a new semantic level, save the old}
+@y
+\pTeXchg{Initialize |stkLR| in each nesting level.}
+@p @<|LR| nest routines@>
+@#
+procedure push_nest; {enter a new semantic level, save the old}
+@z
+@x
+incr(nest_ptr); head:=get_avail; tail:=head; prev_graf:=0; mode_line:=line;
+@y 216==================
+incr(nest_ptr); head:=get_avail; tail:=head; prev_graf:=0; mode_line:=line;
+stkLR:=get_avail; stkLR_cmd:= 0; stkLR_src := 0;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [16.217]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 217
+@p procedure pop_nest; {leave a semantic level, re-enter the old}
+begin free_avail(head); decr(nest_ptr); cur_list:=nest[nest_ptr];
+end;
+@y 217==================
+\pTeXchg{We should flush |stkLR| at end of each nesting level.}
+@p procedure pop_nest; {leave a semantic level, re-enter the old}
+var p:pointer;
+begin free_avail(head); if in_auto_LR then pop_stkLR;
+while stkLR<>null do begin p:=stkLR; stkLR:=link(p); free_avail(p); end;
+decr(nest_ptr); cur_list:=nest[nest_ptr];
+end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [16.218]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure@?print_totals; forward;@t\2@>
+@y
+\pTeXaltstr
+@p procedure@?print_totals; forward;@t\2@>
+@z
+@x
+ print_nl("### "); print_mode(m);
+ print(" entered at line "); print_int(abs(nest[p].ml_field));
+@y
+ print_nl("### ");
+ if latin_speech then begin print_mode(m);
+ print(" entered at line "); print_int(abs(nest[p].ml_field)); end
+ else begin print("ՠ"); print_int(abs(nest[p].ml_field));
+ print("ѽ"); print_mode(m); print("נ"); end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [16.219]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Show the auxiliary...@>=
+@y
+@
+\pTeXaltstr
+@<Show the auxiliary...@>=
+@z
+@x
+ if nest[p].pg_field<>1 then print_char("s");
+@y
+ if nest[p].pg_field<>1 then L_or(print_char("s"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.222]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+(since they are used in error recovery).
+@y
+(since they are used in error recovery).
+\pTeXchg{We also have new permanent control sequences.}
+@z
+@x 222
+@d frozen_null_font=frozen_control_sequence+10
+@y 222====================
+@d frozen_bgn_L=frozen_control_sequence+10 {permanent `\.{\\beginL}'}
+@d frozen_bgn_R=frozen_control_sequence+11 {permanent `\.{\\beginR}'}
+@d frozen_end_L=frozen_control_sequence+12 {permanent `\.{\\endL}'}
+@d frozen_end_R=frozen_control_sequence+13 {permanent `\.{\\endR}'}
+@d frozen_null_font=frozen_control_sequence+14
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.223]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Show equivalent |n|, in region 1 or 2@>=
+@y
+\pTeXaltstr
+@<Show equivalent |n|, in region 1 or 2@>=
+@z
+@x Adding eqchar
+ begin print_char(":"); show_token_list(link(equiv(n)),null,32);
+@y
+ begin print_char(":"); set_eq_show(eq_type(n));
+ show_token_list(link(equiv(n)),null,32); eq_show:=false;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.224]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+parameters have larger numbers than the others.
+@y
+parameters have larger numbers than the others.
+\pTeXchg{We also have more new parameters.}
+@z
+@x 224
+@d par_fill_skip_code=14 {glue on last line of paragraph}
+@d thin_mu_skip_code=15 {thin space in math formula}
+@d med_mu_skip_code=16 {medium space in math formula}
+@d thick_mu_skip_code=17 {thick space in math formula}
+@d glue_pars=18 {total number of glue parameters}
+@y 224====================
+@d semi_space_skip_code=14 {glue between semitic words (if not |zero_glue|)}
+@d semi_xspace_skip_code=15 {glue after semitic sentences (if not |zero_glue|)}
+@d mid_rule_code=16 {rule between semitic characters, if appropriate}
+@d par_fill_skip_code=17 {glue on last line of paragraph}
+@d thin_mu_skip_code=18 {thin space in math formula}
+@d med_mu_skip_code=19 {medium space in math formula}
+@d thick_mu_skip_code=20 {thick space in math formula}
+@d glue_pars=21 {total number of glue parameters}
+@z
+@x 224
+@d xspace_skip==glue_par(xspace_skip_code)
+@y 224====================
+@d xspace_skip==glue_par(xspace_skip_code)
+@d semi_space_skip==glue_par(semi_space_skip_code)
+@d semi_xspace_skip==glue_par(semi_xspace_skip_code)
+@d mid_rule==glue_par(mid_rule_code)
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.225]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+xspace_skip_code: print_esc("xspaceskip");
+@y
+xspace_skip_code: print_esc("xspaceskip");
+semi_space_skip_code: print_esc("semispaceskip");
+semi_xspace_skip_code: print_esc("semixspaceskip");
+mid_rule_code: print_esc("midrulespec");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.230]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+registers.
+@y
+registers.
+\pTeXchg{We also have more new token parameters and new table.}
+@z
+@x
+@d err_help_loc=local_base+9 {points to token list for \.{\\errhelp}}
+@d toks_base=local_base+10 {table of 256 token list registers}
+@y
+@d every_semi_par_loc=local_base+9
+ {points to token list for \.{\\everysemipar}}
+@d every_semi_math_loc=local_base+10
+ {points to token list for \.{\\everysemimath}}
+@d every_semi_display_loc=local_base+11
+ {points to token list for \.{\\everysemidisplay}}
+@d after_every_display_loc=local_base+12
+ {points to token list for \.{\\everycr}}
+@d err_help_loc=local_base+13 {points to token list for \.{\\errhelp}}
+@d toks_base=local_base+14 {table of 256 token list registers}
+@z
+@x
+@d cur_font_loc=box_base+256 {internal font number outside math mode}
+@d math_font_base=cur_font_loc+1 {table of 48 math font numbers}
+@y
+@d cur_LRswch_loc=box_base+256 {automatic |bi_directional| typesetting switch}
+@d cur_speech_loc=cur_LRswch_loc+1 {current speech switch}
+@d cur_direction_loc=cur_speech_loc+1 {current direction switch}
+@d vbox_justify_loc=cur_direction_loc+1 {current vbox justufication}
+@d cur_font_loc=vbox_justify_loc+1 {internal font number outside math mode}
+@d cur_latif_loc=cur_font_loc+1 {internal latin font number }
+@d cur_semif_loc=cur_latif_loc+1 {internal semitic font number }
+@d math_font_base=cur_semif_loc+1 {table of 48 math font numbers}
+@z
+@x
+@d math_code_base=sf_code_base+256 {table of 256 math mode mappings}
+@d int_base=math_code_base+256 {beginning of region 5}
+@y
+@d locate_code_base=sf_code_base+256 {table of 256 |locate_code| mappings}
+@d acc_factor_base=locate_code_base+256 {table of 256 |acc_factor| mappings}
+@d eq_char_base=acc_factor_base+256 {table of 256 |eq_chars|}
+@d eq_charif_base=eq_char_base+256 {table of 256 |eq_charsif|}
+@d join_attrib_base=eq_charif_base+256 {table of 256 |join_attributes|}
+@d math_code_base=join_attrib_base+256 {table of 256 math mode mappings}
+@d int_base=math_code_base+256 {beginning of region 5}
+@z
+@x
+@d math_code(#)==equiv(math_code_base+#)
+@y
+@#
+@d math_code(#)==equiv(math_code_base+#)
+@d every_semi_par==equiv(every_semi_par_loc)
+@d every_semi_math==equiv(every_semi_math_loc)
+@d after_every_display==equiv(after_every_display_loc)
+@d every_semi_display==equiv(every_semi_display_loc)
+@d cur_LR_swch==equiv(cur_LRswch_loc)
+@d cur_speech==equiv(cur_speech_loc)
+@d cur_direction==equiv(cur_direction_loc)
+@d vbox_justify==equiv(vbox_justify_loc)
+@d R_to_L_vbox==(vbox_justify=R_to_L)
+@d L_to_R_vbox==(vbox_justify=L_to_R)
+@d cur_latif==equiv(cur_latif_loc)
+@d cur_semif==equiv(cur_semif_loc)
+@d locate_code(#)==equiv(locate_code_base+semichrout(#))
+@d acc_factor(#)==equiv(acc_factor_base+semichrout(#))
+@d join_attrib(#)==equiv(join_attrib_base+semichrout(#))
+@d eqch(#)==equiv(eq_char_base+#)
+@d eqif(#)==equiv(eq_charif_base+#)
+@d is_semi_font(#)==(fontwin[#]<>null_font)
+@d is_latin_font(#)==(fontwin[#]=null_font)
+@d is_twin_font(#)==(fontwin[#]=twin_tag)
+@d has_twin_font(#)==(fontwin[#]<twin_tag) {|fontwin[#]>null_font| checked }
+@d is_dbl_font(#)==(fontwin[#]=dbl_tag)
+@z
+@x
+@!@:err_help_}{\.{\\errhelp} primitive@>
+@y
+@!@:err_help_}{\.{\\errhelp} primitive@>
+primitive("everysemipar",assign_toks,every_semi_par_loc);
+@!@:every_semi_par_}{\.{\\everysemipar} primitive@>
+primitive("everysemimath",assign_toks,every_semi_math_loc);
+@!@:every_semi_math_}{\.{\\everysemimath} primitive@>
+primitive("aftereverydisplay",assign_toks,after_every_display_loc);
+@!@:after_every_display_}{\.{\\aftereverydisplay} primitive@>
+primitive("everysemidisplay",assign_toks,every_semi_display_loc);
+@!@:every_semi_display_}{\.{\\everysemidisplay} primitive@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.231]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |print_cmd_chr|
+ othercases print_esc("errhelp")
+@y
+ every_semi_par_loc: print_esc("everysemipar");
+ every_semi_math_loc: print_esc("everysemimath");
+ every_semi_display_loc: print_esc("everysemidisplay");
+ after_every_display_loc: print_esc("aftereverydisplay");
+ othercases print_esc("errhelp")
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.233]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else if n<cur_font_loc then
+@y
+else if n<cur_LRswch_loc then
+@z
+@x
+else if n<cat_code_base then @<Show the font identifier in |eqtb[n]|@>
+@y
+@<Test bidirectionals@>@/
+else if n<cat_code_base then @<Show the font identifier in |eqtb[n]|@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.234]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin if n=cur_font_loc then print("current font")
+@y
+begin if n=cur_font_loc then print("current active font")
+else if n=cur_latif_loc then print("current latin font")
+else if n=cur_semif_loc then print("current semitic font")
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.235]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ else begin print_esc("sfcode"); print_int(n-sf_code_base);
+@y
+ else if n<locate_code_base then
+ begin print_esc("sfcode"); print_int(n-sf_code_base);
+ end
+ else if n<acc_factor_base then
+ begin print_esc("lcode"); print_int(n-locate_code_base);
+ end
+ else if n<eq_char_base then
+ begin print_esc("accfactor"); print_int(n-acc_factor_base);
+ end
+ else if n<eq_charif_base then
+ begin print_esc("eqchar"); print_int(n-eq_char_base);
+ end
+ else if n<join_attrib_base then
+ begin print_esc("eqcharif"); print_int(n-eq_charif_base);
+ end
+ else begin print_esc("jattrib"); print_int(n-join_attrib_base);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.236]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+that will be defined later.
+@y
+that will be defined later.
+\pTeXchg{We also have new int parameters and also want to increase |count|
+table.}
+@z
+@x
+@d int_pars=55 {total number of integer parameters}
+@d count_base=int_base+int_pars {256 user \.{\\count} registers}
+@d del_code_base=count_base+256 {256 delimiter code mappings}
+@y
+@d dig_fam_code=55 {current semitic family}
+@d vbox_justification_code=56
+@d mrule_init_code=57
+@d semi_day_code=58 {current day of the month}
+@d semi_month_code=59 {current month of the year}
+@d semi_year_code=60 {current year of Hejri Shamsi}
+@d LR_showswch_code=61
+@d LR_miscswch_code=62
+@d int_pars=63 {total number of integer parameters}
+@d count_base=int_base+int_pars {512 user \.{\\count} registers}
+@d del_code_base=count_base+512 {256 delimiter code mappings}
+@z
+@x
+@d year==int_par(year_code)
+@y
+@d year==int_par(year_code)
+@d semi_day==int_par(semi_day_code)
+@d semi_month==int_par(semi_month_code)
+@d semi_year==int_par(semi_year_code)
+@d dig_fam==int_par(dig_fam_code)
+@d vbox_justification==int_par(vbox_justification_code)
+@d R_to_L_par==(vbox_justification > 0)
+@d L_to_R_par==(vbox_justification < 0)
+@d R_to_L_line==(R_to_L_vbox and (vbox_justification > 1))
+@d LR_showswch==int_par(LR_showswch_code)
+@d eqchring==(chrbit(LR_showswch,1))
+@d eqnaming==(chrbit(LR_showswch,2))
+@d eqshwing==(chrbit(LR_showswch,4))
+@d eqwrting==(chrbit(LR_showswch,8))
+@d eqspcial==(chrbit(LR_showswch,16))
+@d rawprtchr==(chrbit(LR_showswch,32))
+@d set_eq_show(#)==eq_show:=eqshwing and(#<=long_outer_call)
+@d LR_miscswch==int_par(LR_miscswch_code)
+@d addRcmds==(chrbit(LR_miscswch,1))
+@d addLcmdh==(chrbit(LR_miscswch,2))
+@d addRcmdh==(chrbit(LR_miscswch,4))
+@d addLcmds==(chrbit(LR_miscswch,8))
+@d ignrautoLR==(chrbit(LR_miscswch,16))
+@d mrule_init==int_par(mrule_init_code)
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.237]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+othercases print("[unknown integer parameter!]")
+@y
+semi_day_code:print_esc("semiday");
+semi_month_code:print_esc("semimonth");
+semi_year_code:print_esc("semiyear");
+dig_fam_code:print_esc("semifam");
+vbox_justification_code:print_esc("vboxjustification");
+LR_showswch_code:print_esc("LRshowswitch");
+LR_miscswch_code:print_esc("LRmiscswitch");
+mrule_init_code:print_esc("midruleinit");
+othercases print("[unknown integer parameter!]")
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.241] fix_date_and_time
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+Since standard \PASCAL\ cannot provide such information, something special
+is needed. The program here simply specifies July 4, 1776, at noon; but
+users probably want a better approximation to the truth.
+
+@p procedure fix_date_and_time;
+begin time:=12*60; {minutes since midnight}
+day:=4; {fourth day of the month}
+month:=7; {seventh month of the year}
+year:=1776; {Anno Domini}
+end;
+@y
+("dateandtime") in turn is a C macro, which calls |get_date_and_time|, passing
+it the addresses of the day, month, etc., so they can be set by the
+routine. |get_date_and_time| also sets up interrupt catching if that
+is conditionally compiled in the C code.
+
+@d fix_date_and_time==date_and_time(time,day,month,year,
+ semi_day,semi_month,semi_year)
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.243] alternate escape_char
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Set variable |c| to the current escape character@>=c:=escape_char
+@y
+@
+\pTeXaltstr
+@<Set variable |c| to the current escape character@>=c:=escape_char;
+ if ((c >= 0) and (c < 256) and semitic_speech) then c:=alt_str[c]
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.247] fix_date_and_time
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+here, and the 256 \.{\\dimen} registers.
+@y
+here, and the 256 \.{\\dimen} registers.
+\pTeXchg{We also want to increase |dimen| table.}
+@z
+@x
+ {table of 256 user-defined \.{\\dimen} registers}
+@d eqtb_size=scaled_base+255 {largest subscript of |eqtb|}
+@y
+ {table of 512 user-defined \.{\\dimen} registers}
+@d eqtb_size=scaled_base+511 {largest subscript of |eqtb|}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [17.253] Change eqtb to zeqtb
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!eqtb:array[active_base..eqtb_size] of memory_word;
+@y
+@!zeqtb:array[active_base..eqtb_size] of memory_word;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [18.265]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Put each of \TeX's primitives into the hash table@>=
+primitive(" ",ex_space,0);@/
+@!@:Single-character primitives /}{\quad\.{\\\ }@>
+@y
+\pTeXchg{We should redefine some primitives namely |ex_space|, |accent|,
+ |char_num|, |def_font| and |halign|, as two language dependent ones.}
+@<Put each of \TeX's primitives into the hash table@>=
+@z
+@x
+primitive("accent",accent,0);@/
+@!@:accent_}{\.{\\accent} primitive@>
+@y
+@z
+@x
+primitive("char",char_num,0);@/
+@!@:char_}{\.{\\char} primitive@>
+@y
+@z
+@x
+primitive("font",def_font,0);@/
+@!@:font_}{\.{\\font} primitive@>
+@y
+@z
+@x
+primitive("halign",halign,0);@/
+@!@:halign_}{\.{\\halign} primitive@>
+@y
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [18.266]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%SEMIACCENT
+@x
+@<Cases of |print_cmd_chr|...@>=
+accent: print_esc("accent");
+@y
+\pTeXchg{We should also redefine those |print_cmd_chr| cases.}
+@<Cases of |print_cmd_chr|...@>=
+@z
+@x
+char_num: print_esc("char");
+@y
+@z
+@x
+def_font: print_esc("font");
+@y
+@z
+@x
+ex_space: print_esc(" ");
+@y
+@z
+@x
+halign: print_esc("halign");
+@y
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [20.289]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x
+@d space_token=@'5040 {$2^8\cdot|spacer|+|" "|$}
+ @y
+@d space_token=@'5040 {$2^8\cdot|spacer|+|" "|$}
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [20.294]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|out_param| commands.
+@y
+|out_param| commands.
+\pTeXaltstr
+@z
+@x Adding eqchar
+ letter,other_char: print(c);
+mac_param: begin print(c); print(c);
+ end;
+out_param: begin print(match_chr);
+@y
+ letter,other_char: if eq_show and(eqch(c)<>0)then print_char(c)else print(c);
+mac_param: if eq_show and eqch(c)<>0 then begin print_char(c);print_char(c);end
+ else begin print(c); print(c); end;
+out_param: begin if eq_show and eqch(match_chr)<>null then
+ print_char (match_chr) else print(match_chr);
+@z
+@x Adding eqchar
+match: begin match_chr:=c; print(c); incr(n); print_char(n);
+@y
+match: begin match_chr:=c;
+ if eq_show and eqch(c)<>0 then print_char(c) else print(c);
+ incr(n); print_char(n);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [20.296]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure print_meaning;
+@y
+\pTeXaltstr
+@p procedure print_meaning;
+@z
+@x Adding eqchar
+ begin print_char(":"); print_ln; token_show(cur_chr);
+@y
+ begin print_char(":"); print_ln;
+ set_eq_show(cur_cmd); token_show(cur_chr); eq_show:=false;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [21.298] Add variable t for variation of LR commands
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d chr_cmd(#)==begin print(#); print_ASCII(chr_code);
+@y
+\pTeXaltstr
+@d semi_space_token=@'5240 {$2^8\cdot|spacer|+|""|$}
+@d chr_cmd(#)==begin print(#); print_ASCII(chr_code);
+@z
+@x |print_cmd_chr|
+begin case cmd of
+@y
+var @!t:integer;
+begin case cmd of
+@z
+@x
+spacer: chr_cmd("blank space ");
+letter: chr_cmd("the letter ");
+other_char: chr_cmd("the character ");
+@y
+spacer: if is_semi_chr(chr_code) then chr_cmd("semitic blank space ")
+ else chr_cmd("latin blank space ");
+letter: if is_semi_chr(chr_code) then chr_cmd("the semitic letter ")
+ else chr_cmd("the latin letter ");
+other_char: if is_semi_chr(chr_code) then chr_cmd("the semitic character ")
+ else chr_cmd("the latin character ");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [21.300] Saving file area and extension to save pool space at end of file
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ @!start_field,@!loc_field, @!limit_field, @!name_field: halfword;
+@y
+ @!start_field,@!loc_field, @!limit_field, @!name_field,
+ @!ext_field,@!area_field: halfword;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [21.302] Saving file area and extension to save pool space at end of file
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d name==cur_input.name_field {name of the current file}
+@y
+@d name==cur_input.name_field {name of the current file}
+@d ext==cur_input.ext_field {extension of the current file}
+@d area==cur_input.area_field {area of the current file}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.306]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Declare the procedure called |runaway|@>=
+@y
+\pTeXaltstr
+@<Declare the procedure called |runaway|@>=
+@z
+@x
+ begin print_nl("Runaway ");
+@y
+ begin L_or_S(print_nl("Runaway "))(print_nl(""));
+@z
+@x
+ print_char("?");print_ln; show_token_list(link(p),null,error_line-10);
+@y
+ or_S(print(""));
+ print_char("?");print_ln; show_token_list(link(p),null,error_line-10);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.307]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d token_list=0 {|state| code when scanning a token list}
+@y
+\pTeXchg{We should define new token list parameters.}
+@d token_list=0 {|state| code when scanning a token list}
+@z
+@x
+@d mark_text=14 {|token_type| code for \.{\\topmark}, etc.}
+@d write_text=15 {|token_type| code for \.{\\write}}
+@y
+@#
+@d every_semi_par_text=14 {|token_type| code for \.{\\everysemipar}}
+@d every_semi_math_text=15 {|token_type| code for \.{\\everysemimath}}
+@d after_every_display_text=16 {|token_type| code for \.{\\aftereverydisplay}}
+@d every_semi_display_text=17 {|token_type| code for \.{\\everysemidisplay}}
+@#
+@d mark_text=18 {|token_type| code for \.{\\topmark}, etc.}
+@d write_text=19 {|token_type| code for \.{\\write}}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.308]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+othercases print_nl("?") {this should never happen}
+@y
+every_semi_par_text: print_nl("<everysemipar> ");
+every_semi_math_text: print_nl("<everysemimath> ");
+after_every_display_text: print_nl("<aftereverydisplay> ");
+every_semi_display_text: print_nl("<everysemidisplay> ");
+othercases print_nl("?") {this should never happen}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.317]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Print two lines using the tricky pseudoprinted information@>=
+@y
+\pTeXnewprt
+@<Print two lines using the tricky pseudoprinted information@>=
+@z
+@x
+for q:=p to first_count-1 do print_char(trick_buf[q mod error_line]);
+@y
+pushprinteq;
+for q:=p to first_count-1 do print_char(trick_buf[q mod error_line]);
+popprinteq;
+@z
+@x
+for q:=first_count to p-1 do print_char(trick_buf[q mod error_line]);
+@y
+pushprinteq;
+for q:=first_count to p-1 do print_char(trick_buf[q mod error_line]);
+popprinteq;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.319]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Pseudoprint the token list@>=
+@y
+@
+\pTeXaltstr
+@<Pseudoprint the token list@>=
+@z
+@x Adding eqchar
+if token_type<macro then show_token_list(start,loc,100000)
+else show_token_list(link(start),loc,100000) {avoid reference count}
+@y
+set_eq_show(token_type);
+if token_type<macro then show_token_list(start,loc,100000)
+else show_token_list(link(start),loc,100000); {avoid reference count}
+eq_show:=false
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.329]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x Remove file name from string pool
+@p procedure end_file_reading;
+begin first:=start; line:=line_stack[index];
+if name>17 then a_close(cur_file); {forget it}
+pop_input; decr(in_open);
+end;
+@y
+@p procedure end_file_reading;
+begin first:=start; line:=line_stack[index];
+if name>17 then a_close(cur_file); {forget it}
+if (name=str_ptr-1)or(ext=str_ptr-1)then{we can conserve string pool space now}
+ begin flush_string; if (name=str_ptr-1) then flush_string;
+ if (area=str_ptr-1) then flush_string; end;pop_input; decr(in_open); end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [23.331] use a different for loop index, local to tex_body
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+first:=buf_size; repeat buffer[first]:=0; decr(first); until first=0;
+@y
+bufindx:=buf_size; repeat buffer[bufindx]:=0; decr(bufindx); until bufindx=0;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [24.332] Getting the next token
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|end_line_char| has |ignore| as its catcode.)
+@y
+|end_line_char| has |ignore| as its catcode.)
+
+@p @<Bidirectional procedures@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.336]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure check_outer_validity;
+@y
+\pTeXaltstr
+@p procedure check_outer_validity;
+@z
+@x
+ else begin print_err("Incomplete "); print_cmd_chr(if_test,cur_if);
+@.Incomplete \\if...@>
+ print("; all text was ignored after line "); print_int(skip_line);
+@y
+ else begin LorRprt_err("Incomplete ",""); print_cmd_chr(if_test,cur_if);
+@.Incomplete \\if...@>
+ print("; all text was ignored after line "); print_int(skip_line);
+ or_S(print("נϾ"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [24.337]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Back up an outer control sequence so that it can be reread@>=
+@y
+\pTeXusechr
+@<Back up an outer control sequence so that it can be reread@>=
+@z
+@x
+ cur_cmd:=spacer; cur_chr:=" "; {replace it by a space}
+@y
+ set_directed_space;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.338]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Tell the user what has run away...@>=
+begin runaway; {print a definition, argument, or preamble}
+@y
+@
+\pTeXaltstr
+@<Tell the user what has run away...@>=
+begin runaway; {print a definition, argument, or preamble}
+L_or(
+@z
+@x
+ end;
+print(" while scanning ");
+@y
+ end); L_or_S(print(" while scanning "))(print_err("̠Ϡ"));
+@z
+@x
+print(" of "); sprint_cs(warning_index);
+@y
+print(" of "); sprint_cs(warning_index); or_S(print(""));
+or_S(if cur_cs=0 then print("File ended")
+ else begin cur_cs:=0; print("Forbidden control sequence found"); end);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.341]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d switch=25 {a label in |get_next|}
+@y
+\pTeXeqnm
+@d switch=25 {a label in |get_next|}
+@z
+@x Adding |eq_name| command
+begin restart: cur_cs:=0;
+@y
+begin restart: cur_cs:=0; cur_eq:=0;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [24.348]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Finish line, emit a space@>=
+@y
+\pTeXusechr
+@<Finish line, emit a space@>=
+@z
+@x
+begin loc:=limit+1; cur_cmd:=spacer; cur_chr:=" ";
+@y
+begin loc:=limit+1; set_directed_space;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [24.349]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Enter |skip_blanks| state, emit a space@>=
+@y
+\pTeXaltstr
+@<Enter |skip_blanks| state, emit a space@>=
+@z
+@x
+begin state:=skip_blanks; cur_chr:=" ";
+@y
+begin state:=skip_blanks;
+if issemichr(cur_chr) then cur_chr:="" else cur_chr:=" ";
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.356]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Scan ahead in the buffer...@>=
+@y
+@
+\pTeXeqnm
+@<Scan ahead in the buffer...@>=
+@z
+@x Adding |eq_name| command
+ begin cur_cs:=id_lookup(loc,k-loc); loc:=k; goto found;
+@y
+ begin cur_cs:=id_lookup(loc,k-loc); loc:=k;
+ @<Check |eq_name| command@>; goto found;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [22.357]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Input from token list, |goto restart| if end of list or
+@y
+\pTeXeqnm
+@<Input from token list, |goto restart| if end of list or
+@z
+@x Adding |eq_name| command
+ begin cur_cs:=t-cs_token_flag;
+@y
+ begin cur_cs:=t-cs_token_flag; @<Check |eq_name| command@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [24.365]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure get_token; {sets |cur_cmd|, |cur_chr|, |cur_tok|}
+@y
+\pTeXeqnm
+@p procedure get_token; {sets |cur_cmd|, |cur_chr|, |cur_tok|}
+@z
+@x
+if cur_cs=0 then cur_tok:=(cur_cmd*@'400)+cur_chr
+else cur_tok:=cs_token_flag+cur_cs;
+@y
+@<Set |cur_tok| and |eq_tok|@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [24.374]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Look up the characters of list |r| in the hash table...@>=
+@y
+@
+\pTeXeqnm
+@<Look up the characters of list |r| in the hash table...@>=
+@z
+@x
+if j>first+1 then
+ begin no_new_control_sequence:=false; cur_cs:=id_lookup(first,j-first);
+@y
+cur_eq:=0;
+if j>first+1 then
+ begin no_new_control_sequence:=false; cur_cs:=id_lookup(first,j-first);
+ @<Check |eq_name| command@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [25.376]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Put each...@>=
+primitive("input",input,0);@/
+@!@:input_}{\.{\\input} primitive@>
+primitive("endinput",input,1);@/
+@!@:end_input_}{\.{\\endinput} primitive@>
+@y
+\pTeXchg{We should redefine |input| primitive as two language dependent ones.}
+@<Put each...@>=
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [25.377]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+input: if chr_code=0 then print_esc("input")@+else print_esc("endinput");
+@y
+input: if chr_code = L_to_R then print_esc("input")@+
+ else if chr_code=R_to_L then print_esc("inputR")@+ else print_esc("endinput");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [25.378]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Initiate or terminate input...@>=
+if cur_chr>0 then force_eof:=true
+else if name_in_progress then insert_relax
+else start_input
+@y
+@
+\pTeXchg{Deal with |left_or_right| files.}
+@<Initiate or terminate input...@>=
+if cur_chr=0 then force_eof:=true
+else if name_in_progress then insert_relax
+else begin if in_open<>max_in_open then direction_stack[in_open+1]:=cur_chr;
+ start_input; end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [24.380]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure get_x_token; {sets |cur_cmd|, |cur_chr|, |cur_tok|,
+@y
+\pTeXeqnm
+@p procedure get_x_token; {sets |cur_cmd|, |cur_chr|, |cur_tok|,
+@z
+@x
+done: if cur_cs=0 then cur_tok:=(cur_cmd*@'400)+cur_chr
+else cur_tok:=cs_token_flag+cur_cs;
+@y
+done: @<Set |cur_tok| and |eq_tok|@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [24.381]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure x_token; {|get_x_token| without the initial |get_next|}
+@y
+\pTeXeqnm
+@p procedure x_token; {|get_x_token| without the initial |get_next|}
+@z
+@x Adding eqcharif
+if cur_cs=0 then cur_tok:=(cur_cmd*@'400)+cur_chr
+else cur_tok:=cs_token_flag+cur_cs;
+@y
+@<Set |cur_tok| and |eq_tok|@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [25.392]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Scan a parameter until its delimiter string has been found; or, ...@>=
+@y
+\pTeXeqnm
+@<Scan a parameter until its delimiter string has been found; or, ...@>=
+@z
+@x
+if cur_tok=info(r) then
+@y
+if (cur_tok=info(r))or (eq_tok=info(r)) then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [25.393]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Store the current token, but |goto continue| if it is...@>=
+@y
+@
+\pTeXusechr
+@<Store the current token, but |goto continue| if it is...@>=
+@z
+@x
+begin if cur_tok=space_token then
+@y
+begin if (cur_tok=space_token)or(cur_tok=semi_space_token) then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [25.401]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Show the text of the macro being expanded@>=
+@y
+@
+\pTeXaltstr
+@<Show the text of the macro being expanded@>=
+@z
+@x
+token_show(ref_count); end_diagnostic(false);
+@y
+eq_show:=eqshwing; token_show(ref_count); eq_show:=0; end_diagnostic(false);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.405]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure scan_optional_equals;
+@y
+\pTeXeqnm
+@p procedure scan_optional_equals;
+@z
+@x
+if cur_tok<>other_token+"=" then back_input;
+@y
+if not cur_eq_other("=") then back_input;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.407]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x changing scan_keyword
+@p function scan_keyword(@!s:str_number):boolean; {look for a given string}
+@y
+\pTeXchg{Introduce semitic keywords.
+Here we use original function as |scan_one_keyword| and redefine
+function |scan_keyword| to check alternate strings.
+}
+@p function scan_one_keyword(@!s:str_number):boolean; {look for a given string}
+@z
+@x
+ scan_keyword:=false; return;
+@y
+ scan_one_keyword:=false; return;
+@z
+@x
+flush_list(link(backup_head)); scan_keyword:=true;
+exit:end;
+@y
+flush_list(link(backup_head)); scan_one_keyword:=true;
+exit:end;
+@#
+function scan_keyword(@!s:str_number):boolean; {look for a given string}
+var a:str_number; {tail of the backup list}
+b:boolean;
+begin if semitic_speech and (alt_str[s]>0) then begin a:=s; s:=alt_str[s]; end
+ else a:=abs(alt_str[s]);
+ b:=scan_one_keyword (s); if (not b) and (a<>s) then b:=scan_one_keyword(a);
+ scan_keyword:=b;
+end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.413] scan_something_internal
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+|cur_cmd<min_internal| or |cur_cmd>max_internal|.
+@y
+|cur_cmd<min_internal| or |cur_cmd>max_internal|.
+\pTeXchg{Introduce new internal parameters.}
+@z
+@x
+@p procedure scan_something_internal(@!level:small_number;@!negative:boolean);
+@y
+@p @<Declare |find_last|@>@/
+@#
+procedure scan_something_internal(@!level:small_number;@!negative:boolean);
+@z
+@x defining new variables
+@!p:0..nest_size; {index into |nest|}
+@y
+@!p:0..nest_size; {index into |nest|}
+@!t:halfword;
+@!q:pointer;
+@z
+@x adding semi_given
+char_given,math_given: scanned_result(cur_chr)(int_val);
+@y
+semi_given,char_given,math_given: scanned_result(cur_chr)(int_val);
+LR_getting: scanned_result(equiv(m))(int_val);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.424] scan_something_internal
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Fetch an item in the current node...@>=
+@y
+\pTeXchg{We should retrieve last internal parameters without
+ counting |LR_node|'s.}
+@<Fetch an item in the current node...@>=
+@z
+@x observing mid_rule and auto_LR nodes
+ case cur_chr of
+ int_val: if type(tail)=penalty_node then cur_val:=penalty(tail);
+ dimen_val: if type(tail)=kern_node then cur_val:=width(tail);
+ glue_val: if type(tail)=glue_node then
+ begin cur_val:=glue_ptr(tail);
+ if subtype(tail)=mu_glue then cur_val_level:=mu_val;
+ end;
+ end {there are no other cases}
+@y
+ begin t:=null;
+ case cur_chr of
+ int_val: t:=penalty_node;
+ dimen_val: t:=kern_node;
+ glue_val: t:=glue_node;
+ end; {there are no other cases}
+ if t<>null then begin q:=find_last (t);
+ if (q<>null) then begin
+ if (link(q)<>null) and (type(link(q))=t) then q:=link(q);
+ case cur_chr of
+ int_val: cur_val:=penalty(q);
+ dimen_val: cur_val:=width(q);
+ glue_val: begin cur_val:=glue_ptr(q);
+ if subtype(q)=mu_glue then cur_val_level:=mu_val;
+ end;
+ end; {there are no other cases}
+ end;
+ end;
+ end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.426]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Fetch a font integer@>=
+@y
+@
+\pTeXchg{We have new font integer.}
+@<Fetch a font integer@>=
+@z
+@x
+else scanned_result(skew_char[cur_val])(int_val);
+@y
+else if m=1 then scanned_result(skew_char[cur_val])(int_val)
+ else if m=2 then
+ if (level=tok_val)and(cur_val<=font_max) then
+ scanned_result(font_id_base+fontwin[cur_val])(ident_val)
+ else scanned_result(fontwin[cur_val])(int_val)
+ else @<Complain that \.{\\the} can't do this; give zero result@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.427]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Fetch a register@>=
+begin scan_eight_bit_int;
+@y
+@
+\pTeXchg{Our |count| and |dimen| tables are increased.}
+@<Fetch a register@>=
+begin if (m <> int_val) and (m <> dimen_val) then scan_eight_bit_int
+ else scan_nine_bit_int;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.428]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Complain that \.{\\the} can't do this; give zero result@>=
+@y
+@
+\pTeXaltstr
+@<Complain that \.{\\the} can't do this; give zero result@>=
+@z
+@x
+print("' after "); print_esc("the");
+@y
+print("' after "); print_esc("the"); or_S(print("Ѿ"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.436] misplaced \pTeX message is due to WEB system!!!!
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Declare procedures that scan restricted classes of integers@>=
+@y
+@
+\pTeXchg{We use |mathchar| range @'100001 throught @'110000 for
+ semitic numbers in math mode.}
+@<Declare procedures that scan restricted classes of integers@>=
+@z
+@x
+if (cur_val<0)or(cur_val>@'77777) then
+@y
+if (cur_val<0)or(cur_val>@'110000)or(cur_val=@'100000) then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.437]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if (cur_val<0)or(cur_val>@'777777777) then
+@y
+if (cur_val<0)or(cur_val>@'1100000000)or(cur_val=@'1000000000) then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.440]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure scan_int; {sets |cur_val| to an integer}
+@y
+\pTeXusechr
+@d semi_octal_token=other_token+""
+@d semi_alpha_token=other_token+""
+@d semi_point_token=other_token+"" {semitic decimal point}
+@p procedure scan_int; {sets |cur_val| to an integer}
+@z
+@x
+if cur_tok=alpha_token then @<Scan an alphabetic character code into |cur_val|@>
+@y
+if (cur_tok=alpha_token) or (cur_tok=semi_alpha_token) then
+ @<Scan an alphabetic character code into |cur_val|@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.441]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Get the next non-blank non-sign token...@>=
+negative:=false;
+repeat @<Get the next non-blank non-call token@>;
+if cur_tok=other_token+"-" then
+ begin negative := not negative; cur_tok:=other_token+"+";
+ end;
+until cur_tok<>other_token+"+"
+@y
+@
+\pTeXusechr
+@<Get the next non-blank non-sign token...@>=
+negative:=chk_sign_and_semitic
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.444]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Scan a numeric constant@>=
+@y
+@
+\pTeXusechr
+@<Scan a numeric constant@>=
+@z
+@x
+if cur_tok=octal_token then
+@y
+if (cur_tok=octal_token) or (cur_tok=semi_octal_token) then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.445]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @d infinity==@'17777777777 {the largest positive value that \TeX\ knows}
+@y
+@
+\pTeXusechr
+@d infinity==@'17777777777 {the largest positive value that \TeX\ knows}
+@d semi_zero_token=other_token+"" {zero, the smallest digit}
+@z
+@x
+ (cur_tok<=zero_token+9) then d:=cur_tok-zero_token
+ else if radix=16 then
+@y
+ (cur_tok<=zero_token+9) then d:=cur_tok-zero_token
+ else if (cur_tok<semi_zero_token+radix)and(cur_tok>=semi_zero_token)and
+ (cur_tok<=semi_zero_token+9) then d:=cur_tok-semi_zero_token
+ else if radix=16 then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [26.453]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Scan units and set |cur_val| to $x\cdot(|cur_val|+f/2^{16})$...@>=
+@y
+\pTeXusechr
+@<Scan units and set |cur_val| to $x\cdot(|cur_val|+f/2^{16})$...@>=
+@z
+@x "true" after units
+attach_fraction: if cur_val>=@'40000 then arith_error:=true
+@y
+attach_fraction: if scan_keyword("true") then
+ @<Adjust \(f)for the magnification ratio@>;
+ if cur_val>=@'40000 then arith_error:=true
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [27.464] Building the token list
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function str_toks(@!b:pool_pointer):pointer;
+@y
+\pTeXusechr
+@p function str_toks(@!b:pool_pointer):pointer;
+@z
+@x 464
+ if t=" " then t:=space_token
+@y 464===================
+ if t=" " then t:=space_token else if t="" then t:=semi_space_token
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [27.468]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d number_code=0 {command code for \.{\\number}}
+@d roman_numeral_code=1 {command code for \.{\\romannumeral}}
+@d string_code=2 {command code for \.{\\string}}
+@d meaning_code=3 {command code for \.{\\meaning}}
+@d font_name_code=4 {command code for \.{\\fontname}}
+@d job_name_code=5 {command code for \.{\\jobname}}
+@y
+\pTeXchg{Define new commands.}
+@d number_code=0 {command code for \.{\\number}}
+@d thousands_code=1 {command code for \.{\\thousands}}
+@d millions_code=2 {command code for \.{\\millions}}
+@d billions_code=3 {command code for \.{\\billions}}
+@d roman_numeral_code=4 {command code for \.{\\romannumeral}}
+@d string_code=5 {command code for \.{\\string}}
+@d meaning_code=6 {command code for \.{\\meaning}}
+@d font_name_code=7 {command code for \.{\\fontname}}
+@d job_name_code=8 {command code for \.{\\jobname}}
+@z
+@x
+@!@:job_name_}{\.{\\jobname} primitive@>
+@y
+@!@:job_name_}{\.{\\jobname} primitive@>
+@#
+primitive("thousands",convert,thousands_code);@/
+@!@:thousands_}{\.{\\thousands} primitive@>
+primitive("millions",convert,millions_code);@/
+@!@:millions_}{\.{\\millions} primitive@>
+primitive("billions",convert,billions_code);@/
+@!@:billions_}{\.{\\billions} primitive@>
+@#
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [27.469]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ number_code: print_esc("number");
+@y
+ number_code: print_esc("number");
+ thousands_code: print_esc("thousands");
+ millions_code: print_esc("millions");
+ billions_code: print_esc("billions");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [27.471]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+number_code,roman_numeral_code: scan_int;
+@y
+number_code, thousands_code, millions_code, billions_code,
+roman_numeral_code: scan_int;
+@z
+@x
+number_code: print_int(cur_val);
+@y
+number_code: print_int(cur_val);
+thousands_code: print_int((cur_val mod 1000000) div 1000);
+millions_code: print_int((cur_val mod 1000000000) div 1000000);
+billions_code: print_int(cur_val div 1000000000);
+@z
+@x
+ else print_char(cur_chr);
+@y
+ else print(cur_chr);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [27.473]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function scan_toks(@!macro_def,@!xpand:boolean):pointer;
+@y
+\pTeXusechr
+@p function scan_toks(@!macro_def,@!xpand:boolean):pointer;
+@z
+@x
+var t:halfword; {token representing the highest parameter number}
+@y
+var t,tt:halfword; {token representing the highest parameter number}
+@z
+@x
+p:=def_ref; hash_brace:=0; t:=zero_token;
+@y
+p:=def_ref; hash_brace:=0; t:=zero_token; tt:=semi_zero_token;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [27.476]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<If the next character is a parameter number...@>=
+@y
+@
+\pTeXusechr
+@<If the next character is a parameter number...@>=
+@z
+@x
+if t=zero_token+9 then
+@y
+if (t=zero_token+9)or(tt=semi_zero_token+9) then
+@z
+@x
+else begin incr(t);
+ if cur_tok<>t then
+@y
+else begin incr(t); incr (tt);
+ if (cur_tok<>t) and (cur_tok<>tt) then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [27.479]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Look for parameter number...@>=
+@y
+@
+\pTeXusechr
+@<Look for parameter number...@>=
+@z
+@x
+ if (cur_tok<=zero_token)or(cur_tok>t) then
+@y
+ if (cur_tok<=zero_token)or(cur_tok>t) then
+ if (cur_tok<=semi_zero_token)or(cur_tok>tt) then
+@z
+@x
+ sprint_cs(warning_index);
+@y
+ sprint_cs(warning_index); or_S(print("렎"));
+@z
+@x
+ else cur_tok:=out_param_token-"0"+cur_chr;
+@y
+ else cur_tok:=out_param_token-""+cur_chr
+ else cur_tok:=out_param_token-"0"+cur_chr;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [27.483]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Input and store tokens from the next line of the file@>=
+@y
+@
+\pTeXchg{Deal with |left_or_right| files.}
+@<Input and store tokens from the next line of the file@>=
+@z
+@x
+else if read_open[m]=just_open then @<Input the first line of |read_file[m]|@>
+else @<Input the next line of |read_file[m]|@>;
+@y
+else begin direction_stack[in_open]:=read_file_direction[m];
+ if read_open[m]=just_open then @<Input the first line of |read_file[m]|@>
+ else @<Input the next line of |read_file[m]|@>; end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28.487] new `if' codes
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+We consider now the way \TeX\ handles various kinds of \.{\\if} commands.
+@y
+We consider now the way \TeX\ handles various kinds of \.{\\if} commands.
+\pTeXchg{Introduce new \.{\\if} commands.}
+@z
+@x 487
+@d if_case_code=16 { `\.{\\ifcase}' }
+@y 487===============
+@d if_case_code=16 { `\.{\\ifcase}' }
+@d if_L_code=17 { `\.{\\ifLtoR}' }
+@d if_R_code=18 { `\.{\\ifRtoL}' }
+@d if_latin_code=19 { `\.{\\iflatin}' }
+@d if_left_vbox_code=20 { `\.{\\ifleftvbox}' }
+@d if_joinable_code=21 { `\.{\\ifjoinable}' }
+@d if_semiticchar_code=22 { `\.{\\ifsemiticchar}' }
+@d if_ones_code=23 { `\.{\\ifonesof}' }
+@d if_tens_code=24 { `\.{\\iftensof}' }
+@d if_hundreds_code=25 { `\.{\\ifhundredsof}' }
+@d if_thousands_code=26 { `\.{\\ifthousands}' }
+@d if_millions_code=27 { `\.{\\ifmillions}' }
+@d if_billions_code=28 { `\.{\\ifbillions}' }
+@d if_prehundreds_code=29 { `\.{\\ifprehundreds}' }
+@d if_prethousands_code=30 { `\.{\\ifprethousands}' }
+@d if_premillions_code=31 { `\.{\\ifpremillions}' }
+@d if_prebillions_code=32 { `\.{\\ifprebillions}' }
+@d if_setlatin_code=33 { `\.{\\ifsetlatin}' }
+@d if_setsemitic_code=34 { `\.{\\ifsetsemitic}' }
+@d if_setrawprinting_code=35 { `\.{\\ifsetrawprinting}' }
+@d if_LRdir_code=36 { `\.{\\ifautoLRdir}' }
+@d if_LRfnt_code=37 { `\.{\\ifautofont}' }
+@d if_splited_code=38 { `\.{\\ifsplited}' }
+@z
+@x 487
+@!@:if_case_}{\.{\\ifcase} primitive@>
+@y 487===============
+@!@:if_case_}{\.{\\ifcase} primitive@>
+primitive("ifLtoR",if_test,if_L_code);
+@!@:if_L_}{\.{\\ifLtoR} primitive@>
+primitive("ifRtoL",if_test,if_R_code);
+@!@:if_R_}{\.{\\ifRtoL} primitive@>
+primitive("iflatin",if_test,if_latin_code);
+@!@:if_latin_}{\.{\\iflatin} primitive@>
+primitive("ifleftvbox",if_test,if_left_vbox_code);
+@!@:if_left_vbox_}{\.{\\ifleftvbox} primitive@>
+primitive("ifjoinable",if_test,if_joinable_code);
+@!@:if_joinable_}{\.{\\ifjoinable} primitive@>
+primitive("ifsemiticchar",if_test,if_semiticchar_code);
+@!@:if_semiticchar_}{\.{\\ifsemiticchar} primitive@>
+primitive("ifonesof",if_test,if_ones_code);
+@!@:if_ones_}{\.{\\ifonesof} primitive@>
+primitive("iftensof",if_test,if_tens_code);
+@!@:if_tens_}{\.{\\iftensof} primitive@>
+primitive("ifhundredsof",if_test,if_hundreds_code);
+@!@:if_hundreds_}{\.{\\ifhundredsof} primitive@>
+primitive("ifthousands",if_test,if_thousands_code);
+@!@:if_thousands_}{\.{\\ifthousands} primitive@>
+primitive("ifmillions",if_test,if_millions_code);
+@!@:if_millions_}{\.{\\ifmillions} primitive@>
+primitive("ifbillions",if_test,if_billions_code);
+@!@:if_billions_}{\.{\\ifbillions} primitive@>
+primitive("ifprehundreds",if_test,if_prehundreds_code);
+@!@:if_prehundreds_}{\.{\\ifprehundreds} primitive@>
+primitive("ifprethousands",if_test,if_prethousands_code);
+@!@:if_prethousands_}{\.{\\ifprethousands} primitive@>
+primitive("ifpremillions",if_test,if_premillions_code);
+@!@:if_premillions_}{\.{\\ifpremillions} primitive@>
+primitive("ifprebillions",if_test,if_prebillions_code);
+@!@:if_prebillions_}{\.{\\ifprebillions} primitive@>
+primitive("ifsetlatin",if_test,if_setlatin_code);
+@!@:if_setlatin_}{\.{\\ifsetlatin} primitive@>
+primitive("ifsetsemitic",if_test,if_setsemitic_code);
+@!@:if_setsemitic_}{\.{\\ifsetsemitic} primitive@>
+primitive("ifsetrawprinting",if_test,if_setrawprinting_code);
+@!@:if_setrawprinting_}{\.{\\ifsetrawprinting} primitive@>
+primitive("ifautoLRdir",if_test,if_LRdir_code);
+@!@:if_LRdir_}{\.{\\ifautoLRdir} primitive@>
+primitive("ifautofont",if_test,if_LRfnt_code);
+@!@:if_LRfnt_}{\.{\\ifautofont} primitive@>
+primitive("ifsplited",if_test,if_splited_code);
+@!@:if_splited_}{\.{\\ifsplited} primitive@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28.488] new `if' codes
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 488
+ if_case_code:print_esc("ifcase");
+@y 488===============
+ if_case_code:print_esc("ifcase");
+ if_L_code:print_esc("ifLtoR");
+ if_R_code:print_esc("ifRtoL");
+ if_latin_code:print_esc("iflatin");
+ if_left_vbox_code:print_esc("ifleftvbox");
+ if_joinable_code:print_esc("ifjoinable");
+ if_semiticchar_code:print_esc("ifsemiticchar");
+ if_ones_code:print_esc("ifonesof");
+ if_tens_code:print_esc("iftensof");
+ if_hundreds_code:print_esc("ifhundredsof");
+ if_thousands_code:print_esc("ifthousands");
+ if_millions_code:print_esc("ifmillions");
+ if_billions_code:print_esc("ifbillions");
+ if_prehundreds_code:print_esc("ifprehundreds");
+ if_prethousands_code:print_esc("ifprethousands");
+ if_premillions_code:print_esc("ifpremillions");
+ if_prebillions_code:print_esc("ifprebillions");
+ if_setlatin_code:print_esc("ifsetlatin");
+ if_setsemitic_code:print_esc("ifsetsemitic");
+ if_setrawprinting_code:print_esc("ifsetrawprinting");
+ if_LRdir_code:print_esc("ifautoLRdir");
+ if_LRfnt_code:print_esc("ifautofont");
+ if_splited_code:print_esc("ifsplited");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28.496] new `if' codes
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Pop the condition stack@>=
+begin p:=cond_ptr; if_line:=if_line_field(p);
+@y
+@
+\pTeXchg{Implement \.{\\ifsetlatin} and \.{\\ifsetsemitic} grouping stack.}
+@<Pop the condition stack@>=
+begin p:=cond_ptr; if_line:=if_line_field(p); pop_ifstk;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28.498] new `if' codes
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure conditional;
+label exit,common_ending;
+var b:boolean; {is the condition true?}
+@!r:"<"..">"; {relation to be evaluated}
+@y
+\pTeXchg{We add new conditionals and introduce new relation symbols.}
+@p @<Declare |pop_ifstk|@>@/
+@#
+procedure conditional;
+label exit,common_ending,done;
+var b:boolean; {is the condition true?}
+@!r:ASCII_code; {relation to be evaluated}
+@!i:integer;
+@z
+@x
+if tracing_commands>1 then @<Display the value of |b|@>;
+@y
+done:if tracing_commands>1 then @<Display the value of |b|@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28.501]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Either process \.{\\ifcase} or set |b|...@>=
+@y
+@
+\pTeXchg{Implement \.{\\ifsetlatin} and \.{\\ifsetsemitic} grouping stack.}
+@<Either process \.{\\ifcase} or set |b|...@>=
+@z
+@x 501
+if_case_code: @<Select the appropriate case
+ and |return| or |goto common_ending|@>;
+end {there are no other cases}
+@y 501===============
+@<Process semitic conditionlas@>@/
+if_case_code: @<Select the appropriate case
+ and |return| or |goto common_ending|@>;
+end {there are no other cases}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28.503]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Test relation between integers or dimensions@>=
+@y
+\pTeXchg{Implement new relation symbols.}
+@<Test relation between integers or dimensions@>=
+@z
+@x
+if (cur_tok>=other_token+"<")and(cur_tok<=other_token+">") then
+@y
+if ((cur_tok>=other_token+"<")and(cur_tok<=other_token+">")) or
+ ((cur_tok>=other_token+"")and(cur_tok<=other_token+"")) then
+@z
+@x
+ print_cmd_chr(if_test,this_if);
+@y
+ print_cmd_chr(if_test,this_if); or_S(print("Ϡ"));
+@z
+@x
+ back_error; r:="=";
+@y
+ back_error; L_or_S(r:="=")(r:="");
+@z
+@x
+"<": b:=(n<cur_val);
+"=": b:=(n=cur_val);
+">": b:=(n>cur_val);
+@y 503===================
+"<","": b:=(n<cur_val);
+"=","": b:=(n=cur_val);
+">","": b:=(n>cur_val);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28.506]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+active characters have the smallest tokens, among all control sequences.
+@y
+active characters have the smallest tokens, among all control sequences.
+\pTeXeqnm
+@z
+@x Adding eqcharif
+if this_if=if_char_code then b:=(n=cur_chr)@+else b:=(m=cur_cmd);
+@y
+if this_if=if_char_code then b:=((n=cur_chr)or@<Test |eqif| n@>)
+@+else b:=(m=cur_cmd);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28.507]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+are allowed, but we might be scanning a macro definition or preamble.
+@y
+are allowed, but we might be scanning a macro definition or preamble.
+\pTeXeqnm
+@z
+@x Adding eqcharif
+else if cur_cmd<call then b:=(cur_chr=q)
+@y
+else if cur_cmd<call then b:=((cur_chr=q)or@<Test |eqif| q@>)
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [28.509]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Select the appropriate case and |return| or |goto common_ending|@>=
+begin scan_int; n:=cur_val; {|n| is the number of cases to pass}
+@y
+@
+\pTeXusechr
+@<Select the appropriate case and |return| or |goto common_ending|@>=
+begin scan_int; @<Check positional numbers@>@/
+ n:=cur_val; {|n| is the number of cases to pass}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.514] TEX area directories
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d TEX_area=="TeXinputs:"
+@.TeXinputs@>
+@d TEX_font_area=="TeXfonts:"
+@.TeXfonts@>
+@y
+We'll handle the path stuff in an external C module.
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.516] more_name
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin if c=" " then more_name:=false
+@y
+begin if (c=" ")or(c="") then more_name:=false
+@z
+@x
+ if (c=">")or(c=":") then
+@y
+ if (c="/") then
+@z
+@x
+ else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length;
+@y
+ else if c="." then ext_delimiter:=cur_length;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.520] default format
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d format_default_length=20 {length of the |TEX_format_default| string}
+@d format_area_length=11 {length of its area part}
+@y
+Under {\mc UNIX} we don't give the area part, instead depending
+on the path searching that will happen during file opening. This doesn't
+really matter, since we change |TEX_format_default| to a char * anyway.
+
+@d format_default_length=9 {length of the |TEX_format_default| string}
+@d format_area_length=0 {length of its area part}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.521] plain format location
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!TEX_format_default:packed array[1..format_default_length] of char;
+
+@ @<Set init...@>=
+TEX_format_default:='TeXformats:plain.fmt';
+@y
+@!TEX_format_default:c_char_pointer;
+
+@ @<Set init...@>=
+TEX_format_default := ' plain.fmt';
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.524] format file opening: only try once, with path search
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin incr(loc); j:=loc; buffer[last]:=" ";
+ while buffer[j]<>" " do incr(j);
+@y
+ begin incr(loc); j:=loc; L_or_S(buffer[last]:=" ")(buffer[last]:="");
+ while (buffer[j]<>" ")and(buffer[j]<>"") do incr(j);
+@z
+@x
+ pack_buffered_name(format_area_length,loc,j-1);
+ {now try the system format file area}
+ if w_open_in(fmt_file) then goto found;
+@y
+@z
+@x wterm_ln --> bwterm_ln
+ wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.');
+@y
+ bwterm_ln('Sorry, I can''t find that format;',' will try PLAIN.');
+@z
+@x wterm_ln --> bwterm_ln
+ wterm_ln('I can''t find the PLAIN format file!');
+@y
+ bwterm_ln('I can''t find the PLAIN format file!');
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.525] make_name_string
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p function make_name_string:str_number;
+var k:1..file_name_size; {index into |name_of_file|}
+begin if (pool_ptr+name_length>pool_size)or(str_ptr=max_strings)or
+ (cur_length>0) then
+ make_name_string:="?"
+else begin for k:=1 to name_length do append_char(xord[name_of_file[k]]);
+ make_name_string:=make_string;
+ end;
+end;
+function a_make_name_string(var f:alpha_file):str_number;
+begin a_make_name_string:=make_name_string;
+end;
+function b_make_name_string(var f:byte_file):str_number;
+begin b_make_name_string:=make_name_string;
+end;
+function w_make_name_string(var f:word_file):str_number;
+begin w_make_name_string:=make_name_string;
+end;
+@y
+With the C version, we know that |real_name_of_file|
+contains |name_of_file| prepended with the directory name that was found
+by path searching.
+
+If |real_name_of_file| starts with |'./'|, we don't use that part of the
+name, since {\mc UNIX} users understand that.
+@^system dependencies@>
+
+@p function make_name_string:str_number;
+var k,@!kstart:1..file_name_size; {index into |name_of_file|}
+begin
+ k:=1;
+ while (k<file_name_size) and (xord[real_name_of_file[k]]<>" ") do incr(k);
+ name_length:=k-1; {the real |name_length|}
+ if (pool_ptr+name_length>pool_size)or(str_ptr=max_strings)or
+ (cur_length>0) then make_name_string:="?"
+ else begin
+ if (xord[real_name_of_file[1]]=".")and(xord[real_name_of_file[2]]="/") then
+ kstart:=3
+ else kstart:=1;
+ for k:=kstart to name_length do append_char(xord[real_name_of_file[k]]);
+ make_name_string:=make_string;
+ end;
+end;
+
+{The |X_make_name_string| functions are changed to macros in C.}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.530] Adding Farsi messages
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure prompt_file_name(@!s,@!e:str_number);
+@y
+\pTeXaltstr
+@p procedure prompt_file_name(@!s,@!e:str_number);
+@z
+@x
+print_file_name(cur_name,cur_area,cur_ext); print("'.");
+@y
+print_file_name(cur_name,cur_area,cur_ext); L_or_S(print("'.");)
+(if s="input file name" then print(" Ѡ") else print(""););
+@z
+@x
+print_nl("Please type another "); print(s);
+@y
+print_nl("Please type another "); print(s); or_S(print("Ġ"));
+@z
+@x
+clear_terminal; prompt_input(": "); @<Scan file name in the buffer@>;
+@y
+clear_terminal; left_input := true;
+prompt_input(": "); @<Scan file name in the buffer@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.531] Skip Farsi blanks
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Scan file name in the buffer@>=
+@y
+@
+\pTeXusechr
+@<Scan file name in the buffer@>=
+@z
+@x
+while (buffer[k]=" ")and(k<last) do incr(k);
+@y
+while ((buffer[k]=" ")or(buffer[k]=""))and(k<last) do incr(k);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.534] Adjust for C string conventions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!months:packed array [1..36] of char; {abbreviations of month names}
+@y
+@!months:c_char_pointer;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.536] Add Farsi messages
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Print the banner...@>=
+@y
+@
+\pTeXchg{Print Farsi date form.}
+@<Print the banner...@>=
+@z
+@x
+begin wlog(banner);
+slow_print(format_ident); print(" ");
+print_int(day); print_char(" ");
+months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+for k:=3*month-2 to 3*month do wlog(months[k]);
+print_char(" "); print_int(year); print_char(" ");
+print_two(time div 60); print_char(":"); print_two(time mod 60);
+@y 536==============
+begin print_nl(banner);
+if not (format_ident = initex) then print_ln;
+slow_print(format_ident); print(" ");
+if latin_speech then begin print_int(day); print_char(" ");
+ months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC';
+ for k:=3*month-2 to 3*month do print_char (months[k]);
+ print_char(" "); print_int(year); print_char(" ");
+ print_two(time div 60); print_char(":"); print_two(time mod 60);
+ end
+else begin print_char("");
+ case semi_day of
+ 1: print("");
+ 2: print("");
+ 3: print("");
+ 4: print("Ѿ");
+ 5: print("");
+ 6: print("");
+ 7: print("");
+ 8: print("");
+ 9: print("");
+ 10: print("");
+ 11: print("Ҿ");
+ 12: print("Ͻ");
+ 13: print("");
+ 14: print("Ѿ");
+ 15: print("");
+ 16: print("");
+ 17: print("");
+ 18: print("");
+ 19: print("");
+ 20: print("");
+ 21: print("");
+ 22: print("Ϡ");
+ 23: print("ՠ");
+ 24: print("Ѿʠ");
+ 25: print(" ");
+ 26: print("נ");
+ 27: print("");
+ 28: print("");
+ 29: print("");
+ 30: print("");
+ 31: print("");
+ othercases begin print("Ġ");
+ print_int(semi_day); print (""); end
+ endcases;@/
+ print_char("");
+ case semi_month of
+ 1: print("");
+ 2: print("ѽ");
+ 3: print("Ͻ");
+ 4: print("");
+ 5: print("Ͻ");
+ 6: print("");
+ 7: print("");
+ 8: print("");
+ 9: print("л");
+ 10: print("");
+ 11: print("");
+ 12: print("ս");
+ othercases begin print ("Ġ");
+ print_int(semi_month); print (""); end
+ endcases;@/
+ print_char(""); print_int(semi_year); print("ՠϠ");
+ print_two(time mod 60); print_char(""); print_two(time div 60);
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] a_open_in of \input file needs path selector
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if a_open_in(cur_file) then goto done;
+ if cur_area="" then
+ begin pack_file_name(cur_name,TEX_area,cur_ext);
+ if a_open_in(cur_file) then goto done;
+ end;
+@y
+ if a_open_in(cur_file,input_path_spec) then goto done;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [29.537] {get rid of return of name to string pool} But we do that more
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x Remove file name from string pool. We save ext and area here.
+if name=str_ptr-1 then {we can conserve string pool space now}
+ begin flush_string; name:=cur_name;
+ end;
+@y
+if (name=str_ptr-1) or (ext=str_ptr-1) then
+ {we can conserve string pool space now}
+ begin flush_string;
+ if (name=str_ptr-1) then flush_string;
+ if (area=str_ptr-1) then flush_string;
+ name:=cur_name; ext:=cur_ext; area:=cur_area;
+ end
+else begin ext:=0; area := 0; end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.563] Fix TFM file opening
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if aire="" then pack_file_name(nom,TEX_font_area,".tfm")
+else pack_file_name(nom,aire,".tfm");
+@y
+pack_file_name(nom,aire,".tfm");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.564] reading the tfm file
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% As a special case, whenever we open a tfm file, we read its first
+% byte into "tfm_temp" right away. TeX looks at "fbyte" before calling
+% "fget", so it ends up seeing every byte. This is Pascal-like I/O.
+@x
+@d fget==get(tfm_file)
+@d fbyte==tfm_file^
+@y
+@d fget==tfm_temp:=getc(tfm_file)
+@d fbyte==tfm_temp
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.576]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+the new font.
+@y
+the new font.
+\pTeXchg{Deal with \pTeX{} fonts.}
+@z
+@x 576
+font_bc[f]:=bc; font_ec[f]:=ec; font_glue[f]:=null;
+@y 576===================
+font_bc[f]:=bc; font_ec[f]:=ec; font_glue[f]:=null;
+fontwin[f]:=null_font; font_mid_rule[f]:=null;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.577]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 577
+if cur_cmd=def_font then f:=cur_font
+@y 577===================
+if cur_cmd=def_font then if cur_chr=Lftlang then f:=cur_latif
+ else if cur_chr<=Rtlang then f:=cur_semif else f:=cur_font
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.578]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x
+ @y
+\pTeXaltstr
+ @z
+@x 578
+else begin if writing and(n<=space_shrink_code)and@|
+ (n>=space_code)and(font_glue[f]<>null) then
+ begin delete_glue_ref(font_glue[f]);
+ font_glue[f]:=null;
+ end;
+@y 578===================
+else begin if writing then
+ if (n<=space_shrink_code)and(n>=space_code)and(font_glue[f]<>null) then
+ begin delete_glue_ref(font_glue[f]); font_glue[f]:=null; end
+ else @<Check \pTeX{} font dimen@>@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [30.581]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print_ASCII(c); print(" in font ");
+ slow_print(font_name[f]); print_char("!"); end_diagnostic(false);
+@y
+ if is_semi_font (f) then print_s_ASCII(c) else print_ASCII(c);
+ print(" in font ");
+ slow_print(font_name[f]); LorRprt("!",""); end_diagnostic(false);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.597] write_dvi
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@p procedure write_dvi(@!a,@!b:dvi_index);
+var k:dvi_index;
+begin for k:=a to b do write(dvi_file,dvi_buf[k]);
+end;
+@y
+
+In C, we use a macro to call fwrite() or write() directly, writing all
+the bytes to be written in one shot. Much better even than writing four
+bytes at a time.
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.617]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print(" TeX output "); print_int(year); print_char(".");
+ print_two(month); print_char("."); print_two(day);
+ print_char(":"); print_two(time div 60);
+ print_two(time mod 60);
+@y
+ if latin_speech then
+ begin print(" Parsi_TeX output "); print_int(year); print_char(".");
+ print_two(month); print_char("."); print_two(day);
+ print_char(":"); print_two(time div 60);print_two(time mod 60);
+ end
+ else
+ begin saved_lang := cur_speech; cur_speech := Lftlang;
+ print(" TeX-e-Parsi output "); print_int(semi_year); print_char("/");
+ print_two(semi_month); print_char("/"); print_two(semi_day);
+ print_char(":"); print_two(time div 60); print_two(time mod 60);
+ cur_speech := saved_lang;
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.619]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |hlist_out|
+@!p:pointer; {current position in the hlist}
+@y
+@!p:pointer; {current position in the hlist}
+@!q:pointer; {trailes behind |p|}
+@!saved_q:pointer; {for releasing |q|}
+@z
+@x
+g_sign:=glue_sign(this_box); p:=list_ptr(this_box);
+incr(cur_s);
+@y
+g_sign:=glue_sign(this_box); p:=list_ptr(this_box);
+@<|re_organize| in |hlist_out|@>;
+incr(cur_s);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.619]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 619
+decr(cur_s);
+@y 619==================
+decr(cur_s); free_avail(saved_q);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.622]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 622
+glue_node: @<Move right or output leaders@>;
+@y 622==================
+glue_node: if is_not_supressed(p) then @<Move right or output leaders@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.625] @<Move right or output leaders@>=
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |mid_rule|
+if subtype(p)>=a_leaders then
+@y 625==================
+@<Check |mid_rule|s@>@/
+if subtype(p)>=a_leaders then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.631]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+rule_node: begin rule_ht:=height(p); rule_dp:=depth(p); rule_wd:=width(p);
+@y 631===================
+rule_node: begin rule_ht:=height(p); rule_dp:=depth(p); rule_wd:=width(p);
+ leader_box:=p;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.632]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 632
+ cur_h:=left_edge+shift_amount(p); {shift the box right}
+@y 632==================
+ if subtype(p)=right_justify then
+ cur_h:=left_edge-shift_amount(p) {shift the box left}
+ else cur_h:=left_edge+shift_amount(p); {shift the box right}
+ if R_to_L_node (p) then cur_h:=cur_h+width(this_box)-width(p);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.633]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 633
+ begin synch_h; synch_v;
+ dvi_out(put_rule); dvi_four(rule_ht); dvi_four(rule_wd);
+ end;
+@y 633==================
+ begin save_h:=cur_h;
+ if R_to_L_node (leader_box) then
+ cur_h:=cur_h+width(this_box)-rule_wd;
+ synch_h; synch_v; dvi_out(put_rule); dvi_four(rule_ht); dvi_four(rule_wd);
+ if cur_h<>save_h then begin cur_h:=save_h; synch_h; end;
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.637]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 637
+begin cur_h:=left_edge+shift_amount(leader_box); synch_h; save_h:=dvi_h;@/
+@y
+begin cur_h:=left_edge+shift_amount(leader_box); save_h:=cur_h;@/
+ if R_to_L_node (leader_box) then
+ cur_h:=cur_h+width(this_box)-width(leader_box);
+ synch_h;@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.638]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |ship_out|
+begin if tracing_output>0 then
+@y
+@<LR ship vars@>@/
+if tracing_output>0 then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.639]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |ship_out|
+flush_node_list(p);
+@y
+flush_node_list(p); @<Flush the LR stack@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [32.642]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print(" ("); print_int(total_pages); print(" page");
+ if total_pages<>1 then print_char("s");
+ print(", "); print_int(dvi_offset+dvi_ptr); print(" bytes).");
+@y
+ LorRprt(" (","נ"); print_int(total_pages); print(" page");
+ if total_pages<>1 then L_or(print_char("s"));
+ print(", "); print_int(dvi_offset+dvi_ptr); print(" bytes).");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [33.649]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |hpack|
+begin last_badness:=0; r:=get_node(box_node_size); type(r):=hlist_node;
+@y 649==================
+@!LR_err:integer; {counts missing begins and ends}
+@!LR_sv:pointer;
+begin last_badness:=0; r:=get_node(box_node_size); type(r):=hlist_node;
+LR_sv:=LRsp; LRsp := null; LR_err:=0;
+@z
+@x 649
+exit: hpack:=r;
+@y 649==================
+exit: @<Check for LR anomalies at the end of |hpack|@>;
+@!debug if is_open_LR then confusion (" LRsp in hpack "); gubed
+LRsp:=LR_sv; hpack:=r;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [33.651]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 651
+ glue_node:@<Incorporate glue into the horizontal totals@>;
+@y 651===================
+ glue_node:if is_not_supressed(p) then
+ @<Incorporate glue into the horizontal totals@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [33.656]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 656
+if subtype(p)>=a_leaders then
+ begin g:=leader_ptr(p);
+@y 656===================
+if (subtype(p)>=a_leaders)and(subtype(p)<=x_leaders) then
+ begin g:=leader_ptr(p);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [33.660]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if last_badness>100 then print_nl("Underfull")@+else print_nl("Loose");
+@y
+L_or_S(if last_badness>100 then print_nl("Underfull")@+else print_nl("Loose"))
+ (print_nl("Ͼ");
+ if last_badness>100 then print("")@+else print(""));
+@z
+@x
+ print_int(line);
+@y
+ print_int(line); or_S(print(" "));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [33.669] check midrules
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 669
+ glue_node: @<Incorporate glue into the vertical totals@>;
+@y 669==================
+ glue_node: if is_mrule(p) then confusion("mid_rule_2")
+ else @<Incorporate glue into the vertical totals@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [33.674]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if last_badness>100 then print_nl("Underfull")@+else print_nl("Loose");
+@y
+L_or_S(if last_badness>100 then print_nl("Underfull")@+else print_nl("Loose"))
+ (print_nl("Ͼ");
+ if last_badness>100 then print("")@+else print(""));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [33.675]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print_int(line);
+@y
+ print_int(line); or_S(print(" "));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [34.691]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin print_esc("fam"); print_int(fam(p)); print_char(" ");
+print_ASCII(qo(character(p)));
+@y
+begin if is_semi_font (font(p)) then print_esc("semifam") else print_esc("fam");
+ print_int(fam(p)); print_char(" ");
+ @<Print |p| according to |fontwin[font(p)]|@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [35.702]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x 702
+@d cramped_style(#)==2*(# div 2)+cramped {cramp the style}
+@d sub_style(#)==2*(# div 4)+script_style+cramped {smaller and cramped}
+@d sup_style(#)==2*(# div 4)+script_style+(# mod 2) {smaller}
+@d num_style(#)==#+2-2*(# div 6) {smaller unless already script-script}
+@d denom_style(#)==2*(# div 2)+cramped+2-2*(# div 6) {smaller, cramped}
+ @y 702===================
+@d cramped_style(#)==2*((#) div 2)+cramped {cramp the style}
+@d sub_style(#)==2*((#) div 4)+script_style+cramped {smaller and cramped}
+@d sup_style(#)==begin ss:=(#) mod 2;
+ ss:=2*((#) div 4)+script_style+ss; end {smaller}
+@d num_style(#)==#+2-2*((#) div 6) {smaller unless already script-script}
+@d denom_style(#)==2*((#) div 2)+cramped+2-2*((#) div 6) {smaller, cramped}
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [36.738]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 738
+ width(y):=0; p:=new_kern(-delta); link(p):=x; link(y):=p;
+@y 738===================
+ width(y):=0; subtype(y):=left_justify; {|left_vbox|}
+ p:=new_kern(-delta); link(p):=x; link(y):=p;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [36.749]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x 749
+@!shift_up,@!shift_down:scaled; {dimensions for box calculation}
+ @y 749===================
+@!shift_up,@!shift_down:scaled; {dimensions for box calculation}
+@!ss:small_number; {auxiliary variable for special `mod' handling}
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [36.750]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x 750
+begin x:=clean_box(supscr(q),sup_style(cur_style));
+ @y 750===================
+begin sup_style(cur_style); x:=clean_box(supscr(q),ss);
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [36.756]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x 756
+@!t:small_number; {subsidiary size code}
+ @y 756===================
+@!t:small_number; {subsidiary size code}
+@!ss:small_number; {auxiliary variable for special `mod' handling}
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [36.758]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x 758
+begin x:=clean_box(supscr(q),sup_style(cur_style));
+ @y 758===================
+begin sup_style(cur_style); x:=clean_box(supscr(q),ss);
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [36.759]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 759
+x:=vpack(x,natural); shift_amount(x):=shift_down;
+@y 759===================
+subtype(x):=left_justify; subtype(y):=left_justify; {|left_vbox|}
+x:=vpack(x,natural); shift_amount(x):=shift_down;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.770]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |align_chr|
+@d align_stack_node_size=5 {number of |mem| words to save alignment states}
+
+@<Glob...@>=
+@!cur_align:pointer; {current position in preamble list}
+@y 770===================
+@d align_stack_node_size=6 {number of |mem| words to save alignment states}
+
+@<Glob...@>=
+@!align_cmd:halfword; {current alignment command code}
+@!align_chr:halfword; {current alignment |sub_command| code}
+@!cur_align:pointer; {current position in preamble list}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.771]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |align_chr|
+cur_head:=null; cur_tail:=null;
+@y
+cur_head:=null; cur_tail:=null; align_cmd:=null; align_chr:=null;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.772]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |align_chr|
+info(p+4):=cur_head; link(p+4):=cur_tail;
+@y
+info(p+4):=cur_head; link(p+4):=cur_tail;
+info(p+5):=align_cmd; link(p+5):=align_chr;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.772]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |align_chr|
+cur_tail:=link(p+4); cur_head:=info(p+4);
+@y
+cur_tail:=link(p+4); cur_head:=info(p+4);
+align_cmd:=info(p+5); align_chr:=link(p+5);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.774] init_align
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |align_chr|
+push_alignment; align_state:=-1000000; {enter a new alignment level}
+@y
+push_alignment; align_state:=-1000000; {enter a new alignment level}
+align_cmd:=cur_cmd; align_chr:=cur_chr;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.786] init_span
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x insert |begin_R_code| at begin of column
+if mode=-hmode then space_factor:=1000
+@y
+if mode=-hmode then begin space_factor:=1000;
+@<insert |begin_R_code| at begin of column@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.792]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print_esc("cr");
+@y
+ print_esc("cr"); or_S(print("ϽϠĠ"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.796] fin_col
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x insert matching |end_R_code| at end of column
+ begin adjust_tail:=cur_tail; u:=hpack(link(head),natural); w:=width(u);
+@y
+ begin adjust_tail:=cur_tail;
+@<insert matching |end_R_code| at end of column@>;@/
+u:=hpack(link(head),natural); w:=width(u);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.799] fin_row
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x set row justification
+ begin p:=hpack(link(head),natural);
+@y
+ begin p:=hpack(link(head),natural);
+ if align_chr=Rtlang then subtype(p):=right_justify
+ else subtype(p):=left_justify;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.800] fin_align
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x introduce |pu| and |pr| to keep predecessor nodes of |u| and |r|
+var @!p,@!q,@!r,@!s,@!u,@!v: pointer; {registers for the list operations}
+@y
+var @!p,@!q,@!r,@!s,@!u,@!v,@!pu,@!pr: pointer;
+ {registers for the list operations}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.806] running dimention in rule
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x set rule justification in alignment
+ shift_amount(q):=o; link(q):=r; link(s):=q;
+@y
+ shift_amount(q):=o; link(q):=r; link(s):=q; subtype(q):=subtype(list_ptr(q));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.807] @<Set the unset box |q| and the unset boxes in it@>=
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x append blank boxes and reverse the columns in a row
+repeat @<Set the glue in node |r| and change it from an unset node@>;
+r:=link(link(r)); s:=link(link(s));
+until r=null;
+@y
+pr:=list_ptr(q); { keep |r| predecessor in |pr| }
+repeat @<Set the glue in node |r| and change it from an unset node@>;
+pr:=link(r); { ditto }
+r:=link(link(r)); s:=link(link(s));
+until r=null;
+if align_chr=Rtlang then @<Reverse align columns@>;@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% @<Set the glue in node |r|...@>=
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x set spanned box width to last column width
+if mode=-vmode then
+@y
+if u<>hold_head then
+ if align_chr=Rtlang then begin width(u):=w; w:=width(s); end;
+if mode=-vmode then
+@z
+@x set spanned box as last spanned column
+ begin link(u):=link(r); link(r):=link(hold_head); r:=u;
+@y
+ if align_chr=Rtlang then
+ begin link(u):=link(hold_head); link(pu):=r; link(pr):=u; end
+ else begin link(u):=link(r); link(r):=link(hold_head); r:=u;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [37.809] Append tabskip
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x keep last blank box of spanned columns in |pu|
+s:=link(s); link(u):=new_null_box; u:=link(u); t:=t+width(s);
+@y
+s:=link(s); link(u):=new_null_box; pu:=u; u:=link(u); t:=t+width(s);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [38.816] line_break
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |mid_rule|
+link(temp_head):=link(head);
+@y
+link(temp_head):=link(head); r:=tail;
+@z
+@x
+ flush_node_list(leader_ptr(tail)); penalty(tail):=inf_penalty;
+ end;
+@y
+ if is_not_mrule(tail) then flush_node_list(leader_ptr(tail))
+ else leader_ptr(tail):=null; penalty(tail):=inf_penalty;
+ r:=link(head); while link(r)<>tail do r:=link(r);
+ end;
+if in_auto_LR then begin s:=tail; tail:=r; pop_stkLR; tail_append(s); end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [38.859] Fix a casting/expression evaluation problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if abs(fit_class-fitness(r))>1 then d:=d+adj_demerits;
+@y
+if abs(toint(fit_class)-toint(fitness(r)))>1 then d:=d+adj_demerits;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.866] @<Call |try_break| if |cur_p| is a legal breakpoint...@>=
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |mid_rule|
+@d kern_break==begin if not is_char_node(link(cur_p)) and auto_breaking then
+ if type(link(cur_p))=glue_node then try_break(0,unhyphenated);
+@y
+@d kern_break==begin if not is_char_node(link(cur_p)) and auto_breaking then
+ if (type(link(cur_p))=glue_node) and is_not_mrule(link(cur_p)) then
+ try_break(0,unhyphenated);
+@z
+@x |glue_node:|
+ if second_pass and auto_breaking then
+@y
+ if second_pass and auto_breaking and is_not_mrule(cur_p) then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.868] @<If node |cur_p| is a legal breakpoint, call...@>=
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |mid_rule|
+if auto_breaking then
+@y
+if auto_breaking and is_not_mrule(cur_p) then
+@z
+@x |mid_rule|
+check_shrinkage(glue_ptr(cur_p)); q:=glue_ptr(cur_p);
+@y
+ if second_pass and auto_breaking then activate_mid_rule (cur_p)
+ else suppress_mid_rule (cur_p);
+ if is_not_supressed(cur_p) then begin
+ check_shrinkage(glue_ptr(cur_p)); q:=glue_ptr(cur_p);
+@z
+@x append end of above begin
+active_width[6]:=active_width[6]+shrink(q)
+@y
+active_width[6]:=active_width[6]+shrink(q)
+end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.875] Another casting bug
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin line_diff:=line_number(r)-best_line;
+@y
+ begin line_diff:=toint(line_number(r))-toint(best_line);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.877] post_line_break
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x prepare to handle LR nodes
+@!cur_line: halfword; {the current line number being justified}
+begin @<Reverse the links of the relevant passive nodes, setting |cur_p| to the
+ first breakpoint@>;
+@y
+@!cur_line: halfword; {the current line number being justified}
+@!tmp:pointer; { for LR manipulation }
+begin
+@!debug if is_open_LR then confusion (" LRsp in post_line_break "); gubed
+@!debug if is_open_LJ then confusion (" LJsp in post_line_break "); gubed
+@<Reverse the links of the relevant passive nodes, setting |cur_p| to the
+ first breakpoint@>;
+@z
+@x LR nodes
+prev_graf:=best_line-1;
+@y
+prev_graf:=best_line-1; @<Flush the LJ stack@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.880]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x LR nodes
+@<Modify the end of the line to reflect the nature of the break and to include
+ \.{\\rightskip}; also set the proper value of |disc_break|@>;
+@y
+@<Adjust the LR stack based on LR nodes in this line@>;
+@<Modify the end of the line to reflect the nature of the break and to include
+ \.{\\rightskip}; also set the proper value of |disc_break|@>;
+@<Insert LR nodes at the end of the current line@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.881] @<Modify the end of the line...@>=
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |mid_rule| and left or right skip
+ glue_ptr(q):=right_skip;
+ subtype(q):=right_skip_code+1; add_glue_ref(right_skip);
+@y
+ if is_mrule(q) then leader_ptr(q):=null;
+ if R_to_L_line then
+ begin glue_ptr(q):=left_skip; add_glue_ref(left_skip);
+ subtype(q):=left_skip_code+1;
+ end
+ else begin glue_ptr(q):=right_skip; add_glue_ref(right_skip);
+ subtype(q):=right_skip_code+1;
+ end;
+@z
+@x |accents|
+ else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0;
+@y
+ else if (type(q)=math_node)or
+ ((type(q)=kern_node)and(subtype(q)<>acc_kern)) then width(q):=0;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.886] @<Put the \(r)\.{\\rightskip} glue after node |q|@>;
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x left or right skip
+r:=new_param_glue(right_skip_code); link(r):=link(q); link(q):=r; q:=r
+@y
+ if R_to_L_line then r:=new_param_glue(left_skip_code)
+ else r:=new_param_glue(right_skip_code);
+ link(r):=link(q); link(q):=r; q:=r
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.887] @<Put the \(l)\.{\\leftskip} glue at the left...@>=
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x left or right skip
+if left_skip<>zero_glue then
+ begin r:=new_param_glue(left_skip_code);
+ link(r):=q; q:=r;
+ end
+@y
+ if R_to_L_line then begin
+ if right_skip<>zero_glue then
+ begin r:=new_param_glue(right_skip_code); link(r):=q; q:=r; end;
+ end else if left_skip<>zero_glue then
+ begin r:=new_param_glue(left_skip_code); link(r):=q; q:=r; end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [39.889] @<Call the packaging subroutine...@>=
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x box justification
+shift_amount(just_box):=cur_indent
+@y
+if R_to_L_vbox then
+ begin subtype(just_box):=right_justify; {|cur_indent| := -|cur_indent|;} end
+else subtype(just_box):=left_justify;
+shift_amount(just_box):=cur_indent
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [40.899] @<Check that the nodes following |hb| permit hyphenation...@>=
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |mid_rule|
+ whatsit_node,glue_node,penalty_node,ins_node,adjust_node,mark_node:
+ goto done4;
+@y
+ whatsit_node,penalty_node,ins_node,adjust_node,mark_node: goto done4;
+ glue_node: if is_not_mrule(s) then goto done4 else goto done1;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [42.934] new_hyph_exceptions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x |semitic char|
+@!u,@!v:pool_pointer; {indices into |str_pool|}
+ @y
+@!u,@!v:pool_pointer; {indices into |str_pool|}
+@!tmp:halfword;
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [42.935]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x |semitic char|
+ char_num: begin scan_char_num; cur_chr:=cur_val; cur_cmd:=char_given;
+ @y 935===================
+ char_num: begin tmp:=cur_chr; scan_char_num; cur_chr:=cur_val;
+ if tmp=Lftlang then cur_cmd:=char_given else cur_cmd:=semi_given;
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [42.937]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x |semitic char|
+ begin print_err("Not a letter");
+@.Not a letter@>
+ help2("Letters in \hyphenation words must have \lccode>0.")@/
+ @y
+ begin print_err("Not a latin letter");
+@.Not a letter@>
+ help3("Hyphenation exceptions must contain only latin letters")@/
+ ("and latin letters in \hyphenation words must have \lccode>0.")@/
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.943] web2c can't parse negative lower bounds in arrays. Sorry.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size;
+@y
+@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size;
+@z
+@x
+var h:-trie_op_size..trie_op_size; {trial hash location}
+@y
+var h:neg_trie_op_size..trie_op_size; {trial hash location}
+@z
+@x 944
+begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (trie_op_size+trie_op_size)
+ - trie_op_size;
+@y
+begin h:=abs(toint(n)+313*toint(d)+361*toint(v)+1009*toint(cur_lang))
+ mod (trie_op_size - neg_trie_op_size) + neg_trie_op_size;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [43.947] A casting problem.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+begin h:=abs(trie_c[p]+1009*trie_o[p]+@|
+ 2718*trie_l[p]+3142*trie_r[p]) mod trie_size;
+@y
+begin h:=abs(toint(trie_c[p])+1009*toint(trie_o[p])+@|
+ 2718*toint(trie_l[p])+3142*toint(trie_r[p])) mod trie_size;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [45.989]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 989
+@!output_active:boolean; {are we in the midst of an output routine?}
+@y
+@!output_active:boolean; {are we in the midst of an output routine?}
+@!splited_ins:array [0..255] of boolean;
+@z
+
+@x 990
+output_active:=false; insert_penalties:=0;
+@y
+output_active:=false; insert_penalties:=0;
+for i:=0 to 255 do splited_ins [i] := false;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [45.992]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+flush_node_list(box(n)); box(n):=null;
+end;
+@y
+flush_node_list(box(n)); box(n):=null;
+end;
+@#
+@<Define |append_mid_rule| procedure@>@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1014]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+insert_penalties:=0; {this will count the number of insertions held over}
+@y
+insert_penalties:=0; {this will count the number of insertions held over}
+for q:=0 to 255 do splited_ins [q] := false;
+@z
+
+@x 1021
+ free_node(temp_ptr,box_node_size); wait:=true;
+@y
+ free_node(temp_ptr,box_node_size); wait:=true;
+ splited_ins[subtype(r)] := true;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1029]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x 1029
+with particular care.
+ @y 1029=================
+with particular care.
+
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1030]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |main_loop|
+@^inner loop@>
+@y
+@^inner loop@>
+\pTeXchg{We should double cases of inner loop to read semitic characters
+and assign approperiate font in accordance with their joining attributes.}
+@z
+@x |main_loop|
+@d append_normal_space=120 {go here to append a normal space between words}
+@y
+@d append_normal_space=120 {go here to append a normal space between words}
+@#
+@d pre_lookahead_one=121 {backing from |main_loop_lookahead+1|}
+@d post_lookahead_one=122 {skip |semi_chr| check in |main_loop_lookahead+1|}
+@#
+@d semi_main_loop=130 {go here to typeset |cur_chr| in the current font}
+@d semi_mid_loop=135 {like |main_loop_2|, but |f| is already adjusted}
+@d semi_lookahead=140 {like |main_loop_2|, but several variables are set up}
+@d semi_lig_loop=145 {go here to check for ligature or kern}
+
+@d manual=0 {should be |> normal < LRsw_max|}
+@d autoLR=1 {should be |> normal < LRsw_max|}
+@d autofont=2 {should be |> normal < LRsw_max|}
+@d automatic=3 {should be |> normal < LRsw_max|}
+
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1030]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |main_loop|
+ append_normal_space,exit;
+var@!t:integer; {general-purpose temporary variable}
+@y
+semi_main_loop,semi_main_loop+1,semi_main_loop+2,semi_mid_loop,
+ semi_lookahead,semi_lookahead+1,semi_lookahead+2,semi_lookahead+3,
+ semi_lig_loop, append_normal_space,exit;
+var@!t:integer; {general-purpose temporary variable}
+@!l:quarterword; {the current character or ligature}
+@!c:eight_bits; {the most recent character}
+@!r:halfword; {the next character for ligature/kern matching}
+@!k:0..font_mem_size; {index into |font_info|}
+@!q:pointer; {where a ligature should be detached}
+@!i:four_quarters; {character information bytes for |l|}
+@!j:four_quarters; {ligature/kern command}
+@!f,f1,acc_font:internal_font_number; {the current font}
+@!fontadj:boolean; {should the current font be adjusted?}
+@!acc_char:four_quarters;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1030]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |main_loop|
+big_switch: get_x_token;@/
+@y
+@<Reset last char params@>;@/
+big_switch: get_x_token;@/
+@z
+@x
+hmode+letter,hmode+other_char,hmode+char_given: goto main_loop;
+hmode+char_num: begin scan_char_num; cur_chr:=cur_val; goto main_loop;@+end;
+@y
+hmode+letter,hmode+other_char:
+if is_semi_char(cur_chr) then goto semi_main_loop else goto main_loop;
+hmode+char_given: goto main_loop;
+hmode+semi_given: goto semi_main_loop;
+hmode+char_num: begin
+ if (cur_chr=Lftlang) and check_latin_font then goto big_switch
+ else if (cur_chr=Rtlang) and check_semitic_font then goto big_switch;
+ t:=cur_chr; scan_char_num; cur_chr:=cur_val;
+ if t=Lftlang then goto main_loop else goto semi_main_loop;
+ end;
+@z
+@x
+hmode+spacer: if space_factor=1000 then goto append_normal_space
+ else app_space;
+hmode+ex_space,mmode+ex_space: goto append_normal_space;
+@y 1030=================
+hmode+spacer,hmode+ex_space: begin
+ if (cur_chr=Rtlang) or (is_semi_char(cur_chr)) then
+ begin if check_semitic_font then goto big_switch; end
+ else if check_latin_font then goto big_switch;
+ if (cur_cmd=ex_space)or(space_factor=1000) then goto append_normal_space
+ else call_app_space;
+ end;
+mmode+ex_space: begin if cur_chr=Rtlang then set_semi_font else set_latin_font;
+ goto append_normal_space;
+ end;
+@z
+@x
+end; {of the big |case| statement}
+goto big_switch;
+@y
+end; {of the big |case| statement}
+goto big_switch;
+semi_main_loop: @<handle semitic character such as TeX main loop@>;
+@z
+ @x
+@d adjust_space_factor==@t@>@;@/
+ @y
+@d adjust_space_factor==@t@>@;@/
+ @z
+@x |main_loop|
+@<Append character |cur_chr|...@>=
+adjust_space_factor;@/
+@y
+@<Append character |cur_chr|...@>=
+ if check_latin_font then goto big_switch;@/
+ adjust_space_factor;
+ @<Reset last char params@>;@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1031]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if cur_cmd=char_given then goto main_loop_lookahead+1;
+@y
+if cur_cmd=char_given then goto post_lookahead_one;
+@z
+@x
+if cur_cmd=char_given then goto main_loop_lookahead+1;
+if cur_cmd=char_num then
+ begin scan_char_num; cur_chr:=cur_val; goto main_loop_lookahead+1;
+ end;
+if cur_cmd=no_boundary then bchar:=non_char;
+cur_r:=bchar; lig_stack:=null; goto main_lig_loop;
+main_loop_lookahead+1: adjust_space_factor;
+@y
+if cur_cmd=char_given then goto post_lookahead_one;
+if (cur_cmd=char_num) and (cur_chr = Lftlang) then
+ begin scan_char_num; cur_chr:=cur_val; goto post_lookahead_one;
+ end;
+if cur_cmd=no_boundary then bchar:=non_char;
+pre_lookahead_one:
+cur_r:=bchar; lig_stack:=null; goto main_lig_loop;
+main_loop_lookahead+1:
+ if is_semi_char(cur_chr) then goto pre_lookahead_one;
+post_lookahead_one: adjust_space_factor;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1041]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1041
+@<Append a normal inter-word space...@>=
+if space_skip=zero_glue then
+ begin @<Find the glue specification, |main_p|, for
+ text spaces in the current font@>;
+ temp_ptr:=new_glue(main_p);
+ end
+else temp_ptr:=new_param_glue(space_skip_code);
+link(tail):=temp_ptr; tail:=temp_ptr;
+goto big_switch
+@y 1041=================
+@<Append a normal inter-word space...@>=
+if is_semi_font (cur_font) then
+ if semi_space_skip=zero_glue then
+ begin @<Find the glue specification, |main_p|, for
+ text spaces in the current font@>;
+ temp_ptr:=new_glue(main_p);
+ end
+ else temp_ptr:=new_param_glue(semi_space_skip_code)
+else if space_skip=zero_glue then
+ begin @<Find the glue specification, |main_p|, for...@>;
+ temp_ptr:=new_glue(main_p);
+ end
+ else temp_ptr:=new_param_glue(space_skip_code);
+link(tail):=temp_ptr; tail:=temp_ptr;
+@<Reset last char params@>;@/
+goto big_switch
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1043]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1043
+procedure app_space; {handle spaces when |space_factor<>1000|}
+var@!q:pointer; {glue node}
+begin if (space_factor>=2000)and(xspace_skip<>zero_glue) then
+ q:=new_param_glue(xspace_skip_code)
+else begin if space_skip<>zero_glue then main_p:=space_skip
+ else @<Find the glue specification...@>;
+ main_p:=new_spec(main_p);
+ @<Modify the glue specification in |main_p| according to the space factor@>;
+ q:=new_glue(main_p); glue_ref_count(main_p):=null;
+ end;
+link(tail):=q; tail:=q;
+end;
+@y 1043===================
+procedure app_space(xsp,sp:halfword); {handle spaces when |space_factor<>1000|}
+var@!q:pointer; {glue node}
+begin if (space_factor>=2000)and(glue_par(xsp)<>zero_glue) then
+ q:=new_param_glue(xsp)
+else begin if glue_par(sp)<>zero_glue then main_p:=glue_par(sp)
+ else @<Find the glue specification...@>;
+ main_p:=new_spec(main_p);
+ @<Modify the glue specification in |main_p| according to the space factor@>;
+ q:=new_glue(main_p); glue_ref_count(main_p):=null;
+ end;
+link(tail):=q; tail:=q;
+@<Reset last char params@>;@/
+end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1049]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print("' in "); print_mode(mode);
+@y
+print("' in "); print_mode(mode); or_S(print("Ѿ"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [46.1050]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x
+("return to the right one by typing `I}' or `I$' or `I\par'.");@/
+error;
+end;
+ @y
+("return to the right one by typing `I}' or `I$' or `I\par'.");@/
+error;
+end;
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1056]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if abs(mode)=vmode then prev_depth:=ignore_depth
+ else if abs(mode)=hmode then space_factor:=1000;
+@y
+ if abs(mode)=vmode then
+ begin prev_depth:=ignore_depth; @<Set rule justification@>;@/
+ end
+ else if abs(mode)=hmode then space_factor:=1000;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1070]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if par_shape_ptr<>null then eq_define(par_shape_loc,shape_ref,null);
+@y
+if par_shape_ptr<>null then eq_define(par_shape_loc,shape_ref,null);
+@<Check parargraph justification@>;@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1071]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x hboxR
+@!@:hbox_}{\.{\\hbox} primitive@>
+ @y
+@!@:hbox_}{\.{\\hbox} primitive@>
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1072]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x hboxR
+ othercases print_esc("hbox")
+@y
+ vtop_code+hmode+1: print_esc("hboxR");
+ othercases print_esc("hbox")
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1076]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if adjust_tail<>null then
+@y
+ @<Set |cur_box| justification@>;@/
+ if adjust_tail<>null then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1078]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ leader_ptr(tail):=cur_box;
+@y
+ leader_ptr(tail):=cur_box;
+ if abs(mode)=vmode then @<Set |cur_box| justification@>;@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1081]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+cur_box:=tail; shift_amount(cur_box):=0;
+@y
+cur_box:=tail; shift_amount(cur_box):=0; subtype(cur_box):=min_quarterword;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1083]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x hboxR
+begin k:=cur_chr-vtop_code; saved(0):=box_context;
+@y
+begin k:=cur_chr-vtop_code; saved(0):=box_context;
+ if k>hmode then n:=1 else n:=0; k:=k-n;
+@z
+@x
+ if every_hbox<>null then begin_token_list(every_hbox,every_hbox_text);
+@y
+@<Test |n=1|@>;@/
+ if every_hbox<>null then begin_token_list(every_hbox,every_hbox_text);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1086]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1086
+if mode=-hmode then cur_box:=hpack(link(head),saved(2),saved(1))
+@y 1086==================
+if mode=-hmode then begin @<Test |auto_LR|@>;@/
+ cur_box:=hpack(link(head),saved(2),saved(1)); end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1090]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1090
+ vmode+ex_space,vmode+no_boundary:@t@>@;@/
+ begin back_input; new_graf(true);
+ end;
+
+@y 1090==================
+ vmode+ex_space,vmode+no_boundary,vmode+semi_given,vmode+LR:@t@>@;@/
+ begin back_input; new_graf(true);
+ end;
+
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1091]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |new_graf|
+if indented then
+ begin tail:=new_null_box; link(head):=tail; width(tail):=par_indent;@+
+ end;
+if every_par<>null then begin_token_list(every_par,every_par_text);
+@y 1091==================
+emit_par_LR;@/
+if indented then
+ begin tail_append(new_null_box); width(tail):=par_indent; @+
+ end;
+@<Insert |every_semi_par|@>;@/
+if every_par<>null then begin_token_list(every_par,every_par_text);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1108]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+procedure end_graf;
+begin if mode=hmode then
+ begin if head=tail then pop_nest {null paragraphs are ignored}
+ else line_break(widow_penalty);
+@y
+procedure LR_line_break(@!wp:integer);
+var p:pointer;
+begin p:=link(head);
+ while ((p<>null) and (whatsit_LR(p))) do p:=link(p);
+ if p<>null then line_break(wp)
+ else begin p:=link(head); pop_nest; flush_node_list (p); end;
+end;
+procedure end_graf;
+begin if mode=hmode then
+ begin if head=tail then pop_nest {null paragraphs are ignored}
+ else LR_line_break (widow_penalty);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1117] delete_last procedure checking auto_LR interference
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+procedure delete_last;
+label exit;
+var @!p,@!q:pointer; {run through the current list}
+@!m:quarterword; {the length of a replacement list}
+begin if (mode=vmode)and(tail=head) then
+ @<Apologize for inability to do the operation now,
+ unless \.{\\unskip} follows non-glue@>
+else begin if not is_char_node(tail) then if type(tail)=cur_chr then
+ begin q:=head;
+ repeat p:=q;
+ if not is_char_node(q) then if type(q)=disc_node then
+ begin for m:=1 to replace_count(q) do p:=link(p);
+ if p=tail then return;
+ end;
+ q:=link(p);
+ until q=tail;
+ link(p):=null; flush_node_list(tail); tail:=p;
+ end;
+ end;
+@y
+procedure delete_last;
+label exit;
+var @!p,@!q:pointer; {run through the current list}
+begin if (mode=vmode)and(tail=head) then
+ @<Apologize for inability to do the operation now,
+ unless \.{\\unskip} follows non-glue@>
+else begin p:=find_last (cur_chr);
+ if p<>null then begin
+ if (p=head) and ((link(p)=null) or (type(link(p))<>cur_chr)) then
+ begin q:=p; head:=link(p); end
+ else
+ if link(p)<>tail then begin q:=link(p); link(p):=link(q); p:=q; end
+ else begin q:=tail; tail:=p; end;
+ link(p):=null; flush_node_list(q);
+ end;
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1121] procedure unpackage adding left or right justify
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x Are this change necessary ???? (test it)
+while link(tail)<>null do tail:=link(tail);
+exit:end;
+@y
+if abs(mode)=vmode then
+ while link(tail)<>null do
+ begin tail:=link(tail);
+ if (type(tail)=rule_node) or
+ (type(tail)=hlist_node) or
+ (type(tail)=vlist_node) then
+ if subtype(tail)=min_quarterword then
+ if R_to_L_vbox then subtype(tail):=right_justify
+ else subtype(tail):=left_justify;
+ end
+else while link(tail)<>null do tail:=link(tail);
+exit:end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1119]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1119
+ and set |q| to the list's tail@>;
+p:=link(head); pop_nest;
+@y 1119==================
+ and set |q| to the list's tail@>;
+p:=link(head); pop_nest; if link(q)<>null then q:=link(q);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1122]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1122
+hmode+accent: make_accent;
+@y
+hmode+accent: if cur_chr=Lftlang then make_accent
+ else if cur_chr > Rtlang+1 then retain_acc := true
+ else make_semi_accent (cur_chr > Rtlang);
+@z
+@x
+@<Declare act...@>=
+procedure make_accent;
+@y
+\pTeXchg{Semitic accents are more complicated, so we left
+|make_accent| procedure for latin accents and define a new function
+to deal with semitic accents.}
+@<Declare act...@>=
+procedure make_accent;
+@z
+@x 1123
+begin scan_char_num; f:=cur_font; p:=new_character(f,cur_val);
+@y 1123==================
+begin scan_char_num; f:=cur_latif; p:=new_character(f,cur_val);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1124]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1124
+q:=null; f:=cur_font;
+@y 1124==================
+q:=null;
+ if (((cur_cmd=letter)or(cur_cmd=other_char)) and has_semi_font(cur_chr))
+ or ((cur_cmd=char_num)and(cur_chr=Rtlang))
+ or (cur_cmd=semi_given) then
+ begin f:=cur_semif; if cur_cmd=semi_given then cur_cmd:=char_given; end
+ else f:=cur_latif;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [47.1128]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if cur_tok=tab_token+"&" then
+@y
+if (cur_tok=tab_token+"&") or (cur_tok=tab_token+"") then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1139]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1139
+if every_math<>null then begin_token_list(every_math,every_math_text);
+end
+@y 1139==================
+if every_math<>null then begin_token_list(every_math,every_math_text);
+@<Insert |every_semi_math|@>;@/
+end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1145]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1145
+else begin line_break(display_widow_penalty);@/
+@y
+else begin LR_line_break(display_widow_penalty);@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1149]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if every_display<>null then begin_token_list(every_display,every_display_text);
+@y
+if every_display<>null then begin_token_list(every_display,every_display_text);
+@<Insert |every_semi_display|@>;@/
+@z
+@x
+ begin l:=hsize-abs(hang_indent);
+ if hang_indent>0 then s:=hang_indent@+else s:=0;
+@y
+ begin
+ if R_to_L_vbox then
+ if hang_indent>0 then begin l:=hsize-hang_indent; s:=0; end
+ else begin s:=-hang_indent; l:=hsize; end
+ else begin l:=hsize-abs(hang_indent);
+ if hang_indent>0 then s:=hang_indent@+else s:=0; end;
+@z
+@x
+ s:=mem[p-1].sc; l:=mem[p].sc;
+@y
+ s:=mem[p-1].sc; l:=mem[p].sc;
+ if R_to_L_vbox then if s > 0 then s := 0 else s:=-s;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1151]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1151
+@d fam_in_range==((cur_fam>=0)and(cur_fam<16))
+
+@<Declare act...@>=
+@y
+\pTeXchg{Using |dig_fam| for semitic digits in math and reporting illegal
+ semitic characters.}
+@d digfam_in_range==((dig_fam>=0)and(dig_fam<16))
+@d fam_in_range==((cur_fam>=0)and(cur_fam<16))
+
+@<Declare act...@>=
+@<Declare |report_math_illegal_case|@>;@/
+@#
+@z
+@x
+letter,other_char,char_given: begin c:=ho(math_code(cur_chr));
+ if c=@'100000 then
+ begin @<Treat |cur_chr| as an active character@>;
+ goto restart;
+ end;
+ end;
+char_num: begin scan_char_num; cur_chr:=cur_val; cur_cmd:=char_given;
+ goto reswitch;
+ end;
+@y 1151===================
+letter,other_char,char_given,semi_given: begin
+ if ((cur_cmd = semi_given) or
+ (is_semi_char(cur_chr) and (cur_cmd <> char_given))) then
+ begin report_math_illegal_case(false); goto restart; end;
+ c:=ho(math_code(cur_chr));
+ if c=@'100000 then
+ begin @<Treat |cur_chr| as an active character@>; goto restart; end;
+ end;
+char_num:
+ if cur_chr=Lftlang then begin scan_char_num; cur_chr:=cur_val;
+ cur_cmd:=char_given; goto reswitch; end
+ else begin scan_char_num; cur_chr:=cur_val;
+ report_math_illegal_case(false); goto restart; end;
+@z
+@x
+if (c>=var_code)and fam_in_range then fam(p):=cur_fam
+@y
+if (c>digvar_code)and digfam_in_range then fam(p):=dig_fam
+else if (c>=var_code)and fam_in_range then fam(p):=cur_fam
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1154]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1154
+mmode+letter,mmode+other_char,mmode+char_given:
+ set_math_char(ho(math_code(cur_chr)));
+mmode+char_num: begin scan_char_num; cur_chr:=cur_val;
+ set_math_char(ho(math_code(cur_chr)));
+ end;
+@y 1154===================
+mmode+letter,mmode+other_char: if not is_semi_char(cur_chr) then
+ set_math_char(ho(math_code(cur_chr)))
+ else report_math_illegal_case(true);
+mmode+char_given: set_math_char(ho(math_code(cur_chr)));
+mmode+semi_given: report_math_illegal_case(true);
+mmode+char_num: if cur_chr<>Lftlang then report_math_illegal_case(true)
+ else begin scan_char_num; cur_chr:=cur_val;
+ set_math_char(ho(math_code(cur_chr))) end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1155]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1155
+begin if c>=@'100000 then
+@y
+begin if c=@'100000 then
+@z
+@x
+ if c>=var_code then
+ begin if fam_in_range then fam(nucleus(p)):=cur_fam;
+@y
+ if c>=var_code then
+ begin if (c>digvar_code)and digfam_in_range then fam(nucleus(p)):=dig_fam
+else if fam_in_range then fam(nucleus(p)):=cur_fam;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1160]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ letter,other_char: cur_val:=del_code(cur_chr);
+@y
+ letter,other_char: if is_semi_char(cur_chr) then cur_val:=-1
+ else cur_val:=del_code(cur_chr);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1165]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x using dig_fam
+if (cur_val>=var_code)and fam_in_range then fam(accent_chr(tail)):=cur_fam
+else fam(accent_chr(tail)):=(cur_val div 256) mod 16;
+@y
+if (cur_val>digvar_code)and digfam_in_range then fam(accent_chr(tail)):=dig_fam
+else if (cur_val>=var_code)and fam_in_range then fam(accent_chr(tail)):=cur_fam
+else fam(accent_chr(tail)):=(cur_val div 256) mod 16;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1196]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x |after_math|
+cur_mlist:=p; cur_style:=text_style; mlist_penalties:=(mode>0); mlist_to_hlist;
+link(tail):=link(temp_head);
+while link(tail)<>null do tail:=link(tail);
+@y 1196==================
+@<Append a |bgn_L| to the tail of the current mlist@>;
+cur_mlist:=p; cur_style:=text_style;
+mlist_penalties:=(mode>0); mlist_to_hlist;
+link(tail):=link(temp_head);
+while link(tail)<>null do tail:=link(tail);
+@<Append an |end_L| to the tail of the current mlist@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1200]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x implementing |after_every_display| primitive
+@<Scan an optional space@>;
+if nest_ptr=1 then build_page;
+@y
+emit_par_LR;@/
+@<Scan an optional space@>;
+if nest_ptr=1 then build_page;
+@<Insert |after_every_display|@>;@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1203] @<Append the glue or equation number preceding the display@>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x MUST BE CHECKED --> subtype(a):=left_justify;
+if l and(e=0) then {it follows that |type(a)=hlist_node|}
+ begin shift_amount(a):=s; append_to_vlist(a);
+ tail_append(new_penalty(inf_penalty));
+@y
+if l and(e=0) then {it follows that |type(a)=hlist_node|}
+ begin shift_amount(a):=s; append_to_vlist(a);
+ subtype(a):=left_justify; {the equation number should be left justified}
+ tail_append(new_penalty(inf_penalty));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1204] @<Append the display and perhaps also the equation number@>
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%INSTEAD OF USING REFLECT COMMANDS I WANT TO RE_ORGANIZE THE DVI FILE IN PLACE
+@x 1204
+shift_amount(b):=s+d; append_to_vlist(b)
+@y 1204==================
+shift_amount(b):=s+d; append_to_vlist(b);
+subtype(b):=left_justify {formula are always left justify }
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [48.1205]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ shift_amount(a):=s+z-width(a);
+ append_to_vlist(a);
+@y
+ shift_amount(a):=s+z-width(a); append_to_vlist(a); subtype(a):=left_justify;
+ {the equation number should be right justified, but the |shift_amount|
+ has been set to do the job}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1210]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+%Adding to Big switch of main control
+@x 1210
+any_mode(set_interaction):prefixed_command;
+@y 1210==================
+any_mode(LR_setting),
+any_mode(switch_font),
+any_mode(let_name),
+any_mode(set_interaction):prefixed_command;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1212]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print_cmd_chr(cur_cmd,cur_chr); print_char("'");
+@y
+print_cmd_chr(cur_cmd,cur_chr); L_or_S(print_char("'"))(print("Ѿ"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1213]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin print_err("You can't use `"); print_esc("long"); print("' or `");
+@y
+ begin LorRprt_err("You can't use `","ҽ");
+ print_esc("long"); print("' or `");
+@z
+@x
+ print_cmd_chr(cur_cmd,cur_chr); print_char("'");
+@y
+ print_cmd_chr(cur_cmd,cur_chr);
+ L_or_S(print_char("'"))(print("Ͼս"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1215]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Declare subprocedures for |prefixed_command|@>=
+procedure get_r_token;
+@y
+@<Declare subprocedures for |prefixed_command|@>=
+@<Declare \pTeX{} subprocedures for |prefixed_command|@>@/
+procedure get_r_token;
+@z
+@x
+until cur_tok<>space_token;
+@y
+until (cur_tok<>space_token) and (cur_tok<>semi_space_token);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1217]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1217
+set_font: define(cur_font_loc,data,cur_chr);
+@y 1217=================
+set_font: begin define(cur_font_loc,data,cur_chr);
+ if is_semi_font (cur_chr) then define(cur_semif_loc,data,cur_chr)
+ else define(cur_latif_loc,data,cur_chr); end;
+switch_font: begin if (cur_chr<>0) and has_twin_font (cur_semif) then
+ begin cur_chr:=fontwin[cur_semif]; define(cur_semif_loc,data,cur_chr); end
+ else cur_chr := cur_semif; define(cur_font_loc,data,cur_chr); end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1221]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ if cur_tok=other_token+"=" then
+@y
+ if cur_eq_other("=") then
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1222]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1222
+@d toks_def_code=6 {|shorthand_def| for \.{\\toksdef}}
+@y 1222=================
+@d toks_def_code=6 {|shorthand_def| for \.{\\toksdef}}
+@d semi_char_def_code=7 {|shorthand_def| for \.{\\semichardef}}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1222]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1222
+primitive("toksdef",shorthand_def,toks_def_code);@/
+@!@:toks_def_}{\.{\\toksdef} primitive@>
+@y 1222=================
+primitive("toksdef",shorthand_def,toks_def_code);@/
+@!@:toks_def_}{\.{\\toksdef} primitive@>
+primitive("semichardef",shorthand_def,semi_char_def_code);@/
+@!@:semi_char_def_}{\.{\\semichardef} primitive@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1223]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ othercases print_esc("toksdef")
+ endcases;
+char_given: begin print_esc("char"); print_hex(chr_code);
+ end;
+math_given: begin print_esc("mathchar"); print_hex(chr_code);
+@y
+ toks_def_code: print_esc("toksdef");
+ othercases print_esc("semichardef");
+ endcases;
+semi_given: begin print_esc("semichar");
+ L_or_S(print_hex(chr_code))(print_int(chr_code));
+ end;
+char_given: begin print_esc("char");
+ L_or_S(print_hex(chr_code))(print_int(chr_code));
+ end;
+math_given: begin print_esc("mathchar");
+ L_or_S(print_hex(chr_code))(print_int(chr_code));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1224]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1224
+ char_def_code: begin scan_char_num; define(p,char_given,cur_val);
+@y 1224=================
+ semi_char_def_code: begin scan_char_num;
+ define(p,semi_given,cur_val); end;
+ char_def_code: begin scan_char_num; define(p,char_given,cur_val);
+@z
+@x
+ othercases begin scan_eight_bit_int;
+@y
+ othercases begin if (n <> count_def_code) and (n <> dimen_def_code) then
+ scan_eight_bit_int
+ else scan_nine_bit_int;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1226]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ info(q):=right_brace_token+"}";
+ q:=get_avail; info(q):=left_brace_token+"{";
+@y
+ L_or_S(info(q):=right_brace_token+"}")(info(q):=right_brace_token+"");
+ q:=get_avail;
+ L_or_S(info(q):=left_brace_token+"{")(info(q):=left_brace_token+"");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1230]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1230
+@!@:cat_code_}{\.{\\catcode} primitive@>
+@y 1230=================
+@!@:cat_code_}{\.{\\catcode} primitive@>
+primitive("lcode",def_code,locate_code_base);
+@!@:locate_code_}{\.{\\lcode} primitive@>
+primitive("accfactor",def_code,acc_factor_base);
+@!@:acc_factor_}{\.{\\accfactor} primitive@>
+primitive("eqchar",def_code,eq_char_base);@/
+@!@:eqch_}{\.{\\eqchar} primitive@>
+primitive("eqcharif",def_code,eq_charif_base);@/
+@!@:eqif_}{\.{\\eqcharif} primitive@>
+primitive("jattrib",def_code,join_attrib_base);
+@!@:join_attrib_}{\.{\\jattrib} primitive@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1231]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ else print_esc("delcode");
+@y
+ else if chr_code=locate_code_base then print_esc("lcode")
+ else if chr_code=acc_factor_base then print_esc("accfactor")
+ else if chr_code=eq_char_base then print_esc("eqchar")
+ else if chr_code=eq_charif_base then print_esc("eqcharif")
+ else if chr_code=join_attrib_base then print_esc("jattrib")
+ else print_esc("delcode");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1232]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print_int(n);
+@y
+ print_int(n); or_S(print("׾"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1233]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1233
+@ @<Let |n| be the largest...@>=
+if cur_chr=cat_code_base then n:=max_char_code
+else if cur_chr=math_code_base then n:=@'100000
+@y 1233=================
+@
+\pTeXchg{Our new tables has different maximum values.}
+@<Let |n| be the largest...@>=
+if cur_chr=cat_code_base then n:=max_char_code
+else if cur_chr=math_code_base then n:=@'110000
+else @<Check semitic char tables@>@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1236]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+else if scan_keyword("by") then do_nothing; {optional `\.{by}'}
+@y
+else if (scan_keyword("by")) or
+ ((q=multiply) and (scan_keyword(""))) or
+ ((q=advance) and (scan_keyword(""))) or
+ ((q=divide) and (scan_keyword(""))) then do_nothing;
+ {optional `\.{by}'}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1237]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print("' after "); print_cmd_chr(q,0);
+@y
+ print("' after "); print_cmd_chr(q,0); or_S(print("Ѿ"));
+@z
+@x
+p:=cur_chr; scan_eight_bit_int;
+@y
+p:=cur_chr;
+if (p <> int_val) and (p <> dimen_val) then scan_eight_bit_int
+ else scan_nine_bit_int;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1244]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ begin print_err("Bad "); print_esc("prevgraf");
+@y
+ begin LorRprt_err("Bad ",""); print_esc("prevgraf"); or_S(print("վ"));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1251]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+hyph_data: if chr_code=1 then print_esc("patterns")
+ else print_esc("hyphenation");
+@y
+hyph_data: if chr_code=1 then print_esc("patterns")
+ else print_esc("hyphenation");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1253]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1253
+assign_font_int: begin n:=cur_chr; scan_font_ident; f:=cur_val;
+ scan_optional_equals; scan_int;
+ if n=0 then hyphen_char[f]:=cur_val@+else skew_char[f]:=cur_val;
+ end;
+@y 1253===================
+assign_font_int: begin n:=cur_chr; scan_font_ident;
+ if n=3 then
+ if is_semi_font (cur_val) then fontwin[cur_val]:=twin_tag
+ else begin print_err("Invalid font identifier, ignored");
+ help1("Latin fonts can't be converted to twin fonts.");
+ error;
+ end
+ else begin f:=cur_val; scan_optional_equals;
+ if n=2 then
+ if is_latin_font (f) then
+ begin print_err("Invalid font identifier, ignored.");
+ help1("Latin fonts can't have twin fonts.");
+ error;
+ end
+ else begin @<Get the next non-blank non-call token@>;
+ back_input; scan_font_ident;
+ if is_semi_font (cur_val) then
+ begin fontwin[cur_val]:=twin_tag;
+ fontwin[f]:=cur_val;
+ end
+ else begin print_err("Invalid font identifier, ignored.");
+ help1("Latin fonts can't be twin fonts.");
+ error;
+ end;
+ end
+ else begin scan_int;
+ if n=0 then hyphen_char[f]:=cur_val@+else skew_char[f]:=cur_val;
+ end;
+ end;
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1254]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1254
+@!@:skew_char_}{\.{\\skewchar} primitive@>
+@y 1254===================
+@!@:skew_char_}{\.{\\skewchar} primitive@>
+primitive("twinfont",assign_font_int,2);
+@!@:twin_font_}{\.{\\twinfont} primitive@>
+primitive("maketwin",assign_font_int,3);
+@!@:make_twin_}{\.{\\maketwin} primitive@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1255]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ else print_esc("skewchar");
+@y
+ else if chr_code=1 then print_esc("skewchar")
+ else if chr_code=2 then print_esc("twinfont")
+ else print_esc("maketwin");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1256]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1256
+def_font: new_font(a);
+@y 1256===================
+def_font: if cur_chr>Rtlang then
+ begin print_err("Improper use of `\activefont', ignored");
+ help3("Control sequence `\activefont' is only for inspection,")@/
+ ("not for font defining. I deleted your command.")@/
+ ("If you really want to define a font, just type `I\font' or `I\semifont'.");
+ error;
+ end
+else if cur_chr=Lftlang then new_font(a) else new_semi_font(a);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1257]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Declare subprocedures for |prefixed_command|@>=
+procedure new_font(@!a:small_number);
+@y
+@ @<Declare subprocedures for |prefixed_command|@>=
+@<Declare \pTeX{} font procedures for |prefixed_command|@>@/
+procedure new_font(@!a:small_number);
+@z
+@x
+f:=read_font_info(u,cur_name,cur_area,s);
+@y
+f:=read_font_info(u,cur_name,cur_area,s); fontwin[f]:=null_font;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1261]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+set_font:begin print("select font "); slow_print(font_name[chr_code]);
+@y
+switch_font:begin
+ if cur_chr <> 0 then print("switch twin font ")
+ else print("switch base font ");
+ slow_print(font_name[chr_code]);
+ if font_size[chr_code]<>font_dsize[chr_code] then
+ begin print(" at "); print_scaled(font_size[chr_code]); print("pt");
+ end;
+ end;
+set_font:begin if is_latin_font (chr_code) then
+ print("select latin font ")
+ else if is_twin_font (chr_code) then
+ print("select twin semitic font ")
+ else print("select main semitic font ");
+ slow_print(font_name[chr_code]);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1272]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+primitive("openin",in_stream,1);
+@!@:open_in_}{\.{\\openin} primitive@>
+@y
+primitive("openin",in_stream,L_to_R);
+@!@:open_in_}{\.{\\openin} primitive@>
+primitive("openinR",in_stream,R_to_L);
+@!@:open_in_R_}{\.{\\openinR} primitive@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1273]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ else print_esc("openin");
+@y
+ else if chr_code=L_to_R then print_esc("openin")
+ else print_esc("openinR");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1275] a_open_in of \read file needs path specifier
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+var c:0..1; {1 for \.{\\openin}, 0 for \.{\\closein}}
+@y
+var c:0..R_to_L; {1 for \.{\\openin}, 0 for \.{\\closein}}
+@z
+@x
+ if a_open_in(read_file[n]) then read_open[n]:=just_open;
+@y
+ if a_open_in(read_file[n],read_path_spec) then
+ begin read_open[n]:=just_open; read_file_direction[n]:=c; end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1278]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x
+message: if chr_code=0 then print_esc("message")
+ else print_esc("errmessage");
+ @y
+message: if chr_code=0 then print_esc("message")
+ else print_esc("errmessage");
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [49.1295]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+long_call: print_esc("long macro");
+outer_call: print_esc("outer macro");
+long_outer_call: begin print_esc("long"); print_esc("outer macro");
+ end;
+end_template: print_esc("outer endtemplate");
+@y
+long_call:
+ L_or_S(print_esc("long macro"))(print(""); print_esc(""));
+outer_call:
+ L_or_S(print_esc("outer macro"))(print(""); print_esc(""));
+long_outer_call:
+ begin L_or_S(print_esc("long"); print_esc("outer macro"))
+ (print(""); print_esc(""); print_esc(""));
+ end;
+end_template:
+ L_or_S(print_esc("outer endtemplate"))
+ (print(""); print_esc(""));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1302] Eliminate unused variable w in |store_fmt_file|
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@!x: integer; {something to dump}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something to dump}
+@!saved_lang:language_type; {the language of \TeX\ messages.}
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1303] Eliminate unused variable w in |load_fmt_file|
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x wterm_ln --> bwterm_ln
+ wterm_ln('---! Must increase the ',#);
+@y
+ bwterm_ln('---! Must increase the ',#);
+@z
+@x
+@!x: integer; {something undumped}
+@!w: four_quarters; {four ASCII codes}
+@y
+@!x: integer; {something undumped}
+@z
+@x wterm_ln --> bwterm_ln
+ wterm_ln('(Fatal format file error; I''m stymied)');
+@y
+ bwterm_ln('(Fatal format file error; I''m stymied)');
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.passim] Fix reading and writing fmt_file for C
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1305
+@d dump_wd(#)==begin fmt_file^:=#; put(fmt_file);@+end
+@d dump_int(#)==begin fmt_file^.int:=#; put(fmt_file);@+end
+@d dump_hh(#)==begin fmt_file^.hh:=#; put(fmt_file);@+end
+@d dump_qqqq(#)==begin fmt_file^.qqqq:=#; put(fmt_file);@+end
+@y 1305
+@d dump_wd(#)==put_fmt_word(#)
+@d dump_int(#)==put_fmt_int(#)
+@d dump_hh(#)==put_fmt_hh(#)
+@d dump_qqqq(#)==put_fmt_qqqq(#)
+@z
+@x 1306
+@d undump_wd(#)==begin get(fmt_file); #:=fmt_file^;@+end
+@d undump_int(#)==begin get(fmt_file); #:=fmt_file^.int;@+end
+@d undump_hh(#)==begin get(fmt_file); #:=fmt_file^.hh;@+end
+@d undump_qqqq(#)==begin get(fmt_file); #:=fmt_file^.qqqq;@+end
+@y 1306
+@d undump_wd(#)==get_fmt_word(#)
+@d undump_int(#)==get_fmt_int(#)
+@d undump_hh(#)==get_fmt_hh(#)
+@d undump_qqqq(#)==get_fmt_qqqq(#)
+@z
+@x 1308
+x:=fmt_file^.int;
+@y 1308
+get_fmt_int(x); {This is reading the first word of the fmt file}
+@z
+########################################################################
+% Make dumping/undumping more efficient in C
+########################################################################
+@x 1309
+for k:=0 to str_ptr do dump_int(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin dump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; dump_four_ASCII;
+@y 1309
+dump_things(str_start[0], str_ptr+1);
+dump_things(str_pool[0], pool_ptr);
+dump_things(alt_str[0], str_ptr+1);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1309]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print_ln; print_int(str_ptr); print(" strings of total length ");
+print_int(pool_ptr)
+@y
+print_ln; print_int(str_ptr);
+print(" strings of total length ");
+print_int(pool_ptr)
+@z
+########################################################################
+% Make dumping/undumping more efficient in C
+########################################################################
+@x 1310
+for k:=0 to str_ptr do undump(0)(pool_ptr)(str_start[k]);
+k:=0;
+while k+4<pool_ptr do
+ begin undump_four_ASCII; k:=k+4;
+ end;
+k:=pool_ptr-4; undump_four_ASCII;
+@y 1310
+undump_things(str_start[0], str_ptr+1);
+undump_things(str_pool[0], pool_ptr);
+undump_things(alt_str[0], str_ptr+1);
+@z
+@x 1311
+repeat for k:=p to q+1 do dump_wd(mem[k]);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+for k:=p to lo_mem_max do dump_wd(mem[k]);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+for k:=hi_mem_min to mem_end do dump_wd(mem[k]);
+@y 1311
+repeat
+ dump_things(mem[p], q+2-p);
+x:=x+q+2-p; var_used:=var_used+q-p;
+p:=q+node_size(q); q:=rlink(q);
+until q=rover;
+var_used:=var_used+lo_mem_max-p; dyn_used:=mem_end+1-hi_mem_min;@/
+dump_things(mem[p], lo_mem_max+1-p);
+x:=x+lo_mem_max+1-p;
+dump_int(hi_mem_min); dump_int(avail);
+dump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+########################################################################
+% Make dumping/undumping more efficient in C
+########################################################################
+@x 1312
+repeat for k:=p to q+1 do undump_wd(mem[k]);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+for k:=p to lo_mem_max do undump_wd(mem[k]);
+@y 1312
+repeat
+ undump_things(mem[p], q+2-p);
+p:=q+node_size(q);
+if (p>lo_mem_max)or((q>=rlink(q))and(rlink(q)<>rover)) then goto bad_fmt;
+q:=rlink(q);
+until q=rover;
+undump_things(mem[p], lo_mem_max+1-p);
+@z
+@x 1312
+for k:=hi_mem_min to mem_end do undump_wd(mem[k]);
+@y 1312
+undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min);
+@z
+@x 1315
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y 1315
+dump_things(eqtb[k], l-k);
+@z
+@x 1316
+while k<l do
+ begin dump_wd(eqtb[k]); incr(k);
+ end;
+@y 1316
+dump_things(eqtb[k], l-k);
+@z
+@x 1317
+for j:=k to k+x-1 do undump_wd(eqtb[j]);
+@y 1317
+undump_things(eqtb[k], x);
+@z
+@x 1318
+for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]);
+@y 1318
+dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+########################################################################
+% Make dumping/undumping more efficient in C
+########################################################################
+@x 1319
+for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]);
+@y 1319
+undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used);
+@z
+@x 1320
+for k:=0 to fmem_ptr-1 do dump_wd(font_info[k]);
+dump_int(font_ptr);
+for k:=null_font to font_ptr do
+ @<Dump the array info for internal font number |k|@>;
+@y 1320
+@<Dump the array info for internal font number |k|@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1320]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if font_ptr<>font_base+1 then print_char("s")
+@y
+if font_ptr<>font_base+1 then L_or(print_char("s"))
+@z
+########################################################################
+% Make dumping/undumping more efficient in C
+########################################################################
+@x 1321
+for k:=0 to fmem_ptr-1 do undump_wd(font_info[k]);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+for k:=null_font to font_ptr do
+ @<Undump the array info for internal font number |k|@>
+@y 1321
+@<Undump the array info for internal font number |k|@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1322] Writing font info (almost at end of dump stuff)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Knuth's code writes all the information relevant to a single font
+% in the same section of the fmt file. But it's a lot faster to
+% write the arrays of information out, one whole array at a time.
+% So that's the way we handle dumping and undumping font info.
+@x 1322
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_qqqq(font_check[k]);
+dump_int(font_size[k]);
+dump_int(font_dsize[k]);
+dump_int(font_params[k]);@/
+dump_int(hyphen_char[k]);
+dump_int(skew_char[k]);@/
+dump_int(font_name[k]);
+dump_int(font_area[k]);@/
+dump_int(font_bc[k]);
+dump_int(font_ec[k]);@/
+dump_int(char_base[k]);
+dump_int(width_base[k]);
+dump_int(height_base[k]);@/
+dump_int(depth_base[k]);
+dump_int(italic_base[k]);
+dump_int(lig_kern_base[k]);@/
+dump_int(kern_base[k]);
+dump_int(exten_base[k]);
+dump_int(param_base[k]);@/
+dump_int(font_glue[k]);@/
+dump_int(bchar_label[k]);
+dump_int(font_bchar[k]);
+dump_int(font_false_bchar[k]);@/
+print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+print_file_name(font_name[k],font_area[k],"");
+if font_size[k]<>font_dsize[k] then
+ begin print(" at "); print_scaled(font_size[k]); print("pt");
+ end;
+end
+@y 1322================
+@ @<Dump the array info for internal font number |k|@>=
+begin dump_things(font_info[0], fmem_ptr);
+dump_int(font_ptr);
+dump_things(font_check[null_font], font_ptr+1-null_font);
+dump_things(font_size[null_font], font_ptr+1-null_font);
+dump_things(font_dsize[null_font], font_ptr+1-null_font);
+dump_things(font_params[null_font], font_ptr+1-null_font);
+dump_things(hyphen_char[null_font], font_ptr+1-null_font);
+dump_things(skew_char[null_font], font_ptr+1-null_font);
+dump_things(font_name[null_font], font_ptr+1-null_font);
+dump_things(font_area[null_font], font_ptr+1-null_font);
+dump_things(font_bc[null_font], font_ptr+1-null_font);
+dump_things(font_ec[null_font], font_ptr+1-null_font);
+dump_things(char_base[null_font], font_ptr+1-null_font);
+dump_things(width_base[null_font], font_ptr+1-null_font);
+dump_things(height_base[null_font], font_ptr+1-null_font);
+dump_things(depth_base[null_font], font_ptr+1-null_font);
+dump_things(italic_base[null_font], font_ptr+1-null_font);
+dump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+dump_things(kern_base[null_font], font_ptr+1-null_font);
+dump_things(exten_base[null_font], font_ptr+1-null_font);
+dump_things(param_base[null_font], font_ptr+1-null_font);
+dump_things(font_glue[null_font], font_ptr+1-null_font);
+dump_things(bchar_label[null_font], font_ptr+1-null_font);
+dump_things(font_bchar[null_font], font_ptr+1-null_font);
+dump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+dump_things(fontwin[null_font], font_ptr+1-null_font);
+dump_things(font_mid_rule[null_font], font_ptr+1-null_font);
+for k:=null_font to font_ptr do
+ begin
+ print_nl("\font"); print_esc(font_id_text(k)); print_char("=");
+ print_file_name(font_name[k],font_area[k],"");
+ if font_size[k]<>font_dsize[k] then begin
+ print(" at "); print_scaled(font_size[k]);print("pt");
+ end;
+ end;
+end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1323] Reading font info for C (Nearly done with undump stuff)
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1323
+@ @<Undump the array info for internal font number |k|@>=
+begin undump_qqqq(font_check[k]);@/
+undump_int(font_size[k]);
+undump_int(font_dsize[k]);
+undump(min_halfword)(max_halfword)(font_params[k]);@/
+undump_int(hyphen_char[k]);
+undump_int(skew_char[k]);@/
+undump(0)(str_ptr)(font_name[k]);
+undump(0)(str_ptr)(font_area[k]);@/
+undump(0)(255)(font_bc[k]);
+undump(0)(255)(font_ec[k]);@/
+undump_int(char_base[k]);
+undump_int(width_base[k]);
+undump_int(height_base[k]);@/
+undump_int(depth_base[k]);
+undump_int(italic_base[k]);
+undump_int(lig_kern_base[k]);@/
+undump_int(kern_base[k]);
+undump_int(exten_base[k]);
+undump_int(param_base[k]);@/
+undump(min_halfword)(lo_mem_max)(font_glue[k]);@/
+undump(0)(fmem_ptr-1)(bchar_label[k]);
+undump(min_quarterword)(non_char)(font_bchar[k]);
+undump(min_quarterword)(non_char)(font_false_bchar[k]);
+end
+@y 1323===========
+@ The way this is done in C makes the reference to
+the internal font number meaningless, but putting the code
+here preserves the association with the WEB modules.
+
+@<Undump the array info for internal font number |k|@>=
+begin undump_things(font_info[0], fmem_ptr);
+undump_size(font_base)(font_max)('font max')(font_ptr);
+undump_things(font_check[null_font], font_ptr+1-null_font);
+undump_things(font_size[null_font], font_ptr+1-null_font);
+undump_things(font_dsize[null_font], font_ptr+1-null_font);
+undump_things(font_params[null_font], font_ptr+1-null_font);
+undump_things(hyphen_char[null_font], font_ptr+1-null_font);
+undump_things(skew_char[null_font], font_ptr+1-null_font);
+undump_things(font_name[null_font], font_ptr+1-null_font);
+undump_things(font_area[null_font], font_ptr+1-null_font);
+undump_things(font_bc[null_font], font_ptr+1-null_font);
+undump_things(font_ec[null_font], font_ptr+1-null_font);
+undump_things(char_base[null_font], font_ptr+1-null_font);
+undump_things(width_base[null_font], font_ptr+1-null_font);
+undump_things(height_base[null_font], font_ptr+1-null_font);
+undump_things(depth_base[null_font], font_ptr+1-null_font);
+undump_things(italic_base[null_font], font_ptr+1-null_font);
+undump_things(lig_kern_base[null_font], font_ptr+1-null_font);
+undump_things(kern_base[null_font], font_ptr+1-null_font);
+undump_things(exten_base[null_font], font_ptr+1-null_font);
+undump_things(param_base[null_font], font_ptr+1-null_font);
+undump_things(font_glue[null_font], font_ptr+1-null_font);
+undump_things(bchar_label[null_font], font_ptr+1-null_font);
+undump_things(font_bchar[null_font], font_ptr+1-null_font);
+undump_things(font_false_bchar[null_font], font_ptr+1-null_font);
+undump_things(fontwin[null_font], font_ptr+1-null_font);
+undump_things(font_mid_rule[null_font], font_ptr+1-null_font);
+end
+@z
+@x
+print_ln; print_int(hyph_count); print(" hyphenation exception");
+if hyph_count<>1 then print_char("s");
+@y
+print_ln; print_int(hyph_count); L_or_S(print(" hyphenation exception");
+ if hyph_count<>1 then print_char("s"))
+(if hyph_count<>1 then print("þս") else print("ս");
+ print("Ġ"));
+@z
+@x 1324
+for k:=0 to trie_max do dump_hh(trie[k]);
+dump_int(trie_op_ptr);
+for k:=1 to trie_op_ptr do
+ begin dump_int(hyf_distance[k]);
+ dump_int(hyf_num[k]);
+ dump_int(hyf_next[k]);
+ end;
+@y 1324
+dump_things(trie[0], trie_max+1);
+dump_int(trie_op_ptr);
+dump_things(hyf_distance[min_quarterword+1], trie_op_ptr-min_quarterword);
+dump_things(hyf_num[min_quarterword+1], trie_op_ptr-min_quarterword);
+dump_things(hyf_next[min_quarterword+1], trie_op_ptr-min_quarterword);
+@z
+@x
+if trie_op_ptr<>1 then print_char("s");
+@y
+if trie_op_ptr<>1 then L_or(print_char("s"));
+@z
+@x 1325
+for k:=0 to j do undump_hh(trie[k]);
+@y
+undump_things(trie[0], j+1);
+@z
+@x
+for k:=1 to j do
+ begin undump(0)(63)(hyf_distance[k]); {a |small_number|}
+ undump(0)(63)(hyf_num[k]);
+ undump(min_quarterword)(max_quarterword)(hyf_next[k]);
+ end;
+@y 1325
+undump_things(hyf_distance[1], j);
+undump_things(hyf_num[1], j);
+undump_things(hyf_next[1], j);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [50.1328]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+print(" (preloaded format="); print(job_name); print_char(" ");
+print_int(year); print_char(".");
+print_int(month); print_char("."); print_int(day); print_char(")");
+@y
+ saved_lang := cur_speech; cur_speech := Lftlang;
+ print(" (preloaded format="); print(job_name); print_char(" ");
+ print_int(year); print_char(".");
+ print_int(month); print_char("."); print_int(day); print_char(")");
+ cur_speech := saved_lang;
+@z
+@x
+pack_job_name(format_extension);
+@y
+selector:=new_string;
+ cur_speech := Rtlang;
+ print("Ͼב"); print(jobname); print_char("");
+ print_int(semi_day); print_char(""); print_int(semi_month);
+ print_char(""); print_int(semi_year mod 100); print_char("");
+ cur_speech := saved_lang;
+ if interaction=batch_mode then selector:=log_only
+ else selector:=term_and_log;
+str_room(1);
+k:=make_string;
+alt_str [k] := -format_ident; alt_str [format_ident] := k;
+pack_job_name(format_extension);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1332] uexit() call depends on `history'; procedure-ize main prog;
+% Also, add call to set_paths
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ Now this is really it: \TeX\ starts and ends here.
+
+The initial test involving |ready_already| should be deleted if the
+\PASCAL\ runtime system is smart enough to detect such a ``mistake.''
+@y
+@ Now this is really it: \TeX\ starts and ends here.
+
+Use the value of |history| to determine what exit-code to use. We use
+1 if |history <> spotless| and 0 otherwise.
+@z
+@x
+@p begin @!{|start_here|}
+history:=fatal_error_stop; {in case we quit during initialization}
+t_open_out; {open the terminal for output}
+if ready_already=314159 then goto start_of_TEX;
+@y
+@p procedure tex_body(speech:language_type;direction:direction_type);
+label @<Labels in the outer block@>@/
+var bufindx:0..buf_size; {an index used in a for loop below}
+@!virtex_ident:str_number;
+begin @!{|start_here|}
+history:=fatal_error_stop; {in case we quit during initialization}
+rawprtflg:=0; eq_show:=false; LRsp:=null; SPCsp:=null; LJsp := null;
+t_open_out; {open the terminal for output}
+set_paths; {get default file paths from the Unix environment}
+virtex_ident:=max_strings + 1;
+if ready_already=314159 then goto start_of_TEX;
+@z
+@x wterm_ln --> bwterm_ln
+ begin wterm_ln('Ouch---my internal constants have been clobbered!',
+@y
+ begin bwterm_ln('Ouch---my internal constants have been clobbered!',
+@z
+@x set speech and direction if specified in command line
+start_of_TEX: @<Initialize the output routines@>;
+@y
+start_of_TEX:
+if speech <> 0 then geq_define (cur_speech_loc,data,speech);
+if direction <> 0 then begin
+ geq_define (vbox_justify_loc,data,direction);
+ geq_define (cur_direction_loc,data,direction); end;
+@<Reset directinal variables@>;
+@<Initialize the output routines@>;
+@z
+@x
+final_end: ready_already:=0;
+end.
+@y
+final_end: do_final_end;
+end {|tex_body|};
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1333] omit call to wake_up_terminal on normal termination
+% print new line before termination; switch to editor if nec.
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+wake_up_terminal; @<Finish the \.{DVI} file@>;
+if log_opened then
+ begin wlog_cr; a_close(log_file); selector:=selector-2;
+ if selector=term_only then
+ begin print_nl("Transcript written on ");
+@.Transcript written...@>
+ slow_print(log_name); print_char(".");
+ end;
+ end;
+end;
+@y
+@<Finish the \.{DVI} file@>;
+if log_opened then
+ begin cwlog_cr; @!stat check_last_options; tats
+ a_close(log_file); selector:=selector-2;
+ if selector=term_only then
+ begin print_nl("Transcript written on ");
+@.Transcript written...@>
+ slow_print(log_name); L_or_S(print_char("."))(print(""));
+ end;
+ end;
+print_ln;
+if (edit_name_start<>0) and (interaction>batch_mode) then
+
+calledit(str_pool, edit_name_start, edit_name_length,
+ edit_line, edit_direction);
+end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1334]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@<Output statistics...@>=
+if log_opened then
+ begin wlog_ln(' ');
+ wlog_ln('Here is how much of TeX''s memory',' you used:');
+@.Here is how much...@>
+ wlog(' ',str_ptr-init_str_ptr:1,' string');
+ if str_ptr<>init_str_ptr+1 then wlog('s');
+ wlog_ln(' out of ', max_strings-init_str_ptr:1);@/
+ wlog_ln(' ',pool_ptr-init_pool_ptr:1,' string characters out of ',
+ pool_size-init_pool_ptr:1);@/
+ wlog_ln(' ',lo_mem_max-mem_min+mem_end-hi_mem_min+2:1,@|
+ ' words of memory out of ',mem_end+1-mem_min:1);@/
+ wlog_ln(' ',cs_count:1,' multiletter control sequences out of ',
+ hash_size:1);@/
+ wlog(' ',fmem_ptr:1,' words of font info for ',
+ font_ptr-font_base:1,' font');
+ if font_ptr<>font_base+1 then wlog('s');
+ wlog_ln(', out of ',font_mem_size:1,' for ',font_max-font_base:1);@/
+ wlog(' ',hyph_count:1,' hyphenation exception');
+ if hyph_count<>1 then wlog('s');
+ wlog_ln(' out of ',hyph_size:1);@/
+ wlog_ln(' ',max_in_stack:1,'i,',max_nest_stack:1,'n,',@|
+ max_param_stack:1,'p,',@|
+ max_buf_stack+1:1,'b,',@|
+ max_save_stack+6:1,'s stack positions out of ',@|
+ stack_size:1,'i,',
+ nest_size:1,'n,',
+ param_size:1,'p,',
+ buf_size:1,'b,',
+ save_size:1,'s');
+ end
+@y
+@<Output statistics...@>=
+if log_opened then
+if latin_speech then begin bwlog_ln(' ');
+ bwlog_ln('Here is how much of TeX''s memory',' you used:');
+@.Here is how much...@>
+ bwlog_ln(' ',str_ptr-init_str_ptr:1,' string');
+ if str_ptr<>init_str_ptr+1 then bwlog_ln('s');
+ bwlog_ln(' out of ', max_strings-init_str_ptr:1);@/
+ bwlog_ln(' ',pool_ptr-init_pool_ptr:1,' string characters out of ',
+ pool_size-init_pool_ptr:1);@/
+ bwlog_ln(' ',lo_mem_max-mem_min+mem_end-hi_mem_min+2:1,@|
+ ' words of memory out of ',mem_end+1-mem_min:1);@/
+ bwlog_ln(' ',cs_count:1,' multiletter control sequences out of ',
+ hash_size:1);@/
+ bwlog_ln(' ',fmem_ptr:1,' words of font info for ',
+ font_ptr-font_base:1,' font');
+ if font_ptr<>font_base+1 then bwlog_ln('s');
+ bwlog_ln(', out of ',font_mem_size:1,' for ',font_max-font_base:1);@/
+ bwlog_ln(' ',hyph_count:1,' hyphenation exception');
+ if hyph_count<>1 then bwlog_ln('s');
+ bwlog_ln(' out of ',hyph_size:1);@/
+ bwlog_ln(' ',max_in_stack:1,'i,',max_nest_stack:1,'n,',@|
+ max_param_stack:1,'p,',@|
+ max_buf_stack+1:1,'b,',@|
+ max_save_stack+6:1,'s stack positions out of ',@|
+ stack_size:1,'i,',
+ nest_size:1,'n,',
+ param_size:1,'p,',
+ buf_size:1,'b,',
+ save_size:1,'s');
+ end
+else begin k:=selector; selector:=log_only;
+ print_ln; print("̠ҽנѽTeXҽѾѾŸ"); print_ln;
+@.Here is how much...@>
+ print_char(""); print_int(str_ptr-init_str_ptr); print("Ѡ");
+ print("ҽ"); print_int(max_strings-init_str_ptr); print_ln;
+ print_char(""); print_int(pool_ptr-init_pool_ptr);
+ print("ҽѠ"); print_int(pool_size-init_pool_ptr); print_ln;
+ print_char(""); print_int(lo_mem_max-mem_min+mem_end-hi_mem_min+2);
+ print("ҽ̠Π"); print_int(mem_end+1-mem_min); print_ln;
+ print_char(""); print_int(cs_count);
+ print("ҽʠӽ"); print_int(hash_size); print_ln;
+ print_char(""); print_int(fmem_ptr);
+ print("þݽҽΠ"); print_int(font_ptr-font_base);
+ print("ҽ"); print_int(font_mem_size);
+ print(""); print_int(font_max-font_base); print_ln;
+ print_char(""); print_int(hyph_count);
+ if hyph_count<>1 then print("þս") else print("ս");
+ print("ҽĠ"); print_int(hyph_size); print_ln;
+ print_char(""); print_int(max_in_stack); print("");
+ print_int(max_nest_stack); print("");
+ print_int(max_param_stack); print("");
+ print_int(max_buf_stack+1); print("");
+ print_int(max_save_stack+6); print("ҽ ΠԽ");
+ print_int(stack_size); print("");
+ print_int(nest_size); print("");
+ print_int(param_size); print("");
+ print_int(buf_size); print("");
+ print_int(save_size); print("Խ"); print_ln;
+ selector:=k;
+ end
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1335]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ print_int(cur_level-level_one); print_char(")");
+@y
+ print_int(cur_level-level_one);
+ L_or_S(print_char(")"))(print(" "));
+@z
+@x
+ print_nl("(\dump is performed only by INITEX)"); return;
+@y
+ print_nl("(\dump is performed only by INITEX)");
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1337]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+ while (loc<limit)and(buffer[loc]=" ") do incr(loc);
+@y
+ while (loc<limit)and((buffer[loc]=" ")or(buffer[loc]="")) do incr(loc);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [51.1337]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+if (loc<limit)and(cat_code(buffer[loc])<>escape) then start_input;
+@y
+if speech <> 0 then geq_define (cur_speech_loc,data,speech);
+if direction <> 0 then begin
+ geq_define (vbox_justify_loc,data,direction);
+ geq_define (cur_direction_loc,data,direction); end;
+@<Reset directinal variables@>;
+if virtex_ident=0 then
+ begin print(banner); print_ln;
+ slow_print(format_ident); print_ln;
+ update_terminal;
+ end;
+if (loc<limit)and(cat_code(buffer[loc])<>escape) then
+ begin direction_stack[in_open+1]:=cur_direction; start_input;
+ end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [52.1338] Core-dump in debugging mode on 0 input
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% In Unix, it's not possible to switch into the debugger while a program
+% is running. The best approximation is to do a core dump, then run
+% the debugger on it later.
+@x
+@d breakpoint=888 {place where a breakpoint is desirable}
+@y
+@d breakpoint=888 {place where a breakpoint is desirable}
+@d end_debug==end_term_IO; cur_speech:=sl; cur_direction:=sd
+@z
+@x |debug_help|
+begin loop begin wake_up_terminal;
+@y
+@!sl:language_type;
+@!sd:direction_type;
+begin begin_term_IO; sl:=cur_speech; sd:=cur_direction;
+ cur_speech := Lftlang; cur_direction := L_to_R;
+ loop begin wake_up_terminal;
+@z
+@x
+ read(term_in,m);
+ if m<0 then return
+ else if m=0 then
+ begin goto breakpoint;@\ {go to every label at least once}
+ breakpoint: m:=0; @{'BREAKPOINT'@}@\
+ end
+ else begin read(term_in,n);
+@y
+ read_int(term_in,m);
+ if m<0 then begin read_ln(term_in); end_debug; return; end
+ else if m=0 then dump_core {Do something to cause a core dump}
+ else begin read_int(term_in,n); term_offset:=0;
+ {the user's line ended with \<\rm return>}
+@z
+@x
+exit:end;
+@y
+exit: end_debug; end;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [52.1339]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+13: begin read(term_in,l); print_cmd_chr(n,l);
+@y
+13: begin read_int(term_in,l);
+ term_offset:=0; {the user's line ended with \<\rm return>}
+ print_cmd_chr(n,l);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1341]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d write_node=1 {|subtype| in whatsits that represent things to \.{\\write}}
+@d close_node=2 {|subtype| in whatsits that represent streams to \.{\\closeout}}
+@d special_node=3 {|subtype| in whatsits that represent \.{\\special} things}
+@d language_node=4 {|subtype| in whatsits that change the current language}
+@y
+@d open_R_node=1 {|subtype| in whatsits that represent files to \.{\\openoutR}}
+@d write_node=2 {|subtype| in whatsits that represent things to \.{\\write}}
+@d eqwrite_node=3 {|subtype| that represent \.{\\eqwrite}}
+@d close_node=4 {|subtype| in whatsits that represent streams to \.{\\closeout}}
+@d special_node=5 {|subtype| in whatsits that represent \.{\\special} things}
+@d language_node=9 {|subtype| in whatsits that change the current language}
+@/
+@z ATTENSION: any change may affect |LR_node| and |immediate_code| definitions
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1342]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+ @x
+@!write_open:array[0..17] of boolean;
+ @y
+ @!write_open:array[0..17] of boolean;
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1344]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@d immediate_code=4 {command modifier for \.{\\immediate}}
+@d set_language_code=5 {command modifier for \.{\\setlanguage}}
+@y
+@d beginspecial_node=6 {|subtype| in whatsits that represent \.{\\beginspecial}}
+@d endspecial_node=7 {|subtype| in whatsits that represent \.{\\endspecial}}
+@d LR_node=8 {|subtypes| in whatsits that represent \beginL, etc.}
+@d immediate_code=9 {command modifier for \.{\\immediate}}
+@d set_language_code=10 {command modifier for \.{\\setlanguage}}
+@z
+ @x
+@!@:open_out_}{\.{\\openout} primitive@>
+ @y
+@!@:open_out_}{\.{\\openout} primitive@>
+ @z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1346]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x 1346
+extension: case chr_code of
+ open_node:print_esc("openout");
+@y 1346=====================
+@<LR cmdchr@>@/
+extension: case chr_code of
+ open_node:print_esc("openout");
+@<LR ext cmdchr@>@/
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1348]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x open_R_node, eqwrite_node
+open_node:@<Implement \.{\\openout}@>;
+write_node:@<Implement \.{\\write}@>;
+@y
+open_node,open_R_node:@<Implement \.{\\openout}@>;
+eqwrite_node,write_node:@<Implement \.{\\write}@>;
+@z
+@x beginspecial_node, endspecial_node
+special_node:@<Implement \.{\\special}@>;
+@y
+special_node,beginspecial_node,endspecial_node:@<Implement \.{\\special}@>;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1354]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x special_switch
+begin new_whatsit(special_node,write_node_size); write_stream(tail):=null;
+p:=scan_toks(false,true); write_tokens(tail):=def_ref;
+end
+@y
+begin i := cur_speech; j := cur_direction; k:=cur_chr;
+if not eqspcial then begin cur_speech := Lftlang; cur_direction := L_to_R;
+ end;
+new_whatsit(k,write_node_size);
+if k = endspecial_node then
+ if is_open_SPC then begin
+ p := info (SPCsp); pop_SPC;
+ write_tokens(tail):=write_stream (p);
+ add_token_ref (write_tokens(tail));
+ end
+ else begin print_err("Extra \endspecial, ignored");
+ help1("\endspecial must be match with \beginspecial.");
+ error; write_tokens(tail):=null;
+ end
+else begin p:=scan_toks(false,true); write_tokens(tail):=def_ref; end;
+if k = beginspecial_node then begin
+ q:=scan_toks(false,true); write_stream(tail):=def_ref;
+ push_SPC(tail);
+ end
+else write_stream(tail):=null;
+cur_speech := i; cur_direction := j;
+end
+
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1356]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x eqwrite_node
+write_node:begin print_write_whatsit("write",p);
+@y
+eqwrite_node,write_node:begin
+ if subtype(p) = eqwrite_node then print_write_whatsit("eqwrite",p)
+ else print_write_whatsit("write",p);
+@z
+@x open_R_node, LR_node, beginspecial_node and endspecial_node
+othercases print("whatsit?")
+@y
+@<Print LR |whatsit|@>@/
+othercases print("whatsit?")
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1357]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x open_R_node
+open_node: begin r:=get_node(open_node_size); words:=open_node_size;
+@y
+open_node,open_R_node:
+ begin r:=get_node(open_node_size); words:=open_node_size;
+@z
+@x eqwrite_node
+write_node,special_node: begin r:=get_node(write_node_size);
+@y
+eqwrite_node,write_node,special_node,beginspecial_node,endspecial_node:
+ begin r:=get_node(write_node_size);
+ if subtype(p) = beginspecial_node then add_token_ref (write_stream(p));
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1357]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x LR_node
+close_node,language_node: begin r:=get_node(small_node_size);
+@y
+close_node,LR_node,language_node: begin r:=get_node(small_node_size);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1358]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x open_R_node, eqwrite_node, beginspecial_node and endspecial_node
+open_node: free_node(p,open_node_size);
+write_node,special_node: begin delete_token_ref(write_tokens(p));
+@y
+open_node,open_R_node: free_node(p,open_node_size);
+eqwrite_node,write_node,special_node,beginspecial_node,endspecial_node:
+ begin delete_token_ref(write_tokens(p));
+ if subtype(p) = beginspecial_node then delete_token_ref(write_stream(p));
+@z
+@x LR_node
+close_node,language_node: free_node(p,small_node_size);
+@y
+close_node,language_node,LR_node: free_node(p,small_node_size);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1360]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@ @<Incorporate a whatsit node into an hbox@>=do_nothing
+@y
+@ @<Incorporate a whatsit node into an hbox@>=
+if subtype(p)=LR_node then @<Adjust the LR stack for the |hpack| routine@>
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1366]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x LR_node
+@ @<Output the whatsit node |p| in an hlist@>=
+out_what(p)
+@y
+@ @<Output the whatsit node |p| in an hlist@>=
+if subtype(p)<>LR_node then out_what(p)
+else @<Output a reflection instruction if the direction has changed@>
+@z
+@x |write_out|
+token_show(def_ref); print_ln;
+@y
+eq_show:=(eqwrting or (subtype (p) = eqwrite_node));
+ token_show(def_ref); eq_show:=false; print_ln;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1373]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x open_R_node, eqwrite_node
+open_node,write_node,close_node:@<Do some work that has been queued up
+ for \.{\\write}@>;
+special_node:special_out(p);
+@y
+open_node,open_R_node,write_node,eqwrite_node,close_node:
+ @<Do some work that has been queued up for \.{\\write}@>;
+beginspecial_node,endspecial_node,special_node:special_out(p);
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [53.1374]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x eqwrite_node
+ if subtype(p)=write_node then write_out(p)
+@y
+ if (subtype(p)=write_node) or (subtype(p)=eqwrite_node) then write_out(p)
+@z
+@x open_R_node
+ write_open[j]:=true;
+@y
+ write_open[j]:=true;
+ if subtype(p)=open_R_node then write_file_direction[j]:=R_to_L
+ else write_file_direction[j]:=L_to_R;
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [54.1376]
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+itself will get a new section number.
+@^system dependencies@>
+@y
+itself will get a new section number.
+@^system dependencies@>
+
+@ Here is a temporary integer, used as a holder during reading and writing of
+TFM files, and a temporary |memory_word|, used in reading/writing format
+files.
+Also, the variables used to hold ``switch-to-editor'' information.
+@^<system dependencies@>
+
+@<Glob...@>=
+@!edit_name_start: pool_pointer;
+@!edit_name_length,@!edit_line,@!tfm_temp: integer;
+
+@ The |edit_name_start| will be set to point into |str_pool| somewhere after
+its beginning if \TeX\ is supposed to switch to an editor on exit.
+
+@<Set init...@>=
+edit_name_start:=0;
+
+@* \[55] \TeX-e-Parsi changes.
+\beginRt{}
+Ѿנ̠սנὠսՠϠĝýĠʠ
+ϠנὠᠾýĠ̠ٽ
+
+\endRt
+
+@d LftTag=1 {should be |> normal < LRsw_max|}
+@d RtTag=2 {should be |> normal < LRsw_max|}
+
+@<Constants...@>=
+@!Lftlang=LftTag; @/
+@!Rtlang=RtTag;@/
+@!L_to_R=LftTag;
+@!R_to_L=RtTag;
+
+@
+@<\pTeX{} Types@>=
+@!direction_type=L_to_R..R_to_L;@/
+@!language_type=Lftlang..Rtlang;@/
+
+@* \[56] \RLt{Ϡ}.
+\beginRt{}
+ıϾ̠ϠսᠲѽϠĝϠ
+ʠսѠ
+
+ʠսѠ
+پ흝흝
+὿۝ᠾϠ
+սנĠ흝
+\endRt
+
+@d ignorable=0
+@d unjoinable=1
+@d joinable=2
+
+@<Initialize table entries...@>=
+cat_code(""):=spacer; cat_code(""):=escape;
+cat_code(""):=comment; cat_code(""):=letter;
+for k:="" to "" do cat_code(k):=letter;
+for k:=0 to 255 do
+ begin join_attrib(k):=unjoinable; locate_code(k):=k;
+ end;
+locate_code(""):=""; locate_code(""):="";
+locate_code(""):=""; locate_code(""):="";
+locate_code(""):="";
+locate_code(""):=""; locate_code(""):="";
+join_attrib(""):=ignorable;
+k:=""; while k<"" do begin join_attrib(k):=joinable; k:=k+2; end;
+k:=""; while k<"" do begin join_attrib(k):=joinable; k:=k+2; end;
+join_attrib(""):=joinable; join_attrib(""):=joinable;
+join_attrib(""):=joinable; join_attrib(""):=joinable;
+join_attrib(""):=joinable; join_attrib(""):=joinable;
+join_attrib(""):=joinable;
+sf_code(""):=3000; {semitic `.'}
+
+@
+@<Check semitic char tables@>=
+if cur_chr=join_attrib_base then n:=joinable
+@
+@<Reset last char params@>=
+curchr_attrib:=unjoinable; acc_wd:=0; acc_ht:=0; acc_dp:=0; retain_acc:=false
+
+@ .\par
+For flexibility on various Farsi character sets,
+ we fill |xchr|'s in external C routine that might be read
+ from an external file.
+
+@<Use |setup_xchrs|@>=
+setup_xchrs;
+
+@* \[57] \RLt{Ϡ}.
+\beginRt{}
+Ծս נҠϠĝ
+ϽϠҠננĠѻϠ
+ѽսѾ흠ԾսҠ
+᠋՝񝝌頠
+ԾսѾ Ѡ٠Ѡ Ƞ
+սѝսʝ頾ѽսѾ흠
+
+\endRt{}
+
+@d latin_speech==(cur_speech=Lftlang)
+@d semitic_speech==(cur_speech=Rtlang)
+@#
+@#
+@d L_or_S(#)==@+if latin_speech then @+begin #; @+end else L_or_S_end
+@d L_or_S_end(#)==@+begin #; @+end
+@d L_or(#)==@+if latin_speech then @+begin #; @+end
+@d or_S(#)==@+if semitic_speech then @+begin #; @+end
+
+@<Constants...@>=
+@!semi_blank=160; {character code for farsi blank }
+
+@ \beginRt{}
+٠ѠΠ٠ҽѠϠϾսҠ
+ϠנĠѠνҽ렾ѽ
+\endRt
+
+@<Glob...@>=
+@!left_or_right:direction_type; {for bi\_directional terminal I/O}
+@!left_input:boolean; {for shifting input line in semitic mode }
+@!edit_direction: direction_type; {the direction for invoking editor.}
+
+@
+@<Reset directinal variables@>=
+left_or_right := cur_direction
+
+@ \beginRt{}
+ѠѽҽʠսѠ̠ϠϽ
+սᠿĠսѠʠ̠Ϡ
+\endRt
+@<Print the |dig| array in approperiate direction@>=
+ if latin_speech then begin
+ while k>0 do
+ begin decr(k);
+ if dig[k]<10 then print_char("0"+dig[k])
+ else print_char("A"-10+dig[k]);
+ end; end
+ else begin
+ decr(k); for i:=0 to k do begin
+ if dig[i]<10 then print_char(""+dig[i])
+ else print_char("A"-10+dig[i]); end;
+ end
+@
+@<Print two digit in approperiate direction@>=
+ if latin_speech then
+ begin
+ print_char("0"+(n div 10));
+ print_char("0"+(n mod 10));
+ end
+ else
+ begin
+ print_char("0"+(n mod 10));
+ print_char("0"+(n div 10));
+ end
+@
+@<Redefine |print_scaled|@>=
+procedure print_scaled(@!s:scaled); {prints scaled real, rounded to five
+ digits}
+var delta:scaled; {amount of allowable inaccuracy}
+@!k,kk:0..23; {index to current digit}
+@!ss:scaled;
+begin
+if latin_speech then print_scaled_Lft(s)@+else
+begin
+ if s<0 then
+ begin print_char("-"); negate(s); {print the sign, if negative}
+ end;
+ss:=s div unity;
+s:=10*(s mod unity)+5; delta:=10; k:=0;
+repeat if delta>unity then s:=s+@'100000-50000; {round the last digit}
+ dig[k]:=s div unity; incr(k);
+ s:=10*(s mod unity); delta:=delta*10;
+until s<=delta;
+for kk:=k-1 downto 0 do begin decr(k); print_char(""+dig[kk]); end;
+ print_char(""); print_int(ss);
+end;
+end;
+@* \[56] \RLt{Ƞ}.
+\beginRt{}
+ѻýҽѻս򻝠ѻȠѠϾ 
+ĠѾսѻս
+׾Ѿנ⦆ѠȠѠѾנϠ
+
+սѾٽѠս
+
+ѻĠ
+ѠȠѠ
+սѾٽ
+
+נϠҠѽսȠѠ
+ĠʠѠĝ
+ʠѠՠҽѠנՠĝ
+Ͼս
+ϾսՠѠҽĠѠנϠՠĝ
+ҽ ՠѠҽʠѠՠՠՠĝ
+ϾսѠ
+
+נʠȠנϽϠѠѽϠĝ
+׾׽ϠѠȠ̠ѾǠĝ
+
+սҠנϠȠѠҾϾ
+٠ѽԾսѠȠĠʝĝ
+
+ѽѠʠҽנѠȠϠĝ
+ʠҽ 齠Ѡ
+
+Ѡ齠᠋흠ν
+\endRt
+
+@d strequiv(#)==#:=get_streq (#)
+@d pushprinteq==incr(rawprtflg)
+@d popprinteq==decr(rawprtflg)
+
+@<Glob...@>=
+@!alt_str: array[str_number] of neg_max_strings..max_strings;
+@!rawprtflg: small_number; {are we printing an equived string?}
+
+@
+@<Make the first 256...@>=;
+for g:=0 to max_strings-1 do alt_str [g] := null;
+rawprtflg:=0
+
+@ Function |get_streq| return alternate string.
+@<Define |get_streq|@>=
+function get_streq (@!s:str_number):str_number; {get the equivalent of s}
+var a,e:str_number;
+begin
+ a := s;
+ if rawprtflg = 0 then begin
+ e := alt_str [s];
+ if latin_speech and (e < 0) then a := -e
+ else if semitic_speech and (e > 0) then a := e;
+ end;
+ get_streq := a;
+end;
+
+@
+@<Define |pprint|@>=
+procedure pprint(@!s:integer); {prints equivalent string of |s|}
+var j:pool_pointer; {current character code position}
+begin
+if s > 255 then strequiv(s);
+ pushprinteq;
+ j:=str_start[s];
+ while j<str_start[s+1] do
+ begin print_char(so(str_pool[j])); incr(j);
+ end;
+ popprinteq;
+end;
+
+@ \beginRt{}
+սԽ𽝠ϾҠѠ
+սנĠҽҽվ
+\endRt
+@<Define |LorRprt| procedures@>=
+procedure LorRprt(@!s1,s2:integer); {print strings |s1| or |s2|}
+begin pushprinteq;
+ if latin_speech then print (s1) else print (s2);
+ popprinteq;
+end;
+@#
+procedure LorRprt_err(@!s1,s2:integer);
+begin if interaction=error_stop_mode then wake_up_terminal;
+ if latin_speech then begin print_nl("! "); print(s1); end
+ else begin print_nl(""); print(s2); end;
+end;
+@* \[57] \RLt{ϠѾξ}.
+\beginRt{}
+սםȠĠϾ 
+ս
+սʠսѠם
+ĝϠϾ ý
+ϾսսѠʠ򽠱٠ѾנȠ
+
+ѠҽϾսʠսϾ ý
+ϠþٽϾϽϠנ
+ս̠ѠҽϾսϾ þ
+
+ѾΠĝΠҽϠ
+ĝѾѠ ՠѠ
+ս齠ᠭĠ۽Ѿ 
+
+ҽѾսנĠ
+|manLR|
+սנϾ٠ѾĠ٠
+|autoerr|
+սנ۽٠ҽĠΠƽ
+|autodir|
+սנ۽ȠĠ
+|autopar|
+սנ۽սѠҽѾ נƽ
+|autocol|
+սנ۽ʠսѠȠՠ
+|manrbox|
+սנ۽սϾ흝
+|automath|
+սנ۽ʠսѠ
+
+\endRt
+
+@d bgn_L_code=1
+@d bgn_R_code=2
+@d end_LR_add=3
+
+@d end_L_code=bgn_L_code+end_LR_add
+@d end_R_code=bgn_R_code+end_LR_add
+
+@d LR_bias=8
+@d manLR=0
+@d autoerr=1
+@d autodir=2
+@d autopar=3
+@d autocol=4
+@d manrbox=5
+@d automath=6
+
+@d dir_bgn_L==(autodir * LR_bias + bgn_L_code)
+@d dir_bgn_R==(autodir * LR_bias + bgn_R_code)
+@d err_end_L==(autoerr * LR_bias + end_L_code)
+@d err_end_R==(autoerr * LR_bias + end_R_code)
+@d par_bgn_R==(autopar * LR_bias + bgn_R_code)
+@d col_bgn_R==(autocol * LR_bias + bgn_R_code)
+@d col_end_R==(autocol * LR_bias + end_R_code)
+@d col_bgn_L==(autocol * LR_bias + bgn_L_code)
+@d col_end_L==(autocol * LR_bias + end_L_code)
+@d box_bgn_R==(manrbox * LR_bias + bgn_R_code)
+@d box_end_R==(manrbox * LR_bias + end_R_code)
+
+@d LRcmd==type
+@d LRsrc==subtype
+
+@d LRend(#)==(#+end_LR_add)
+@d LRbgn(#)==(#-end_LR_add)
+@d is_end_LR(#)==(#>end_LR_add)
+@d in_auto_LR==(stkLR_src=autodir)
+@d auto_LRdir==(chrbit(cur_LR_swch,autoLR))
+@d auto_LRfont==(chrbit(cur_LR_swch,autofont))
+@d auto_LR_needed==((cur_LR_swch>manual) or (stkLR_cmd=bgn_R_code))
+
+@d is_semi_char(#)==(issemichr(#) and auto_LR_needed)
+@d has_semi_font(#)==(issemichr(#) and auto_LRfont)
+@
+@d stkLR==cur_list.LR_aux_field.hh.rh
+@d stkLR_cmd==LRcmd(stkLR)
+@d stkLR_src==LRsrc(stkLR)
+@d stkLR_end==LRend(stkLR_cmd)
+@<Set init...@>=
+ stkLR:=null;
+@
+@<Initialize table entries...@>=
+cur_LR_swch:=manual; eq_type(cur_LRswch_loc):=data;
+vbox_justification:=0; LR_showswch:=7; { |eqchring| .. |eqnaming| }
+LR_miscswch := 1;
+eq_level(cur_LRswch_loc):=level_one;@/
+vbox_justify:=L_to_R; eq_type(vbox_justify_loc):=data;
+eq_level(vbox_justify_loc):=level_one;@/
+@
+@<LR cmdchr@>=
+LR: begin case (chr_code mod LR_bias) of
+ bgn_L_code: print_esc("beginL");
+ bgn_R_code: print_esc("beginR");
+ end_L_code: print_esc("endL");
+ end_R_code: print_esc("endR");
+ othercases print("!!LR command!!")
+ endcases;
+ case (chr_code div LR_bias) of
+ manLR: print("manual");
+ autoerr: print("autoerr");
+ autodir: print("autodir");
+ autopar: print("autopar");
+ autocol: print("autocol");
+ manrbox: print("manrbox");
+ automath: print("automath");
+ othercases print("!!LR source!!")
+ endcases; end;
+@
+@<|LR| nest routines@>=
+procedure show_LR(c,s:small_number);
+begin cur_cmd:=LR; cur_chr:=c+s*LR_bias; show_cur_cmd_chr;
+end;
+@#
+procedure pop_stkLR;
+var p:pointer;
+begin @!debug if stkLR = null then confusion("LR_pop_1");
+ if link(stkLR) = null then confusion("LR_pop_2"); gubed
+ if tracing_commands > 1 then
+ if stkLR_src>autoerr then show_LR(stkLR_end,stkLR_src);
+ tail_append(end_LR(stkLR));
+ p:=stkLR; stkLR:=link(stkLR); free_avail(p);
+end;
+@
+@d emit_par_LR==if R_to_L_vbox then append_LR(par_bgn_R)
+@<Insert |every_semi_par|@>=
+if every_semi_par<>null then
+ begin_token_list(every_semi_par,every_semi_par_text)
+@
+@<Insert |every_semi_math|@>=
+if every_semi_math<>null then
+ begin_token_list(every_semi_math,every_semi_math_text)
+@
+@<Insert |every_semi_display|@>=
+if every_semi_display<>null then
+ begin_token_list(every_semi_display,every_semi_display_text)
+@ Implementing |after_every_display| primitive.
+@<Insert |after_every_display|@>=
+if after_every_display<>null then
+ begin_token_list(after_every_display,after_every_display_text)
+@
+@<Test |auto_LR|@>=
+if in_auto_LR then pop_stkLR;
+ if (stkLR_src=manrbox) then append_LR (box_end_R)
+@
+@<Test |n=1|@>=
+ if n=1 then append_LR(box_bgn_R);
+@
+@<insert matching |end_R_code| at end of column@>=
+ if align_chr=Rtlang then begin
+ if addRcmds then append_LR(col_end_R)
+ else if addLcmds then append_LR(col_end_L); end
+ else if addLcmdh then append_LR(col_end_L)
+ else if addRcmdh then append_LR(col_end_R);
+ if in_auto_LR then pop_stkLR
+@
+@<insert |begin_R_code| at begin of column@>=
+ if align_chr=Rtlang then begin
+ if addRcmds then append_LR (col_bgn_R)
+ else if addLcmds then append_LR (col_bgn_L); end
+ else if addLcmdh then append_LR (col_bgn_L)
+ else if addRcmdh then append_LR (col_bgn_R); end
+
+@
+@d LR_command(#)==type(#+1) {the |LR_command|}
+@d LR_source(#)==subtype(#+1) {|auto...| or |manLR|}
+@d is_LR(#)==((type(#)=whatsit_node)and(subtype(#)=LR_node))
+@d is_auto_LR(#)==(is_LR(#) and (LR_source(#)<>manLR))
+@d whatsit_LR(#)==((not is_char_node(#))and is_LR(#))
+@d is_bgn_LR(#)==(LR_command(#)<=end_LR_add)
+@d end_LR(#)==new_LR(LRend(LRcmd(#)),LRsrc(#))
+@d cmd_LR(#)==new_LR(LRcmd(#),LRsrc(#))
+@d is_open_LR==(LRsp<>null)
+@d LR_match_stk(#)==((is_open_LR)and(LRcmd(LRsp)=(LRbgn(LR_command(#)))))
+@d LR_updt(#)==is_bgn_LR(#) then push_LR(#) else if LR_match_stk(#)
+@d R_to_L_node(#)==((R_to_L_vbox and (subtype(#)=min_quarterword)) or
+ (subtype(#)=right_justify))
+@d is_open_SPC==(SPCsp<>null)
+@d end_LJ(#)==new_LJ(info(#),true)
+@d cmd_LJ(#)==new_LJ(info(#),false)
+@d whatsit_LJ(#)==((type(#)=whatsit_node) and (subtype(#)>=beginspecial_node)
+ and (subtype(#)<=LR_node))
+@d is_bgn_LJ(#)==(((subtype(#)=LR_node) and is_bgn_LR(#)) or
+ (subtype(#)=beginspecial_node))
+@d is_end_LJ(#)==(((subtype(#)=LR_node) and
+ is_end_LR(LR_command(#)) and
+ (subtype(info(LJsp))=LR_node) and
+ is_bgn_LR(info(LJsp)) and
+ (LRend(LR_command(info(LJsp)))=LR_command(#))
+ ) or ((subtype(#)=endspecial_node) and
+ (subtype(info(LJsp))=beginspecial_node)))
+@d is_open_LJ==(LJsp<>null)
+
+@<|re_organize| in |hlist_out|@>=
+ while ((p<>null) and whatsit_LR(p)) do
+ if is_bgn_LR(p) then
+ if is_open_LR then p:=re_organize(p) else confusion("LRptr1")
+ else confusion("LRptr2");
+list_ptr(this_box):=p;
+ q:=get_avail; saved_q:=q; link(q):=p
+
+@
+@<Cases of |main_control| that build...@>=
+hmode+LR: append_LR (cur_chr);
+
+@
+@<Glob...@>=
+@!LRsp: pointer; {stack of LR nodes in |re_organization|}
+
+@ To appending |LR_nodes| to horizental list we call
+ |new_LR| procedure with parameter |c|, that implies |LR_command|,
+ and |s|, which shows source of command,
+ to create a |whatsit_node| with subtype |LR_node|.
+The |push_LR| and |pop_LR| procedures
+are used to checking or reorganizing LR nodes.
+
+@<Declare functions needed for special kinds of nodes@>=
+procedure push_LR(p:pointer);
+var t:pointer;
+begin t:=get_avail; info(t):=info(p+1); link(t):=LRsp; LRsp:=t;
+end;
+@#
+procedure pop_LR;
+var t:pointer; begin t:=LRsp; LRsp:=link(t); free_avail(t);
+end;
+@#
+function new_LR(c,s: small_number): pointer;
+var p: pointer;
+begin p:=get_node(small_node_size); type(p):=whatsit_node; subtype(p):=LR_node;
+ LR_command(p):=c; LR_source(p):=s; new_LR:=p;
+end;
+
+@
+@<Append a |bgn_L| to the tail of the current mlist@>=
+if auto_LR_needed then tail_append(new_LR(bgn_L_code, automath))
+
+@
+@<Append an |end_L| to the tail of the current mlist@>=
+if auto_LR_needed then tail_append(new_LR(end_L_code, automath))
+
+@ @<Flush the LR stack@>=while is_open_LR do pop_LR
+
+@ @<Flush the LJ stack@>=@<Flush the LR stack@>; while is_open_LJ do pop_LJ
+
+@ @<Adjust the LR stack based on LR nodes in this line@>=r:=link(temp_head);
+while is_open_LJ do begin s:=cmd_LJ(LJsp); link(s):=r; r:=s; pop_LJ; end;
+link(temp_head):=r; q:=r; while q<>cur_break(cur_p) do
+ begin if not is_char_node(q) then if whatsit_LJ(q) then
+ if is_bgn_LJ (q) then push_LJ (q)
+ else if is_open_LJ then if is_end_LJ (q) then pop_LJ; q:=link(q); end
+
+@
+@<Insert LR nodes at the end of the current line@>=
+if is_open_LJ then begin
+ s:=temp_head; r:=link(s); while r<>q do begin s:=r; r:=link(s); end; r:=LJsp;
+ while r<>null do begin link(s):=end_LJ(r); s:=link(s); r:=link(r); end;
+ link(s):=q; end
+
+@
+@<Adjust the LR stack for the |hpack| routine@>=if LR_updt(p) then pop_LR
+ else begin incr(LR_err); while link(q)<>p do q:=link(q);
+ link(q):=link(p); free_node(p,small_node_size); p:=q; end
+
+@
+@<Check for LR anomalies at the end of |hpack|@>=
+if is_open_LR then begin while link(q)<>null do q:=link(q);
+ repeat link(q):=end_LR(LRsp); q:=link(q); LR_err:=LR_err+10000; pop_LR;
+ until LRsp=null; end;
+if LR_err>0 then begin print_ln;
+ print_nl("\endL or \endR problem (");
+ print_int(LR_err div 10000); print("missing, ");
+ print_int(LR_err mod 10000); print(" extra");
+ LR_err:=0; goto common_ending; end
+
+@
+@<Output a reflection instruction if the direction has changed@>=
+ begin while link(q)<>p do q:=link(q);
+ if is_bgn_LR(p) then
+ if is_open_LR then link(q):=re_organize(p) else confusion("LRptr3")
+ else confusion("LRptr4"); p:=q; end
+
+@
+@<Declare procedures needed in |hlist_out|, |vlist_out|@>=
+function re_organize(p:pointer): pointer;
+label done,done1,restart;
+var q,r,t: pointer;
+wrap:boolean;
+begin wrap:=LR_command(p)<>LRcmd(LRsp);
+push_LR (p);
+q:=p; p:=link(p); free_node(q,small_node_size);
+restart: q:=p; if q=null then confusion("reorganize1");
+if whatsit_LR(q) then
+ if is_bgn_LR(q) then begin p:=re_organize(q); goto restart; end
+ else begin p:=link(q); r:=q; goto done1; end;
+r:=link(q);
+while r<>null do
+ if whatsit_LR(r) then if is_bgn_LR(r) then r:=re_organize(r) else goto done
+ else if wrap then begin t:=p; p:=r; r:=link(r); link(p):=t; end
+ else begin link(q):=r; q:=r; r:=link(r); end; confusion("reorganize2");
+done: link(q):=link(r);
+done1:if not LR_match_stk(r) then confusion("reorganize3");
+ re_organize:=p; free_node(r,small_node_size);
+ pop_LR;
+end;
+
+@
+@<Bidirectional procedures@>=
+procedure LR_unbalance(c:small_number);
+begin print_err("Unbalanced ");
+if c=end_L_code then print_esc("endL") else print_esc("endR");
+print(" command, ignored");
+if c=end_L_code then begin
+ help2("Your `\endL' command doesn't match any previous `\beginL' command.")@/
+ ("Go ahead. I am going to ignore it."); end
+else begin
+ help2("Your `\endR' command doesn't match any previous `\beginR' command.")@/
+ ("Go ahead. I am going to ignore it."); end; error;
+end;
+@#
+procedure LR_unmatched(c:small_number);
+begin print_err("Unmatched ");
+if c=end_L_code then print_esc("endL") else print_esc("endR");
+print(" command, corrected");
+if c=end_L_code then begin
+ help5("Your `\endL' command doesn't match any previous `\beginL' command.")@/
+ ("I have replaced your errorenous `\endL' by a correct `\endR' command,")@/
+ ("assuming that you meant to end your previous `\beginR'.")@/
+ ("If you don't need it, just type `1' and my insertion will be deleted.")@/
+ ("But make sure that your previous `\beginR' would be endded correctly.");
+ end
+else begin
+ help5("Your `\endR' command doesn't match any previous `\beginR' command.")@/
+ ("I have replaced your errorenous `\endR' by a correct `\endL' command,")@/
+ ("assuming that you meant to end your previous `\beginL'.")@/
+ ("If you don't need it, just type `1' and my insertion will be deleted.")@/
+ ("But make sure that your previous `\beginL' would be endded correctly.");
+ end;
+if c=end_L_code then cur_tok:=cs_token_flag+frozen_end_R
+else cur_tok:=cs_token_flag+frozen_end_L; ins_error;
+end;
+@#
+procedure append_LR(c:small_number);
+var p:pointer;
+t:small_number;
+begin if stkLR = null then confusion ("LR stack underflow");
+ if in_auto_LR then pop_stkLR; t := c div LR_bias; c := c mod LR_bias;
+ if is_end_LR (c) then
+ if stkLR<>null then
+ begin if c<>stkLR_end then LR_unmatched (c); pop_stkLR; end
+ else LR_unbalance (c)
+ else if (t<>autodir) or (c<>stkLR_cmd) then
+ begin if tracing_commands>1 then if t>autodir then show_LR(c,t);
+ tail_append(new_LR(c,t)); p:=get_avail; link(p):=stkLR;
+ stkLR:=p; stkLR_cmd:=c; stkLR_src:=t; end;
+end;
+@#
+
+@
+@<Set |cur_box| justification@>=
+ if R_to_L_vbox then subtype(cur_box):=right_justify
+ else subtype(cur_box):=left_justify;
+@
+@<Set rule justification@>=
+ if R_to_L_vbox then subtype(tail):=right_justify
+ else subtype(tail):=left_justify
+@
+@<Check parargraph justification@>=
+if R_to_L_par then
+ begin if not R_to_L_vbox then
+ eq_define(vbox_justify_loc,data,R_to_L);
+ end
+else if L_to_R_par then
+ if not L_to_R_vbox then
+ eq_define(vbox_justify_loc,data,L_to_R);
+@<Reset last char params@>;@/
+
+@
+@<LR ship vars@>=
+@!saved_lang:language_type; {the language of \TeX\ messages.}
+@!t:pointer;
+begin
+@!debug if is_open_LR then confusion (" LRsp in ship_out "); gubed
+ t := new_LR (bgn_L_code, 0); push_LR (t); {at outer level}
+ free_node (t, small_node_size);
+
+
+@* \[63] \RLt{Ϡҽ}.
+\beginRt{}
+սנĠҠҽϠҽ 
+󽝠Ѿ Ծսѽĝ
+սנĠȠϠ
+ƠĽѾ흠Ϡ̠ʠĝ
+\endRt
+@<Glob...@>=
+@!curchr_attrib:unjoinable..joinable;
+@!acc_wd,@!acc_ht,@!acc_dp:integer;
+@!retain_acc:boolean; { are we have to retain accented character dimensions }
+@ \subtitle{Semitic main loop.}
+@d adjust_charo(#)==#:=semichrin(locate_code(cur_chr))
+@d adjust_char(#)==#:=locate_code(cur_chr); if is_not_dbl_font then
+ #:=semichrin(#)
+@d is_not_dbl_font==(not is_dbl_font(cur_font))
+@d adjust_font(#)==fontadj:=false;
+ if cat_code(semichrout(c))=letter then if curchr_attrib=joinable then
+ if has_twin_font (#) then #:=fontwin[#]
+@d adjust_fontn(#)==fontadj:=false;
+ if cat_code(semichrout(c))=letter then if curchr_attrib=joinable then
+ if is_dbl_font(#) then if c > 128 then c:=c-128
+ else if has_twin_font (#) then #:=fontwin[#]
+@d chk_font_adjusting(#)==if fontadj then begin #:=cur_font; adjust_font(#); end
+@d set_cur_attrib(#)==if join_attrib(#)>ignorable then
+ curchr_attrib:=join_attrib(#)
+@d mid_rule_ok==((mrule_init >= 0) and is_twin_font(f) and
+ (char_exists(char_info(f)(c)))and (font_params[f]>=14))
+@d has_semi_accent_height(#)==((font_params [#] > 7) and
+ (semi_accent_height(#)<>0))
+@d semi_wrapup==
+ if ligature_present then
+ begin main_p:=new_ligature(f,l,link(q));
+ link(q):=main_p; tail:=main_p; set_cur_attrib(l);
+ end;
+ if c=hyphen_char[f1] then
+ if mode=hmode then tail_append(new_disc)
+
+@<handle semitic character such as TeX main loop@>=
+ if check_semitic_font then goto big_switch;
+ adjust_space_factor;
+ f:=cur_font; adjust_char(c); adjust_font(f);
+ @<if char |c| in font |f| not exists goto reswitch@>;
+ @<look for kern of char befor semiaccent@>;
+goto semi_mid_loop;
+semi_main_loop+1: if not fontadj then f:=cur_font;
+ @<if char |c| in font |f| not exists goto reswitch@>;
+semi_main_loop+2: chk_font_adjusting (f);
+semi_mid_loop:
+if mid_rule_ok then append_mid_rule (f);
+q:=tail; ligature_present:=false; l:=qi(c); f1:=f;
+set_cur_attrib(c);
+semi_lookahead: i:=char_info(f)(l);
+if char_exists(i) then
+ begin fast_get_avail(main_p); acc_char:=i; acc_font:=f1;
+ font(main_p):=f1; character(main_p):=qi(c);
+ link(tail):=main_p; tail:=main_p;
+ end
+else char_warning(f,qo(l));
+@<Look for another semitic character and set |r|=256 if there's none there@>;
+semi_lig_loop:
+@<If there's relevent ligature/kern to |i| adjust the text@>;
+if r=qi(256) then goto reswitch; {|cur_cmd|, |cur_chr|, |cur_tok| are untouched}
+c:=qo(r);
+goto semi_main_loop+1; {|f| is still valid}
+
+@ @<if char |c| in font |f| not exists goto reswitch@>=
+ if (c<font_bc[f])or(c>font_ec[f]) then
+ begin char_warning(f,c); goto big_switch; end
+
+@ @<look for kern of char befor semiaccent@>=
+ if (tail<>head) and (type(tail)=kern_node) and (subtype(tail)=acc_kern) and
+ ((acc_font = f) or (acc_font = fontwin[f])) and
+ (char_tag(acc_char) = lig_tag) then
+ begin i := acc_char; f1:=acc_font;
+ k:=lig_kern_start(f1)(i); r:=qi(c);
+ repeat j:=font_info[k].qqqq; {fetch a lig/kern command}
+ if next_char(j)=r then
+ if op_byte(j)>=kern_flag then
+ begin
+ q:=new_kern(char_kern(f1)(j));
+ tail_append(new_kern(char_kern(f1)(j)));
+ goto semi_mid_loop;
+ end;
+ incr(k);
+ until skip_byte(j)>=stop_flag;
+ end
+
+@ @<Look for another semitic character and set |r|=256 if there's none there@>=
+get_next; {set only |cur_cmd| and |cur_chr|}
+if cur_cmd=letter then goto semi_lookahead+2;
+if cur_cmd=other_char then goto semi_lookahead+2;
+if cur_cmd=semi_given then goto semi_lookahead+3;
+x_token; {set |cur_cmd|, |cur_chr|, |cur_tok|}
+if cur_cmd=letter then goto semi_lookahead+2;
+if cur_cmd=other_char then goto semi_lookahead+2;
+if cur_cmd=semi_given then goto semi_lookahead+3;
+if cur_cmd=char_num then
+ if cur_chr=Rtlang then
+ begin scan_char_num; cur_chr:=cur_val; goto semi_lookahead+3; end;
+semi_lookahead+1:
+r:=qi(256); goto semi_lig_loop;
+semi_lookahead+2:
+ if not is_semi_char(cur_chr) then goto semi_lookahead+1;
+ adjust_space_factor;
+semi_lookahead+3:
+ adjust_char(r); fontadj:=true
+
+@ @<If there's relevent ligature/kern to |i| adjust the text@>=
+if char_tag(i)=lig_tag then
+ if r<>qi(256) then
+ begin k:=lig_kern_start(f)(i);
+ repeat j:=font_info[k].qqqq; {fetch a lig/kern command}
+ if next_char(j)=r then
+ if op_byte(j)<kern_flag then
+ begin ligature_present:=true; l:=rem_byte(j); c:=qo(r);
+ chk_font_adjusting (f1);
+ if join_attrib(l)>ignorable then curchr_attrib:=join_attrib(l);
+ goto semi_lookahead;
+ end
+ else
+ begin semi_wrapup;
+ tail_append(new_kern(char_kern(f)(j)));
+ c:=qo(r); goto semi_main_loop+2;
+ end;
+ incr(k);
+ until skip_byte(j)>=stop_flag;
+ end;
+semi_wrapup
+
+@ \subtitle{New font specifications.}
+Farsi fonts are expected to have seven extra parameters:
+\hang|param[8]=semi_accent_height| is accents height.
+
+\hang|param[9]=mid_rule_height| is midrule height.
+
+\hang|param[10]=mid_rule_depth| is midrule depthe.
+
+\hang|param[11]=mid_rule_width| is midrule width.
+
+\hang|param[12]=mid_rule_stretch| is midrule stretch.
+
+\hang|param[13]=mid_rule_shrink| is midrule shrink.
+
+\hang|param[14]=mid_rule_stretch_order| is midrule stretch order.
+
+@d semi_accent_height_code=8
+@d mid_rule_height_code=9
+@d mid_rule_depth_code=10
+@d mid_rule_width_code=11
+@d mid_rule_stretch_code=12
+@d mid_rule_shrink_code=13
+@d mid_rule_stretch_order_code=14
+@#
+@d semi_accent_height==param(semi_accent_height_code)
+@d mid_rule_height==param(mid_rule_height_code)
+@d mid_rule_depth==param(mid_rule_depth_code)
+@d mid_rule_width==param(mid_rule_width_code)
+@d mid_rule_stretch==param(mid_rule_stretch_code)
+@d mid_rule_shrink==param(mid_rule_shrink_code)
+@d mid_rule_stretch_order==param(mid_rule_stretch_order_code)
+
+@<Check \pTeX{} font dimen@>=
+if (n<=mid_rule_stretch_order_code)and
+ (n>=mid_rule_height_code)and(font_mid_rule[f]<>null) then
+ begin delete_glue_ref(font_mid_rule[f]); font_mid_rule[f]:=null; end;
+
+
+@ New Constants for \pTeX{} font types.
+
+@<Constants...@>=
+@!twin_tag=256; {a constant to deal with |font_twin| must be greater than
+ |font_max| and must not exceed |max_quarterword| }
+@!dbl_tag=257; {same as |twin_tag| }
+
+@
+@<Glob...@>=
+@!fontwin:array[internal_font_number] of halfword; {the twin font of this font}
+@!font_mid_rule:array[internal_font_number] of pointer;
+ {glue specification for interletter rule, |null| if not allocated}
+
+@ Befor appending a second |Rtlang| character to horizental list,
+ if we have |mrule_init>=0|, we call the |append_mid_rule| procedure
+ to do the job.
+
+@<Define |append_mid_rule| procedure@>=
+procedure append_mid_rule(@!f:internal_font_number);
+var @!p,q:pointer; {for |mid_rule| handling}
+@!k:0..font_mem_size; {index into |font_info|}
+begin
+ if mid_rule=zero_glue then
+ begin p:=font_mid_rule[f];
+ if p=null then
+ begin p:=new_spec(zero_glue); k:=param_base[f]+mid_rule_width_code;
+ width(p):=font_info[k].sc; {that's |mid_rule_width(f)|}
+ stretch(p):=font_info[k+1].sc; {and |mid_rule_stretch(f)|}
+ shrink(p):=font_info[k+2].sc; {and |mid_rule_shrink(f)|}
+ stretch_order(p):=font_info[k+3].sc; {and |mid_rule_stretch_order(f)|}
+ font_mid_rule[f]:=p;
+ end;
+ q:=new_glue(p);
+ end
+ else q:=new_param_glue(mid_rule_code);
+ leader_ptr(q):=f; {the font of this |mid_rule|}
+ if mrule_init>0 then subtype(q):=active_mid_rule
+ else subtype(q):=suprsd_mid_rule;
+ link(tail):=q; tail:=q;
+end;
+
+@
+@<Check |mid_rule|s@>=
+if is_mrule(p) then {|suprsd_mid_rule| can't go here }
+ begin rule_ht:=mid_rule_height(leader_ptr(p));
+ rule_dp:=mid_rule_depth(leader_ptr(p));
+ rule_ht:=rule_ht+rule_dp; {this is the rule thickness}
+ if (rule_ht>0)and(rule_wd>0) then {we don't output empty rules}
+ begin 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;
+ end;
+ goto move_past;
+ end;
+@
+@<Initialize table entries...@>=
+fontwin[null_font]:=null_font; font_mid_rule[null_font]:=null;
+@
+@d set_rest_end_end(#)==#:=f; hyphen_char [f]:=-1
+@d set_rest_end(#)==font_id_text(f):=#; set_rest_end_end
+@d set_rest(#)==equiv(#):=f; eqtb[font_id_base+f]:=eqtb[#]; set_rest_end
+
+@<Declare \pTeX{} font procedures for |prefixed_command|@>=
+function get_semi_fontext(a:small_number;u:pointer;s:str_number):str_number;
+begin
+ if u>=hash_base then s:=text(u)
+ else if u>=single_base then begin if u<>null_cs then s:=u-single_base end
+ else begin old_setting:=selector; selector:=new_string; print(s);
+ print(u-active_base); selector:=old_setting; @.FONTx@>
+ str_room(1); s:=make_string; end;
+ define(u,set_font,null_font); get_semi_fontext:=s;
+end;
+@#
+function get_semi_font(u:pointer):internal_font_number;
+label found;
+var @!s:scaled; {stated ``at'' size, or negative of scaled magnification}
+@!f:internal_font_number; {runs through existing fonts}
+begin scan_file_name; @<Scan the font size specification@>;
+for f:=font_base+1 to font_ptr do
+ if str_eq_str(font_name[f],cur_name)and str_eq_str(font_area[f],cur_area) then
+ begin if s>0 then begin if s=font_size[f] then goto found; end
+ else if font_size[f]=xn_over_d(font_dsize[f],-s,1000) then goto found;
+ end;
+f:=read_font_info(u,cur_name,cur_area,s);
+found: get_semi_font:=f;
+end;
+@#
+procedure new_semi_font(@!a:small_number);
+label common_ending,found1,found2;
+var u,uu:pointer; {user's font identifier}
+@!f:internal_font_number; {runs through existing fonts}
+@!t,tt:str_number; {name for the frozen font identifier}
+@!old_setting:0..max_selector; {holds |selector| setting}
+@!fu,fuu:internal_font_number; {font numbers for |twin_font| setting}
+@!first_null,second_null,single_font:boolean;
+begin single_font:=(cur_chr = 0);
+if job_name=0 then open_log_file; {avoid \.{texput} with the font name}
+@.texput@>
+get_font_token(1); u:=cur_cs; first_null:=cs_null_font;
+if single_font then cur_cs:=0
+else if not first_null then get_font_token(2);
+uu:=cur_cs; second_null:=cs_null_font;
+if not first_null then t:=get_semi_fontext(a,u,"SEMIFONT");
+if (uu<>0) and (not second_null) then tt:=get_semi_fontext (a,uu,"TWINFONT");
+scan_optional_equals;
+if not first_null then begin f:=get_semi_font(u); set_rest(u)(t)(fu); end;
+if first_null or ((uu<>0) and (not second_null) and (uu<>u)) then
+ begin f:=get_semi_font (uu); set_rest(uu)(tt)(fuu); end;
+if single_font then fontwin[fu]:=dbl_tag
+else if (uu=0)or(u=uu) then fontwin[fu]:=fu
+ else if not first_null then
+ if not second_null then
+ begin fontwin[fu]:=fuu; fontwin[fuu]:=twin_tag; end
+ else fontwin[fu]:=fu
+ else fontwin[fuu]:=twin_tag;
+end;
+@
+The |semifont| command may be define with one or two control sequences
+and the new |dblfont| command must be defined with one control sequence.
+Procedur |get_font_token| is defined
+to handel these commands when defining semitic fonts.
+It take a |nullify| parameter that may vary as follows:
+
+\yskip\textindent{1)} To get the first control sequence.
+
+\textindent{2)} To get the optional second control sequence.
+
+@d cs_null_font==((cur_chr=null_font)and(cur_cmd=set_font))
+
+@<Declare \pTeX{} subprocedures for |prefixed_command|@>=
+procedure get_font_token(nullify:halfword);
+label restart;
+begin restart: repeat get_token;
+until (cur_tok<>space_token) and (cur_tok<>semi_space_token);
+if ((cur_cs=0)and(nullify<>2))or(cur_cs>frozen_control_sequence) then
+ begin print_err("Missing control sequence inserted");
+@.Missing control...@>
+ help5("Please don't say `\semifont cs...', say `\semifont\cs...'.")@/
+ ("I've inserted an inaccessible control sequence so that your")@/
+ ("definition will be completed without mixing me up too badly.")@/
+ ("You can recover graciously from this error, if you're")@/
+ ("careful; see exercise 27.2 in The TeXbook.");
+@:TeXbook}{\sl The \TeX book@>
+ if cur_cs=0 then back_input;
+ cur_tok:=cs_token_flag+frozen_protection; ins_error; goto restart;
+ end;
+if (cur_cs=0)and(nullify=2) then back_input;
+end;
+@
+@<Print |p| according to |fontwin[font(p)]|@>=
+ if is_semi_font (font(p)) then print_s_ASCII(qo(character(p)))
+ else print_ASCII(qo(character(p)))
+
+@
+For every printing we should reset directional variable.
+@d semitic_mode==(stkLR_cmd=bgn_R_code)
+@d latin_mode==(stkLR_cmd=bgn_L_code)
+@d cur_eq_other(#)==((cur_tok=other_token+#) or (eq_tok=other_token+#))
+@d set_latin_font==begin if cur_font<>cur_latif then
+ eq_define(cur_font_loc,data,cur_latif); end
+@d set_semi_font==begin if cur_font<>cur_semif then
+ eq_define(cur_font_loc,data,cur_semif); end
+
+@<Bidirectional procedures@>=
+procedure set_directed_space;
+var @!direction:direction_type;
+begin
+if ((name<1)or(name=16)) then direction:=cur_direction
+else if name>17 then direction:=direction_stack[in_open]
+ else if read_open[name-1]=closed then direction:=cur_direction
+ else direction:=direction_stack[in_open];
+cur_cmd:=spacer;
+if semitic_mode then cur_chr:="" else if latin_mode then cur_chr:=" "
+ else if direction=L_to_R then cur_chr:=" " else cur_chr:="";
+end;
+@#
+@ For automatic |bi_directional| typesetting we have to check |cur_font|
+ anywhere context may change direction.
+
+@<Declare act...@>=
+function insert_LR(which:language_type):boolean;
+var p:pointer; {for inserting |auto_LR| commands}
+@!n:halfword;
+begin x_token; back_input;
+ if which=Rtlang then n:=frozen_bgn_R else n:=frozen_bgn_L;
+ p:=get_avail; info(p):=cs_token_flag + n; ins_list(p); insert_LR:=true;
+end;
+@#
+function check_semitic_font:boolean;
+var @!b:boolean;
+begin b:=false;
+ if auto_LRdir then if not semitic_mode then b:=insert_LR(Rtlang);
+ if auto_LRfont then set_semi_font;
+ check_semitic_font:=b;
+end;
+@#
+function check_latin_font:boolean;
+var @!b:boolean;
+begin b:=false;
+ if auto_LRdir then if not latin_mode then b:=insert_LR(Lftlang);
+ if auto_LRfont then set_latin_font;
+ check_latin_font:=b;
+end;
+@#
+procedure call_app_space;
+begin if is_semi_font (cur_font) then
+ app_space(semi_xspace_skip_code,semi_space_skip_code)
+else app_space(xspace_skip_code,space_skip_code);
+end;
+
+@* \[67] New conditional.
+
+@d ifstk_size=128 {maximum nested ifset...}
+@d ifstk_val==if_stack [ifstk_ptr]
+
+@<Glob...@>=
+@!if_stack: array [0..ifstk_size] of eight_bits; {nested |if_set|...}
+@!ifstk_ptr:eight_bits; {top of the |if_stack|}
+@
+@<Set init...@>=ifstk_ptr := 0;
+@
+@d nestLR_cmd(#)==LRcmd(nest[#].LR_aux_field.hh.rh)
+@d R_done(#)==begin b:=(#=bgn_R_code); goto done; end
+@d L_done(#)==begin b:=(#=bgn_L_code); goto done; end
+
+@<Process semitic conditionlas@>=
+if_semiticchar_code: begin get_x_token_or_active_char; b:=issemichr(cur_chr);
+ if (cur_cmd>active_char)or(cur_chr>255) then b:=false; end;
+if_L_code: begin if stkLR_cmd<>0 then L_done(stkLR_cmd);
+ for i:=nest_ptr-1 downto 0 do if nestLR_cmd(i)<>0 then L_done(nestLR_cmd(i));
+ b:=false; end;
+if_R_code: begin if stkLR_cmd<>0 then R_done(stkLR_cmd);
+ for i:=nest_ptr-1 downto 0 do if nestLR_cmd(i)<>0 then R_done(nestLR_cmd(i));
+ b:=false; end;
+if_latin_code: b:=latin_speech;
+if_left_vbox_code: b:=L_to_R_vbox;
+if_joinable_code: b:=curchr_attrib=joinable;
+if_thousands_code: b:=get_rem_or_div (1000000,1000) <> 0;
+if_millions_code: b:=get_rem_or_div (1000000000,1000000) <> 0;
+if_billions_code: b:=get_rem_or_div (0,1000000000) <> 0;
+if_prehundreds_code: b:=get_rem_or_div (100,0) <> 0;
+if_prethousands_code: b:=get_rem_or_div (1000,0) <> 0;
+if_premillions_code: b:=get_rem_or_div (1000000,0) <> 0;
+if_prebillions_code: b:=get_rem_or_div (1000000000,0) <> 0;
+if_setlatin_code: begin
+ if ifstk_ptr < ifstk_size then begin
+ ifstk_val:=(cur_direction mod 4)*4+(cur_speech mod 4);
+ incr (ifstk_ptr);
+ end;
+ cur_speech := Lftlang; cur_direction := L_to_R; b:=true; end;
+if_setsemitic_code: begin
+ if ifstk_ptr < ifstk_size then begin
+ ifstk_val:=(cur_direction mod 4)*4+(cur_speech mod 4);
+ incr (ifstk_ptr);
+ end;
+ cur_speech := Rtlang; cur_direction := R_to_L; b:=true; end;
+if_setrawprinting_code: begin
+ if ifstk_ptr < ifstk_size then begin
+ if eq_show then ifstk_val:=17 else ifstk_val:=16;
+ incr (ifstk_ptr);
+ end;
+ pushprinteq; eq_show := false;
+ b:=true; end;
+if_LRdir_code: b:=auto_LRdir;
+if_LRfnt_code: b:=auto_LRfont;
+if_splited_code: @<Check splited insert@>;
+if_ones_code, if_tens_code, if_hundreds_code, {process like |if_case_code|}
+@
+@<Declare |pop_ifstk|@>=
+procedure pop_ifstk;
+begin
+ if (cur_if >= if_setlatin_code) and (ifstk_ptr > 0) then begin
+ decr (ifstk_ptr);
+ if ifstk_val < 16 then
+ begin
+ cur_speech := ifstk_val mod 4;
+ cur_direction := ifstk_val div 4;
+ end
+ else begin popprinteq;
+ if ifstk_val > 16 then eq_show := true;
+ end;
+ end;
+end;
+@
+@<Test |eqif| q@>=
+(eqchring and
+ ((cur_chr=eqif(q)) or (eqif(q)=cur_chr)))
+@
+@<Test |eqif| n@>=
+(eqchring and
+ ((eqif(n)=cur_chr) or (n=eqif(cur_chr))))
+@
+@<Check positional numbers@>=
+ if this_if = if_ones_code then n:=cur_val mod 10
+ else if this_if = if_tens_code then n:=(cur_val mod 100) div 10
+ else if this_if = if_hundreds_code then n:=(cur_val mod 1000) div 100
+ else {continue with |if_case_code|}
+
+
+@* \[61] Semitic accents.
+@<Initialize table entries...@>=
+for k:=0 to 255 do
+ begin acc_factor(k):=2056;
+ end;
+@
+@<Check semitic char tables@>=
+else if cur_chr=acc_factor_base then n:=16448
+@
+@<Declare act...@>=
+procedure make_semi_accent (@!downacc:boolean);
+var s,@!t: real; {amount of slant}
+@!p,@!q,@!r:pointer; {character, box, and kern nodes}
+@!f:internal_font_number; {relevant font}
+@!a,@!h,@!d,@!x,@!y,@!w,@!delta,odelta:scaled; { heights, depths and widths }
+@!i:four_quarters; {character information}
+@!wf:halfword;
+@!qc:pointer; {character of tail}
+@!k:0..font_mem_size; {index into |font_info|}
+begin scan_char_num; f:=cur_semif;
+if not is_dbl_font(f) then cur_val:=semichrin(cur_val);
+p:=new_character(f,cur_val);
+if p<>null then
+ begin q:=null;
+ if tail <> head then begin
+ if (is_char_node(tail)) or (type(tail)=ligature_node) then
+ begin s:=slant(f)/float_constant(65536);
+ if has_semi_accent_height(f) then x:=semi_accent_height(f)
+ else begin x:=x_height(f); end;
+ i:=char_info(f)(character(p)); a:=char_width(f)(i);
+ if not retain_acc then begin acc_wd:=a;
+ if downacc then acc_dp:=char_depth(f)(height_depth(i))
+ else acc_ht:=char_height(f)(height_depth(i)); end;
+ q:=tail; if type(q)=ligature_node then qc:=lig_char(q) else qc:=q;
+ f:=font(qc); t:=slant(f)/float_constant(65536);
+ i:=char_info(f)(character(qc)); w:=char_width(f)(i);
+ wf:=acc_factor (character(qc));
+ h:=char_height(f)(height_depth(i)); d:=char_depth(f)(height_depth(i));
+ if downacc then begin wf:=wf div 256; y:=d-x; s:=-d*t+x*s; end
+ else begin wf:=wf mod 256; y:=x-h; s:=-h*t+x*s; end;
+ if retain_acc then begin acc_wd := -w; acc_ht := h; acc_dp := d; end
+ else if downacc then begin acc_ht:=h; acc_dp:=acc_dp+y; end
+ else begin acc_dp:=d; acc_ht:=acc_ht-y; end;
+ if wf <> 0 then w:=round(w*wf)/float_constant(8);
+ delta:=round((w-a)/float_constant(2)+s);
+ if y<>0 then begin p:=hpack(p,natural); shift_amount(p):=y; end;
+ r:=new_kern(-a-delta); subtype(r):=acc_kern; link(tail):=r; link(r):=p;
+ tail:=new_kern(delta); subtype(tail):=acc_kern; link(p):=tail;
+ end { |char_node| }
+ else if (type(tail)=kern_node) and (subtype(tail)=acc_kern) then
+ begin s:=slant(f)/float_constant(65536);
+ if semi_accent_height(f)<>0 then x:=semi_accent_height(f)
+ else begin x:=x_height(f); end;
+ h:=acc_ht; d:=acc_dp; w:=acc_wd; if downacc then y:=d-x else y:=x-h;
+ i:=char_info(f)(character(p)); a:=char_width(f)(i);
+ if not retain_acc then begin acc_wd := a;
+ if downacc then acc_dp:=char_depth(f)(height_depth(i))+y
+ else acc_ht:=char_height(f)(height_depth(i))-y; end;
+ if y<>0 then begin p:=hpack(p,natural); shift_amount(p):=y; end;
+ delta:=round((w-a)/float_constant(2));
+ q:=tail; odelta:=width(q); width(q):=-a - delta; link(q):=p;
+ tail:=new_kern(delta+odelta); subtype(tail):=acc_kern; link(p):=tail;
+ end;
+ end; {if |tail <> head| }
+ if q=null then tail_append (p); space_factor:=1000;
+ retain_acc:=false;
+end;
+end;
+
+@* \[62] Equated commands.
+@<Initialize table entries...@>=
+for k:=0 to 255 do
+ begin eqch (k) := 0; eqif (k) := 0;
+ end;
+eqch("-"):=""; eqch("+"):=""; eqch("="):="";
+eqch(""):="-"; eqch(""):="+"; eqch(""):="=";
+eqif("-"):=""; eqif("+"):=""; eqif("="):="";
+eqif(""):="-"; eqif(""):="+"; eqif(""):="=";
+
+@
+@d LRsw_max = 4
+@d alt_text(#)==alt_str[text(#)]
+@d LRswend(#)==#
+@d LRsw(#)==LRsw_max * # + LRswend
+@<Glob...@>=
+@!cur_eq: pointer; {equated control sequence found here, zero if none found}
+@!eq_tok: halfword; {packed representative of |cur_cmd| and |eqch(cur_chr)|}
+@!eq_show:boolean; {are we in showing equated macro delimiters}
+
+@ @<Cases of |print_cmd_chr|...@>=
+let_name: case chr_code of
+normal: print_esc("leteqname");
+LftTag: print_esc("letlatinname");
+RtTag: print_esc("letsemiticname");
+LRsw_max: print_esc("letnoteqname");
+LRsw_max+1: print_esc("letnoteqchar");
+LRsw_max+2: print_esc("letnoteqcharif");
+othercases;
+endcases;@/
+@
+@<Assignments@>=
+let_name: if cur_chr <= LRsw(1)(0) then do_eq_name (a)
+ else if cur_chr > LRsw(1)(1) then
+ for p:=eq_charif_base to eq_charif_base+255 do define(p,data,0)
+ else for p:=eq_char_base to eq_char_base+255 do define (p,data,0);
+@
+@<Declare \pTeX{} subprocedures for |prefixed_command|@>=
+procedure do_eq_name (@!a:small_number);
+label not_found, found;
+var p,n,e,swch,j:integer;
+h:str_number;
+begin n:=cur_chr; swch:=LR_showswch;
+{ if eqnaming then |LR_showswch| := swch - 2; }
+ LR_showswch := 0; j:=0;
+ get_r_token; p:=cur_cs;
+{ if |cur_eq|<>0 then p:=|cur_eq| else p:=|cur_cs|; }
+ if n <> LRsw(1)(0) then begin
+ repeat get_token; until cur_cmd<>spacer;
+ if cur_eq_other("=") then
+ begin get_token; if cur_cmd=spacer then get_token; end;
+ end;
+ h:="Command names can be equated only with another command name.";@/
+ if (cur_cs < hash_base) or (p < hash_base) or
+ (cur_cs >= glue_base) or (p >= glue_base) then goto not_found;
+ h:="Diferent command names can be equated.";@/
+ if n = LRsw(1)(0) then
+ begin h:="Only equated commands can be \noteqname.";@/
+ if eq_type (p) <> eq_name then goto not_found;
+ e := abs (alt_text(p)); alt_text(p):=null;
+ if (e<>null) and (abs(alt_str[e])=text(p)) then alt_str[e] := null;
+ define(p,undefined_cs,null);
+ goto found; end
+ else if (cur_cs = p) or
+ ((n <> normal) and (alt_text(cur_cs)<>null)) then goto not_found;
+ if n=Lftlang then begin alt_text(cur_cs):=-text(p);
+ if alt_text(p)=null then alt_text(p):=text(cur_cs); end
+ else if n=Rtlang then begin alt_text(cur_cs):=text(p);
+ if alt_text(p)=null then alt_text(p):=-text(cur_cs); end;
+ if ((eq_type (cur_cs) = relax) or (eq_type (cur_cs) = undefined_cs)) and
+ ((eq_type (p) <> relax) and (eq_type (p) <> undefined_cs)) then
+ begin define(cur_cs,eq_name,p); end
+ else define(p,eq_name,cur_cs);
+ goto found;
+not_found:
+ print_err("Bad command name");
+ if (n<>normal) and (alt_text(cur_cs)<>null) then
+ begin print (" old eqname `");
+ pushprinteq; print_esc(abs(alt_text(cur_cs)));
+ popprinteq; print_char("'");
+ end;
+ help2(h)("I'm ignoring the command and its parameters");
+ error;
+found:
+ LR_showswch := swch;
+end;
+@ @<Check |eq_name| command@>=
+ if eqnaming then
+ while (eq_type(cur_cs)=eq_name) and (equiv(cur_cs)<>cur_eq) do
+ begin if cur_eq=0 then cur_eq:=cur_cs; cur_cs:=equiv(cur_cs); end;
+
+@ @<Set |cur_tok| and |eq_tok|@>=eq_tok:=0;
+ if cur_cs=0 then begin cur_tok:=(cur_cmd*@'400)+cur_chr;
+ if eqchring and (eqif(cur_chr)<>0) then eq_tok:=(cur_cmd*256)+eqif(cur_chr);
+ end
+else begin cur_tok:=cs_token_flag+cur_cs;
+ if cur_eq <> 0 then eq_tok := cs_token_flag + cur_eq; end
+
+
+@* \[68] New whatsit.
+
+@<Glob...@>=
+@!SPCsp: pointer; {stack of beginspecial nodes}
+@!LJsp: pointer; {stack of LR and beginspecial nodes}
+
+@ To appending |beginspecial_node| or |endspecial_node| to
+ horizental list we
+ create a |whatsit_node| with subtype |beginspacial_node| or |endspecial_node|.
+The |push_SPC| and |pop_SPC| procedures
+are used to checking or reinserting these nodes.
+
+For adjusting breaked line |beginspecial_node| and |LR_node| must nest
+properly, so we use |push_LJ| and |pop_LJ| to avoid confusion.
+
+@<Declare functions needed for special kinds of nodes@>=
+procedure push_SPC(p:pointer);
+var t:pointer;
+begin t:=get_avail; info(t):=p; link(t):=SPCsp; SPCsp:=t;
+end;
+@#
+procedure pop_SPC;
+var t:pointer; begin t:=SPCsp;
+ if t<>null then begin SPCsp:=link(t); free_avail(t); end;
+end;
+@#
+procedure push_LJ(p:pointer);
+var t:pointer;
+begin t:=get_avail; info(t):=p; link(t):=LJsp; LJsp:=t;
+end;
+@#
+procedure pop_LJ;
+var t:pointer; begin t:=LJsp;
+ if t<>null then begin LJsp:=link(t); free_avail(t); end;
+end;
+@#
+function new_LJ(s:pointer;endflg:boolean): pointer;
+var p: pointer;
+t:small_number;
+begin p:=get_node(write_node_size);
+ type(p):=whatsit_node;
+ if subtype (s) = beginspecial_node then
+ if endflg then t:=endspecial_node else t:=beginspecial_node
+ else t:=LR_node;
+ subtype(p):=t;
+ if t=endspecial_node then begin
+ write_tokens (p):=write_stream (s); add_token_ref(write_tokens (p));
+ write_stream (p):=null;
+ end
+ else if t=beginspecial_node then begin
+ write_tokens(p):=write_tokens (s);add_token_ref(write_tokens (p));
+ write_stream (p):=write_stream (s);add_token_ref(write_stream (p));
+ end
+ else begin t:=LR_command(s); if endflg then t:=LRend(t);
+ LR_command (p) := t; LR_source (p) := LR_source (s); end;
+ new_LJ:=p;
+end;
+
+@* \[70] Extra small changes.
+@<Glob...@>=
+@!direction_stack:array[1..max_in_open] of direction_type;
+@!read_file_direction:array[0..15] of direction_type;
+@!write_file_direction:array[0..15] of direction_type;
+
+@ \subtitle{נ}
+@<Check splited insert@>=
+begin scan_eight_bit_int;
+ b:=splited_ins [cur_val];
+end
+@ \subtitle{ʠսѠ}
+@<Reverse align columns@>=
+ begin u:=hold_head;
+ while s<>null do {insert blank boxes for empty columns }
+ begin link(u):=new_null_box; u:=link(u); width(u):=width(s);
+ s:=link(s); v:=glue_ptr(s); link(u):=new_glue(v); u:=link(u);
+ subtype(u):=tab_skip_code+1; s:=link(s);
+ end;
+ if u<>hold_head then {append blank boxes}
+ begin link(u):=link(pr); link(pr):=link(hold_head); end;
+ if list_ptr(q)<>null then {reverse columns in row |q|}
+ begin s:=list_ptr(q); r:=link(s); link(s):=null;
+ while r<>null do begin u:=link(r); link(r):=s; s:=r; r:=u; end;
+ list_ptr(q):=s;
+ end;
+ end
+@ \subtitle{ϠѾϽ}
+@d digvar_code==@'100000
+{math code meaning ``use the current semitic family''}
+
+@<Declare |report_math_illegal_case|@>=
+procedure report_math_illegal_case(bool:boolean);
+begin you_cant;
+if bool then
+begin
+help4("Sorry, but I can't handle semitic characters in formulas, YET.")@/
+("I'll just use the latin letter `a' instead of your semitic character.")@/
+("Or maybe you're in the wrong mode. If so, you might be able to")@/
+("return to the right one by typing `I}' or `I$' or `I\par'.");@/
+end
+else begin
+help2("Sorry, but I can't handle semitic characters in formulas, YET.")@/
+("I'll just use the latin letter `a' instead of your semitic character.");@/
+end;
+cur_tok:=letter_token+"a"; ins_error;
+end
+@
+@<Cases of |main_control| that build...@>=
+mmode+LR: report_illegal_case;
+
+@
+@<Declare |find_last|@>=
+function find_last (@!what:halfword):halfword;
+label exit,done;
+var @!p,@!q,@!t:pointer; {run through the current list}
+@!m:quarterword; {the length of a replacement list}
+begin find_last:=null;
+ if not is_char_node(tail) then
+ if ((type(tail)=what) or (ignrautoLR and is_auto_LR(tail))) then
+ begin q:=head;
+ if type(tail)=what then t:=null
+ else begin
+ if (link(q)=tail) and (type(q)=what) then
+ begin find_last:=q; return; end;
+ t:=tail;
+ end;
+ repeat p:=q;
+ if not is_char_node(q) then if type(q)=disc_node then
+ begin for m:=1 to replace_count(q) do p:=link(p);
+ if p=tail then return;
+ end;
+ q:=link(p);
+ if t<>null then
+ if type(q)=what then t:=p
+ else if not is_auto_LR(q) then t:=tail;
+ until q=tail;
+ if (t<>null) and (t<>tail) then
+ begin
+ if not ((type(t)=glue_node) and is_mrule(t)) then find_last := t;
+ end
+ else find_last:=p;
+ end;
+exit:end;
+@#
+procedure scan_nine_bit_int;
+begin scan_int;
+if (cur_val<0)or(cur_val>511) then
+ begin print_err("Bad register code");
+@.Bad register code@>
+ help2("A dimen or count register number must be between 0 and 512.")@/
+ ("I changed this one to zero."); int_error(cur_val); cur_val:=0;
+ end;
+end;
+@#
+function chk_sign_and_semitic:boolean;
+var negative:boolean; {should the answer be negated?}
+@!p,@!q:pointer; {keep head and tail of semietic digits}
+begin p:=null; q:=null; negative:=false;
+repeat @<Get the next non-blank non-call token@>;
+ if cur_eq_other("-") then
+ begin negative:=not negative; cur_tok:=other_token+"+"; eq_tok:=cur_tok; end;
+until (not cur_eq_other("+"));
+if not ((cur_tok<=other_token+"9") and (cur_tok>=other_token+"0")) then
+while ((cur_tok<=other_token+"") and (cur_tok>=other_token+"")) or
+ ((cur_tok<=other_token+"9") and (cur_tok>=other_token+"0")) or
+ (cur_tok=semi_point_token) or (cur_tok=semi_octal_token) do
+ begin if (cur_tok<=other_token+"") and (cur_tok>=other_token+"") then
+ cur_tok:=cur_tok-""+"0"
+ else if (cur_tok<=other_token+"9") and (cur_tok>=other_token+"0") then
+ cur_tok:=cur_tok-"0"
+ else if cur_tok=semi_point_token then cur_tok:=point_token
+ else cur_tok:=octal_token;
+ fast_get_avail(p); info(p):=cur_tok; link(p):=q; q:=p; get_x_token;
+ end;
+if p<>null then
+ begin if cur_eq_other("-") then negative := not negative else back_input;
+ back_list(p); get_x_token; end;
+ chk_sign_and_semitic:=negative;
+end;
+@#
+function get_rem_or_div (@!m,@!d:integer):integer;
+begin scan_int; if m > 0 then cur_val := cur_val mod m;
+ if d > 0 then cur_val := cur_val div d; get_rem_or_div := cur_val;
+end;
+@
+@<Print LR |whatsit|@>=
+open_R_node:begin print_write_whatsit("openoutR",p); print_char("=");
+ print_file_name(open_name(p),open_area(p),open_ext(p)); end;
+LR_node: begin case LR_command(p) of
+ bgn_L_code: print_esc("beginL");
+ bgn_R_code: print_esc("beginR");
+ end_L_code: print_esc("endL");
+ end_R_code: print_esc("endR");
+ othercases print("!!LR node command!!")
+ endcases;
+ case LR_source(p) of
+ manLR: print("manual");
+ autoerr: print("autoerr");
+ autodir: print("autodir");
+ autopar: print("autopar");
+ autocol: print("autocol");
+ manrbox: print("manrbox");
+ automath: print("automath");
+ othercases print("!!LR node source!!")
+ endcases; end;
+beginspecial_node:begin print_esc("beginspecial");
+ print_mark(write_tokens(p));
+ print_mark(write_stream(p));
+ end;
+endspecial_node:print_esc("endspecial");
+@
+@<LR ext cmdchr@>=
+ open_R_node:print_esc("openoutR");
+ eqwrite_node:print_esc("eqwrite");
+ beginspecial_node:print_esc("beginspecial");
+ endspecial_node:print_esc("endspecial");
+@
+@<Test bidirectionals@>=
+else if n<cur_speech_loc then begin print("bi\_directional typesetting");
+ print_char("=");
+ if equiv(n)=0 then print("manLRset")
+ else if equiv(n) = 1 then print ("autoLRdirset")
+ else if equiv(n) = 2 then print ("autoLRfontset")
+ else print("autoLRdirfontset");
+ end
+else if n<cur_direction_loc then begin print("speech language");
+ print_char("=");
+ if equiv(n)=Rtlang then print("semitic") else print("latin");
+ end
+else if n<vbox_justify_loc then begin print("speech direction");
+ print_char("=");
+ if equiv(n)=R_to_L then print("RtoL") else print("LtoR");
+ end
+else if n<cur_font_loc then
+ begin print("current vbox justification"); print("=from ");
+ if equiv(n)=L_to_R then print("left") else print("right");
+ end
+@ @<Cases of |print_cmd_chr|...@>=
+LR_setting: begin
+t := chr_code div LRsw_max; chr_code := chr_code mod LRsw_max;
+case t of
+0: if chr_code=joinable then print_esc("lastcharjoinable")
+ else print_esc("lastcharunjoinable");
+1: if chr_code=manual then print_esc("manLRset")
+ else if chr_code = autoLR then print_esc("autoLRdirset")
+ else if chr_code = autofont then print_esc("autoLRfontset")
+ else print_esc("autoLRset");
+2: if chr_code=Lftlang then print_esc("latin") else print_esc("semitic");
+3: if chr_code=L_to_R then print_esc("LtoR") else print_esc("RtoL");
+4: if chr_code=L_to_R then print_esc("leftvbox") else print_esc("rightvbox");
+1000: print_esc ("leftinput");
+endcases; { there are no other cases }
+end;@/
+LR_getting: if chr_code=cur_direction_loc then print_esc("curdirection")
+ else if chr_code=cur_speech_loc then print_esc("curspeech")
+ else if chr_code=cur_LRswch_loc then print_esc("curLRswch")
+ else print_esc("curboxdir");
+
+@
+@<Assignments@>=
+LR_setting: if cur_chr = LRsw(1000)(0) then left_input := true
+else if cur_chr < LRsw_max then curchr_attrib:=cur_chr
+else define(cur_LRswch_loc+(cur_chr div LRsw_max)-1,data,cur_chr mod
+LRsw_max);@/
+LR_getting: begin p:=cur_chr; scan_optional_equals; scan_int;
+ define(p,data,cur_val); end;
+@
+@<Put each of \TeX's primitives into the hash table@>=
+primitive("semispaceskip",assign_glue,glue_base+semi_space_skip_code);@/
+@!@:semi_space_skip_}{\.{\\semispaceskip} primitive@>
+primitive("semixspaceskip",assign_glue,glue_base+semi_xspace_skip_code);@/
+@!@:semi_xspace_skip_}{\.{\\semixspaceskip} primitive@>
+primitive("midrulespec",assign_glue,glue_base+mid_rule_code);@/
+@!@:mid_rule_}{\.{\\midrule} primitive@>
+primitive("beginspecial",extension,beginspecial_node);
+@!@:beginspecial_}{\.{\\beginspecial} primitive@>
+primitive("endspecial",extension,endspecial_node);
+@!@:endspecial_}{\.{\\endspecial} primitive@>
+primitive("eqwrite",extension,eqwrite_node);
+@!@:eqwrite_}{\.{\\eqwrite} primitive@>
+primitive("beginL",LR,bgn_L_code);@/
+@!@:bgn_L_}{\.{\\beginL} primitive@>
+text(frozen_bgn_L):="beginL"; eqtb[frozen_bgn_L]:=eqtb[cur_val];@/
+equiv(frozen_bgn_L):=dir_bgn_L;
+primitive("beginR",LR,bgn_R_code);@/
+@!@:bgn_R_}{\.{\\beginR} primitive@>
+text(frozen_bgn_R):="beginR"; eqtb[frozen_bgn_R]:=eqtb[cur_val];@/
+equiv(frozen_bgn_R):=dir_bgn_R;
+primitive("endL",LR,end_L_code);@/
+@!@:end_L_}{\.{\\endL} primitive@>
+text(frozen_end_L):="endL"; eqtb[frozen_end_L]:=eqtb[cur_val];@/
+equiv(frozen_end_L):=err_end_L;
+primitive("endR",LR,end_R_code);@/
+@!@:end_R_}{\.{\\endR} primitive@>
+text(frozen_end_R):="endR"; eqtb[frozen_end_R]:=eqtb[cur_val];@/
+equiv(frozen_end_R):=err_end_R;
+@#
+primitive("vboxjustification",assign_int,int_base+vbox_justification_code);@/
+@!@:vbox_justification_}{\.{\\vboxjustification} primitive@>
+primitive("LRshowswitch",assign_int,int_base+LR_showswch_code);@/
+@!@:LR_showswch_}{\.{\\LRshowswitch} primitive@>
+primitive("LRmiscswitch",assign_int,int_base+LR_miscswch_code);@/
+@!@:LR_miscswch_}{\.{\\LRmiscswitch} primitive@>
+primitive("midruleinit",assign_int,int_base+mrule_init_code);@/
+@!@:mrule_init_}{\.{\\midruleinit} primitive@>
+@#
+primitive(" ",ex_space,Lftlang);@/
+@!@:Single-character primitives /}{\quad\.{\\\ }@>
+primitive("",ex_space,Rtlang);@/
+@!@:Single-character primitives /}{\quad\.{\\\ }@>
+primitive("accent",accent,Lftlang);@/
+@!@:accent_}{\.{\\accent} primitive@>
+primitive("semiaccent",accent,Rtlang);@/
+@!@:accent_}{\.{\\semiaccent} primitive@>
+primitive("semiaccentdown",accent,Rtlang+1);@/
+@!@:accent_}{\.{\\semiaccentdown} primitive@>
+primitive("retainaccentchar",accent,Rtlang+2);@/
+@!@:accent_}{\.{\\retainaccentchar} primitive@>
+primitive("char",char_num,Lftlang);@/
+@!@:char_}{\.{\\char} primitive@>
+primitive("semichar",char_num,Rtlang);@/
+@!@:semi_char_}{\.{\\semichar} primitive@>
+primitive("dblfont",def_font,0);@/
+@!@:font_}{\.{\\font} primitive@>
+primitive("font",def_font,Lftlang);@/
+@!@:font_}{\.{\\font} primitive@>
+primitive("fontdimen",assign_font_dimen,0);@/
+@!@:font_dimen_}{\.{\\fontdimen} primitive@>
+primitive("semifont",def_font,Rtlang);@/
+@!@:semifont_}{\.{\\semifont} primitive@>
+primitive("activefont",def_font,Rtlang+1);@/ {only for showing}
+@!@:active_font_}{\.{\\activefont} primitive@>
+primitive("halign",halign,Lftlang);@/
+@!@:halign_}{\.{\\halign} primitive@>
+primitive("semihalign",halign,Rtlang);@/
+@!@:semihalign_}{\.{\\semihalign} primitive@>
+@#
+primitive("endinput",input,0);@/
+@!@:end_input_}{\.{\\endinput} primitive@>
+primitive("input",input,L_to_R);@/
+@!@:input_}{\.{\\input} primitive@>
+primitive("inputR",input,R_to_L);@/
+@!@:input_}{\.{\\inputR} primitive@>
+@#
+@#
+primitive("openoutR",extension,open_R_node);@/
+@!@:open_out_R_}{\.{\\openoutR} primitive@>
+primitive("leteqname",let_name,normal);@/
+@!@:let_eq_name_}{\.{\\leteqname} primitive@>
+primitive("letlatinname",let_name,Lftlang);@/
+@!@:let_latin_name_}{\.{\\letlatinname} primitive@>
+primitive("letsemiticname",let_name,Rtlang);@/
+@!@:let_semitic_name_}{\.{\\letsemiticname} primitive@>
+primitive("letnoteqname",let_name,LRsw(1)(0));@/
+@!@:let_noteq_name_}{\.{\\letnoteqname} primitive@>
+primitive("letnoteqchar",let_name,LRsw(1)(1));@/
+@!@:let_noteq_char_}{\.{\\letnoteqchar} primitive@>
+primitive("letnoteqcharif",let_name,LRsw(1)(2));@/
+@!@:let_noteq_charsif_}{\.{\\letnoteqcharif} primitive@>
+@#
+primitive("lastcharjoinable",LR_setting,LRsw(0)(joinable));@/
+@!@:joinable_}{\.{\\lastcharjoinable} primitive@>
+primitive("lastcharunjoinable",LR_setting,LRsw(0)(unjoinable));@/
+@!@:unjoinable_}{\.{\\lastcharunjoinable} primitive@>
+primitive("manLRset",LR_setting,LRsw(1)(manual));@/
+@!@:cur_LRswch_loc_}{\.{\\manLRset} primitive@>
+primitive("autoLRdirset",LR_setting,LRsw(1)(autoLR));@/
+@!@:cur_LRswch_loc_}{\.{\\autoLRdirset} primitive@>
+primitive("autofontset",LR_setting,LRsw(1)(autofont));@/
+@!@:cur_LRswch_loc_}{\.{\\autofont} primitive@>
+primitive("autoLRset",LR_setting,LRsw(1)(automatic));@/
+@!@:cur_LRswch_loc_}{\.{\\autoLRset} primitive@>
+primitive("latin",LR_setting,LRsw(2)(Lftlang));@/
+@!@:latin_}{\.{\\latin} primitive@>
+primitive("semitic",LR_setting,LRsw(2)(Rtlang));@/
+@!@:semitic_}{\.{\\semitic} primitive@>
+primitive("LtoR",LR_setting,LRsw(3)(L_to_R));@/
+@!@:L_to_R_}{\.{\\LtoR} primitive@>
+primitive("RtoL",LR_setting,LRsw(3)(R_to_L));@/
+@!@:R_to_L_}{\.{\\RtoL} primitive@>
+primitive("leftvbox",LR_setting,LRsw(4)(L_to_R));@/
+@!@:vbox_justify_loc_}{\.{\\leftvbox} primitive@>
+primitive("rightvbox",LR_setting,LRsw(4)(R_to_L));@/
+@!@:vbox_justify_loc_}{\.{\\rightvbox} primitive@>
+primitive("leftinput",LR_setting,LRsw(1000)(0));@/
+@!@:left_input_}{\.{\\leftinput} primitive@>
+@#
+primitive("curLRswch",LR_getting,cur_LRswch_loc);@/
+@!@:LR_getting_}{\.{\\curLRswch} primitive@>
+primitive("curspeech",LR_getting,cur_speech_loc);@/
+@!@:LR_getting_}{\.{\\curspeech} primitive@>
+primitive("curdirection",LR_getting,cur_direction_loc);@/
+@!@:LR_getting_}{\.{\\curdirection} primitive@>
+primitive("curboxdir",LR_getting,vbox_justify_loc);@/
+@!@:LR_getting_}{\.{\\curboxdir} primitive@>
+primitive("semiday",assign_int,int_base+semi_day_code);@/
+primitive("semimonth",assign_int,int_base+semi_month_code);@/
+primitive("semiyear",assign_int,int_base+semi_year_code);@/
+primitive("fonttwin",switch_font,1);@/
+primitive("basefont",switch_font,0);@/
+primitive("semifam",assign_int,int_base+dig_fam_code);@/
+primitive("hboxR",make_box,vtop_code+hmode+1);@/
+@!@:hboxR_}{\.{\\hboxR} primitive@>
+@
+@<Cases of |print_cmd_chr|...@>=
+accent: if chr_code=Lftlang then print_esc("accent")
+ else if chr_code=Rtlang then print_esc("semiaccent")
+ else if chr_code=Rtlang+1 then print_esc("semiaccentdown")
+ else print_esc("retainaccentchar");
+char_num: if chr_code=Lftlang then print_esc("char") else print_esc("semichar");
+def_font: case chr_code of
+ 0: print_esc("dblfont");
+ LftTag: print_esc("font");
+ RtTag: print_esc("semifont");
+ RtTag+1: print_esc("activefont");
+ end;
+ex_space: if chr_code=Lftlang then print_esc(" ") else print_esc("");
+halign: if chr_code=Lftlang then print_esc("halign") else
+ print_esc("semihalign");
+
+@* \[65] Implementing command line options |+commands| and |+strings|.
+@d print_cmd_name(#)==pushprinteq; sprint_cs(#); popprinteq
+@d print_nlcnt==print_nl(""); incr (cnt)
+@d print_name_ln==print_nlcnt; print_cmd_name
+@d print_name_lnh==print_nlcnt; was_used [h-hash_base]:=true; print_cmd_name
+@d print_cmd_toks==print_char("="); print_cmd_chr(eq_type(h), equiv(h))
+@d good_cmd==(not was_used [h-hash_base])
+@d tok_prim==((eq_type(h) = assign_toks) and (equiv(h) >= toks_base))
+@d int_prim==((eq_type(h) = assign_int) and (equiv(h) >= count_base))
+@d dim_prim==((eq_type(h) = assign_dimen) and (equiv(h) >= scaled_base))
+@d skp_prim==((eq_type(h) = assign_glue) and (equiv(h) >= skip_base))
+@d mus_prim==((eq_type(h) = assign_mu_glue) and (equiv(h) >= mu_skip_base))
+@d font_prim==(((eq_type(h) = set_font) and (equiv(h) <> null_font)) or
+ ((eq_type(h) = switch_font)))
+@d printcnt==totalcnt := totalcnt + cnt; print_int(cnt); cnt:=0
+
+@p @!stat function str_to_hash(@!s:str_number) : pointer;
+var k:pool_pointer; {index into |str_pool|}
+@!j:small_number; {index into |buffer|}
+@!l:small_number; {length of the string}
+begin
+ k:=str_start[s]; l:=str_start[s+1]-k;@/
+ for j:=0 to l-1 do buffer[j]:=so(str_pool[k+j]);@/
+ no_new_control_sequence:=true;@/
+ str_to_hash:=id_lookup(0,l) - hash_base;@/
+ no_new_control_sequence:=false;@/
+end;
+@#
+procedure print_commands;
+var h:pointer;
+s,e:str_number;
+svs,svd,svl:integer;
+totalcnt,cnt:integer;
+last_hash:integer;
+was_used: array [0..hash_size+1] of boolean;
+begin svs:=selector; svd:=cur_direction; svl:=cur_speech;
+ selector:=log_only; cur_direction:=R_to_L; cur_speech:=Rtlang;
+ for h:=0 to hash_size do was_used [h]:=false;
+ last_hash:=hash_base+hash_size;
+ for h:=hash_base to last_hash do
+ if eq_type(h) = undefined_cs then was_used [h - hash_base] := true;
+ for h:=hash_base to last_hash do
+ if length(text(h)) > 60 then was_used [h - hash_base] := true;
+ print_nl("սҠננĠ");
+ print_nl("ҽѾ");
+ totalcnt:=0; cnt:=0;
+ for h:=active_base to single_base-1 do
+ if eq_type(h) <> undefined_cs then
+ begin print_name_ln(h); print_cmd_toks; end;
+ print_nl("ҽѾϽ"); printcnt;
+ print_nl("ҽѾ");
+ for h:=single_base to hash_base-1 do
+ if eq_type(h) <> undefined_cs then
+ begin print_name_ln(h); print_cmd_toks; end;
+ print_nl("ҽѾϽ"); printcnt;
+ print_nl("ҽѾ");
+ cnt := printprims (was_used,"");
+ print_nl("ҽѾϽ"); printcnt;
+ print_nl("ҽѾȠ");
+ cnt := printeqprims (was_used,"");
+ print_nl("ҽѾȠϽ"); printcnt;
+ print_nl("ҽѾȠ");
+ for h:=hash_base to last_hash do
+ if good_cmd and (eq_type(h) = char_given) then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾϽ"); printcnt;
+ print_nl("ҽѾȠ");
+ for h:=hash_base to last_hash do
+ if good_cmd and (eq_type(h) = semi_given) then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾϽ"); printcnt;
+ print_nl("ҽѾ۾Ƞ");
+ for h:=hash_base to last_hash do
+ if good_cmd and (eq_type(h) = math_given) then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾ۾Ͻ"); printcnt;
+ print_nl("ҽѾᠼȠȠ");
+ for h:=hash_base to last_hash do
+ if good_cmd and tok_prim then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾᠼȠȠϽ"); printcnt;
+ print_nl("ҽѾѾנȠ");
+ for h:=hash_base to last_hash do
+ if good_cmd and int_prim then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾѾנȠϽ"); printcnt;
+ print_nl("ҽѾȠ");
+ for h:=hash_base to last_hash do
+ if good_cmd and dim_prim then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾȠϽ"); printcnt;
+ print_nl("ҽѾȠ");
+ for h:=hash_base to last_hash do
+ if good_cmd and skp_prim then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾȠϽ"); printcnt;
+ print_nl("ҽѾ۾Ƞ");
+ for h:=hash_base to last_hash do
+ if good_cmd and mus_prim then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾ۾ȠϽ"); printcnt;
+ print_nl("ҽѾ");
+ for h:=hash_base to last_hash do
+ if good_cmd and font_prim then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾϽ"); printcnt;
+ print_nl("ҽѾנ");
+ for h:=hash_base to last_hash do
+ if good_cmd and (eq_type(h) < call) then
+ begin print_name_lnh(h); print_cmd_toks;
+ print(" ("); print_int(eq_type(h)); print(") "); end;
+ print_nl("ҽѾנϽ"); printcnt;
+ print_nl("ҽѾʠ");
+ for h:=hash_base to last_hash do
+ if good_cmd and (eq_type(h) <> eq_name) and (eq_type(h) >= call) then
+ begin print_name_lnh(h); print_cmd_toks; end;
+ print_nl("ҽѾʠϽ"); printcnt;
+ print_nl("ҽѾ");
+ for h:=hash_base to last_hash do
+ if good_cmd and (eq_type(h) = eq_name) then
+ begin print_name_lnh(h); print_char("="); print_cmd_name(equiv(h));
+ end;
+ print_nl("ҽѾϽ"); printcnt;
+ print_nl("ҽѾ");
+ for h:=hash_base to last_hash do
+ if good_cmd and (text(h) <> null) then
+ begin print_name_lnh(h); print_char("="); print_cmd_name(equiv(h));
+ end;
+ print_nl("ҽѾϽ"); printcnt;
+ print_nl("ҽѾנĠϽ"); print_int(totalcnt);
+ print_nl("ҽѾĠ");
+ for h:=hash_base to last_hash do
+ if (eq_type(h)=undefined_cs) and (text(h)<>null) then
+ begin print_name_lnh(h);
+ end;
+ print_nl("ҽѾĠϽ"); printcnt;
+ print_nl("ҽѾנϽ"); print_int(totalcnt);
+ selector:=svs; cur_direction:=svd; cur_speech:=svl;
+ print_nl("");
+end;
+
+procedure print_strings;
+var s:str_number;
+svs,f,l:integer;
+begin pushprinteq; print_nl("ѠΠҾ");
+ svs:=selector; selector:=log_only;
+ for s:=0 to str_ptr - 1 do
+ begin
+ f := str_start [s]; l := str_start [s+1];
+ print_nl(""); print_int(s); print(""); print_int(f);
+ print_char(""); print_int(l); print("");
+ if (l - f) > 40 then l := f + 40;
+ while f < l do begin print_char(str_pool[f]); incr (f); end;
+ if l < str_start [s+1] then print("");
+ print_char("");
+ end;
+ print_nl("");
+ for f:=0 to 255 do if eqch(f)<>0 then
+ begin print_nl(""); print_char (f); print("");
+ print_char(eqch(f)); print(""); print_int(f);
+ print_char(""); print_int(eqch(f));
+ end;
+ print_nl("");
+ for f:=0 to 255 do if eqif(f)<>0 then
+ begin print_nl(""); print_char (f); print("");
+ print_char(eqif(f)); print(""); print_int(f);
+ print_char(""); print_int(eqif(f));
+ end;
+ print_nl(""); popprinteq; selector:=svs;
+end;
+tats
+
+@
+@<Declare act...@>=
+@!init procedure eqprimitive(@!s1,@!s2:str_number);
+var k:pool_pointer; {index into |str_pool|}
+@!j:small_number; {index into |buffer|}
+@!l:small_number; {length of the string}
+@!h1,@!h2:integer; {hash address of s1 and s2}
+begin
+if s1<256 then h1:=s1+single_base
+else begin k:=str_start[s1]; l:=str_start[s1+1]-k;
+ for j:=0 to l-1 do buffer[j]:=so(str_pool[k+j]);
+ no_new_control_sequence:=true;
+ h1:=id_lookup(0,l);
+ no_new_control_sequence:=false;
+ if h1 = undefined_control_sequence then
+ fatal_error("Undefined latin primitive");
+ end;
+if s2<256 then h2:=s2+single_base
+else begin k:=str_start[s2]; l:=str_start[s2+1]-k;
+ for j:=0 to l-1 do buffer[j]:=so(str_pool[k+j]);
+ h2:=id_lookup(0,l); {|no_new_control_sequence| is |false|}
+ flush_string; {we don't want to have the string twice}
+ if text(h2) = s2 then begin
+ print_err("semitic primitive already defined!"); print(s2); error;
+ end;
+ text(h2):=s2;
+ end;
+ geq_define(h2,eq_name,h1);
+ alt_str [s1] := s2; alt_str [s2] := -s1;
+end;
+tini
+@
+@<Put each of \TeX's primitives into the hash table@>=
+begineqprimitives(selector);@/
+eqprimitive("LtoR","ս");@/
+eqprimitive("RtoL","ս");@/
+eqprimitive("abovedisplayshortskip","پ");@/
+eqprimitive("abovedisplayskip","پ");@/
+eqprimitive("accent","");@/
+eqprimitive("accfactor","὿");@/
+eqprimitive("activefont","");@/
+eqprimitive("adjdemerits","");@/
+eqprimitive("advance","");@/
+eqprimitive("afterassignment","ҽ");@/
+eqprimitive("aftereverydisplay","ҽ");@/
+eqprimitive("aftergroup","ҽ");@/
+eqprimitive("autoLRdirset","Ѿ");@/
+eqprimitive("autofontset","Ѿ");@/
+eqprimitive("autoLRset","Ѿս");@/
+eqprimitive("basefont","ٽ");@/
+eqprimitive("baselineskip","پ");@/
+eqprimitive("batchmode","ҽ");@/
+eqprimitive("beginL","");@/
+eqprimitive("beginR","ս");@/
+eqprimitive("begingroup","");@/
+eqprimitive("belowdisplayshortskip","پ");@/
+eqprimitive("belowdisplayskip","پ");@/
+eqprimitive("billions","");@/
+eqprimitive("botmark","");@/
+eqprimitive("box","Ͼ");@/
+eqprimitive("boxmaxdepth","Ͼ");@/
+eqprimitive("catcode","");@/
+eqprimitive("char","");@/
+eqprimitive("chardef","");@/
+eqprimitive("cleaders","");@/
+eqprimitive("closein","");@/
+eqprimitive("closeout","");@/
+eqprimitive("clubpenalty","");@/
+eqprimitive("copy","");@/
+eqprimitive("count","Ѿ");@/
+eqprimitive("countdef","Ѿ");@/
+eqprimitive("cr","");@/
+eqprimitive("crcr","");@/
+eqprimitive("csname","");@/
+eqprimitive("day","");@/
+eqprimitive("deadcycles","");@/
+eqprimitive("def","");@/
+eqprimitive("delcode","Ҿս");@/
+eqprimitive("delimiter","Ҿս");@/
+eqprimitive("delimiterfactor","Ҿսȿ");@/
+eqprimitive("dimen","");@/
+eqprimitive("dimendef","");@/
+eqprimitive("discretionary","ѽ");@/
+eqprimitive("displayindent","");@/
+eqprimitive("displaywidth","");@/
+eqprimitive("divide","");@/
+eqprimitive("dp","");@/
+eqprimitive("dump","");@/
+eqprimitive("edef","");@/
+eqprimitive("else","");@/
+eqprimitive("end","");@/
+eqprimitive("endL","");@/
+eqprimitive("endR","ս");@/
+eqprimitive("endcsname","");@/
+eqprimitive("endgroup","");@/
+eqprimitive("endinput","");@/
+eqprimitive("endlinechar","");@/
+eqprimitive("errhelp","");@/
+eqprimitive("errmessage","");@/
+eqprimitive("errorcontextlines","");@/
+eqprimitive("errorstopmode","ҽ");@/
+eqprimitive("escapechar","");@/
+eqprimitive("everycr","");@/
+eqprimitive("everydisplay","");@/
+eqprimitive("everyhbox","Ͼ");@/
+eqprimitive("everyjob","Ѿ");@/
+eqprimitive("everymath","۾");@/
+eqprimitive("everypar","");@/
+eqprimitive("everysemidisplay","");@/
+eqprimitive("everysemimath","۾");@/
+eqprimitive("everysemipar","");@/
+eqprimitive("everyvbox","Ͼ");@/
+eqprimitive("exhyphenpenalty","۽");@/
+eqprimitive("expandafter","ҽ");@/
+eqprimitive("fam","Ͻ");@/
+eqprimitive("fi","");@/
+eqprimitive("firstmark","");@/
+eqprimitive("floatingpenalty","");@/
+eqprimitive("font","");@/
+eqprimitive("fontdimen","");@/
+eqprimitive("fontname","");@/
+eqprimitive("fonttwin","Ͻ");@/
+eqprimitive("futurelet","ѽ");@/
+eqprimitive("gdef","");@/
+eqprimitive("global","");@/
+eqprimitive("globaldefs","Ѿ");@/
+eqprimitive("halign","");@/
+eqprimitive("hangafter","ҽ");@/
+eqprimitive("hangindent","");@/
+eqprimitive("hbadness","");@/
+eqprimitive("hbox","Ͼ");@/
+eqprimitive("hboxR","սϾ");@/
+eqprimitive("hfil","");@/
+eqprimitive("hfill","");@/
+eqprimitive("hfilneg","");@/
+eqprimitive("hoffset","׾");@/
+eqprimitive("holdinginserts","");@/
+eqprimitive("hrule","");@/
+eqprimitive("hsize","");@/
+eqprimitive("hskip","پ");@/
+eqprimitive("hss","");@/
+eqprimitive("ht","ѽ");@/
+eqprimitive("hyphenation","");@/
+eqprimitive("hyphenchar","");@/
+eqprimitive("hyphenpenalty","");@/
+eqprimitive("if","");@/
+eqprimitive("ifLtoR","ս");@/
+eqprimitive("ifRtoL","ս");@/
+eqprimitive("ifautoLRdir","Ѿ");@/
+eqprimitive("ifautofont","Ѿ");@/
+eqprimitive("ifcat","");@/
+eqprimitive("ifdim","");@/
+eqprimitive("ifeof","");@/
+eqprimitive("iffalse","Ͼ");@/
+eqprimitive("ifhbox","Ͼ");@/
+eqprimitive("ifhmode","");@/
+eqprimitive("ifinner","");@/
+eqprimitive("ifjoinable","");@/
+eqprimitive("iflatin","");@/
+eqprimitive("ifleftvbox","ҽϾ");@/
+eqprimitive("ifmmode","۾");@/
+eqprimitive("ifnum","");@/
+eqprimitive("ifodd","");@/
+eqprimitive("ifcase","");@/
+eqprimitive("ifonesof","");@/
+eqprimitive("iftensof","");@/
+eqprimitive("ifhundredsof","");@/
+eqprimitive("ifthousands","ѽ");@/
+eqprimitive("ifmillions","");@/
+eqprimitive("ifbillions","");@/
+eqprimitive("ifprehundreds","");@/
+eqprimitive("ifprethousands","ѽ");@/
+eqprimitive("ifpremillions","");@/
+eqprimitive("ifprebillions","");@/
+eqprimitive("ifsetlatin","ѽ");@/
+eqprimitive("ifsetsemitic","ѽ");@/
+eqprimitive("ifsetrawprinting","ѽ");@/
+eqprimitive("ifsemiticchar","");@/
+eqprimitive("ifsplited","");@/
+eqprimitive("iftrue","");@/
+eqprimitive("ifvbox","Ͼ");@/
+eqprimitive("ifvmode","");@/
+eqprimitive("ifvoid","");@/
+eqprimitive("ifx","");@/
+eqprimitive("ignorespaces","پ");@/
+eqprimitive("immediate","");@/
+eqprimitive("indent","");@/
+eqprimitive("input","ҽ");@/
+eqprimitive("inputR","");@/
+eqprimitive("insert","");@/
+eqprimitive("insertpenalties","");@/
+eqprimitive("interlinepenalty","");@/
+eqprimitive("jattrib","");@/
+eqprimitive("jobname","Ѿ");@/
+eqprimitive("kern","");@/
+eqprimitive("language","");@/
+eqprimitive("lastbox","Ͼλ");@/
+eqprimitive("lastcharjoinable","");@/
+eqprimitive("lastcharunjoinable","¾");@/
+eqprimitive("lastkern","λ");@/
+eqprimitive("lastpenalty","λ");@/
+eqprimitive("lastskip","پλ");@/
+eqprimitive("inputlineno","Ѿ");@/
+eqprimitive("badness","");@/
+eqprimitive("latin","");@/
+eqprimitive("lccode","");@/
+eqprimitive("lcode","");@/
+eqprimitive("leaders","");@/
+eqprimitive("leftvbox","ҽϾ");@/
+eqprimitive("curboxdir","ѾϾ");@/
+eqprimitive("curdirection","Ѿ");@/
+eqprimitive("curLRswch","Ѿս");@/
+eqprimitive("curspeech","Ѿ");@/
+eqprimitive("let","ѽ");@/
+eqprimitive("linepenalty","");@/
+eqprimitive("lineskip","پ");@/
+eqprimitive("lineskiplimit","پ");@/
+eqprimitive("long","");@/
+eqprimitive("looseness","");@/
+eqprimitive("lower","");@/
+eqprimitive("mag","");@/
+eqprimitive("maketwin","Ͻ");@/
+eqprimitive("manLRset","ս");@/
+eqprimitive("mark","");@/
+eqprimitive("mathaccent","۾ѿ");@/
+eqprimitive("mathchar","۾");@/
+eqprimitive("mathchardef","۾");@/
+eqprimitive("mathcode","۾");@/
+eqprimitive("maxdeadcycles","ѽ");@/
+eqprimitive("maxdepth","");@/
+eqprimitive("meaning","");@/
+eqprimitive("medmuskip","۾پ");@/
+eqprimitive("message","");@/
+eqprimitive("midruleinit","ѽ");@/
+eqprimitive("midrulespec","Ͼ");@/
+eqprimitive("millions","");@/
+eqprimitive("mkern","۾");@/
+eqprimitive("month","");@/
+eqprimitive("moveleft","");@/
+eqprimitive("moveright","ս");@/
+eqprimitive("mskip","۾پ");@/
+eqprimitive("multiply","");@/
+eqprimitive("muskip","پ");@/
+eqprimitive("muskipdef","پ");@/
+eqprimitive("newlinechar","");@/
+eqprimitive("noalign","");@/
+eqprimitive("noexpand","");@/
+eqprimitive("noindent","");@/
+eqprimitive("nonstopmode","ҽ");@/
+eqprimitive("nullfont","");@/
+eqprimitive("number","");@/
+eqprimitive("omit","");@/
+eqprimitive("openin","ҽҾ");@/
+eqprimitive("openinR","Ҿ");@/
+eqprimitive("openout","ҽҾ");@/
+eqprimitive("openoutR","Ҿ");@/
+eqprimitive("or","");@/
+eqprimitive("outer","");@/
+eqprimitive("output","");@/
+eqprimitive("outputpenalty","");@/
+eqprimitive("overfullrule","");@/
+eqprimitive("pagedepth","");@/
+eqprimitive("pagefilllstretch","");@/
+eqprimitive("pagefillstretch","");@/
+eqprimitive("pagefilstretch","");@/
+eqprimitive("pagegoal","");@/
+eqprimitive("pageshrink","");@/
+eqprimitive("pagestretch","");@/
+eqprimitive("pagetotal","");@/
+eqprimitive("par","");@/
+eqprimitive("parfillskip","پ");@/
+eqprimitive("parindent","");@/
+eqprimitive("parshape","");@/
+eqprimitive("parskip","پ");@/
+eqprimitive("patterns","");@/
+eqprimitive("pausing","");@/
+eqprimitive("penalty","");@/
+eqprimitive("postdisplaypenalty","");@/
+eqprimitive("predisplaypenalty","");@/
+eqprimitive("predisplaysize","ҽ");@/
+eqprimitive("pretolerance","");@/
+eqprimitive("prevdepth","");@/
+eqprimitive("prevgraf","");@/
+eqprimitive("radical","Ͻ");@/
+{eqprimitive("rawprinting","");}
+{eqprimitive("eqprinting","");}
+eqprimitive("raise","");@/
+eqprimitive("read","");@/
+eqprimitive("relax","̽");@/
+eqprimitive("leftskip","پ");@/
+eqprimitive("rightskip","پ");@/
+eqprimitive("rightvbox","սҽϾ");@/
+eqprimitive("leftinput","ҽ");@/
+eqprimitive("romannumeral","");@/
+eqprimitive("scriptfont","");@/
+eqprimitive("scriptscriptfont","");@/
+eqprimitive("scrollmode","ҽ");@/
+eqprimitive("semiaccent","");@/
+eqprimitive("semiaccentdown","ҿ");@/
+eqprimitive("retainaccentchar","");@/
+eqprimitive("semichar","");@/
+eqprimitive("semichardef","");@/
+eqprimitive("semiday","");@/
+eqprimitive("semifam","Ͻ");@/
+eqprimitive("dblfont","");@/
+eqprimitive("semifont","");@/
+eqprimitive("semihalign","");@/
+eqprimitive("semimonth","");@/
+eqprimitive("semispaceskip","þپ");@/
+eqprimitive("semitic","");@/
+eqprimitive("semixspaceskip","þ۽پ");@/
+eqprimitive("semiyear","");@/
+eqprimitive("setbox","Ͼ");@/
+eqprimitive("sfcode","پ");@/
+eqprimitive("shipout","");@/
+eqprimitive("show","");@/
+eqprimitive("showbox","Ͼ");@/
+eqprimitive("showboxbreadth","Ͼ");@/
+eqprimitive("showboxdepth","Ͼ");@/
+eqprimitive("showlists","");@/
+eqprimitive("showthe","");@/
+eqprimitive("skewchar","ѽ");@/
+eqprimitive("skip","پ");@/
+eqprimitive("skipdef","پ");@/
+eqprimitive("spacefactor","پ");@/
+eqprimitive("spaceskip","þپ");@/
+eqprimitive("span","Ͻ");@/
+eqprimitive("special","");@/
+eqprimitive("splitmaxdepth","");@/
+eqprimitive("splittopskip","پ");@/
+eqprimitive("string","");@/
+eqprimitive("tabskip","پ");@/
+eqprimitive("textfont","");@/
+eqprimitive("the","");@/
+eqprimitive("thickmuskip","۾Ͼپ");@/
+eqprimitive("thinmuskip","۾پ");@/
+eqprimitive("thousands","ѽ");@/
+eqprimitive("time","");@/
+eqprimitive("toks","");@/
+eqprimitive("toksdef","");@/
+eqprimitive("tolerance","");@/
+eqprimitive("topmark","");@/
+eqprimitive("topskip","پ");@/
+eqprimitive("tracingcommands","");@/
+eqprimitive("tracinglostchars","");@/
+eqprimitive("tracingmacros","");@/
+eqprimitive("tracingonline","");@/
+eqprimitive("tracingoutput","");@/
+eqprimitive("tracingpages","þ");@/
+eqprimitive("tracingparagraphs","");@/
+eqprimitive("tracingrestores","Ҿ");@/
+eqprimitive("tracingstats","Ѿ");@/
+eqprimitive("twinfont","Ͻ");@/
+eqprimitive("uccode","");@/
+eqprimitive("uchyph","");@/
+eqprimitive("unhbox","Ͼ");@/
+eqprimitive("unhcopy","");@/
+eqprimitive("unkern","");@/
+eqprimitive("unpenalty","");@/
+eqprimitive("unskip","پ");@/
+eqprimitive("unvbox","Ͼ");@/
+eqprimitive("unvcopy","");@/
+eqprimitive("vadjust","");@/
+eqprimitive("valign","");@/
+eqprimitive("vbadness","");@/
+eqprimitive("vbox","Ͼ");@/
+eqprimitive("vboxjustification","Ͼ");@/
+eqprimitive("LRshowswitch","");@/
+eqprimitive("LRmiscswitch","");@/
+eqprimitive("vcenter","Ͼ");@/
+eqprimitive("vfil","");@/
+eqprimitive("vfill","");@/
+eqprimitive("vfilneg","");@/
+eqprimitive("voffset","׾");@/
+eqprimitive("vrule","");@/
+eqprimitive("vsize","");@/
+eqprimitive("vskip","پ");@/
+eqprimitive("vsplit","");@/
+eqprimitive("vss","");@/
+eqprimitive("vtop","Ͼ");@/
+eqprimitive("wd","");@/
+eqprimitive("widowpenalty","");@/
+eqprimitive("write","");@/
+eqprimitive("eqwrite","");@/
+eqprimitive("xdef","");@/
+eqprimitive("xleaders","");@/
+eqprimitive("xspaceskip","þ۽پ");@/
+eqprimitive("year","");@/
+eqprimitive("letlatinname","ѽ");@/
+eqprimitive("letsemiticname","ѽ");@/
+eqprimitive("leteqname","ѽ");@/
+eqprimitive("eqchar","");@/
+eqprimitive("eqcharif","");@/
+eqprimitive("letnoteqname","ѽ");@/
+eqprimitive("letnoteqchar","ѽ");@/
+eqprimitive("letnoteqcharif","ѽ");@/
+eqprimitive("emergencystretch","");@/
+eqprimitive("hfuzz","");@/
+eqprimitive("vfuzz","");@/
+eqprimitive("endspecial","");@/
+eqprimitive("beginspecial","");@/
+make_eqstr;
+
+@ Putting non-command equivalent strings are made with procedure |make_eqstr|
+by initex program.
+
+@d end_eqs(#)==#
+@d eqs(#)==alt_str[#]:=end_eqs
+
+@p @!init procedure make_eqstr;
+begin
+eqs("-")("");@/
+eqs("+")("");@/
+eqs("=")("");@/
+eqs(" ")("");@/
+eqs("*")("");@/
+eqs("{")("");@/
+eqs("\")("");@/
+eqs("}")("");@/
+eqs("&")("");@/
+eqs("#")("");@/
+eqs("%")("");@/
+eqs(".")("");@/
+eqs(",")("");@/
+eqs(";")("");@/
+eqs(":")("");@/
+eqs("?")("");@/
+eqs("!")("");@/
+eqs(">")("");@/
+eqs("(")("");@/
+eqs(")")("");@/
+eqs("[")("");@/
+eqs("]")("");@/
+eqs("|")("");@/
+eqs("0")("");@/
+eqs("1")("");@/
+eqs("2")("");@/
+eqs("3")("");@/
+eqs("4")("");@/
+eqs("5")("");@/
+eqs("6")("");@/
+eqs("7")("");@/
+eqs("8")("");@/
+eqs("9")("");@/
+eqs("'")("");@/
+eqs("l")("");@/
+eqs("at")("ҽ");@/
+eqs("bp")("");@/
+eqs("cc")("");@/
+eqs("cm")("");@/
+eqs("dd")("");@/
+eqs("depth")("");@/
+eqs("em")("");@/
+eqs("ex")("");@/
+eqs("height")("ѽ");@/
+eqs("in")("");@/
+eqs("minus")("");@/
+eqs("mm")("");@/
+eqs("pc")("");@/
+eqs("plus")("۾");@/
+eqs("scaled")("۾");@/
+eqs("sp")("Խ");@/
+eqs("spread")("");@/
+eqs("to")("");@/
+eqs("true")("");@/
+eqs("width")("");@/
+eqs(" ")("");@/
+eqs(" (")("");@/
+eqs(" (\output routine)")("ٝё");@/
+eqs(" (for accent)")("ὠ");@/
+eqs(" (held over for next output)")("׽Π");@/
+eqs(" (language")("");@/
+eqs(" (ligature ")("ľ");@/
+eqs(" (see the transcript file)")("ѠѾ‘");@/
+eqs(" )")("");@/
+eqs(" -> @@@@")("");@/
+eqs(" []")("");@/
+eqs(" \hbox (badness ")("");@/
+eqs(" \vbox (badness ")("");@/
+eqs(" adds ")("þ۽");@/
+eqs(" after: ")("ҽ");@/
+eqs(" at ")("ҽϠ");@/
+eqs(" b=")("");@/
+eqs(" bytes).")("");@/
+eqs(" c=")("");@/
+eqs(" columns)")("ՠ");@/
+eqs(" command, corrected")("ٽҽ");@/
+eqs(" command, ignored")("Ͼ۽");@/
+eqs(" d=")("");@/
+eqs(" doesn't match its definition")("ѽĠ");@/
+eqs(" extra")("۽");@/
+eqs(" for language ")("Ҡ");@/
+eqs(" g=")("");@/
+eqs(" goal height ")("ѽ");@/
+eqs(" has ")("ѽϠ");@/
+eqs(" has an extra }")("ս۽ѽϠ");@/
+eqs(" in font ")("Ϡ");@/
+eqs(" line")("ՠ");@/
+eqs(" memory locations dumped; current usage is ")@/
+("ҽѾϾսנĠ̠ҽΠ");@/
+eqs(" might split")("ננս");@/
+eqs(" minus ")("");@/
+eqs(" multiletter control sequences")("ʠӽ");@/
+eqs("! ")("");@/
+eqs(" on line ")("ՠϠ");@/
+eqs(" op")("ս");@/
+eqs(" out of ")("ҽ");@/
+eqs(" p=")("Ǡ");@/
+eqs(" page")("٠");@/
+eqs(" plus ")("۾");@/
+eqs(" preloaded font")("נѽ");@/
+eqs(" replacing ")("Ƞ");@/
+eqs(" strings of total length ")("ݠѠ");@/
+eqs(" t=")("");@/
+eqs(" the previous value will be retained")("נΠ̠ѽ");@/
+eqs(" via @@@@")("ҽ");@/
+eqs(" was complete")("Ѡ Ѿ נĠ");@/
+eqs(" was incomplete)")("");@/
+eqs(" words of font info for ")("þݽҽΠ");@/
+eqs("### ")("");@/
+eqs("### current page:")("ѾȠ٠");@/
+eqs("### recent contributions:")("νþ");@/
+eqs("%% goal height=")("ѽ");@/
+eqs("' after ")("ҽ Ѡ");@/
+eqs("' in ")("ϠѠ");@/
+eqs("' or `")("");@/
+eqs("' with `")("");@/
+eqs("(Please type a command or say `\end')")@/
+("ѽϠ");@/
+eqs("(\dump is performed only by INITEX)")@/
+("נȽΠĠĝ");@/
+eqs("(see the transcript file for additional information)")@/
+("ȽѾ þݽ");@/
+eqs("(That makes 100 errors; please try again.)")@/
+("ՠѾϠ׽נ");@/
+eqs("(interwoven alignment preambles are not allowed)")@/
+("ҾѠĠν");@/
+eqs(") ")("");@/
+eqs(") detected at line ")("ՠϠ");@/
+eqs(") has occurred while \output is active")@/
+(" ̠Ϡٝ");@/
+eqs(") in alignment at lines ")("ՠѠϠ");@/
+eqs(") in paragraph at lines ")("ՠѾ Ϡ");@/
+eqs("), should be at most ")("̠");@/
+eqs("), should be in the range 0..")("񽠰پϠ");@/
+eqs(");")("");@/
+eqs(")x")("");@/
+eqs("**")("");@/
+eqs("*** (cannot \read from terminal in nonstop modes)")@/
+("Πʠ ҽĠ̠ϑ");@/
+eqs("*** (job aborted, file error in nonstop mode)")@/
+("Ġ̠Ϡ ׽נѾ푠");@/
+eqs("*** (job aborted, no legal \end found)")@/
+("Ѿ푠");@/
+eqs(", ")("");@/
+eqs(", #")("");@/
+eqs(", current language ")("ѾȠҠ");@/
+eqs(", glue set ")("ѽ");@/
+eqs(", left justified")("ʠҽ");@/
+eqs(", max depth=")("̠");@/
+eqs(", natural size ")("ݠҽ");@/
+eqs(", prevgraf ")("");@/
+eqs(", right justified")("սѠҽ");@/
+eqs(", shifted ")("נ");@/
+eqs(", shrink ")("頧");@/
+eqs(", stretch ")("");@/
+eqs(", surrounded ")("ݾ̽");@/
+eqs("- ")("");@/
+eqs("--")("");@/
+eqs("->")("");@/
+eqs("...")("");@/
+eqs(": ")("");@/
+eqs(": line ")("ՠ");@/
+eqs(":hyphenmin")("̥");@/
+eqs("; all text was ignored after line ")("ՠҽ Ġ");@/
+eqs("; split(")("נ");@/
+eqs("; still untouched: ")("Ϡ");@/
+eqs("; all text was ignored after line ")("ՠҽ Ġ");@/
+eqs("< -")("");@/
+eqs("<*>")("");@/
+eqs("<-")("");@/
+eqs("=>")("");@/
+eqs("<aftereverydisplay> ")("ҽ");@/
+eqs("<argument> ")("ѻ");@/
+eqs("<everycr> ")("");@/
+eqs("<everydisplay> ")("");@/
+eqs("<everyhbox> ")("Ͼ");@/
+eqs("<everyjob> ")("Ѿ");@/
+eqs("<everymath> ")("۾");@/
+eqs("<everypar> ")("");@/
+eqs("<everysemidisplay> ")("");@/
+eqs("<everysemimath> ")("۾");@/
+eqs("<everysemipar> ")("");@/
+eqs("<everyvbox> ")("Ͼ");@/
+eqs("<insert> ")("Ϛ");@/
+eqs("<inserted text> ")("Ϡ");@/
+eqs("<mark> ")("");@/
+eqs("<output> ")("ٚ");@/
+eqs("<read ")("");@/
+eqs("<recently read> ")("Πν");@/
+eqs("<template> ")("");@/
+eqs("<to be read again> ")("ΠѾϠվ");@/
+eqs("<write> ")("");@/
+eqs("=from ")("ҽ");@/
+eqs("? ")("");@/
+eqs("?.?")("");@/
+eqs("@@")("");@/
+eqs("@@@@")("");@/
+eqs("@@firstpass")("");@/
+eqs("@@secondpass")("");@/
+eqs("AVAIL list clobbered at ")("ΠϠ");@/
+eqs("Argument of ")("ѻ");@/
+eqs("Arithmetic overflow")("۾Ѡ");@/
+eqs("BAD.")("");@/
+eqs("Bad character code")("վ");@/
+eqs("Bad command name")("վ");@/
+eqs("Bad delimiter code")("վҾսȠ");@/
+eqs("Bad flag at ")("ΠϠվ");@/
+eqs("Bad link, display aborted.")("վĽ");@/
+eqs("Bad mathchar")("վ۾Ѡ");@/
+eqs("Bad number")("վ");@/
+eqs("Bad register code")("վþƠ");@/
+eqs("Bad space factor")("վپ頿");@/
+eqs("Beginning to dump on file ")(" ѠĠҾ");@/
+eqs("CLOBBERED.")("");@/
+eqs("Completed box being shipped out")("ϾϾ");@/
+eqs("DVI output file")("ΠϠ");@/
+eqs("Dimension too large")("Ѿ");@/
+eqs("Double-AVAIL list clobbered at ")("ΠϠϟ");@/
+eqs("Doubly free location at ")("ѾנϠϽһ");@/
+eqs("EQUIV(")("Ͼ");@/
+eqs("ETC.")("");@/
+eqs("Emergency stop")("ѽ۽");@/
+eqs("End of file on the terminal!")(" Ѡ ");@/
+eqs("Extra ")("۽");@/
+eqs("I'm ignoring this; it doesn't match any \if.")@/
+ ("Ͼ");@/
+eqs("Extra alignment tab has been changed to ")("۽");@/
+eqs("FONT")("");@/
+eqs("Hyphenation trie of length ")("Ġ");@/
+eqs("I can't find file `")(" ");@/
+eqs("I can't go on meeting you like this")@/
+("ϠϽנѾϠ");@/
+eqs("I can't write on file `")(" Ѡ");@/
+eqs("I've inserted something that you may have forgotten.")@/
+("۽׾ս");
+eqs("(See the <inserted text> above.)")
+("ѠϠϠ");@/
+eqs("With luck, this will get me unwedged. But if you")@/
+("⦆נѾϽ̽");@/
+eqs("really didn't forget anything, try typing `2' now; then")@/
+("ĠѠ頽Ѡ");@/
+eqs("my insertion and my current dilemma will both disappear.")@/
+("נϾѾנ۽");@/
+eqs("IMPOSSIBLE.")("");@/
+eqs("INFO(")("ݽ");@/
+eqs("Illegal magnification has been changed to 1000")@/
+("ϽϠĠ");@/
+eqs("Illegal unit of measure (")("վҽ̽");@/
+eqs("Illegal parameter number in definition of ")@/
+("ĠϠѾ Ѿ");@/
+eqs("Improper use of `\activefont', ignored")@/
+("Ͼ띏ҽϾϾս");@/
+eqs("Invalid font identifier, ignored.")@/
+("ϾϾ ս");@/
+eqs("Improper `at' size (")("վҽϏ");@/
+eqs("Improper alphabetic constant")("վ");@/
+eqs("Incompatible list can't be unboxed")@/
+("ҾѠѾҾվϾ");@/
+eqs("Incompatible magnification (")("ѾҾվ");@/
+eqs("Interruption")("");@/
+eqs("Invalid code (")("վ");@/
+eqs("LINK(")("Ľ");@/
+eqs("Leaders not followed by proper glue")@/
+("ѽ Ϡվ");@/
+eqs("Memory usage before: ")("ҽ̠Ѿ");@/
+eqs("Missing ")("");
+eqs(" inserted")("נ۽");
+eqs("Missing # inserted in alignment preamble")@/
+("ϠѠϠ");@/
+eqs("Missing = inserted for ")("");@/
+eqs("Missing `to' inserted")("Ϡ");@/
+eqs("Missing character: There is no ")("");@/
+eqs("Missing control sequence inserted")("Ϡӽ");@/
+eqs("Missing font identifier")("렭վ");
+eqs("Missing number, treated as zero")("٠");@/
+eqs("Missing { inserted")("נ۽");
+eqs("Missing } inserted")("נ۽");
+eqs("NONEXISTENT.")("");@/
+eqs("New busy locs:")("ҽѾנ׽Ƞ");@/
+eqs("No pages of output.")("Π٠");@/
+eqs("Number too big")("Ѿ");@/
+eqs("OK")("ΠѾ");@/
+eqs("OK, entering ")("̠ѽΠѾ");@/
+eqs("Only one # is allowed per tab")("սҾĠҾ");@/
+eqs("Output written on ")(" Ѡ");@/
+eqs("Overfull \hbox (")("ՠϾ");@/
+eqs("Overfull \vbox (")("ՠϾ");@/
+eqs("Paragraph ended before ")("ҽ");@/
+eqs("Parameters must be numbered consecutively")@/
+("נѽѾנĠѾ");@/
+eqs("Patterns can be loaded only by INITEX")@/
+("נѽΠĠĠ");@/
+eqs("Please type another ")(" ѠϠ");@/
+eqs("Please type the name of your input file.")@/
+("ѽѠ ");@/
+eqs("SAVE(")("SAVE");@/
+eqs("SEMIFONT")("");@/
+eqs("TWINFONT")("Ͻ");@/
+eqs("Text line contains an invalid character")@/
+("ս̠");@/
+eqs("Transcript written on ")(" ѠѾ");@/
+eqs("The following box has been deleted:")("սנ̠РϾ");@/
+eqs("This can't happen (")("׾Ͼ齠Ľ");@/
+eqs("Tight \hbox (badness ")("Ͼ");@/
+eqs("Tight \vbox (badness ")("Ͼ");@/
+eqs("Too many }'s")("۽");@/
+eqs("You've closed more groups than you opened.")@/
+("սנҾҽנϽ");@/
+eqs("Such booboos are generally harmless, so keep going.")@/
+("ϠϽϾ̠");@/
+eqs("Transcript written on ")(" ѠѾ");@/
+eqs("Unbalanced ")("");@/
+eqs("Unbalanced write command")("ҽ");@/
+eqs("Unbalanced output routine")("ҽ٠");@/
+eqs("Your sneaky output routine has problematic {'s and/or }'s.")@/
+("ѽϠ٠ѠҾ");@/
+eqs("I can't handle that very well; good luck.")@/
+("׾ΠѠ");@/
+eqs("Undefined control sequence")("Ġӽ");@/
+eqs("Unknown node type!")("ξ׾");@/
+eqs("Unmatched ")("");@/
+eqs("Use of ")("ҽϾս");@/
+eqs("You already have nine parameters")@/
+("ĠѾ ϽĠ");@/
+eqs("You can't dump inside a group")@/
+("ĠϾϠ");@/
+eqs("You can't use a prefix with `")("Ѡ ");@/
+eqs("You can't use `")("");@/
+eqs("[]")("");@/
+eqs("[unknown command code!]")("ξ׾");@/
+eqs("[unknown dimen parameter!]")("ξ׾Ѿ“");@/
+eqs("[unknown extension!]")("ξ׾");@/
+eqs("[unknown integer parameter!]")("Ծ׾ѠѾ“");@/
+eqs("\endL or \endR problem (")("ս׽");@/
+eqs("\font")("");@/
+eqs("active ")("");@/
+eqs("alignment tab character ")("Ѡپ");@/
+eqs("argument")("ѻ");@/
+eqs("begin-group character ")("נ");@/
+eqs("bi_directional typesetting")("Ϡ");@/
+eqs("buffer size")("ҽ");@/
+eqs("current active font")("ѾȠ");@/
+eqs("current latin font")("ѾȠ");@/
+eqs("current semitic font")("ѾȠՠ");@/
+eqs("current vbox justification")("Ͼѽս");@/
+eqs("definition")("");@/
+eqs("display math")("۾Ѡ");@/
+eqs("end occurred ")("");@/
+eqs("end of alignment template")("Ѡ");@/
+eqs("end-group character ")(" ");@/
+eqs("etc.")("");@/
+eqs("fil")("");@/
+eqs("fill")("");@/
+eqs("filll")("");@/
+eqs("foul")("");@/
+eqs("glue")("");@/
+eqs("grouping levels")("");@/
+eqs("hash size")("ҽ hash");@/
+eqs("horizontal")("");@/
+eqs("ignored")(" ");@/
+eqs("input stack size")(" ҽ");@/
+eqs("insert>")("");@/
+eqs("inside a group at level ")("ѠϠϠ");@/
+eqs("internal vertical")("νϠ");@/
+eqs("l.")("");@/
+eqs("latin blank space ")("Πپ");@/
+eqs("left")("");@/
+eqs("macro parameter character ")("Ѿ ");@/
+eqs("macro")("");@/
+eqs("main memory size")("ٽ̠ҽ");@/
+eqs("manual")("");@/
+eqs("autoerr")("");
+eqs("autodir")("");
+eqs("autopar")("");
+eqs("autocol")("");
+eqs("manrbox")("սϾ");
+eqs("automath")("");
+eqs("math shift character ")("۾Ѡ̠");@/
+eqs("math")("۾");@/
+eqs("missing, ")("");@/
+eqs("mu inserted)")("Ϡ");@/
+eqs("mu")("");@/
+eqs("no")("");@/
+eqs("normal")("Ͼ");@/
+eqs("number of strings")("ѠϽ");@/
+eqs("off")("");@/
+eqs("on")("");@/
+eqs("penalty ")("");@/
+eqs("pool size")("ҽ");@/
+eqs("preamble")("");@/
+eqs("prevdepth ")("");@/
+eqs("pt inserted)")("Ϡ");@/
+eqs("pt too high")("");@/
+eqs("pt too wide")("");@/
+eqs("pt")("");@/
+eqs("pt), replaced by 10pt")("נϽϠĠ±");@/
+eqs("replaced by filll)")("Ƞ ");@/
+eqs("restricted horizontal")("");@/
+eqs("right")("ս");@/
+eqs("rule(")("");@/
+eqs("save size")("ҽ save");@/
+eqs("select main semitic font ")("ՠٽ");@/
+eqs("select latin font ")("");@/
+eqs("select twin semitic font ")("ՠϽ");@/
+eqs("semantic nest size")("ҽ");@/
+eqs("semitic blank space ")("ՠΠپ");@/
+eqs("spacefactor ")("پ");@/
+eqs("subscript character ")(" ");@/
+eqs("superscript character ")("Ġ");@/
+eqs("supressed ")("");@/
+eqs("switch base font ")("ٽ");@/
+eqs("switch twin font ")("Ͻ");@/
+eqs("text input levels")("");@/
+eqs("text")("");@/
+eqs("the latin character ")("");@/
+eqs("the latin letter ")("");@/
+eqs("the semitic character ")("ՠ");@/
+eqs("the semitic letter ")("ՠ");@/
+eqs("this will be denominator of:")("ҽѾ");@/
+eqs("total height ")("ѽ");@/
+eqs("undefined")("");@/
+eqs("use")("Ѿ");@/
+eqs("vertical")("");@/
+eqs("void")("");@/
+eqs("whatsit?")("");@/
+eqs("when ")(" ");@/
+eqs("{}")("");@/
+eqs("{case ")("");@/
+eqs("{false}")("Ͼ");@/
+eqs("{true}")("ό");@/
+eqs(banner)("TeXϽϠנѾŸ");@/
+eqs(initex)("Πđ");@/
+eqs(noformat)("נ");@/
+eqs("I have just deleted some text, as you asked.")@/
+("̠Ѡҽ렾נսϠ");@/
+eqs("You can now delete more, or insert, or whatever.")@/
+("ϠѾϠ̠ѽ");@/
+eqs("Sorry, I don't know how to help in this situation.")@/
+ ("ξՠҽϠխ");@/
+eqs("Sorry, I already gave what help I could...")@/
+ ("ѽϠҽѠխ");@/
+eqs("Maybe you should try asking a human?")@/
+ ("ҽ׾");@/
+eqs("An error might have occurred before I noticed any problems.")@/
+ ("׾ϽϠѠ׽נ׽ҽ ս");@/
+eqs("``If all else fails, read the instructions.''")@/
+ ("ѠϠ̠Ҿo");@/
+eqs("If you really absolutely need more capacity,")@/
+ ("ѽϠҾߠȠ");@/
+eqs("you can ask a wizard to enlarge me.")@/
+ ("Ϡ齠ߠսϠҽ");@/
+eqs("I'm broken. Please show this to someone who can fix can fix")@/
+ ("ѠĠϠѠ׽נ");@/
+eqs("One of your faux pas seems to have wounded me deeply...")@/
+ ("׾ѽנջנþҽ");@/
+eqs("in fact, I'm barely conscious. Please fix it and try again.")@/
+ ("ՠѾϠΠ׽Ѡҽ Ѿ");@/
+eqs("You rang?")@/
+ ("׽ϠѾ");@/
+eqs("Try to insert some instructions for me (e.g.,`I\showlists'),")@/
+ ("ϏѽϠ");@/
+eqs("unless you just want to quit by typing `X'.")@/
+ ("Ϡ Ѿ͏ѽ");@/
+eqs("I can handle only one magnification ratio per job. So I've")@/
+ ("ѾѾϠ");@/
+eqs("reverted to the magnification you used earlier on this run.")@/
+ ("Ͼս렾נҽ");@/
+eqs("The magnification ratio must be between 1 and 32768.")@/
+ ("׾");@/
+eqs("A forbidden control sequence occurred in skipped text.")@/
+ ("׽ϠӽϾ");@/
+eqs("This kind of error happens when you say `\if...' and forget")@/
+ ("Ѡѝנ׽");@/
+eqs("the matching `\fi'. I've inserted a `\fi'; this might work.")@/
+("נƭս۽ѝϠ");@/
+eqs("A funny symbol that I can't read has just been input.")@/
+ ("נѽΠϾ");@/
+eqs("Continue, and I'll forget that it ever happened.")@/
+ ("頽ѠϠϽ");@/
+eqs("If you say, e.g., `\def\a1{...}', then you must always")@/
+ ("ҽѽĝ");@/
+eqs("put `1' after `\a', since control sequence names are")@/
+("Ġ̠ҽӽսҠѠ");@/
+eqs("made up of letters only. The macro here has not been")@/
+("ѽΠѠϠ");@/
+eqs("followed by the required stuff, so I'm ignoring it.")@/
+ ("Ͼ");@/
+eqs("A number should have been here; I inserted `0'.")@/
+ ("ϠϠ");@/
+eqs("(If you can't figure out why I needed to see a number,")@/
+ ("Ϡʠՠq");@/
+eqs("look up `weird error' in the index to The TeXbook.)")@/
+(" `weired error' The TeXbook Ƚ");@/
+eqs("I'm forgetting what you said and using zero instead.")@/
+ ("Ͼս٠ҽϠנѠ");@/
+eqs("A register number must be between 0 and 255.")@/
+ ("׾þƠ");@/
+eqs("A dimen or count register number must be between 0 and 512.")@/
+ ("׾Ѿנ");@/
+eqs("A character number must be between 0 and 255.")@/
+ ("׾");@/
+eqs("Since I expected to read a number between 0 and 15,")@/
+ ("ҽ");@/
+eqs("A mathchar number must be between 0 and 36864, except 32768.")@/
+ ("׾۾Ѡ");@/
+eqs("I changed this one to zero.")@/
+ ("ϽϠĠ٠Ѡ");@/
+eqs("A numeric delimiter code must be between 0 and 2^{27}-1.")@/
+ ("׾ҾսȠ");@/
+eqs("A one-character control sequence belongs after a ` mark.")@/
+ ("נ̟ӽҽ");@/
+eqs("So I'm essentially inserting \0 here.")@/
+ ("ϠվսϠ");@/
+eqs("I can only go up to 2147483647='17777777777=""7FFFFFFF,")@/
+ ("ҽ ѠᠾĠ");@/
+eqs("so I'm using that number instead of yours.")@/
+ ("ѾѠנ");@/
+eqs("I dddon't go any higher than filll.")@/
+ ("Ľ ҽ");@/
+eqs("The unit of measurement in math glue must be mu.")@/
+ ("׾۾ѠϠҽ̽");@/
+eqs("To recover gracefully from this error, it's best to")@/
+ ("̠Ѡ̽սΠٽ");@/
+eqs("delete the erroneous units; e.g., type `2' to delete")@/
+ ("ѽ̠̠");@/
+eqs("I can't work with sizes bigger than about 19 feet.")@/
+ ("ҽ ѠҽϾ");@/
+eqs("Continue and I'll use the largest value I can.")@/
+ ("ΠѾѠѽϠϽ");@/
+eqs("I'm going to ignore the # sign you just used.")@/
+ ("ϾѠѾȠѽϠ");@/
+eqs("I've inserted the digit you should have used after the #.")@/
+ ("齠ѠҽվѾ");@/
+eqs("Type `1' to delete what you did use.")@/
+ ("ѽΠ̠");@/
+eqs("You meant to type ## instead of #, right?")@/
+ ("Ѡս");@/
+eqs("Or maybe a } was forgotten somewhere earlier, and things")@/
+ ("׾ՠϠѠս");@/
+eqs("are all screwed up? I'm going to assume that you meant ##.")@/
+ ("սנѽϠ");@/
+eqs("I was expecting to see `<', `=', or `>'. Didn't.")@/
+ ("");@/
+eqs("There should be exactly one # between &'s, when an")@/
+ ("սĠ̠Ϡѝѝ");@/
+eqs("none, so I've put one in; maybe that will work.")@/
+ ("נƭנϠνȠ");@/
+eqs("\halign or \valign is being set up. In this case you had")@/
+ ("נϠנ頾");@/
+eqs("more than one, so I'm ignoring all but the first.")@/
+ ("ϾѠ׽Ϡҽ");@/
+eqs("You have given more \span or & marks than there were")@/
+ ("ϽĠҽѾנϽϽ");@/
+eqs("in the preamble to the \halign or \valign now in progress.")@/
+ ("Ϡѝѝ");@/
+eqs("So I'll assume that you meant to type \cr instead.")@/
+ ("׽Ϡ՝렾נ");@/
+eqs("Sorry, but I'm not programmed to handle this case;")@/
+ ("ҽ խ");@/
+eqs("I'll just pretend that you didn't ask for it.")@/
+ ("սʠʠٽנʠ");@/
+eqs("If you're in the wrong mode, you might be able to")@/
+ ("ѽս׽̠Ϡ");@/
+eqs("Sorry, but I can't handle semitic characters in formulas, YET.")@/
+ ("۾ѠϠѠѾխ");@/
+eqs("I'll just use the latin letter `a' instead of your semitic character.")@/
+("̠נѾҽ `a' ѽ렽");@/
+eqs("Or maybe you're in the wrong mode. If so, you might be able to")@/
+ ("ѽսϠ׽̠Ϡנ");@/
+eqs("return to the right one by typing `I}' or `I$' or `I\par'.")@/
+ ("ϏϏ$ҾϠ̠Ϗ");@/
+eqs("Sorry, Pandora. (You sneaky devil.)")@/
+ ("נϠխ");@/
+eqs("I refuse to unbox an \hbox in vertical mode or vice versa.")@/
+ ("ѽΠ̠ϠϾ흠Ҿҽ");@/
+eqs("And I can't open any boxes in math mode.")@/
+ ("ҾѠϾ۾Ѡ̠Ϡ۠");@/
+eqs("I'll pretend you didn't say \long or \outer or \global.")@/
+ ("ᝠנ");@/
+eqs("I'll pretend you didn't say \long or \outer here.")@/
+ ("Ϡנ");@/
+eqs("Please don't say `\semifont cs...', say `\semifont\cs...'.")@/
+ ("ս띏ս띏");@/
+eqs("I've inserted an inaccessible control sequence so that your")@/
+ ("נĠĠϠϠϠӽ");@/
+eqs("You can recover graciously from this error, if you're")@/
+ ("ٽѠΠϠ");@/
+eqs("careful; see exercise 27.2 in The TeXbook.")@/
+ ("ϠĠ The TeXbook Ƚ");@/
+eqs("Please don't say `\def cs{...}', say `\def\cs{...}'.")@/
+ ("սĝսĝ");@/
+eqs("definition will be completed without mixing me up too badly.")@/
+ ("נĠ");@/
+eqs("Please use ")("");@/
+eqs(" for accents in math mode")("Ѿ۾Ѡ̠ϠὠѠ");@/
+eqs("I'm changing \accent to \mathaccent here; wish me luck.")@/
+ ("ϠנĠ۾ѿὝѠנὠ");@/
+eqs("(Accents are not the same in formulas as they are in text.)")@/
+ ("ϠὠϠὑ");@/
+eqs("You should have said `\read<number> to \cs'.")@/
+ ("靠");@/
+eqs("I'm going to look for the \cs now.")@/
+ ("靠");@/
+eqs("I'm going to use 0 instead of that illegal code value.")@/
+ ("ϾսҽϾѽϠ");@/
+eqs("I can't carry out that multiplication or division,")@/
+ ("ȽѠĠ۠");@/
+eqs("since the result is out of range.")@/
+ ("սҽѾΠپ̠");@/
+eqs("I'm forgetting what you said and not changing anything.")@/
+ ("ĠѠʠϾѠנ");@/
+eqs("I allow only values in the range 1..32767 here.")@/
+ ("ҾѠ񽠱ҽϾ頾Ϡ");@/
+eqs("I allow only nonnegative values here.")@/
+ ("ѽҾѠϾ頾Ϡ");@/
+eqs("Latin fonts can't be converted to twin fonts.")@/
+ ("ĠϽѠ");@/
+eqs("Latin fonts can't have twin fonts.")@/
+ ("׾׽ϠϽ");@/
+eqs("Latin fonts can't be twin fonts.")@/
+ ("׾Ͻ");@/
+eqs("Control sequence `\activefont' is only for inspection,")@/
+ ("սϾսҾ頎띏ӽ");@/
+eqs("not for font defining. I deleted your command.")@/
+ ("̠ѠנĠ");@/
+eqs
+("If you really want to define a font, just type `I\font' or `I\semifont'.")@/
+("ϏϏϠĠ");@/
+eqs("I can only handle fonts at positive sizes that are")@/
+ ("²ҽҽϠ렾Ġ");@/
+eqs("less than 2048pt, so I've changed what you said to 10pt.")@/
+ ("ϽϠĠ±ѠנѾ");@/
+eqs("(That was another \errmessage.)")@/
+ ("Ϡ");@/
+eqs("This error message was generated by an \errmessage")@/
+ ("սנϾ٠Π ");@/
+eqs("command, so I can't give any explicit help.")@/
+ ("ξՠҽپΠ");@/
+eqs("Pretend that you're Hercule Poirot: Examine all clues,")@/
+ ("Ѡѽѽ ");@/
+eqs("and deduce the truth by order and method.")@/
+ ("Ϡ̠ҽϾս");@/
+eqs("This isn't an error message; I'm just \showing something.")@/
+ ("ѠʠѽϠΠ ");@/
+eqs("Type `I\show...' to show more (e.g., \show\cs,")@/
+ ("ϏϠ");@/
+eqs("\showthe\count10, \showbox255, \showlists).")@/
+ ("ϾѾם");@/
+eqs("And type `I\tracingonline=1\show...' to show boxes and")@/
+ ("ѠϾĠѝϏϠ");@/
+eqs("lists on your terminal as well as in the transcript file.")@/
+ ("ϠѾ Ϡ Ѡ");@/
+eqs("`{...\dump}' is a no-no.")@/
+ ("սĝ");@/
+eqs("On this page there's a \write with fewer real {'s than }'s.")@/
+ ("ѽϠҽѽϠ٠");@/
+eqs("I can't handle that very well; good luck.")@/
+ ("׾ҽ ϠѠ̠ʠ");@/
+eqs("Go ahead. I am going to ignore it.")@/
+ ("ϾѠϠϽ");@/
+eqs("Your `\endL' command doesn't match any previous `\beginL' command.")@/
+ ("Ƞ렎ם頾נ");@/
+eqs("I have replaced your errorenous `\endL' by a correct `\endR' command,")@/
+ ("ȠϠսѠנϾ");@/
+eqs("assuming that you meant to end your previous `\beginR'.")@/
+ ("Ϡ ѠΠ렎սם׽Ϡ렾נ");@/
+eqs("If you don't need it, just type `1' and my insertion will be deleted.")@/
+ ("ΠѽѽҾ");@/
+eqs("But make sure that your previous `\beginR' would be endded correctly.")@/
+ ("נϽϠ 렎սם׾ս̠");@/
+eqs("Your `\endR' command doesn't match any previous `\beginR' command.")@/
+ ("Ƞ렎ם頾נս");@/
+eqs("I have replaced your errorenous `\endR' by a correct `\endL' command,")@/
+ ("ȠϠѠנϾս");@/
+eqs("assuming that you meant to end your previous `\beginL'.")@/
+ ("Ϡ ѠΠ렎ם׽Ϡ렾נ");@/
+eqs("But make sure that your previous `\beginL' would be endded correctly.")@/
+ ("נϽϠ 렎ם׾ս̠");@/
+eqs("The control sequence at the end of the top line")@/
+("սĠנΠ ՠӽ");@/
+eqs("of your error message was never \def'ed. If you have")@/
+("Ѿ흏ϽѠ׽Ϡ");@/
+eqs("misspelled it (e.g., `\hobx'), type `I' and the correct")@/
+("ϾϏٽϏѽҽ");@/
+eqs("spelling (e.g., `I\hbox'). Otherwise just continue,")@/
+("ϠϽΠѾ");@/
+eqs("and I'll forget about whatever was undefined.")@/
+("ΠսĠѠ");@/
+eqs("I suspect you've forgotten a `}', causing me to apply this")@/
+("սנ׾Ͼ齠Ƞ");@/
+eqs("control sequence to too much text. How can we recover?")@/
+ ("ϠѾ Ѡ");@/
+eqs("My plan is to forget the whole thing and hope for the best.")@/
+("׾׽Ϡ頽ѠʠѽϠ");@/
+eqs("I suspect you have forgotten a `}', causing me")@/
+("սנ׾Ͼ齠Ƞ");@/
+eqs("to read past where you wanted me to stop.")@/
+ ("נҽ");@/
+eqs("I'll try to recover; but if the error is serious,")@/
+("սȠΠ⦆ѠΠՠ");@/
+eqs("you'd better type `E' or `X' now and fix your file.")@/
+("ٽΠ͏Ҡս");@/
+eqs("Dimensions can be in units of em, ex, in, pt, pc,")@/
+("  ̽Ͼ");@/
+eqs("cm, mm, dd, cc, bp, or sp; but yours is a new one!")@/
+("נϽϠԽ ՠ ");@/
+eqs("I'll assume that you meant to say pt, for printer's points.")@/
+("ս נ頤Ƞנ");@/
+eqs("two letters. (See Chapter 27 of The TeXbook.)")@/
+(" The TeXbook Ƚ");@/
+eqs("You should say `\leaders <box or rule><hskip or vskip>'.")@/
+ ("پ頾پ隘ΠϾ");@/
+eqs("I found the <box or rule>, but there's no suitable")@/
+ ("վپ頾پ隠ϠѠΠϾ횠");@/
+eqs("<hskip or vskip>, so I'm ignoring these leaders.")@/
+ ("ϾѠ");@/
+eqs("Type <return> to proceed, S to scroll future error messages,")@/
+("ѾϽ<return>׽Ͼ");@/
+eqs("R to run without stopping, Q to run quietly,")@/
+("ԏՠѾϽÏĠѾϽ");@/
+eqs("I to insert something, ")("ϏȠϠ");@/
+eqs("E to edit your file,")(" ");@/
+eqs("1 or ... or 9 to ignore the next 1 to 9 tokens of input,")@/
+("Ƞ񽠱Ͼ");@/
+eqs("H for help, X to quit.")@/
+("Ѡ͏ҽΠ쏠");@/
+eqs("The file ended while I was skipping conditional text.")@/
+("Ѡ  נΠ̠Ϡ");@/
+eqs("I've run across a `}' that doesn't seem to match anything.")@/
+("Ƞʠ");@/
+eqs("For example, `\def\a#1{...}' and `\a}' would produce")@/
+("Π ĝ");@/
+eqs("this error. If you simply proceed now, the `\par' that")@/
+("ϠҽϾՠ");@/
+eqs("I've just inserted will cause me to report a runaway")@/
+("נѻΠϾս");@/
+eqs("argument that might be the root of the problem. But if")@/
+("ս۽⦆սٽᠬ̽");@/
+eqs("your `}' was spurious, just type `2' and it will go away.")@/
+(" ϽѾĠ");@/
+eqs("Command names can be equated only with another command name.")@/
+ ("נȠϠĠ");@/
+eqs("Only equated commands can be \noteqname.")@/
+ ("ננȠ頾");@/
+eqs("Diferent command names can be equated.")@/
+ ("נ頾");@/
+eqs("I'm ignoring the command and its parameters")@/
+ ("ΠϾѾ Ѡנ");@/
+eqs("File ended")("Ѡ ");@/
+eqs("Forbidden control sequence found")("נϠӽ");@/
+eqs(" while scanning ")("̠Ϡ");@/
+eqs("retaining")("ѽ");@/
+eqs("restoring")("Ҿ");@/
+eqs("input file name")("");@/
+eqs("file name for output")("");@/
+eqs("transcript file name")("Ѿ");@/
+eqs("format file name")("");@/
+eqs("output file name")("");@/
+eqs(" of ")("ӽ");@/
+eqs(" old eqname `")("");@/
+eqs("Font ")("TFM렐");@/
+eqs(" scaled ")("۾");@/
+eqs(" not loadable: Bad metric (TFM) file")("Ϡ");@/
+eqs(" not loadable: Metric (TFM) file not found")("");@/
+eqs(" not loaded: Not enough room left")@/
+ ("սȠʠנҾ")@/;
+eqs("speech language")("");@/
+eqs("speech direction")("");@/
+eqs("> \box")("Ͼ흠");@/
+eqs("Extra \endspecial, ignored")("Ͼ۽");@/
+eqs("\endspecial must be match with \beginspecial.")@/
+ ("םҽ ");
+end;
+tini
+@z
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% [55.1380] Change Index section number
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+@x
+@* \[55] Index.
+@y
+@* \[65] Index.
+@z
diff --git a/systems/parsitex/parsitex.pdf b/systems/parsitex/parsitex.pdf
new file mode 100644
index 0000000000..d4b9631ead
--- /dev/null
+++ b/systems/parsitex/parsitex.pdf
Binary files differ