diff options
Diffstat (limited to 'obsolete/systems/sisisi/unix')
84 files changed, 63158 insertions, 0 deletions
diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/german.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/german.ch new file mode 100644 index 0000000000..85179b9d47 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/german.ch @@ -0,0 +1,71 @@ +From helmut@eichow.tuwien.ac.at Thu Aug 12 11:31 MES 1993 +Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP + (16.8/16.2) id AA29128; Thu, 12 Aug 93 11:31:42 +0200 +Return-Path: <helmut@eichow.tuwien.ac.at> +Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9761; Thu, 12 Aug 1993 + 11:29:25 EDT +Date: Thu, 12 Aug 1993 11:29:23 EDT +From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at> +To: heinz@eichow.tuwien.ac.at +Cc: helmut@eichow.tuwien.ac.at +Message-Id: <00970E8C.653CC200.9761@eichow.tuwien.ac.at> +Subject: File: german_sty.cha +Status: RO + +@x +\gdef\umlauthigh{\def\"##1{{\accent127 ##1}}} +\gdef\umlautlow{\def\"{\protect\newumlaut}} +\gdef\newumlaut#1{\leavevmode\allowhyphens + \vbox{\baselineskip\z@skip \lineskip.25ex +@y +% \gdef\umlauthigh{\def\"##1{{\accent127 ##1}}} +\gdef\umlauthigh{\def\"##1{{\dirtyumlaut##1}}} + +%\gdef\umlautlow{\def\"{\protect\newumlaut}} + +\gdef\umlautlow{\def\"{\protect\dirtyumlautlow}} + +\gdef\dirtyumlautlow#1{\if#1A{\discretionary +{\kern 4321sp m\kern +196sp\kern-4517sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1O{\discretionary +{\kern 4321sp m\kern +214sp\kern-4535sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1U{\discretionary +{\kern 4321sp m\kern +220sp\kern-4541sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1a{\discretionary +{\kern 4321sp m\kern +228sp\kern-4549sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1o{\discretionary +{\kern 4321sp m\kern +246sp\kern-4567sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1u{\discretionary +{\kern 4321sp m\kern +252sp\kern-4573sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1s{\discretionary +{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{} +{\ss}}\else{\protect\newumlaut#1}\fi\fi\fi\fi\fi\fi\fi} + + +\gdef\newumlaut#1{\leavevmode + \vbox{\baselineskip\z@skip \lineskip.25ex +@z + +@x + {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}\allowhyphens} +\gdef\highumlaut#1{\leavevmode\allowhyphens + \accent127 #1\allowhyphens} + +\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\ +z@\ht\z@ +@y + {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}} + +\gdef\highumlaut#1{\leavevmode\dirtyumlaut#1} + +\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\ +z@\ht\z@ +@z + + diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/lplain.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/lplain.ch new file mode 100644 index 0000000000..4c3e0c9e52 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/lplain.ch @@ -0,0 +1,33 @@ +From helmut@eichow.tuwien.ac.at Thu Aug 12 11:33 MES 1993 +Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP + (16.8/16.2) id AA29169; Thu, 12 Aug 93 11:33:32 +0200 +Return-Path: <helmut@eichow.tuwien.ac.at> +Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9765; Thu, 12 Aug 1993 + 11:31:14 EDT +Date: Thu, 12 Aug 1993 11:31:13 EDT +From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at> +To: heinz@eichow.tuwien.ac.at +Message-Id: <00970E8C.A685B5A0.9765@eichow.tuwien.ac.at> +Subject: File: lplain_tex.cha +Status: RO + +@x +\def\"#1{{\accent"7F #1}} + +% LaTeX change: Make \t work in a moving argument. +@y +%\def\"#1{{\accent"7F #1}} <-- this definition is replaced by the +following: +\def\"#1{\dirtyumlaut#1} +\input def_umlaut + +% LaTeX change: Make \t work in a moving argument. +@z + +@x +\input hyphen +@y +\input sihyphen +@z + + diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/plain.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/plain.ch new file mode 100644 index 0000000000..de25f540f8 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/plain.ch @@ -0,0 +1,32 @@ +From helmut@eichow.tuwien.ac.at Thu Aug 12 11:32 MES 1993 +Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP + (16.8/16.2) id AA29132; Thu, 12 Aug 93 11:32:33 +0200 +Return-Path: <helmut@eichow.tuwien.ac.at> +Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9763; Thu, 12 Aug 1993 + 11:30:15 EDT +Date: Thu, 12 Aug 1993 11:30:14 EDT +From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at> +To: heinz@eichow.tuwien.ac.at +Message-Id: <00970E8C.837FA520.9763@eichow.tuwien.ac.at> +Subject: File: plain_tex.cha +Status: RO + +@x +\def\"#1{{\accent"7F #1}} +\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}} +@y +% \def\"#1{{\accent"7F #1}} <-- this definition is replaced by +the following: +\def\"#1{\dirtyumlaut#1} +\input def_umlaut % for testing purposes excluded + +\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}} +@z + +@x +\input hyphen +@y +\input sihyphen +@z + + diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/sigerman.sty b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/sigerman.sty new file mode 100644 index 0000000000..9f3396a76c --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/sigerman.sty @@ -0,0 +1,432 @@ +%GERMAN +% This is GERMAN.TEX or GERMAN.DOC or GERMAN.STY, Vers. 2.3c, 28 Aug 1990, +% collected by H.Partl (TU Wien), +% using ideas by W.Appelt, F.Hommes et al. (GMD St.Augustin), +% T.Hofmann (CIBA-GEIGY Basel), N.Schwarz (Uni Bochum), +% J.Schrod (TH Darmstadt), D.Armbruster (Uni Stuttgart), +% R.Schoepf (Uni Mainz, Uni Heidelberg) and F.Mittelbach +% (Uni Mainz, EDS Ruesselsheim), J.Knappen (Uni Mainz), +% P.Breitenlohner (MPI Muenchen), and many others. +% +% DOCUMENT STYLE OPTION for writing german texts +% with TeX version 2.x (Plain TeX) or with LaTeX version 2.09. +% +% It can be called via +% \input german +% or (with LaTeX) via +% \documentstyle[german]{anystyle} +% +% This file conforms to the standard for "Einheitliche deutsche +% TeX-Befehle" as proposed at the 6th Meeting of German TeX Users +% in Muenster, October 1987. It is available from DANTE (the users +% group of German speaking TeX users) at the Uni Heidelberg. +% +% Commands to be used by the end users: +% "a for Umlaut-a (like \"a), also for all other vowels. +% "s for sharp s (like \ss{}). +% "ck for ck to be hyphenated as k-k. +% "ff for ff to be hyphenated as ff-f, also for certain +% other consonants. +% "S for SS to be \uppercase{"s} +% "A, "CK, "FF etc. uppercase versions of the above +% "| to separate ligatures. +% "- like \-, but allowing hyphenation in the rest of +% the word. +% "" like "-, but producing no hyphen sign. +% "` or \glqq for german left double quotes (similar to ,,) +% "' or \grqq for german right double quotes (similar to ``) +% \glq for german left single quotes (similar to , ) +% \grq for german right single quotes (similar to ` ) +% "< or \flqq for french left double quotes (similar to <<) +% "> or \frqq for french right double quotes (similar to >>) +% \flq for french left single quotes (similar to < ) +% \frq for french right single quotes (similar to > ) +% \dq for the original quotes character (") +% \selectlanguage{n} to switch to the language specified by n, which +% should be one of the following command names: +% \austrian \french \english \german \USenglish; +% - this changes the date format, captions and (if +% ``multilingual TeX''is installed) hyphenation. +% \originalTeX to restore everything to the original settings +% of TeX and LaTeX (well, almost everything). +% \germanTeX to re-activate the german settings. +% +% Obsolete commands, provided for compatibility with existing +% applications: +% \3 for sharp s (like "s). +% \ck for ck to be hyphenated as k-k (like "ck). +% \setlanguage (if not defined, i.e. not with TeX 3.x) = \selectlanguage +% +% Lower level commands and features: +% \umlautlow redefines the Umlaut accent such that the dots come +% nearer to the letter and that hyphenation is enabled +% in the rest of the word. +% \umlauthigh restores \" to its original meaning. +% \ss is \lccode'd to enable hyphenation. +% \mdqon makes " an active (meta-) character that does the +% pretty things described above. +% \mdqoff restores " to its original meaning. +% \dospecials,\@sanitize are extended to include the ". +% \dateaustrian, \dategerman, \dateenglish, \dateUSenglish, \datefrench +% redefine \today to use the respective date format. +% \captionsgerman, \captionsenglish, \captionsfrench +% switch to german, english or french chapter captions +% and the like, resp. This will have an effect only +% if the document style files use the symbolic names +% \chaptername etc. instead of the original english +% words. +% \language a count that is set by \selectlanguage and can be used +% by document style declarations like +% \ifnum\language=\english .textengl.\else +% \ifnum\language=\german .textgerm.\fi\fi +% and/or by M.Ferguson's ``Multilingual T^eX''. +% +% Finally, \germanTeX is switched on. +% +% Notes: +% This file can be used both with Plain TeX and with LaTeX and other +% macro packages, and with the original TeX and LaTeX fonts. Usage +% of german hyphenation patterns is recommended to accompany this +% style file when writing german texts. +% The file should be read in vertical mode only (usually at the +% beginning of the document) to avoid spurious spaces. +% \undefined must be an undefined control sequence. +% Multiple calls of this file (e.g. at the beginning of each subfile) +% will do no harm. Only the first call (i.e., if \mdqon is undefined) +% performs all the definitions and settings. +% The catcode of @ remains unchanged after processing of this file. +% All definitions are global, the switching on of the german options +% is local. +% The commands \mdqon, \mdqoff, \originalTeX, \germanTeX, and +% \selectlanguage are ``fragile'' with LaTeX and should not be used +% within arguments of macro calls. +% In Plain TeX, `\protect' should be \let to `\relax' normally and to +% something like `\string' inside the arguments of `\write' or `\message' +% (see LaTeX.TEX for all the details). +% The command \umlautlow may need adaption to font parameters (see +% comments there for details). +% The commands \flqq, \frqq, \flq, \frq, and \datefrench in their +% present forms do not work properly with all font sizes and styles, +% they still require a better solution. A LaTeX-only solution might be +% to use {\ly(}, {\ly(\kern-0.166em(}, {\ly)} etc., but this would not +% work with Plain TeX. +% + +% \ifundefined{mdqon} or \mdqon=\relax +\expandafter\ifx\csname mdqon\endcsname\relax +% \then go ahead \else do nothing +\else \endinput \fi + +\message{Document Style Option `german' Version 2.3c of 28 Aug 1990} + +% \ifundefined{protect} +\ifx\protect\undefined +% \then define it +\let\protect=\relax \fi + +{\catcode`\@=11 % \makeatletter + +\gdef\allowhyphens{\penalty\@M \hskip\z@skip} +% {\nobreak \hskip 0pt plus 0pt\relax} + +\newcount\U@C\newbox\U@B\newdimen\U@D +% \gdef\umlauthigh{\def\"##1{{\accent127 ##1}}} +\gdef\umlauthigh{\def\"##1{{\dirtyumlaut##1}}} + +%\gdef\umlautlow{\def\"{\protect\newumlaut}} + +\gdef\umlautlow{\def\"{\protect\dirtyumlautlow}} + +\gdef\dirtyumlautlow#1{\if#1A{\discretionary +{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1O{\discretionary +{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1U{\discretionary +{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1a{\discretionary +{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1o{\discretionary +{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1u{\discretionary +{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1s{\discretionary +{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{} +{\ss}}\else{\protect\newumlaut#1}\fi\fi\fi\fi\fi\fi\fi} + + +\gdef\newumlaut#1{\leavevmode + \vbox{\baselineskip\z@skip \lineskip.25ex +% \baselineskip 0pt + \ialign{##\crcr\hidewidth + \setbox\U@B\hbox{#1}\U@D .01\p@\U@C\U@D + \U@D\ht\U@B\advance\U@D -1ex\divide\U@D \U@C + \U@C\U@D\U@D\the\fontdimen1\the\font + \multiply\U@D \U@C\divide\U@D 100\kern\U@D + \vbox to .20ex % <--- depending on the METAFONT parameters +% of the fonts, the height of this \vbox +% may vary around the value of .20ex -- +% just try out, which will look best! + {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}} + +\gdef\highumlaut#1{\leavevmode\dirtyumlaut#1} + +\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\z@\ht\z@ + \advance\dimen\z@ -\ht\tw@ + \setbox\z@\hbox{\lower\dimen\z@ \box\z@}\ht\z@\ht\tw@ \dp\z@\dp\tw@ } +% (this lowers the german left quotes to the same level as the comma.) + +\gdef\@glqq{{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi \leavevmode + \set@low@box{''}\box\z@\kern-.04em\allowhyphens\@SF\relax}} +\gdef\glqq{\protect\@glqq} +\gdef\@grqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi \kern-.07em``\kern.07em\@SF\relax} +\gdef\grqq{\protect\@grqq} +\gdef\@glq{{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi \leavevmode + \set@low@box{'}\box\z@\kern-.04em\allowhyphens\@SF\relax}} +\gdef\glq{\protect\@glq} +\gdef\@grq{\kern-.07em`\kern.07em} +\gdef\grq{\protect\@grq} +\gdef\@flqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi + \ifmmode \ll \else \leavevmode + \raise .2ex \hbox{$\scriptscriptstyle \ll $}\fi \@SF\relax} +\gdef\flqq{\protect\@flqq} +\gdef\@frqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi + \ifmmode \gg \else \leavevmode + \raise .2ex \hbox{$\scriptscriptstyle \gg $}\fi \@SF\relax} +\gdef\frqq{\protect\@frqq} +\gdef\@flq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi + \ifmmode < \else \leavevmode + \raise .2ex \hbox{$\scriptscriptstyle < $}\fi \@SF\relax} +\gdef\flq{\protect\@flq} +\gdef\@frq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi + \ifmmode > \else \leavevmode + \raise .2ex \hbox{$\scriptscriptstyle > $}\fi \@SF\relax} +\gdef\frq{\protect\@frq} + +% enable hyphenations after \ss: +\global\lccode`\^^Y=`\^^Y + +\global\let\original@three=\3 % Note that \3 may be defined or undefined. + +% add the quotes to the definitions of dospecials and sanitize: +\begingroup +\def\do{\noexpand\do\noexpand}% +% note that "\xdef" means "\global\edef" +\xdef\dospecials{\dospecials\do\"}% +% not ( \ifundefined{@sanitize} or \@sanitize=\relax ) = if LaTeX +\expandafter\ifx\csname @sanitize\endcsname\relax \else + \def\@makeother{\noexpand\@makeother\noexpand}% + \xdef\@sanitize{\@sanitize\@makeother\"}% +\fi +\endgroup + +\gdef\mdqon{\catcode`\"\active} +\gdef\mdqoff{\catcode`\"12 } + +\gdef\ck{\allowhyphens\discretionary{k-}{k}{ck}\allowhyphens} + +{\mdqoff +\gdef\@UMLAUT{\"} +\gdef\@MATHUMLAUT{\mathaccent"707F } +\gdef\@SS{\mathchar"7019 } +\gdef\dq{"} +} + +{\mdqon +\gdef"{\protect\active@dq} +\gdef\active@dq{\futurelet\next@after@dq\first@active@dq} +% For efficency, first the most frequent ones in a short macro only: +\gdef\first@active@dq#1{% + \ifx \next@after@dq\bgroup\dq {#1}% + \else \expandafter\ifx \space\next@after@dq\dq\space #1% + % The two lines above are needed before everything else, to take care of + % (empty or non-empty) groups and spaces after the active quote! + % Now the real thing: + \else \ifx #1s\ifmmode\@SS \else \ss\fi{}% + % note the empty group to avoid gobbling spaces. + \else \ifx #1a\ifmmode\@MATHUMLAUT a\else \@UMLAUT a\fi + \else \ifx #1o\ifmmode\@MATHUMLAUT o\else \@UMLAUT o\fi + \else \ifx #1u\ifmmode\@MATHUMLAUT u\else \@UMLAUT u\fi + \else \ifx #1A\ifmmode\@MATHUMLAUT A\else \@UMLAUT A\fi + \else \ifx #1O\ifmmode\@MATHUMLAUT O\else \@UMLAUT O\fi + \else \ifx #1U\ifmmode\@MATHUMLAUT U\else \@UMLAUT U\fi + \else \ifx #1`\glqq{}% + \else \ifx #1'\grqq{}% + \else \other@active@dq{#1}% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi } +% And now a separate command for the less frequent ones: +\gdef\other@active@dq#1{% + \ifx #1e\ifmmode\@MATHUMLAUT e\else \highumlaut e\fi + \else \ifx #1i\ifmmode\@MATHUMLAUT i\else \highumlaut\i \fi + \else \ifx #1E\ifmmode\@MATHUMLAUT E\else \highumlaut E\fi + \else \ifx #1I\ifmmode\@MATHUMLAUT I\else \highumlaut I\fi + \else \ifx #1SSS% + \else \ifx #1-\allowhyphens\-\allowhyphens + \else \ifx #1"\hskip\z@skip + \else \ifx #1|\discretionary{-}{}{\kern.03em}% + \else \ifx #1c\allowhyphens\discretionary{k-}{}{c}\allowhyphens + \else \ifx #1f\allowhyphens\discretionary{ff-}{}{f}\allowhyphens + \else \ifx #1l\allowhyphens\discretionary{ll-}{}{l}\allowhyphens + \else \ifx #1m\allowhyphens\discretionary{mm-}{}{m}\allowhyphens + \else \ifx #1n\allowhyphens\discretionary{nn-}{}{n}\allowhyphens + \else \ifx #1p\allowhyphens\discretionary{pp-}{}{p}\allowhyphens + \else \ifx #1t\allowhyphens\discretionary{tt-}{}{t}\allowhyphens + \else \ifx #1C\allowhyphens\discretionary{K-}{}{C}\allowhyphens + \else \ifx #1F\allowhyphens\discretionary{FF-}{}{F}\allowhyphens + \else \ifx #1L\allowhyphens\discretionary{LL-}{}{L}\allowhyphens + \else \ifx #1M\allowhyphens\discretionary{MM-}{}{M}\allowhyphens + \else \ifx #1N\allowhyphens\discretionary{NN-}{}{N}\allowhyphens + \else \ifx #1P\allowhyphens\discretionary{PP-}{}{P}\allowhyphens + \else \ifx #1T\allowhyphens\discretionary{TT-}{}{T}\allowhyphens + \else \ifx #1<\flqq{}% + \else \ifx #1>\frqq{}% + % note the empty group to avoid gobbling spaces. + \else \ifx #1\active@dq\hskip\z@skip + \else \dq #1% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi } +} % end of \mdqon + +\gdef\dateaustrian{\def\today{\number\day.~\ifcase\month\or + J\"anner\or Februar\or M\"arz\or April\or Mai\or Juni\or + Juli\or August\or September\or Oktober\or November\or Dezember\fi + \space\number\year}} +\gdef\dategerman{\def\today{\number\day.~\ifcase\month\or + Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or + Juli\or August\or September\or Oktober\or November\or Dezember\fi + \space\number\year}} +\gdef\dateUSenglish{\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year}} +\gdef\dateenglish{\def\today{\ifcase\day\or + 1st\or 2nd\or 3rd\or 4th\or 5th\or + 6th\or 7th\or 8th\or 9th\or 10th\or + 11th\or 12th\or 13th\or 14th\or 15th\or + 16th\or 17th\or 18th\or 19th\or 20th\or + 21st\or 22nd\or 237rd\or 24th\or 25th\or + 26th\or 27th\or 28th\or 29th\or 30th\or + 31st\fi + ~\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space \number\year}} +\gdef\datefrench{\def\today{\ifnum\day=1\relax 1\/$^{\rm er}$\else + \number\day\fi \space\ifcase\month\or + janvier\or f\'evrier\or mars\or avril\or mai\or juin\or + juillet\or ao\^ut\or septembre\or octobre\or novembre\or d\'ecembre\fi + \space\number\year}} + +% Here is, how you can modify the LaTeX document style files and option +% files, to benefit from the following \captionsxxxxx commands. Def's like +% \def\tableofcontents{\section*{Contents\markboth{CONTENTS}{CONTENTS}} +% \@starttoc{toc}} +% should be redefined by def's like +% \def\contentsname{Contents} % <--- +% \def\tableofcontents{\section*{\contentsname +% \markboth{\uppercase{\contentsname}}{\uppercase{\contentsname}}} +% \@starttoc{toc}} +% (it's best to put all these new lines to the end of the origignal files), +% and of course, you should modify the change date in the file header and +% in the \typeout command. + +\gdef\captionsgerman{% +\def\refname{Literatur}% +\def\abstractname{Zusammenfassung}% +\def\bibname{Literaturverzeichnis}% +\def\chaptername{Kapitel}% +\def\appendixname{Anhang}% +\def\contentsname{Inhaltsverzeichnis}% % oder nur: Inhalt +\def\listfigurename{Abbildungsverzeichnis}% +\def\listtablename{Tabellenverzeichnis}% +\def\indexname{Index}% +\def\figurename{Abbildung}% +\def\tablename{Tabelle}% % oder: Tafel +\def\partname{Teil}% +\def\enclname{Anlage(n)}% % oder: Beilage(n) +\def\ccname{Verteiler}% % oder: Kopien an +\def\headtoname{An}% +\def\pagename{Seite}} + +\gdef\captionsenglish{% +\def\refname{References}% +\def\abstractname{Abstract}% +\def\bibname{Bibliography}% +\def\chaptername{Chapter}% +\def\appendixname{Appendix}% +\def\contentsname{Contents}% +\def\listfigurename{List of Figures}% +\def\listtablename{List of Tables}% +\def\indexname{Index}% +\def\figurename{Figure}% +\def\tablename{Table}% +\def\partname{Part}% +\def\enclname{encl}% +\def\ccname{cc}% +\def\headtoname{To}% +\def\pagename{Page}} + +\gdef\captionsfrench{% +\def\refname{R\'ef\'erences}% +\def\abstractname{R\'esum\'e}% +\def\bibname{Bibliographie}% +\def\chaptername{Chapitre}% +\def\appendixname{Annexe}% +\def\contentsname{Table des mati\`eres}% +\def\listfigurename{Liste des figures}% +\def\listtablename{Liste des tableaux}% +\def\indexname{Index}% +\def\figurename{Figure}% +\def\tablename{Tableau}% +\def\partname{Partie}% +\def\enclname{P.~J.}% +\def\ccname{Copie \`a}% +\def\headtoname{A}% +\def\pagename{Page}} + +\newcount\l@nguage +% This will be re-declared as \language if the latter has not yet been +% declared neither by Ferguson's ``Multilingual T^eX'' nor by TeX 3: +% \ifundefined{language} +\expandafter\ifx\csname language\endcsname\relax +\global\let\language=\l@nguage +\fi + +\newcount\USenglish \global\USenglish=0 +\newcount\german \global\german=1 +\newcount\austrian \global\austrian=2 +\newcount\french \global\french=3 +\newcount\english \global\english=4 + +\gdef\selectlanguage#1{\language #1\relax + \expandafter\ifcase #1\relax + \dateUSenglish \captionsenglish \or + \dategerman \captionsgerman \or + \dateaustrian \captionsgerman \or + \datefrench \captionsfrench \or + \dateenglish \captionsenglish \fi} + +% \ifundefined{setlanguage} (= TeX version < 3 ) +\expandafter\ifx\csname setlanguage\endcsname\relax +\global\let\setlanguage=\selectlanguage +\fi + +\gdef\originalTeX{\mdqoff \umlauthigh \let\3\original@three + \selectlanguage{\USenglish}} +\gdef\germanTeX{\mdqon \umlautlow \let\3\ss + \selectlanguage{\german}} + +} % return to previous catcodes + +% Now, switch on what is appropriate for german: + +\germanTeX + +% This is the end of GERMAN.STY/DOC/TEX. +\endinput diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/silplain.tex b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/silplain.tex new file mode 100644 index 0000000000..2655612748 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/silplain.tex @@ -0,0 +1,1372 @@ +% File LPLAIN - Created 29 October 1985 from plain version 1.5CM +% - Last modified 20 October 1988 to take into account +% changes to PLAIN.TEX reported by Arthur Ogawa +% - Modified February 8, 1990 by Dominik Wujastyk to +% match the PLAIN.TEX meant for TeX 3.0 (\fmtname{plain}, +% \fmtversion{3.0}). +% - Modified March 15, 1990 by Frank Mittelbach to +% allow the use of this file both in TeX 2 and 3 +% +% This is the LaTeX version of the plain TeX format that's described in +% The TeXbook. All modifications can be found by searching for +% the word 'LaTeX'. +% N.B.: A version number is defined at the very end of this file; +% please change that number whenever the file is modified! +% And don't modify the file under any circumstances. +% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% + +\catcode`\{=1 % left brace is begin-group character +\catcode`\}=2 % right brace is end-group character +\catcode`\$=3 % dollar sign is math shift +\catcode`\&=4 % ampersand is alignment tab +\catcode`\#=6 % hash mark is macro parameter character +\catcode`\^=7 \catcode`\^^K=7 % circumflex and uparrow are for superscripts +\catcode`\_=8 \catcode`\^^A=8 % underline and downarrow are for subscripts +\catcode`\^^I=10 % ascii tab is a blank space +\chardef\active=13 \catcode`\~=\active % tilde is active +\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par" + +\message{Preloading the plain format: codes,} + +% We had to define the \catcodes right away, before the message line, +% since \message uses the { and } characters. +% When INITEX (the TeX initializer) starts up, +% it has defined the following \catcode values: +% \catcode`\^^@=9 % ascii null is ignored +% \catcode`\^^M=5 % ascii return is end-line +% \catcode`\\=0 % backslash is TeX escape character +% \catcode`\%=14 % percent sign is comment character +% \catcode`\ =10 % ascii space is blank space +% \catcode`\^^?=15 % ascii delete is invalid +% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters +% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters +% all others are type 12 (other) + +% Here is a list of the characters that have been specially catcoded: +\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~} +% (not counting ascii null, tab, linefeed, formfeed, return, delete) +% Each symbol in the list is preceded by \do, which can be defined +% if you want to do something to every item in the list. + +% We make @ signs act like letters, temporarily, to avoid conflict +% between user names and internal control sequences of plain format. +\catcode`@=11 + +% INITEX sets up \mathcode x=x, for x=0..127, except that +% \mathcode x=x+"7100, for x = `A to `Z and `a to `z; +% \mathcode x=x+"7000, for x = `0 to `9. +% The following changes define internal codes as recommended +% in Appendix C of The TeXbook: +\mathcode`\^^@="2201 % \cdot +\mathcode`\^^A="3223 % \downarrow +\mathcode`\^^B="010B % \alpha +\mathcode`\^^C="010C % \beta +\mathcode`\^^D="225E % \land +\mathcode`\^^E="023A % \lnot +\mathcode`\^^F="3232 % \in +\mathcode`\^^G="0119 % \pi +\mathcode`\^^H="0115 % \lambda +\mathcode`\^^I="010D % \gamma +\mathcode`\^^J="010E % \delta +\mathcode`\^^K="3222 % \uparrow +\mathcode`\^^L="2206 % \pm +\mathcode`\^^M="2208 % \oplus +\mathcode`\^^N="0231 % \infty +\mathcode`\^^O="0140 % \partial +\mathcode`\^^P="321A % \subset +\mathcode`\^^Q="321B % \supset +\mathcode`\^^R="225C % \cap +\mathcode`\^^S="225B % \cup +\mathcode`\^^T="0238 % \forall +\mathcode`\^^U="0239 % \exists +\mathcode`\^^V="220A % \otimes +\mathcode`\^^W="3224 % \leftrightarrow +\mathcode`\^^X="3220 % \leftarrow +\mathcode`\^^Y="3221 % \rightarrow +\mathcode`\^^Z="8000 % \ne +\mathcode`\^^[="2205 % \diamond +\mathcode`\^^\="3214 % \le +\mathcode`\^^]="3215 % \ge +\mathcode`\^^^="3211 % \equiv +\mathcode`\^^_="225F % \lor +\mathcode`\ ="8000 % \space +\mathcode`\!="5021 +\mathcode`\'="8000 % ^\prime +\mathcode`\(="4028 +\mathcode`\)="5029 +\mathcode`\*="2203 % \ast +\mathcode`\+="202B +\mathcode`\,="613B +\mathcode`\-="2200 +\mathcode`\.="013A +\mathcode`\/="013D +\mathcode`\:="303A +\mathcode`\;="603B +\mathcode`\<="313C +\mathcode`\=="303D +\mathcode`\>="313E +\mathcode`\?="503F +\mathcode`\[="405B +\mathcode`\\="026E % \backslash +\mathcode`\]="505D +\mathcode`\_="8000 % \_ +\mathcode`\{="4266 +\mathcode`\|="026A +\mathcode`\}="5267 +\mathcode`\^^?="1273 % \smallint + +% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x, +% and \lccode`x=`x, \lccode`X=`x; all other values are zero. +% No changes to those tables are needed in plain TeX format. + +% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999 +% for uppercase letters. The following changes are needed: +\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0 +% The \nonfrenchspacing macro will make further changes to \sfcode values. + +% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0 +\delcode`\(="028300 +\delcode`\)="029301 +\delcode`\[="05B302 +\delcode`\]="05D303 +\delcode`\<="26830A +\delcode`\>="26930B +\delcode`\/="02F30E +\delcode`\|="26A30C +\delcode`\\="26E30F +% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails! + +% To make the plain macros more efficient in time and space, +% several constant values are declared here as control sequences. +% If they were changed, anything could happen; so they are private symbols. +\chardef\@ne=1 +\chardef\tw@=2 +\chardef\thr@@=3 +\chardef\sixt@@n=16 +\chardef\@cclv=255 +\mathchardef\@cclvi=256 +\mathchardef\@m=1000 +\mathchardef\@M=10000 +\mathchardef\@MM=20000 + +% Allocation of registers + +% Here are macros for the automatic allocation of \count, \box, \dimen, +% \skip, \muskip, and \toks registers, as well as \read and \write +% stream numbers, \fam codes, \language codes, and \insert numbers. + +\message{registers,} + +% When a register is used only temporarily, it need not be allocated; +% grouping can be used, making the value previously in the register return +% after the close of the group. The main use of these macros is for +% registers that are defined by one macro and used by others, possibly at +% different nesting levels. All such registers should be defined through +% these macros; otherwise conflicts may occur, especially when two or more +% more macro packages are being used at once. + +% The following counters are reserved: +% 0 to 9 page numbering +% 10 count allocation +% 11 dimen allocation +% 12 skip allocation +% 13 muskip allocation +% 14 box allocation +% 15 toks allocation +% 16 read file allocation +% 17 write file allocation +% 18 math family allocation +% 19 language allocation +% 20 insert allocation +% 21 the most recently allocated number +% 22 constant -1 +% New counters are allocated starting with 23, 24, etc. Other registers are +% allocated starting with 10. This leaves 0 through 9 for the user to play +% with safely, except that counts 0 to 9 are considered to be the page and +% subpage numbers (since they are displayed during output). In this scheme, +% \count 10 always contains the number of the highest-numbered counter that +% has been allocated, \count 14 the highest-numbered box, etc. +% Inserts are given numbers 254, 253, etc., since they require a \count, +% \dimen, \skip, and \box all with the same number; \count 19 contains the +% lowest-numbered insert that has been allocated. Of course, \box255 is +% reserved for \output; \count255, \dimen255, and \skip255 can be used freely. + +% It is recommended that macro designers always use +% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and +% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255. +% This will prevent ``save stack buildup'' that might otherwise occur. + +\count10=22 % allocates \count registers 23, 24, ... +\count11=9 % allocates \dimen registers 10, 11, ... +\count12=9 % allocates \skip registers 10, 11, ... +\count13=9 % allocates \muskip registers 10, 11, ... +\count14=9 % allocates \box registers 10, 11, ... +\count15=9 % allocates \toks registers 10, 11, ... +\count16=-1 % allocates input streams 0, 1, ... +\count17=-1 % allocates output streams 0, 1, ... +\count18=3 % allocates math families 4, 5, ... +\count19=0 % allocates \language codes 1, 2, ... +\count20=255 % allocates insertions 254, 253, ... +\countdef\insc@unt=20 % the insertion counter +\countdef\allocationnumber=21 % the most recent allocation +\countdef\m@ne=22 \m@ne=-1 % a handy constant +\def\wlog{\immediate\write\m@ne} % write on log file (only) + +% Here are abbreviations for the names of scratch registers +% that don't need to be allocated. + +\countdef\count@=255 +\dimendef\dimen@=0 +\dimendef\dimen@i=1 % global only +\dimendef\dimen@ii=2 +\skipdef\skip@=0 +\toksdef\toks@=0 + +% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo +% and \foo will be defined (with \countdef) to be the next counter. +% To find out which counter \foo is, you can look at \allocationnumber. +% Since there's no \boxdef command, \chardef is used to define a \newbox, +% \newinsert, \newfam, and so on. +% LaTeX change: remove \outer from \newcount and \newdimen (FMi) +% This is necessary to use \newcount inside \if... +% later on. + +\def\newcount{\alloc@0\count\countdef\insc@unt} +\def\newdimen{\alloc@1\dimen\dimendef\insc@unt} +\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt} +\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi} +\outer\def\newbox{\alloc@4\box\chardef\insc@unt} +\let\newtoks=\relax % we do this to allow plain.tex to be read in twice +\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}} +\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi} +\outer\def\newread{\alloc@6\read\chardef\sixt@@n} +\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n} +\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n} +\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi} +\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne + \ch@ck#1#4#2% make sure there's still room + \allocationnumber=\count1#1% + \global#3#5=\allocationnumber + \wlog{\string#5=\string#2\the\allocationnumber}} +\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne + \ch@ck0\insc@unt\count + \ch@ck1\insc@unt\dimen + \ch@ck2\insc@unt\skip + \ch@ck4\insc@unt\box + \allocationnumber=\insc@unt + \global\chardef#1=\allocationnumber + \wlog{\string#1=\string\insert\the\allocationnumber}} +\def\ch@ck#1#2#3{\ifnum\count1#1<#2% + \else\errmessage{No room for a new #3}\fi} + +% Here are some examples of allocation. +\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen> +\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow + +% LaTeX change: the PLAIN \centering dimension conflicts with +% LaTeX's \centering command, so it is redefined to \@centering. +% This dimension is used by LaTeX. + +\newskip\@centering \@centering=0pt plus 1000pt minus 1000pt + +\newdimen\p@ \p@=1pt % this saves macro space and time +\newdimen\z@ \z@=0pt % can be used both for 0pt and 0 +\newskip\z@skip \z@skip=0pt plus0pt minus0pt +\newbox\voidb@x % permanently void box register + +% And here's a different sort of allocation: +% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo. +\outer\def\newif#1{\count@\escapechar \escapechar\m@ne + \expandafter\expandafter\expandafter + \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}% + \expandafter\expandafter\expandafter + \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}% + \@if#1{false}\escapechar\count@} % the condition starts out false +\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname} +{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required + +\message{setting up things for TeX 3.0, } + +% If this file is used in an old TeX we define the new features +% of TeX 3.0 as simple macros or counters so that files that uses +% these features can be processed in such an environment +% (They will however produce some other results). + +\ifx\undefined\inputlineno + \newcount\inputlineno + \inputlineno-1 % this could be used to detect that + % an old TeX is in force + \newcount\language + \newcount\lefthyphenmin + \newcount\righthyphenmin + \newcount\errorcontextlines + \newcount\holdinginserts + \newdimen\emergencystretch + \newcount\badness + \let\noboundary\relax + \newcount\setlanguage +\fi + +% Assign initial values to TeX's parameters + +\message{parameters,} + +% All of TeX's numeric parameters are listed here, +% but the code is commented out if no special value needs to be set. +% INITEX makes all parameters zero except where noted. + +\pretolerance=100 +\tolerance=200 % INITEX sets this to 10000 +\hbadness=1000 +\vbadness=1000 +\linepenalty=10 +\hyphenpenalty=50 +\exhyphenpenalty=50 +\binoppenalty=700 +\relpenalty=500 +\clubpenalty=150 +\widowpenalty=150 +\displaywidowpenalty=50 +\brokenpenalty=100 +\predisplaypenalty=10000 +% \postdisplaypenalty=0 +% \interlinepenalty=0 +% \floatingpenalty=0, set during \insert +% \outputpenalty=0, set before TeX enters \output +\doublehyphendemerits=10000 +\finalhyphendemerits=5000 +\adjdemerits=10000 +% \looseness=0, cleared by TeX after each paragraph +% \pausing=0 +% \holdinginserts=0 +% \tracingonline=0 +% \tracingmacros=0 +% \tracingstats=0 +% \tracingparagraphs=0 +% \tracingpages=0 +% \tracingoutput=0 +\tracinglostchars=1 +% \tracingcommands=0 +% \tracingrestores=0 +% \language=0 +\uchyph=1 +% \lefthyphenmin=2 \righthyphenmin=3 set below +% \globaldefs=0 +% \maxdeadcycles=25 % INITEX does this +% \hangafter=1 % INITEX does this, also TeX after each paragraph +% \fam=0 +% \mag=1000 % INITEX does this +% \escapechar=`\\ % INITEX does this +\defaulthyphenchar=`\- +\defaultskewchar=-1 +% \endlinechar=`\^^M % INITEX does this +\newlinechar=-1 +\delimiterfactor=901 +% \time=now % TeX does this at beginning of job +% \day=now % TeX does this at beginning of job +% \month=now % TeX does this at beginning of job +% \year=now % TeX does this at beginning of job +\showboxbreadth=5 +\showboxdepth=3 +\errorcontextlines=5 + +\hfuzz=0.1pt +\vfuzz=0.1pt +\overfullrule=5pt +\hsize=6.5in +\vsize=8.9in +\maxdepth=4pt +\splitmaxdepth=\maxdimen +\boxmaxdepth=\maxdimen +% \lineskiplimit=0pt, changed by \normalbaselines +\delimitershortfall=5pt +\nulldelimiterspace=1.2pt +\scriptspace=0.5pt +% \mathsurround=0pt +% \predisplaysize=0pt, set before TeX enters $$ +% \displaywidth=0pt, set before TeX enters $$ +% \displayindent=0pt, set before TeX enters $$ +\parindent=20pt +% \hangindent=0pt, zeroed by TeX after each paragraph +% \hoffset=0pt +% \voffset=0pt + +% \baselineskip=0pt, changed by \normalbaselines +% \lineskip=0pt, changed by \normalbaselines +\parskip=0pt plus 1pt +\abovedisplayskip=12pt plus 3pt minus 9pt +\abovedisplayshortskip=0pt plus 3pt +\belowdisplayskip=12pt plus 3pt minus 9pt +\belowdisplayshortskip=7pt plus 3pt minus 4pt +% \leftskip=0pt +% \rightskip=0pt +\topskip=10pt +\splittopskip=10pt +% \tabskip=0pt +% \spaceskip=0pt +% \xspaceskip=0pt +\parfillskip=0pt plus 1fil + +\thinmuskip=3mu +\medmuskip=4mu plus 2mu minus 4mu +\thickmuskip=5mu plus 5mu + +% We also define special registers that function like parameters: +\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt +\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt +\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt +\newskip\normalbaselineskip \normalbaselineskip=12pt +\newskip\normallineskip \normallineskip=1pt +\newdimen\normallineskiplimit \normallineskiplimit=0pt +\newdimen\jot \jot=3pt +\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100 +\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100 + +% Definitions for preloaded fonts + +\def\magstephalf{1095 } +\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax} + +% Fonts assigned to \preloaded are not part of "plain TeX", +% but they are preloaded so that other format packages can use them. +% For example, if another set of macros says "\font\ninerm=cmr9", +% TeX will not have to reload the font metric information for cmr9. + +% LaTeX font definitions are taken from the file LFONTS.TEX, +% so all of PLAIN's font definitions are commented out. + +%\message{fonts,} +% +%\font\tenrm=cmr10 % roman text +%\font\preloaded=cmr9 +%\font\preloaded=cmr8 +%\font\sevenrm=cmr7 +%\font\preloaded=cmr6 +%\font\fiverm=cmr5 +% +%\font\teni=cmmi10 % math italic +%\font\preloaded=cmmi9 +%\font\preloaded=cmmi8 +%\font\seveni=cmmi7 +%\font\preloaded=cmmi6 +%\font\fivei=cmmi5 +% +%\font\tensy=cmsy10 % math symbols +%\font\preloaded=cmsy9 +%\font\preloaded=cmsy8 +%\font\sevensy=cmsy7 +%\font\preloaded=cmsy6 +%\font\fivesy=cmsy5 +% +%\font\tenex=cmex10 % math extension +% +%\font\preloaded=cmss10 % sans serif +%\font\preloaded=cmssq8 +% +%\font\preloaded=cmssi10 % sans serif italic +%\font\preloaded=cmssqi8 +% +%\font\tenbf=cmbx10 % boldface extended +%\font\preloaded=cmbx9 +%\font\preloaded=cmbx8 +%\font\sevenbf=cmbx7 +%\font\preloaded=cmbx6 +%\font\fivebf=cmbx5 +% +%\font\tentt=cmtt10 % typewriter +%\font\preloaded=cmtt9 +%\font\preloaded=cmtt8 +% +%\font\preloaded=cmsltt10 % slanted typewriter +% +%\font\tensl=cmsl10 % slanted roman +%\font\preloaded=cmsl9 +%\font\preloaded=cmsl8 +% +%\font\tenit=cmti10 % text italic +%\font\preloaded=cmti9 +%\font\preloaded=cmti8 +%\font\preloaded=cmti7 +% +%\message{more fonts,} +%\font\preloaded=cmu10 % unslanted text italic +% +%\font\preloaded=cmmib10 % bold math italic +%\font\preloaded=cmbsy10 % bold math symbols +% +%\font\preloaded=cmcsc10 % caps and small caps +% +%\font\preloaded=cmssbx10 % sans serif bold extended +% +%\font\preloaded=cmdunh10 % Dunhill style +% +%\font\preloaded=cmr7 scaled \magstep4 % for titles +%\font\preloaded=cmtt10 scaled \magstep2 +%\font\preloaded=cmssbx10 scaled \magstep2 +% +%\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols +% +%% Additional \preloaded fonts can be specified here. +%% (And those that were \preloaded above can be eliminated.) +% +%\let\preloaded=\undefined % preloaded fonts must be declared anew later. +% +%\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177 +%\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60 +% +%\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm +%\def\rm{\fam\z@\tenrm} +%\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei +%\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni} +%\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy +%\def\cal{\fam\tw@} +%\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex +%\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4 +%\textfont\itfam=\tenit +%\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5 +%\textfont\slfam=\tensl +%\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6 +%\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf +%\scriptscriptfont\bffam=\fivebf +%\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7 +%\textfont\ttfam=\tentt + +% Macros for setting ordinary text +\message{macros,} + +\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m + \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m} +\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000% + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 } + +\def\normalbaselines{\lineskip\normallineskip + \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit} + +\def\^^M{\ } % control <return> = control <space> +\def\^^I{\ } % same for <tab> + +\def\lq{`} \def\rq{'} +\def\lbrack{[} \def\rbrack{]} + +\let\endgraf=\par \let\endline=\cr + +\def\space{ } +\def\empty{} +\def\null{\hbox{}} + +\let\bgroup={ \let\egroup=} + +% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}' +% since this allows, for example, `\let\par=\cr \obeylines \halign{...' +{\catcode`\^^M=\active % these lines must end with % + \gdef\obeylines{\catcode`\^^M\active \let^^M\par}% + \global\let^^M\par} % this is in case ^^M appears in a \write +\def\obeyspaces{\catcode`\ \active} +{\obeyspaces\global\let =\space} + +\def\loop#1\repeat{\def\body{#1}\iterate} +\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next} +\let\repeat=\fi % this makes \loop...\if...\repeat skippable + +\def\thinspace{\kern .16667em } +\def\negthinspace{\kern-.16667em } +\def\enspace{\kern.5em } + +\def\enskip{\hskip.5em\relax} +\def\quad{\hskip1em\relax} +\def\qquad{\hskip2em\relax} + +\def\smallskip{\vskip\smallskipamount} +\def\medskip{\vskip\medskipamount} +\def\bigskip{\vskip\bigskipamount} + +\def\nointerlineskip{\prevdepth-1000\p@} +\def\offinterlineskip{\baselineskip-1000\p@ + \lineskip\z@ \lineskiplimit\maxdimen} + +\def\vglue{\afterassignment\vgl@\skip@=} +\def\vgl@{\par \dimen@\prevdepth \hrule height\z@ + \nobreak\vskip\skip@ \prevdepth\dimen@} +\def\hglue{\afterassignment\hgl@\skip@=} +\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@ + \nobreak\hskip\skip@ \spacefactor\count@} + +\def~{\penalty\@M \ } % tie +\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-' + +\def\break{\penalty-\@M} +\def\nobreak{\penalty \@M} +\def\allowbreak{\penalty \z@} + +\def\filbreak{\par\vfil\penalty-200\vfilneg} +\def\goodbreak{\par\penalty-500 } +\def\eject{\par\break} +\def\supereject{\par\penalty-\@MM} + +\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi} +\def\smallbreak{\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi} +\def\medbreak{\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi} +\def\bigbreak{\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi} + +% \line changed to \@@line because LaTeX redefines \line +\def\@@line{\hbox to\hsize} +\def\leftline#1{\@@line{#1\hss}} +\def\rightline#1{\@@line{\hss#1}} +\def\centerline#1{\@@line{\hss#1\hss}} +% end of LaTeX \line -> \@@line change + +\def\rlap#1{\hbox to\z@{#1\hss}} +\def\llap#1{\hbox to\z@{\hss#1}} + +\def\m@th{\mathsurround=\z@} +\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@ + \m@th \underline{\box\z@}$} + +\newbox\strutbox +\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@} +\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} + +\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out +\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign +\newcount\mscount +\def\multispan#1{\omit \mscount#1 + \loop\ifnum\mscount>\@ne \sp@n\repeat} +\def\sp@n{\span\omit\advance\mscount\m@ne} + +% LaTeX has its own tabbing environment, so PLAIN's is disabled. +% +%\newif\ifus@ \newif\if@cr +%\newbox\tabs \newbox\tabsyet \newbox\tabsdone +% +%\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null} +%\def\settabs{\setbox\tabs\null \futurelet\next\sett@b} +%\let\+=\relax % in case this file is being read in twice +%\def\sett@b{\ifx\next\+\let\next\relax +% \def\next{\afterassignment\s@tt@b\let\next}% +% \else\let\next\s@tcols\fi\next} +%\def\s@tt@b{\let\next\relax\us@false\m@ketabbox} +%\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+ +%\outer\def\+{\tabalign} +%\def\s@tcols#1\columns{\count@#1 \dimen@\hsize +% \loop\ifnum\count@>\z@ \@nother \repeat} +%\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@ +% \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}% +% \advance\dimen@-\dimen@ii \advance\count@\m@ne} +% +%\def\m@ketabbox{\begingroup +% \global\setbox\tabsyet\copy\tabs +% \global\setbox\tabsdone\null +% \def\cr{\@crtrue\crcr\egroup\egroup +% \ifus@\unvbox\z@\lastbox\fi\endgroup +% \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}% +% \setbox\z@\vbox\bgroup\@crfalse +% \ialign\bgroup&\t@bbox##\t@bb@x\crcr} +% +%\def\t@bbox{\setbox\z@\hbox\bgroup} +%\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column +% \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet +% \global\setbox\@ne\lastbox}% now \box\@ne holds its size +% \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}% +% \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi +% \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi +% \box\z@} + +\def\hang{\hangindent\parindent} +\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces} +\def\item{\par\hang\textindent} +\def\itemitem{\par\indent \hangindent2\parindent \textindent} +\def\narrower{\advance\leftskip\parindent + \advance\rightskip\parindent} + +% LaTeX has its own sectioning macros +%\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250 +% \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip +% \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent} + +\outer\def\proclaim #1. #2\par{\medbreak + \noindent{\bf#1.\enspace}{\sl#2\par}% + \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi} + +\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax} +\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only + +\chardef\%=`\% +\chardef\&=`\& +\chardef\#=`\# +\chardef\$=`\$ +\chardef\ss="19 +\chardef\ae="1A +\chardef\oe="1B +\chardef\o="1C +\chardef\AE="1D +\chardef\OE="1E +\chardef\O="1F +\chardef\i="10 \chardef\j="11 % dotless letters +\def\aa{\accent23a} +\def\l{\char32l} +\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}} + +\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary +\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}} +\def\AA{\leavevmode\setbox0\hbox{h}\dimen@\ht0\advance\dimen@-1ex% + \rlap{\raise.67\dimen@\hbox{\char'27}}A} + +\def\mathhexbox#1#2#3{\leavevmode + \hbox{$\m@th \mathchar"#1#2#3$}} +\def\dag{\mathhexbox279} +\def\ddag{\mathhexbox27A} +\def\S{\mathhexbox278} +\def\P{\mathhexbox27B} + +\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex% + \ialign{##\crcr#1\crcr}}} % put characters over each other +\def\ooalign{\lineskiplimit-\maxdimen \oalign} + +% LaTeX change: \d, \b, \c redefined to work in a moving argument. +\def\pd#1{\oalign{#1\crcr\hidewidth.\hidewidth}} +\def\d{\protect\pd} + +\def\pb#1{\oalign{#1\crcr\hidewidth + \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}} +\def\b{\protect\pb} + +\def\pc#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1% + \else{\ooalign{\hidewidth\char24\hidewidth\crcr\unhbox\z@}}\fi} +\def\c{\protect\pc} +% end of LaTeX change to \d, \b, \c + +\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}} + +% LaTeX change: \ldots is redefined to do essentially what Plain's \dots does, +% so ... +\def\dots{\ldots} + +\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX} + +\def\`#1{{\accent18 #1}} +\def\'#1{{\accent19 #1}} +\def\v#1{{\accent20 #1}} \let\^^_=\v +\def\u#1{{\accent21 #1}} \let\^^S=\u +\def\=#1{{\accent22 #1}} +\def\^#1{{\accent94 #1}} \let\^^D=\^ +\def\.#1{{\accent95 #1}} +\def\H#1{{\accent"7D #1}} +\def\~#1{{\accent"7E #1}} +%\def\"#1{{\accent"7F #1}} <-- this definition is replaced by the following: +\def\"#1{\dirtyumlaut#1} +\input def_umlaut + +% LaTeX change: Make \t work in a moving argument. +\def\pt#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}} +\def\t{\protect\pt} + +% LaTeX change: \kern\z@ added to end of \hrulefill and \dotfill +% to make them work in `tabular' and `array' environments. +% (Change made 24 July 1987). +\def\hrulefill{\leaders\hrule\hfill\kern\z@} +\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill\kern\z@} + +\def\rightarrowfill{$\m@th\mathord-\mkern-6mu% + \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill + \mkern-6mu\mathord\rightarrow$} +\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-6mu% + \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill + \mkern-6mu\mathord-$} +\mathchardef\braceld="37A \mathchardef\bracerd="37B +\mathchardef\bracelu="37C \mathchardef\braceru="37D +\def\downbracefill{$\m@th\braceld\leaders\vrule\hfill\braceru + \bracelu\leaders\vrule\hfill\bracerd$} +\def\upbracefill{$\m@th\bracelu\leaders\vrule\hfill\bracerd + \braceld\leaders\vrule\hfill\braceru$} + +% LaTeX change: \bye is eliminated. +%\outer\def\bye{\par\vfill\supereject\end} + +% Macros for math setting +\message{math definitions,} + +\let\sp=^ \let\sb=_ +\def\,{\mskip\thinmuskip} +\def\>{\mskip\medmuskip} +\def\;{\mskip\thickmuskip} +\def\!{\mskip-\thinmuskip} +\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} +{\catcode`\'=\active \gdef'{^\bgroup\prim@s}} +\def\prim@s{\prime\futurelet\next\pr@m@s} +\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t + \else\let\nxt\egroup\fi\fi \nxt} +\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup} +{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math + +{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_ + +\mathchardef\alpha="010B +\mathchardef\beta="010C +\mathchardef\gamma="010D +\mathchardef\delta="010E +\mathchardef\epsilon="010F +\mathchardef\zeta="0110 +\mathchardef\eta="0111 +\mathchardef\theta="0112 +\mathchardef\iota="0113 +\mathchardef\kappa="0114 +\mathchardef\lambda="0115 +\mathchardef\mu="0116 +\mathchardef\nu="0117 +\mathchardef\xi="0118 +\mathchardef\pi="0119 +\mathchardef\rho="011A +\mathchardef\sigma="011B +\mathchardef\tau="011C +\mathchardef\upsilon="011D +\mathchardef\phi="011E +\mathchardef\chi="011F +\mathchardef\psi="0120 +\mathchardef\omega="0121 +\mathchardef\varepsilon="0122 +\mathchardef\vartheta="0123 +\mathchardef\varpi="0124 +\mathchardef\varrho="0125 +\mathchardef\varsigma="0126 +\mathchardef\varphi="0127 +\mathchardef\Gamma="7000 +\mathchardef\Delta="7001 +\mathchardef\Theta="7002 +\mathchardef\Lambda="7003 +\mathchardef\Xi="7004 +\mathchardef\Pi="7005 +\mathchardef\Sigma="7006 +\mathchardef\Upsilon="7007 +\mathchardef\Phi="7008 +\mathchardef\Psi="7009 +\mathchardef\Omega="700A + +\mathchardef\aleph="0240 +\def\hbar{{\mathchar'26\mkern-9muh}} +\mathchardef\imath="017B +\mathchardef\jmath="017C +\mathchardef\ell="0160 +\mathchardef\wp="017D +\mathchardef\Re="023C +\mathchardef\Im="023D +\mathchardef\partial="0140 +\mathchardef\infty="0231 +\mathchardef\prime="0230 +\mathchardef\emptyset="023B +\mathchardef\nabla="0272 +\def\surd{{\mathchar"1270}} +\mathchardef\top="023E +\mathchardef\bot="023F +\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr + \not\mathrel{\mkern14mu}\crcr + \noalign{\nointerlineskip} + \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}} +\mathchardef\triangle="0234 +\mathchardef\forall="0238 +\mathchardef\exists="0239 +\mathchardef\neg="023A \let\lnot=\neg +\mathchardef\flat="015B +\mathchardef\natural="015C +\mathchardef\sharp="015D +\mathchardef\clubsuit="027C +\mathchardef\diamondsuit="027D +\mathchardef\heartsuit="027E +\mathchardef\spadesuit="027F + +\mathchardef\coprod="1360 +\mathchardef\bigvee="1357 +\mathchardef\bigwedge="1356 +\mathchardef\biguplus="1355 +\mathchardef\bigcap="1354 +\mathchardef\bigcup="1353 +\mathchardef\intop="1352 \def\int{\intop\nolimits} +\mathchardef\prod="1351 +\mathchardef\sum="1350 +\mathchardef\bigotimes="134E +\mathchardef\bigoplus="134C +\mathchardef\bigodot="134A +\mathchardef\ointop="1348 \def\oint{\ointop\nolimits} +\mathchardef\bigsqcup="1346 +\mathchardef\smallint="1273 + +\mathchardef\triangleleft="212F +\mathchardef\triangleright="212E +\mathchardef\bigtriangleup="2234 +\mathchardef\bigtriangledown="2235 +\mathchardef\wedge="225E \let\land=\wedge +\mathchardef\vee="225F \let\lor=\vee +\mathchardef\cap="225C +\mathchardef\cup="225B +\mathchardef\ddagger="227A +\mathchardef\dagger="2279 +\mathchardef\sqcap="2275 +\mathchardef\sqcup="2274 +\mathchardef\uplus="225D +\mathchardef\amalg="2271 +\mathchardef\diamond="2205 +\mathchardef\bullet="220F +\mathchardef\wr="226F +\mathchardef\div="2204 +\mathchardef\odot="220C +\mathchardef\oslash="220B +\mathchardef\otimes="220A +\mathchardef\ominus="2209 +\mathchardef\oplus="2208 +\mathchardef\mp="2207 +\mathchardef\pm="2206 +\mathchardef\circ="220E +\mathchardef\bigcirc="220D +\mathchardef\setminus="226E % for set difference A\setminus B +\mathchardef\cdot="2201 +\mathchardef\ast="2203 +\mathchardef\times="2202 +\mathchardef\star="213F + +\mathchardef\propto="322F +\mathchardef\sqsubseteq="3276 +\mathchardef\sqsupseteq="3277 +\mathchardef\parallel="326B +\mathchardef\mid="326A +\mathchardef\dashv="3261 +\mathchardef\vdash="3260 +\mathchardef\nearrow="3225 +\mathchardef\searrow="3226 +\mathchardef\nwarrow="322D +\mathchardef\swarrow="322E +\mathchardef\Leftrightarrow="322C +\mathchardef\Leftarrow="3228 +\mathchardef\Rightarrow="3229 +\def\neq{\not=} \let\ne=\neq +\mathchardef\leq="3214 \let\le=\leq +\mathchardef\geq="3215 \let\ge=\geq +\mathchardef\succ="321F +\mathchardef\prec="321E +\mathchardef\approx="3219 +\mathchardef\succeq="3217 +\mathchardef\preceq="3216 +\mathchardef\supset="321B +\mathchardef\subset="321A +\mathchardef\supseteq="3213 +\mathchardef\subseteq="3212 +\mathchardef\in="3232 +\mathchardef\ni="3233 \let\owns=\ni +\mathchardef\gg="321D +\mathchardef\ll="321C +\mathchardef\not="3236 +\mathchardef\leftrightarrow="3224 +\mathchardef\leftarrow="3220 \let\gets=\leftarrow +\mathchardef\rightarrow="3221 \let\to=\rightarrow +\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow} +\mathchardef\sim="3218 +\mathchardef\simeq="3227 +\mathchardef\perp="323F +\mathchardef\equiv="3211 +\mathchardef\asymp="3210 +\mathchardef\smile="315E +\mathchardef\frown="315F +\mathchardef\leftharpoonup="3128 +\mathchardef\leftharpoondown="3129 +\mathchardef\rightharpoonup="312A +\mathchardef\rightharpoondown="312B + +\def\joinrel{\mathrel{\mkern-3mu}} +\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as + +\def\Relbar{\mathrel=} +\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow} +\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook} +\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft} +\def\models{\mathrel|\joinrel=} +\def\Longrightarrow{\Relbar\joinrel\Rightarrow} + +% LaTeX Change: \longrightarrow and \longleftarrow redefined to make +% then robust. +\def\longrightarrow{\protect\@lra} + \def\@lra{\relbar\joinrel\rightarrow} +\def\longleftarrow{\protect\@lla} + \def\@lla{\leftarrow\joinrel\relbar} +% End of LaTeX change to \longrightarrow and \longleftarrow + +\def\Longleftarrow{\Leftarrow\joinrel\Relbar} +\def\longmapsto{\mapstochar\longrightarrow} +\def\longleftrightarrow{\leftarrow\joinrel\rightarrow} +\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow} +\def\iff{\;\Longleftrightarrow\;} + +\mathchardef\ldotp="613A % ldot as a punctuation mark +\mathchardef\cdotp="6201 % cdot as a punctuation mark +\mathchardef\colon="603A % colon as a punctuation mark + +% LaTeX change: make \ldots work outside math mode too. +\def\@ldots{\mathinner{\ldotp\ldotp\ldotp}} +\def\ldots{\protect\pldots} +\def\pldots{\relax\ifmmode\@ldots\else\mbox{$\@ldots\,$}\fi} +% End of LaTeX change to \ldots + +\def\cdots{\mathinner{\cdotp\cdotp\cdotp}} +\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ + \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} +\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu + \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}} + +\def\acute{\mathaccent"7013 } +\def\grave{\mathaccent"7012 } +\def\ddot{\mathaccent"707F } +\def\tilde{\mathaccent"707E } +\def\bar{\mathaccent"7016 } +\def\breve{\mathaccent"7015 } +\def\check{\mathaccent"7014 } +\def\hat{\mathaccent"705E } +\def\vec{\mathaccent"017E } +\def\dot{\mathaccent"705F } +\def\widetilde{\mathaccent"0365 } +\def\widehat{\mathaccent"0362 } +\def\overrightarrow#1{\vbox{\ialign{##\crcr + \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overleftarrow#1{\vbox{\ialign{##\crcr + \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overbrace#1{\mathop{\vbox{\ialign{##\crcr\noalign{\kern3\p@} + \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits} +\def\underbrace#1{\mathop{\vtop{\ialign{##\crcr + $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip} + \upbracefill\crcr\noalign{\kern3\p@}}}}\limits} +\def\skew#1#2#3{{#2{#3\mkern#1mu}\mkern-#1mu}{}} + +\def\lmoustache{\delimiter"4000340 } % top from (, bottom from ) +\def\rmoustache{\delimiter"5000341 } % top from ), bottom from ( +\def\lgroup{\delimiter"400033A } % extensible ( with sharper tips +\def\rgroup{\delimiter"500033B } % extensible ) with sharper tips +\def\arrowvert{\delimiter"33C000 } % arrow without arrowheads +\def\Arrowvert{\delimiter"33D000 } % double arrow without arrowheads +\def\bracevert{\delimiter"33E000 } % the vertical bar that extends braces +\def\Vert{\delimiter"26B30D } \let\|=\Vert +\def\vert{\delimiter"26A30C } +\def\uparrow{\delimiter"3222378 } +\def\downarrow{\delimiter"3223379 } +\def\updownarrow{\delimiter"326C33F } +\def\Uparrow{\delimiter"322A37E } +\def\Downarrow{\delimiter"322B37F } +\def\Updownarrow{\delimiter"326D377 } +\def\backslash{\delimiter"26E30F } % for double coset G\backslash H +\def\rangle{\delimiter"526930B } +\def\langle{\delimiter"426830A } +\def\rbrace{\delimiter"5267309 } \let\}=\rbrace +\def\lbrace{\delimiter"4266308 } \let\{=\lbrace +\def\rceil{\delimiter"5265307 } +\def\lceil{\delimiter"4264306 } +\def\rfloor{\delimiter"5263305 } +\def\lfloor{\delimiter"4262304 } + +\def\bigl{\mathopen\big} +\def\bigm{\mathrel\big} +\def\bigr{\mathclose\big} +\def\Bigl{\mathopen\Big} +\def\Bigm{\mathrel\Big} +\def\Bigr{\mathclose\Big} +\def\biggl{\mathopen\bigg} +\def\biggm{\mathrel\bigg} +\def\biggr{\mathclose\bigg} +\def\Biggl{\mathopen\Bigg} +\def\Biggm{\mathrel\Bigg} +\def\Biggr{\mathclose\Bigg} +\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}} +\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}} +\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}} +\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}} +\def\n@space{\nulldelimiterspace\z@ \m@th} + +\def\choose{\atopwithdelims()} +\def\brack{\atopwithdelims[]} +\def\brace{\atopwithdelims\{\}} + +\def\sqrt{\radical"270370 } + +\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}% + {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}} +\newbox\rootbox +\def\root#1\of{\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$} + \mathpalette\r@@t} +\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$} + \dimen@\ht\z@ \advance\dimen@-\dp\z@ + \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu \box\z@} +\newif\ifv@ \newif\ifh@ +\def\vphantom{\v@true\h@false\ph@nt} +\def\hphantom{\v@false\h@true\ph@nt} +\def\phantom{\v@true\h@true\ph@nt} +\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}% + \else\let\next\makeph@nt\fi\next} +\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt} +\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt} +\def\finph@nt{\setbox\tw@\null + \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi + \ifh@ \wd\tw@\wd\z@\fi \box\tw@} +\def\mathstrut{\vphantom(} +\def\smash{\relax % \relax, in case this comes first in \halign + \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh + \fi\next} +\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh} +\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh} +\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@} + +\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign +\def\@vereq#1#2{\lower.5\p@\vbox{\baselineskip\z@skip\lineskip-.5\p@ + \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}} +\def\notin{\mathrel{\mathpalette\c@ncel\in}} +\def\c@ncel#1#2{\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}} +\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}} +\def\rlh@#1{\vcenter{\hbox{\ooalign{\raise2pt + \hbox{$#1\rightharpoonup$}\crcr + $#1\leftharpoondown$}}}} +\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}} +\def\doteq{\buildrel\textstyle.\over=} + +\def\log{\mathop{\rm log}\nolimits} +\def\lg{\mathop{\rm lg}\nolimits} +\def\ln{\mathop{\rm ln}\nolimits} +\def\lim{\mathop{\rm lim}} +\def\limsup{\mathop{\rm lim\,sup}} +\def\liminf{\mathop{\rm lim\,inf}} +\def\sin{\mathop{\rm sin}\nolimits} +\def\arcsin{\mathop{\rm arcsin}\nolimits} +\def\sinh{\mathop{\rm sinh}\nolimits} +\def\cos{\mathop{\rm cos}\nolimits} +\def\arccos{\mathop{\rm arccos}\nolimits} +\def\cosh{\mathop{\rm cosh}\nolimits} +\def\tan{\mathop{\rm tan}\nolimits} +\def\arctan{\mathop{\rm arctan}\nolimits} +\def\tanh{\mathop{\rm tanh}\nolimits} +\def\cot{\mathop{\rm cot}\nolimits} +\def\coth{\mathop{\rm coth}\nolimits} +\def\sec{\mathop{\rm sec}\nolimits} +\def\csc{\mathop{\rm csc}\nolimits} +\def\max{\mathop{\rm max}} +\def\min{\mathop{\rm min}} +\def\sup{\mathop{\rm sup}} +\def\inf{\mathop{\rm inf}} +\def\arg{\mathop{\rm arg}\nolimits} +\def\ker{\mathop{\rm ker}\nolimits} +\def\dim{\mathop{\rm dim}\nolimits} +\def\hom{\mathop{\rm hom}\nolimits} +\def\det{\mathop{\rm det}} +\def\exp{\mathop{\rm exp}\nolimits} +\def\Pr{\mathop{\rm Pr}} +\def\gcd{\mathop{\rm gcd}} +\def\deg{\mathop{\rm deg}\nolimits} + +\def\bmod{\mskip-\medmuskip\mkern5mu + \mathbin{\rm mod}\penalty900\mkern5mu\mskip-\medmuskip} +\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)} + +\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th + \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.} +\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th + \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr + \mathstrut\crcr\noalign{\kern-\baselineskip} + #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,} +\def\pmatrix#1{\left(\matrix{#1}\right)} +\newdimen\p@renwd + +% LaTeX: following command is moved after the \tenex font is defined +% by LFONTS +%\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left ( + +\def\bordermatrix#1{\begingroup \m@th + \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}% + \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil + &&\quad\hfil$##$\hfil\crcr + \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}% + #1\crcr\omit\strut\cr}}% + \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne + \global\setbox\@ne\vbox{\box\@ne\kern2\p@}% + \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}% + \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup} + +\def\openup{\afterassignment\@penup\dimen@=} +\def\@penup{\advance\lineskip\dimen@ + \advance\baselineskip\dimen@ + \advance\lineskiplimit\dimen@} + +% LaTeX change: \eqalign eliminated, since it is replaced by the +% eqnarray environment. +% +%\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th +% \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil +% \crcr#1\crcr}}\,} + +\newif\ifdt@p +\def\displ@y{\global\dt@ptrue\openup\jot\m@th + \everycr{\noalign{\ifdt@p \global\dt@pfalse + \vskip-\lineskiplimit \vskip\normallineskiplimit + \else \penalty\interdisplaylinepenalty \fi}}} +\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y +\def\displaylines#1{\displ@y + \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr + #1\crcr}} + +% LaTeX: The following \eqalign type macros are eliminated, since +% they are replaced by the eqnarray environment. +% +%\def\eqalignno#1{\displ@y \tabskip\centering +% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip +% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering +% &\llap{$\@lign##$}\tabskip\z@skip\crcr +% #1\crcr}} +%\def\leqalignno#1{\displ@y \tabskip\centering +% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip +% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering +% &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr +% #1\crcr}} + +% Definitions related to output + +% LaTeX uses its own output routine +% +%\message{output routines,} +% +%\countdef\pageno=0 \pageno=1 % first page is number 1 +%\newtoks\headline \headline={\hfil} % headline is normally blank +%\newtoks\footline \footline={\hss\tenrm\folio\hss} +% % footline is normally a centered page number in font \tenrm +%\newif\ifr@ggedbottom +%\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue} +%\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom +%\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi} +%\def\nopagenumbers{\footline{\hfil}} % blank out the footline +%\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne +% \else\global\advance\pageno\@ne \fi} % increase |pageno| + +% LaTeX does use the same insert for footnotes as PLAIN +\newinsert\footins + +%\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later +% \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi +% #1\@sf\vfootnote{#1}} +%\def\vfootnote#1{\insert\footins\bgroup +% \interlinepenalty\interfootnotelinepenalty +% \splittopskip\ht\strutbox % top baseline for broken footnotes +% \splitmaxdepth\dp\strutbox \floatingpenalty\@MM +% \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip +% \textindent{#1}\footstrut\futurelet\next\fo@t} +%\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t +% \else\let\next\f@t\fi \next} +%\def\f@@t{\bgroup\aftergroup\@foot\let\next} +%\def\f@t#1{#1\@foot} +%\def\@foot{\strut\egroup} +%\def\footstrut{\vbox to\splittopskip{}} + +% LaTeX leaves these initializations for the \footins insert. +% +\skip\footins=\bigskipamount % space added when footnote is present +\count\footins=1000 % footnote magnification factor (1 to 1) +\dimen\footins=8in % maximum footnotes per page + +%\newinsert\topins +%\newif\ifp@ge \newif\if@mid +%\def\topinsert{\@midfalse\p@gefalse\@ins} +%\def\midinsert{\@midtrue\@ins} +%\def\pageinsert{\@midfalse\p@getrue\@ins} +%\skip\topins=\z@skip % no space added when a topinsert is present +%\count\topins=1000 % magnification factor (1 to 1) +%\dimen\topins=\maxdimen % no limit per page +%\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox +%\def\endinsert{\egroup % finish the \vbox +% \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@ +% \advance\dimen@\pagetotal \advance\dimen@-\pageshrink +% \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi +% \if@mid \bigskip\box\z@\bigbreak +% \else\insert\topins{\penalty100 % floating insertion +% \splittopskip\z@skip +% \splitmaxdepth\maxdimen \floatingpenalty\z@ +% \ifp@ge \dimen@\dp\z@ +% \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero +% \else \box\z@\nobreak\bigskip\fi}\fi\endgroup} + +%\output{\plainoutput} +%\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}% +% \advancepageno +% \ifnum\outputpenalty>-\@MM \else\dosupereject\fi} +%\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}} +%\def\makeheadline{\vbox to\z@{\vskip-22.5\p@ +% \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip} +%\def\makefootline{\baselineskip24\p@\line{\the\footline}} +%\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over +% \line{}\kern-\topskip\nobreak\vfill\supereject\fi} +% +%\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi +% \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255 +% \ifvoid\footins\else % footnote info is present +% \vskip\skip\footins +% \footnoterule +% \unvbox\footins\fi +% \ifr@ggedbottom \kern-\dimen@ \vfil \fi} + +% LaTeX keeps PLAIN TeX's \footnoterule as the default +% +\def\footnoterule{\kern-3\p@ + \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high + +% Hyphenation, miscellaneous macros, and initial values for standard layout +\message{hyphenation} + +\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks +\input sihyphen + +% \magnification doesn't work in LaTeX +% +%\def\magnification{\afterassignment\m@g\count@} +%\def\m@g{\mag\count@ +% \hsize6.5truein\vsize8.9truein\dimen\footins8truein} + +\def\tracingall{\tracingonline\@ne\tracingcommands\tw@\tracingstats\tw@ + \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne + \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne + \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode} + +\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm + \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}} + +% input LaTeX fonts and commands + +\input lfonts +\input latex + +% LaTeX change: moved from above. +\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left ( + +% LaTeX: default values +\normalbaselines +% LaTeX: select 10pt font size and \rm style +\xpt + +\nonfrenchspacing % punctuation affects the spacing +\catcode`@=12 % at signs are no longer letters + +% LaTeX: File called LPLAIN +% Identify the current format +\def\fmtname{lplain}\def\fmtversion{2.09-February 8, 1990} + +\typeout{Input any local modifications here.} diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/siplain.tex b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/siplain.tex new file mode 100644 index 0000000000..bffb195e6e --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.14/siplain.tex @@ -0,0 +1,1232 @@ +% This is the plain TeX format that's described in The TeXbook. +% N.B.: A version number is defined at the very end of this file; +% please change that number whenever the file is modified! +% And don't modify the file under any circumstances. + +\catcode`\{=1 % left brace is begin-group character +\catcode`\}=2 % right brace is end-group character +\catcode`\$=3 % dollar sign is math shift +\catcode`\&=4 % ampersand is alignment tab +\catcode`\#=6 % hash mark is macro parameter character +\catcode`\^=7 \catcode`\^^K=7 % circumflex and uparrow are for superscripts +\catcode`\_=8 \catcode`\^^A=8 % underline and downarrow are for subscripts +\catcode`\^^I=10 % ascii tab is a blank space +\chardef\active=13 \catcode`\~=\active % tilde is active +\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par" + +\message{Preloading the plain format: codes,} + +% We had to define the \catcodes right away, before the message line, +% since \message uses the { and } characters. +% When INITEX (the TeX initializer) starts up, +% it has defined the following \catcode values: +% \catcode`\^^@=9 % ascii null is ignored +% \catcode`\^^M=5 % ascii return is end-line +% \catcode`\\=0 % backslash is TeX escape character +% \catcode`\%=14 % percent sign is comment character +% \catcode`\ =10 % ascii space is blank space +% \catcode`\^^?=15 % ascii delete is invalid +% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters +% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters +% all others are type 12 (other) + +% Here is a list of the characters that have been specially catcoded: +\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~} +% (not counting ascii null, tab, linefeed, formfeed, return, delete) +% Each symbol in the list is preceded by \do, which can be defined +% if you want to do something to every item in the list. + +% We make @ signs act like letters, temporarily, to avoid conflict +% between user names and internal control sequences of plain format. +\catcode`@=11 + +% INITEX sets up \mathcode x=x, for x=0..255, except that +% \mathcode x=x+"7100, for x = `A to `Z and `a to `z; +% \mathcode x=x+"7000, for x = `0 to `9. +% The following changes define internal codes as recommended +% in Appendix C of The TeXbook: +\mathcode`\^^@="2201 % \cdot +\mathcode`\^^A="3223 % \downarrow +\mathcode`\^^B="010B % \alpha +\mathcode`\^^C="010C % \beta +\mathcode`\^^D="225E % \land +\mathcode`\^^E="023A % \lnot +\mathcode`\^^F="3232 % \in +\mathcode`\^^G="0119 % \pi +\mathcode`\^^H="0115 % \lambda +\mathcode`\^^I="010D % \gamma +\mathcode`\^^J="010E % \delta +\mathcode`\^^K="3222 % \uparrow +\mathcode`\^^L="2206 % \pm +\mathcode`\^^M="2208 % \oplus +\mathcode`\^^N="0231 % \infty +\mathcode`\^^O="0140 % \partial +\mathcode`\^^P="321A % \subset +\mathcode`\^^Q="321B % \supset +\mathcode`\^^R="225C % \cap +\mathcode`\^^S="225B % \cup +\mathcode`\^^T="0238 % \forall +\mathcode`\^^U="0239 % \exists +\mathcode`\^^V="220A % \otimes +\mathcode`\^^W="3224 % \leftrightarrow +\mathcode`\^^X="3220 % \leftarrow +\mathcode`\^^Y="3221 % \rightarrow +\mathcode`\^^Z="8000 % \ne +\mathcode`\^^[="2205 % \diamond +\mathcode`\^^\="3214 % \le +\mathcode`\^^]="3215 % \ge +\mathcode`\^^^="3211 % \equiv +\mathcode`\^^_="225F % \lor +\mathcode`\ ="8000 % \space +\mathcode`\!="5021 +\mathcode`\'="8000 % ^\prime +\mathcode`\(="4028 +\mathcode`\)="5029 +\mathcode`\*="2203 % \ast +\mathcode`\+="202B +\mathcode`\,="613B +\mathcode`\-="2200 +\mathcode`\.="013A +\mathcode`\/="013D +\mathcode`\:="303A +\mathcode`\;="603B +\mathcode`\<="313C +\mathcode`\=="303D +\mathcode`\>="313E +\mathcode`\?="503F +\mathcode`\[="405B +\mathcode`\\="026E % \backslash +\mathcode`\]="505D +\mathcode`\_="8000 % \_ +\mathcode`\{="4266 +\mathcode`\|="026A +\mathcode`\}="5267 +\mathcode`\^^?="1273 % \smallint + +% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x, +% and \lccode`x=`x, \lccode`X=`x; all other values are zero. +% No changes to those tables are needed in plain TeX format. + +% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999 +% for uppercase letters. The following changes are needed: +\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0 +% The \nonfrenchspacing macro will make further changes to \sfcode values. + +% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0 +\delcode`\(="028300 +\delcode`\)="029301 +\delcode`\[="05B302 +\delcode`\]="05D303 +\delcode`\<="26830A +\delcode`\>="26930B +\delcode`\/="02F30E +\delcode`\|="26A30C +\delcode`\\="26E30F +% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails! + +% To make the plain macros more efficient in time and space, +% several constant values are declared here as control sequences. +% If they were changed, anything could happen; so they are private symbols. +\chardef\@ne=1 +\chardef\tw@=2 +\chardef\thr@@=3 +\chardef\sixt@@n=16 +\chardef\@cclv=255 +\mathchardef\@cclvi=256 +\mathchardef\@m=1000 +\mathchardef\@M=10000 +\mathchardef\@MM=20000 + +% Allocation of registers + +% Here are macros for the automatic allocation of \count, \box, \dimen, +% \skip, \muskip, and \toks registers, as well as \read and \write +% stream numbers, \fam codes, \language codes, and \insert numbers. + +\message{registers,} + +% When a register is used only temporarily, it need not be allocated; +% grouping can be used, making the value previously in the register return +% after the close of the group. The main use of these macros is for +% registers that are defined by one macro and used by others, possibly at +% different nesting levels. All such registers should be defined through +% these macros; otherwise conflicts may occur, especially when two or more +% more macro packages are being used at once. + +% The following counters are reserved: +% 0 to 9 page numbering +% 10 count allocation +% 11 dimen allocation +% 12 skip allocation +% 13 muskip allocation +% 14 box allocation +% 15 toks allocation +% 16 read file allocation +% 17 write file allocation +% 18 math family allocation +% 19 language allocation +% 20 insert allocation +% 21 the most recently allocated number +% 22 constant -1 +% New counters are allocated starting with 23, 24, etc. Other registers are +% allocated starting with 10. This leaves 0 through 9 for the user to play +% with safely, except that counts 0 to 9 are considered to be the page and +% subpage numbers (since they are displayed during output). In this scheme, +% \count 10 always contains the number of the highest-numbered counter that +% has been allocated, \count 14 the highest-numbered box, etc. +% Inserts are given numbers 254, 253, etc., since they require a \count, +% \dimen, \skip, and \box all with the same number; \count 20 contains the +% lowest-numbered insert that has been allocated. Of course, \box255 is +% reserved for \output; \count255, \dimen255, and \skip255 can be used freely. + +% It is recommended that macro designers always use +% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and +% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255. +% This will prevent ``save stack buildup'' that might otherwise occur. + +\count10=22 % allocates \count registers 23, 24, ... +\count11=9 % allocates \dimen registers 10, 11, ... +\count12=9 % allocates \skip registers 10, 11, ... +\count13=9 % allocates \muskip registers 10, 11, ... +\count14=9 % allocates \box registers 10, 11, ... +\count15=9 % allocates \toks registers 10, 11, ... +\count16=-1 % allocates input streams 0, 1, ... +\count17=-1 % allocates output streams 0, 1, ... +\count18=3 % allocates math families 4, 5, ... +\count19=0 % allocates \language codes 1, 2, ... +\count20=255 % allocates insertions 254, 253, ... +\countdef\insc@unt=20 % the insertion counter +\countdef\allocationnumber=21 % the most recent allocation +\countdef\m@ne=22 \m@ne=-1 % a handy constant +\def\wlog{\immediate\write\m@ne} % write on log file (only) + +% Here are abbreviations for the names of scratch registers +% that don't need to be allocated. + +\countdef\count@=255 +\dimendef\dimen@=0 +\dimendef\dimen@i=1 % global only +\dimendef\dimen@ii=2 +\skipdef\skip@=0 +\toksdef\toks@=0 + +% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo +% and \foo will be defined (with \countdef) to be the next counter. +% To find out which counter \foo is, you can look at \allocationnumber. +% Since there's no \boxdef command, \chardef is used to define a \newbox, +% \newinsert, \newfam, and so on. + +\outer\def\newcount{\alloc@0\count\countdef\insc@unt} +\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt} +\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt} +\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi} +\outer\def\newbox{\alloc@4\box\chardef\insc@unt} +\let\newtoks=\relax % we do this to allow plain.tex to be read in twice +\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}} +\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi} +\outer\def\newread{\alloc@6\read\chardef\sixt@@n} +\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n} +\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n} +\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi} +\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne + \ch@ck#1#4#2% make sure there's still room + \allocationnumber=\count1#1% + \global#3#5=\allocationnumber + \wlog{\string#5=\string#2\the\allocationnumber}} +\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne + \ch@ck0\insc@unt\count + \ch@ck1\insc@unt\dimen + \ch@ck2\insc@unt\skip + \ch@ck4\insc@unt\box + \allocationnumber=\insc@unt + \global\chardef#1=\allocationnumber + \wlog{\string#1=\string\insert\the\allocationnumber}} +\def\ch@ck#1#2#3{\ifnum\count1#1<#2% + \else\errmessage{No room for a new #3}\fi} + +% Here are some examples of allocation. +\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen> +\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow +\newskip\centering \centering=0pt plus 1000pt minus 1000pt +\newdimen\p@ \p@=1pt % this saves macro space and time +\newdimen\z@ \z@=0pt % can be used both for 0pt and 0 +\newskip\z@skip \z@skip=0pt plus0pt minus0pt +\newbox\voidb@x % permanently void box register + +% And here's a different sort of allocation: +% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo. +\outer\def\newif#1{\count@\escapechar \escapechar\m@ne + \expandafter\expandafter\expandafter + \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}% + \expandafter\expandafter\expandafter + \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}% + \@if#1{false}\escapechar\count@} % the condition starts out false +\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname} +{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required + +% Assign initial values to TeX's parameters + +\message{parameters,} + +% All of TeX's numeric parameters are listed here, +% but the code is commented out if no special value needs to be set. +% INITEX makes all parameters zero except where noted. + +\pretolerance=100 +\tolerance=200 % INITEX sets this to 10000 +\hbadness=1000 +\vbadness=1000 +\linepenalty=10 +\hyphenpenalty=50 +\exhyphenpenalty=50 +\binoppenalty=700 +\relpenalty=500 +\clubpenalty=150 +\widowpenalty=150 +\displaywidowpenalty=50 +\brokenpenalty=100 +\predisplaypenalty=10000 +% \postdisplaypenalty=0 +% \interlinepenalty=0 +% \floatingpenalty=0, set during \insert +% \outputpenalty=0, set before TeX enters \output +\doublehyphendemerits=10000 +\finalhyphendemerits=5000 +\adjdemerits=10000 +% \looseness=0, cleared by TeX after each paragraph +% \pausing=0 +% \holdinginserts=0 +% \tracingonline=0 +% \tracingmacros=0 +% \tracingstats=0 +% \tracingparagraphs=0 +% \tracingpages=0 +% \tracingoutput=0 +\tracinglostchars=1 +% \tracingcommands=0 +% \tracingrestores=0 +% \language=0 +\uchyph=1 +% \lefthyphenmin=2 \righthyphenmin=3 set below +% \globaldefs=0 +% \maxdeadcycles=25 % INITEX does this +% \hangafter=1 % INITEX does this, also TeX after each paragraph +% \fam=0 +% \mag=1000 % INITEX does this +% \escapechar=`\\ % INITEX does this +\defaulthyphenchar=`\- +\defaultskewchar=-1 +% \endlinechar=`\^^M % INITEX does this +\newlinechar=-1 +\delimiterfactor=901 +% \time=now % TeX does this at beginning of job +% \day=now % TeX does this at beginning of job +% \month=now % TeX does this at beginning of job +% \year=now % TeX does this at beginning of job +\showboxbreadth=5 +\showboxdepth=3 +\errorcontextlines=5 + +\hfuzz=0.1pt +\vfuzz=0.1pt +\overfullrule=5pt +\hsize=6.5in +\vsize=8.9in +\maxdepth=4pt +\splitmaxdepth=\maxdimen +\boxmaxdepth=\maxdimen +% \lineskiplimit=0pt, changed by \normalbaselines +\delimitershortfall=5pt +\nulldelimiterspace=1.2pt +\scriptspace=0.5pt +% \mathsurround=0pt +% \predisplaysize=0pt, set before TeX enters $$ +% \displaywidth=0pt, set before TeX enters $$ +% \displayindent=0pt, set before TeX enters $$ +\parindent=20pt +% \hangindent=0pt, zeroed by TeX after each paragraph +% \hoffset=0pt +% \voffset=0pt + +% \baselineskip=0pt, changed by \normalbaselines +% \lineskip=0pt, changed by \normalbaselines +\parskip=0pt plus 1pt +\abovedisplayskip=12pt plus 3pt minus 9pt +\abovedisplayshortskip=0pt plus 3pt +\belowdisplayskip=12pt plus 3pt minus 9pt +\belowdisplayshortskip=7pt plus 3pt minus 4pt +% \leftskip=0pt +% \rightskip=0pt +\topskip=10pt +\splittopskip=10pt +% \tabskip=0pt +% \spaceskip=0pt +% \xspaceskip=0pt +\parfillskip=0pt plus 1fil + +\thinmuskip=3mu +\medmuskip=4mu plus 2mu minus 4mu +\thickmuskip=5mu plus 5mu + +% We also define special registers that function like parameters: +\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt +\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt +\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt +\newskip\normalbaselineskip \normalbaselineskip=12pt +\newskip\normallineskip \normallineskip=1pt +\newdimen\normallineskiplimit \normallineskiplimit=0pt +\newdimen\jot \jot=3pt +\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100 +\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100 + +% Definitions for preloaded fonts + +\def\magstephalf{1095 } +\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax} + +% Fonts assigned to \preloaded are not part of "plain TeX", +% but they are preloaded so that other format packages can use them. +% For example, if another set of macros says "\font\ninerm=cmr9", +% TeX will not have to reload the font metric information for cmr9. + +\message{fonts,} + +\font\tenrm=cmr10 % roman text +\font\preloaded=cmr9 +\font\preloaded=cmr8 +\font\sevenrm=cmr7 +\font\preloaded=cmr6 +\font\fiverm=cmr5 + +\font\teni=cmmi10 % math italic +\font\preloaded=cmmi9 +\font\preloaded=cmmi8 +\font\seveni=cmmi7 +\font\preloaded=cmmi6 +\font\fivei=cmmi5 + +\font\tensy=cmsy10 % math symbols +\font\preloaded=cmsy9 +\font\preloaded=cmsy8 +\font\sevensy=cmsy7 +\font\preloaded=cmsy6 +\font\fivesy=cmsy5 + +\font\tenex=cmex10 % math extension + +\font\preloaded=cmss10 % sans serif +\font\preloaded=cmssq8 + +\font\preloaded=cmssi10 % sans serif italic +\font\preloaded=cmssqi8 + +\font\tenbf=cmbx10 % boldface extended +\font\preloaded=cmbx9 +\font\preloaded=cmbx8 +\font\sevenbf=cmbx7 +\font\preloaded=cmbx6 +\font\fivebf=cmbx5 + +\font\tentt=cmtt10 % typewriter +\font\preloaded=cmtt9 +\font\preloaded=cmtt8 + +\font\preloaded=cmsltt10 % slanted typewriter + +\font\tensl=cmsl10 % slanted roman +\font\preloaded=cmsl9 +\font\preloaded=cmsl8 + +\font\tenit=cmti10 % text italic +\font\preloaded=cmti9 +\font\preloaded=cmti8 +\font\preloaded=cmti7 + +\message{more fonts,} +\font\preloaded=cmu10 % unslanted text italic + +\font\preloaded=cmmib10 % bold math italic +\font\preloaded=cmbsy10 % bold math symbols + +\font\preloaded=cmcsc10 % caps and small caps + +\font\preloaded=cmssbx10 % sans serif bold extended + +\font\preloaded=cmdunh10 % Dunhill style + +\font\preloaded=cmr7 scaled \magstep4 % for titles +\font\preloaded=cmtt10 scaled \magstep2 +\font\preloaded=cmssbx10 scaled \magstep2 + +\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols + +% Additional \preloaded fonts can be specified here. +% (And those that were \preloaded above can be eliminated.) + +\let\preloaded=\undefined % preloaded fonts must be declared anew later. + +\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177 +\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60 + +\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm +\def\rm{\fam\z@\tenrm} +\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei +\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni} +\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy +\def\cal{\fam\tw@} +\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex +\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4 +\textfont\itfam=\tenit +\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5 +\textfont\slfam=\tensl +\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6 +\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf +\scriptscriptfont\bffam=\fivebf +\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7 +\textfont\ttfam=\tentt + +% Macros for setting ordinary text +\message{macros,} + +\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m + \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m} +\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000% + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 } + +\def\normalbaselines{\lineskip\normallineskip + \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit} + +\def\^^M{\ } % control <return> = control <space> +\def\^^I{\ } % same for <tab> + +\def\lq{`} \def\rq{'} +\def\lbrack{[} \def\rbrack{]} + +\let\endgraf=\par \let\endline=\cr + +\def\space{ } +\def\empty{} +\def\null{\hbox{}} + +\let\bgroup={ \let\egroup=} + +% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}' +% since this allows, for example, `\let\par=\cr \obeylines \halign{...' +{\catcode`\^^M=\active % these lines must end with % + \gdef\obeylines{\catcode`\^^M\active \let^^M\par}% + \global\let^^M\par} % this is in case ^^M appears in a \write +\def\obeyspaces{\catcode`\ \active} +{\obeyspaces\global\let =\space} + +\def\loop#1\repeat{\def\body{#1}\iterate} +\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next} +\let\repeat=\fi % this makes \loop...\if...\repeat skippable + +\def\thinspace{\kern .16667em } +\def\negthinspace{\kern-.16667em } +\def\enspace{\kern.5em } + +\def\enskip{\hskip.5em\relax} +\def\quad{\hskip1em\relax} +\def\qquad{\hskip2em\relax} + +\def\smallskip{\vskip\smallskipamount} +\def\medskip{\vskip\medskipamount} +\def\bigskip{\vskip\bigskipamount} + +\def\nointerlineskip{\prevdepth-1000\p@} +\def\offinterlineskip{\baselineskip-1000\p@ + \lineskip\z@ \lineskiplimit\maxdimen} + +\def\topglue{\nointerlineskip\vglue-\topskip\vglue} % for top of page +\def\vglue{\afterassignment\vgl@\skip@=} +\def\vgl@{\par \dimen@\prevdepth \hrule height\z@ + \nobreak\vskip\skip@ \prevdepth\dimen@} +\def\hglue{\afterassignment\hgl@\skip@=} +\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@ + \nobreak\hskip\skip@ \spacefactor\count@} + +\def~{\penalty\@M \ } % tie +\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-' + +\def\break{\penalty-\@M} +\def\nobreak{\penalty \@M} +\def\allowbreak{\penalty \z@} + +\def\filbreak{\par\vfil\penalty-200\vfilneg} +\def\goodbreak{\par\penalty-500 } +\def\eject{\par\break} +\def\supereject{\par\penalty-\@MM} + +\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi} +\def\smallbreak{\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi} +\def\medbreak{\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi} +\def\bigbreak{\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi} + +\def\line{\hbox to\hsize} +\def\leftline#1{\line{#1\hss}} +\def\rightline#1{\line{\hss#1}} +\def\centerline#1{\line{\hss#1\hss}} + +\def\rlap#1{\hbox to\z@{#1\hss}} +\def\llap#1{\hbox to\z@{\hss#1}} + +\def\m@th{\mathsurround=\z@} +\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@ + \m@th \underline{\box\z@}$} + +\newbox\strutbox +\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@} +\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} + +\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out +\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign +\newcount\mscount +\def\multispan#1{\omit \mscount#1 + \loop\ifnum\mscount>\@ne \sp@n\repeat} +\def\sp@n{\span\omit\advance\mscount\m@ne} + +\newif\ifus@ \newif\if@cr +\newbox\tabs \newbox\tabsyet \newbox\tabsdone + +\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null} +\def\settabs{\setbox\tabs\null \futurelet\next\sett@b} +\let\+=\relax % in case this file is being read in twice +\def\sett@b{\ifx\next\+\let\next\relax + \def\next{\afterassignment\s@tt@b\let\next}% + \else\let\next\s@tcols\fi\next} +\def\s@tt@b{\let\next\relax\us@false\m@ketabbox} +\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+ +\outer\def\+{\tabalign} +\def\s@tcols#1\columns{\count@#1\dimen@\hsize + \loop\ifnum\count@>\z@ \@nother \repeat} +\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@ + \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}% + \advance\dimen@-\dimen@ii \advance\count@\m@ne} + +\def\m@ketabbox{\begingroup + \global\setbox\tabsyet\copy\tabs + \global\setbox\tabsdone\null + \def\cr{\@crtrue\crcr\egroup\egroup + \ifus@\unvbox\z@\lastbox\fi\endgroup + \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}% + \setbox\z@\vbox\bgroup\@crfalse + \ialign\bgroup&\t@bbox##\t@bb@x\crcr} + +\def\t@bbox{\setbox\z@\hbox\bgroup} +\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column + \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet + \global\setbox\@ne\lastbox}% now \box\@ne holds its size + \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}% + \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi + \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi + \box\z@} + +\def\hang{\hangindent\parindent} +\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces} +\def\item{\par\hang\textindent} +\def\itemitem{\par\indent \hangindent2\parindent \textindent} +\def\narrower{\advance\leftskip\parindent + \advance\rightskip\parindent} + +\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250 + \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip + \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent} +\outer\def\proclaim #1. #2\par{\medbreak + \noindent{\bf#1.\enspace}{\sl#2\par}% + \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi} + +\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax} +\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only + +\chardef\%=`\% +\chardef\&=`\& +\chardef\#=`\# +\chardef\$=`\$ +\chardef\ss="19 +\chardef\ae="1A +\chardef\oe="1B +\chardef\o="1C +\chardef\AE="1D +\chardef\OE="1E +\chardef\O="1F +\chardef\i="10 \chardef\j="11 % dotless letters +\def\aa{\accent23a} +\def\l{\char32l} +\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}} + +\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary +\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}} +\def\AA{\leavevmode\setbox0\hbox{h}\dimen@\ht0\advance\dimen@-1ex% + \rlap{\raise.67\dimen@\hbox{\char'27}}A} + +\def\mathhexbox#1#2#3{\leavevmode + \hbox{$\m@th \mathchar"#1#2#3$}} +\def\dag{\mathhexbox279} +\def\ddag{\mathhexbox27A} +\def\S{\mathhexbox278} +\def\P{\mathhexbox27B} + +\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex% + \ialign{##\crcr#1\crcr}}} % put characters over each other +\def\ooalign{\lineskiplimit-\maxdimen \oalign} +\def\d#1{\oalign{#1\crcr\hidewidth.\hidewidth}} +\def\b#1{\oalign{#1\crcr\hidewidth + \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}} +\def\c#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1% + \else{\ooalign{\hidewidth\char24\hidewidth\crcr\unhbox\z@}}\fi} +\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}} + +\def\dots{\relax\ifmmode\ldots\else$\m@th\ldots\,$\fi} +\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX} + +\def\`#1{{\accent18 #1}} +\def\'#1{{\accent19 #1}} +\def\v#1{{\accent20 #1}} \let\^^_=\v +\def\u#1{{\accent21 #1}} \let\^^S=\u +\def\=#1{{\accent22 #1}} +\def\^#1{{\accent94 #1}} \let\^^D=\^ +\def\.#1{{\accent95 #1}} +\def\H#1{{\accent"7D #1}} +\def\~#1{{\accent"7E #1}} +% \def\"#1{{\accent"7F #1}} <-- this definition is replaced by the following: +\def\"#1{\dirtyumlaut#1} +\input def_umlaut % for testing purposes excluded + +\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}} + +\def\hrulefill{\leaders\hrule\hfill} +\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill} +\def\rightarrowfill{$\m@th\mathord-\mkern-6mu% + \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill + \mkern-6mu\mathord\rightarrow$} +\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-6mu% + \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill + \mkern-6mu\mathord-$} +\mathchardef\braceld="37A \mathchardef\bracerd="37B +\mathchardef\bracelu="37C \mathchardef\braceru="37D +\def\downbracefill{$\m@th\braceld\leaders\vrule\hfill\braceru + \bracelu\leaders\vrule\hfill\bracerd$} +\def\upbracefill{$\m@th\bracelu\leaders\vrule\hfill\bracerd + \braceld\leaders\vrule\hfill\braceru$} + +\outer\def\bye{\par\vfill\supereject\end} + +% Macros for math setting +\message{math definitions,} + +\let\sp=^ \let\sb=_ +\def\,{\mskip\thinmuskip} +\def\>{\mskip\medmuskip} +\def\;{\mskip\thickmuskip} +\def\!{\mskip-\thinmuskip} +\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} +{\catcode`\'=\active \gdef'{^\bgroup\prim@s}} +\def\prim@s{\prime\futurelet\next\pr@m@s} +\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t + \else\let\nxt\egroup\fi\fi \nxt} +\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup} +{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math + +{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_ + +\mathchardef\alpha="010B +\mathchardef\beta="010C +\mathchardef\gamma="010D +\mathchardef\delta="010E +\mathchardef\epsilon="010F +\mathchardef\zeta="0110 +\mathchardef\eta="0111 +\mathchardef\theta="0112 +\mathchardef\iota="0113 +\mathchardef\kappa="0114 +\mathchardef\lambda="0115 +\mathchardef\mu="0116 +\mathchardef\nu="0117 +\mathchardef\xi="0118 +\mathchardef\pi="0119 +\mathchardef\rho="011A +\mathchardef\sigma="011B +\mathchardef\tau="011C +\mathchardef\upsilon="011D +\mathchardef\phi="011E +\mathchardef\chi="011F +\mathchardef\psi="0120 +\mathchardef\omega="0121 +\mathchardef\varepsilon="0122 +\mathchardef\vartheta="0123 +\mathchardef\varpi="0124 +\mathchardef\varrho="0125 +\mathchardef\varsigma="0126 +\mathchardef\varphi="0127 +\mathchardef\Gamma="7000 +\mathchardef\Delta="7001 +\mathchardef\Theta="7002 +\mathchardef\Lambda="7003 +\mathchardef\Xi="7004 +\mathchardef\Pi="7005 +\mathchardef\Sigma="7006 +\mathchardef\Upsilon="7007 +\mathchardef\Phi="7008 +\mathchardef\Psi="7009 +\mathchardef\Omega="700A + +\mathchardef\aleph="0240 +\def\hbar{{\mathchar'26\mkern-9muh}} +\mathchardef\imath="017B +\mathchardef\jmath="017C +\mathchardef\ell="0160 +\mathchardef\wp="017D +\mathchardef\Re="023C +\mathchardef\Im="023D +\mathchardef\partial="0140 +\mathchardef\infty="0231 +\mathchardef\prime="0230 +\mathchardef\emptyset="023B +\mathchardef\nabla="0272 +\def\surd{{\mathchar"1270}} +\mathchardef\top="023E +\mathchardef\bot="023F +\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr + \not\mathrel{\mkern14mu}\crcr + \noalign{\nointerlineskip} + \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}} +\mathchardef\triangle="0234 +\mathchardef\forall="0238 +\mathchardef\exists="0239 +\mathchardef\neg="023A \let\lnot=\neg +\mathchardef\flat="015B +\mathchardef\natural="015C +\mathchardef\sharp="015D +\mathchardef\clubsuit="027C +\mathchardef\diamondsuit="027D +\mathchardef\heartsuit="027E +\mathchardef\spadesuit="027F + +\mathchardef\coprod="1360 +\mathchardef\bigvee="1357 +\mathchardef\bigwedge="1356 +\mathchardef\biguplus="1355 +\mathchardef\bigcap="1354 +\mathchardef\bigcup="1353 +\mathchardef\intop="1352 \def\int{\intop\nolimits} +\mathchardef\prod="1351 +\mathchardef\sum="1350 +\mathchardef\bigotimes="134E +\mathchardef\bigoplus="134C +\mathchardef\bigodot="134A +\mathchardef\ointop="1348 \def\oint{\ointop\nolimits} +\mathchardef\bigsqcup="1346 +\mathchardef\smallint="1273 + +\mathchardef\triangleleft="212F +\mathchardef\triangleright="212E +\mathchardef\bigtriangleup="2234 +\mathchardef\bigtriangledown="2235 +\mathchardef\wedge="225E \let\land=\wedge +\mathchardef\vee="225F \let\lor=\vee +\mathchardef\cap="225C +\mathchardef\cup="225B +\mathchardef\ddagger="227A +\mathchardef\dagger="2279 +\mathchardef\sqcap="2275 +\mathchardef\sqcup="2274 +\mathchardef\uplus="225D +\mathchardef\amalg="2271 +\mathchardef\diamond="2205 +\mathchardef\bullet="220F +\mathchardef\wr="226F +\mathchardef\div="2204 +\mathchardef\odot="220C +\mathchardef\oslash="220B +\mathchardef\otimes="220A +\mathchardef\ominus="2209 +\mathchardef\oplus="2208 +\mathchardef\mp="2207 +\mathchardef\pm="2206 +\mathchardef\circ="220E +\mathchardef\bigcirc="220D +\mathchardef\setminus="226E % for set difference A\setminus B +\mathchardef\cdot="2201 +\mathchardef\ast="2203 +\mathchardef\times="2202 +\mathchardef\star="213F + +\mathchardef\propto="322F +\mathchardef\sqsubseteq="3276 +\mathchardef\sqsupseteq="3277 +\mathchardef\parallel="326B +\mathchardef\mid="326A +\mathchardef\dashv="3261 +\mathchardef\vdash="3260 +\mathchardef\nearrow="3225 +\mathchardef\searrow="3226 +\mathchardef\nwarrow="322D +\mathchardef\swarrow="322E +\mathchardef\Leftrightarrow="322C +\mathchardef\Leftarrow="3228 +\mathchardef\Rightarrow="3229 +\def\neq{\not=} \let\ne=\neq +\mathchardef\leq="3214 \let\le=\leq +\mathchardef\geq="3215 \let\ge=\geq +\mathchardef\succ="321F +\mathchardef\prec="321E +\mathchardef\approx="3219 +\mathchardef\succeq="3217 +\mathchardef\preceq="3216 +\mathchardef\supset="321B +\mathchardef\subset="321A +\mathchardef\supseteq="3213 +\mathchardef\subseteq="3212 +\mathchardef\in="3232 +\mathchardef\ni="3233 \let\owns=\ni +\mathchardef\gg="321D +\mathchardef\ll="321C +\mathchardef\not="3236 +\mathchardef\leftrightarrow="3224 +\mathchardef\leftarrow="3220 \let\gets=\leftarrow +\mathchardef\rightarrow="3221 \let\to=\rightarrow +\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow} +\mathchardef\sim="3218 +\mathchardef\simeq="3227 +\mathchardef\perp="323F +\mathchardef\equiv="3211 +\mathchardef\asymp="3210 +\mathchardef\smile="315E +\mathchardef\frown="315F +\mathchardef\leftharpoonup="3128 +\mathchardef\leftharpoondown="3129 +\mathchardef\rightharpoonup="312A +\mathchardef\rightharpoondown="312B + +\def\joinrel{\mathrel{\mkern-3mu}} +\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as + +\def\Relbar{\mathrel=} +\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow} +\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook} +\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft} +\def\models{\mathrel|\joinrel=} +\def\Longrightarrow{\Relbar\joinrel\Rightarrow} +\def\longrightarrow{\relbar\joinrel\rightarrow} +\def\longleftarrow{\leftarrow\joinrel\relbar} +\def\Longleftarrow{\Leftarrow\joinrel\Relbar} +\def\longmapsto{\mapstochar\longrightarrow} +\def\longleftrightarrow{\leftarrow\joinrel\rightarrow} +\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow} +\def\iff{\;\Longleftrightarrow\;} + +\mathchardef\ldotp="613A % ldot as a punctuation mark +\mathchardef\cdotp="6201 % cdot as a punctuation mark +\mathchardef\colon="603A % colon as a punctuation mark +\def\ldots{\mathinner{\ldotp\ldotp\ldotp}} +\def\cdots{\mathinner{\cdotp\cdotp\cdotp}} +\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ + \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} +\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu + \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}} + +\def\acute{\mathaccent"7013 } +\def\grave{\mathaccent"7012 } +\def\ddot{\mathaccent"707F } +\def\tilde{\mathaccent"707E } +\def\bar{\mathaccent"7016 } +\def\breve{\mathaccent"7015 } +\def\check{\mathaccent"7014 } +\def\hat{\mathaccent"705E } +\def\vec{\mathaccent"017E } +\def\dot{\mathaccent"705F } +\def\widetilde{\mathaccent"0365 } +\def\widehat{\mathaccent"0362 } +\def\overrightarrow#1{\vbox{\ialign{##\crcr + \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overleftarrow#1{\vbox{\ialign{##\crcr + \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overbrace#1{\mathop{\vbox{\ialign{##\crcr\noalign{\kern3\p@} + \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits} +\def\underbrace#1{\mathop{\vtop{\ialign{##\crcr + $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip} + \upbracefill\crcr\noalign{\kern3\p@}}}}\limits} +\def\skew#1#2#3{{#2{#3\mkern#1mu}\mkern-#1mu}{}} + +\def\lmoustache{\delimiter"4000340 } % top from (, bottom from ) +\def\rmoustache{\delimiter"5000341 } % top from ), bottom from ( +\def\lgroup{\delimiter"400033A } % extensible ( with sharper tips +\def\rgroup{\delimiter"500033B } % extensible ) with sharper tips +\def\arrowvert{\delimiter"33C000 } % arrow without arrowheads +\def\Arrowvert{\delimiter"33D000 } % double arrow without arrowheads +\def\bracevert{\delimiter"33E000 } % the vertical bar that extends braces +\def\Vert{\delimiter"26B30D } \let\|=\Vert +\def\vert{\delimiter"26A30C } +\def\uparrow{\delimiter"3222378 } +\def\downarrow{\delimiter"3223379 } +\def\updownarrow{\delimiter"326C33F } +\def\Uparrow{\delimiter"322A37E } +\def\Downarrow{\delimiter"322B37F } +\def\Updownarrow{\delimiter"326D377 } +\def\backslash{\delimiter"26E30F } % for double coset G\backslash H +\def\rangle{\delimiter"526930B } +\def\langle{\delimiter"426830A } +\def\rbrace{\delimiter"5267309 } \let\}=\rbrace +\def\lbrace{\delimiter"4266308 } \let\{=\lbrace +\def\rceil{\delimiter"5265307 } +\def\lceil{\delimiter"4264306 } +\def\rfloor{\delimiter"5263305 } +\def\lfloor{\delimiter"4262304 } + +\def\bigl{\mathopen\big} +\def\bigm{\mathrel\big} +\def\bigr{\mathclose\big} +\def\Bigl{\mathopen\Big} +\def\Bigm{\mathrel\Big} +\def\Bigr{\mathclose\Big} +\def\biggl{\mathopen\bigg} +\def\biggm{\mathrel\bigg} +\def\biggr{\mathclose\bigg} +\def\Biggl{\mathopen\Bigg} +\def\Biggm{\mathrel\Bigg} +\def\Biggr{\mathclose\Bigg} +\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}} +\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}} +\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}} +\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}} +\def\n@space{\nulldelimiterspace\z@ \m@th} + +\def\choose{\atopwithdelims()} +\def\brack{\atopwithdelims[]} +\def\brace{\atopwithdelims\{\}} + +\def\sqrt{\radical"270370 } + +\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}% + {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}} +\newbox\rootbox +\def\root#1\of{\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$} + \mathpalette\r@@t} +\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$} + \dimen@\ht\z@ \advance\dimen@-\dp\z@ + \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu \box\z@} +\newif\ifv@ \newif\ifh@ +\def\vphantom{\v@true\h@false\ph@nt} +\def\hphantom{\v@false\h@true\ph@nt} +\def\phantom{\v@true\h@true\ph@nt} +\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}% + \else\let\next\makeph@nt\fi\next} +\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt} +\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt} +\def\finph@nt{\setbox\tw@\null + \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi + \ifh@ \wd\tw@\wd\z@\fi \box\tw@} +\def\mathstrut{\vphantom(} +\def\smash{\relax % \relax, in case this comes first in \halign + \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh + \fi\next} +\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh} +\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh} +\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@} + +\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign +\def\@vereq#1#2{\lower.5\p@\vbox{\baselineskip\z@skip\lineskip-.5\p@ + \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}} +\def\notin{\mathrel{\mathpalette\c@ncel\in}} +\def\c@ncel#1#2{\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}} +\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}} +\def\rlh@#1{\vcenter{\hbox{\ooalign{\raise2pt + \hbox{$#1\rightharpoonup$}\crcr + $#1\leftharpoondown$}}}} +\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}} +\def\doteq{\buildrel\textstyle.\over=} + +\def\log{\mathop{\rm log}\nolimits} +\def\lg{\mathop{\rm lg}\nolimits} +\def\ln{\mathop{\rm ln}\nolimits} +\def\lim{\mathop{\rm lim}} +\def\limsup{\mathop{\rm lim\,sup}} +\def\liminf{\mathop{\rm lim\,inf}} +\def\sin{\mathop{\rm sin}\nolimits} +\def\arcsin{\mathop{\rm arcsin}\nolimits} +\def\sinh{\mathop{\rm sinh}\nolimits} +\def\cos{\mathop{\rm cos}\nolimits} +\def\arccos{\mathop{\rm arccos}\nolimits} +\def\cosh{\mathop{\rm cosh}\nolimits} +\def\tan{\mathop{\rm tan}\nolimits} +\def\arctan{\mathop{\rm arctan}\nolimits} +\def\tanh{\mathop{\rm tanh}\nolimits} +\def\cot{\mathop{\rm cot}\nolimits} +\def\coth{\mathop{\rm coth}\nolimits} +\def\sec{\mathop{\rm sec}\nolimits} +\def\csc{\mathop{\rm csc}\nolimits} +\def\max{\mathop{\rm max}} +\def\min{\mathop{\rm min}} +\def\sup{\mathop{\rm sup}} +\def\inf{\mathop{\rm inf}} +\def\arg{\mathop{\rm arg}\nolimits} +\def\ker{\mathop{\rm ker}\nolimits} +\def\dim{\mathop{\rm dim}\nolimits} +\def\hom{\mathop{\rm hom}\nolimits} +\def\det{\mathop{\rm det}} +\def\exp{\mathop{\rm exp}\nolimits} +\def\Pr{\mathop{\rm Pr}} +\def\gcd{\mathop{\rm gcd}} +\def\deg{\mathop{\rm deg}\nolimits} + +\def\bmod{\mskip-\medmuskip\mkern5mu + \mathbin{\rm mod}\penalty900\mkern5mu\mskip-\medmuskip} +\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)} + +\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th + \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.} +\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th + \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr + \mathstrut\crcr\noalign{\kern-\baselineskip} + #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,} +\def\pmatrix#1{\left(\matrix{#1}\right)} +\newdimen\p@renwd +\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left ( +\def\bordermatrix#1{\begingroup \m@th + \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}% + \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil + &&\quad\hfil$##$\hfil\crcr + \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}% + #1\crcr\omit\strut\cr}}% + \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne + \global\setbox\@ne\vbox{\box\@ne\kern2\p@}% + \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}% + \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup} + +\def\openup{\afterassignment\@penup\dimen@=} +\def\@penup{\advance\lineskip\dimen@ + \advance\baselineskip\dimen@ + \advance\lineskiplimit\dimen@} +\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th + \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil + \crcr#1\crcr}}\,} +\newif\ifdt@p +\def\displ@y{\global\dt@ptrue\openup\jot\m@th + \everycr{\noalign{\ifdt@p \global\dt@pfalse + \vskip-\lineskiplimit \vskip\normallineskiplimit + \else \penalty\interdisplaylinepenalty \fi}}} +\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y +\def\displaylines#1{\displ@y + \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr + #1\crcr}} +\def\eqalignno#1{\displ@y \tabskip\centering + \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip + &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering + &\llap{$\@lign##$}\tabskip\z@skip\crcr + #1\crcr}} +\def\leqalignno#1{\displ@y \tabskip\centering + \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip + &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering + &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr + #1\crcr}} + +% Definitions related to output + +\message{output routines,} + +\countdef\pageno=0 \pageno=1 % first page is number 1 +\newtoks\headline \headline={\hfil} % headline is normally blank +\newtoks\footline \footline={\hss\tenrm\folio\hss} + % footline is normally a centered page number in font \tenrm +\newif\ifr@ggedbottom +\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue} +\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom +\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi} +\def\nopagenumbers{\footline{\hfil}} % blank out the footline +\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne + \else\global\advance\pageno\@ne \fi} % increase |pageno| + +\newinsert\footins +\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi + #1\@sf\vfootnote{#1}} +\def\vfootnote#1{\insert\footins\bgroup + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox \floatingpenalty\@MM + \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip + \textindent{#1}\footstrut\futurelet\next\fo@t} +\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t + \else\let\next\f@t\fi \next} +\def\f@@t{\bgroup\aftergroup\@foot\let\next} +\def\f@t#1{#1\@foot} +\def\@foot{\strut\egroup} +\def\footstrut{\vbox to\splittopskip{}} +\skip\footins=\bigskipamount % space added when footnote is present +\count\footins=1000 % footnote magnification factor (1 to 1) +\dimen\footins=8in % maximum footnotes per page + +\newinsert\topins +\newif\ifp@ge \newif\if@mid +\def\topinsert{\@midfalse\p@gefalse\@ins} +\def\midinsert{\@midtrue\@ins} +\def\pageinsert{\@midfalse\p@getrue\@ins} +\skip\topins=\z@skip % no space added when a topinsert is present +\count\topins=1000 % magnification factor (1 to 1) +\dimen\topins=\maxdimen % no limit per page +\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox +\def\endinsert{\egroup % finish the \vbox + \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@ + \advance\dimen@\pagetotal \advance\dimen@-\pageshrink + \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi + \if@mid \bigskip\box\z@\bigbreak + \else\insert\topins{\penalty100 % floating insertion + \splittopskip\z@skip + \splitmaxdepth\maxdimen \floatingpenalty\z@ + \ifp@ge \dimen@\dp\z@ + \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero + \else \box\z@\nobreak\bigskip\fi}\fi\endgroup} + +\output{\plainoutput} +\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}% + \advancepageno + \ifnum\outputpenalty>-\@MM \else\dosupereject\fi} +\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}} +\def\makeheadline{\vbox to\z@{\vskip-22.5\p@ + \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip} +\def\makefootline{\baselineskip24\p@\line{\the\footline}} +\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over + \line{}\kern-\topskip\nobreak\vfill\supereject\fi} + +\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi + \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255 + \ifvoid\footins\else % footnote info is present + \vskip\skip\footins + \footnoterule + \unvbox\footins\fi + \ifr@ggedbottom \kern-\dimen@ \vfil \fi} +\def\footnoterule{\kern-3\p@ + \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high + +% Hyphenation, miscellaneous macros, and initial values for standard layout +\message{hyphenation} + +\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks +\input sihyphen + +\def\magnification{\afterassignment\m@g\count@} +\def\m@g{\mag\count@ + \hsize6.5truein\vsize8.9truein\dimen\footins8truein} + +\def\tracingall{\tracingonline\@ne\tracingcommands\tw@\tracingstats\tw@ + \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne + \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne + \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode} + +\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm + \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}} + +\normalbaselines\rm % select roman font +\nonfrenchspacing % punctuation affects the spacing +\catcode`@=12 % at signs are no longer letters + +\def\fmtname{plain}\def\fmtversion{3.0} % identifies the current format diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/german.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/german.ch new file mode 100644 index 0000000000..85179b9d47 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/german.ch @@ -0,0 +1,71 @@ +From helmut@eichow.tuwien.ac.at Thu Aug 12 11:31 MES 1993 +Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP + (16.8/16.2) id AA29128; Thu, 12 Aug 93 11:31:42 +0200 +Return-Path: <helmut@eichow.tuwien.ac.at> +Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9761; Thu, 12 Aug 1993 + 11:29:25 EDT +Date: Thu, 12 Aug 1993 11:29:23 EDT +From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at> +To: heinz@eichow.tuwien.ac.at +Cc: helmut@eichow.tuwien.ac.at +Message-Id: <00970E8C.653CC200.9761@eichow.tuwien.ac.at> +Subject: File: german_sty.cha +Status: RO + +@x +\gdef\umlauthigh{\def\"##1{{\accent127 ##1}}} +\gdef\umlautlow{\def\"{\protect\newumlaut}} +\gdef\newumlaut#1{\leavevmode\allowhyphens + \vbox{\baselineskip\z@skip \lineskip.25ex +@y +% \gdef\umlauthigh{\def\"##1{{\accent127 ##1}}} +\gdef\umlauthigh{\def\"##1{{\dirtyumlaut##1}}} + +%\gdef\umlautlow{\def\"{\protect\newumlaut}} + +\gdef\umlautlow{\def\"{\protect\dirtyumlautlow}} + +\gdef\dirtyumlautlow#1{\if#1A{\discretionary +{\kern 4321sp m\kern +196sp\kern-4517sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1O{\discretionary +{\kern 4321sp m\kern +214sp\kern-4535sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1U{\discretionary +{\kern 4321sp m\kern +220sp\kern-4541sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1a{\discretionary +{\kern 4321sp m\kern +228sp\kern-4549sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1o{\discretionary +{\kern 4321sp m\kern +246sp\kern-4567sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1u{\discretionary +{\kern 4321sp m\kern +252sp\kern-4573sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1s{\discretionary +{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{} +{\ss}}\else{\protect\newumlaut#1}\fi\fi\fi\fi\fi\fi\fi} + + +\gdef\newumlaut#1{\leavevmode + \vbox{\baselineskip\z@skip \lineskip.25ex +@z + +@x + {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}\allowhyphens} +\gdef\highumlaut#1{\leavevmode\allowhyphens + \accent127 #1\allowhyphens} + +\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\ +z@\ht\z@ +@y + {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}} + +\gdef\highumlaut#1{\leavevmode\dirtyumlaut#1} + +\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\ +z@\ht\z@ +@z + + diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/lplain.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/lplain.ch new file mode 100644 index 0000000000..8cece159fe --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/lplain.ch @@ -0,0 +1,33 @@ +From helmut@eichow.tuwien.ac.at Thu Aug 12 11:33 MES 1993 +Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP + (16.8/16.2) id AA29169; Thu, 12 Aug 93 11:33:32 +0200 +Return-Path: <helmut@eichow.tuwien.ac.at> +Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9765; Thu, 12 Aug 1993 + 11:31:14 EDT +Date: Thu, 12 Aug 1993 11:31:13 EDT +From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at> +To: heinz@eichow.tuwien.ac.at +Message-Id: <00970E8C.A685B5A0.9765@eichow.tuwien.ac.at> +Subject: File: lplain_tex.cha +Status: RO + +@x +\def\"#1{{\accent"7F #1}} + +% LaTeX change: Make \t work in a moving argument. +@y +%\def\"#1{{\accent"7F #1}} <-- this definition is replaced by the +following: +\def\"#1{\dirtyumlaut#1} +\input def_umlaut + +% LaTeX change: Make \t work in a moving argument. +@z + +@x +\input lhyphen +@y +\input sihyphen +@z + + diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/plain.ch b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/plain.ch new file mode 100644 index 0000000000..de25f540f8 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/plain.ch @@ -0,0 +1,32 @@ +From helmut@eichow.tuwien.ac.at Thu Aug 12 11:32 MES 1993 +Received: from eichow.tuwien.ac.at by eiunix.tuwien.ac.at with SMTP + (16.8/16.2) id AA29132; Thu, 12 Aug 93 11:32:33 +0200 +Return-Path: <helmut@eichow.tuwien.ac.at> +Received: by eichow.tuwien.ac.at (MX V3.3 VAX) id 9763; Thu, 12 Aug 1993 + 11:30:15 EDT +Date: Thu, 12 Aug 1993 11:30:14 EDT +From: "Steiner Helmut, Tel. 58801/4073" <helmut@eichow.tuwien.ac.at> +To: heinz@eichow.tuwien.ac.at +Message-Id: <00970E8C.837FA520.9763@eichow.tuwien.ac.at> +Subject: File: plain_tex.cha +Status: RO + +@x +\def\"#1{{\accent"7F #1}} +\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}} +@y +% \def\"#1{{\accent"7F #1}} <-- this definition is replaced by +the following: +\def\"#1{\dirtyumlaut#1} +\input def_umlaut % for testing purposes excluded + +\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}} +@z + +@x +\input hyphen +@y +\input sihyphen +@z + + diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/sigerman.sty b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/sigerman.sty new file mode 100644 index 0000000000..9f3396a76c --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/sigerman.sty @@ -0,0 +1,432 @@ +%GERMAN +% This is GERMAN.TEX or GERMAN.DOC or GERMAN.STY, Vers. 2.3c, 28 Aug 1990, +% collected by H.Partl (TU Wien), +% using ideas by W.Appelt, F.Hommes et al. (GMD St.Augustin), +% T.Hofmann (CIBA-GEIGY Basel), N.Schwarz (Uni Bochum), +% J.Schrod (TH Darmstadt), D.Armbruster (Uni Stuttgart), +% R.Schoepf (Uni Mainz, Uni Heidelberg) and F.Mittelbach +% (Uni Mainz, EDS Ruesselsheim), J.Knappen (Uni Mainz), +% P.Breitenlohner (MPI Muenchen), and many others. +% +% DOCUMENT STYLE OPTION for writing german texts +% with TeX version 2.x (Plain TeX) or with LaTeX version 2.09. +% +% It can be called via +% \input german +% or (with LaTeX) via +% \documentstyle[german]{anystyle} +% +% This file conforms to the standard for "Einheitliche deutsche +% TeX-Befehle" as proposed at the 6th Meeting of German TeX Users +% in Muenster, October 1987. It is available from DANTE (the users +% group of German speaking TeX users) at the Uni Heidelberg. +% +% Commands to be used by the end users: +% "a for Umlaut-a (like \"a), also for all other vowels. +% "s for sharp s (like \ss{}). +% "ck for ck to be hyphenated as k-k. +% "ff for ff to be hyphenated as ff-f, also for certain +% other consonants. +% "S for SS to be \uppercase{"s} +% "A, "CK, "FF etc. uppercase versions of the above +% "| to separate ligatures. +% "- like \-, but allowing hyphenation in the rest of +% the word. +% "" like "-, but producing no hyphen sign. +% "` or \glqq for german left double quotes (similar to ,,) +% "' or \grqq for german right double quotes (similar to ``) +% \glq for german left single quotes (similar to , ) +% \grq for german right single quotes (similar to ` ) +% "< or \flqq for french left double quotes (similar to <<) +% "> or \frqq for french right double quotes (similar to >>) +% \flq for french left single quotes (similar to < ) +% \frq for french right single quotes (similar to > ) +% \dq for the original quotes character (") +% \selectlanguage{n} to switch to the language specified by n, which +% should be one of the following command names: +% \austrian \french \english \german \USenglish; +% - this changes the date format, captions and (if +% ``multilingual TeX''is installed) hyphenation. +% \originalTeX to restore everything to the original settings +% of TeX and LaTeX (well, almost everything). +% \germanTeX to re-activate the german settings. +% +% Obsolete commands, provided for compatibility with existing +% applications: +% \3 for sharp s (like "s). +% \ck for ck to be hyphenated as k-k (like "ck). +% \setlanguage (if not defined, i.e. not with TeX 3.x) = \selectlanguage +% +% Lower level commands and features: +% \umlautlow redefines the Umlaut accent such that the dots come +% nearer to the letter and that hyphenation is enabled +% in the rest of the word. +% \umlauthigh restores \" to its original meaning. +% \ss is \lccode'd to enable hyphenation. +% \mdqon makes " an active (meta-) character that does the +% pretty things described above. +% \mdqoff restores " to its original meaning. +% \dospecials,\@sanitize are extended to include the ". +% \dateaustrian, \dategerman, \dateenglish, \dateUSenglish, \datefrench +% redefine \today to use the respective date format. +% \captionsgerman, \captionsenglish, \captionsfrench +% switch to german, english or french chapter captions +% and the like, resp. This will have an effect only +% if the document style files use the symbolic names +% \chaptername etc. instead of the original english +% words. +% \language a count that is set by \selectlanguage and can be used +% by document style declarations like +% \ifnum\language=\english .textengl.\else +% \ifnum\language=\german .textgerm.\fi\fi +% and/or by M.Ferguson's ``Multilingual T^eX''. +% +% Finally, \germanTeX is switched on. +% +% Notes: +% This file can be used both with Plain TeX and with LaTeX and other +% macro packages, and with the original TeX and LaTeX fonts. Usage +% of german hyphenation patterns is recommended to accompany this +% style file when writing german texts. +% The file should be read in vertical mode only (usually at the +% beginning of the document) to avoid spurious spaces. +% \undefined must be an undefined control sequence. +% Multiple calls of this file (e.g. at the beginning of each subfile) +% will do no harm. Only the first call (i.e., if \mdqon is undefined) +% performs all the definitions and settings. +% The catcode of @ remains unchanged after processing of this file. +% All definitions are global, the switching on of the german options +% is local. +% The commands \mdqon, \mdqoff, \originalTeX, \germanTeX, and +% \selectlanguage are ``fragile'' with LaTeX and should not be used +% within arguments of macro calls. +% In Plain TeX, `\protect' should be \let to `\relax' normally and to +% something like `\string' inside the arguments of `\write' or `\message' +% (see LaTeX.TEX for all the details). +% The command \umlautlow may need adaption to font parameters (see +% comments there for details). +% The commands \flqq, \frqq, \flq, \frq, and \datefrench in their +% present forms do not work properly with all font sizes and styles, +% they still require a better solution. A LaTeX-only solution might be +% to use {\ly(}, {\ly(\kern-0.166em(}, {\ly)} etc., but this would not +% work with Plain TeX. +% + +% \ifundefined{mdqon} or \mdqon=\relax +\expandafter\ifx\csname mdqon\endcsname\relax +% \then go ahead \else do nothing +\else \endinput \fi + +\message{Document Style Option `german' Version 2.3c of 28 Aug 1990} + +% \ifundefined{protect} +\ifx\protect\undefined +% \then define it +\let\protect=\relax \fi + +{\catcode`\@=11 % \makeatletter + +\gdef\allowhyphens{\penalty\@M \hskip\z@skip} +% {\nobreak \hskip 0pt plus 0pt\relax} + +\newcount\U@C\newbox\U@B\newdimen\U@D +% \gdef\umlauthigh{\def\"##1{{\accent127 ##1}}} +\gdef\umlauthigh{\def\"##1{{\dirtyumlaut##1}}} + +%\gdef\umlautlow{\def\"{\protect\newumlaut}} + +\gdef\umlautlow{\def\"{\protect\dirtyumlautlow}} + +\gdef\dirtyumlautlow#1{\if#1A{\discretionary +{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1O{\discretionary +{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1U{\discretionary +{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1a{\discretionary +{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1o{\discretionary +{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1u{\discretionary +{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\protect\newumlaut#1}}\else +\if#1s{\discretionary +{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{} +{\ss}}\else{\protect\newumlaut#1}\fi\fi\fi\fi\fi\fi\fi} + + +\gdef\newumlaut#1{\leavevmode + \vbox{\baselineskip\z@skip \lineskip.25ex +% \baselineskip 0pt + \ialign{##\crcr\hidewidth + \setbox\U@B\hbox{#1}\U@D .01\p@\U@C\U@D + \U@D\ht\U@B\advance\U@D -1ex\divide\U@D \U@C + \U@C\U@D\U@D\the\fontdimen1\the\font + \multiply\U@D \U@C\divide\U@D 100\kern\U@D + \vbox to .20ex % <--- depending on the METAFONT parameters +% of the fonts, the height of this \vbox +% may vary around the value of .20ex -- +% just try out, which will look best! + {\hbox{\char127}\vss}\hidewidth\crcr#1\crcr}}} + +\gdef\highumlaut#1{\leavevmode\dirtyumlaut#1} + +\gdef\set@low@box#1{\setbox\tw@\hbox{,}\setbox\z@\hbox{#1}\dimen\z@\ht\z@ + \advance\dimen\z@ -\ht\tw@ + \setbox\z@\hbox{\lower\dimen\z@ \box\z@}\ht\z@\ht\tw@ \dp\z@\dp\tw@ } +% (this lowers the german left quotes to the same level as the comma.) + +\gdef\@glqq{{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi \leavevmode + \set@low@box{''}\box\z@\kern-.04em\allowhyphens\@SF\relax}} +\gdef\glqq{\protect\@glqq} +\gdef\@grqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi \kern-.07em``\kern.07em\@SF\relax} +\gdef\grqq{\protect\@grqq} +\gdef\@glq{{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi \leavevmode + \set@low@box{'}\box\z@\kern-.04em\allowhyphens\@SF\relax}} +\gdef\glq{\protect\@glq} +\gdef\@grq{\kern-.07em`\kern.07em} +\gdef\grq{\protect\@grq} +\gdef\@flqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi + \ifmmode \ll \else \leavevmode + \raise .2ex \hbox{$\scriptscriptstyle \ll $}\fi \@SF\relax} +\gdef\flqq{\protect\@flqq} +\gdef\@frqq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi + \ifmmode \gg \else \leavevmode + \raise .2ex \hbox{$\scriptscriptstyle \gg $}\fi \@SF\relax} +\gdef\frqq{\protect\@frqq} +\gdef\@flq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi + \ifmmode < \else \leavevmode + \raise .2ex \hbox{$\scriptscriptstyle < $}\fi \@SF\relax} +\gdef\flq{\protect\@flq} +\gdef\@frq{\ifhmode \edef\@SF{\spacefactor\the\spacefactor}\else + \let\@SF\empty \fi + \ifmmode > \else \leavevmode + \raise .2ex \hbox{$\scriptscriptstyle > $}\fi \@SF\relax} +\gdef\frq{\protect\@frq} + +% enable hyphenations after \ss: +\global\lccode`\^^Y=`\^^Y + +\global\let\original@three=\3 % Note that \3 may be defined or undefined. + +% add the quotes to the definitions of dospecials and sanitize: +\begingroup +\def\do{\noexpand\do\noexpand}% +% note that "\xdef" means "\global\edef" +\xdef\dospecials{\dospecials\do\"}% +% not ( \ifundefined{@sanitize} or \@sanitize=\relax ) = if LaTeX +\expandafter\ifx\csname @sanitize\endcsname\relax \else + \def\@makeother{\noexpand\@makeother\noexpand}% + \xdef\@sanitize{\@sanitize\@makeother\"}% +\fi +\endgroup + +\gdef\mdqon{\catcode`\"\active} +\gdef\mdqoff{\catcode`\"12 } + +\gdef\ck{\allowhyphens\discretionary{k-}{k}{ck}\allowhyphens} + +{\mdqoff +\gdef\@UMLAUT{\"} +\gdef\@MATHUMLAUT{\mathaccent"707F } +\gdef\@SS{\mathchar"7019 } +\gdef\dq{"} +} + +{\mdqon +\gdef"{\protect\active@dq} +\gdef\active@dq{\futurelet\next@after@dq\first@active@dq} +% For efficency, first the most frequent ones in a short macro only: +\gdef\first@active@dq#1{% + \ifx \next@after@dq\bgroup\dq {#1}% + \else \expandafter\ifx \space\next@after@dq\dq\space #1% + % The two lines above are needed before everything else, to take care of + % (empty or non-empty) groups and spaces after the active quote! + % Now the real thing: + \else \ifx #1s\ifmmode\@SS \else \ss\fi{}% + % note the empty group to avoid gobbling spaces. + \else \ifx #1a\ifmmode\@MATHUMLAUT a\else \@UMLAUT a\fi + \else \ifx #1o\ifmmode\@MATHUMLAUT o\else \@UMLAUT o\fi + \else \ifx #1u\ifmmode\@MATHUMLAUT u\else \@UMLAUT u\fi + \else \ifx #1A\ifmmode\@MATHUMLAUT A\else \@UMLAUT A\fi + \else \ifx #1O\ifmmode\@MATHUMLAUT O\else \@UMLAUT O\fi + \else \ifx #1U\ifmmode\@MATHUMLAUT U\else \@UMLAUT U\fi + \else \ifx #1`\glqq{}% + \else \ifx #1'\grqq{}% + \else \other@active@dq{#1}% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi } +% And now a separate command for the less frequent ones: +\gdef\other@active@dq#1{% + \ifx #1e\ifmmode\@MATHUMLAUT e\else \highumlaut e\fi + \else \ifx #1i\ifmmode\@MATHUMLAUT i\else \highumlaut\i \fi + \else \ifx #1E\ifmmode\@MATHUMLAUT E\else \highumlaut E\fi + \else \ifx #1I\ifmmode\@MATHUMLAUT I\else \highumlaut I\fi + \else \ifx #1SSS% + \else \ifx #1-\allowhyphens\-\allowhyphens + \else \ifx #1"\hskip\z@skip + \else \ifx #1|\discretionary{-}{}{\kern.03em}% + \else \ifx #1c\allowhyphens\discretionary{k-}{}{c}\allowhyphens + \else \ifx #1f\allowhyphens\discretionary{ff-}{}{f}\allowhyphens + \else \ifx #1l\allowhyphens\discretionary{ll-}{}{l}\allowhyphens + \else \ifx #1m\allowhyphens\discretionary{mm-}{}{m}\allowhyphens + \else \ifx #1n\allowhyphens\discretionary{nn-}{}{n}\allowhyphens + \else \ifx #1p\allowhyphens\discretionary{pp-}{}{p}\allowhyphens + \else \ifx #1t\allowhyphens\discretionary{tt-}{}{t}\allowhyphens + \else \ifx #1C\allowhyphens\discretionary{K-}{}{C}\allowhyphens + \else \ifx #1F\allowhyphens\discretionary{FF-}{}{F}\allowhyphens + \else \ifx #1L\allowhyphens\discretionary{LL-}{}{L}\allowhyphens + \else \ifx #1M\allowhyphens\discretionary{MM-}{}{M}\allowhyphens + \else \ifx #1N\allowhyphens\discretionary{NN-}{}{N}\allowhyphens + \else \ifx #1P\allowhyphens\discretionary{PP-}{}{P}\allowhyphens + \else \ifx #1T\allowhyphens\discretionary{TT-}{}{T}\allowhyphens + \else \ifx #1<\flqq{}% + \else \ifx #1>\frqq{}% + % note the empty group to avoid gobbling spaces. + \else \ifx #1\active@dq\hskip\z@skip + \else \dq #1% + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi } +} % end of \mdqon + +\gdef\dateaustrian{\def\today{\number\day.~\ifcase\month\or + J\"anner\or Februar\or M\"arz\or April\or Mai\or Juni\or + Juli\or August\or September\or Oktober\or November\or Dezember\fi + \space\number\year}} +\gdef\dategerman{\def\today{\number\day.~\ifcase\month\or + Januar\or Februar\or M\"arz\or April\or Mai\or Juni\or + Juli\or August\or September\or Oktober\or November\or Dezember\fi + \space\number\year}} +\gdef\dateUSenglish{\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year}} +\gdef\dateenglish{\def\today{\ifcase\day\or + 1st\or 2nd\or 3rd\or 4th\or 5th\or + 6th\or 7th\or 8th\or 9th\or 10th\or + 11th\or 12th\or 13th\or 14th\or 15th\or + 16th\or 17th\or 18th\or 19th\or 20th\or + 21st\or 22nd\or 237rd\or 24th\or 25th\or + 26th\or 27th\or 28th\or 29th\or 30th\or + 31st\fi + ~\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space \number\year}} +\gdef\datefrench{\def\today{\ifnum\day=1\relax 1\/$^{\rm er}$\else + \number\day\fi \space\ifcase\month\or + janvier\or f\'evrier\or mars\or avril\or mai\or juin\or + juillet\or ao\^ut\or septembre\or octobre\or novembre\or d\'ecembre\fi + \space\number\year}} + +% Here is, how you can modify the LaTeX document style files and option +% files, to benefit from the following \captionsxxxxx commands. Def's like +% \def\tableofcontents{\section*{Contents\markboth{CONTENTS}{CONTENTS}} +% \@starttoc{toc}} +% should be redefined by def's like +% \def\contentsname{Contents} % <--- +% \def\tableofcontents{\section*{\contentsname +% \markboth{\uppercase{\contentsname}}{\uppercase{\contentsname}}} +% \@starttoc{toc}} +% (it's best to put all these new lines to the end of the origignal files), +% and of course, you should modify the change date in the file header and +% in the \typeout command. + +\gdef\captionsgerman{% +\def\refname{Literatur}% +\def\abstractname{Zusammenfassung}% +\def\bibname{Literaturverzeichnis}% +\def\chaptername{Kapitel}% +\def\appendixname{Anhang}% +\def\contentsname{Inhaltsverzeichnis}% % oder nur: Inhalt +\def\listfigurename{Abbildungsverzeichnis}% +\def\listtablename{Tabellenverzeichnis}% +\def\indexname{Index}% +\def\figurename{Abbildung}% +\def\tablename{Tabelle}% % oder: Tafel +\def\partname{Teil}% +\def\enclname{Anlage(n)}% % oder: Beilage(n) +\def\ccname{Verteiler}% % oder: Kopien an +\def\headtoname{An}% +\def\pagename{Seite}} + +\gdef\captionsenglish{% +\def\refname{References}% +\def\abstractname{Abstract}% +\def\bibname{Bibliography}% +\def\chaptername{Chapter}% +\def\appendixname{Appendix}% +\def\contentsname{Contents}% +\def\listfigurename{List of Figures}% +\def\listtablename{List of Tables}% +\def\indexname{Index}% +\def\figurename{Figure}% +\def\tablename{Table}% +\def\partname{Part}% +\def\enclname{encl}% +\def\ccname{cc}% +\def\headtoname{To}% +\def\pagename{Page}} + +\gdef\captionsfrench{% +\def\refname{R\'ef\'erences}% +\def\abstractname{R\'esum\'e}% +\def\bibname{Bibliographie}% +\def\chaptername{Chapitre}% +\def\appendixname{Annexe}% +\def\contentsname{Table des mati\`eres}% +\def\listfigurename{Liste des figures}% +\def\listtablename{Liste des tableaux}% +\def\indexname{Index}% +\def\figurename{Figure}% +\def\tablename{Tableau}% +\def\partname{Partie}% +\def\enclname{P.~J.}% +\def\ccname{Copie \`a}% +\def\headtoname{A}% +\def\pagename{Page}} + +\newcount\l@nguage +% This will be re-declared as \language if the latter has not yet been +% declared neither by Ferguson's ``Multilingual T^eX'' nor by TeX 3: +% \ifundefined{language} +\expandafter\ifx\csname language\endcsname\relax +\global\let\language=\l@nguage +\fi + +\newcount\USenglish \global\USenglish=0 +\newcount\german \global\german=1 +\newcount\austrian \global\austrian=2 +\newcount\french \global\french=3 +\newcount\english \global\english=4 + +\gdef\selectlanguage#1{\language #1\relax + \expandafter\ifcase #1\relax + \dateUSenglish \captionsenglish \or + \dategerman \captionsgerman \or + \dateaustrian \captionsgerman \or + \datefrench \captionsfrench \or + \dateenglish \captionsenglish \fi} + +% \ifundefined{setlanguage} (= TeX version < 3 ) +\expandafter\ifx\csname setlanguage\endcsname\relax +\global\let\setlanguage=\selectlanguage +\fi + +\gdef\originalTeX{\mdqoff \umlauthigh \let\3\original@three + \selectlanguage{\USenglish}} +\gdef\germanTeX{\mdqon \umlautlow \let\3\ss + \selectlanguage{\german}} + +} % return to previous catcodes + +% Now, switch on what is appropriate for german: + +\germanTeX + +% This is the end of GERMAN.STY/DOC/TEX. +\endinput diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/silplain.tex b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/silplain.tex new file mode 100644 index 0000000000..d0caa18510 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/silplain.tex @@ -0,0 +1,1372 @@ +% File LPLAIN - Created 29 October 1985 from plain version 1.5CM +% - Last modified 20 October 1988 to take into account +% changes to PLAIN.TEX reported by Arthur Ogawa +% - Modified February 8, 1990 by Dominik Wujastyk to +% match the PLAIN.TEX meant for TeX 3.0 (\fmtname{plain}, +% \fmtversion{3.0}). +% - Modified March 15, 1990 by Frank Mittelbach to +% allow the use of this file both in TeX 2 and 3 +% - Modified June 21, 1991 by RmS to clear the +% contents of \box0. +% - Modified July 1, 1991, by RmS to correct \multispan bug. +% - Modified August 14, 1991, By RmS to make \cases work +% with NFSS. +% - Modified October 30, 1991, by RmS to remove \catcode and +% \mathcode assignments for control characters. +% - Modified November 1, 1991, by RmS to remove ^^A and ^^K +% control characters. +% - Modified November 4, 1991, by RmS to add missing \m@th +% assignments and to introduce the file lhyphen.tex. +% - Modified November 7, 1991, by RmS to make it work with +% MLTeX version 2. +% - Modified March 17, 1992, by RmS to match changes in +% plain.tex of March 16, 1992. +% +% This is the LaTeX version of the plain TeX format that's described in +% The TeXbook. All modifications can be found by searching for +% the word 'LaTeX'. +% N.B.: A version number is defined at the very end of this file; +% please change that number whenever the file is modified! +% And don't modify the file under any circumstances. +% +%% \CharacterTable +%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z +%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z +%% Digits \0\1\2\3\4\5\6\7\8\9 +%% Exclamation \! Double quote \" Hash (number) \# +%% Dollar \$ Percent \% Ampersand \& +%% Acute accent \' Left paren \( Right paren \) +%% Asterisk \* Plus \+ Comma \, +%% Minus \- Point \. Solidus \/ +%% Colon \: Semicolon \; Less than \< +%% Equals \= Greater than \> Question mark \? +%% Commercial at \@ Left bracket \[ Backslash \\ +%% Right bracket \] Circumflex \^ Underscore \_ +%% Grave accent \` Left brace \{ Vertical bar \| +%% Right brace \} Tilde \~} +%% + +\catcode`\{=1 % left brace is begin-group character +\catcode`\}=2 % right brace is end-group character +\catcode`\$=3 % dollar sign is math shift +\catcode`\&=4 % ampersand is alignment tab +\catcode`\#=6 % hash mark is macro parameter character +\catcode`\^=7 % circumflex and uparrow are for superscripts +\catcode`\_=8 % underline and downarrow are for subscripts +\catcode`\^^I=10 % ascii tab is a blank space +\chardef\active=13 \catcode`\~=\active % tilde is active +\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par" + +\message{Preloading the plain format: codes,} + +% We had to define the \catcodes right away, before the message line, +% since \message uses the { and } characters. +% When INITEX (the TeX initializer) starts up, +% it has defined the following \catcode values: +% \catcode`\^^@=9 % ascii null is ignored +% \catcode`\^^M=5 % ascii return is end-line +% \catcode`\\=0 % backslash is TeX escape character +% \catcode`\%=14 % percent sign is comment character +% \catcode`\ =10 % ascii space is blank space +% \catcode`\^^?=15 % ascii delete is invalid +% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters +% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters +% all others are type 12 (other) + +% Here is a list of the characters that have been specially catcoded: +\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\_\do\%\do\~} +% (not counting ascii null, tab, linefeed, formfeed, return, delete) +% Each symbol in the list is preceded by \do, which can be defined +% if you want to do something to every item in the list. + +% We make @ signs act like letters, temporarily, to avoid conflict +% between user names and internal control sequences of plain format. +\catcode`@=11 + +% INITEX sets up \mathcode x=x, for x=0..255, except that +% \mathcode x=x+"7100, for x = `A to `Z and `a to `z; +% \mathcode x=x+"7000, for x = `0 to `9. +% The following changes define internal codes as recommended +% in Appendix C of The TeXbook: +\mathcode`\ ="8000 % \space +\mathcode`\!="5021 +\mathcode`\'="8000 % ^\prime +\mathcode`\(="4028 +\mathcode`\)="5029 +\mathcode`\*="2203 % \ast +\mathcode`\+="202B +\mathcode`\,="613B +\mathcode`\-="2200 +\mathcode`\.="013A +\mathcode`\/="013D +\mathcode`\:="303A +\mathcode`\;="603B +\mathcode`\<="313C +\mathcode`\=="303D +\mathcode`\>="313E +\mathcode`\?="503F +\mathcode`\[="405B +\mathcode`\\="026E % \backslash +\mathcode`\]="505D +\mathcode`\_="8000 % \_ +\mathcode`\{="4266 +\mathcode`\|="026A +\mathcode`\}="5267 + +% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x, +% and \lccode`x=`x, \lccode`X=`x; all other values are zero. +% No changes to those tables are needed in plain TeX format. + +% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999 +% for uppercase letters. The following changes are needed: +\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0 +% The \nonfrenchspacing macro will make further changes to \sfcode values. + +% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0 +\delcode`\(="028300 +\delcode`\)="029301 +\delcode`\[="05B302 +\delcode`\]="05D303 +\delcode`\<="26830A +\delcode`\>="26930B +\delcode`\/="02F30E +\delcode`\|="26A30C +\delcode`\\="26E30F +% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails! + +% To make the plain macros more efficient in time and space, +% several constant values are declared here as control sequences. +% If they were changed, anything could happen; so they are private symbols. +\chardef\@ne=1 +\chardef\tw@=2 +\chardef\thr@@=3 +\chardef\sixt@@n=16 +\chardef\@cclv=255 +\mathchardef\@cclvi=256 +\mathchardef\@m=1000 +\mathchardef\@M=10000 +\mathchardef\@MM=20000 + +% Allocation of registers + +% Here are macros for the automatic allocation of \count, \box, \dimen, +% \skip, \muskip, and \toks registers, as well as \read and \write +% stream numbers, \fam codes, \language codes, and \insert numbers. + +\message{registers,} + +% When a register is used only temporarily, it need not be allocated; +% grouping can be used, making the value previously in the register return +% after the close of the group. The main use of these macros is for +% registers that are defined by one macro and used by others, possibly at +% different nesting levels. All such registers should be defined through +% these macros; otherwise conflicts may occur, especially when two or more +% more macro packages are being used at once. + +% The following counters are reserved: +% 0 to 9 page numbering +% 10 count allocation +% 11 dimen allocation +% 12 skip allocation +% 13 muskip allocation +% 14 box allocation +% 15 toks allocation +% 16 read file allocation +% 17 write file allocation +% 18 math family allocation +% 19 language allocation +% 20 insert allocation +% 21 the most recently allocated number +% 22 constant -1 +% New counters are allocated starting with 23, 24, etc. Other registers are +% allocated starting with 10. This leaves 0 through 9 for the user to play +% with safely, except that counts 0 to 9 are considered to be the page and +% subpage numbers (since they are displayed during output). In this scheme, +% \count 10 always contains the number of the highest-numbered counter that +% has been allocated, \count 14 the highest-numbered box, etc. +% Inserts are given numbers 254, 253, etc., since they require a \count, +% \dimen, \skip, and \box all with the same number; \count 20 contains the +% lowest-numbered insert that has been allocated. Of course, \box255 is +% reserved for \output; \count255, \dimen255, and \skip255 can be used freely. + +% It is recommended that macro designers always use +% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and +% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255. +% This will prevent ``save stack buildup'' that might otherwise occur. + +\count10=22 % allocates \count registers 23, 24, ... +\count11=9 % allocates \dimen registers 10, 11, ... +\count12=9 % allocates \skip registers 10, 11, ... +\count13=9 % allocates \muskip registers 10, 11, ... +\count14=9 % allocates \box registers 10, 11, ... +\count15=9 % allocates \toks registers 10, 11, ... +\count16=-1 % allocates input streams 0, 1, ... +\count17=-1 % allocates output streams 0, 1, ... +\count18=3 % allocates math families 4, 5, ... +\count19=0 % allocates \language codes 1, 2, ... +\count20=255 % allocates insertions 254, 253, ... +\countdef\insc@unt=20 % the insertion counter +\countdef\allocationnumber=21 % the most recent allocation +\countdef\m@ne=22 \m@ne=-1 % a handy constant +\def\wlog{\immediate\write\m@ne} % write on log file (only) + +% Here are abbreviations for the names of scratch registers +% that don't need to be allocated. + +\countdef\count@=255 +\dimendef\dimen@=0 +\dimendef\dimen@i=1 % global only +\dimendef\dimen@ii=2 +\skipdef\skip@=0 +\toksdef\toks@=0 + +% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo +% and \foo will be defined (with \countdef) to be the next counter. +% To find out which counter \foo is, you can look at \allocationnumber. +% Since there's no \boxdef command, \chardef is used to define a \newbox, +% \newinsert, \newfam, and so on. +% LaTeX change: remove \outer from \newcount and \newdimen (FMi) +% This is necessary to use \newcount inside \if... +% later on. + +\def\newcount{\alloc@0\count\countdef\insc@unt} +\def\newdimen{\alloc@1\dimen\dimendef\insc@unt} +\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt} +\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi} +\outer\def\newbox{\alloc@4\box\chardef\insc@unt} +\let\newtoks=\relax % we do this to allow plain.tex to be read in twice +\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}} +\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi} +\outer\def\newread{\alloc@6\read\chardef\sixt@@n} +\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n} +\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n} +\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi} +\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne + \ch@ck#1#4#2% make sure there's still room + \allocationnumber=\count1#1% + \global#3#5=\allocationnumber + \wlog{\string#5=\string#2\the\allocationnumber}} +\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne + \ch@ck0\insc@unt\count + \ch@ck1\insc@unt\dimen + \ch@ck2\insc@unt\skip + \ch@ck4\insc@unt\box + \allocationnumber=\insc@unt + \global\chardef#1=\allocationnumber + \wlog{\string#1=\string\insert\the\allocationnumber}} +\def\ch@ck#1#2#3{\ifnum\count1#1<#2% + \else\errmessage{No room for a new #3}\fi} + +% Here are some examples of allocation. +\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen> +\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow + +% LaTeX change: the PLAIN \centering dimension conflicts with +% LaTeX's \centering command, so it is redefined to \@centering. +% This dimension is used by LaTeX. + +\newskip\@centering \@centering=0pt plus 1000pt minus 1000pt + +\newdimen\p@ \p@=1pt % this saves macro space and time +\newdimen\z@ \z@=0pt % can be used both for 0pt and 0 +\newskip\z@skip \z@skip=0pt plus0pt minus0pt +\newbox\voidb@x % permanently void box register + +% And here's a different sort of allocation: +% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo. +\outer\def\newif#1{\count@\escapechar \escapechar\m@ne + \expandafter\expandafter\expandafter + \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}% + \expandafter\expandafter\expandafter + \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}% + \@if#1{false}\escapechar\count@} % the condition starts out false +\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname} +{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required + +\message{compatibility for TeX 2, } + +% If this file is used in an old TeX we define the new features +% of TeX 3.0 as simple macros or counters so that files that uses +% these features can be processed in such an environment +% (They will however produce some other results). + +\ifx\undefined\inputlineno + \newcount\inputlineno + \inputlineno-1 % this could be used to detect that + % an old TeX is in force + \ifx\undefined\language % extra test for MLTeX 2, RmS 91/11/07 + \newcount\language + \fi + \newcount\lefthyphenmin + \newcount\righthyphenmin + \newcount\errorcontextlines + \newcount\holdinginserts + \newdimen\emergencystretch + \newcount\badness + \let\noboundary\relax + \newcount\setlanguage +\fi + +% Assign initial values to TeX's parameters + +\message{parameters,} + +% All of TeX's numeric parameters are listed here, +% but the code is commented out if no special value needs to be set. +% INITEX makes all parameters zero except where noted. + +\pretolerance=100 +\tolerance=200 % INITEX sets this to 10000 +\hbadness=1000 +\vbadness=1000 +\linepenalty=10 +\hyphenpenalty=50 +\exhyphenpenalty=50 +\binoppenalty=700 +\relpenalty=500 +\clubpenalty=150 +\widowpenalty=150 +\displaywidowpenalty=50 +\brokenpenalty=100 +\predisplaypenalty=10000 +% \postdisplaypenalty=0 +% \interlinepenalty=0 +% \floatingpenalty=0, set during \insert +% \outputpenalty=0, set before TeX enters \output +\doublehyphendemerits=10000 +\finalhyphendemerits=5000 +\adjdemerits=10000 +% \looseness=0, cleared by TeX after each paragraph +% \pausing=0 +% \holdinginserts=0 +% \tracingonline=0 +% \tracingmacros=0 +% \tracingstats=0 +% \tracingparagraphs=0 +% \tracingpages=0 +% \tracingoutput=0 +\tracinglostchars=1 +% \tracingcommands=0 +% \tracingrestores=0 +% \language=0 +\uchyph=1 +% \lefthyphenmin=2 \righthyphenmin=3 set below +% \globaldefs=0 +% \maxdeadcycles=25 % INITEX does this +% \hangafter=1 % INITEX does this, also TeX after each paragraph +% \fam=0 +% \mag=1000 % INITEX does this +% \escapechar=`\\ % INITEX does this +\defaulthyphenchar=`\- +\defaultskewchar=-1 +% \endlinechar=`\^^M % INITEX does this +\newlinechar=-1 +\delimiterfactor=901 +% \time=now % TeX does this at beginning of job +% \day=now % TeX does this at beginning of job +% \month=now % TeX does this at beginning of job +% \year=now % TeX does this at beginning of job +\showboxbreadth=5 +\showboxdepth=3 +\errorcontextlines=5 + +\hfuzz=0.1pt +\vfuzz=0.1pt +\overfullrule=5pt +\hsize=6.5in +\vsize=8.9in +\maxdepth=4pt +\splitmaxdepth=\maxdimen +\boxmaxdepth=\maxdimen +% \lineskiplimit=0pt, changed by \normalbaselines +\delimitershortfall=5pt +\nulldelimiterspace=1.2pt +\scriptspace=0.5pt +% \mathsurround=0pt +% \predisplaysize=0pt, set before TeX enters $$ +% \displaywidth=0pt, set before TeX enters $$ +% \displayindent=0pt, set before TeX enters $$ +\parindent=20pt +% \hangindent=0pt, zeroed by TeX after each paragraph +% \hoffset=0pt +% \voffset=0pt + +% \baselineskip=0pt, changed by \normalbaselines +% \lineskip=0pt, changed by \normalbaselines +\parskip=0pt plus 1pt +\abovedisplayskip=12pt plus 3pt minus 9pt +\abovedisplayshortskip=0pt plus 3pt +\belowdisplayskip=12pt plus 3pt minus 9pt +\belowdisplayshortskip=7pt plus 3pt minus 4pt +% \leftskip=0pt +% \rightskip=0pt +\topskip=10pt +\splittopskip=10pt +% \tabskip=0pt +% \spaceskip=0pt +% \xspaceskip=0pt +\parfillskip=0pt plus 1fil + +\thinmuskip=3mu +\medmuskip=4mu plus 2mu minus 4mu +\thickmuskip=5mu plus 5mu + +% We also define special registers that function like parameters: +\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt +\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt +\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt +\newskip\normalbaselineskip \normalbaselineskip=12pt +\newskip\normallineskip \normallineskip=1pt +\newdimen\normallineskiplimit \normallineskiplimit=0pt +\newdimen\jot \jot=3pt +\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100 +\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100 + +% Definitions for preloaded fonts + +\def\magstephalf{1095 } +\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax} + +% Fonts assigned to \preloaded are not part of "plain TeX", +% but they are preloaded so that other format packages can use them. +% For example, if another set of macros says "\font\ninerm=cmr9", +% TeX will not have to reload the font metric information for cmr9. + +% LaTeX font definitions are taken from the file LFONTS.TEX, +% so all of PLAIN's font definitions are commented out. + +%\message{fonts,} +% +%\font\tenrm=cmr10 % roman text +%\font\preloaded=cmr9 +%\font\preloaded=cmr8 +%\font\sevenrm=cmr7 +%\font\preloaded=cmr6 +%\font\fiverm=cmr5 +% +%\font\teni=cmmi10 % math italic +%\font\preloaded=cmmi9 +%\font\preloaded=cmmi8 +%\font\seveni=cmmi7 +%\font\preloaded=cmmi6 +%\font\fivei=cmmi5 +% +%\font\tensy=cmsy10 % math symbols +%\font\preloaded=cmsy9 +%\font\preloaded=cmsy8 +%\font\sevensy=cmsy7 +%\font\preloaded=cmsy6 +%\font\fivesy=cmsy5 +% +%\font\tenex=cmex10 % math extension +% +%\font\preloaded=cmss10 % sans serif +%\font\preloaded=cmssq8 +% +%\font\preloaded=cmssi10 % sans serif italic +%\font\preloaded=cmssqi8 +% +%\font\tenbf=cmbx10 % boldface extended +%\font\preloaded=cmbx9 +%\font\preloaded=cmbx8 +%\font\sevenbf=cmbx7 +%\font\preloaded=cmbx6 +%\font\fivebf=cmbx5 +% +%\font\tentt=cmtt10 % typewriter +%\font\preloaded=cmtt9 +%\font\preloaded=cmtt8 +% +%\font\preloaded=cmsltt10 % slanted typewriter +% +%\font\tensl=cmsl10 % slanted roman +%\font\preloaded=cmsl9 +%\font\preloaded=cmsl8 +% +%\font\tenit=cmti10 % text italic +%\font\preloaded=cmti9 +%\font\preloaded=cmti8 +%\font\preloaded=cmti7 +% +%\message{more fonts,} +%\font\preloaded=cmu10 % unslanted text italic +% +%\font\preloaded=cmmib10 % bold math italic +%\font\preloaded=cmbsy10 % bold math symbols +% +%\font\preloaded=cmcsc10 % caps and small caps +% +%\font\preloaded=cmssbx10 % sans serif bold extended +% +%\font\preloaded=cmdunh10 % Dunhill style +% +%\font\preloaded=cmr7 scaled \magstep4 % for titles +%\font\preloaded=cmtt10 scaled \magstep2 +%\font\preloaded=cmssbx10 scaled \magstep2 +% +%\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols +% +%% Additional \preloaded fonts can be specified here. +%% (And those that were \preloaded above can be eliminated.) +% +%\let\preloaded=\undefined % preloaded fonts must be declared anew later. +% +%\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177 +%\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60 +% +%\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm +%\def\rm{\fam\z@\tenrm} +%\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei +%\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni} +%\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy +%\def\cal{\fam\tw@} +%\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex +%\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4 +%\textfont\itfam=\tenit +%\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5 +%\textfont\slfam=\tensl +%\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6 +%\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf +%\scriptscriptfont\bffam=\fivebf +%\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7 +%\textfont\ttfam=\tentt + +% Macros for setting ordinary text +\message{macros,} + +\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m + \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m} +\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000% + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 } + +\def\normalbaselines{\lineskip\normallineskip + \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit} + +\def\^^M{\ } % control <return> = control <space> +\def\^^I{\ } % same for <tab> + +\def\lq{`} \def\rq{'} +\def\lbrack{[} \def\rbrack{]} + +\let\endgraf=\par \let\endline=\cr + +\def\space{ } +\def\empty{} +\def\null{\hbox{}} + +\let\bgroup={ \let\egroup=} + +% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}' +% since this allows, for example, `\let\par=\cr \obeylines \halign{...' +{\catcode`\^^M=\active % these lines must end with % + \gdef\obeylines{\catcode`\^^M\active \let^^M\par}% + \global\let^^M\par} % this is in case ^^M appears in a \write +\def\obeyspaces{\catcode`\ \active} +{\obeyspaces\global\let =\space} + +\def\loop#1\repeat{\def\body{#1}\iterate} +\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next} +\let\repeat=\fi % this makes \loop...\if...\repeat skippable + +\def\thinspace{\kern .16667em } +\def\negthinspace{\kern-.16667em } +\def\enspace{\kern.5em } + +\def\enskip{\hskip.5em\relax} +\def\quad{\hskip1em\relax} +\def\qquad{\hskip2em\relax} + +\def\smallskip{\vskip\smallskipamount} +\def\medskip{\vskip\medskipamount} +\def\bigskip{\vskip\bigskipamount} + +\def\nointerlineskip{\prevdepth-1000\p@} +\def\offinterlineskip{\baselineskip-1000\p@ + \lineskip\z@ \lineskiplimit\maxdimen} + +\def\vglue{\afterassignment\vgl@\skip@=} +\def\vgl@{\par \dimen@\prevdepth \hrule height\z@ + \nobreak\vskip\skip@ \prevdepth\dimen@} +\def\hglue{\afterassignment\hgl@\skip@=} +\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@ + \nobreak\hskip\skip@ \spacefactor\count@} + +\def~{\penalty\@M \ } % tie +\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-' + +\def\break{\penalty-\@M} +\def\nobreak{\penalty \@M} +\def\allowbreak{\penalty \z@} + +\def\filbreak{\par\vfil\penalty-200\vfilneg} +\def\goodbreak{\par\penalty-500 } +\def\eject{\par\break} +\def\supereject{\par\penalty-\@MM} + +\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi} +\def\smallbreak{\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi} +\def\medbreak{\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi} +\def\bigbreak{\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi} + +% \line changed to \@@line because LaTeX redefines \line +\def\@@line{\hbox to\hsize} +\def\leftline#1{\@@line{#1\hss}} +\def\rightline#1{\@@line{\hss#1}} +\def\centerline#1{\@@line{\hss#1\hss}} +% end of LaTeX \line -> \@@line change + +\def\rlap#1{\hbox to\z@{#1\hss}} +\def\llap#1{\hbox to\z@{\hss#1}} + +\def\m@th{\mathsurround=\z@} +\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@ + \m@th \underline{\box\z@}$} + +\newbox\strutbox +\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@} +\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} + +\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out +\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign +\newcount\mscount +\def\multispan#1{\omit \mscount#1\relax + \loop\ifnum\mscount>\@ne \sp@n\repeat} +\def\sp@n{\span\omit\advance\mscount\m@ne} + +% LaTeX has its own tabbing environment, so PLAIN's is disabled. +% +%\newif\ifus@ \newif\if@cr +%\newbox\tabs \newbox\tabsyet \newbox\tabsdone +% +%\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null} +%\def\settabs{\setbox\tabs\null \futurelet\next\sett@b} +%\let\+=\relax % in case this file is being read in twice +%\def\sett@b{\ifx\next\+\let\next\relax +% \def\next{\afterassignment\s@tt@b\let\next}% +% \else\let\next\s@tcols\fi\next} +%\def\s@tt@b{\let\next\relax\us@false\m@ketabbox} +%\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+ +%\outer\def\+{\tabalign} +%\def\s@tcols#1\columns{\count@#1 \dimen@\hsize +% \loop\ifnum\count@>\z@ \@nother \repeat} +%\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@ +% \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}% +% \advance\dimen@-\dimen@ii \advance\count@\m@ne} +% +%\def\m@ketabbox{\begingroup +% \global\setbox\tabsyet\copy\tabs +% \global\setbox\tabsdone\null +% \def\cr{\@crtrue\crcr\egroup\egroup +% \ifus@\unvbox\z@\lastbox\fi\endgroup +% \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}% +% \setbox\z@\vbox\bgroup\@crfalse +% \ialign\bgroup&\t@bbox##\t@bb@x\crcr} +% +%\def\t@bbox{\setbox\z@\hbox\bgroup} +%\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column +% \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet +% \global\setbox\@ne\lastbox}% now \box\@ne holds its size +% \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}% +% \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi +% \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi +% \box\z@} + +\def\hang{\hangindent\parindent} +\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces} +\def\item{\par\hang\textindent} +%% RmS 91/11/04: Removed \itemitem since never needed/useful on LaTeX. +%\def\itemitem{\par\indent \hangindent2\parindent \textindent} +\def\narrower{\advance\leftskip\parindent + \advance\rightskip\parindent} + +% LaTeX has its own sectioning macros +%\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250 +% \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip +% \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent} + +\outer\def\proclaim #1. #2\par{\medbreak + \noindent{\bf#1.\enspace}{\sl#2\par}% + \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi} + +\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax} +\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only + +\chardef\%=`\% +\chardef\&=`\& +\chardef\#=`\# +\chardef\$=`\$ +\chardef\ss="19 +\chardef\ae="1A +\chardef\oe="1B +\chardef\o="1C +\chardef\AE="1D +\chardef\OE="1E +\chardef\O="1F +\chardef\i="10 \chardef\j="11 % dotless letters +\def\aa{\accent23a} +\def\l{\char32l} +\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}} + +\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary +\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}} +\def\AA{\leavevmode\setbox0\hbox{h}\dimen@\ht0\advance\dimen@-1ex% + \rlap{\raise.67\dimen@\hbox{\char'27}}A} + +\def\mathhexbox#1#2#3{\leavevmode + \hbox{$\m@th \mathchar"#1#2#3$}} +\def\dag{\mathhexbox279} +\def\ddag{\mathhexbox27A} +\def\S{\mathhexbox278} +\def\P{\mathhexbox27B} + +\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex% + \ialign{##\crcr#1\crcr}}} % put characters over each other +\def\ooalign{\lineskiplimit-\maxdimen \oalign} + +% LaTeX change: \d, \b, \c redefined to work in a moving argument. +\def\pd#1{\oalign{#1\crcr\hidewidth.\hidewidth}} +\def\d{\protect\pd} + +\def\pb#1{\oalign{#1\crcr\hidewidth + \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}} +\def\b{\protect\pb} + +\def\pc#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1% + \else{\ooalign{\unhbox\z@\crcr\hidewidth\char24\hidewidth}}\fi} +\def\c{\protect\pc} +% end of LaTeX change to \d, \b, \c + +\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}} + +% LaTeX change: \ldots is redefined to do essentially what Plain's \dots does, +% so ... +\def\dots{\ldots} + +\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX} + +\def\`#1{{\accent18 #1}} +\def\'#1{{\accent19 #1}} +\def\v#1{{\accent20 #1}} \let\^^_=\v +\def\u#1{{\accent21 #1}} \let\^^S=\u +\def\=#1{{\accent22 #1}} +\def\^#1{{\accent94 #1}} \let\^^D=\^ +\def\.#1{{\accent95 #1}} +\def\H#1{{\accent"7D #1}} +\def\~#1{{\accent"7E #1}} +%\def\"#1{{\accent"7F #1}} <-- this definition is replaced by the +following: +\def\"#1{\dirtyumlaut#1} +\input def_umlaut + +% LaTeX change: Make \t work in a moving argument. +\def\pt#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}} +\def\t{\protect\pt} + +% LaTeX change: \kern\z@ added to end of \hrulefill and \dotfill +% to make them work in `tabular' and `array' environments. +% (Change made 24 July 1987). +\def\hrulefill{\leaders\hrule\hfill\kern\z@} +\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill\kern\z@} + +\def\rightarrowfill{$\m@th\mathord-\mkern-6mu% + \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill + \mkern-6mu\mathord\rightarrow$} +\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-6mu% + \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill + \mkern-6mu\mathord-$} +\mathchardef\braceld="37A \mathchardef\bracerd="37B +\mathchardef\bracelu="37C \mathchardef\braceru="37D +\def\downbracefill{$\m@th\braceld\leaders\vrule\hfill\braceru + \bracelu\leaders\vrule\hfill\bracerd$} +\def\upbracefill{$\m@th\bracelu\leaders\vrule\hfill\bracerd + \braceld\leaders\vrule\hfill\braceru$} + +% LaTeX change: \bye is eliminated. +%\outer\def\bye{\par\vfill\supereject\end} + +% Macros for math setting +\message{math definitions,} + +\let\sp=^ \let\sb=_ +\def\,{\mskip\thinmuskip} +\def\>{\mskip\medmuskip} +\def\;{\mskip\thickmuskip} +\def\!{\mskip-\thinmuskip} +\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} +{\catcode`\'=\active \gdef'{^\bgroup\prim@s}} +\def\prim@s{\prime\futurelet\next\pr@m@s} +\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t + \else\let\nxt\egroup\fi\fi \nxt} +\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup} +{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math + +{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_ + +\mathchardef\alpha="010B +\mathchardef\beta="010C +\mathchardef\gamma="010D +\mathchardef\delta="010E +\mathchardef\epsilon="010F +\mathchardef\zeta="0110 +\mathchardef\eta="0111 +\mathchardef\theta="0112 +\mathchardef\iota="0113 +\mathchardef\kappa="0114 +\mathchardef\lambda="0115 +\mathchardef\mu="0116 +\mathchardef\nu="0117 +\mathchardef\xi="0118 +\mathchardef\pi="0119 +\mathchardef\rho="011A +\mathchardef\sigma="011B +\mathchardef\tau="011C +\mathchardef\upsilon="011D +\mathchardef\phi="011E +\mathchardef\chi="011F +\mathchardef\psi="0120 +\mathchardef\omega="0121 +\mathchardef\varepsilon="0122 +\mathchardef\vartheta="0123 +\mathchardef\varpi="0124 +\mathchardef\varrho="0125 +\mathchardef\varsigma="0126 +\mathchardef\varphi="0127 +\mathchardef\Gamma="7000 +\mathchardef\Delta="7001 +\mathchardef\Theta="7002 +\mathchardef\Lambda="7003 +\mathchardef\Xi="7004 +\mathchardef\Pi="7005 +\mathchardef\Sigma="7006 +\mathchardef\Upsilon="7007 +\mathchardef\Phi="7008 +\mathchardef\Psi="7009 +\mathchardef\Omega="700A + +\mathchardef\aleph="0240 +\def\hbar{{\mathchar'26\mkern-9muh}} +\mathchardef\imath="017B +\mathchardef\jmath="017C +\mathchardef\ell="0160 +\mathchardef\wp="017D +\mathchardef\Re="023C +\mathchardef\Im="023D +\mathchardef\partial="0140 +\mathchardef\infty="0231 +\mathchardef\prime="0230 +\mathchardef\emptyset="023B +\mathchardef\nabla="0272 +\def\surd{{\mathchar"1270}} +\mathchardef\top="023E +\mathchardef\bot="023F +\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr + \not\mathrel{\mkern14mu}\crcr + \noalign{\nointerlineskip} + \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}} +\mathchardef\triangle="0234 +\mathchardef\forall="0238 +\mathchardef\exists="0239 +\mathchardef\neg="023A \let\lnot=\neg +\mathchardef\flat="015B +\mathchardef\natural="015C +\mathchardef\sharp="015D +\mathchardef\clubsuit="027C +\mathchardef\diamondsuit="027D +\mathchardef\heartsuit="027E +\mathchardef\spadesuit="027F + +\mathchardef\coprod="1360 +\mathchardef\bigvee="1357 +\mathchardef\bigwedge="1356 +\mathchardef\biguplus="1355 +\mathchardef\bigcap="1354 +\mathchardef\bigcup="1353 +\mathchardef\intop="1352 \def\int{\intop\nolimits} +\mathchardef\prod="1351 +\mathchardef\sum="1350 +\mathchardef\bigotimes="134E +\mathchardef\bigoplus="134C +\mathchardef\bigodot="134A +\mathchardef\ointop="1348 \def\oint{\ointop\nolimits} +\mathchardef\bigsqcup="1346 +\mathchardef\smallint="1273 + +\mathchardef\triangleleft="212F +\mathchardef\triangleright="212E +\mathchardef\bigtriangleup="2234 +\mathchardef\bigtriangledown="2235 +\mathchardef\wedge="225E \let\land=\wedge +\mathchardef\vee="225F \let\lor=\vee +\mathchardef\cap="225C +\mathchardef\cup="225B +\mathchardef\ddagger="227A +\mathchardef\dagger="2279 +\mathchardef\sqcap="2275 +\mathchardef\sqcup="2274 +\mathchardef\uplus="225D +\mathchardef\amalg="2271 +\mathchardef\diamond="2205 +\mathchardef\bullet="220F +\mathchardef\wr="226F +\mathchardef\div="2204 +\mathchardef\odot="220C +\mathchardef\oslash="220B +\mathchardef\otimes="220A +\mathchardef\ominus="2209 +\mathchardef\oplus="2208 +\mathchardef\mp="2207 +\mathchardef\pm="2206 +\mathchardef\circ="220E +\mathchardef\bigcirc="220D +\mathchardef\setminus="226E % for set difference A\setminus B +\mathchardef\cdot="2201 +\mathchardef\ast="2203 +\mathchardef\times="2202 +\mathchardef\star="213F + +\mathchardef\propto="322F +\mathchardef\sqsubseteq="3276 +\mathchardef\sqsupseteq="3277 +\mathchardef\parallel="326B +\mathchardef\mid="326A +\mathchardef\dashv="3261 +\mathchardef\vdash="3260 +\mathchardef\nearrow="3225 +\mathchardef\searrow="3226 +\mathchardef\nwarrow="322D +\mathchardef\swarrow="322E +\mathchardef\Leftrightarrow="322C +\mathchardef\Leftarrow="3228 +\mathchardef\Rightarrow="3229 +\def\neq{\not=} \let\ne=\neq +\mathchardef\leq="3214 \let\le=\leq +\mathchardef\geq="3215 \let\ge=\geq +\mathchardef\succ="321F +\mathchardef\prec="321E +\mathchardef\approx="3219 +\mathchardef\succeq="3217 +\mathchardef\preceq="3216 +\mathchardef\supset="321B +\mathchardef\subset="321A +\mathchardef\supseteq="3213 +\mathchardef\subseteq="3212 +\mathchardef\in="3232 +\mathchardef\ni="3233 \let\owns=\ni +\mathchardef\gg="321D +\mathchardef\ll="321C +\mathchardef\not="3236 +\mathchardef\leftrightarrow="3224 +\mathchardef\leftarrow="3220 \let\gets=\leftarrow +\mathchardef\rightarrow="3221 \let\to=\rightarrow +\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow} +\mathchardef\sim="3218 +\mathchardef\simeq="3227 +\mathchardef\perp="323F +\mathchardef\equiv="3211 +\mathchardef\asymp="3210 +\mathchardef\smile="315E +\mathchardef\frown="315F +\mathchardef\leftharpoonup="3128 +\mathchardef\leftharpoondown="3129 +\mathchardef\rightharpoonup="312A +\mathchardef\rightharpoondown="312B + +\def\joinrel{\mathrel{\mkern-3mu}} +\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as + +\def\Relbar{\mathrel=} +\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow} +\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook} +\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft} +\def\models{\mathrel|\joinrel=} +\def\Longrightarrow{\Relbar\joinrel\Rightarrow} + +% LaTeX Change: \longrightarrow and \longleftarrow redefined to make +% then robust. +\def\longrightarrow{\protect\@lra} + \def\@lra{\relbar\joinrel\rightarrow} +\def\longleftarrow{\protect\@lla} + \def\@lla{\leftarrow\joinrel\relbar} +% End of LaTeX change to \longrightarrow and \longleftarrow + +\def\Longleftarrow{\Leftarrow\joinrel\Relbar} +\def\longmapsto{\mapstochar\longrightarrow} +\def\longleftrightarrow{\leftarrow\joinrel\rightarrow} +\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow} +\def\iff{\;\Longleftrightarrow\;} + +\mathchardef\ldotp="613A % ldot as a punctuation mark +\mathchardef\cdotp="6201 % cdot as a punctuation mark +\mathchardef\colon="603A % colon as a punctuation mark + +% LaTeX change: make \ldots work outside math mode too. +\def\@ldots{\mathinner{\ldotp\ldotp\ldotp}} +\def\ldots{\protect\pldots} +\def\pldots{\relax\ifmmode\@ldots\else\mbox{$\m@th\@ldots\,$}\fi} +% End of LaTeX change to \ldots + +\def\cdots{\mathinner{\cdotp\cdotp\cdotp}} +\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ + \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} +\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu + \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}} + +\def\acute{\mathaccent"7013 } +\def\grave{\mathaccent"7012 } +\def\ddot{\mathaccent"707F } +\def\tilde{\mathaccent"707E } +\def\bar{\mathaccent"7016 } +\def\breve{\mathaccent"7015 } +\def\check{\mathaccent"7014 } +\def\hat{\mathaccent"705E } +\def\vec{\mathaccent"017E } +\def\dot{\mathaccent"705F } +\def\widetilde{\mathaccent"0365 } +\def\widehat{\mathaccent"0362 } +\def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr + \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overleftarrow#1{\vbox{\m@th\ialign{##\crcr + \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3\p@} + \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits} +\def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr + $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip} + \upbracefill\crcr\noalign{\kern3\p@}}}}\limits} +\def\skew#1#2#3{{#2{#3\mkern#1mu}\mkern-#1mu}{}} + +\def\lmoustache{\delimiter"437A340 } % top from (, bottom from ) +\def\rmoustache{\delimiter"537B341 } % top from ), bottom from ( +\def\lgroup{\delimiter"462833A } % extensible ( with sharper tips +\def\rgroup{\delimiter"562933B } % extensible ) with sharper tips +\def\arrowvert{\delimiter"26A33C } % arrow without arrowheads +\def\Arrowvert{\delimiter"26B33D } % double arrow without arrowheads +\def\bracevert{\delimiter"77C33E } % the vertical bar that extends braces +\def\Vert{\delimiter"26B30D } \let\|=\Vert +\def\vert{\delimiter"26A30C } +\def\uparrow{\delimiter"3222378 } +\def\downarrow{\delimiter"3223379 } +\def\updownarrow{\delimiter"326C33F } +\def\Uparrow{\delimiter"322A37E } +\def\Downarrow{\delimiter"322B37F } +\def\Updownarrow{\delimiter"326D377 } +\def\backslash{\delimiter"26E30F } % for double coset G\backslash H +\def\rangle{\delimiter"526930B } +\def\langle{\delimiter"426830A } +\def\rbrace{\delimiter"5267309 } \let\}=\rbrace +\def\lbrace{\delimiter"4266308 } \let\{=\lbrace +\def\rceil{\delimiter"5265307 } +\def\lceil{\delimiter"4264306 } +\def\rfloor{\delimiter"5263305 } +\def\lfloor{\delimiter"4262304 } + +\def\bigl{\mathopen\big} +\def\bigm{\mathrel\big} +\def\bigr{\mathclose\big} +\def\Bigl{\mathopen\Big} +\def\Bigm{\mathrel\Big} +\def\Bigr{\mathclose\Big} +\def\biggl{\mathopen\bigg} +\def\biggm{\mathrel\bigg} +\def\biggr{\mathclose\bigg} +\def\Biggl{\mathopen\Bigg} +\def\Biggm{\mathrel\Bigg} +\def\Biggr{\mathclose\Bigg} +\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}} +\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}} +\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}} +\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}} +\def\n@space{\nulldelimiterspace\z@ \m@th} + +\def\choose{\atopwithdelims()} +\def\brack{\atopwithdelims[]} +\def\brace{\atopwithdelims\{\}} + +\def\sqrt{\radical"270370 } + +\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}% + {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}} +\newbox\rootbox +\def\root#1\of{\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$} + \mathpalette\r@@t} +\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$} + \dimen@\ht\z@ \advance\dimen@-\dp\z@ + \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu \box\z@} +\newif\ifv@ \newif\ifh@ +\def\vphantom{\v@true\h@false\ph@nt} +\def\hphantom{\v@false\h@true\ph@nt} +\def\phantom{\v@true\h@true\ph@nt} +\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}% + \else\let\next\makeph@nt\fi\next} +\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt} +\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt} +\def\finph@nt{\setbox\tw@\null + \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi + \ifh@ \wd\tw@\wd\z@\fi \box\tw@} +\def\mathstrut{\vphantom(} +\def\smash{\relax % \relax, in case this comes first in \halign + \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh + \fi\next} +\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh} +\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh} +\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@} + +\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign +\def\@vereq#1#2{\lower.5\p@\vbox{\baselineskip\z@skip\lineskip-.5\p@ + \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}} +\def\notin{\mathrel{\m@th\mathpalette\c@ncel\in}} +\def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}} +\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}} +\def\rlh@#1{\vcenter{\m@th\hbox{\ooalign{\raise2pt + \hbox{$#1\rightharpoonup$}\crcr + $#1\leftharpoondown$}}}} +\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}} +\def\doteq{\buildrel\textstyle.\over=} + +\def\log{\mathop{\rm log}\nolimits} +\def\lg{\mathop{\rm lg}\nolimits} +\def\ln{\mathop{\rm ln}\nolimits} +\def\lim{\mathop{\rm lim}} +\def\limsup{\mathop{\rm lim\,sup}} +\def\liminf{\mathop{\rm lim\,inf}} +\def\sin{\mathop{\rm sin}\nolimits} +\def\arcsin{\mathop{\rm arcsin}\nolimits} +\def\sinh{\mathop{\rm sinh}\nolimits} +\def\cos{\mathop{\rm cos}\nolimits} +\def\arccos{\mathop{\rm arccos}\nolimits} +\def\cosh{\mathop{\rm cosh}\nolimits} +\def\tan{\mathop{\rm tan}\nolimits} +\def\arctan{\mathop{\rm arctan}\nolimits} +\def\tanh{\mathop{\rm tanh}\nolimits} +\def\cot{\mathop{\rm cot}\nolimits} +\def\coth{\mathop{\rm coth}\nolimits} +\def\sec{\mathop{\rm sec}\nolimits} +\def\csc{\mathop{\rm csc}\nolimits} +\def\max{\mathop{\rm max}} +\def\min{\mathop{\rm min}} +\def\sup{\mathop{\rm sup}} +\def\inf{\mathop{\rm inf}} +\def\arg{\mathop{\rm arg}\nolimits} +\def\ker{\mathop{\rm ker}\nolimits} +\def\dim{\mathop{\rm dim}\nolimits} +\def\hom{\mathop{\rm hom}\nolimits} +\def\det{\mathop{\rm det}} +\def\exp{\mathop{\rm exp}\nolimits} +\def\Pr{\mathop{\rm Pr}} +\def\gcd{\mathop{\rm gcd}} +\def\deg{\mathop{\rm deg}\nolimits} + +\def\bmod{\mskip-\medmuskip\mkern5mu + \mathbin{\rm mod}\penalty900\mkern5mu\mskip-\medmuskip} +\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)} + +%% RmS 91/08/14 inserted extra braces around entry for NFSS +\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th + \ialign{$##\hfil$&\quad{##}\hfil\crcr#1\crcr}}\right.} +\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th + \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr + \mathstrut\crcr\noalign{\kern-\baselineskip} + #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,} +\def\pmatrix#1{\left(\matrix{#1}\right)} +\newdimen\p@renwd + +% LaTeX: following command is moved after the \tenex font is defined +% by LFONTS +%\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left ( + +\def\bordermatrix#1{\begingroup \m@th + \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}% + \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil + &&\quad\hfil$##$\hfil\crcr + \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}% + #1\crcr\omit\strut\cr}}% + \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne + \global\setbox\@ne\vbox{\box\@ne\kern2\p@}% + \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}% + \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup} + +\def\openup{\afterassignment\@penup\dimen@=} +\def\@penup{\advance\lineskip\dimen@ + \advance\baselineskip\dimen@ + \advance\lineskiplimit\dimen@} + +% LaTeX change: \eqalign eliminated, since it is replaced by the +% eqnarray environment. +% +%\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th +% \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil +% \crcr#1\crcr}}\,} + +\newif\ifdt@p +\def\displ@y{\global\dt@ptrue\openup\jot\m@th + \everycr{\noalign{\ifdt@p \global\dt@pfalse + \vskip-\lineskiplimit \vskip\normallineskiplimit + \else \penalty\interdisplaylinepenalty \fi}}} +\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y +\def\displaylines#1{\displ@y + \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr + #1\crcr}} + +% LaTeX: The following \eqalign type macros are eliminated, since +% they are replaced by the eqnarray environment. +% +%\def\eqalignno#1{\displ@y \tabskip\centering +% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip +% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering +% &\llap{$\@lign##$}\tabskip\z@skip\crcr +% #1\crcr}} +%\def\leqalignno#1{\displ@y \tabskip\centering +% \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip +% &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering +% &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr +% #1\crcr}} + +% Definitions related to output + +% LaTeX uses its own output routine +% +%\message{output routines,} +% +%\countdef\pageno=0 \pageno=1 % first page is number 1 +%\newtoks\headline \headline={\hfil} % headline is normally blank +%\newtoks\footline \footline={\hss\tenrm\folio\hss} +% % footline is normally a centered page number in font \tenrm +%\newif\ifr@ggedbottom +%\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue} +%\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom +%\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi} +%\def\nopagenumbers{\footline{\hfil}} % blank out the footline +%\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne +% \else\global\advance\pageno\@ne \fi} % increase |pageno| + +% LaTeX does use the same insert for footnotes as PLAIN +\newinsert\footins + +%\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later +% \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi +% #1\@sf\vfootnote{#1}} +%\def\vfootnote#1{\insert\footins\bgroup +% \interlinepenalty\interfootnotelinepenalty +% \splittopskip\ht\strutbox % top baseline for broken footnotes +% \splitmaxdepth\dp\strutbox \floatingpenalty\@MM +% \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip +% \textindent{#1}\footstrut\futurelet\next\fo@t} +%\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t +% \else\let\next\f@t\fi \next} +%\def\f@@t{\bgroup\aftergroup\@foot\let\next} +%\def\f@t#1{#1\@foot} +%\def\@foot{\strut\egroup} +%\def\footstrut{\vbox to\splittopskip{}} + +% LaTeX leaves these initializations for the \footins insert. +% +\skip\footins=\bigskipamount % space added when footnote is present +\count\footins=1000 % footnote magnification factor (1 to 1) +\dimen\footins=8in % maximum footnotes per page + +%\newinsert\topins +%\newif\ifp@ge \newif\if@mid +%\def\topinsert{\@midfalse\p@gefalse\@ins} +%\def\midinsert{\@midtrue\@ins} +%\def\pageinsert{\@midfalse\p@getrue\@ins} +%\skip\topins=\z@skip % no space added when a topinsert is present +%\count\topins=1000 % magnification factor (1 to 1) +%\dimen\topins=\maxdimen % no limit per page +%\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox +%\def\endinsert{\egroup % finish the \vbox +% \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@ +% \advance\dimen@\pagetotal \advance\dimen@-\pageshrink +% \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi +% \if@mid \bigskip\box\z@\bigbreak +% \else\insert\topins{\penalty100 % floating insertion +% \splittopskip\z@skip +% \splitmaxdepth\maxdimen \floatingpenalty\z@ +% \ifp@ge \dimen@\dp\z@ +% \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero +% \else \box\z@\nobreak\bigskip\fi}\fi\endgroup} + +%\output{\plainoutput} +%\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}% +% \advancepageno +% \ifnum\outputpenalty>-\@MM \else\dosupereject\fi} +%\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}} +%\def\makeheadline{\vbox to\z@{\vskip-22.5\p@ +% \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip} +%\def\makefootline{\baselineskip24\p@\line{\the\footline}} +%\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over +% \line{}\kern-\topskip\nobreak\vfill\supereject\fi} +% +%\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi +% \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255 +% \ifvoid\footins\else % footnote info is present +% \vskip\skip\footins +% \footnoterule +% \unvbox\footins\fi +% \ifr@ggedbottom \kern-\dimen@ \vfil \fi} + +% LaTeX keeps PLAIN TeX's \footnoterule as the default +% +\def\footnoterule{\kern-3\p@ + \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high + +% Hyphenation, miscellaneous macros, and initial values for standard layout +\message{hyphenation} + +\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks +\input sihyphen + +% \magnification doesn't work in LaTeX +% +%\def\magnification{\afterassignment\m@g\count@} +%\def\m@g{\mag\count@ +% \hsize6.5truein\vsize8.9truein\dimen\footins8truein} + +%% FMi & RmS 91/08/26: added \errorcontextlines=\maxdimen, +%% suggested by J. Schrod + +\def\tracingall{\tracingcommands\tw@\tracingstats\tw@ + \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne + \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne + \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode + \errorcontextlines\maxdimen\tracingonline\@ne} + +\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm + \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}} + +% input LaTeX fonts and commands + +%% Initialize \reset@font for use with Old font selection + +\let\reset@font\empty + +\input lfonts +\input latex + +% LaTeX change: moved from above. +\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left ( + +% RmS 91/06/21: clear \box0 +\setbox0=\box\voidb@x + +% LaTeX: default values +\normalbaselines +% LaTeX: select 10pt font size and \rm style +\xpt + +\nonfrenchspacing % punctuation affects the spacing +\catcode`@=12 % at signs are no longer letters + +% LaTeX: File called LPLAIN +% Identify the current format +\def\fmtname{lplain}\def\fmtversion{2.09-March 25, 1992} + +\typeout{Input any local modifications here.} + +\endinput diff --git a/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/siplain.tex b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/siplain.tex new file mode 100644 index 0000000000..7289f7d32f --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INPUTS3.141/siplain.tex @@ -0,0 +1,1233 @@ +% This is the plain TeX format that's described in The TeXbook. +% N.B.: A version number is defined at the very end of this file; +% please change that number whenever the file is modified! +% And don't modify the file under any circumstances. + +\catcode`\{=1 % left brace is begin-group character +\catcode`\}=2 % right brace is end-group character +\catcode`\$=3 % dollar sign is math shift +\catcode`\&=4 % ampersand is alignment tab +\catcode`\#=6 % hash mark is macro parameter character +\catcode`\^=7 \catcode`\^^K=7 % circumflex and uparrow are for superscripts +\catcode`\_=8 \catcode`\^^A=8 % underline and downarrow are for subscripts +\catcode`\^^I=10 % ascii tab is a blank space +\chardef\active=13 \catcode`\~=\active % tilde is active +\catcode`\^^L=\active \outer\def^^L{\par} % ascii form-feed is "\outer\par" + +\message{Preloading the plain format: codes,} + +% We had to define the \catcodes right away, before the message line, +% since \message uses the { and } characters. +% When INITEX (the TeX initializer) starts up, +% it has defined the following \catcode values: +% \catcode`\^^@=9 % ascii null is ignored +% \catcode`\^^M=5 % ascii return is end-line +% \catcode`\\=0 % backslash is TeX escape character +% \catcode`\%=14 % percent sign is comment character +% \catcode`\ =10 % ascii space is blank space +% \catcode`\^^?=15 % ascii delete is invalid +% \catcode`\A=11 ... \catcode`\Z=11 % uppercase letters +% \catcode`\a=11 ... \catcode`\z=11 % lowercase letters +% all others are type 12 (other) + +% Here is a list of the characters that have been specially catcoded: +\def\dospecials{\do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~} +% (not counting ascii null, tab, linefeed, formfeed, return, delete) +% Each symbol in the list is preceded by \do, which can be defined +% if you want to do something to every item in the list. + +% We make @ signs act like letters, temporarily, to avoid conflict +% between user names and internal control sequences of plain format. +\catcode`@=11 + +% INITEX sets up \mathcode x=x, for x=0..255, except that +% \mathcode x=x+"7100, for x = `A to `Z and `a to `z; +% \mathcode x=x+"7000, for x = `0 to `9. +% The following changes define internal codes as recommended +% in Appendix C of The TeXbook: +\mathcode`\^^@="2201 % \cdot +\mathcode`\^^A="3223 % \downarrow +\mathcode`\^^B="010B % \alpha +\mathcode`\^^C="010C % \beta +\mathcode`\^^D="225E % \land +\mathcode`\^^E="023A % \lnot +\mathcode`\^^F="3232 % \in +\mathcode`\^^G="0119 % \pi +\mathcode`\^^H="0115 % \lambda +\mathcode`\^^I="010D % \gamma +\mathcode`\^^J="010E % \delta +\mathcode`\^^K="3222 % \uparrow +\mathcode`\^^L="2206 % \pm +\mathcode`\^^M="2208 % \oplus +\mathcode`\^^N="0231 % \infty +\mathcode`\^^O="0140 % \partial +\mathcode`\^^P="321A % \subset +\mathcode`\^^Q="321B % \supset +\mathcode`\^^R="225C % \cap +\mathcode`\^^S="225B % \cup +\mathcode`\^^T="0238 % \forall +\mathcode`\^^U="0239 % \exists +\mathcode`\^^V="220A % \otimes +\mathcode`\^^W="3224 % \leftrightarrow +\mathcode`\^^X="3220 % \leftarrow +\mathcode`\^^Y="3221 % \rightarrow +\mathcode`\^^Z="8000 % \ne +\mathcode`\^^[="2205 % \diamond +\mathcode`\^^\="3214 % \le +\mathcode`\^^]="3215 % \ge +\mathcode`\^^^="3211 % \equiv +\mathcode`\^^_="225F % \lor +\mathcode`\ ="8000 % \space +\mathcode`\!="5021 +\mathcode`\'="8000 % ^\prime +\mathcode`\(="4028 +\mathcode`\)="5029 +\mathcode`\*="2203 % \ast +\mathcode`\+="202B +\mathcode`\,="613B +\mathcode`\-="2200 +\mathcode`\.="013A +\mathcode`\/="013D +\mathcode`\:="303A +\mathcode`\;="603B +\mathcode`\<="313C +\mathcode`\=="303D +\mathcode`\>="313E +\mathcode`\?="503F +\mathcode`\[="405B +\mathcode`\\="026E % \backslash +\mathcode`\]="505D +\mathcode`\_="8000 % \_ +\mathcode`\{="4266 +\mathcode`\|="026A +\mathcode`\}="5267 +\mathcode`\^^?="1273 % \smallint + +% INITEX sets \uccode`x=`X and \uccode `X=`X for all letters x, +% and \lccode`x=`x, \lccode`X=`x; all other values are zero. +% No changes to those tables are needed in plain TeX format. + +% INITEX sets \sfcode x=1000 for all x, except that \sfcode`X=999 +% for uppercase letters. The following changes are needed: +\sfcode`\)=0 \sfcode`\'=0 \sfcode`\]=0 +% The \nonfrenchspacing macro will make further changes to \sfcode values. + +% Finally, INITEX sets all \delcode values to -1, except \delcode`.=0 +\delcode`\(="028300 +\delcode`\)="029301 +\delcode`\[="05B302 +\delcode`\]="05D303 +\delcode`\<="26830A +\delcode`\>="26930B +\delcode`\/="02F30E +\delcode`\|="26A30C +\delcode`\\="26E30F +% N.B. { and } should NOT get delcodes; otherwise parameter grouping fails! + +% To make the plain macros more efficient in time and space, +% several constant values are declared here as control sequences. +% If they were changed, anything could happen; so they are private symbols. +\chardef\@ne=1 +\chardef\tw@=2 +\chardef\thr@@=3 +\chardef\sixt@@n=16 +\chardef\@cclv=255 +\mathchardef\@cclvi=256 +\mathchardef\@m=1000 +\mathchardef\@M=10000 +\mathchardef\@MM=20000 + +% Allocation of registers + +% Here are macros for the automatic allocation of \count, \box, \dimen, +% \skip, \muskip, and \toks registers, as well as \read and \write +% stream numbers, \fam codes, \language codes, and \insert numbers. + +\message{registers,} + +% When a register is used only temporarily, it need not be allocated; +% grouping can be used, making the value previously in the register return +% after the close of the group. The main use of these macros is for +% registers that are defined by one macro and used by others, possibly at +% different nesting levels. All such registers should be defined through +% these macros; otherwise conflicts may occur, especially when two or more +% more macro packages are being used at once. + +% The following counters are reserved: +% 0 to 9 page numbering +% 10 count allocation +% 11 dimen allocation +% 12 skip allocation +% 13 muskip allocation +% 14 box allocation +% 15 toks allocation +% 16 read file allocation +% 17 write file allocation +% 18 math family allocation +% 19 language allocation +% 20 insert allocation +% 21 the most recently allocated number +% 22 constant -1 +% New counters are allocated starting with 23, 24, etc. Other registers are +% allocated starting with 10. This leaves 0 through 9 for the user to play +% with safely, except that counts 0 to 9 are considered to be the page and +% subpage numbers (since they are displayed during output). In this scheme, +% \count 10 always contains the number of the highest-numbered counter that +% has been allocated, \count 14 the highest-numbered box, etc. +% Inserts are given numbers 254, 253, etc., since they require a \count, +% \dimen, \skip, and \box all with the same number; \count 20 contains the +% lowest-numbered insert that has been allocated. Of course, \box255 is +% reserved for \output; \count255, \dimen255, and \skip255 can be used freely. + +% It is recommended that macro designers always use +% \global assignments with respect to registers numbered 1, 3, 5, 7, 9, and +% always non-\global assignments with respect to registers 0, 2, 4, 6, 8, 255. +% This will prevent ``save stack buildup'' that might otherwise occur. + +\count10=22 % allocates \count registers 23, 24, ... +\count11=9 % allocates \dimen registers 10, 11, ... +\count12=9 % allocates \skip registers 10, 11, ... +\count13=9 % allocates \muskip registers 10, 11, ... +\count14=9 % allocates \box registers 10, 11, ... +\count15=9 % allocates \toks registers 10, 11, ... +\count16=-1 % allocates input streams 0, 1, ... +\count17=-1 % allocates output streams 0, 1, ... +\count18=3 % allocates math families 4, 5, ... +\count19=0 % allocates \language codes 1, 2, ... +\count20=255 % allocates insertions 254, 253, ... +\countdef\insc@unt=20 % the insertion counter +\countdef\allocationnumber=21 % the most recent allocation +\countdef\m@ne=22 \m@ne=-1 % a handy constant +\def\wlog{\immediate\write\m@ne} % write on log file (only) + +% Here are abbreviations for the names of scratch registers +% that don't need to be allocated. + +\countdef\count@=255 +\dimendef\dimen@=0 +\dimendef\dimen@i=1 % global only +\dimendef\dimen@ii=2 +\skipdef\skip@=0 +\toksdef\toks@=0 + +% Now, we define \newcount, \newbox, etc. so that you can say \newcount\foo +% and \foo will be defined (with \countdef) to be the next counter. +% To find out which counter \foo is, you can look at \allocationnumber. +% Since there's no \boxdef command, \chardef is used to define a \newbox, +% \newinsert, \newfam, and so on. + +\outer\def\newcount{\alloc@0\count\countdef\insc@unt} +\outer\def\newdimen{\alloc@1\dimen\dimendef\insc@unt} +\outer\def\newskip{\alloc@2\skip\skipdef\insc@unt} +\outer\def\newmuskip{\alloc@3\muskip\muskipdef\@cclvi} +\outer\def\newbox{\alloc@4\box\chardef\insc@unt} +\let\newtoks=\relax % we do this to allow plain.tex to be read in twice +\outer\def\newhelp#1#2{\newtoks#1#1\expandafter{\csname#2\endcsname}} +\outer\def\newtoks{\alloc@5\toks\toksdef\@cclvi} +\outer\def\newread{\alloc@6\read\chardef\sixt@@n} +\outer\def\newwrite{\alloc@7\write\chardef\sixt@@n} +\outer\def\newfam{\alloc@8\fam\chardef\sixt@@n} +\outer\def\newlanguage{\alloc@9\language\chardef\@cclvi} +\def\alloc@#1#2#3#4#5{\global\advance\count1#1by\@ne + \ch@ck#1#4#2% make sure there's still room + \allocationnumber=\count1#1% + \global#3#5=\allocationnumber + \wlog{\string#5=\string#2\the\allocationnumber}} +\outer\def\newinsert#1{\global\advance\insc@unt by\m@ne + \ch@ck0\insc@unt\count + \ch@ck1\insc@unt\dimen + \ch@ck2\insc@unt\skip + \ch@ck4\insc@unt\box + \allocationnumber=\insc@unt + \global\chardef#1=\allocationnumber + \wlog{\string#1=\string\insert\the\allocationnumber}} +\def\ch@ck#1#2#3{\ifnum\count1#1<#2% + \else\errmessage{No room for a new #3}\fi} + +% Here are some examples of allocation. +\newdimen\maxdimen \maxdimen=16383.99999pt % the largest legal <dimen> +\newskip\hideskip \hideskip=-1000pt plus 1fill % negative but can grow +\newskip\centering \centering=0pt plus 1000pt minus 1000pt +\newdimen\p@ \p@=1pt % this saves macro space and time +\newdimen\z@ \z@=0pt % can be used both for 0pt and 0 +\newskip\z@skip \z@skip=0pt plus0pt minus0pt +\newbox\voidb@x % permanently void box register + +% And here's a different sort of allocation: +% For example, \newif\iffoo creates \footrue, \foofalse to go with \iffoo. +\outer\def\newif#1{\count@\escapechar \escapechar\m@ne + \expandafter\expandafter\expandafter + \edef\@if#1{true}{\let\noexpand#1=\noexpand\iftrue}% + \expandafter\expandafter\expandafter + \edef\@if#1{false}{\let\noexpand#1=\noexpand\iffalse}% + \@if#1{false}\escapechar\count@} % the condition starts out false +\def\@if#1#2{\csname\expandafter\if@\string#1#2\endcsname} +{\uccode`1=`i \uccode`2=`f \uppercase{\gdef\if@12{}}} % `if' is required + +% Assign initial values to TeX's parameters + +\message{parameters,} + +% All of TeX's numeric parameters are listed here, +% but the code is commented out if no special value needs to be set. +% INITEX makes all parameters zero except where noted. + +\pretolerance=100 +\tolerance=200 % INITEX sets this to 10000 +\hbadness=1000 +\vbadness=1000 +\linepenalty=10 +\hyphenpenalty=50 +\exhyphenpenalty=50 +\binoppenalty=700 +\relpenalty=500 +\clubpenalty=150 +\widowpenalty=150 +\displaywidowpenalty=50 +\brokenpenalty=100 +\predisplaypenalty=10000 +% \postdisplaypenalty=0 +% \interlinepenalty=0 +% \floatingpenalty=0, set during \insert +% \outputpenalty=0, set before TeX enters \output +\doublehyphendemerits=10000 +\finalhyphendemerits=5000 +\adjdemerits=10000 +% \looseness=0, cleared by TeX after each paragraph +% \pausing=0 +% \holdinginserts=0 +% \tracingonline=0 +% \tracingmacros=0 +% \tracingstats=0 +% \tracingparagraphs=0 +% \tracingpages=0 +% \tracingoutput=0 +\tracinglostchars=1 +% \tracingcommands=0 +% \tracingrestores=0 +% \language=0 +\uchyph=1 +% \lefthyphenmin=2 \righthyphenmin=3 set below +% \globaldefs=0 +% \maxdeadcycles=25 % INITEX does this +% \hangafter=1 % INITEX does this, also TeX after each paragraph +% \fam=0 +% \mag=1000 % INITEX does this +% \escapechar=`\\ % INITEX does this +\defaulthyphenchar=`\- +\defaultskewchar=-1 +% \endlinechar=`\^^M % INITEX does this +\newlinechar=-1 +\delimiterfactor=901 +% \time=now % TeX does this at beginning of job +% \day=now % TeX does this at beginning of job +% \month=now % TeX does this at beginning of job +% \year=now % TeX does this at beginning of job +\showboxbreadth=5 +\showboxdepth=3 +\errorcontextlines=5 + +\hfuzz=0.1pt +\vfuzz=0.1pt +\overfullrule=5pt +\hsize=6.5in +\vsize=8.9in +\maxdepth=4pt +\splitmaxdepth=\maxdimen +\boxmaxdepth=\maxdimen +% \lineskiplimit=0pt, changed by \normalbaselines +\delimitershortfall=5pt +\nulldelimiterspace=1.2pt +\scriptspace=0.5pt +% \mathsurround=0pt +% \predisplaysize=0pt, set before TeX enters $$ +% \displaywidth=0pt, set before TeX enters $$ +% \displayindent=0pt, set before TeX enters $$ +\parindent=20pt +% \hangindent=0pt, zeroed by TeX after each paragraph +% \hoffset=0pt +% \voffset=0pt + +% \baselineskip=0pt, changed by \normalbaselines +% \lineskip=0pt, changed by \normalbaselines +\parskip=0pt plus 1pt +\abovedisplayskip=12pt plus 3pt minus 9pt +\abovedisplayshortskip=0pt plus 3pt +\belowdisplayskip=12pt plus 3pt minus 9pt +\belowdisplayshortskip=7pt plus 3pt minus 4pt +% \leftskip=0pt +% \rightskip=0pt +\topskip=10pt +\splittopskip=10pt +% \tabskip=0pt +% \spaceskip=0pt +% \xspaceskip=0pt +\parfillskip=0pt plus 1fil + +\thinmuskip=3mu +\medmuskip=4mu plus 2mu minus 4mu +\thickmuskip=5mu plus 5mu + +% We also define special registers that function like parameters: +\newskip\smallskipamount \smallskipamount=3pt plus 1pt minus 1pt +\newskip\medskipamount \medskipamount=6pt plus 2pt minus 2pt +\newskip\bigskipamount \bigskipamount=12pt plus 4pt minus 4pt +\newskip\normalbaselineskip \normalbaselineskip=12pt +\newskip\normallineskip \normallineskip=1pt +\newdimen\normallineskiplimit \normallineskiplimit=0pt +\newdimen\jot \jot=3pt +\newcount\interdisplaylinepenalty \interdisplaylinepenalty=100 +\newcount\interfootnotelinepenalty \interfootnotelinepenalty=100 + +% Definitions for preloaded fonts + +\def\magstephalf{1095 } +\def\magstep#1{\ifcase#1 \@m\or 1200\or 1440\or 1728\or 2074\or 2488\fi\relax} + +% Fonts assigned to \preloaded are not part of "plain TeX", +% but they are preloaded so that other format packages can use them. +% For example, if another set of macros says "\font\ninerm=cmr9", +% TeX will not have to reload the font metric information for cmr9. + +\message{fonts,} + +\font\tenrm=cmr10 % roman text +\font\preloaded=cmr9 +\font\preloaded=cmr8 +\font\sevenrm=cmr7 +\font\preloaded=cmr6 +\font\fiverm=cmr5 + +\font\teni=cmmi10 % math italic +\font\preloaded=cmmi9 +\font\preloaded=cmmi8 +\font\seveni=cmmi7 +\font\preloaded=cmmi6 +\font\fivei=cmmi5 + +\font\tensy=cmsy10 % math symbols +\font\preloaded=cmsy9 +\font\preloaded=cmsy8 +\font\sevensy=cmsy7 +\font\preloaded=cmsy6 +\font\fivesy=cmsy5 + +\font\tenex=cmex10 % math extension + +\font\preloaded=cmss10 % sans serif +\font\preloaded=cmssq8 + +\font\preloaded=cmssi10 % sans serif italic +\font\preloaded=cmssqi8 + +\font\tenbf=cmbx10 % boldface extended +\font\preloaded=cmbx9 +\font\preloaded=cmbx8 +\font\sevenbf=cmbx7 +\font\preloaded=cmbx6 +\font\fivebf=cmbx5 + +\font\tentt=cmtt10 % typewriter +\font\preloaded=cmtt9 +\font\preloaded=cmtt8 + +\font\preloaded=cmsltt10 % slanted typewriter + +\font\tensl=cmsl10 % slanted roman +\font\preloaded=cmsl9 +\font\preloaded=cmsl8 + +\font\tenit=cmti10 % text italic +\font\preloaded=cmti9 +\font\preloaded=cmti8 +\font\preloaded=cmti7 + +\message{more fonts,} +\font\preloaded=cmu10 % unslanted text italic + +\font\preloaded=cmmib10 % bold math italic +\font\preloaded=cmbsy10 % bold math symbols + +\font\preloaded=cmcsc10 % caps and small caps + +\font\preloaded=cmssbx10 % sans serif bold extended + +\font\preloaded=cmdunh10 % Dunhill style + +\font\preloaded=cmr7 scaled \magstep4 % for titles +\font\preloaded=cmtt10 scaled \magstep2 +\font\preloaded=cmssbx10 scaled \magstep2 + +\font\preloaded=manfnt % METAFONT logo and dragon curve and special symbols + +% Additional \preloaded fonts can be specified here. +% (And those that were \preloaded above can be eliminated.) + +\let\preloaded=\undefined % preloaded fonts must be declared anew later. + +\skewchar\teni='177 \skewchar\seveni='177 \skewchar\fivei='177 +\skewchar\tensy='60 \skewchar\sevensy='60 \skewchar\fivesy='60 + +\textfont0=\tenrm \scriptfont0=\sevenrm \scriptscriptfont0=\fiverm +\def\rm{\fam\z@\tenrm} +\textfont1=\teni \scriptfont1=\seveni \scriptscriptfont1=\fivei +\def\mit{\fam\@ne} \def\oldstyle{\fam\@ne\teni} +\textfont2=\tensy \scriptfont2=\sevensy \scriptscriptfont2=\fivesy +\def\cal{\fam\tw@} +\textfont3=\tenex \scriptfont3=\tenex \scriptscriptfont3=\tenex +\newfam\itfam \def\it{\fam\itfam\tenit} % \it is family 4 +\textfont\itfam=\tenit +\newfam\slfam \def\sl{\fam\slfam\tensl} % \sl is family 5 +\textfont\slfam=\tensl +\newfam\bffam \def\bf{\fam\bffam\tenbf} % \bf is family 6 +\textfont\bffam=\tenbf \scriptfont\bffam=\sevenbf +\scriptscriptfont\bffam=\fivebf +\newfam\ttfam \def\tt{\fam\ttfam\tentt} % \tt is family 7 +\textfont\ttfam=\tentt + +% Macros for setting ordinary text +\message{macros,} + +\def\frenchspacing{\sfcode`\.\@m \sfcode`\?\@m \sfcode`\!\@m + \sfcode`\:\@m \sfcode`\;\@m \sfcode`\,\@m} +\def\nonfrenchspacing{\sfcode`\.3000\sfcode`\?3000\sfcode`\!3000% + \sfcode`\:2000\sfcode`\;1500\sfcode`\,1250 } + +\def\normalbaselines{\lineskip\normallineskip + \baselineskip\normalbaselineskip \lineskiplimit\normallineskiplimit} + +\def\^^M{\ } % control <return> = control <space> +\def\^^I{\ } % same for <tab> + +\def\lq{`} \def\rq{'} +\def\lbrack{[} \def\rbrack{]} + +\let\endgraf=\par \let\endline=\cr + +\def\space{ } +\def\empty{} +\def\null{\hbox{}} + +\let\bgroup={ \let\egroup=} + +% In \obeylines, we say `\let^^M=\par' instead of `\def^^M{\par}' +% since this allows, for example, `\let\par=\cr \obeylines \halign{...' +{\catcode`\^^M=\active % these lines must end with % + \gdef\obeylines{\catcode`\^^M\active \let^^M\par}% + \global\let^^M\par} % this is in case ^^M appears in a \write +\def\obeyspaces{\catcode`\ \active} +{\obeyspaces\global\let =\space} + +\def\loop#1\repeat{\def\body{#1}\iterate} +\def\iterate{\body \let\next\iterate \else\let\next\relax\fi \next} +\let\repeat=\fi % this makes \loop...\if...\repeat skippable + +\def\thinspace{\kern .16667em } +\def\negthinspace{\kern-.16667em } +\def\enspace{\kern.5em } + +\def\enskip{\hskip.5em\relax} +\def\quad{\hskip1em\relax} +\def\qquad{\hskip2em\relax} + +\def\smallskip{\vskip\smallskipamount} +\def\medskip{\vskip\medskipamount} +\def\bigskip{\vskip\bigskipamount} + +\def\nointerlineskip{\prevdepth-1000\p@} +\def\offinterlineskip{\baselineskip-1000\p@ + \lineskip\z@ \lineskiplimit\maxdimen} + +\def\topglue{\nointerlineskip\vglue-\topskip\vglue} % for top of page +\def\vglue{\afterassignment\vgl@\skip@=} +\def\vgl@{\par \dimen@\prevdepth \hrule height\z@ + \nobreak\vskip\skip@ \prevdepth\dimen@} +\def\hglue{\afterassignment\hgl@\skip@=} +\def\hgl@{\leavevmode \count@\spacefactor \vrule width\z@ + \nobreak\hskip\skip@ \spacefactor\count@} + +\def~{\penalty\@M \ } % tie +\def\slash{/\penalty\exhyphenpenalty} % a `/' that acts like a `-' + +\def\break{\penalty-\@M} +\def\nobreak{\penalty \@M} +\def\allowbreak{\penalty \z@} + +\def\filbreak{\par\vfil\penalty-200\vfilneg} +\def\goodbreak{\par\penalty-500 } +\def\eject{\par\break} +\def\supereject{\par\penalty-\@MM} + +\def\removelastskip{\ifdim\lastskip=\z@\else\vskip-\lastskip\fi} +\def\smallbreak{\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi} +\def\medbreak{\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi} +\def\bigbreak{\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi} + +\def\line{\hbox to\hsize} +\def\leftline#1{\line{#1\hss}} +\def\rightline#1{\line{\hss#1}} +\def\centerline#1{\line{\hss#1\hss}} + +\def\rlap#1{\hbox to\z@{#1\hss}} +\def\llap#1{\hbox to\z@{\hss#1}} + +\def\m@th{\mathsurround=\z@} +\def\underbar#1{$\setbox\z@\hbox{#1}\dp\z@\z@ + \m@th \underline{\box\z@}$} + +\newbox\strutbox +\setbox\strutbox=\hbox{\vrule height8.5pt depth3.5pt width\z@} +\def\strut{\relax\ifmmode\copy\strutbox\else\unhcopy\strutbox\fi} + +\def\hidewidth{\hskip\hideskip} % for alignment entries that can stick out +\def\ialign{\everycr{}\tabskip\z@skip\halign} % initialized \halign +\newcount\mscount +\def\multispan#1{\omit \mscount#1\relax + \loop\ifnum\mscount>\@ne \sp@n\repeat} +\def\sp@n{\span\omit\advance\mscount\m@ne} + +\newif\ifus@ \newif\if@cr +\newbox\tabs \newbox\tabsyet \newbox\tabsdone + +\def\cleartabs{\global\setbox\tabsyet\null \setbox\tabs\null} +\def\settabs{\setbox\tabs\null \futurelet\next\sett@b} +\let\+=\relax % in case this file is being read in twice +\def\sett@b{\ifx\next\+\let\next\relax + \def\next{\afterassignment\s@tt@b\let\next}% + \else\let\next\s@tcols\fi\next} +\def\s@tt@b{\let\next\relax\us@false\m@ketabbox} +\def\tabalign{\us@true\m@ketabbox} % non-\outer version of \+ +\outer\def\+{\tabalign} +\def\s@tcols#1\columns{\count@#1\dimen@\hsize + \loop\ifnum\count@>\z@ \@nother \repeat} +\def\@nother{\dimen@ii\dimen@ \divide\dimen@ii\count@ + \setbox\tabs\hbox{\hbox to\dimen@ii{}\unhbox\tabs}% + \advance\dimen@-\dimen@ii \advance\count@\m@ne} + +\def\m@ketabbox{\begingroup + \global\setbox\tabsyet\copy\tabs + \global\setbox\tabsdone\null + \def\cr{\@crtrue\crcr\egroup\egroup + \ifus@\unvbox\z@\lastbox\fi\endgroup + \setbox\tabs\hbox{\unhbox\tabsyet\unhbox\tabsdone}}% + \setbox\z@\vbox\bgroup\@crfalse + \ialign\bgroup&\t@bbox##\t@bb@x\crcr} + +\def\t@bbox{\setbox\z@\hbox\bgroup} +\def\t@bb@x{\if@cr\egroup % now \box\z@ holds the column + \else\hss\egroup \global\setbox\tabsyet\hbox{\unhbox\tabsyet + \global\setbox\@ne\lastbox}% now \box\@ne holds its size + \ifvoid\@ne\global\setbox\@ne\hbox to\wd\z@{}% + \else\setbox\z@\hbox to\wd\@ne{\unhbox\z@}\fi + \global\setbox\tabsdone\hbox{\box\@ne\unhbox\tabsdone}\fi + \box\z@} + +\def\hang{\hangindent\parindent} +\def\textindent#1{\indent\llap{#1\enspace}\ignorespaces} +\def\item{\par\hang\textindent} +\def\itemitem{\par\indent \hangindent2\parindent \textindent} +\def\narrower{\advance\leftskip\parindent + \advance\rightskip\parindent} + +\outer\def\beginsection#1\par{\vskip\z@ plus.3\vsize\penalty-250 + \vskip\z@ plus-.3\vsize\bigskip\vskip\parskip + \message{#1}\leftline{\bf#1}\nobreak\smallskip\noindent} +\outer\def\proclaim #1. #2\par{\medbreak + \noindent{\bf#1.\enspace}{\sl#2\par}% + \ifdim\lastskip<\medskipamount \removelastskip\penalty55\medskip\fi} + +\def\raggedright{\rightskip\z@ plus2em \spaceskip.3333em \xspaceskip.5em\relax} +\def\ttraggedright{\tt\rightskip\z@ plus2em\relax} % for use with \tt only + +\chardef\%=`\% +\chardef\&=`\& +\chardef\#=`\# +\chardef\$=`\$ +\chardef\ss="19 +\chardef\ae="1A +\chardef\oe="1B +\chardef\o="1C +\chardef\AE="1D +\chardef\OE="1E +\chardef\O="1F +\chardef\i="10 \chardef\j="11 % dotless letters +\def\aa{\accent23a} +\def\l{\char32l} +\def\L{\leavevmode\setbox0\hbox{L}\hbox to\wd0{\hss\char32L}} + +\def\leavevmode{\unhbox\voidb@x} % begins a paragraph, if necessary +\def\_{\leavevmode \kern.06em \vbox{\hrule width.3em}} +\def\AA{\leavevmode\setbox0\hbox{h}\dimen@\ht0\advance\dimen@-1ex% + \rlap{\raise.67\dimen@\hbox{\char'27}}A} + +\def\mathhexbox#1#2#3{\leavevmode + \hbox{$\m@th \mathchar"#1#2#3$}} +\def\dag{\mathhexbox279} +\def\ddag{\mathhexbox27A} +\def\S{\mathhexbox278} +\def\P{\mathhexbox27B} + +\def\oalign#1{\leavevmode\vtop{\baselineskip\z@skip \lineskip.25ex% + \ialign{##\crcr#1\crcr}}} % put characters over each other +\def\ooalign{\lineskiplimit-\maxdimen \oalign} +\def\d#1{\oalign{#1\crcr\hidewidth.\hidewidth}} +\def\b#1{\oalign{#1\crcr\hidewidth + \vbox to.2ex{\hbox{\char22}\vss}\hidewidth}} +\def\c#1{\setbox\z@\hbox{#1}\ifdim\ht\z@=1ex\accent24 #1% + \else{\ooalign{\unhbox\z@\crcr\hidewidth\char24\hidewidth}}\fi} +\def\copyright{{\ooalign{\hfil\raise.07ex\hbox{c}\hfil\crcr\mathhexbox20D}}} + +\def\dots{\relax\ifmmode\ldots\else$\m@th\ldots\,$\fi} +\def\TeX{T\kern-.1667em\lower.5ex\hbox{E}\kern-.125emX} + +\def\`#1{{\accent18 #1}} +\def\'#1{{\accent19 #1}} +\def\v#1{{\accent20 #1}} \let\^^_=\v +\def\u#1{{\accent21 #1}} \let\^^S=\u +\def\=#1{{\accent22 #1}} +\def\^#1{{\accent94 #1}} \let\^^D=\^ +\def\.#1{{\accent95 #1}} +\def\H#1{{\accent"7D #1}} +\def\~#1{{\accent"7E #1}} +% \def\"#1{{\accent"7F #1}} <-- this definition is replaced by +the following: +\def\"#1{\dirtyumlaut#1} +\input def_umlaut % for testing purposes excluded + +\def\t#1{{\edef\next{\the\font}\the\textfont1\accent"7F\next#1}} + +\def\hrulefill{\leaders\hrule\hfill} +\def\dotfill{\cleaders\hbox{$\m@th \mkern1.5mu.\mkern1.5mu$}\hfill} +\def\rightarrowfill{$\m@th\mathord-\mkern-6mu% + \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill + \mkern-6mu\mathord\rightarrow$} +\def\leftarrowfill{$\m@th\mathord\leftarrow\mkern-6mu% + \cleaders\hbox{$\mkern-2mu\mathord-\mkern-2mu$}\hfill + \mkern-6mu\mathord-$} +\mathchardef\braceld="37A \mathchardef\bracerd="37B +\mathchardef\bracelu="37C \mathchardef\braceru="37D +\def\downbracefill{$\m@th\braceld\leaders\vrule\hfill\braceru + \bracelu\leaders\vrule\hfill\bracerd$} +\def\upbracefill{$\m@th\bracelu\leaders\vrule\hfill\bracerd + \braceld\leaders\vrule\hfill\braceru$} + +\outer\def\bye{\par\vfill\supereject\end} + +% Macros for math setting +\message{math definitions,} + +\let\sp=^ \let\sb=_ +\def\,{\mskip\thinmuskip} +\def\>{\mskip\medmuskip} +\def\;{\mskip\thickmuskip} +\def\!{\mskip-\thinmuskip} +\def\*{\discretionary{\thinspace\the\textfont2\char2}{}{}} +{\catcode`\'=\active \gdef'{^\bgroup\prim@s}} +\def\prim@s{\prime\futurelet\next\pr@m@s} +\def\pr@m@s{\ifx'\next\let\nxt\pr@@@s \else\ifx^\next\let\nxt\pr@@@t + \else\let\nxt\egroup\fi\fi \nxt} +\def\pr@@@s#1{\prim@s} \def\pr@@@t#1#2{#2\egroup} +{\catcode`\^^Z=\active \gdef^^Z{\not=}} % ^^Z is like \ne in math + +{\catcode`\_=\active \global\let_=\_} % _ in math is either subscript or \_ + +\mathchardef\alpha="010B +\mathchardef\beta="010C +\mathchardef\gamma="010D +\mathchardef\delta="010E +\mathchardef\epsilon="010F +\mathchardef\zeta="0110 +\mathchardef\eta="0111 +\mathchardef\theta="0112 +\mathchardef\iota="0113 +\mathchardef\kappa="0114 +\mathchardef\lambda="0115 +\mathchardef\mu="0116 +\mathchardef\nu="0117 +\mathchardef\xi="0118 +\mathchardef\pi="0119 +\mathchardef\rho="011A +\mathchardef\sigma="011B +\mathchardef\tau="011C +\mathchardef\upsilon="011D +\mathchardef\phi="011E +\mathchardef\chi="011F +\mathchardef\psi="0120 +\mathchardef\omega="0121 +\mathchardef\varepsilon="0122 +\mathchardef\vartheta="0123 +\mathchardef\varpi="0124 +\mathchardef\varrho="0125 +\mathchardef\varsigma="0126 +\mathchardef\varphi="0127 +\mathchardef\Gamma="7000 +\mathchardef\Delta="7001 +\mathchardef\Theta="7002 +\mathchardef\Lambda="7003 +\mathchardef\Xi="7004 +\mathchardef\Pi="7005 +\mathchardef\Sigma="7006 +\mathchardef\Upsilon="7007 +\mathchardef\Phi="7008 +\mathchardef\Psi="7009 +\mathchardef\Omega="700A + +\mathchardef\aleph="0240 +\def\hbar{{\mathchar'26\mkern-9muh}} +\mathchardef\imath="017B +\mathchardef\jmath="017C +\mathchardef\ell="0160 +\mathchardef\wp="017D +\mathchardef\Re="023C +\mathchardef\Im="023D +\mathchardef\partial="0140 +\mathchardef\infty="0231 +\mathchardef\prime="0230 +\mathchardef\emptyset="023B +\mathchardef\nabla="0272 +\def\surd{{\mathchar"1270}} +\mathchardef\top="023E +\mathchardef\bot="023F +\def\angle{{\vbox{\ialign{$\m@th\scriptstyle##$\crcr + \not\mathrel{\mkern14mu}\crcr + \noalign{\nointerlineskip} + \mkern2.5mu\leaders\hrule height.34pt\hfill\mkern2.5mu\crcr}}}} +\mathchardef\triangle="0234 +\mathchardef\forall="0238 +\mathchardef\exists="0239 +\mathchardef\neg="023A \let\lnot=\neg +\mathchardef\flat="015B +\mathchardef\natural="015C +\mathchardef\sharp="015D +\mathchardef\clubsuit="027C +\mathchardef\diamondsuit="027D +\mathchardef\heartsuit="027E +\mathchardef\spadesuit="027F + +\mathchardef\coprod="1360 +\mathchardef\bigvee="1357 +\mathchardef\bigwedge="1356 +\mathchardef\biguplus="1355 +\mathchardef\bigcap="1354 +\mathchardef\bigcup="1353 +\mathchardef\intop="1352 \def\int{\intop\nolimits} +\mathchardef\prod="1351 +\mathchardef\sum="1350 +\mathchardef\bigotimes="134E +\mathchardef\bigoplus="134C +\mathchardef\bigodot="134A +\mathchardef\ointop="1348 \def\oint{\ointop\nolimits} +\mathchardef\bigsqcup="1346 +\mathchardef\smallint="1273 + +\mathchardef\triangleleft="212F +\mathchardef\triangleright="212E +\mathchardef\bigtriangleup="2234 +\mathchardef\bigtriangledown="2235 +\mathchardef\wedge="225E \let\land=\wedge +\mathchardef\vee="225F \let\lor=\vee +\mathchardef\cap="225C +\mathchardef\cup="225B +\mathchardef\ddagger="227A +\mathchardef\dagger="2279 +\mathchardef\sqcap="2275 +\mathchardef\sqcup="2274 +\mathchardef\uplus="225D +\mathchardef\amalg="2271 +\mathchardef\diamond="2205 +\mathchardef\bullet="220F +\mathchardef\wr="226F +\mathchardef\div="2204 +\mathchardef\odot="220C +\mathchardef\oslash="220B +\mathchardef\otimes="220A +\mathchardef\ominus="2209 +\mathchardef\oplus="2208 +\mathchardef\mp="2207 +\mathchardef\pm="2206 +\mathchardef\circ="220E +\mathchardef\bigcirc="220D +\mathchardef\setminus="226E % for set difference A\setminus B +\mathchardef\cdot="2201 +\mathchardef\ast="2203 +\mathchardef\times="2202 +\mathchardef\star="213F + +\mathchardef\propto="322F +\mathchardef\sqsubseteq="3276 +\mathchardef\sqsupseteq="3277 +\mathchardef\parallel="326B +\mathchardef\mid="326A +\mathchardef\dashv="3261 +\mathchardef\vdash="3260 +\mathchardef\nearrow="3225 +\mathchardef\searrow="3226 +\mathchardef\nwarrow="322D +\mathchardef\swarrow="322E +\mathchardef\Leftrightarrow="322C +\mathchardef\Leftarrow="3228 +\mathchardef\Rightarrow="3229 +\def\neq{\not=} \let\ne=\neq +\mathchardef\leq="3214 \let\le=\leq +\mathchardef\geq="3215 \let\ge=\geq +\mathchardef\succ="321F +\mathchardef\prec="321E +\mathchardef\approx="3219 +\mathchardef\succeq="3217 +\mathchardef\preceq="3216 +\mathchardef\supset="321B +\mathchardef\subset="321A +\mathchardef\supseteq="3213 +\mathchardef\subseteq="3212 +\mathchardef\in="3232 +\mathchardef\ni="3233 \let\owns=\ni +\mathchardef\gg="321D +\mathchardef\ll="321C +\mathchardef\not="3236 +\mathchardef\leftrightarrow="3224 +\mathchardef\leftarrow="3220 \let\gets=\leftarrow +\mathchardef\rightarrow="3221 \let\to=\rightarrow +\mathchardef\mapstochar="3237 \def\mapsto{\mapstochar\rightarrow} +\mathchardef\sim="3218 +\mathchardef\simeq="3227 +\mathchardef\perp="323F +\mathchardef\equiv="3211 +\mathchardef\asymp="3210 +\mathchardef\smile="315E +\mathchardef\frown="315F +\mathchardef\leftharpoonup="3128 +\mathchardef\leftharpoondown="3129 +\mathchardef\rightharpoonup="312A +\mathchardef\rightharpoondown="312B + +\def\joinrel{\mathrel{\mkern-3mu}} +\def\relbar{\mathrel{\smash-}} % \smash, because - has the same height as + +\def\Relbar{\mathrel=} +\mathchardef\lhook="312C \def\hookrightarrow{\lhook\joinrel\rightarrow} +\mathchardef\rhook="312D \def\hookleftarrow{\leftarrow\joinrel\rhook} +\def\bowtie{\mathrel\triangleright\joinrel\mathrel\triangleleft} +\def\models{\mathrel|\joinrel=} +\def\Longrightarrow{\Relbar\joinrel\Rightarrow} +\def\longrightarrow{\relbar\joinrel\rightarrow} +\def\longleftarrow{\leftarrow\joinrel\relbar} +\def\Longleftarrow{\Leftarrow\joinrel\Relbar} +\def\longmapsto{\mapstochar\longrightarrow} +\def\longleftrightarrow{\leftarrow\joinrel\rightarrow} +\def\Longleftrightarrow{\Leftarrow\joinrel\Rightarrow} +\def\iff{\;\Longleftrightarrow\;} + +\mathchardef\ldotp="613A % ldot as a punctuation mark +\mathchardef\cdotp="6201 % cdot as a punctuation mark +\mathchardef\colon="603A % colon as a punctuation mark +\def\ldots{\mathinner{\ldotp\ldotp\ldotp}} +\def\cdots{\mathinner{\cdotp\cdotp\cdotp}} +\def\vdots{\vbox{\baselineskip4\p@ \lineskiplimit\z@ + \kern6\p@\hbox{.}\hbox{.}\hbox{.}}} +\def\ddots{\mathinner{\mkern1mu\raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern2mu + \raise4\p@\hbox{.}\mkern2mu\raise\p@\hbox{.}\mkern1mu}} + +\def\acute{\mathaccent"7013 } +\def\grave{\mathaccent"7012 } +\def\ddot{\mathaccent"707F } +\def\tilde{\mathaccent"707E } +\def\bar{\mathaccent"7016 } +\def\breve{\mathaccent"7015 } +\def\check{\mathaccent"7014 } +\def\hat{\mathaccent"705E } +\def\vec{\mathaccent"017E } +\def\dot{\mathaccent"705F } +\def\widetilde{\mathaccent"0365 } +\def\widehat{\mathaccent"0362 } +\def\overrightarrow#1{\vbox{\m@th\ialign{##\crcr + \rightarrowfill\crcr\noalign{\kern-\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overleftarrow#1{\vbox{\m@th\ialign{##\crcr + \leftarrowfill\crcr\noalign{\kern-\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}} +\def\overbrace#1{\mathop{\vbox{\m@th\ialign{##\crcr\noalign{\kern3\p@} + \downbracefill\crcr\noalign{\kern3\p@\nointerlineskip} + $\hfil\displaystyle{#1}\hfil$\crcr}}}\limits} +\def\underbrace#1{\mathop{\vtop{\m@th\ialign{##\crcr + $\hfil\displaystyle{#1}\hfil$\crcr\noalign{\kern3\p@\nointerlineskip} + \upbracefill\crcr\noalign{\kern3\p@}}}}\limits} +\def\skew#1#2#3{{#2{#3\mkern#1mu}\mkern-#1mu}{}} + +\def\lmoustache{\delimiter"437A340 } % top from (, bottom from ) +\def\rmoustache{\delimiter"537B341 } % top from ), bottom from ( +\def\lgroup{\delimiter"462833A } % extensible ( with sharper tips +\def\rgroup{\delimiter"562933B } % extensible ) with sharper tips +\def\arrowvert{\delimiter"26A33C } % arrow without arrowheads +\def\Arrowvert{\delimiter"26B33D } % double arrow without arrowheads +\def\bracevert{\delimiter"77C33E } % the vertical bar that extends braces +\def\Vert{\delimiter"26B30D } \let\|=\Vert +\def\vert{\delimiter"26A30C } +\def\uparrow{\delimiter"3222378 } +\def\downarrow{\delimiter"3223379 } +\def\updownarrow{\delimiter"326C33F } +\def\Uparrow{\delimiter"322A37E } +\def\Downarrow{\delimiter"322B37F } +\def\Updownarrow{\delimiter"326D377 } +\def\backslash{\delimiter"26E30F } % for double coset G\backslash H +\def\rangle{\delimiter"526930B } +\def\langle{\delimiter"426830A } +\def\rbrace{\delimiter"5267309 } \let\}=\rbrace +\def\lbrace{\delimiter"4266308 } \let\{=\lbrace +\def\rceil{\delimiter"5265307 } +\def\lceil{\delimiter"4264306 } +\def\rfloor{\delimiter"5263305 } +\def\lfloor{\delimiter"4262304 } + +\def\bigl{\mathopen\big} +\def\bigm{\mathrel\big} +\def\bigr{\mathclose\big} +\def\Bigl{\mathopen\Big} +\def\Bigm{\mathrel\Big} +\def\Bigr{\mathclose\Big} +\def\biggl{\mathopen\bigg} +\def\biggm{\mathrel\bigg} +\def\biggr{\mathclose\bigg} +\def\Biggl{\mathopen\Bigg} +\def\Biggm{\mathrel\Bigg} +\def\Biggr{\mathclose\Bigg} +\def\big#1{{\hbox{$\left#1\vbox to8.5\p@{}\right.\n@space$}}} +\def\Big#1{{\hbox{$\left#1\vbox to11.5\p@{}\right.\n@space$}}} +\def\bigg#1{{\hbox{$\left#1\vbox to14.5\p@{}\right.\n@space$}}} +\def\Bigg#1{{\hbox{$\left#1\vbox to17.5\p@{}\right.\n@space$}}} +\def\n@space{\nulldelimiterspace\z@ \m@th} + +\def\choose{\atopwithdelims()} +\def\brack{\atopwithdelims[]} +\def\brace{\atopwithdelims\{\}} + +\def\sqrt{\radical"270370 } + +\def\mathpalette#1#2{\mathchoice{#1\displaystyle{#2}}% + {#1\textstyle{#2}}{#1\scriptstyle{#2}}{#1\scriptscriptstyle{#2}}} +\newbox\rootbox +\def\root#1\of{\setbox\rootbox\hbox{$\m@th\scriptscriptstyle{#1}$} + \mathpalette\r@@t} +\def\r@@t#1#2{\setbox\z@\hbox{$\m@th#1\sqrt{#2}$} + \dimen@\ht\z@ \advance\dimen@-\dp\z@ + \mkern5mu\raise.6\dimen@\copy\rootbox \mkern-10mu \box\z@} +\newif\ifv@ \newif\ifh@ +\def\vphantom{\v@true\h@false\ph@nt} +\def\hphantom{\v@false\h@true\ph@nt} +\def\phantom{\v@true\h@true\ph@nt} +\def\ph@nt{\ifmmode\def\next{\mathpalette\mathph@nt}% + \else\let\next\makeph@nt\fi\next} +\def\makeph@nt#1{\setbox\z@\hbox{#1}\finph@nt} +\def\mathph@nt#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finph@nt} +\def\finph@nt{\setbox\tw@\null + \ifv@ \ht\tw@\ht\z@ \dp\tw@\dp\z@\fi + \ifh@ \wd\tw@\wd\z@\fi \box\tw@} +\def\mathstrut{\vphantom(} +\def\smash{\relax % \relax, in case this comes first in \halign + \ifmmode\def\next{\mathpalette\mathsm@sh}\else\let\next\makesm@sh + \fi\next} +\def\makesm@sh#1{\setbox\z@\hbox{#1}\finsm@sh} +\def\mathsm@sh#1#2{\setbox\z@\hbox{$\m@th#1{#2}$}\finsm@sh} +\def\finsm@sh{\ht\z@\z@ \dp\z@\z@ \box\z@} + +\def\cong{\mathrel{\mathpalette\@vereq\sim}} % congruence sign +\def\@vereq#1#2{\lower.5\p@\vbox{\baselineskip\z@skip\lineskip-.5\p@ + \ialign{$\m@th#1\hfil##\hfil$\crcr#2\crcr=\crcr}}} +\def\notin{\mathrel{\mathpalette\c@ncel\in}} +\def\c@ncel#1#2{\m@th\ooalign{$\hfil#1\mkern1mu/\hfil$\crcr$#1#2$}} +\def\rightleftharpoons{\mathrel{\mathpalette\rlh@{}}} +\def\rlh@#1{\vcenter{\m@th\hbox{\ooalign{\raise2pt + \hbox{$#1\rightharpoonup$}\crcr + $#1\leftharpoondown$}}}} +\def\buildrel#1\over#2{\mathrel{\mathop{\kern\z@#2}\limits^{#1}}} +\def\doteq{\buildrel\textstyle.\over=} + +\def\log{\mathop{\rm log}\nolimits} +\def\lg{\mathop{\rm lg}\nolimits} +\def\ln{\mathop{\rm ln}\nolimits} +\def\lim{\mathop{\rm lim}} +\def\limsup{\mathop{\rm lim\,sup}} +\def\liminf{\mathop{\rm lim\,inf}} +\def\sin{\mathop{\rm sin}\nolimits} +\def\arcsin{\mathop{\rm arcsin}\nolimits} +\def\sinh{\mathop{\rm sinh}\nolimits} +\def\cos{\mathop{\rm cos}\nolimits} +\def\arccos{\mathop{\rm arccos}\nolimits} +\def\cosh{\mathop{\rm cosh}\nolimits} +\def\tan{\mathop{\rm tan}\nolimits} +\def\arctan{\mathop{\rm arctan}\nolimits} +\def\tanh{\mathop{\rm tanh}\nolimits} +\def\cot{\mathop{\rm cot}\nolimits} +\def\coth{\mathop{\rm coth}\nolimits} +\def\sec{\mathop{\rm sec}\nolimits} +\def\csc{\mathop{\rm csc}\nolimits} +\def\max{\mathop{\rm max}} +\def\min{\mathop{\rm min}} +\def\sup{\mathop{\rm sup}} +\def\inf{\mathop{\rm inf}} +\def\arg{\mathop{\rm arg}\nolimits} +\def\ker{\mathop{\rm ker}\nolimits} +\def\dim{\mathop{\rm dim}\nolimits} +\def\hom{\mathop{\rm hom}\nolimits} +\def\det{\mathop{\rm det}} +\def\exp{\mathop{\rm exp}\nolimits} +\def\Pr{\mathop{\rm Pr}} +\def\gcd{\mathop{\rm gcd}} +\def\deg{\mathop{\rm deg}\nolimits} + +\def\bmod{\mskip-\medmuskip\mkern5mu + \mathbin{\rm mod}\penalty900\mkern5mu\mskip-\medmuskip} +\def\pmod#1{\allowbreak\mkern18mu({\rm mod}\,\,#1)} + +\def\cases#1{\left\{\,\vcenter{\normalbaselines\m@th + \ialign{$##\hfil$&\quad##\hfil\crcr#1\crcr}}\right.} +\def\matrix#1{\null\,\vcenter{\normalbaselines\m@th + \ialign{\hfil$##$\hfil&&\quad\hfil$##$\hfil\crcr + \mathstrut\crcr\noalign{\kern-\baselineskip} + #1\crcr\mathstrut\crcr\noalign{\kern-\baselineskip}}}\,} +\def\pmatrix#1{\left(\matrix{#1}\right)} +\newdimen\p@renwd +\setbox0=\hbox{\tenex B} \p@renwd=\wd0 % width of the big left ( +\def\bordermatrix#1{\begingroup \m@th + \setbox\z@\vbox{\def\cr{\crcr\noalign{\kern2\p@\global\let\cr\endline}}% + \ialign{$##$\hfil\kern2\p@\kern\p@renwd&\thinspace\hfil$##$\hfil + &&\quad\hfil$##$\hfil\crcr + \omit\strut\hfil\crcr\noalign{\kern-\baselineskip}% + #1\crcr\omit\strut\cr}}% + \setbox\tw@\vbox{\unvcopy\z@\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{\unhbox\@ne\unskip\global\setbox\@ne\lastbox}% + \setbox\tw@\hbox{$\kern\wd\@ne\kern-\p@renwd\left(\kern-\wd\@ne + \global\setbox\@ne\vbox{\box\@ne\kern2\p@}% + \vcenter{\kern-\ht\@ne\unvbox\z@\kern-\baselineskip}\,\right)$}% + \null\;\vbox{\kern\ht\@ne\box\tw@}\endgroup} + +\def\openup{\afterassignment\@penup\dimen@=} +\def\@penup{\advance\lineskip\dimen@ + \advance\baselineskip\dimen@ + \advance\lineskiplimit\dimen@} +\def\eqalign#1{\null\,\vcenter{\openup\jot\m@th + \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil + \crcr#1\crcr}}\,} +\newif\ifdt@p +\def\displ@y{\global\dt@ptrue\openup\jot\m@th + \everycr{\noalign{\ifdt@p \global\dt@pfalse + \vskip-\lineskiplimit \vskip\normallineskiplimit + \else \penalty\interdisplaylinepenalty \fi}}} +\def\@lign{\tabskip\z@skip\everycr{}} % restore inside \displ@y +\def\displaylines#1{\displ@y + \halign{\hbox to\displaywidth{$\@lign\hfil\displaystyle##\hfil$}\crcr + #1\crcr}} +\def\eqalignno#1{\displ@y \tabskip\centering + \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip + &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering + &\llap{$\@lign##$}\tabskip\z@skip\crcr + #1\crcr}} +\def\leqalignno#1{\displ@y \tabskip\centering + \halign to\displaywidth{\hfil$\@lign\displaystyle{##}$\tabskip\z@skip + &$\@lign\displaystyle{{}##}$\hfil\tabskip\centering + &\kern-\displaywidth\rlap{$\@lign##$}\tabskip\displaywidth\crcr + #1\crcr}} + +% Definitions related to output + +\message{output routines,} + +\countdef\pageno=0 \pageno=1 % first page is number 1 +\newtoks\headline \headline={\hfil} % headline is normally blank +\newtoks\footline \footline={\hss\tenrm\folio\hss} + % footline is normally a centered page number in font \tenrm +\newif\ifr@ggedbottom +\def\raggedbottom{\topskip 10\p@ plus60\p@ \r@ggedbottomtrue} +\def\normalbottom{\topskip 10\p@ \r@ggedbottomfalse} % undoes \raggedbottom +\def\folio{\ifnum\pageno<\z@ \romannumeral-\pageno \else\number\pageno \fi} +\def\nopagenumbers{\footline{\hfil}} % blank out the footline +\def\advancepageno{\ifnum\pageno<\z@ \global\advance\pageno\m@ne + \else\global\advance\pageno\@ne \fi} % increase |pageno| + +\newinsert\footins +\def\footnote#1{\let\@sf\empty % parameter #2 (the text) is read later + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\/\fi + #1\@sf\vfootnote{#1}} +\def\vfootnote#1{\insert\footins\bgroup + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox \floatingpenalty\@MM + \leftskip\z@skip \rightskip\z@skip \spaceskip\z@skip \xspaceskip\z@skip + \textindent{#1}\footstrut\futurelet\next\fo@t} +\def\fo@t{\ifcat\bgroup\noexpand\next \let\next\f@@t + \else\let\next\f@t\fi \next} +\def\f@@t{\bgroup\aftergroup\@foot\let\next} +\def\f@t#1{#1\@foot} +\def\@foot{\strut\egroup} +\def\footstrut{\vbox to\splittopskip{}} +\skip\footins=\bigskipamount % space added when footnote is present +\count\footins=1000 % footnote magnification factor (1 to 1) +\dimen\footins=8in % maximum footnotes per page + +\newinsert\topins +\newif\ifp@ge \newif\if@mid +\def\topinsert{\@midfalse\p@gefalse\@ins} +\def\midinsert{\@midtrue\@ins} +\def\pageinsert{\@midfalse\p@getrue\@ins} +\skip\topins=\z@skip % no space added when a topinsert is present +\count\topins=1000 % magnification factor (1 to 1) +\dimen\topins=\maxdimen % no limit per page +\def\@ins{\par\begingroup\setbox\z@\vbox\bgroup} % start a \vbox +\def\endinsert{\egroup % finish the \vbox + \if@mid \dimen@\ht\z@ \advance\dimen@\dp\z@ \advance\dimen@12\p@ + \advance\dimen@\pagetotal \advance\dimen@-\pageshrink + \ifdim\dimen@>\pagegoal\@midfalse\p@gefalse\fi\fi + \if@mid \bigskip\box\z@\bigbreak + \else\insert\topins{\penalty100 % floating insertion + \splittopskip\z@skip + \splitmaxdepth\maxdimen \floatingpenalty\z@ + \ifp@ge \dimen@\dp\z@ + \vbox to\vsize{\unvbox\z@\kern-\dimen@}% depth is zero + \else \box\z@\nobreak\bigskip\fi}\fi\endgroup} + +\output{\plainoutput} +\def\plainoutput{\shipout\vbox{\makeheadline\pagebody\makefootline}% + \advancepageno + \ifnum\outputpenalty>-\@MM \else\dosupereject\fi} +\def\pagebody{\vbox to\vsize{\boxmaxdepth\maxdepth \pagecontents}} +\def\makeheadline{\vbox to\z@{\vskip-22.5\p@ + \line{\vbox to8.5\p@{}\the\headline}\vss}\nointerlineskip} +\def\makefootline{\baselineskip24\p@\line{\the\footline}} +\def\dosupereject{\ifnum\insertpenalties>\z@ % something is being held over + \line{}\kern-\topskip\nobreak\vfill\supereject\fi} + +\def\pagecontents{\ifvoid\topins\else\unvbox\topins\fi + \dimen@=\dp\@cclv \unvbox\@cclv % open up \box255 + \ifvoid\footins\else % footnote info is present + \vskip\skip\footins + \footnoterule + \unvbox\footins\fi + \ifr@ggedbottom \kern-\dimen@ \vfil \fi} +\def\footnoterule{\kern-3\p@ + \hrule width 2truein \kern 2.6\p@} % the \hrule is .4pt high + +% Hyphenation, miscellaneous macros, and initial values for standard layout +\message{hyphenation} + +\lefthyphenmin=2 \righthyphenmin=3 % disallow x- or -xx breaks +\input sihyphen + +\def\magnification{\afterassignment\m@g\count@} +\def\m@g{\mag\count@ + \hsize6.5truein\vsize8.9truein\dimen\footins8truein} + +\def\tracingall{\tracingonline\@ne\tracingcommands\tw@\tracingstats\tw@ + \tracingpages\@ne\tracingoutput\@ne\tracinglostchars\@ne + \tracingmacros\tw@\tracingparagraphs\@ne\tracingrestores\@ne + \showboxbreadth\maxdimen\showboxdepth\maxdimen\errorstopmode} + +\def\showhyphens#1{\setbox0\vbox{\parfillskip\z@skip\hsize\maxdimen\tenrm + \pretolerance\m@ne\tolerance\m@ne\hbadness0\showboxdepth0\ #1}} + +\normalbaselines\rm % select roman font +\nonfrenchspacing % punctuation affects the spacing +\catcode`@=12 % at signs are no longer letters + +\def\fmtname{plain}\def\fmtversion{3.141} % identifies the current format diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/Makefile b/obsolete/systems/sisisi/unix/COMMON/INST_BER/Makefile new file mode 100644 index 0000000000..f89f936515 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/Makefile @@ -0,0 +1,31 @@ +# +# TransFig makefile +# + +all: inst_ber.fg1.tex inst_ber.fg2.tex + +# translation into ps + +inst_ber.fg1.tex: inst_ber.fg1.ps Makefile + fig2ps2tex inst_ber.fg1.ps >inst_ber.fg1.tex +clean:: + rm -f inst_ber.fg1.tex + +inst_ber.fg1.ps: inst_ber.fg1.fig Makefile + fig2dev -L ps -m 0.8 inst_ber.fg1.fig > inst_ber.fg1.ps +clean:: + rm -f inst_ber.fg1.ps + + +# translation into ps + +inst_ber.fg2.tex: inst_ber.fg2.ps Makefile + fig2ps2tex inst_ber.fg2.ps >inst_ber.fg2.tex +clean:: + rm -f inst_ber.fg2.tex + +inst_ber.fg2.ps: inst_ber.fg2.fig Makefile + fig2dev -L ps inst_ber.fg2.fig > inst_ber.fg2.ps +clean:: + rm -f inst_ber.fg2.ps + diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.aux b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.aux new file mode 100644 index 0000000000..3b4181dc63 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.aux @@ -0,0 +1,37 @@ +\relax +\citation{KnuthProg} +\citation{KnuthBook} +\citation{Lamport} +\citation{Kopka} +\citation{BarthNi} +\citation{BarthNi2} +\citation{duden} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {1}Terminologie}{2}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {2}SiSiSi}{2}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {3}Kurzbeschreibung des Trennverfahrens}{3}} +\citation{BarthNi} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {4}Mehrdeutigkeiten}{4}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {5}Unbekannte W\string\active@dq\space orter}{6}} +\@writefile{lof}{\string\contentsline\space {figure}{\string\numberline\space {1}{\ignorespaces Die neuen M\string\active@dq\space oglichkeiten}}{7}} +\newlabel{bild1}{{1}{7}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {6}\string\isitex\space \ intern: Die neuen Files}{8}} +\newlabel{kapitel6}{{6}{8}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {7}Wie erzeugt man ein druckfertiges Manuskript mit \string\isitex\space ?}{9}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {8}\string\active@dq\space `xxx\string\active@dq\space ' ist ein mehrdeutiges Wort! --- was tun?}{10}} +\@writefile{lof}{\string\contentsline\space {figure}{\string\numberline\space {2}{\ignorespaces Die Wege der Daten}}{11}} +\newlabel{bild2}{{2}{11}} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {9}\string\active@dq\space `xxx\string\active@dq\space ' ist ein unbekanntes Wort! --- was tun?}{12}} +\citation{BarthNi} +\citation{BarthNi2} +\citation{duden} +\@writefile{toc}{\string\contentsline\space {section}{\string\numberline\space {10}\string\active@dq\space Anderung der Worttabelle}{13}} +\newlabel{kapitel10}{{10}{13}} +\bibcite{KnuthProg}{1} +\bibcite{KnuthBook}{2} +\bibcite{Lamport}{3} +\bibcite{Kopka}{4} +\bibcite{BarthNi}{5} +\bibcite{BarthNi2}{6} +\bibcite{Dante}{7} +\bibcite{FTP}{8} +\bibcite{duden}{9} diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.dvi b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.dvi Binary files differnew file mode 100644 index 0000000000..731f146890 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.dvi diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.edt b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.edt new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.edt diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.fig b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.fig new file mode 100644 index 0000000000..8bd6dadda5 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.fig @@ -0,0 +1,79 @@ +#FIG 2.1 +80 2 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 379 769 379 699 179 699 179 769 379 769 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 154 769 154 699 4 699 4 769 154 769 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 659 279 699 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 659 469 699 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 769 279 819 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 79 769 79 819 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 359 349 359 299 199 299 199 349 359 349 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 154 349 154 299 4 299 4 349 154 349 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 259 279 299 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 259 464 299 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 259 79 299 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 349 279 399 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 464 349 464 399 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 79 349 79 399 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 359 259 359 209 199 209 199 259 359 259 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 179 279 209 9999 9999 +2 2 0 4 -1 0 0 0 0.000 0 0 0 + 339 179 219 179 219 149 339 149 339 179 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 659 79 699 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 359 659 359 609 199 609 199 659 359 659 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 279 579 279 609 9999 9999 +2 2 0 4 -1 0 0 0 0.000 0 0 0 + 339 579 219 579 219 549 339 549 339 579 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 539 769 539 699 404 699 404 769 539 769 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 0 0 + 469 769 469 819 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 524 349 524 299 404 299 404 349 524 349 9999 9999 +4 1 0 14 0 -1 0 0.00000 4 13 173 279 719 mit angegebenen Trennstellen +4 1 0 14 0 -1 0 0.00000 4 10 120 279 740 merken in doku.mem +4 1 0 14 0 -1 0 0.00000 4 10 72 279 761 und doku.lex +4 1 0 14 0 -1 0 0.00000 4 10 120 79 719 merken in doku.mem +4 1 0 14 0 -1 0 0.00000 4 10 72 79 740 und doku.lex +4 1 0 14 0 -1 0 0.00000 4 10 93 279 839 mit Trennstellen +4 1 0 14 0 -1 0 0.00000 4 10 105 279 860 wiederverwenden +4 1 0 14 0 -1 0 0.00000 4 10 130 279 881 und LEXIKON am PC +4 1 0 14 0 -1 0 0.00000 4 10 63 79 839 untrennbar +4 1 0 14 0 -1 0 0.00000 4 10 105 79 860 wiederverwenden +4 1 0 14 0 -1 0 0.00000 4 10 130 79 881 und LEXIKON am PC +4 1 0 14 0 -1 0 0.00000 4 10 120 279 319 merken in doku.mem +4 1 0 14 0 -1 0 0.00000 4 10 72 279 340 und doku.lex +4 1 0 14 0 -1 0 0.00000 4 10 120 79 319 merken in doku.mem +4 1 0 14 0 -1 0 0.00000 4 10 72 279 419 Trennstellen +4 1 0 14 0 -1 0 0.00000 4 10 105 279 440 wiederverwenden +4 1 0 14 0 -1 0 0.00000 4 10 130 279 461 und LEXIKON am PC +4 1 0 14 0 -1 0 0.00000 4 10 72 79 419 Trennstellen +4 1 0 14 0 -1 0 0.00000 4 10 105 79 440 wiederverwenden +4 1 0 14 0 -1 0 0.00000 4 13 88 279 250 oder Tippfehler +4 1 0 14 0 -1 0 0.00000 4 13 143 279 229 Auswahl einer Trennung +4 1 0 14 0 -1 0 0.00000 4 13 110 279 169 mehrdeutiges Wort +4 1 0 14 0 -1 0 0.00000 4 13 88 279 650 oder Tippfehler +4 1 0 14 0 -1 0 0.00000 4 10 66 279 629 neues Wort +4 1 0 14 0 -1 0 0.00000 4 10 105 279 569 unbekanntes Wort +4 1 0 14 0 -1 0 0.00000 4 10 109 469 719 merken in doku.edt +4 1 0 14 0 -1 0 0.00000 4 13 127 469 839 Tippfehler ausbessern +4 1 0 14 0 -1 0 0.00000 4 10 109 464 319 merken in doku.edt +4 1 0 14 0 -1 0 0.00000 4 13 127 464 419 Tippfehler ausbessern diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.ps b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.ps new file mode 100644 index 0000000000..3fc15415b8 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.ps @@ -0,0 +1,188 @@ +%!PS-Adobe-2.0 EPSF +%%Title: inst_ber.fg1.fig +%%Creator: fig2dev +%%CreationDate: Mon Aug 23 14:14:02 1993 +%%For: heinz@eiunix (Heinz Herbeck,E 186/1,58801-4107,) +%%BoundingBox: 0 0 386 527 +%%Pages: 0 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +0 setlinecap 0 setlinejoin +-3.0 635.0 translate 0.720 -0.720 scale +0.500 setlinewidth +% Polyline +n 154 769 m 154 699 l 4 699 l 4 769 l + clp gs col-1 s gr +% Polyline +n 279 659 m 279 699 l gs col-1 s gr +% Polyline +n 279 659 m 469 699 l gs col-1 s gr +% Polyline +n 279 769 m 279 819 l gs col-1 s gr +% Polyline +n 79 769 m 79 819 l gs col-1 s gr +% Polyline +n 359 349 m 359 299 l 199 299 l 199 349 l + clp gs col-1 s gr +% Polyline +n 154 349 m 154 299 l 4 299 l 4 349 l + clp gs col-1 s gr +% Polyline +n 279 259 m 279 299 l gs col-1 s gr +% Polyline +n 279 259 m 464 299 l gs col-1 s gr +% Polyline +n 279 259 m 79 299 l gs col-1 s gr +% Polyline +n 279 349 m 279 399 l gs col-1 s gr +% Polyline +n 464 349 m 464 399 l gs col-1 s gr +% Polyline +n 79 349 m 79 399 l gs col-1 s gr +% Polyline +n 359 259 m 359 209 l 199 209 l 199 259 l + clp gs col-1 s gr +% Polyline +n 279 179 m 279 209 l gs col-1 s gr +3.000 setlinewidth +% Polyline +n 339 179 m 219 179 l 219 149 l 339 149 l + clp gs col-1 s gr +0.500 setlinewidth +% Polyline +n 279 659 m 79 699 l gs col-1 s gr +% Polyline +n 359 659 m 359 609 l 199 609 l 199 659 l + clp gs col-1 s gr +% Polyline +n 279 579 m 279 609 l gs col-1 s gr +3.000 setlinewidth +% Polyline +n 339 579 m 219 579 l 219 549 l 339 549 l + clp gs col-1 s gr +0.500 setlinewidth +% Polyline +n 539 769 m 539 699 l 404 699 l 404 769 l + clp gs col-1 s gr +% Polyline +n 469 769 m 469 819 l gs col-1 s gr +% Polyline +n 524 349 m 524 299 l 404 299 l 404 349 l + clp gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +279 719 m +gs 1 -1 scale (mit angegebenen Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 740 m +gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +% Polyline +n 379 769 m 379 699 l 179 699 l 179 769 l + clp gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +279 761 m +gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +464 419 m +gs 1 -1 scale (Tippfehler ausbessern) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 719 m +gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 740 m +gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 839 m +gs 1 -1 scale (mit Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 860 m +gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 881 m +gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 839 m +gs 1 -1 scale (untrennbar) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 860 m +gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 881 m +gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 319 m +gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 340 m +gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 319 m +gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 419 m +gs 1 -1 scale (Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 440 m +gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 461 m +gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 419 m +gs 1 -1 scale (Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 440 m +gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 250 m +gs 1 -1 scale (oder Tippfehler) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 229 m +gs 1 -1 scale (Auswahl einer Trennung) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 169 m +gs 1 -1 scale (mehrdeutiges Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 650 m +gs 1 -1 scale (oder Tippfehler) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 629 m +gs 1 -1 scale (neues Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 569 m +gs 1 -1 scale (unbekanntes Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +469 719 m +gs 1 -1 scale (merken in doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +469 839 m +gs 1 -1 scale (Tippfehler ausbessern) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +464 319 m +gs 1 -1 scale (merken in doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +$F2psEnd diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.tex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.tex new file mode 100644 index 0000000000..6ef8cc7f33 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg1.tex @@ -0,0 +1,7 @@ +\makebox[5.361in][l]{ + \vbox to 7.319in{ + \vfill + \special{psfile=inst_ber.fg1.ps} + } + \vspace{-\baselineskip} +} diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.fig b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.fig new file mode 100644 index 0000000000..486b308596 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.fig @@ -0,0 +1,61 @@ +#FIG 2.1 +80 2 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 269 289 269 259 209 259 209 289 269 289 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 299 489 299 439 179 439 179 489 299 489 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 324 609 324 559 154 559 154 609 324 609 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 559 289 559 259 439 259 439 289 559 289 9999 9999 +2 4 0 1 -1 0 0 0 0.000 7 0 0 + 309 204 309 184 249 184 249 204 309 204 9999 9999 +2 4 0 1 -1 0 0 0 0.000 7 0 0 + 189 384 189 364 129 364 129 384 189 384 9999 9999 +2 4 0 1 -1 0 0 0 0.000 7 0 0 + 309 424 309 404 249 404 249 424 309 424 9999 9999 +2 4 0 1 -1 0 0 0 0.000 7 0 0 + 309 544 309 524 249 524 249 544 309 544 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 239 149 239 259 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 219 289 219 309 99 309 99 239 219 239 219 259 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 229 289 229 359 79 359 79 99 229 99 229 119 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 239 289 239 439 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 259 289 259 309 499 309 499 289 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 499 259 499 239 259 239 259 259 9999 9999 +2 1 0 1 -1 0 0 0 0.000 -1 1 0 + 0 0 1.000 4.000 8.000 + 239 489 239 559 9999 9999 +2 2 0 1 -1 0 0 0 0.000 0 0 0 + 269 149 269 119 209 119 209 149 269 149 9999 9999 +2 4 0 1 -1 0 0 0 0.000 7 0 0 + 194 334 194 314 124 314 124 334 194 334 9999 9999 +2 4 0 1 -1 0 0 0 0.000 7 0 0 + 409 334 409 314 349 314 349 334 409 334 9999 9999 +2 4 0 1 -1 0 0 0 0.000 7 0 0 + 419 234 419 204 339 204 339 234 419 234 9999 9999 +4 1 0 14 0 -1 0 0.00000 4 10 52 239 139 EDITOR +4 1 0 14 0 -1 0 0.00000 4 10 49 279 199 doku.tex +4 1 0 14 0 -1 0 0.00000 4 10 40 239 279 iSiTeX +4 1 0 14 0 -1 0 0.00000 4 10 49 159 379 doku.edt +4 1 0 14 0 -1 0 0.00000 4 10 47 239 459 DVI2PS +4 1 0 14 0 -1 0 0.00000 4 13 107 239 480 (..dvi to Postscript) +4 1 0 14 0 -1 0 0.00000 4 10 42 239 579 PRINT +4 1 0 14 0 -1 0 0.00000 4 13 155 239 600 (Postscript-Laserdrucker) +4 1 0 14 0 -1 0 0.00000 4 10 48 279 419 doku.dvi +4 1 0 14 0 -1 0 0.00000 4 13 44 279 539 doku.ps +4 1 0 14 0 -1 0 0.00000 4 10 106 499 279 LEXIKON am PC +4 1 0 14 0 -1 0 0.00000 4 10 60 159 329 doku.mem +4 1 0 14 0 -1 0 0.00000 4 10 48 379 329 doku.lex +4 1 0 14 0 -1 0 0.00000 4 10 67 379 224 Worttabelle diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.ps b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.ps new file mode 100644 index 0000000000..2334f21cc4 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.ps @@ -0,0 +1,133 @@ +%!PS-Adobe-2.0 EPSF +%%Title: inst_ber.fg2.fig +%%Creator: fig2dev +%%CreationDate: Mon Aug 23 13:39:57 1993 +%%For: heinz@eiunix (Heinz Herbeck,E 186/1,58801-4107,) +%%BoundingBox: 0 0 432 459 +%%Pages: 0 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +0 setlinecap 0 setlinejoin +-72.0 549.0 translate 0.900 -0.900 scale +0.500 setlinewidth +% Polyline +n 299 489 m 299 439 l 179 439 l 179 489 l + clp gs col-1 s gr +% Polyline +n 324 609 m 324 559 l 154 559 l 154 609 l + clp gs col-1 s gr +% Polyline +n 559 289 m 559 259 l 439 259 l 439 289 l + clp gs col-1 s gr +% Polyline +n 256 184 m 249 184 249 197 7 arcto 4 {pop} repeat 249 204 302 204 7 arcto 4 {pop} repeat 309 204 309 191 7 arcto 4 {pop} repeat 309 184 256 184 7 arcto 4 {pop} repeat clp gs col-1 s gr +% Polyline +n 136 364 m 129 364 129 377 7 arcto 4 {pop} repeat 129 384 182 384 7 arcto 4 {pop} repeat 189 384 189 371 7 arcto 4 {pop} repeat 189 364 136 364 7 arcto 4 {pop} repeat clp gs col-1 s gr +% Polyline +n 256 404 m 249 404 249 417 7 arcto 4 {pop} repeat 249 424 302 424 7 arcto 4 {pop} repeat 309 424 309 411 7 arcto 4 {pop} repeat 309 404 256 404 7 arcto 4 {pop} repeat clp gs col-1 s gr +% Polyline +n 256 524 m 249 524 249 537 7 arcto 4 {pop} repeat 249 544 302 544 7 arcto 4 {pop} repeat 309 544 309 531 7 arcto 4 {pop} repeat 309 524 256 524 7 arcto 4 {pop} repeat clp gs col-1 s gr +% Polyline +n 239 149 m 239 259 l gs col-1 s gr +n 241.000 251.000 m 239.000 259.000 l 237.000 251.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 219 289 m 219 309 l 99 309 l 99 239 l + 219 239 l 219 259 l gs col-1 s gr +n 221.000 251.000 m 219.000 259.000 l 217.000 251.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 229 289 m 229 359 l 79 359 l 79 99 l + 229 99 l 229 119 l gs col-1 s gr +n 231.000 111.000 m 229.000 119.000 l 227.000 111.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 239 289 m 239 439 l gs col-1 s gr +n 241.000 431.000 m 239.000 439.000 l 237.000 431.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 259 289 m 259 309 l 499 309 l 499 289 l gs col-1 s gr +n 497.000 297.000 m 499.000 289.000 l 501.000 297.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 499 259 m 499 239 l 259 239 l 259 259 l gs col-1 s gr +n 261.000 251.000 m 259.000 259.000 l 257.000 251.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 239 489 m 239 559 l gs col-1 s gr +n 241.000 551.000 m 239.000 559.000 l 237.000 551.000 l gs 2 setlinejoin col-1 s gr +% Polyline +n 269 149 m 269 119 l 209 119 l 209 149 l + clp gs col-1 s gr +% Polyline +n 269 289 m 269 259 l 209 259 l 209 289 l + clp gs col-1 s gr +% Polyline +n 131 314 m 124 314 124 327 7 arcto 4 {pop} repeat 124 334 187 334 7 arcto 4 {pop} repeat 194 334 194 321 7 arcto 4 {pop} repeat 194 314 131 314 7 arcto 4 {pop} repeat clp gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +379 224 m +gs 1 -1 scale (Worttabelle) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +% Polyline +n 356 314 m 349 314 349 327 7 arcto 4 {pop} repeat 349 334 402 334 7 arcto 4 {pop} repeat 409 334 409 321 7 arcto 4 {pop} repeat 409 314 356 314 7 arcto 4 {pop} repeat clp gs col-1 s gr +% Polyline +n 346 204 m 339 204 339 227 7 arcto 4 {pop} repeat 339 234 412 234 7 arcto 4 {pop} repeat 419 234 419 211 7 arcto 4 {pop} repeat 419 204 346 204 7 arcto 4 {pop} repeat clp gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +239 139 m +gs 1 -1 scale (EDITOR) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 199 m +gs 1 -1 scale (doku.tex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 279 m +gs 1 -1 scale (iSiTeX) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +159 379 m +gs 1 -1 scale (doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 459 m +gs 1 -1 scale (DVI2PS) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 480 m +gs 1 -1 scale (\(..dvi to Postscript\)) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 579 m +gs 1 -1 scale (PRINT) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 600 m +gs 1 -1 scale (\(Postscript-Laserdrucker\)) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 419 m +gs 1 -1 scale (doku.dvi) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 539 m +gs 1 -1 scale (doku.ps) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +499 279 m +gs 1 -1 scale (LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +159 329 m +gs 1 -1 scale (doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +379 329 m +gs 1 -1 scale (doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +$F2psEnd diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.tex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.tex new file mode 100644 index 0000000000..9d35f02a29 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.fg2.tex @@ -0,0 +1,7 @@ +\makebox[6.000in][l]{ + \vbox to 6.375in{ + \vfill + \special{psfile=inst_ber.fg2.ps} + } + \vspace{-\baselineskip} +} diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.lex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.lex new file mode 100644 index 0000000000..806b45fec9 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.lex @@ -0,0 +1,16 @@ +hyphenation +barth +nirschl +sisisi +duden + penalties +defaultm"a"sig + underfull +f"uchse +dudenregeln +initex +leslie +document +preparation +addison +wesley diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.log b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.log new file mode 100644 index 0000000000..3dc7c7ff3a --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.log @@ -0,0 +1,180 @@ +This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92} (C version d) (format=silplain 93.8.19) 23 AUG 1993 13:39 +**inst_ber.tex +(inst_ber.tex +ILaTeX Version 2.09 <13 Jun 1989> +(/usr/local/lib/tex/inputs/article.sty +Document Style `article' <16 Mar 88>, modified at TUW <11 Apr 89>. +(/usr/local/lib/tex/inputs/art12.sty) +\c@part=\count80 +\c@section=\count81 +\c@subsection=\count82 +\c@subsubsection=\count83 +\c@paragraph=\count84 +\c@subparagraph=\count85 +\c@figure=\count86 +\c@table=\count87 +) (/usr/local/lib/tex/inputs/sigerman.sty +Document Style Option `german' Version 2.3c of 28 Aug 1990 +\U@C=\count88 +\U@B=\box29 +\U@D=\dimen99 +\l@nguage=\count89 +\USenglish=\count90 +\german=\count91 +\austrian=\count92 +\french=\count93 +\english=\count94 +) (transfig.tex +TransFig: figures in PostScript. +) (inst_ber.aux) (inst_ber.toc) +\tf@toc=\write3 + [0 + +] [1] [2] +Overfull \hbox (1.11171pt too wide) in paragraph at lines 146--153 +[][]\twlit SiSiSi \twlrm un-ter-stmtzt eine sinnent-sprechen-de Tren-nung, in-d +em es die \twlbf Haupt- + +\hbox(8.33331+2.33331)x390.0, glue set - 1.0 +.\hbox(0.0+0.0)x17.62482 +.\setlanguage1 (hyphenmin 2,3) +.\twlit S +.\twlit i +.\twlit S +.etc. + +[3] [4] [5] (inst_ber.fg1.tex) [6] [7] [8] [9] (inst_ber.fg2.tex) +Overfull \hbox (43.62pt too wide) in paragraph at lines 1--469 +[][] + +\hbox(460.72124+0.0)x390.0 +.\hbox(0.0+0.0)x0.0 +.\hbox(460.72124+0.0)x433.62, glue set 425.78674fil +..\glue 3.91663 plus 1.95831 minus 1.30554 +..\vbox(460.72124+0.0)x0.0, glue set 460.72124fill +...\glue 0.0 plus 1.0fill +...\special{psfile=inst_ber.fg2.ps} +..\glue 3.91663 plus 1.95831 minus 1.30554 +..\vadjust +...\glue -14.5 +...\glue 0.0 +..\glue 0.0 plus 1.0fil minus 1.0fil +.\glue(\rightskip) 0.0 + + +Underfull \hbox (badness 10000) in paragraph at lines 1--469 + + +\hbox(0.0+0.0)x390.0 +.\glue(\rightskip) 0.0 + +[10] [11] +Overfull \hbox (13.19629pt too wide) in paragraph at lines 544--544 +[] []\twltt (`-' Nebentrennstelle, `=' Haupttrennstelle, `.' Weiterruecken,[] + +\hbox(8.33333+2.66667)x390.0 +.\hbox(0.0+0.0)x0.0 +.\penalty 10000 +.\glue 6.29994 +.\setlanguage1 (hyphenmin 2,3) +.\twltt ( +.etc. + +[12] +Underfull \hbox (badness 10000) in paragraph at lines 598--599 + + +\hbox(0.0+0.0)x390.0 +.\glue(\rightskip) 0.0 + + +Underfull \hbox (badness 7273) in paragraph at lines 604--606 +[][]\twlrm Wie 1, je-doch kann die- + +\hbox(8.33331+2.33331)x156.49014, glue set 4.17557 +.\hbox(0.0+0.0)x0.0 +.\setlanguage1 (hyphenmin 2,3) +.\twlrm W +.\twlrm i +.\twlrm e +.etc. + + +Underfull \hbox (badness 1048) in paragraph at lines 611--612 +\twlrm Trenn-stel-le, nach dem \twlit k\twlrm -ten + +\hbox(8.33331+2.33331)x156.49014, glue set 2.19072 +.\twlrm T +.\kern-0.97916 +.\twlrm r +.\twlrm e +.\twlrm n +.etc. + + +Underfull \hbox (badness 1430) in paragraph at lines 616--616 +[][]\twlrm Nach der Vor-sil-be wird ge- + +\hbox(8.33331+2.33331)x156.49014, glue set 2.42874 +.\hbox(0.0+0.0)x0.0 +.\setlanguage1 (hyphenmin 2,3) +.\twlrm N +.\twlrm a +.\twlrm c +.etc. + + +Overfull \hbox (46.36421pt too wide) in paragraph at lines 600--620 +[] + +\hbox(112.94995+106.94994)x390.0 +.\hbox(112.94995+106.94994)x436.36421 +..\mathon +..\vbox(112.94995+106.94994)x436.36421 +...\rule(0.4+0.0)x436.36421 +...\hbox(10.14995+4.35004)x436.36421 [] +...\rule(0.4+0.0)x436.36421 +...\hbox(10.14995+18.85004)x436.36421 [] +...\rule(0.4+0.0)x436.36421 +...etc. +..\mathoff +.\glue(\rightskip) 0.0 + + +Overfull \hbox (44.73192pt too wide) in paragraph at lines 600--620 +[] + +\hbox(47.29997+41.29996)x390.0 +.\hbox(47.29997+41.29996)x434.73192 +..\mathon +..\vbox(47.29997+41.29996)x434.73192 +...\rule(0.4+0.0)x434.73192 +...\hbox(10.14995+4.35004)x434.73192 [] +...\rule(0.4+0.0)x434.73192 +...\hbox(10.14995+18.85004)x434.73192 [] +...\rule(0.4+0.0)x434.73192 +...etc. +..\mathoff +.\penalty 10000 +.\glue 0.0 plus 1.0fil +.\penalty -10000 +.\glue(\rightskip) 0.0 + + +Underfull \hbox (badness 10000) in paragraph at lines 600--620 + + +\hbox(0.0+0.0)x390.0 +.\glue(\rightskip) 0.0 + +[13] [14] [15] (inst_ber.aux) ) +Here is how much of TeX's memory you used: + 259 strings out of 11972 + 2366 string characters out of 87201 + 38859 words of memory out of 262141 + 2219 multiletter control sequences out of 9500 + 21837 words of font info for 84 fonts, out of 100000 for 255 + 0 hyphenation exceptions out of 607 + 13i,15n,15p,218b,339s stack positions out of 300i,40n,60p,3000b,4000s + +Output written on inst_ber.dvi (16 pages, 46448 bytes). diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.mem b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.mem new file mode 100644 index 0000000000..2c6bf9be52 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.mem @@ -0,0 +1,224 @@ +21 + 23 15 18 20 26 21 19 1 13 13 5 14 19 5 20 26 21 14 7 5 14 + 1 1 1 4 1 2 1 1 2 1 1 2 1 1 2 1 1 2 1 1 1 +f +12 + 20 18 5 14 14 19 20 5 12 12 5 14 + 1 1 1 1 2 1 1 1 2 1 1 1 +f +11 + 8 25 16 8 5 14 1 20 9 15 14 + 1 1 1 1 1 1 1 1 1 1 1 +t +5 + 2 1 18 20 8 + 1 1 1 1 1 +t +7 + 14 9 18 19 3 8 12 + 1 1 1 1 1 1 1 +t +18 + 19 9 14 14 5 14 20 19 16 18 5 3 8 5 14 4 5 14 + 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 1 +f +6 + 19 9 19 9 19 9 + 1 1 1 1 1 1 +t +11 + 14 1 8 20 19 20 5 12 12 5 14 + 1 1 1 2 1 1 1 2 1 1 1 +f +5 + 4 21 4 5 14 + 1 2 1 1 1 +t +11 + 23 15 18 20 20 1 2 5 12 12 5 + 1 1 1 2 1 2 1 1 2 1 1 +f +16 + 23 15 18 20 2 5 19 20 1 14 4 20 5 9 12 5 + 1 1 1 4 1 2 1 1 1 1 1 1 1 2 1 1 +f +14 + 1 13 5 18 9 11 1 14 9 19 3 8 5 14 + 1 1 2 1 2 1 2 1 1 1 1 1 1 1 +f +11 + 20 18 5 14 14 19 20 5 12 12 5 + 1 1 1 1 2 1 1 1 2 1 1 +f +8 + 16 1 19 19 5 14 4 5 + 1 1 2 1 1 2 1 1 +f +10 + 5 9 7 5 14 14 1 13 5 14 + 1 2 1 1 4 1 2 1 1 1 +f +17 + 19 9 14 14 5 14 20 19 16 18 5 3 8 5 14 4 5 + 1 1 1 1 1 1 2 1 1 1 1 1 1 1 2 1 1 +f +17 + 14 5 2 5 14 20 18 5 14 14 19 20 5 12 12 5 14 + 1 2 1 1 4 1 1 1 1 2 1 1 1 2 1 1 1 +f +9 + 16 5 14 1 12 20 9 5 19 + 1 1 1 1 2 1 1 1 1 +t +12 + 4 5 6 1 21 12 20 13 27 30 9 7 + 1 2 1 1 1 1 2 1 1 1 1 1 +t +17 + 8 1 21 16 20 20 18 5 14 14 19 20 5 12 12 5 14 + 1 1 1 1 4 1 1 1 1 2 1 1 1 2 1 1 1 +f +12 + 6 21 7 5 14 26 5 9 3 8 5 14 + 1 2 1 1 4 1 1 2 1 1 1 1 +f +9 + 2 5 19 20 5 8 5 14 4 + 1 2 1 1 1 1 1 1 1 +f +10 + 21 14 16 1 19 19 5 14 4 5 + 1 2 1 1 2 1 1 2 1 1 +f +16 + 19 9 14 14 5 14 20 19 20 5 12 12 5 14 4 5 + 1 1 1 1 1 1 2 1 1 1 1 1 1 2 1 1 +f +12 + 1 2 20 18 5 14 14 21 14 7 5 14 + 1 2 1 1 1 2 1 1 2 1 1 1 +f +18 + 5 9 14 26 5 12 2 5 19 20 1 14 4 20 5 9 12 5 + 1 1 2 1 1 4 1 2 1 1 1 1 1 1 1 2 1 1 +f +8 + 2 5 20 20 18 21 8 5 + 1 1 1 4 1 2 1 1 +f +16 + 8 1 21 16 20 20 18 5 14 14 19 20 5 12 12 5 + 1 1 1 1 4 1 1 1 1 2 1 1 1 2 1 1 +f +16 + 14 5 2 5 14 20 18 5 14 14 19 20 5 12 12 5 + 1 2 1 1 4 1 1 1 1 2 1 1 1 2 1 1 +f +9 + 21 14 4 5 18 6 21 12 12 + 1 2 1 1 2 1 1 1 1 +t +8 + 26 21 7 18 21 14 4 5 + 1 2 1 1 1 2 1 1 +f +13 + 23 5 9 20 18 5 9 3 8 5 14 4 5 + 1 1 1 4 1 1 1 1 1 1 2 1 1 +f +15 + 26 21 19 1 13 13 5 14 6 1 19 19 5 14 4 + 1 2 1 1 2 1 1 4 1 1 1 1 1 1 1 +f +12 + 5 14 20 19 16 18 5 3 8 5 14 4 + 1 1 2 1 1 1 1 1 1 1 1 1 +f +9 + 23 1 3 8 19 20 21 2 5 + 1 1 1 1 1 1 2 1 1 +f +10 + 23 1 3 8 19 20 21 2 5 14 + 1 1 1 1 1 1 2 1 1 1 +f +11 + 8 9 14 26 21 7 5 6 29 7 20 + 1 1 2 1 2 1 2 1 1 1 1 +f +13 + 7 18 21 14 4 19 27 20 26 12 9 3 8 + 1 1 1 1 4 1 1 1 2 1 1 1 1 +f +7 + 12 28 19 3 8 5 14 + 1 2 1 1 1 1 1 +f +11 + 8 9 14 7 5 14 15 13 13 5 14 + 1 1 2 1 2 1 1 2 1 1 1 +f +16 + 1 21 6 13 5 18 11 19 1 13 13 1 3 8 5 14 + 1 1 2 1 1 1 2 1 1 4 1 2 1 1 1 1 +f +11 + 5 18 12 5 9 3 8 20 5 18 20 + 1 2 1 1 1 1 2 1 1 1 1 +f +12 + 1 21 19 7 5 2 5 19 19 5 18 20 + 1 1 2 1 1 1 1 2 1 1 1 1 +f +15 + 2 5 14 21 20 26 5 18 5 9 7 5 14 5 14 + 1 2 1 1 2 1 1 1 1 2 1 2 1 1 1 +f +12 + 1 2 23 1 14 4 12 21 14 7 5 14 + 1 2 1 1 1 2 1 1 2 1 1 1 +f +9 + 20 9 5 18 14 1 13 5 14 + 1 1 1 4 1 2 1 1 1 +f +6 + 6 29 3 8 19 5 + 1 1 1 1 1 1 +t +10 + 1 2 23 5 9 3 8 5 14 4 + 1 2 1 1 1 1 1 1 1 1 +f +11 + 4 21 4 5 14 18 5 7 5 12 14 + 1 2 1 1 2 1 2 1 1 1 1 +t +7 + 4 1 18 29 2 5 18 + 1 1 1 1 1 1 1 +f +6 + 9 14 9 20 5 24 + 1 1 1 1 1 1 +t +6 + 12 5 19 12 9 5 + 1 1 1 1 1 1 +t +8 + 4 15 3 21 13 5 14 20 + 1 1 1 1 1 1 1 1 +t +11 + 16 18 5 16 1 18 1 20 9 15 14 + 1 1 1 1 1 1 1 1 1 1 1 +t +7 + 1 4 4 9 19 15 14 + 1 1 1 1 1 1 1 +t +6 + 23 5 19 12 5 25 + 1 1 1 1 1 1 +t diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.ps b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.ps new file mode 100644 index 0000000000..e82861458e --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.ps @@ -0,0 +1,2560 @@ +%!PS-Adobe-2.0 +%%Creator: dvips 5.47 Copyright 1986-91 Radical Eye Software +%%Title: inst_ber.dvi +%%Pages: 16 1 +%%BoundingBox: 0 0 596 843 +%%EndComments +%%BeginProcSet: tex.pro +/TeXDict 200 dict def TeXDict begin /N /def load def /B{bind def}N /S /exch +load def /X{S N}B /TR /translate load N /isls false N /vsize 10 N /@rigin{ +isls{[0 1 -1 0 0 0]concat}if 72 Resolution div 72 VResolution div neg scale +Resolution VResolution vsize neg mul TR matrix currentmatrix dup dup 4 get +round 4 exch put dup dup 5 get round 5 exch put setmatrix}N /@letter{/vsize 10 +N}B /@landscape{/isls true N /vsize -1 N}B /@a4{/vsize 10.6929133858 N}B /@a3{ +/vsize 15.5531 N}B /@ledger{/vsize 16 N}B /@legal{/vsize 13 N}B /@manualfeed{ +statusdict /manualfeed true put}B /@copies{/#copies X}B /FMat[1 0 0 -1 0 0]N +/FBB[0 0 0 0]N /nn 0 N /IE 0 N /ctr 0 N /df-tail{/nn 8 dict N nn begin +/FontType 3 N /FontMatrix fntrx N /FontBBox FBB N string /base X array +/BitMaps X /BuildChar{CharBuilder}N /Encoding IE N end dup{/foo setfont}2 +array copy cvx N load 0 nn put /ctr 0 N[}B /df{/sf 1 N /fntrx FMat N df-tail} +B /dfs{div /sf X /fntrx[sf 0 0 sf neg 0 0]N df-tail}B /E{pop nn dup definefont +setfont}B /ch-width{ch-data dup length 5 sub get}B /ch-height{ch-data dup +length 4 sub get}B /ch-xoff{128 ch-data dup length 3 sub get sub}B /ch-yoff{ +ch-data dup length 2 sub get 127 sub}B /ch-dx{ch-data dup length 1 sub get}B +/ch-image{ch-data dup type /stringtype ne{ctr get /ctr ctr 1 add N}if}B /id 0 +N /rw 0 N /rc 0 N /gp 0 N /cp 0 N /G 0 N /sf 0 N /CharBuilder{save 3 1 roll S +dup /base get 2 index get S /BitMaps get S get /ch-data X pop /ctr 0 N ch-dx 0 +ch-xoff ch-yoff ch-height sub ch-xoff ch-width add ch-yoff setcachedevice +ch-width ch-height true[1 0 0 -1 -.1 ch-xoff sub ch-yoff .1 add]{ch-image} +imagemask restore}B /D{/cc X dup type /stringtype ne{]}if nn /base get cc ctr +put nn /BitMaps get S ctr S sf 1 ne{dup dup length 1 sub dup 2 index S get sf +div put}if put /ctr ctr 1 add N}B /I{cc 1 add D}B /bop{userdict /bop-hook +known{bop-hook}if /SI save N @rigin 0 0 moveto}N /eop{clear SI restore +showpage userdict /eop-hook known{eop-hook}if}N /@start{userdict /start-hook +known{start-hook}if /VResolution X /Resolution X 1000 div /DVImag X /IE 256 +array N 0 1 255{IE S 1 string dup 0 3 index put cvn put}for}N /p /show load N +/RMat[1 0 0 -1 0 0]N /BDot 260 string N /rulex 0 N /ruley 0 N /v{/ruley X +/rulex X V}B /V statusdict begin /product where{pop product dup length 7 ge{0 +7 getinterval(Display)eq}{pop false}ifelse}{false}ifelse end{{gsave TR -.1 -.1 +TR 1 1 scale rulex ruley false RMat{BDot}imagemask grestore}}{{gsave TR -.1 +-.1 TR rulex ruley scale 1 1 false RMat{BDot}imagemask grestore}}ifelse B /a{ +moveto}B /delta 0 N /tail{dup /delta X 0 rmoveto}B /M{S p delta add tail}B /b{ +S p tail}B /c{-4 M}B /d{-3 M}B /e{-2 M}B /f{-1 M}B /g{0 M}B /h{1 M}B /i{2 M}B +/j{3 M}B /k{4 M}B /w{0 rmoveto}B /l{p -4 w}B /m{p -3 w}B /n{p -2 w}B /o{p -1 w +}B /q{p 1 w}B /r{p 2 w}B /s{p 3 w}B /t{p 4 w}B /x{0 S rmoveto}B /y{3 2 roll p +a}B /bos{/SS save N}B /eos{clear SS restore}B end +%%EndProcSet +%%BeginProcSet: special.pro +TeXDict begin /SDict 200 dict N SDict begin /@SpecialDefaults{/hs 612 N /vs +792 N /ho 0 N /vo 0 N /hsc 1 N /vsc 1 N /ang 0 N /CLIP false N /BBcalc false N +/p 3 def}B /@scaleunit 100 N /@hscale{@scaleunit div /hsc X}B /@vscale{ +@scaleunit div /vsc X}B /@hsize{/hs X /CLIP true N}B /@vsize{/vs X /CLIP true +N}B /@hoffset{/ho X}B /@voffset{/vo X}B /@angle{/ang X}B /@rwi{10 div /rwi X} +B /@llx{/llx X}B /@lly{/lly X}B /@urx{/urx X}B /@ury{/ury X /BBcalc true N}B +/magscale true def end /@MacSetUp{userdict /md known{userdict /md get type +/dicttype eq{md begin /letter{}N /note{}N /legal{}N /od{txpose 1 0 mtx +defaultmatrix dtransform S atan/pa X newpath clippath mark{transform{ +itransform moveto}}{transform{itransform lineto}}{6 -2 roll transform 6 -2 +roll transform 6 -2 roll transform{itransform 6 2 roll itransform 6 2 roll +itransform 6 2 roll curveto}}{{closepath}}pathforall newpath counttomark array +astore /gc xdf pop ct 39 0 put 10 fz 0 fs 2 F/|______Courier fnt invertflag{ +PaintBlack}if}N /txpose{pxs pys scale ppr aload pop por{noflips{pop S neg S TR +pop 1 -1 scale}if xflip yflip and{pop S neg S TR 180 rotate 1 -1 scale ppr 3 +get ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip +not and{pop S neg S TR pop 180 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if +yflip xflip not and{ppr 1 get neg ppr 0 get neg TR}if}{noflips{TR pop pop 270 +rotate 1 -1 scale}if xflip yflip and{TR pop pop 90 rotate 1 -1 scale ppr 3 get +ppr 1 get neg sub neg ppr 2 get ppr 0 get neg sub neg TR}if xflip yflip not +and{TR pop pop 90 rotate ppr 3 get ppr 1 get neg sub neg 0 TR}if yflip xflip +not and{TR pop pop 270 rotate ppr 2 get ppr 0 get neg sub neg 0 S TR}if} +ifelse scaleby96{ppr aload pop 4 -1 roll add 2 div 3 1 roll add 2 div 2 copy +TR .96 dup scale neg S neg S TR}if}N /cp{pop pop showpage pm restore}N end}if} +if}N /normalscale{Resolution 72 div VResolution 72 div neg scale magscale{ +DVImag dup scale}if}N /psfts{S 65536 div N}N /startTexFig{/psf$SavedState save +N userdict maxlength dict begin /magscale false def normalscale currentpoint +TR /psf$ury psfts /psf$urx psfts /psf$lly psfts /psf$llx psfts /psf$y psfts +/psf$x psfts currentpoint /psf$cy X /psf$cx X /psf$sx psf$x psf$urx psf$llx +sub div N /psf$sy psf$y psf$ury psf$lly sub div N psf$sx psf$sy scale psf$cx +psf$sx div psf$llx sub psf$cy psf$sy div psf$ury sub TR /showpage{}N +/erasepage{}N /copypage{}N /p 3 def @MacSetUp}N /doclip{psf$llx psf$lly +psf$urx psf$ury currentpoint 6 2 roll newpath 4 copy 4 2 roll moveto 6 -1 roll +S lineto S lineto S lineto closepath clip newpath moveto}N /endTexFig{end +psf$SavedState restore}N /@beginspecial{SDict begin /SpecialSave save N gsave +normalscale currentpoint TR @SpecialDefaults}N /@setspecial{CLIP{newpath 0 0 +moveto hs 0 rlineto 0 vs rlineto hs neg 0 rlineto closepath clip}if ho vo TR +hsc vsc scale ang rotate BBcalc{rwi urx llx sub div dup scale llx neg lly neg +TR}if /showpage{}N /erasepage{}N /copypage{}N newpath}N /@endspecial{grestore +clear SpecialSave restore end}N /@defspecial{SDict begin}N /@fedspecial{end}B +/li{lineto}B /rl{rlineto}B /rc{rcurveto}B /np{/SaveX currentpoint /SaveY X N 1 +setlinecap newpath}N /st{stroke SaveX SaveY moveto}N /fil{fill SaveX SaveY +moveto}N /ellipse{/endangle X /startangle X /yrad X /xrad X /savematrix matrix +currentmatrix N TR xrad yrad scale 0 0 1 startangle endangle arc savematrix +setmatrix}N end +%%EndProcSet +TeXDict begin 1000 300 300 @start /Fa 1 59 df<70F8F8F87005057C840E>58 +D E /Fb 1 16 df<03F0000FFC001FFE003FFF007FFF807FFF80FFFFC0FFFFC0FFFFC0FFFFC0FF +FFC0FFFFC0FFFFC0FFFFC07FFF807FFF803FFF001FFE000FFC0003F00012147D9519>15 +D E /Fc 54 123 df<70F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F8F87870000000000070F8F8F870 +051E769D1A>33 D<701CF01EF01EF01EF01EF01EF01EF01EF01E701C701C701C701C600C0F0E7B +9D1A>I<1C3E3E3F1F070707070E0E1C3C78F0600810789D1A>39 D<0038007800F001E003C007 +800F000E001C001C0038003800700070007000E000E000E000E000E000E000E000E000E000E000 +700070007000380038001C001C000E000F00078003C001E000F8007800380D2878A21A>I<6000 +F00078003C001E000F000780038001C001C000E000E00070007000700038003800380038003800 +38003800380038003800700070007000E000E001C001C0038007800F001E003C007800F0006000 +0D287CA21A>I<0030000078000078000078000078000078000078000078000078007FFFF0FFFF +F8FFFFF87FFFF000780000780000780000780000780000780000780000780000300015167E991A +>43 D<183E7E7F3F1F070E0E1CFCF8E0080D77851A>I<7FFFC0FFFFE0FFFFE07FFFC013047D90 +1A>I<3078FCFC7830060676851A>I<01F00007FC000FFE001F1F001C07003803803803807001C0 +7001C07001C0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C0 +7001C07803C03803803C07801C07001F1F000FFE0007FC0001F000131E7D9D1A>48 +D<00C001C001C003C007C00FC07FC0FDC071C001C001C001C001C001C001C001C001C001C001C0 +01C001C001C001C001C001C001C001C07FFFFFFF7FFF101E7B9D1A>I<03F0000FFC001FFF003C +0F807803C07001C0E000E0F000E0F000E06000E00000E00000E00001C00001C000038000078000 +0F00000E00003C00007C0000F00001E00003C0000780000F00001E00E03C00E07FFFE0FFFFE07F +FFE0131E7D9D1A>I<01F00007FC001FFE003E0F003807807003807001C0E001C0E001C0E001E0 +E000E0E000E0E001E07001E07803E03C0FE01FFFE00FFCE003F0E00001C00001C00001C0000380 +600380F00700F00F00F03E007FFC003FF0000FC000131E7D9D1A>57 D<3078FCFC783000000000 +00000000003078FCFC7830061576941A>I<7FFFF0FFFFF8FFFFF87FFFF0000000000000000000 +0000007FFFF0FFFFF8FFFFF87FFFF0150C7E941A>61 D<FFFE00FFFF80FFFFC01C03E01C00E01C +00F01C00701C00701C00701C00701C00E01C01E01C07C01FFF801FFF801FFFC01C01E01C00F01C +00701C00381C00381C00381C00381C00381C00781C00F01C01F0FFFFE0FFFFC0FFFF00151E7E9D +1A>66 D<7FFFFCFFFFFC7FFFFC0E001C0E001C0E001C0E001C0E001C0E00000E00000E07000E07 +000E07000FFF000FFF000FFF000E07000E07000E07000E00000E00000E00000E000E0E000E0E00 +0E0E000E0E000E7FFFFEFFFFFE7FFFFE171E7F9D1A>69 D<7FFFFCFFFFFC7FFFFC0E001C0E001C +0E001C0E001C0E001C0E00000E00000E07000E07000E07000FFF000FFF000FFF000E07000E0700 +0E07000E00000E00000E00000E00000E00000E00000E00000E00007FE000FFF0007FE000161E7F +9D1A>I<FF8FF8FF8FF8FF8FF81C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01 +C01C01C01FFFC01FFFC01FFFC01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01C01 +C01C01C01C01C0FF8FF8FF8FF8FF8FF8151E7E9D1A>72 D<FFFF80FFFF80FFFF8001C00001C000 +01C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C000 +01C00001C00001C00001C00001C00001C00001C00001C00001C000FFFF80FFFF80FFFF80111E7C +9D1A>I<FF83F8FF87FCFF83F81C01E01C03C01C03801C07001C0F001C1E001C1C001C38001C78 +001CF0001CF8001DF8001FDC001F9C001F0E001E0F001E07001C07801C03801C01C01C01C01C00 +E01C00E01C0070FF81FCFF81FEFF81FC171E7F9D1A>75 D<7FE000FFF0007FE0000E00000E0000 +0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0000 +0E00000E00000E00000E00000E00380E00380E00380E00380E00387FFFF8FFFFF87FFFF8151E7E +9D1A>I<FE0FF8FF0FF8FF0FF81D81C01D81C01D81C01D81C01DC1C01CC1C01CC1C01CE1C01CE1 +C01C61C01C61C01C71C01C71C01C31C01C31C01C39C01C39C01C19C01C19C01C1DC01C0DC01C0D +C01C0DC01C0DC0FF87C0FF87C0FF83C0151E7E9D1A>78 D<0FFE003FFF807FFFC07C07C07001C0 +F001E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0E000E0 +E000E0E000E0E000E0E000E0E000E0F001E0F001E07001C07C07C07FFFC03FFF800FFE00131E7D +9D1A>I<03F1C00FFDC03FFFC07C0FC07003C0E003C0E001C0E001C0E001C0E000007000007800 +003F00001FF00007FE0000FF00000F800003C00001C00000E00000E06000E0E000E0E000E0E001 +C0F001C0FC0780FFFF80EFFE00E3F800131E7D9D1A>83 D<7FFFFEFFFFFEFFFFFEE0380EE0380E +E0380EE0380EE0380E003800003800003800003800003800003800003800003800003800003800 +00380000380000380000380000380000380000380000380000380003FF8007FFC003FF80171E7F +9D1A>I<FE00FEFF01FEFE00FE70001C3800383800383800383800383800383800383800383800 +38187C301C7C701C7C701CEE701CEE701CEE701CEE701CEE700CC6600CC6600DC7600DC7600D83 +600D83600D83600F83E00F83E00701C0171E7F9D1A>87 D<7F87F87FCFF87F87F80F01C0070380 +07838003870003C70001CE0001EE0000FC0000FC00007800007800007800007C00007C0000FE00 +00EE0001CF0001C7000387800383800703C00701C00E01E00E00E07F83FCFF83FE7F83FC171E7F +9D1A>I<600000F00000F00000F800007800007C00003C00003E00001E00001E00001F00000F00 +000F800007800007C00003C00003C00003E00001E00001F00000F00000F800007800007800007C +00003C00003E00001E00001F00000F00000F00000F800007800007C00003C00003E00001E00001 +E00000C013277DA21A>92 D<060F1E3C387070E0E0E0E0F8FC7C7C38081077A11A>96 +D<1FF0003FFC007FFE00780F00300700000380000380007F8007FF801FFF803F83807803807003 +80E00380E00380E00380700780780F803FFFFC1FFDFC07F0FC16157D941A>I<FE0000FE0000FE +00000E00000E00000E00000E00000E00000E00000E3E000EFF800FFFE00FC1F00F80700F00380E +00380E001C0E001C0E001C0E001C0E001C0E001C0E001C0F00380F00780F80F00FC1E00FFFC00E +FF80063E00161E7F9D1A>I<00FF8003FFC00FFFE01F01E03C00C0780000700000700000E00000 +E00000E00000E00000E000007000007000007800703C00701F01F00FFFE003FFC000FE0014157D +941A>I<001FC0001FC0001FC00001C00001C00001C00001C00001C00001C001F1C007FDC00FFF +C01E0FC03C07C07803C07001C0E001C0E001C0E001C0E001C0E001C0E001C0E001C07003C07003 +C03807C03E0FC01FFFFC07FDFC01F1FC161E7E9D1A>I<01F80007FF000FFF801E07C03C01C078 +00E07000E0E00070E00070FFFFF0FFFFF0FFFFF0E000007000007000007800703C00701F01F00F +FFE003FFC000FE0014157D941A>I<0007E0001FF0003FF800787800F03000E00000E00000E000 +00E0007FFFF0FFFFF0FFFFF000E00000E00000E00000E00000E00000E00000E00000E00000E000 +00E00000E00000E00000E00000E00000E0007FFFC07FFFC07FFFC0151E7F9D1A>I<00F87C03FF +FE07FFFE0F078C0E03801C01C01C01C01C01C01C01C01C01C00E03800F07800FFF000FFE001CF8 +001C00001C00000E00000FFF800FFFE03FFFF87C007C70001CE0000EE0000EE0000EE0000E7000 +1C78003C3E00F81FFFF007FFC001FF0017217F941A>I<FE0000FE0000FE00000E00000E00000E +00000E00000E00000E00000E3E000EFF800FFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E +00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0FFE3FEFFE3FEFFE3FE171E7F9D +1A>I<01C00003E00003E00003E00001C0000000000000000000000000000000007FE000FFE000 +7FE00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E000 +00E00000E00000E000FFFFC0FFFFC0FFFFC0121F7C9E1A>I<FE0000FE0000FE00000E00000E00 +000E00000E00000E00000E00000E3FF80E3FFC0E3FF80E07800E0F000E1E000E3C000E78000EF0 +000FF8000FFC000F9C000F0E000E0F000E07800E03800E01C00E01E0FFC3FCFFE7FEFFC3FC171E +7F9D1A>107 D<FFE000FFE000FFE00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E0 +0000E00000E00000E000FFFFE0FFFFE0FFFFE0131E7D9D1A>I<7CE0E000FFFBF8007FFFF8001F +1F1C001E1E1C001E1E1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C001C1C1C00 +1C1C1C001C1C1C001C1C1C001C1C1C001C1C1C007F1F1F00FF9F9F807F1F1F00191580941A>I< +FE3E00FEFF80FFFFC00FC1C00F80E00F00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E0 +0E00E00E00E00E00E00E00E00E00E0FFE3FEFFE3FEFFE3FE17157F941A>I<01F00007FC001FFF +003E0F803C07807803C07001C0E000E0E000E0E000E0E000E0E000E0E000E0F001E07001C07803 +C03C07803E0F801FFF0007FC0001F00013157D941A>I<FE3E00FEFF80FFFFE00FC1F00F80700F +00380E00380E001C0E001C0E001C0E001C0E001C0E001C0E001C0F00380F00780F80F00FC1E00F +FFC00EFF800E3E000E00000E00000E00000E00000E00000E00000E00000E0000FFE000FFE000FF +E00016207F941A>I<FF83F0FF8FF8FFBFFC03FC3C03F01803E00003C00003C000038000038000 +038000038000038000038000038000038000038000038000FFFF00FFFF80FFFF0016157E941A> +114 D<07FB801FFF807FFF80780780E00380E00380E003807800007FC0003FFC0007FF00003F80 +0003806001C0E001C0E001C0F003C0FC0780FFFF00EFFE00E3F80012157C941A>I<00C00001C0 +0001C00001C00001C00001C00001C0007FFFE0FFFFE0FFFFE001C00001C00001C00001C00001C0 +0001C00001C00001C00001C00001C00001C07001C07001C07001C07000E0E000FFE0007FC0001F +00141C7F9B1A>I<FE0FE0FE0FE0FE0FE00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E +00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFE03FFFE00FCFE17157F941A>I< +7FC7FCFFC7FE7FC7FC0E00E00E00E00F01E00701C00701C00783C003838003838003838001C700 +01C70001C70000EE0000EE0000EE00007C00007C0000380017157F941A>I<FF83FEFFC7FEFF83 +FE3800381C00701C00701C00701C00701C38701C7C700C7C600E6CE00E6CE00EEEE00EEEE00EEE +E006C6C006C6C007C7C007C7C003838017157F941A>I<7FC7F87FCFFC7FC7F80703C003878003 +C70001EE0000FE00007C00007800003800007C0000EE0001EE0001C7000383800783C00701C07F +C7FCFFC7FE7FC7FC17157F941A>I<7FC7FCFFC7FE7FC7FC0E00E00F00E00701E00701C00781C0 +0381C003838001C38001C38001C70000E70000E70000E600006600006E00003C00003C00003C00 +003C0000380000380000780000700030700078E00079E0007FC0003F80001E000017207F941A> +I<7FFFF0FFFFF0FFFFF0E001E0E003C0E00780000F00001E00003C0000780000F00001E00003C0 +000780000F00381E00383C0038780038FFFFF8FFFFF8FFFFF815157E941A>I +E /Fd 11 108 df<00FFFFFF80000F000780000F000180000F000180001E000180001E00018000 +1E000100001E000100003C000100003C000100003C010100003C01000000780200000078020000 +007806000000780E000000FFFC000000F00C000000F00C000000F00C000001E008000001E00800 +0001E008040001E000080003C000080003C000080003C000100003C00010000780002000078000 +6000078000C000078001C0000F8007C000FFFFFF800021227DA121>69 D<00FFF8000F00000F00 +000F00001E00001E00001E00001E00003C00003C00003C00003C00007800007800007800007800 +00F00000F00000F00000F00001E00001E00001E00001E00003C00003C00003C00003C000078000 +0780000780000780000F8000FFF80015227DA113>73 D<00FFF807FC000F0001E0000F0001C000 +0F000100001E000200001E000400001E001000001E002000003C004000003C008000003C010000 +003C04000000780800000078180000007838000000787C000000F0BC000000F23C000000F41E00 +0000F81E000001F01F000001E00F000001E00F000001E00F800003C007800003C007800003C003 +C00003C003C000078003C000078001E000078001E000078001E0000F8001F000FFF80FFE002622 +7DA125>75 D<00FFFC00000F8000000F0000000F0000001E0000001E0000001E0000001E000000 +3C0000003C0000003C0000003C00000078000000780000007800000078000000F0000000F00000 +00F0000000F0000001E0000001E0000001E0002001E0002003C0004003C0004003C0008003C000 +8007800180078001000780030007800F000F803E00FFFFFE001B227DA11F>I<00FF000FFC000F +8001E0000F800180000FC000800013C001000013C001000011E001000011E001000021E0020000 +20F002000020F002000020F0020000407804000040780400004078040000403C040000803C0800 +00803E080000801E080000801E080001001F100001000F100001000F10000100079000020007A0 +00020007A000020003E000020003E000040003C000040001C000040001C0000C0001C0001E0000 +8000FFC000800026227DA124>78 D<0000FE0000078380000C00E0003800700070003800E00038 +01C0001C0380001C0700001C0F00001E1E00001E1C00001E3C00001E3C00001E7800001E780000 +1E7800001EF000003CF000003CF000003CF0000078F0000078E0000078E00000F0E00000F0E000 +01E0E00001C0F00003C0F00007807000070078000E0038001C001C0038000E00E0000703800001 +FC00001F2479A225>I<0001F020000E0C40001802C0003001C0006001C000E0018000C0018001 +C0018001C0018003C0010003C0010003C0000003C0000003E0000001F8000001FF000000FFE000 +007FF000001FF8000003FC0000007C0000003C0000001E0000001E0000001E0020001C0020001C +0020001C00200018006000380060003000700060007000C000C8018000C607000081FC00001B24 +7DA21B>83 D<007FF81FF8000FC007C000078003000007C002000003C004000003C008000003E0 +10000001E030000001E020000001F040000000F080000000F100000000FA000000007C00000000 +7C000000007C000000003C000000003C000000007E000000009E000000011E000000031F000000 +060F000000040F000000080F80000010078000002007C000004007C00000C003C000018003E000 +010001E000070001E0001F0003F000FFC01FFE0025227EA124>88 D<00C001E001C001C0000000 +000000000000000000000000001C002300430043008700870087000E000E001C001C001C003800 +38003840708070807080710032001C000B217BA00F>105 D<0000E00001E00001E00000C00000 +00000000000000000000000000000000000000000000001E000023000043800083800083800103 +80010380000700000700000700000700000E00000E00000E00000E00001C00001C00001C00001C +0000380000380000380000380000700000700000700070E000F0C000F180006300003C0000132B +82A00F>I<00F0000FE00000E00000E00000E00001C00001C00001C00001C00003800003800003 +80000380000700000701E0070210070C700E10F00E10F00E20600E40001D80001E00001FC0001C +7000383800383800381C00381C20703840703840703840701880E01880600F0014237DA216>I +E /Fe 1 98 df<00040000000E0000000E0000000E0000001F0000001F0000003F800000278000 +002780000043C0000043C0000043C0000081E0000081E0000101F0000100F0000100F00003FFF8 +000200780006007C0004003C0004003C000C001E000C001E003C003F00FF00FFE01B1A7F991F> +97 D E /Ff 82 128 df<001F83E000706E3000C07C780180F8780380F0780700700007007000 +07007000070070000700700007007000070070000700700007007000FFFFFFC007007000070070 +000700700007007000070070000700700007007000070070000700700007007000070070000700 +7000070070000700700007007000070070000700700007007000070078007FE3FF801D2380A21C +>11 D<001FC0000070200000C01000018038000380780007007800070030000700000007000000 +0700000007000000070000000700000007000000FFFFF800070078000700380007003800070038 +000700380007003800070038000700380007003800070038000700380007003800070038000700 +380007003800070038000700380007003800070038007FE1FF80192380A21B>I<001FD8000070 +380000C07800018078000380780007003800070038000700380007003800070038000700380007 +0038000700380007003800FFFFF800070038000700380007003800070038000700380007003800 +070038000700380007003800070038000700380007003800070038000700380007003800070038 +000700380007003800070038007FF3FF80192380A21B>I<007C000187000303800703C00601C0 +0E01E00E01E00E01E00E01E00E01E00E01C00E03800E03800E0E00FE38000E06000E03800E01C0 +0E01C00E00E00E00F00E00F00E00700E00780E00780E00780E00780E00780E00780E00700E0070 +0E70E00E70C00E7180FE1F0015237FA218>25 D<70F8F8F8F8F8F8F87070707070707070707070 +70202020202020000000000070F8F8F87005247CA30E>33 D<7038F87CFC7EFC7E743A04020402 +040204020804080410081008201040200F0F7EA218>I<00200040008001000300060004000C00 +0C00180018003000300030007000600060006000E000E000E000E000E000E000E000E000E000E0 +00E000E000E000E0006000600060007000300030003000180018000C000C000400060003000100 +0080004000200B327CA413>40 D<800040002000100018000C0004000600060003000300018001 +80018001C000C000C000C000E000E000E000E000E000E000E000E000E000E000E000E000E000E0 +00C000C000C001C0018001800180030003000600060004000C00180010002000400080000B327D +A413>I<0001800000018000000180000001800000018000000180000001800000018000000180 +0000018000000180000001800000018000000180000001800000018000FFFFFFFEFFFFFFFE0001 +800000018000000180000001800000018000000180000001800000018000000180000001800000 +01800000018000000180000001800000018000000180001F227D9C26>43 +D<70F8FCFC7404040404080810102040060F7C840E>I<FFE0FFE00B027F8B10>I<70F8F8F87005 +057C840E>I<000080000180000180000300000300000300000600000600000600000C00000C00 +000C0000180000180000180000300000300000300000600000600000600000C00000C00000C000 +0180000180000180000180000300000300000300000600000600000600000C00000C00000C0000 +180000180000180000300000300000300000600000600000600000C00000C00000C0000011317D +A418>I<01F000071C000C06001803003803803803807001C07001C07001C07001C0F001E0F001 +E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E0F001E07001 +C07001C07001C07803C03803803803801C07000C0600071C0001F00013227EA018>I<00800380 +0F80F3800380038003800380038003800380038003800380038003800380038003800380038003 +8003800380038003800380038003800380038007C0FFFE0F217CA018>I<03F0000C1C00100700 +2007804003C04003C08003E0F003E0F801E0F801E0F801E02003E00003E00003C00003C0000780 +000700000E00001C0000180000300000600000C000018000010000020020040020080020180060 +3000403FFFC07FFFC0FFFFC013217EA018>I<03F8000C1E001007002007804007C07807C07803 +C07807C03807C0000780000780000700000F00000E0000380003F000001C00000F000007800007 +800003C00003C00003E02003E07003E0F803E0F803E0F003C04003C0400780200780100F000C1C +0003F00013227EA018>I<000200000600000E00000E00001E00001E00002E00004E00004E0000 +8E00008E00010E00020E00020E00040E00040E00080E00100E00100E00200E00200E00400E0080 +0E00FFFFF8000E00000E00000E00000E00000E00000E00000E00001F0001FFF015217FA018>I< +1000801E07001FFF001FFE001FF80013E00010000010000010000010000010000010000010F800 +130E001407001803801003800001C00001C00001E00001E00001E00001E07001E0F001E0F001E0 +E001C08001C04003C04003802007001006000C1C0003F00013227EA018>I<007E0001C1000300 +800601C00E03C01C03C0180180380000380000780000700000700000F0F800F30C00F40600F403 +00F80380F801C0F001C0F001E0F001E0F001E0F001E0F001E07001E07001E07001E03801C03801 +C01803801C03000C0600070C0001F00013227EA018>I<4000006000007FFFE07FFFC07FFFC040 +0080C0010080010080020080020000040000080000080000100000300000200000600000600000 +600000E00000C00000C00001C00001C00001C00001C00003C00003C00003C00003C00003C00003 +C00003C00003C00001800013237DA118>I<01F800060E000803001001802001802000C06000C0 +6000C06000C07000C07801803E01003F02001FC4000FF80003F80003FC00067F00083F80100F80 +3007C06001C06000E0C000E0C00060C00060C00060C000606000406000C03000801803000E0E00 +03F00013227EA018>I<01F000060C000C0600180700380380700380700380F001C0F001C0F001 +C0F001E0F001E0F001E0F001E0F001E07001E07003E03803E01805E00C05E00619E003E1E00001 +C00001C00001C0000380000380300300780700780600700C002018001030000FC00013227EA018 +>I<70F8F8F870000000000000000000000070F8F8F87005157C940E>I<70F8F8F8700000000000 +00000000000070F8F8F87808080808101010204040051F7C940E>I<FFFFFFFEFFFFFFFE000000 +0000000000000000000000000000000000000000000000000000000000FFFFFFFEFFFFFFFE1F0C +7D9126>61 D<07E01838201C400E800FF00FF00FF00F000F000E001C00380030006000C000C000 +800080018001000100010001000100010000000000000000000000038007C007C007C003801023 +7DA217>63 D<0001800000018000000180000003C0000003C0000003C0000005E0000005E00000 +0DF0000008F0000008F0000010F800001078000010780000203C0000203C0000203C0000401E00 +00401E0000401E0000800F0000800F0000FFFF000100078001000780030007C0020003C0020003 +C0040003E0040001E0040001E00C0000F00C0000F03E0001F8FF800FFF20237EA225>65 +D<FFFFF8000F800E0007800780078003C0078003E0078001E0078001F0078001F0078001F00780 +01F0078001F0078001E0078003E0078007C007800F8007803E0007FFFE0007800780078003C007 +8001E0078001F0078000F0078000F8078000F8078000F8078000F8078000F8078000F8078001F0 +078001F0078003E0078007C00F800F00FFFFFC001D227EA123>I<0007E0100038183000E00630 +01C00170038000F0070000F00E0000701E0000701C0000303C0000303C0000307C000010780000 +1078000010F8000000F8000000F8000000F8000000F8000000F8000000F8000000F80000007800 +0000780000107C0000103C0000103C0000101C0000201E0000200E000040070000400380008001 +C0010000E0020000381C000007E0001C247DA223>I<FFFFF0000F801E0007800700078003C007 +8001C0078000E0078000F007800078078000780780007C0780003C0780003C0780003C0780003E +0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780003E0780003C078000 +3C0780007C0780007807800078078000F0078000E0078001E0078003C0078007000F801E00FFFF +F8001F227EA125>I<FFFFFFC00F8007C0078001C0078000C00780004007800040078000600780 +0020078000200780002007802020078020000780200007802000078060000780E00007FFE00007 +80E000078060000780200007802000078020000780200807800008078000080780001007800010 +07800010078000300780003007800070078000E00F8003E0FFFFFFE01D227EA121>I<FFFFFFC0 +0F8007C0078001C0078000C0078000400780004007800060078000200780002007800020078020 +20078020000780200007802000078060000780E00007FFE0000780E00007806000078020000780 +200007802000078020000780000007800000078000000780000007800000078000000780000007 +800000078000000FC00000FFFE00001B227EA120>I<0007F008003C0C1800E0021801C001B803 +8000F8070000780F0000381E0000381E0000183C0000183C0000187C0000087800000878000008 +F8000000F8000000F8000000F8000000F8000000F8000000F8000000F8001FFF780000F8780000 +787C0000783C0000783C0000781E0000781E0000780F00007807000078038000B801C000B800E0 +0318003C0C080007F00020247DA226>I<FFFC3FFF0FC003F0078001E0078001E0078001E00780 +01E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E007 +8001E007FFFFE0078001E0078001E0078001E0078001E0078001E0078001E0078001E0078001E0 +078001E0078001E0078001E0078001E0078001E0078001E0078001E00FC003F0FFFC3FFF20227E +A125>I<FFFC0FC007800780078007800780078007800780078007800780078007800780078007 +80078007800780078007800780078007800780078007800780078007800FC0FFFC0E227EA112> +I<03FFF0001F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F +00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F +00700F00F80F00F80F00F80E00F01E00401C0020380018700007C00014237EA119>I<FFFC03FF +000FC000F800078000600007800040000780008000078001000007800200000780040000078008 +0000078010000007802000000780400000078080000007818000000783C000000787E000000789 +E000000788F000000790F0000007A078000007C03C000007803C000007801E000007800F000007 +800F00000780078000078007C000078003C000078001E000078001E000078000F000078000F800 +0FC000FC00FFFC07FF8021227EA126>I<FFFE00000FC000000780000007800000078000000780 +000007800000078000000780000007800000078000000780000007800000078000000780000007 +800000078000000780000007800000078000000780000007800000078000800780008007800080 +07800080078001800780018007800100078003000780030007800F000F803F00FFFFFF0019227E +A11E>I<FFC00003FF0FC00003F007C00003E005E00005E005E00005E004F00009E004F00009E0 +04F00009E004780011E004780011E004780011E0043C0021E0043C0021E0043C0021E0041E0041 +E0041E0041E0040F0081E0040F0081E0040F0081E004078101E004078101E004078101E00403C2 +01E00403C201E00401E401E00401E401E00401E401E00400F801E00400F801E00400F801E00400 +7001E00E007001E01F007003F0FFE0203FFF28227EA12D>I<FF8007FF07C000F807C0007005E0 +002004F0002004F0002004780020047C0020043C0020041E0020041F0020040F00200407802004 +0780200403C0200401E0200401E0200400F0200400F8200400782004003C2004003E2004001E20 +04000F2004000F20040007A0040003E0040003E0040001E0040001E0040000E00E0000601F0000 +60FFE0002020227EA125>I<FFFFF0000F803C0007800F0007800780078007C0078003C0078003 +E0078003E0078003E0078003E0078003E0078003E0078003C0078007C00780078007800F000780 +3C0007FFF000078000000780000007800000078000000780000007800000078000000780000007 +80000007800000078000000780000007800000078000000FC00000FFFC00001B227EA121>80 +D<000FE00000783C0000E00E0003C00780078003C00F0001E00E0000E01E0000F03E0000F83C00 +00787C00007C7C00007C7800003C7800003CF800003EF800003EF800003EF800003EF800003EF8 +00003EF800003EF800003EF800003E7800003C7C00007C7C00007C3C0000783C0000781E0380F0 +0E0420E00F0801E0078813C003C8178000E80E00007C3C02000FEC0200000C0200000C0200000E +0600000F0E000007FC000007FC000007F8000003F8000001E01F2D7DA226>I<FFFFE000000F80 +3C000007800E00000780078000078007C000078003C000078003E000078003E000078003E00007 +8003E000078003E000078003C000078007C000078007800007800E000007803C000007FFE00000 +0780700000078038000007801C000007801E000007800E000007800F000007800F000007800F00 +0007800F000007800F800007800F800007800F800007800F808007800FC080078007C0800FC003 +C100FFFC01E2000000007C0021237EA124>I<03F0200C0C601802603001E07000E0600060E000 +60E00060E00020E00020E00020F00000F000007800007F00003FF0001FFE000FFF0003FF80003F +C00007E00001E00000F00000F0000070800070800070800070800070C00060C00060E000C0F000 +C0C80180C6070081FC0014247DA21B>I<7FFFFFF8780780786007801840078008400780084007 +8008C007800C800780048007800480078004800780040007800000078000000780000007800000 +078000000780000007800000078000000780000007800000078000000780000007800000078000 +00078000000780000007800000078000000780000007800000078000000FC00003FFFF001E227E +A123>I<FFFC07FF0FC000F8078000700780002007800020078000200780002007800020078000 +200780002007800020078000200780002007800020078000200780002007800020078000200780 +0020078000200780002007800020078000200780002007800020078000200380004003C0004003 +C0004001C0008000E000800060010000300600001C08000003F00020237EA125>I<FFF0007FC0 +1F80001F000F00000C000780000C000780000800078000080003C000100003C000100003E00030 +0001E000200001E000200000F000400000F000400000F000400000780080000078008000007C01 +8000003C010000003C010000001E020000001E020000001F020000000F040000000F040000000F +8C0000000788000000078800000003D000000003D000000003F000000001E000000001E0000000 +00C000000000C000000000C0000022237FA125>I<FFF03FFC03FE1F8007E000F80F0003C00070 +0F0003C000200F0003C00020078001E00040078001E00040078001E0004003C002F0008003C002 +F0008003C002F0008001E00478010001E00478010001E00478010000F0083C020000F0083C0200 +00F0083C020000F8183E06000078101E04000078101E0400007C101E0400003C200F0800003C20 +0F0800003C200F0800001E40079000001E40079000001E40079000000F8003E000000F8003E000 +000F8003E00000070001C00000070001C00000070001C0000003000180000002000080002F237F +A132>I<7FF807FF0007E001F80003C000E00003E000C00001E000800000F001000000F8030000 +0078020000007C040000003E0C0000001E080000001F100000000FB000000007A000000007C000 +000003E000000001E000000001F000000003F80000000278000000047C0000000C3E000000081E +000000101F000000300F80000020078000004007C00000C003E000008001E000010001F0000300 +00F000070000F8001F8001FC00FFE007FFC022227FA125>I<7FFFFE7E003E78003C7000786000 +784000F0C000F0C001E08003C08003C0800780000780000F00001F00001E00003C00003C000078 +0000780000F00001F00001E00103C00103C0010780010780030F00031E00021E00023C00063C00 +0E78001EF8007EFFFFFE18227DA11E>90 D<FEFEC0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0 +C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0C0FEFE07317BA40E>I<08041008 +20102010402040208040804080408040B85CFC7EFC7E7C3E381C0F0F7AA218>I<FEFE06060606 +060606060606060606060606060606060606060606060606060606060606060606060606060606 +0606FEFE07317FA40E>I<0FE0001838003C0C003C0E0018070000070000070000070000FF0007 +C7001E07003C0700780700700700F00708F00708F00708F00F087817083C23900FC1E015157E94 +18>97 D<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E00 +000E00000E00000E1F000E61C00E80600F00300E00380E003C0E001C0E001E0E001E0E001E0E00 +1E0E001E0E001E0E001E0E001C0E003C0E00380F00700C80600C41C0083F0017237FA21B>I<01 +FE000703000C07801C0780380300780000700000F00000F00000F00000F00000F00000F00000F0 +00007000007800403800401C00800C010007060001F80012157E9416>I<0000E0000FE00001E0 +0000E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E001F8E00704E0 +0C02E01C01E03800E07800E07000E0F000E0F000E0F000E0F000E0F000E0F000E0F000E07000E0 +7800E03800E01801E00C02E0070CF001F0FE17237EA21B>I<01FC000707000C03801C01C03801 +C07801E07000E0F000E0FFFFE0F00000F00000F00000F00000F000007000007800203800201C00 +400E008007030000FC0013157F9416>I<003C00C6018F038F030F070007000700070007000700 +070007000700FFF807000700070007000700070007000700070007000700070007000700070007 +000700070007807FF8102380A20F>I<00007001F198071E180E0E181C07001C07003C07803C07 +803C07803C07801C07001C07000E0E000F1C0019F0001000001000001800001800001FFE000FFF +C00FFFE03800F0600030400018C00018C00018C000186000306000303800E00E038003FE001521 +7F9518>I<0E0000FE00001E00000E00000E00000E00000E00000E00000E00000E00000E00000E +00000E00000E00000E1F800E60C00E80E00F00700F00700E00700E00700E00700E00700E00700E +00700E00700E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF18237FA21B>I< +1C001E003E001E001C00000000000000000000000000000000000E00FE001E000E000E000E000E +000E000E000E000E000E000E000E000E000E000E000E000E000E00FFC00A227FA10E>I<01C003 +E003E003E001C00000000000000000000000000000000001E00FE001E000E000E000E000E000E0 +00E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E060E0F0 +C0F18061803E000B2C82A10F>I<0E0000FE00001E00000E00000E00000E00000E00000E00000E +00000E00000E00000E00000E00000E00000E03FC0E01F00E01C00E01800E02000E04000E08000E +10000E38000EF8000F1C000E1E000E0E000E07000E07800E03C00E01C00E01E00E00F00E00F8FF +E3FE17237FA21A>I<0E00FE001E000E000E000E000E000E000E000E000E000E000E000E000E00 +0E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00FF +E00B237FA20E>I<0E1FC07F00FE60E183801E807201C00F003C00E00F003C00E00E003800E00E +003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E00E003800E0 +0E003800E00E003800E00E003800E00E003800E00E003800E00E003800E0FFE3FF8FFE27157F94 +2A>I<0E1F80FE60C01E80E00F00700F00700E00700E00700E00700E00700E00700E00700E0070 +0E00700E00700E00700E00700E00700E00700E00700E0070FFE7FF18157F941B>I<01FC000707 +000C01801800C03800E0700070700070F00078F00078F00078F00078F00078F00078F000787000 +707800F03800E01C01C00E038007070001FC0015157F9418>I<0E1F00FE61C00E80600F00700E +00380E003C0E001C0E001E0E001E0E001E0E001E0E001E0E001E0E001E0E003C0E003C0E00380F +00700E80E00E41C00E3F000E00000E00000E00000E00000E00000E00000E00000E00000E0000FF +E000171F7F941B>I<0E3CFE461E8F0F0F0F060F000E000E000E000E000E000E000E000E000E00 +0E000E000E000E000F00FFF010157F9413>114 D<0F8830786018C018C008C008E008F0007F80 +3FE00FF001F8003C801C800C800CC00CC008E018D0308FC00E157E9413>I<0200020002000200 +0600060006000E001E003E00FFF80E000E000E000E000E000E000E000E000E000E000E000E040E +040E040E040E040E040708030801F00E1F7F9E13>I<0E0070FE07F01E00F00E00700E00700E00 +700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E00F00E00F00601 +7003827800FC7F18157F941B>I<FFC1FE1E00780E00300E00200E002007004007004003808003 +808003808001C10001C10000E20000E20000E20000740000740000380000380000380000100017 +157F941A>I<FF8FF8FF1E01E03C1C01C0180E01C0180E01E0100E01E010070260200702702007 +02702003843040038438400384384001C8188001C81C8001C81C8000F00D0000F00F0000F00F00 +00600600006006000060060020157F9423>I<FF83FE1F01F00E00C007008003810003830001C2 +0000E400007800007800003800003C00004E00008E000187000103800201C00401E00C00E03E01 +F0FF03FE17157F941A>I<FFC1FE1E00780E00300E00200E002007004007004003808003808003 +808001C10001C10000E20000E20000E20000740000740000380000380000380000100000100000 +2000002000002000004000F04000F08000F180004300003C0000171F7F941A>I<3FFFC0380380 +300780200700600E00401C00403C0040380000700000E00001E00001C0000380400700400F0040 +0E00C01C0080380080780180700780FFFF8012157F9416>I<FFFFFE1701808C18>I<FFFFFFFFFF +FF3001808C31>I<7070F8F8F8F8F8F870700D057BA118>127 D E /Fg 21 +123 df<00E0000001900000030800000308000007080000070800000708000007080000071000 +0007100000072000000740000003C03FE003800F00038006000380040005C0040009C0080010E0 +100030E010006070200060702000E0384000E03C4000E01C8000E00F0020E00700207007804030 +09C0401830E18007C03E001B1F7E9D20>38 D<000600000006000000060000000F0000000F0000 +000F00000017800000178000001780000023C0000023C0000023C0000041E0000041E0000041E0 +000080F0000080F0000180F8000100780001FFF80003007C0002003C0002003C0006003E000400 +1E0004001E000C001F001E001F00FF80FFF01C1D7F9C1F>65 D<FFF00F000F000F000F000F000F +000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F000F00 +0F00FFF00C1C7F9B0F>73 D<FF8000FF800F8000F8000F8000F8000BC00178000BC00178000BC0 +01780009E002780009E002780008F004780008F004780008F00478000878087800087808780008 +78087800083C107800083C107800083C107800081E207800081E207800081E207800080F407800 +080F40780008078078000807807800080780780008030078001C03007800FF8307FF80211C7E9B +26>77 D<FF007FC00F800E000F8004000BC0040009E0040009E0040008F0040008F80400087804 +00083C0400083C0400081E0400080F0400080F0400080784000807C4000803C4000801E4000801 +E4000800F40008007C0008007C0008003C0008003C0008001C0008000C001C000C00FF8004001A +1C7E9B1F>I<7FFFFFC0700F01C0600F00C0400F0040400F0040C00F0020800F0020800F002080 +0F0020000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000 +000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000001F800003FFFC +001B1C7F9B1E>84 D<FFF07FC00F000E000F0004000F0004000F0004000F0004000F0004000F00 +04000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F0004000F +0004000F0004000F0004000F0004000F0004000700080007800800038010000180100000C02000 +0070C000001F00001A1D7E9B1F>I<7FF0FFC00FC03E000780180003C0180003E0100001E02000 +01F0600000F0400000788000007D8000003D0000001E0000001F0000000F0000000F8000000F80 +000013C0000023E0000021E0000041F00000C0F8000080780001007C0003003C0002001E000600 +1F001F003F80FFC0FFF01C1C7F9B1F>88 D<1FC000307000783800781C00301C00001C00001C00 +01FC000F1C00381C00701C00601C00E01C40E01C40E01C40603C40304E801F870012127E9115> +97 D<07E00C301878307870306000E000E000E000E000E000E00060007004300418080C3007C0 +0E127E9112>99 D<03E00C301818300C700E6006E006FFFEE000E000E000E00060007002300218 +040C1803E00F127F9112>101 D<FC00001C00001C00001C00001C00001C00001C00001C00001C +00001C00001C00001C7C001C87001D03001E03801C03801C03801C03801C03801C03801C03801C +03801C03801C03801C03801C03801C03801C0380FF9FF0141D7F9C17>104 +D<18003C003C0018000000000000000000000000000000FC001C001C001C001C001C001C001C00 +1C001C001C001C001C001C001C001C001C00FF80091D7F9C0C>I<FC00001C00001C00001C0000 +1C00001C00001C00001C00001C00001C00001C00001C3FC01C0F001C0C001C08001C10001C2000 +1C40001CE0001DE0001E70001C78001C38001C3C001C1C001C0E001C0F001C0F80FF9FE0131D7F +9C16>107 D<FC7C001C87001D03001E03801C03801C03801C03801C03801C03801C03801C0380 +1C03801C03801C03801C03801C03801C0380FF9FF014127F9117>110 D<03F0000E1C00180600 +300300700380600180E001C0E001C0E001C0E001C0E001C0E001C0600180700380300300180600 +0E1C0003F00012127F9115>I<FCE01D301E781E781C301C001C001C001C001C001C001C001C00 +1C001C001C001C00FFC00D127F9110>114 D<1F9030704030C010C010E010F8007F803FE00FF0 +00F880388018C018C018E010D0608FC00D127F9110>I<04000400040004000C000C001C003C00 +FFE01C001C001C001C001C001C001C001C001C001C101C101C101C101C100C100E2003C00C1A7F +9910>I<FF07E03C03801C01001C01000E02000E020007040007040007040003880003880003D8 +0001D00001D00000E00000E00000E00000400013127F9116>118 D<7FFC70386038407040F040 +E041C003C0038007000F040E041C043C0C380870087038FFF80E127F9112>122 +D E /Fh 1 122 df<0C000C000C000C000C000C00FFC0FFC00C000C000C000C000C000C000C00 +0C000C000C000C000C000C000C000C000C000C000C000A1A7E9310>121 +D E /Fi 10 121 df<3078FCFC78300606778518>46 D<1FE0003FF8007FFC00781E00300E0000 +070000070000FF0007FF001FFF007F0700780700E00700E00700E00700F00F00781F003FFFF01F +FBF007E1F014147D9318>97 D<01FE0007FF001FFF803E0780380300700000700000E00000E000 +00E00000E00000E00000E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318 +>99 D<01F00007FC001FFE003E0F00380780700380700380E001C0E001C0FFFFC0FFFFC0FFFFC0 +E000007000007001C03801C03E03C01FFF8007FF0001FC0012147D9318>101 +D<03800007C00007C00007C0000380000000000000000000000000007FC000FFC0007FC00001C0 +0001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C00001C0 +00FFFF00FFFF80FFFF00111D7C9C18>105 D<7E3E00FEFF807FFFC00FC1C00F80E00F00E00E00 +E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E07FC3FCFFE7FE7FC3 +FC1714809318>110 D<0180000380000380000380000380007FFFC0FFFFC0FFFFC00380000380 +000380000380000380000380000380000380000380000380400380E00380E00380E001C1C001FF +C000FF80003E0013197F9818>116 D<7E07E0FE0FE07E07E00E00E00E00E00E00E00E00E00E00 +E00E00E00E00E00E00E00E00E00E00E00E00E00E00E00E01E00F03E007FFFC03FFFE01FCFC1714 +809318>I<FF8FF8FF8FF8FF8FF83800E03800E03800E01C01C01C01C01C71C01CF9C01CF9C01C +D9C01CD9C00DDD800DDD800DDD800D8D800F8F800F8F8007070015147F9318>119 +D<7F8FF07F9FF07F8FF0070700078E00039E0001DC0001F80000F80000700000F00000F80001DC +00039E00038E000707000F07807F8FF0FF8FF87F8FF015147F9318>I E +/Fj 1 98 df<001800001800001800003C00003C00004E00004E00004E00008700008700018780 +0103800103800201C00201C003FFC00400E00400E00800700800701800703C0078FE01FF18177F +961C>97 D E /Fk 15 106 df<01FFFFC0001E00F0001E0078001E0038001E003C003C003C003C +003C003C003C003C003C0078007800780078007800F0007801E000F0078000FFFE0000F00F8000 +F003C001E001C001E001E001E001E001E001E003C001E003C001E003C001E003C001C0078003C0 +0780078007800F0007801E000F007800FFFFE0001E1F7D9E20>66 D<0000FE0200078186001C00 +4C0038003C0060003C00C0001C01C0001803800018070000180F0000181E0000101E0000103C00 +00003C00000078000000780000007800000078000000F0000000F0000000F0000000F0000000F0 +0000807000008070000080700001003800010038000200180004000C001800060020000381C000 +00FE00001F217A9F21>I<01FFFF80001E00E0001E0070001E0038001E001C003C001C003C000E +003C000E003C000E0078000E0078000E0078000E0078000E00F0001E00F0001E00F0001E00F000 +1E01E0003C01E0003C01E0003C01E0007803C0007003C0007003C000E003C001C0078001C00780 +038007800E0007801C000F007000FFFFC0001F1F7D9E22>I<01FFFFFE001E001C001E000C001E +0004001E0004003C0004003C0004003C0004003C00040078080800780800007808000078180000 +F0300000FFF00000F0300000F0300001E0200001E0200001E0200001E0001003C0002003C00020 +03C0004003C00040078000800780018007800100078007000F001F00FFFFFE001F1F7D9E1F>I< +0000FC040007030C001C00980030007800E0007801C000380380003003800030070000300E0000 +301E0000201E0000203C0000003C00000078000000780000007800000078000000F0000000F000 +FFF0F0000780F0000780F0000F0070000F0070000F0070000F0070001E0038001E0018003E001C +002E000E00CC000383040000FC00001E217A9F23>71 D<01FFF3FFE0001F003E00001E003C0000 +1E003C00001E003C00003C007800003C007800003C007800003C007800007800F000007800F000 +007800F000007800F00000F001E00000FFFFE00000F001E00000F001E00001E003C00001E003C0 +0001E003C00001E003C00003C007800003C007800003C007800003C007800007800F000007800F +000007800F000007800F00000F801F0000FFF1FFE000231F7D9E22>I<01FFF0001F00001E0000 +1E00001E00003C00003C00003C00003C0000780000780000780000780000F00000F00000F00000 +F00001E00001E00001E00001E00003C00003C00003C00003C0000780000780000780000780000F +8000FFF800141F7D9E12>I<01FFF800001F0000001E0000001E0000001E0000003C0000003C00 +00003C0000003C00000078000000780000007800000078000000F0000000F0000000F0000000F0 +000001E0000001E0000001E0000001E0008003C0010003C0010003C0030003C002000780060007 +80060007800C0007801C000F007800FFFFF800191F7D9E1D>76 D<01FF007FE0001F000F00001F +0004000017800400001780040000278008000023C008000023C008000023C008000041E0100000 +41E010000041F010000040F010000080F0200000807820000080782000008078200001003C4000 +01003C400001003C400001001E400002001E800002001E800002000F800002000F800004000F00 +00040007000004000700000C000700001C00020000FF80020000231F7D9E22>78 +D<01FFFF80001E00E0001E0070001E0038001E003C003C003C003C003C003C003C003C003C0078 +007800780078007800F0007800E000F003C000F00F0000FFFC0000F0000001E0000001E0000001 +E0000001E0000003C0000003C0000003C0000003C0000007800000078000000780000007800000 +0F800000FFF000001E1F7D9E1F>80 D<01FFFF00001E03C0001E00E0001E0070001E0078003C00 +78003C0078003C0078003C0078007800F0007800F0007801E0007801C000F0070000F01E0000FF +F00000F0380001E01C0001E01E0001E00E0001E00F0003C01E0003C01E0003C01E0003C01E0007 +803C0007803C0807803C0807803C100F801C10FFF00C20000007C01D207D9E21>82 +D<0007E040001C18C0003005800060038000C0038001C001800180010003800100038001000380 +01000380000003C0000003C0000003F8000001FF800001FFE000007FF000001FF0000001F80000 +00780000007800000038000000380020003800200038002000300060007000600060006000E000 +7000C000E8038000C606000081F800001A217D9F1A>I<0FFFFFF01E0780E01807802010078020 +20078020200F0020600F0020400F0020400F0020801E0040001E0000001E0000001E0000003C00 +00003C0000003C0000003C00000078000000780000007800000078000000F0000000F0000000F0 +000000F0000001E0000001E0000001E0000001E0000003E00000FFFF00001C1F789E21>I<7FFC +1FF807C003C00780010007800100078001000F0002000F0002000F0002000F0002001E0004001E +0004001E0004001E0004003C0008003C0008003C0008003C000800780010007800100078001000 +78001000F0002000F0002000F0002000F0004000F0004000700080007001000030020000380400 +000C18000007E000001D20779E22>I<00C001E001E001C000000000000000000000000000000E +003300230043804300470087000E000E000E001C001C001C003840388030807080310033001C00 +0B1F7C9E0E>105 D E /Fl 49 128 df<003F0000E0C001C0C00381E00701E00701E007000007 +0000070000070000070000070000FFFFE00700E00700E00700E00700E00700E00700E00700E007 +00E00700E00700E00700E00700E00700E00700E00700E00700E00700E00700E07FC3FE1720809F +19>12 D<00FC00018E000307000603800E03C00E03C00E03C00E03C00E03C00E03800E07000E0E +00FE38000E0E000E03000E03800E01C00E01C00E01E00E00E00E00F00E00F00E00F00E00F00E00 +F00E00F00E00F00E00E00E71E00E71C00E7380FE3E0014207F9F17>25 D<70F8FCFC7404040408 +0810102040060E7C840D>44 D<FFC0FFC00A027F8A0F>I<70F8F8F87005057C840D>I<70F8F8F8 +700000000000000000000070F8F8F87005147C930D>58 D<000100000003800000038000000380 +000007C0000007C0000007C0000009E0000009E0000009E0000010F0000010F0000010F0000020 +7800002078000020780000403C0000403C0000403C0000801E0000801E0000FFFE0001000F0001 +000F0001000F00020007800200078002000780040003C00E0003C01F0007E0FFC03FFE1F207F9F +22>65 D<FFFFE0000F80380007801E0007801F0007800F0007800F8007800F8007800F8007800F +8007800F8007800F0007801F0007801E0007803C0007FFF00007803C0007801E0007800F000780 +0F8007800780078007C0078007C0078007C0078007C0078007C00780078007800F8007800F0007 +801F000F803C00FFFFF0001A1F7E9E20>I<FFFFE0000F803C0007801E00078007000780038007 +8003C0078001E0078001E0078001F0078000F0078000F0078000F8078000F8078000F8078000F8 +078000F8078000F8078000F8078000F8078000F8078000F0078000F0078000F0078001E0078001 +E0078003C0078003800780070007800E000F803C00FFFFE0001D1F7E9E23>68 +D<FFFFFF000F800F00078003000780030007800100078001800780008007800080078000800780 +80800780800007808000078080000781800007FF80000781800007808000078080000780800007 +808000078000200780002007800020078000400780004007800040078000C0078000C007800180 +0F800F80FFFFFF801B1F7E9E1F>I<FFFFFF000F800F0007800300078003000780010007800180 +07800080078000800780008007800080078080000780800007808000078080000781800007FF80 +000781800007808000078080000780800007808000078000000780000007800000078000000780 +00000780000007800000078000000FC00000FFFE0000191F7E9E1E>I<FFFC0FC0078007800780 +078007800780078007800780078007800780078007800780078007800780078007800780078007 +8007800780078007800FC0FFFC0E1F7F9E10>73 D<FFFE000FC000078000078000078000078000 +078000078000078000078000078000078000078000078000078000078000078000078000078000 +07800007800207800207800207800207800607800407800407800C07801C0F807CFFFFFC171F7E +9E1C>76 D<FF80001FF80F80001F800780001F0005C0002F0005C0002F0005C0002F0004E0004F +0004E0004F000470008F000470008F000470008F000438010F000438010F000438010F00041C02 +0F00041C020F00041C020F00040E040F00040E040F00040E040F000407080F000407080F000407 +080F000403900F000403900F000401E00F000401E00F000401E00F000E00C00F001F00C01F80FF +E0C1FFF8251F7E9E2A>I<FF803FF807C007C007C0038005E0010005E0010004F0010004780100 +04780100043C0100043C0100041E0100040F0100040F010004078100040781000403C1000401E1 +000401E1000400F1000400F1000400790004003D0004003D0004001F0004001F0004000F000400 +0700040007000E0003001F000300FFE001001D1F7E9E22>I<FFFFE0000F80780007801C000780 +1E0007800F0007800F8007800F8007800F8007800F8007800F8007800F8007800F0007801E0007 +801C000780780007FFE00007800000078000000780000007800000078000000780000007800000 +0780000007800000078000000780000007800000078000000FC00000FFFC0000191F7E9E1F>80 +D<07E0800C1980100780300380600180600180E00180E00080E00080E00080F00000F000007800 +007F00003FF0001FFC000FFE0003FF00001F800007800003C00003C00001C08001C08001C08001 +C08001C0C00180C00380E00300F00600CE0C0081F80012217D9F19>83 D<7FFFFFE0780F01E060 +0F0060400F0020400F0020C00F0030800F0010800F0010800F0010800F0010000F0000000F0000 +000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F00 +00000F0000000F0000000F0000000F0000000F0000000F0000000F0000001F800007FFFE001C1F +7E9E21>I<FFFC3FF80FC007C00780038007800100078001000780010007800100078001000780 +010007800100078001000780010007800100078001000780010007800100078001000780010007 +8001000780010007800100078001000780010007800100038002000380020001C0020001C00400 +00E008000070180000382000000FC0001D207E9E22>I<FFF003FE1F8000F80F0000600F800060 +078000400780004003C0008003C0008003C0008001E0010001E0010001F0010000F0020000F002 +0000F806000078040000780400003C0800003C0800003C0800001E1000001E1000001F3000000F +2000000F20000007C0000007C0000007C000000380000003800000038000000100001F207F9E22 +>I<FFF07FF81FF01F800FC007C00F00078003800F00078001000F0007C00100078007C0020007 +8007C00200078007C0020003C009E0040003C009E0040003C009E0040003E010F00C0001E010F0 +080001E010F0080001F02078080000F02078100000F02078100000F0403C10000078403C200000 +78403C20000078C03E2000003C801E4000003C801E4000003C801E4000001F000F8000001F000F +8000001F000F8000001E00078000000E00070000000E00070000000C000300000004000200002C +207F9E2F>I<7FF83FF80FE00FC007C0070003C0020001E0040001F00C0000F008000078100000 +7C1000003C2000003E4000001E4000000F8000000F8000000780000003C0000007E0000005E000 +0009F0000018F8000010780000207C0000603C0000401E0000801F0001800F0001000780020007 +C0070003C01F8007E0FFE01FFE1F1F7F9E22>I<1FE000303000781800781C00300E00000E0000 +0E00000E0000FE00078E001E0E00380E00780E00F00E10F00E10F00E10F01E10781E103867200F +83C014147E9317>97 D<0E0000FE00000E00000E00000E00000E00000E00000E00000E00000E00 +000E00000E00000E3E000EC3800F01C00F00E00E00E00E00700E00700E00780E00780E00780E00 +780E00780E00780E00700E00700E00E00F00E00D01C00CC300083E0015207F9F19>I<03F80E0C +1C1E381E380C70007000F000F000F000F000F000F00070007000380138011C020E0C03F010147E +9314>I<000380003F800003800003800003800003800003800003800003800003800003800003 +8003E380061B801C0780380380380380700380700380F00380F00380F00380F00380F00380F003 +807003807003803803803807801C07800E1B8003E3F815207E9F19>I<03F0000E1C001C0E0038 +0700380700700700700380F00380F00380FFFF80F00000F00000F0000070000070000038008018 +00800C010007060001F80011147F9314>I<007C00C6018F038F07060700070007000700070007 +000700FFF007000700070007000700070007000700070007000700070007000700070007000700 +07007FF01020809F0E>I<0000E003E3300E3C301C1C30380E00780F00780F00780F00780F0078 +0F00380E001C1C001E380033E0002000002000003000003000003FFE001FFF800FFFC03001E060 +0070C00030C00030C00030C000306000603000C01C038003FC00141F7F9417>I<0E0000FE0000 +0E00000E00000E00000E00000E00000E00000E00000E00000E00000E00000E3E000E43000E8180 +0F01C00F01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0 +0E01C00E01C00E01C0FFE7FC16207F9F19>I<1C001E003E001E001C0000000000000000000000 +00000E007E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E +00FFC00A1F809E0C>I<00E001F001F001F000E0000000000000000000000000007007F000F000 +700070007000700070007000700070007000700070007000700070007000700070007000700070 +00706070F060F0C061803F000C28829E0E>I<0E0000FE00000E00000E00000E00000E00000E00 +000E00000E00000E00000E00000E00000E0FF00E03C00E03000E02000E04000E08000E10000E30 +000E70000EF8000F38000E1C000E1E000E0E000E07000E07800E03800E03C00E03E0FFCFF81520 +7F9F18>I<0E00FE000E000E000E000E000E000E000E000E000E000E000E000E000E000E000E00 +0E000E000E000E000E000E000E000E000E000E000E000E000E000E00FFE00B20809F0C>I<0E1F +01F000FE618618000E81C81C000F00F00E000F00F00E000E00E00E000E00E00E000E00E00E000E +00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E000E00E00E00 +0E00E00E000E00E00E000E00E00E00FFE7FE7FE023147F9326>I<0E3E00FE43000E81800F01C0 +0F01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0 +0E01C00E01C0FFE7FC16147F9319>I<01F800070E001C03803801C03801C07000E07000E0F000 +F0F000F0F000F0F000F0F000F0F000F07000E07000E03801C03801C01C0380070E0001F8001414 +7F9317>I<0E3E00FEC3800F01C00F00E00E00E00E00F00E00700E00780E00780E00780E00780E +00780E00780E00700E00F00E00E00F01E00F01C00EC3000E3E000E00000E00000E00000E00000E +00000E00000E00000E0000FFE000151D7F9319>I<0E78FE8C0F1E0F1E0F0C0E000E000E000E00 +0E000E000E000E000E000E000E000E000E000E00FFE00F147F9312>114 +D<1F9030704030C010C010C010E00078007F803FE00FF00070803880188018C018C018E030D060 +8F800D147E9312>I<020002000200060006000E000E003E00FFF80E000E000E000E000E000E00 +0E000E000E000E000E000E080E080E080E080E080610031001E00D1C7F9B12>I<0E01C0FE1FC0 +0E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C00E01C0 +0E01C00E03C00603C0030DC001F1FC16147F9319>I<FF83F81E01E01C00C00E00800E00800E00 +8007010007010003820003820003820001C40001C40001EC0000E80000E8000070000070000070 +0000200015147F9318>I<FF9FE1FC3C0780701C0300601C0380200E0380400E0380400E03C040 +0707C0800704C0800704E080038861000388710003C8730001D0320001D03A0000F03C0000E01C +0000E01C0000601800004008001E147F9321>I<7FC3FC0F01E00701C007018003810001C20000 +E40000EC00007800003800003C00007C00004E000087000107000303800201C00601E01E01E0FF +07FE1714809318>I<FF83F81E01E01C00C00E00800E00800E0080070100070100038200038200 +03820001C40001C40001EC0000E80000E800007000007000007000002000002000004000004000 +004000F08000F08000F100006200003C0000151D7F9318>I<3FFF380E200E201C403840784070 +00E001E001C00380078007010E011E011C0338027006700EFFFE10147F9314>I<FFFFFC160180 +8C17>I<30307878F87C787830300E057C9E17>127 D E /Fm 9 118 df<3FFFFF803FFFFF803F +803F003E007F0038007E003800FC007001FC007001F8006003F0006007F0006007E000000FC000 +001FC000001F8000003F0000007F0000007E000000FC000001FC018001F8018003F0018007F001 +8007E003800FC003801FC003001F8007003F000F007F001F007E007F00FFFFFF00FFFFFF00191F +7D9E20>90 D<07FC001FFF003F0F803F07C03F03E03F03E00C03E00003E0007FE007FBE01F03E0 +3C03E07C03E0F803E0F803E0F803E0FC05E07E0DE03FF8FE0FE07E17147F9319>97 +D<01FE0007FF800F83C01E01E03E00F07C00F07C00F8FC00F8FFFFF8FFFFF8FC0000FC0000FC00 +007C00007C00003E00181E00180F807007FFE000FF8015147F9318>101 +D<001F8000FFC001F3E003E7E003C7E007C7E007C3C007C00007C00007C00007C00007C000FFFC +00FFFC0007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C00007C0 +0007C00007C00007C00007C0003FFC003FFC0013207F9F10>I<01FC3C07FFFE0F079E1E03DE3E +03E03E03E03E03E03E03E03E03E01E03C00F07800FFF0009FC001800001800001C00001FFF800F +FFF007FFF81FFFFC3C007C70003EF0001EF0001EF0001E78003C78003C3F01F80FFFE001FF0017 +1E7F931A>I<FE0FE03F80FE1FF07FC01E70F9C3E01E407D01F01E807E01F01F807E01F01F007C +01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F007C01F01F00 +7C01F01F007C01F01F007C01F01F007C01F0FFE3FF8FFEFFE3FF8FFE27147D932C>109 +D<FE0FC0FE3FE01E61F01EC0F81E80F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00 +F81F00F81F00F81F00F81F00F81F00F8FFE3FFFFE3FF18147D931D>I<0FE63FFE701E600EE006 +E006F800FFC07FF83FFC1FFE03FE001FC007C007E007F006F81EFFFCC7F010147E9315>115 +D<FF07F8FF07F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00F81F00 +F81F00F81F00F81F01F81F01F80F06F807FCFF03F8FF18147D931D>117 +D E /Fn 23 118 df<78FCFCFCFC7806067B8511>46 D<00100000700001F0000FF000FEF000F0 +F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000 +F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000 +F00000F00000F00000F00000F00000F00001F8007FFFE07FFFE013287BA71E>49 +D<00FE0007FF800E07E01803F02001F82000F840007C40007CF8007EFC007EFC003EFC003EFC00 +3E78007E00007E00007C00007C0000F80000F80001F00001E00003C0000780000700000E00001C +0000380000700000600000C0000180020300020600040C000418000410000C3FFFFC7FFFF8FFFF +F8FFFFF817287DA71E>I<007F000003FFC0000701F0000C00F80010007C001C007C003E007E00 +3E003E003E003E001E003E000C007E0000007C0000007C00000078000000F0000000E0000001C0 +000007000000FF00000001E0000000F0000000780000003C0000003E0000001F0000001F000000 +1F8000001F8030001F8078001F80FC001F80FC001F80FC001F00F8001F0040003F0040003E0030 +007C001800F8000F01F00003FFC000007F000019297EA71E>I<007F000001FFC00007C1E0000F +0070001E0038001C003C003C001C0078001E0078001E00F8000F00F8000F00F8000F00F8000F00 +F8000F80F8000F80F8000F80F8000F8078000F8078001F803C001F803C001F801C002F800E004F +800700CF8003810F80007E0F8000000F0000000F0000000F0000001E0000001E0000001E000000 +3C001C003C003E0078003E0070003C00E0001801C0001C0780000FFE000003F8000019297EA71E +>57 D<00001800000000180000000018000000003C000000003C000000003C000000007E000000 +007E00000000FF000000009F000000009F000000011F800000010F800000010F8000000207C000 +000207C000000207C000000403E000000403E000000403E000000801F000000801F000001801F8 +00001000F800001000F800002000FC000020007C00003FFFFC00007FFFFE000040003E00004000 +3E000080001F000080001F000080001F000100000F800100000F800100000F8002000007C00700 +0007C01F80000FE0FFF000FFFFFFF000FFFF282A7EA92D>65 D<FFFFFF8000FFFFFFF00007E000 +FC0003E0007E0003E0003F0003E0001F8003E0000F8003E0000F8003E0000FC003E0000FC003E0 +000FC003E0000FC003E0000FC003E0000F8003E0001F8003E0001F0003E0003E0003E0007C0003 +E001F80003FFFFE00003E000F80003E0003E0003E0001F0003E0000F8003E00007C003E00007E0 +03E00003E003E00003F003E00003F003E00003F003E00003F003E00003F003E00003F003E00007 +E003E00007E003E0000FC003E0001F8003E0003F0007E000FE00FFFFFFF800FFFFFFE00024297E +A82A>I<FFFF81FFFFFFFF81FFFF07F0000FE003E00007C003E00007C003E00007C003E00007C0 +03E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007 +C003E00007C003E00007C003E00007C003E00007C003FFFFFFC003FFFFFFC003E00007C003E000 +07C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E0 +0007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C003E00007C007 +F0000FE0FFFF81FFFFFFFF81FFFF28297EA82D>72 D<00FE010003FF83000F81E3001E0037003C +001F0038000F007800070070000700F0000300F0000300F0000300F0000100F8000100F8000100 +FC0000007C0000007F0000003FE000001FFF00000FFFE00007FFF80003FFFC00007FFE000007FF +0000007F0000001F8000000F80000007C0000007C0800003C0800003C0800003C0800003C0C000 +03C0C0000380C0000380E0000780F0000700F8000E00EE001C00C3C07800C1FFF000803FC0001A +2B7DA921>83 D<FFFE03FFF803FFC0FFFE03FFF803FFC00FE0003F80007E0007C0001F00001800 +03E0001F0000180003E0000F8000100003E0000F8000100001F0000F8000200001F0000FC00020 +0001F0000FC000200000F8000FC000400000F80013E000400000F80013E000400000FC0013E000 +C000007C0033F0008000007C0021F0008000007E0021F0008000003E0021F8010000003E0040F8 +010000003E0040F8010000001F0040F8020000001F00807C020000001F00807C020000000F8080 +7C040000000F81003E040000000F81003E0400000007C1003E0800000007C2001F0800000007C2 +001F0800000003E2001F1000000003E4000F9000000003E4000F9000000001F4000FA000000001 +F80007E000000001F80007E000000000F80007C000000000F00003C000000000F00003C0000000 +007000038000000000600001800000000060000180000000006000018000003A2A7FA83D>87 +D<01FC00000E0780001001C0003C00E0003E00F0003E0078001C00780008007800000078000000 +780000007800007FF80003E078000F8078001F0078003E0078007C00780078007820F8007820F8 +007820F8007820F800F8207C00F8203C013C401F063FC007F80F001B1A7E991E>97 +D<07800000FF800000FF8000000F80000007800000078000000780000007800000078000000780 +00000780000007800000078000000780000007800000078000000783F000078C1C0007B0070007 +A0038007C003C0078001E0078001E0078000F0078000F0078000F8078000F8078000F8078000F8 +078000F8078000F8078000F8078000F0078000F0078001F0078001E0078001C007C003C0074007 +8007200E0006181C000407E0001D2A7FA921>I<007F8001C0700780080F003C1E007C3C007C3C +00387C0010780000F80000F80000F80000F80000F80000F80000F80000F800007800007C00003C +00043C00041E00080F001007802001C0C0007F00161A7E991B>I<007E0003C3800700E00E00F0 +1C00703C00783C003878003C78003CF8003CF8003CFFFFFCF80000F80000F80000F80000F80000 +7800007C00003C00043C00041E00080E001007002001C0C0007F00161A7E991B>101 +D<0000078001FC1840070721C00E03C1C01E03C0803C01E0003C01E0007C01F0007C01F0007C01 +F0007C01F0007C01F0003C01E0003C01E0001E03C0000E0380001707000011FC00003000000030 +00000030000000380000001C0000001FFFC0000FFFF80007FFFC001C003E0030000F0070000700 +60000380E0000380E0000380E0000380E0000380700007007000070038000E000C0018000780F0 +0000FF80001A287E9A1E>103 D<07800000FF800000FF8000000F800000078000000780000007 +800000078000000780000007800000078000000780000007800000078000000780000007800000 +0783F800078C1C0007900E0007A0070007A0078007C0078007C007800780078007800780078007 +800780078007800780078007800780078007800780078007800780078007800780078007800780 +078007800780078007800780078007800780FFFCFFFCFFFCFFFC1E2A7FA921>I<07000F801F80 +1F800F80070000000000000000000000000000000000000007807F807F800F8007800780078007 +800780078007800780078007800780078007800780078007800780078007800780FFF8FFF80D29 +7FA811>I<07800000FF800000FF8000000F800000078000000780000007800000078000000780 +00000780000007800000078000000780000007800000078000000780000007807FF007807FF007 +801F8007801C0007801800078020000780400007808000078100000782000007870000079F8000 +07A7800007C7C0000783E0000781E0000781F0000780F8000780780007807C0007803E0007801E +0007801F0007801F80FFFC7FF8FFFC7FF81D2A7FA920>107 D<0783F800FF8C1C00FF900E000F +A0070007A0078007C0078007C00780078007800780078007800780078007800780078007800780 +078007800780078007800780078007800780078007800780078007800780078007800780078007 +8007800780FFFCFFFCFFFCFFFC1E1A7F9921>110 D<0787C0FF98E0FF91F00FA1F007C1F007C0 +E007C0000780000780000780000780000780000780000780000780000780000780000780000780 +0007800007800007800007800007C000FFFE00FFFE00141A7F9917>114 +D<07F8401C06C03001C06000C06000C0E00040E00040F00040F800007E00007FF0003FFE000FFF +0003FF80003FC00007C08001E08001E0C000E0C000E0C000E0E000C0F001C0F80180C4070083F8 +00131A7E9918>I<0080000080000080000080000180000180000180000380000380000780000F +80001FFF80FFFF8007800007800007800007800007800007800007800007800007800007800007 +800007800007800007804007804007804007804007804007804007804003C08001C08000E10000 +3E0012257FA417>I<07800780FF80FF80FF80FF800F800F800780078007800780078007800780 +078007800780078007800780078007800780078007800780078007800780078007800780078007 +800780078007800780078007800F8007800F800380178001C027C000E047FC003F87FC1E1A7F99 +21>I E /Fo 1 122 df<00600000F00000F00000F00000F00000F00000F0000060000060000060 +000060000060000060000060007861E0FFFFF0FFFFF07861E00060000060000060000060000060 +0000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F00000F0 +0000F00000F00000F00000F00000F00000F00000F0000060000060000060000060000060000060 +0000600000600000600000600000600000600014377DA91B>121 D E /Fp +30 128 df<1C003E007F00FF80FF80FF807F003E001C000909798818>46 +D<0001C0000003C0000007C000001FC00000FFC000FFFFC000FFFFC000FF1FC000001FC000001F +C000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC00000 +1FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000 +001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC0 +00001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001FC000001F +C000001FC000001FC000001FC000007FF000FFFFFFF8FFFFFFF8FFFFFFF81D3879B72B>49 +D<000FF80000007FFF000001FFFFC00003F01FE000078007F0000E0003F8001C0001FC001F8001 +FE003FC000FE003FE000FF003FE000FF003FE000FF003FE000FF001FC000FF000F8000FF000200 +00FE00000001FE00000001FE00000001FC00000003F800000003F000000007E000000007C00000 +001F800000007E0000003FF80000003FFF000000001FC000000007E000000003F000000001F800 +000001FC00000000FE00000000FF00000000FF000000007F800000007F800000007FC00000007F +C00000007FC03F00007FC07F80007FC0FFC0007FC0FFC0007FC0FFC0007F80FFC0007F80FFC000 +FF80FF8000FF007F0000FF00700001FE00380001FC001C0003F8000F0007F00007E01FE00001FF +FF8000007FFF0000000FF8000022397CB72B>51 D<000000380000000038000000007800000000 +F800000000F800000001F800000003F800000007F800000007F80000000FF80000001FF8000000 +1BF800000033F800000073F800000063F8000000C3F8000001C3F800000183F800000303F80000 +0703F800000603F800000C03F800001C03F800001803F800003003F800007003F800006003F800 +00C003F80001C003F800038003F800030003F800070003F8000E0003F8000C0003F800180003F8 +00380003F800300003F800600003F800E00003F800FFFFFFFFFCFFFFFFFFFCFFFFFFFFFC000003 +F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 +03F800000003F800000003F800000007FC000003FFFFF80003FFFFF80003FFFFF826397EB82B> +I<FFFFFFFFFFFF80FFFFFFFFFFFF80FFFFFFFFFFFF8000FFC00001FF80007F8000003F80007F80 +00000FC0007F80000007C0007F80000003C0007F80000003C0007F80000001C0007F80000001C0 +007F80000000C0007F80000000C0007F80000000C0007F80000000C0007F80000000E0007F8000 +000060007F8000300060007F8000300060007F8000300060007F8000300000007F800030000000 +7F8000300000007F8000700000007F8000700000007F8000F00000007F8003F00000007FFFFFF0 +0000007FFFFFF00000007FFFFFF00000007F8003F00000007F8000F00000007F8000700000007F +8000700000007F8000300000007F8000300000007F800030000C007F800030000C007F80003000 +0C007F8000300018007F8000000018007F8000000018007F8000000018007F8000000038007F80 +00000038007F8000000030007F8000000030007F8000000070007F8000000070007F80000000F0 +007F80000000E0007F80000001E0007F80000003E0007F8000000FE0007F8000003FE000FFC000 +01FFE0FFFFFFFFFFFFC0FFFFFFFFFFFFC0FFFFFFFFFFFFC0363B7EBA3B>69 +D<FFFFFFC0FFFFFFC0FFFFFFC000FFC000007F8000007F8000007F8000007F8000007F8000007F +8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F800000 +7F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000 +007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F80 +00007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F +8000007F8000007F8000007F8000007F8000007F8000007F800000FFC000FFFFFFC0FFFFFFC0FF +FFFFC01A3B7EBA1F>73 D<FFFF800000FFFFF0FFFFC00000FFFFF0FFFFE00000FFFFF0007FE000 +0007FE00007FF0000001F800006FF8000000F0000067F800000060000063FC00000060000063FE +00000060000061FE00000060000060FF00000060000060FF800000600000607FC0000060000060 +3FC00000600000603FE00000600000601FF00000600000600FF000006000006007F80000600000 +6007FC00006000006003FC00006000006001FE00006000006001FF00006000006000FF80006000 +0060007F800060000060007FC00060000060003FE00060000060001FE00060000060000FF00060 +000060000FF800600000600007F800600000600003FC00600000600003FE00600000600001FF00 +600000600000FF006000006000007F806000006000007FC06000006000003FC06000006000001F +E06000006000001FF06000006000000FF060000060000007F860000060000007FC600000600000 +03FE60000060000001FE60000060000000FF60000060000000FFE00000600000007FE000006000 +00003FE00000600000003FE00000600000001FE00000600000000FE00000600000000FE0000060 +00000007E00000F000000003E00001F800000001E00007FE00000001E000FFFFF0000000E000FF +FFF00000006000FFFFF000000060003C3B7EBA41>78 D<000FF80060003FFF006000FFFFC0E001 +F807E1E007E000F1E00F80003BE00F00001FE01F00000FE03E000007E03E000003E07C000001E0 +7C000001E0FC000001E0FC000000E0FC000000E0FC000000E0FC00000060FE00000060FE000000 +60FF000000607F000000007F800000007FE00000003FF80000003FFF8000001FFFF800000FFFFF +800007FFFFE00003FFFFF80001FFFFFC0000FFFFFE00003FFFFF000007FFFF8000007FFFC00000 +07FFE00000007FE00000001FF00000000FF000000007F000000007F800000003F840000003F8C0 +000003F8C0000001F8C0000001F8C0000001F8E0000001F8E0000001F8E0000001F0F0000001F0 +F0000003F0F8000003E0F8000003E0FC000007C0FF00000F80FB80000F00F1F0003E00F0FE00FC +00E03FFFF800C00FFFE000C001FF8000253D7BBB30>83 D<3FFFFFFFFFFFF83FFFFFFFFFFFF83F +FFFFFFFFFFF83FE001FF8007F83F0000FF0001F87C0000FF00007C780000FF00003C780000FF00 +003C700000FF00001C700000FF00001C600000FF00000C600000FF00000C600000FF00000C6000 +00FF00000C600000FF00000CE00000FF00000EC00000FF000006C00000FF000006C00000FF0000 +06C00000FF000006000000FF000000000000FF000000000000FF000000000000FF000000000000 +FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF000000 +000000FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF +000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF00000000 +0000FF000000000000FF000000000000FF000000000000FF000000000000FF000000000000FF00 +0000000000FF000000000000FF000000000000FF000000000000FF000000000000FF0000000000 +00FF000000000000FF000000000000FF000000000003FFC00000001FFFFFFFF800001FFFFFFFF8 +00001FFFFFFFF800373B7DBA3E>I<FFFFFFC000FFFFF0FFFFFFC000FFFFF0FFFFFFC000FFFFF0 +00FFC0000007FE00007F80000001F800007F80000000F000007F800000006000007F8000000060 +00007F800000006000007F800000006000007F800000006000007F800000006000007F80000000 +6000007F800000006000007F800000006000007F800000006000007F800000006000007F800000 +006000007F800000006000007F800000006000007F800000006000007F800000006000007F8000 +00006000007F800000006000007F800000006000007F800000006000007F800000006000007F80 +0000006000007F800000006000007F800000006000007F800000006000007F800000006000007F +800000006000007F800000006000007F800000006000007F800000006000007F80000000600000 +7F800000006000007F800000006000007F800000006000007F800000006000007F800000006000 +007F800000006000007F800000006000003F80000000C000003FC0000000C000003FC0000000C0 +00001FC00000018000001FC00000018000000FE000000300000007E000000700000003F0000006 +00000001F800000C00000000FC000038000000007E000070000000003F8001E0000000001FF00F +C00000000007FFFF800000000001FFFE0000000000001FF00000003C3C7EBA41>I<7FFFFF800F +FFFF007FFFFF800FFFFF007FFFFF800FFFFF0000FFFC0001FFE000003FF000007F0000001FF000 +007C0000001FF00000380000000FF800003000000007F800006000000007FC0000E000000003FE +0000C000000003FE00018000000001FF00038000000000FF80030000000000FF80060000000000 +7FC00E00000000003FE00C00000000003FE01800000000001FF03800000000000FF83000000000 +000FF860000000000007FCE0000000000003FEC0000000000003FF80000000000001FF80000000 +000000FF00000000000000FF800000000000007FC00000000000007FC00000000000003FE00000 +000000003FF00000000000003FF00000000000006FF8000000000000E7FC000000000000C7FC00 +000000000183FE00000000000381FF00000000000301FF00000000000600FF80000000000E007F +C0000000000C007FC00000000018003FE00000000038001FE00000000030001FF0000000006000 +0FF800000000E0000FF800000000C00007FC00000001800003FE00000003800003FE0000000300 +0001FF00000006000000FF8000000E000000FF8000001E0000007FC000003E0000003FE00000FF +0000007FE00007FF800001FFF800FFFFF0000FFFFFF0FFFFF0000FFFFFF0FFFFF0000FFFFFF03C +3B7EBA41>88 D<003FC0000001FFF8000007C07E00000E001F00001E000F80001F8007C0003FC0 +03E0003FC003F0003FC003F0003FC001F0001F8001F8000F0001F800000001F800000001F80000 +0001F800000001F80000001FF8000007FFF800003FF9F80000FF01F80003F801F80007F001F800 +0FC001F8001F8001F8003F8001F8007F0001F8007F0001F8007E0001F80CFE0001F80CFE0001F8 +0CFE0001F80CFE0003F80CFE0003F80C7E0006F80C7F0006F80C3F000C7C181F80187E380FE070 +3FF003FFE01FE0007F800F8026287CA62B>97 D<01F800000000FFF800000000FFF800000000FF +F80000000007F80000000001F80000000001F80000000001F80000000001F80000000001F80000 +000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F80FF0 +000001F83FFE000001F8F01F000001F9C007C00001FB0003E00001FE0001F00001FC0000F80001 +FC00007C0001F800007E0001F800003E0001F800003F0001F800003F0001F800003F8001F80000 +1F8001F800001F8001F800001FC001F800001FC001F800001FC001F800001FC001F800001FC001 +F800001FC001F800001FC001F800001FC001F800001FC001F800001F8001F800001F8001F80000 +3F8001F800003F0001F800003F0001F800007E0001F800007C0001FC0000FC0001FC0000F80001 +F60001F00001E30003E00001E1C00FC00001C0F03F000001803FFC000000000FE000002A3D7EBB +30>I<0003FE00001FFFC0003E01F000F8003801F0003C03E000FC07C001FE0FC001FE0F8001FE +1F8001FE3F0000FC3F0000787F0000007F0000007E0000007E000000FE000000FE000000FE0000 +00FE000000FE000000FE000000FE000000FE000000FE0000007E0000007F0000007F0000003F00 +00033F0000031F8000031F8000060FC0000607C0000C03E0001801F0003000F800E0007E03C000 +1FFF000003FC0020287DA626>I<00000007E000000003FFE000000003FFE000000003FFE00000 +00001FE00000000007E00000000007E00000000007E00000000007E00000000007E00000000007 +E00000000007E00000000007E00000000007E00000000007E00000000007E00000000007E00000 +000007E00000000007E00000000007E00000000007E00000000007E0000001FC07E000000FFF87 +E000003F03C7E00000FC0067E00001F00037E00003E0001FE00007C0000FE0000FC0000FE0000F +800007E0001F800007E0003F000007E0003F000007E0007F000007E0007E000007E0007E000007 +E000FE000007E000FE000007E000FE000007E000FE000007E000FE000007E000FE000007E000FE +000007E000FE000007E000FE000007E0007E000007E0007E000007E0007F000007E0003F000007 +E0003F000007E0001F000007E0001F80000FE0000F80000FE00007C0001FE00003E0001FE00001 +F00077F80000F800E7FFC0003E0387FFC0001FFF07FFC00003FC07E0002A3D7DBB30>I<0003FC +0000001FFF0000007E07C00000F801E00001E000F00003E000780007C0007C000F80003E001F80 +003E001F00003F003F00001F003F00001F007F00001F007E00001F807E00001F80FE00001F80FE +00001F80FFFFFFFF80FFFFFFFF80FE00000000FE00000000FE00000000FE00000000FE00000000 +7E000000007E000000007F000000007F000000003F000001803F000001801F800001800F800003 +000FC000030007C000060003E0000C0001F00018000078007000003F01E000000FFF80000001FE +000021287EA626>I<00003F000001FFC00003E0E0000781F0000F83F8001F07F8003E07F8007E +07F8007E03F0007C01E000FC000000FC000000FC000000FC000000FC000000FC000000FC000000 +FC000000FC000000FC000000FC000000FC000000FC000000FC0000FFFFFC00FFFFFC00FFFFFC00 +00FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC00 +0000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC +000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000FC000000 +FC000001FE00007FFFFC007FFFFC007FFFFC001D3D7FBC1A>I<0007F001F8003FFE0FFC007C1F +1E3E00F007F03E01E003E01C03C001E00807C001F0000FC001F8000F8000F8001F8000FC001F80 +00FC001F8000FC001F8000FC001F8000FC001F8000FC001F8000FC000F8000F8000FC001F80007 +C001F00003C001E00001E003C00001F0078000037C1F0000073FFE00000607F000000600000000 +0E000000000E000000000E000000000F000000000F0000000007C000000007FFFFC00003FFFFFC +0001FFFFFF0000FFFFFF8003FFFFFFC00780003FE01F000007F03E000001F83C000000F87C0000 +00F8780000007CF80000007CF80000007CF80000007CF80000007CF80000007C7C000000F87C00 +0000F83E000001F01F000003E00F800007C003E0001F0001FC00FE00003FFFF0000007FF800027 +397EA52B>I<01F800000000FFF800000000FFF800000000FFF80000000007F80000000001F800 +00000001F80000000001F80000000001F80000000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F800 +00000001F80000000001F80000000001F80000000001F807F8000001F81FFE000001F8781F0000 +01F8E00F800001F98007C00001FB0007E00001FB0003E00001FE0003F00001FC0003F00001FC00 +03F00001FC0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F000 +01F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 +03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F000 +01F80003F00001F80003F00001F80003F00001F80003F00001F80003F00003FC0007F800FFFFF1 +FFFFE0FFFFF1FFFFE0FFFFF1FFFFE02B3C7EBB30>I<01C00003F00007F8000FF8000FF8000FF8 +0007F80003F00001C0000000000000000000000000000000000000000000000000000000000000 +0000000001F8007FF8007FF8007FF80007F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F8 +0001F80001F80001F80001F80001F80001F80001F80001F80001F80003FC00FFFFE0FFFFE0FFFF +E0133A7FB917>I<01F800000000FFF800000000FFF800000000FFF80000000007F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000 +000001F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001 +F80000000001F80000000001F80000000001F80000000001F80000000001F800FFFE0001F800FF +FE0001F800FFFE0001F8007FE00001F8003F800001F8003E000001F80038000001F80030000001 +F800E0000001F801C0000001F80300000001F80600000001F80C00000001F81800000001F83C00 +000001F87E00000001F8FF00000001FB9F00000001FF1F80000001FC0FC0000001F807C0000001 +F807E0000001F803F0000001F801F0000001F801F8000001F800FC000001F8007C000001F8007E +000001F8003F000001F8001F800001F8001F800001F8000FC00001F8000FE00003FC001FF800FF +FFF07FFF80FFFFF07FFF80FFFFF07FFF80293C7EBB2D>107 D<01F800FFF800FFF800FFF80007 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001 +F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80003 +FC00FFFFF0FFFFF0FFFFF0143C7FBB17>I<01F807F80000FFF81FFE0000FFF8781F0000FFF8E0 +0F800007F98007C00001FB0007E00001FB0003E00001FE0003F00001FC0003F00001FC0003F000 +01FC0003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 +03F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F000 +01F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F800 +03F00001F80003F00001F80003F00001F80003F00001F80003F00003FC0007F800FFFFF1FFFFE0 +FFFFF1FFFFE0FFFFF1FFFFE02B267EA530>110 D<01F80FF00000FFF83FFE0000FFF8F01F0000 +FFF9C007C00003FB0003E00001FE0001F00001FC0000F80001FC0000FC0001F800007E0001F800 +007E0001F800007F0001F800003F0001F800003F8001F800003F8001F800001F8001F800001FC0 +01F800001FC001F800001FC001F800001FC001F800001FC001F800001FC001F800001FC001F800 +001FC001F800001FC001F800001F8001F800003F8001F800003F8001F800003F0001F800007F00 +01F800007E0001F80000FC0001FC0000FC0001FC0001F80001FE0003F00001FB0007E00001F9C0 +0FC00001F8F03F000001F83FFC000001F80FE0000001F80000000001F80000000001F800000000 +01F80000000001F80000000001F80000000001F80000000001F80000000001F80000000001F800 +00000001F80000000001F80000000003FC00000000FFFFF0000000FFFFF0000000FFFFF0000000 +2A377EA530>112 D<03F00F80FFF03FE0FFF070F0FFF0C1F807F183F801F303F801F603F801F6 +01F001F6004001FC000001FC000001FC000001FC000001F8000001F8000001F8000001F8000001 +F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F80000 +01F8000001F8000001F8000001F8000001F8000001F8000001F8000003FC0000FFFFF800FFFFF8 +00FFFFF8001D267EA522>114 D<007F818003FFE3800F807F801E001F80380007803800078070 +00038070000380F0000180F0000180F0000180F8000180F8000180FE0000007F8000007FFC0000 +3FFFC0001FFFF0000FFFFC0003FFFE0001FFFF00001FFF800000FF8000001FC040000FC0C00007 +E0C00003E0E00001E0E00001E0E00001E0E00001E0F00001E0F00001C0F80003C0FC000380FC00 +0700F7000E00E3C03C00C0FFF800C03FC0001B287DA622>I<0018000000180000001800000018 +00000018000000380000003800000038000000380000007800000078000000F8000000F8000001 +F8000003F8000007F800001FFFFF00FFFFFF00FFFFFF0001F8000001F8000001F8000001F80000 +01F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F8000001F800 +0001F8000001F8000001F8000001F8000001F8018001F8018001F8018001F8018001F8018001F8 +018001F8018001F8018001F8018000F8018000F8030000FC0300007C0300003E0600001F0C0000 +0FF8000003F00019367EB421>I<01F80003F000FFF801FFF000FFF801FFF000FFF801FFF00007 +F8000FF00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 +F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001 +F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003F00001F80003 +F00001F80003F00001F80003F00001F80003F00001F80003F00001F80007F00001F80007F00001 +F80007F00000F8000FF00000F8000FF00000FC001BF000007C001BFC00003E0073FFE0001F81E3 +FFE0000FFF83FFE00001FE03F0002B277EA530>I<FFFF801FFFFFFF801FFFFFFF801FFF07FC00 +07F803F80003E003F80001C001F800018001F800018000FC00030000FC00030000FC000300007E +000600007E000600007F000E00003F000C00003F000C00001F801800001F801800001FC0380000 +0FC03000000FC030000007E060000007E060000007E060000003F0C0000003F0C0000003F9C000 +0001F980000001F980000000FF00000000FF00000000FF000000007E000000007E000000003C00 +0000003C000000003C0000000018000028267EA42D>I<3C003C7E007EFF00FFFF81FFFF81FFFF +81FFFF00FF7E007E3C003C180977B92B>127 D E /Fq 55 128 df<387CFEFEFEFEFE7C7C7C7C +7C7C7C7C38383838383838380000000000387CFEFEFE7C3807237BA211>33 +D<3803807C07C0FE0FE0FF0FF0FF0FF07F07F03B03B00300300300300700700600600600600C00 +C01C01C018018070070020020014117EA21D>I<FFFCFFFCFFFCFFFC0E047F8C13>45 +D<387CFEFEFE7C3807077C8610>I<00FE0007FFC00F83E01F01F03E00F83E00F87C007C7C007C +7C007CFC007CFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007EFC007E +FC007EFC007E7C007C7C007C7C007C3E00F83E00F81F01F00F83E007FFC000FE0017207E9F1C> +48 D<00180000780001F800FFF800FFF80001F80001F80001F80001F80001F80001F80001F800 +01F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F80001F800 +01F80001F80001F80001F80001F8007FFFE07FFFE013207C9F1C>I<03FC000FFF003C1FC07007 +E07C07F0FE03F0FE03F8FE03F8FE01F87C01F83803F80003F80003F00003F00007E00007C0000F +80001F00003E0000380000700000E01801C0180380180700180E00380FFFF01FFFF03FFFF07FFF +F0FFFFF0FFFFF015207D9F1C>I<00FE0007FFC00F07E01E03F03F03F03F81F83F81F83F81F81F +03F81F03F00003F00003E00007C0001F8001FE0001FF000007C00001F00001F80000FC0000FC3C +00FE7E00FEFF00FEFF00FEFF00FEFF00FC7E01FC7801F81E07F00FFFC001FE0017207E9F1C>I< +0000E00001E00003E00003E00007E0000FE0001FE0001FE00037E00077E000E7E001C7E00187E0 +0307E00707E00E07E00C07E01807E03807E07007E0E007E0FFFFFEFFFFFE0007E00007E00007E0 +0007E00007E00007E00007E000FFFE00FFFE17207E9F1C>I<1000201E01E01FFFC01FFF801FFF +001FFE001FF8001BC00018000018000018000018000019FC001FFF001E0FC01807E01803E00003 +F00003F00003F80003F83803F87C03F8FE03F8FE03F8FC03F0FC03F07007E03007C01C1F800FFF +0003F80015207D9F1C>I<001F8000FFE003F07007C0F00F01F81F01F83E01F83E01F87E00F07C +00007C0000FC0800FC7FC0FCFFE0FD80F0FF00F8FE007CFE007CFC007EFC007EFC007EFC007E7C +007E7C007E7C007E3C007C3E007C1E00F80F00F00783E003FFC000FF0017207E9F1C>I<600000 +7800007FFFFE7FFFFE7FFFFC7FFFF87FFFF87FFFF0E00060E000C0C00180C00300C00300000600 +000C00001C0000180000380000780000780000F00000F00000F00001F00001F00001F00003F000 +03F00003F00003F00003F00003F00003F00001E00017227DA11C>I<00FE0003FFC00703E00E00 +F01C00F01C00783C00783E00783F00783F80783FE0F01FF9E01FFFC00FFF8007FFC003FFE007FF +F01E7FF83C1FFC7807FC7801FEF000FEF0003EF0001EF0001EF0001CF8001C7800383C00381F01 +F00FFFC001FF0017207E9F1C>I<01FE0007FF800F83E01E01F03E00F07C00F87C0078FC007CFC +007CFC007CFC007EFC007EFC007EFC007E7C00FE7C00FE3E01FE1E037E0FFE7E07FC7E00207E00 +007C00007C1E007C3F00F83F00F83F00F03F01E01E03C01C0F800FFE0003F80017207E9F1C>I< +387CFEFEFE7C380000000000000000387CFEFEFE7C3807167C9510>I<07FC001FFF00380F8070 +07C0F807E0FC07E0FC07E0FC07E07807E0000FC0001F80001F00003C0000780000700000E00000 +E00000C00000C00000C00000C00000C00000C00000000000000000000000000000000001C00003 +E00007F00007F00007F00003E00001C00013237DA21A>63 D<000070000000007000000000F800 +000000F800000000F800000001FC00000001FC00000003FE00000003FE00000003FE00000006FF +000000067F0000000E7F8000000C3F8000000C3F800000183FC00000181FC00000381FE0000030 +0FE00000300FE00000600FF000006007F00000E007F80000FFFFF80000FFFFF800018001FC0001 +8001FC00038001FE00030000FE00030000FE000600007F000600007F00FFE00FFFF8FFE00FFFF8 +25227EA12A>65 D<FFFFFF8000FFFFFFF00007F003FC0007F0007E0007F0003F0007F0001F8007 +F0000FC007F00007E007F00007E007F00007F007F00003F007F00003F007F00003F007F00003F8 +07F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F00003F807F00003 +F807F00003F007F00003F007F00003F007F00007E007F00007E007F0000FC007F0001F8007F000 +3F0007F0007E0007F003FC00FFFFFFF000FFFFFF800025227EA12B>68 D<FFFFFFFCFFFFFFFC07 +F000FC07F0003C07F0001C07F0000C07F0000E07F0000E07F0000607F0180607F0180607F01806 +07F0180007F0380007F0780007FFF80007FFF80007F0780007F0380007F0180007F0180007F018 +0307F0180307F0000307F0000607F0000607F0000607F0000E07F0000E07F0001E07F0003E07F0 +01FCFFFFFFFCFFFFFFFC20227EA125>I<FFFFFFF8FFFFFFF807F001F807F0007807F0003807F0 +001807F0001C07F0001C07F0000C07F0000C07F0180C07F0180C07F0180007F0180007F0380007 +F0780007FFF80007FFF80007F0780007F0380007F0180007F0180007F0180007F0180007F00000 +07F0000007F0000007F0000007F0000007F0000007F0000007F00000FFFFE000FFFFE0001E227E +A123>I<FFFF83FFFEFFFF83FFFE07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC0 +07F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001F +C007FFFFFFC007FFFFFFC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F000 +1FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0001FC007F0 +001FC007F0001FC0FFFF83FFFEFFFF83FFFE27227EA12C>72 D<FFFFE0FFFFE003F80003F80003 +F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003 +F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003F80003 +F80003F800FFFFE0FFFFE013227FA115>I<FFFF803FFCFFFF803FFC07F000038007F000070007 +F0000E0007F000180007F000300007F000E00007F001C00007F003800007F007000007F00E0000 +07F018000007F038000007F0FC000007F1FE000007F3FE000007F77F000007FE7F800007F83F80 +0007F01FC00007F01FE00007F00FE00007F007F00007F007F80007F003F80007F001FC0007F001 +FE0007F000FF0007F0007F0007F0007F8007F0003FC0FFFF83FFFCFFFF83FFFC26227EA12C>75 +D<FFF000000FFFFFF800001FFF07F800001FE006FC000037E006FC000037E006FC000037E0067E +000067E0067E000067E0063F0000C7E0063F0000C7E0061F800187E0061F800187E0060FC00307 +E0060FC00307E0060FC00307E00607E00607E00607E00607E00603F00C07E00603F00C07E00601 +F81807E00601F81807E00601F81807E00600FC3007E00600FC3007E006007E6007E006007E6007 +E006003FC007E006003FC007E006001F8007E006001F8007E006001F8007E006000F0007E0FFF0 +0F00FFFFFFF00600FFFF30227EA135>77 D<01FC0407FF8C1F03FC3C007C7C003C78001C78001C +F8000CF8000CFC000CFC0000FF0000FFE0007FFF007FFFC03FFFF01FFFF80FFFFC03FFFE003FFE +0003FF00007F00003F00003FC0001FC0001FC0001FE0001EE0001EF0003CFC003CFF00F8C7FFE0 +80FF8018227DA11F>83 D<7FFFFFFF807FFFFFFF807E03F80F807803F807807003F803806003F8 +0180E003F801C0E003F801C0C003F800C0C003F800C0C003F800C0C003F800C00003F800000003 +F800000003F800000003F800000003F800000003F800000003F800000003F800000003F8000000 +03F800000003F800000003F800000003F800000003F800000003F800000003F800000003F80000 +0003F800000003F800000003F8000003FFFFF80003FFFFF80022227EA127>I<FFFF803FFCFFFF +803FFC07F000018007F000018007F000018007F000018007F000018007F000018007F000018007 +F000018007F000018007F000018007F000018007F000018007F000018007F000018007F0000180 +07F000018007F000018007F000018007F000018007F000018007F000018007F000018007F00001 +8007F000018003F000030003F800030001F800060000FC000E00007E001C00003F80F800000FFF +E0000001FF000026227EA12B>I<FFFF0FFFF01FFEFFFF0FFFF01FFE0FF000FF0000E007F0007F +0000C007F0007F0000C003F8007F80018003F8003F80018003FC003F80038001FC003FC0030001 +FC003FC0030000FE007FE0060000FE006FE0060000FF006FE00600007F00C7F00C00007F00C7F0 +0C00007F80C7F81C00003F8183F81800003F8183F81800001FC383FC3000001FC301FC3000001F +E301FC3000000FE600FE6000000FE600FE6000000FF600FFE0000007FC007FC0000007FC007FC0 +000003FC007F80000003F8003F80000003F8003F80000001F0001F00000001F0001F00000000F0 +001E00000000E0000E00000000E0000E000037227FA13A>87 D<7FFFC1FFF07FFFC1FFF003FC00 +0C0001FE00180000FE00380000FF007000007F806000003F80C000003FC1C000001FE38000000F +E30000000FF700000007FE00000003FC00000003FC00000001FE00000000FE00000000FF000000 +00FF80000001FFC0000001BFC00000031FE00000070FF000000E0FF000000C07F800001803FC00 +003803FC00003001FE00006000FF0000E000FF0001C0007F800180003FC0FFFC03FFFEFFFC03FF +FE27227FA12A>I<0400400E00E0180180380380300300600600600600E00E00C00C00C00C00DC +0DC0FE0FE0FF0FF0FF0FF07F07F03E03E01C01C014117AA21D>92 D<07FC001FFF803F07C03F03 +E03F01E03F01F01E01F00001F00001F0003FF003FDF01FC1F03F01F07E01F0FC01F0FC01F0FC01 +F0FC01F07E02F07E0CF81FF87F07E03F18167E951B>97 D<FF000000FF0000001F0000001F0000 +001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0F +E0001F3FF8001FF07C001F801E001F001F001F000F801F000F801F000FC01F000FC01F000FC01F +000FC01F000FC01F000FC01F000FC01F000FC01F000F801F001F801F801F001FC03E001EE07C00 +1C3FF800180FC0001A237EA21F>I<00FF8007FFE00F83F01F03F03E03F07E03F07C01E07C0000 +FC0000FC0000FC0000FC0000FC0000FC00007C00007E00007E00003E00301F00600FC0E007FF80 +00FE0014167E9519>I<0001FE000001FE0000003E0000003E0000003E0000003E0000003E0000 +003E0000003E0000003E0000003E0000003E0000003E0001FC3E0007FFBE000F81FE001F007E00 +3E003E007E003E007C003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E00FC003E +00FC003E007C003E007C003E003E007E001E00FE000F83BE0007FF3FC001FC3FC01A237EA21F> +I<00FE0007FF800F87C01E01E03E01F07C00F07C00F8FC00F8FC00F8FFFFF8FFFFF8FC0000FC00 +00FC00007C00007C00007E00003E00181F00300FC07003FFC000FF0015167E951A>I<003F8000 +FFC001E3E003C7E007C7E00F87E00F83C00F80000F80000F80000F80000F80000F8000FFFC00FF +FC000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F +80000F80000F80000F80000F80000F80007FF8007FF80013237FA211>I<03FC1E0FFF7F1F0F8F +3E07CF3C03C07C03E07C03E07C03E07C03E07C03E03C03C03E07C01F0F801FFF0013FC00300000 +3000003800003FFF801FFFF00FFFF81FFFFC3800FC70003EF0001EF0001EF0001EF0001E78003C +7C007C3F01F80FFFE001FF0018217E951C>I<FF000000FF0000001F0000001F0000001F000000 +1F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F07E0001F1FF8 +001F307C001F403C001F803E001F803E001F003E001F003E001F003E001F003E001F003E001F00 +3E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FF +E1FFC01A237EA21F>I<1C003F007F007F007F003F001C000000000000000000000000000000FF +00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 +FFE0FFE00B247EA310>I<FF000000FF0000001F0000001F0000001F0000001F0000001F000000 +1F0000001F0000001F0000001F0000001F0000001F0000001F00FF801F00FF801F0038001F0060 +001F01C0001F0380001F0700001F0E00001F1C00001F7E00001FFF00001FCF00001F0F80001F07 +C0001F03E0001F01E0001F01F0001F00F8001F007C001F003C00FFE0FFC0FFE0FFC01A237EA21E +>107 D<FF00FF001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00FFE0FFE00B237EA2 +10>I<FF07F007F000FF1FFC1FFC001F303E303E001F403E403E001F801F801F001F801F801F00 +1F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F +001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F001F00 +1F001F001F00FFE0FFE0FFE0FFE0FFE0FFE02B167E9530>I<FF07E000FF1FF8001F307C001F40 +3C001F803E001F803E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F +003E001F003E001F003E001F003E001F003E001F003E001F003E00FFE1FFC0FFE1FFC01A167E95 +1F>I<00FE0007FFC00F83E01E00F03E00F87C007C7C007C7C007CFC007EFC007EFC007EFC007E +FC007EFC007EFC007E7C007C7C007C3E00F81F01F00F83E007FFC000FE0017167E951C>I<FF0F +E000FF3FF8001FF07C001F803E001F001F001F001F801F001F801F000FC01F000FC01F000FC01F +000FC01F000FC01F000FC01F000FC01F000FC01F001F801F001F801F803F001FC03E001FE0FC00 +1F3FF8001F0FC0001F0000001F0000001F0000001F0000001F0000001F0000001F0000001F0000 +00FFE00000FFE000001A207E951F>I<FE1F00FE3FC01E67E01EC7E01E87E01E87E01F83C01F00 +001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F00001F0000FFF0 +00FFF00013167E9517>114 D<0FF3003FFF00781F00600700E00300E00300F00300FC00007FE0 +007FF8003FFE000FFF0001FF00000F80C00780C00380E00380E00380F00700FC0E00EFFC00C7F0 +0011167E9516>I<0180000180000180000180000380000380000780000780000F80003F8000FF +FF00FFFF000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F80000F +81800F81800F81800F81800F81800F830007C30003FE0000F80011207F9F16>I<FF01FE00FF01 +FE001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F003E001F +003E001F003E001F003E001F003E001F003E001F003E001F007E001F00FE000F81BE0007FF3FC0 +01FC3FC01A167E951F>I<FFE01FE0FFE01FE00F8006000F8006000FC00E0007C00C0007E01C00 +03E0180003E0180001F0300001F0300000F8600000F86000007CC000007CC000007FC000003F80 +00003F8000001F0000001F0000000E0000000E00001B167F951E>I<FFE7FF07F8FFE7FF07F81F +007800C00F807801800F807C01800F807C018007C07E030007C0DE030007E0DE070003E0DF0600 +03E18F060001F18F0C0001F38F8C0001FB079C0000FB07D80000FE03D800007E03F000007E03F0 +00007C01F000003C01E000003800E000001800C00025167F9528>I<FFE07FC0FFE07FC00F801C +0007C0380003E0700003F0600001F8C00000F98000007F8000003F0000001F0000001F8000003F +C0000037C0000063E00000C1F00001C0F8000380FC0007007E000E003E00FF80FFE0FF80FFE01B +167F951E>I<7FFFF07FFFF07C03E07007C0600FC0E01F80C01F00C03E00C07E0000FC0000F800 +01F00003F03007E03007C0300F80701F80703F00603E00E07C03E0FFFFE0FFFFE014167E9519> +122 D<FFFFFFFFFFFFFEFFFFFFFFFFFFFE3702808E38>124 D<380E007C1F00FE3F80FE3F80FE +3F807C1F00380E0011077BA31C>127 D E /Fr 54 128 df<1F003F807FC0FFE0FFE0FFE0FFE0 +FFE0FFE07FC07FC07FC07FC07FC07FC03F803F803F803F803F803F803F801F001F001F001F001F +001F001F000E000E000E000E000000000000000000000000000E003F807FC07FC0FFE0FFE0FFE0 +7FC07FC03F800E000B3279B119>33 D<1F0007C03F800FE07FC01FF0FFE03FF8FFE03FF8FFF03F +FCFFF03FFCFFF03FFC7FF01FFC3FF00FFC1F7007DC0070001C0070001C00E0003800E0003800E0 +003801C0007001C00070038000E0038000E0070001C00E0003801C00070038000E00100004001E +197DB12B>I<FFFFF0FFFFF0FFFFF0FFFFF0FFFFF0FFFFF0FFFFF014077F921B>45 +D<000FFC0000007FFF800001FFFFE00003FC0FF00007F003F8000FE001FC000FE001FC001FC000 +FE003FC000FF003FC000FF003F80007F007F80007F807F80007F807F80007F807F80007F80FF80 +007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF +80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0FF80007FC0 +7F80007F807F80007F807F80007F807F80007F803F80007F003FC000FF003FC000FF001FC000FE +001FE001FE000FE001FC0007F807F80003FC0FF00001FFFFE000007FFF8000000FFC0000222E7D +AD29>48 D<0001E0000003E000000FE000007FE0001FFFE000FFFFE000FFBFE000E03FE000003F +E000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE00000 +3FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000 +003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE000003FE0 +00003FE000003FE000003FE000003FE000003FE0007FFFFFF07FFFFFF07FFFFFF01C2E7AAD29> +I<003FF00001FFFE0007FFFF800FC07FE01E001FF03C000FF87F0007FC7F8007FEFFC007FEFFC0 +03FEFFC003FFFFC003FF7F8003FF7F8003FF3F0003FF000003FF000003FE000003FE000007FC00 +0007FC00000FF800000FF000001FE000001FC000003F8000007F000000FE000001F8000001F000 +0003E00000078007000F0007001E0007003C000F0078000E00F0000E01C0001E03FFFFFE07FFFF +FE0FFFFFFE1FFFFFFE3FFFFFFE7FFFFFFCFFFFFFFCFFFFFFFCFFFFFFFC202E7CAD29>I<000FFC +0000007FFF800001F01FE00003C00FF000070007F8000FE007FC000FF007FC001FF007FE001FF8 +07FE001FF807FE001FF807FE001FF807FE000FF007FC0007E007FC00018007FC0000000FF80000 +000FF00000001FE00000001FC00000007F8000001FFE0000001FFC0000001FFF800000001FF000 +000007F800000003FC00000003FE00000003FF00000001FF80000001FF800E0001FFC03F8001FF +C07FC001FFC07FC001FFC0FFE001FFC0FFE001FFC0FFE001FF80FFE001FF80FFC003FF007F8003 +FF003F0003FE001F0007FC000FE01FF80007FFFFE00001FFFF8000001FFC0000222E7DAD29>I< +0000007800000000F800000001F800000003F800000007F800000007F80000000FF80000001FF8 +0000003FF80000007FF800000077F8000000F7F8000001E7F8000003C7F800000787F800000707 +F800000F07F800001E07F800003C07F800007807F800007007F80000F007F80001E007F80003C0 +07F800078007F8000F0007F8000F0007F8001E0007F8003C0007F800780007F800F00007F800FF +FFFFFFF0FFFFFFFFF0FFFFFFFFF000000FF80000000FF80000000FF80000000FF80000000FF800 +00000FF80000000FF80000000FF80000000FF800000FFFFFF0000FFFFFF0000FFFFFF0242E7EAD +29>I<0C0000380FC003F80FFFFFF80FFFFFF00FFFFFE00FFFFFC00FFFFF800FFFFE000FFFFC00 +0FFFF0000FFF00000F0000000F0000000F0000000F0000000F0000000F0000000F0000000F0FF8 +000F7FFF000FFFFFC00FF01FE00F800FF00F0007F80E0007FC000003FC000003FE000003FE0000 +03FF000003FF1E0003FF3F0003FF7F8003FFFF8003FFFFC003FFFFC003FEFF8003FEFF8003FE7F +0007FC7C0007F83C000FF01E001FE00FC07FC007FFFF8001FFFE00003FE000202E7CAD29>I<00 +007F80000007FFF000001FC07800007F001C0000FC001E0001F8007E0003F800FF0007F001FF00 +0FF001FF000FE001FF001FE001FF003FE000FE003FE0007C003FC00000007FC00000007FC00000 +007FC0000000FFC3FF8000FFC7FFE000FFCFBFF000FFDC03F800FFF801FC00FFF001FE00FFF000 +FF00FFE000FF80FFE000FF80FFE000FF80FFC000FFC0FFC000FFC0FFC000FFC07FC000FFC07FC0 +00FFC07FC000FFC07FC000FFC03FC000FFC03FC000FF803FC000FF801FE000FF801FE000FF000F +E001FE0007F001FC0003F803F80001FC0FF00000FFFFE000003FFF80000007FC0000222E7DAD29 +>I<38000000003E000000003FFFFFFFC03FFFFFFFC03FFFFFFFC03FFFFFFF807FFFFFFF007FFF +FFFE007FFFFFFC007FFFFFF8007FFFFFF000780001F000700003E000700007C000F0000F8000E0 +000F0000E0001E0000E0003E000000007C00000000F800000000F800000001F000000001F00000 +0003F000000003E000000007E000000007E00000000FE00000000FE00000001FC00000001FC000 +00001FC00000003FC00000003FC00000003FC00000003FC00000003FC00000007FC00000007FC0 +0000007FC00000007FC00000007FC00000007FC00000007FC00000007FC00000003F800000003F +800000000E00000022307BAF29>I<0007FC0000003FFF800000F80FE00001E003F00003C001F8 +00078000FC000F8000FC000F80007E000F80007E001F80007E001FC0007E001FC0007E001FE000 +7E001FF800FC001FFE00FC000FFF81F8000FFFE1F0000FFFF7E00007FFFFC00003FFFF800001FF +FFC00000FFFFE000007FFFF80001FFFFFC0003F7FFFE000FE1FFFF001F807FFF003F003FFF803F +000FFF807E0003FFC07E0000FFC0FC00007FC0FC00001FC0FC00001FC0FC00000FC0FC00000FC0 +FC00000F807E00000F807E00000F007F00001F003F00001E001FC0007C000FF803F80003FFFFE0 +0000FFFF8000001FFC0000222E7DAD29>I<000FFC0000007FFF000001FC0FC00003F003E00007 +E003F0000FE001F8001FE001FC003FC001FE007FC000FE007FC000FF00FFC000FF00FFC000FF80 +FFC000FF80FFC000FF80FFC000FF80FFC000FFC0FFC000FFC0FFC000FFC0FFC000FFC07FC001FF +C07FC001FFC03FC001FFC03FC003FFC01FE003FFC00FE007FFC007F00EFFC003FF7CFFC001FFF8 +FFC0007FF0FF80000000FF80000000FF80000000FF80000000FF000F8001FF001FC001FF003FE0 +01FE003FE001FC003FE003FC003FE003F8003FC007F0001F800FE0001E001FC0000F807F800007 +FFFE000001FFF80000007FC00000222E7DAD29>I<1F003F807FC0FFE0FFE0FFE0FFE0FFE07FC0 +3F801F0000000000000000000000000000000000000000001F003F807FC0FFE0FFE0FFE0FFE0FF +E07FC03F801F000B207A9F17>I<00FFE00003FFFC000FFFFF001F007F803C003FC07E001FE07F +001FE0FF801FF0FF801FF0FF801FF0FF801FF07F001FF03E003FE01C003FC000007F800000FF00 +0001FE000001F8000003F0000007E0000007C000000F8000000F0000000E0000000E0000001E00 +00001C0000001C0000001C0000001C0000001C0000001C0000001C000000000000000000000000 +0000000000000000000000000000001C0000007F000000FF800000FF800001FFC00001FFC00001 +FFC00000FF800000FF8000007F0000001C00001C327BB127>63 D<0000007C0000000000007C00 +0000000000FE000000000000FE000000000000FE000000000001FF000000000001FF0000000000 +03FF800000000003FF800000000007FFC00000000007FFC00000000007FFC0000000000FFFE000 +0000000F7FE0000000001F7FF0000000001E3FF0000000001E3FF0000000003E3FF8000000003C +1FF8000000007C1FFC00000000780FFC00000000780FFC00000000F80FFE00000000F007FE0000 +0001F007FF00000001E003FF00000001E003FF00000003E003FF80000003C001FF80000007C001 +FFC00000078000FFC00000078000FFC000000FFFFFFFE000000FFFFFFFE000001FFFFFFFF00000 +1E00003FF000001E00003FF000003C00003FF800003C00001FF800007C00001FFC00007800000F +FC00007800000FFC0000F0000007FE0000F0000007FE0001F0000007FF0003F8000003FF00FFFF +C001FFFFFEFFFFC001FFFFFEFFFFC001FFFFFE37317DB03E>65 D<FFFFFFFFF00000FFFFFFFFFF +0000FFFFFFFFFFC00000FFC000FFF00000FFC0000FFC0000FFC00007FE0000FFC00001FF0000FF +C00000FF8000FFC000007FC000FFC000003FE000FFC000003FE000FFC000001FF000FFC000001F +F000FFC000001FF800FFC000000FF800FFC000000FFC00FFC000000FFC00FFC000000FFC00FFC0 +00000FFC00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000000FFE +00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000000FFE00FFC000 +000FFE00FFC000000FFC00FFC000000FFC00FFC000000FFC00FFC000000FFC00FFC000000FF800 +FFC000001FF800FFC000001FF800FFC000001FF000FFC000003FE000FFC000003FE000FFC00000 +7FC000FFC00000FF8000FFC00001FF0000FFC00003FE0000FFC0000FFC0000FFC0007FF000FFFF +FFFFFFE000FFFFFFFFFF0000FFFFFFFFF0000037317EB03F>68 D<FFFFFFFFFFF000FFFFFFFFFF +F000FFFFFFFFFFF00000FFC0003FF00000FFC00007F80000FFC00003F80000FFC00000F80000FF +C00000F80000FFC00000780000FFC00000780000FFC00000380000FFC00000380000FFC0000038 +0000FFC000001C0000FFC007001C0000FFC007001C0000FFC007001C0000FFC00700000000FFC0 +0700000000FFC00F00000000FFC01F00000000FFC03F00000000FFFFFF00000000FFFFFF000000 +00FFFFFF00000000FFC03F00000000FFC01F00000000FFC00F00000000FFC00700000000FFC007 +00000000FFC00700038000FFC00700038000FFC00700038000FFC00000070000FFC00000070000 +FFC00000070000FFC00000070000FFC000000F0000FFC000000F0000FFC000001E0000FFC00000 +1E0000FFC000003E0000FFC000007E0000FFC00000FE0000FFC00003FE0000FFC0001FFE00FFFF +FFFFFFFC00FFFFFFFFFFFC00FFFFFFFFFFFC0031317EB036>I<FFFFFFFFFFF0FFFFFFFFFFF0FF +FFFFFFFFF000FFC0003FF000FFC00007F800FFC00003F800FFC00000F800FFC00000F800FFC000 +007800FFC000007800FFC000003800FFC000003800FFC000003800FFC000001C00FFC000001C00 +FFC007001C00FFC007001C00FFC007000000FFC007000000FFC007000000FFC00F000000FFC01F +000000FFC03F000000FFFFFF000000FFFFFF000000FFFFFF000000FFC03F000000FFC01F000000 +FFC00F000000FFC007000000FFC007000000FFC007000000FFC007000000FFC007000000FFC000 +000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000 +FFC000000000FFC000000000FFC000000000FFC000000000FFC0000000FFFFFFF00000FFFFFFF0 +0000FFFFFFF000002E317EB034>I<FFFFFFC0FFFFFFC0FFFFFFC000FFC00000FFC00000FFC000 +00FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC0 +0000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FF +C00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000 +FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC00000FFC000 +00FFC000FFFFFFC0FFFFFFC0FFFFFFC01A317EB01F>73 D<FFFFFFC0007FFFC0FFFFFFC0007FFF +C0FFFFFFC0007FFFC000FFC0000007F00000FFC0000003C00000FFC000000F800000FFC000001F +000000FFC000003C000000FFC0000078000000FFC00001F0000000FFC00003E0000000FFC00007 +80000000FFC0000F00000000FFC0003E00000000FFC0007C00000000FFC000F000000000FFC001 +E000000000FFC007C000000000FFC00F8000000000FFC01F0000000000FFC03F8000000000FFC0 +7FC000000000FFC1FFE000000000FFC3FFF000000000FFC7FFF000000000FFCF3FF800000000FF +FE1FFC00000000FFFC0FFE00000000FFF007FE00000000FFE007FF00000000FFC003FF80000000 +FFC001FFC0000000FFC000FFE0000000FFC000FFE0000000FFC0007FF0000000FFC0003FF80000 +00FFC0001FFC000000FFC0000FFC000000FFC0000FFE000000FFC00007FF000000FFC00003FF80 +0000FFC00001FFC00000FFC00001FFC00000FFC00000FFE00000FFC000007FF00000FFC000007F +F800FFFFFFC00FFFFFE0FFFFFFC00FFFFFE0FFFFFFC00FFFFFE03B317EB041>75 +D<FFFFFFF00000FFFFFFF00000FFFFFFF0000000FFC000000000FFC000000000FFC000000000FF +C000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC00000 +0000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FF +C000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC000000000FFC00000 +0000FFC000000000FFC000000000FFC000000000FFC000000000FFC000007000FFC000007000FF +C000007000FFC00000F000FFC00000F000FFC00000E000FFC00000E000FFC00001E000FFC00001 +E000FFC00003E000FFC00003E000FFC00007E000FFC0000FE000FFC0001FE000FFC0007FC000FF +C003FFC0FFFFFFFFFFC0FFFFFFFFFFC0FFFFFFFFFFC02C317EB032>I<FFFF8000000001FFFF80 +FFFFC000000003FFFF80FFFFE000000007FFFF8000FFE000000007FF800000EFF00000000EFF80 +0000EFF00000000EFF800000EFF00000000EFF800000E7F80000001CFF800000E7F80000001CFF +800000E3FC00000038FF800000E3FC00000038FF800000E1FE00000070FF800000E1FE00000070 +FF800000E0FF000000E0FF800000E0FF000000E0FF800000E07F800001C0FF800000E07F800001 +C0FF800000E03FC0000380FF800000E03FC0000380FF800000E03FC0000380FF800000E01FE000 +0700FF800000E01FE0000700FF800000E00FF0000E00FF800000E00FF0000E00FF800000E007F8 +001C00FF800000E007F8001C00FF800000E003FC003800FF800000E003FC003800FF800000E001 +FE007000FF800000E001FE007000FF800000E000FF00E000FF800000E000FF00E000FF800000E0 +00FF00E000FF800000E0007F81C000FF800000E0007F81C000FF800000E0003FC38000FF800000 +E0003FC38000FF800000E0001FE70000FF800000E0001FE70000FF800000E0000FFE0000FF8000 +00E0000FFE0000FF800000E00007FC0000FF800000E00007FC0000FF800000E00007FC0000FF80 +0000E00003F80000FF800001F00003F80000FF8000FFFFE001F000FFFFFF80FFFFE001F000FFFF +FF80FFFFE000E000FFFFFF8049317EB04E>I<001FF0018000FFFF038003FFFFC78007F00FFF80 +0F8001FF801F00007F803F00001F803E00000F807E00000F807E00000780FE00000780FE000007 +80FE00000380FF00000380FF00000380FF80000000FFE00000007FFC0000007FFFE000007FFFFE +00003FFFFFC0001FFFFFF0001FFFFFF8000FFFFFFC0003FFFFFE0001FFFFFF00007FFFFF80001F +FFFF800000FFFFC0000007FFC0000000FFE00000003FE00000003FE00000001FE06000001FE0E0 +00000FE0E000000FE0E000000FE0E000000FC0F000000FC0F000000FC0F800001F80FC00001F80 +FF00003F00FFC0007E00FFFC01FC00F1FFFFF800E03FFFE000C007FF000023317BB02E>83 +D<3FFFFFFFFFFF003FFFFFFFFFFF003FFFFFFFFFFF003FE00FFC01FF007F000FFC003F807E000F +FC001F807C000FFC000F8078000FFC00078078000FFC00078070000FFC00038070000FFC000380 +70000FFC00038070000FFC000380E0000FFC0001C0E0000FFC0001C0E0000FFC0001C0E0000FFC +0001C000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000 +000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00 +000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0000000000 +0FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC0000 +0000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000FFC00000000000F +FC000000007FFFFFFF8000007FFFFFFF8000007FFFFFFF800032307DAF39>I<FFFFFFC003FFFF +C0FFFFFFC003FFFFC0FFFFFFC003FFFFC000FFC0000007E00000FFC0000003C00000FFC0000003 +C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC00000 +03C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC000 +0003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0 +000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FF +C0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000 +FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C00000FFC0000003C000 +00FFC0000003C000007FC00000038000007FC00000078000007FE00000078000003FE000000F00 +00003FE000000F0000001FF000001E0000000FF800003E00000007FC00007C00000003FE0001F8 +00000000FFC00FE0000000003FFFFF80000000000FFFFE000000000000FFF00000003A317EB03F +>I<FFFFFE07FFFFF801FFFFFFFFFE07FFFFF801FFFFFFFFFE07FFFFF801FFFF03FF00000FFC00 +0007E003FF80000FFC000003C001FF80000FFE0000038001FF800007FE0000038001FFC00007FE +0000078000FFC00007FF0000070000FFE00003FF00000700007FE00003FF80000E00007FE00003 +FF80000E00007FF00003FF80001E00003FF00007FFC0001C00003FF80007FFC0001C00001FF800 +07FFE0003800001FF8000E7FE0003800001FFC000E7FE0007800000FFC001E7FF0007000000FFC +001C3FF00070000007FE001C3FF000E0000007FE00381FF800E0000007FF00381FF801E0000003 +FF00781FFC01C0000003FF00700FFC01C0000003FF80700FFC03C0000001FF80F00FFE03800000 +01FFC0E007FE0380000000FFC0E007FF0700000000FFC1C003FF0700000000FFE1C003FF0F0000 +00007FE3C003FF8E000000007FE38001FF8E000000003FF38001FF9C000000003FF70000FFDC00 +0000003FFF0000FFFC000000001FFF0000FFF8000000001FFE00007FF8000000000FFE00007FF0 +000000000FFC00003FF0000000000FFC00003FF00000000007FC00003FE00000000007F800001F +E00000000007F800001FE00000000003F800001FC00000000003F000000FC00000000001F00000 +0F800000000001E0000007800000000000E000000700000050317EB055>87 +D<7FFFFF80FFFFF07FFFFF80FFFFF07FFFFF80FFFFF000FFE0000FF80000FFF00003E000007FF0 +0007C000003FF80007C000003FFC000F8000001FFC001F0000000FFE003E00000007FF003E0000 +0007FF807C00000003FF80F800000001FFC1F000000001FFE1F000000000FFE3E0000000007FF7 +C0000000007FFF80000000003FFF80000000001FFF00000000000FFE00000000000FFF00000000 +0007FF000000000003FF800000000003FFC00000000001FFC00000000003FFE00000000007FFF0 +000000000FFFF8000000000FBFF8000000001F1FFC000000003E1FFE000000007C0FFE00000000 +7C07FF00000000F803FF80000001F003FF80000003E001FFC0000003E000FFE0000007C000FFF0 +00000F80007FF000000F00003FF800001F00003FFC00003E00001FFC00007C00000FFE00007C00 +0007FF0001FE000007FF80FFFFF001FFFFFEFFFFF001FFFFFEFFFFF001FFFFFE37317DB03E>I< +0080002001C00070038000E0070001C00E0003801C0007001C00070038000E0038000E0070001C +0070001C0070001C00E0003800E0003800EF803BE0FFC03FF0FFE03FF8FFF03FFCFFF03FFCFFF0 +3FFC7FF01FFC7FF01FFC3FE00FF81FC007F00F8003E01E1977B12B>92 D<007FF8000003FFFF00 +0007FFFFC0000FE01FE0001FF007F0001FF003F8001FF003FC001FF001FE000FE001FE0007C001 +FE00010001FE00000001FE00000001FE000001FFFE00003FFFFE0001FFF1FE0007FE01FE000FF0 +01FE001FC001FE003F8001FE007F8001FE00FF0001FE00FF0001FE00FF0001FE00FF0001FE00FF +0003FE007F8003FE007FC00EFE003FF03CFF000FFFF87FF807FFF03FF800FF800FF825207E9F28 +>97 D<01F8000000FFF8000000FFF8000000FFF80000000FF800000007F800000007F800000007 +F800000007F800000007F800000007F800000007F800000007F800000007F800000007F8000000 +07F800000007F800000007F800000007F80FF00007F87FFE0007F9FFFF8007FFE03FC007FF000F +E007FE0007F007F80003F807F80003FC07F80003FC07F80001FE07F80001FE07F80001FE07F800 +01FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F8 +0001FE07F80001FE07F80001FE07F80003FC07F80003FC07FC0007F807FE0007F007F7001FE007 +E3E07FC007C1FFFF0007807FFE0007001FE00028327EB12E>I<0007FF00007FFFE000FFFFF003 +FC03F807F007FC0FE007FC1FE007FC3FC007FC3FC003F87FC001F07F8000407F800000FF800000 +FF800000FF800000FF800000FF800000FF800000FF800000FF8000007F8000007FC000007FC000 +003FC0000E3FE0000E1FE0001C0FF0001C07F8007803FF01F000FFFFE0007FFF800007FC001F20 +7D9F25>I<00000007E0000003FFE0000003FFE0000003FFE00000003FE00000001FE00000001F +E00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE00000001FE0000000 +1FE00000001FE00000001FE00000001FE0000FF81FE0007FFF1FE001FFFFDFE003FE03FFE007F8 +00FFE00FE0003FE01FE0001FE03FC0001FE03FC0001FE07F80001FE07F80001FE07F80001FE0FF +80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0FF80001FE0 +7F80001FE07F80001FE07F80001FE03FC0001FE03FC0001FE01FC0003FE00FE0007FE007F001FF +E003FC07DFF001FFFF9FFF007FFE1FFF000FF01FFF28327DB12E>I<0007FC0000003FFF800000 +FFFFE00003FC07F00007F801F8000FE000FC001FE0007E003FC0007E003FC0003F007FC0003F00 +7F80003F007F80003F80FF80003F80FF80003F80FFFFFFFF80FFFFFFFF80FFFFFFFF80FF800000 +00FF80000000FF800000007F800000007F800000003FC00000003FC00003801FC00003801FE000 +07800FF0000F0007F8001E0003FE00FC0000FFFFF800003FFFE0000003FF000021207E9F26>I< +0000FF000007FFC0001FFFE0003FC7F0007F0FF800FE0FF801FE0FF801FC0FF803FC07F003FC03 +E003FC01C003FC000003FC000003FC000003FC000003FC000003FC000003FC0000FFFFF800FFFF +F800FFFFF80003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003 +FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC0000 +03FC000003FC000003FC000003FC000003FC000003FC000003FC000003FC00007FFFF0007FFFF0 +007FFFF0001D327EB119>I<001FF007E000FFFE3FF001FFFF7FF807F83FF1F80FE00FE1F80FE0 +0FE0F01FC007F0601FC007F0003FC007F8003FC007F8003FC007F8003FC007F8003FC007F8001F +C007F0001FC007F0000FE00FE0000FE00FE00007F83FC00007FFFF000006FFFE00000E1FF00000 +0E000000001E000000001E000000001F000000001F800000001FFFFFC0000FFFFFF8000FFFFFFE +0007FFFFFF0003FFFFFF8007FFFFFFC01FFFFFFFE03F00007FE07E00000FF0FC000007F0FC0000 +03F0FC000003F0FC000003F0FC000003F07E000007E03F00000FC01FC0003F800FF801FF0007FF +FFFE0000FFFFF000001FFF8000252F7E9F29>I<01F800000000FFF800000000FFF800000000FF +F8000000000FF80000000007F80000000007F80000000007F80000000007F80000000007F80000 +000007F80000000007F80000000007F80000000007F80000000007F80000000007F80000000007 +F80000000007F80000000007F807F8000007F83FFF000007F87FFF800007F8F03FC00007F9C01F +E00007FB000FE00007FE000FF00007FE000FF00007FC000FF00007FC000FF00007F8000FF00007 +F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000F +F00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007 +F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF000FFFFC1FFFF80FFFFC1FF +FF80FFFFC1FFFF8029327DB12E>I<03C0000FF0000FF0001FF8001FF8001FFC001FF8001FF800 +0FF0000FF00003C00000000000000000000000000000000000000000000000000001F800FFF800 +FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 +07F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F800 +07F800FFFF80FFFF80FFFF8011337DB217>I<01F8000000FFF8000000FFF8000000FFF8000000 +0FF800000007F800000007F800000007F800000007F800000007F800000007F800000007F80000 +0007F800000007F800000007F800000007F800000007F800000007F800000007F8007FFC07F800 +7FFC07F8007FFC07F8001FC007F8001F0007F8003E0007F800780007F801F00007F803E00007F8 +07800007F81F000007F83E000007F87C000007F9FE000007FBFF000007FFFF800007FF7FC00007 +FE3FE00007F81FE00007F01FF00007F00FF80007F007FC0007F003FE0007F001FF0007F000FF00 +07F000FF8007F0007FC007F0003FE007F0003FF0FFFF80FFFFFFFF80FFFFFFFF80FFFF28327EB1 +2C>107 D<01F800FFF800FFF800FFF8000FF80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007 +F80007F80007F80007F80007F80007F80007F80007F80007F80007F800FFFFC0FFFFC0FFFFC012 +327DB117>I<03F007F8000FF000FFF03FFF007FFE00FFF07FFF80FFFF00FFF0F03FC1E07F800F +F1C01FE3803FC007F3000FE6001FC007F6000FFC001FE007FE000FFC001FE007FC000FF8001FE0 +07FC000FF8001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001F +E007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF000 +1FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0 +001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000FF0001FE007F8000F +F0001FE0FFFFC1FFFF83FFFFFFFFC1FFFF83FFFFFFFFC1FFFF83FFFF40207D9F45>I<03F007F8 +0000FFF03FFF0000FFF07FFF8000FFF0F03FC0000FF1C01FE00007F3000FE00007F6000FF00007 +FE000FF00007FC000FF00007FC000FF00007F8000FF00007F8000FF00007F8000FF00007F8000F +F00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007 +F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000F +F00007F8000FF00007F8000FF000FFFFC1FFFF80FFFFC1FFFF80FFFFC1FFFF8029207D9F2E>I< +0007FE0000003FFFC00000FFFFF00003FC03FC0007F000FE000FE0007F001FC0003F803FC0003F +C03FC0003FC07F80001FE07F80001FE07F80001FE0FF80001FF0FF80001FF0FF80001FF0FF8000 +1FF0FF80001FF0FF80001FF0FF80001FF0FF80001FF07F80001FE07F80001FE07F80001FE03FC0 +003FC03FC0003FC01FE0007F800FE0007F0007F801FE0003FE07FC0001FFFFF800003FFFC00000 +07FE000024207E9F29>I<01F80FF000FFF87FFE00FFF9FFFF80FFFFE07FC00FFF001FE007FE00 +0FF007F80007F807F80007FC07F80003FC07F80003FE07F80003FE07F80001FE07F80001FF07F8 +0001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FF07F80001FE07 +F80003FE07F80003FE07F80003FC07F80007FC07FC0007F807FE000FF007FF001FE007FBE07FC0 +07F9FFFF0007F87FFE0007F81FE00007F800000007F800000007F800000007F800000007F80000 +0007F800000007F800000007F800000007F800000007F800000007F8000000FFFFC00000FFFFC0 +0000FFFFC00000282E7E9F2E>I<03F03F00FFF07FC0FFF1FFE0FFF3C7F00FF38FF807F70FF807 +F60FF807FE0FF807FC07F007FC03E007FC008007F8000007F8000007F8000007F8000007F80000 +07F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F8000007F800 +0007F8000007F8000007F80000FFFFE000FFFFE000FFFFE0001D207E9F22>114 +D<00FF870007FFEF001FFFFF003F007F003C001F0078000F00F8000700F8000700F8000700FC00 +0700FF000000FFF800007FFFC0003FFFF0003FFFFC000FFFFE0007FFFF0001FFFF80001FFF8000 +00FFC000001FC060000FC0E00007C0E00007C0F00007C0F8000780F8000F80FE000F00FF803E00 +FFFFFC00F3FFF800C07FC0001A207D9F21>I<0038000038000038000038000038000078000078 +0000780000F80000F80001F80003F80007F8001FF800FFFFFEFFFFFEFFFFFE07F80007F80007F8 +0007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F80007F8 +0007F80707F80707F80707F80707F80707F80707F80703F80E03FC0E01FE1C00FFF8007FF0000F +E0182E7EAD20>I<01F80003F000FFF801FFF000FFF801FFF000FFF801FFF0000FF8001FF00007 +F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000F +F00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007 +F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8000FF00007F8001F +F00007F8001FF00003F8003FF00003F8006FF00001FE03CFF80000FFFF8FFF80007FFF0FFF8000 +0FFC0FFF8029207D9F2E>I<FFFF801FFEFFFF801FFEFFFF801FFE07F80003E007F80001C007FC +0003C003FC00038003FE00078001FE00070001FF000F0000FF000E0000FF801E00007F801C0000 +7FC03C00003FC03800003FE03800001FE07000001FE07000000FF0E000000FF0E000000FF9E000 +0007F9C0000007FFC0000003FF80000003FF80000001FF00000001FF00000000FE00000000FE00 +0000007C000000007C0000000038000027207E9F2C>I<FFFF0FFFF01FFEFFFF0FFFF01FFEFFFF +0FFFF01FFE0FF0007E0001F00FF8007F0001E007F8007F0001C007F8003F8003C003FC003F8003 +8003FC007FC0038003FE007FC0078001FE00FFC0070001FF00EFE00F0000FF00EFE00E0000FF01 +C7F00E00007F81C7F01C00007F83C7F01C00007FC383F83C00003FC383F83800003FC701FC3800 +001FE701FC7000001FEF01FC7000001FFE00FEF000000FFE00FEE000000FFC007FE0000007FC00 +7FC0000007FC007FC0000007F8003FC0000003F8003F80000003F0001F80000001F0001F000000 +01E0000F00000000E0000E000037207E9F3C>I<FFFF00FFFCFFFF00FFFCFFFF00FFFC07F8001F +8003FC001E0001FE003C0000FF00780000FF80F000007FC1E000003FC1E000001FE3C000000FF7 +80000007FF00000007FE00000003FE00000001FE00000000FF00000001FF80000001FFC0000003 +FFE00000079FF000000F0FF000001E07F800003C03FC00007801FE0000F001FF0001E000FF8001 +E0007FC007E0003FC0FFF801FFFEFFF801FFFEFFF801FFFE27207E9F2C>I<3FFFFFFC3FFFFFFC +3FFFFFFC3FC00FF83E001FF03C003FF038003FE078007FC07800FF807001FF807001FF007003FE +007007FC00000FF800000FF800001FF000003FE000007FC00E007FC00E00FF800E01FF000E03FE +000E07FE001E07FC001E0FF8001C1FF0003C3FF0007C3FE000FC7FC007FCFFFFFFFCFFFFFFFCFF +FFFFFC1F207E9F25>122 D<FFFFFFFFFFFFFFFFFFFF80FFFFFFFFFFFFFFFFFFFF80FFFFFFFFFF +FFFFFFFFFF805103809452>124 D<1C00387F00FEFF81FFFF81FFFFC3FFFFC3FFFF81FFFF81FF +7F00FE1C0038180A78B229>127 D E end +%%EndProlog +%%BeginSetup +%%Feature: *Resolution 300 +TeXDict begin @a4 +%%EndSetup +%%Page: 0 1 +bop 164 315 a Fr(Inhaltsv)n(erzeic)n(hnis)164 436 y Fq(1)45 +b(T)-5 b(erminologie)1198 b(2)164 555 y(2)45 b(SiSiSi)1377 +b(2)164 675 y(3)45 b(Kurzb)r(esc)n(hreibung)18 b(des)g(T)-5 +b(renn)n(v)n(erfahrens)562 b(3)164 795 y(4)45 b(Mehrdeutigk)n(eiten)1082 +b(4)164 914 y(5)45 b(Un)n(b)r(ek)m(ann)n(te)18 b(W)606 917 +y(\177)606 914 y(orter)1027 b(6)164 1034 y(6)237 1045 y(I)258 +1034 y(S)289 1023 y(I)310 1034 y(T)340 1045 y(E)369 1034 y(X)19 +b(in)n(tern:)24 b(Die)18 b(neuen)g(Files)757 b(8)164 1154 y(7)45 +b(Wie)16 b(erzeugt)f(man)h(ein)g(druc)n(kfertiges)f(Man)n(uskript)i(mit)1495 +1165 y(I)1516 1154 y(S)1547 1143 y(I)1568 1154 y(T)1598 1165 +y(E)1627 1154 y(X?)60 b(9)164 1274 y(8)237 1301 y(")264 1274 +y(xxx)l(\\)21 b(ist)d(ein)g(mehrdeutiges)e(W)-5 b(ort!)25 b(|)19 +b(w)n(as)h(tun?)352 b(10)164 1393 y(9)237 1421 y(")264 1393 +y(xxx)l(\\)21 b(ist)d(ein)g(un)n(b)r(ek)m(ann)n(tes)h(W)-5 +b(ort!)25 b(|)18 b(w)n(as)i(tun?)377 b(12)164 1513 y(10)244 +1503 y(\177)237 1513 y(Anderung)19 b(der)f(W)-5 b(orttab)r(elle)838 +b(13)p eop +%%Page: 1 2 +bop 838 527 a Fp(I)869 509 y(S)917 490 y(I)948 509 y(T)996 +527 y(E)1044 509 y(X)333 612 y(In)n(teraktiv)n(e)31 b(Silb)r(en)n(trenn)n +(ung)f(f)1395 616 y(\177)1393 612 y(ur)f(die)265 716 y(deutsc)n(he)g(Sprac)n +(he)f(un)n(ter)h(T)1216 735 y(E)1263 716 y(X)g(3.14)f(und)635 +820 y(3.141)h(un)n(ter)f(UNIX)1313 789 y Fo(y)420 978 y Fn(W.)20 +b(Barth)150 b(H.)20 b(Steiner)148 b(H.)20 b(Herb)r(ec)n(k)762 +1105 y(23.)f(August)h(1993)766 1289 y Fm(Zusammenfassung)354 +1380 y Fl(Das)15 b(sp)q(eziell)j(f)618 1382 y(\177)617 1380 +y(ur)d(deutsc)o(hsprac)o(hige)h(T)l(exte)f(en)o(t)o(wic)o(k)o(elte)h +Fk(SiSiSi)871 1474 y(SICHERE)711 1530 y(SINNENTSPRECHEN)o(DE)756 +1587 y(SILBENTRENNUNG)286 1680 y Fl(k)m(ann)23 b(jetzt)f(in)i(T)601 +1690 y(E)626 1680 y(X)f(und)g(L)793 1674 y Fj(a)814 1680 y +Fl(T)839 1694 y(E)865 1680 y(X)f(b)q(en)o(utzt)h(w)o(erden.)43 +b(Es)22 b(gibt)h(f)1478 1682 y(\177)1477 1680 y(ur)f(UNIX)286 +1737 y(c)o(hange{\014les)14 b(und)h(alle)g(anderen)f(not)o(w)o(endigen)g +(Files)h(auf)f(dem)g(anon)o(ymous{)286 1793 y(FTP{serv)o(er)19 +b Fi(eiunix.tuwien.ac.at)p Fl(.)32 b(Dort)19 b(\014ndet)i(man)f(auc)o(h)h +(eine)g(In-)286 1850 y(stallationsanleitung,)16 b(mit)f(der)g(man)g(das)g +(System)f(leic)o(h)o(t)i(installieren)i(k)m(ann.)286 1906 y(Dadurc)o(h)f +(wird)i(ein)f(neues)h(System)e(erzeugt,)h(das)g(das)f(neue)i(V)l(erfahren)f +(f)1619 1908 y(\177)1618 1906 y(ur)286 1963 y(die)e(Silb)q(en)o(trenn)o(ung)h +(v)o(erw)o(endet.)i(Alle)e(anderen)e(T)1197 1972 y(E)1223 1963 +y(X{F)l(unktionen)g(bleib)q(en)286 2019 y(un)o(v)o(er)396 2021 +y(\177)396 2019 y(andert.)354 2076 y(Es)i(gibt)h(zw)o(ei)f(V)l(arian)o(ten:) +25 b(Das)16 b(einfac)o(he)j(S)1142 2066 y(I)1158 2076 y(T)1183 +2085 y(E)1209 2076 y(X)e(und)h(das)f(in)o(teraktiv)o(e,)286 +2132 y(v)o(oll)d(ausgebaute)604 2142 y(I)621 2132 y(S)646 2122 +y(I)662 2132 y(T)687 2142 y(E)713 2132 y(X.)f(Das)h(einfac)o(he)h(S)1061 +2122 y(I)1077 2132 y(T)1102 2142 y(E)1128 2132 y(X)f(k)m(ann)g(nac)o(h)g(der) +h(Installati-)286 2188 y(on)d(genauso)h(wie)g(das)f(urspr)777 +2190 y(\177)776 2188 y(unglic)o(he)j(T)977 2198 y(E)1002 2188 +y(X)e(v)o(erw)o(endet)f(w)o(erden.)19 b(Es)13 b(hat)f(ab)q(er)286 +2245 y(den)19 b(V)l(orteil,)i(da\031)d(es)h(auc)o(h)g(b)q(ei)h(unerw)o +(arteten)f(W)l(ortzusammensetzungen)286 2301 y(k)o(eine)f(falsc)o(hen)g(T)l +(rennstellen)h(erzeugt.)25 b(W)l(elc)o(he)18 b(zus)1241 2303 +y(\177)1241 2301 y(atzlic)o(hen)h(M)1476 2303 y(\177)1476 2301 +y(o)o(glic)o(hk)o(ei-)286 2358 y(ten)364 2368 y(I)381 2358 +y(S)406 2348 y(I)422 2358 y(T)447 2368 y(E)473 2358 y(X)c(bietet,)g(ist)h(in) +g(diesem)g(Beric)o(h)o(t)g(b)q(esc)o(hrieb)q(en.)p 164 2402 +648 2 v 221 2433 a Fh(y)239 2448 y Fg(UNIX)e(ist)g(Mark)o(enzeic)o(hen)h(v)o +(on)f(A)m(T&T)961 2599 y Ff(1)p eop +%%Page: 2 3 +bop 164 315 a Fr(1)83 b(T)-7 b(erminologie)164 436 y Ff(T)191 +446 y(E)218 436 y(X)24 b(ist)16 b(Donald)h(E.)f(Kn)o(uths)g(F)l +(ormatierungsprogramm)e(f)1311 438 y(\177)1310 436 y(ur)j(T)l(exte)e([1],)g +([2].)164 537 y(L)176 531 y Fe(a)200 537 y Ff(T)227 552 y(E)254 +537 y(X)24 b(ist)17 b(das)g(v)o(on)g(Leslie)e(Lamp)q(ort)i(en)o(t)o(wic)o(k)o +(elte)c(Makro{P)o(ak)o(et)k(zu)f(T)1547 548 y(E)1575 537 y(X,)f(das)j(im)286 +598 y(deutsc)o(hsprac)o(higen)f(Raum)h(meist)e(v)o(erw)o(endet)h(wird)h([3],) +g([4].)26 b(Ab)18 b(sofort)h(gilt)286 658 y(T)313 669 y(E)340 +658 y(X)14 b(synon)o(ym)g(f)611 660 y(\177)610 658 y(ur)g(T)697 +669 y(E)725 658 y(X)g(und)h(L)884 652 y Fe(a)908 658 y Ff(T)935 +673 y(E)962 658 y(X,)f(und)h(die)f(im)f(folgenden)i(b)q(esc)o(hrieb)q(enen) +286 718 y(Erw)o(eiterungen)f(S)636 707 y(I)653 718 y(T)680 +729 y(E)708 718 y(X)g(und)854 729 y(I)872 718 y(S)899 707 y(I)917 +718 y(T)944 729 y(E)971 718 y(X)g(k)1048 720 y(\177)1048 718 +y(onnen)h(so)o(w)o(ohl)f(auf)h(T)1453 729 y(E)1480 718 y(X)f(als)h(auc)o(h)g +(auf)286 778 y(L)298 772 y Fe(a)322 778 y Ff(T)349 793 y(E)376 +778 y(X)h(angew)o(endet)g(w)o(erden.)164 880 y(S)191 869 y(I)209 +880 y(T)236 891 y(E)263 880 y(X)24 b(ist)14 b(eine)f(V)l(arian)o(te)g(v)o(on) +h(T)799 891 y(E)827 880 y(X)f(f)893 882 y(\177)892 880 y(ur)i(deutsc)o +(hsprac)o(hige)e(T)l(exte,)g(die)h(durc)o(h)g(Aus-)286 940 +y(tausc)o(h)25 b(der)540 970 y(")563 940 y(h)o(yphenation)m(\\)j(durc)o(h)c +(das)h(v)o(on)g(W.)f(Barth)h(und)g(H.)f(Nirsc)o(hl)286 1000 +y(en)o(t)o(wic)o(k)o(elte)9 b(V)l(erfahren)i(zur)833 1030 y(")855 +1000 y(sic)o(heren)g(sinnen)o(tsprec)o(henden)g(Silb)q(en)o(trenn)o(ung)286 +1060 y(\()p Fd(SiSiSi)5 b Ff(\))m(\\)20 b(f)512 1062 y(\177)511 +1060 y(ur)d(die)e(deutsc)o(he)h(Sprac)o(he)g([5],)f([6])h(en)o(tstanden)g +(ist.)164 1173 y(I)182 1162 y(S)209 1151 y(I)226 1162 y(T)253 +1173 y(E)280 1162 y(X)24 b(ist)11 b(eine)g(um)f(einige)g(zus)780 +1164 y(\177)780 1162 y(atzlic)o(he)g(M)998 1164 y(\177)998 +1162 y(oglic)o(hk)o(eiten,)f(insb)q(esondere)i(in)o(teraktiv)o(e)286 +1222 y(Komp)q(onen)o(ten,)k(erw)o(eiterte)f(F)l(orm)h(v)o(on)h(S)1087 +1212 y(I)1105 1222 y(T)1132 1233 y(E)1159 1222 y(X.)164 1399 +y Fr(2)83 b(SiSiSi)164 1520 y Ff(In)11 b(der)g(deutsc)o(hen)g(Sprac)o(he)g(v) +o(erw)o(endet)f(man)h(gern)h(lange,)g(zusammengesetzte)c(W)1723 +1522 y(\177)1723 1520 y(o)q(r-)164 1580 y(ter,)15 b(wie)h(z.B.:)286 +1692 y(T)l(ext=v)o(erarb)q(eitungs=system)e(o)q(der)j(Silb)q(en=trenn)o +(ungs=v)o(erfahren.)164 1805 y(W)l(enn)23 b(solc)o(he)f(riesigen)g(Gebilde)g +(nic)o(h)o(t)g(am)g(Ende)h(einer)f(Zeile)f(abgeteilt)i(w)o(erden)164 +1865 y(k)190 1867 y(\177)190 1865 y(onnen,)e(en)o(tsteh)o(t)f(meist)f(ein)h +(sehr)g(unsc)o(h)990 1867 y(\177)990 1865 y(o)q(nes)g(Sc)o(hriftbild.)33 +b(Das)21 b(Hauptproblem)164 1925 y(b)q(ei)14 b(der)g(Silb)q(en)o(trenn)o(ung) +g(ist)g(das)i(Finden)e(der)g(Nah)o(tstellen)f(\(durc)o(h)1467 +1955 y(")1489 1925 y(=)m(\\)18 b(angezeigt\))164 1985 y(zwisc)o(hen)j(den)i +(Einzelw)638 1987 y(\177)638 1985 y(o)o(rtern.)40 b(Die)22 +b(T)l(rennstellen)g(innerhalb)g(der)g(Einzelw)1681 1987 y(\177)1681 +1985 y(o)o(rter)164 2046 y(lassen)f(sic)o(h)e(relativ)g(leic)o(h)o(t)f(mit)h +(den)h(im)f(Duden)h([9])g(angegeb)q(enen)h(Regeln)f(ermit-)164 +2106 y(teln.)38 b Fd(SiSiSi)28 b Ff(\014ndet)22 b(die)f(Zerlegung)h(der)g(W) +1051 2108 y(\177)1051 2106 y(orter)g(mit)e(Hilfe)h(einer)g(W)l(orttab)q +(elle,)164 2166 y(genauer)h(einer)e(T)l(ab)q(elle)g(aller)h(W)l(ortb)q +(estandteile:)31 b(V)l(orsilb)q(en,)21 b(St)1455 2168 y(\177)1455 +2166 y(a)q(mme)d(und)j(En-)164 2226 y(dungen.)i(W)l(eniger)16 +b(als)h(8000)h(Ein)o(tragungen)f(reic)o(hen)e(aus,)i(um)f(fast)h(alle)f +(deutsc)o(hen)164 2286 y(W)214 2288 y(\177)214 2286 y(orter)k(und)g(die)f(g) +544 2288 y(\177)544 2286 y(a)q(ngigen)h(F)l(remdw)900 2288 +y(\177)900 2286 y(o)n(rter)g(zu)f(erfassen.)32 b(Durc)o(h)20 +b(die)f(Abst)1638 2288 y(\177)1637 2286 y(utzung)164 2346 y(des)h(V)l +(erfahrens)f(auf)i(eine)d(W)l(orttab)q(elle)i(ist)g(es)f(nat)1162 +2348 y(\177)1161 2346 y(u)q(rlic)o(h)f(m)1344 2348 y(\177)1344 +2346 y(o)o(glic)o(h,)i(auc)o(h)f(mit)f(un-)164 2407 y(v)o(orherseh)o(baren,)j +(ungew)656 2409 y(\177)656 2407 y(o)q(hnlic)o(hen)f(W)l(ortunget)1108 +2409 y(\177)1107 2407 y(u)q(men)g(fertig)g(zu)h(w)o(erden.)36 +b(Dieses)164 2467 y(Zerspalten)18 b(zusammengesetzter)d(W)883 +2469 y(\177)883 2467 y(o)q(rter)j(mit)f(einer)h(einfac)o(hen,)1451 +2469 y(\177)1449 2467 y(ub)q(ersc)o(haubaren)961 2599 y(2)p +eop +%%Page: 3 4 +bop 164 307 a Ff(Metho)q(de)12 b(bringt)h(w)o(esen)o(tlic)o(he)d(V)l(orteile) +g(gegen)1053 309 y(\177)1052 307 y(u)q(b)q(er)i(dem)f(aus)i(dem)e(Amerik)m +(anisc)o(hen)165 369 y(\177)164 367 y(ub)q(ernommenen)j(pattern{V)l +(erfahren.)237 437 y Fd(SiSiSi)j Ff(suc)o(h)o(t)11 b(nac)o(h)g(allen)f(m)766 +439 y(\177)766 437 y(o)o(glic)o(hen)g(Zerlegungen)h(eines)f(W)l(ortes.)20 +b(Bei)10 b(manc)o(hen)164 497 y(gibt)16 b(es)g(mehr)f(als)h(eine,)f(wie)h +(z.B.:)286 602 y(Bau=mast/Baum=ast)f(o)q(der)i(Stau=b)q(ec)o(k)o(en/Staub=ec) +o(k)o(en.)164 707 y(Wir)12 b(b)q(ezeic)o(hnen)g(das)h(als)g +Fq(Mehrdeutigk)n(eit)p Ff(.)18 b(St)1113 709 y(\177)1113 707 +y(o)q(\031t)13 b Fd(SiSiSi)19 b Ff(auf)13 b(eine)f(solc)o(he)g(Mehr-)164 +767 y(deutigk)o(eit,)18 b(so)j(n)o(utzt)e(die)g(einfac)o(here)f(Implem)o(en)n +(tierung)f(S)1325 756 y(I)1343 767 y(T)1370 778 y(E)1397 767 +y(X)i(die)g(zw)o(eifelhafte)164 827 y(T)l(rennstelle)d(nic)o(h)o(t)g(aus.)25 +b(Dadurc)o(h)17 b(wird)g(sic)o(hergestellt,)e(da\031)k(k)o(eine)c(falsc)o +(hen)i(T)l(ren-)164 887 y(n)o(ungen)c(en)o(tstehen.)20 b(Das)14 +b(in)o(teraktiv)o(e)902 898 y(I)919 887 y(S)946 877 y(I)964 +887 y(T)991 898 y(E)1018 887 y(X)f(h)1095 889 y(\177)1095 887 +y(alt)g(w)1200 889 y(\177)1200 887 y(a)q(hrend)g(der)g(Bearb)q(eitung)g(des) +164 948 y(Dokumen)o(ts)d(b)q(ei)i(jedem)e(solc)o(hen)h(mehrdeutigen)f(W)l +(ort)i(an,)g(zeigt)f(dem)g(Ben)o(utzer)f(alle)164 1008 y(m)206 +1010 y(\177)206 1008 y(o)o(glic)o(hen)15 b(Zerlegungen)h(und)g(erlaubt)g +(ihm,)e(die)i(passende)h(auszu)o(w)1479 1010 y(\177)1479 1008 +y(ahlen.)237 1077 y(F)l(alls)22 b Fd(SiSiSi)28 b Ff(f)528 1079 +y(\177)527 1077 y(ur)22 b(ein)f(W)l(ort)i(k)o(eine)d(Zerlegung)i(\014ndet,)h +(dann)g(handelt)f(es)g(sic)o(h)164 1138 y(dab)q(ei)14 b(en)o(t)o(w)o(eder)e +(um)h(ein)g(sehr)h(ausgefallenes)g(W)l(ort)g(\(z.B.)e(Eigennamen)h(o)q(der) +1661 1140 y(\177)1661 1138 y(ahnli-)164 1198 y(c)o(hes\),)h(das)h(nic)o(h)o +(t)e(in)i(der)f(W)l(orttab)q(elle)g(en)o(thalten)g(ist,)g(o)q(der)h(das)h(W)l +(ort)f(wurde)f(falsc)o(h)164 1258 y(gesc)o(hrieb)q(en.)21 b(Wir)16 +b(sprec)o(hen)f(v)o(on)i(einem)d Fq(un)n(b)r(ek)m(ann)n(ten)k(W)-5 +b(ort)p Ff(.)22 b(Auc)o(h)16 b(in)g(diesen)164 1318 y(F)196 +1320 y(\177)196 1318 y(allen)21 b(wird)h(durc)o(h)g(S)605 1308 +y(I)622 1318 y(T)649 1329 y(E)676 1318 y(X)g(nic)o(h)o(t)f(getrenn)o(t,)h +(die)f(Silb)q(en)o(trenn)o(ung)h(bleibt)e(sic)o(her.)164 1389 +y(I)182 1378 y(S)209 1368 y(I)226 1378 y(T)253 1389 y(E)280 +1378 y(X)i(erlaubt)g(ab)q(er)g(dem)e(Ben)o(utzer,)h(je)h(nac)o(hdem)e(w)o +(elc)o(her)g(F)l(all)h(v)o(orliegt,)h(das)164 1439 y(un)o(b)q(ek)m(ann)o(te) +16 b(W)l(ort)h(zu)f(k)o(orrigieren)f(o)q(der)h(in)g(die)g(W)l(orttab)q(elle)g +(einzutragen.)237 1508 y Fd(SiSiSi)h Ff(un)o(terst)532 1510 +y(\177)531 1508 y(utzt)10 b(eine)g(sinnen)o(tsprec)o(hende)f(T)l(renn)o(ung,) +j(indem)d(es)i(die)f Fq(Haupt-)164 1569 y(trennstellen)j Ff(an)j(den)f(Nah)o +(tstellen)e(zusammengesetzter)f(W)1358 1571 y(\177)1358 1569 +y(o)q(rter)i(gegen)1596 1571 y(\177)1595 1569 y(u)q(b)q(er)h(den)164 +1629 y(Neb)q(en)o(trennstellen)f(in)i(den)g(Einzelw)880 1631 +y(\177)880 1629 y(o)o(rtern)g(b)q(ev)o(orzugt.)237 1699 y(Diese)23 +b(Bev)o(orzugung)g(wird)g(durc)o(h)f(Strafpunkte)h(\(p)q(enalties\))g +(gesteuert.)42 b(De-)164 1759 y(faultm)305 1761 y(\177)305 +1759 y(a)o(\031ig)13 b(erhalten)g(die)g(Neb)q(en)o(trennstellen)d(einen)j(h) +1214 1761 y(\177)1214 1759 y(oheren)g(W)l(ert)g(als)g(die)g(Haupt-)164 +1819 y(trennstellen.)19 b(Diese)13 b(Relation)h(k)m(ann)g(ab)q(er)h(v)o(on)f +(einem)d(erfahrenen)j(Ben)o(utzer)e(durc)o(h)164 1879 y(den)g(neuen)f(T)415 +1890 y(E)442 1879 y(X{Befehl)f Fc(\\nebenhyphenpenalty)15 b +Ff(f)1173 1881 y(\177)1172 1879 y(ur)c(seine)g(Installation)h(ge)1645 +1881 y(\177)1645 1879 y(andert)164 1939 y(w)o(erden.)21 b(Ab)q(er)16 +b(das)g(wird)h(f)686 1941 y(\177)685 1939 y(ur)f(normales)f(Arb)q(eiten)g(k)m +(aum)h(not)o(w)o(endig)g(sein.)164 2114 y Fr(3)83 b(Kurzb)r(esc)n(hreibung)24 +b(des)j(T)-7 b(renn)n(v)n(erfahrens)164 2233 y Ff(Jedes)21 +b(W)l(ort)h(ist)g(eine)e(F)l(olge)i(v)o(on)f(einem)e(o)q(der)j(mehreren)e +(Einzelw)1488 2235 y(\177)1488 2233 y(o)o(rtern.)37 b(Jedes)164 +2293 y(Einzelw)o(ort)15 b(b)q(esteh)o(t)g(aus)i(b)q(eliebig)e(vielen)f(V)l +(orsilb)q(en)i(\(ev)o(en)o(tuell)d(auc)o(h)j(k)o(einen\),)e(ge-)164 +2354 y(folgt)j(v)o(on)f(genau)h(einem)d(Stamm,)g(abgesc)o(hlossen)i(durc)o(h) +g(b)q(eliebig)g(viele)e(Endungen)164 2414 y(\(ersatzw)o(eise)19 +b(F)l(ugenzeic)o(hen\).)33 b(Eine)20 b(W)l(orttab)q(elle)g(en)o(th)1268 +2416 y(\177)1268 2414 y(alt)g(alle)f(diese)h(erw)1638 2416 +y(\177)1638 2414 y(ahn)o(ten)164 2474 y(W)l(ortb)q(estandteile)c +(\(Morpheme\).)961 2599 y(3)p eop +%%Page: 4 5 +bop 237 307 a Ff(Der)13 b(Algorithm)o(us)f(suc)o(h)o(t)h(f)746 +309 y(\177)745 307 y(ur)g(jedes)g(W)l(ort,)h(das)g(ev)o(en)o(tuell)d(getrenn) +o(t)i(w)o(erden)g(soll,)164 367 y(systematisc)o(h)i(nac)o(h)i(allen)f +(Zerlegungen,)g(die)g(nac)o(h)h(der)g(angegeb)q(enen)g(Grammatik)164 +428 y(m)206 430 y(\177)206 428 y(o)o(glic)o(h)12 b(sind.)20 +b(Dab)q(ei)13 b(erk)o(enn)o(t)e(er)h(durc)o(h)g(Nac)o(hsc)o(hauen)g(in)g(der) +h(W)l(orttab)q(elle,)f(ob)i(ein)164 488 y(b)q(etrac)o(h)o(tetes)f(T)l(eilst) +557 490 y(\177)556 488 y(u)o(c)o(k)g(des)h(W)l(ortes)g(ein)f(W)l(ortb)q +(estandteil)h(im)e(erw)1464 490 y(\177)1464 488 y(ahn)o(ten)h(Sinn)h(ist)164 +548 y(und)j(gegeb)q(enenfalls)f(v)o(on)g(w)o(elc)o(her)e(Art)i(es)g(ist.)237 +619 y(Auf)21 b(diese)f(W)l(eise)g(\014ndet)h(der)g(Algorithm)o(us)e(f)1136 +621 y(\177)1135 619 y(ur)i(jede)g(Zerlegung)f(alle)h(Haupt-)164 +679 y(trennstellen,)16 b(n)472 681 y(\177)472 679 y(amlic)o(h)f(zwisc)o(hen)h +(der)h(letzten)f(Endung)i(eines)f(T)l(eilw)o(ortes)f(und)i(der)164 +739 y(folgenden)f(V)l(orsilb)q(e,)f(bzw.)h(dem)e(folgenden)i(Stamm.)22 +b(Au\031erdem)15 b(erk)o(enn)o(t)g(er)i(auc)o(h)164 799 y(sofort)h(alle)f +(Neb)q(en)o(trennstellen)e(hin)o(ter)h(den)i(V)l(orsilb)q(en.)24 +b(F)1302 801 y(\177)1301 799 y(ur)17 b(den)h(Rest)f(jedes)g(Ein-)164 +860 y(zelw)o(orts,)d(b)q(estehend)h(aus)g(Stamm)e(und)i(Endungen,)g(m)o +(u\031)f(man)g(die)g(Duden{Regeln)164 920 y(f)180 922 y(\177)179 +920 y(ur)g(die)f(Silb)q(en)o(trenn)o(ung)h(an)o(w)o(enden.)20 +b(Das)15 b(sind)f(solc)o(he)f(Regeln)g(wie)1473 950 y(")1495 +920 y(In)h(einer)f(F)l(olge)164 980 y(v)o(on)18 b(Konsonan)o(ten)h(ist)e(v)o +(or)h(dem)e(letzten)h(zu)g(trennen)m(\\)s(,)h(z.B.)e(tre-ten,)i(F)1573 +982 y(\177)1572 980 y(ul-lungen,)164 1040 y(k)190 1042 y(\177)190 +1040 y(amp-fen.)23 b(Diese)17 b(Regeln)g(sind)g(mit)e(all)i(ihren)g +(Ausnahmen,)f(z.B.)g(Sonderb)q(ehand-)164 1100 y(lung)j(v)o(on)f(st)g(und)h +(c)o(k,)f(v)o(ollst)719 1102 y(\177)719 1100 y(a)o(ndig)h(in)f +Fd(SiSiSi)24 b Ff(eingearb)q(eitet.)j(Eb)q(enso)19 b(wird)g(sc)o(hon)164 +1161 y(b)q(ei)d(der)g(Zerlegung)g(in)g(Einzelw)777 1163 y(\177)777 +1161 y(o)o(rter)g(die)f(3{Konsonan)o(ten{Regel)j(b)q(er)1528 +1163 y(\177)1527 1161 y(uc)o(ksic)o(h)o(tigt.)237 1231 y(Es)c(gibt)g(W)451 +1233 y(\177)451 1231 y(o)q(rter,)f(F)l(remdw)755 1233 y(\177)755 +1231 y(o)o(rter,)g(die)h(nic)o(h)o(t)e(nac)o(h)i(den)g(Duden{Regeln)f +(getrenn)o(t)164 1292 y(w)o(erden,)g(z.B.)f(Pro-gramm)g(o)q(der)i(P)o +(an-orama.)20 b(In)13 b(diesen)g(F)1301 1294 y(\177)1301 1292 +y(allen)g(ist)g(in)g(der)g(W)l(ortta-)164 1352 y(b)q(elle)j(der)g(Stamm)e +(als)606 1382 y(")629 1352 y(Ausnahme)m(\\)19 b(deklariert)c(und)i(die)f(m) +1334 1354 y(\177)1334 1352 y(o)o(glic)o(hen)f(T)l(rennstellen)164 +1412 y(sind)j(angegeb)q(en.)29 b(Der)18 b(Algorithm)o(us)f(b)q(er)980 +1414 y(\177)979 1412 y(uc)o(ksic)o(h)o(tigt)f(nat)1296 1414 +y(\177)1295 1412 y(u)q(rlic)o(h)h(solc)o(he)h(Angab)q(en.)164 +1472 y(Eine)e(ausf)362 1474 y(\177)361 1472 y(uhrlic)o(he)f(Besc)o(hreibung)g +(des)h(V)l(erfahrens)g(\014ndet)g(sic)o(h)g(in)g([5].)164 1649 +y Fr(4)83 b(Mehrdeutigk)n(eiten)164 1770 y Ff(Nun)16 b(gibt)g(es)g(im)e +(Deutsc)o(hen)i(das)g(Problem,)f(da\031)i(viele,)c(meist)i(zusammengesetzte)o +(,)164 1830 y(W)214 1832 y(\177)214 1830 y(orter)g(existieren,)e(die)i(v)o +(ersc)o(hieden)e(in)o(terpretiert)g(und)j(daher)f(auc)o(h)g(auf)h(v)o(ersc)o +(hie-)164 1890 y(dene)11 b(Arten)f(getrenn)o(t)h(w)o(erden)f(k)783 +1892 y(\177)783 1890 y(o)q(nnen.)19 b(Das)12 b(ergibt)f(dann,)h(sofern)g(der) +f(Algorithm)o(us)164 1950 y(eine)18 b(unpassende)j(T)l(rennstelle)d(w)818 +1952 y(\177)818 1950 y(ahlt,)i(sinnen)o(tstellende)d(Abtrenn)o(ungen,)i(die)g +(das)164 2010 y(\015)192 2012 y(\177)191 2010 y(ussige)e(Lesen)f(ersc)o(h)o +(w)o(eren.)j(Einige)d(Beispiele:)286 2123 y(W)l(ac)o(hs=tub)q(e/W)l(ac)o +(h=stub)q(e)286 2204 y(Bau=mast/Baum=ast)286 2285 y(P)o(ersonal=mangel/P)o +(erson=alm=angel)286 2366 y(Spiel=ende/spie-lende)961 2599 +y(4)p eop +%%Page: 5 6 +bop 164 307 a Ff(Alle)20 b(anderen)i(T)l(renn)o(v)o(erfahren,)g(die)g(die)f +(Einzelb)q(estandteile)f(v)o(on)i(zusammenge-)164 367 y(setzten)16 +b(W)380 369 y(\177)380 367 y(o)q(rtern)h(\(die)626 397 y(")649 +367 y(Morpheme)m(\\)s(\))f(nic)o(h)o(t)g(erk)o(ennen)f(\(also)j(auc)o(h)f +(die)1579 397 y(")1601 367 y(pattern{)164 428 y(Metho)q(de)m(\\)s(\),)d +(\014nden)g(diese)f(Mehrdeutigk)o(eiten)e(nic)o(h)o(t.)19 b +Fd(SiSiSi)h Ff(\(in)13 b(S)1455 417 y(I)1473 428 y(T)1500 438 +y(E)1527 428 y(X\))g(hingegen)164 488 y(n)o(utzt)h(solc)o(he)g(unsic)o(heren) +g(T)l(rennstellen)g(generell)f(nic)o(h)o(t)h(aus.)21 b(Im)13 +b(Beispiel)1604 518 y(")1626 488 y(Bettru-)164 548 y(he)m(\\)20 +b(wird)c(die)g(angegeb)q(ene)h(Haupttrennstelle)e(ignoriert.)22 +b(Nur)16 b(die)g(sic)o(here)f(Neb)q(en-)164 608 y(trennstelle)406 +638 y(")428 608 y(Bettru-he)m(\\)22 b(k)o(omm)o(t)16 b(in)j(F)l(rage.)30 +b(Hat)19 b(man)f(ab)q(er)i(n)o(ur)f(w)o(enige)f(sic)o(here)164 +668 y(T)l(rennstellen)d(in)g(langen,)h(zusammengesetzten)d(W)1150 +670 y(\177)1150 668 y(ortern,)i(so)i(k)1395 670 y(\177)1395 +668 y(onnen)f(in)g(manc)o(hen)164 729 y(Zeilen)11 b(\(b)q(ei)h(Randausgleic)o +(h\))g(gro\031e)h(L)893 730 y(\177)892 729 y(u)q(c)o(k)o(en)e(bzw.)1136 +758 y(")1158 729 y(Stauc)o(h)o(ungen)m(\\)16 b(en)o(tstehen.)j(Das)164 +789 y(Sc)o(hriftbild)10 b(wird)h(unsc)o(h)625 791 y(\177)625 +789 y(on,)h(h)729 791 y(\177)729 789 y(a)q(u\014g)g(tritt)f(die)g(T)1046 +799 y(E)1073 789 y(X{W)l(arn)o(ung)1339 818 y(")1362 789 y(underfull)f(h)o(b) +q(o)o(x)m(\\)15 b(auf.)237 857 y(Dieses)g(Problem)f(wird)h(in)746 +868 y(I)763 857 y(S)790 846 y(I)808 857 y(T)835 868 y(E)862 +857 y(X)g(durc)o(h)g(in)o(teraktiv)o(es)e(Eingreifen)h(in)h(den)g(Pro-)164 +917 y(duktionsv)o(organg)h(gel)590 919 y(\177)590 917 y(ost.)21 +b(T)l(ri\013t)813 928 y(I)831 917 y(S)858 906 y(I)875 917 y(T)902 +928 y(E)930 917 y(X)14 b(auf)h(ein)g(mehrdeutiges)e(W)l(ort,)i(so)h(w)o +(erden)164 977 y(dem)j(Ben)o(utzer)h(alle)g(m)622 979 y(\177)622 +977 y(o)o(glic)o(hen)g(Zerlegungen)h(am)f(Bildsc)o(hirm)d(angezeigt,)22 +b(so)q(da\031)164 1038 y(er)17 b(die)g(in)h(seinem)d(Kon)o(text)i(sinngem)888 +1039 y(\177)888 1038 y(a)o(\031e)h(ausw)1080 1039 y(\177)1080 +1038 y(a)q(hlen)g(k)m(ann.)26 b(Diese)17 b(W)l(ahl)g(m)o(u\031)g(f)1738 +1039 y(\177)1737 1038 y(ur)164 1098 y(ein)c(solc)o(hes)g(mehrdeutiges)e(W)l +(ort)j(n)o(ur)g(einmal)d(getro\013en)j(w)o(erden,)f(d.h.)g(b)q(ei)g(w)o +(eiteren)164 1158 y(V)l(ork)o(ommen)c(desselb)q(en)j(W)l(ortes)g(in)g +(demselb)q(en)e(Dokumen)o(t)h(soll)g(dann)i(immer)c(auto-)164 +1218 y(matisc)o(h)15 b(diese)h(ric)o(h)o(tige)f(T)l(renn)o(ung)i(gew)940 +1220 y(\177)940 1218 y(a)q(hlt)f(w)o(erden.)22 b(Dieser)16 +b(F)l(orderung)i(liegt)e(die)164 1278 y(Erfahrung)h(zugrunde,)f(da\031)h(ein) +f(mehrdeutiges)e(W)l(ort)j(praktisc)o(h)e(nie)h(in)g(demselb)q(en)164 +1338 y(Dokumen)o(t)j(in)h(v)o(ersc)o(hiedenen)e(Bedeutungen)i(v)o(ork)o(omm)n +(t.)31 b(Au\031erdem)18 b(sind)j(viele)164 1399 y(der)c(v)o(on)g +Fd(SiSiSi)491 1428 y Ff(")514 1399 y(erk)m(ann)o(ten)m(\\)j(Mehrdeutigk)o +(eiten)15 b(im)1227 1401 y(\177)1225 1399 y(ublic)o(hen)h(W)l(ortsc)o(hatz)h +(nic)o(h)o(t)164 1459 y(gebr)256 1461 y(\177)256 1459 y(auc)o(hlic)o(h)e +(\(siehe)i(das)g(Beispiel:)k(P)o(erson=alm=angel\).)h(W)l(eiters)16 +b(w)o(erden)g(auc)o(h)164 1519 y(f)180 1521 y(\177)179 1519 +y(ur)h(w)o(eitere)e(Durc)o(hl)554 1521 y(\177)554 1519 y(aufe)i(\(nac)o(h)g +(erneutem)e(Editieren\))g(die)i(ric)o(h)o(tigen)e(T)l(rennstellen)164 +1579 y(gemerkt)f(und)j(wieder)e(v)o(erw)o(endet.)237 1647 y(F)270 +1649 y(\177)269 1647 y(ur)e(den)g(Sonderfall,)h(da\031)g(ein)e(mehrdeutiges)g +(W)l(ort)h(in)g(mehreren)e(Bedeutungen)164 1708 y(v)o(ork)o(omm)n(t,)h(z.B.) +506 1737 y(")529 1708 y(In)i(der)h(W)l(ac)o(hstub)q(e)g(liegt)f(eine)g(W)l +(ac)o(hstub)q(e)m(\\)s(,)h(gibt)g(es)g(die)f(b)q(eiden)164 +1768 y(folgenden)i(M)427 1770 y(\177)427 1768 y(oglic)o(hk)o(eiten:)237 +1862 y Fb(\017)24 b Ff(Man)d(mac)o(h)o(t)555 1864 y(\177)553 +1862 y(ub)q(erhaupt)h(nic)o(h)o(ts.)33 b(Dann)21 b(w)o(erden)f(n)o(ur)h(die)e +(sic)o(heren)h(T)l(renn-)286 1922 y(stellen)c(ausgen)o(utzt.)25 +b(Es)17 b(en)o(tstehen)g(k)o(eine)f(T)l(rennfehler,)g(allenfalls)g(wird)h +(das)286 1982 y(Sc)o(hriftbild)d(et)o(w)o(as)i(unruhig.)237 +2079 y Fb(\017)24 b Ff(Mit)13 b(dem)g(T)508 2090 y(E)535 2079 +y(X{Befehl)g Fc(\\-)h Ff(tr)848 2081 y(\177)848 2079 y(a)q(gt)g(man)f(b)q +(eim)g(Editieren)g(b)q(ei)h(allen)f(\(o)q(der)i(auc)o(h)286 +2139 y(n)o(ur)d(b)q(ei)h(einigen)f(ausgew)760 2141 y(\177)760 +2139 y(a)q(hlten\))g(V)l(ork)o(ommen)e(des)i(W)l(ortes)h(alle)f(T)l +(rennstellen)286 2199 y(\(o)q(der)i(n)o(ur)f(einen)f(T)l(eil)g(da)o(v)o(on\)) +i(ein.)969 2210 y(I)987 2199 y(S)1014 2189 y(I)1032 2199 y(T)1059 +2210 y(E)1086 2199 y(X)f(n)o(utzt)f(dann)i(diese)f(v)o(orgegeb)q(enen)286 +2259 y(T)l(rennstellen)19 b(aus,)i(suc)o(h)o(t)e(ab)q(er)i(in)e(jedem)f(W)l +(ort,)j(das)g(eine)e(solc)o(he)g(V)l(orgab)q(e)286 2320 y(en)o(th)380 +2322 y(\177)380 2320 y(alt,)c(nic)o(h)o(t)g(nac)o(h)h(w)o(eiteren)f(T)l +(rennstellen.)237 2414 y(Ab)q(er)g(no)q(c)o(h)h(ein)e(V)l(orfall)h(m)o(u\031) +f(b)q(eac)o(h)o(tet)g(w)o(erden.)20 b(Wie)15 b(k)m(ann)h(der)f(Ben)o(utzer,)e +(der)164 2474 y(irrt)236 2476 y(\177)235 2474 y(umlic)o(h)h(f)410 +2476 y(\177)409 2474 y(ur)j(ein)f(mehrdeutiges)f(W)l(ort)i(eine)f(falsc)o(he) +h(T)l(renn)o(v)m(arian)o(te)f(ausgew)1698 2476 y(\177)1698 +2474 y(a)q(hlt)961 2599 y(5)p eop +%%Page: 6 7 +bop 164 307 a Ff(hat,)15 b(diesen)e(F)l(ehler)g(wieder)g(b)q(eseitigen?)21 +b(Bei)12 b(jedem)h(w)o(eiteren)f(Durc)o(hlauf)i(l)1613 309 +y(\177)1613 307 y(auft)g(das)164 367 y(Programm)h(ohne)h(Halt)634 +369 y(\177)632 367 y(ub)q(er)h(alle)e(V)l(ork)o(ommen)e(dieses)j(W)l(ortes)h +(hin)o(w)o(eg,)e(es)h(h)1670 369 y(\177)1670 367 y(a)q(lt)g(ja)164 +428 y(das)h(Problem)d(dieser)i(Mehrdeutigk)o(eit)e(f)941 430 +y(\177)940 428 y(ur)i(gel)1062 430 y(\177)1062 428 y(ost.)21 +b(Deshalb)c(wurde)f(in)1549 438 y(I)1566 428 y(S)1593 417 y(I)1611 +428 y(T)1638 438 y(E)1665 428 y(X)g(am)164 488 y(Anfang)h(der)e(Behandlung)i +(des)f(Dokumen)o(ts)f(ein)g(Halt)h(eingef)1343 490 y(\177)1342 +488 y(u)o(gt,)g(b)q(ei)g(dem)f(der)g(Be-)164 548 y(n)o(utzer)i(aufgefordert)h +(wird,)f(et)o(w)o(aige)f(F)l(ehler)h(aus)h(v)o(orherigen)f(Durc)o(hl)1513 +550 y(\177)1513 548 y(a)o(ufen)h(wieder)164 608 y(zu)e(b)q(eseitigen.)164 +785 y Fr(5)83 b(Un)n(b)r(ek)-5 b(ann)n(te)26 b(W)831 789 y(\177)831 +785 y(o)q(rter)164 905 y Ff(Alle)14 b(W)315 907 y(\177)315 +905 y(o)q(rter,)h(f)464 907 y(\177)463 905 y(ur)h(die)g Fd(SiSiSi)22 +b Ff(k)o(eine)15 b(Zerlegung)g(\014ndet,)h(sind)g Fq(un)n(b)r(ek)m(ann)n(te)i +(W)1713 908 y(\177)1713 905 y(or-)164 966 y(ter)p Ff(.)30 b(Das)21 +b(sind)e(W)536 968 y(\177)536 966 y(o)q(rter,)g(die)g(einen)f(Sc)o +(hreibfehler)g(en)o(thalten,)h(ab)q(er)h(auc)o(h)f(solc)o(he,)164 +1026 y(die)f(ric)o(h)o(tig)g(gesc)o(hrieb)q(en,)g(dem)f Fd(SiSiSi)5 +b Ff({Algorithm)o(us)18 b(ab)q(er)i(no)q(c)o(h)f(un)o(b)q(ek)m(ann)o(t)g +(sind)164 1086 y(\(d.h.)12 b(die)h(no)q(c)o(h)g(nic)o(h)o(t)f(in)h(der)f(W)l +(orttab)q(elle)h(sind\).)20 b(Die)13 b(einfac)o(he)f(L)1423 +1088 y(\177)1423 1086 y(o)q(sung)h(v)o(on)g(S)1674 1075 y(I)1692 +1086 y(T)1719 1097 y(E)1746 1086 y(X)164 1146 y(lautet:)20 +b(Solc)o(he)13 b(W)l(orte)h(w)o(erden)g(nic)o(h)o(t)f(getrenn)o(t.)20 +b(Die)13 b(F)l(olgen)h(sind)g(die)g(gleic)o(hen)e(wie)164 1206 +y(b)q(ei)18 b(mehrdeutigen)d(W)603 1208 y(\177)603 1206 y(o)q(rtern:)24 +b(L)803 1208 y(\177)802 1206 y(u)q(c)o(k)o(en,)16 b(Stauc)o(h)o(ungen,)1258 +1236 y(")1281 1206 y(underfull)h(h)o(b)q(o)o(x)m(\\)k(|)d(und)164 +1267 y(wieder)c(aus)i(einem)c(f)558 1269 y(\177)557 1267 y(ur)j(den)g(Autor)g +(des)g(Dokumen)o(ts)e(unerkl)1323 1269 y(\177)1323 1267 y(arlic)o(hen)g +(Grund.)21 b(Ab)q(er)164 1327 y(denno)q(c)o(h)16 b(k)382 1329 +y(\177)382 1327 y(onnen)h(k)o(eine)d(T)l(rennfehler)h(en)o(tstehen!)237 +1398 y(Das)k(in)o(teraktiv)o(e)581 1408 y(I)598 1398 y(S)625 +1387 y(I)643 1398 y(T)670 1408 y(E)697 1398 y(X)e(bleibt)g(b)q(ei)g(jedem)f +(un)o(b)q(ek)m(ann)o(ten)h(W)l(ort)h(stehen.)25 b(Der)164 1458 +y(Ben)o(utzer)16 b(k)m(ann)j(jetzt)e(en)o(tsc)o(heiden,)f(ob)i(es)g(sic)o(h)f +(um)g(einen)g(Tippfehler)g(o)q(der)h(wirk-)164 1518 y(lic)o(h)f(um)h(ein)g +(un)o(b)q(ek)m(ann)o(tes)h(W)l(ort,)h(d.h.)e(um)f(einen)h(Namen,)g(eine)g +(Abk)1543 1520 y(\177)1542 1518 y(u)o(rzung,)i(ein)164 1578 +y(ausgefallenes)e(F)l(remdw)o(ort)e(o)q(der)j(et)o(w)o(as)958 +1568 y(\177)952 1578 y(A)o(hnlic)o(hes)e(handelt.)27 b(Diese)1508 +1608 y(")1530 1578 y(neuen)18 b(W)1723 1580 y(\177)1723 1578 +y(o)q(r-)164 1639 y(ter)m(\\)24 b(sollen)c(n)o(ur)h(einmal)d(als)j(un)o(b)q +(ek)m(ann)o(t)g(gemeldet)d(w)o(erden,)j(also)h(in)e(den)h(folgen-)164 +1699 y(den)16 b(Pro)q(duktionsl)530 1701 y(\177)530 1699 y(a)q(ufen)f +(desselb)q(en)g(Dokumen)o(ts)g(als)h(b)q(ek)m(ann)o(t)g(akzeptiert)e(w)o +(erden.)164 1759 y(Tippfehler)h(sollen)h(hingegen)g(immer)d(angezeigt)j(w)o +(erden.)237 1830 y(Da)22 b(ab)q(er)g(ein)f(Eingri\013)h(in)f(das)i(gerade)e +(b)q(earb)q(eitete)g(T)1301 1841 y(E)1329 1830 y(X{File)f(nic)o(h)o(t)g(m) +1661 1832 y(\177)1661 1830 y(o)o(glic)o(h)164 1890 y(ist)g(\(d.h.)f(ein)h +(sofortiges)h(Ausb)q(essern)f(der)g(Tippfehler)f(im)g(Dokumen)o(t)g(ginge)h +(w)o(eit)165 1952 y(\177)164 1950 y(ub)q(er)15 b(den)f(Ein\015u\031b)q(ereic) +o(h)g(der)g(Silb)q(en)o(trenn)o(ung)g(hinaus)h(und)g(w)1387 +1952 y(\177)1386 1950 y(urde)g(w)o(eitreic)o(hende)164 2010 +y(Eingri\013e)e(in)g(T)439 2021 y(E)466 2010 y(X)g(erfordern\),)g(sp)q(eic)o +(hert)959 2021 y(I)977 2010 y(S)1004 2000 y(I)1021 2010 y(T)1048 +2021 y(E)1076 2010 y(X)f(die)h(v)o(om)f(Ben)o(utzer)f(als)1578 +2040 y(")1600 2010 y(Tippfeh-)164 2071 y(ler)m(\\)16 b(b)q(ezeic)o(hneten)c +(W)591 2073 y(\177)591 2071 y(orter)i(in)f(einem)e(File,)i(das)h(man)f(b)q +(eim)f(n)1344 2073 y(\177)1344 2071 y(ac)o(hsten)h(Editieren)g(als)164 +2131 y(Ged)251 2133 y(\177)251 2131 y(ac)o(h)o(tnisst)440 2133 +y(\177)439 2131 y(utze)i(v)o(erw)o(enden)g(k)m(ann.)237 2202 +y(W)l(elc)o(he)h(neuen)h(M)592 2204 y(\177)592 2202 y(oglic)o(hk)o(eiten)859 +2212 y(I)877 2202 y(S)904 2191 y(I)922 2202 y(T)949 2212 y(E)976 +2202 y(X)g(bietet,)f(ist)h(zusammenfassend)e(in)i(Ab-)164 2262 +y(bildung)f(1)h(dargestellt.)961 2599 y(6)p eop +%%Page: 7 8 +bop 180 2216 a @beginspecial @setspecial +%%BeginDocument: inst_ber.fg1.ps +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +0 setlinecap 0 setlinejoin +-3.0 635.0 translate 0.720 -0.720 scale +0.500 setlinewidth +n 154 769 m 154 699 l 4 699 l 4 769 l + clp gs col-1 s gr +n 279 659 m 279 699 l gs col-1 s gr +n 279 659 m 469 699 l gs col-1 s gr +n 279 769 m 279 819 l gs col-1 s gr +n 79 769 m 79 819 l gs col-1 s gr +n 359 349 m 359 299 l 199 299 l 199 349 l + clp gs col-1 s gr +n 154 349 m 154 299 l 4 299 l 4 349 l + clp gs col-1 s gr +n 279 259 m 279 299 l gs col-1 s gr +n 279 259 m 464 299 l gs col-1 s gr +n 279 259 m 79 299 l gs col-1 s gr +n 279 349 m 279 399 l gs col-1 s gr +n 464 349 m 464 399 l gs col-1 s gr +n 79 349 m 79 399 l gs col-1 s gr +n 359 259 m 359 209 l 199 209 l 199 259 l + clp gs col-1 s gr +n 279 179 m 279 209 l gs col-1 s gr +3.000 setlinewidth +n 339 179 m 219 179 l 219 149 l 339 149 l + clp gs col-1 s gr +0.500 setlinewidth +n 279 659 m 79 699 l gs col-1 s gr +n 359 659 m 359 609 l 199 609 l 199 659 l + clp gs col-1 s gr +n 279 579 m 279 609 l gs col-1 s gr +3.000 setlinewidth +n 339 579 m 219 579 l 219 549 l 339 549 l + clp gs col-1 s gr +0.500 setlinewidth +n 539 769 m 539 699 l 404 699 l 404 769 l + clp gs col-1 s gr +n 469 769 m 469 819 l gs col-1 s gr +n 524 349 m 524 299 l 404 299 l 404 349 l + clp gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +279 719 m +gs 1 -1 scale (mit angegebenen Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 740 m +gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +n 379 769 m 379 699 l 179 699 l 179 769 l + clp gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +279 761 m +gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +464 419 m +gs 1 -1 scale (Tippfehler ausbessern) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 719 m +gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 740 m +gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 839 m +gs 1 -1 scale (mit Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 860 m +gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 881 m +gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 839 m +gs 1 -1 scale (untrennbar) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 860 m +gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 881 m +gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 319 m +gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 340 m +gs 1 -1 scale (und doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 319 m +gs 1 -1 scale (merken in doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 419 m +gs 1 -1 scale (Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 440 m +gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 461 m +gs 1 -1 scale (und LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 419 m +gs 1 -1 scale (Trennstellen) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +79 440 m +gs 1 -1 scale (wiederverwenden) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 250 m +gs 1 -1 scale (oder Tippfehler) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 229 m +gs 1 -1 scale (Auswahl einer Trennung) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 169 m +gs 1 -1 scale (mehrdeutiges Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 650 m +gs 1 -1 scale (oder Tippfehler) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 629 m +gs 1 -1 scale (neues Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 569 m +gs 1 -1 scale (unbekanntes Wort) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +469 719 m +gs 1 -1 scale (merken in doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +469 839 m +gs 1 -1 scale (Tippfehler ausbessern) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +464 319 m +gs 1 -1 scale (merken in doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +$F2psEnd +%%EndDocument + @endspecial 561 2318 a Ff(Abbildung)16 b(1:)22 b(Die)15 b(neuen)h(M)1135 +2320 y(\177)1135 2318 y(oglic)o(hk)o(eiten)961 2599 y(7)p eop +%%Page: 8 9 +bop 164 331 a Fr(6)288 347 y(I)319 331 y(S)365 315 y(I)396 +331 y(T)439 347 y(E)484 331 y(X)27 b(in)n(tern:)36 b(Die)28 +b(neuen)e(Files)164 451 y Ff(Um)20 b(die)i(obigen)g(Erw)o(eiterungen)g(zu)g +(erm)993 453 y(\177)993 451 y(o)n(glic)o(hen,)g(w)o(erden)g(die)f(en)o +(tsprec)o(henden)164 511 y(Informationen)16 b(in)i(drei)f(Files)f(gesp)q(eic) +o(hert.)1033 541 y(")1055 511 y(doku)m(\\)22 b(steh)o(t)17 +b(im)f(F)l(olgenden)h(f)1644 513 y(\177)1643 511 y(ur)h(den)164 +571 y(Namen)d(des)h(gerade)g(b)q(earb)q(eiteten)g(Dokumen)o(ts.)237 +684 y Fb(\017)24 b Fq(doku.mem)o Ff(:)g(Der)18 b(Ben)o(utzer)g(w)922 +686 y(\177)922 684 y(ahlt)h(b)q(ei)f(mehrdeutigen)f(W)1466 +686 y(\177)1466 684 y(ortern)i(die)f(pas-)286 744 y(sende)e(Bedeutung)h(aus.) +23 b(Diese)16 b(W)l(ahl)h(wird)g(in)f Fc(doku.mem)i Ff(gesp)q(eic)o(hert.)k +(V)l(on)286 804 y(jetzt)h(an)i(w)o(erden)e(alle)g(V)l(ork)o(ommnisse)e +(dieses)i(W)l(ortes)i(en)o(tsprec)o(hend)d(die-)286 864 y(ser)e(F)l +(estlegung)g(getrenn)o(t.)33 b(Ac)o(h)o(tung!)g(Komm)o(t)17 +b(ein)j(W)l(ort)g(mit)f(v)o(ersc)o(hiede-)286 925 y(nen)i(Endungen)h(im)e(T)l +(ext)h(v)o(or,)h(so)g(wird)g(f)1116 927 y(\177)1115 925 y(ur)f(jede)g(V)l +(arian)o(te)f(extra)i(gefragt.)286 985 y(\(Komm)o(t)15 b(also)j(in)f(einem)e +(Dokumen)o(t)h(zB.)g(dreimal)1286 1015 y(")1309 985 y(W)l(ac)o(hstub)q(e)m +(\\)21 b(und)d(f)1699 987 y(\177)1698 985 y(unf-)286 1045 y(mal)388 +1075 y(")411 1045 y(W)l(ac)o(hstub)q(en)m(\\)27 b(v)o(or,)e(so)g(m)o(u\031)e +(der)g(Ben)o(utzer)f(je)i(einmal)e(die)h(ric)o(h)o(tige)286 +1105 y(T)l(renn)o(ung)15 b(f)520 1107 y(\177)519 1105 y(ur)580 +1135 y(")603 1105 y(W)l(ac)o(hstub)q(e)m(\\)k(und)972 1135 +y(")994 1105 y(W)l(ac)o(hstub)q(en)m(\\)g(angeb)q(en.\))j(Eb)q(enso)16 +b(w)o(er-)286 1165 y(den)k(alle)f(W)525 1167 y(\177)525 1165 +y(o)q(rter,)h(die)g(dem)e(System)h(un)o(b)q(ek)m(ann)o(t)h(sind)h(und)f(f) +1496 1167 y(\177)1495 1165 y(ur)g(das)h(Doku-)286 1226 y(men)o(t)f(sp)q +(ezielle)f(F)l(remdw)784 1228 y(\177)784 1226 y(o)o(rter)i(o)q(der)i(Namen)d +(darstellen,)h(durc)o(h)h(ein)f(Kom-)286 1286 y(mando)14 b(des)h(Ben)o +(utzers)e(\(ev)o(en)o(tuell)f(mit)h(den)i(eingegeb)q(enen)f(T)l +(rennstellen\))f(in)286 1346 y Fc(doku.mem)22 b Ff(gesp)q(eic)o(hert.)34 +b(Diese)21 b(Information)f(wird)g(dann)i(b)q(ei)f(allen)f(w)o(eite-)286 +1406 y(ren)371 1417 y(I)389 1406 y(S)416 1395 y(I)434 1406 +y(T)461 1417 y(E)488 1406 y(X)d(Pro)q(duktionsl)816 1408 y(\177)816 +1406 y(a)q(ufen)g(b)q(er)1019 1408 y(\177)1018 1406 y(uc)o(ksic)o(h)o(tigt)f +(und)i(en)o(tsprec)o(hend)e(erw)o(ei-)286 1466 y(tert)e(\(w)o(enn)g(b)q(eim)e +(w)o(eiteren)h(Editieren)g(neue)h(mehrdeutige)e(o)q(der)j(un)o(b)q(ek)m(ann)o +(te)286 1527 y(W)336 1529 y(\177)336 1527 y(orter)h(hinzugef)634 +1529 y(\177)633 1527 y(ugt)g(wurden\).)237 1628 y Fb(\017)24 +b Fq(doku.lex)p Ff(:)c(Bei)15 b(mehrdeutigen)g(und)i(insb)q(esondere)f(b)q +(ei)h(un)o(b)q(ek)m(ann)o(ten)f(W)1723 1630 y(\177)1723 1628 +y(o)q(r-)286 1688 y(tern,)i(k)m(ann)h(sic)o(h)e(der)h(Ben)o(utzer)e(dazu)j +(en)o(tsc)o(hlie\031en,)d(da\031)j(sie)e(\(zus)1576 1690 y(\177)1576 +1688 y(a)q(tzlic)o(h)f(zu)286 1749 y(der)g(erw)446 1751 y(\177)446 +1749 y(ahn)o(ten)g(Ein)o(tragung)h(in)e Fc(doku.mem)p Ff(\))j(in)e(die)f(W)l +(orttab)q(elle)h(v)o(on)g Fd(SiSiSi)286 1809 y Ff(eingetragen)k(w)o(erden)f +(sollen.)33 b(Un)o(b)q(ek)m(ann)o(te)19 b(W)1210 1811 y(\177)1210 +1809 y(o)q(rter)g(k)o(ommen)e(daher)k(auto-)286 1869 y(matisc)o(h)e(und)i +(mehrdeutige)e(W)907 1871 y(\177)907 1869 y(orter)i(auf)g(W)l(unsc)o(h)g(in)f +(das)i(File)d Fc(doku.lex)p Ff(,)286 1929 y(damit)d(sie)h(leic)o(h)o(t)f(mit) +g(dem)830 1959 y(")852 1929 y Fd(LEXIK)o(ON)8 b Ff({System)m(\\)20 +b(am)d(PC)h(in)f(die)g(W)l(ortta-)286 1989 y(b)q(elle)c(eingetragen)i(w)o +(erden)f(k)849 1991 y(\177)849 1989 y(onnen.)20 b(So)15 b(ist)f(es)h(dem)e +(Ben)o(utzer)g(m)1549 1991 y(\177)1549 1989 y(o)o(glic)o(h,)g(eine)286 +2050 y(sp)q(ezielle)h(W)l(orttab)q(elle)i(f)760 2052 y(\177)759 +2050 y(ur)g(seinen)g(p)q(ers)1056 2052 y(\177)1056 2050 y(o)q(nlic)o(hen)e(W) +l(ortsc)o(hatz)j(zu)f(sc)o(ha\013en.)237 2151 y Fb(\017)24 +b Fq(doku.edt)p Ff(:)30 b(Alle)20 b(als)h(Tippfehler)f(erk)m(ann)o(ten)h(W) +1252 2153 y(\177)1252 2151 y(o)q(rter)g(w)o(erden)f(in)h(das)h(File)286 +2211 y Fc(doku.edt)14 b Ff(gesc)o(hrieb)q(en.)19 b(Dieses)12 +b(File)f(un)o(tersc)o(heidet)f(sic)o(h)i(grunds)1554 2213 y(\177)1554 +2211 y(a)q(tzlic)o(h)f(v)o(on)286 2272 y(den)k(b)q(eiden)g(obigen.)22 +b(Ein)o(tragungen)16 b(in)f(diesem)e(File)i(w)o(erden)g(nic)o(h)o(t)f +(automa-)286 2332 y(tisc)o(h)g(f)416 2334 y(\177)415 2332 y(ur)h(w)o(eitere)f +(V)l(ork)o(omme)o(n)e(desselb)q(en)j(W)l(ortes)g(und)h(auc)o(h)f(nic)o(h)o(t) +f(f)1638 2334 y(\177)1637 2332 y(ur)h(w)o(ei-)286 2392 y(tere)g(Durc)o(hl)528 +2394 y(\177)528 2392 y(aufe)g(v)o(erw)o(endet.)20 b(Es)c(ist)f(als)1090 +2422 y(")1113 2392 y(Merk\014le)m(\\)i(des)f(Ben)o(utzers)e(f)1651 +2394 y(\177)1650 2392 y(ur)i(das)286 2452 y(n)313 2454 y(\177)313 +2452 y(ac)o(hste)j(Editieren)g(gedac)o(h)o(t.)30 b(Er)20 b(k)m(ann)g(es)g +(daher)g(ansc)o(hauen,)g(ausdruc)o(k)o(en,)961 2599 y(8)p eop +%%Page: 9 10 +bop 286 307 a Ff(editieren)19 b(und)j(l)608 309 y(\177)608 +307 y(osc)o(hen.)35 b(W)l(eiters)21 b(wird)g(dieses)f(File)g(b)q(ei)h(jedem)e +(Durc)o(hlauf)286 367 y(neu)g(angelegt.)28 b(Das)20 b(ist)f(sinn)o(v)o(oll,)e +(w)o(eil)g(Tippfehler)h(ja)h(nic)o(h)o(t)f(hingenommen)286 +428 y(w)o(erden)d(sollen)f(\(w)o(eder)h(v)o(on)835 438 y(I)853 +428 y(S)880 417 y(I)897 428 y(T)924 438 y(E)952 428 y(X)f(no)q(c)o(h)i(v)o +(om)e(Ben)o(utzer\).)19 b(Es)d(w)o(erden)e(also)286 488 y(imme)o(r)g(alle)i +(Tippfehler)g(gemeldet.)21 b(Das)d(wiederholte)e(Aufmerksamm)n(ac)o(hen)286 +548 y(ist)g(durc)o(haus)g(b)q(eabsic)o(h)o(tigt.)164 660 y(Die)d(Files)e +Fc(doku.mem)k Ff(und)e Fc(doku.lex)h Ff(d)929 662 y(\177)928 +660 y(u)q(rfen)e(nic)o(h)o(t)g(v)o(om)f(Ben)o(utzer)h(v)o(er)1542 +662 y(\177)1542 660 y(a)o(ndert)h(w)o(er-)164 721 y(den,)h(w)o(eil)g(sie)g(v) +o(om)f(System)g(wieder)h(v)o(erw)o(endet)f(w)o(erden.)20 b +Fc(doku.edt)c Ff(darf)f(ge)1645 723 y(\177)1645 721 y(andert)164 +781 y(o)q(der)i(zerst)375 783 y(\177)375 781 y(ort)f(w)o(erden.)164 +958 y Fr(7)83 b(Wie)24 b(erzeugt)f(man)h(ein)f(druc)n(kfertiges)g(Man)n(u-) +288 1049 y(skript)j(mit)677 1065 y(I)709 1049 y(S)755 1033 +y(I)786 1049 y(T)829 1065 y(E)873 1049 y(X?)164 1169 y Ff(Beim)11 +b(ersten)16 b(Editieren)p 288 1177 340 2 v 12 w(b)q(ereitet)d(man)g(das)h +(Man)o(uskript)f(genauso)i(wie)e(f)1550 1171 y(\177)1549 1169 +y(ur)1609 1199 y(")1631 1169 y(norma-)164 1230 y(les)m(\\)20 +b(T)287 1240 y(E)314 1230 y(X)d(auf.)24 b(Die)17 b(Befehle)e(f)750 +1232 y(\177)749 1230 y(ur)i(die)f(F)l(on)o(ts,)h(die)g(F)l(ormate,)e(usw.)j +(f)1454 1232 y(\177)1453 1230 y(ugt)f(man)f(in)h(den)164 1290 +y(T)l(ext)f(ein.)237 1361 y(Beim)j(ersten)d(Durc)o(hlauf)p +369 1369 355 2 v 21 w(durc)o(h)21 b(das)979 1371 y(I)996 1361 +y(S)1023 1350 y(I)1041 1361 y(T)1068 1371 y(E)1095 1361 y(X{System)f(b)q(ean) +o(t)o(w)o(ortet)h(man)g(die)164 1421 y(F)l(ragen)e(des)h(Systems)e(b)q(ez)680 +1423 y(\177)679 1421 y(uglic)o(h)g(mehrdeutiger)f(und)i(un)o(b)q(ek)m(ann)o +(ter)g(W)1557 1423 y(\177)1557 1421 y(o)q(rter)g(sinn-)164 +1481 y(v)o(oll.)25 b(Es)18 b(en)o(tstehen)f(die)h(Files)e Fc(doku.mem)p +Ff(,)j Fc(doku.lex)h Ff(und)e Fc(doku.edt)h Ff(\(siehe)e(Ab-)164 +1541 y(bildung)f(2\).)237 1612 y(Im)d(allgemeinen)f(wird)j(man)f(auc)o(h)g +(das)i(en)o(tstandene)e(File)h(druc)o(k)o(en)p 1258 1620 264 +2 v -2 w(,)g(um)f(w)o(eitere)164 1672 y(Hin)o(w)o(eise)j(f)385 +1674 y(\177)384 1672 y(ur)i(Korrekturen)g(im)e(Man)o(uskript)i(zu)g +(erhalten.)30 b(In)19 b(diesem)e(Ausdruc)o(k)164 1733 y(sind)g(sc)o(hon)g +(alle)g(T)l(rennstellen)f(b)q(er)843 1735 y(\177)842 1733 y(uc)o(ksic)o(h)o +(tigt,)f(die)h(man)g(|)h(wie)g(in)g(Kapitel)f(6)i(b)q(e-)164 +1793 y(sc)o(hrieb)q(en)d(|)h(an)h(das)g(File)e Fc(doku.mem)i +Ff(gemeldet)d(hat.)237 1864 y(Jetzt)k(k)m(ann)i(man)e(die)g(W)l(orttab)q +(elle)p 675 1872 251 2 v 19 w(mit)f(dem)g(System)h Fd(LEXIK)o(ON)27 +b Ff(erw)o(eitern.)164 1924 y(Man)18 b(wird)g(\(siehe)f(Kapitel)f(10\))j +(alle)e(sp)q(eziellen)f(W)1152 1926 y(\177)1152 1924 y(orter)i(dieses)f +(Dokumen)o(ts,)f(bzw.)164 1984 y(des)f(F)l(ac)o(h)o(v)o(ok)m(abulars)g(ein)o +(tragen.)21 b Fd(LEXIK)o(ON)i Ff(b)q(en)o(utzt)15 b(dab)q(ei)g(das)h(File)e +Fc(doku.lex)p Ff(.)237 2055 y(Danac)o(h)20 b(erfolgt)f(das)h(n)690 +2057 y(\177)690 2055 y(a)q(c)o(hste)c(Editieren)p 663 2063 +371 2 v -2 w(.)31 b(Mit)19 b(den)g(Hin)o(w)o(eisen)e(aus)j(dem)e(File)164 +2115 y Fc(doku.edt)13 b Ff(und)f(den)f(Erk)o(enn)o(tnissen)f(v)o(om)g +(Korrekturlesen)h(wird)g(man)g(insb)q(esondere)164 2175 y(alle)23 +b(Tippfehler)f(k)o(orrigieren,)h(ab)q(er)h(auc)o(h)g(andere)f(Korrekturen)g +(im)e(Man)o(uskript)164 2236 y(v)o(ornehmen.)237 2306 y(Beim)13 +b(folgenden)j(n)608 2308 y(\177)608 2306 y(a)q(c)o(hsten)f(Durc)o(hlauf)p +581 2314 413 2 v 16 w(bleibt)g(das)h(System)e(nic)o(h)o(t)h(mehr)f(b)q(ei)i +(al-)164 2367 y(len)11 b(mehrdeutigen)e(und)j(un)o(b)q(ek)m(ann)o(ten)g(W)965 +2369 y(\177)965 2367 y(ortern,)g(die)f(in)g(einem)e(fr)1418 +2369 y(\177)1417 2367 y(uheren)i(Durc)o(hlauf)164 2427 y(in)j +Fc(doku.mem)i Ff(eingetragen)e(wurden,)h(stehen.)20 b(Am)13 +b(Anfang)i(dieses)f(Durc)o(hlaufs)g(gibt)961 2599 y(9)p eop +%%Page: 10 11 +bop 164 307 a Ff(es)17 b(jedo)q(c)o(h)h(Gelegenheit,)d(fr)692 +309 y(\177)691 307 y(uhere)i(falsc)o(he)g(F)l(estlegungen)g(zu)g(l)1356 +309 y(\177)1356 307 y(osc)o(hen.)24 b(Neue)16 b(mehr-)164 367 +y(deutige)d(o)q(der)h(un)o(b)q(ek)m(ann)o(te)f(W)746 369 y(\177)746 +367 y(o)q(rter)g(\(auc)o(h)g(alte)g(Tippfehler\))g(w)o(erden)g(wie)g(im)e +(ersten)164 428 y(Durc)o(hgang)17 b(b)q(ehandelt.)237 498 y(Diese)e(V)l(org) +466 500 y(\177)466 498 y(a)q(nge)h(w)o(erden)f(solange)i(wiederholt,)e(bis)g +(die)h(Qualit)1459 500 y(\177)1459 498 y(at)f(des)h(gedruc)o(k-)164 +559 y(ten)g(Man)o(uskripts)g(den)g(Anspr)751 561 y(\177)750 +559 y(uc)o(hen)g(gen)964 561 y(\177)963 559 y(ugt.)237 630 +y(Die)g(W)l(ege,)f(die)h(die)f(Daten)i(nehmen,)d(sind)i(in)g(Abbildung)f(2)i +(zusammenfassend)164 690 y(dargestellt.)164 867 y Fr(8)288 +906 y(")328 867 y(xxx)-6 b(\\)33 b(ist)28 b(ein)g(mehrdeutiges)f(W)-7 +b(ort!)40 b(|)29 b(w)n(as)288 958 y(tun?)164 1078 y Ff(W)l(enn)302 +1089 y(I)320 1078 y(S)347 1068 y(I)365 1078 y(T)392 1089 y(E)419 +1078 y(X)16 b(ein)g(mehrdeutiges)e(W)l(ort)j(\014ndet,)f(dann)h(sieh)o(t)f +(das)h(folgenderma\031en)164 1139 y(aus)g(\(am)e(Beispiel)f(des)j(W)l(ortes) +782 1168 y(")805 1139 y(W)l(ac)o(hstub)q(e)m(\\)s(\):)164 1251 +y Fc(`wachstube')28 b(ist)e(ein)h(mehrdeutiges)h(Wort!)190 +1311 y(0:)f(nur)f(die)h(sicheren)g(Trennstellen)h(waehlen)f(\(`wachstu-be'\)) +190 1371 y(1:)g(`wach=stu-be')190 1432 y(2:)g(`wachs=tu-be')190 +1492 y(9:)g(Tippfehler!)g(-)g(merken)g(im)f(File)h(`doku.edt')164 +1552 y(Bitte)g(waehlen)g(Sie)g(eine)f(Bedeutung)i(z.B.)f(`0'+`Enter')h(aus:) +190 1612 y(\(zusaetzlich)g(E)e(z.B.)h(`0E'+`Enter':)216 1672 +y(Wort)g(auch)g(fuer)g(LEXIKON)g(vormerken\))164 1785 y Ff(Nun)17 +b(m)o(u\031)f(man)h(eine)f(Zi\013er)h(gefolgt)h(v)o(on)974 +1815 y(")996 1785 y(En)o(ter)m(\\)j(eingeb)q(en.)j(Ist)17 b(z.B.)f(die)h +(Bedeu-)164 1845 y(tung)281 1875 y(")304 1845 y(W)l(ac)o(h=stub)q(e)m(\\)23 +b(die)c(gemein)o(te,)e(so)j(gibt)g(man)1202 1875 y(")1224 1845 +y(1)m(\\)s(+)1310 1875 y(")1333 1845 y(En)o(ter)m(\\)j(ein.)30 +b(Ab)20 b(jetzt)164 1905 y(wird)i(das)h(W)l(ort)504 1935 y(")527 +1905 y(W)l(ac)o(hstub)q(e)m(\\)j(im)20 b(ganzen)i(Dokumen)o(t)f(und)i(auc)o +(h)f(in)f(k)1609 1907 y(\177)1608 1905 y(unftigen)164 1965 +y(Durc)o(hl)309 1967 y(\177)309 1965 y(aufen)d(en)o(tsprec)o(hend)f(getrenn)o +(t.)27 b(T)l(ritt)18 b(der)1164 1967 y(\177)1163 1965 y(ub)q(eraus)h(seltene) +e(F)l(all)h(auf,)h(da\031)164 2026 y(ein)i(W)l(ort)i(tats)460 +2028 y(\177)460 2026 y(a)q(c)o(hlic)o(h)d(in)h(mehreren)f(Bedeutungen)i(in)f +(ein)h(und)g(demselb)q(en)e(Do-)164 2086 y(kumen)o(t)g(v)o(ork)o(omm)n(t,)g +(so)i(k)m(ann)h(man)d(sic)o(h)h(durc)o(h)1145 2116 y(")1167 +2086 y(0)m(\\)s(+)1253 2116 y(")1276 2086 y(En)o(ter)m(\\)k(auf)d(die)f(sic)o +(heren)164 2146 y(T)l(rennstellen)14 b(b)q(esc)o(hr)577 2148 +y(\177)577 2146 y(ank)o(en.)20 b(Will)14 b(man)g(das)i(W)l(ort)g(sp)1205 +2148 y(\177)1205 2146 y(ater)f(auc)o(h)g(in)g(die)f(W)l(orttab)q(el-)164 +2206 y(le)g(ein)o(tragen,)g(so)h(gibt)g(man)f(zus)771 2208 +y(\177)771 2206 y(a)q(tzlic)o(h)f(no)q(c)o(h)i(ein)1118 2236 +y(")1140 2206 y(E)m(\\)j(an)e(\(also)f(zB.)1479 2236 y(")1501 +2206 y(1E)m(\\)s(+)1620 2236 y(")1643 2206 y(En)o(ter)m(\\)164 +2266 y(statt)278 2296 y(")301 2266 y(1)m(\\)s(+)387 2296 y(")410 +2266 y(En)o(ter)m(\\)s(\).)20 b(Dadurc)o(h)15 b(wird)e(das)i(W)l(ort)f(zus) +1186 2268 y(\177)1186 2266 y(a)q(tzlic)o(h)e(in)h(das)i(File)e +Fc(doku.lex)164 2327 y Ff(eingetragen,)k(das)h(die)f(Arb)q(eit)g(mit)e(dem)h +(Lexik)o(on{System)g(erleic)o(h)o(tert.)21 b(Gibt)d(man)164 +2416 y(")186 2387 y(9)m(\\)s(+)272 2416 y(")296 2387 y(En)o(ter)m(\\)c(ein,)e +(so)h(wird)e(das)i(W)l(ort)f(n)o(ur)g(\(!\))20 b(ins)12 b(File)e +Fc(doku.edt)k Ff(gesc)o(hrieb)q(en)d(und)164 2447 y(k)m(ann)17 +b(dann)g(b)q(eim)d(Editieren)h(v)o(on)i Fc(doku.tex)g Ff(gesuc)o(h)o(t)f(und) +g(ausgeb)q(essert)i(w)o(erden.)949 2599 y(10)p eop +%%Page: 11 12 +bop 180 2240 a @beginspecial @setspecial +%%BeginDocument: inst_ber.fg2.ps +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/l {lineto} bind def +/m {moveto} bind def +/s {stroke} bind def +/n {newpath} bind def +/gs {gsave} bind def +/gr {grestore} bind def +/clp {closepath} bind def +/graycol {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul +4 -2 roll mul setrgbcolor} bind def +/col-1 {} def +/col0 {0 0 0 setrgbcolor} bind def +/col1 {0 0 1 setrgbcolor} bind def +/col2 {0 1 0 setrgbcolor} bind def +/col3 {0 1 1 setrgbcolor} bind def +/col4 {1 0 0 setrgbcolor} bind def +/col5 {1 0 1 setrgbcolor} bind def +/col6 {1 1 0 setrgbcolor} bind def +/col7 {1 1 1 setrgbcolor} bind def + end +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def + +$F2psBegin +0 setlinecap 0 setlinejoin +-72.0 549.0 translate 0.900 -0.900 scale +0.500 setlinewidth +n 299 489 m 299 439 l 179 439 l 179 489 l + clp gs col-1 s gr +n 324 609 m 324 559 l 154 559 l 154 609 l + clp gs col-1 s gr +n 559 289 m 559 259 l 439 259 l 439 289 l + clp gs col-1 s gr +n 256 184 m 249 184 249 197 7 arcto 4 {pop} repeat 249 204 302 204 7 arcto 4 {pop} repeat 309 204 309 191 7 arcto 4 {pop} repeat 309 184 256 184 7 arcto 4 {pop} repeat clp gs col-1 s gr +n 136 364 m 129 364 129 377 7 arcto 4 {pop} repeat 129 384 182 384 7 arcto 4 {pop} repeat 189 384 189 371 7 arcto 4 {pop} repeat 189 364 136 364 7 arcto 4 {pop} repeat clp gs col-1 s gr +n 256 404 m 249 404 249 417 7 arcto 4 {pop} repeat 249 424 302 424 7 arcto 4 {pop} repeat 309 424 309 411 7 arcto 4 {pop} repeat 309 404 256 404 7 arcto 4 {pop} repeat clp gs col-1 s gr +n 256 524 m 249 524 249 537 7 arcto 4 {pop} repeat 249 544 302 544 7 arcto 4 {pop} repeat 309 544 309 531 7 arcto 4 {pop} repeat 309 524 256 524 7 arcto 4 {pop} repeat clp gs col-1 s gr +n 239 149 m 239 259 l gs col-1 s gr +n 241.000 251.000 m 239.000 259.000 l 237.000 251.000 l gs 2 setlinejoin col-1 s gr +n 219 289 m 219 309 l 99 309 l 99 239 l + 219 239 l 219 259 l gs col-1 s gr +n 221.000 251.000 m 219.000 259.000 l 217.000 251.000 l gs 2 setlinejoin col-1 s gr +n 229 289 m 229 359 l 79 359 l 79 99 l + 229 99 l 229 119 l gs col-1 s gr +n 231.000 111.000 m 229.000 119.000 l 227.000 111.000 l gs 2 setlinejoin col-1 s gr +n 239 289 m 239 439 l gs col-1 s gr +n 241.000 431.000 m 239.000 439.000 l 237.000 431.000 l gs 2 setlinejoin col-1 s gr +n 259 289 m 259 309 l 499 309 l 499 289 l gs col-1 s gr +n 497.000 297.000 m 499.000 289.000 l 501.000 297.000 l gs 2 setlinejoin col-1 s gr +n 499 259 m 499 239 l 259 239 l 259 259 l gs col-1 s gr +n 261.000 251.000 m 259.000 259.000 l 257.000 251.000 l gs 2 setlinejoin col-1 s gr +n 239 489 m 239 559 l gs col-1 s gr +n 241.000 551.000 m 239.000 559.000 l 237.000 551.000 l gs 2 setlinejoin col-1 s gr +n 269 149 m 269 119 l 209 119 l 209 149 l + clp gs col-1 s gr +n 269 289 m 269 259 l 209 259 l 209 289 l + clp gs col-1 s gr +n 131 314 m 124 314 124 327 7 arcto 4 {pop} repeat 124 334 187 334 7 arcto 4 {pop} repeat 194 334 194 321 7 arcto 4 {pop} repeat 194 314 131 314 7 arcto 4 {pop} repeat clp gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +379 224 m +gs 1 -1 scale (Worttabelle) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +n 356 314 m 349 314 349 327 7 arcto 4 {pop} repeat 349 334 402 334 7 arcto 4 {pop} repeat 409 334 409 321 7 arcto 4 {pop} repeat 409 314 356 314 7 arcto 4 {pop} repeat clp gs col-1 s gr +n 346 204 m 339 204 339 227 7 arcto 4 {pop} repeat 339 234 412 234 7 arcto 4 {pop} repeat 419 234 419 211 7 arcto 4 {pop} repeat 419 204 346 204 7 arcto 4 {pop} repeat clp gs col-1 s gr +/Times-Roman findfont 14.00 scalefont setfont +239 139 m +gs 1 -1 scale (EDITOR) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 199 m +gs 1 -1 scale (doku.tex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 279 m +gs 1 -1 scale (iSiTeX) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +159 379 m +gs 1 -1 scale (doku.edt) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 459 m +gs 1 -1 scale (DVI2PS) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 480 m +gs 1 -1 scale (\(..dvi to Postscript\)) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 579 m +gs 1 -1 scale (PRINT) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +239 600 m +gs 1 -1 scale (\(Postscript-Laserdrucker\)) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 419 m +gs 1 -1 scale (doku.dvi) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +279 539 m +gs 1 -1 scale (doku.ps) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +499 279 m +gs 1 -1 scale (LEXIKON am PC) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +159 329 m +gs 1 -1 scale (doku.mem) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +/Times-Roman findfont 14.00 scalefont setfont +379 329 m +gs 1 -1 scale (doku.lex) dup stringwidth pop 2 div neg 0 rmoveto col-1 show gr +$F2psEnd +%%EndDocument + @endspecial 608 2402 a Ff(Abbildung)15 b(2:)22 b(Die)16 b(W)l(ege)g(der)g +(Daten)949 2599 y(11)p eop +%%Page: 12 13 +bop 164 315 a Fr(9)288 354 y(")328 315 y(xxx)-6 b(\\)37 b(ist)c(ein)f(un)n(b) +r(ek)-5 b(ann)n(tes)32 b(W)-7 b(ort!)54 b(|)33 b(w)n(as)288 +407 y(tun?)164 526 y Ff(W)l(enn)304 536 y(I)322 526 y(S)349 +515 y(I)367 526 y(T)394 536 y(E)421 526 y(X)18 b(ein)g(un)o(b)q(ek)m(ann)o +(tes)g(W)l(ort)h(\014ndet,)g(dann)g(sieh)o(t)f(das)h(folgenderma\031en)164 +586 y(aus)e(\(am)e(Beispiel)f(des)j(W)l(ortes)782 616 y(")805 +586 y(Acet)o(ylsalicyl)o(s)1095 588 y(\177)1095 586 y(a)n(ure)m(\\)s(\):)164 +688 y Fc(`acetylsalicyls"aure')29 b(ist)e(ein)g(unbekanntes)g(Wort!)190 +748 y(0:)g(neues)f(Wort,)h(merken)g(in)g(`doku.lex')190 809 +y(1:)g(neues)f(Wort,)h(Trennstellen)h(angeben)g(und)e(merken)h(in)g +(`doku.lex')190 869 y(9:)g(Tippfehler!)g(-)g(merken)g(im)f(File)h(`doku.edt') +164 929 y(Bitte)g(waehlen)g(Sie)g(eine)f(Bedeutung)i(\(0,1,9\))f(aus:)164 +1032 y Ff(Nun)20 b(m)o(u\031)e(man)h(eine)g(Zi\013er)h(gefolgt)g(v)o(on)991 +1061 y(")1014 1032 y(En)o(ter)m(\\)j(eingeb)q(en.)31 b(Ist)20 +b(das)h(W)l(ort)f(b)q(ei-)164 1092 y(spielsw)o(eise)f(ein)h(kurzes)g(F)l +(remdw)o(ort,)g(so)h(gibt)g(man)1196 1121 y(")1219 1092 y(0)m(\\)s(+)1305 +1121 y(")1328 1092 y(En)o(ter)m(\\)j(ein.)33 b(Ab)21 b(jetzt)164 +1152 y(ist)f(das)g(W)l(ort)g(b)q(ek)m(ann)o(t;)i(es)e(wird)f(jedo)q(c)o(h)h +(nic)o(h)o(t)e(getrenn)o(t.)32 b(Es)20 b(wird)g(in)f(den)h(Files)164 +1212 y Fc(doku.mem)c Ff(und)e(auc)o(h)h Fc(doku.lex)g Ff(gesp)q(eic)o(hert,)f +(um)f(es)h(nac)o(hher)g(ev)o(en)o(tuell)e(mit)g(dem)164 1272 +y Fd(LEXIK)o(ON)c Ff({System)17 b(leic)o(h)o(t)f(in)i(die)g(W)l(orttab)q +(elle)g(ein)o(tragen)g(zu)g(k)1445 1274 y(\177)1445 1272 y(onnen.)28 +b(Handelt)164 1333 y(es)16 b(sic)o(h)g(b)q(ei)g(dem)f(un)o(b)q(ek)m(ann)o +(ten)h(W)l(ort)h(ab)q(er)g(um)e(ein)g(langes)i(\(zusammengesetztes\))164 +1393 y(fremdes)k(W)l(ort,)i(so)g(ist)g(es)f(|)g(aus)h(den)f(ob)q(en)h(genann) +o(ten)g(Gr)1385 1395 y(\177)1384 1393 y(unden)g(|)f(sinn)o(v)o(oll,)164 +1453 y(T)l(rennstellen)d(v)o(orzugeb)q(en.)33 b(Zu)20 b(diesem)e(Zw)o(ec)o(k) +h(tippt)h(man)1364 1483 y(")1387 1453 y(1)m(\\)s(+)1473 1483 +y(")1496 1453 y(En)o(ter)m(\\)s(.)33 b(Dar-)164 1513 y(aufhin)16 +b(ersc)o(hein)o(t)f(dann)i(folgende)f(Eingab)q(eau\013orderung:)164 +1616 y Fc(Bitte)27 b(den)f(Trennvektor)i(angeben)190 1676 y(\(`-')f +(Nebentrennstelle,)i(`=')d(Haupttrennstelle,)j(`.')e(Weiterruecken,)190 +1736 y(Trennstrich)h(unter)f(dem)f(Buchstaben)i(angeben,)f(hinter)h(dem)190 +1796 y(getrennt)f(werden)h(soll\):)164 1856 y(acetylsalicyls"aure)164 +1959 y Ff(Nun)16 b(k)m(ann)h(man)e(direkt)h(un)o(ter)f(dem)g(W)l(ort)i(die)e +(T)l(rennstellen)g(angeb)q(en:)164 2061 y Fc(acetylsalicyls"aure)164 +2122 y(..-..=.-.-..=...-)164 2224 y Ff(Nac)o(hdem)20 b(man)498 +2254 y(")521 2224 y(En)o(ter)m(\\)25 b(gedr)779 2226 y(\177)778 +2224 y(uc)o(kt)c(hat,)j(ist)1073 2254 y(")1096 2224 y(acet)o(ylsalicyls)1374 +2226 y(\177)1374 2224 y(a)n(ure)m(\\)h(b)q(ek)m(ann)o(t)e(und)164 +2284 y(wird)16 b(gegeb)q(enenfalls)595 2314 y(")618 2284 y(ace-t)o +(yl=sa-li-cyl=s)1020 2286 y(\177)1020 2284 y(a)n(u-re)m(\\)k(getrenn)o(t.)237 +2354 y(Als)e(dritte)f(W)l(ahlm)615 2356 y(\177)615 2354 y(o)o(glic)o(hk)o +(eit)e(hat)k(man)e(no)q(c)o(h)1150 2383 y(")1173 2354 y(9)m(\\)s(+)1259 +2383 y(")1282 2354 y(En)o(ter)m(\\)s(.)26 b(Dann)19 b(wird)f(das)164 +2414 y(W)l(ort)23 b(ins)g(File)482 2444 y(")504 2414 y(doku.edt)m(\\)j(gesc)o +(hrieb)q(en)c(und)h(k)m(ann)h(dann)f(b)q(eim)e(Editieren)h(v)o(on)164 +2504 y(")186 2474 y(doku.tex)m(\\)d(gesuc)o(h)o(t)d(und)h(ausgeb)q(essert)g +(w)o(erden.)949 2599 y(12)p eop +%%Page: 13 14 +bop 164 329 a Fr(10)340 315 y(\177)329 329 y(Anderung)27 b(der)g(W)-7 +b(orttab)r(elle)164 449 y Ff(Es)19 b(ist)f(zu)g(empfehlen,)e(sp)q(ezielle)g +(W)863 451 y(\177)863 449 y(o)q(rter)i(des)g(b)q(en)o(utzereigenen)f(V)l(ok)m +(abulars)i(auc)o(h)164 510 y(wirklic)o(h)j(in)h(die)g(W)l(orttab)q(elle)g +(einzutragen.)43 b Fd(SiSiSi)29 b Ff(k)o(enn)o(t)23 b(n)1408 +512 y(\177)1408 510 y(amlic)o(h)e(nac)o(h)i(dem)164 570 y(Ein)o(tragen)18 +b(eines)g(solc)o(hen)f(neuen)h(W)l(ortes)h(auc)o(h)f(alle)g(Ab)o(w)o +(andlungen)f(dieses)h(W)l(or-)164 630 y(tes,)e(die)g(durc)o(h)h(V)l +(oransetzen)f(v)o(on)h(V)l(orsilb)q(en)f(o)q(der)h(auc)o(h)g(Anf)1360 +632 y(\177)1359 630 y(ugen)g(v)o(on)f(Endungen)164 690 y(en)o(tstehen,)24 +b(so)o(wie)f(alle)g(seine)g(Kom)o(binationen)f(mit)g(anderen)h(W)1453 +692 y(\177)1453 690 y(o)q(rtern.)43 b(Nat)1722 692 y(\177)1721 +690 y(ur-)164 750 y(lic)o(h)16 b(erk)o(enn)o(t)g Fd(SiSiSi)24 +b Ff(diese)17 b(W)753 752 y(\177)753 750 y(orter)g(dann)h(alle)f(ric)o(h)o +(tig)f(und)i(trenn)o(t)f(sie)g(b)q(ei)g(Bedarf)164 811 y(k)o(orrekt.)28 +b(Beispielsw)o(eise)16 b(sind)j(k)o(eine)f(Tiernamen)f(in)h(der)h(normalen)f +(W)l(orttab)q(elle.)164 871 y(T)l(r)214 873 y(\177)214 871 +y(agt)c(der)f(Ben)o(utzer,)f(der)g(ein)h(Tierbuc)o(h)f(sc)o(hreibt,)g(F)l(uc) +o(hs)p 1148 879 122 2 v 13 w(als)h(Stamm)e(in)i(die)f(T)l(ab)q(el-)164 +931 y(le)17 b(ein,)h(dann)h(b)q(ehandelt)f Fd(SiSiSi)24 b Ff(auc)o(h)18 +b(F)l(uc)o(hses,)g(Silb)q(erfuc)o(hs,)f(F)l(uc)o(hssc)o(h)o(w)o(anz)g(und)164 +1021 y(")186 991 y(es)i(fuc)o(hst)f(mic)o(h)m(\\)h(k)o(orrekt)e(wie)h(jedes)g +(andere)g(W)l(ort.)28 b(Allerdings)17 b(m)1505 993 y(\177)1504 +991 y(u)o(ssen)i(F)1669 993 y(\177)1668 991 y(uc)o(hse)164 +1051 y(w)o(egen)d(der)g(W)l(andlung)h(des)f(u)h(in)e(ein)890 +1053 y(\177)889 1051 y(u)h(gesondert)h(eingetragen)f(w)o(erden.)237 +1122 y(Man)25 b(sollte)g(n)o(ur)f(neue)h(W)l(ortst)860 1124 +y(\177)860 1122 y(a)q(mme)d(ein)o(tragen.)47 b(Bei)24 b(F)l(remdw)1539 +1124 y(\177)1539 1122 y(o)n(rtern)h(m)o(u\031)164 1182 y(man)c(jedo)q(c)o(h)i +(darauf)g(ac)o(h)o(ten,)f(ob)h(eine)e(Ausnahme)g(zu)i(den)f(Duden{Regeln)g(v) +o(or-)164 1243 y(liegt.)e(Dazu)15 b(m)o(u\031)f(man)g(sic)o(h)h(naturgem)929 +1245 y(\177)929 1243 y(a)o(\031)h(mit)d(dieser)h(Problematik)f(b)q(efassen,)j +(z.B.)164 1303 y([5],)e([6])h(und)g([9].)20 b(Ausnahmen)14 +b(sind)h(z.B.)f(Pro-gramm,)f(Kata-strophe,)j(Pin-up-girl,)164 +1363 y(P)o(an-ora-ma.)22 b(Man)16 b(m)o(u\031)f(rec)o(h)o(t)g(sorgf)890 +1365 y(\177)890 1363 y(a)q(ltig)h(arb)q(eiten.)237 1434 y(Man)h(k)m(ann)f +(folgende)g(Morphem-Arten)f(in)h(die)f(W)l(orttab)q(elle)h(ein)o(tragen:)p +164 1511 1812 2 v 163 1571 2 61 v 237 1571 V 263 1553 a(Art)p +854 1571 V 545 w(Kurzb)q(ezeic)o(hn)o(ung)p 1275 1571 V 52 +w(Erkl)1393 1555 y(\177)1393 1553 y(arung)p 1975 1571 V 164 +1573 1812 2 v 163 1693 2 121 v 189 1615 a(1)p 237 1693 V 50 +w(Stamm)p 854 1693 V 639 w(s)p 1275 1693 V 226 w(normaler)31 +b(Stamm,)i(wird)g(nac)o(h)1301 1675 y(Duden{Regeln)16 b(getrenn)o(t)p +1975 1693 V 164 1695 1812 2 v 163 1935 2 241 v 189 1737 a(2)p +237 1935 V 50 w(Stamm,)j(nic)o(h)o(t)f(geeignet)i(f)785 1739 +y(\177)784 1737 y(ur)263 1797 y(W)l(ortzusammensetzungen)p +854 1935 V 1046 1737 a(st)p 1275 1935 V 217 w(Wie)49 b(1,)59 +b(jedo)q(c)o(h)50 b(k)m(ann)h(die-)1301 1797 y(ser)23 b(Stamm)d(nic)o(h)o(t)i +(mit)e(anderen)1301 1857 y(zu)29 b(einem)e(zusammengesetzte)o(n)1301 +1917 y(W)l(ort)16 b(v)o(erkn)1545 1919 y(\177)1544 1917 y(u)o(pft)h(w)o +(erden)p 1975 1935 V 164 1937 1812 2 v 163 2178 2 241 v 189 +1979 a(3)p 237 2178 V 50 w(Ausnahme)p 854 2178 V 426 w(a)g +Fd(i)g(j)33 b Ff(o)q(der)g(a)17 b Fd(i)p 1275 2178 V 84 w Ff(Es)27 +b(wird)g(ab)o(w)o(eic)o(hend)f(v)o(on)h(den)1301 2039 y(Dudenregeln)k(nac)o +(h)h(dem)e Fd(i)p Ff(-ten)1301 2100 y(und)14 b Fd(j)p Ff(-ten)h(Buc)o(hstab)q +(en)f(getrenn)o(t)1301 2160 y(\(und)i(n)o(ur)g(dort\))p 1975 +2178 V 164 2179 1812 2 v 163 2420 2 241 v 189 2222 a(4)p 237 +2420 V 50 w(Ausnahme)f(mit)f(Ende{Mar-)263 2282 y(kierung)p +854 2420 V 880 2222 a(au)j Fd(i)g(k)33 b Ff(o)q(der)g(au)17 +b Fd(k)p 1275 2420 V 50 w Ff(Wie)f(3,)g(jedo)q(c)o(h)h(de\014niert)e +Fd(k)i Ff(k)o(eine)1301 2282 y(T)l(rennstelle,)37 b(nac)o(h)d(dem)e +Fd(k)p Ff(-ten)1301 2342 y(Buc)o(hstab)q(en)17 b(setzen)f(die)h(Duden-)1301 +2402 y(Regeln)e(wieder)h(ein)p 1975 2420 V 164 2422 1812 2 +v 949 2599 a(13)p eop +%%Page: 14 15 +bop 164 267 1805 2 v 163 328 2 61 v 237 328 V 263 309 a Ff(Art)p +854 328 V 542 w(Kurzb)q(ezeic)o(hn)o(ung)p 1268 328 V 48 w(Erkl)1386 +311 y(\177)1386 309 y(arung)p 1968 328 V 164 329 1805 2 v 163 +450 2 121 v 189 371 a(5)p 237 450 V 50 w(V)l(orsilb)q(e)p 854 +450 V 613 w(v)p 1268 450 V 219 w(Nac)o(h)35 b(der)h(V)l(orsilb)q(e)g(wird)f +(ge-)1294 432 y(trenn)o(t)p 1968 450 V 164 451 1805 2 v 163 +632 2 181 v 189 493 a(6)p 237 632 V 50 w(Endung)p 854 632 V +623 w(e)p 1268 632 V 221 w(Die)16 b(Endung\(en\))i(wird)e(mit)f(dem)1294 +554 y(Stamm)9 b(zusammen)h(den)h(Duden{)1294 614 y(Regeln)16 +b(un)o(terw)o(orfen)p 1968 632 V 164 633 1805 2 v 237 709 a(Die)336 +698 y(\177)330 709 y(Anderung)21 b(der)g(W)l(orttab)q(elle)f(k)m(ann)i(man)d +(auf)j(eine)d(der)i(folgenden)g(Arten)164 769 y(durc)o(hf)301 +771 y(\177)300 769 y(uhren:)218 881 y(a\))k(mit)14 b(dem)h(mitgelieferte)o(n) +f(Lexik)o(on-System)g(auf)i(einem)e(PC)p 286 899 1148 2 v 286 +941 a(Auf)e(dem)g(PC)h(un)o(terst)713 943 y(\177)712 941 y(utzt)g(Sie)f(ein)g +(Dialogsystem)g(b)q(eim)g(Einf)1466 943 y(\177)1465 941 y(u)o(gen)i(der)e +(neuen)286 1002 y(W)336 1003 y(\177)336 1002 y(orter.)40 b(Sie)22 +b(brauc)o(hen)g(sic)o(h)f(um)h(Einzelheiten)e(der)i(Ko)q(dierung)h(nic)o(h)o +(t)e(zu)286 1062 y(k)313 1064 y(\177)312 1062 y(ummern.)26 +b(Au\031erdem)17 b(zeigt)h(Ihnen)g(das)i(System)d(in)i(jedem)e(F)l(all)h(zur) +g(Kon-)286 1122 y(trolle)d(an,)i(wie)e Fd(SiSiSi)23 b Ff(v)o(on)16 +b(n)o(un)g(an)h(die)e(fraglic)o(hen)g(W)1336 1124 y(\177)1336 +1122 y(o)q(rter)h(trennen)g(wird.)286 1203 y(Nac)o(h)i(der)505 +1192 y(\177)499 1203 y(Anderung)h(m)771 1205 y(\177)770 1203 +y(u)o(ssen)f(Sie)g(die)g(W)l(orttab)q(elle)g(w)o(orttab.h)o(tx)h(mit)d(dem) +286 1263 y(h)o(tx2tex{Programm)d(in)h(die)g(un)o(ter)h(UNIX)1115 +1265 y(\177)1114 1263 y(ublic)o(he)e(Ko)q(dierung)i(\(4)g(f)1591 +1265 y(\177)1590 1263 y(ur)1651 1265 y(\177)1651 1263 y(a,)g +Fa(:)8 b(:)g(:)f Ff(,)286 1323 y(1)17 b(f)343 1325 y(\177)342 +1323 y(ur)f(\031\))g(um)o(w)o(andeln.)k(Sie)15 b(erhalten)h(dadurc)o(h)g(das) +h(neue)f(File)f(sih)o(yphen.tex.)215 1425 y(b\))25 b(durc)o(h)16 +b(Editieren)f(des)h(Files)f(sih)o(yphen.tex)p 286 1443 817 +2 v 286 1485 a(Sie)f(k)389 1487 y(\177)389 1485 y(onnen)h(unmittelbar)e(Ein)o +(tragungen)i(in)f(der)h(Art)f(v)o(ornehmen,)f(wie)h(sie)g(in)286 +1545 y(obiger)20 b(T)l(ab)q(elle)f(b)q(esc)o(hrieb)q(en)g(sind.)31 +b(Sie)19 b(m)1135 1547 y(\177)1134 1545 y(u)o(ssen)h(dann)g(allerdings)g(die) +f(\(b)q(e-)286 1606 y(n)o(utzerfreundlic)o(he)11 b(?\))21 b(Ko)q(dierung)15 +b(v)o(on)f(UNIX)e(b)q(eac)o(h)o(ten)h(und)i(erhalten)e(auc)o(h)286 +1666 y(k)o(eine)20 b(explizite)f(Angab)q(e)j(dar)870 1668 y(\177)869 +1666 y(u)q(b)q(er,)g(wie)f Fd(SiSiSi)28 b Ff(die)21 b(neuen)g(W)1528 +1668 y(\177)1528 1666 y(orter)h(sp)1699 1668 y(\177)1699 1666 +y(ater)286 1726 y(trennen)16 b(wird.)237 1838 y(Nac)o(h)i(Absc)o(hlu\031)f +(dieser)723 1828 y(\177)717 1838 y(Anderungsarb)q(eiten)h(ist)g(in)g(b)q +(eiden)g(F)1458 1840 y(\177)1458 1838 y(allen)f(a\))h(und)h(b\))164 +1899 y(S)191 1888 y(I)209 1899 y(T)236 1909 y(E)263 1899 y(X)c(bzw.)434 +1909 y(I)452 1899 y(S)479 1888 y(I)496 1899 y(T)523 1909 y(E)551 +1899 y(X)g(mit)f(initex)g(neu)i(zu)f(initialisieren,)e(so)j(wie)g(das)g(in)f +(der)h(Instal-)164 1959 y(lationsanleitung)g(v)o(on)g(S)638 +1948 y(I)656 1959 y(T)683 1969 y(E)710 1959 y(X)g(bzw.)882 +1969 y(I)900 1959 y(S)927 1948 y(I)945 1959 y(T)972 1969 y(E)999 +1959 y(X)g(f)1068 1961 y(\177)1067 1959 y(ur)g(UNIX)e(b)q(esc)o(hrieb)q(en)i +(ist.)949 2599 y(14)p eop +%%Page: 15 16 +bop 164 315 a Fr(Literatur)191 436 y Ff([1])24 b(Kn)o(uth,)12 +b(Donald)h(E.:)19 b(T)703 446 y(E)731 436 y(X:)11 b(The)h(Program,)h(Addison) +f(W)l(esley)l(,)g(Computers)f(and)267 496 y(T)o(yp)q(esetting,)k(V)l(ol.)h(B) +191 598 y([2])24 b(Kn)o(uth,)16 b(Donald)h(E.:)k(The)16 b(T)813 +608 y(E)840 598 y(Xb)q(o)q(ok,)h(Addison)f(W)l(esley)191 699 +y([3])24 b(Lamp)q(ort,)30 b(Leslie:)43 b(L)687 693 y Fe(a)711 +699 y Ff(T)738 714 y(E)766 699 y(X.)27 b(A)g(do)q(cumen)o(t)f(preparation)i +(system,)h(Addison)267 760 y(W)l(esley)191 861 y([4])24 b(Kopk)m(a,)17 +b(Helm)o(ut:)h(L)638 855 y Fe(a)662 861 y Ff(T)689 876 y(E)716 +861 y(X:)e(eine)f(Einf)973 863 y(\177)972 861 y(uhrung,)h(Addison)g(W)l +(esley)191 963 y([5])24 b(Barth)15 b(W.,)f(Nirsc)o(hl)f(H.:)20 +b(Implem)o(en)o(ti)o(erung)12 b(eines)j(V)l(erfahrens)f(f)1498 +965 y(\177)1497 963 y(ur)h(die)f(Silb)q(en-)267 1023 y(trenn)o(ung,)h(TU)h +(Wien,)f(Institut)g(f)910 1025 y(\177)909 1023 y(ur)h(Praktisc)o(he)f +(Informatik,)f(Beric)o(h)o(t)g(Nr.)h(26,)267 1083 y(1985)191 +1185 y([6])24 b(Barth)14 b(W.,)g(Nirsc)o(hl)f(H.:)19 b(Sic)o(here)13 +b(sinnen)o(tsprec)o(hende)g(Silb)q(en)o(trenn)o(ung)g(f)1661 +1187 y(\177)1660 1185 y(ur)i(die)267 1245 y(deutsc)o(he)g(Sprac)o(he.)h +(Angew)o(andte)g(Informatik)e(4,)j(S.)f(152{159)i(\(1985\))191 +1347 y([7])24 b(Barth)18 b(W.,)f(Steiner)g(H.:)24 b(Deutsc)o(he)17 +b(Silb)q(en)o(trenn)o(ung)g(f)1326 1349 y(\177)1325 1347 y(ur)h(T)1416 +1358 y(E)1443 1347 y(X)g(3.1,)g(D)o(ANTE,)267 1407 y(Die)e(T)383 +1418 y(E)410 1407 y(Xnisc)o(he)f(Kom)696 1409 y(\177)696 1407 +y(o)o(die,)g(Heft)h(1/1992)191 1509 y([8])24 b Fd(SiSiSi)h +Ff(f)434 1511 y(\177)433 1509 y(ur)18 b(T)524 1520 y(E)551 +1509 y(X,)g(Installationsanleitung,)1114 1511 y(\177)1113 1509 +y(ub)q(er)h(anon)o(ymes)e(FTP)i(am)f(serv)o(er)267 1569 y Fc +(eiunix.tuwien.ac.at)p Ff(.)191 1671 y([9])24 b(DUDEN,)12 b(Rec)o(h)o(tsc)o +(hreibung)f(der)i(deutsc)o(hen)f(Sprac)o(he)h(und)g(der)g(F)l(remdw)1668 +1673 y(\177)1668 1671 y(o)o(rter.)267 1731 y(19.)24 b(Au\015age,)13 +b(Bibliographisc)o(hes)e(Institut,)h(Mannheim/Wien/Z)1531 1733 +y(\177)1530 1731 y(u)n(ric)o(h)f(\(1986\))949 2599 y(15)p eop +%%Trailer +end +userdict /end-hook known{end-hook}if +%%EOF diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.tex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.tex new file mode 100644 index 0000000000..00609fa49f --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.tex @@ -0,0 +1,678 @@ +\documentstyle[sigerman,12pt]{article} + + \parskip0.5ex plus0.3ex minus0.2ex + + \newcommand{\sisisi}{{\it SiSiSi\/}} + \newcommand{\lexikon}{{\it LEXIKON\/}} +% \newcommand{\sitex}{{\it Si}\/\TeX} +% \newcommand{\isitex}{{\it iSi}\/\TeX} + \newcommand{\sitex}{S\raisebox{0.5ex}{I}\TeX} + \newcommand{\isitex}{\raisebox{-0.5ex}{I}S\raisebox{0.5ex}{I}\TeX} + + \setcounter{page}{0} + +\input{transfig} + +\begin{document} + +\renewcommand{\thefootnote}{\fnsymbol{footnote}} +\title{\protect\isitex\\ + Interaktive Silbentrennung f"ur die deutsche Sprache unter \TeX\ + 3.14 und 3.141 unter UNIX\footnote[2]{UNIX ist Markenzeichen von AT\&T}} +\renewcommand{\thefootnote}{\arabic{footnote}} +\author{W. Barth \and H. Steiner \and H. Herbeck} + +% \onecolumn + +\thispagestyle{empty} +\tableofcontents + +\maketitle + +\begin{abstract} +Das speziell f"ur +deutschsprachige Texte entwickelte \sisisi +\begin{center}{\it +SICHERE\\ +SINNENTSPRECHENDE\\ +SILBENTRENNUNG +}\end{center} +kann jetzt in \TeX\ und \LaTeX\ benutzt +werden. Es gibt f"ur UNIX change--files und alle anderen +notwendigen Files auf dem anonymous--FTP--server {\tt eiunix.tuwien.ac.at}. +Dort findet man auch +eine Installationsanleitung, mit der man das System leicht +installieren kann. Dadurch wird ein +neues System erzeugt, das das neue +Verfahren f"ur die Silbentrennung +verwendet. Alle anderen \TeX --Funktionen bleiben +unver"andert. + +Es gibt zwei Varianten: +Das einfache \sitex\ und das +interaktive, voll ausgebaute \isitex. Das einfache \sitex\ kann nach der +Installation genauso wie das urspr"ungliche \TeX\ verwendet werden. Es hat +aber den Vorteil, da"s es auch bei unerwarteten Wortzusammensetzungen keine +falschen Trennstellen erzeugt. Welche zus"atzlichen M"oglichkeiten +\isitex\ bietet, ist in diesem Bericht beschrieben. +\end{abstract} + +% \twocolumn + +\section{Terminologie} +\begin{description} +\item[{\rm \TeX}] ist Donald E. +Knuths Formatierungsprogramm f"ur +Texte \cite{KnuthProg}, +\cite{KnuthBook}. + +\item[\LaTeX] ist das von Leslie Lamport entwickelte Makro--Paket +zu \TeX , das im deutschsprachigen Raum meist verwendet wird +\cite{Lamport}, \cite{Kopka}. Ab sofort gilt \TeX\ synonym f"ur +\TeX\ und \LaTeX, und +die im folgenden beschriebenen Erweiterungen \sitex\ und \isitex\ +k"onnen sowohl auf \TeX\ als auch auf \LaTeX\ angewendet werden. + +\item[{\rm \sitex}] ist eine Variante von \TeX\ f"ur deutschsprachige Texte, +die durch Austausch der "`hyphenation"' durch das von W.~Barth und +H.~Nirschl entwickelte Verfahren zur "`sicheren +sinnentsprechenden Silbentrennung (\sisisi)"' f"ur die deutsche +Sprache \cite{BarthNi}, \cite{BarthNi2} entstanden ist. + +\item[{\rm \isitex}] ist eine um einige zus"atzliche M"oglichkeiten, +insbesondere interaktive Komponenten, erweiterte Form von \sitex. +\end{description} + +\section{SiSiSi} +In der deutschen Sprache verwendet man gern lange, +zusammengesetzte W"orter, wie z.B.: +\begin{quote} +Text=verarbeitungs=system oder +Silben=trennungs=verfahren. +\end{quote} + Wenn solche riesigen Gebilde nicht +am Ende einer Zeile +abgeteilt werden k"onnen, entsteht meist ein sehr +unsch"ones Schriftbild. Das Hauptproblem bei der Silbentrennung +ist das Finden der Nahtstellen (durch "`="' angezeigt) zwischen den +Einzelw"ortern. Die Trennstellen +innerhalb der Einzelw"orter lassen sich +relativ leicht mit den im Duden +\cite{duden} angegebenen Regeln +ermitteln. \sisisi\ findet die +Zerlegung der W"orter mit Hilfe einer Worttabelle, +genauer einer Tabelle aller Wortbestandteile: Vorsilben, +St"amme und Endungen. Weniger als 8000 Eintragungen reichen aus, um +fast alle deutschen W"orter und die g"angigen Fremdw"orter zu +erfassen. Durch die Abst"utzung des Verfahrens auf eine Worttabelle +ist es nat"urlich m"oglich, auch mit unvorhersehbaren, +ungew"ohnlichen Wortunget"umen fertig zu werden. Dieses +Zerspalten zusammengesetzter W"orter mit einer einfachen, +"uberschaubaren Methode bringt wesentliche Vorteile gegen"uber +dem aus dem Amerikanischen "ubernommenen pattern--Verfahren. + +\sisisi\ sucht nach allen m"oglichen +Zerlegungen eines Wortes. Bei manchen +gibt es mehr als eine, wie z.B.: +\begin{quote} +Bau=mast/Baum=ast oder +Stau=becken/Staub=ecken. +\end{quote} + Wir bezeichnen das als +{\bf Mehrdeutigkeit}. St"o"st \sisisi\ auf eine solche +Mehrdeutigkeit, +so nutzt die einfachere Implementierung \sitex\ die zweifelhafte Trennstelle +nicht aus. Dadurch wird sichergestellt, da"s keine falschen Trennungen +entstehen. Das interaktive +\isitex\ h"alt w"ahrend der Bearbeitung +des Dokuments bei +jedem solchen mehrdeutigen Wort an, zeigt dem Benutzer alle +m"oglichen Zerlegungen und erlaubt ihm, die passende +auszuw"ahlen. + +Falls \sisisi\ f"ur ein Wort keine Zerlegung findet, dann handelt +es sich dabei entweder um ein sehr ausgefallenes Wort (z.B.\ +Eigennamen oder "ahnliches), das nicht +in der Worttabelle enthalten ist, oder das Wort wurde falsch +geschrieben. Wir sprechen von einem +{\bf unbekannten +Wort}. Auch in diesen F"allen wird +durch \sitex\ nicht getrennt, die +Silbentrennung bleibt sicher. \isitex\ erlaubt aber +dem Benutzer, je nachdem welcher Fall +vorliegt, das unbekannte Wort zu +korrigieren oder in die Worttabelle einzutragen. + +\sisisi\ unterst"utzt eine +sinnentsprechende Trennung, indem es +die {\bf Haupt\-trenn\-stellen} an +den Nahtstellen +zusammengesetzter W"orter gegen"uber +den Nebentrennstellen in den +Einzelw"ortern bevorzugt. + +Diese Bevorzugung wird durch +Strafpunkte (penalties) gesteuert. +Defaultm"a"sig erhalten die +Nebentrennstellen einen h"oheren Wert +als die Haupttrennstellen. Diese +Relation kann aber von einem erfahrenen Benutzer durch +den neuen \TeX--Befehl \verb/\nebenhyphenpenalty/ f"ur seine +Installation ge"andert werden. Aber das wird f"ur normales +Arbeiten kaum notwendig sein. + +\section{Kurzbeschreibung des Trennverfahrens} + +Jedes Wort ist eine Folge von einem oder mehreren +Einzelw"ortern. Jedes Einzelwort besteht aus beliebig vielen +Vorsilben (eventuell auch keinen), gefolgt von genau einem Stamm, +abgeschlossen durch beliebig viele Endungen (ersatzweise +Fugenzeichen). Eine Worttabelle enth"alt alle diese erw"ahnten +Wortbestandteile (Morpheme). + +Der Algorithmus sucht f"ur jedes Wort, das eventuell getrennt +werden soll, systematisch nach allen Zerlegungen, die nach der +angegebenen Grammatik m"oglich sind. Dabei erkennt er durch +Nachschauen in der Wort\-tabelle, ob ein betrachtetes Teilst"uck +des Wortes ein Wortbestandteil im erw"ahnten Sinn ist und +gegebenenfalls von welcher Art es ist. + +Auf diese Weise findet der Algorithmus f"ur jede Zerlegung alle +Haupttrennstellen, n"amlich zwischen der letzten Endung eines +Teilwortes und der folgenden Vorsilbe, bzw.\ dem folgenden Stamm. +Au"serdem erkennt er auch sofort alle Nebentrennstellen hinter +den Vorsilben. F"ur den Rest jedes Einzelworts, bestehend aus +Stamm und Endungen, mu"s man die Duden--Regeln f"ur die Silbentrennung +anwenden. Das sind solche Regeln wie "`In einer Folge von +Konsonanten ist vor dem letzten zu trennen"', z.B. tre-ten, +F"ul-lungen, k"amp-fen. Diese Regeln sind mit all ihren +Ausnahmen, z.B. Sonderbehandlung von st und ck, vollst"andig in +\sisisi\ eingearbeitet. Ebenso wird schon bei der Zerlegung in +Einzelw"orter die +3--Konsonanten--Regel ber"ucksichtigt. + +Es gibt W"orter, Fremdw"orter, die nicht nach +den Duden--Regeln getrennt werden, z.B. Pro-gramm oder +Pan-orama. In diesen F"allen ist in der Worttabelle der Stamm +als "`Ausnahme"' deklariert und die m"oglichen Trennstellen sind +angegeben. Der Algorithmus ber"ucksichtigt nat"urlich solche +Angaben. Eine ausf"uhrliche Beschreibung des Verfahrens findet sich in +\cite{BarthNi}. + +\section{Mehrdeutigkeiten} +Nun gibt es im Deutschen das Problem, +da"s viele, meist +zusammengesetzte, W"orter existieren, die verschieden interpretiert +und daher auch auf verschiedene Arten getrennt werden k"onnen. +Das ergibt dann, sofern der Algorithmus eine unpassende +Trennstelle w"ahlt, sinnentstellende Abtrennungen, die das +fl"ussige Lesen erschweren. Einige Beispiele: +\begin{quote} +Wachs=tube/Wach=stube + +Bau=mast/Baum=ast + +Personal=mangel/Person=alm=angel + +Spiel=ende/spie-lende +\end{quote} +Alle anderen +Trennverfahren, die die Einzelbestandteile von zusammengesetzten +W"ortern (die "`Morpheme"') nicht +erkennen (also auch die "`pattern--Methode"'), finden diese Mehrdeutigkeiten +nicht. \sisisi\ (in \sitex) hingegen nutzt solche unsicheren +Trennstellen generell nicht aus. Im Beispiel "`Bettruhe"' wird +die angegebene Haupttrennstelle ignoriert. Nur die sichere +Nebentrennstelle "`Bettru-he"' kommt in Frage. Hat man aber nur +wenige sichere Trennstellen in langen, zusammengesetzten W"ortern, +so k"onnen in manchen Zeilen (bei Randausgleich) gro"se L"ucken +bzw.\ "`Stauchungen"' entstehen. Das Schriftbild wird unsch"on, +h"aufig tritt die \TeX--Warnung "`underfull hbox"' auf. + +Dieses Problem wird in \isitex\ durch interaktives Eingreifen in +den Produktionsvorgang gel"ost. Trifft \isitex\ auf ein +mehrdeutiges Wort, so werden dem +Benutzer alle m"oglichen Zerlegungen am +Bildschirm angezeigt, soda"s er die in seinem Kontext sinngem"a"se +ausw"ahlen kann. Diese Wahl mu"s f"ur ein solches mehrdeutiges +Wort nur einmal getroffen werden, d.h.\ bei weiteren Vorkommen +desselben Wortes in demselben Dokument +soll dann immer automatisch +diese richtige Trennung gew"ahlt werden. Dieser Forderung liegt +die Erfahrung zugrunde, da"s ein +mehrdeutiges Wort praktisch nie in +demselben Dokument in verschiedenen +Bedeutungen vorkommt. Au"serdem sind +viele der von \sisisi\ "`erkannten"' +Mehrdeutigkeiten im "ublichen Wortschatz nicht gebr"auchlich +(siehe das Beispiel: Person=alm=angel). Weiters werden auch f"ur +weitere Durchl"aufe (nach erneutem Editieren) die richtigen +Trennstellen gemerkt und wieder verwendet. + +F"ur den Sonderfall, da"s ein mehrdeutiges Wort in mehreren +Bedeutungen vorkommt, z.B. "`In der Wachstube liegt eine +Wachstube"', gibt es die beiden folgenden M"oglichkeiten: +\begin{itemize} +\item Man macht "uberhaupt nichts. Dann werden nur die sicheren +Trennstellen ausgenutzt. Es entstehen keine Trennfehler, +allenfalls wird das Schriftbild etwas unruhig. +\item Mit dem \TeX--Befehl \verb/\-/ tr"agt man beim Editieren +bei allen (oder auch nur bei einigen ausgew"ahlten) Vorkommen +des Wortes alle Trennstellen (oder nur einen Teil davon) ein. +\isitex\ nutzt dann diese vorgegebenen Trennstellen aus, sucht +aber in jedem Wort, das eine solche +Vorgabe enth"alt, nicht nach +weiteren Trennstellen. +\end{itemize} + +Aber noch ein Vorfall mu"s beachtet werden. Wie kann der +Benutzer, der irrt"umlich f"ur ein mehrdeutiges Wort eine +falsche Trennvariante ausgew"ahlt hat, diesen Fehler wieder +beseitigen? Bei jedem weiteren Durchlauf l"auft das Programm ohne Halt +"uber alle Vorkommen dieses Wortes hinweg, es h"alt ja das +Problem dieser Mehrdeutigkeit f"ur +gel"ost. Deshalb wurde in +\isitex\ am Anfang der Behandlung des Dokuments ein Halt +eingef"ugt, bei dem der Benutzer aufgefordert wird, etwaige +Fehler aus vorherigen Durchl"aufen wieder zu beseitigen. + +\section{Unbekannte W"orter} + +Alle W"orter, f"ur die \sisisi\ keine Zerlegung findet, sind +{\bf unbekannte W"orter}. Das +sind W"orter, die einen Schreibfehler +enthalten, aber auch solche, die richtig +geschrieben, dem \sisisi--Algorithmus aber noch unbekannt sind +(d.h.\ die noch nicht in der +Worttabelle sind). Die einfache L"osung +von \sitex\ lautet: Solche Worte werden nicht getrennt. Die +Folgen sind die gleichen wie bei mehrdeutigen W"ortern: +L"ucken, Stauchungen, "`underfull +hbox"' --- und wieder aus +einem f"ur den Autor des Dokuments +unerkl"arlichen Grund. Aber dennoch +k"onnen keine Trennfehler entstehen! + +Das interaktive \isitex\ bleibt bei +jedem unbekannten Wort stehen. Der Benutzer +kann jetzt entscheiden, ob es sich um +einen Tippfehler oder +wirklich um ein unbekanntes Wort, d.h.\ um einen Namen, eine +Abk"urzung, ein ausgefallenes Fremdwort oder etwas "Ahnliches +handelt. +Diese "`neuen W"orter"' sollen nur einmal als unbekannt gemeldet +werden, also in den folgenden Produktionsl"aufen desselben +Dokuments als bekannt akzeptiert werden. Tippfehler sollen +hingegen immer angezeigt werden. + +Da aber ein Eingriff in das gerade bearbeitete \TeX--File nicht +m"oglich ist (d.h.\ ein sofortiges Ausbessern der Tippfehler im +Dokument ginge weit "uber den Einflu"sbereich der Silbentrennung +hinaus und w"urde weitreichende Eingriffe in \TeX\ erfordern), +speichert \isitex\ die vom Benutzer als "`Tippfehler"' bezeichneten W"orter +in einem File, das man beim n"achsten Editieren als +Ged"achtnisst"utze verwenden kann. + + Welche neuen M"oglichkeiten \isitex\ bietet, + ist zusammenfassend in Abbildung~\ref{bild1} dargestellt. + +\begin{figure} +\input{inst_ber.fg1} +\caption{\label{bild1} Die neuen M"oglichkeiten} +\end{figure} + +\section{\protect\isitex\ intern: Die neuen Files} +\label{kapitel6} + +Um die obigen Erweiterungen zu erm"oglichen, +werden die entsprechenden Informationen in +drei Files gespeichert. "`doku"' steht im Folgenden f"ur +den Namen des gerade bearbeiteten +Dokuments. +\begin{itemize} +\item {\bf doku.mem}: Der Benutzer w"ahlt bei mehrdeutigen W"ortern +die passende Bedeutung +aus. Diese Wahl wird in \verb/doku.mem/ gespeichert. +Von jetzt an werden +alle Vorkommnisse dieses Wortes entsprechend dieser +Festlegung getrennt. +Achtung! Kommt ein Wort mit verschiedenen +Endungen im Text vor, so +wird f"ur jede Variante extra gefragt. +(Kommt also in einem Dokument zB. dreimal +"`Wachstube"' und f"unfmal "`Wachstuben"' vor, +so mu"s der Benutzer je einmal die +richtige Trennung f"ur "`Wachstube"' und +"`Wachstuben"' angeben.) Ebenso werden +alle W"orter, die dem System unbekannt +sind und f"ur das Dokument spezielle +Fremdw"orter oder Namen +darstellen, durch ein Kommando des +Benutzers (eventuell mit den +eingegebenen Trennstellen) in \verb/doku.mem/ gespeichert. +Diese Information wird dann bei allen weiteren +\isitex\ Produktionsl"aufen +ber"ucksichtigt und entsprechend erweitert (wenn beim +weiteren Editieren neue mehrdeutige +oder unbekannte W"orter hinzugef"ugt wurden). +\item {\bf doku.lex}: Bei mehrdeutigen +und insbesondere bei unbekannten +W"ortern, kann sich der +Benutzer dazu entschlie"sen, da"s sie +(zus"atzlich zu der erw"ahnten +Eintragung in \verb/doku.mem/) in die +Worttabelle von \sisisi\ eingetragen +werden sollen. Unbekannte W"orter kommen +daher automatisch und mehrdeutige +W"orter auf Wunsch in das File +\verb/doku.lex/, damit sie leicht mit dem "`\lexikon--System"' am +PC in die Worttabelle eingetragen +werden k"onnen. So ist +es dem Benutzer m"oglich, eine +spezielle Worttabelle f"ur seinen +pers"onlichen Wortschatz zu schaffen. + +\item {\bf doku.edt}: Alle als Tippfehler erkannten W"orter +werden in das File \verb/doku.edt/ + geschrieben. Dieses File unterscheidet sich +grunds"atzlich von den beiden obigen. Eintragungen in diesem + File werden nicht automatisch f"ur weitere Vorkommen +desselben Wortes und + auch nicht f"ur weitere Durchl"aufe verwendet. Es ist +als "`Merkfile"' des + Benutzers f"ur das n"achste Editieren + gedacht. Er kann es daher anschauen, ausdrucken, +editieren und l"oschen. + Weiters wird dieses File bei jedem + Durchlauf neu angelegt. Das ist sinnvoll, weil +Tippfehler ja nicht hingenommen werden sollen (weder von \isitex\ + noch vom Benutzer). Es werden + also immer alle Tippfehler gemeldet. Das wiederholte + Aufmerksammachen ist durchaus beabsichtigt. +\end{itemize} +Die Files \verb/doku.mem/ und +\verb/doku.lex/ d"urfen nicht vom Benutzer +ver"andert werden, weil sie vom System +wieder verwendet werden. +\verb/doku.edt/ darf ge"andert oder +zerst"ort werden. + +\section{Wie erzeugt man ein +druckfertiges Manuskript mit +\protect\isitex ?} + +Beim \underline{ersten Editieren} bereitet +man das Manuskript genauso wie f"ur +"`normales"' \TeX\ auf. Die +Befehle f"ur die Fonts, die +Formate, usw.\ f"ugt man in den Text ein. + +Beim \underline{ersten Durchlauf} durch +das \isitex--System beantwortet man die Fragen +des Systems bez"uglich mehrdeutiger und +unbekannter W"orter sinnvoll. Es entstehen die Files +\verb/doku.mem/, \verb/doku.lex/ und +\verb/doku.edt/ (siehe Abbildung +\ref{bild2}). + +Im allgemeinen wird man +auch das entstandene +\underline{File drucken}, +um weitere Hinweise f"ur Korrekturen im +Manuskript zu erhalten. In diesem +Ausdruck sind schon alle Trennstellen +ber"ucksichtigt, die man ---~wie in +Kapitel~\ref{kapitel6} beschrieben~--- +an das File +\verb/doku.mem/ gemeldet hat. + +Jetzt kann man die +\underline{Worttabelle} mit dem System +\lexikon\ erweitern. Man wird (siehe +Kapitel~\ref{kapitel10}) alle speziellen +W"orter dieses Dokuments, bzw.\ des +Fachvokabulars eintragen. \lexikon\ +benutzt dabei das File \verb/doku.lex/. + +Danach erfolgt das \underline{n"achste +Editieren}. Mit den Hinweisen aus dem +File \verb/doku.edt/ und den +Erkenntnissen vom Korrekturlesen wird +man insbesondere alle Tippfehler +korrigieren, aber auch andere +Korrekturen im Manuskript vornehmen. + +Beim folgenden \underline{n"achsten Durchlauf} +bleibt das System nicht mehr bei +allen mehrdeutigen und unbekannten +W"ortern, die in einem fr"uheren +Durchlauf in \verb/doku.mem/ +eingetragen wurden, stehen. Am +Anfang dieses Durchlaufs gibt es jedoch +Gelegenheit, fr"uhere +falsche Festlegungen zu l"oschen. Neue +mehrdeutige oder unbekannte W"orter +(auch alte Tippfehler) werden wie im +ersten Durchgang behandelt. + +Diese Vorg"ange werden solange +wiederholt, bis die Qualit"at des +gedruckten Manuskripts den Anspr"uchen +gen"ugt. + +Die Wege, die die Daten nehmen, sind in +Abbildung~\ref{bild2} zusammenfassend +dargestellt. + +\begin{figure} +\input{inst_ber.fg2} +\caption{\label{bild2} Die Wege der Daten} +\end{figure} + + +\section{"`xxx"' ist ein mehrdeutiges Wort! --- was tun?} + + Wenn \isitex\ ein mehrdeutiges Wort findet, dann + sieht das folgenderma"sen aus (am Beispiel des + Wortes "`Wachstube"'): +\begin{verbatim} +`wachstube' ist ein mehrdeutiges Wort! + 0: nur die sicheren Trennstellen waehlen (`wachstu-be') + 1: `wach=stu-be' + 2: `wachs=tu-be' + 9: Tippfehler! - merken im File `doku.edt' +Bitte waehlen Sie eine Bedeutung z.B. `0'+`Enter' aus: + (zusaetzlich E z.B. `0E'+`Enter': + Wort auch fuer LEXIKON vormerken) +\end{verbatim} + Nun mu"s man eine Ziffer gefolgt von "`Enter"' + eingeben. Ist z.B. die Bedeutung "`Wach=stube"' + die gemeinte, so gibt man "`1"'+"`Enter"' ein. Ab + jetzt wird das Wort "`Wachstube"' im ganzen Dokument und +auch in k"unftigen Durchl"aufen entsprechend getrennt. Tritt der +"uberaus seltene + Fall auf, da"s ein Wort tats"achlich in mehreren +Bedeutungen in ein und demselben Dokument + vorkommt, so kann man sich durch "`0"'+"`Enter"' auf + die sicheren Trennstellen beschr"anken. Will + man das Wort sp"ater auch in die Worttabelle eintragen, +so gibt man zus"atzlich noch ein "`E"' an (also zB. "`1E"'+"`Enter"' statt +"`1"'+"`Enter"'). Dadurch wird das Wort + zus"atzlich in das File \verb/doku.lex/ eingetragen, das +die Arbeit mit dem Lexikon--System + erleichtert. Gibt man "`9"'+"`Enter"' ein, so wird + das Wort nur (!) ins File \verb/doku.edt/ geschrieben +und kann dann beim Editieren von +\verb/doku.tex/ gesucht und ausgebessert werden. + +\newpage + +\section{"`xxx"' ist ein unbekanntes Wort! --- was tun?} + + Wenn \isitex\ ein unbekanntes Wort findet, dann + sieht das folgenderma"sen aus (am Beispiel des + Wortes "`Acetylsalicyls"aure"'): +\begin{verbatim} +`acetylsalicyls"aure' ist ein unbekanntes Wort! + 0: neues Wort, merken in `doku.lex' + 1: neues Wort, Trennstellen angeben und merken in `doku.lex' + 9: Tippfehler! - merken im File `doku.edt' +Bitte waehlen Sie eine Bedeutung (0,1,9) aus: +\end{verbatim} + Nun mu"s man eine Ziffer gefolgt von "`Enter"' + eingeben. Ist das Wort beispielsweise ein kurzes Fremdwort, +so gibt man "`0"'+"`Enter"' ein. Ab + jetzt ist das Wort bekannt; es wird jedoch + nicht getrennt. Es wird in den Files +\verb/doku.mem/ und auch \verb/doku.lex/ +gespeichert, um es nachher eventuell +mit dem \lexikon--System leicht in die + Worttabelle eintragen zu k"onnen. Handelt es + sich bei dem unbekannten Wort aber um ein + langes (zusammengesetztes) fremdes +Wort, so ist + es --- aus den oben genannten Gr"unden --- sinnvoll, +Trennstellen vorzugeben. Zu diesem Zweck + tippt man "`1"'+"`Enter"'. Daraufhin erscheint dann + folgende Eingabeaufforderung: +\begin{verbatim} +Bitte den Trennvektor angeben + (`-' Nebentrennstelle, `=' Haupttrennstelle, `.' Weiterruecken, + Trennstrich unter dem Buchstaben angeben, hinter dem + getrennt werden soll): +acetylsalicyls"aure +\end{verbatim} + Nun kann man direkt unter dem Wort die Trennstellen angeben: +\begin{verbatim} +acetylsalicyls"aure +..-..=.-.-..=...- +\end{verbatim} + Nachdem man "`Enter"' gedr"uckt hat, ist + "`acetylsalicyls"aure"' bekannt und wird gegebenenfalls + "`ace-tyl=sa-li-cyl=s"au-re"' getrennt. + + Als dritte Wahlm"oglichkeit hat man noch "`9"'+"`Enter"'. Dann +wird das Wort ins File "`doku.edt"' + geschrieben und kann dann beim Editieren von + "`doku.tex"' gesucht und ausgebessert werden. + +\section{"Anderung der Worttabelle} +\label{kapitel10} + +Es ist zu empfehlen, spezielle W"orter +des benutzereigenen Vokabulars auch +wirklich in die Worttabelle +einzutragen. \sisisi\ kennt n"amlich +nach dem Eintragen eines solchen neuen +Wortes auch alle Abwandlungen dieses +Wortes, die durch Voransetzen von +Vorsilben oder auch Anf"ugen von +Endungen entstehen, sowie alle seine +Kombinationen mit anderen W"ortern. +Nat"urlich erkennt \sisisi\ diese +W"orter dann alle richtig und trennt +sie bei Bedarf korrekt. +Beispielsweise sind keine Tiernamen in +der normalen Worttabelle. Tr"agt der +Benutzer, der ein Tierbuch schreibt, +\underline{Fuchs} als Stamm in die +Tabelle ein, dann behandelt \sisisi\ +auch Fuchses, Silberfuchs, Fuchsschwanz +und "`es fuchst mich"' korrekt wie +jedes andere Wort. Allerdings m"ussen +F"uchse wegen der Wandlung des u in ein +"u gesondert eingetragen werden. + +Man sollte nur neue +Wortst"amme eintragen. Bei +Fremdw"ortern mu"s man jedoch darauf +achten, ob eine Ausnahme zu den +Duden--Regeln vorliegt. Dazu mu"s man +sich naturgem"a"s mit dieser +Problematik befassen, z.B. +\cite{BarthNi}, \cite{BarthNi2} und \cite{duden}. Ausnahmen sind z.B. +Pro-gramm, Kata-strophe, Pin-up-girl, +Pan-ora-ma. Man mu"s recht sorgf"altig +arbeiten. + +Man kann folgende Morphem-Arten in die Worttabelle eintragen:\\ + +\noindent +\begin{tabular}{|r|p{4.8cm}|c|p{5.5cm}|}\hline + & Art & Kurzbezeichnung & Erkl"arung\\ \hline +1 & Stamm & s & normaler Stamm, wird nach Duden--Regeln getrennt\\ \hline +2 & Stamm, nicht geeignet f"ur Wortzusammensetzungen & st & Wie 1, jedoch +kann dieser Stamm nicht mit anderen zu einem zusammengesetzten Wort +verkn"upft werden\\ \hline +3 & Ausnahme & a {\it i j}~~oder~~a {\it i} & Es wird +abweichend von den Dudenregeln nach dem {\it i}-ten und {\it j}-ten +Buchstaben getrennt (und nur dort)\\ \hline +4 & Ausnahme mit Ende--Mar\-kie\-rung & au {\it i k}~~oder~~au {\it k} & +Wie 3, jedoch definiert {\it k} keine Trennstelle, nach dem +{\it k}-ten Buchstaben setzen die Duden-Regeln wieder ein\\ \hline +\end{tabular} +\begin{tabular}{|r|p{4.8cm}|c|p{5.5cm}|}\hline + & Art & Kurzbezeichnung & Erkl"arung\\ \hline +5 & Vorsilbe & v & Nach der Vorsilbe wird ge\-trennt\\ \hline +6 & Endung & e & Die Endung(en) wird mit dem Stamm zusammen den +Duden--Regeln unterworfen\\ \hline +\end{tabular}\\ + +Die "Anderung der Worttabelle kann man auf eine der folgenden Arten +durchf"uhren: +\begin{itemize} +\item[a)] \underline{mit dem mitgelieferten Lexikon-System auf einem PC}\\ +Auf dem PC unterst"utzt Sie ein Dialogsystem beim Einf"ugen der neuen +W"orter. Sie brauchen sich um Einzelheiten der Kodierung nicht zu k"ummern. +Au"serdem zeigt Ihnen das System in jedem Fall zur Kontrolle an, wie +\sisisi\ von nun an die fraglichen W"orter trennen wird. + +Nach der "Anderung m"ussen Sie die Worttabelle worttab.htx mit dem +htx2tex--Programm in die unter UNIX "ubliche Kodierung (4 f"ur "a, \dots, 1 +f"ur "s) umwandeln. Sie erhalten dadurch das neue File sihyphen.tex. +\item[b)] \underline{durch Editieren des Files sihyphen.tex}\\ +Sie k"onnen unmittelbar Eintragungen in der Art vornehmen, wie sie in +obiger Tabelle beschrieben sind. Sie m"ussen dann allerdings die +(benutzerfreundliche ?) Kodierung von UNIX beachten und erhalten auch keine +explizite Angabe dar"uber, wie \sisisi\ die neuen W"orter sp"ater trennen +wird. +\end{itemize} + +Nach Abschlu"s dieser "Anderungsarbeiten ist in beiden F"allen a) und b) +\sitex\ bzw. \isitex\ mit initex neu zu initialisieren, so wie das in der +Installationsanleitung von \sitex\ bzw. \isitex\ f"ur UNIX beschrieben ist. + +\newpage + +\begin{thebibliography}{[8]} + \bibitem{KnuthProg} Knuth, Donald E.: \TeX: The +Program, Addison Wesley, Computers and Typesetting, Vol.\ B + \bibitem{KnuthBook} Knuth, Donald E.: The \TeX book, +Addison Wesley + \bibitem{Lamport} Lamport, Leslie: \LaTeX. A document +preparation system, Addison Wesley + \bibitem{Kopka} Kopka, Helmut: \LaTeX: eine Einf"uhrung, +Addison Wesley + \bibitem{BarthNi} Barth W., Nirschl H.: Implementierung eines +Verfahrens f"ur die Silbentrennung, TU~Wien, Institut f"ur +Praktische Informatik, Bericht Nr.~26, 1985 + \bibitem{BarthNi2} Barth W., Nirschl +H.: Sichere sinnentsprechende +Silbentrennung f"ur die deutsche +Sprache. Angewandte Informatik~4, +S.~152--159 (1985) + \bibitem{Dante} Barth W., Steiner H.: +Deutsche Silbentrennung f"ur \TeX\ 3.1, +DANTE, Die \TeX nische Kom"odie, Heft 1/1992 + \bibitem{FTP} \sisisi\ f"ur \TeX, +Installationsanleitung, "uber anonymes +FTP am server \verb/eiunix.tuwien.ac.at/. + \bibitem{duden} DUDEN, Rechtschreibung +der deutschen Sprache und der +Fremdw"orter. 19.~ Auflage, +Bibliographisches Institut, +Mannheim/Wien/Z"urich (1986) +\end{thebibliography} + +\end{document} + diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.toc b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.toc new file mode 100644 index 0000000000..5903a5939b --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/inst_ber.toc @@ -0,0 +1,10 @@ +\contentsline {section}{\numberline {1}Terminologie}{2} +\contentsline {section}{\numberline {2}SiSiSi}{2} +\contentsline {section}{\numberline {3}Kurzbeschreibung des Trennverfahrens}{3} +\contentsline {section}{\numberline {4}Mehrdeutigkeiten}{4} +\contentsline {section}{\numberline {5}Unbekannte W\active@dq orter}{6} +\contentsline {section}{\numberline {6}\isitex \ intern: Die neuen Files}{8} +\contentsline {section}{\numberline {7}Wie erzeugt man ein druckfertiges Manuskript mit \isitex ?}{9} +\contentsline {section}{\numberline {8}\active@dq `xxx\active@dq ' ist ein mehrdeutiges Wort! --- was tun?}{10} +\contentsline {section}{\numberline {9}\active@dq `xxx\active@dq ' ist ein unbekanntes Wort! --- was tun?}{12} +\contentsline {section}{\numberline {10}\active@dq Anderung der Worttabelle}{13} diff --git a/obsolete/systems/sisisi/unix/COMMON/INST_BER/transfig.tex b/obsolete/systems/sisisi/unix/COMMON/INST_BER/transfig.tex new file mode 100644 index 0000000000..2f40b0af18 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/INST_BER/transfig.tex @@ -0,0 +1 @@ +\typeout{TransFig: figures in PostScript.} diff --git a/obsolete/systems/sisisi/unix/COMMON/def_umlaut.tex b/obsolete/systems/sisisi/unix/COMMON/def_umlaut.tex new file mode 100644 index 0000000000..48e8ba0e57 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/def_umlaut.tex @@ -0,0 +1,48 @@ +% "DEF_UMLAUT.TEX" definitions of "dirty" umlauts + +\def\dirtyumlaut#1{\if#1A{\discretionary +{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{{\accent"7F A}}}\else +\if#1O{\discretionary +{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{{\accent"7F O}}}\else +\if#1U{\discretionary +{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{{\accent"7F U}}}\else +\if#1a{\discretionary +{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{{\accent"7F a}}}\else +\if#1o{\discretionary +{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{{\accent"7F o}}}\else +\if#1u{\discretionary +{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{{\accent"7F u}}}\else +\if#1s{%\discretionary --- test +%{\kern 4321sp m\kern 255sp\kern-4573sp\kern-1em}{} +{\ss}}\else{{\accent"7F #1}}\fi\fi\fi\fi\fi\fi\fi} + + +\catcode`^^c4=11 % Ae +\catcode`^^d6=11 % Oe +\catcode`^^dc=11 % Ue +\catcode`^^e4=11 % ae +\catcode`^^f6=11 % oe +\catcode`^^fc=11 % ue +% \catcode`^^ff=11 % ss, sz + +\lccode`^^c4=`^^e4 % Ae --> ae +\lccode`^^d6=`^^f6 % Oe --> oe +\lccode`^^dc=`^^fc % Ue --> ue +\lccode`^^e4=`^^e4 % ae --> ae +\lccode`^^f6=`^^f6 % oe --> oe +\lccode`^^fc=`^^fc % ue --> ue +% \lccode`^^ff=`^^ff % ss, sz --> ss, sz + +\uccode`^^c4=`^^c4 % Ae --> Ae +\uccode`^^d6=`^^d6 % Oe --> Oe +\uccode`^^dc=`^^dc % Ue --> Ue +\uccode`^^e4=`^^c4 % ae --> Ae +\uccode`^^f6=`^^d6 % oe --> Oe +\uccode`^^fc=`^^dc % ue --> Ue +% \uccode`^^ff=`^^ff % ss, sz --> ss, sz ? uccode`^^ff=`^^df + + +\catcode`^^Y=11 % ss,sz +\lccode`^^Y=`^^Y +\uccode`^^Y=`^^Y + diff --git a/obsolete/systems/sisisi/unix/COMMON/htx2tex.doc b/obsolete/systems/sisisi/unix/COMMON/htx2tex.doc new file mode 100644 index 0000000000..fabcaf533f --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/htx2tex.doc @@ -0,0 +1,27 @@ +============================================================================== + +HTX2TEX.exe dient zum Konvertieren der SISISI-Klarschrift-Worttabelle +(mit LEXIKON.exe erstellt) in die f"ur TeX notwendige Form. Dabei werden +vor allem die Umlaute nach folgendem Schema in Ziffern umcodiert: + +"a -> 4 +"o -> 3 +"u -> 2 +"s -> 1 + +Weiters werden einige zus"atzliche Trennzeichen wie Punkte (.) und +Beistriche (,) eingef"ugt. Die Attribute der einzelnen Wortbestandteile +werden nicht ver"andert und haben folgende Bedeutung (x und y sind Ziffern): + +s ... Stamm +v ... Vorsilbe +e ... Endung +st ... Stamm, der alleine stehen mu"s +a x ... Ausnahme, Trennstelle nach dem x-ten Buchstaben +a x y ... Ausnahme, Trennstellen nach dem x-ten Buchtaben und nach + dem y-ten Buchstaben +au x ... Ausnahme, untrennbar bis zum x-ten Buchstaben +au x y ... Ausnahme, Trennstelle nach dem x-ten Buchstaben, sonst nicht + trennen bis zum y-ten Buchstaben + +============================================================================== diff --git a/obsolete/systems/sisisi/unix/COMMON/sihyphen.tex b/obsolete/systems/sisisi/unix/COMMON/sihyphen.tex new file mode 100644 index 0000000000..90dbc8cd81 --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/sihyphen.tex @@ -0,0 +1,5577 @@ +\patterns{ +ab.vst, +abakus.s, +abel.e, +abend.s, +abenteuer.s, +aber.vst, +able.e, +abonn.s, +absolut.s, +abstrahier.a.2, +abstrakt.a.2, +absurd.s, +absze1.a.2, +abt.s, +ach.st, +ache.s, +achs.s, +achsel.s, +acht.s, +acker.s, +adapt.a.2, +ad4quat.a.2, +add.s, +ade.s, +adel.s, +ader.s, +adjektiv.s, +adler.s, +administrat.a.2.6, +adress.a.5, +advent.s, +aero.v, +aff.s, +afrika.s, +age.e, +agent.s, +aggress.a.2, +aha.st, +ahm.s, +ahn.s, +ahorn.s, +aids.s, +akadem.s, +akazie.s, +akkord.s, +akkordeon.s, +akt.s, +aktiv.s, +aktualit4t.s, +aktuell.s, +akust.s, +akzept.s, +akzeptanz.s, +al.e, +alarm.s, +album.s, +alemann.s, +alfabet.s, +alge.s, +algebra.a.2.4, +algorithm.s, +algorithmus.s, +alisch.e, +alisier.e, +alkohol.s, +alkoholiker.s, +all.s, +allein.s, +allerdings.s, +alles.s, +alli.s, +allm4hlich.s, +allzu.s, +alm.s, +almose.s, +alp.s, +alphabet.s, +als.st, +also.st, +alt.s, +altar.s, +alter.s, +alternativ.s, +aluminium.s, +am.st, +amateur.s, +ambition.s, +ambo1.s, +ambulat.s, +ameise.s, +amen.s, +amerika.s, +amok.s, +ampel.s, +amsel.s, +amt.s, +an.vst, +analog.s, +analys.s, +analytisch.s, +ananas.s, +and.e, +ander.s, +anderer.s, +anderswo.s, +angel.s, +anger.s, +angina.s, +angst.s, +anim.s, +animo.s, +animus.s, +anker.s, +annuit4t.s, +anonym.a.2, +anorak.s, +ans4ssig.s, +ant.e, +anteil.s, +antenn.s, +anthropo.a.2, +anti.v, +antlitz.s, +antwort.s, +anz.e, +aper.s, +apfel.s, +apostel.s, +apotheke.s, +apparat.s, +appell.s, +appetit.s, +applaudier.a.2, +applaus.a.2, +approxim.a.2.5, +april.a, +aquarium.s, +arbeit.s, +arbeiter.s, +architekt.s, +architekton.s, +architektur.s, +archiv.s, +arg.s, +argument.s, +ariat.e, +aristokrat.a.3.6, +arit4t.e, +arithmet.s, +arm.s, +armut.s, +aroma.s, +art.s, +arthritis.a.2.6, +artikel.s, +artikul.s, +arznei.s, +arzt.s, +asbest.s, +asch.s, +asiat.s, +aspekt.au.4, +asphalt.s, +assistent.s, +assistenz.s, +assistier.s, +ast.s, +astro.au.4, +a1.s, +at.e, +atelier.s, +atem.s, +athlet.s, +ation.e, +atlas.s, +atm.s, +atmosph4r.a.2.4, +atom.s, +atomar.s, +attentat.s, +attent4ter.s, +attest.s, +attrakt.a.2, +au.s, +auch.st, +auf.vs, +aufs.st, +aug.s, +august.s, +aus.vst, +austral.a.2, +austria.a, +au1en.s, +au1er.s, +au1erdem.s, +auto.vs, +autobahn.s, +autodrom.a.4, +automat.s, +automatisch.s, +autor.s, +avanc.s, +avantgard.s, +axiom.s, +axt.st, +4cht.s, +4chz.s, +4ff.s, +4hn.s, +4hre.s, +4lt.s, +4mt.s, +4nder.s, +4ngst.s, +4pfel.s, +4quivalent.s, +4quivalenz.s, +4r.e, +4rg.s, +4rger.s, +4rm.s, +4rzt.s, +4st.s, +4sthet.a.2, +4t.e, +4tz.s, +4ug.s, +4u1er.s, +4xte.s, +baby.a.2, +bach.s, +back.s, +bad.s, +baff.s, +bagger.s, +bahn.s, +bahr.s, +balanc.s, +bald.s, +baldrian.s, +balg.s, +balken.s, +balkon.s, +ball.s, +ballett.s, +ballon.s, +balsam.s, +balz.s, +banal.s, +banane.s, +band.s, +bandag.s, +bang.s, +banjo.s, +bank.s, +bann.s, +bar.evst, +baracke.s, +barg.s, +barm.s, +baro.v, +barock.s, +barren.s, +barsch.s, +bart.s, +bas.s, +basis.s, +bast.s, +ba1.s, +bat.s, +bau.s, +bauch.s, +bauer.s, +baum.s, +bausch.s, +bazillen.s, +bazillus.s, +b4ch.s, +b4ck.s, +b4cker.s, +b4d.s, +b4hn.s, +b4lk.s, +b4ll.s, +b4nd.s, +b4ng.s, +b4nk.s, +b4r.s, +b4rt.s, +b4sse.s, +b4uch.s, +b4uer.s, +b4um.s, +b4usch.s, +be.v, +beb.s, +becher.s, +becken.s, +beef.s, +beer.s, +beerd.a.2, +beet.s, +begann.s, +beginn.s, +begonn.s, +behend.s, +beh3rd.s, +bei.vst, +beicht.s, +beid.s, +beige.s, +beil.s, +beim.st, +bein.s, +beinhalt.a.2, +bei1.s, +beiz.s, +bejah.s, +bell.s, +bengel.s, +benzin.s, +bequem.s, +berg.s, +bergab.a.4, +bergauf.a.4, +ber2chtigt.s, +beschwerd.s, +beschwerde.a.2, +besen.s, +besser.s, +best.s, +best4tig.s, +besteh.s, +bet.s, +bet4ub.s, +betrieb.a.2, +bett.s, +beug.s, +beul.s, +beut.s, +beutel.s, +bezirk.s, +bibel.s, +biber.s, +bibl.s, +biblio.a.2, +bibliothek.a.2, +bieg.s, +biene.s, +bier.s, +biet.s, +bikini.a.2.4, +bilanz.s, +bild.s, +billig.s, +billiger.s, +bin.st, +bin4r.s, +bind.s, +binnen.s, +bio.v, +biolog.s, +birg.s, +birk.s, +birn.s, +birne.s, +bis.s, +bischof.s, +bisch3f.s, +bisher.s, +biskott.s, +biskuit.a.3, +biss.s, +bist.st, +bi1.s, +bitt.s, +bitter.s, +blam.s, +blank.s, +blas.s, +bla1.s, +blatt.s, +blau.s, +bl4h.s, +bl4s.s, +bl4tt.s, +bl4u.s, +blech.s, +blei.s, +bleib.s, +bleich.s, +blend.s, +blick.s, +blieb.s, +blies.s, +blind.s, +blink.s, +blinz.s, +blitz.s, +block.s, +blond.s, +blo1.s, +bl3cke.s, +bl3d.s, +bl3k.s, +bl31.s, +bluejean.a.4, +bluff.s, +blum.s, +blunze.s, +bluse.s, +blut.s, +bl2ff.s, +bl2h.s, +bl2m.s, +bl2t.s, +bob.s, +bock.s, +boden.s, +bog.s, +bohne.s, +bohr.s, +boiler.s, +boje.s, +bold.s, +bolz.s, +bombard.s, +bombe.s, +bonbon.s, +bonbonniere.s, +bonus.s, +boom.s, +boot.s, +bord.s, +bord2re.s, +borg.s, +borst.s, +borte.s, +bos.s, +bot.s, +botan.s, +bottich.s, +box.s, +b3.s, +b3ck.s, +b3ller.s, +b3rse.s, +b3s.s, +b3schung.s, +b3t.s, +brach.s, +bracht.s, +branche.s, +brand.s, +brannt.s, +brat.s, +brau.s, +brauch.s, +braun.s, +brav.s, +bravo.s, +br4nd.s, +br4t.s, +br4u.s, +br4uch.s, +br4un.s, +br4ut.s, +br4utigam.s, +brech.s, +brei.s, +breit.s, +brems.s, +brenn.s, +brenz.s, +brett.s, +brezel.s, +brich.s, +brief.s, +brikett.s, +brill.s, +bring.s, +brise.s, +broch.s, +brock.s, +brod.s, +brodel.s, +brom.s, +bronchial.s, +bronchitis.s, +brosamen.s, +brosch.s, +brosch2re.s, +brot.s, +br3ck.s, +br3sel.s, +br3t.s, +bruch.s, +bruder.s, +brumm.s, +brunn.s, +brunst.s, +brust.s, +brut.s, +brutal.s, +brutto.s, +brutzel.s, +br2ch.s, +br2ck.s, +br2der.s, +br2h.s, +br2ll.s, +br2nett.s, +br2st.s, +br2t.s, +bub.s, +buch.s, +buchstab.s, +buck.s, +bude.s, +budel.s, +budget.s, +buffet.s, +bug.s, +buket.s, +bummel.s, +bummerl.s, +bund.s, +bunt.s, +bure.s, +burg.s, +bursch.s, +bus.s, +busch.s, +bussard.s, +busserl.s, +bu1.s, +butt.s, +butter.s, +butzen.s, +b2ch.s, +b2ck.s, +b2ffel.s, +b2ffet.s, +b2g.s, +b2gel.s, +b2hn.s, +b2nd.s, +b2rg.s, +b2rgermeister.s, +b2ro.s, +b2rst.s, +b2sch.s, +b21.s, +bzw.st, +cafe.s, +camp.s, +camping.s, +cellist.s, +cello.s, +cellophan.s, +celsius.s, +center.s, +champagner.a.4.6, +champignon.a.4.6, +chance.s, +chaos.s, +chaot.s, +charakter.s, +charm.s, +chauff.s, +chef.s, +chem.s, +chemikal.s, +chen.e, +chiffr.a.4, +china.s, +chines.s, +chip.s, +chirurg.a.4, +chlor.s, +cholera.s, +chor.s, +choral.s, +choreo.v, +choreograph.a.3.6, +christ.s, +christus.s, +chrom.s, +city.s, +clever.s, +clown.s, +club.s, +cod.s, +collage.s, +compiler.s, +computer.s, +couch.s, +courag.s, +cousin.s, +cowboy.s, +creme.s, +cup.s, +da.svt, +dabei.s, +dach.s, +dacht.s, +dackel.s, +dadurch.s, +daf2r.s, +daher.s, +dahin.s, +damal.s, +dame.s, +damit.st, +damm.s, +dampf.s, +dampfer.s, +dank.s, +dann.st, +dar.vst, +daran.a.3, +darauf.a.3, +daraus.a.3, +darb.s, +darf.s, +darin.a.3, +darm.s, +darum.a.3, +das.st, +dasjenige.s, +dasselbe.s, +da1.st, +data.s, +datei.s, +daten.s, +datier.s, +dattel.s, +datum.s, +dau.s, +dauer.s, +davon.s, +dazu.s, +d4ch.s, +d4mm.s, +d4mmer.s, +d4mpf.s, +d4mpfer.s, +d4rm.s, +debakel.s, +deck.s, +defekt.s, +definier.s, +definition.s, +defizit.s, +degen.s, +dehn.s, +deich.s, +deichsel.s, +dein.s, +deka.vs, +dekan.s, +deklar.a.2, +dekor.s, +deleg.s, +delikat.s, +delikatesse.s, +delikt.s, +delphin.s, +dem.s, +demokrat.a.2.4, +demol.s, +demonstr.a.2.5, +demut.s, +dem2tig.s, +den.st, +denen.st, +dengel.s, +denjenigen.s, +denk.s, +denn.s, +dennoch.s, +denselben.st, +dentist.s, +deponie.s, +depress.a.2, +deprim.a.2, +der.s, +derb.s, +derby.s, +derjenig.s, +des.stv, +deshalb.st, +design.s, +deskript.a.2, +dessen.s, +dessert.s, +desto.s, +deswegen.s, +deszend.a.2, +detail.s, +detektiv.s, +determin.s, +deut.s, +deutsam.s, +deutsch.s, +deutschen.s, +dezember.s, +dezi.v, +dezimal.s, +dia.s, +diagnos.a.3, +diagnose.a.3, +diagonal.s, +diagramm.a.3, +dialekt.s, +dialog.s, +diamant.s, +di4t.s, +dich.st, +dicht.s, +dick.s, +dickicht.s, +didakt.s, +die.s, +dieb.s, +diejenige.s, +dien.s, +dienst.s, +dienstag.a.5, +dies.s, +diffam.s, +different.s, +differential.s, +differenz.s, +diffizil.s, +digital.s, +dikt.s, +dilemma.s, +dilett.s, +dimension.s, +dimensional.s, +ding.s, +di3zes.s, +diphtherie.s, +diplom.a.2, +dir.st, +direkt.s, +dirig.s, +dirigent.s, +dirndl.s, +dis.v, +diskont.s, +diskret.a.3, +diskussion.s, +diskut.s, +dispon.s, +dissert.s, +distanz.s, +distel.s, +disziplin.a.3.5, +diva.s, +divergent.s, +divergenz.s, +divers.s, +divid.s, +divis.s, +diwan.s, +doch.st, +docht.s, +dogge.s, +dohle.s, +doktor.s, +dokument.s, +dokumentar.s, +dokumentation.s, +dolch.s, +dollar.s, +dolmetsch.s, +dom.s, +domino.s, +dompt.s, +donau.s, +donner.s, +donnerstag.a.3.7, +doppel.s, +doppl.s, +dorb.s, +dorf.s, +dorn.s, +dorr.s, +dorsch.s, +dort.s, +dose.s, +dot.s, +dotter.s, +dozent.s, +dozier.s, +d3rf.s, +d3rr.s, +drache.s, +dragoner.s, +draht.s, +drama.s, +dran.vst, +drang.s, +drap.s, +drastisch.s, +drauf.stv, +draus.st, +drau1en.st, +dr4ht.s, +dr4ng.s, +drechseln.s, +drechsler.s, +dreck.s, +dreh.s, +drei.s, +dreier.a.4, +drei1ig.s, +dresch.s, +dress.s, +dre1.s, +dribb.s, +drie1.s, +drill.s, +drin.st, +dring.s, +drinnen.st, +drischt.s, +dritt.s, +droben.st, +drog.s, +droh.s, +drollig.s, +dromedar.s, +drosch.s, +dross.s, +dro1.s, +dr3hn.s, +druck.s, +drum.vst, +drungen.s, +drunter.st, +dru1.s, +dr2ben.st, +dr2ber.s, +dr2ck.s, +dr2s.s, +dschungel.s, +dschunke.s, +du.st, +duck.s, +dudel.s, +duell.s, +duett.s, +duft.s, +dukat.s, +duktion.s, +duld.s, +dumm.s, +dumpf.s, +dung.s, +dunkel.s, +dunkl.s, +dunst.s, +dur.s, +durch.vs, +durchaus.a.5, +durchs.st, +durf.s, +durst.s, +dusch.s, +dutzend.s, +duz.s, +d2bel.s, +d2ft.s, +d2mm.s, +d2ng.s, +d2nn.s, +d2nst.s, +d2rf.s, +d2rr.s, +d2rst.s, +d2s.s, +d2ster.s, +dynam.s, +dynamik.a.2, +dynamisch.a.2, +dynamo.s, +dynast.s, +e.e, +eben.s, +ebenso.st, +eber.s, +ebne.s, +echo.s, +echse.s, +echt.s, +eck.s, +edel.s, +edit.s, +efeu.s, +effekt.s, +effektiv.s, +effizient.s, +effizienz.s, +egal.s, +egg.s, +egoist.a.3, +ehe.s, +ehr.s, +ei.es, +eich.s, +eid.s, +eier.s, +eifer.s, +eifrig.s, +eig.s, +eigentlich.s, +eil.s, +eimer.s, +ein.vs, +einander.a.3, +eine.s, +einem.s, +einen.s, +einer.s, +einheit.s, +einig.s, +einiger.s, +eins.s, +einsam.s, +einzel.s, +einzig.s, +eis.s, +eisen.s, +eisern.s, +eitel.s, +eiter.s, +eitrig.s, +ekel.s, +el.e, +elast.s, +elastizit4t.s, +elefant.s, +eleg.s, +elegant.s, +eleganz.s, +elektr.a.4, +elektrizit4t.a.4, +elektro.a.4, +element.s, +elementar.s, +elend.s, +elf.s, +elimin.s, +ell.e, +ellbogen.s, +elle.e, +ellen.e, +ellenbogen.s, +elles.e, +ellipse.s, +elliptisch.s, +elnd.e, +elster.s, +eltern.s, +em.e, +email.s, +emaill.s, +emp.v, +empir.s, +empor.s, +emp3r.s, +emsig.s, +en.e, +end.es, +energ.s, +eng.s, +enkel.s, +enorm.s, +ensemble.a.2.5, +ent.ve, +entbehr.s, +ente.s, +entgolt.s, +entlich.e, +entz2ckend.s, +enz.e, +enzian.s, +epiped.s, +episode.s, +epoch.s, +er.vset, +erb.s, +erd.s, +erei.e, +ergonom.s, +erker.s, +erl.s, +ernd.e, +ernst.s, +ernte.s, +erst.s, +erz.s, +es.est, +esch.s, +esel.s, +eskal.s, +eskapade.s, +eskimo.s, +espe.s, +essant.s, +esse.s, +essig.s, +e1.s, +etage.s, +etappe.s, +eternit.s, +eth.a.3, +etikett.s, +etliche.s, +etui.s, +etwa.s, +etwaig.a.2.4, +etwas.st, +euch.st, +euer.st, +eule.s, +eur.e, +eure.est, +europa.s, +europ4.s, +euter.s, +evangel.s, +eventuell.s, +ewig.s, +ex.v, +exakt.a.2, +exemplar.a.2.4, +exerz.a.2, +exil.s, +existent.a.3, +existenz.s, +existier.s, +exklud.a.2, +exklus.a.2, +exorbitant.a.2, +exot.s, +experiment.s, +experte.s, +explizi.a.2, +explodier.a.2, +explosion.a.2, +exponent.s, +export.s, +expre1.a.2, +exspekt.a.2, +extern.s, +extra.a.2, +extrem.a.2, +extrema.a.2, +extremal.a.2, +fabel.s, +fabrik.a.2, +fabrikant.a.2, +fabrikat.a.2, +fabrikation.a.2, +fabrizier.s, +fach.s, +fackel.s, +fad.s, +faden.s, +fahl.s, +fahn.s, +fahnd.s, +fahr.s, +fakt.s, +fakult4t.s, +falk.s, +fall.s, +falsch.s, +falt.s, +famili4r.s, +familie.s, +famos.s, +fanat.s, +fand.s, +fanfare.s, +fang.s, +farb.s, +farm.s, +faschier.s, +fasching.s, +faser.s, +fass.s, +fasson.s, +fast.s, +fa1.s, +fa1t.s, +fauch.s, +faul.s, +faust.s, +faxe.s, +fazit.s, +f4cher.s, +f4d.s, +f4den.s, +f4hig.s, +f4hr.s, +f4hrd.s, +f4ll.s, +f4lsch.s, +f4lt.s, +f4ng.s, +f4rb.s, +f4ul.s, +f4ust.s, +feber.s, +februar.a.2.5, +fecht.s, +feder.s, +fee.s, +feg.s, +fehd.s, +fehl.s, +fehler.s, +feier.a.3, +feig.s, +feil.s, +feilsch.s, +fein.s, +feind.s, +feld.s, +felg.s, +fell.s, +fels.s, +fenster.s, +ferien.a.2.4, +ferkel.s, +fern.s, +fers.s, +fertig.s, +fesch.s, +fessel.s, +fest.s, +fe1l.s, +fett.s, +fetz.s, +feucht.s, +feuer.s, +feurig.s, +fiaker.s, +fibel.s, +ficht.s, +fidel.s, +fieber.s, +fiebrig.s, +fied.s, +fiedel.s, +fiehl.s, +fiel.s, +figur.s, +fikt.s, +file.au.3, +filial.s, +film.s, +filter.s, +filtr.s, +filz.s, +final.s, +finanz.s, +finanziell.s, +find.s, +finesse.s, +fing.s, +finger.s, +finish.s, +finit.s, +fink.s, +finster.s, +firm.s, +firma.s, +firn.s, +firnis.s, +first.s, +fisch.s, +fischer.s, +fistel.s, +fit.s, +fix.s, +flach.s, +flacker.s, +flad.s, +flagg.s, +flamm.s, +flanell.s, +flank.s, +flasche.s, +flatter.s, +flau.s, +flaum.s, +fl4ch.s, +fl4sch.s, +flecht.s, +fleck.s, +fleckerl.s, +fledermaus.s, +flegel.s, +fleh.s, +flehentlich.s, +fleisch.s, +flei1.s, +fletsch.s, +flexib.s, +flexibilit4t.s, +flicht.s, +flick.s, +flieder.s, +flieg.s, +flieh.s, +flies.s, +flie1.s, +flimmer.s, +flink.s, +flint.s, +flitter.s, +flitz.s, +flocht.s, +flock.s, +flog.s, +floh.s, +flosse.s, +flo1.s, +flott.s, +fl31.s, +fl3te.s, +fluch.s, +flucht.s, +flug.s, +flunker.s, +flur.s, +fluss.s, +flu1.s, +flut.s, +fl2cht.s, +fl2ge.s, +fl2gel.s, +fl2gge.s, +fl2ss.s, +fl2ster.s, +focht.s, +fohl.s, +folg.s, +folgend.s, +folgender.s, +folie.s, +folter.s, +fon.s, +fonds.s, +fopp.s, +forc.s, +forder.s, +forelle.s, +foren.s, +form.s, +formal.s, +format.s, +formel.s, +formular.s, +formulier.s, +forsch.s, +forst.s, +fort.s, +forum.s, +foto.s, +f3hn.s, +f3hre.s, +f3n.s, +f3rder.s, +f3rm.s, +f3rst.s, +fracht.s, +frag.s, +frank.s, +frans.s, +fra1.s, +fratz.s, +frau.s, +fr4chter.s, +fr4s.s, +fr41.s, +fr4ulein.s, +frech.s, +frei.s, +freitag.s, +fremd.s, +frequentier.s, +frequenz.s, +fress.s, +freu.s, +freud.s, +freund.s, +frev.s, +fried.s, +frier.s, +fris.s, +frisch.s, +frist.s, +fri1.s, +frittat.s, +froh.s, +fromm.s, +fron.s, +front.s, +fror.s, +frosch.s, +frost.s, +frott.s, +frotzel.s, +fr3h.s, +fr3st.s, +frucht.s, +fr2cht.s, +fr2h.s, +fuchs.s, +fug.s, +fuhr.s, +fund.s, +funk.s, +funktion.s, +furch.s, +furcht.s, +furt.s, +furunkel.s, +fusion.s, +fu1.s, +futter.s, +futteral.s, +f2g.s, +f2hl.s, +f2hr.s, +f2ll.s, +f2nd.s, +f2nf.s, +f2r.vst, +f2rcht.s, +f2rst.s, +f21.s, +f2tter.s, +gab.s, +gabel.s, +gacker.s, +gaff.s, +galant.s, +galerie.s, +galgen.s, +gall.s, +galopp.s, +galt.s, +gams.s, +gang.s, +gans.s, +ganz.s, +gar.s, +garag.s, +garaus.a.3, +garb.s, +garde.s, +garnitur.s, +garten.s, +gas.s, +gaso.v, +gasse.s, +gast.s, +gatsch.s, +gatt.s, +gau.s, +gaul.s, +gaumen.s, +gauner.s, +g4b.s, +g4hn.s, +g4ng.s, +g4ns.s, +g4nz.s, +g4r.s, +g4rten.s, +g4ste.s, +g41.s, +ge.v, +geb.s, +gebaut.s, +geb4rd.s, +geb4ud.s, +geber.s, +geboren.s, +gebracht.a.2, +geburt.s, +geb2hr.s, +gedeih.s, +gediegen.s, +gedieh.s, +gegen.s, +gegend.s, +gegn.s, +gegner.s, +gegolten.s, +geh.s, +gehalt.s, +geheim.s, +geheuer.s, +geheuren.s, +geier.s, +geig.s, +geil.s, +geisel.s, +geist.s, +gei1.s, +geiz.s, +gelb.s, +geld.s, +gelegentlich.s, +geling.s, +gell.s, +gelse.s, +gelt.s, +gel2bd.s, +gem4lde.s, +gems.s, +gem2s.s, +genau.s, +genauso.s, +gendarm.s, +general.s, +generator.s, +generell.s, +generier.s, +genes.s, +genesen.s, +genie1.s, +genoss.s, +geno1.st, +genug.s, +gen2g.s, +geo.v, +gerad.s, +geradeaus.a.6, +geradezu.s, +gerb.s, +germ.s, +german.s, +gern.s, +gerste.s, +gerte.s, +ger2ch.s, +ger2mpel.s, +ges41.s, +geschah.s, +geschehen.s, +geschieht.s, +geschm4cker.a.2, +geschmeid.a.2, +geschwister.s, +geschw2r.a.2, +geselcht.s, +gesell.s, +gesind.s, +gessen.s, +gest.s, +gestrig.s, +gestr2pp.a.2, +gest2t.s, +gesund.s, +gesungen.s, +gesunken.s, +ge1lich.s, +getan.s, +getreide.a.2, +geud.s, +gewalt.s, +gewann.s, +gewinn.s, +gewi1.s, +geziefer.s, +geziem.s, +gib.s, +gicht.s, +gieb.s, +gier.s, +gie1.s, +gift.s, +gigant.s, +gilb.s, +gilt.s, +ging.s, +ginster.s, +gipfel.s, +gips.s, +giraffe.s, +girlande.s, +girr.s, +gitarre.s, +gitter.s, +gladiole.s, +glanz.s, +glas.s, +glatt.s, +glatz.s, +glaub.s, +gl4nz.s, +gl4s.s, +gl4tt.s, +gl4ub.s, +gleich.s, +gleis.s, +gleit.s, +gletscher.s, +glich.s, +glied.s, +glimm.s, +glimpf.s, +glitschig.s, +glitt.s, +glitzer.s, +glitzernd.s, +global.s, +globus.s, +glock.s, +glomm.s, +gloss.s, +glossar.s, +glotz.s, +gl3ck.s, +glucks.s, +glut.s, +gl2ck.s, +gl2h.s, +gnade.s, +gn4dig.s, +gn2g.s, +gockel.s, +gold.s, +golf.s, +gonal.s, +gondel.s, +gong.s, +gorilla.s, +goss.s, +go1.s, +gott.s, +g3nn.s, +g3tt.s, +grab.s, +grad.s, +graf.s, +gram.s, +gramm.s, +grammatikalisch.s, +granat.s, +grandios.s, +granit.s, +grant.s, +graph.s, +graphik.s, +gras.s, +grat.s, +gratis.s, +gratul.s, +grau.s, +graupel.s, +grav.s, +gravierend.s, +grazi.s, +gr4b.s, +gr4f.s, +gr4m.s, +gr4s.s, +gr41lich.s, +gr4te.s, +gr4tsch.s, +greif.s, +greis.s, +grei1ler.s, +grell.s, +gremien.a.3.5, +gremium.s, +grenz.s, +greuel.s, +grie1.s, +griff.s, +grill.s, +grimasse.s, +grimm.s, +grind.s, +grins.s, +gripp.s, +grob.s, +grobian.s, +groll.s, +groschen.s, +gro1.s, +grott.s, +gr3hl.s, +gr31.s, +grub.s, +gruft.s, +grund.s, +grunz.s, +gruppe.s, +gruppier.s, +grusel.s, +gruss.s, +gru1.s, +gr2b.s, +gr2n.s, +gr2nd.s, +gr21.s, +guck.s, +gugelhupf.s, +gulasch.s, +gulden.s, +gummi.s, +gunst.s, +gurgel.s, +gurk.s, +gurt.s, +guss.s, +gu1.s, +gut.s, +g2ltig.s, +g2nst.s, +g2rt.s, +g2ss.s, +g2t.s, +gymnasi.s, +gymnasium.s, +gymnast.s, +haar.s, +hab.s, +habicht.s, +habilit.s, +hack.s, +hader.s, +hafen.s, +hafer.s, +hafner.s, +haft.s, +hag.s, +hagel.s, +hahn.s, +hai.s, +hain.s, +hak.s, +halb.s, +halde.s, +halfter.s, +hall.s, +hallo.s, +halm.s, +hals.s, +halt.s, +hammel.s, +hammer.s, +hampel.s, +hamster.s, +hand.s, +handlung.s, +hanf.s, +hang.s, +hangar.s, +hantier.s, +haper.s, +happen.s, +hardware.au.4.7, +harfe.s, +harm.s, +harmon.s, +harmonika.s, +harn.s, +harpun.s, +harr.s, +harsch.s, +hart.s, +hartn4ckig.s, +harz.s, +hasch.s, +hase.s, +hasel.s, +hass.s, +hast.s, +ha1.s, +hat.s, +hatte.s, +hau.s, +haube.s, +hauch.s, +haufen.s, +haupt.s, +haus.s, +haut.s, +h4ftling.s, +h4k.s, +h4kel.s, +h4lfte.s, +h4lt.s, +h4mmer.s, +h4nd.s, +h4ng.s, +h4nseln.s, +h4rchen.s, +h4rt.s, +h4s.s, +h4ss.s, +h41.s, +h4tsch.s, +h4tte.s, +h4uf.s, +h4upt.s, +h4us.s, +h4ut.s, +heb.s, +hecht.s, +heck.s, +heer.s, +hefe.s, +heft.s, +heg.s, +heid.s, +heikel.s, +heiklig.s, +heil.s, +heiland.s, +heim.s, +heimat.s, +heirat.s, +heiser.s, +hei1.s, +heit.e, +heiter.s, +heiz.s, +hektar.s, +hekto.v, +held.s, +helf.s, +helikopter.s, +hell.s, +helm.s, +hemd.s, +hemm.s, +hendl.s, +hengst.s, +henk.s, +henne.s, +her.vs, +herab.a.3, +heran.a.3, +herauf.a.3, +heraus.a.3, +herb.s, +herbst.s, +herd.s, +herein.a.3, +hering.s, +herr.s, +herrsch.s, +herum.a.3, +herz.s, +hetz.s, +heu.s, +heuchel.s, +heuchler.s, +heuer.s, +heul.s, +heut.s, +hex.s, +hieb.s, +hielt.s, +hier.s, +hierarch.a.4.6, +hierauf.a.4, +hierbei.s, +hierf2r.s, +hierher.s, +hierzu.s, +hiesig.s, +hie1.s, +hilf.s, +him.v, +himmel.s, +himmlisch.s, +hin.vs, +hinab.a.3, +hinauf.a.3, +hinaus.a.3, +hinder.s, +hindurch.s, +hinein.a.3, +hing.s, +hink.s, +hint.s, +hinter.s, +hinzu.s, +hirn.s, +hirsch.s, +hirse.s, +hirt.s, +hiss.s, +histor.s, +hitz.s, +hob.s, +hobby.s, +hoch.s, +hock.s, +hof.s, +hoff.s, +hoffentlich.st, +hohe.s, +hohl.s, +hohn.s, +hol.s, +holf.s, +holper.s, +holprig.s, +holz.s, +homo.v, +honig.s, +hopf.s, +hoppel.s, +hoppla.s, +hops.s, +horch.s, +horde.s, +horizont.s, +horizontal.s, +horn.s, +hornisse.s, +horst.s, +hort.s, +hose.s, +hospital.a.2, +hospit4ler.a.2, +hostie.s, +hotel.s, +h3chst.s, +h3cker.s, +h3f.s, +h3h.s, +h3ll.s, +h3lz.s, +h3r.s, +h3s.s, +hub.s, +hudeln.s, +huf.s, +huhn.s, +human.s, +hummel.s, +hummer.s, +humor.s, +humpel.s, +humus.s, +hund.s, +hundert.s, +hunger.s, +hungrig.s, +hup.s, +hupf.s, +hurra.s, +hurtig.s, +husch.s, +hust.s, +hut.s, +h2bsch.s, +h2ft.s, +h2gel.s, +h2hn.s, +h2hner.s, +h2hnerei.a.3.6, +h2ll.s, +h2ls.s, +h2ndin.s, +h2pf.s, +h2rde.s, +h2steln.s, +h2t.s, +hyazinth.s, +hy4ne.a.3, +hydrant.a.2, +hygien.s, +hymne.s, +hypnotis.s, +hypothese.s, +hypothetisch.s, +hyster.s, +iade.e, +ial.e, +iat.e, +ich.st, +ideal.s, +idee.s, +ident.s, +identifikation.s, +idiot.s, +ie.e, +iell.e, +ien.e, +ier.e, +ig.e, +igel.s, +ignor.s, +ihm.st, +ihn.s, +ihr.s, +ik.e, +ika.e, +ikum.e, +illuster.s, +illustr.a.2.4, +im.st, +imag.s, +imbi1.s, +imker.s, +immer.s, +immerzu.s, +immun.s, +impf.s, +implement.a.2, +implizi.a.2, +import.s, +impr4gn.a.2.5, +improvis.a.2, +impuls.s, +imstand.s, +in.vest, +in4r.e, +indes.s, +indessen.s, +index.s, +individu.s, +individuum.s, +indiz.s, +industri.a.2.4, +infekt.s, +infinitesimal.s, +infiz.s, +inflation.a.2, +infolgedessen.s, +informatik.s, +information.s, +infra.a.2, +inhal.s, +initi.a.2, +injekt.s, +inklus.a.2, +inne.s, +innere.s, +innig.s, +innung.s, +ins.st, +insbesonder.s, +insekt.s, +insel.s, +inser.s, +insgesamt.s, +insolvent.s, +insolvenz.s, +inspekt.a.2, +instanz.s, +instinkt.s, +institut.s, +instrument.a.2, +inszenier.a.2, +integer.s, +integr.a.2.4, +integral.a.2.4, +intelligent.s, +intelligenz.s, +intendant.s, +intens.s, +inter.v, +interess.a.2.5, +intern.s, +interpret.a.2.5, +intrig.a.2, +invalid.s, +inventar.s, +inventur.s, +invest.s, +inwieweit.s, +ion.e, +ional.e, +irdisch.s, +irgend.s, +irgendein.a.6, +irgendwie.s, +irgendwo.s, +irr.s, +irrelevant.s, +irreversibel.s, +isation.e, +isch.e, +isier.e, +ismus.e, +iso.v, +isol.s, +ist.ste, +istisch.e, +i1t.s, +italien.s, +it4t.e, +iter.s, +ition.e, +ium.e, +iv.e, +iz.e, +ja.s, +jacht.s, +jacke.s, +jag.s, +jagd.s, +jahr.s, +jahresende.a.3.6, +jalousie.s, +janker.s, +januar.s, +jauche.s, +jauchz.s, +jaul.s, +jaus.s, +jazz.s, +j4ck.s, +j4ger.s, +j4h.s, +j4hr.s, +j4mmerlich.s, +j4nner.s, +j4te.s, +je.st, +jed.s, +jedoch.st, +jeglich.s, +jeher.s, +jemals.s, +jemand.s, +jen.s, +jenseits.s, +jesus.s, +jetzig.s, +jetzt.s, +jeweil.s, +job.s, +joch.s, +jod.s, +jodel.s, +jodler.s, +joghurt.a.2, +johannis.s, +johl.s, +jongl.s, +joppe.s, +journal.a.4, +jubel.s, +jubil.s, +jubilar.s, +jubil4um.s, +juchz.s, +juck.s, +jud.s, +judo.s, +jugend.s, +juli.s, +jung.s, +juni.s, +justiz.s, +jute.s, +juwel.s, +jux.s, +j2d.s, +j2ng.s, +kabel.s, +kabin.s, +kachel.s, +kaffee.s, +kahl.s, +kahn.s, +kai.s, +kaiser.s, +kajak.s, +kakao.s, +kaktus.s, +kalb.s, +kalender.s, +kalk.s, +kalkul.s, +kalt.s, +kam.s, +kamera.s, +kamerad.s, +kamill.s, +kamm.s, +kamp.s, +kampf.s, +kanal.s, +kanarie.s, +kan4le.s, +kandid.s, +kanin.s, +kanister.s, +kann.s, +kanon.s, +kanone.s, +kant.s, +kanu.s, +kanz.s, +kap.s, +kapazit4t.s, +kapital.s, +kapit4n.s, +kapitel.s, +kaplan.a.2, +kappe.s, +kaputt.s, +kapuz.s, +kar.s, +karabiner.s, +karaffe.s, +karawan.s, +karbol.s, +kardinal.s, +karg.s, +kari.s, +karniese.s, +karo.s, +karosse.s, +karott.s, +karpfen.s, +karte.s, +kartei.s, +kartoffel.s, +karton.s, +kasern.s, +kasperl.s, +kass.s, +kassa.s, +kastanie.s, +kasten.s, +katakomb.s, +katalog.s, +katarrh.s, +katastroph.a.2.4, +katastrophal.s, +katech.s, +kategor.s, +kater.s, +kathol.s, +katze.s, +kau.s, +kauer.s, +kauf.s, +kaum.s, +kautschuk.s, +kauz.s, +k4fer.s, +k4fig.s, +k4lt.s, +k4m.s, +k4mm.s, +k4mpf.s, +k4nguruh.s, +k4pp.s, +k4rg.s, +k4rt.s, +k4se.s, +k4st.s, +k4tz.s, +k4ue.s, +k4uf.s, +keck.s, +kegel.s, +kehl.s, +kehr.s, +keif.s, +keil.s, +keim.s, +kein.s, +keit.e, +keks.s, +kelch.s, +kell.s, +kenn.s, +kenter.s, +keram.s, +kerb.s, +kerker.s, +kerl.s, +kern.s, +kerze.s, +kessel.s, +kett.s, +keuch.s, +keule.s, +keusch.s, +kicher.s, +kiebitz.s, +kiefer.s, +kiel.s, +kieme.s, +kien.s, +kies.s, +kilo.vs, +kind.s, +kinn.s, +kino.s, +kiosk.s, +kipp.s, +kirch.s, +kirsch.s, +kirtag.s, +kissen.s, +kist.s, +kitsch.s, +kitt.s, +kitz.s, +klag.s, +klamm.s, +klammer.s, +klang.s, +klappe.s, +klappt.s, +klaps.s, +klar.s, +klass.s, +klassifizier.s, +klatsch.s, +klau.s, +klaub.s, +klausur.s, +klavier.s, +kl4ff.s, +kl4g.s, +kl4ng.s, +kl4r.s, +kleb.s, +kleck.s, +klee.s, +kleid.s, +kleie.s, +klein.s, +kleister.s, +klemm.s, +klett.s, +klima.s, +klimper.s, +klin.s, +kling.s, +klink.s, +klinker.s, +klipp.s, +klirr.s, +klo.s, +klopf.s, +klosett.s, +kloster.s, +klotz.s, +kl3ppel.s, +klub.s, +kluft.s, +klug.s, +klump.s, +klung.s, +kl2ft.s, +knabber.s, +knabe.s, +knack.s, +knall.s, +knapp.s, +knarr.s, +knatt.s, +knaus.s, +kn4cke.s, +kn4uel.s, +knebel.s, +knecht.s, +knet.s, +knick.s, +knie.s, +kniff.s, +knips.s, +knirps.s, +knirsch.s, +knister.s, +knitter.s, +knoblauch.s, +knoch.s, +knochen.s, +knoll.s, +knopf.s, +knorpel.s, +knorplig.s, +knorr.s, +knosp.s, +knot.s, +kn3ch.s, +kn3del.s, +kn3pf.s, +knurr.s, +knusper.s, +knusprig.s, +kn2ll.s, +kn2pf.s, +kn2ppel.s, +koal.a.2, +kobel.s, +kobold.s, +koch.s, +kod.s, +kodex.s, +koeffizient.s, +koffer.s, +kogel.s, +kognit.a.2, +kohl.s, +koje.s, +kokos.s, +koks.s, +kolb.s, +kolik.s, +kollabier.s, +kollaps.s, +kolleg.s, +kollekt.s, +koller.s, +kolonn.s, +kolossal.s, +kolo1.s, +kombination.s, +kombinator.s, +kombinatorisch.s, +kombinier.s, +komm.s, +komma.s, +kommando.s, +kommentar.s, +kommentier.s, +kommiss.s, +kommun.s, +kommuni.s, +kompakt.s, +kompanie.s, +kompetent.s, +kompetenz.s, +komplett.a.3, +komplex.a.3, +kompliment.a.3, +kompliz.a.3, +kompon.s, +komponente.s, +kompott.s, +kon.v, +kondens.s, +kondition.s, +konditor.s, +kondol.s, +konfekt.s, +konfer.s, +konfession.s, +konflikt.a.3, +kongre1.a.3, +kongruenz.a.3.6, +konjunktur.s, +konkav.s, +konkret.a.3, +konkurr.s, +konkurrent.s, +konn.s, +konsequent.s, +konsequenz.s, +konserv.s, +konsonant.s, +konstant.s, +konstruier.a.3, +konstrukt.a.3, +konsum.s, +konsument.s, +kontakt.s, +konten.s, +kontingent.s, +kontinuier.s, +konto.s, +kontra.a.3, +kontrakt.a.3, +kontrast.a.3, +kontroll.a.3, +konvent.s, +konvergent.s, +konvergenz.s, +konvex.s, +konzentr.a.3.6, +konzept.s, +konzern.s, +konzert.s, +konzession.s, +konzil.s, +konzipier.s, +kooperation.a.2, +koordin.a.2, +kopf.s, +kopie.s, +kopplung.s, +koralle.s, +korb.s, +kork.s, +korn.s, +korrekt.s, +korrektur.s, +korrel.s, +korrespond.a.3.5, +korrigier.s, +kosmet.s, +kosmo.s, +kost.s, +kost2m.s, +kot.s, +kotz.s, +k3ch.s, +k3der.s, +k3ffer.s, +k3hl.s, +k3mm.s, +k3nig.s, +k3nn.s, +k3pf.s, +k3rn.s, +k3rper.s, +k3st.s, +krabbel.s, +krach.s, +kraft.s, +kragen.s, +krakeel.s, +kralle.s, +kram.s, +krampen.s, +krampf.s, +kran.s, +krank.s, +kranz.s, +krapfen.s, +krass.s, +kra1.s, +krat.s, +kratz.s, +kraul.s, +kraus.s, +kraut.s, +krawall.s, +krawatte.s, +krax.s, +kr4chz.s, +kr4ft.s, +kr4gen.s, +kr4h.s, +kr4mer.s, +kr4nk.s, +kr4nz.s, +kr4usel.s, +kr4ut.s, +kreat.s, +krebs.s, +kredenz.s, +kredit.s, +kreide.s, +kreier.a.3, +kreis.s, +kremp.s, +kren.s, +krepp.s, +kreuz.s, +kribb.s, +kriech.s, +krieg.s, +krimi.s, +kripp.s, +krise.s, +krisis.s, +kristall.s, +krit.s, +kriteri.s, +kriterium.s, +kritzel.s, +kroch.s, +krokodil.s, +kron.s, +kropf.s, +kr3n.s, +kr3te.s, +krug.s, +krumm.s, +krust.s, +kruzifix.s, +kr2cke.s, +kr2g.s, +kr2mm.s, +kr2ppel.s, +krypto.v, +kubisch.s, +kubus.s, +kuchen.s, +kuckuck.s, +kuf.s, +kugel.s, +kuh.s, +kult.s, +kultur.s, +kummer.s, +kund.s, +kunft.s, +kunst.s, +kunterbunt.s, +kupfer.s, +kuppe.s, +kuppel.s, +kupplung.s, +kur.s, +kurbel.s, +kurios.s, +kurs.s, +kurv.s, +kurz.s, +kusine.s, +ku1.s, +kutsch.s, +kutte.s, +kuvert.s, +k2bel.s, +k2che.s, +k2cken.s, +k2hl.s, +k2hn.s, +k2ken.s, +k2mmel.s, +k2mmer.s, +k2nd.s, +k2nft.s, +k2nftig.s, +k2nst.s, +k2r.s, +k2rbis.s, +k2rschner.s, +k2rz.s, +k2ss.s, +k2ste.s, +kybernet.s, +lab.s, +lach.s, +lack.s, +lad.s, +lag.s, +lahm.s, +laib.s, +laich.s, +laie.s, +lall.s, +lament.s, +lamm.s, +lampe.s, +lampion.s, +land.s, +lang.s, +lanze.s, +lapp.s, +larv.s, +las.s, +lasch.s, +lass.s, +lasso.s, +last.s, +la1.s, +latein.s, +latern.s, +latsch.s, +latte.s, +latz.s, +lau.s, +laub.s, +lauch.s, +lauf.s, +laug.s, +laus.s, +lausch.s, +laut.s, +lava.s, +lawine.s, +lax.s, +lazarett.s, +l4ch.s, +l4dt.s, +l4g.s, +l4hm.s, +l4nd.s, +l4nder.s, +l4ng.s, +l4rm.s, +l4ss.s, +l4ster.s, +l4stig.s, +l41.s, +l41t.s, +l4uf.s, +l4ufer.s, +l4us.s, +l4ut.s, +le.e, +leb.s, +lechz.s, +leck.s, +leder.s, +ledig.s, +lee.s, +leer.s, +leg.s, +legal.s, +legitim.s, +lehen.s, +lehm.s, +lehn.s, +lehr.s, +lei.e, +leib.s, +leich.s, +leicht.s, +leid.s, +leier.s, +leih.s, +leim.s, +lein.se, +leise.s, +leist.s, +leit.s, +lenk.s, +lenz.s, +lepra.a.2, +ler.e, +lerche.s, +lern.s, +les.s, +letzt.s, +leucht.s, +leugn.s, +leut.s, +lexikon.s, +libelle.s, +lich.e, +licher.e, +licht.s, +lid.s, +lieb.s, +lied.s, +lief.s, +lieg.s, +lieh.s, +lies.s, +lie1.s, +lift.s, +lig.e, +liga.s, +lik3r.s, +lila.s, +limonade.s, +limousine.s, +lind.s, +lineal.s, +linear.s, +ling.e, +linguist.s, +linie.s, +linien.a.2.4, +linig.s, +link.s, +linoleum.s, +linse.s, +lippe.s, +lisch.e, +lispel.s, +list.s, +liter.s, +literatur.s, +litt.s, +liturg.s, +livr.a.2, +lizenz.s, +lob.s, +loch.s, +lock.s, +loden.s, +log.s, +loggia.s, +logik.s, +logisch.s, +loh.s, +lohn.s, +lok.s, +lokal.s, +lokomotiv.s, +lorbeer.s, +los.vse, +lot.s, +lotto.s, +l3b.s, +l3ch.s, +l3ck.s, +l3ffel.s, +l3hn.s, +l3s.s, +l3sch.s, +l3t.s, +l3w.s, +lud.s, +luft.s, +luke.s, +lump.s, +lung.e, +lunge.s, +lupe.s, +lust.s, +lutsch.s, +luv.s, +luxuri3s.s, +luxus.s, +l2cke.s, +l2ft.s, +l2g.s, +l2mmel.s, +lys.e, +lyt.e, +m.e, +mach.s, +madonna.s, +mag.s, +magazin.s, +magd.s, +magistrat.a.2.4, +magnet.a.2, +magneto.a.2, +mahagoni.s, +mahd.s, +mahl.s, +mahn.s, +mai.s, +majest.s, +majoran.s, +makel.s, +makkaroni.s, +makler.s, +mal.s, +malus.s, +malz.s, +man.s, +management.s, +managen.s, +manager.s, +manch.s, +mand.s, +manege.s, +mang.s, +mangel.s, +manifest.s, +manipulation.s, +manipulier.s, +mann.s, +man3v.s, +mansarde.s, +manschette.s, +mantel.s, +manu.s, +manuell.s, +mappe.s, +marder.s, +margarine.s, +marginal.s, +marionett.s, +mark.s, +markier.s, +markise.s, +markt.s, +marmelade.s, +marmor.s, +marsch.s, +marter.s, +marzipan.s, +masch.s, +maschin.s, +maser.s, +mask.s, +mass.s, +masse.s, +mast.s, +ma1.s, +matador.s, +match.s, +mater.s, +material.s, +materie.s, +mathematik.s, +mathematisch.s, +matratze.a.2, +matrikel.a.2.5, +matrix.a.2, +matrize.a.2.5, +matsch.s, +matt.s, +matura.s, +mauer.s, +maul.s, +maurer.s, +maus.s, +maut.s, +maxim.s, +maximal.s, +maximum.s, +mayonnaise.a.2.5, +m4ch.s, +m4dchen.s, +m4del.s, +m4dl.s, +m4h.s, +m4ngel.s, +m4nn.s, +m4ntel.s, +m4rchen.s, +m4rkte.s, +m4rtyrer.s, +m4rz.s, +m4st.s, +m41.s, +m4us.s, +mechan.s, +mecker.s, +medaille.s, +medaillon.s, +medial.s, +medien.s, +medikament.s, +medium.s, +medizin.s, +meer.s, +mehl.s, +mehr.s, +meid.s, +meier.s, +meile.s, +mein.s, +meind.s, +meise.s, +meist.s, +mei1el.s, +meld.s, +melk.s, +melod.s, +melone.s, +menagerie.s, +meng.s, +mensch.s, +ment.e, +mental.s, +menu.s, +men2.s, +merk.s, +merz.s, +mess.s, +messen.s, +messer.s, +messing.s, +me1.s, +meta.v, +metall.s, +metapher.s, +meteor.s, +meteoro.s, +meter.s, +method.s, +metr.a.2, +metropol.a.2, +mett.s, +metz.s, +meut.s, +mich.s, +mied.s, +mieden.s, +mien.s, +mies.s, +miet.s, +mikro.a.2, +milch.s, +mild.s, +milit.s, +milli.v, +milliarde.s, +million.s, +milz.s, +minder.s, +mindest.s, +mine.s, +mineral.s, +mini.s, +miniatur.s, +minimal.s, +minimum.s, +minister.s, +ministerium.s, +minus.s, +minute.s, +min2t.s, +minz.s, +mir.st, +misch.s, +miser.s, +mismus.e, +misse.s, +mission.s, +missionar.s, +mist.s, +mi1.vs, +mit.vst, +mitt.s, +mittag.s, +mitter.s, +mittler.s, +mittwoch.s, +mix.s, +mobil.s, +mobilit4t.s, +mocht.s, +mod.s, +modell.s, +modi.s, +modifikation.s, +modifizier.s, +modul.s, +modular.s, +modus.s, +mogel.s, +mohn.s, +mohr.s, +mokka.s, +molk.s, +moll.s, +moment.s, +momentan.s, +monat.s, +mond.s, +monitor.s, +mono.v, +mont.s, +montag.s, +monument.s, +moor.s, +moos.s, +moped.s, +mops.s, +moral.s, +morast.s, +morator.s, +mord.s, +morg.s, +morgen.s, +moritat.s, +morph.s, +morpho.v, +morsch.s, +mosaik.s, +most.s, +motiv.s, +motor.s, +motte.s, +m3bel.s, +m3bl.s, +m3cht.s, +m3g.s, +m3nch.s, +m3rder.s, +m3rtel.s, +m3we.s, +mucks.s, +muff.s, +mulde.s, +muli.s, +mull.s, +multi.s, +multiplikand.a.3.5, +multiplikat.a.3.5, +mumie.s, +mumps.s, +mund.s, +munition.s, +munkel.s, +munter.s, +mure.s, +murks.s, +murmel.s, +murr.s, +mus.s, +muschel.s, +muse.s, +museum.a.2.4, +musik.s, +musikal.s, +musiz.s, +muskel.s, +muskulatur.s, +muskul3s.s, +muster.s, +mu1.s, +mut.s, +mutter.s, +m2cke.s, +m2d.s, +m2h.s, +m2ll.s, +m2nd.s, +m2nz.s, +m2rb.s, +m2rr.s, +m2ss.s, +m21.s, +m21te.s, +m2t.s, +m2tz.s, +myst.s, +mysteri.s, +mystif.s, +mythen.s, +mythisch.s, +mythos.s, +n.e, +nabe.s, +nabel.s, +nach.vs, +nachdem.st, +nacht.s, +nacken.s, +nackt.s, +nadel.s, +nadel3hr.a.2.5, +nag.s, +nah.s, +nahezu.s, +nahm.s, +naiv.s, +nam.s, +namentlich.s, +nannt.s, +nano.v, +narb.s, +narkose.s, +narr.s, +narzisse.s, +nas.s, +nasch.s, +na1.s, +nation.s, +national.s, +natter.s, +natur.s, +nat2r.s, +n4chst.s, +n4cht.s, +n4h.s, +n4m.s, +n4rr.s, +n4rrisch.s, +n4s.s, +nebel.s, +neben.s, +nebenan.a.2.5, +nebenbei.s, +neblig.s, +nebst.s, +neck.s, +neffe.s, +negativ.s, +neger.s, +negrid.a.2, +nehm.s, +neid.s, +neig.s, +nein.s, +nelke.s, +nenn.s, +neon.s, +nephritis.a.2.6, +nerv.s, +nerv3s.s, +nessel.s, +nest.s, +nett.s, +netto.s, +netz.s, +neu.s, +neugierde.s, +neun.s, +neuralg.a.4, +neuro.v, +neutral.a.3, +neutrum.a.3, +nicht.s, +nick.s, +nie.s, +nied.s, +niere.s, +niet.s, +nikolaus.s, +nikotin.s, +nil.s, +nimm.s, +nipp.s, +nirgend.s, +nirgendwo.s, +nis.e, +nische.s, +nist.s, +niveau.s, +nixe.s, +nobel.s, +noch.s, +nock.s, +nom.s, +nommen.s, +nonne.s, +nord.s, +norm.s, +normal.s, +nostalg.a.4, +not.s, +notar.s, +notiz.s, +nougat.s, +novell.s, +november.s, +n3rd.s, +n3rg.s, +n3t.s, +nudel.s, +nugat.s, +nuklear.a.2, +null.s, +numer.s, +numerier.s, +numerisch.s, +nummer.s, +nun.st, +nunft.s, +nunmehr.st, +nur.st, +nu1.s, +nut.s, +nutz.s, +nutzer.s, +n2chter.s, +n2nft.s, +n2ster.s, +n2tz.s, +nylon.s, +oase.s, +ob.v, +obacht.a.2, +obdach.s, +oben.s, +ober.s, +obig.s, +objekt.s, +oblate.s, +obmann.s, +oboe.s, +obschon.s, +obst.s, +obwohl.st, +ochs.s, +ocker.s, +oder.st, +ofen.s, +offen.s, +offiz.s, +offizier.s, +oft.s, +ohn.s, +ohr.s, +oktober.s, +oliv.s, +olymp.s, +oma.s, +omelett.s, +omnibus.s, +onkel.s, +opa.s, +oper.s, +operat.s, +operette.s, +operier.s, +opfer.s, +opposit.s, +opti.s, +optik.s, +option.s, +opus.s, +or.e, +orange.s, +orchester.s, +ord.s, +ordentlich.s, +organ.s, +organis.s, +organisation.s, +organisier.s, +orgel.s, +orientier.s, +original.s, +originell.s, +orium.e, +orkan.s, +ornament.s, +ort.s, +ortho.v, +ost.s, +oster.s, +otter.s, +oval.s, +ozean.s, +3d.s, +3fen.s, +3ffentlich.s, +3ffne.s, +3ffnung.s, +3ft.s, +3hr.s, +3ko.v, +3l.s, +3r.e, +3rt.s, +3rtlich.s, +3s.e, +3se.s, +3st.s, +3ster.s, +paar.s, +pacht.s, +pack.s, +padd.s, +paket.s, +palais.s, +palast.s, +palaver.s, +paletot.s, +palett.s, +palm.s, +pan.s, +paneel.s, +panorama.a.3, +pansch.s, +pantoffel.s, +pantsch.s, +panzer.s, +papa.s, +papagei.s, +papier.s, +papp.s, +paprika.a.2, +papst.s, +par.st, +para.v, +parad.s, +paradies.s, +parallaxe.a.3, +parallel.a.3, +parallelo.a.3, +pardon.s, +parfum.s, +parf2m.s, +parier.s, +parit.s, +park.s, +parlament.s, +part.s, +partei.s, +parterre.s, +partie.s, +partizip.s, +partner.s, +party.s, +parzell.s, +pasch.s, +pass.s, +passable.a.3.5, +passage.s, +passagier.s, +passier.s, +pasta.s, +paste.s, +pastet.s, +pasteurisier.s, +pastor.s, +pa1.s, +pat.s, +patent.s, +patho.v, +patient.s, +patron.a.2, +patsch.s, +patschen.s, +patz.s, +pauk.s, +paus.s, +pauschal.s, +pause.s, +pavian.s, +pavillon.s, +p4chter.s, +p4ck.s, +p4dagog.a.3, +p4pst.s, +p4rchen.s, +pech.s, +pedal.s, +pedit.s, +pegel.s, +pein.s, +peitsch.s, +pelikan.s, +pelz.s, +pend.s, +pension.s, +pensum.s, +per.vst, +perfekt.s, +pergament.s, +period.a.2.4, +peripher.s, +perl.s, +perlon.s, +permanent.s, +perplex.a.3, +person.s, +personal.s, +pers3n.s, +per2cke.s, +pessim.s, +pest.s, +petersil.s, +petrol.a.2, +petroleum.a.2.5, +pfad.s, +pfahl.s, +pfand.s, +pfanne.s, +pfarr.s, +pfau.s, +pf4nd.s, +pf4nde.s, +pfeffer.s, +pfeif.s, +pfeil.s, +pfennig.s, +pferd.s, +pfiff.s, +pfingst.s, +pfirsich.s, +pflanz.s, +pflaster.s, +pflaume.s, +pfleg.s, +pflicht.s, +pflock.s, +pflug.s, +pfl2ck.s, +pfl2g.s, +pfort.s, +pfosten.s, +pfote.s, +pf3rt.s, +pfropf.s, +pfui.s, +pfund.s, +pfusch.s, +pf2tze.s, +phantas.s, +phantast.s, +phantom.s, +phase.s, +philo.s, +phon.s, +phor.e, +photo.s, +photograph.a.3.5, +phys.s, +physio.v, +pianino.s, +pianist.s, +piano.s, +pick.s, +piekfein.s, +piep.s, +piesack.s, +pigment.s, +pik.s, +pilger.s, +pille.s, +pilot.s, +pilz.s, +pingpong.s, +pinguin.s, +pink.s, +pinne.s, +pinsel.s, +pinupgirl.a.3, +pinzette.s, +pionier.s, +pirat.s, +pirouette.s, +pirsch.s, +piste.s, +pistol.s, +pittoresk.s, +plafond.s, +plag.s, +plagiat.s, +plakat.s, +plakette.s, +plan.s, +planet.s, +planke.s, +plankton.s, +plansch.s, +plantage.s, +plapper.s, +plasma.s, +plast.s, +plastik.s, +plateau.s, +platin.s, +platit2de.s, +platonisch.s, +platsch.s, +platt.s, +platz.s, +plauder.s, +plausch.s, +plausibel.s, +plazet.s, +plazier.s, +pl4d.s, +pl4doyer.s, +pl4n.s, +pl4rr.s, +pl4tscher.s, +pl4tt.s, +pl4tz.s, +plebej.s, +plebiszit.a.3.5, +plebs.s, +pleite.s, +plenar.s, +plenum.s, +pleuel.s, +plexi.s, +plissee.s, +plizier.s, +plomb.s, +plos.s, +pl3tzlich.s, +plump.s, +plunder.s, +plunze.s, +plural.s, +plus.s, +pl2nder.s, +pl2sch.s, +pneu.s, +pneumat.s, +poch.s, +pock.s, +podest.s, +podex.s, +podium.s, +poem.s, +poet.s, +pokal.s, +poker.s, +pol.s, +polar.s, +polem.s, +polen.s, +police.s, +poliklin.a.4, +polio.s, +polit.s, +politur.s, +poliz.s, +polizei.s, +polizze.s, +polka.s, +pollen.s, +polster.s, +polter.s, +poly.v, +polygam.s, +polygon.s, +polymer.s, +polynom.s, +polyp.s, +pomad.s, +pommes.s, +pomp.s, +ponton.s, +pony.s, +pool.s, +pop.s, +popul.s, +pore.s, +porno.s, +por3s.s, +port.s, +portal.s, +portefeuille.s, +porti.s, +porto.s, +portrait.s, +porzellan.s, +pos.s, +posaune.s, +position.s, +positiv.s, +poss.s, +post.s, +postillion.s, +postulat.s, +potent.s, +potenz.s, +powidl.s, +p3bel.s, +p3kel.s, +p3nal.s, +p3st.s, +pracht.s, +pragmat.s, +prahl.s, +prakt.s, +praktikabl.a.4.8, +prall.s, +prang.s, +pranke.s, +prass.s, +prassel.s, +praxis.s, +pr4cht.s, +pr4dikat.s, +pr4g.s, +pr4gnant.a.3, +pr4lat.s, +pr4mie.s, +pr4par.s, +pr4sent.s, +pr4senz.s, +pr4sident.s, +pr4zis.s, +predig.s, +preis.s, +preiserh3hung.a.5, +prek4r.s, +prell.s, +press.s, +pre1.s, +prickel.s, +pries.s, +priester.s, +prim.s, +prima.s, +primitiv.s, +prinz.s, +prinzessin.s, +prinzip.s, +priorit4t.s, +prise.s, +pritsche.s, +privat.s, +privileg.s, +pro.vst, +prob.s, +probabil.s, +problem.a.3, +produkt.s, +produzent.s, +profess.s, +professor.s, +profil.s, +prognos.a.3, +programm.a.3, +programmende.a.3.8, +progress.a.3, +progre1.a.3, +projekt.s, +projektil.s, +projizier.s, +promen.s, +prompt.s, +propag.s, +propaganda.s, +propeller.s, +prophet.s, +prophezei.a.3.6, +proporz.s, +prospekt.a.3, +prothese.s, +protokoll.s, +protz.s, +proviant.s, +provinz.s, +provis.s, +prozedur.s, +prozent.s, +prozess.s, +proze1.s, +prunk.s, +pr2f.s, +pr2gel.s, +pseudo.s, +psych.s, +psycho.s, +publik.a.2, +publikum.a.2.5, +publiz.a.2, +pudding.s, +pudel.s, +puder.s, +puff.s, +puffer.s, +pullover.a.4, +puls.s, +pult.s, +pulver.s, +pump.s, +punkt.s, +pupille.s, +pupp.s, +pur.s, +purpur.s, +purzel.s, +pute.s, +putz.s, +puzzle.s, +p2nkt.s, +p2ree.s, +pyjama.s, +pyknisch.a.2, +pyramide.s, +quader.s, +quadrat.a.3, +quadrier.a.3, +quak.s, +qual.s, +qualit.s, +quant.s, +quantit.s, +quart.s, +quartal.s, +quarz.s, +quasi.s, +quast.s, +quatsch.s, +qu4l.s, +queck.s, +quell.s, +quelle.s, +quer.s, +querfeldein.a.4.8, +quetsch.s, +quick.s, +quiek.s, +quietsch.s, +quirl.s, +quitt.s, +quiz.s, +quot.s, +r.e, +rabatt.s, +rabe.s, +rabiat.s, +rach.s, +racker.s, +rad.s, +radikal.s, +radio.s, +radius.s, +raff.s, +raffin.s, +rag.s, +rahm.s, +raiffeisen.a.5, +rain.s, +rakete.s, +ramm.s, +rampe.s, +ramsch.s, +rand.s, +randalier.s, +rang.s, +rank.s, +rann.s, +ranz.s, +rapid.s, +rappe.s, +raps.s, +rar.s, +ras.s, +rasch.s, +raspel.s, +rat.s, +raub.s, +rauch.s, +rauf.s, +rauh.s, +raum.s, +raunz.s, +raupe.s, +raus.vst, +rausch.s, +r4ch.s, +r4d.s, +r4hm.s, +r4nd.s, +r4t.s, +r4uber.s, +r4ucher.s, +r4ud.s, +r4um.s, +r4usch.s, +r4usper.s, +re.v, +reag.s, +real.s, +realisation.s, +realisier.s, +realistisch.s, +reb.s, +rebe.s, +rebeln.s, +rechen.s, +recherch.s, +rechn.s, +recht.s, +reck.s, +recorder.s, +red.s, +redakt.s, +reduz.s, +reell.s, +refer.s, +reflekt.a.2, +reflex.a.2, +refrain.a.2, +reg.s, +regal.s, +regatta.s, +regier.s, +regiment.s, +regisseur.s, +registrat.a.2.4, +registrier.a.2.4, +reglement.a.2, +regress.a.2, +regre1.a.2, +regul.s, +reh.s, +rehabilit.s, +reib.s, +reich.s, +reif.s, +reigen.s, +reih.s, +reim.s, +rein.s, +reis.s, +rei1.s, +rei1aus.a.4, +reit.s, +reiz.s, +reklam.a.2, +rekord.s, +rektor.s, +relat.s, +relativ.s, +relevant.s, +relig.s, +religi3s.s, +remis.s, +remp.s, +renk.s, +renn.s, +renov.s, +rent.s, +rentab.s, +rentabilit4t.s, +rentner.s, +reparatur.s, +reparier.s, +reptil.s, +republik.a.2.4, +reserv.s, +reservier.s, +resonanz.s, +respekt.a.2, +rest.s, +restaur.s, +resultat.s, +resultier.s, +retour.s, +retrospektiv.a.2.5, +rett.s, +rettich.s, +reu.s, +revanch.s, +revers.s, +reversibel.s, +revolt.s, +revolut.s, +revolver.s, +rezept.s, +rhabarber.s, +rhetor.s, +rheuma.s, +rheumatisch.s, +rhododendron.a.5.8, +rhythm.s, +rhythmus.s, +ribisel.s, +rich.e, +richt.s, +rieb.s, +riech.s, +rief.s, +rieg.s, +riem.s, +ries.s, +riet.s, +rill.s, +rind.s, +ring.s, +ringsum.a.5, +rinn.s, +ripp.s, +rips.s, +risiko.s, +riskant.s, +riskier.s, +riss.s, +rist.s, +ri1.s, +ritt.s, +ritz.s, +robe.s, +roboter.s, +robust.s, +roch.s, +rock.s, +rod.s, +rode.s, +rodel.s, +rogen.s, +roggen.s, +roh.s, +rohr.s, +roll.s, +roman.s, +ronn.s, +rosa.s, +rose.s, +rosig.s, +rosin.s, +rost.s, +ro1.s, +rot.s, +rotz.s, +route.s, +r3ch.s, +r3hr.s, +r3ll.s, +r3m.s, +r3ntgen.s, +r3s.s, +r3t.s, +rubrik.a.2, +ruch.s, +ruck.s, +rudel.s, +ruder.s, +ruf.s, +ruh.s, +ruin.s, +rum.s, +rumor.s, +rump.s, +rumpf.s, +rund.s, +runz.s, +rupf.s, +ru1.s, +rute.s, +rutsch.s, +r2b.s, +r2ck.s, +r2d.s, +r2g.s, +r2hm.s, +r2hr.s, +r2lps.s, +r2mpf.s, +r2pel.s, +r2sch.s, +r2ssel.s, +r2st.s, +r2tt.s, +s.e, +saal.s, +saar.s, +saat.s, +sach.s, +sack.s, +safari.s, +saft.s, +sag.s, +sah.s, +saison.s, +saite.s, +sakko.s, +sakrament.a.2, +sakristei.a.2, +sal.e, +salamander.s, +salami.s, +salat.s, +salb.s, +saldo.s, +salon.s, +salto.s, +salut.s, +salz.s, +sam.e, +same.s, +samm.s, +sammen.s, +samstag.a.4, +samt.s, +sanatorien.s, +sanatorium.s, +sand.s, +sandale.s, +sandwich.s, +sanft.s, +sang.s, +sanier.s, +sanit4r.s, +sanit4t.s, +sank.s, +sann.s, +sardelle.s, +sardine.s, +sarg.s, +sasse.s, +sa1.s, +satan.s, +satellit.s, +satt.s, +satz.s, +sau.s, +sauber.s, +sauce.s, +sauciere.s, +sauer.s, +sauf.s, +saug.s, +saum.s, +sauna.s, +saus.s, +saxophon.s, +s4.s, +s4bel.s, +s4ch.s, +s4en.s, +s4g.s, +s4le.s, +s4mtlich.s, +s4nft.s, +s4nger.s, +s4t.s, +s4tt.s, +s4tz.s, +s4uber.s, +s4uer.s, +s4uf.s, +s4ug.s, +s4ule.s, +s4um.s, +s4ure.s, +s4usel.s, +schab.s, +schablone.a.4, +schach.s, +schacht.s, +schachtel.s, +schad.s, +schaf.s, +schaff.s, +schaft.s, +schal.s, +schale.s, +schall.s, +schalt.s, +scham.s, +schand.s, +schank.s, +schanz.s, +schar.s, +scharf.s, +schatt.s, +schattier.s, +schatulle.s, +schatz.s, +schau.s, +schauf.s, +schauk.s, +schaum.s, +sch4big.s, +sch4d.s, +sch4fer.s, +sch4ft.s, +sch4hl.s, +sch4l.s, +sch4m.s, +sch4nd.s, +sch4rf.s, +sch4tz.s, +sch4um.s, +scheck.s, +scheffel.s, +scheib.s, +scheid.s, +schein.s, +scheit.s, +schell.s, +schelm.s, +schema.s, +schematisch.s, +schemel.s, +schenk.s, +schepper.s, +scher.s, +scherbe.s, +scherflein.s, +scherz.s, +scheu.s, +scheuch.s, +scheu1.s, +schi.s, +schicht.s, +schick.s, +schieb.s, +schied.s, +schief.s, +schiel.s, +schien.s, +schie1.s, +schiff.s, +schikan.s, +schild.s, +schilf.s, +schiller.s, +schillernd.s, +schilling.s, +schimm.s, +schimpanse.s, +schimpf.s, +schind.s, +schinken.s, +schirm.s, +schirr.s, +schizophren.a.4.6, +schlacht.s, +schlack.s, +schlaf.s, +schlaff.s, +schlag.s, +schlamm.s, +schlamp.s, +schlang.s, +schlank.s, +schlau.s, +schlauch.s, +schl4cht.s, +schl4f.s, +schl4g.s, +schl4ngel.s, +schlecht.s, +schleck.s, +schlegel.s, +schleich.s, +schleier.a.6, +schleif.s, +schleifenende.a.6.9, +schleim.s, +schlei1.s, +schlemm.s, +schlender.s, +schlenker.s, +schlepp.s, +schleuder.s, +schleunig.s, +schleus.s, +schlich.s, +schlief.s, +schlie1.s, +schliff.s, +schlimm.s, +schling.s, +schlitt.s, +schlitz.s, +schlosse.s, +schlo1.s, +schlot.s, +schlotter.s, +schlucht.s, +schluchz.s, +schluck.s, +schlug.s, +schlummer.s, +schlund.s, +schlupf.s, +schluss.s, +schlu1.s, +schl2ck.s, +schl2pf.s, +schl2rf.s, +schl2ss.s, +schmach.s, +schmack.s, +schmal.s, +schmalz.s, +schmarotz.s, +schmarren.s, +schmatz.s, +schmaus.s, +schm4chtig.s, +schm4h.s, +schmeck.s, +schmeich.s, +schmei1.s, +schmelz.s, +schmerz.s, +schmetter.s, +schmied.s, +schmieg.s, +schmier.s, +schmilzt.s, +schmink.s, +schmirg.s, +schmiss.s, +schmi1.s, +schmoll.s, +schmolz.s, +schmor.s, +schmuck.s, +schmugg.s, +schmunzel.s, +schmutz.s, +schm2ck.s, +schnabel.s, +schnabulier.s, +schnall.s, +schnalz.s, +schnapp.s, +schnaps.s, +schnarch.s, +schnarr.s, +schnatter.s, +schnaub.s, +schnauf.s, +schnauz.s, +schn4uz.s, +schnecke.s, +schnee.s, +schnei.s, +schneid.s, +schneien.a.6, +schnell.s, +schneuz.s, +schnippisch.s, +schnitt.s, +schnitz.s, +schnob.s, +schnorchel.s, +schn3rkel.s, +schn3rks.s, +schnuller.s, +schnupf.s, +schnuppe.s, +schnupper.s, +schnur.s, +schnurr.s, +schnurstracks.a.6, +schn2ff.s, +schn2r.s, +schob.s, +schock.s, +schokolade.s, +scholle.s, +schon.s, +schopf.s, +schoppen.s, +schornstein.s, +schossen.s, +scho1.s, +schote.s, +schott.s, +sch3n.s, +sch3pf.s, +sch31.s, +schraff.s, +schrank.s, +schraub.s, +schr4g.s, +schr4nk.s, +schrebergarten.s, +schreck.s, +schrei.s, +schreib.s, +schreit.s, +schrie.s, +schrieb.s, +schrift.s, +schrill.s, +schritt.s, +schrocken.s, +schroff.s, +schrot.s, +schr3pf.s, +schrumpf.s, +schub.s, +schuf.s, +schuft.s, +schuh.s, +schuko.s, +schul.s, +schuld.s, +schulter.s, +schund.s, +schupp.s, +schur.s, +schurk.s, +schurz.s, +schussel.s, +schuster.s, +schu1.s, +schutt.s, +schutz.s, +sch2chtern.s, +sch2ler.s, +sch2r.s, +sch2rf.s, +sch2rz.s, +sch2ss.s, +sch2tt.s, +sch2tz.s, +schwach.s, +schwade.s, +schwager.s, +schwalbe.s, +schwall.s, +schwamm.s, +schwan.s, +schwand.s, +schwang.s, +schwank.s, +schwanz.s, +schwarm.s, +schwarte.s, +schwarz.s, +schwatz.s, +schw4ch.s, +schw4ger.s, +schw4nz.s, +schw4nzel.s, +schw4r.s, +schw4rm.s, +schw4rz.s, +schw4tz.s, +schweb.s, +schwefel.s, +schweif.s, +schweig.s, +schwein.s, +schwei1.s, +schweiz.s, +schwel.s, +schwell.s, +schwemm.s, +schwend.s, +schwengel.s, +schwenk.s, +schwer.s, +schwester.s, +schwieg.s, +schwiel.s, +schwiele.s, +schwierig.s, +schwimm.s, +schwind.s, +schwing.s, +schwips.s, +schwirr.s, +schwitz.s, +schwoll.s, +schwomm.s, +schwor.s, +schw3r.s, +schwulst.s, +schwund.s, +schwung.s, +schwur.s, +schw2l.s, +sechs.s, +sechzehn.s, +sechzig.s, +see.s, +seel.s, +segel.s, +segen.s, +segler.s, +segn.s, +seh.s, +sehr.s, +sei.s, +seicht.s, +seid.s, +seif.s, +seih.s, +seil.s, +sein.s, +seit.s, +sekret.a.2, +sekt.s, +sekund.s, +sekunde.s, +selbe.s, +selbst.s, +selbst4ndig.s, +selch.s, +selekt.s, +selig.s, +sellerie.s, +selt.s, +semant.s, +semantik.s, +semester.s, +semi.s, +seminar.s, +semmel.s, +send.s, +senf.s, +seng.s, +senior.s, +senk.s, +senn.s, +sensation.s, +sense.s, +sensor.s, +separat.s, +september.s, +sequent.s, +sequenz.s, +serie.s, +serien.a.2.4, +seri3s.s, +serpentine.s, +service.s, +servier.s, +serviette.a.3.5, +sess.s, +sessel.s, +se1.s, +set.es, +setz.s, +seuch.s, +seufz.s, +sex.s, +shampoo.s, +shopping.s, +shorts.s, +show.s, +sich.st, +sichel.s, +sicher.s, +sicht.s, +sicker.s, +sie.st, +sieb.s, +sieben.s, +siech.s, +sied.s, +sieg.s, +sieh.s, +signal.a.2, +signifik.a.2.5, +silb.s, +silbentrenn.a.3.6, +silber.s, +silbrig.s, +silo.s, +silvester.s, +simpel.s, +sims.s, +simul.s, +sind.st, +sinfon.s, +sing.s, +sink.s, +sinn.s, +sintflut.a.4, +siphon.s, +sippe.s, +sirene.s, +sirup.s, +sitt.s, +sittich.s, +situation.s, +sitz.s, +skala.s, +skandal.s, +skelett.s, +ski.s, +skizz.s, +sklave.s, +skop.s, +skript.s, +slalom.s, +slip.s, +smaragd.s, +so.vst, +socke.s, +sockel.s, +sod.s, +soda.s, +sodann.s, +soda1.s, +sofa.s, +soff.s, +sofort.s, +software.au.4.7, +sogar.st, +sohl.s, +sohn.s, +sol.s, +solch.s, +soldat.s, +soll.s, +sollen.s, +solo.s, +somit.st, +sommer.s, +sonate.s, +sonder.s, +sonn.s, +sonntag.s, +sonst.s, +soph.s, +sopran.a.2, +sorg.s, +sort.s, +sortiment.s, +so1e.s, +sott.s, +soundso.a.2.5, +souvenir.s, +sowie.s, +sowjet.s, +sozial.s, +sozio.v, +s3hn.s, +spachtel.s, +spagat.s, +spaghetti.a.3, +spalier.s, +spalt.s, +span.s, +spange.s, +spann.s, +spar.s, +spargel.s, +spass.s, +spassig.s, +spa1.s, +spat.s, +spatz.s, +spazier.s, +sp4h.s, +sp4lt.s, +sp4nn.s, +sp4rlich.s, +sp4t.s, +specht.s, +speck.s, +spedit.s, +speer.s, +spei.s, +speich.s, +speicher.s, +speien.a.4, +speis.s, +spektak.s, +spektr.a.4, +spektra.a.4, +spektro.a.4, +spektrum.a.4, +spekul.s, +spend.s, +spengler.s, +spenst.s, +sperling.s, +sperr.s, +spesen.s, +spezial.s, +spezialis.s, +speziell.a.3.5, +spezifikation.s, +spezifisch.s, +spezifizier.s, +spick.s, +spiegel.s, +spiegelei.a.4.7, +spiel.s, +spie1.s, +spike.s, +spinat.s, +spindel.s, +spinn.s, +spion.s, +spiral.s, +spiritus.s, +spital.s, +spit4ler.a.3, +spitz.s, +splitt.s, +spontan.s, +sporn.s, +sport.s, +spott.s, +sp3tt.s, +sprach.s, +sprang.s, +spray.s, +spr4ch.s, +sprech.s, +spreiz.s, +spreng.s, +sprenkel.s, +spreu.s, +sprich.s, +sprie1.s, +spring.s, +springer.s, +sprint.s, +sprit.s, +spritz.s, +sprochen.s, +spross.s, +spro1.s, +spr3d.s, +spr31.s, +spruch.s, +sprud.s, +sprudel.s, +sprung.s, +spr2ch.s, +spr2h.s, +spr2ng.s, +spuck.s, +spuk.s, +spul.s, +spund.s, +spur.s, +sp2l.s, +sp2r.s, +staat.s, +stab.s, +stabil.s, +stach.s, +stachel.s, +stachl.s, +stadel.s, +stadion.s, +stadium.s, +stadt.s, +stahl.s, +stall.s, +stalt.s, +stamm.s, +stampf.s, +stand.s, +standard.s, +stang.s, +stank.s, +stanniol.s, +stanz.s, +stap.s, +stapf.s, +star.s, +starb.s, +stark.s, +starr.s, +start.s, +stat.s, +statik.s, +station.s, +statisch.s, +statistik.s, +statistisch.s, +statt.s, +statu.s, +statue.s, +status.s, +stau.s, +staub.s, +stauch.s, +staud.s, +st4b.s, +st4dt.s, +st4hl.s, +st4mm.s, +st4nd.s, +st4nker.s, +st4rk.s, +st4tt.s, +steak.s, +stech.s, +steck.s, +steg.s, +steh.s, +steif.s, +steig.s, +steil.s, +stein.s, +stell.s, +stellung.s, +stelz.s, +stemm.s, +stempel.s, +stengel.s, +steno.vst, +stephan.s, +stepp.s, +steppe.s, +sterb.s, +stereo.s, +steril.s, +stern.s, +sterz.s, +stet.s, +steuer.s, +stich.s, +stick.s, +stief.s, +stiefel.s, +stieg.s, +stiehlt.s, +stiel.s, +stier.s, +stie1.s, +stift.s, +stil.s, +still.s, +stimm.s, +stink.s, +stipend.s, +stirb.s, +stirn.s, +stoch.s, +stock.s, +stoff.s, +stohl.s, +stoisch.s, +stollen.s, +stolper.s, +stolz.s, +stop.s, +stopf.s, +stopp.s, +storb.s, +storch.s, +sto1.s, +stotter.s, +st3ber.s, +st3ck.s, +st3hn.s, +st3psel.s, +st3r.s, +st31.s, +straf.s, +straff.s, +strahl.s, +stramm.s, +stramp.s, +strand.s, +strang.s, +strapaz.s, +stra1.s, +strateg.s, +strauch.s, +strau1.s, +str4f.s, +str4hn.s, +str41.s, +str4ub.s, +str4uch.s, +str4u1.s, +streb.s, +streck.s, +streich.s, +streif.s, +streik.s, +streit.s, +streng.s, +stress.s, +stre1.s, +streu.s, +strich.s, +strichlier.s, +strick.s, +striegel.s, +strieme.s, +stritt.s, +stroh.s, +strolch.s, +strom.s, +stroph.s, +strotz.s, +str3m.s, +strudel.s, +struktur.s, +strumpf.s, +strunk.s, +strupp.s, +struwwelpeter.s, +str2mpf.s, +str2pp.s, +stube.s, +stud.s, +student.s, +studio.s, +studium.s, +stuf.s, +stuhl.s, +stulpe.s, +stumm.s, +stumpf.s, +stund.s, +stunk.s, +sturm.s, +sturz.s, +stute.s, +stutz.s, +st2b.s, +st2berl.s, +st2ck.s, +st2lp.s, +st2mper.s, +st2mpf.s, +st2nd.s, +st2rm.s, +st2rz.s, +st2tz.s, +subtrahend.a.3, +subtrahier.a.3, +subtraktion.a.3, +subvention.s, +such.s, +sucht.s, +sud.s, +suggerier.s, +suggest.s, +sukzess.s, +summ.s, +sumpf.s, +super.vst, +suppe.s, +surr.s, +suspekt.a.2, +suspendier.a.3, +suspens.a.3, +s2cht.s, +s2d.s, +s2hn.s, +s2mpf.s, +s2nd.s, +s21.s, +swimming.s, +symbol.a.3, +symbolik.a.3, +symbolisch.a.3, +symbolis.a.3, +symmetr.a.3.5, +sympath.s, +symphon.s, +sympos.s, +synchron.a.3, +syndik.s, +syndikus.s, +synonym.au.3.5, +syntax.s, +synthese.s, +system.a.2, +systematik.a.2, +systematisch.a.2, +systematisier.a.2, +szene.s, +t.e, +tabak.s, +tabell.s, +tabernakel.s, +tablett.a.2, +tacho.s, +tadel.s, +tafel.s, +tag.s, +taill.s, +takt.s, +tal.s, +talent.s, +taler.s, +talg.s, +talisman.s, +talk.s, +tandem.s, +tangent.s, +tangier.s, +tank.s, +tann.s, +tante.s, +tanz.s, +tapet.s, +tapezier.s, +tapfer.s, +tapp.s, +tara.s, +tarif.s, +tarn.s, +tasche.s, +tasse.s, +tastatur.s, +tast.s, +tat.s, +tatsache.s, +tatze.s, +tau.s, +taub.s, +tauch.s, +tauf.s, +taug.s, +tausch.s, +tausend.s, +tax.s, +taxi.s, +t4fel.s, +t4g.s, +t4nz.s, +t4sch.s, +t4t.s, +t4tsch.s, +t4ub.s, +t4uf.s, +t4usch.s, +team.au.3, +technik.s, +techniker.s, +technisch.s, +techno.s, +teddy.s, +tee.s, +teich.s, +teig.s, +teil.s, +teint.s, +tel.e, +tele.vs, +telex.s, +teller.s, +tempel.s, +tempera.s, +tempo.s, +tendenz.s, +tenne.s, +tennis.s, +tenor.s, +teppich.s, +term.s, +termino.s, +terpentin.s, +terrasse.s, +terrazzo.s, +terror.s, +terti.s, +test.s, +teuer.s, +teuf.s, +text.s, +textil.s, +theater.s, +theist.a.3, +thema.s, +themen.s, +theo.s, +theoretisch.s, +theorie.s, +therap.s, +thermal.s, +thermo.s, +thron.s, +thunfisch.s, +tick.s, +tief.s, +tiegel.s, +tier.s, +tiger.s, +tilg.s, +tinte.s, +tip.s, +tipp.s, +tipptopp.s, +tirol.s, +tisch.s, +titel.s, +tob.s, +tochter.s, +tod.s, +toilett.s, +toler.s, +toll.s, +tolpatsch.s, +tomate.s, +tombola.s, +ton.s, +topf.s, +topfit.s, +topo.v, +tor.s, +torf.s, +torkel.s, +tos.s, +tot.s, +total.s, +toto.s, +tour.s, +t3chter.s, +t3dlich.s, +t3lpel.s, +t3n.s, +t3pf.s, +t3richt.s, +t3s.s, +t3t.s, +trab.s, +tracht.s, +tradition.s, +traf.s, +trafo.s, +trag.s, +trag3d.s, +train.s, +trainer.s, +training.s, +trakt.s, +tram.s, +trampel.s, +tramway.s, +tran.s, +trank.s, +transfer.s, +transit.s, +transparent.s, +transparenz.s, +transport.s, +transzend.s, +transzendent.s, +trapez.s, +trasse.s, +trat.s, +tratsch.s, +trau.s, +traube.s, +traum.s, +travers.s, +tr4cht.s, +tr4g.s, +tr4ller.s, +tr4n.s, +tr4nk.s, +tr4uf.s, +tr4um.s, +treff.s, +treib.s, +trend.s, +trenn.s, +trepp.s, +treppab.a.5, +treppauf.a.5, +tresor.s, +tret.s, +treu.s, +trib2ne.s, +trichter.s, +trick.s, +trieb.s, +triff.s, +trift.s, +trikot.s, +triller.s, +trink.s, +trio.s, +trippel.s, +tritt.s, +triumph.s, +trock.s, +troffen.s, +trog.s, +tromm.s, +trompete.s, +trop.s, +tropf.s, +troph4e.au.3.6, +trost.s, +trott.s, +trotz.s, +tr3d.s, +tr3pf.s, +tr3st.s, +trubel.s, +trudeln.s, +trug.s, +truhe.s, +trunk.s, +trupp.s, +trut.s, +tr2b.s, +tr2g.s, +tr2mmer.s, +tube.s, +tuberkulose.s, +tuberkul3s.s, +tuch.s, +tue.s, +tuend.s, +tugend.s, +tulpe.s, +tum.e, +tummel.s, +tumult.s, +tun.st, +tunell.s, +tunk.s, +tunnel.s, +tupf.s, +turbine.s, +turm.s, +turn.s, +tusch.s, +tut.s, +t2ch.s, +t2ck.s, +t2ft.s, +t2m.e, +t2mmel.s, +t2mpel.s, +t2r.s, +t2rk.s, +t2rm.s, +t2te.s, +typ.s, +typhus.s, +tyrann.s, +ufer.s, +uhr.s, +uhu.s, +ul4r.e, +ulme.s, +ultimativ.s, +ultimatum.s, +ultimo.s, +ultra.a.2, +um.vst, +ums.st, +umso.s, +un.v, +und.s, +ung.e, +unget2m.s, +uni.s, +uniform.s, +universit4t.s, +uns.s, +unten.st, +unter.vs, +unterdes.s, +ur.ve, +urbar.s, +urne.s, +utop.s, +2b.s, +2ber.vs, +2beraus.a.4, +2berein.a.4, +2brig.s, +2ppig.s, +vagabund.s, +vakuum.s, +valid.s, +vall.s, +vanille.s, +vari.s, +variable.a.2.5, +vater.s, +v4ter.s, +veilchen.s, +vektor.s, +vene.s, +ventil.s, +ver.v, +veranda.s, +verb.s, +verdutzt.s, +veredlung.a.3, +verein.a.3, +verflixt.a.3, +verga1.s, +vergess.s, +vergi1.s, +verletz.s, +verleumd.s, +verlier.s, +verlor.s, +vers.s, +version.s, +verteidig.s, +vertikal.s, +vertrackt.a.3, +vetter.s, +viadukt.s, +video.v, +vieh.s, +viel.s, +vier.s, +villa.s, +villen.s, +violett.s, +violin.s, +viper.s, +viren.s, +virtuell.s, +virtuos.s, +virulent.s, +virus.s, +vision.s, +visit.s, +visualisier.s, +vitamin.s, +vize.s, +vogel.s, +vokabel.s, +vokabular.s, +vokal.s, +volk.s, +voll.s, +volumen.s, +vom.st, +von.vst, +vor.vs, +vorab.a.3, +voran.a.3, +voraus.a.3, +vorbei.s, +vorder.s, +vorher.s, +v3gel.s, +v3lk.s, +v3ll.s, +vulkan.s, +waag.s, +wabe.s, +wach.s, +wacholder.s, +wachs.s, +wackel.s, +wade.s, +waffe.s, +waffel.s, +wag.s, +waggon.s, +wahl.s, +wahn.s, +wahr.s, +waid.s, +wais.s, +wal.s, +wald.s, +walk.s, +wall.s, +walt.s, +walz.s, +wand.s, +wange.s, +wank.s, +wann.s, +wanz.s, +wapp.s, +war.s, +warb.s, +warf.s, +warm.s, +wart.s, +warum.a.3, +warze.s, +was.s, +wasch.s, +wasser.s, +wate.s, +watschel.s, +watt.s, +w4ch.s, +w4g.s, +w4hl.s, +w4hn.s, +w4hr.s, +w4hrend.s, +w4ld.s, +w4lt.s, +w4lz.s, +w4nd.s, +w4re.s, +w4rm.s, +w4rt.s, +w4sch.s, +w4sser.s, +web.s, +wechsel.s, +wechselnd.s, +wechsl.s, +weck.s, +wedel.s, +weder.s, +weg.s, +wegen.s, +weh.s, +wehr.s, +wehtun.s, +weib.s, +weich.s, +weid.s, +weiger.s, +weih.s, +weil.s, +wein.s, +weis.s, +wei1.s, +weit.s, +weiter.s, +weithin.a.4, +weizen.s, +welch.s, +welk.s, +well.s, +welt.s, +wem.st, +wen.st, +wend.s, +wenig.s, +wenigsten.s, +wenn.s, +wer.st, +werb.s, +werd.s, +werf.s, +werg.s, +werk.s, +werkstatt.s, +wermut.s, +werner.st, +wert.s, +wes.s, +wesen.s, +wesend.s, +wesentlich.s, +weshalb.s, +wespe.s, +west.s, +weswegen.s, +wett.s, +wetz.s, +wich.s, +wichs.s, +wicht.s, +wickel.s, +wicklung.s, +widder.s, +wider.vs, +widm.s, +widrig.s, +wie.st, +wieder.vst, +wiederum.a.6, +wieg.s, +wieher.s, +wien.s, +wierig.s, +wies.s, +wieso.s, +wieviel.s, +wild.s, +wildbret.a.4, +will.s, +wimmel.s, +wimmer.s, +wimpel.s, +wimper.s, +wind.s, +wink.s, +winsel.s, +winter.s, +winz.s, +wipfel.s, +wir.st, +wirbel.s, +wird.st, +wirf.s, +wirk.s, +wirr.s, +wirt.s, +wisch.s, +wispel.s, +wiss.s, +wi1.s, +witt.s, +witter.s, +witwe.s, +witwer.s, +witz.s, +wo.st, +wobei.st, +woben.s, +woche.s, +wochenende.a.2.6, +wodurch.st, +wof2r.st, +wog.s, +woher.s, +wohin.s, +wohl.s, +wohlauf.a.4, +wohn.s, +wolf.s, +wolk.s, +woll.s, +womit.s, +wom3glich.s, +wonach.s, +wonne.s, +woran.a.3, +worauf.a.3, +woraus.a.3, +worb.s, +worden.s, +worfen.s, +worin.a.3, +wort.s, +wor2ber.a.3, +wovon.st, +wovor.s, +wozu.st, +w3ch.s, +w3chentlich.s, +w3hn.s, +w3lb.s, +w3lk.s, +w3rt.s, +w3rter.s, +wrack.s, +wuch.s, +wuchs.s, +wulst.s, +wund.s, +wunder.s, +wunsch.s, +wurde.s, +wurf.s, +wurm.s, +wurst.s, +wurzel.s, +wusch.s, +wuschel.s, +wust.s, +wu1t.s, +wut.s, +w2chs.s, +w2hl.s, +w2nsch.s, +w2rd.s, +w2rf.s, +w2rg.s, +w2rm.s, +w2rst.s, +w2rz.s, +w2st.s, +w21t.s, +w2t.s, +xylophon.s, +yankee.s, +ypsilon.s, +zack.s, +zag.s, +zahl.s, +zahm.s, +zahn.s, +zange.s, +zank.s, +zapf.s, +zappel.s, +zart.s, +zauber.s, +zaum.s, +zaun.s, +zaus.s, +z4h.s, +z4hl.s, +z4hm.s, +z4hn.s, +z4nk.s, +z4pf.s, +z4rt.s, +z4un.s, +zebra.a.2, +zech.s, +zeck.s, +zeder.s, +zeh.s, +zehe.s, +zehn.s, +zehr.s, +zeich.s, +zeig.s, +zeih.s, +zeil.s, +zeile.s, +zeisig.s, +zeit.s, +zell.s, +zellophan.s, +zelt.s, +zement.s, +zensier.s, +zensur.s, +zenti.v, +zentner.s, +zentr.a.3, +zentral.a.3, +zentri.a.3, +zentrum.a.3, +zer.v, +zeremonie.s, +zerr.s, +zettel.s, +zeug.s, +zicht.s, +zick.s, +ziege.s, +ziegel.s, +zieh.s, +ziel.s, +ziem.s, +ziemlich.s, +zier.s, +zierde.s, +ziffer.s, +zig.e, +zigarette.s, +zigarre.s, +zigeuner.s, +zimmer.s, +zimperlich.s, +zimt.s, +zink.s, +zinn.s, +zins.s, +zipfel.s, +zirka.s, +zirkel.s, +zirkul.s, +zirkus.s, +zirp.s, +zisch.s, +zitat.s, +zither.s, +zitier.s, +zitrone.a.2, +zitter.s, +zittrig.s, +zivil.s, +zivilisation.s, +zivilisier.s, +zog.s, +zoll.s, +zone.s, +zoo.s, +zopf.s, +zorn.s, +zott.s, +zottel.s, +z3g.s, +z3ll.s, +zu.vst, +zuber.s, +zucht.s, +zuck.s, +zucker.s, +zug.s, +zuge.vs, +zugeben.s, +zum.st, +zunge.s, +zupf.s, +zur.st, +zurzeit.s, +zusammengesetzt.s, +z2cht.s, +z2ck.s, +z2g.s, +z2nd.s, +z2ngel.s, +z2rn.s, +zwang.s, +zwanzig.s, +zwar.st, +zw4ng.s, +zweck.s, +zwei.s, +zweier.a.4, +zweif.s, +zweifel.s, +zweig.s, +zwerchfell.s, +zwerg.s, +zwetsche.s, +zwetschge.s, +zwetschke.s, +zwick.s, +zwie.v, +zwiebel.s, +zwilling.s, +zwing.s, +zwinker.s, +zwirn.s, +zwischen.s, +zwischendurch.s, +zwist.s, +zwitscher.s, +zw3lf.s, +zwung.s, +zykl.a.2, +zyklus.a.2, +zylind.s, +zyn.s, +zypresse.a.2} diff --git a/obsolete/systems/sisisi/unix/COMMON/worttab.htx b/obsolete/systems/sisisi/unix/COMMON/worttab.htx new file mode 100644 index 0000000000..b297dd449e --- /dev/null +++ b/obsolete/systems/sisisi/unix/COMMON/worttab.htx @@ -0,0 +1,5576 @@ +ab vst
+abakus s
+abel e
+abend s
+abenteuer s
+aber vst
+able e
+abonn s
+absolut s
+abstrahier a 2
+abstrakt a 2
+absurd s
+abszeá a 2
+abt s
+ach st
+ache s
+achs s
+achsel s
+acht s
+acker s
+adapt a 2
+ad„quat a 2
+add s
+ade s
+adel s
+ader s
+adjektiv s
+adler s
+administrat a 2 6
+adress a 5
+advent s
+aero v
+aff s
+afrika s
+age e
+agent s
+aggress a 2
+aha st
+ahm s
+ahn s
+ahorn s
+aids s
+akadem s
+akazie s
+akkord s
+akkordeon s
+akt s
+aktiv s
+aktualit„t s
+aktuell s
+akust s
+akzept s
+akzeptanz s
+al e
+alarm s
+album s
+alemann s
+alfabet s
+alge s
+algebra a 2 4
+algorithm s
+algorithmus s
+alisch e
+alisier e
+alkohol s
+alkoholiker s
+all s
+allein s
+allerdings s
+alles s
+alli s
+allm„hlich s
+allzu s
+alm s
+almose s
+alp s
+alphabet s
+als st
+also st
+alt s
+altar s
+alter s
+alternativ s
+aluminium s
+am st
+amateur s
+ambition s
+amboá s
+ambulat s
+ameise s
+amen s
+amerika s
+amok s
+ampel s
+amsel s
+amt s
+an vst
+analog s
+analys s
+analytisch s
+ananas s
+and e
+ander s
+anderer s
+anderswo s
+angel s
+anger s
+angina s
+angst s
+anim s
+animo s
+animus s
+anker s
+annuit„t s
+anonym a 2
+anorak s
+ans„ssig s
+ant e
+anteil s
+antenn s
+anthropo a 2
+anti v
+antlitz s
+antwort s
+anz e
+aper s
+apfel s
+apostel s
+apotheke s
+apparat s
+appell s
+appetit s
+applaudier a 2
+applaus a 2
+approxim a 2 5
+april a
+aquarium s
+arbeit s
+arbeiter s
+architekt s
+architekton s
+architektur s
+archiv s
+arg s
+argument s
+ariat e
+aristokrat a 3 6
+arit„t e
+arithmet s
+arm s
+armut s
+aroma s
+art s
+arthritis a 2 6
+artikel s
+artikul s
+arznei s
+arzt s
+asbest s
+asch s
+asiat s
+aspekt au 4
+asphalt s
+assistent s
+assistenz s
+assistier s
+ast s
+astro au 4
+aá s
+at e
+atelier s
+atem s
+athlet s
+ation e
+atlas s
+atm s
+atmosph„r a 2 4
+atom s
+atomar s
+attentat s
+attent„ter s
+attest s
+attrakt a 2
+au s
+auch st
+auf vs
+aufs st
+aug s
+august s
+aus vst
+austral a 2
+austria a
+auáen s
+auáer s
+auáerdem s
+auto vs
+autobahn s
+autodrom a 4
+automat s
+automatisch s
+autor s
+avanc s
+avantgard s
+axiom s
+axt st
+„cht s
+„chz s
+„ff s
+„hn s
+„hre s
+„lt s
+„mt s
+„nder s
+„ngst s
+„pfel s
+„quivalent s
+„quivalenz s
+„r e
+„rg s
+„rger s
+„rm s
+„rzt s
+„st s
+„sthet a 2
+„t e
+„tz s
+„ug s
+„uáer s
+„xte s
+baby a 2
+bach s
+back s
+bad s
+baff s
+bagger s
+bahn s
+bahr s
+balanc s
+bald s
+baldrian s
+balg s
+balken s
+balkon s
+ball s
+ballett s
+ballon s
+balsam s
+balz s
+banal s
+banane s
+band s
+bandag s
+bang s
+banjo s
+bank s
+bann s
+bar evst
+baracke s
+barg s
+barm s
+baro v
+barock s
+barren s
+barsch s
+bart s
+bas s
+basis s
+bast s
+baá s
+bat s
+bau s
+bauch s
+bauer s
+baum s
+bausch s
+bazillen s
+bazillus s
+b„ch s
+b„ck s
+b„cker s
+b„d s
+b„hn s
+b„lk s
+b„ll s
+b„nd s
+b„ng s
+b„nk s
+b„r s
+b„rt s
+b„sse s
+b„uch s
+b„uer s
+b„um s
+b„usch s
+be v
+beb s
+becher s
+becken s
+beef s
+beer s
+beerd a 2
+beet s
+begann s
+beginn s
+begonn s
+behend s
+beh”rd s
+bei vst
+beicht s
+beid s
+beige s
+beil s
+beim st
+bein s
+beinhalt a 2
+beiá s
+beiz s
+bejah s
+bell s
+bengel s
+benzin s
+bequem s
+berg s
+bergab a 4
+bergauf a 4
+berchtigt s
+beschwerd s
+beschwerde a 2
+besen s
+besser s
+best s
+best„tig s
+besteh s
+bet s
+bet„ub s
+betrieb a 2
+bett s
+beug s
+beul s
+beut s
+beutel s
+bezirk s
+bibel s
+biber s
+bibl s
+biblio a 2
+bibliothek a 2
+bieg s
+biene s
+bier s
+biet s
+bikini a 2 4
+bilanz s
+bild s
+billig s
+billiger s
+bin st
+bin„r s
+bind s
+binnen s
+bio v
+biolog s
+birg s
+birk s
+birn s
+birne s
+bis s
+bischof s
+bisch”f s
+bisher s
+biskott s
+biskuit a 3
+biss s
+bist st
+biá s
+bitt s
+bitter s
+blam s
+blank s
+blas s
+blaá s
+blatt s
+blau s
+bl„h s
+bl„s s
+bl„tt s
+bl„u s
+blech s
+blei s
+bleib s
+bleich s
+blend s
+blick s
+blieb s
+blies s
+blind s
+blink s
+blinz s
+blitz s
+block s
+blond s
+bloá s
+bl”cke s
+bl”d s
+bl”k s
+blӇ s
+bluejean a 4
+bluff s
+blum s
+blunze s
+bluse s
+blut s
+blff s
+blh s
+blm s
+blt s
+bob s
+bock s
+boden s
+bog s
+bohne s
+bohr s
+boiler s
+boje s
+bold s
+bolz s
+bombard s
+bombe s
+bonbon s
+bonbonniere s
+bonus s
+boom s
+boot s
+bord s
+bordre s
+borg s
+borst s
+borte s
+bos s
+bot s
+botan s
+bottich s
+box s
+b” s
+b”ck s
+b”ller s
+b”rse s
+b”s s
+b”schung s
+b”t s
+brach s
+bracht s
+branche s
+brand s
+brannt s
+brat s
+brau s
+brauch s
+braun s
+brav s
+bravo s
+br„nd s
+br„t s
+br„u s
+br„uch s
+br„un s
+br„ut s
+br„utigam s
+brech s
+brei s
+breit s
+brems s
+brenn s
+brenz s
+brett s
+brezel s
+brich s
+brief s
+brikett s
+brill s
+bring s
+brise s
+broch s
+brock s
+brod s
+brodel s
+brom s
+bronchial s
+bronchitis s
+brosamen s
+brosch s
+broschre s
+brot s
+br”ck s
+br”sel s
+br”t s
+bruch s
+bruder s
+brumm s
+brunn s
+brunst s
+brust s
+brut s
+brutal s
+brutto s
+brutzel s
+brch s
+brck s
+brder s
+brh s
+brll s
+brnett s
+brst s
+brt s
+bub s
+buch s
+buchstab s
+buck s
+bude s
+budel s
+budget s
+buffet s
+bug s
+buket s
+bummel s
+bummerl s
+bund s
+bunt s
+bure s
+burg s
+bursch s
+bus s
+busch s
+bussard s
+busserl s
+buá s
+butt s
+butter s
+butzen s
+bch s
+bck s
+bffel s
+bffet s
+bg s
+bgel s
+bhn s
+bnd s
+brg s
+brgermeister s
+bro s
+brst s
+bsch s
+bá s
+bzw st
+cafe s
+camp s
+camping s
+cellist s
+cello s
+cellophan s
+celsius s
+center s
+champagner a 4 6
+champignon a 4 6
+chance s
+chaos s
+chaot s
+charakter s
+charm s
+chauff s
+chef s
+chem s
+chemikal s
+chen e
+chiffr a 4
+china s
+chines s
+chip s
+chirurg a 4
+chlor s
+cholera s
+chor s
+choral s
+choreo v
+choreograph a 3 6
+christ s
+christus s
+chrom s
+city s
+clever s
+clown s
+club s
+cod s
+collage s
+compiler s
+computer s
+couch s
+courag s
+cousin s
+cowboy s
+creme s
+cup s
+da svt
+dabei s
+dach s
+dacht s
+dackel s
+dadurch s
+dafr s
+daher s
+dahin s
+damal s
+dame s
+damit st
+damm s
+dampf s
+dampfer s
+dank s
+dann st
+dar vst
+daran a 3
+darauf a 3
+daraus a 3
+darb s
+darf s
+darin a 3
+darm s
+darum a 3
+das st
+dasjenige s
+dasselbe s
+daá st
+data s
+datei s
+daten s
+datier s
+dattel s
+datum s
+dau s
+dauer s
+davon s
+dazu s
+d„ch s
+d„mm s
+d„mmer s
+d„mpf s
+d„mpfer s
+d„rm s
+debakel s
+deck s
+defekt s
+definier s
+definition s
+defizit s
+degen s
+dehn s
+deich s
+deichsel s
+dein s
+deka v s
+dekan s
+deklar a 2
+dekor s
+deleg s
+delikat s
+delikatesse s
+delikt s
+delphin s
+dem s
+demokrat a 2 4
+demol s
+demonstr a 2 5
+demut s
+demtig s
+den st
+denen st
+dengel s
+denjenigen s
+denk s
+denn s
+dennoch s
+denselben st
+dentist s
+deponie s
+depress a 2
+deprim a 2
+der s
+derb s
+derby s
+derjenig s
+des st v
+deshalb st
+design s
+deskript a 2
+dessen s
+dessert s
+desto s
+deswegen s
+deszend a 2
+detail s
+detektiv s
+determin s
+deut s
+deutsam s
+deutsch s
+deutschen s
+dezember s
+dezi v
+dezimal s
+dia s
+diagnos a 3
+diagnose a 3
+diagonal s
+diagramm a 3
+dialekt s
+dialog s
+diamant s
+di„t s
+dich st
+dicht s
+dick s
+dickicht s
+didakt s
+die s
+dieb s
+diejenige s
+dien s
+dienst s
+dienstag a 5
+dies s
+diffam s
+different s
+differential s
+differenz s
+diffizil s
+digital s
+dikt s
+dilemma s
+dilett s
+dimension s
+dimensional s
+ding s
+di”zes s
+diphtherie s
+diplom a 2
+dir st
+direkt s
+dirig s
+dirigent s
+dirndl s
+dis v
+diskont s
+diskret a 3
+diskussion s
+diskut s
+dispon s
+dissert s
+distanz s
+distel s
+disziplin a 3 5
+diva s
+divergent s
+divergenz s
+divers s
+divid s
+divis s
+diwan s
+doch st
+docht s
+dogge s
+dohle s
+doktor s
+dokument s
+dokumentar s
+dokumentation s
+dolch s
+dollar s
+dolmetsch s
+dom s
+domino s
+dompt s
+donau s
+donner s
+donnerstag a 3 7
+doppel s
+doppl s
+dorb s
+dorf s
+dorn s
+dorr s
+dorsch s
+dort s
+dose s
+dot s
+dotter s
+dozent s
+dozier s
+d”rf s
+d”rr s
+drache s
+dragoner s
+draht s
+drama s
+dran vst
+drang s
+drap s
+drastisch s
+drauf st v
+draus st
+drauáen st
+dr„ht s
+dr„ng s
+drechseln s
+drechsler s
+dreck s
+dreh s
+drei s
+dreier a 4
+dreiáig s
+dresch s
+dress s
+dreá s
+dribb s
+drieá s
+drill s
+drin st
+dring s
+drinnen st
+drischt s
+dritt s
+droben st
+drog s
+droh s
+drollig s
+dromedar s
+drosch s
+dross s
+droá s
+dr”hn s
+druck s
+drum vst
+drungen s
+drunter st
+druá s
+drben st
+drber s
+drck s
+drs s
+dschungel s
+dschunke s
+du st
+duck s
+dudel s
+duell s
+duett s
+duft s
+dukat s
+duktion s
+duld s
+dumm s
+dumpf s
+dung s
+dunkel s
+dunkl s
+dunst s
+dur s
+durch vs
+durchaus a5
+durchs st
+durf s
+durst s
+dusch s
+dutzend s
+duz s
+dbel s
+dft s
+dmm s
+dng s
+dnn s
+dnst s
+drf s
+drr s
+drst s
+ds s
+dster s
+dynam s
+dynamik a 2
+dynamisch a 2
+dynamo s
+dynast s
+e e
+eben s
+ebenso st
+eber s
+ebne s
+echo s
+echse s
+echt s
+eck s
+edel s
+edit s
+efeu s
+effekt s
+effektiv s
+effizient s
+effizienz s
+egal s
+egg s
+egoist a 3
+ehe s
+ehr s
+ei es
+eich s
+eid s
+eier s
+eifer s
+eifrig s
+eig s
+eigentlich s
+eil s
+eimer s
+ein vs
+einander a 3
+eine s
+einem s
+einen s
+einer s
+einheit s
+einig s
+einiger s
+eins s
+einsam s
+einzel s
+einzig s
+eis s
+eisen s
+eisern s
+eitel s
+eiter s
+eitrig s
+ekel s
+el e
+elast s
+elastizit„t s
+elefant s
+eleg s
+elegant s
+eleganz s
+elektr a4
+elektrizit„t a 4
+elektro a 4
+element s
+elementar s
+elend s
+elf s
+elimin s
+ell e
+ellbogen s
+elle e
+ellen e
+ellenbogen s
+elles e
+ellipse s
+elliptisch s
+elnd e
+elster s
+eltern s
+em e
+email s
+emaill s
+emp v
+empir s
+empor s
+emp”r s
+emsig s
+en e
+end es
+energ s
+eng s
+enkel s
+enorm s
+ensemble a 2 5
+ent ve
+entbehr s
+ente s
+entgolt s
+entlich e
+entzckend s
+enz e
+enzian s
+epiped s
+episode s
+epoch s
+er vset
+erb s
+erd s
+erei e
+ergonom s
+erker s
+erl s
+ernd e
+ernst s
+ernte s
+erst s
+erz s
+es est
+esch s
+esel s
+eskal s
+eskapade s
+eskimo s
+espe s
+essant s
+esse s
+essig s
+eá s
+etage s
+etappe s
+eternit s
+eth a 3
+etikett s
+etliche s
+etui s
+etwa s
+etwaig a 2 4
+etwas st
+euch st
+euer st
+eule s
+eur e
+eure est
+europa s
+europ„ s
+euter s
+evangel s
+eventuell s
+ewig s
+ex v
+exakt a 2
+exemplar a 2 4
+exerz a 2
+exil s
+existent a 3
+existenz s
+existier s
+exklud a2
+exklus a 2
+exorbitant a 2
+exot s
+experiment s
+experte s
+explizi a 2
+explodier a 2
+explosion a 2
+exponent s
+export s
+expreá a 2
+exspekt a 2
+extern s
+extra a 2
+extrem a 2
+extrema a 2
+extremal a 2
+fabel s
+fabrik a 2
+fabrikant a 2
+fabrikat a 2
+fabrikation a 2
+fabrizier s
+fach s
+fackel s
+fad s
+faden s
+fahl s
+fahn s
+fahnd s
+fahr s
+fakt s
+fakult„t s
+falk s
+fall s
+falsch s
+falt s
+famili„r s
+familie s
+famos s
+fanat s
+fand s
+fanfare s
+fang s
+farb s
+farm s
+faschier s
+fasching s
+faser s
+fass s
+fasson s
+fast s
+faá s
+faát s
+fauch s
+faul s
+faust s
+faxe s
+fazit s
+f„cher s
+f„d s
+f„den s
+f„hig s
+f„hr s
+f„hrd s
+f„ll s
+f„lsch s
+f„lt s
+f„ng s
+f„rb s
+f„ul s
+f„ust s
+feber s
+februar a 2 5
+fecht s
+feder s
+fee s
+feg s
+fehd s
+fehl s
+fehler s
+feier a 3
+feig s
+feil s
+feilsch s
+fein s
+feind s
+feld s
+felg s
+fell s
+fels s
+fenster s
+ferien a 2 4
+ferkel s
+fern s
+fers s
+fertig s
+fesch s
+fessel s
+fest s
+feál s
+fett s
+fetz s
+feucht s
+feuer s
+feurig s
+fiaker s
+fibel s
+ficht s
+fidel s
+fieber s
+fiebrig s
+fied s
+fiedel s
+fiehl s
+fiel s
+figur s
+fikt s
+file au 3
+filial s
+film s
+filter s
+filtr s
+filz s
+final s
+finanz s
+finanziell s
+find s
+finesse s
+fing s
+finger s
+finish s
+finit s
+fink s
+finster s
+firm s
+firma s
+firn s
+firnis s
+first s
+fisch s
+fischer s
+fistel s
+fit s
+fix s
+flach s
+flacker s
+flad s
+flagg s
+flamm s
+flanell s
+flank s
+flasche s
+flatter s
+flau s
+flaum s
+fl„ch s
+fl„sch s
+flecht s
+fleck s
+fleckerl s
+fledermaus s
+flegel s
+fleh s
+flehentlich s
+fleisch s
+fleiá s
+fletsch s
+flexib s
+flexibilit„t s
+flicht s
+flick s
+flieder s
+flieg s
+flieh s
+flies s
+flieá s
+flimmer s
+flink s
+flint s
+flitter s
+flitz s
+flocht s
+flock s
+flog s
+floh s
+flosse s
+floá s
+flott s
+flӇ s
+fl”te s
+fluch s
+flucht s
+flug s
+flunker s
+flur s
+fluss s
+fluá s
+flut s
+flcht s
+flge s
+flgel s
+flgge s
+flss s
+flster s
+focht s
+fohl s
+folg s
+folgend s
+folgender s
+folie s
+folter s
+fon s
+fonds s
+fopp s
+forc s
+forder s
+forelle s
+foren s
+form s
+formal s
+format s
+formel s
+formular s
+formulier s
+forsch s
+forst s
+fort s
+forum s
+foto s
+f”hn s
+f”hre s
+f”n s
+f”rder s
+f”rm s
+f”rst s
+fracht s
+frag s
+frank s
+frans s
+fraá s
+fratz s
+frau s
+fr„chter s
+fr„s s
+fr„á s
+fr„ulein s
+frech s
+frei s
+freitag s
+fremd s
+frequentier s
+frequenz s
+fress s
+freu s
+freud s
+freund s
+frev s
+fried s
+frier s
+fris s
+frisch s
+frist s
+friá s
+frittat s
+froh s
+fromm s
+fron s
+front s
+fror s
+frosch s
+frost s
+frott s
+frotzel s
+fr”h s
+fr”st s
+frucht s
+frcht s
+frh s
+fuchs s
+fug s
+fuhr s
+fund s
+funk s
+funktion s
+furch s
+furcht s
+furt s
+furunkel s
+fusion s
+fuá s
+futter s
+futteral s
+fg s
+fhl s
+fhr s
+fll s
+fnd s
+fnf s
+fr vst
+frcht s
+frst s
+fá s
+ftter s
+gab s
+gabel s
+gacker s
+gaff s
+galant s
+galerie s
+galgen s
+gall s
+galopp s
+galt s
+gams s
+gang s
+gans s
+ganz s
+gar s
+garag s
+garaus a 3
+garb s
+garde s
+garnitur s
+garten s
+gas s
+gaso v
+gasse s
+gast s
+gatsch s
+gatt s
+gau s
+gaul s
+gaumen s
+gauner s
+g„b s
+g„hn s
+g„ng s
+g„ns s
+g„nz s
+g„r s
+g„rten s
+g„ste s
+g„á s
+ge v
+geb s
+gebaut s
+geb„rd s
+geb„ud s
+geber s
+geboren s
+gebracht a 2
+geburt s
+gebhr s
+gedeih s
+gediegen s
+gedieh s
+gegen s
+gegend s
+gegn s
+gegner s
+gegolten s
+geh s
+gehalt s
+geheim s
+geheuer s
+geheuren s
+geier s
+geig s
+geil s
+geisel s
+geist s
+geiá s
+geiz s
+gelb s
+geld s
+gelegentlich s
+geling s
+gell s
+gelse s
+gelt s
+gelbd s
+gem„lde s
+gems s
+gems s
+genau s
+genauso s
+gendarm s
+general s
+generator s
+generell s
+generier s
+genes s
+genesen s
+genieá s
+genoss s
+genoá st
+genug s
+geng s
+geo v
+gerad s
+geradeaus a 6
+geradezu s
+gerb s
+germ s
+german s
+gern s
+gerste s
+gerte s
+gerch s
+germpel s
+ges„á s
+geschah s
+geschehen s
+geschieht s
+geschm„cker a 2
+geschmeid a 2
+geschwister s
+geschwr a 2
+geselcht s
+gesell s
+gesind s
+gessen s
+gest s
+gestrig s
+gestrpp a 2
+gestt s
+gesund s
+gesungen s
+gesunken s
+geálich s
+getan s
+getreide a 2
+geud s
+gewalt s
+gewann s
+gewinn s
+gewiá s
+geziefer s
+geziem s
+gib s
+gicht s
+gieb s
+gier s
+gieá s
+gift s
+gigant s
+gilb s
+gilt s
+ging s
+ginster s
+gipfel s
+gips s
+giraffe s
+girlande s
+girr s
+gitarre s
+gitter s
+gladiole s
+glanz s
+glas s
+glatt s
+glatz s
+glaub s
+gl„nz s
+gl„s s
+gl„tt s
+gl„ub s
+gleich s
+gleis s
+gleit s
+gletscher s
+glich s
+glied s
+glimm s
+glimpf s
+glitschig s
+glitt s
+glitzer s
+glitzernd s
+global s
+globus s
+glock s
+glomm s
+gloss s
+glossar s
+glotz s
+gl”ck s
+glucks s
+glut s
+glck s
+glh s
+gnade s
+gn„dig s
+gng s
+gockel s
+gold s
+golf s
+gonal s
+gondel s
+gong s
+gorilla s
+goss s
+goá s
+gott s
+g”nn s
+g”tt s
+grab s
+grad s
+graf s
+gram s
+gramm s
+grammatikalisch s
+granat s
+grandios s
+granit s
+grant s
+graph s
+graphik s
+gras s
+grat s
+gratis s
+gratul s
+grau s
+graupel s
+grav s
+gravierend s
+grazi s
+gr„b s
+gr„f s
+gr„m s
+gr„s s
+gr„álich s
+gr„te s
+gr„tsch s
+greif s
+greis s
+greiáler s
+grell s
+gremien a 3 5
+gremium s
+grenz s
+greuel s
+grieá s
+griff s
+grill s
+grimasse s
+grimm s
+grind s
+grins s
+gripp s
+grob s
+grobian s
+groll s
+groschen s
+groá s
+grott s
+gr”hl s
+grӇ s
+grub s
+gruft s
+grund s
+grunz s
+gruppe s
+gruppier s
+grusel s
+gruss s
+gruá s
+grb s
+grn s
+grnd s
+grá s
+guck s
+gugelhupf s
+gulasch s
+gulden s
+gummi s
+gunst s
+gurgel s
+gurk s
+gurt s
+guss s
+guá s
+gut s
+gltig s
+gnst s
+grt s
+gss s
+gt s
+gymnasi s
+gymnasium s
+gymnast s
+haar s
+hab s
+habicht s
+habilit s
+hack s
+hader s
+hafen s
+hafer s
+hafner s
+haft s
+hag s
+hagel s
+hahn s
+hai s
+hain s
+hak s
+halb s
+halde s
+halfter s
+hall s
+hallo s
+halm s
+hals s
+halt s
+hammel s
+hammer s
+hampel s
+hamster s
+hand s
+handlung s
+hanf s
+hang s
+hangar s
+hantier s
+haper s
+happen s
+hardware au 4 7
+harfe s
+harm s
+harmon s
+harmonika s
+harn s
+harpun s
+harr s
+harsch s
+hart s
+hartn„ckig s
+harz s
+hasch s
+hase s
+hasel s
+hass s
+hast s
+haá s
+hat s
+hatte s
+hau s
+haube s
+hauch s
+haufen s
+haupt s
+haus s
+haut s
+h„ftling s
+h„k s
+h„kel s
+h„lfte s
+h„lt s
+h„mmer s
+h„nd s
+h„ng s
+h„nseln s
+h„rchen s
+h„rt s
+h„s s
+h„ss s
+h„á s
+h„tsch s
+h„tte s
+h„uf s
+h„upt s
+h„us s
+h„ut s
+heb s
+hecht s
+heck s
+heer s
+hefe s
+heft s
+heg s
+heid s
+heikel s
+heiklig s
+heil s
+heiland s
+heim s
+heimat s
+heirat s
+heiser s
+heiá s
+heit e
+heiter s
+heiz s
+hektar s
+hekto v
+held s
+helf s
+helikopter s
+hell s
+helm s
+hemd s
+hemm s
+hendl s
+hengst s
+henk s
+henne s
+her vs
+herab a 3
+heran a 3
+herauf a 3
+heraus a 3
+herb s
+herbst s
+herd s
+herein a 3
+hering s
+herr s
+herrsch s
+herum a 3
+herz s
+hetz s
+heu s
+heuchel s
+heuchler s
+heuer s
+heul s
+heut s
+hex s
+hieb s
+hielt s
+hier s
+hierarch a 4 6
+hierauf a 4
+hierbei s
+hierfr s
+hierher s
+hierzu s
+hiesig s
+hieá s
+hilf s
+him v
+himmel s
+himmlisch s
+hin vs
+hinab a 3
+hinauf a 3
+hinaus a 3
+hinder s
+hindurch s
+hinein a 3
+hing s
+hink s
+hint s
+hinter s
+hinzu s
+hirn s
+hirsch s
+hirse s
+hirt s
+hiss s
+histor s
+hitz s
+hob s
+hobby s
+hoch s
+hock s
+hof s
+hoff s
+hoffentlich st
+hohe s
+hohl s
+hohn s
+hol s
+holf s
+holper s
+holprig s
+holz s
+homo v
+honig s
+hopf s
+hoppel s
+hoppla s
+hops s
+horch s
+horde s
+horizont s
+horizontal s
+horn s
+hornisse s
+horst s
+hort s
+hose s
+hospital a 2
+hospit„ler a 2
+hostie s
+hotel s
+h”chst s
+h”cker s
+h”f s
+h”h s
+h”ll s
+h”lz s
+h”r s
+h”s s
+hub s
+hudeln s
+huf s
+huhn s
+human s
+hummel s
+hummer s
+humor s
+humpel s
+humus s
+hund s
+hundert s
+hunger s
+hungrig s
+hup s
+hupf s
+hurra s
+hurtig s
+husch s
+hust s
+hut s
+hbsch s
+hft s
+hgel s
+hhn s
+hhner s
+hhnerei a 3 6
+hll s
+hls s
+hndin s
+hpf s
+hrde s
+hsteln s
+ht s
+hyazinth s
+hy„ne a 3
+hydrant a 2
+hygien s
+hymne s
+hypnotis s
+hypothese s
+hypothetisch s
+hyster s
+iade e
+ial e
+iat e
+ich st
+ideal s
+idee s
+ident s
+identifikation s
+idiot s
+ie e
+iell e
+ien e
+ier e
+ig e
+igel s
+ignor s
+ihm st
+ihn s
+ihr s
+ik e
+ika e
+ikum e
+illuster s
+illustr a 2 4
+im st
+imag s
+imbiá s
+imker s
+immer s
+immerzu s
+immun s
+impf s
+implement a 2
+implizi a 2
+import s
+impr„gn a 2 5
+improvis a 2
+impuls s
+imstand s
+in vest
+in„r e
+indes s
+indessen s
+index s
+individu s
+individuum s
+indiz s
+industri a 2 4
+infekt s
+infinitesimal s
+infiz s
+inflation a 2
+infolgedessen s
+informatik s
+information s
+infra a 2
+inhal s
+initi a 2
+injekt s
+inklus a2
+inne s
+innere s
+innig s
+innung s
+ins st
+insbesonder s
+insekt s
+insel s
+inser s
+insgesamt s
+insolvent s
+insolvenz s
+inspekt a 2
+instanz s
+instinkt s
+institut s
+instrument a 2
+inszenier a 2
+integer s
+integr a 2 4
+integral a 2 4
+intelligent s
+intelligenz s
+intendant s
+intens s
+inter v
+interess a 2 5
+intern s
+interpret a 2 5
+intrig a 2
+invalid s
+inventar s
+inventur s
+invest s
+inwieweit s
+ion e
+ional e
+irdisch s
+irgend s
+irgendein a 6
+irgendwie s
+irgendwo s
+irr s
+irrelevant s
+irreversibel s
+isation e
+isch e
+isier e
+ismus e
+iso v
+isol s
+ist st e
+istisch e
+iát s
+italien s
+it„t e
+iter s
+ition e
+ium e
+iv e
+iz e
+ja s
+jacht s
+jacke s
+jag s
+jagd s
+jahr s
+jahresende a 3 6
+jalousie s
+janker s
+januar s
+jauche s
+jauchz s
+jaul s
+jaus s
+jazz s
+j„ck s
+j„ger s
+j„h s
+j„hr s
+j„mmerlich s
+j„nner s
+j„te s
+je st
+jed s
+jedoch st
+jeglich s
+jeher s
+jemals s
+jemand s
+jen s
+jenseits s
+jesus s
+jetzig s
+jetzt s
+jeweil s
+job s
+joch s
+jod s
+jodel s
+jodler s
+joghurt a 2
+johannis s
+johl s
+jongl s
+joppe s
+journal a 4
+jubel s
+jubil s
+jubilar s
+jubil„um s
+juchz s
+juck s
+jud s
+judo s
+jugend s
+juli s
+jung s
+juni s
+justiz s
+jute s
+juwel s
+jux s
+jd s
+jng s
+kabel s
+kabin s
+kachel s
+kaffee s
+kahl s
+kahn s
+kai s
+kaiser s
+kajak s
+kakao s
+kaktus s
+kalb s
+kalender s
+kalk s
+kalkul s
+kalt s
+kam s
+kamera s
+kamerad s
+kamill s
+kamm s
+kamp s
+kampf s
+kanal s
+kanarie s
+kan„le s
+kandid s
+kanin s
+kanister s
+kann s
+kanon s
+kanone s
+kant s
+kanu s
+kanz s
+kap s
+kapazit„t s
+kapital s
+kapit„n s
+kapitel s
+kaplan a 2
+kappe s
+kaputt s
+kapuz s
+kar s
+karabiner s
+karaffe s
+karawan s
+karbol s
+kardinal s
+karg s
+kari s
+karniese s
+karo s
+karosse s
+karott s
+karpfen s
+karte s
+kartei s
+kartoffel s
+karton s
+kasern s
+kasperl s
+kass s
+kassa s
+kastanie s
+kasten s
+katakomb s
+katalog s
+katarrh s
+katastroph a 2 4
+katastrophal s
+katech s
+kategor s
+kater s
+kathol s
+katze s
+kau s
+kauer s
+kauf s
+kaum s
+kautschuk s
+kauz s
+k„fer s
+k„fig s
+k„lt s
+k„m s
+k„mm s
+k„mpf s
+k„nguruh s
+k„pp s
+k„rg s
+k„rt s
+k„se s
+k„st s
+k„tz s
+k„ue s
+k„uf s
+keck s
+kegel s
+kehl s
+kehr s
+keif s
+keil s
+keim s
+kein s
+keit e
+keks s
+kelch s
+kell s
+kenn s
+kenter s
+keram s
+kerb s
+kerker s
+kerl s
+kern s
+kerze s
+kessel s
+kett s
+keuch s
+keule s
+keusch s
+kicher s
+kiebitz s
+kiefer s
+kiel s
+kieme s
+kien s
+kies s
+kilo vs
+kind s
+kinn s
+kino s
+kiosk s
+kipp s
+kirch s
+kirsch s
+kirtag s
+kissen s
+kist s
+kitsch s
+kitt s
+kitz s
+klag s
+klamm s
+klammer s
+klang s
+klappe s
+klappt s
+klaps s
+klar s
+klass s
+klassifizier s
+klatsch s
+klau s
+klaub s
+klausur s
+klavier s
+kl„ff s
+kl„g s
+kl„ng s
+kl„r s
+kleb s
+kleck s
+klee s
+kleid s
+kleie s
+klein s
+kleister s
+klemm s
+klett s
+klima s
+klimper s
+klin s
+kling s
+klink s
+klinker s
+klipp s
+klirr s
+klo s
+klopf s
+klosett s
+kloster s
+klotz s
+kl”ppel s
+klub s
+kluft s
+klug s
+klump s
+klung s
+klft s
+knabber s
+knabe s
+knack s
+knall s
+knapp s
+knarr s
+knatt s
+knaus s
+kn„cke s
+kn„uel s
+knebel s
+knecht s
+knet s
+knick s
+knie s
+kniff s
+knips s
+knirps s
+knirsch s
+knister s
+knitter s
+knoblauch s
+knoch s
+knochen s
+knoll s
+knopf s
+knorpel s
+knorplig s
+knorr s
+knosp s
+knot s
+kn”ch s
+kn”del s
+kn”pf s
+knurr s
+knusper s
+knusprig s
+knll s
+knpf s
+knppel s
+koal a 2
+kobel s
+kobold s
+koch s
+kod s
+kodex s
+koeffizient s
+koffer s
+kogel s
+kognit a 2
+kohl s
+koje s
+kokos s
+koks s
+kolb s
+kolik s
+kollabier s
+kollaps s
+kolleg s
+kollekt s
+koller s
+kolonn s
+kolossal s
+koloá s
+kombination s
+kombinator s
+kombinatorisch s
+kombinier s
+komm s
+komma s
+kommando s
+kommentar s
+kommentier s
+kommiss s
+kommun s
+kommuni s
+kompakt s
+kompanie s
+kompetent s
+kompetenz s
+komplett a 3
+komplex a 3
+kompliment a 3
+kompliz a 3
+kompon s
+komponente s
+kompott s
+kon v
+kondens s
+kondition s
+konditor s
+kondol s
+konfekt s
+konfer s
+konfession s
+konflikt a 3
+kongreá a 3
+kongruenz a 3 6
+konjunktur s
+konkav s
+konkret a 3
+konkurr s
+konkurrent s
+konn s
+konsequent s
+konsequenz s
+konserv s
+konsonant s
+konstant s
+konstruier a 3
+konstrukt a 3
+konsum s
+konsument s
+kontakt s
+konten s
+kontingent s
+kontinuier s
+konto s
+kontra a 3
+kontrakt a3
+kontrast a 3
+kontroll a 3
+konvent s
+konvergent s
+konvergenz s
+konvex s
+konzentr a3 6
+konzept s
+konzern s
+konzert s
+konzession s
+konzil s
+konzipier s
+kooperation a 2
+koordin a 2
+kopf s
+kopie s
+kopplung s
+koralle s
+korb s
+kork s
+korn s
+korrekt s
+korrektur s
+korrel s
+korrespond a 3 5
+korrigier s
+kosmet s
+kosmo s
+kost s
+kostm s
+kot s
+kotz s
+k”ch s
+k”der s
+k”ffer s
+k”hl s
+k”mm s
+k”nig s
+k”nn s
+k”pf s
+k”rn s
+k”rper s
+k”st s
+krabbel s
+krach s
+kraft s
+kragen s
+krakeel s
+kralle s
+kram s
+krampen s
+krampf s
+kran s
+krank s
+kranz s
+krapfen s
+krass s
+kraá s
+krat s
+kratz s
+kraul s
+kraus s
+kraut s
+krawall s
+krawatte s
+krax s
+kr„chz s
+kr„ft s
+kr„gen s
+kr„h s
+kr„mer s
+kr„nk s
+kr„nz s
+kr„usel s
+kr„ut s
+kreat s
+krebs s
+kredenz s
+kredit s
+kreide s
+kreier a 3
+kreis s
+kremp s
+kren s
+krepp s
+kreuz s
+kribb s
+kriech s
+krieg s
+krimi s
+kripp s
+krise s
+krisis s
+kristall s
+krit s
+kriteri s
+kriterium s
+kritzel s
+kroch s
+krokodil s
+kron s
+kropf s
+kr”n s
+kr”te s
+krug s
+krumm s
+krust s
+kruzifix s
+krcke s
+krg s
+krmm s
+krppel s
+krypto v
+kubisch s
+kubus s
+kuchen s
+kuckuck s
+kuf s
+kugel s
+kuh s
+kult s
+kultur s
+kummer s
+kund s
+kunft s
+kunst s
+kunterbunt s
+kupfer s
+kuppe s
+kuppel s
+kupplung s
+kur s
+kurbel s
+kurios s
+kurs s
+kurv s
+kurz s
+kusine s
+kuá s
+kutsch s
+kutte s
+kuvert s
+kbel s
+kche s
+kcken s
+khl s
+khn s
+kken s
+kmmel s
+kmmer s
+knd s
+knft s
+knftig s
+knst s
+kr s
+krbis s
+krschner s
+krz s
+kss s
+kste s
+kybernet s
+lab s
+lach s
+lack s
+lad s
+lag s
+lahm s
+laib s
+laich s
+laie s
+lall s
+lament s
+lamm s
+lampe s
+lampion s
+land s
+lang s
+lanze s
+lapp s
+larv s
+las s
+lasch s
+lass s
+lasso s
+last s
+laá s
+latein s
+latern s
+latsch s
+latte s
+latz s
+lau s
+laub s
+lauch s
+lauf s
+laug s
+laus s
+lausch s
+laut s
+lava s
+lawine s
+lax s
+lazarett s
+l„ch s
+l„dt s
+l„g s
+l„hm s
+l„nd s
+l„nder s
+l„ng s
+l„rm s
+l„ss s
+l„ster s
+l„stig s
+l„á s
+l„át s
+l„uf s
+l„ufer s
+l„us s
+l„ut s
+le e
+leb s
+lechz s
+leck s
+leder s
+ledig s
+lee s
+leer s
+leg s
+legal s
+legitim s
+lehen s
+lehm s
+lehn s
+lehr s
+lei e
+leib s
+leich s
+leicht s
+leid s
+leier s
+leih s
+leim s
+lein s e
+leise s
+leist s
+leit s
+lenk s
+lenz s
+lepra a 2
+ler e
+lerche s
+lern s
+les s
+letzt s
+leucht s
+leugn s
+leut s
+lexikon s
+libelle s
+lich e
+licher e
+licht s
+lid s
+lieb s
+lied s
+lief s
+lieg s
+lieh s
+lies s
+lieá s
+lift s
+lig e
+liga s
+lik”r s
+lila s
+limonade s
+limousine s
+lind s
+lineal s
+linear s
+ling e
+linguist s
+linie s
+linien a 2 4
+linig s
+link s
+linoleum s
+linse s
+lippe s
+lisch e
+lispel s
+list s
+liter s
+literatur s
+litt s
+liturg s
+livr a 2
+lizenz s
+lob s
+loch s
+lock s
+loden s
+log s
+loggia s
+logik s
+logisch s
+loh s
+lohn s
+lok s
+lokal s
+lokomotiv s
+lorbeer s
+los vse
+lot s
+lotto s
+l”b s
+l”ch s
+l”ck s
+l”ffel s
+l”hn s
+l”s s
+l”sch s
+l”t s
+l”w s
+lud s
+luft s
+luke s
+lump s
+lung e
+lunge s
+lupe s
+lust s
+lutsch s
+luv s
+luxuri”s s
+luxus s
+lcke s
+lft s
+lg s
+lmmel s
+lys e
+lyt e
+m e
+mach s
+madonna s
+mag s
+magazin s
+magd s
+magistrat a2 4
+magnet a2
+magneto a2
+mahagoni s
+mahd s
+mahl s
+mahn s
+mai s
+majest s
+majoran s
+makel s
+makkaroni s
+makler s
+mal s
+malus s
+malz s
+man s
+management s
+managen s
+manager s
+manch s
+mand s
+manege s
+mang s
+mangel s
+manifest s
+manipulation s
+manipulier s
+mann s
+man”v s
+mansarde s
+manschette s
+mantel s
+manu s
+manuell s
+mappe s
+marder s
+margarine s
+marginal s
+marionett s
+mark s
+markier s
+markise s
+markt s
+marmelade s
+marmor s
+marsch s
+marter s
+marzipan s
+masch s
+maschin s
+maser s
+mask s
+mass s
+masse s
+mast s
+maá s
+matador s
+match s
+mater s
+material s
+materie s
+mathematik s
+mathematisch s
+matratze a 2
+matrikel a 2 5
+matrix a 2
+matrize a 2 5
+matsch s
+matt s
+matura s
+mauer s
+maul s
+maurer s
+maus s
+maut s
+maxim s
+maximal s
+maximum s
+mayonnaise a 2 5
+m„ch s
+m„dchen s
+m„del s
+m„dl s
+m„h s
+m„ngel s
+m„nn s
+m„ntel s
+m„rchen s
+m„rkte s
+m„rtyrer s
+m„rz s
+m„st s
+m„á s
+m„us s
+mechan s
+mecker s
+medaille s
+medaillon s
+medial s
+medien s
+medikament s
+medium s
+medizin s
+meer s
+mehl s
+mehr s
+meid s
+meier s
+meile s
+mein s
+meind s
+meise s
+meist s
+meiáel s
+meld s
+melk s
+melod s
+melone s
+menagerie s
+meng s
+mensch s
+ment e
+mental s
+menu s
+men s
+merk s
+merz s
+mess s
+messen s
+messer s
+messing s
+meá s
+meta v
+metall s
+metapher s
+meteor s
+meteoro s
+meter s
+method s
+metr a 2
+metropol a 2
+mett s
+metz s
+meut s
+mich s
+mied s
+mieden s
+mien s
+mies s
+miet s
+mikro a 2
+milch s
+mild s
+milit s
+milli v
+milliarde s
+million s
+milz s
+minder s
+mindest s
+mine s
+mineral s
+mini s
+miniatur s
+minimal s
+minimum s
+minister s
+ministerium s
+minus s
+minute s
+mint s
+minz s
+mir st
+misch s
+miser s
+mismus e
+misse s
+mission s
+missionar s
+mist s
+miá vs
+mit vst
+mitt s
+mittag s
+mitter s
+mittler s
+mittwoch s
+mix s
+mobil s
+mobilit„t s
+mocht s
+mod s
+modell s
+modi s
+modifikation s
+modifizier s
+modul s
+modular s
+modus s
+mogel s
+mohn s
+mohr s
+mokka s
+molk s
+moll s
+moment s
+momentan s
+monat s
+mond s
+monitor s
+mono v
+mont s
+montag s
+monument s
+moor s
+moos s
+moped s
+mops s
+moral s
+morast s
+morator s
+mord s
+morg s
+morgen s
+moritat s
+morph s
+morpho v
+morsch s
+mosaik s
+most s
+motiv s
+motor s
+motte s
+m”bel s
+m”bl s
+m”cht s
+m”g s
+m”nch s
+m”rder s
+m”rtel s
+m”we s
+mucks s
+muff s
+mulde s
+muli s
+mull s
+multi s
+multiplikand a 3 5
+multiplikat a 3 5
+mumie s
+mumps s
+mund s
+munition s
+munkel s
+munter s
+mure s
+murks s
+murmel s
+murr s
+mus s
+muschel s
+muse s
+museum a 2 4
+musik s
+musikal s
+musiz s
+muskel s
+muskulatur s
+muskul”s s
+muster s
+muá s
+mut s
+mutter s
+mcke s
+md s
+mh s
+mll s
+mnd s
+mnz s
+mrb s
+mrr s
+mss s
+má s
+máte s
+mt s
+mtz s
+myst s
+mysteri s
+mystif s
+mythen s
+mythisch s
+mythos s
+n e
+nabe s
+nabel s
+nach vs
+nachdem st
+nacht s
+nacken s
+nackt s
+nadel s
+nadel”hr a 2 5
+nag s
+nah s
+nahezu s
+nahm s
+naiv s
+nam s
+namentlich s
+nannt s
+nano v
+narb s
+narkose s
+narr s
+narzisse s
+nas s
+nasch s
+naá s
+nation s
+national s
+natter s
+natur s
+natr s
+n„chst s
+n„cht s
+n„h s
+n„m s
+n„rr s
+n„rrisch s
+n„s s
+nebel s
+neben s
+nebenan a2 5
+nebenbei s
+neblig s
+nebst s
+neck s
+neffe s
+negativ s
+neger s
+negrid a 2
+nehm s
+neid s
+neig s
+nein s
+nelke s
+nenn s
+neon s
+nephritis a 2 6
+nerv s
+nerv”s s
+nessel s
+nest s
+nett s
+netto s
+netz s
+neu s
+neugierde s
+neun s
+neuralg a 4
+neuro v
+neutral a 3
+neutrum a 3
+nicht s
+nick s
+nie s
+nied s
+niere s
+niet s
+nikolaus s
+nikotin s
+nil s
+nimm s
+nipp s
+nirgend s
+nirgendwo s
+nis e
+nische s
+nist s
+niveau s
+nixe s
+nobel s
+noch s
+nock s
+nom s
+nommen s
+nonne s
+nord s
+norm s
+normal s
+nostalg a 4
+not s
+notar s
+notiz s
+nougat s
+novell s
+november s
+n”rd s
+n”rg s
+n”t s
+nudel s
+nugat s
+nuklear a 2
+null s
+numer s
+numerier s
+numerisch s
+nummer s
+nun st
+nunft s
+nunmehr st
+nur st
+nuá s
+nut s
+nutz s
+nutzer s
+nchter s
+nnft s
+nster s
+ntz s
+nylon s
+oase s
+ob v
+obacht a 2
+obdach s
+oben s
+ober s
+obig s
+objekt s
+oblate s
+obmann s
+oboe s
+obschon s
+obst s
+obwohl st
+ochs s
+ocker s
+oder st
+ofen s
+offen s
+offiz s
+offizier s
+oft s
+ohn s
+ohr s
+oktober s
+oliv s
+olymp s
+oma s
+omelett s
+omnibus s
+onkel s
+opa s
+oper s
+operat s
+operette s
+operier s
+opfer s
+opposit s
+opti s
+optik s
+option s
+opus s
+or e
+orange s
+orchester s
+ord s
+ordentlich s
+organ s
+organis s
+organisation s
+organisier s
+orgel s
+orientier s
+original s
+originell s
+orium e
+orkan s
+ornament s
+ort s
+ortho v
+ost s
+oster s
+otter s
+oval s
+ozean s
+”d s
+”fen s
+”ffentlich s
+”ffne s
+”ffnung s
+”ft s
+”hr s
+”ko v
+”l s
+”r e
+”rt s
+”rtlich s
+”s e
+”se s
+”st s
+”ster s
+paar s
+pacht s
+pack s
+padd s
+paket s
+palais s
+palast s
+palaver s
+paletot s
+palett s
+palm s
+pan s
+paneel s
+panorama a 3
+pansch s
+pantoffel s
+pantsch s
+panzer s
+papa s
+papagei s
+papier s
+papp s
+paprika a 2
+papst s
+par st
+para v
+parad s
+paradies s
+parallaxe a 3
+parallel a 3
+parallelo a 3
+pardon s
+parfum s
+parfm s
+parier s
+parit s
+park s
+parlament s
+part s
+partei s
+parterre s
+partie s
+partizip s
+partner s
+party s
+parzell s
+pasch s
+pass s
+passable a 3 5
+passage s
+passagier s
+passier s
+pasta s
+paste s
+pastet s
+pasteurisier s
+pastor s
+paá s
+pat s
+patent s
+patho v
+patient s
+patron a 2
+patsch s
+patschen s
+patz s
+pauk s
+paus s
+pauschal s
+pause s
+pavian s
+pavillon s
+p„chter s
+p„ck s
+p„dagog a 3
+p„pst s
+p„rchen s
+pech s
+pedal s
+pedit s
+pegel s
+pein s
+peitsch s
+pelikan s
+pelz s
+pend s
+pension s
+pensum s
+per vst
+perfekt s
+pergament s
+period a 2 4
+peripher s
+perl s
+perlon s
+permanent s
+perplex a 3
+person s
+personal s
+pers”n s
+percke s
+pessim s
+pest s
+petersil s
+petrol a 2
+petroleum a 2 5
+pfad s
+pfahl s
+pfand s
+pfanne s
+pfarr s
+pfau s
+pf„nd s
+pf„nde s
+pfeffer s
+pfeif s
+pfeil s
+pfennig s
+pferd s
+pfiff s
+pfingst s
+pfirsich s
+pflanz s
+pflaster s
+pflaume s
+pfleg s
+pflicht s
+pflock s
+pflug s
+pflck s
+pflg s
+pfort s
+pfosten s
+pfote s
+pf”rt s
+pfropf s
+pfui s
+pfund s
+pfusch s
+pftze s
+phantas s
+phantast s
+phantom s
+phase s
+philo s
+phon s
+phor e
+photo s
+photograph a 3 5
+phys s
+physio v
+pianino s
+pianist s
+piano s
+pick s
+piekfein s
+piep s
+piesack s
+pigment s
+pik s
+pilger s
+pille s
+pilot s
+pilz s
+pingpong s
+pinguin s
+pink s
+pinne s
+pinsel s
+pinupgirl a3
+pinzette s
+pionier s
+pirat s
+pirouette s
+pirsch s
+piste s
+pistol s
+pittoresk s
+plafond s
+plag s
+plagiat s
+plakat s
+plakette s
+plan s
+planet s
+planke s
+plankton s
+plansch s
+plantage s
+plapper s
+plasma s
+plast s
+plastik s
+plateau s
+platin s
+platitde s
+platonisch s
+platsch s
+platt s
+platz s
+plauder s
+plausch s
+plausibel s
+plazet s
+plazier s
+pl„d s
+pl„doyer s
+pl„n s
+pl„rr s
+pl„tscher s
+pl„tt s
+pl„tz s
+plebej s
+plebiszit a 3 5
+plebs s
+pleite s
+plenar s
+plenum s
+pleuel s
+plexi s
+plissee s
+plizier s
+plomb s
+plos s
+pl”tzlich s
+plump s
+plunder s
+plunze s
+plural s
+plus s
+plnder s
+plsch s
+pneu s
+pneumat s
+poch s
+pock s
+podest s
+podex s
+podium s
+poem s
+poet s
+pokal s
+poker s
+pol s
+polar s
+polem s
+polen s
+police s
+poliklin a 4
+polio s
+polit s
+politur s
+poliz s
+polizei s
+polizze s
+polka s
+pollen s
+polster s
+polter s
+poly v
+polygam s
+polygon s
+polymer s
+polynom s
+polyp s
+pomad s
+pommes s
+pomp s
+ponton s
+pony s
+pool s
+pop s
+popul s
+pore s
+porno s
+por”s s
+port s
+portal s
+portefeuille s
+porti s
+porto s
+portrait s
+porzellan s
+pos s
+posaune s
+position s
+positiv s
+poss s
+post s
+postillion s
+postulat s
+potent s
+potenz s
+powidl s
+p”bel s
+p”kel s
+p”nal s
+p”st s
+pracht s
+pragmat s
+prahl s
+prakt s
+praktikabl a 4 8
+prall s
+prang s
+pranke s
+prass s
+prassel s
+praxis s
+pr„cht s
+pr„dikat s
+pr„g s
+pr„gnant a 3
+pr„lat s
+pr„mie s
+pr„par s
+pr„sent s
+pr„senz s
+pr„sident s
+pr„zis s
+predig s
+preis s
+preiserh”hung a5
+prek„r s
+prell s
+press s
+preá s
+prickel s
+pries s
+priester s
+prim s
+prima s
+primitiv s
+prinz s
+prinzessin s
+prinzip s
+priorit„t s
+prise s
+pritsche s
+privat s
+privileg s
+pro vst
+prob s
+probabil s
+problem a 3
+produkt s
+produzent s
+profess s
+professor s
+profil s
+prognos a 3
+programm a 3
+programmende a 3 8
+progress a 3
+progreá a 3
+projekt s
+projektil s
+projizier s
+promen s
+prompt s
+propag s
+propaganda s
+propeller s
+prophet s
+prophezei a 3 6
+proporz s
+prospekt a 3
+prothese s
+protokoll s
+protz s
+proviant s
+provinz s
+provis s
+prozedur s
+prozent s
+prozess s
+prozeá s
+prunk s
+prf s
+prgel s
+pseudo s
+psych s
+psycho s
+publik a2
+publikum a 2 5
+publiz a 2
+pudding s
+pudel s
+puder s
+puff s
+puffer s
+pullover a 4
+puls s
+pult s
+pulver s
+pump s
+punkt s
+pupille s
+pupp s
+pur s
+purpur s
+purzel s
+pute s
+putz s
+puzzle s
+pnkt s
+pree s
+pyjama s
+pyknisch a 2
+pyramide s
+quader s
+quadrat a3
+quadrier a3
+quak s
+qual s
+qualit s
+quant s
+quantit s
+quart s
+quartal s
+quarz s
+quasi s
+quast s
+quatsch s
+qu„l s
+queck s
+quell s
+quelle s
+quer s
+querfeldein a 4 8
+quetsch s
+quick s
+quiek s
+quietsch s
+quirl s
+quitt s
+quiz s
+quot s
+r e
+rabatt s
+rabe s
+rabiat s
+rach s
+racker s
+rad s
+radikal s
+radio s
+radius s
+raff s
+raffin s
+rag s
+rahm s
+raiffeisen a 5
+rain s
+rakete s
+ramm s
+rampe s
+ramsch s
+rand s
+randalier s
+rang s
+rank s
+rann s
+ranz s
+rapid s
+rappe s
+raps s
+rar s
+ras s
+rasch s
+raspel s
+rat s
+raub s
+rauch s
+rauf s
+rauh s
+raum s
+raunz s
+raupe s
+raus vst
+rausch s
+r„ch s
+r„d s
+r„hm s
+r„nd s
+r„t s
+r„uber s
+r„ucher s
+r„ud s
+r„um s
+r„usch s
+r„usper s
+re v
+reag s
+real s
+realisation s
+realisier s
+realistisch s
+reb s
+rebe s
+rebeln s
+rechen s
+recherch s
+rechn s
+recht s
+reck s
+recorder s
+red s
+redakt s
+reduz s
+reell s
+refer s
+reflekt a 2
+reflex a 2
+refrain a 2
+reg s
+regal s
+regatta s
+regier s
+regiment s
+regisseur s
+registrat a2 4
+registrier a 2 4
+reglement a 2
+regress a 2
+regreá a 2
+regul s
+reh s
+rehabilit s
+reib s
+reich s
+reif s
+reigen s
+reih s
+reim s
+rein s
+reis s
+reiá s
+reiáaus a 4
+reit s
+reiz s
+reklam a 2
+rekord s
+rektor s
+relat s
+relativ s
+relevant s
+relig s
+religi”s s
+remis s
+remp s
+renk s
+renn s
+renov s
+rent s
+rentab s
+rentabilit„t s
+rentner s
+reparatur s
+reparier s
+reptil s
+republik a 2 4
+reserv s
+reservier s
+resonanz s
+respekt a 2
+rest s
+restaur s
+resultat s
+resultier s
+retour s
+retrospektiv a 2 5
+rett s
+rettich s
+reu s
+revanch s
+revers s
+reversibel s
+revolt s
+revolut s
+revolver s
+rezept s
+rhabarber s
+rhetor s
+rheuma s
+rheumatisch s
+rhododendron a 5 8
+rhythm s
+rhythmus s
+ribisel s
+rich e
+richt s
+rieb s
+riech s
+rief s
+rieg s
+riem s
+ries s
+riet s
+rill s
+rind s
+ring s
+ringsum a 5
+rinn s
+ripp s
+rips s
+risiko s
+riskant s
+riskier s
+riss s
+rist s
+riá s
+ritt s
+ritz s
+robe s
+roboter s
+robust s
+roch s
+rock s
+rod s
+rode s
+rodel s
+rogen s
+roggen s
+roh s
+rohr s
+roll s
+roman s
+ronn s
+rosa s
+rose s
+rosig s
+rosin s
+rost s
+roá s
+rot s
+rotz s
+route s
+r”ch s
+r”hr s
+r”ll s
+r”m s
+r”ntgen s
+r”s s
+r”t s
+rubrik a 2
+ruch s
+ruck s
+rudel s
+ruder s
+ruf s
+ruh s
+ruin s
+rum s
+rumor s
+rump s
+rumpf s
+rund s
+runz s
+rupf s
+ruá s
+rute s
+rutsch s
+rb s
+rck s
+rd s
+rg s
+rhm s
+rhr s
+rlps s
+rmpf s
+rpel s
+rsch s
+rssel s
+rst s
+rtt s
+s e
+saal s
+saar s
+saat s
+sach s
+sack s
+safari s
+saft s
+sag s
+sah s
+saison s
+saite s
+sakko s
+sakrament a 2
+sakristei a2
+sal e
+salamander s
+salami s
+salat s
+salb s
+saldo s
+salon s
+salto s
+salut s
+salz s
+sam e
+same s
+samm s
+sammen s
+samstag a 4
+samt s
+sanatorien s
+sanatorium s
+sand s
+sandale s
+sandwich s
+sanft s
+sang s
+sanier s
+sanit„r s
+sanit„t s
+sank s
+sann s
+sardelle s
+sardine s
+sarg s
+sasse s
+saá s
+satan s
+satellit s
+satt s
+satz s
+sau s
+sauber s
+sauce s
+sauciere s
+sauer s
+sauf s
+saug s
+saum s
+sauna s
+saus s
+saxophon s
+s„ s
+s„bel s
+s„ch s
+s„en s
+s„g s
+s„le s
+s„mtlich s
+s„nft s
+s„nger s
+s„t s
+s„tt s
+s„tz s
+s„uber s
+s„uer s
+s„uf s
+s„ug s
+s„ule s
+s„um s
+s„ure s
+s„usel s
+schab s
+schablone a 4
+schach s
+schacht s
+schachtel s
+schad s
+schaf s
+schaff s
+schaft s
+schal s
+schale s
+schall s
+schalt s
+scham s
+schand s
+schank s
+schanz s
+schar s
+scharf s
+schatt s
+schattier s
+schatulle s
+schatz s
+schau s
+schauf s
+schauk s
+schaum s
+sch„big s
+sch„d s
+sch„fer s
+sch„ft s
+sch„hl s
+sch„l s
+sch„m s
+sch„nd s
+sch„rf s
+sch„tz s
+sch„um s
+scheck s
+scheffel s
+scheib s
+scheid s
+schein s
+scheit s
+schell s
+schelm s
+schema s
+schematisch s
+schemel s
+schenk s
+schepper s
+scher s
+scherbe s
+scherflein s
+scherz s
+scheu s
+scheuch s
+scheuá s
+schi s
+schicht s
+schick s
+schieb s
+schied s
+schief s
+schiel s
+schien s
+schieá s
+schiff s
+schikan s
+schild s
+schilf s
+schiller s
+schillernd s
+schilling s
+schimm s
+schimpanse s
+schimpf s
+schind s
+schinken s
+schirm s
+schirr s
+schizophren a 4 6
+schlacht s
+schlack s
+schlaf s
+schlaff s
+schlag s
+schlamm s
+schlamp s
+schlang s
+schlank s
+schlau s
+schlauch s
+schl„cht s
+schl„f s
+schl„g s
+schl„ngel s
+schlecht s
+schleck s
+schlegel s
+schleich s
+schleier a 6
+schleif s
+schleifenende a 6 9
+schleim s
+schleiá s
+schlemm s
+schlender s
+schlenker s
+schlepp s
+schleuder s
+schleunig s
+schleus s
+schlich s
+schlief s
+schlieá s
+schliff s
+schlimm s
+schling s
+schlitt s
+schlitz s
+schlosse s
+schloá s
+schlot s
+schlotter s
+schlucht s
+schluchz s
+schluck s
+schlug s
+schlummer s
+schlund s
+schlupf s
+schluss s
+schluá s
+schlck s
+schlpf s
+schlrf s
+schlss s
+schmach s
+schmack s
+schmal s
+schmalz s
+schmarotz s
+schmarren s
+schmatz s
+schmaus s
+schm„chtig s
+schm„h s
+schmeck s
+schmeich s
+schmeiá s
+schmelz s
+schmerz s
+schmetter s
+schmied s
+schmieg s
+schmier s
+schmilzt s
+schmink s
+schmirg s
+schmiss s
+schmiá s
+schmoll s
+schmolz s
+schmor s
+schmuck s
+schmugg s
+schmunzel s
+schmutz s
+schmck s
+schnabel s
+schnabulier s
+schnall s
+schnalz s
+schnapp s
+schnaps s
+schnarch s
+schnarr s
+schnatter s
+schnaub s
+schnauf s
+schnauz s
+schn„uz s
+schnecke s
+schnee s
+schnei s
+schneid s
+schneien a 6
+schnell s
+schneuz s
+schnippisch s
+schnitt s
+schnitz s
+schnob s
+schnorchel s
+schn”rkel s
+schn”rks s
+schnuller s
+schnupf s
+schnuppe s
+schnupper s
+schnur s
+schnurr s
+schnurstracks a 6
+schnff s
+schnr s
+schob s
+schock s
+schokolade s
+scholle s
+schon s
+schopf s
+schoppen s
+schornstein s
+schossen s
+schoá s
+schote s
+schott s
+sch”n s
+sch”pf s
+schӇ s
+schraff s
+schrank s
+schraub s
+schr„g s
+schr„nk s
+schrebergarten s
+schreck s
+schrei s
+schreib s
+schreit s
+schrie s
+schrieb s
+schrift s
+schrill s
+schritt s
+schrocken s
+schroff s
+schrot s
+schr”pf s
+schrumpf s
+schub s
+schuf s
+schuft s
+schuh s
+schuko s
+schul s
+schuld s
+schulter s
+schund s
+schupp s
+schur s
+schurk s
+schurz s
+schussel s
+schuster s
+schuá s
+schutt s
+schutz s
+schchtern s
+schler s
+schr s
+schrf s
+schrz s
+schss s
+schtt s
+schtz s
+schwach s
+schwade s
+schwager s
+schwalbe s
+schwall s
+schwamm s
+schwan s
+schwand s
+schwang s
+schwank s
+schwanz s
+schwarm s
+schwarte s
+schwarz s
+schwatz s
+schw„ch s
+schw„ger s
+schw„nz s
+schw„nzel s
+schw„r s
+schw„rm s
+schw„rz s
+schw„tz s
+schweb s
+schwefel s
+schweif s
+schweig s
+schwein s
+schweiá s
+schweiz s
+schwel s
+schwell s
+schwemm s
+schwend s
+schwengel s
+schwenk s
+schwer s
+schwester s
+schwieg s
+schwiel s
+schwiele s
+schwierig s
+schwimm s
+schwind s
+schwing s
+schwips s
+schwirr s
+schwitz s
+schwoll s
+schwomm s
+schwor s
+schw”r s
+schwulst s
+schwund s
+schwung s
+schwur s
+schwl s
+sechs s
+sechzehn s
+sechzig s
+see s
+seel s
+segel s
+segen s
+segler s
+segn s
+seh s
+sehr s
+sei s
+seicht s
+seid s
+seif s
+seih s
+seil s
+sein s
+seit s
+sekret a 2
+sekt s
+sekund s
+sekunde s
+selbe s
+selbst s
+selbst„ndig s
+selch s
+selekt s
+selig s
+sellerie s
+selt s
+semant s
+semantik s
+semester s
+semi s
+seminar s
+semmel s
+send s
+senf s
+seng s
+senior s
+senk s
+senn s
+sensation s
+sense s
+sensor s
+separat s
+september s
+sequent s
+sequenz s
+serie s
+serien a 2 4
+seri”s s
+serpentine s
+service s
+servier s
+serviette a 3 5
+sess s
+sessel s
+seá s
+set e s
+setz s
+seuch s
+seufz s
+sex s
+shampoo s
+shopping s
+shorts s
+show s
+sich st
+sichel s
+sicher s
+sicht s
+sicker s
+sie st
+sieb s
+sieben s
+siech s
+sied s
+sieg s
+sieh s
+signal a 2
+signifik a 2 5
+silb s
+silbentrenn a 3 6
+silber s
+silbrig s
+silo s
+silvester s
+simpel s
+sims s
+simul s
+sind st
+sinfon s
+sing s
+sink s
+sinn s
+sintflut a 4
+siphon s
+sippe s
+sirene s
+sirup s
+sitt s
+sittich s
+situation s
+sitz s
+skala s
+skandal s
+skelett s
+ski s
+skizz s
+sklave s
+skop s
+skript s
+slalom s
+slip s
+smaragd s
+so vst
+socke s
+sockel s
+sod s
+soda s
+sodann s
+sodaá s
+sofa s
+soff s
+sofort s
+software au 4 7
+sogar st
+sohl s
+sohn s
+sol s
+solch s
+soldat s
+soll s
+sollen s
+solo s
+somit st
+sommer s
+sonate s
+sonder s
+sonn s
+sonntag s
+sonst s
+soph s
+sopran a 2
+sorg s
+sort s
+sortiment s
+soáe s
+sott s
+soundso a 2 5
+souvenir s
+sowie s
+sowjet s
+sozial s
+sozio v
+s”hn s
+spachtel s
+spagat s
+spaghetti a 3
+spalier s
+spalt s
+span s
+spange s
+spann s
+spar s
+spargel s
+spass s
+spassig s
+spaá s
+spat s
+spatz s
+spazier s
+sp„h s
+sp„lt s
+sp„nn s
+sp„rlich s
+sp„t s
+specht s
+speck s
+spedit s
+speer s
+spei s
+speich s
+speicher s
+speien a4
+speis s
+spektak s
+spektr a 4
+spektra a 4
+spektro a 4
+spektrum a 4
+spekul s
+spend s
+spengler s
+spenst s
+sperling s
+sperr s
+spesen s
+spezial s
+spezialis s
+speziell a 3 5
+spezifikation s
+spezifisch s
+spezifizier s
+spick s
+spiegel s
+spiegelei a 4 7
+spiel s
+spieá s
+spike s
+spinat s
+spindel s
+spinn s
+spion s
+spiral s
+spiritus s
+spital s
+spit„ler a 3
+spitz s
+splitt s
+spontan s
+sporn s
+sport s
+spott s
+sp”tt s
+sprach s
+sprang s
+spray s
+spr„ch s
+sprech s
+spreiz s
+spreng s
+sprenkel s
+spreu s
+sprich s
+sprieá s
+spring s
+springer s
+sprint s
+sprit s
+spritz s
+sprochen s
+spross s
+sproá s
+spr”d s
+sprӇ s
+spruch s
+sprud s
+sprudel s
+sprung s
+sprch s
+sprh s
+sprng s
+spuck s
+spuk s
+spul s
+spund s
+spur s
+spl s
+spr s
+staat s
+stab s
+stabil s
+stach s
+stachel s
+stachl s
+stadel s
+stadion s
+stadium s
+stadt s
+stahl s
+stall s
+stalt s
+stamm s
+stampf s
+stand s
+standard s
+stang s
+stank s
+stanniol s
+stanz s
+stap s
+stapf s
+star s
+starb s
+stark s
+starr s
+start s
+stat s
+statik s
+station s
+statisch s
+statistik s
+statistisch s
+statt s
+statu s
+statue s
+status s
+stau s
+staub s
+stauch s
+staud s
+st„b s
+st„dt s
+st„hl s
+st„mm s
+st„nd s
+st„nker s
+st„rk s
+st„tt s
+steak s
+stech s
+steck s
+steg s
+steh s
+steif s
+steig s
+steil s
+stein s
+stell s
+stellung s
+stelz s
+stemm s
+stempel s
+stengel s
+steno vst
+stephan s
+stepp s
+steppe s
+sterb s
+stereo s
+steril s
+stern s
+sterz s
+stet s
+steuer s
+stich s
+stick s
+stief s
+stiefel s
+stieg s
+stiehlt s
+stiel s
+stier s
+stieá s
+stift s
+stil s
+still s
+stimm s
+stink s
+stipend s
+stirb s
+stirn s
+stoch s
+stock s
+stoff s
+stohl s
+stoisch s
+stollen s
+stolper s
+stolz s
+stop s
+stopf s
+stopp s
+storb s
+storch s
+stoá s
+stotter s
+st”ber s
+st”ck s
+st”hn s
+st”psel s
+st”r s
+stӇ s
+straf s
+straff s
+strahl s
+stramm s
+stramp s
+strand s
+strang s
+strapaz s
+straá s
+strateg s
+strauch s
+strauá s
+str„f s
+str„hn s
+str„á s
+str„ub s
+str„uch s
+str„uá s
+streb s
+streck s
+streich s
+streif s
+streik s
+streit s
+streng s
+stress s
+streá s
+streu s
+strich s
+strichlier s
+strick s
+striegel s
+strieme s
+stritt s
+stroh s
+strolch s
+strom s
+stroph s
+strotz s
+str”m s
+strudel s
+struktur s
+strumpf s
+strunk s
+strupp s
+struwwelpeter s
+strmpf s
+strpp s
+stube s
+stud s
+student s
+studio s
+studium s
+stuf s
+stuhl s
+stulpe s
+stumm s
+stumpf s
+stund s
+stunk s
+sturm s
+sturz s
+stute s
+stutz s
+stb s
+stberl s
+stck s
+stlp s
+stmper s
+stmpf s
+stnd s
+strm s
+strz s
+sttz s
+subtrahend a 3
+subtrahier a3
+subtraktion a3
+subvention s
+such s
+sucht s
+sud s
+suggerier s
+suggest s
+sukzess s
+summ s
+sumpf s
+super vst
+suppe s
+surr s
+suspekt a 2
+suspendier a 3
+suspens a 3
+scht s
+sd s
+shn s
+smpf s
+snd s
+sá s
+swimming s
+symbol a 3
+symbolik a 3
+symbolisch a 3
+symbolis a 3
+symmetr a 3 5
+sympath s
+symphon s
+sympos s
+synchron a 3
+syndik s
+syndikus s
+synonym au 3 5
+syntax s
+synthese s
+system a 2
+systematik a 2
+systematisch a 2
+systematisier a 2
+szene s
+t e
+tabak s
+tabell s
+tabernakel s
+tablett a 2
+tacho s
+tadel s
+tafel s
+tag s
+taill s
+takt s
+tal s
+talent s
+taler s
+talg s
+talisman s
+talk s
+tandem s
+tangent s
+tangier s
+tank s
+tann s
+tante s
+tanz s
+tapet s
+tapezier s
+tapfer s
+tapp s
+tara s
+tarif s
+tarn s
+tasche s
+tasse s
+tastatur s
+tast s
+tat s
+tatsache s
+tatze s
+tau s
+taub s
+tauch s
+tauf s
+taug s
+tausch s
+tausend s
+tax s
+taxi s
+t„fel s
+t„g s
+t„nz s
+t„sch s
+t„t s
+t„tsch s
+t„ub s
+t„uf s
+t„usch s
+team au 3
+technik s
+techniker s
+technisch s
+techno s
+teddy s
+tee s
+teich s
+teig s
+teil s
+teint s
+tel e
+tele vs
+telex s
+teller s
+tempel s
+tempera s
+tempo s
+tendenz s
+tenne s
+tennis s
+tenor s
+teppich s
+term s
+termino s
+terpentin s
+terrasse s
+terrazzo s
+terror s
+terti s
+test s
+teuer s
+teuf s
+text s
+textil s
+theater s
+theist a 3
+thema s
+themen s
+theo s
+theoretisch s
+theorie s
+therap s
+thermal s
+thermo s
+thron s
+thunfisch s
+tick s
+tief s
+tiegel s
+tier s
+tiger s
+tilg s
+tinte s
+tip s
+tipp s
+tipptopp s
+tirol s
+tisch s
+titel s
+tob s
+tochter s
+tod s
+toilett s
+toler s
+toll s
+tolpatsch s
+tomate s
+tombola s
+ton s
+topf s
+topfit s
+topo v
+tor s
+torf s
+torkel s
+tos s
+tot s
+total s
+toto s
+tour s
+t”chter s
+t”dlich s
+t”lpel s
+t”n s
+t”pf s
+t”richt s
+t”s s
+t”t s
+trab s
+tracht s
+tradition s
+traf s
+trafo s
+trag s
+trag”d s
+train s
+trainer s
+training s
+trakt s
+tram s
+trampel s
+tramway s
+tran s
+trank s
+transfer s
+transit s
+transparent s
+transparenz s
+transport s
+transzend s
+transzendent s
+trapez s
+trasse s
+trat s
+tratsch s
+trau s
+traube s
+traum s
+travers s
+tr„cht s
+tr„g s
+tr„ller s
+tr„n s
+tr„nk s
+tr„uf s
+tr„um s
+treff s
+treib s
+trend s
+trenn s
+trepp s
+treppab a 5
+treppauf a 5
+tresor s
+tret s
+treu s
+tribne s
+trichter s
+trick s
+trieb s
+triff s
+trift s
+trikot s
+triller s
+trink s
+trio s
+trippel s
+tritt s
+triumph s
+trock s
+troffen s
+trog s
+tromm s
+trompete s
+trop s
+tropf s
+troph„e au 3 6
+trost s
+trott s
+trotz s
+tr”d s
+tr”pf s
+tr”st s
+trubel s
+trudeln s
+trug s
+truhe s
+trunk s
+trupp s
+trut s
+trb s
+trg s
+trmmer s
+tube s
+tuberkulose s
+tuberkul”s s
+tuch s
+tue s
+tuend s
+tugend s
+tulpe s
+tum e
+tummel s
+tumult s
+tun st
+tunell s
+tunk s
+tunnel s
+tupf s
+turbine s
+turm s
+turn s
+tusch s
+tut s
+tch s
+tck s
+tft s
+tm e
+tmmel s
+tmpel s
+tr s
+trk s
+trm s
+tte s
+typ s
+typhus s
+tyrann s
+ufer s
+uhr s
+uhu s
+ul„r e
+ulme s
+ultimativ s
+ultimatum s
+ultimo s
+ultra a 2
+um vst
+ums st
+umso s
+un v
+und s
+ung e
+ungetm s
+uni s
+uniform s
+universit„t s
+uns s
+unten st
+unter vs
+unterdes s
+ur ve
+urbar s
+urne s
+utop s
+b s
+ber vs
+beraus a 4
+berein a 4
+brig s
+ppig s
+vagabund s
+vakuum s
+valid s
+vall s
+vanille s
+vari s
+variable a 2 5
+vater s
+v„ter s
+veilchen s
+vektor s
+vene s
+ventil s
+ver v
+veranda s
+verb s
+verdutzt s
+veredlung a 3
+verein a 3
+verflixt a 3
+vergaá s
+vergess s
+vergiá s
+verletz s
+verleumd s
+verlier s
+verlor s
+vers s
+version s
+verteidig s
+vertikal s
+vertrackt a 3
+vetter s
+viadukt s
+video v
+vieh s
+viel s
+vier s
+villa s
+villen s
+violett s
+violin s
+viper s
+viren s
+virtuell s
+virtuos s
+virulent s
+virus s
+vision s
+visit s
+visualisier s
+vitamin s
+vize s
+vogel s
+vokabel s
+vokabular s
+vokal s
+volk s
+voll s
+volumen s
+vom st
+von vst
+vor vs
+vorab a 3
+voran a3
+voraus a 3
+vorbei s
+vorder s
+vorher s
+v”gel s
+v”lk s
+v”ll s
+vulkan s
+waag s
+wabe s
+wach s
+wacholder s
+wachs s
+wackel s
+wade s
+waffe s
+waffel s
+wag s
+waggon s
+wahl s
+wahn s
+wahr s
+waid s
+wais s
+wal s
+wald s
+walk s
+wall s
+walt s
+walz s
+wand s
+wange s
+wank s
+wann s
+wanz s
+wapp s
+war s
+warb s
+warf s
+warm s
+wart s
+warum a 3
+warze s
+was s
+wasch s
+wasser s
+wate s
+watschel s
+watt s
+w„ch s
+w„g s
+w„hl s
+w„hn s
+w„hr s
+w„hrend s
+w„ld s
+w„lt s
+w„lz s
+w„nd s
+w„re s
+w„rm s
+w„rt s
+w„sch s
+w„sser s
+web s
+wechsel s
+wechselnd s
+wechsl s
+weck s
+wedel s
+weder s
+weg s
+wegen s
+weh s
+wehr s
+wehtun s
+weib s
+weich s
+weid s
+weiger s
+weih s
+weil s
+wein s
+weis s
+weiá s
+weit s
+weiter s
+weithin a 4
+weizen s
+welch s
+welk s
+well s
+welt s
+wem st
+wen st
+wend s
+wenig s
+wenigsten s
+wenn s
+wer st
+werb s
+werd s
+werf s
+werg s
+werk s
+werkstatt s
+wermut s
+werner st
+wert s
+wes s
+wesen s
+wesend s
+wesentlich s
+weshalb s
+wespe s
+west s
+weswegen s
+wett s
+wetz s
+wich s
+wichs s
+wicht s
+wickel s
+wicklung s
+widder s
+wider vs
+widm s
+widrig s
+wie st
+wieder vst
+wiederum a 6
+wieg s
+wieher s
+wien s
+wierig s
+wies s
+wieso s
+wieviel s
+wild s
+wildbret a 4
+will s
+wimmel s
+wimmer s
+wimpel s
+wimper s
+wind s
+wink s
+winsel s
+winter s
+winz s
+wipfel s
+wir st
+wirbel s
+wird st
+wirf s
+wirk s
+wirr s
+wirt s
+wisch s
+wispel s
+wiss s
+wiá s
+witt s
+witter s
+witwe s
+witwer s
+witz s
+wo st
+wobei st
+woben s
+woche s
+wochenende a 2 6
+wodurch st
+wofr st
+wog s
+woher s
+wohin s
+wohl s
+wohlauf a 4
+wohn s
+wolf s
+wolk s
+woll s
+womit s
+wom”glich s
+wonach s
+wonne s
+woran a 3
+worauf a 3
+woraus a 3
+worb s
+worden s
+worfen s
+worin a 3
+wort s
+worber a 3
+wovon st
+wovor s
+wozu st
+w”ch s
+w”chentlich s
+w”hn s
+w”lb s
+w”lk s
+w”rt s
+w”rter s
+wrack s
+wuch s
+wuchs s
+wulst s
+wund s
+wunder s
+wunsch s
+wurde s
+wurf s
+wurm s
+wurst s
+wurzel s
+wusch s
+wuschel s
+wust s
+wuát s
+wut s
+wchs s
+whl s
+wnsch s
+wrd s
+wrf s
+wrg s
+wrm s
+wrst s
+wrz s
+wst s
+wát s
+wt s
+xylophon s
+yankee s
+ypsilon s
+zack s
+zag s
+zahl s
+zahm s
+zahn s
+zange s
+zank s
+zapf s
+zappel s
+zart s
+zauber s
+zaum s
+zaun s
+zaus s
+z„h s
+z„hl s
+z„hm s
+z„hn s
+z„nk s
+z„pf s
+z„rt s
+z„un s
+zebra a 2
+zech s
+zeck s
+zeder s
+zeh s
+zehe s
+zehn s
+zehr s
+zeich s
+zeig s
+zeih s
+zeil s
+zeile s
+zeisig s
+zeit s
+zell s
+zellophan s
+zelt s
+zement s
+zensier s
+zensur s
+zenti v
+zentner s
+zentr a 3
+zentral a3
+zentri a 3
+zentrum a3
+zer v
+zeremonie s
+zerr s
+zettel s
+zeug s
+zicht s
+zick s
+ziege s
+ziegel s
+zieh s
+ziel s
+ziem s
+ziemlich s
+zier s
+zierde s
+ziffer s
+zig e
+zigarette s
+zigarre s
+zigeuner s
+zimmer s
+zimperlich s
+zimt s
+zink s
+zinn s
+zins s
+zipfel s
+zirka s
+zirkel s
+zirkul s
+zirkus s
+zirp s
+zisch s
+zitat s
+zither s
+zitier s
+zitrone a 2
+zitter s
+zittrig s
+zivil s
+zivilisation s
+zivilisier s
+zog s
+zoll s
+zone s
+zoo s
+zopf s
+zorn s
+zott s
+zottel s
+z”g s
+z”ll s
+zu vst
+zuber s
+zucht s
+zuck s
+zucker s
+zug s
+zuge vs
+zugeben s
+zum st
+zunge s
+zupf s
+zur st
+zurzeit s
+zusammengesetzt s
+zcht s
+zck s
+zg s
+znd s
+zngel s
+zrn s
+zwang s
+zwanzig s
+zwar st
+zw„ng s
+zweck s
+zwei s
+zweier a 4
+zweif s
+zweifel s
+zweig s
+zwerchfell s
+zwerg s
+zwetsche s
+zwetschge s
+zwetschke s
+zwick s
+zwie v
+zwiebel s
+zwilling s
+zwing s
+zwinker s
+zwirn s
+zwischen s
+zwischendurch s
+zwist s
+zwitscher s
+zw”lf s
+zwung s
+zykl a 2
+zyklus a 2
+zylind s
+zyn s
+zypresse a2
diff --git a/obsolete/systems/sisisi/unix/Lexikon/neuwort.tex b/obsolete/systems/sisisi/unix/Lexikon/neuwort.tex new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/obsolete/systems/sisisi/unix/Lexikon/neuwort.tex diff --git a/obsolete/systems/sisisi/unix/Lexikon/sisisi.sys b/obsolete/systems/sisisi/unix/Lexikon/sisisi.sys new file mode 100644 index 0000000000..8cb50412ce --- /dev/null +++ b/obsolete/systems/sisisi/unix/Lexikon/sisisi.sys @@ -0,0 +1,27 @@ +c:\sisisi\ +xxx +c:\sisisi\worttab +c:\sisisi\worttab +0 rechter Rand +0 linker Rand +2 Seitenumbruch +0 Einrueckung +2 Zeilenvorschub +TRUE Randausgleich +3 Kopfzone +3 Fuszzone +51 Seitenlaenge +1 Seitennummer +10 Dokument linker Rand +72 Dokument rechter Rand +2 Dokument Zeilenvorschub +4 Druckertyp : NEC P6 +2 Zeilen zwischen Text und Fuánote +. Zeichen fr Trennlinie +10 Linker Rand der Trennlinie +72 Rechter Rand der Trennlinie +75 Max. Anzahl von Fuánoten auf einer Seite +3 Zeilen eines Absatzes mssen auf neue Seite +2 Zeilen eines Absatzes bleiben auf alter Seite +8 max linker Rand der Bilder +70 max rechter Rand der Bilder diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/LIESMICH.EXPERTE b/obsolete/systems/sisisi/unix/SiTeX3.14/LIESMICH.EXPERTE new file mode 100644 index 0000000000..ea97b1f343 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/LIESMICH.EXPERTE @@ -0,0 +1,184 @@ + + + TeX mit SISISI-Silbentrennung + ============================= + + Technische Dokumentation fuer Fortgeschrittene + ============================================== + + +(Hinweis: Dieses File enthaelt nur technische Information. Wenn Sie nur SiTeX +installieren wollen, ohne sich fuer die Probleme und Hintergruende zu +interessieren, brauchen Sie dieses File nicht zu lesen. Wenn allerdings bei +der normalen Installation etwas schiefgehen sollte, kann Ihnen die in diesem +File enthaltene Information vielleicht weiterhelfen.) + +0) Grundsaetzliches. +-------------------- + +Die SISISI Silbentrennung ist ein WEB-Changefile (sitex3.ch), das gewoehnlich +in tex.web hineingetangle'd wird. Fuer die UNIX-Version von TeX wurde +allerdings ein web2c Konverter geschrieben, der das von tangle erzeugte tex.p +in C-Code konvertieren soll. Dieser Konverter kann mit den in sitex3.ch +verwendeten Standard-Pascal Befehlen nicht umgehen, z.B. koennen keine +statisch geschachtelten Prozeduren verarbeitet werden. + +Es war also notwendig, sitex3.ch so zu aendern, dass es von dem web2c +Konverter verarbeitet werden kann. Ausserdem hat der web2c Konverter einige +Eigenheiten (sprich Fehler :-), die es notwendig machen, den entstehenden +C-Code einer Nachbearbeitung (sprich Korrektur) zu unterwerfen. Diese +Aufgaben wurden im Rahmen eines Informatikpraktikums von den Studenten +Hans-Juergen Szoldatics und Florian Zwerina geloest. + +1) Einbinden von SISISI in TeX. +------------------------------- + +Das erste Problem entsteht dadurch, dass tangle nur ein einzelnes Changefile +in ein .web Masterfile einbinden kann. In der C/UNIX Version ist es +allerdings notwendig, zuerst sitex3.ch in tex.web einzubinden, und dann +zusaetzlich noch ctex.ch. Diese Aufgabe kann mit tangle alleine nicht geloest +werden. Es gibt allerdings ein Programm namens TIE, das dazu verwendet werden +kann, mehrere Changefiles in ein Masterfile einzubinden, und das in einer C +Version auf + + ftp.th-darmstadt.de [130.83.55.75] + directory pub/programming/literate-programming/Tools + file tie-<version>.tar.Z + +zur Verfuegung steht. + +(Ich bin Klaus Guntermann fuer diese Information zu grossem Dank verpflichtet). + +Um Ihnen das Leben zu erleichtern, finden Sie tie-2.4.tar.Z gemeinsam mit den +anderen SISISI-Files in diesem Verzeichnis. Um Ihnen das Leben noch leichter +zu machen, finden Sie auch ein sitex.web, das nichts anderes ist als tex.web +(Version 3.14) mit sitex3.ch hineingetie'd. Falls Sie allerdings vorhaben +sollten, eine andere (neuere oder aeltere) Version von TeX zu verwenden, +muessen Sie zuerst tie.c uebersetzen und das ebenfalls in diesem Verzeichnis +vorhandene sitex3.ch in Ihr tex.web hineintie-en, um ein neues sitex.web zu +erhalten. (Wenn Sie das `install' Skript verwenden wollen, muessen Sie nachher +sitex.web compress-en, oder das `install' Skript entsprechend aendern.) + +2) Die Konversion von TeX (mit SISISI) nach C. +---------------------------------------------- + +Sobald Sie Ihr original tex.web durch sitex.web ersetzt haben (wobei Sie +sitex.web in tex.web umbenennen muessen), koennen Sie ein `make' starten, +genau wie bei der normalen Installation von TeX. Allerdings sind noch einige +kleine Vorarbeiten notwendig, die Ihnen das `install' Skript abnimmt, die Sie +aber bei haendischer Installation selbst tun muessen. + +Zunaechst einmal sind die internen Tabellen von tangle und web2c zu klein +fuer SiTeX, und muessen vergroessert werden. Dazu gibt es neue Versionen von +tangle.ch und web2c.c und web2c.h, die in ihre entsprechenden Verzeichnisse +kopiert werden muessen (naemlich nach TEXSRC/web und TEXSRC/web2c). Ausserdem +muessen einige Definitionen in ctex.ch geaendert werden, und deshalb wird +auch dieses File mitgeliefert. Ausserdem gibt es noch neue Versionen der +Makefiles, da 1) zwei neue Format-Files erzeugt werden muessen und 2) nicht +mehr nur tex[0-8].c ensteht, sondern auch tex9.c. + +3) Jetzt beginnt der Aerger. +---------------------------- + +tex.web wird von tangle in tex.p konvertiert (mit ctex.ch als Changefile), +und tex.p dann von einem Skript namens `convert' unter Verwendung von web2c +in mehrere .c und .h Files umgewandelt. Dann versucht sich der C-Compiler an +dem Resultat, und damit beginnen die Schwierigkeiten. Aus irgendwelchen +unerfindlichen Gruenden wird '] ] )' von web2c in ') ] ]' umgewandelt, was +natuerlich den obligaten Syntaxfehler erzeugt. Ausserdem wird ein Array, das +in Pascal als Wertparameter an eine Prozedur uebergeben wird, automatisch zu +einem Var-Parameter, da der Arrayname in C ja eigentlich nur ein Zeiger auf +das erste Element des Arrays ist. In Pascal wird - wie es sich fuer einen +Wertparameter gehoert - eine Kopie des gesamten Arrays erzeugt und diese dann +an die Prozedur uebergeben. In C wird eine Kopie des Zeigers erzeugt und +diese dann uebergeben. Was passiert, wenn dann das Array innerhalb der +Prozedur modifiziert wird, kann man sich denken (in Pascal ist nur die lokale +Kopie betroffen, in C ...). Aus diesem Grund muss explizit ein temporaeres +Array in der Prozedur definiert werden, das den Wert des Parameters speichert +und beim Verlassen der Prozedur wieder herstellt. Natuerlich muss die +Zuweisung, die in Pascal ja auch fuer Arrays funktioniert, in C durch ein +`memcpy' ersetzt werden. + +Ein weiterer Fehler wird durch die schlechte Konvertierung der Ein-/Ausgabe +Anweisungen von Pascal erzeugt. Bei der Umwandlung von write() in fprintf() +geht die Feldbreite verloren (write(x:4) wird zu printf("%d",x) anstelle von +printf("%4d",x)). Ebenso gibt es Probleme bei der Eingabe, wenn +selbstdefinierte Datentypen verwendet werden. Dadurch kommt es zu einem +Fehler beim Abspeichern bzw. Einlesen der Hashtabelle, die im File hf3 +abgespeichert wird. + +Wieder ein anderes Problem entsteht durch die trickreiche Umsetzung von +Prozedurdeklarationen und -aufrufen. Um die Unterscheidung von Wert- und +Variablenparametern so transparent wie moeglich zu machen, werden alle +Funktionen (im C-Code) umbenannt und stattdessen Makros definiert, die den +Adressoperator auf alle Var-Parameter anwenden und damit die (jetzt +umbenannte) Funktion aufrufen. Vorteil: Am Funktionsaufruf aendert sich gar +nichts, nur wird statt der Funktion jetzt eben der Makro `aufgerufen', der +dann fuer die richtige Uebergabe der Parameter sorgt. Leider tut web2c zuviel +des Guten und erzeugt in den Makros auch noch Typecasts, damit die Parameter +auch nur ja den richtigen Typ haben. Und GNU C vertraegt es leider nicht, +wenn Casts auf Array-Typen vorgenommen werden, was in SiTeX nun halt einmal +vorkommt. Deshalb muessen alle Casts, die Array-Typen spezifizieren, aus +coerce.h entfernt werden (dort sind alle Makros und Funktionsprototypen +definert). + +Um Ihnen diese Korrekturen abzunehmen, stehen die Files tex6.c, coerce.h und +texd.h in bereits korrigierter Form zur Verfuegung, und muessen nach +TEXSRC/tex kopiert werden, sobald `make' zum ersten Mal mit der Fehlermeldung +`cast specifies array type' abbricht (wenn vorher ein anderer Fehler +auftritt, ist etwas schiefgegangen !). Wenn Sie das `install' Skript +verwenden, geschieht dies automatisch. Dann wird einfach wieder das `make' neu +gestartet. Das Problem dabei ist, dass web2c eigentlich nur ein einziges +grosses C-File erzeugt, das dann nachtraeglich in die einzelnen Files +aufgespaltet wird, und dass keine Garantie dafuer besteht, dass das tex6.c, +das Sie erhalten, genauso aussieht wie jenes, das bei mir enstanden ist und +in dem ich die Fehler korrigiert habe. Sollten sich (was aber eher +unwahrscheinlich ist) im weiteren Verlauf des `make' wieder Fehler ergeben, +und zwar dass Symbole nicht bzw. doppelt deklariert wurden, ist genau dieser +Fall eingetreten. Verstaendigen Sie mich dann bitte umgehend. Ansonsten +sollten Sie aber jetzt ohne weitere Probleme initex und virtex in Ihrem +TEXSRC/tex Verzeichnis erhalten. + +4) Die Installation des fertigen SiTeX. +--------------------------------------- + +Nachdem also nun initex und virtex erfolgreich erstellt wurden, muessen Sie +noch die Format-Files erzeugen und alles in den entsprechenden Verzeichnissen +installieren. Die Format-Files werden vom `install' Skript automatisch +erzeugt, aber wenn Sie es haendisch tun wollen/muessen, sehen Sie am besten +im Makefile in Ihrem SISISIDIR nach, wie man Format-Files erzeugt. Wenn Sie +das `install' Skript verwendet haben, finden Sie neben sitex.fmt und +silatex.fmt in TEXSRC/tex auch noch ein File namens sitex.pool und ein File +namens hf3. Wenn Sie allerdings `install' nicht verwendet haben, heisst +sitex.pool noch tex.pool und muss erst umbenannt werden. Das hf3 File wird +automatisch generiert, sobald Sie das erste Format-File erzeugen. + +Sie sollten nun zuerst hf3 in ein Verzeichnis in Ihrem TEXINPUTS Pfad kopieren, +und sitex.pool in das TEXPOOLDIR. Dann kommen sitex.fmt und silatex.fmt in +das TEXFORMATS Verzeichnis, und in dem selben Verzeichnis erzeugen Sie auch +einen Link namens siplain.fmt auf sitex.fmt. + +Jetzt muessen Sie sich entscheiden, ob Sie Ihr altes TeX/LaTeX behalten +wollen oder nicht. Falls Sie auch weiterhin fremdsprachige Texte bearbeiten +wollen, sollten Sie das neue initex und virtex unter neuem Namen (z.B. +siinitex und sivirtex) in ein Verzeichnis in Ihrem Standard-Suchpfad +kopieren, und Links namens sitex und silatex auf sivirtex erzeugen, in dem +selben Verzeichnis. + +Falls Sie das alte TeX nicht mehr wollen, kopieren Sie einfach das neue +virtex ueber das alte, und ebenso das neue initex ueber das alte initex, und +stellen Sie die sitex und silatex Links her. Die alten Links, tex, latex, +slitex etc. koennen Sie entfernen. + +5) Bugs, Probleme etc. +---------------------- + +Der Installationsprozess wurde auf einem 486 PC mit Interactive Unix SVR3.2 +und auf einer HP 9000/705 mit HP-UX 8.07 getestet. Auf beiden Maschinen sind +die Resultate, die silatex liefert, identisch. Allerdings hatte ich bis jetzt +keine Gelegenheit, silatex auf anderen Systemen, speziell BSD und AIX, zu +testen. Deshalb muss silatex noch immer als Beta Version betrachtet werden, +und alle Fehlermeldungen, Kommentare, (Verbesserungs-)Vorschlaege und +Berichte ueber erfolgreiche Inbetriebnahme sind willkommen. + +Schicken Sie bitte EMail an heinz@eiunix.tuwien.ac.at . diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/MANIFEST b/obsolete/systems/sisisi/unix/SiTeX3.14/MANIFEST new file mode 100644 index 0000000000..765509e138 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/MANIFEST @@ -0,0 +1,20 @@ +Dieses Verzeichnis enthaelt: +============================ + +LIESMICH Installationsanleitung auf Deutsch +LIESMICH.EXPERTE Technische Beschreibung von SiTeX +MANIFEST Dieses File +Makefile Ersetzt Makefile in TEXSRC/tex +README Installationsanleitung auf Englisch +README.EXPERT Technische Beschreibung von SiTeX (Engl.) +coerce.h Korrigierte Version, kommt nach TEXSRC/tex +ctex.ch ditto +install Installationsskript +makefile Ersetzt makefile in TEXSRC +sitex.web.Z TeX mit SISISI hineingetie'd +sitex3.ch Changefile mit dem SISISI-Algorithmus +tangle.ch Kommt nach TEXSRC/web +tex6.c Korrigierte Version, kommt nach TEXSRC/tex +texd.h Korrigierte Version, kommt nach TEXSRC/tex +web2c.c Kommt nach TEXSRC/web2c +web2c.h ditto diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/Makefile b/obsolete/systems/sisisi/unix/SiTeX3.14/Makefile new file mode 100644 index 0000000000..92d1e062cc --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/Makefile @@ -0,0 +1,200 @@ +# This file makes TeX in its various incarnations. +# +# The file ../common/texmf.h uses the symbol `TeX' to define certain +# things that are different for TeX and Metafont, hence the addition to +# CFLAGS. + +SITEDIR=.. +CC=gcc +OPT=-O +CFLAGS=$(OPT) -I$(SITEDIR) -DTeX +LDFLAGS= +LOADLIBES= +SHELL=/bin/sh +LN=ln + +# The formats we know how to make. +# +formats=amstex.fmt etex.fmt latex.fmt slitex.fmt tex.fmt \ +texinfo.fmt picplus.fmt + + +makeargs=SITEDIR="$(SITEDIR)" CC="$(CC)" OPT="$(OPT)" \ + LDFLAGS="$(LDFLAGS)" LOADLIBES="$(LOADLIBES)" + +.SUFFIXES: +.SUFFIXES: .o .c +.c.o: + $(CC) $(CFLAGS) -c $*.c + +# Routines used everywhere. +# +commondefines=../common/common.defines ../common/texmf.defines +commonh=../common/extra.h ../common/common.h +commono=../common/alloca.o ../common/extra.o + +# Routines used in both TeX and Metafont. +# +extrac=../common/texmf.c +extrah=../common/texmf.h ../common/endian.h +extrao=texmf.o + +# Routines used in TeX, Metafont, and BibTeX. +# +fileioc=../common/fileio.c +fileioh=../common/fileio.h +fileioo=fileio.o + +# We don't add `$(commono)' here, since it doesn't depend on anything in +# this directory, and we write a dependency for `$(objs)' below. +# +objs=$(fileioo) tex0.o tex1.o tex2.o tex3.o tex4.o tex5.o tex6.o tex7.o tex8.o tex9.o +iobjs=iextra.o initex.o $(objs) +vobjs=tex-extra.o itex.o $(objs) + + +default: all + +all: initex virtex +triptrap: triptex + +initex: stamp-convert $(iobjs) $(commono) + $(CC) -o initex $(LDFLAGS) $(iobjs) $(commono) $(LOADLIBES) + +virtex: stamp-convert $(vobjs) $(commono) + $(CC) -o virtex $(LDFLAGS) $(vobjs) $(commono) $(LOADLIBES) + +run-trip: + rm -f trip.tex + -$(LN) TeXtrip/trip.tex . + ../texware/pltotf TeXtrip/trip.pl trip.tfm + -$(SHELL) -c '. ./tripenv; \ + ./triptex < TeXtrip/trip1.in > /dev/null 2>&1' + -diff TeXtrip/tripin.log trip.log + -$(SHELL) -c '. ./tripenv; \ + ./triptex < TeXtrip/trip2.in > trip.fot' + -diff TeXtrip/trip.log trip.log + -diff TeXtrip/trip.fot trip.fot + $(SHELL) -c '. ./tripenv; \ + ../texware/dvitype trip.dvi < TeXtrip/dvitype.in > trip.typ' + -diff TeXtrip/trip.typ trip.typ + + +# Make format files automatically. +# +fmts: $(formats) + +amstex.fmt: tex.fmt + ./initex \&./tex amstex \\dump + +etex.fmt: tex.fmt + touch eplain.aux # Makes cross-reference warnings work right. + ./initex \&./tex eplain \\dump + mv eplain.fmt etex.fmt + mv eplain.log etex.log + +# Until LaTeX and SLiTeX are updated, we must use a hacked version, that +# sets the new parameters to reasonable values. +# +latex.fmt: + ./initex lplain \\dump + mv lplain.fmt latex.fmt + mv lplain.log latex.log + +picplus.fmt: tex.fmt + ./initex \&./tex picplus \\dump + +slitex.fmt: + ./initex splain \\dump + mv splain.fmt slitex.fmt + mv splain.log slitex.log + +tex.fmt: + ./initex plain \\dump + mv plain.fmt tex.fmt + mv plain.log tex.log + +sitex.fmt: + ./initex siplain \\dump + mv siplain.fmt sitex.fmt + mv siplain.log sitex.log + +silatex.fmt: + ./initex silplain \\dump + mv silplain.fmt silatex.fmt + mv silplain.log silatex.log + +# texinfo changes the escape character from `\' to `@'. +# +texinfo.fmt: tex.fmt + ./initex \&./tex texinfo @dump + + +# The `ini_to_trip' script changes texd.h, instead of the change file, so +# retangling is not necessary. After changing constants, making a +# triptex means making an initex. +# +triptex: stamp-trip $(iobjs) $(commono) + make $(makeargs) initex + mv initex triptex + +stamp-trip: stamp-convert + rm -f *.o + $(SHELL) ./ini_to_trip texd.h + touch stamp-trip + +# tangle produces tex.p and tex.pool. +# +tex.p: tex.web ctex.ch + ../web/tangle tex.web ctex.ch + +# The convert script produces tex[0-8].c, itex.c, coerce.h, and texd.h. +# The (hand-coded) memory.h is included in one of tex?.c files; it isn't +# really necessary to `convert' again if it changes, only to recompile +# those files, but describing that relationship is ugly to do. +# (Furthermore, memory.h is stable.) +# +stamp-convert: tex.p memory.h fixcoerce.h $(commondefines) + $(SHELL) ./convert + touch stamp-convert + +# The (hand-coded) file $(extrac) and the (generated) file itex.c have +# #ifdefs for INITEX, so we compile them differently. +# +iextra.o: $(extrac) texd.h $(extrah) $(commonh) + $(CC) $(CFLAGS) -I. -DINITEX -DINI -c $(extrac) + mv $(extrao) iextra.o + +initex.o: itex.c texd.h $(extrah) $(commonh) + $(CC) $(CFLAGS) -DINITEX -c itex.c && mv itex.o initex.o + +$(objs): stamp-convert texd.h +tex-extra.o: $(extrac) texd.h + rm -f tex-extra.c + $(LN) $(extrac) tex-extra.c + $(CC) $(CFLAGS) -I. -c tex-extra.c + +$(fileioo): $(fileioc) $(fileioh) + $(CC) $(CFLAGS) -I. -c $(fileioc) + +tex0.o: tex0.c +tex1.o: tex1.c +tex2.o: tex2.c +tex3.o: tex3.c +tex4.o: tex4.c +tex5.o: tex5.c +tex6.o: tex6.c +tex7.o: tex7.c +tex8.o: tex8.c +tex9.o: tex9.c + + +clean: + rm -f stamp-* *.o triptex initex virtex + rm -f texd.h coerce.h *.log *.fmt *.aux + rm -f 8terminal.tex trip.* tripos.tex dvitype.out + rm -f tex-extra.c + +veryclean: clean + rm -f tex?.c itex.c tex.p tex.pool texput.* + rm -f \#*\# *~ *.bak *.ckp core diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/README.EXPERT b/obsolete/systems/sisisi/unix/SiTeX3.14/README.EXPERT new file mode 100644 index 0000000000..0cd8f15ec3 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/README.EXPERT @@ -0,0 +1,155 @@ + + + TeX with SISISI-Hyphenation + =========================== + + Technical Guide for Expert Users + ================================ + + +(Note: This file contains technical information only. You don't have to read +it, unless you are *really* interested in the problems of porting SISISI to +UNIX, or unless somthing went wrong with the normal installation process.) + +0) Motivation. +-------------- + +The SISISI-Hyphenation comes as a WEB-changefile (sitex3.ch), which is +usually tangle'd into tex.web. The problem with the C version of TeX is that +the folks who wrote the web2c converter considered only a WEB-specific subset +of PASCAL, but sitex3.ch makes full use of standard PASCAL constructs. For +example, the web2c converter can't handle statically nested procedures, which +SISISI uses quite extensively. + +Therefore, for the C version of TeX, it was necessary to modify sitex3.ch to +allow conversion with web2c, and, since web2c shows some strange and +inexplicable behaviour (read: bugs :-), it is also necessary to modify the C +files that are generated by the converter. This was performed by students of +computer science Hans-J"urgen Szoldatics and Florian Zwerina. + +1) Incorporating SISISI into TeX. +--------------------------------- + +The first problem is that tangle takes a .web and a single .ch file, and +generates a .p file. But in the C version, we have two changefiles, sitex3.ch +and ctex.ch, and we first have to tangle tex.web with sitex3.ch, and the +resulting file with ctex.ch, which is not possible. Fortunately, there's a +program called TIE, which can be used to incorporate many changefiles into a +.web master file, and which is available in a C version from + + ftp.th-darmstadt.de [130.83.55.75] + directory pub/programming/literate-programming/Tools + file tie-<version>.tar.Z + +(Thanks to Klaus Guntermann for providing this information). + +For convenience, tie-2.4.tar.Z is included in this distribution. Also for +convenience, this distribution contains a file called sitex.web, which is +the original tex.web (version 3.14) with sitex3.ch tie'd into it. In case you +want to install a newer (or maybe an older) version of TeX, you will have to +compile tie.c and tie sitex3.ch into your tex.web, thus creating your own +sitex.web. + + +2) Converting tex.web (with SISISI) into a C program. +----------------------------------------------------- + +As soon as tex.web has been replaced with sitex.web, you can start `make', +just as with the normal installation of TeX. There are some differences, +however: SiTeX uses up all the namespace in tangle and in web2c, and you have +to increase the symbol tables in these programs. That's the reason why +tangle.ch and web2c.? are provided and copied to their appropriate places +by `install'. Some definitions in ctex.ch have to be changed, and so this +file is also provided. Finally, the makefiles have to be changed to take into +account the 9th C-file generated by the conversion process and the SISISI +format files. + +3) Now the problems start. +-------------------------- + +As soon as tex.web has been tangle'd into tex.p and tex.p been converted into +several .c and .h files, the bugs in web2c strike. For some strange reason, +the sequence '] ] )' is twisted into ') ] ]', with the obvious result of a C +syntax error. Also, the pass-by-value mechanism of PASCAL turns into +pass-by-reference as soon as arrays are used as actual parameters. This +comes from the fact that an array variable in C is the same as a pointer to +the first array element. Therefore, instead of a copy of the entire array +(which is what happens in PASCAL), only the pointer to the first element +is passed to the function. Guess what happens when the array is modified +inside the function... As a consequence, a temporary array has to be +introduced into the function which stores a copy of the original parameter +and restores it at the end of the function. Needless to say, the PASCAL +assignment for arrays has to be converted manually into a C `memcpy' library +call. + +Another bug is web2c's handling of input/output. PASCAL's write() is not +properly translated into C's fprintf(), when a field width is specified. That +is, write(x:4) is translated into printf("%d",x), but really should be +printf("%4d",x). Similar problems arise with the conversion of read() into +fscanf(), when non-standard data types are used. This causes SISISI's hash +table to be written to file hf3 in wrong format, and to be read back into +memory in a wrong way. + +Other problems arise from the nifty mechanism web2c employs for the handling +of PASCAL's VAR-parameters. The PASCAL functions and procedures are renamed +and introduced C macros with the names of the original functions and +procedures, which apply the C address operator (&) to the arguments that +are pass-by-ref, and subsequently call the now renamed function. Unfortunately, +web2c does too much of the good and also generates type casts for the +function parameters to ensure proper data types, which causes GNU C to +complain about `cast specifies array type', when casts to array types are +attempted. It is therefore necessary to remove these casts from coerce.h, +where macros and function prototypes are defined. + +For convenience, the files tex6.c, coerce.h and texd.h (with all bugs removed) +are provided and can be copied into TEXSRC/tex as soon as the `make' stops +for the first time (usually with the aforementioned complaint about casts to +array types), replacing the buggy files. The `install' script does this for +you. The danger here is that your tex6.c is not necessarily the same as my +tex6.c (i.e. the tex6.c I got out of my converter and applied the necessary +bug fixes to). If this should be the case, the compilation will again +terminate with an error, either that some symbols are declared twice or that +some symbols are missing. If this should happen, please contact me +immediately. If no such errors occur, compilation should terminate normally +and you should get initex and virtex. + +4) Installing SiTeX on your system. +----------------------------------- + +After initex and virtex have been successfully generated, it's now time to +install the program and format files on your system. To get sitex.fmt and +silatex.fmt, look into SISISIDIR/Makefile how these files are generated. The +`install' script performs this step automatically, so if you used `install' to +create SiTeX, you will already have the SISISI format files. You will find +all these files in your TEXDIR, along with a file named sitex.pool and a file +named hf3. + +First, you should copy hf3 to your TEXINPUTS directory (more precisely: +into a directory contained in the TEXINPUTS path), and sitex.pool to the +TEXPOOL dir. Then copy sitex.fmt and silatex.fmt into TEXFORMATS, and +create a link to sitex.fmt named siplain.fmt in the same directory. + +Now you have to decide whether you want to retain TeX with the original +hyphenation algorithm (virtex, tex and latex). If not, simply remove the old +virtex and initex and all the links to it (such as tex, latex, slitex, glatex +etc.) and copy the new initex and virtex into a directory holding your +executables. Then create links to the now new virtex with names sitex and +silatex. + +If you want to keep the original TeX, you have to copy initex and virtex into +your standard search path under different names, preferably siinitex and +sivirtex, and create the sitex and silatex links. Note however, that you can't +use silatex for non-German documents, as the hyphenation algorithm is designed +for the German language only. So if you want to work with German and English +documents, you have to retain the original TeX. + +5) Troubleshooting. +------------------- + +I have tested the installation process on a 486 PC running Interactive SVR3.2, +and on an HP 9000/705 running HP-UX 8.07. silatex gives the same results on +both machines. I had no opportunity, however, to make and test silatex on other +systems, especially not BSD systems and AIX. SiTeX has therefore to be regarded +as being still in its beta version, and any bug reports, comments, critics or +praise (no, seriously ! If you have successfully installed SiTeX please let +me know too !) are welcome. Send EMail to heinz@eiunix.tuwien.ac.at . diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/coerce.h b/obsolete/systems/sisisi/unix/SiTeX3.14/coerce.h new file mode 100644 index 0000000000..f7672fe2ab --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/coerce.h @@ -0,0 +1,890 @@ +void initialize(); +#define initialize_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void println(); +#define println_regmem +void zprintchar(); +#define printchar(s) zprintchar((ASCIIcode) (s)) +#define printchar_regmem register memoryword *eqtb=zeqtb; +void zprint(); +#define print(s) zprint((integer) (s)) +#define print_regmem register memoryword *eqtb=zeqtb; +void zslowprint(); +#define slowprint(s) zslowprint((integer) (s)) +#define slowprint_regmem register memoryword *eqtb=zeqtb; +void zprintnl(); +#define printnl(s) zprintnl((strnumber) (s)) +#define printnl_regmem +void zprintesc(); +#define printesc(s) zprintesc((strnumber) (s)) +#define printesc_regmem register memoryword *eqtb=zeqtb; +void zprintthedigs(); +#define printthedigs(k) zprintthedigs((eightbits) (k)) +#define printthedigs_regmem +void zprintint(); +#define printint(n) zprintint((integer) (n)) +#define printint_regmem +void zprintcs(); +#define printcs(p) zprintcs((integer) (p)) +#define printcs_regmem register memoryword *eqtb=zeqtb; +void zsprintcs(); +#define sprintcs(p) zsprintcs((halfword) (p)) +#define sprintcs_regmem +void zprintfilename(); +#define printfilename(n, a, e) zprintfilename((integer) (n), (integer) (a), (integer) (e)) +#define printfilename_regmem +void zprintsize(); +#define printsize(s) zprintsize((integer) (s)) +#define printsize_regmem +void zprintwritewhatsit(); +#define printwritewhatsit(s, p) zprintwritewhatsit((strnumber) (s), (halfword) (p)) +#define printwritewhatsit_regmem register memoryword *mem=zmem; +void jumpout(); +#define jumpout_regmem +void error(); +#define error_regmem +void zfatalerror(); +#define fatalerror(s) zfatalerror((strnumber) (s)) +#define fatalerror_regmem +void zoverflow(); +#define overflow(s, n) zoverflow((strnumber) (s), (integer) (n)) +#define overflow_regmem +void zconfusion(); +#define confusion(s) zconfusion((strnumber) (s)) +#define confusion_regmem +boolean initterminal(); +#define initterminal_regmem +strnumber makestring(); +#define makestring_regmem +boolean zstreqbuf(); +#define streqbuf(s, k) zstreqbuf((strnumber) (s), (integer) (k)) +#define streqbuf_regmem +boolean zstreqstr(); +#define streqstr(s, t) zstreqstr((strnumber) (s), (strnumber) (t)) +#define streqstr_regmem +boolean getstringsstarted(); +#define getstringsstarted_regmem +void zprinttwo(); +#define printtwo(n) zprinttwo((integer) (n)) +#define printtwo_regmem +void zprinthex(); +#define printhex(n) zprinthex((integer) (n)) +#define printhex_regmem +void zprintromanint(); +#define printromanint(n) zprintromanint((integer) (n)) +#define printromanint_regmem +void printcurrentstring(); +#define printcurrentstring_regmem +void terminput(); +#define terminput_regmem +void zinterror(); +#define interror(n) zinterror((integer) (n)) +#define interror_regmem +void normalizeselector(); +#define normalizeselector_regmem +void pauseforinstructions(); +#define pauseforinstructions_regmem +integer zhalf(); +#define half(x) zhalf((integer) (x)) +#define half_regmem +scaled zrounddecimals(); +#define rounddecimals(k) zrounddecimals((smallnumber) (k)) +#define rounddecimals_regmem +void zprintscaled(); +#define printscaled(s) zprintscaled((scaled) (s)) +#define printscaled_regmem +scaled zmultandadd(); +#define multandadd(n, x, y, maxanswer) zmultandadd((integer) (n), (scaled) (x), (scaled) (y), (scaled) (maxanswer)) +#define multandadd_regmem +scaled zxovern(); +#define xovern(x, n) zxovern((scaled) (x), (integer) (n)) +#define xovern_regmem +scaled zxnoverd(); +#define xnoverd(x, n, d) zxnoverd((scaled) (x), (integer) (n), (integer) (d)) +#define xnoverd_regmem +halfword zbadness(); +#define badness(t, s) zbadness((scaled) (t), (scaled) (s)) +#define badness_regmem +void zprintword(); +#define printword(w) zprintword((memoryword) (w)) +#define printword_regmem +void zshowtokenlist(); +#define showtokenlist(p, q, l) zshowtokenlist((integer) (p), (integer) (q), (integer) (l)) +#define showtokenlist_regmem register memoryword *mem=zmem; +void runaway(); +#define runaway_regmem register memoryword *mem=zmem; +halfword getavail(); +#define getavail_regmem register memoryword *mem=zmem; +void zflushlist(); +#define flushlist(p) zflushlist((halfword) (p)) +#define flushlist_regmem register memoryword *mem=zmem; +halfword zgetnode(); +#define getnode(s) zgetnode((integer) (s)) +#define getnode_regmem register memoryword *mem=zmem; +void zfreenode(); +#define freenode(p, s) zfreenode((halfword) (p), (halfword) (s)) +#define freenode_regmem register memoryword *mem=zmem; +void sortavail(); +#define sortavail_regmem register memoryword *mem=zmem; +halfword newnullbox(); +#define newnullbox_regmem register memoryword *mem=zmem; +halfword newrule(); +#define newrule_regmem register memoryword *mem=zmem; +halfword znewligature(); +#define newligature(f, c, q) znewligature((quarterword) (f), (quarterword) (c), (halfword) (q)) +#define newligature_regmem register memoryword *mem=zmem; +halfword znewligitem(); +#define newligitem(c) znewligitem((quarterword) (c)) +#define newligitem_regmem register memoryword *mem=zmem; +halfword newdisc(); +#define newdisc_regmem register memoryword *mem=zmem; +halfword znewmath(); +#define newmath(w, s) znewmath((scaled) (w), (smallnumber) (s)) +#define newmath_regmem register memoryword *mem=zmem; +halfword znewspec(); +#define newspec(p) znewspec((halfword) (p)) +#define newspec_regmem register memoryword *mem=zmem; +halfword znewparamglue(); +#define newparamglue(n) znewparamglue((smallnumber) (n)) +#define newparamglue_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword znewglue(); +#define newglue(q) znewglue((halfword) (q)) +#define newglue_regmem register memoryword *mem=zmem; +halfword znewskipparam(); +#define newskipparam(n) znewskipparam((smallnumber) (n)) +#define newskipparam_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword znewkern(); +#define newkern(w) znewkern((scaled) (w)) +#define newkern_regmem register memoryword *mem=zmem; +halfword znewpenalty(); +#define newpenalty(m) znewpenalty((integer) (m)) +#define newpenalty_regmem register memoryword *mem=zmem; +void zcheckmem(); +#define checkmem(printlocs) zcheckmem((boolean) (printlocs)) +#define checkmem_regmem register memoryword *mem=zmem; +void zsearchmem(); +#define searchmem(p) zsearchmem((halfword) (p)) +#define searchmem_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zshortdisplay(); +#define shortdisplay(p) zshortdisplay((integer) (p)) +#define shortdisplay_regmem register memoryword *mem=zmem; +void zprintfontandchar(); +#define printfontandchar(p) zprintfontandchar((integer) (p)) +#define printfontandchar_regmem register memoryword *mem=zmem; +void zprintmark(); +#define printmark(p) zprintmark((integer) (p)) +#define printmark_regmem register memoryword *mem=zmem; +void zprintruledimen(); +#define printruledimen(d) zprintruledimen((scaled) (d)) +#define printruledimen_regmem +void zprintglue(); +#define printglue(d, order, s) zprintglue((scaled) (d), (integer) (order), (strnumber) (s)) +#define printglue_regmem +void zprintspec(); +#define printspec(p, s) zprintspec((integer) (p), (strnumber) (s)) +#define printspec_regmem register memoryword *mem=zmem; +void zprintfamandchar(); +#define printfamandchar(p) zprintfamandchar((halfword) (p)) +#define printfamandchar_regmem register memoryword *mem=zmem; +void zprintdelimiter(); +#define printdelimiter(p) zprintdelimiter((halfword) (p)) +#define printdelimiter_regmem register memoryword *mem=zmem; +void zprintsubsidiarydata(); +#define printsubsidiarydata(p, c) zprintsubsidiarydata((halfword) (p), (ASCIIcode) (c)) +#define printsubsidiarydata_regmem register memoryword *mem=zmem; +void zprintstyle(); +#define printstyle(c) zprintstyle((integer) (c)) +#define printstyle_regmem +void zprintskipparam(); +#define printskipparam(n) zprintskipparam((integer) (n)) +#define printskipparam_regmem +void zshownodelist(); +#define shownodelist(p) zshownodelist((integer) (p)) +#define shownodelist_regmem register memoryword *mem=zmem; +void zshowbox(); +#define showbox(p) zshowbox((halfword) (p)) +#define showbox_regmem register memoryword *eqtb=zeqtb; +void zdeletetokenref(); +#define deletetokenref(p) zdeletetokenref((halfword) (p)) +#define deletetokenref_regmem register memoryword *mem=zmem; +void zdeleteglueref(); +#define deleteglueref(p) zdeleteglueref((halfword) (p)) +#define deleteglueref_regmem register memoryword *mem=zmem; +void zflushnodelist(); +#define flushnodelist(p) zflushnodelist((halfword) (p)) +#define flushnodelist_regmem register memoryword *mem=zmem; +halfword zcopynodelist(); +#define copynodelist(p) zcopynodelist((halfword) (p)) +#define copynodelist_regmem register memoryword *mem=zmem; +void zprintmode(); +#define printmode(m) zprintmode((integer) (m)) +#define printmode_regmem +void pushnest(); +#define pushnest_regmem +void popnest(); +#define popnest_regmem register memoryword *mem=zmem; +void showactivities(); +#define showactivities_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zprintparam(); +#define printparam(n) zprintparam((integer) (n)) +#define printparam_regmem +void begindiagnostic(); +#define begindiagnostic_regmem register memoryword *eqtb=zeqtb; +void zenddiagnostic(); +#define enddiagnostic(blankline) zenddiagnostic((boolean) (blankline)) +#define enddiagnostic_regmem +void zprintlengthparam(); +#define printlengthparam(n) zprintlengthparam((integer) (n)) +#define printlengthparam_regmem +void zprintcmdchr(); +#define printcmdchr(cmd, chrcode) zprintcmdchr((quarterword) (cmd), (halfword) (chrcode)) +#define printcmdchr_regmem +void zshoweqtb(); +#define showeqtb(n) zshoweqtb((halfword) (n)) +#define showeqtb_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword zidlookup(); +#define idlookup(j, l) zidlookup((integer) (j), (integer) (l)) +#define idlookup_regmem +void zprimitive(); +#define primitive(s, c, o) zprimitive((strnumber) (s), (quarterword) (c), (halfword) (o)) +#define primitive_regmem register memoryword *eqtb=zeqtb; +void znewsavelevel(); +#define newsavelevel(c) znewsavelevel((groupcode) (c)) +#define newsavelevel_regmem +void zeqdestroy(); +#define eqdestroy(w) zeqdestroy((memoryword) (w)) +#define eqdestroy_regmem register memoryword *mem=zmem; +void zeqsave(); +#define eqsave(p, l) zeqsave((halfword) (p), (quarterword) (l)) +#define eqsave_regmem register memoryword *eqtb=zeqtb; +void zeqdefine(); +#define eqdefine(p, t, e) zeqdefine((halfword) (p), (quarterword) (t), (halfword) (e)) +#define eqdefine_regmem register memoryword *eqtb=zeqtb; +void zeqworddefine(); +#define eqworddefine(p, w) zeqworddefine((halfword) (p), (integer) (w)) +#define eqworddefine_regmem register memoryword *eqtb=zeqtb; +void zgeqdefine(); +#define geqdefine(p, t, e) zgeqdefine((halfword) (p), (quarterword) (t), (halfword) (e)) +#define geqdefine_regmem register memoryword *eqtb=zeqtb; +void zgeqworddefine(); +#define geqworddefine(p, w) zgeqworddefine((halfword) (p), (integer) (w)) +#define geqworddefine_regmem register memoryword *eqtb=zeqtb; +void zsaveforafter(); +#define saveforafter(t) zsaveforafter((halfword) (t)) +#define saveforafter_regmem +void zrestoretrace(); +#define restoretrace(p, s) zrestoretrace((halfword) (p), (strnumber) (s)) +#define restoretrace_regmem +void unsave(); +#define unsave_regmem register memoryword *eqtb=zeqtb; +void preparemag(); +#define preparemag_regmem register memoryword *eqtb=zeqtb; +void ztokenshow(); +#define tokenshow(p) ztokenshow((halfword) (p)) +#define tokenshow_regmem register memoryword *mem=zmem; +void printmeaning(); +#define printmeaning_regmem +void showcurcmdchr(); +#define showcurcmdchr_regmem +void showcontext(); +#define showcontext_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zbegintokenlist(); +#define begintokenlist(p, t) zbegintokenlist((halfword) (p), (quarterword) (t)) +#define begintokenlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void endtokenlist(); +#define endtokenlist_regmem +void backinput(); +#define backinput_regmem register memoryword *mem=zmem; +void backerror(); +#define backerror_regmem +void inserror(); +#define inserror_regmem +void beginfilereading(); +#define beginfilereading_regmem +void endfilereading(); +#define endfilereading_regmem +void clearforerrorprompt(); +#define clearforerrorprompt_regmem +void checkoutervalidity(); +#define checkoutervalidity_regmem register memoryword *mem=zmem; +void getnext(); +#define getnext_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void firmuptheline(); +#define firmuptheline_regmem register memoryword *eqtb=zeqtb; +void gettoken(); +#define gettoken_regmem +void macrocall(); +#define macrocall_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void insertrelax(); +#define insertrelax_regmem +void expand(); +#define expand_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void getxtoken(); +#define getxtoken_regmem +void xtoken(); +#define xtoken_regmem +void scanleftbrace(); +#define scanleftbrace_regmem +void scanoptionalequals(); +#define scanoptionalequals_regmem +boolean zscankeyword(); +#define scankeyword(s) zscankeyword((strnumber) (s)) +#define scankeyword_regmem register memoryword *mem=zmem; +void muerror(); +#define muerror_regmem +void scaneightbitint(); +#define scaneightbitint_regmem +void scancharnum(); +#define scancharnum_regmem +void scanfourbitint(); +#define scanfourbitint_regmem +void scanfifteenbitint(); +#define scanfifteenbitint_regmem +void scantwentysevenbitint(); +#define scantwentysevenbitint_regmem +void scanfontident(); +#define scanfontident_regmem register memoryword *eqtb=zeqtb; +void zfindfontdimen(); +#define findfontdimen(writing) zfindfontdimen((boolean) (writing)) +#define findfontdimen_regmem +void zscansomethinginternal(); +#define scansomethinginternal(level, negative) zscansomethinginternal((smallnumber) (level), (boolean) (negative)) +#define scansomethinginternal_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void scanint(); +#define scanint_regmem +void zscandimen(); +#define scandimen(mu, inf, shortcut) zscandimen((boolean) (mu), (boolean) (inf), (boolean) (shortcut)) +#define scandimen_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zscanglue(); +#define scanglue(level) zscanglue((smallnumber) (level)) +#define scanglue_regmem register memoryword *mem=zmem; +halfword scanrulespec(); +#define scanrulespec_regmem register memoryword *mem=zmem; +halfword zstrtoks(); +#define strtoks(b) zstrtoks((poolpointer) (b)) +#define strtoks_regmem register memoryword *mem=zmem; +halfword thetoks(); +#define thetoks_regmem register memoryword *mem=zmem; +void insthetoks(); +#define insthetoks_regmem register memoryword *mem=zmem; +void convtoks(); +#define convtoks_regmem register memoryword *mem=zmem; +halfword zscantoks(); +#define scantoks(macrodef, xpand) zscantoks((boolean) (macrodef), (boolean) (xpand)) +#define scantoks_regmem register memoryword *mem=zmem; +void zreadtoks(); +#define readtoks(n, r) zreadtoks((integer) (n), (halfword) (r)) +#define readtoks_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void passtext(); +#define passtext_regmem +void zchangeiflimit(); +#define changeiflimit(l, p) zchangeiflimit((smallnumber) (l), (halfword) (p)) +#define changeiflimit_regmem register memoryword *mem=zmem; +void conditional(); +#define conditional_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void beginname(); +#define beginname_regmem +boolean zmorename(); +#define morename(c) zmorename((ASCIIcode) (c)) +#define morename_regmem +void endname(); +#define endname_regmem +void zpackfilename(); +#define packfilename(n, a, e) zpackfilename((strnumber) (n), (strnumber) (a), (strnumber) (e)) +#define packfilename_regmem +void zpackbufferedname(); +#define packbufferedname(n, a, b) zpackbufferedname((smallnumber) (n), (integer) (a), (integer) (b)) +#define packbufferedname_regmem +strnumber makenamestring(); +#define makenamestring_regmem +strnumber zamakenamestring(); +#define amakenamestring(f) zamakenamestring((alphafile *) &(f)) +#define amakenamestring_regmem +strnumber zbmakenamestring(); +#define bmakenamestring(f) zbmakenamestring((bytefile *) &(f)) +#define bmakenamestring_regmem +strnumber zwmakenamestring(); +#define wmakenamestring(f) zwmakenamestring((wordfile *) &(f)) +#define wmakenamestring_regmem +void scanfilename(); +#define scanfilename_regmem +void zpackjobname(); +#define packjobname(s) zpackjobname((strnumber) (s)) +#define packjobname_regmem +void zpromptfilename(); +#define promptfilename(s, e) zpromptfilename((strnumber) (s), (strnumber) (e)) +#define promptfilename_regmem +void openlogfile(); +#define openlogfile_regmem register memoryword *eqtb=zeqtb; +void startinput(); +#define startinput_regmem register memoryword *eqtb=zeqtb; +internalfontnumber zreadfontinfo(); +#define readfontinfo(u, nom, aire, s) zreadfontinfo((halfword) (u), (strnumber) (nom), (strnumber) (aire), (scaled) (s)) +#define readfontinfo_regmem register memoryword *eqtb=zeqtb; +void zcharwarning(); +#define charwarning(f, c) zcharwarning((internalfontnumber) (f), (eightbits) (c)) +#define charwarning_regmem register memoryword *eqtb=zeqtb; +halfword znewcharacter(); +#define newcharacter(f, c) znewcharacter((internalfontnumber) (f), (eightbits) (c)) +#define newcharacter_regmem register memoryword *mem=zmem; +void dviswap(); +#define dviswap_regmem +void zdvifour(); +#define dvifour(x) zdvifour((integer) (x)) +#define dvifour_regmem +void zdvipop(); +#define dvipop(l) zdvipop((integer) (l)) +#define dvipop_regmem +void zdvifontdef(); +#define dvifontdef(f) zdvifontdef((internalfontnumber) (f)) +#define dvifontdef_regmem +void zmovement(); +#define movement(w, o) zmovement((scaled) (w), (eightbits) (o)) +#define movement_regmem register memoryword *mem=zmem; +void zprunemovements(); +#define prunemovements(l) zprunemovements((integer) (l)) +#define prunemovements_regmem register memoryword *mem=zmem; +void zspecialout(); +#define specialout(p) zspecialout((halfword) (p)) +#define specialout_regmem register memoryword *mem=zmem; +void zwriteout(); +#define writeout(p) zwriteout((halfword) (p)) +#define writeout_regmem register memoryword *mem=zmem; +void zoutwhat(); +#define outwhat(p) zoutwhat((halfword) (p)) +#define outwhat_regmem register memoryword *mem=zmem; +void hlistout(); +#define hlistout_regmem register memoryword *mem=zmem; +void vlistout(); +#define vlistout_regmem register memoryword *mem=zmem; +void zshipout(); +#define shipout(p) zshipout((halfword) (p)) +#define shipout_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zscanspec(); +#define scanspec(c, threecodes) zscanspec((groupcode) (c), (boolean) (threecodes)) +#define scanspec_regmem +halfword zhpack(); +#define hpack(p, w, m) zhpack((halfword) (p), (scaled) (w), (smallnumber) (m)) +#define hpack_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword zvpackage(); +#define vpackage(p, h, m, l) zvpackage((halfword) (p), (scaled) (h), (smallnumber) (m), (scaled) (l)) +#define vpackage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zappendtovlist(); +#define appendtovlist(b) zappendtovlist((halfword) (b)) +#define appendtovlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword newnoad(); +#define newnoad_regmem register memoryword *mem=zmem; +halfword znewstyle(); +#define newstyle(s) znewstyle((smallnumber) (s)) +#define newstyle_regmem register memoryword *mem=zmem; +halfword newchoice(); +#define newchoice_regmem register memoryword *mem=zmem; +void showinfo(); +#define showinfo_regmem register memoryword *mem=zmem; +halfword zfractionrule(); +#define fractionrule(t) zfractionrule((scaled) (t)) +#define fractionrule_regmem register memoryword *mem=zmem; +halfword zoverbar(); +#define overbar(b, k, t) zoverbar((halfword) (b), (scaled) (k), (scaled) (t)) +#define overbar_regmem register memoryword *mem=zmem; +halfword zcharbox(); +#define charbox(f, c) zcharbox((internalfontnumber) (f), (quarterword) (c)) +#define charbox_regmem register memoryword *mem=zmem; +void zstackintobox(); +#define stackintobox(b, f, c) zstackintobox((halfword) (b), (internalfontnumber) (f), (quarterword) (c)) +#define stackintobox_regmem register memoryword *mem=zmem; +scaled zheightplusdepth(); +#define heightplusdepth(f, c) zheightplusdepth((internalfontnumber) (f), (quarterword) (c)) +#define heightplusdepth_regmem +halfword zvardelimiter(); +#define vardelimiter(d, s, v) zvardelimiter((halfword) (d), (smallnumber) (s), (scaled) (v)) +#define vardelimiter_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword zrebox(); +#define rebox(b, w) zrebox((halfword) (b), (scaled) (w)) +#define rebox_regmem register memoryword *mem=zmem; +halfword zmathglue(); +#define mathglue(g, m) zmathglue((halfword) (g), (scaled) (m)) +#define mathglue_regmem register memoryword *mem=zmem; +void zmathkern(); +#define mathkern(p, m) zmathkern((halfword) (p), (scaled) (m)) +#define mathkern_regmem register memoryword *mem=zmem; +void flushmath(); +#define flushmath_regmem register memoryword *mem=zmem; +halfword zcleanbox(); +#define cleanbox(p, s) zcleanbox((halfword) (p), (smallnumber) (s)) +#define cleanbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zfetch(); +#define fetch(a) zfetch((halfword) (a)) +#define fetch_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakeover(); +#define makeover(q) zmakeover((halfword) (q)) +#define makeover_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakeunder(); +#define makeunder(q) zmakeunder((halfword) (q)) +#define makeunder_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakevcenter(); +#define makevcenter(q) zmakevcenter((halfword) (q)) +#define makevcenter_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakeradical(); +#define makeradical(q) zmakeradical((halfword) (q)) +#define makeradical_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakemathaccent(); +#define makemathaccent(q) zmakemathaccent((halfword) (q)) +#define makemathaccent_regmem register memoryword *mem=zmem; +void zmakefraction(); +#define makefraction(q) zmakefraction((halfword) (q)) +#define makefraction_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +scaled zmakeop(); +#define makeop(q) zmakeop((halfword) (q)) +#define makeop_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakeord(); +#define makeord(q) zmakeord((halfword) (q)) +#define makeord_regmem register memoryword *mem=zmem; +void zmakescripts(); +#define makescripts(q, delta) zmakescripts((halfword) (q), (scaled) (delta)) +#define makescripts_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +smallnumber zmakeleftright(); +#define makeleftright(q, style, maxd, maxh) zmakeleftright((halfword) (q), (smallnumber) (style), (scaled) (maxd), (scaled) (maxh)) +#define makeleftright_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void mlisttohlist(); +#define mlisttohlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void pushalignment(); +#define pushalignment_regmem register memoryword *mem=zmem; +void popalignment(); +#define popalignment_regmem register memoryword *mem=zmem; +void getpreambletoken(); +#define getpreambletoken_regmem register memoryword *eqtb=zeqtb; +void initalign(); +#define initalign_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zinitspan(); +#define initspan(p) zinitspan((halfword) (p)) +#define initspan_regmem +void initrow(); +#define initrow_regmem register memoryword *mem=zmem; +void initcol(); +#define initcol_regmem register memoryword *mem=zmem; +boolean fincol(); +#define fincol_regmem register memoryword *mem=zmem; +void finrow(); +#define finrow_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void finalign(); +#define finalign_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void alignpeek(); +#define alignpeek_regmem +halfword zfiniteshrink(); +#define finiteshrink(p) zfiniteshrink((halfword) (p)) +#define finiteshrink_regmem register memoryword *mem=zmem; +void ztrybreak(); +#define trybreak(pi, breaktype) ztrybreak((integer) (pi), (smallnumber) (breaktype)) +#define trybreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zpostlinebreak(); +#define postlinebreak(finalwidowpenalty) zpostlinebreak((integer) (finalwidowpenalty)) +#define postlinebreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +smallnumber zreconstitute(); +#define reconstitute(j, n, bchar, hchar) zreconstitute((smallnumber) (j), (smallnumber) (n), (halfword) (bchar), (halfword) (hchar)) +#define reconstitute_regmem register memoryword *mem=zmem; +void zhashfunk(); +#define hashfunk(w, anfang, ende, v, ind, k) zhashfunk( (w), (integer) (anfang), (integer) (ende), (v), (ind), (k)) +#define hashfunk_regmem +void zunpackinfo(); +#define unpackinfo(b, iausnahme, iuntrennbar, ierste, izweite, iendung, ivorsilbe, istamm, iehervor, istammallein) zunpackinfo((infobyte) (b), (boolean *) &(iausnahme), (boolean *) &(iuntrennbar), (integer *) &(ierste), (integer *) &(izweite), (boolean *) &(iendung), (boolean *) &(ivorsilbe), (boolean *) &(istamm), (boolean *) &(iehervor), (boolean *) &(istammallein)) +#define unpackinfo_regmem +void zunpackentry(); +#define unpackentry(h, etabv, etabb, efrei, ewiederfrei) zunpackentry( (h), (verdschlue *) &(etabv), (infobyte *) &(etabb), (boolean *) &(efrei), (boolean *) &(ewiederfrei)) +#define unpackentry_regmem +void zhashsuch(); +#define hashsuch(v, ind, k, iausnahme, iuntrennbar, ierste, izweite, iendung, ivorsilbe, istamm, iehervor, istammallein, g) zhashsuch((verdschlue) (v), (integer) (ind), (integer) (k), (boolean *) &(iausnahme), (boolean *) &(iuntrennbar), (integer *) &(ierste), (integer *) &(izweite), (boolean *) &(iendung), (boolean *) &(ivorsilbe), (boolean *) &(istamm), (boolean *) &(iehervor), (boolean *) &(istammallein), (boolean *) &(g)) +#define hashsuch_regmem +void zhashload(); +#define hashload(status) zhashload((integer *) &(status)) +#define hashload_regmem +void inittrennen(); +#define inittrennen_regmem +void zpackinfo(); +#define packinfo(i, b) zpackinfo((i), (infobyte *) &(b)) +#define packinfo_regmem +void zpackentry(); +#define packentry(e, h) zpackentry((e), (h)) +#define packentry_regmem +void zhashetr(); +#define hashetr(w, laenge, i, g) zhashetr( (w), (integer) (laenge), (i), (boolean *) &(g)) +#define hashetr_regmem +void hashempty(); +#define hashempty_regmem +void zhashsave(); +#define hashsave(status) zhashsave((integer *) &(status)) +#define hashsave_regmem +integer hashsize(); +#define hashsize_regmem +void zzahl(); +#define zahl(line, i, ende, j) zzahl( (line), (integer *) &(i), (integer) (ende), (integer *) &(j)) +#define zahl_regmem +void zinfobau(); +#define infobau(line, anfang, ende, informausnahme, informuntrennbar, informerste, informzweite, informendung, informvorsilbe, informstamm, informehervor, informstammallein, g) zinfobau( (line), (integer) (anfang), (integer) (ende), (boolean *) &(informausnahme), (boolean *) &(informuntrennbar), (integer *) &(informerste), (integer *) &(informzweite), (boolean *) &(informendung), (boolean *) &(informvorsilbe), (boolean *) &(informstamm), (boolean *) &(informehervor), (boolean *) &(informstammallein), (boolean *) &(g)) +#define infobau_regmem +void zeintragen(); +#define eintragen(line, l) zeintragen( (line), (integer) (l)) +#define eintragen_regmem +void znaechsterbst(); +#define naechsterbst(i, tr, dudstop, b, w) znaechsterbst((integer *) &(i), (tr), (dudstop), (buchstabe *) &(b), (w)) +#define naechsterbst_regmem +void zduden(); +#define duden(tr, w, tr1, dudtr, dud, dudstop, laenge, ok, zerlegungen) zduden( (tr), (w), (tr1), (dudtr), (dud), (dudstop), (integer) (laenge), (boolean *) &(ok), (integer *) &(zerlegungen)) +#define duden_regmem +void ztrennen(); +#define trennen(zustand, anfang, spv, ok1, tr, dudtr, zerlegungen, dud, v, ind, k, dudstop, w, tr1, laenge) ztrennen((integer) (zustand), (integer) (anfang), (spv), (boolean *) &(ok1), (tr), (dudtr), (integer *) &(zerlegungen), (dud), (v), (ind), (k), (dudstop), (w), (tr1), (integer) (laenge)) +#define trennen_regmem +void zabteilen(); +#define abteilen(w, tr1, laenge, ok, zerlegungen) zabteilen( (w), (tr1), (integer) (laenge), (boolean *) &(ok), (integer *) &(zerlegungen)) +#define abteilen_regmem +boolean zisdirtyumlaut(); +#define isdirtyumlaut(p) zisdirtyumlaut((halfword) (p)) +#define isdirtyumlaut_regmem register memoryword *mem=zmem; +integer zgetcharof(); +#define getcharof(s) zgetcharof((halfword) (s)) +#define getcharof_regmem register memoryword *mem=zmem; +integer zgetfontof(); +#define getfontof(s) zgetfontof((halfword) (s)) +#define getfontof_regmem register memoryword *mem=zmem; +void hyphenate(); +#define hyphenate_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +trieopcode znewtrieop(); +#define newtrieop(d, n, v) znewtrieop((smallnumber) (d), (smallnumber) (n), (trieopcode) (v)) +#define newtrieop_regmem +triepointer ztrienode(); +#define trienode(p) ztrienode((triepointer) (p)) +#define trienode_regmem +triepointer zcompresstrie(); +#define compresstrie(p) zcompresstrie((triepointer) (p)) +#define compresstrie_regmem +void zfirstfit(); +#define firstfit(p) zfirstfit((triepointer) (p)) +#define firstfit_regmem +void ztriepack(); +#define triepack(p) ztriepack((triepointer) (p)) +#define triepack_regmem +void ztriefix(); +#define triefix(p) ztriefix((triepointer) (p)) +#define triefix_regmem +void newpatterns(); +#define newpatterns_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void inittrie(); +#define inittrie_regmem +void zlinebreak(); +#define linebreak(finalwidowpenalty) zlinebreak((integer) (finalwidowpenalty)) +#define linebreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void newhyphexceptions(); +#define newhyphexceptions_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword zprunepagetop(); +#define prunepagetop(p) zprunepagetop((halfword) (p)) +#define prunepagetop_regmem register memoryword *mem=zmem; +halfword zvertbreak(); +#define vertbreak(p, h, d) zvertbreak((halfword) (p), (scaled) (h), (scaled) (d)) +#define vertbreak_regmem register memoryword *mem=zmem; +halfword zvsplit(); +#define vsplit(n, h) zvsplit((eightbits) (n), (scaled) (h)) +#define vsplit_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void printtotals(); +#define printtotals_regmem +void zfreezepagespecs(); +#define freezepagespecs(s) zfreezepagespecs((smallnumber) (s)) +#define freezepagespecs_regmem register memoryword *eqtb=zeqtb; +void zboxerror(); +#define boxerror(n) zboxerror((eightbits) (n)) +#define boxerror_regmem register memoryword *eqtb=zeqtb; +void zensurevbox(); +#define ensurevbox(n) zensurevbox((eightbits) (n)) +#define ensurevbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zfireup(); +#define fireup(c) zfireup((halfword) (c)) +#define fireup_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void buildpage(); +#define buildpage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void appspace(); +#define appspace_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void insertdollarsign(); +#define insertdollarsign_regmem +void youcant(); +#define youcant_regmem +void reportillegalcase(); +#define reportillegalcase_regmem +boolean privileged(); +#define privileged_regmem +boolean itsallover(); +#define itsallover_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void appendglue(); +#define appendglue_regmem register memoryword *mem=zmem; +void appendkern(); +#define appendkern_regmem register memoryword *mem=zmem; +void offsave(); +#define offsave_regmem register memoryword *mem=zmem; +void extrarightbrace(); +#define extrarightbrace_regmem +void normalparagraph(); +#define normalparagraph_regmem register memoryword *eqtb=zeqtb; +void zboxend(); +#define boxend(boxcontext) zboxend((integer) (boxcontext)) +#define boxend_regmem register memoryword *mem=zmem; +void zbeginbox(); +#define beginbox(boxcontext) zbeginbox((integer) (boxcontext)) +#define beginbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zscanbox(); +#define scanbox(boxcontext) zscanbox((integer) (boxcontext)) +#define scanbox_regmem +void zpackage(); +#define package(c) zpackage((smallnumber) (c)) +#define package_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +smallnumber znormmin(); +#define normmin(h) znormmin((integer) (h)) +#define normmin_regmem +void znewgraf(); +#define newgraf(indented) znewgraf((boolean) (indented)) +#define newgraf_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void indentinhmode(); +#define indentinhmode_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void headforvmode(); +#define headforvmode_regmem +void endgraf(); +#define endgraf_regmem register memoryword *eqtb=zeqtb; +void begininsertoradjust(); +#define begininsertoradjust_regmem +void makemark(); +#define makemark_regmem register memoryword *mem=zmem; +void appendpenalty(); +#define appendpenalty_regmem register memoryword *mem=zmem; +void deletelast(); +#define deletelast_regmem register memoryword *mem=zmem; +void unpackage(); +#define unpackage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void appenditaliccorrection(); +#define appenditaliccorrection_regmem register memoryword *mem=zmem; +void appenddiscretionary(); +#define appenddiscretionary_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void builddiscretionary(); +#define builddiscretionary_regmem register memoryword *mem=zmem; +void makeaccent(); +#define makeaccent_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void alignerror(); +#define alignerror_regmem +void noalignerror(); +#define noalignerror_regmem +void omiterror(); +#define omiterror_regmem +void doendv(); +#define doendv_regmem +void cserror(); +#define cserror_regmem +void zpushmath(); +#define pushmath(c) zpushmath((groupcode) (c)) +#define pushmath_regmem +void initmath(); +#define initmath_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void starteqno(); +#define starteqno_regmem register memoryword *eqtb=zeqtb; +void zscanmath(); +#define scanmath(p) zscanmath((halfword) (p)) +#define scanmath_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zsetmathchar(); +#define setmathchar(c) zsetmathchar((integer) (c)) +#define setmathchar_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void mathlimitswitch(); +#define mathlimitswitch_regmem register memoryword *mem=zmem; +void zscandelimiter(); +#define scandelimiter(p, r) zscandelimiter((halfword) (p), (boolean) (r)) +#define scandelimiter_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void mathradical(); +#define mathradical_regmem register memoryword *mem=zmem; +void mathac(); +#define mathac_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void appendchoices(); +#define appendchoices_regmem register memoryword *mem=zmem; +halfword zfinmlist(); +#define finmlist(p) zfinmlist((halfword) (p)) +#define finmlist_regmem register memoryword *mem=zmem; +void buildchoices(); +#define buildchoices_regmem register memoryword *mem=zmem; +void subsup(); +#define subsup_regmem register memoryword *mem=zmem; +void mathfraction(); +#define mathfraction_regmem register memoryword *mem=zmem; +void mathleftright(); +#define mathleftright_regmem register memoryword *mem=zmem; +void aftermath(); +#define aftermath_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void resumeafterdisplay(); +#define resumeafterdisplay_regmem +void getrtoken(); +#define getrtoken_regmem +void trapzeroglue(); +#define trapzeroglue_regmem register memoryword *mem=zmem; +void zdoregistercommand(); +#define doregistercommand(a) zdoregistercommand((smallnumber) (a)) +#define doregistercommand_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void alteraux(); +#define alteraux_regmem +void alterprevgraf(); +#define alterprevgraf_regmem +void alterpagesofar(); +#define alterpagesofar_regmem +void alterinteger(); +#define alterinteger_regmem +void alterboxdimen(); +#define alterboxdimen_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void znewfont(); +#define newfont(a) znewfont((smallnumber) (a)) +#define newfont_regmem register memoryword *eqtb=zeqtb; +void newinteraction(); +#define newinteraction_regmem +void prefixedcommand(); +#define prefixedcommand_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void doassignments(); +#define doassignments_regmem +void openorclosein(); +#define openorclosein_regmem +void issuemessage(); +#define issuemessage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void shiftcase(); +#define shiftcase_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void showwhatever(); +#define showwhatever_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void storefmtfile(); +#define storefmtfile_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void znewwhatsit(); +#define newwhatsit(s, w) znewwhatsit((smallnumber) (s), (smallnumber) (w)) +#define newwhatsit_regmem register memoryword *mem=zmem; +void znewwritewhatsit(); +#define newwritewhatsit(w) znewwritewhatsit((smallnumber) (w)) +#define newwritewhatsit_regmem register memoryword *mem=zmem; +void doextension(); +#define doextension_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void fixlanguage(); +#define fixlanguage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void handlerightbrace(); +#define handlerightbrace_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void maincontrol(); +#define maincontrol_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void giveerrhelp(); +#define giveerrhelp_regmem register memoryword *eqtb=zeqtb; +boolean openfmtfile(); +#define openfmtfile_regmem +boolean loadfmtfile(); +#define loadfmtfile_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void closefilesandterminate(); +#define closefilesandterminate_regmem register memoryword *eqtb=zeqtb; +void finalcleanup(); +#define finalcleanup_regmem register memoryword *mem=zmem; +void initprim(); +#define initprim_regmem register memoryword *eqtb=zeqtb; +void debughelp(); +#define debughelp_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void texbody(); +#define texbody_regmem register memoryword *eqtb=zeqtb; +/* + * The C compiler ignores most unnecessary casts (i.e., casts of something + * to its own type). However, for structures, it doesn't. Therefore, + * we have to redefine these two macros so that they don't try to cast + * the argument (a memoryword) as a memoryword. + */ +#undef eqdestroy +#define eqdestroy(x) zeqdestroy(x) +#undef printword +#define printword(x) zprintword(x) diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/ctex.ch b/obsolete/systems/sisisi/unix/SiTeX3.14/ctex.ch new file mode 100644 index 0000000000..0219aedbf2 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/ctex.ch @@ -0,0 +1,1877 @@ +% Change file for TeX in C, derived from various other change files. +% By Tim Morgan, UC Irvine ICS Department, and many others. +% +% +% Modification history: +% (05/28/86) ETM Started with TeX 2.0 +% (06/03/87) ETM Brought up to TeX 2.2 +% (09/26/87) ETM Brought up to TeX 2.3 +% (10/01/87) ETM Brought up to TeX 2.5 +% (12/21/87) ETM Brought up to TeX 2.7 +% (01/14/88) ETM Brought up to TeX 2.9 +% (02/20/88) PAM Revised format and module numbers +% (03/01/88) ETM Eliminated some unused variables and unnecesary tests +% (05/09/88) ETM Added yet another casting bug fix +% (06/21/88) ETM Brought up to TeX version 2.93 +% (12/11/88) ETM Brought up to TeX version 2.94 +% (01/12/89) PAM Brought up to TeX version 2.95 +% (02/14/89) ETM Brought up to TeX version 2.96 +% (03/10/89) ETM Brought up to TeX version 2.98 +% (07/06/89) ETM Brought up to TeX version 2.991 +% (11/30/89) KB To version 2.992 (8-bit). +% (01/10/90) SR To version 2.993. +% (03/27/90) KY To version 3.0. +% (more recent changes in ../ChangeLog.W2C) +% +% The module numbers in this change file refer to the published text in +% TeX: The Program, Volume B of Computers&Typesetting, 1986. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [0] WEAVE: print changes only. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + \def\?##1]{\hbox to 1in{\hfil##1.\ }} + } +@y + \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }} + } +\let\maybe=\iffalse +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.2] banner (changed to show trie extension version) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d banner=='This is TeX, Version 3.14 (+SISISI 1.0)' +@y +@d banner=='This is TeX, C Version 3.14t3 (+SISISI 1.0)' {printed when \TeX\ starts} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.4] program header +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Actually the heading shown here is not quite normal: The |program| line +does not mention any |output| file, because \ph\ would ask the \TeX\ user +to specify a file name if |output| were specified here. +@^system dependencies@> + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +program TEX; {all file names are defined dynamically} +label @<Labels in the outer block@>@/ +@y + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +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; + {key control points} +@y +@<Labels in the outer block@>= +start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end; + {key control points} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.7] debug..gubed, stat..tats +% Here we change these WEB symbols, which are used much as #ifdef's +% are 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] Same, for `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] Turn off all 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: some enlarged, dvi_buf_size 16K for +% BSD I/O, file_name_size becomes FILENAMESIZE. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Constants...@>= +@!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:SITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@y +@d file_name_size == FILENAMESIZE {Get value from \.{site.h}.} +@<Constants...@>= +@!mem_max=262140; {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=3000; {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=60; {maximum number of simultaneous macro parameters} +@!nest_size=40; {maximum number of semantic levels simultaneously active} +@!max_strings=7500; {maximum number of strings; must not exceed |max_halfword|} +@!string_vacancies=74000; {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=100000; {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=24000; {space for hyphenation patterns; should be larger for + \.{INITEX} than it is in production versions of \TeX} +@!trie_op_size=750; {space for ``opcodes'' in the hyphenation patterns} +@!neg_trie_op_size=-750; {for lower trie_op_hash array bound} +@!min_trie_op=0; {first possible trie op code for any language} +@!max_trie_op=500; {largest possible trie op code for any language} +@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8} +@!pool_name='sitex.pool'; + {string of length |file_name_size|; tells where the string pool appears} +@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX}; + must be substantially larger than |mem_bot| + and not greater than |mem_max|} +@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 it is a ``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), since to needs +% to be changed for the trip test. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=9500 {maximum number of control sequences; it should be at most + about |(mem_max-mem_min)/10|} +@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|} +@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.16] Use C macros for `incr' and `decr'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d incr(#) == #:=#+1 {increase a variable by unity} +@d decr(#) == #:=#-1 {decrease a variable by unity} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] The text_char type is used as an array index into xord. The +% default type `char' produces signed integers, which are bad array +% indices in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d text_char == char {the data type of characters in text files} +@y +@d text_char == ASCII_code {the data type of characters in text files} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [2.23] Allow any character as input. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +for i:=0 to @'37 do xchr[i]:=' '; +for i:=@'177 to @'377 do xchr[i]:=' '; +@y +for i:=0 to @'37 do xchr[i]:=chr(i); +for i:=@'177 to @'377 do xchr[i]:=chr(i); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.25] Remove file types we don't need. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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.27] Do file opening in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 are defined in C. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.28] Do file closing in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 the file closing routines as well. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.31] Do `input_ln' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 define |input_ln| in C, for efficiency. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.32] `term_in' and `term_out' are standard input and output. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!term_in:alpha_file; {the terminal as an input file} +@!term_out:alpha_file; {the terminal as an output file} +@y +@d term_in==stdin {the terminal as an input file} +@d term_out==stdout {the terminal as an output file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.33] We 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 defined in C. + +@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} +@y +these operations can be specified with {\mc UNIX}. |update_terminal| +does an |fflush| (via the macro |flush|). |clear_terminal| is redefined +to do nothing, since the user should control the terminal. +@^system dependencies@> + +@d update_terminal == flush (term_out) +@d clear_terminal == do_nothing +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.37] Reading 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} +label exit; +begin t_open_in; +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); + if loc<last then + begin init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out,'Please type the name of your input file.'); + end; +exit:end; +@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@> + +@p +function init_terminal:boolean; {gets the terminal input started} +label exit; +begin + t_open_in; + 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; write(term_out, '**'); update_terminal; +@.**@> + if not input_ln(term_in,true) then begin {this shouldn't happen} + 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); + + if loc<last then begin + init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out, 'Please type the name of your input file.'); + end; +exit: +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51] Open the pool file using a path, and can't do string +% assignments directly. (`strcpy' and `strlen' work here because +% `pool_name' is a constant string, and thus ends in a null and doesn't +% start with a space.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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); {copy the string} +name_of_file[0] := ' '; +name_of_file[strlen (pool_name)+1] := ' '; +if a_open_in (pool_file, TEX_POOL_PATH) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how +% it's read. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else bad_pool('! I can''t read SITEX3.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 sitex.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('! sitex.pool has no check sum.'); +@.TEX.POOL has no check sum@> +read(pool_file,m); read(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('! sitex.pool line doesn''t begin with two digits.'); +@z +@x + bad_pool('! TEX.POOL check sum doesn''t have nine digits.'); +@y + bad_pool('! sitex.pool check sum doesn''t have nine digits.'); +@z +@x +done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.'); +@y +done: if a<>@$ then bad_pool('! sitex.pool doesn''t match; tangle me again.'); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [5.61] Eliminate the misleading message ``(no format preloaded)''. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if format_ident=0 then wterm_ln(' (no format preloaded)') +else begin print(format_ident); print_ln; + end; +@y +if format_ident>0 then print(format_ident); +print_ln; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [6.81] Eliminate nonlocal goto, since C doesn't have them. +% 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'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Error hand...@>= +procedure jump_out; +begin goto end_of_TEX; +end; +@y +@d do_final_end==begin + update_terminal; + 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.84] Implement the switch-to-editor option. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +line ready to be edited. But such an extension requires some system +wizardry, so the present implementation simply types out the name of the +file that should be +edited and the relevant line number. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@y +line ready to be edited. +We do this by calling the external procedure |call_edit| with a pointer to +the filename, its length, and the line number. +However, here we just set up the variables that will be used as arguments, +since we don't want to do the switch-to-editor until after TeX has closed +its files. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@d edit_file==input_stack[base_ptr] +@z +@x +"E": if base_ptr>0 then + begin print_nl("You want to edit file "); +@.You want to edit file x@> + print(input_stack[base_ptr].name_field); + print(" at line "); print_int(line); + interaction:=scroll_mode; jump_out; +@y +"E": if base_ptr>0 then + begin + edit_name_start:=str_start[edit_file.name_field]; + edit_name_length:=str_start[edit_file.name_field+1] - + str_start[edit_file.name_field]; + edit_line:=line; + jump_out; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.109] Define glue_ratio in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!glue_ratio=real; {one-word representation of a glue expansion factor} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.110] Make it easy to build a bigger TeX. (Nothing is changed in +% the basic version.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=255 {largest allowable value in a |quarterword|} +@d min_halfword==0 {smallest allowable value in a |halfword|} +@d max_halfword==262143 {largest allowable value in a |halfword|} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.112] Efficiency. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +@^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 +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +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] Put the memory structure into an include file, since it's too +% hard to translate automatically. Also, remove the `word_file' type. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!quarterword = min_quarterword..max_quarterword; {1/4 of a word} +@!halfword=min_halfword..max_halfword; {1/2 of a word} +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@!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 +@!quarterword=min_quarterword..max_quarterword; +@!halfword=min_halfword..max_halfword; +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@=#include "memory.h";@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [9.116] Change `mem' to `zmem', so 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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [11.165] Fix the word `free' so that it doesn't conflict with the +% standard C library routine of the same name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) +@y +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) + +@d free==free_arr +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.174,176] Eliminate some unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + begin if (font(p)<font_base)or(font(p)>font_max) then + print_char("*") +@y + begin if (font(p)>font_max) then + print_char("*") +@z + +@x +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*") +@y +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)>font_max) then print_char("*") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.186] Don't worry about strange floating point values. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if glue_sign(p)=shrinking then print("- "); + if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?") + else if abs(g)>float_constant(20000) then +@y + if glue_sign(p)=shrinking then print("- "); + { The Unix |pc| folks removed this restriction with a remark that + invalid bit patterns were vanishingly improbable, so we follow + their example without really understanding it. + |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')| + |else| } + if fabs(g)>float_constant(20000) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [17.241] Do `fix_date_and_time' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +@^system dependencies@> +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 +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +It calls a macro-defined |date_and_time| routine. |date_and_time| +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. +@^system dependencies@> + +@d fix_date_and_time==date_and_time(time,day,month,year) +@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.262] Remove more unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@y +else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.513] Area and extension rules for filenames. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\.>' or `\.:', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the first +remaining `\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep track +of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any} +@!ext_delimiter:pool_pointer; {the relevant `\..', if any} +@y +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\./', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the last +`\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep +track of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\./', if any} +@!ext_delimiter:pool_pointer; {the most recent `\..', if any} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.514] TeX area directories. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d TEX_area=="TeXinputs:" +@.TeXinputs@> +@d TEX_font_area=="TeXfonts:" +@.TeXfonts@> +@y +In C, the default paths are specified in a separate +file, \.{site.h}. The file opening procedures do path searching +based either on those default paths, or on paths given by the user +in environment variables. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.516] more_name +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c=">")or(c=":") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length; +@y +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c="/") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if c="." then ext_delimiter:=cur_length; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.520] The 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} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@y +Under {\mc UNIX} we don't give the area part, instead depending +on the path searching that will happen during file opening. Also, the +length will be set in the main program. + +@d format_area_length=0 {length of its area part} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.521] Where `plain.fmt' is. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!TEX_format_default:packed array[1..format_default_length] of char; + +@ @<Set init...@>= +TEX_format_default:='TeXformats:plain.fmt'; +@y +@!format_default_length: integer; +@!TEX_format_default: c_char_pointer; + +@ We set the name of the default format file and the length of that name +in C, instead of Pascal, since we want them to depend on the name of the +program. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.524] Format file opening: only try once, with path searching. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + pack_buffered_name(0,loc,j-1); {try first without the system file area} + if w_open_in(fmt_file) then goto found; + 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 + pack_buffered_name(0,loc,j-1); + if w_open_in(fmt_file) then goto found; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% (still [29.524]) replace `PLAIN' in error messages with `default'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.'); +@y + wterm_ln('Sorry, I can''t find that format;',' will try the default.'); +@z +@x + wterm_ln('I can''t find the PLAIN format file!'); +@.I can't find PLAIN...@> +@y + wterm_ln('I can''t find the default format file!'); +@.I can't find default format...@> +@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 + +@x +months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@y +months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Use a path when calling a_open_in to do a \input; also, try +% to open the file with and without the `.tex' extension, regardless of +% whether the file already has an extension. This allows filenames like +% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if cur_ext="" then cur_ext:=".tex"; +pack_cur_name; +loop@+ begin begin_file_reading; {set up |cur_file| and new level of input} + 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 +pack_cur_name; {Try without |".tex"|.} +loop@+begin + begin_file_reading; {set up |cur_file| and new level of input} + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + pack_cur_name; {Try adding |".tex"|, even if we already have an extension.} + if name_length < file_name_size + 5 {Don't overflow the array.} + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; +@z + +% Knuth should fix this bug. +@x +if term_offset+length(name)>max_print_line-2 then print_ln +@y +if term_offset+length(name)>max_print_line-3 then print_ln +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Get rid of return of filename to string pool. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if name=str_ptr-1 then {we can conserve string pool space now} + begin flush_string; name:=cur_name; + end; +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [30.563] Fix TFM file opening. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +file_opened:=false; +if aire="" then pack_file_name(nom,TEX_font_area,".tfm") +else pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@y +file_opened:=false; +pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [32.597] We only want `eof' on the TFM file to be true if we +% previously had EOF, not if we're at EOF now. This is like `feof', and +% unlike our implementation of `eof' elsewhere. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if eof(tfm_file) then abort; +@y +if feof(tfm_file) then abort; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [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.875] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +repeat if type(r)<>delta_node then + begin line_diff:=line_number(r)-best_line; +@y +repeat if type(r)<>delta_node then + begin line_diff:=toint(line_number(r))-toint(best_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [42.920,921,923,924] Allow larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Comparatively few different number sequences $n_0\ldots n_k$ actually occur, +since most of the |n|'s are generally zero. Therefore the number sequences +are encoded in such a way that |trie_op|$(z_k)$ is only one byte long. +If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|. +@y +The theory that comparatively few different number sequences $n_0\ldots n_k$ +actually occur, since most of the |n|'s are generally zero, seems to fail +at least for the large German hyphenation patterns. +Therefore the number sequences cannot any longer be encoded in such a way +that |trie_op|$(z_k)$ is only one byte long. +We have introduced a new constant |max_trie_op| for the maximum allowable +hyphenation operation code value; |max_trie_op| might be different for +\TeX\ and \.{INITEX} and must not exceed |max_halfword|. +An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword| +or a quarterword otherwise. +@^system dependencies@> +If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|. +@z +@x +@!trie_pointer=0..trie_size; {an index into |trie|} +@y +@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode} +@!trie_pointer=0..trie_size; {an index into |trie|} +@z +@x +@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie} +@d trie_char(#)==trie[#].b1 {character matched at this trie location} +@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location} +@y +@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|, +and |trie_op| will no longer fit into one memory word; thus using web2c +we define |trie| as three array instead of an array of records. +The variant will be implented by reusing the opcode field later on with +another macro. +@d trie_link(#)==trie_trl[#] {``downward'' link in a trie} +@d trie_char(#)==trie_trc[#] {character matched at this trie location} +@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location} +@z +@x +@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|} +@y +@!trie_trl:array[trie_pointer] of halfword; {|trie_link|} +@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|} +@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|} +@z +%@x +% begin if trie_op(z)<>min_quarterword then +%@y +% begin if trie_op(z)<>min_trie_op then +%@z +%@x +%until v=min_quarterword; +%@y +%until v=min_trie_op; +%@z +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943] Larger tries, also in documentation parts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +|hyf_next[@t$v^\prime$@>]=min_quarterword|. +@y +|hyf_next[@t$v^\prime$@>]=min_trie_op|. +@z +@x +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad +@y +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad +@z +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.?] Hack around the negative lower bound here. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The hash table is called |trie_op_hash|, and the number of entries it contains +is |trie_op_ptr|. + +@<Glob...@>= +@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size; +@y +The hash table is called |trie_op_hash|, and the number of entries it contains +is |trie_op_ptr|. + +@<Glob...@>= +@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943,944] Larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!trie_used:array[ASCII_code] of quarterword; +@y +@!trie_used:array[ASCII_code] of trie_opcode; +@z +@x +@!trie_op_val:array[1..trie_op_size] of quarterword; +@y +@!trie_op_val:array[1..trie_op_size] of trie_opcode; +@z +@x +tini +@y +tini@; +@!max_op_used:trie_opcode; {largest opcode used for any language} +@!small_op:boolean; {flag used while dumping or undumping} +@z +@x +|new_trie_op| could return |min_quarterword| (thereby simply ignoring +@y +|new_trie_op| could return |min_trie_op| (thereby simply ignoring +@z +@x +function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword; +label exit; +var h:-trie_op_size..trie_op_size; {trial hash location} +@!u:quarterword; {trial op code} +@y +function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode; +label exit; +var h:neg_trie_op_size..trie_op_size; {trial hash location} +@!u:trie_opcode; {trial op code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (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+trie_op_size) +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944,945,946] And larger tries again. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if u=max_quarterword then + overflow("pattern memory ops per language", + max_quarterword-min_quarterword); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; +@y + if u=max_trie_op then + overflow("pattern memory ops per language", + max_trie_op-min_trie_op); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; + if u>max_op_used then max_op_used:=u; +@z +@x +op_start[0]:=-min_quarterword; +@y +op_start[0]:=-min_trie_op; +@z +@x +for k:=0 to 255 do trie_used[k]:=min_quarterword; +@y +for k:=0 to 255 do trie_used[k]:=min_trie_op; +@z +@x +trie_op_ptr:=0; +@y +max_op_used:=min_trie_op; +trie_op_ptr:=0; +@z +@x +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword; +@y +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode; +@z +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.947] And another. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.950,958,960,963] Larger tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d trie_back(#)==trie[#].lh {backward links in |trie| holes} +@y +@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links} +@z +@x +@<Move the data into |trie|@>= +h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|, + |trie_op:=min_quarterword|, |trie_char:=qi(0)|} +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do trie[r]:=h; +@y +@d clear_trie == {clear |trie[r]|} + begin trie_link(r):=0; + trie_op(r):=min_trie_op; + trie_char(r):=min_quarterword; {|trie_char:=qi(0)|} + end +@<Move the data into |trie|@>= +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do clear_trie; +@z +@x + repeat s:=trie_link(r); trie[r]:=h; r:=s; +@y + repeat s:=trie_link(r); clear_trie; r:=s; +@z +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [49.1275] Same stuff as for \input, this time for \openin. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if cur_ext="" then cur_ext:=".tex"; + pack_cur_name; + if a_open_in(read_file[n]) then read_open[n]:=just_open; +@y + pack_cur_name; + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open + else begin + pack_cur_name; + if name_length < file_name_size + 5 {Don't overflow the array.} + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open; + end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1302] Eliminate now-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} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1303] Ditto, for `load_fmt_file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!x: integer; {something undumped} +@!w: four_quarters; {four ASCII codes} +@y +@!x: integer; {something undumped} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.??] Do reading and writing of `fmt_file' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@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 +@z + +@x +@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 +@z + +@x +x:=fmt_file^.int; +@y +undump_int(x); {This reads the first word of the \.{.fmt} file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] Make dumping/undumping more efficient. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +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 +dump_things(str_start[0], str_ptr+1); +dump_things(str_pool[0], pool_ptr); +@z + +@x +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 +undump_things(str_start[0], str_ptr+1); +undump_things(str_pool[0], pool_ptr); +@z + +@x +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 +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 + +@x +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 +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 +for k:=hi_mem_min to mem_end do undump_wd(mem[k]); +@y +undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +for j:=k to k+x-1 do undump_wd(eqtb[j]); +@y +undump_things(eqtb[k], x); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]); +@y +dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]); +@y +undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +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 +@<Dump the array info for internal font number |k|@>; +@z + +@x +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 +@<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 +@ @<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 +@ @<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); +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.1322] Reading font info for C (nearly done with undump stuff). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ @<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)(font_mem_size)(bchar_label[k]); +undump(min_quarterword)(non_char)(font_bchar[k]); +undump(min_quarterword)(non_char)(font_false_bchar[k]); +end +@y +@ 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); +end +@z + +% The hyphenation patterns. +% +@x +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 +dump_things(trie_trl[0], trie_max+1); +dump_things(trie_tro[0], trie_max+1); +dump_things(trie_trc[0], trie_max+1); +dump_int(trie_op_ptr); +dump_things(hyf_distance[1], trie_op_ptr); +dump_things(hyf_num[1], trie_op_ptr); +dump_things(hyf_next[1], trie_op_ptr); +@z + +@x +for k:=0 to j do undump_hh(trie[k]); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +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 +undump_things(trie_trl[0], j+1); +undump_things(trie_tro[0], j+1); +undump_things(trie_trc[0], j+1); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +undump_things(hyf_distance[1], j); +undump_things(hyf_num[1], j); +undump_things(hyf_next[1], j); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1327] As with TFM files, `eof' here means `have we previously +% encountered the end-of-file', not `are we at the end of the file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if (x<>69069)or eof(fmt_file) then goto bad_fmt +@y +if (x<>69069)or feof(fmt_file) then goto bad_fmt +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +print(" (preloaded format="); print(job_name); print_char(" "); +@y +print(" (format="); print(job_name); print_char(" "); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1332] `uexit' argument depends on `history'; add call to +% set_paths; make the main program a procedure, so that uses of `eqtb' +% will work. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@p begin @!{|start_here|} +@y +@p procedure tex_body; +begin @!{|start_here|} +@z + +@x +t_open_out; {open the terminal for output} +@y +t_open_out; {open the terminal for output} +{get default file paths from the environment} +set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT + + TFM_FILE_PATH_BIT); +@z + +@x +end_of_TEX: close_files_and_terminate; +final_end: ready_already:=0; +end. +@y +close_files_and_terminate; +final_end: do_final_end; +end {|tex_body|}; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1333] Print new line before termination; switch to editor if +% necessary. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + print(log_name); print_char("."); + end; + end; +@y + print(log_name); print_char("."); + end; + end; +print_ln; +if (edit_name_start<>0) and (interaction>batch_mode) then + call_edit(str_pool,edit_name_start,edit_name_length,edit_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [52.1338] Core-dump in debugging mode on 0 input. Under 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 + begin goto breakpoint;@\ {go to every label at least once} + breakpoint: m:=0; @{'BREAKPOINT'@}@\ + end +@y + dump_core {Do something to cause a core dump} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [54.1376] Add editor-switch variables to globals. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +This section should be replaced, if necessary, by any special +modifications of the program +that are necessary to make \TeX\ work at a particular installation. +It is usually best to design your change file so that all changes to +previous sections preserve the section numbering; then everybody's version +will be consistent with the published program. More extensive changes, +which introduce new sections, can be inserted here; then only the index +itself will get a new section number. +@^system dependencies@> +@y +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; +@z diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/install b/obsolete/systems/sisisi/unix/SiTeX3.14/install new file mode 100644 index 0000000000..42018ad32e --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/install @@ -0,0 +1,59 @@ +#!/bin/sh + +TEXSRC="/users/heinz/src/tex/TeX3.14" +TEXDIR=$TEXSRC/tex +WEBDIR=$TEXSRC/web +WEB2CDIR=$TEXSRC/web2c +SISISIDIR="/users/heinz/src/tex/sisisi" + +echo +echo "Do not forget to copy the files *.sty and *.tex" +echo "from $SISISIDIR to your TEXINPUTS-Directory." +echo +echo "Press 'q' to interrupt this installation and do it now, <cr> to continue" +read x +if [ "$x" = "q" ] +then + exit +fi + +cd $TEXSRC + +( cd $SISISIDIR; uncompress <sitex.web.Z >$TEXDIR/tex.web;\ + cp web2c* $WEB2CDIR; \ + cp tangle.ch $WEBDIR; cp makefile $TEXSRC; cp Makefile ctex.ch $TEXDIR ) + +make "CC=gcc" TeX +if [ ! -f $TEXDIR/stamp-convert ] +then + echo "*** SISISI: tex.p not converted. Something's gone wrong. Stop." 1>&2 + exit 1 +fi + +( cd $SISISIDIR; cp tex6.c texd.h coerce.h $TEXDIR ) + +make "CC=gcc" TeX +if [ ! -f $TEXDIR/virtex ] +then + echo "*** SISISI: make failed. Stop." 1>&2 + exit 2 +fi + +( cd $TEXDIR; mv tex.pool sitex.pool ) + +make formats +if [ ! -f $TEXSRC/stamp-formats ] +then + echo "*** SISISI: make formats failed. Stop." 1>&2 + exit 2 +fi + +echo +echo "SISISI has been successfully compiled, and the format files have been" +echo "generated. Now follow the guidelines from the README file for further" +echo "installation. Do not forget to copy $TEXDIR/sitex.pool" +echo "to your TEXPOOL-Directory, and $TEXDIR/hf3 to your" +echo "TEXINPUTS-Directory." +echo + +exit 0 diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/makefile b/obsolete/systems/sisisi/unix/SiTeX3.14/makefile new file mode 100644 index 0000000000..c72607bcef --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/makefile @@ -0,0 +1,280 @@ +# Overall Makefile for making TeX, Metafont, and friends, using WEB to C. + + +# TeX 3.14 + Metafont 2.7 + web2c b. +# +version=5.84b + +# Directory that site.h is in relative to subdirectories, i.e., `..' +# means the directory containing this Makefile. +SITEDIR=.. + +# Default C compiler. +CC=gcc + +# Default flags to give the C compiler. (Don't define CFLAGS directly.) +OPT=-O + +# Default flags to give to the loader. +LDFLAGS= + +# Default libraries with which to link (libraries for the Metafont +# support are specified separately). +LOADLIBES= + +# Make sure we use the sh. If your sh is broken, you might try bash, +# the GNU replacement. +SHELL=/bin/sh + +# The yacc program to use on web2c/web2c.yacc. +YACC=bison -y + +# The lex program to use on web2c/web2c.lex. +LEX=lex +# -ll for lex, -lfl for flex. +LEXLIB=-ll + +# Need -D_POSIX_SOURCE here, perhaps, if on a POSIX system. +LEXCFLAGS= + +# How to make a link. +LN=ln -s + +# Support libraries for Metafont. +x10lib=-lX +x11lib=-lXt -lX11 +sunlib=-lsuntool -lsunwindow -lpixrect + +# This line should select the libraries that match what you said in site.h. +wlibs=$(x11lib) + +# These lines define the format and base files that `make fmts' and +# `make bases' will try to make, and `make install' will try to install. +# See README.W2C for a brief description of each of these formats. +formats=sitex.fmt silatex.fmt +# etex.fmt \ +# amstex.fmt amslatex.fmt picplus.fmt texinfo.fmt +bases=mf.base cmmf.base + +# The name of the file that defines your local devices, for use with +# Metafont. (Only relevant during `make bases'.) I urge you to get the +# file `modes.mf', which defines all known modes, plus useful +# definitions for all fonts. It's available from ftp.cs.umb.edu +# [192.12.26.23] as pub/tex/modes.mf, among other places. +localmodes=modes + +# You may need INSTALL=cp on system V, if you don't have GNU install. +# Or you can install the programs by hand. +# $(fileinstall) is used for the format and base files, man files, and +# other non-executables, and $(programinstall) is used for +# the executables. +INSTALL=install -g tex -c +fileinstall=$(INSTALL) -m 664 +proginstall=$(INSTALL) -m 775 -s + +# These pathnames are used to customize the manual pages with local +# directory names; some of them are used in `make install'. They should +# match the system directories in the paths defined in `./site.h'. +bindir=/usr/local/bin +manext=l +mandir=/usr/man/man$(manext) + +texlibdir=/usr/local/lib/tex +texpooldir=$(texlibdir) +texinputdir=$(texlibdir)/inputs +texfontdir=$(texlibdir)/fonts +formatdir=$(texlibdir)/formats + +mflibdir=/usr/local/lib/mf +mfpooldir=$(mflibdir) +mfinputdir=$(mflibdir)/inputs +basedir=$(mflibdir)/bases + +# Where the Computer Modern sources are. +# (The man pages claim that you have installed the standard utility +# sources, like `grayf.mf' and `expr.mf', somewhere in $(mfinputdir).) +cmsources=/usr/local/src/other/TeX+MF/typefaces/cm + +default: all + + +# Stuff below here probably doesn't need to be changed. +# +alldirs=web tex mf texware mfware fontutil bibtex dviutil +triptrapdirs=tex texware mf mfware + +makeargs=SITEDIR="$(SITEDIR)" CC="$(CC)" OPT="$(OPT)" \ +SHELL="$(SHELL)" LDFLAGS="$(LDFLAGS)" LOADLIBES="$(LOADLIBES)" wlibs="$(wlibs)" + +web2c=web2c +web2cprograms=$(web2c)/web2c $(web2c)/regfix $(web2c)/splitup \ + $(web2c)/fixwrites +commonsources=common/alloca.c common/extra.c common/main.c common/endian.c + +triptrap: stamp-tangle stamp-common + for name in $(triptrapdirs); \ + do \ + (cd $${name}; make $(makeargs) LN="$(LN)" triptrap); \ + done + +run-triptrap: run-trip run-trap + +clean-triptrap: + cd tex; make veryclean + cd mf; make veryclean + +all: stamp-web2c stamp-common + for name in $(alldirs); \ + do \ + (cd $${name}; echo $${name}; make $(makeargs) all); \ + done + +TeX: stamp-web2c stamp-tangle stamp-common + cd tex; make $(makeargs) all + +BibTeX: stamp-web2c stamp-tangle stamp-common + cd bibtex; make $(makeargs) all + +run-trip: + cd tex; make run-trip + +MF: stamp-web2c stamp-tangle stamp-common + cd mf; make $(makeargs) all + +run-trap: + cd mf; make run-trap + + +# The targets below must be up to date for anything to be made. +# + +stamp-web2c: + cd $(web2c); \ + make $(makeargs) YACC="$(YACC)" LEX="$(LEX)" LEXLIB="$(LEXLIB)" all + touch stamp-web2c + +stamp-common: $(commonsources) + cd common; make $(makeargs) all + touch stamp-common + +stamp-tangle: stamp-web2c stamp-common + cd web; make $(makeargs) tangle + touch stamp-tangle + + +manpages: + cd man; make SITEDIR=$(SITEDIR) \ + bindir=$(bindir) texlibdir=$(texlibdir) \ + texpooldir=$(texpooldir) formatdir=$(formatdir) \ + texinputdir=$(texinputdir) texfontdir=$(texfontdir) \ + mflibdir=$(mflibdir) mfpooldir=$(mfpooldir) \ + basedir=$(basedir) mfinputdir=$(mfinputdir) \ + cmsources=$(cmsources) \ + all + +bases: stamp-bases +stamp-bases: + cd mf; MFPOOL=.; export MFPOOL; \ + make bases="$(bases)" localmodes="$(localmodes)" bases + touch stamp-bases + +formats: stamp-formats +stamp-formats: + cd tex; TEXPOOL=.; export TEXPOOL; make formats="$(formats)" fmts + touch stamp-formats + + +# Installation targets. +# +install-manpages: + cd man; make mandir=$(mandir) INSTALL="$(fileinstall)" \ + SITEDIR="$(SITEDIR)" manext=$(manext) install + +install: + if test -d $(bindir); then exit 0; else mkdir $(bindir); fi + $(proginstall) tex/initex $(bindir)/initex + $(proginstall) tex/virtex $(bindir)/virtex + $(proginstall) mf/inimf $(bindir)/inimf + $(proginstall) mf/virmf $(bindir)/virmf + $(proginstall) web/tangle $(bindir)/tangle + $(proginstall) web/weave $(bindir)/weave + $(proginstall) texware/dvitype $(bindir)/dvitype + $(proginstall) texware/pltotf $(bindir)/pltotf + $(proginstall) texware/tftopl $(bindir)/tftopl + $(proginstall) mfware/gftodvi $(bindir)/gftodvi + $(proginstall) mfware/gftopk $(bindir)/gftopk + $(proginstall) mfware/gftype $(bindir)/gftype + $(proginstall) mfware/mft $(bindir)/mft + $(proginstall) fontutil/pktogf $(bindir)/pktogf + $(proginstall) fontutil/pktype $(bindir)/pktype + $(proginstall) fontutil/vftovp $(bindir)/vftovp + $(proginstall) fontutil/vptovf $(bindir)/vptovf + $(proginstall) bibtex/bibtex $(bindir)/bibtex + $(proginstall) dviutil/dvicopy $(bindir)/dvicopy + if test -d $(texpooldir); then exit 0; else mkdir $(texpooldir); fi + -if test -s tex/tex.pool; \ + then (cd tex; $(fileinstall) tex.pool $(texpooldir) ); fi + if test -d $(mfpooldir); then exit 0; else mkdir $(mfpooldir); fi + -if test -s mf/mf.pool; \ + then (cd mf; $(fileinstall) mf.pool $(mfpooldir) ); fi + +install-formats: stamp-formats + if test -d $(formatdir); then exit 0; else -mkdir $(formatdir); fi + for f in $(formats); \ + do \ + rm -f $(bindir)/`basename $$f .fmt`; \ + ln $(bindir)/virtex $(bindir)/`basename $$f .fmt`; \ + $(fileinstall) tex/$$f $(formatdir); \ + done + cd $(formatdir); rm -f plain.fmt; ln tex.fmt plain.fmt + +install-bases: stamp-bases + if test -d $(basedir); then exit 0; else -mkdir $(basedir); fi + for f in $(bases); \ + do \ + rm -f $(bindir)/`basename $$f .base`; \ + ln $(bindir)/virmf $(bindir)/`basename $$f .base`; \ + $(fileinstall) mf/$$f $(basedir); \ + done + cd $(basedir); rm -f plain.base; ln mf.base plain.base + + +# Need GNU tar for this. +# +web2c-dist: web/tangleboot.pas + @echo -n "check -linet;tangleboot" + @echo "big{tex,mf.ch; trie change" + mv ChangeLog ChangeLog.W2C + cd ..; \ + find src-$(version) \! -name '*.web' -type f -print > /tmp/files; \ + tar czfT web2c-$(version).tar.Z /tmp/files; \ + ls -ld web* + mv ChangeLog.W2C ChangeLog + +web-dist: web/tangleboot.pas + cd ..; \ + find src-$(version) -name '*.web' -print > /tmp/webfest; \ + tar czfT web-$(version).tar.Z /tmp/webfest; \ + ls -ld web* + +web/tangleboot.pas: + cd web; make tangle.p; cp tangle.p tangleboot.pas; make veryclean + +clean: + rm -f stamp-* + for name in web2c common $(alldirs); \ + do \ + (cd $${name}; make clean); \ + done + +veryclean: + rm -f stamp-* + for name in web2c common man $(alldirs); \ + do \ + (cd $${name}; make veryclean); \ + done + rm -f \#*\# *~ *.bak *.ckp core + +.PHONY: default triptrap run-triptrap clean-triptrap all TeX run-trip \ + MF run-trap manpages bases formats install-manpages install \ + install-formats install-bases web2c-dist web-dist clean veryclean diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/sitex.web.gz b/obsolete/systems/sisisi/unix/SiTeX3.14/sitex.web.gz Binary files differnew file mode 100644 index 0000000000..13fb851bfe --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/sitex.web.gz diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/sitex3.ch b/obsolete/systems/sisisi/unix/SiTeX3.14/sitex3.ch new file mode 100644 index 0000000000..048d9433cb --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/sitex3.ch @@ -0,0 +1,2827 @@ +========================================================================= + +SI_TEX.CHA Change file for SISISI-hyphenation in TeX 3.1 16.7.1991 + (c) for SISISI-hyphenation: Wilhelm Barth, Heinrich Nirschl + (c) for TeX changes: Heini Hofstaedter, Harald Mueller + + additional changes until 10. October 1991 HH +========================================================================= + +This is the change file for inclusion of SISISI into TeX V.3.14. + +There are three main changes in this file (which are of course quite +intermingled): + + 1) the replacement of Liang's hyphenation by SISISI. + + 2) the change of the interface of the actual hyphenation + to the post-hyphenation and the line-break algorithm. + + This change is necessary because in original TeX, only the + information "hyphen - no hyphen" can be transmitted to the + line break algorithm because of two "bottlenecks": + + 1. Hyphenation --> Post-Hyphenation: Here a hyphen at position i + is marked by the 1-bit information odd(hyf[i]). + 2. Post-Hyphenation --> Line-Breaking: Here a hyphen is marked + by the existence of a discretionary node. + + From SISISI, there must be more information flowing to the + line-break algorithm: + + a. Is a hyphen a main hyphen or a "nebenhyphen"? To this end, + a change is made such that a penalty node is allowed as + the first node in the prebreak list of a discretionary + node. This penalty node contains the penalty associated with + this specific hyphen. For "nebenhyphens", this value is set + by an additional primitive "\nebenhyphenpenalty". + Instead of the hyf-array, an array hyfpen is used that + contains the actual penalties; the old "if odd(hyf[i])" now + is converted ti "if hyfpen[i] <> inf_penalty". + + b. A hyphen may be more complicated than a single -: ck-hyphens + and triple-consonant-hyphens may be present. To include these, + another array hyf_disc is introduced that contains ready-made + discretionary nodes for such hyphens. + + At first, we simply wanted to include these discretionary + during the post-hyphenation into the new node list. But then + Heini felt that the impossiblity of ligatures with parts of such + a discretionary node was not acceptable; therefore he introdiced + the "x-mechanism" (characterized by many variables starting with + "x") and changed the reconstitute function so that more than the + single hyphen_char could be introduced into the reconstitution + process. + + 3) "Dirty" changes for the hyphenation of words with umlauts. + These changes are necessary because the umlauts in TeX are not + (necessarily) real characters, but something else (see definition + of umlauts in plain.tex or german.tex). + Ordinarily, the hyphenation only accepts sequences of letters, + ligatures (which are expanded to their single characters), and + so-called "implicit kerns". An umlaut, however, is usually + represented as a letter character and another character consisting + of two dots ("dieresis character"), which are connected by + explicit kerns (not implicite ones!). Therefore, words containing + umlauts are not hyphenable words in TeX, which is not acceptable + for german texts. + + Therefore, we devised a "bypass" for umlauts as follows: An umlaut + is now represented as a special discretionary node (so-called + "dirty umlaut") as follows: + \discretionary{\kern4321sp m\kern<code>sp\kern<back>sp\kern-1em}% + {}% + {<umlaut>} + where the 4321sp is a "marker" for the "dirty umlaut", the "m" + letter is used to derive the font of the umlaut, <code> is + the font number that should be associated with this umlaut (the + font numbers of the umlauts are given below); and <back> is used + to cancel the preceding kerns, i.e.\ <back> = - (4321 + <code>). + + In other words, the prebreak list contains the information that + this is an umlaut (albeit a "dirty" one) and some more + information needed for the hyphenation, the postbreak list is + empty, and the main list contains the umlaut proper. By a + special if-statement in the line-break algorithm, a hyphenation + at a discretionary node of this format is suppressed, so that + always the umlaut of the main list is printed. + The font numbers for the lowercase umlauts (which are given + in the second \kern node) must be: + ae 228 + oe 246 + ue 252 + The codes for the uppercase umlauts can be chosen arbitrarily. + + In order to get the hyphenation for these "dirty umlauts" + running, one must include lccode assignments of the form + \lccode<code>=<lccode> + for each of the new letters (see example below). + + A typical declaration of the "dirty umlauts" runs like this: + +%%%%%%%%%%%%%%%%%%%%% declaration of dirty umlauts %%%%%%%%%%%%%%%%%%%%%% +\def\A"{\discretionary{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\"A}} +\def\a"{\discretionary{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\"a}} +\def\O"{\discretionary{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\"O}} +\def\o"{\discretionary{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\"o}} +\def\U"{\discretionary{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\"U}} +\def\u"{\discretionary{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\"u}} +\lccode196=228 % uppercase umlaut A +\lccode214=246 % uppercase umlaut O +\lccode220=252 % uppercase umlaut U +\lccode228=228 % uppercase umlaut a +\lccode246=246 % uppercase umlaut o +\lccode252=252 % uppercase umlaut u +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +When (if?) one day N.Schwarz's DC/EC fonts arrive, the changes of the +third kind can be eliminated. How long this will take ... well, wait and +see. +But when they arrive, it's not longer possible to choose the codes for +uppercase umlauts arbitrarily. The codes for uppercase umlauts will +then be those, shown in the example above. + +========================================================================= + +At first, we add a control sequence \SISISI. +@x +\def\PASCAL{Pascal} +@y +\def\SISISI{{\sl SISISI}} +\def\PASCAL{Pascal} + +\let\maybe=\iffalse % print only changed modules +@z + +------------------------------------------------------------------------- + +@x +@d banner=='This is TeX, Version 3.14' {printed when \TeX\ starts} +@y +@d banner=='This is TeX, Version 3.14 (+SISISI 1.0)' +@z + +------------------------------------------------------------------------- + +A number of procedures of SISISI are declared after the TeX program. As +these procedures are used in the hyphenation, of course, they must be +declared as `forward'. + In web2c gibt es keine forward's !!!! +%@x +%procedure initialize; {this procedure gets things started properly} +%@y +%@<forward declarations@> +%procedure initialize; {this procedure gets things started properly} +%@z + +------------------------------------------------------------------------- +%@x +%@d pool_name_length=8 +%@y +%@d pool_name_length=11 +% {number of characters of ``pool_f_name''} +%@z +%see the following change of the pool file name "pool_f_name" +------------------------------------------------------------------------- + +@x +@!pool_name='TeXformats:TEX.POOL '; +@y +@!pool_name='TeXformats:SITEX3.POOL '; +@z + +------------------------------------------------------------------------- + +@x +else bad_pool('! I can''t read TEX.POOL.') +@.I can't read TEX.POOL@> +@y +else bad_pool('! I can''t read SITEX3.POOL.'); +@.I can't read TEX.POOL@> +@z +========================================================================= + +To have all messages, coming from SI_TEX, displayed on screen +and written to the log-file simultanously, we make the following, +additional definitions. + temp nicht mehr vorhanden, in log ve„ndert. +@x +@d wlog_ln(#)==write_ln(log_file,#) +@d wlog_cr==write_ln(log_file) +@y +@d wlog_ln(#)==write_ln(log_file,#) +@d wlog_cr==write_ln(log_file) + +@d si_put(#) == @+ begin + if (file_offset<>0)or(term_offset<>0) then print_ln; + if selector<>log_only then wterm(#); + if (selector=log_only)or(selector=term_and_log) then + wlog(#); + end +@d si_put_ln(#) == @+ begin + if (file_offset<>0)or(term_offset<>0) then print_ln; + if selector<>log_only then wterm_ln(#); + if (selector=log_only)or(selector=term_and_log) then + wlog_ln(#); + end +@d si_put_cr == print_ln + + +@d dbg_put(#) == {} +@d dbg_put_ln(#) == {} +@d dbg_put_cr == {} +@z +========================================================================= + +We add a new primitive \nebenhyphenpenalty for setting the penalty of a +minor hyphen: + +@x +@d int_pars=55 {total number of integer parameters} +@d count_base=int_base+int_pars {256 user \.{\\count} registers} +@y +@d neben_hyphen_penalty_code=55 {penalty for break after neben-hyphen} +@d si_debug_code=56 {value is treated as an set of active debugging sections} +@d supress_debug_mark_code=57 {same as above; if a section number is set, then + the output of the section number and the debugging output banner + of this section is supressed} +@d int_pars=58 {total number of integer parameters} +@d count_base=int_base+int_pars {256 user \.{\\count} registers} +@z +------------------------------------------------------------------------- +@x +@<Assign the values |depth_threshold:=show_box_depth|...@>= +@y +@d neben_hyphen_penalty==int_par(neben_hyphen_penalty_code) +@d si_debug(#) == if odd(int_par(si_debug_code) div #) then begin + if not odd(int_par(supress_debug_mark_code)div #) then + begin + si_put_cr; + si_put_ln(' <* debugging output section #',#:#,' *>'); + end; {marking supression} + { dig_count entfernt !!! } +@d gubed_si == end +@f si_debug == begin +@f gubed_si == end +@f gubed == nil + + +@<Assign the values |depth_threshold:=show_box_depth|...@>= +@z +------------------------------------------------------------------------- +@x +othercases print("[unknown integer parameter!]") +@y +neben_hyphen_penalty_code:print_esc("nebenhyphenpenalty"); +si_debug_code:print_esc("sidebug"); +supress_debug_mark_code:print_esc("supressdebugmark"); +othercases print("[unknown integer parameter!]") +@z +------------------------------------------------------------------------- +@x +@ @<Cases of |print_cmd_chr|...@>= +@y +primitive("nebenhyphenpenalty",assign_int,int_base+neben_hyphen_penalty_code);@/ +@!@:neben_hyphen_penalty_}{\.{\\nebenhyphenpenalty} primitive@> +primitive("sidebug",assign_int,int_base+si_debug_code); +primitive("supressdebugmark",assign_int,int_base+supress_debug_mark_code); +@ @<Cases of |print_cmd_chr|...@>= +@z + +========================================================================= + +As now hyphens may have different penalties, we must somehow associate +a penalty with a discretionary node. We do this by allowing a penalty +node as the first node in the prebreak list of a discretionary node. + +The following changes are in two case statements that check the nodes +in the sublists of a discretionary node; we add an empty case for +penalty nodes (two more case statements follow a little bit later). + +@x + othercases confusion("disc1") +@y + penalty_node: ; + othercases confusion("disc1") +@z +------------------------------------------------------------------------- +@x + othercases confusion("disc2") +@y + penalty_node: ; + othercases confusion("disc2") +@z + +========================================================================= + +MAIN CHANGE 2) + +The following change is in the line-break section, where try_break is +given the penalty stored in the penalty node. This change is the reason +for all other changes concerning penalties. Moreover, in this change +a line break is suppressed if the discretionary node is actually +a "dirty umlaut" (via "if not is_dirty_umlaut(cur_p) then ... try_break"). + +@x +begin s:=pre_break(cur_p); disc_width:=0; +if s=null then try_break(ex_hyphen_penalty,hyphenated) +else begin repeat @<Add the width of node |s| to |disc_width|@>; + s:=link(s); + until s=null; + act_width:=act_width+disc_width; + try_break(hyphen_penalty,hyphenated); + act_width:=act_width-disc_width; + end; +r:=replace_count(cur_p); s:=link(cur_p); +while r>0 do + begin @<Add the width of node |s| to |act_width|@>; + decr(r); s:=link(s); + end; +prev_p:=cur_p; cur_p:=s; goto done5; +end + +@y +begin + s:=pre_break(cur_p); disc_width:=0; + if s=null then try_break(ex_hyphen_penalty,hyphenated) + else if (type(s)=penalty_node) and (link(s)=null) then begin + flush_node_list(s); s := null; + try_break(ex_hyphen_penalty,hyphenated); end + else if not is_dirty_umlaut(cur_p) then begin + if type(s)=penalty_node then s:=link(s); + repeat @<Add the width of node |s| to |disc_width|@>; + s:=link(s); + until s=null; + act_width:=act_width+disc_width; + if type(pre_break(cur_p))=penalty_node then begin + try_break(penalty(pre_break(cur_p)),hyphenated) end + else begin try_break(hyphen_penalty,hyphenated); end; + act_width:=act_width-disc_width; + end; + r:=replace_count(cur_p); s:=link(cur_p); + while r>0 do begin + @<Add the width of node |s| to |act_width|@>; + decr(r); s:=link(s); + end; + prev_p:=cur_p; cur_p:=s; goto done5; +end + +@z + +========================================================================= + +Two more case statements. + +@x + othercases confusion("disc3") +@y + penalty_node: ; + othercases confusion("disc3") +@z + +------------------------------------------------------------------------- + +@x + othercases confusion("disc4") +@y + penalty_node: ; + othercases confusion("disc4") +@z + +========================================================================= + +There's a little problem, converting a device independent (``.dvi'') +to a post script file (``.ps''). I think that this program part could +cause this problem. so let's see... + +!a <-- = --> @x With this, i want to try to reproduce this error. + Because, after i had inserted this change, that error didn`t occur + again! +@<Modify the end of the line...@>= +q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false; +if q<>null then {|q| cannot be a |char_node|} + if type(q)=glue_node then + begin delete_glue_ref(glue_ptr(q)); + glue_ptr(q):=right_skip; + subtype(q):=right_skip_code+1; add_glue_ref(right_skip); + goto done; + end + else begin if type(q)=disc_node then + @<Change discretionary to compulsory and set + |disc_break:=true|@> + else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0; + end +else begin q:=temp_head; + while link(q)<>null do q:=link(q); + end; +@<Put the \(r)\.{\\rightskip} glue after node |q|@>; +done: +!a <-- = --> @y +@<Modify the end of the line...@>= +q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false; +if q<>null then {|q| cannot be a |char_node|} + if type(q)=glue_node then + begin delete_glue_ref(glue_ptr(q)); + glue_ptr(q):=right_skip; + subtype(q):=right_skip_code+1; add_glue_ref(right_skip); + goto done; + end + else begin + if type(q)=disc_node then begin + hyfdeb_b:=false; + if is_dirty_umlaut(q) then begin + si_debug(64) hyfdeb_b:=true; gubed_si; + si_put_cr; + si_put_ln(' ??? There's a line break at a dirty umlaut!?'); + end; + if not hyfdeb_b then begin + @<Change discretionary to compulsory and set |disc_break:=true|@> + end; + end else + if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0; + end else begin + q:=temp_head; + while link(q)<>null do q:=link(q); + end; +@<Put the \(r)\.{\\rightskip} glue after node |q|@>; +done: +!a <-- = --> @z + + +========================================================================= + +If the break actually occurs, the penalty node is made a separate list +with only one node, which is immediately flushed. + +@x +begin s:=pre_break(q); link(q):=s; +while link(s)<>null do s:=link(s); +pre_break(q):=null; q:=s; +end +@y +begin + s:=pre_break(q); + if type(s)=penalty_node then begin + s:=link(s); + link(pre_break(q)):= null; + flush_node_list(pre_break(q)); + end; + link(q):=s; + while link(s)<>null do s:=link(s); + pre_break(q):=null; q:=s; +end +@z + +========================================================================= + +The type `array[0..65] of 0..256' is needed more often, so we make it +an explicit type (see big SISISI change at end of change file). hc is +now declared of this type. + +@x +@!hc:array[0..65] of 0..256; {word to be hyphenated} +@!hn:small_number; {the number of positions occupied in |hc|} +@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} +@y +@!hc:a_word; {word to be hyphenated} +@!hn:small_number; {the number of positions occupied in |hc|} +@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} +{ some variables for debugging output } +@!hyfdeb_i,hyfdeb_j: integer; +@!hyfdeb_b:boolean; +@!si_p, si_q, si_r, si_s: pointer; +@z + +------------------------------------------------------------------------- + +Our hyphenation routines need even more "more local variables". + +@x +@ Hyphenation routines need a few more local variables. +@y +@!dirty_umlaut:array [-1..64] of pointer; {the [-1] field is used, if a + whatsit node occurs inbetween a word. This can happen due to + Partl's changes in ``german.sty'' } + +@ Hyphenation routines need a few more local variables. +@z + +------------------------------------------------------------------------- + +@x +@!j:small_number; {an index into |hc| or |hu|} +@y +@!qq:pointer; +@!j:small_number; {two indices into |hc| or |hu|} +@!jj:integer; +@z + +========================================================================= + +The dirty_umlaut array must be initialized for each word. +And we enable watching the node list, representing the word +to be hyphenated. + +@x +if s<>null then + begin @<Skip to node |ha|, or |goto done1| if no hyphenation +@y +si_p:=cur_p; si_q:=null; +for jj:=-1 to 64 do dirty_umlaut[jj] := null; +if s<>null then begin + si_debug(1) +{ hyfdeb_i:=depth_threshold; depth_threshold:=100; + hyfdeb_j:=breadth_max; breadth_max:=100; +} + show_node_list(si_p); +{ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; } + gubed_si; + @<Skip to node |ha|, or |goto done1| if no hyphenation +@z + +------------------------------------------------------------------------- + +@x + hyphenate; + end; +done1: end +@y + hyphenate; + end; +done1: +si_debug(32) + hyfdeb_i := depth_threshold; hyfdeb_j := breadth_max; + if si_q<>null then begin + depth_threshold:=100; {show all levels of a list} + breadth_max:=200; {show all nodes of one level of a list} + si_r:=link(si_q); link(si_q):=null; + end else begin + (* take the values, set by the user, for this variables! *) + breadth_max:=show_box_breadth; depth_threshold:=show_box_depth; + end; + show_node_list(si_p); + si_put_cr; + if si_q <> null then link( si_q ) := si_r; + + depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; +gubed_si; +end +@z + +========================================================================= + +MAIN CHANGE 1) + +Here, we add the SISISI-procedure abteilen for use in hyphenate and +another label done1. + +@x +procedure hyphenate; +label common_ending,done,found,found1,found2,not_found,exit; +var @<Local variables for hyphenation@>@; +@y + +@<Handling of dirty umlauts@> + +procedure hyphenate; +label common_ending,done,done1,found,found1,found2,not_found,exit; +var @<Local variables for hyphenation@>@; +@z + +========================================================================= + +MAIN CHANGE 3) + +The prehyphenation loop must now also skip over the "dirty umlauts". + +@x +loop@+ begin if is_char_node(s) then + begin c:=qo(character(s)); hf:=font(s); + end + else if type(s)=ligature_node then + if lig_ptr(s)=null then goto continue + else begin q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q); + end + else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue + else if type(s)=whatsit_node then + begin @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + goto continue; + end + else goto done1; + if lc_code(c)<>0 then + if (lc_code(c)=c)or(uc_hyph>0) then goto done2 +@y +loop@+ begin + if is_char_node(s) then begin + c:=qo(character(s)); hf:=font(s); + end else if type(s)=ligature_node then begin + if lig_ptr(s)=null then goto continue + else begin + q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q); + end + end else if is_dirty_umlaut(s) then begin + c:=get_char_of(s); hf:=get_font_of(s); + end else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue + else if type(s)=whatsit_node then begin + @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + goto continue; + end else goto done1; + + if lc_code(c)<>0 then + if (lc_code(c)=c)or(uc_hyph>0) then goto done2 +@z + +========================================================================= + +MAIN CHANGE 2) + +The interface variables for the hyphenation are extended: hyfpen[i] +holds the actual penalty of a hyphen at position i, hyf_disc[i] +contains a "special discretionary" for triple-consonant-hyphens and +ck-hyphens. hc_si is the word as given to the SISISI algorithm; +hyf_si is returned from SISISI and contains markers for the hyphens. + +After this change, there are many changes where `odd(hyf[i])' is +simply replaced by `hyfpen[i]<>inf_penalty'. + +Another procedure to be changed is `reconstitute': It now has to handle +special dicretionary nodes. For a detailed feeling about the code changes +in reconstitute, either (1) look through it bit by bit, or (2) ask Heini +Hofstaedter. + +@x + end + else if type(s)=ligature_node then + @<Move the characters of a ligature node to |hu| and |hc|; + but |goto done3| if they are not all letters@> +@y + end else if is_dirty_umlaut(s) then begin + if get_font_of(s)<>hf then goto done3; + c:=get_char_of(s); + if lc_code(c)=0 then goto done3; + if hn=63 then goto done3; + hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=lc_code(c); + dirty_umlaut[hn]:=s; + for jj:=1 to replace_count(s) do s:=link(s); + end else if type(s)=whatsit_node then begin + @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + dirty_umlaut[-1]:=s; + end else if type(s)=ligature_node then + @<Move the characters of a ligature node to |hu| and |hc|; + but |goto done3| if they are not all letters@> +@z + +========================================================================= + +MAIN CHANGE 3) + +Also in the conversion loop (where the node list is shuffled into the +hc array), we must skip a "dirty umlaut". + +@x +loop@+ begin if not(is_char_node(s)) then + case type(s) of + ligature_node: do_nothing; +@y +loop@+ begin +if not(is_char_node(s)) then + if is_dirty_umlaut(s) then begin + for jj:=1 to replace_count(s)-1 do s:=link(s); + end else + case type(s) of + ligature_node: do_nothing; +@z + +========================================================================= + +Well, there are a lot of new variables that are necessary for the new +hyphenation. Most of them are necessary for Heini's change in the +reconstitute function, where now discretionary nodes for hyphens with +more than one character (e.g. the german ck-hyphens or +three-consonant-hyphens) can be inserted. + +@x +@ @<Local variables for hyphenation@>= +@!i,@!j,@!l:0..65; {indices into |hc| or |hu|} +@!q,@!r,@!s:pointer; {temporary registers for list manipulation} +@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|} +@y +@!hyfpen:array [0..64] of integer; {penalties for possible discretionary + hyphens} +@!hyf_si:trennvektor; +@!hc_si:wort; +@!hyf_disc:array [0..64] of pointer; + +@ @<Local variables for hyphenation@>= +@!i,@!j,@!l,@!kk:0..65; {indices into |hc| or |hu|} +@!q,@!r,@!s,@!qq,@!qr,@!hold_r:pointer; {temporary registers for list manipulation} +@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|} + +@!xchg_char:array [0..10] of 0..256; {type of |hu| and |hc|} +@!add_char, {additional characters when hyphenating e.g.\ + Schiffahrt $\rightarrow$ Schif{\sl f}-fahrt: here + |add_char| = 1} +@!xchg_i,xchg_k,xchg_hu: 0..65; {type like |i|, |j| and |l| } +@!spec_hyf: pointer; {special hyphen; causes different spelling of the + word, when it is hyphenated at this point} +@!si_j:integer; +@z + +========================================================================= + +An odd->inf_penalty change. + +@x +for j:=l_hyf to hn-r_hyf do if odd(hyf[j]) then goto found1; +@y +for j:=l_hyf to hn-r_hyf do if hyfpen[j]<>inf_penalty then goto found1; +@z + +========================================================================= + +The new variable hold_r is initialized (the kern node is a dummy node, +as far as I can see). + +@x +if not is_char_node(hb) then + if type(hb)=ligature_node then if odd(subtype(hb)) then +@y +hold_r := new_kern(1235); link(hold_r):=r; +if not is_char_node(hb) then + if type(hb)=ligature_node then if odd(subtype(hb)) then +@z + +========================================================================= + +Initialize some variables if the list starts with a "dirty umlaut". + +@x +else if type(ha)=ligature_node then + if font(lig_char(ha))<>hf then goto found2 + else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1); +@y +else if is_dirty_umlaut(ha) then begin + if get_font_of(ha) <> hf then goto found2 + else begin init_list:=ha; init_lig := false; hu[0]:=get_char_of(ha); + end +end else if type(ha)=ligature_node then + if font(lig_char(ha))<>hf then goto found2 + else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1); +@z + +========================================================================= + +MAIN CHANGE 3) + +unhinge all "dirty umlauts". + +@x +common_ending: flush_node_list(r); +@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>; +flush_list(init_list) +@y +common_ending: +qq:=hold_r; +for kk:={1}j to hn do if dirty_umlaut[kk] <> null then begin + while link(qq) <> dirty_umlaut[kk] do qq := link(qq); + qr := link(qq); + for i:=1 to replace_count(qr) do + if qr<>null then qr:=link(qr) + else begin {test:} + si_put_ln('...??..X --> ????? !'); + end; {:test} + if qr<>null then begin + link(qq):=link(qr); link(qr):=null; + end else link(qq):=null; +end; +if dirty_umlaut[-1]<>null then begin + qq:=hold_r; + while (link(qq)<>dirty_umlaut[-1])and(link(qq)<>null) do qq:=link(qq); + if link(qq)=dirty_umlaut[-1] then begin + link(qq):=link(dirty_umlaut[-1]); + link(dirty_umlaut[-1]):=null; + end else begin + si_put(' *** ERROR: node list is damaged! '); + si_put_ln('(post hyphenation - unhinge a whatsit node)'); + end; +end; +{} +r:=hold_r; +while link(r)<>null do begin + if (mem_min<=link(r))and(link(r)<=mem_max) then r:=link(r) + else begin + wlog_cr; wterm_cr; + wlog_ln('???$ - ERROR in node list!'); + wterm_ln('???$ - ERROR in node list!'); + kk:=depth_threshold; l:=breadth_max; + depth_threshold:=100; breadth_max:=100; + show_node_list(hold_r); + link(r):=null; + depth_threshold:=kk; breadth_max:=l; + end; +end; +{} +flush_node_list(hold_r); +@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>; +flush_list(init_list) +@z + +------------------------------------------------------------------------ + +Another odd->inf_penalty change (this time only textual). + +@x +If there exists an index |k| in the range $j\le k\le m$ such that |hyf[k]| +is odd and such that the result of |reconstitute| would have been different +if $x_{k+1}$ had been |hchar|, then |reconstitute| sets |hyphen_passed| +to the smallest such~|k|. Otherwise it sets |hyphen_passed| to zero. +@y +If there exists an index |k| in the range $j\le k\le m$ such that +|hyfpen[k]<>inf_penalty| and such that the result of |reconstitute| +would have been different if $x_{k+1}$ had been |hchar|, then |reconstitute| +sets |hyphen_passed| to the smallest such~|k|. Otherwise it sets +|hyphen_passed| to zero. +@z + +------------------------------------------------------------------------- + +In the reconstitute function, we set the boundary value n immediately +before the next "dirty umlaut" by a simple for-loop starting at the +original n. + +@x +begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null; +@y +@!ii:small_number; +begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null; +for ii:=n downto j do + if dirty_umlaut[ii] <> null then n:=ii-1; +@z + +------------------------------------------------------------------------- + +Another odd->inf_penalty change. + +@x + if odd(hyf[j]) then cur_rh:=hchar@+else cur_rh:=non_char; +@y + if hyfpen[j]<>inf_penalty then cur_rh:=hchar@+else cur_rh:=non_char; +@z + +========================================================================= + +A first change in the reconstitute function. + +@x + else begin if hchar<non_char then if odd(hyf[j]) then + begin hyphen_passed:=j; hchar:=non_char; + end; + if op_byte(q)<kern_flag then + @<Carry out a ligature replacement, updating the cursor structure +@y + else begin if hchar<non_char then if hyfpen[j]<>inf_penalty then + begin hyphen_passed:=j; hchar:=non_char; + end; + if op_byte(q)<kern_flag then + @<Carry out a ligature replacement, updating the cursor structure +@z + + +------------------------------------------------------------------------- + +Now we are in the post-hyphenation's main loop; here must append a +"dirty umlaut" to the growing node list. This is simply done by an +if-statement that checks for the presence of a "dirty umlaut" and +appends it. + +Moreover, we have another textual odd->inf_penalty change. + +@x +repeat l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1; +if hyphen_passed=0 then + begin link(s):=link(hold_head); + while link(s)>null do s:=link(s); + if odd(hyf[j-1]) then + begin l:=j; hyphen_passed:=j-1; link(hold_head):=null; + end; + end; +if hyphen_passed>0 then + @<Create and append a discretionary node as an alternative to the + unhyphenated word, and continue to develop both branches until they + become equivalent@>; +until j>hn; +link(s):=q + +@ In this repeat loop we will insert another discretionary if |hyf[j-1]| is +odd, when both branches of the previous discretionary end at position |j-1|. +@y +if dirty_umlaut[-1]<>null then begin + {hook in the previous saved whatsit node before the first + character of the hyphenated word} + link(s):=dirty_umlaut[-1]; + s:=link(s); +end; +repeat + if dirty_umlaut[j]<>null then begin + link(s):=dirty_umlaut[j]; + while link(s)>null do s:=link(s); + link(hold_head):=null; + j:=j+1; hyphen_passed:=0; + if hyfpen[j-1]<>inf_penalty then begin + l:=j; hyphen_passed:=j-1; + si_debug(16) + si_put_ln(' *** append a hyphen immediatly after a dirty umlaut!'); + gubed_si; + end; + end else begin + l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1; + if hyphen_passed=0 then begin + link(s):=link(hold_head); + while link(s)>null do s:=link(s); + if hyfpen[j-1]<>inf_penalty then begin + l:=j; hyphen_passed:=j-1; link(hold_head):=null; + end; + end; + end; {if dirty_umlaut[j]<>null then-else} + if hyphen_passed>0 then + @<Create and append a discretionary node as an alternative to the + unhyphenated word, and continue to develop both branches until they + become equivalent@>; +until j>hn; +link(s):=q; +si_q:=s; {save the last node of the hyphenated word for debugging output} +for j:=0 to 64 do if hyf_disc[j]<>null then begin + flush_node_list( hyf_disc[j]); +end + +@ In this repeat loop we will insert another discretionary if +|hyfpen[j-1]<>inf_penalty|, when both branches of the previous +discretionary end at position |j-1|. +@z + +========================================================================= + +Another odd->inf_penalty change. + +@x +hyphen_passed:=j-1; link(hold_head):=null; +until not odd(hyf[j-1]) +@y +hyphen_passed:=j-1; link(hold_head):=null; +until (hyfpen[j-1]=inf_penalty) +@z + +========================================================================= + +Here comes the big reconstitution action (cheers to Heini!). + +@x +@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>= +minor_tail:=null; pre_break(r):=null; hyf_node:=new_character(hf,hyf_char); +if hyf_node<>null then + begin incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node); + end; +while l<=i do + begin l:=reconstitute(l,i,font_bchar[hf],non_char)+1; + if link(hold_head)>null then + begin if minor_tail=null then pre_break(r):=link(hold_head) +@y +As the value of |hyfpen[i]| is necessary for creating a penalty node, +we must create this node before we ``kill'' the hyphenation information in +|hyfpen[i]| by assigning |inf_penalty|. |minor_tail| contains the +pointer to the penalty node or |null|, if no such node has been created. + +@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>= +if (hyfpen[i]<>inf_penalty) and (hyfpen[i]<>hyphen_penalty) + then minor_tail:=new_penalty(hyfpen[i]) + else minor_tail:=null; +hyfpen[i]:=inf_penalty; +pre_break(r):=minor_tail; + +hyf_node:=new_character(hf,hyf_char); +{Exchange |pre_break|-list of the selfbuilt |disc_node| with |hu|} +xchg_k:=i; +if hyf_disc[xchg_k]<>null then begin + spec_hyf:=pre_break(hyf_disc[xchg_k]); + add_char:=subtype(spec_hyf); + xchg_i:=1; + repeat + spec_hyf:=link(spec_hyf); + if spec_hyf<>null then begin + xchg_char[xchg_i]:=qo(character(spec_hyf)); + incr(xchg_i); + end;{if} + until spec_hyf=null; + if hyf_node<>null then begin + xchg_char[xchg_i]:=hyf_char; + free_avail(hyf_node); + end else decr(xchg_i); + xchg_hu:=i-xchg_i+add_char+2; {this is the index of |hu| where the first + character is replaced by a character of the + |pre_break|-list of |spec_hyf|} + for xchg_k:=1 to xchg_i do begin + xchg_char[0]:=hu[xchg_hu]; + hu[xchg_hu]:=xchg_char[xchg_k]; + xchg_char[xchg_k]:=xchg_char[0]; + incr(xchg_hu); + end; {|for|} + xchg_k:=i; + i:=xchg_hu-1; + xchg_hu:=xchg_hu-xchg_i; +end {|if hyf_disc[]<>null|} +else if hyf_node<>null then begin + incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node); +end; +while l<=i do begin + l:=reconstitute(l,i,font_bchar[hf],non_char)+1; + if link(hold_head)>null then + begin if minor_tail=null then pre_break(r):=link(hold_head) +@z + +------------------------------------------------------------------------- + +... continued: + +@x +if hyf_node<>null then + begin hu[i]:=c; {restore the character in the hyphen position} + l:=i; decr(i); + end + +@y + if hyf_disc[xchg_k]<>null then begin +{ Restore the original word in |hu| } + i:=xchg_k; l:=i+1; + for xchg_k:=1 to xchg_i do begin + hu[xchg_hu]:=xchg_char[xchg_k]; + incr(xchg_hu); + end;{for} + end else if hyf_node<>null then begin + hu[i]:=c; {restore the character in the hyphen position} + l:=i; decr(i); + end + +@z + +========================================================================= + +MAIN CHANGE 1) + +Finally, we come to the SISISI hyphenation. At first, we define two +variables: + +@x +@ Assuming that these auxiliary tables have been set up properly, the +@y +@!funktioniert: boolean; +@!zerleg: integer; + +@ Assuming that these auxiliary tables have been set up properly, the +@z + +------------------------------------------------------------------------- + +And off we go; at first only slowly, ... + +@x +@<Find hyphen locations for the word in |hc|...@>= +@y +{\sl Here, the German Hyphenation of W.Barth and H.Nirschl has been added!} + + +@<Find hyphen locations for the word in |hc|...@>= +@z + +------------------------------------------------------------------------- + +... but now we kill all of Liang's code and replace it by some re- and +back-en- and decoding, a call to abteilen, and the construction of the +special discretionaries. Then we go right into the SISISI hyphenation. +========================================================================= +@x +if trie_char(cur_lang+1)<>qi(cur_lang) then return; {no patterns for |cur_lang|} +hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=256; {insert delimiters} +for j:=0 to hn-r_hyf+1 do + begin z:=trie_link(cur_lang+1)+hc[j]; l:=j; + while hc[l]=qo(trie_char(z)) do + begin if trie_op(z)<>min_quarterword then + @<Store \(m)maximum values in the |hyf| table@>; + incr(l); z:=trie_link(z)+hc[l]; + end; + end; +found: for j:=0 to l_hyf-1 do hyf[j]:=0; +for j:=0 to r_hyf-1 do hyf[hn-j]:=0 + +@ @<Store \(m)maximum values in the |hyf| table@>= +begin v:=trie_op(z); +repeat v:=v+op_start[cur_lang]; i:=l-hyf_distance[v]; +if hyf_num[v]>hyf[i] then hyf[i]:=hyf_num[v]; +v:=hyf_next[v]; +until v=min_quarterword; +end + +@ The exception table that is built by \TeX's \.{\\hyphenation} primitive is +@y + for j:=0 to hn do + hc_si[j] := ktab[hc[j]]; + si_debug(2) + si_put(' hc:'); + for j:=0 to hn do si_put( xchr[hc[j]] ); + si_put_ln(':'); + si_put(' hc_si:'); + for j:=0 to hn do si_put( xchr[rev_tab[hc_si[j]]] ); + si_put_ln(':'); + gubed_si; + si_debug(4) + si_put_ln('< decimal character codes >'); + si_put(' hc:'); + for j:=0 to hn do begin + si_put(hc[j]:3,'-'); + if ((j+1) mod 16)=0 then begin + si_put_cr; si_put(' '); + end; + end; + si_put_cr; + si_put(' hc_si:'); + for j:=0 to hn do begin + si_put( rev_tab[hc_si[j]]:3,'-' ); + if ((j+1) mod 16)=0 then begin + si_put_cr; si_put(' '); + end; + end; + si_put_cr; si_put_cr; + gubed_si; + + abteilen(hc_si,hyf_si,hn,funktioniert,zerleg); + for j:=0 to 64 do begin + hyf_disc[j]:=null; hyfpen[j]:=inf_penalty; + end; + if funktioniert then + for j:=0 to hn do begin + if hyf_si[j]=neben then hyfpen[j] := neben_hyphen_penalty + else if hyf_si[j]=haupt then hyfpen[j] := hyphen_penalty + else if hyf_si[j]=nebenck then begin + hyfpen[j+1] := neben_hyphen_penalty; + s:=get_node(small_node_size); {discretionary node erzeugen} + type(s):=disc_node; + hyf_disc[j+1]:=s; + {|pre_break|-Liste: } + pre_break(s):=new_penalty(neben_hyphen_penalty); s:=pre_break(s); + subtype(s):=0; { number of additional characters } + link(s):=new_character(hf,hu[j+2]); {'k' oder'K'} + link(link(s)):=null; + s:=hyf_disc[j+1]; + post_break(s):=null; link(s):=null; + end + else if hyf_si[j]=haupt3 then begin + hyfpen[j-1]:=hyphen_penalty; + s:=get_node(small_node_size); {discretionary node erzeugen} + type(s):=disc_node; + hyf_disc[j-1]:=s; + {|pre_break|-Liste: } + pre_break(s):=new_penalty(hyphen_penalty); s:=pre_break(s); + subtype(s):=1; + link(s):=new_character(hf,hu[j]); { Dreifachkonsonant } + link(link(s)):=null; + {|post_break|- und |link|-Liste: } + s:=hyf_disc[j-1]; + post_break(s):=null; + link(s):=null; + end + end; {|if funktioniert|} + si_debug(8) + if funktioniert then begin + for j:=0 to hn do + if hyfpen[j]<>inf_penalty then begin + if hyf_disc[j]<>null then begin + if subtype(pre_break(hyf_disc[j]))=0 then + si_put( xchr[hu[j+1]], '-' ) + else {if subty...} + si_put( xchr[hu[j+1]], xchr[hu[j+1]], '=' ); + { i hope so } + end else begin + si_put( xchr[hu[j]] ); + if hyfpen[j]=hyphen_penalty then + si_put('=') + else si_put('-'); + end; + end else begin + si_put( xchr[hu[j]] ); + end; + end else begin + si_put_ln(' no hyphens were found in this word!'); + end; + si_put_cr; + gubed_si; + goto done1; + +found: +hyfpen[0]:=inf_penalty; +for j:=1 to hn do + if odd(hyf[j]) then hyfpen[j]:=hyphen_penalty + else hyfpen[j]:=inf_penalty; + +done1: + +@ Das folgende Modul ersetzt die gesamte Liang'sche Trennung. Aufgabe +dieses Modules ist es, ein in hc (ein Array of 0..255 ) liegendes Wort +nach Trennstellen zu untersuchen und die gefundenen Trennstellen in +hyf (ebenfalls ein Array of neben...) an den entsprechenden Stellen +einzutragen. Die genaue Beschreibung der Vorgangsweise findet man im +INSTITUTSBERICHT NR. 26, TECHNISCHE UNIVERSIT\"AT WIEN, INSTITUT +F\"UR PRAKTISCHE INFORMATIK. + +Alle Prozeduren f\"ur die Silbentrennung \SISISI, die bei jedem +Start von TeX aufgerufen werden. + +@ Dieser Modul beinhaltet alle f\"ur die neue Silbentrennung |abteilen| +n\"otigen Initialisierungen bzw. Prozeduren, die nur einmal am Anfang +ausgef\"uhrt werden sollen. + +@<Set initial values of ...@>= + inittrennen; + +@ @<Constants in the outer block@>= + maxwl = 64; { Maximale Wortlaenge } + sonderzeichen= 0; + bst_a= 1; bst_b= 2; bst_c= 3; bst_d= 4; bst_e= 5; bst_f= 6; bst_g= 7; + bst_h= 8; bst_i= 9; bst_j=10; bst_k=11; bst_l=12; bst_m=13; bst_n=14; + bst_o=15; bst_p=16; bst_q=17; bst_r=18; bst_s=19; bst_t=20; bst_u=21; + bst_v=22; bst_w=23; bst_x=24; bst_y=25; bst_z=26; bst_ae=27; + bst_oe=28; bst_ue=29; bst_sz=30; trennzeichen=31; + keine = 1; neben = 2; nebenck = 3; haupt = 4 ; haupt3 = 5; + + tabsize = 8191; { 2**13 - 1 } + spec_letter_ID = 4321; + { const definitionen } + vok_a = 1; + vok_e = 2; + vok_i = 3; + vok_o = 4; + vok_u = 5; + vok_ae = 6; + vok_oe = 7; + vok_ue = 8; + vok_ie = 9; + vok_ai = 10; + vok_ei = 11; + vok_au = 12; + vok_aeu= 13; + vok_eu = 14; + vok_y = 15; + kons = 16; + +@ +@<Types in the outer block@>= + string80 = packed array [0..80] of eight_bits; + buchstabe = eight_bits; + a_word = array[0..maxwl] of 0..256; + wort = a_word; + sperrvektor=array [0..maxwl] of boolean; + dudt=array [0..maxwl] of boolean;{frueher kein type !!} + { trennung = (keine, neben, nebenck, haupt, haupt3); } + trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==> + zwischen Buchstabe i und i+1 wird getrennt } + ktabtype = packed array [0..255] of buchstabe; + verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C } + varr = array [0..maxwl] of verdschlue; + intarr = array [0..maxwl] of integer; + + { darf nicht als var Parameter uebergeben werden !!} + infotype = record + { frueher ein variantenRecord } + ausnahme:boolean; + untrennbar:boolean; + { erste :0..7; + zweite:0..7; } + erste :integer; + zweite:integer; + endung,vorsilbe,stamm,ehervor,stammallein:boolean; + end; + + infobyte = eight_bits; + + { darf nicht als var Parameter uebergeben werden !!} + tableentry=record + tabv:verdschlue; + tabb:infobyte; + frei:boolean; + wiederfrei:boolean; + end; + + hashelement = packed array [0..3] of eight_bits; + htabtype = packed array [0..tabsize] of hashelement; + +@ +@<Global variables@>= + ktab : ktabtype; + htab : htabtype; + anzahl : integer; + hashfile : alpha_file; + kombtab : array [1..5, 1..5] of integer; + konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]} + rev_tab: array[0..255]of integer; + + +@ Prozedurdefinitionen + +function dig_count( v: integer): integer; + { calculates the number of decimal digits of ``v'' } + var x, e, c: integer; +begin + x := v div 10; e:=1; c:=1; + while e<=x do begin + e := e * 10; incr(c); + end; + dig_count:=c; +end; + +@<Handling of dirty umlauts@>= + +procedure hashfunk (var w:wort; anfang,ende:integer; + var v:varr; var ind,k:intarr ); + + { -PRAK!- in C long statt integer } + var vacc, indacc, kacc : integer; + i : integer; +begin + vacc := 31415; indacc := 152; kacc := 271; +dbg_put_ln(' * HFNC ='); + for i := anfang to ende do begin +dbg_put(' * HFNC ',i-anfang:3,' A'); + vacc := (vacc * 31 + w [i]) mod 8388648; +dbg_put('B'); + v[i] := vacc; +dbg_put('C'); + indacc := (indacc * 33 + w[i]) mod (tabsize+1); +dbg_put('D'); + ind[i] := indacc; +dbg_put('E'); + kacc := (kacc * 15 + w[i]) mod ((tabsize+1) div 2); +dbg_put('F'); + k[i] := 2*kacc + 1; +dbg_put_ln('G'); + end; {|for|} +end; {|hashfunk|} + +procedure unpackinfo ( b:infobyte; + { var i:infotype } + var iausnahme :boolean; + var iuntrennbar :boolean; + var ierste :integer; + var izweite :integer; + var iendung :boolean; + var ivorsilbe :boolean; + var istamm :boolean; + var iehervor :boolean; + var istammallein:boolean ); +begin + { with i do begin } + if odd(b) then begin { 87654321 } + iausnahme:= true; + b:= b div 2; { 08765432 } + if odd(b) then iuntrennbar:= true + else iuntrennbar:= false; + b:=b div 2; { 00876543 } + ierste := b mod 8; { 00876xxx } + izweite := b div 8; { 00000876 } + end else begin + iausnahme:= false; { 87654321 } + b:= b div 2; { 08765432 } + if odd(b) then iendung:= true + else iendung:= false; + b:= b div 2; { 00876543 } + if odd(b) then ivorsilbe:= true + else ivorsilbe:= false; + b:= b div 2; { 00087654 } + if odd(b) then istamm:= true + else istamm:= false; + b:= b div 2; { 00008765 } + if odd(b) then iehervor:= true + else iehervor:= false; + b:= b div 2; { 00000876 } + if odd(b) then istammallein:= true + else istammallein:= false; + end; {|if-then-else|} + { end; |with|} +end; {|unpackinfo|} + + +procedure unpackentry( h:hashelement; + { var e:tableentry } + var etabv:verdschlue; + var etabb:infobyte; + var efrei:boolean; + var ewiederfrei:boolean ); +begin + { with e do begin } +dbg_put_cr; +dbg_put(' ==> UPCKNTY 1'); + etabv:= h[0]+h[1]*256+h[2]*256*256; +dbg_put(' 2'); + if odd(h[3]) then begin { Ausnahme } +dbg_put(' 3 A'); + etabb:= h[3]; +dbg_put('1'); + efrei:= false; + ewiederfrei:= false; + end + else begin +dbg_put(' 3 B'); + etabb:= h[3] mod 64; +dbg_put('1'); + { h[3]:=h[3] div 64;} {-PRAK!- in C ein var-Paramter, darf daher + nicht ver„ndert werden. } +dbg_put('2'); + { durch folgende 2 Abfragen ersetzt. -PRAK!- } + if odd(h[3] div 64) then efrei := true + else efrei := false; + if odd(h[3] div 128) then ewiederfrei := true + else ewiederfrei := false; + end; +dbg_put_ln('- 4'); + { end; |with|} +end; {|unpackentry|} + + +procedure hashsuch ( v:verdschlue; + ind,k : integer; + { var i:infotype; } + var iausnahme :boolean; + var iuntrennbar :boolean; + var ierste :integer; + var izweite :integer; + var iendung :boolean; + var ivorsilbe :boolean; + var istamm :boolean; + var iehervor :boolean; + var istammallein:boolean; + var g:boolean ); + +{ sucht Eintragung in der Hashtabelle, g ist TRUE falls gefunden } + var + gef,ngef:boolean; + j:integer; + entry : tableentry; + +begin + gef := false; ngef := false; j := ind; + repeat + unpackentry(htab[j],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei); + if entry.frei then ngef := true + else if (v = entry.tabv) and not entry.wiederfrei then begin + unpackinfo(entry.tabb,iausnahme,iuntrennbar,ierste,izweite, + iendung,ivorsilbe,istamm,iehervor,istammallein); + gef := true; + end else + j := (j+k) mod (tabsize + 1) + until gef or ngef; + g := gef; +end; {|hashsuch|} + + +procedure hashload ( var status:integer ); +{ einlesen der Hash-Tabelle von file fn } + var i : integer; + e : tableentry; +begin + { Orginal sitex3.cha -PRAK!- + for i:=1 to file_name_size do name_of_file:= ' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length := 3; + anzahl := 0; + if a_open_in(hashfile) then begin + } + + { geaendert !! -PRAK!- } + for i:=1 to file_name_size do name_of_file[i]:= ' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length := 3; + anzahl := 0; + { -PRAK!- texinputpath fr C notwendig } + if a_open_in(hashfile, TEX_INPUT_PATH) then begin + for i := 0 to tabsize do begin + { -PRAK!- in C Probleme mit den typen beim einlesen } + read (hashfile, htab[i][0]); { htab = packed array [0..tabsize] of } + read (hashfile, htab[i][1]); { hashelement, und } + read (hashfile, htab[i][2]); { hashelement = packed array 0..3 } + read (hashfile, htab[i][3]); + unpackentry (htab[i],e.tabv,e.tabb,e.frei,e.wiederfrei); + if not e.frei and not e.wiederfrei then anzahl := anzahl + 1; + end; {|for|} + status:= 0; + a_close(hashfile); + end else status:= 1; +end; {|hashload|} + + +procedure inittrennen; + var ch: 0..255; + bst: buchstabe; + i, status: integer; + is_iniTeX: boolean; +begin + { Konversionstabelle |ktab| initialisieren } + { ======================================== } + + for ch := 0 to 255 do begin + + { if (ch in [" ",",",";",":","-","/","?","!","(",")",".","""","'","^"]) then } + + case ch of + " ",",",";",":","-","/","?","!","(",")",".","""","'","^": + + if ch="." then ktab[ch]:= "." + else ktab[ch] := trennzeichen + { else ktab[ch] := sonderzeichen geht nicht !!} + end; { case } + +if (ktab[ch] <> ".") and (ktab[ch] <> trennzeichen) then ktab[ch] := sonderzeichen; + + end; { for } + for bst := bst_a to bst_z do begin + ktab[ord('A')+ord(bst)-ord(bst_a)]:=bst; + ktab[ord('a')+ord(bst)-ord(bst_a)]:=bst + end; + + { Umlaute und scharfes s - f\"ur ``production \TeX version'' } + ktab[255]:=bst_sz; + ktab[246]:=bst_oe; + ktab[252]:=bst_ue; + ktab[228]:=bst_ae; + + { Umlaute und scharfes s - f\"ur ``initialization \TeX version'' } + ktab["1"]:=bst_sz; + ktab["2"]:=bst_ue; + ktab["3"]:=bst_oe; + ktab["4"]:=bst_ae; + ktab[25]:=bst_sz; {?-wieso? HH} + +{testing:} +for i:=0 to 255 do rev_tab[ktab[i]]:=i; +rev_tab[ktab[255]]:=223; +xchr[223]:=chr(223); xchr[228]:=chr(228); xchr[246]:=chr(246); +xchr[252]:=chr(252); xchr[255]:=chr(223); xchr[ 25]:=chr(223); +{:end of testing} + + { Kombinationstabelle |kombtab| initialisieren } + { ============================================ } + { Diese Tabelle muss symetrisch sein, + kombtab[a,b] = kombtab[b,a] } + kombtab[ keine, keine] := keine; + kombtab[ keine, neben] := keine; + kombtab[ keine,nebenck] := keine; + kombtab[ keine, haupt] := keine; + kombtab[ keine, haupt3] := keine; + + kombtab[ neben, keine] := keine; + kombtab[ neben, neben] := neben; + kombtab[ neben,nebenck] := keine; + kombtab[ neben, haupt] := neben; + kombtab[ neben, haupt3] := keine; + + kombtab[nebenck, keine] := keine; + kombtab[nebenck, neben] := keine; + kombtab[nebenck,nebenck] := nebenck; + kombtab[nebenck, haupt] := keine; + kombtab[nebenck, haupt3] := keine; + + kombtab[ haupt, keine] := keine; + kombtab[ haupt, neben] := neben; + kombtab[ haupt,nebenck] := keine; + kombtab[ haupt, haupt] := haupt; + kombtab[ haupt, haupt3] := keine; + + kombtab[ haupt3, keine] := keine; + kombtab[ haupt3, neben] := keine; + kombtab[ haupt3,nebenck] := keine; + kombtab[ haupt3, haupt] := keine; + kombtab[ haupt3, haupt3] := haupt3; + + { Konsonantentabelle initialisieren } + for bst:=bst_a to bst_sz do konsonant[bst] := true; + konsonant[bst_a] := false; + konsonant[bst_e] := false; + konsonant[bst_i] := false; + konsonant[bst_o] := false; + konsonant[bst_u] := false; + konsonant[bst_ae] := false; + konsonant[bst_oe] := false; + konsonant[bst_ue] := false; + + +{ ================== Hashtabelle |htab| initialisieren ====================== + +Die Prozedur ``hashload'' darf im Initialisierungslauf von TeX auf +keinen Fall aufgerufen werden. Deshalb wird zun\"achst festgestellt, ob +dieser Programmlauf ein Initialisierungslauf ist oder nicht. Abh\"angig +davon wird ``hashload'' nur aufgerufen, wenn dies ein ``Arbeits''-lauf +(production-version) von \TeX ist. + +=============================================================================} + is_iniTeX:=false; + init is_iniTeX:=true; tini + if not is_iniTeX then begin + hashload(status); + if status <> 0 then begin + si_put_cr; + si_put_ln +(' * * * * * * * * * *!'); + si_put_ln('**** ERROR: Can not read hash-file!'); + si_put_cr; + jump_out; + end; + end; {|not iniTeX|} +end; {|inittrennen|} + + +procedure packinfo ( i:infotype; var b : infobyte ); +{ Byte: /zweite/zweite/zweite/erste/erste/erste/untrennbar/ausnahm/ } +{ bzw.: /0 /0 /stall /eherv/stamm/vors /endung /0 / } + +begin + b:=0; +dbg_put_cr; + { with i do begin } + if i.ausnahme then +begin +dbg_put(' ### PCKINF 1A utr:'); +if i.untrennbar then dbg_put('Y') else dbg_put('N'); +dbg_put_ln(',',ord(i.untrennbar):3,' 1.',i.erste:3,' 2.',i.zweite:3); + b:=1+2*ord(i.untrennbar)+4*i.erste+32*i.zweite +; dbg_put('B'); +end + else +begin +dbg_put(' ### PCKINF 2A'); + b:= 2*ord(i.endung)+4*ord(i.vorsilbe)+8*ord(i.stamm)+16*ord(i.ehervor) + +32*ord(i.stammallein); +dbg_put('B'); +end; + { end; with } +dbg_put_ln('-3'); +end; {|packinfo|} + +procedure packentry( e:tableentry; var h:hashelement ); +{ /infobyte+frei,wiederfrei/verdschhigh/verdschmiddle/verdschllow/ } + +begin + { with e do begin } +dbg_put_cr; +dbg_put(' +++ PCKNTY A'); + h[0]:= e.tabv mod 256; { 87654321abcdefghxxxxxxxx} +dbg_put('B'); + e.tabv:= e.tabv div 256; { 0000000087654321abcdefgh} +dbg_put('C'); + h[1]:= e.tabv mod 256; { 0000000087654321xxxxxxxx} +dbg_put('D'); + h[2]:= e.tabv div 256; { 000000000000000087654321} + +dbg_put('E'); + if odd(e.tabb) then h[3]:= e.tabb { Ausnahme !! } + else +begin +dbg_put('F1'); + h[3]:=e.tabb+64*ord(e.frei)+128*ord(e.wiederfrei); { wfxxxxxx } +dbg_put('-2'); +end; +dbg_put_ln('G'); + { end; |with|} +end; {|packentry|} + + + +procedure hashetr ( var w:wort; laenge:integer; i:infotype; + var g:boolean ); + + var v1: varr; + ind1, k1: intarr; + v: verdschlue; + ind, k, j, e: integer; + gef,ngef:boolean; + entry: tableentry; + helem: hashelement; + +begin +dbg_put_ln(' ** HTR 1'); + if anzahl >= tabsize then begin +dbg_put_ln(' ** HTR 2a'); + g := false; + end + else begin +dbg_put_ln(' ** HTR 2b'); + if (anzahl < 10) or (anzahl mod 100 = 0) then begin + si_put_cr; si_put(' -Anzahl:',anzahl,'. '); + end; +dbg_put_ln(' ** HTR 3'); + hashfunk(w,1,laenge,v1,ind1,k1); +dbg_put_ln(' ** HTR 4'); + v := v1[laenge]; + ind := ind1[laenge]; + k := k1[laenge]; + gef := false; ngef := false; + repeat +dbg_put_ln(' ** HTR 5 A'); + unpackentry(htab[ind],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei); +dbg_put_ln(' ** HTR B'); + if entry.frei or entry.wiederfrei then begin + anzahl := anzahl + 1; + ngef := true; + entry.tabv := v; +dbg_put_ln(' ** HTR C1'); + packinfo (i,entry.tabb); +dbg_put_ln(' ** HTR D1'); + entry.frei := false; + entry.wiederfrei := false; +dbg_put_ln(' ** HTR E1'); + packentry(entry,helem); +dbg_put_ln(' ** HTR F1'); + htab[ind] := helem; { -PRAK!- in C memcpy() } + end else begin +dbg_put_ln(' ** HTR C2'); + gef := v = entry.tabv; + if not gef then ind := (ind+k) mod (tabsize + 1); +dbg_put_ln(' ** HTR D2'); + end; + until gef or ngef; +dbg_put_ln(' ** HTR 6'); + g := ngef; + end +end; {|hashetr|} + +procedure hashempty; + var i:integer; + elem : tableentry; + he : hashelement; +begin + { with elem do begin } + elem.tabv:=0; + elem.tabb := 0; { !!!!!! Irgend ein Affe hat diese Initialisierung vergessen. + ( Und dies ist eine Beleidigung fuer jeden Affen ) HM } + elem.frei := true; + elem.wiederfrei := false; + { end; } + packentry (elem, he); + for i := 0 to tabsize do htab[i] := he; { -PRAK!- in C memcpy() } + anzahl := 0; +end; {|hashempty|} + +procedure hashsave (var status:integer); +{ abspeichern der Hash-Tabelle auf file } + var i: integer; +begin + for i:=1 to file_name_size do name_of_file[i]:=' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length:=3; + if a_open_out(hashfile) then begin + for i := 0 to tabsize do begin + write (hashfile, htab[i][0]:4); + write (hashfile, htab[i][1]:4); + write (hashfile, htab[i][2]:4); + write (hashfile, htab[i][3]:4); + write_ln (hashfile); + end; + status:=0; + a_close(hashfile); + end else status:=1; +end; {|hashsave|} + + +function hashsize :integer; +begin + hashsize:=anzahl; +end; + + +procedure zahl(line:string80;var i:integer; ende:integer; var j:integer); + var aus: boolean; +begin + j:=0; + repeat + if i<=ende then + if ktab[line[i]]="." then i:=i+1 + else aus:=true + else aus:=true + until aus; + repeat + if i<=ende then begin + { if line[i] in ["0".."9"] then begin } + case line[i] of + "0","1","2","3","4","5","6","7","8","9": + begin j:=10*j+line[i]-"0";i:=i+1 + end; + { else aus:=true geht nicht !!! } + end; + if (line[i] <> "0") and + (line[i] <> "1") and + (line[i] <> "2") and + (line[i] <> "3") and + (line[i] <> "4") and + (line[i] <> "5") and + (line[i] <> "6") and + (line[i] <> "7") and + (line[i] <> "8") and + (line[i] <> "9") then aus :=true; + end else aus:=true + until aus; +end; {|zahl|} + + +procedure infobau(line: string80; anfang,ende: integer; + { var inform: infotype;} + var informausnahme :boolean; + var informuntrennbar :boolean; + var informerste :integer; + var informzweite :integer; + var informendung :boolean; + var informvorsilbe :boolean; + var informstamm :boolean; + var informehervor :boolean; + var informstammallein:boolean; + var g: boolean); + + var i,j:integer;ok,fehler:boolean; + b:buchstabe; +begin + g:=false; + { with inform do begin } { initialisierung } + informausnahme:=false; + informendung:=false; + informvorsilbe:=false; + informehervor:=false; + informstamm:=false; + informstammallein:=false; + i:=anfang; ok:=false; fehler:=false; + repeat + if i<=ende then + if line[i]="." then i:=i+1 else ok:=true + else fehler:=true + until ok or fehler; + if not fehler then begin + b:=ktab[line[i]]; + if b = bst_a then begin + {ausnahme} + informausnahme:=true; + i:=i+1; + if ktab[line[i]] = bst_u then begin + i := i + 1; informuntrennbar := true; + end else informuntrennbar := false; + zahl(line,i,ende,j); + if j=0 then begin + informerste:=7; informzweite:=7; + { Record-komponente ``zweite'' wird } + { initialisiert, damit beim packen keine } + { undefinierten Ergebnisse entstehen (die u.U. zu } + { RUN-TIME-ERRORS f\"uhren k\"onnen!) } + end else begin + j:=j-2; + if (j>=0) and (j<=6) then informerste:=j + else fehler:=true; + zahl(line,i,ende,j); + if j=0 then informzweite:=7 + else begin + j:=j-informerste-4; + if (j>=0) and (j<=6) then informzweite:=j + else fehler:=true; + end; + end; + if not fehler then g:=true; + end {|if b = bst_a |} + else begin + ok:=false; + repeat + case b of + {bst_v} 22: informvorsilbe:=true; + {bst_e} 5: informendung:=true; + {bst_s} 19: informstamm:=true; + {bst_b} 2: informehervor:=true; + {bst_t} 20: informstammallein:=true; + {trennzeichen} 31:; + othercases fehler:=true + endcases; + if i=ende then ok:=true + else begin + i:=i+1; + b:=ktab[line[i]] + end + until ok or fehler; + if not fehler then + g := (informvorsilbe or informendung or informstamm) + and (not informehervor or informvorsilbe and informendung) + and (not informstammallein or informstamm); + end; {|if b = bst_a then-else|} + end {|if not fehler|} + { end |with inform|} +end; {|infobau|} + + +procedure eintragen (line: string80; l: integer ); + var i, laenge: integer; + inform: infotype; + w: wort; + g: boolean; +begin + laenge := 1; + while line [laenge] <> "." do laenge := laenge + 1; + laenge := laenge -1; + if laenge >= 1 then begin + if laenge <= maxwl then begin + infobau(line,laenge+1,l, + inform.ausnahme,inform.untrennbar, + inform.erste,inform.zweite,inform.endung, + inform.vorsilbe,inform.stamm,inform.ehervor, + inform.stammallein,g); + + if not g then begin + si_put_cr; si_put(' Info falsch: ') + end else begin + for i:= 1 to laenge do w[i]:=ktab[line[i]]; + hashetr(w,laenge,inform,g); + if not g then begin + si_put_cr; si_put(' Tabellenfehler: '); + end; + end; + if not g then begin + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end + end {|if laenge <= maxwl|} + else begin + si_put_cr; si_put_ln(' zu langes Wort: '); + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end + end {|if laenge >= 1|} + else begin + si_put_cr; si_put_ln(' Falsche Zeile: '); + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end +end; {|eintragen|} + +{---------------------------------------------------------------------------} + +{ naechsterbst -> naechsterbst(i,tr,dudstop,b,w) } + +procedure naechsterbst(var i:integer;var tr:trennvektor; + var dudstop:sperrvektor;var b:buchstabe; + var w:wort); + begin + if (i>0) and (tr[i]=keine) and not dudstop[i] + then begin b:=w[i];i:=i-1 end + else b:=trennzeichen + end; +{---------------------------------------------------------------------------} +{ duden(tr) -> duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen) } + + procedure duden (tr:trennvektor; + var w:wort; + var tr1 :trennvektor; + var dudtr:trennvektor; + dud :dudt; { array [0..maxwl] of boolean; } + var dudstop:sperrvektor; + laenge : integer; + var ok :boolean; + var zerlegungen:integer ); + + { traegt in dudtr die Trennstellen nach Dudenregeln ein } + + { frueher mtype laut = (.....) } + + var i:integer; + j:integer; + zust:integer; + aus:boolean; + tre:integer; + letzte:integer; + l,lalt:integer;{ vormals laut } + b:buchstabe; + + + begin { duden } + i:=laenge; + for j := 0 to laenge do dudtr[j] := tr[j]; + while (i>0) and not dud [i] do i:=i-1; + while i>0 do begin + zust:=1; aus:=false; letzte := 0; + l:=kons; + b:=w[i]; + i:=i-1; + repeat + {naechsten Laut lesen} + { procedure nlaut; } + begin { nlaut } + tre:=i+1; + lalt:=l; + case b of + {bst_a } 1:begin l:=vok_a; naechsterbst(i,tr,dudstop,b,w) end; + {bst_o } 15:begin l:=vok_o; naechsterbst(i,tr,dudstop,b,w) end; + {bst_ue} 29:begin l:=vok_ue; naechsterbst(i,tr,dudstop,b,w) end; + {bst_oe} 28:begin l:=vok_oe; naechsterbst(i,tr,dudstop,b,w) end; + {bst_ae} 27:begin l:=vok_ae; naechsterbst(i,tr,dudstop,b,w) end; + {bst_e } 5:begin + l:=vok_e; naechsterbst(i,tr,dudstop,b,w); + if b = bst_i then begin + l:=vok_ie; + naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin + {ungetbst = } i := i + 1; + l:=vok_e; + b := bst_i; + end; + end + end; + {bst_i} 9:begin + l:=vok_i; naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin l:=vok_ei; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_a then begin l:=vok_ai; naechsterbst(i,tr,dudstop,b,w) end + end; + {bst_u} 21:begin + l:=vok_u; naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin l:=vok_eu; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_a then begin l:=vok_au; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_ae then begin l:=vok_aeu; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_q then begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end + end; + {bst_t} 20:begin + l:=kons; naechsterbst(i,tr,dudstop,b,w); + if b = bst_s then naechsterbst(i,tr,dudstop,b,w) + end; + {bst_h} 8:begin + l:=kons; naechsterbst(i,tr,dudstop,b,w); + if b = bst_c then begin + naechsterbst(i,tr,dudstop,b,w); + if b = bst_s then naechsterbst(i,tr,dudstop,b,w) + end + else if b = bst_p then naechsterbst(i,tr,dudstop,b,w) + else if b = bst_t then naechsterbst(i,tr,dudstop,b,w) + end; + {bst_b, bst_c, bst_d, bst_f, bst_g, bst_j, bst_k, bst_l, bst_m, + bst_n, bst_p, + bst_q, bst_r, bst_s, bst_v, bst_w, bst_x, bst_z, bst_sz } + + 2,3,4,6,7,10,11,12,13,14,16,17,18,19,22,23,24,26,30 : + + begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end; + {bst_y} 25:begin + l:=vok_y; + naechsterbst(i,tr,dudstop,b,w); + end; + {trennzeichen,sonderzeichen} + 31,0 :aus:=true + end; + end; { nlaut } + + if not aus then + {Naechster Zustand} + case zust of + 1:if l=kons then zust:=2 + else zust:=4; + 2:if l<>kons then zust:=3; + 3:if l=kons then zust:=6 + else if l<>lalt then begin + zust:=4; + letzte:=tre; + dudtr[letzte]:=neben + end; + 4:if l=kons then zust:=6 + else zust:=3; + 6:if l=kons then begin + zust:=2; + letzte:=tre; + if (w[tre]=bst_c) and (w[tre+1] = bst_k) then + dudtr[letzte]:=nebenck + else dudtr[letzte]:=neben + end + else begin + zust:=4; + letzte:=tre; + dudtr[letzte]:=neben + end + end + until aus; + if zust=2 then dudtr[letzte]:=keine + else if zust=4 then + { if not (lalt in [vok_ai,vok_ei,vok_au,vok_aeu,vok_eu,vok_ie]) then } + if (lalt < vok_ie) or (lalt > vok_eu) then + dudtr[letzte]:=keine; + while (i>0) and not dud[i] do i:=i-1 + end; + end { duden }; +{---------------------------------------------------------------------------} +{ procedure trennen (zustand : integer; anfang: integer; spv:sperrvektor; + var ok1 : boolean); +} + + procedure trennen ( + { trennen } + zustand : integer; + anfang : integer; + spv : sperrvektor; + var ok1 : boolean; + { abteilen } + var tr :trennvektor; + var dudtr:trennvektor; + var zerlegungen:integer ; + var dud:dudt; { array [0..maxwl] of boolean; } + var v:varr; + var ind,k:intarr; + var dudstop:sperrvektor; + { abteilen aufruf } + var w:wort; + var tr1:trennvektor; + laenge : integer ); + + { Zustand : 1 ... Es kann nur Vorsilbe oder Stamm kommen, + rechts muss noch ein Stamm kommen. + 2 ... Es kann Endung, Vorsilbe oder Stamm kommen. + 3 ... Es kann nur Vorsilbe oder Stamm kommen, im linken + Teil muessen noch Trennstellen eingefuegt werden, + rechts muss noch ein Stamm kommen. + 4 ... Es kann nur Vorsilbe oder Stamm kommen, im linken + Teil muessen noch Trennstellen eingefuegt werden. + 5 ... Trennstelle mit entfallenem Konsonanten } + + var + gef, nichtok:boolean; + schnitt:integer; + inform:infotype; + i:integer; + ok_stamm, ok_vor, ok_end, ok_help:boolean; + tri:integer; + { p_stamm } + i1,tre:integer; + ok : boolean; + stop_ptr :integer; + spvtmp :sperrvektor; { lokale Kopie des Sperrvektors, + fr die bersetzung nach C notwendig. + -PRAK!- } + + { procedure p_endung(var endok:boolean); } + + { procedure p_vorsilbe(var vorok:boolean); } + + { procedure p_stamm(var stok:boolean); } + + { procedure p_stammallein (var staok:boolean); } + + begin { trennen } + spvtmp := spv; + ok1:=false; + if anfang = laenge + 1 + then { Ende des Wortes erreicht} + if (zustand = 2) or (zustand=4) then {erfolgreich zerschnitten } + begin + dud[anfang-1]:=true; + + {duden(tr);} + duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen); + + for i := laenge downto 1 do + begin + if dudtr[i-1] = haupt3 then + begin + dudtr[i-1] := keine; + tri := haupt3; + end + else + tri := dudtr[i]; + + if zerlegungen = 0 then + tr1[i] := tri + else + tr1[i] := kombtab[tr1[i],tri]; + end; + zerlegungen:=zerlegungen+1; + ok1:= true + end + else { kein Stamm im Wortrest ok1 = false } + else { restlichen Teil zerschneiden } + begin + hashfunk (w,anfang,laenge,v,ind,k); + schnitt := laenge; + nichtok := false; + repeat + { links abschneiden } + repeat + if spv[schnitt] then { Schnittstelle gesperrt } + gef:=false + else + begin + hashsuch (v[schnitt],ind[schnitt],k[schnitt], + inform.ausnahme,inform.untrennbar, + inform.erste,inform.zweite,inform.endung, + inform.vorsilbe,inform.stamm,inform.ehervor, + inform.stammallein,gef); + end; + if gef then + spv[schnitt]:=true + else + schnitt := schnitt - 1 + until gef or (schnitt = anfang - 1); + + if gef then { teilwortanfang ist bekanntes wort } + begin + if not inform.ausnahme then + begin + if inform.endung and (zustand=2) then + begin + + { --- p_endung(ok_end); --- } + ok_end:=false; + if (w[anfang]=bst_c) or (w[anfang]=bst_h) then + begin + dud[anfang-1]:=true; + tr[anfang-1]:=neben + end; + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv[schnitt+1]:=true; + trennen (2, schnitt+2, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_end := ok_help + end; + trennen (2, schnitt+1, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_end := ok_end or ok_help; + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + { --- p_endung(ok_end) - ende --- } + + ok1 := ok1 or ok_end + end + else + ok_end:=false; + if inform.vorsilbe + then begin + + { --- p_vorsilbe(ok_vor); --- } + { Trennstelle(n) vor der Vorsilbe eintragen } + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt; + end; + { Trennstellen innerhalb der Vorsilbe eintragen } + dud[schnitt]:=true; + { Rest des Wortes zerschneiden } + trennen(1, schnitt+1, spv, ok_vor, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + dud[schnitt]:=false; + { --- p_vorsilbe(ok_vor) - ende --- } + + ok1 := ok1 or ok_vor + end + else + ok_vor := false; + if inform.stamm and not ok_vor + then begin + if not inform.stammallein + then begin + + { --- p_stamm(ok_stamm); --- } + ok_stamm := false; + stop_ptr := 0; + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt + end; + {ev. Ausnahmetrennstellen eintragen} + if inform.ausnahme then begin + if inform.erste<>7 then begin + tre:=anfang+inform.erste+1; + tr[tre]:=neben; + if inform.zweite<>7 then begin + tre:=tre+inform.zweite+2; + if inform.untrennbar then begin + stop_ptr := tre; + dudstop[stop_ptr] := true; + end + else + tr[tre]:=neben + end + else begin + if inform.untrennbar then begin + tr[tre] := keine; + stop_ptr := tre; + dudstop[tre]:=true; + end + end + end + else begin {inform.erste = 7} + stop_ptr := schnitt-1; + dudstop[stop_ptr] := true + end + end; + + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv [schnitt+1] := true; + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_help + end; + + { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts } + if (schnitt >=2) and (schnitt < laenge) then + if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and + (w[schnitt] = w[schnitt-1]) then begin + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + end; + + { restlichen Teil zerschneiden } + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + + { eingetragene Trennstellen entfernen } + if inform.ausnahme then + for i1:=anfang-1 to schnitt do + begin + tr[i1]:=keine; + dud[i1]:=false; + dudstop[stop_ptr] := false; + end + else begin + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + end; + { --- p_stamm(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end + else + if (anfang=1) and (schnitt=laenge) + then begin + + { --- p_stammallein(ok_stamm); --- } + dud[anfang-1]:=true; + tr[anfang-1]:=haupt; + trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + { --- p_stammallein(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end; + end + end + else begin + + { --- p_stamm(ok_stamm); --- } + ok_stamm := false; + stop_ptr := 0; + + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt + end; + {ev. Ausnahmetrennstellen eintragen} + if inform.ausnahme then begin + if inform.erste<>7 then begin + tre:=anfang+inform.erste+1; + tr[tre]:=neben; + if inform.zweite<>7 then begin + tre:=tre+inform.zweite+2; + if inform.untrennbar then begin + stop_ptr := tre; + dudstop[stop_ptr] := true; + end + else + tr[tre]:=neben + end + else begin + if inform.untrennbar then begin + tr[tre] := keine; + stop_ptr := tre; + dudstop[tre]:=true; + end + end + end + else begin {inform.erste = 7} + stop_ptr := schnitt-1; + dudstop[stop_ptr] := true; + end; + end; + + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv [schnitt+1] := true; + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_help + end; + + { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts } + if (schnitt >=2) and (schnitt < laenge) then + if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and + (w[schnitt] = w[schnitt-1]) then begin + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + end; + + { restlichen Teil zerschneiden } + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + + { eingetragene Trennstellen entfernen } + if inform.ausnahme then + for i1:=anfang-1 to schnitt do + begin + tr[i1]:=keine; + dud[i1]:=false; + dudstop[stop_ptr] := false; + end + else begin + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + end; + { --- p_stamm(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end; + + {naechsten Schleifendurchlauf vorbereiten} + schnitt := schnitt - 1; + nichtok := schnitt = anfang - 1 + end + else { kein bekanntes Wort am Beginn des Teilwortes } + nichtok := true; + + until nichtok + end; + spv := spvtmp; { spv wiederherstellen, fr die C Version. -PRAK!- } + end { trennen }; + +{----------------------------------------------------------------------------} + +procedure abteilen ( var w:wort; var tr1:trennvektor; + laenge : integer; var ok:boolean; + var zerlegungen:integer ); + + label 99; + + { kommt in den outer Block } + { mtype sperrvektor=array [0..maxwl] of boolean; } + + var + i:integer; + dud:dudt; { array [0..maxwl] of boolean; } + v:varr; + ind,k:intarr; + spv,dudstop:sperrvektor; + tr, dudtr:trennvektor; + + begin { abteilen } + tr1[0] := keine; + for i:=0 to laenge do begin + tr[i]:=keine; spv[i]:=false; dudstop[i]:=false; dud[i]:=false; + if i > 0 then + if (w[i] = trennzeichen) or (w[i] = sonderzeichen) + then begin + zerlegungen := 0; + ok := false; + goto 99; + end; + end; + zerlegungen:=0; + trennen(3, 1, spv, ok, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + + for i:=0 to laenge do + if tr1[i]=nebenck then begin + tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- } + tr1[i-1]:=nebenck; {sprechend getrennt wird } + end; +99: + end;{ abteilen } +{----------------------------------------------------------------------------} + + {identification number for dirty umlauts; see description in + change file} + + function is_dirty_umlaut(p:pointer):boolean; + var res:boolean; + q:pointer; + begin + res:=false; + if p<>null then + if type(p)=disc_node then + if pre_break(p)<>null then + if link(pre_break(p))<>null then + if link(link(pre_break(p)))<>null then begin + q:=pre_break(p); + if type(q)=penalty_node then q:=link(q); + if (type(q)=kern_node)and(width(q)=spec_letter_ID)and + is_char_node(link(q))and(type(link(link(q)))=kern_node) then res:=true; + end; + is_dirty_umlaut:=res; + end; {|is_dirty_umlaut|} + + function get_char_of(s:pointer):integer; + var q:pointer; + begin + q:=pre_break(s); + if type(q)=penalty_node then q:=link(q); + get_char_of:=width(link(link(q))); + end; {|get_char_of|} + + function get_font_of(s:pointer):integer; + var q:pointer; + begin + q:=pre_break(s); + if type(q)=penalty_node then q:=link(q); + get_font_of:=font(link(q)); + end; {|get_font_of|} + +{----------------------------------------------------------------------------} + +@ Ende ... +@z + +========================================================================= + +@x +@ Now let's go back to the easier problem, of building the linked +trie. When \.{INITEX} has scanned the `\.{\\patterns}' control +sequence, it calls on |new_patterns| to do the right thing. + +@<Declare procedures for preprocessing hyph...@>= +procedure new_patterns; {initializes the hyphenation pattern data} +label done, done1; +var k,@!l:small_number; {indices into |hc| and |hyf|} +@!digit_sensed:boolean; {should the next digit be treated as a letter?} +@!v:quarterword; {trie op code} +@!p,@!q:trie_pointer; {nodes of trie traversed during insertion} +@!first_child:boolean; {is |p=trie_l[q]|?} +@!c:ASCII_code; {character being inserted} +begin if trie_not_ready then + begin set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}} + @<Enter all of the patterns into a linked trie, until coming to a right + brace@>; + end +else begin print_err("Too late for "); print_esc("patterns"); + help1("All patterns must be given before typesetting begins."); + error; link(garbage):=scan_toks(false,false); flush_list(def_ref); + end; +end; +@y +@ We do not build a trie (wether a linked nor a packed). Instead, we +create a hash table for the \SISISI-hyphenation algorithm. But we +still use the data provided by the `\.{\\patterns}' primitive. + +@<Declare procedures for preprocessing hyph...@>= +procedure new_patterns; {initializes the hyphenation pattern data} + label done; + var k: small_number; {index into |zeile|} + @!zeile:string80; { Silbe <space> Type <,> als Eintrag der Hashtabelle } + @!status:integer; + @!c:ASCII_code; {character being inserted} +begin + if trie_not_ready then begin + set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}} + + hashempty; { create the empty hash table } + @<Enter all of the patterns into a hash table, until coming to a right + brace; then skip an optional space@>; + hashsave(status); + if status<>0 then begin + wterm_ln('Fehler bei hash save !!!!!'{?}); + wlog_ln( 'Fehler bei hash save !!!!!'{?}); + end; + end else begin + print_err("Too late for "); print_esc("patterns"); + help1("All patterns must be given before typesetting begins."); + error; link(garbage):=scan_toks(false,false); flush_list(def_ref); + end; +end; +@z + + +-------------------------------------------------------------------------- + + +@x +@ Novices are not supposed to be using \.{\\patterns}, so the error +messages are terse. (Note that all error messages appear in \TeX's string +pool, even if they are used only by \.{INITEX}.) + +@<Enter all of the patterns into a linked trie...@>= +k:=0; hyf[0]:=0; digit_sensed:=false; +loop@+ begin get_x_token; + case cur_cmd of + letter,other_char:@<Append a new letter or a hyphen level@>; + spacer,right_brace: begin if k>0 then + @<Insert a new pattern into the linked trie@>; + if cur_cmd=right_brace then goto done; + k:=0; hyf[0]:=0; digit_sensed:=false; + end; + othercases begin print_err("Bad "); print_esc("patterns"); +@.Bad \\patterns@> + help1("(See Appendix H.)"); error; + end + endcases; + end; +done: +@y +@ Here we build the hash table for the \SISISI-hyphenation. + +@<Enter all of the patterns into a hash table, until coming to a right...@>= +for k:=0 to maxwl do zeile[k]:=" "; +k:=0; +loop@+ begin + get_x_token; { \SISISI Worttabelle hat das Format 'Text.Type,'. + Der Beistrich wird eigens abgefragt, da er in TeX + umdefiniert werden kann. } + if (cur_cmd = right_brace)or(cur_chr = ",") then + begin + { Ein Eintrag der Worttabelle - letzter + (|cur_cmd|=|right_brace|) - gelesen } + if k>0 then eintragen(zeile,k); { ein Eintrag vorhanden } + if cur_cmd = right_brace then goto done; + k := 0; { hyf[] ist \"uberfl\"ussig, da die + Trenninformation in zeile mitverpackt ist. } + end + else { Das Wort ist noch nicht fertig gelesen } + if (cur_cmd = letter) or (cur_cmd = other_char) + or (cur_cmd = spacer) or (cur_chr = ".") + then begin + @<Append a new letter or a hyphen level@>; + end else begin + print_err("Bad "); print_esc("patterns"); +@.Bad \\patterns@> + help1("(See Appendix H.)"); error; + end; +end; {|loop|} +done: +@z + +----------------------------------------------------------------------------- + + +@x +@ @<Append a new letter or a hyphen level@>= +if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then + begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter} + else begin cur_chr:=lc_code(cur_chr); + if cur_chr=0 then + begin print_err("Nonletter"); +@.Nonletter@> + help1("(See Appendix H.)"); error; + end; + end; + if k<63 then + begin incr(k); hc[k]:=cur_chr; hyf[k]:=0; digit_sensed:=false; + end; + end +else if k<63 then + begin hyf[k]:=cur_chr-"0"; digit_sensed:=true; + end +@y +@ @<Append a new letter or a hyphen level@>= +if (cur_chr<>" ")then begin + { Das Leerzeichen wird \"uberlesen! } + if (cur_chr <> ".") then begin + { der Punkt trennt die Silbe von der Silbenart und bleibt erhalten } + if (cur_chr<"0")or(cur_chr>"9") then begin + cur_chr:=lc_code(cur_chr); + if cur_chr=0 then begin + print_err("Nonletter"); +@.Nonletter@> + help1("(See Appendix H.)"); error; cur_chr:=128; + end; + end; + end; + if k<63 then begin + incr(k); zeile[k]:=cur_chr; + end; +end; +@z + +---------------------------------------------------------------------------- + + +@x +@ When the following code comes into play, the pattern $p_1\ldots p_k$ +appears in |hc[1..k]|, and the corresponding sequence of numbers $n_0\ldots +n_k$ appears in |hyf[0..k]|. + +@<Insert a new pattern into the linked trie@>= +begin @<Compute the trie op code, |v|, and set |l:=0|@>; +q:=0; hc[0]:=cur_lang; +while l<=k do + begin c:=hc[l]; incr(l); p:=trie_l[q]; first_child:=true; + while (p>0)and(c>so(trie_c[p])) do + begin q:=p; p:=trie_r[q]; first_child:=false; + end; + if (p=0)or(c<so(trie_c[p])) then + @<Insert a new trie node between |q| and |p|, and + make |p| point to it@>; + q:=p; {now node |q| represents $p_1\ldots p_l$} + end; +if trie_o[q]<>min_quarterword then + begin print_err("Duplicate pattern"); +@.Duplicate pattern@> + help1("(See Appendix H.)"); error; + end; +trie_o[q]:=v; +end +@y +@ Well, that was everything about the initialization of the \SISISI hash +table (at this place). + +All following sections, describing the initialization of the trie are +replaced by ``empty sections'' in order to have same section numbering +in SI\TeX as in \TeX. +@z + +---------------------------------------------------------------------------- + +@x +@ @<Insert a new trie node between |q| and |p|...@>= +begin if trie_ptr=trie_size then overflow("pattern memory",trie_size); +@:TeX capacity exceeded pattern memory}{\quad pattern memory@> +incr(trie_ptr); trie_r[trie_ptr]:=p; p:=trie_ptr; trie_l[p]:=0; +if first_child then trie_l[q]:=p@+else trie_r[q]:=p; +trie_c[p]:=si(c); trie_o[p]:=min_quarterword; +end +@y +@ ``Empty section''. +@z +------------------------------------------------------------------------------ +@x +@ @<Compute the trie op code, |v|...@>= +if hc[1]=0 then hyf[0]:=0; +if hc[k]=0 then hyf[k]:=0; +l:=k; v:=min_quarterword; +loop@+ begin if hyf[l]<>0 then v:=new_trie_op(k-l,hyf[l],v); + if l>0 then decr(l)@+else goto done1; + end; +done1: +@y +@ Further ``empty section''. +@z + +@x +@ Finally we put everything together: Here is how the trie gets to its +final, efficient form. +The following packing routine is rigged so that the root of the linked +tree gets mapped into location 1 of |trie|, as required by the hyphenation +algorithm. This happens because the first call of |first_fit| will +``take'' location~1. + +@<Declare procedures for preprocessing hyphenation patterns@>= +procedure init_trie; +var @!p:trie_pointer; {pointer for initialization} +@!j,@!k,@!t:integer; {all-purpose registers for initialization} +@!r,@!s:trie_pointer; {used to clean up the packed |trie|} +@!h:two_halves; {template used to zero out |trie|'s holes} +begin @<Get ready to compress the trie@>; +if trie_root<>0 then + begin first_fit(trie_root); trie_pack(trie_root); + end; +@y +@ Because we do not use the trie, we fill it with dummy data. +But the main reason, why we do not remove this procedure is, that +it is called and the used variables are referenced somewhere in \TeX. + + +@<Declare procedures for preprocessing hyphenation patterns@>= +procedure init_trie; + var @!p:trie_pointer; {pointer for initialization} + @!j,@!k,@!t:integer; {all-purpose registers for initialization} + @!r,@!s:trie_pointer; {used to clean up the packed |trie|} + @!h:two_halves; {template used to zero out |trie|'s holes} +begin + trie_root:=0; +@z + +========================================================================= + diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/tangle.ch b/obsolete/systems/sisisi/unix/SiTeX3.14/tangle.ch new file mode 100644 index 0000000000..4c0e00a9da --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/tangle.ch @@ -0,0 +1,687 @@ +% tangle.ch for C compilation with web2c. +% The original version of this file was created by Howard Trickey and +% Pavel Curtis. +% +% History: +% +% (more recent changes in ../ChangeLog.W2C) +% +% 10/9/82 (HT) Original version +% 11/29 (HT) New version, with conversion to lowercase handled properly +% Also, new control sequence: +% @=...text...@> Put ...text... verbatim on a line +% by itself in the Pascal output. +% (argument must fit on one line) +% This control sequence facilitates putting #include "gcons.h" +% (for example) in files meant for the pc compiler. +% Also, changed command line usage, so that the absence of a +% change file implies no change file, rather than one with the +% same name as the web file, with .ch at the end. +% 1/15/83 (HT) Changed to work with version 1.2, which incorporates the +% above change (though unbundling the output line breaking), +% so mainly had to remove stuff. +% 2/17 (HT) Fixed bug that caused 0-9 in identifiers to be converted to +% Q-Y on output. +% 3/18 (HT) Brought up to work with Version 1.5. Added -r command line +% flag to cause a .rpl file to be written with all the lines +% of the .web file that were replaced because of the .ch file +% (useful for comparing with previous .rpl files, to see if a +% change file will still work with a new version of a .web file) +% Also, made it write a newline just before exit. +% 4/12 (PC) Merged with Pavel's version, including adding a call to exit() +% at the end depending upon the value of history. +% 4/16 (PC) Brought up to date with version 1.5 released April, 1983. +% 6/28 (HWT) Brought up to date with version 1.7 released June, 1983. +% With new change file format, the -r option is now unnecessary. +% 7/17 (HWT) Brought up to date with version 2.0 released July, 1983. +% 12/18/83 (ETM) Brought up to date with version 2.5 released November, 1983. +% 11/07/84 (ETM) Brought up to date with version 2.6. +% 12/15/85 (ETM) Brought up to date with version 2.8. +% 03/07/88 (ETM) Converted for use with WEB2C +% 01/02/89 (PAM) Cosmetic upgrade to version 2.9 +% 11/30/89 (KB) Version 4. +% (more recent changes in ../ChangeLog.W2C) + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [0] WEAVE: print only changes +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +\pageno=\contentspagenumber \advance\pageno by 1 +@y +\pageno=\contentspagenumber \advance\pageno by 1 +\let\maybe=\iffalse +\def\title{TANGLE changes for C} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1] Change banner message +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d banner=='This is TANGLE, Version 4.2' +@y +@d banner=='This is TANGLE, C Version 4.2' +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [2] add input and output, remove other files, add ref to scan_args, +% and #include external definition for exit(). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d end_of_TANGLE = 9999 {go here to wrap it up} + +@p @t\4@>@<Compiler directives@>@/ +program TANGLE(@!web_file,@!change_file,@!Pascal_file,@!pool); +label end_of_TANGLE; {go here to finish} +const @<Constants in the outer block@>@/ +type @<Types in the outer block@>@/ +var @<Globals in the outer block@>@/ +@<Error handling procedures@>@/ +@y +@d end_of_TANGLE = 9999 {go here to wrap it up} + +@p program TANGLE; +label end_of_TANGLE; {go here to finish} +const @<Constants in the outer block@>@/ +type @<Types in the outer block@>@/ +var @<Globals in the outer block@>@/ +@<Error handling procedures@>@/ +@<Declaration of |scan_args|@>@/ +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4] compiler options +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@{@&$C-,A+,D-@} {no range check, catch arithmetic overflow, no debug overhead} +@!debug @{@&$C+,D+@}@+ gubed {but turn everything on when debugging} +@y +@=(*$C-*)@> {no range check} +@!debug @=(*$C+*)@>@+ gubed {but turn everything on when debugging} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8] Constants: increase id lengths +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!max_names=4000; {number of identifiers, strings, module names; + must be less than 10240} +@!max_texts=2000; {number of replacement texts, must be less than 10240} +@!hash_size=353; {should be prime} +@!longest_name=400; {module names shouldn't be longer than this} +@!line_length=72; {lines of \PASCAL\ output have at most this many characters} +@!out_buf_size=144; {length of output buffer, should be twice |line_length|} +@!stack_size=50; {number of simultaneous levels of macro expansion} +@!max_id_length=12; {long identifiers are chopped to this length, which must + not exceed |line_length|} +@!unambig_length=7; {identifiers must be unique if chopped to this length} + {note that 7 is more strict than \PASCAL's 8, but this can be varied} +@y +@!max_names=9000; {number of identifiers, strings, module names; + must be less than 10240} +@!max_texts=2000; {number of replacement texts, must be less than 10240} +@!hash_size=353; {should be prime} +@!longest_name=400; {module names shouldn't be longer than this} +@!line_length=72; {lines of \PASCAL\ output have at most this many characters} +@!out_buf_size=144; {length of output buffer, should be twice |line_length|} +@!stack_size=100; {number of simultaneous levels of macro expansion} +@!max_id_length=50; {long identifiers are chopped to this length, which must + not exceed |line_length|} +@!unambig_length=20; {identifiers must be unique if chopped to this length} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] The text_char type is used as an array index into xord. The +% default type `char' produces signed integers, which are bad array +% indices in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d text_char == char {the data type of characters in text files} +@y +@d text_char == ASCII_code {the data type of characters in text files} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [17] enable maximum character set +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +for i:=1 to @'37 do xchr[i]:=' '; +for i:=@'200 to @'377 do xchr[i]:=' '; +@y +for i:=1 to @'37 do xchr[i]:=chr(i); +for i:=@'200 to @'377 do xchr[i]:=chr(i); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [20] terminal output: use standard i/o +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d print(#)==write(term_out,#) {`|print|' means write on the terminal} +@y +@d term_out==stdout +@d print(#)==write(term_out,#) {`|print|' means write on the terminal} +@z + +@x +@<Globals...@>= +@!term_out:text_file; {the terminal as an output file} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [21] init terminal +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ Different systems have different ways of specifying that the output on a +certain file will appear on the user's terminal. Here is one way to do this +on the \PASCAL\ system that was used in \.{TANGLE}'s initial development: +@^system dependencies@> + +@<Set init...@>= +rewrite(term_out,'TTY:'); {send |term_out| output to the terminal} +@y +@ Different systems have different ways of specifying that the output on a +certain file will appear on the user's terminal. +@^system dependencies@> + +@<Set init...@>= + {Nothing need be done for C.} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [22] flush terminal buffer +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d update_terminal == break(term_out) {empty the terminal output buffer} +@y +@d update_terminal == flush(term_out) {empty the terminal output buffer} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [24] open input files +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The following code opens the input files. Since these files were listed +in the program header, we assume that the \PASCAL\ runtime system has +already checked that suitable file names have been given; therefore no +additional error checking needs to be done. +@^system dependencies@> + +@p procedure open_input; {prepare to read |web_file| and |change_file|} +begin reset(web_file); reset(change_file); +end; +@y +@ The following code opens the input files. +This happens after the |initialize| procedure has executed. +That will have called the |scan_args| procedure to set up the global +variables |web_name| and |chg_name| to the appropriate file +names. +These globals, and the |scan_args| procedure will be defined at the end +where they won't disturb the module numbering. +@^system dependencies@> + +@p procedure open_input; {prepare to read |web_file| and |change_file|} +begin +reset(web_file,web_name); reset(change_file,chg_name); +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [26] Open output files (except for the pool file). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The following code opens |Pascal_file| and |pool|. +Since these files were listed in the program header, we assume that the +\PASCAL\ runtime system has checked that suitable external file names have +been given. +@^system dependencies@> + +@<Set init...@>= +rewrite(Pascal_file); rewrite(pool); +@y +@ The following code opens |Pascal_file| and |pool|. +Use the |scan_args| procedure to fill the global file names, +according to the names given on the command line. +@^system dependencies@> + +@<Set init...@>= +scan_args; +rewrite(Pascal_file,pascal_file_name); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [28] Fix f^. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + begin buffer[limit]:=xord[f^]; get(f); + incr(limit); + if buffer[limit-1]<>" " then final_limit:=limit; + if limit=buf_size then + begin while not eoln(f) do get(f); +@y + begin buffer[limit]:=xord[getc(f)]; + incr(limit); + if buffer[limit-1]<>" " then final_limit:=limit; + if limit=buf_size then + begin while not eoln(f) do vgetc(f); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] Fix `jump_out'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d fatal_error(#)==begin new_line; print(#); error; mark_fatal; jump_out; + end + +@<Error handling...@>= +procedure jump_out; +begin goto end_of_TANGLE; +end; +@y +@d jump_out==uexit(1) +@d fatal_error(#)==begin new_line; print(#); error; mark_fatal; uexit(1); + end +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [38] Provide for a larger `byte_mem' and `tok_mem'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x Extra capacity: +@d ww=2 {we multiply the byte capacity by approximately this amount} +@d zz=3 {we multiply the token capacity by approximately this amount} +@y +@d ww=3 {we multiply the byte capacity by approximately this amount} +@d zz=4 {we multiply the token capacity by approximately this amount} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [63] Remove conversion to uppercase +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + begin if c>="a" then c:=c-@'40; {merge lowercase with uppercase} +@y + begin +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [64] Delayed pool file opening. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Define and output a new string...@>= +begin ilk[p]:=numeric; {strings are like numeric macros} +if l-double_chars=2 then {this string is for a single character} + equiv[p]:=buffer[id_first+1]+@'100000 +else begin equiv[p]:=string_ptr+@'100000; + l:=l-double_chars-1; +@y +@<Define and output a new string...@>= +begin ilk[p]:=numeric; {strings are like numeric macros} +if l-double_chars=2 then {this string is for a single character} + equiv[p]:=buffer[id_first+1]+@'100000 +else begin + if string_ptr = 256 then rewrite(pool,pool_file_name); + equiv[p]:=string_ptr+@'100000; + l:=l-double_chars-1; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [105] Accept DIV, div, MOD, and mod +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + (((out_contrib[1]="D")and(out_contrib[2]="I")and(out_contrib[3]="V")) or@| + ((out_contrib[1]="M")and(out_contrib[2]="O")and(out_contrib[3]="D")) ))or@| +@^uppercase@> +@y + (((out_contrib[1]="D")and(out_contrib[2]="I")and(out_contrib[3]="V")) or@| + ((out_contrib[1]="d")and(out_contrib[2]="i")and(out_contrib[3]="v")) or@| + ((out_contrib[1]="M")and(out_contrib[2]="O")and(out_contrib[3]="D")) or@| + ((out_contrib[1]="m")and(out_contrib[2]="o")and(out_contrib[3]="d")) ))or@| +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [110] lowercase ids +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@^uppercase@> + if ((out_buf[out_ptr-3]="D")and(out_buf[out_ptr-2]="I")and + (out_buf[out_ptr-1]="V"))or @/ + ((out_buf[out_ptr-3]="M")and(out_buf[out_ptr-2]="O")and + (out_buf[out_ptr-1]="D")) then@/ goto bad_case +@y + if ((out_buf[out_ptr-3]="D")and(out_buf[out_ptr-2]="I")and + (out_buf[out_ptr-1]="V"))or @/ + ((out_buf[out_ptr-3]="d")and(out_buf[out_ptr-2]="i")and + (out_buf[out_ptr-1]="v"))or @/ + ((out_buf[out_ptr-3]="M")and(out_buf[out_ptr-2]="O")and + (out_buf[out_ptr-1]="D"))or @/ + ((out_buf[out_ptr-3]="m")and(out_buf[out_ptr-2]="o")and + (out_buf[out_ptr-1]="d")) then@/ goto bad_case +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [114] lowercase operators (`and', `or', etc.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +and_sign: begin out_contrib[1]:="A"; out_contrib[2]:="N"; out_contrib[3]:="D"; +@^uppercase@> + send_out(ident,3); + end; +not_sign: begin out_contrib[1]:="N"; out_contrib[2]:="O"; out_contrib[3]:="T"; + send_out(ident,3); + end; +set_element_sign: begin out_contrib[1]:="I"; out_contrib[2]:="N"; + send_out(ident,2); + end; +or_sign: begin out_contrib[1]:="O"; out_contrib[2]:="R"; send_out(ident,2); +@y +and_sign: begin out_contrib[1]:="a"; out_contrib[2]:="n"; out_contrib[3]:="d"; + send_out(ident,3); + end; +not_sign: begin out_contrib[1]:="n"; out_contrib[2]:="o"; out_contrib[3]:="t"; + send_out(ident,3); + end; +set_element_sign: begin out_contrib[1]:="i"; out_contrib[2]:="n"; + send_out(ident,2); + end; +or_sign: begin out_contrib[1]:="o"; out_contrib[2]:="r"; send_out(ident,2); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [116] Remove conversion to uppercase +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ Single-character identifiers represent themselves, while longer ones +appear in |byte_mem|. All must be converted to uppercase, +with underlines removed. Extremely long identifiers must be chopped. + +(Some \PASCAL\ compilers work with lowercase letters instead of +uppercase. If this module of \.{TANGLE} is changed, it's also necessary +to change from uppercase to lowercase in the modules that are +listed in the index under ``uppercase''.) +@^system dependencies@> +@^uppercase@> + +@d up_to(#)==#-24,#-23,#-22,#-21,#-20,#-19,#-18,#-17,#-16,#-15,#-14, + #-13,#-12,#-11,#-10,#-9,#-8,#-7,#-6,#-5,#-4,#-3,#-2,#-1,# + +@<Cases related to identifiers@>= +"A",up_to("Z"): begin out_contrib[1]:=cur_char; send_out(ident,1); + end; +"a",up_to("z"): begin out_contrib[1]:=cur_char-@'40; send_out(ident,1); + end; +identifier: begin k:=0; j:=byte_start[cur_val]; w:=cur_val mod ww; + while (k<max_id_length)and(j<byte_start[cur_val+ww]) do + begin incr(k); out_contrib[k]:=byte_mem[w,j]; incr(j); + if out_contrib[k]>="a" then out_contrib[k]:=out_contrib[k]-@'40 + else if out_contrib[k]="_" then decr(k); + end; + send_out(ident,k); + end; +@y +@ Single-character identifiers represent themselves, while longer ones +appear in |byte_mem|. All must be converted to lowercase, +with underlines removed. Extremely long identifiers must be chopped. +@^system dependencies@> + +@d up_to(#)==#-24,#-23,#-22,#-21,#-20,#-19,#-18,#-17,#-16,#-15,#-14, + #-13,#-12,#-11,#-10,#-9,#-8,#-7,#-6,#-5,#-4,#-3,#-2,#-1,# + +@<Cases related to identifiers@>= +"A",up_to("Z"), +"a",up_to("z"): begin out_contrib[1]:=cur_char; send_out(ident,1); + end; +identifier: begin k:=0; j:=byte_start[cur_val]; w:=cur_val mod ww; + while (k<max_id_length)and(j<byte_start[cur_val+ww]) do + begin incr(k); out_contrib[k]:=byte_mem[w,j]; incr(j); + if out_contrib[k]="_" then decr(k); + end; + send_out(ident,k); + end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] Fix casting bug +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d add_in(#)==begin accumulator:=accumulator+next_sign*(#); next_sign:=+1; + end +@y +@d add_in(#)==begin accumulator:=accumulator+next_sign*toint(#); next_sign:=+1; + end +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [179] make term_in = input +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +any error stop will set |debug_cycle| to zero. +@y +any error stop will set |debug_cycle| to zero. + +@d term_in==stdin +@z + +@x +@!term_in:text_file; {the user's terminal as an input file} +@y + +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [180] remove term_in reset +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +reset(term_in,'TTY:','/I'); {open |term_in| as the terminal, don't do a |get|} +@y + +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [182] write newline just before exit; use value of |history| +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +We have defined plenty of procedures, and it is time to put the last +pieces of the puzzle in place. Here is where \.{TANGLE} starts, and where +it ends. +@^system dependencies@> +@y +We have defined plenty of procedures, and it is time to put the last +pieces of the puzzle in place. Here is where \.{TANGLE} starts, and where +it ends. +@^system dependencies@> +@z + +@x +@<Print the job |history|@>; +@y +@<Print the job |history|@>; +new_line; +if (history <> spotless) and (history <> harmless_message) +then uexit (1) +else uexit (0); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [188] system dependent changes--the |scan_args| procedure. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +This module should be replaced, if necessary, by changes to the program +that are necessary to make \.{TANGLE} work at a particular installation. +It is usually best to design your change file so that all changes to +previous modules preserve the module numbering; then everybody's version +will be consistent with the printed program. More extensive changes, +which introduce new modules, can be inserted here; then only the index +itself will get a new module number. +@^system dependencies@> +@y +This module should be replaced, if necessary, by changes to the program +that are necessary to make \.{TANGLE} work at a particular installation. +It is usually best to design your change file so that all changes to +previous modules preserve the module numbering; then everybody's version +will be consistent with the printed program. More extensive changes, +which introduce new modules, can be inserted here; then only the index +itself will get a new module number. +@^system dependencies@> + +@ The user calls \.{TANGLE} with arguments on the command line. These +are either file names or flags (beginning with `\.-'). The following +globals are for communicating the user's desires to the rest of the +program. The various filename variables contain strings with the full +names of those files, as {\mc UNIX} knows them. + +There are no flags that affect \.{TANGLE} at the moment. + +@d max_file_name_length==FILENAMESIZE + +@<Globals...@>= +@!web_name,@!chg_name,@!pascal_file_name,@!pool_file_name: + array[1..max_file_name_length] of char; + +@ The |scan_args| procedure looks at the command line arguments and sets +the |file_name| variables accordingly. At least one file name must be +present: the \.{WEB} file. It may have an extension, or it may omit it +to get |'.web'| added. The \PASCAL\ output file name is formed by +replacing the \.{WEB} file name extension by |'.p'|. Similarly, the +pool file name is formed using a |'.pool'| extension. + +If there is another file name present among the arguments, it is the +change file, again either with an extension or without one to get +|'.ch'| An omitted change file argument means that |'/dev/null'| should +be used, when no changes are desired. + +@<Declaration of |scan_args|@>= +procedure scan_args; + var dot_pos, slash_pos, i, a: integer; {indices} + c: char; + @!fname: array[1..max_file_name_length] of char; {temporary argument holder} + @!found_web,@!found_change: boolean; {|true| when those file names have + been seen} +begin + found_web := false; + found_change := false; + + for a := 1 to argc - 1 + do begin + argv(a,fname); {put argument number |a| into |fname|} + if fname[1] <> '-' + then begin + if not found_web + then @<Get |web_name|, |pascal_file_name|, + and |pool_file_name| variables from |fname|@> + else if not found_change + then @<Get |chg_name| from |fname|@> + else @<Print usage error message and quit@>; + end else + @<Handle flag argument in |fname|@>; + end; + + if not found_web then @<Print usage error message and quit@>; + if not found_change then @<Set up null change file@>; +end; + +@ Use all of |fname| for the |web_name| if there is a |'.'| in it, +otherwise add |'.web'|. The other file names come from adding things +after the dot. The |argv| procedure will not put more than +|max_file_name_length-5| characters into |fname|, and this leaves enough +room in the |file_name| variables to add the extensions. + +The end of a file name is marked with a |' '|, the convention assumed by +the |reset| and |rewrite| procedures. + +@<Get |web_name|...@>= +begin + dot_pos := -1; + slash_pos := -1; + i := 1; + while (fname[i] <> ' ') and (i <= max_file_name_length - 5) + do begin + web_name[i] := fname[i]; + if fname[i] = '.' then dot_pos := i; + if fname[i] = '/' then slash_pos := i; + incr (i); + end; + web_name[i] := ' '; + + if (dot_pos = -1) or (dot_pos < slash_pos) + then begin + dot_pos := i; + web_name[dot_pos] := '.'; + web_name[dot_pos+1] := 'w'; + web_name[dot_pos+2] := 'e'; + web_name[dot_pos+3] := 'b'; + web_name[dot_pos+4] := ' '; + end; + + for i := 1 to dot_pos + do begin + c := web_name[i]; + pascal_file_name[i] := c; + pool_file_name[i] := c; + end; + + pascal_file_name[dot_pos+1] := 'p'; + pascal_file_name[dot_pos+2] := ' '; + + pool_file_name[dot_pos+1] := 'p'; + pool_file_name[dot_pos+2] := 'o'; + pool_file_name[dot_pos+3] := 'o'; + pool_file_name[dot_pos+4] := 'l'; + pool_file_name[dot_pos+5] := ' '; + + found_web := true; +end + +@ @<Get |chg_name|...@>= +begin + dot_pos := -1; + slash_pos := -1; + i := 1; + while (fname[i] <> ' ') and (i <= max_file_name_length - 5) + do begin + chg_name[i] := fname[i]; + if fname[i] = '.' then dot_pos := i; + if fname[i] = '/' then slash_pos := i; + incr (i); + end; + chg_name[i] := ' '; + + if (dot_pos = -1) or (dot_pos < slash_pos) + then begin + dot_pos := i; + chg_name[dot_pos] := '.'; + chg_name[dot_pos+1] := 'c'; + chg_name[dot_pos+2] := 'h'; + chg_name[dot_pos+3] := ' '; + end; + + found_change := true; +end + +@ @<Set up null...@>= +begin + chg_name[1]:='/'; + chg_name[2]:='d'; + chg_name[3]:='e'; + chg_name[4]:='v'; + chg_name[5]:='/'; + chg_name[6]:='n'; + chg_name[7]:='u'; + chg_name[8]:='l'; + chg_name[9]:='l'; + chg_name[10]:=' '; +end + +@ There are no flags currently used by \.{TANGLE}, but this module can be +used as a hook to introduce flags. + +@<Handle flag...@>= +begin + @<Print usage error message and quit@>; +end + +@ @<Print usage error message and quit@>= +begin + print_ln ('Usage: tangle webfile[.web] [changefile[.ch]].'); + uexit (1); +end +@z diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/tex6.c b/obsolete/systems/sisisi/unix/SiTeX3.14/tex6.c new file mode 100644 index 0000000000..b3bebfedf1 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/tex6.c @@ -0,0 +1,2492 @@ +#define EXTERN extern +#include "texd.h" + +void zpostlinebreak ( finalwidowpenalty ) +integer finalwidowpenalty ; +{/* 30 31 */ postlinebreak_regmem + halfword q, r, s ; + boolean discbreak ; + boolean postdiscbreak ; + scaled curwidth ; + scaled curindent ; + quarterword t ; + integer pen ; + halfword curline ; + q = mem [ bestbet + 1 ] .hh .v.RH ; + curp = 0 ; + do { + r = q ; + q = mem [ q + 1 ] .hh .v.LH ; + mem [ r + 1 ] .hh .v.LH = curp ; + curp = r ; + } while ( ! ( q == 0 ) ) ; + curline = curlist .pgfield + 1 ; + do { + q = mem [ curp + 1 ] .hh .v.RH ; + discbreak = false ; + postdiscbreak = false ; + if ( q != 0 ) + if ( mem [ q ] .hh.b0 == 10 ) + { + deleteglueref ( mem [ q + 1 ] .hh .v.LH ) ; + mem [ q + 1 ] .hh .v.LH = eqtb [ 10290 ] .hh .v.RH ; + mem [ q ] .hh.b1 = 9 ; + incr ( mem [ eqtb [ 10290 ] .hh .v.RH ] .hh .v.RH ) ; + goto lab30 ; + } + else { + + if ( mem [ q ] .hh.b0 == 7 ) + { + t = mem [ q ] .hh.b1 ; + if ( t == 0 ) + r = mem [ q ] .hh .v.RH ; + else { + + r = q ; + while ( t > 1 ) { + + r = mem [ r ] .hh .v.RH ; + decr ( t ) ; + } + s = mem [ r ] .hh .v.RH ; + r = mem [ s ] .hh .v.RH ; + mem [ s ] .hh .v.RH = 0 ; + flushnodelist ( mem [ q ] .hh .v.RH ) ; + mem [ q ] .hh.b1 = 0 ; + } + if ( mem [ q + 1 ] .hh .v.RH != 0 ) + { + s = mem [ q + 1 ] .hh .v.RH ; + while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; + mem [ s ] .hh .v.RH = r ; + r = mem [ q + 1 ] .hh .v.RH ; + mem [ q + 1 ] .hh .v.RH = 0 ; + postdiscbreak = true ; + } + if ( mem [ q + 1 ] .hh .v.LH != 0 ) + { + s = mem [ q + 1 ] .hh .v.LH ; + if ( mem [ s ] .hh.b0 == 12 ) + { + s = mem [ s ] .hh .v.RH ; + mem [ mem [ q + 1 ] .hh .v.LH ] .hh .v.RH = 0 ; + flushnodelist ( mem [ q + 1 ] .hh .v.LH ) ; + } + mem [ q ] .hh .v.RH = s ; + while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; + mem [ q + 1 ] .hh .v.LH = 0 ; + q = s ; + } + mem [ q ] .hh .v.RH = r ; + discbreak = true ; + } + else if ( ( mem [ q ] .hh.b0 == 9 ) || ( mem [ q ] .hh.b0 == 11 ) ) + mem [ q + 1 ] .cint = 0 ; + } + else { + + q = memtop - 3 ; + while ( mem [ q ] .hh .v.RH != 0 ) q = mem [ q ] .hh .v.RH ; + } + r = newparamglue ( 8 ) ; + mem [ r ] .hh .v.RH = mem [ q ] .hh .v.RH ; + mem [ q ] .hh .v.RH = r ; + q = r ; + lab30: ; + r = mem [ q ] .hh .v.RH ; + mem [ q ] .hh .v.RH = 0 ; + q = mem [ memtop - 3 ] .hh .v.RH ; + mem [ memtop - 3 ] .hh .v.RH = r ; + if ( eqtb [ 10289 ] .hh .v.RH != 0 ) + { + r = newparamglue ( 7 ) ; + mem [ r ] .hh .v.RH = q ; + q = r ; + } + if ( curline > lastspecialline ) + { + curwidth = secondwidth ; + curindent = secondindent ; + } + else if ( eqtb [ 10812 ] .hh .v.RH == 0 ) + { + curwidth = firstwidth ; + curindent = firstindent ; + } + else { + + curwidth = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline ] .cint ; + curindent = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline - 1 ] .cint ; + } + adjusttail = memtop - 5 ; + justbox = hpack ( q , curwidth , 0 ) ; + mem [ justbox + 4 ] .cint = curindent ; + appendtovlist ( justbox ) ; + if ( memtop - 5 != adjusttail ) + { + mem [ curlist .tailfield ] .hh .v.RH = mem [ memtop - 5 ] .hh .v.RH ; + curlist .tailfield = adjusttail ; + } + adjusttail = 0 ; + if ( curline + 1 != bestline ) + { + pen = eqtb [ 12676 ] .cint ; + if ( curline == curlist .pgfield + 1 ) + pen = pen + eqtb [ 12668 ] .cint ; + if ( curline + 2 == bestline ) + pen = pen + finalwidowpenalty ; + if ( discbreak ) + pen = pen + eqtb [ 12671 ] .cint ; + if ( pen != 0 ) + { + r = newpenalty ( pen ) ; + mem [ curlist .tailfield ] .hh .v.RH = r ; + curlist .tailfield = r ; + } + } + incr ( curline ) ; + curp = mem [ curp + 1 ] .hh .v.LH ; + if ( curp != 0 ) + if ( ! postdiscbreak ) + { + r = memtop - 3 ; + while ( true ) { + + q = mem [ r ] .hh .v.RH ; + if ( q == mem [ curp + 1 ] .hh .v.RH ) + goto lab31 ; + if ( ( q >= himemmin ) ) + goto lab31 ; + if ( ( mem [ q ] .hh.b0 < 9 ) ) + goto lab31 ; + if ( mem [ q ] .hh.b1 == 2 ) + if ( mem [ q ] .hh.b0 == 11 ) + goto lab31 ; + r = q ; + } + lab31: if ( r != memtop - 3 ) + { + mem [ r ] .hh .v.RH = 0 ; + flushnodelist ( mem [ memtop - 3 ] .hh .v.RH ) ; + mem [ memtop - 3 ] .hh .v.RH = q ; + } + } + } while ( ! ( curp == 0 ) ) ; + if ( ( curline != bestline ) || ( mem [ memtop - 3 ] .hh .v.RH != 0 ) ) + confusion ( 935 ) ; + curlist .pgfield = bestline - 1 ; +} +smallnumber zreconstitute ( j , n , bchar , hchar ) +smallnumber j ; +smallnumber n ; +halfword bchar ; +halfword hchar ; +{/* 22 30 */ register smallnumber Result; reconstitute_regmem + halfword p ; + halfword t ; + fourquarters q ; + halfword currh ; + halfword testchar ; + scaled w ; + fontindex k ; + smallnumber ii ; + hyphenpassed = 0 ; + t = memtop - 4 ; + w = 0 ; + mem [ memtop - 4 ] .hh .v.RH = 0 ; + {register integer for_end; ii = n ; for_end = j ; if ( ii >= for_end) do + if ( dirtyumlaut [ ii ] != 0 ) + n = ii - 1 ; + while ( ii-- > for_end ) ; } + curl = hu [ j ] ; + curq = t ; + if ( j == 0 ) + { + ligaturepresent = initlig ; + p = initlist ; + if ( ligaturepresent ) + lfthit = initlft ; + while ( p > 0 ) { + + { + mem [ t ] .hh .v.RH = getavail () ; + t = mem [ t ] .hh .v.RH ; + mem [ t ] .hh.b0 = hf ; + mem [ t ] .hh.b1 = mem [ p ] .hh.b1 ; + } + p = mem [ p ] .hh .v.RH ; + } + } + else if ( curl < 256 ) + { + mem [ t ] .hh .v.RH = getavail () ; + t = mem [ t ] .hh .v.RH ; + mem [ t ] .hh.b0 = hf ; + mem [ t ] .hh.b1 = curl ; + } + ligstack = 0 ; + { + if ( j < n ) + curr = hu [ j + 1 ] ; + else curr = bchar ; + if ( hyfpen [ j ] != 10000 ) + currh = hchar ; + else currh = 256 ; + } + lab22: if ( curl == 256 ) + { + k = bcharlabel [ hf ] ; + if ( k == fontmemsize ) + goto lab30 ; + else q = fontinfo [ k ] .qqqq ; + } + else { + + q = fontinfo [ charbase [ hf ] + curl ] .qqqq ; + if ( ( ( q .b2 ) % 4 ) != 1 ) + goto lab30 ; + k = ligkernbase [ hf ] + q .b3 ; + q = fontinfo [ k ] .qqqq ; + if ( q .b0 > 128 ) + { + k = ligkernbase [ hf ] + 256 * q .b2 + q .b3 + 32768L - 256 * ( 128 ) ; + q = fontinfo [ k ] .qqqq ; + } + } + if ( currh < 256 ) + testchar = currh ; + else testchar = curr ; + while ( true ) { + + if ( q .b1 == testchar ) + if ( q .b0 <= 128 ) + if ( currh < 256 ) + { + hyphenpassed = j ; + hchar = 256 ; + currh = 256 ; + goto lab22 ; + } + else { + + if ( hchar < 256 ) + if ( hyfpen [ j ] != 10000 ) + { + hyphenpassed = j ; + hchar = 256 ; + } + if ( q .b2 < 128 ) + { + if ( curl == 256 ) + lfthit = true ; + if ( j == n ) + if ( ligstack == 0 ) + rthit = true ; + { + if ( interrupt != 0 ) + pauseforinstructions () ; + } + switch ( q .b2 ) + {case 1 : + case 5 : + { + curl = q .b3 ; + ligaturepresent = true ; + } + break ; + case 2 : + case 6 : + { + curr = q .b3 ; + if ( ligstack > 0 ) + mem [ ligstack ] .hh.b1 = curr ; + else { + + ligstack = newligitem ( curr ) ; + if ( j == n ) + bchar = 256 ; + else { + + p = getavail () ; + mem [ ligstack + 1 ] .hh .v.RH = p ; + mem [ p ] .hh.b1 = hu [ j + 1 ] ; + mem [ p ] .hh.b0 = hf ; + } + } + } + break ; + case 3 : + { + curr = q .b3 ; + p = ligstack ; + ligstack = newligitem ( curr ) ; + mem [ ligstack ] .hh .v.RH = p ; + } + break ; + case 7 : + case 11 : + { + if ( ligaturepresent ) + { + p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ; + if ( lfthit ) + { + mem [ p ] .hh.b1 = 2 ; + lfthit = false ; + } + if ( false ) + if ( ligstack == 0 ) + { + incr ( mem [ p ] .hh.b1 ) ; + rthit = false ; + } + mem [ curq ] .hh .v.RH = p ; + t = p ; + ligaturepresent = false ; + } + curq = t ; + curl = q .b3 ; + ligaturepresent = true ; + } + break ; + default: + { + curl = q .b3 ; + ligaturepresent = true ; + if ( ligstack > 0 ) + { + if ( mem [ ligstack + 1 ] .hh .v.RH > 0 ) + { + mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ; + t = mem [ t ] .hh .v.RH ; + incr ( j ) ; + } + p = ligstack ; + ligstack = mem [ p ] .hh .v.RH ; + freenode ( p , 2 ) ; + if ( ligstack == 0 ) + { + if ( j < n ) + curr = hu [ j + 1 ] ; + else curr = bchar ; + if ( hyfpen [ j ] != 10000 ) + currh = hchar ; + else currh = 256 ; + } + else curr = mem [ ligstack ] .hh.b1 ; + } + else if ( j == n ) + goto lab30 ; + else { + + { + mem [ t ] .hh .v.RH = getavail () ; + t = mem [ t ] .hh .v.RH ; + mem [ t ] .hh.b0 = hf ; + mem [ t ] .hh.b1 = curr ; + } + incr ( j ) ; + { + if ( j < n ) + curr = hu [ j + 1 ] ; + else curr = bchar ; + if ( hyfpen [ j ] != 10000 ) + currh = hchar ; + else currh = 256 ; + } + } + } + break ; + } + if ( q .b2 > 4 ) + if ( q .b2 != 7 ) + goto lab30 ; + goto lab22 ; + } + w = fontinfo [ kernbase [ hf ] + 256 * q .b2 + q .b3 ] .cint ; + goto lab30 ; + } + if ( q .b0 >= 128 ) + if ( currh == 256 ) + goto lab30 ; + else { + + currh = 256 ; + goto lab22 ; + } + k = k + q .b0 + 1 ; + q = fontinfo [ k ] .qqqq ; + } + lab30: ; + if ( ligaturepresent ) + { + p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ; + if ( lfthit ) + { + mem [ p ] .hh.b1 = 2 ; + lfthit = false ; + } + if ( rthit ) + if ( ligstack == 0 ) + { + incr ( mem [ p ] .hh.b1 ) ; + rthit = false ; + } + mem [ curq ] .hh .v.RH = p ; + t = p ; + ligaturepresent = false ; + } + if ( w != 0 ) + { + mem [ t ] .hh .v.RH = newkern ( w ) ; + t = mem [ t ] .hh .v.RH ; + w = 0 ; + } + if ( ligstack > 0 ) + { + curq = t ; + curl = mem [ ligstack ] .hh.b1 ; + ligaturepresent = true ; + { + if ( mem [ ligstack + 1 ] .hh .v.RH > 0 ) + { + mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ; + t = mem [ t ] .hh .v.RH ; + incr ( j ) ; + } + p = ligstack ; + ligstack = mem [ p ] .hh .v.RH ; + freenode ( p , 2 ) ; + if ( ligstack == 0 ) + { + if ( j < n ) + curr = hu [ j + 1 ] ; + else curr = bchar ; + if ( hyfpen [ j ] != 10000 ) + currh = hchar ; + else currh = 256 ; + } + else curr = mem [ ligstack ] .hh.b1 ; + } + goto lab22 ; + } + Result = j ; + return(Result) ; +} +void zhashfunk ( w , anfang , ende , v , ind , k ) +wort w ; +integer anfang ; +integer ende ; +varr v ; +intarr ind ; +intarr k ; +{hashfunk_regmem + long vacc, indacc, kacc ; + integer i ; + vacc = 31415L ; + indacc = 152L ; + kacc = 271L ; + {register integer for_end; i = anfang ; for_end = ende ; if ( i <= for_end) + do + { + ; + vacc = ( vacc * 31 + w [ i ] ) % 8388648L ; + v [ i ] = vacc ; + indacc = ( indacc * 33 + w [ i ] ) % ( tabsize + 1 ) ; + ind [ i ] = indacc ; + kacc = ( kacc * 15 + w [ i ] ) % ( ( tabsize + 1 ) / 2 ) ; + k [ i ] = 2 * kacc + 1 ; + } + while ( i++ < for_end ) ; } +} +void zunpackinfo ( b , iausnahme , iuntrennbar , ierste , izweite , iendung , +ivorsilbe , istamm , iehervor , istammallein ) +infobyte b ; +boolean * iausnahme ; +boolean * iuntrennbar ; +integer * ierste ; +integer * izweite ; +boolean * iendung ; +boolean * ivorsilbe ; +boolean * istamm ; +boolean * iehervor ; +boolean * istammallein ; +{unpackinfo_regmem + if ( odd ( b ) ) + { +* iausnahme = true ; + b = b / 2 ; + if ( odd ( b ) ) +* iuntrennbar = true ; + else *iuntrennbar = false ; + b = b / 2 ; +* ierste = b % 8 ; +* izweite = b / 8 ; + } + else { + +* iausnahme = false ; + b = b / 2 ; + if ( odd ( b ) ) +* iendung = true ; + else *iendung = false ; + b = b / 2 ; + if ( odd ( b ) ) +* ivorsilbe = true ; + else *ivorsilbe = false ; + b = b / 2 ; + if ( odd ( b ) ) +* istamm = true ; + else *istamm = false ; + b = b / 2 ; + if ( odd ( b ) ) +* iehervor = true ; + else *iehervor = false ; + b = b / 2 ; + if ( odd ( b ) ) +* istammallein = true ; + else *istammallein = false ; + } +} +void zunpackentry ( h , etabv , etabb , efrei , ewiederfrei ) +hashelement h ; +verdschlue * etabv ; +infobyte * etabb ; +boolean * efrei ; +boolean * ewiederfrei ; +{unpackentry_regmem + ; +* etabv = h [ 0 ] + h [ 1 ] * 256 + h [ 2 ] * 256 * 256 ; + if ( odd ( h [ 3 ] ) ) + { + ; +* etabb = h [ 3 ] ; +* efrei = false ; +* ewiederfrei = false ; + } + else { + + ; +* etabb = h [ 3 ] % 64 ; + if ( odd ( h [ 3 ] / 64 ) ) +* efrei = true ; + else *efrei = false ; + if ( odd ( h [ 3 ] / 128 ) ) +* ewiederfrei = true ; + else *ewiederfrei = false ; + } +} +void zhashsuch ( v , ind , k , iausnahme , iuntrennbar , ierste , izweite , +iendung , ivorsilbe , istamm , iehervor , istammallein , g ) +verdschlue v ; +integer ind ; +integer k ; +boolean * iausnahme ; +boolean * iuntrennbar ; +integer * ierste ; +integer * izweite ; +boolean * iendung ; +boolean * ivorsilbe ; +boolean * istamm ; +boolean * iehervor ; +boolean * istammallein ; +boolean * g ; +{hashsuch_regmem + boolean gef, ngef ; + integer j ; + tableentry entry ; + gef = false ; + ngef = false ; + j = ind ; + do { + unpackentry ( htab [ j ] , entry .tabv , entry .tabb , entry .frei , + entry .wiederfrei ) ; + if ( entry .frei ) + ngef = true ; + else if ( ( v == entry .tabv ) && ! entry .wiederfrei ) + { + unpackinfo ( entry .tabb , *iausnahme , *iuntrennbar , *ierste , *izweite , * + iendung , *ivorsilbe , *istamm , *iehervor , *istammallein ) ; + gef = true ; + } + else j = ( j + k ) % ( tabsize + 1 ) ; + } while ( ! ( gef || ngef ) ) ; +* g = gef ; +} +void zhashload ( status ) +integer * status ; +{hashload_regmem + integer i ; + tableentry e ; + {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <= + for_end) do + nameoffile [ i ] = ' ' ; + while ( i++ < for_end ) ; } + nameoffile [ 1 ] = 'h' ; + nameoffile [ 2 ] = 'f' ; + nameoffile [ 3 ] = '3' ; + namelength = 3 ; + anzahl = 0 ; + if ( aopenin ( hashfile , TEXINPUTPATH ) ) + { + {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end) + do + { + int help; + fscanf ( hashfile, "%d", &help ); + htab [i][0] = (eightbits) help; + fscanf ( hashfile, "%d", &help ); + htab [i][1] = (eightbits) help; + fscanf ( hashfile, "%d", &help ); + htab [i][2] = (eightbits) help; + fscanf ( hashfile, "%d", &help ); + htab [i][3] = (eightbits) help; + unpackentry ( htab [ i ] , e .tabv , e .tabb , e .frei , e .wiederfrei + ) ; + if ( ! e .frei && ! e .wiederfrei ) + anzahl = anzahl + 1 ; + } + while ( i++ < for_end ) ; } +* status = 0 ; + aclose ( hashfile ) ; + } + else *status = 1 ; +} +void zpackinfo ( i , b ) +infotype i ; +infobyte * b ; +{packinfo_regmem +* b = 0 ; + if ( i .ausnahme ) + { + ; + if ( i .untrennbar ) + ; + else ; +* b = 1 + 2 * ord ( i .untrennbar ) + 4 * i .erste + 32 * i .zweite ; + } + else { + + ; +* b = 2 * ord ( i .endung ) + 4 * ord ( i .vorsilbe ) + 8 * ord ( i .stamm ) + + 16 * ord ( i .ehervor ) + 32 * ord ( i .stammallein ) ; + } +} +void zpackentry ( e , h ) +tableentry e ; +hashelement h ; +{packentry_regmem + ; + h [ 0 ] = e .tabv % 256 ; + e .tabv = e .tabv / 256 ; + h [ 1 ] = e .tabv % 256 ; + h [ 2 ] = e .tabv / 256 ; + if ( odd ( e .tabb ) ) + h [ 3 ] = e .tabb ; + else { + + ; + h [ 3 ] = e .tabb + 64 * ord ( e .frei ) + 128 * ord ( e .wiederfrei ) ; + } +} +void zhashetr ( w , laenge , i , g ) +wort w ; +integer laenge ; +infotype i ; +boolean * g ; +{hashetr_regmem + varr v1 ; + intarr ind1, k1 ; + verdschlue v ; + integer ind, k, j, e ; + boolean gef, ngef ; + tableentry entry ; + hashelement helem ; + if ( anzahl >= tabsize ) + { + ; +* g = false ; + } + else { + + ; + if ( ( anzahl < 10 ) || ( anzahl % 100 == 0 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ; + } + } + hashfunk ( w , 1 , laenge , v1 , ind1 , k1 ) ; + v = v1 [ laenge ] ; + ind = ind1 [ laenge ] ; + k = k1 [ laenge ] ; + gef = false ; + ngef = false ; + do { + ; + unpackentry ( htab [ ind ] , entry .tabv , entry .tabb , entry .frei , + entry .wiederfrei ) ; + if ( entry .frei || entry .wiederfrei ) + { + anzahl = anzahl + 1 ; + ngef = true ; + entry .tabv = v ; + packinfo ( i , entry .tabb ) ; + entry .frei = false ; + entry .wiederfrei = false ; + packentry ( entry , helem ) ; + memcpy((void *)htab [ ind ] , (void *)helem , sizeof(hashelement)); + } + else { + + ; + gef = v == entry .tabv ; + if ( ! gef ) + ind = ( ind + k ) % ( tabsize + 1 ) ; + } + } while ( ! ( gef || ngef ) ) ; +* g = ngef ; + } +} +void hashempty ( ) +{hashempty_regmem + integer i ; + tableentry elem ; + hashelement he ; + elem .tabv = 0 ; + elem .tabb = 0 ; + elem .frei = true ; + elem .wiederfrei = false ; + packentry ( elem , he ) ; + {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end) + do + memcpy((void *)htab [ i ] , (void *)he, sizeof(hashelement)); + while ( i++ < for_end ) ; } + anzahl = 0 ; +} +void zhashsave ( status ) +integer * status ; +{hashsave_regmem + integer i ; + {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <= + for_end) do + nameoffile [ i ] = ' ' ; + while ( i++ < for_end ) ; } + nameoffile [ 1 ] = 'h' ; + nameoffile [ 2 ] = 'f' ; + nameoffile [ 3 ] = '3' ; + namelength = 3 ; + if ( aopenout ( hashfile ) ) + { + {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end) + do + { + (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 0 ] ) ; + (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 1 ] ) ; + (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 2 ] ) ; + (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 3 ] ) ; + (void) putc('\n', hashfile ); + } + while ( i++ < for_end ) ; } +* status = 0 ; + aclose ( hashfile ) ; + } + else *status = 1 ; +} +integer hashsize ( ) +{register integer Result; hashsize_regmem + Result = anzahl ; + return(Result) ; +} +void zzahl ( line , i , ende , j ) +string80 line ; +integer * i ; +integer ende ; +integer * j ; +{zahl_regmem + boolean aus ; +* j = 0 ; + do { + if ( *i <= ende ) + if ( ktab [ line [ *i ] ] == 46 ) +* i = *i + 1 ; + else aus = true ; + else aus = true ; + } while ( ! ( aus ) ) ; + do { + if ( *i <= ende ) + { + switch ( line [ *i ] ) + {case 48 : + case 49 : + case 50 : + case 51 : + case 52 : + case 53 : + case 54 : + case 55 : + case 56 : + case 57 : + { +* j = 10 * *j + line [ *i ] - 48 ; +* i = *i + 1 ; + } + break ; + } + if ( ( line [ *i ] != 48 ) && ( line [ *i ] != 49 ) && ( line [ *i ] != 50 + ) && ( line [ *i ] != 51 ) && ( line [ *i ] != 52 ) && ( line [ *i ] != 53 + ) && ( line [ *i ] != 54 ) && ( line [ *i ] != 55 ) && ( line [ *i ] != 56 + ) && ( line [ *i ] != 57 ) ) + aus = true ; + } + else aus = true ; + } while ( ! ( aus ) ) ; +} +void zinfobau ( line , anfang , ende , informausnahme , informuntrennbar , +informerste , informzweite , informendung , informvorsilbe , informstamm , +informehervor , informstammallein , g ) +string80 line ; +integer anfang ; +integer ende ; +boolean * informausnahme ; +boolean * informuntrennbar ; +integer * informerste ; +integer * informzweite ; +boolean * informendung ; +boolean * informvorsilbe ; +boolean * informstamm ; +boolean * informehervor ; +boolean * informstammallein ; +boolean * g ; +{infobau_regmem + integer i, j ; + boolean ok, fehler ; + buchstabe b ; +* g = false ; +* informausnahme = false ; +* informendung = false ; +* informvorsilbe = false ; +* informehervor = false ; +* informstamm = false ; +* informstammallein = false ; + i = anfang ; + ok = false ; + fehler = false ; + do { + if ( i <= ende ) + if ( line [ i ] == 46 ) + i = i + 1 ; + else ok = true ; + else fehler = true ; + } while ( ! ( ok || fehler ) ) ; + if ( ! fehler ) + { + b = ktab [ line [ i ] ] ; + if ( b == bsta ) + { +* informausnahme = true ; + i = i + 1 ; + if ( ktab [ line [ i ] ] == bstu ) + { + i = i + 1 ; +* informuntrennbar = true ; + } + else *informuntrennbar = false ; + zahl ( line , i , ende , j ) ; + if ( j == 0 ) + { +* informerste = 7 ; +* informzweite = 7 ; + } + else { + + j = j - 2 ; + if ( ( j >= 0 ) && ( j <= 6 ) ) +* informerste = j ; + else fehler = true ; + zahl ( line , i , ende , j ) ; + if ( j == 0 ) +* informzweite = 7 ; + else { + + j = j - *informerste - 4 ; + if ( ( j >= 0 ) && ( j <= 6 ) ) +* informzweite = j ; + else fehler = true ; + } + } + if ( ! fehler ) +* g = true ; + } + else { + + ok = false ; + do { + switch ( b ) + {case 22 : +* informvorsilbe = true ; + break ; + case 5 : +* informendung = true ; + break ; + case 19 : +* informstamm = true ; + break ; + case 2 : +* informehervor = true ; + break ; + case 20 : +* informstammallein = true ; + break ; + case 31 : + ; + break ; + default: + fehler = true ; + break ; + } + if ( i == ende ) + ok = true ; + else { + + i = i + 1 ; + b = ktab [ line [ i ] ] ; + } + } while ( ! ( ok || fehler ) ) ; + if ( ! fehler ) +* g = ( *informvorsilbe || *informendung || *informstamm ) && ( ! * + informehervor || *informvorsilbe && *informendung ) && ( ! * + informstammallein || *informstamm ) ; + } + } +} +void zeintragen ( line , l ) +string80 line ; +integer l ; +{eintragen_regmem + integer i, laenge ; + infotype inform ; + wort w ; + boolean g ; + laenge = 1 ; + while ( line [ laenge ] != 46 ) laenge = laenge + 1 ; + laenge = laenge - 1 ; + if ( laenge >= 1 ) + { + if ( laenge <= maxwl ) + { + infobau ( line , laenge + 1 , l , inform .ausnahme , inform .untrennbar + , inform .erste , inform .zweite , inform .endung , inform .vorsilbe , + inform .stamm , inform .ehervor , inform .stammallein , g ) ; + if ( ! g ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " Info falsch: " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " Info falsch: " ) ; + } + } + else { + + {register integer for_end; i = 1 ; for_end = laenge ; if ( i <= + for_end) do + w [ i ] = ktab [ line [ i ] ] ; + while ( i++ < for_end ) ; } + hashetr ( w , laenge , inform , g ) ; + if ( ! g ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " Tabellenfehler: " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " Tabellenfehler: " ) ; + } + } + } + if ( ! g ) + { + {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) + do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( line [ i ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( line [ i ] ) , logfile ); + } + while ( i++ < for_end ) ; } + println () ; + } + } + else { + + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", " zu langes Wort: " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", " zu langes Wort: " ) ; + } + {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( line [ i ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( line [ i ] ) , logfile ); + } + while ( i++ < for_end ) ; } + println () ; + } + } + else { + + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", " Falsche Zeile: " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", " Falsche Zeile: " ) ; + } + {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( line [ i ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( line [ i ] ) , logfile ); + } + while ( i++ < for_end ) ; } + println () ; + } +} +void znaechsterbst ( i , tr , dudstop , b , w ) +integer * i ; +trennvektor tr ; +sperrvektor dudstop ; +buchstabe * b ; +wort w ; +{naechsterbst_regmem + if ( ( *i > 0 ) && ( tr [ *i ] == keine ) && ! dudstop [ *i ] ) + { +* b = w [ *i ] ; +* i = *i - 1 ; + } + else *b = trennzeichen ; +} +void zduden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , zerlegungen +) +trennvektor tr ; +wort w ; +trennvektor tr1 ; +trennvektor dudtr ; +dudt dud ; +sperrvektor dudstop ; +integer laenge ; +boolean * ok ; +integer * zerlegungen ; +{duden_regmem + integer i ; + integer j ; + integer zust ; + boolean aus ; + integer tre ; + integer letzte ; + integer l, lalt ; + buchstabe b ; + i = laenge ; + {register integer for_end; j = 0 ; for_end = laenge ; if ( j <= for_end) do + dudtr [ j ] = tr [ j ] ; + while ( j++ < for_end ) ; } + while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ; + while ( i > 0 ) { + + zust = 1 ; + aus = false ; + letzte = 0 ; + l = kons ; + b = w [ i ] ; + i = i - 1 ; + do { + { + tre = i + 1 ; + lalt = l ; + switch ( b ) + {case 1 : + { + l = voka ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 15 : + { + l = voko ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 29 : + { + l = vokue ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 28 : + { + l = vokoe ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 27 : + { + l = vokae ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 5 : + { + l = voke ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bsti ) + { + l = vokie ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bste ) + { + i = i + 1 ; + l = voke ; + b = bsti ; + } + } + } + break ; + case 9 : + { + l = voki ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bste ) + { + l = vokei ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bsta ) + { + l = vokai ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + } + break ; + case 21 : + { + l = voku ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bste ) + { + l = vokeu ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bsta ) + { + l = vokau ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bstae ) + { + l = vokaeu ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bstq ) + { + l = kons ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + } + break ; + case 20 : + { + l = kons ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bsts ) + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 8 : + { + l = kons ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bstc ) + { + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bsts ) + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bstp ) + naechsterbst ( i , tr , dudstop , b , w ) ; + else if ( b == bstt ) + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 2 : + case 3 : + case 4 : + case 6 : + case 7 : + case 10 : + case 11 : + case 12 : + case 13 : + case 14 : + case 16 : + case 17 : + case 18 : + case 19 : + case 22 : + case 23 : + case 24 : + case 26 : + case 30 : + { + l = kons ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 25 : + { + l = voky ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 31 : + case 0 : + aus = true ; + break ; + } + } + if ( ! aus ) + switch ( zust ) + {case 1 : + if ( l == kons ) + zust = 2 ; + else zust = 4 ; + break ; + case 2 : + if ( l != kons ) + zust = 3 ; + break ; + case 3 : + if ( l == kons ) + zust = 6 ; + else if ( l != lalt ) + { + zust = 4 ; + letzte = tre ; + dudtr [ letzte ] = neben ; + } + break ; + case 4 : + if ( l == kons ) + zust = 6 ; + else zust = 3 ; + break ; + case 6 : + if ( l == kons ) + { + zust = 2 ; + letzte = tre ; + if ( ( w [ tre ] == bstc ) && ( w [ tre + 1 ] == bstk ) ) + dudtr [ letzte ] = nebenck ; + else dudtr [ letzte ] = neben ; + } + else { + + zust = 4 ; + letzte = tre ; + dudtr [ letzte ] = neben ; + } + break ; + } + } while ( ! ( aus ) ) ; + if ( zust == 2 ) + dudtr [ letzte ] = keine ; + else if ( zust == 4 ) + if ( ( lalt < vokie ) || ( lalt > vokeu ) ) + dudtr [ letzte ] = keine ; + while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ; + } +} +void ztrennen ( zustand , anfang , spv , ok1 , tr , dudtr , zerlegungen , dud +, v , ind , k , dudstop , w , tr1 , laenge ) +integer zustand ; +integer anfang ; +sperrvektor spv ; +boolean * ok1 ; +trennvektor tr ; +trennvektor dudtr ; +integer * zerlegungen ; +dudt dud ; +varr v ; +intarr ind ; +intarr k ; +sperrvektor dudstop ; +wort w ; +trennvektor tr1 ; +integer laenge ; +{trennen_regmem + boolean gef, nichtok ; + integer schnitt ; + infotype inform ; + integer i ; + boolean okstamm, okvor, okend, okhelp ; + integer tri ; + integer i1, tre ; + boolean ok ; + integer stopptr ; + sperrvektor spvtmp ; + memcpy((void *)spvtmp, (void *)spv, sizeof(sperrvektor)) ; +* ok1 = false ; + if ( anfang == laenge + 1 ) + if ( ( zustand == 2 ) || ( zustand == 4 ) ) + { + dud [ anfang - 1 ] = true ; + duden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , *zerlegungen ) + ; + {register integer for_end; i = laenge ; for_end = 1 ; if ( i >= for_end) + do + { + if ( dudtr [ i - 1 ] == haupt3 ) + { + dudtr [ i - 1 ] = keine ; + tri = haupt3 ; + } + else tri = dudtr [ i ] ; + if ( *zerlegungen == 0 ) + tr1 [ i ] = tri ; + else tr1 [ i ] = kombtab [ tr1 [ i ] ][ tri ] ; + } + while ( i-- > for_end ) ; } +* zerlegungen = *zerlegungen + 1 ; +* ok1 = true ; + } + else ; + else { + + hashfunk ( w , anfang , laenge , v , ind , k ) ; + schnitt = laenge ; + nichtok = false ; + do { + do { if ( spv [ schnitt ] ) + gef = false ; + else { + + hashsuch ( v [ schnitt ] , ind [ schnitt ] , k [ schnitt ] , inform + .ausnahme , inform .untrennbar , inform .erste , inform .zweite , + inform .endung , inform .vorsilbe , inform .stamm , inform .ehervor + , inform .stammallein , gef ) ; + } + if ( gef ) + spv [ schnitt ] = true ; + else schnitt = schnitt - 1 ; + } while ( ! ( gef || ( schnitt == anfang - 1 ) ) ) ; + if ( gef ) + { + if ( ! inform .ausnahme ) + { + if ( inform .endung && ( zustand == 2 ) ) + { + okend = false ; + if ( ( w [ anfang ] == bstc ) || ( w [ anfang ] == bsth ) ) + { + dud [ anfang - 1 ] = true ; + tr [ anfang - 1 ] = neben ; + } + if ( schnitt < laenge ) + if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] ) + { + spv [ schnitt + 1 ] = true ; + trennen ( 2 , schnitt + 2 , spv , okhelp , tr , dudtr , * + zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okend = okhelp ; + } + trennen ( 2 , schnitt + 1 , spv , okhelp , tr , dudtr , * + zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okend = okend || okhelp ; + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; +* ok1 = *ok1 || okend ; + } + else okend = false ; + if ( inform .vorsilbe ) + { + if ( zustand == 1 ) + tr [ anfang - 1 ] = neben ; + else { + + dud [ anfang - 1 ] = true ; + if ( zustand == 5 ) + tr [ anfang - 1 ] = haupt3 ; + else tr [ anfang - 1 ] = haupt ; + } + dud [ schnitt ] = true ; + trennen ( 1 , schnitt + 1 , spv , okvor , tr , dudtr , *zerlegungen + , dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; + dud [ schnitt ] = false ; +* ok1 = *ok1 || okvor ; + } + else okvor = false ; + if ( inform .stamm && ! okvor ) + { + if ( ! inform .stammallein ) + { + okstamm = false ; + stopptr = 0 ; + if ( zustand == 1 ) + tr [ anfang - 1 ] = neben ; + else { + + dud [ anfang - 1 ] = true ; + if ( zustand == 5 ) + tr [ anfang - 1 ] = haupt3 ; + else tr [ anfang - 1 ] = haupt ; + } + if ( inform .ausnahme ) + { + if ( inform .erste != 7 ) + { + tre = anfang + inform .erste + 1 ; + tr [ tre ] = neben ; + if ( inform .zweite != 7 ) + { + tre = tre + inform .zweite + 2 ; + if ( inform .untrennbar ) + { + stopptr = tre ; + dudstop [ stopptr ] = true ; + } + else tr [ tre ] = neben ; + } + else { + + if ( inform .untrennbar ) + { + tr [ tre ] = keine ; + stopptr = tre ; + dudstop [ tre ] = true ; + } + } + } + else { + + stopptr = schnitt - 1 ; + dudstop [ stopptr ] = true ; + } + } + if ( schnitt < laenge ) + if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] ) + { + spv [ schnitt + 1 ] = true ; + trennen ( 2 , schnitt + 2 , spv , okhelp , tr , dudtr , * + zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) + ; + okstamm = okhelp ; + } + if ( ( schnitt >= 2 ) && ( schnitt < laenge ) ) + if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt + + 1 ] ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) ) + { + trennen ( 5 , schnitt , spv , okhelp , tr , dudtr , * + zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) + ; + okstamm = okstamm || okhelp ; + } + trennen ( 2 , schnitt + 1 , spv , okhelp , tr , dudtr , * + zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okstamm = okstamm || okhelp ; + if ( inform .ausnahme ) + {register integer for_end; i1 = anfang - 1 ; for_end = schnitt + ; if ( i1 <= for_end) do + { + tr [ i1 ] = keine ; + dud [ i1 ] = false ; + dudstop [ stopptr ] = false ; + } + while ( i1++ < for_end ) ; } + else { + + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; + } +* ok1 = *ok1 || okstamm ; + } + else if ( ( anfang == 1 ) && ( schnitt == laenge ) ) + { + dud [ anfang - 1 ] = true ; + tr [ anfang - 1 ] = haupt ; + trennen ( 4 , schnitt + 1 , spv , okstamm , tr , dudtr , * + zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; +* ok1 = *ok1 || okstamm ; + } + } + } + else { + + okstamm = false ; + stopptr = 0 ; + if ( zustand == 1 ) + tr [ anfang - 1 ] = neben ; + else { + + dud [ anfang - 1 ] = true ; + if ( zustand == 5 ) + tr [ anfang - 1 ] = haupt3 ; + else tr [ anfang - 1 ] = haupt ; + } + if ( inform .ausnahme ) + { + if ( inform .erste != 7 ) + { + tre = anfang + inform .erste + 1 ; + tr [ tre ] = neben ; + if ( inform .zweite != 7 ) + { + tre = tre + inform .zweite + 2 ; + if ( inform .untrennbar ) + { + stopptr = tre ; + dudstop [ stopptr ] = true ; + } + else tr [ tre ] = neben ; + } + else { + + if ( inform .untrennbar ) + { + tr [ tre ] = keine ; + stopptr = tre ; + dudstop [ tre ] = true ; + } + } + } + else { + + stopptr = schnitt - 1 ; + dudstop [ stopptr ] = true ; + } + } + if ( schnitt < laenge ) + if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] ) + { + spv [ schnitt + 1 ] = true ; + trennen ( 2 , schnitt + 2 , spv , okhelp , tr , dudtr , * + zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okstamm = okhelp ; + } + if ( ( schnitt >= 2 ) && ( schnitt < laenge ) ) + if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt + 1 ] + ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) ) + { + trennen ( 5 , schnitt , spv , okhelp , tr , dudtr , *zerlegungen , + dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okstamm = okstamm || okhelp ; + } + trennen ( 2 , schnitt + 1 , spv , okhelp , tr , dudtr , *zerlegungen + , dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okstamm = okstamm || okhelp ; + if ( inform .ausnahme ) + {register integer for_end; i1 = anfang - 1 ; for_end = schnitt + ; if ( i1 <= for_end) do + { + tr [ i1 ] = keine ; + dud [ i1 ] = false ; + dudstop [ stopptr ] = false ; + } + while ( i1++ < for_end ) ; } + else { + + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; + } +* ok1 = *ok1 || okstamm ; + } + schnitt = schnitt - 1 ; + nichtok = schnitt == anfang - 1 ; + } + else nichtok = true ; + } while ( ! ( nichtok ) ) ; + } + memcpy((void *)spv, (void *)spvtmp, sizeof(sperrvektor)) ; +} +void zabteilen ( w , tr1 , laenge , ok , zerlegungen ) +wort w ; +trennvektor tr1 ; +integer laenge ; +boolean * ok ; +integer * zerlegungen ; +{/* 99 */ abteilen_regmem + integer i ; + dudt dud ; + varr v ; + intarr ind, k ; + sperrvektor spv, dudstop ; + trennvektor tr, dudtr ; + tr1 [ 0 ] = keine ; + {register integer for_end; i = 0 ; for_end = laenge ; if ( i <= for_end) do + { + tr [ i ] = keine ; + spv [ i ] = false ; + dudstop [ i ] = false ; + dud [ i ] = false ; + if ( i > 0 ) + if ( ( w [ i ] == trennzeichen ) || ( w [ i ] == sonderzeichen ) ) + { +* zerlegungen = 0 ; +* ok = false ; + goto lab99 ; + } + } + while ( i++ < for_end ) ; } +* zerlegungen = 0 ; + trennen ( 3 , 1 , spv , *ok , tr , dudtr , *zerlegungen , dud , v , ind , k , + dudstop , w , tr1 , laenge ) ; + {register integer for_end; i = 0 ; for_end = laenge ; if ( i <= for_end) do + if ( tr1 [ i ] == nebenck ) + { + tr1 [ i ] = keine ; + tr1 [ i - 1 ] = nebenck ; + } + while ( i++ < for_end ) ; } + lab99: ; +} +boolean zisdirtyumlaut ( p ) +halfword p ; +{register boolean Result; isdirtyumlaut_regmem + boolean res ; + halfword q ; + res = false ; + if ( p != 0 ) + if ( mem [ p ] .hh.b0 == 7 ) + if ( mem [ p + 1 ] .hh .v.LH != 0 ) + if ( mem [ mem [ p + 1 ] .hh .v.LH ] .hh .v.RH != 0 ) + if ( mem [ mem [ mem [ p + 1 ] .hh .v.LH ] .hh .v.RH ] .hh .v.RH != 0 ) + { + q = mem [ p + 1 ] .hh .v.LH ; + if ( mem [ q ] .hh.b0 == 12 ) + q = mem [ q ] .hh .v.RH ; + if ( ( mem [ q ] .hh.b0 == 11 ) && ( mem [ q + 1 ] .cint == specletterID ) + && ( mem [ q ] .hh .v.RH >= himemmin ) && ( mem [ mem [ mem [ q ] .hh + .v.RH ] .hh .v.RH ] .hh.b0 == 11 ) ) + res = true ; + } + Result = res ; + return(Result) ; +} +integer zgetcharof ( s ) +halfword s ; +{register integer Result; getcharof_regmem + halfword q ; + q = mem [ s + 1 ] .hh .v.LH ; + if ( mem [ q ] .hh.b0 == 12 ) + q = mem [ q ] .hh .v.RH ; + Result = mem [ mem [ mem [ q ] .hh .v.RH ] .hh .v.RH + 1 ] .cint ; + return(Result) ; +} +integer zgetfontof ( s ) +halfword s ; +{register integer Result; getfontof_regmem + halfword q ; + q = mem [ s + 1 ] .hh .v.LH ; + if ( mem [ q ] .hh.b0 == 12 ) + q = mem [ q ] .hh .v.RH ; + Result = mem [ mem [ q ] .hh .v.RH ] .hh.b0 ; + return(Result) ; +} +void hyphenate ( ) +{/* 50 30 31 40 41 42 45 10 */ hyphenate_regmem + schar i, j, l, kk ; + halfword q, r, s, qq, qr, holdr ; + halfword bchar ; + short xchgchar[11] ; + schar addchar, xchgi, xchgk, xchghu ; + halfword spechyf ; + integer sij ; + halfword majortail, minortail ; + ASCIIcode c ; + schar cloc ; + integer rcount ; + halfword hyfnode ; + triepointer z ; + integer v ; + boolean funktioniert ; + integer zerleg ; + hyphpointer h ; + strnumber k ; + poolpointer u ; + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + hyf [ j ] = 0 ; + while ( j++ < for_end ) ; } + h = hc [ 1 ] ; + incr ( hn ) ; + hc [ hn ] = curlang ; + {register integer for_end; j = 2 ; for_end = hn ; if ( j <= for_end) do + h = ( h + h + hc [ j ] ) % 607 ; + while ( j++ < for_end ) ; } + while ( true ) { + + k = hyphword [ h ] ; + if ( k == 0 ) + goto lab45 ; + if ( ( strstart [ k + 1 ] - strstart [ k ] ) < hn ) + goto lab45 ; + if ( ( strstart [ k + 1 ] - strstart [ k ] ) == hn ) + { + j = 1 ; + u = strstart [ k ] ; + do { + if ( strpool [ u ] < hc [ j ] ) + goto lab45 ; + if ( strpool [ u ] > hc [ j ] ) + goto lab30 ; + incr ( j ) ; + incr ( u ) ; + } while ( ! ( j > hn ) ) ; + s = hyphlist [ h ] ; + while ( s != 0 ) { + + hyf [ mem [ s ] .hh .v.LH ] = 1 ; + s = mem [ s ] .hh .v.RH ; + } + decr ( hn ) ; + goto lab40 ; + } + lab30: ; + if ( h > 0 ) + decr ( h ) ; + else h = 607 ; + } + lab45: decr ( hn ) ; + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + hcsi [ j ] = ktab [ hc [ j ] ] ; + while ( j++ < for_end ) ; } + if ( odd ( eqtb [ 12719 ] .cint / 2 ) ) + { + if ( ! odd ( eqtb [ 12720 ] .cint / 2 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)2 , " *>" ) + ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)2 , " *>" ) ; + } + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " hc:" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " hc:" ) ; + } + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( hc [ j ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( hc [ j ] ) , logfile ); + } + while ( j++ < for_end ) ; } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%c\n", ':' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%c\n", ':' ) ; + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " hc_si:" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " hc_si:" ) ; + } + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( revtab [ hcsi [ j ] ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( revtab [ hcsi [ j ] ] ) , logfile ); + } + while ( j++ < for_end ) ; } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%c\n", ':' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%c\n", ':' ) ; + } + } + if ( odd ( eqtb [ 12719 ] .cint / 4 ) ) + { + if ( ! odd ( eqtb [ 12720 ] .cint / 4 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)4 , " *>" ) + ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)4 , " *>" ) ; + } + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", "< decimal character codes >" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", "< decimal character codes >" ) ; + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " hc:" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " hc:" ) ; + } + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%ld%c", (long)hc [ j ] , '-' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%ld%c", (long)hc [ j ] , '-' ) ; + } + if ( ( ( j + 1 ) % 16 ) == 0 ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " " ) ; + } + } + } + while ( j++ < for_end ) ; } + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " hc_si:" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " hc_si:" ) ; + } + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%ld%c", (long)revtab [ hcsi [ j ] ] , '-' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%ld%c", (long)revtab [ hcsi [ j ] ] , '-' ) ; + } + if ( ( ( j + 1 ) % 16 ) == 0 ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " " ) ; + } + } + } + while ( j++ < for_end ) ; } + println () ; + println () ; + } + abteilen ( hcsi , hyfsi , hn , funktioniert , zerleg ) ; + {register integer for_end; j = 0 ; for_end = 64 ; if ( j <= for_end) do + { + hyfdisc [ j ] = 0 ; + hyfpen [ j ] = 10000 ; + } + while ( j++ < for_end ) ; } + if ( funktioniert ) + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + if ( hyfsi [ j ] == neben ) + hyfpen [ j ] = eqtb [ 12718 ] .cint ; + else if ( hyfsi [ j ] == haupt ) + hyfpen [ j ] = eqtb [ 12666 ] .cint ; + else if ( hyfsi [ j ] == nebenck ) + { + hyfpen [ j + 1 ] = eqtb [ 12718 ] .cint ; + s = getnode ( 2 ) ; + mem [ s ] .hh.b0 = 7 ; + hyfdisc [ j + 1 ] = s ; + mem [ s + 1 ] .hh .v.LH = newpenalty ( eqtb [ 12718 ] .cint ) ; + s = mem [ s + 1 ] .hh .v.LH ; + mem [ s ] .hh.b1 = 0 ; + mem [ s ] .hh .v.RH = newcharacter ( hf , hu [ j + 2 ] ) ; + mem [ mem [ s ] .hh .v.RH ] .hh .v.RH = 0 ; + s = hyfdisc [ j + 1 ] ; + mem [ s + 1 ] .hh .v.RH = 0 ; + mem [ s ] .hh .v.RH = 0 ; + } + else if ( hyfsi [ j ] == haupt3 ) + { + hyfpen [ j - 1 ] = eqtb [ 12666 ] .cint ; + s = getnode ( 2 ) ; + mem [ s ] .hh.b0 = 7 ; + hyfdisc [ j - 1 ] = s ; + mem [ s + 1 ] .hh .v.LH = newpenalty ( eqtb [ 12666 ] .cint ) ; + s = mem [ s + 1 ] .hh .v.LH ; + mem [ s ] .hh.b1 = 1 ; + mem [ s ] .hh .v.RH = newcharacter ( hf , hu [ j ] ) ; + mem [ mem [ s ] .hh .v.RH ] .hh .v.RH = 0 ; + s = hyfdisc [ j - 1 ] ; + mem [ s + 1 ] .hh .v.RH = 0 ; + mem [ s ] .hh .v.RH = 0 ; + } + } + while ( j++ < for_end ) ; } + if ( odd ( eqtb [ 12719 ] .cint / 8 ) ) + { + if ( ! odd ( eqtb [ 12720 ] .cint / 8 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)8 , " *>" ) + ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)8 , " *>" ) ; + } + } + if ( funktioniert ) + { + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + if ( hyfpen [ j ] != 10000 ) + { + if ( hyfdisc [ j ] != 0 ) + { + if ( mem [ mem [ hyfdisc [ j ] + 1 ] .hh .v.LH ] .hh.b1 == 0 ) + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%c%c", Xchr ( hu [ j + 1 ] ) , '-' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%c%c", Xchr ( hu [ j + 1 ] ) , '-' ) ; + } + else { + + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%c%c%c", Xchr ( hu [ j + 1 ] ) , Xchr ( hu [ j + 1 ] ) , '=' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%c%c%c", Xchr ( hu [ j + 1 ] ) , Xchr ( hu [ j + 1 ] ) , '=' ) ; + } + } + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( hu [ j ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( hu [ j ] ) , logfile ); + } + if ( hyfpen [ j ] == eqtb [ 12666 ] .cint ) + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( '=' , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( '=' , logfile ); + } + else { + + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( '-' , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( '-' , logfile ); + } + } + } + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( hu [ j ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( hu [ j ] ) , logfile ); + } + } + while ( j++ < for_end ) ; } + } + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", " no hyphens were found in this word!" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", " no hyphens were found in this word!" ) ; + } + } + println () ; + } + goto lab31 ; + lab40: hyfpen [ 0 ] = 10000 ; + {register integer for_end; j = 1 ; for_end = hn ; if ( j <= for_end) do + if ( odd ( hyf [ j ] ) ) + hyfpen [ j ] = eqtb [ 12666 ] .cint ; + else hyfpen [ j ] = 10000 ; + while ( j++ < for_end ) ; } + lab31: ; + {register integer for_end; j = lhyf ; for_end = hn - rhyf ; if ( j <= + for_end) do + if ( hyfpen [ j ] != 10000 ) + goto lab41 ; + while ( j++ < for_end ) ; } + return ; + lab41: ; + q = mem [ hb ] .hh .v.RH ; + mem [ hb ] .hh .v.RH = 0 ; + r = mem [ ha ] .hh .v.RH ; + mem [ ha ] .hh .v.RH = 0 ; + bchar = 256 ; + holdr = newkern ( 1235 ) ; + mem [ holdr ] .hh .v.RH = r ; + if ( ! ( hb >= himemmin ) ) + if ( mem [ hb ] .hh.b0 == 6 ) + if ( odd ( mem [ hb ] .hh.b1 ) ) + bchar = fontbchar [ hf ] ; + if ( ( ha >= himemmin ) ) + if ( mem [ ha ] .hh.b0 != hf ) + goto lab42 ; + else { + + initlist = ha ; + initlig = false ; + hu [ 0 ] = mem [ ha ] .hh.b1 ; + } + else if ( isdirtyumlaut ( ha ) ) + { + if ( getfontof ( ha ) != hf ) + goto lab42 ; + else { + + initlist = ha ; + initlig = false ; + hu [ 0 ] = getcharof ( ha ) ; + } + } + else if ( mem [ ha ] .hh.b0 == 6 ) + if ( mem [ ha + 1 ] .hh.b0 != hf ) + goto lab42 ; + else { + + initlist = mem [ ha + 1 ] .hh .v.RH ; + initlig = true ; + initlft = ( mem [ ha ] .hh.b1 > 1 ) ; + hu [ 0 ] = mem [ ha + 1 ] .hh.b1 ; + if ( initlist == 0 ) + if ( initlft ) + { + hu [ 0 ] = 256 ; + initlig = false ; + } + freenode ( ha , 2 ) ; + } + else { + + if ( ! ( r >= himemmin ) ) + if ( mem [ r ] .hh.b0 == 6 ) + if ( mem [ r ] .hh.b1 > 1 ) + goto lab42 ; + j = 1 ; + s = ha ; + initlist = 0 ; + goto lab50 ; + } + s = curp ; + while ( mem [ s ] .hh .v.RH != ha ) s = mem [ s ] .hh .v.RH ; + j = 0 ; + goto lab50 ; + lab42: s = ha ; + j = 0 ; + hu [ 0 ] = 256 ; + initlig = false ; + initlist = 0 ; + lab50: qq = holdr ; + {register integer for_end; kk = j ; for_end = hn ; if ( kk <= for_end) do + if ( dirtyumlaut [ kk ] != 0 ) + { + while ( mem [ qq ] .hh .v.RH != dirtyumlaut [ kk ] ) qq = mem [ qq ] .hh + .v.RH ; + qr = mem [ qq ] .hh .v.RH ; + {register integer for_end; i = 1 ; for_end = mem [ qr ] .hh.b1 ; if ( i + <= for_end) do + if ( qr != 0 ) + qr = mem [ qr ] .hh .v.RH ; + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", "...??..X --> ????? !" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", "...??..X --> ????? !" ) ; + } + } + while ( i++ < for_end ) ; } + if ( qr != 0 ) + { + mem [ qq ] .hh .v.RH = mem [ qr ] .hh .v.RH ; + mem [ qr ] .hh .v.RH = 0 ; + } + else mem [ qq ] .hh .v.RH = 0 ; + } + while ( kk++ < for_end ) ; } + if ( dirtyumlaut [ -1 ] != 0 ) + { + qq = holdr ; + while ( ( mem [ qq ] .hh .v.RH != dirtyumlaut [ -1 ] ) && ( mem [ qq ] .hh + .v.RH != 0 ) ) qq = mem [ qq ] .hh .v.RH ; + if ( mem [ qq ] .hh .v.RH == dirtyumlaut [ -1 ] ) + { + mem [ qq ] .hh .v.RH = mem [ dirtyumlaut [ -1 ] ] .hh .v.RH ; + mem [ dirtyumlaut [ -1 ] ] .hh .v.RH = 0 ; + } + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " *** ERROR: node list is damaged! " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " *** ERROR: node list is damaged! " ) ; + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", "(post hyphenation - unhinge a whatsit node)" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", "(post hyphenation - unhinge a whatsit node)" ) ; + } + } + } + r = holdr ; + while ( mem [ r ] .hh .v.RH != 0 ) { + + if ( ( memmin <= mem [ r ] .hh .v.RH ) && ( mem [ r ] .hh .v.RH <= memmax + ) ) + r = mem [ r ] .hh .v.RH ; + else { + + (void) putc('\n', logfile ); + (void) putc('\n', stdout ); + (void) fprintf( logfile , "%s\n", "???$ - ERROR in node list!" ) ; + (void) fprintf( stdout , "%s\n", "???$ - ERROR in node list!" ) ; + kk = depththreshold ; + l = breadthmax ; + depththreshold = 100 ; + breadthmax = 100 ; + shownodelist ( holdr ) ; + mem [ r ] .hh .v.RH = 0 ; + depththreshold = kk ; + breadthmax = l ; + } + } + flushnodelist ( holdr ) ; + if ( dirtyumlaut [ -1 ] != 0 ) + { + mem [ s ] .hh .v.RH = dirtyumlaut [ -1 ] ; + s = mem [ s ] .hh .v.RH ; + } + do { + if ( dirtyumlaut [ j ] != 0 ) + { + mem [ s ] .hh .v.RH = dirtyumlaut [ j ] ; + while ( mem [ s ] .hh .v.RH > 0 ) s = mem [ s ] .hh .v.RH ; + mem [ memtop - 4 ] .hh .v.RH = 0 ; + j = j + 1 ; + hyphenpassed = 0 ; + if ( hyfpen [ j - 1 ] != 10000 ) + { + l = j ; + hyphenpassed = j - 1 ; + if ( odd ( eqtb [ 12719 ] .cint / 16 ) ) + { + if ( ! odd ( eqtb [ 12720 ] .cint / 16 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)16 , " *>" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)16 , " *>" ) ; + } + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", " *** append a hyphen immediatly after a dirty umlaut!" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", " *** append a hyphen immediatly after a dirty umlaut!" ) ; + } + } + } + } + else { + + l = j ; + j = reconstitute ( j , hn , bchar , hyfchar ) + 1 ; + if ( hyphenpassed == 0 ) + { + mem [ s ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + while ( mem [ s ] .hh .v.RH > 0 ) s = mem [ s ] .hh .v.RH ; + if ( hyfpen [ j - 1 ] != 10000 ) + { + l = j ; + hyphenpassed = j - 1 ; + mem [ memtop - 4 ] .hh .v.RH = 0 ; + } + } + } + if ( hyphenpassed > 0 ) + do { + r = getnode ( 2 ) ; + mem [ r ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + mem [ r ] .hh.b0 = 7 ; + majortail = r ; + rcount = 0 ; + while ( mem [ majortail ] .hh .v.RH > 0 ) { + + majortail = mem [ majortail ] .hh .v.RH ; + incr ( rcount ) ; + } + i = hyphenpassed ; + hyf [ i ] = 0 ; + if ( ( hyfpen [ i ] != 10000 ) && ( hyfpen [ i ] != eqtb [ 12666 ] .cint + ) ) + minortail = newpenalty ( hyfpen [ i ] ) ; + else minortail = 0 ; + hyfpen [ i ] = 10000 ; + mem [ r + 1 ] .hh .v.LH = minortail ; + hyfnode = newcharacter ( hf , hyfchar ) ; + xchgk = i ; + if ( hyfdisc [ xchgk ] != 0 ) + { + spechyf = mem [ hyfdisc [ xchgk ] + 1 ] .hh .v.LH ; + addchar = mem [ spechyf ] .hh.b1 ; + xchgi = 1 ; + do { + spechyf = mem [ spechyf ] .hh .v.RH ; + if ( spechyf != 0 ) + { + xchgchar [ xchgi ] = mem [ spechyf ] .hh.b1 ; + incr ( xchgi ) ; + } + } while ( ! ( spechyf == 0 ) ) ; + if ( hyfnode != 0 ) + { + xchgchar [ xchgi ] = hyfchar ; + { + mem [ hyfnode ] .hh .v.RH = avail ; + avail = hyfnode ; + ; +#ifdef STAT + decr ( dynused ) ; +#endif /* STAT */ + } + } + else decr ( xchgi ) ; + xchghu = i - xchgi + addchar + 2 ; + {register integer for_end; xchgk = 1 ; for_end = xchgi ; if ( xchgk + <= for_end) do + { + xchgchar [ 0 ] = hu [ xchghu ] ; + hu [ xchghu ] = xchgchar [ xchgk ] ; + xchgchar [ xchgk ] = xchgchar [ 0 ] ; + incr ( xchghu ) ; + } + while ( xchgk++ < for_end ) ; } + xchgk = i ; + i = xchghu - 1 ; + xchghu = xchghu - xchgi ; + } + else if ( hyfnode != 0 ) + { + incr ( i ) ; + c = hu [ i ] ; + hu [ i ] = hyfchar ; + { + mem [ hyfnode ] .hh .v.RH = avail ; + avail = hyfnode ; + ; +#ifdef STAT + decr ( dynused ) ; +#endif /* STAT */ + } + } + while ( l <= i ) { + + l = reconstitute ( l , i , fontbchar [ hf ] , 256 ) + 1 ; + if ( mem [ memtop - 4 ] .hh .v.RH > 0 ) + { + if ( minortail == 0 ) + mem [ r + 1 ] .hh .v.LH = mem [ memtop - 4 ] .hh .v.RH ; + else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + minortail = mem [ memtop - 4 ] .hh .v.RH ; + while ( mem [ minortail ] .hh .v.RH > 0 ) minortail = mem [ + minortail ] .hh .v.RH ; + } + } + if ( hyfdisc [ xchgk ] != 0 ) + { + i = xchgk ; + l = i + 1 ; + {register integer for_end; xchgk = 1 ; for_end = xchgi ; if ( xchgk + <= for_end) do + { + hu [ xchghu ] = xchgchar [ xchgk ] ; + incr ( xchghu ) ; + } + while ( xchgk++ < for_end ) ; } + } + else if ( hyfnode != 0 ) + { + hu [ i ] = c ; + l = i ; + decr ( i ) ; + } + minortail = 0 ; + mem [ r + 1 ] .hh .v.RH = 0 ; + cloc = 0 ; + if ( bcharlabel [ hf ] < fontmemsize ) + { + decr ( l ) ; + c = hu [ l ] ; + cloc = l ; + hu [ l ] = 256 ; + } + while ( l < j ) { + + do { + l = reconstitute ( l , hn , bchar , 256 ) + 1 ; + if ( cloc > 0 ) + { + hu [ cloc ] = c ; + cloc = 0 ; + } + if ( mem [ memtop - 4 ] .hh .v.RH > 0 ) + { + if ( minortail == 0 ) + mem [ r + 1 ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + minortail = mem [ memtop - 4 ] .hh .v.RH ; + while ( mem [ minortail ] .hh .v.RH > 0 ) minortail = mem [ + minortail ] .hh .v.RH ; + } + } while ( ! ( l >= j ) ) ; + while ( l > j ) { + + j = reconstitute ( j , hn , bchar , 256 ) + 1 ; + mem [ majortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + while ( mem [ majortail ] .hh .v.RH > 0 ) { + + majortail = mem [ majortail ] .hh .v.RH ; + incr ( rcount ) ; + } + } + } + if ( rcount > 127 ) + { + mem [ s ] .hh .v.RH = mem [ r ] .hh .v.RH ; + mem [ r ] .hh .v.RH = 0 ; + flushnodelist ( r ) ; + } + else { + + mem [ s ] .hh .v.RH = r ; + mem [ r ] .hh.b1 = rcount ; + } + s = majortail ; + hyphenpassed = j - 1 ; + mem [ memtop - 4 ] .hh .v.RH = 0 ; + } while ( ! ( ( hyfpen [ j - 1 ] == 10000 ) ) ) ; + } while ( ! ( j > hn ) ) ; + mem [ s ] .hh .v.RH = q ; + siq = s ; + {register integer for_end; j = 0 ; for_end = 64 ; if ( j <= for_end) do + if ( hyfdisc [ j ] != 0 ) + { + flushnodelist ( hyfdisc [ j ] ) ; + } + while ( j++ < for_end ) ; } + flushlist ( initlist ) ; +} diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/texd.h b/obsolete/systems/sisisi/unix/SiTeX3.14/texd.h new file mode 100644 index 0000000000..d53c464953 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/texd.h @@ -0,0 +1,485 @@ +#undef TRIP +#undef TRAP +#define STAT +#undef DEBUG +#include "../common/texmf.h" +#define memmax 262140L +#define memmin 0 +#define bufsize 3000 +#define errorline 79 +#define halferrorline 50 +#define maxprintline 79 +#define stacksize 300 +#define maxinopen 15 +#define fontmax 255 +#define fontmemsize 72000L +#define paramsize 60 +#define nestsize 40 +#define maxstrings 7500 +#define stringvacancies 74000L +#define poolsize 100000L +#define savesize 4000 +#define triesize 24000 +#define trieopsize 750 +#define negtrieopsize -750 +#define mintrieop 0 +#define maxtrieop 500 +#define dvibufsize 16384 +#define poolname "sitex.pool" +#define memtop 262140L +#define maxwl 64 +#define sonderzeichen 0 +#define bsta 1 +#define bstb 2 +#define bstc 3 +#define bstd 4 +#define bste 5 +#define bstf 6 +#define bstg 7 +#define bsth 8 +#define bsti 9 +#define bstj 10 +#define bstk 11 +#define bstl 12 +#define bstm 13 +#define bstn 14 +#define bsto 15 +#define bstp 16 +#define bstq 17 +#define bstr 18 +#define bsts 19 +#define bstt 20 +#define bstu 21 +#define bstv 22 +#define bstw 23 +#define bstx 24 +#define bsty 25 +#define bstz 26 +#define bstae 27 +#define bstoe 28 +#define bstue 29 +#define bstsz 30 +#define trennzeichen 31 +#define keine 1 +#define neben 2 +#define nebenck 3 +#define haupt 4 +#define haupt3 5 +#define tabsize 8191 +#define specletterID 4321 +#define voka 1 +#define voke 2 +#define voki 3 +#define voko 4 +#define voku 5 +#define vokae 6 +#define vokoe 7 +#define vokue 8 +#define vokie 9 +#define vokai 10 +#define vokei 11 +#define vokau 12 +#define vokaeu 13 +#define vokeu 14 +#define voky 15 +#define kons 16 +typedef unsigned char ASCIIcode ; +typedef unsigned char eightbits ; +typedef integer poolpointer ; +typedef integer strnumber ; +typedef unsigned char packedASCIIcode ; +typedef integer scaled ; +typedef integer nonnegativeinteger ; +typedef schar smallnumber ; +typedef unsigned char quarterword ; +typedef integer halfword ; +typedef schar twochoices ; +typedef schar fourchoices ; +#include "memory.h" +typedef schar glueord ; +typedef struct { + short modefield ; + halfword headfield, tailfield ; + integer pgfield, mlfield ; + memoryword auxfield ; + quarterword lhmfield, rhmfield ; +} liststaterecord ; +typedef schar groupcode ; +typedef struct { + quarterword statefield, indexfield ; + halfword startfield, locfield, limitfield, namefield ; +} instaterecord ; +typedef integer internalfontnumber ; +typedef integer fontindex ; +typedef integer dviindex ; +typedef integer trieopcode ; +typedef integer triepointer ; +typedef eightbits string80 [81] ; +typedef eightbits buchstabe ; +typedef short aword [maxwl + 1] ; +typedef aword wort ; +typedef boolean sperrvektor [maxwl + 1] ; +typedef boolean dudt [maxwl + 1] ; +typedef integer trennvektor [maxwl + 1] ; +typedef buchstabe ktabtype [256] ; +typedef unsigned long verdschlue ; +typedef verdschlue varr [maxwl + 1] ; +typedef integer intarr [maxwl + 1] ; +typedef struct { + boolean ausnahme ; + boolean untrennbar ; + integer erste ; + integer zweite ; + boolean endung, vorsilbe, stamm, ehervor, stammallein ; +} infotype ; +typedef eightbits infobyte ; +typedef struct { + verdschlue tabv ; + infobyte tabb ; + boolean frei ; + boolean wiederfrei ; +} tableentry ; +typedef eightbits hashelement [4] ; +typedef hashelement htabtype [tabsize + 1] ; +typedef short hyphpointer ; +EXTERN integer bad ; +EXTERN ASCIIcode xord[256] ; +EXTERN ASCIIcode xchr[256] ; +EXTERN char nameoffile[FILENAMESIZE + 1] ; +EXTERN integer namelength ; +EXTERN ASCIIcode buffer[bufsize + 1] ; +EXTERN integer first ; +EXTERN integer last ; +EXTERN integer maxbufstack ; +EXTERN packedASCIIcode strpool[poolsize + 1] ; +EXTERN poolpointer strstart[maxstrings + 1] ; +EXTERN poolpointer poolptr ; +EXTERN strnumber strptr ; +EXTERN poolpointer initpoolptr ; +EXTERN strnumber initstrptr ; +#ifdef INITEX +EXTERN alphafile poolfile ; +#endif /* INITEX */ +EXTERN alphafile logfile ; +EXTERN schar selector ; +EXTERN schar dig[23] ; +EXTERN integer tally ; +EXTERN integer termoffset ; +EXTERN integer fileoffset ; +EXTERN ASCIIcode trickbuf[errorline + 1] ; +EXTERN integer trickcount ; +EXTERN integer firstcount ; +EXTERN schar interaction ; +EXTERN boolean deletionsallowed ; +EXTERN schar history ; +EXTERN schar errorcount ; +EXTERN strnumber helpline[6] ; +EXTERN schar helpptr ; +EXTERN boolean useerrhelp ; +EXTERN integer interrupt ; +EXTERN boolean OKtointerrupt ; +EXTERN boolean aritherror ; +EXTERN scaled remainder ; +EXTERN halfword tempptr ; +EXTERN memoryword +#define zmem (zzzaa - (int)(memmin)) + zzzaa[memmax - memmin + 1] ; +EXTERN halfword lomemmax ; +EXTERN halfword himemmin ; +EXTERN integer varused, dynused ; +EXTERN halfword avail ; +EXTERN halfword memend ; +EXTERN halfword rover ; +#ifdef DEBUG +EXTERN boolean +#define freearr (zzzab - (int)(memmin)) + zzzab[memmax - memmin + 1] ; +EXTERN boolean +#define wasfree (zzzac - (int)(memmin)) + zzzac[memmax - memmin + 1] ; +EXTERN halfword wasmemend, waslomax, washimin ; +EXTERN boolean panicking ; +#endif /* DEBUG */ +EXTERN integer fontinshortdisplay ; +EXTERN integer depththreshold ; +EXTERN integer breadthmax ; +EXTERN liststaterecord nest[nestsize + 1] ; +EXTERN integer nestptr ; +EXTERN integer maxneststack ; +EXTERN liststaterecord curlist ; +EXTERN short shownmode ; +EXTERN schar oldsetting ; +EXTERN memoryword zeqtb[13510] ; +EXTERN quarterword +#define xeqlevel (zzzad -12663) + zzzad[847] ; +EXTERN twohalves +#define hash (zzzae -514) + zzzae[9767] ; +EXTERN halfword hashused ; +EXTERN boolean nonewcontrolsequence ; +EXTERN integer cscount ; +EXTERN memoryword savestack[savesize + 1] ; +EXTERN integer saveptr ; +EXTERN integer maxsavestack ; +EXTERN quarterword curlevel ; +EXTERN groupcode curgroup ; +EXTERN integer curboundary ; +EXTERN integer magset ; +EXTERN eightbits curcmd ; +EXTERN halfword curchr ; +EXTERN halfword curcs ; +EXTERN halfword curtok ; +EXTERN instaterecord inputstack[stacksize + 1] ; +EXTERN integer inputptr ; +EXTERN integer maxinstack ; +EXTERN instaterecord curinput ; +EXTERN integer inopen ; +EXTERN integer openparens ; +EXTERN alphafile inputfile[maxinopen + 1] ; +EXTERN integer line ; +EXTERN integer linestack[maxinopen + 1] ; +EXTERN schar scannerstatus ; +EXTERN halfword warningindex ; +EXTERN halfword defref ; +EXTERN halfword paramstack[paramsize + 1] ; +EXTERN integer paramptr ; +EXTERN integer maxparamstack ; +EXTERN integer alignstate ; +EXTERN integer baseptr ; +EXTERN halfword parloc ; +EXTERN halfword partoken ; +EXTERN boolean forceeof ; +EXTERN halfword curmark[5] ; +EXTERN schar longstate ; +EXTERN halfword pstack[9] ; +EXTERN integer curval ; +EXTERN schar curvallevel ; +EXTERN smallnumber radix ; +EXTERN glueord curorder ; +EXTERN alphafile readfile[16] ; +EXTERN schar readopen[17] ; +EXTERN halfword condptr ; +EXTERN schar iflimit ; +EXTERN smallnumber curif ; +EXTERN integer ifline ; +EXTERN integer skipline ; +EXTERN strnumber curname ; +EXTERN strnumber curarea ; +EXTERN strnumber curext ; +EXTERN poolpointer areadelimiter ; +EXTERN poolpointer extdelimiter ; +EXTERN integer formatdefaultlength ; +EXTERN ccharpointer TEXformatdefault ; +EXTERN boolean nameinprogress ; +EXTERN strnumber jobname ; +EXTERN boolean logopened ; +EXTERN bytefile dvifile ; +EXTERN strnumber outputfilename ; +EXTERN strnumber logname ; +EXTERN bytefile tfmfile ; +EXTERN memoryword fontinfo[fontmemsize + 1] ; +EXTERN fontindex fmemptr ; +EXTERN internalfontnumber fontptr ; +EXTERN fourquarters fontcheck[fontmax + 1] ; +EXTERN scaled fontsize[fontmax + 1] ; +EXTERN scaled fontdsize[fontmax + 1] ; +EXTERN halfword fontparams[fontmax + 1] ; +EXTERN strnumber fontname[fontmax + 1] ; +EXTERN strnumber fontarea[fontmax + 1] ; +EXTERN eightbits fontbc[fontmax + 1] ; +EXTERN eightbits fontec[fontmax + 1] ; +EXTERN halfword fontglue[fontmax + 1] ; +EXTERN boolean fontused[fontmax + 1] ; +EXTERN integer hyphenchar[fontmax + 1] ; +EXTERN integer skewchar[fontmax + 1] ; +EXTERN fontindex bcharlabel[fontmax + 1] ; +EXTERN short fontbchar[fontmax + 1] ; +EXTERN short fontfalsebchar[fontmax + 1] ; +EXTERN integer charbase[fontmax + 1] ; +EXTERN integer widthbase[fontmax + 1] ; +EXTERN integer heightbase[fontmax + 1] ; +EXTERN integer depthbase[fontmax + 1] ; +EXTERN integer italicbase[fontmax + 1] ; +EXTERN integer ligkernbase[fontmax + 1] ; +EXTERN integer kernbase[fontmax + 1] ; +EXTERN integer extenbase[fontmax + 1] ; +EXTERN integer parambase[fontmax + 1] ; +EXTERN fourquarters nullcharacter ; +EXTERN integer totalpages ; +EXTERN scaled maxv ; +EXTERN scaled maxh ; +EXTERN integer maxpush ; +EXTERN integer lastbop ; +EXTERN integer deadcycles ; +EXTERN boolean doingleaders ; +EXTERN quarterword c, f ; +EXTERN scaled ruleht, ruledp, rulewd ; +EXTERN halfword g ; +EXTERN integer lq, lr ; +EXTERN eightbits dvibuf[dvibufsize + 1] ; +EXTERN dviindex halfbuf ; +EXTERN dviindex dvilimit ; +EXTERN dviindex dviptr ; +EXTERN integer dvioffset ; +EXTERN integer dvigone ; +EXTERN halfword downptr, rightptr ; +EXTERN scaled dvih, dviv ; +EXTERN scaled curh, curv ; +EXTERN internalfontnumber dvif ; +EXTERN integer curs ; +EXTERN scaled totalstretch[4], totalshrink[4] ; +EXTERN integer lastbadness ; +EXTERN halfword adjusttail ; +EXTERN integer packbeginline ; +EXTERN twohalves emptyfield ; +EXTERN fourquarters nulldelimiter ; +EXTERN halfword curmlist ; +EXTERN smallnumber curstyle ; +EXTERN smallnumber cursize ; +EXTERN scaled curmu ; +EXTERN boolean mlistpenalties ; +EXTERN internalfontnumber curf ; +EXTERN quarterword curc ; +EXTERN fourquarters curi ; +EXTERN integer magicoffset ; +EXTERN halfword curalign ; +EXTERN halfword curspan ; +EXTERN halfword curloop ; +EXTERN halfword alignptr ; +EXTERN halfword curhead, curtail ; +EXTERN halfword justbox ; +EXTERN halfword passive ; +EXTERN halfword printednode ; +EXTERN halfword passnumber ; +EXTERN scaled activewidth[7] ; +EXTERN scaled curactivewidth[7] ; +EXTERN scaled background[7] ; +EXTERN scaled breakwidth[7] ; +EXTERN boolean noshrinkerroryet ; +EXTERN halfword curp ; +EXTERN boolean secondpass ; +EXTERN boolean finalpass ; +EXTERN integer threshold ; +EXTERN integer minimaldemerits[4] ; +EXTERN integer minimumdemerits ; +EXTERN halfword bestplace[4] ; +EXTERN halfword bestplline[4] ; +EXTERN scaled discwidth ; +EXTERN halfword easyline ; +EXTERN halfword lastspecialline ; +EXTERN scaled firstwidth ; +EXTERN scaled secondwidth ; +EXTERN scaled firstindent ; +EXTERN scaled secondindent ; +EXTERN halfword bestbet ; +EXTERN integer fewestdemerits ; +EXTERN halfword bestline ; +EXTERN integer actuallooseness ; +EXTERN integer linediff ; +EXTERN aword hc ; +EXTERN smallnumber hn ; +EXTERN halfword ha, hb ; +EXTERN integer hyfdebi, hyfdebj ; +EXTERN boolean hyfdebb ; +EXTERN halfword sip, siq, sir, sis ; +EXTERN internalfontnumber hf ; +EXTERN short hu[64] ; +EXTERN integer hyfchar ; +EXTERN ASCIIcode curlang ; +EXTERN integer lhyf, rhyf ; +EXTERN halfword +#define dirtyumlaut (zzzaf +1) + zzzaf[66] ; +EXTERN schar hyf[65] ; +EXTERN halfword initlist ; +EXTERN boolean initlig ; +EXTERN boolean initlft ; +EXTERN integer hyfpen[65] ; +EXTERN trennvektor hyfsi ; +EXTERN wort hcsi ; +EXTERN halfword hyfdisc[65] ; +EXTERN smallnumber hyphenpassed ; +EXTERN halfword curl, curr ; +EXTERN halfword curq ; +EXTERN halfword ligstack ; +EXTERN boolean ligaturepresent ; +EXTERN boolean lfthit, rthit ; +EXTERN halfword trietrl[triesize + 1] ; +EXTERN halfword trietro[triesize + 1] ; +EXTERN quarterword trietrc[triesize + 1] ; +EXTERN smallnumber hyfdistance[trieopsize + 1] ; +EXTERN smallnumber hyfnum[trieopsize + 1] ; +EXTERN quarterword hyfnext[trieopsize + 1] ; +EXTERN integer opstart[256] ; +EXTERN ktabtype ktab ; +EXTERN htabtype htab ; +EXTERN integer anzahl ; +EXTERN alphafile hashfile ; +EXTERN integer kombtab[6][6] ; +EXTERN boolean konsonant[31] ; +EXTERN integer revtab[256] ; +EXTERN strnumber hyphword[608] ; +EXTERN halfword hyphlist[608] ; +EXTERN hyphpointer hyphcount ; +#ifdef INITEX +EXTERN integer +#define trieophash (zzzag - (int)(negtrieopsize)) + zzzag[trieopsize - negtrieopsize + 1] ; +EXTERN trieopcode trieused[256] ; +EXTERN ASCIIcode trieoplang[trieopsize + 1] ; +EXTERN trieopcode trieopval[trieopsize + 1] ; +EXTERN integer trieopptr ; +#endif /* INITEX */ +EXTERN trieopcode maxopused ; +EXTERN boolean smallop ; +#ifdef INITEX +EXTERN packedASCIIcode triec[triesize + 1] ; +EXTERN trieopcode trieo[triesize + 1] ; +EXTERN triepointer triel[triesize + 1] ; +EXTERN triepointer trier[triesize + 1] ; +EXTERN triepointer trieptr ; +EXTERN triepointer triehash[triesize + 1] ; +#endif /* INITEX */ +#ifdef INITEX +EXTERN boolean trietaken[triesize + 1] ; +EXTERN triepointer triemin[256] ; +EXTERN triepointer triemax ; +EXTERN boolean trienotready ; +#endif /* INITEX */ +EXTERN scaled bestheightplusdepth ; +EXTERN halfword pagetail ; +EXTERN schar pagecontents ; +EXTERN scaled pagemaxdepth ; +EXTERN halfword bestpagebreak ; +EXTERN integer leastpagecost ; +EXTERN scaled bestsize ; +EXTERN scaled pagesofar[8] ; +EXTERN halfword lastglue ; +EXTERN integer lastpenalty ; +EXTERN scaled lastkern ; +EXTERN integer insertpenalties ; +EXTERN boolean outputactive ; +EXTERN internalfontnumber mainf ; +EXTERN fourquarters maini ; +EXTERN fourquarters mainj ; +EXTERN fontindex maink ; +EXTERN halfword mainp ; +EXTERN integer mains ; +EXTERN halfword bchar ; +EXTERN halfword falsebchar ; +EXTERN boolean cancelboundary ; +EXTERN boolean insdisc ; +EXTERN halfword curbox ; +EXTERN halfword aftertoken ; +EXTERN boolean longhelpseen ; +EXTERN strnumber formatident ; +EXTERN wordfile fmtfile ; +EXTERN integer readyalready ; +EXTERN alphafile writefile[16] ; +EXTERN boolean writeopen[18] ; +EXTERN halfword writeloc ; +EXTERN poolpointer editnamestart ; +EXTERN integer editnamelength, editline, tfmtemp ; + +#include "coerce.h" diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.c b/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.c new file mode 100644 index 0000000000..f4a956fd17 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.c @@ -0,0 +1,334 @@ +/* + * This program converts (mostly) the pseudo-Pascal generated by Tangle to C. + * The output depends on many C macros and some postprocessing by other + * programs. + * + * Arguments: + * -f: force strict interpretation of semantics of for stmt + * (never used with TeX and friends) + * -t: special optimizations for tex.p->tex.c + * -m: special optimizations for mf.p->mf.c + * -c: supply the base part of the name of the coerce.h file + * -h: supply the name of the standard header file + * -a: generate ANSI-style function prototypes + * -d: generate some additional debugging output + * + * The majority of this program (which includes ptoc.yacc and ptoc.lex) + * was written by Tomas Rokicki, with modifications by Tim Morgan, et al. + */ + +#include <stdio.h> +#include "web2cy.h" +#include "web2c.h" + + +/* Changing this value will probably stimulate bugs in some + preprocessors---those which want to put the expansion of a macro + entirely on one line. */ +#define max_line_length (78) +#define max_strings (50000) +#define hash_prime (101) +#define sym_table_size (5000) +#define unused (271828) + +/* Says whether to give voluminous progress reports. */ +boolean debug=FALSE; +int indent = 0; +int line_pos = 0; +int last_brace = 0; +int block_level = 0; +int last_tok; +int tex = 0, strict_for = 0, mf = 0; + +char safe_string[80]; +char var_list[500]; +char field_list[500]; +char last_id[80]; +char z_id[80]; +char next_temp[] = "zzzaa"; +char coerce_name[100] = "coerce.h"; + +long last_i_num; +int ii, l_s; +long lower_bound, upper_bound; +extern FILE *fopen(); +FILE *std; +FILE *coerce; +int pf_count = 1; +#ifdef ANSI +boolean ansi = TRUE; +#else +boolean ansi = FALSE; +#endif + +char *std_header = "null.h"; /* Default include filename */ + +char strings[max_strings]; +int hash_list[hash_prime]; +short global = 1; +#ifdef MS_DOS +struct sym_entry huge sym_table[sym_table_size]; +#else +struct sym_entry sym_table[sym_table_size]; +#endif +int next_sym_free = -1, next_string_free = 0; +int mark_sym_free, mark_string_free; + +extern int yyleng; +#ifdef FLEX +extern char *yytext; +#else /* LEX */ +#ifdef HP +extern unsigned char yytext[]; +#else /* not HP */ +extern char yytext[]; +#endif /* not HP */ +#endif /* LEX */ + +void find_next_temp() +{ + next_temp[4]++; + if (next_temp[4] > 'z') { + next_temp[4] = 'a'; + next_temp[3]++; + } +} + +void normal() +{ + std = stdout; +} + +void new_line() +{ + if (!std) + return; + if (line_pos > 0) { + (void) putc('\n', std); + line_pos = 0; + } +} + +void indent_line() +{ + new_line(); +} + + +/* Output the string S to `std'. */ + +void +my_output (s) + char *s; +{ + int len = strlen (s); + int less_indent = 0; + + if (!std) + return; + + if (line_pos + len > max_line_length) + indent_line (); + + if (indent > 1 && (strcmp(s, "case") == 0 || strcmp(s, "default") == 0)) + less_indent = 2; + + while (line_pos < indent * 2 - less_indent) + { + fputs (" ", std); + line_pos += 2; + } + + (void) fprintf (std, "%s ", s); + line_pos += len + 1; + + last_brace = (s[0] == '}'); +} + +void semicolon() +{ + if (!last_brace) { + my_output(";"); + indent_line(); + last_brace = 1; + } +} + + +/* Since a syntax error can never be recovered from, we exit here with + bad status. */ + +void yyerror(s) char *s; +{ + (void) fflush(stdout); + (void) fprintf(stderr, " %s\n", s); + (void) fprintf(stderr, "Last token = %d, ", last_tok); + (void) fprintf(stderr, "error buffer = `%s',\n\t", yytext); + (void) fprintf(stderr, "last id = `%s' (", last_id); + ii = search_table(last_id); + if (ii == -1) + (void) fprintf(stderr, "not in symbol table"); + else + switch (sym_table[ii].typ) { + case undef_id_tok: + (void) fprintf(stderr, "undefined"); + break; + case var_id_tok: + (void) fprintf(stderr, "variable"); + break; + case const_id_tok: + (void) fprintf(stderr, "constant"); + break; + case type_id_tok: + (void) fprintf(stderr, "type"); + break; + case proc_id_tok: + (void) fprintf(stderr, "parameterless procedure"); + break; + case proc_param_tok: + (void) fprintf(stderr, "procedure with parameters"); + break; + case fun_id_tok: + (void) fprintf(stderr, "parameterless function"); + break; + case fun_param_tok: + (void) fprintf(stderr, "function with parameters"); + break; + default: + (void) fprintf(stderr, "unknown!"); + break; + } + fprintf(stderr, ").\n"); + exit(1); + if (debug) { + (void) fprintf(stderr, "Next sym free = %d\n", next_sym_free); + (void) fprintf(stderr, "Mark sym = %d\n", mark_sym_free); + (void) fprintf(stderr, "Next string free = %d\n", next_string_free); + (void) fprintf(stderr, "Mark string = %d\n", mark_string_free); + } +} + +int hash(id) char *id; +{ + register int i = 0, j; + for (j = 0; id[j] != 0; j++) + i = (i + i + id[j]) % hash_prime; + return (i); +} + +int search_table(id) char *id; +{ + int ptr; + ptr = hash_list[hash(id)]; + while (ptr != -1) { + if (strcmp(id, sym_table[ptr].id) == 0) + return (ptr); + else + ptr = sym_table[ptr].next; + } + return (-1); +} + +int add_to_table(id) char *id; +{ + int h, ptr; + h = hash(id); + ptr = hash_list[h]; + hash_list[h] = (++next_sym_free); + sym_table[next_sym_free].next = ptr; + sym_table[next_sym_free].val = unused; + sym_table[next_sym_free].id = strings + next_string_free; + sym_table[next_sym_free].var_formal = FALSE; + sym_table[next_sym_free].var_not_needed = FALSE; + (void) strcpy(strings + next_string_free, id); + next_string_free += strlen(id) + 1; + return (next_sym_free); +} + +void remove_locals() +{ + int h, ptr; + for (h = 0; h < hash_prime; h++) { + next_sym_free = mark_sym_free; + next_string_free = mark_string_free; + ptr = hash_list[h]; + while (ptr > next_sym_free) + ptr = sym_table[ptr].next; + hash_list[h] = ptr; + } + global = 1; +} + +void +mark() +{ + mark_sym_free = next_sym_free; + mark_string_free = next_string_free; + global = 0; +} + + +void +initialize() +{ + register int i; + + for (i = 0; i < hash_prime; hash_list[i++] = -1) + ; + + normal (); + + coerce = fopen (coerce_name, "w"); + if (coerce == NULL) + { + perror (coerce_name); + exit (1); + } +} + +void +main (argc, argv) + int argc; + char *argv[]; +{ + int error, i; + + for (i=1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { + case 't': + tex = TRUE; + break; + case 'm': + mf = TRUE; + break; + case 'f': + strict_for = TRUE; + break; + case 'h': + std_header = &argv[i][2]; + break; + case 'd': + debug = TRUE; + break; + case 'a': + ansi = TRUE; + break; + case 'c': + (void) sprintf(coerce_name, "%s.h", &argv[i][2]); + break; + default: + fprintf(stderr, "Unknown option %s, ignored\n", argv[i]); + break; + } + else { + fprintf(stderr, "Unknown option %s, ignored\n", argv[i]); + } + + initialize (); + error = yyparse (); + new_line (); + + if (debug) + (void) fprintf(stderr, "%d symbols.\n", next_sym_free); + + exit(error); +} diff --git a/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.h b/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.h new file mode 100644 index 0000000000..44fe85653c --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.14/web2c.h @@ -0,0 +1,93 @@ +/* web2c.h: general includes for web2c. */ + +#include <stdio.h> +#include "site.h" +#include "common.h" + +#ifdef SYSV +#define bcopy(s,d,n) memcpy((d),(s),(n)) +#define bcmp(s1,s2,n) memcmp((s1),(s2),(n)) +#define bzero(s,n) memset((s),0,(n)) +#endif + +#ifdef __GNUC__ +#define alloca __builtin_alloca +#else +#ifdef sparc +#include <alloca.h> +#else +char *alloca (); +#endif +#endif + +#define ex_32 (2) +#define ex_real (3) +#define max(a,b) ((a>b)?a:b) + +extern int indent; +extern int line_pos; +extern int last_brace; +extern int block_level; +extern int ii; +extern int last_tok; + +extern char safe_string[80]; +extern char var_list[500]; +extern char field_list[500]; +extern char last_id[80]; +extern char z_id[80]; +extern char next_temp[]; + +extern long last_i_num; +extern int ii, l_s; +extern long lower_bound, upper_bound; +extern FILE *fopen(); +extern FILE *std; +extern int pf_count; + +#include "symtab.h" + +extern char strings[]; +extern int hash_list[]; +extern short global; +#ifdef MS_DOS +extern struct sym_entry huge sym_table[]; +#else +extern struct sym_entry sym_table[]; +#endif +extern int next_sym_free, next_string_free; +extern int mark_sym_free, mark_string_free; + +#ifdef FLEX_SCANNER +extern char *yytext; + +#else /* LEX */ +#ifdef HP +extern unsigned char yytext[]; +#else +extern char yytext[]; +#endif + +#endif /* LEX */ + +#ifdef ANSI +extern void exit(int); +extern int yyparse(void); +void find_next_temp(void); +void normal(void); +void new_line(void); +void indent_line(void); +void my_output(char *); +void semicolon(void); +void yyerror(char *); +int hash(char *); +int search_table(char *); +int add_to_table(char *); +void remove_locals(void); +void mark(void); +void initialize(void); +void main(int,char * *); +#else /* not ANSI */ +void find_next_temp(), normal(), new_line(), indent_line(), my_output(); +void semicolon(), yyerror(), remove_locals(), mark(), initialize(); +#endif /* not ANSI */ diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/install b/obsolete/systems/sisisi/unix/SiTeX3.141/install new file mode 100644 index 0000000000..8b56943f99 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.141/install @@ -0,0 +1,205 @@ +#!/bin/sh + +TEXSRC="/users/heinz/src/tex/TeX-3.141/TeX3.141" +MAKEDIR=$TEXSRC +TEXDIR=$MAKEDIR/tex +WEBDIR=$MAKEDIR/web +WEB2CDIR=$MAKEDIR/web2c +SISISIDIR="/users/heinz/src/tex/sisisi/SiTeX3.141" + +echo "*** SiTeX 3.141 Installation program" +echo "*** ================================" +echo "***" +echo "*** Do not forget to retrieve the files *.tex and *.sty" +echo "*** from eiunix.tuwien.ac.at:/pub/sisisi/COMMON and" +echo "*** copy them into your TEXINPUTS path." +echo "***" +echo "***" +echo "*** Before the installation can continue, you have to" +echo "*** follow the guidelines from the TeX3.141 distribution" +echo "*** and set the pathnames in the several Makefile.in" +echo "*** for your site's needs." +echo "*** Do not run configure, it is started by this script." +echo "***" +echo "*** If you want to stop the installation, press 'q' now." +echo "*** Press <cr> to continue." + +read x +if [ "$x" = "q" ] +then + exit +fi + + +echo +echo "Starting installation of SiTeX3.141" +echo + +cd $TEXDIR +echo "Changing to $TEXDIR" +if [ ! -f tex.web.orig ] +then + echo "Saving tex.web in tex.web.orig" + mv tex.web tex.web.orig +fi +if [ ! -f tex.ch.orig ] +then + echo "Saving tex.ch in tex.ch.orig" + mv tex.ch tex.ch.orig +fi +if [ ! -f Makefile.orig ] +then + echo "Saving Makefile in Makefile.orig" + mv Makefile Makefile.orig +fi +echo "Modifying Makefile for tex9.c" +sed -e 's/^objs=/objs=tex9.o /' -e 's/tex9\.o: tex8\.c/tex9.o: tex9.c/'\ + < Makefile.orig > Makefile + +cd $SISISIDIR +echo "Changing to $SISISIDIR" +echo "Uncompressing sitex.web.Z to $TEXDIR/tex.web" +uncompress <sitex.web.Z >$TEXDIR/tex.web +echo "Copying tex.ch to $TEXDIR/tex.ch" +cp tex.ch $TEXDIR/tex.ch + +cd $WEBDIR +echo "Changing to $WEBDIR" +if [ ! -f tangle.ch.orig ] +then + echo "Saving tangle.ch in tangle.ch.orig" + mv tangle.ch tangle.ch.orig +fi +echo "Modifying tangle.ch for bigger name space" +sed -e '/@!stack_size=50/i\ +@!max_names=4000; {number of identifiers, strings, module names;\ + must be less than 10240}\ +@y\ +@!max_names=9000; {number of identifiers, strings, module names;\ + must be less than 10240}\ +@z\ +\ +@x' < tangle.ch.orig > tangle.ch +sleep 5 +touch tangleboot.p +sleep 5 +touch tangleboot.c tangleboot.h + +cd $WEB2CDIR +echo "Changing to $WEB2CDIR" +if [ ! -f web2c.c.orig ] +then + echo "Saving web2c.c in web2c.c.orig" + mv web2c.c web2c.c.orig +fi +if [ ! -f web2c.h.orig ] +then + echo "Saving web2c.h in web2c.h.orig" + mv web2c.h web2c.h.orig +fi +echo "Modifying web2c.[ch] for bigger tables" +sed -e 's/var_list\[200]/var_list\[500]/'\ + -e 's/field_list\[200]/field_list\[500]/' < web2c.c.orig > web2c.c +sed -e 's/var_list\[200]/var_list\[500]/'\ + -e 's/field_list\[200]/field_list\[500]/' < web2c.h.orig > web2c.h + +cd $MAKEDIR +echo "Changing to $MAKEDIR" +echo "Running configure" +./configure + +echo "*** Now that configure has finished, you might want" +echo "*** to inspect or change the Makefiles, as suggested" +echo "*** in TeX3.141's INSTALL file (Step 4)." +echo "*** Press 's' to suspend the installation and start" +echo "*** an interactive shell, <cr> to continue." + +read x +if [ "$x" = "s" ] +then + echo "Type 'exit' to quit the shell and continue with the installation." + ${SHELL:-/bin/sh} +fi + +cd $MAKEDIR +echo "Changing to $MAKEDIR" +echo "Now starting: \`make TeX'" +make TeX + +cd $TEXDIR +echo "Now starting error correction" +echo "Changing to $TEXDIR" +echo "Correcting coerce.h" +sed -e 's/(string80)//g' -e 's/(sperrvektor)//g' -e 's/(wort)//g'\ + -e 's/(dudt)//g' -e 's/(intarr)//g' -e 's/(varr)//g'\ + -e 's/(trennvektor)//g' -e 's/(hashelement)//g'\ + -e 's/(infotype)//g' -e 's/(tableentry)//g' < coerce.h > coerce.h.new +mv coerce.h.new coerce.h +echo "Correcting texd.h" +sed -e 's/typedef integer verdschlue/typedef unsigned long verdschlue/'\ + < texd.h > texd.h.new +mv texd.h.new texd.h +echo "Correcting tex6.c" +sed -e 's/) ]/] )/g' -e 's/) ]/] )/g' -e 's/\(hashfile.*,.*\)"%ld"/\1"%4ld"/g'\ + -e 's/integer vacc/long vacc/' -e 's/\(vacc = [0-9][0-9]*\)/\1L/'\ + -e 's/\(indacc = [0-9][0-9]*\)/\1L/' -e 's/\(kacc = [0-9][0-9]*\)/\1L/'\ + -e '/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*0.*].*).*;/i\ + integer help;'\ + -e 's/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*\([0-9]\).*].*).*;/\ + fscanf ( hashfile, "%d", \&help );\ + htab [i][\1] = (eightbits) help;/' < tex6.c > tex6.c.new +mv tex6.c.new tex6.c + +cd $MAKEDIR +echo "Returning to $MAKEDIR" +echo "Continuing: \`make TeX'" +make TeX + +cd $TEXDIR +if [ ! -x virtex ] +then + echo "*** There seems to be something wrong; virtex doesn't exist." + echo "*** Obviously, the installation has failed." + exit 1 +fi + +echo "Creating the formatfiles in $TEXDIR" +echo +echo "If siplain.tex, silplain.tex, sihyphen.tex and def_umlaut.tex are not" +echo "in one of the TEXINPUTS directories, you will now run into trouble." +echo "(You will be prompted for their pathnames and have to type in" +echo "the whole stuff.)" + +mv tex.pool sitex.pool +TEXPOOL=. ./initex siplain.tex \\dump +if [ -f siplain.fmt ] +then + mv siplain.fmt sitex.fmt + echo "...sitex.fmt created" +else + echo "siplain.fmt not created for unknown reasons." +fi +TEXPOOL=. ./initex silplain.tex \\dump +if [ -f silplain.fmt ] +then + mv silplain.fmt silatex.fmt + echo "...silatex.fmt created" +else + echo "silplain.fmt not created for unknown reasons." +fi + +echo "*** The installation is now complete." +echo "*** You should find the following files in $TEXDIR:" +echo "***" +echo "*** sitex.fmt, silatex.fmt, hf3," +echo "*** sitex.pool, virtex and initex." +echo "***" +echo "*** Now copy sitex.fmt and silatex.fmt into a TEXFORMAT-Dir," +echo "*** virtex and initex into a directory holding executables" +echo "*** (preferably as sivirtex and siinitex), hf3 into" +echo "*** a TEXINPUTDIR, and sitex.pool into the TEXPOOLDIR." +echo "*** Also create links silatex and sitex to sivirtex, and" +echo "*** a link named siplain.fmt to sitex.fmt, all in the" +echo "*** appropriate directories." + +exit 0 diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/install.other b/obsolete/systems/sisisi/unix/SiTeX3.141/install.other new file mode 100644 index 0000000000..072f2ca78c --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.141/install.other @@ -0,0 +1,204 @@ +#!/bin/sh + +TEXSRC="/users/heinz/src/tex/TeX-3.141/TeX3.141" +MAKEDIR=$TEXSRC/web2c-5.851d +TEXDIR=$MAKEDIR/tex +WEBDIR=$MAKEDIR/web +WEB2CDIR=$MAKEDIR/web2c +SISISIDIR="/users/heinz/src/tex/sisisi/SiTeX3.141" + +echo "*** SiTeX 3.141 Installation program" +echo "*** ================================" +echo "***" +echo "*** Do not forget to retrieve the files *.tex and *.sty" +echo "*** from eiunix.tuwien.ac.at:/pub/sisisi/COMMON and" +echo "*** copy them into your TEXINPUTS path." +echo "***" +echo "***" +echo "*** Before the installation can continue, you have to" +echo "*** follow the guidelines from the TeX3.141 distribution" +echo "*** and set the pathnames in the several Makefile.in" +echo "*** for your site's needs." +echo "*** Do not run configure, it is started by this script." +echo "***" +echo "*** If you want to stop the installation, press 'q' now." +echo "*** Press <cr> to continue." + +read x +if [ "$x" = "q" ] +then + exit +fi + + +echo +echo "Starting installation of SiTeX3.141" +echo + +cd $TEXDIR +echo "Changing to $TEXDIR" +if [ ! -f tex.web.orig ] +then + echo "Saving tex.web in tex.web.orig" + mv tex.web tex.web.orig +fi +if [ ! -f tex.ch.orig ] +then + echo "Saving tex.ch in tex.ch.orig" + mv tex.ch tex.ch.orig +fi +if [ ! -f Makefile.in.orig ] +then + echo "Saving Makefile.in in Makefile.in.orig" + mv Makefile.in Makefile.in.orig +fi +echo "Modifying Makefile.in for tex9.c" +sed -e 's/#.*tex9_o/tex9_o/' < Makefile.in.orig > Makefile.in + +cd $SISISIDIR +echo "Changing to $SISISIDIR" +echo "Uncompressing sitex.web.Z to $TEXDIR/tex.web" +uncompress <sitex.web.Z >$TEXDIR/tex.web +echo "Copying tex.ch to $TEXDIR/tex.ch" +cp tex.ch $TEXDIR/tex.ch + +cd $WEBDIR +echo "Changing to $WEBDIR" +if [ ! -f tangle.ch.orig ] +then + echo "Saving tangle.ch in tangle.ch.orig" + mv tangle.ch tangle.ch.orig +fi +echo "Modifying tangle.ch for bigger name space" +sed -e '/@!stack_size=50/i\ +@!max_names=4000; {number of identifiers, strings, module names;\ + must be less than 10240}\ +@y\ +@!max_names=9000; {number of identifiers, strings, module names;\ + must be less than 10240}\ +@z\ +\ +@x' < tangle.ch.orig > tangle.ch +sleep 5 +touch tangleboot.p +sleep 5 +touch tangleboot.c tangleboot.h + +cd $WEB2CDIR +echo "Changing to $WEB2CDIR" +if [ ! -f web2c.c.orig ] +then + echo "Saving web2c.c in web2c.c.orig" + mv web2c.c web2c.c.orig +fi +if [ ! -f web2c.h.orig ] +then + echo "Saving web2c.h in web2c.h.orig" + mv web2c.h web2c.h.orig +fi +echo "Modifying web2c.[ch] for bigger tables" +sed -e 's/var_list\[200]/var_list\[500]/'\ + -e 's/field_list\[200]/field_list\[500]/' < web2c.c.orig > web2c.c +sed -e 's/var_list\[200]/var_list\[500]/'\ + -e 's/field_list\[200]/field_list\[500]/' < web2c.h.orig > web2c.h + +cd $MAKEDIR +echo "Changing to $MAKEDIR" +echo "Running configure" +./configure + +echo "*** Now that configure has finished, you might want" +echo "*** to inspect or change the Makefiles, as suggested" +echo "*** in TeX3.141's INSTALL file (Step 4)." +echo "*** Press 's' to suspend the installation and start" +echo "*** an interactive shell, <cr> to continue." + +read x +if [ "$x" = "s" ] +then + echo "Type 'exit' to quit the shell and continue with the installation." + ${SHELL:-/bin/sh} +fi + +cd $MAKEDIR +echo "Changing to $MAKEDIR" +echo "Now starting: \`make TeX'" +make TeX + +cd $TEXDIR +echo "Now starting error correction" +echo "Changing to $TEXDIR" +echo "Correcting coerce.h" +sed -e 's/(string80)//g' -e 's/(sperrvektor)//g' -e 's/(wort)//g'\ + -e 's/(dudt)//g' -e 's/(intarr)//g' -e 's/(varr)//g'\ + -e 's/(trennvektor)//g' -e 's/(hashelement)//g'\ + -e 's/(infotype)//g' -e 's/(tableentry)//g' < coerce.h > coerce.h.new +mv coerce.h.new coerce.h +echo "Correcting texd.h" +sed -e 's/typedef integer verdschlue/typedef unsigned long verdschlue/'\ + < texd.h > texd.h.new +mv texd.h.new texd.h +echo "Correcting tex6.c" +sed -e 's/) ]/] )/g' -e 's/) ]/] )/g' -e 's/\(hashfile.*,.*\)"%ld"/\1"%4ld"/g'\ + -e 's/integer vacc/long vacc/' -e 's/\(vacc = [0-9][0-9]*\)/\1L/'\ + -e 's/\(indacc = [0-9][0-9]*\)/\1L/' -e 's/\(kacc = [0-9][0-9]*\)/\1L/'\ + -e '/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*0.*].*).*;/i\ + integer help;'\ + -e 's/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*\([0-9]\).*].*).*;/\ + fscanf ( hashfile, "%d", \&help );\ + htab [i][\1] = (eightbits) help;/' < tex6.c > tex6.c.new +mv tex6.c.new tex6.c + +cd $MAKEDIR +echo "Returning to $MAKEDIR" +echo "Continuing: \`make TeX'" +make TeX + +cd $TEXDIR +if [ ! -x virtex ] +then + echo "*** There seems to be something wrong; virtex doesn't exist." + echo "*** Obviously, the installation has failed." + exit 1 +fi + +echo "Creating the formatfiles in $TEXDIR" +echo +echo "If siplain.tex, silplain.tex, sihyphen.tex and def_umlaut.tex are not" +echo "in one of the TEXINPUTS directories, you will now run into trouble." +echo "(You will be prompted for their pathnames and have to type in" +echo "the whole stuff.)" + +mv tex.pool sitex.pool +TEXPOOL=. ./initex siplain.tex \\dump +if [ -f siplain.fmt ] +then + mv siplain.fmt sitex.fmt + echo "...sitex.fmt created" +else + echo "siplain.fmt not created for unknown reasons." +fi +TEXPOOL=. ./initex silplain.tex \\dump +if [ -f silplain.fmt ] +then + mv silplain.fmt silatex.fmt + echo "...silatex.fmt created" +else + echo "silplain.fmt not created for unknown reasons." +fi + +echo "*** The installation is now complete." +echo "*** You should find the following files in $TEXDIR:" +echo "***" +echo "*** sitex.fmt, silatex.fmt, hf3," +echo "*** sitex.pool, virtex and initex." +echo "***" +echo "*** Now copy sitex.fmt and silatex.fmt into a TEXFORMAT-Dir," +echo "*** virtex and initex into a directory holding executables" +echo "*** (preferably as sivirtex and siinitex), hf3 into" +echo "*** a TEXINPUTDIR, and sitex.pool into the TEXPOOLDIR." +echo "*** Also create links silatex and sitex to sivirtex, and" +echo "*** a link named siplain.fmt to sitex.fmt, all in the" +echo "*** appropriate directories." + +exit 0 diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/sitex.web.gz b/obsolete/systems/sisisi/unix/SiTeX3.141/sitex.web.gz Binary files differnew file mode 100644 index 0000000000..c4842ccebf --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.141/sitex.web.gz diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/sitex3.ch b/obsolete/systems/sisisi/unix/SiTeX3.141/sitex3.ch new file mode 100644 index 0000000000..3c9a647f72 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.141/sitex3.ch @@ -0,0 +1,2834 @@ +========================================================================= + +SI_TEX.CHA Change file for SISISI-hyphenation in TeX 3.1 16.7.1991 + (c) for SISISI-hyphenation: Wilhelm Barth, Heinrich Nirschl + (c) for TeX changes: Heini Hofstaedter, Harald Mueller + (c) UNIX Version: F. Zwerina, H.-J. Szoldatics, Heinz Herbeck + + additional changes until 10. October 1991 HH + additional changes for TeX3.141 July 1993 Heinz Herbeck +========================================================================= + +This is the change file for inclusion of SISISI into TeX V.3.14. + +There are three main changes in this file (which are of course quite +intermingled): + + 1) the replacement of Liang's hyphenation by SISISI. + + 2) the change of the interface of the actual hyphenation + to the post-hyphenation and the line-break algorithm. + + This change is necessary because in original TeX, only the + information "hyphen - no hyphen" can be transmitted to the + line break algorithm because of two "bottlenecks": + + 1. Hyphenation --> Post-Hyphenation: Here a hyphen at position i + is marked by the 1-bit information odd(hyf[i]). + 2. Post-Hyphenation --> Line-Breaking: Here a hyphen is marked + by the existence of a discretionary node. + + From SISISI, there must be more information flowing to the + line-break algorithm: + + a. Is a hyphen a main hyphen or a "nebenhyphen"? To this end, + a change is made such that a penalty node is allowed as + the first node in the prebreak list of a discretionary + node. This penalty node contains the penalty associated with + this specific hyphen. For "nebenhyphens", this value is set + by an additional primitive "\nebenhyphenpenalty". + Instead of the hyf-array, an array hyfpen is used that + contains the actual penalties; the old "if odd(hyf[i])" now + is converted ti "if hyfpen[i] <> inf_penalty". + + b. A hyphen may be more complicated than a single -: ck-hyphens + and triple-consonant-hyphens may be present. To include these, + another array hyf_disc is introduced that contains ready-made + discretionary nodes for such hyphens. + + At first, we simply wanted to include these discretionary + during the post-hyphenation into the new node list. But then + Heini felt that the impossiblity of ligatures with parts of such + a discretionary node was not acceptable; therefore he introdiced + the "x-mechanism" (characterized by many variables starting with + "x") and changed the reconstitute function so that more than the + single hyphen_char could be introduced into the reconstitution + process. + + 3) "Dirty" changes for the hyphenation of words with umlauts. + These changes are necessary because the umlauts in TeX are not + (necessarily) real characters, but something else (see definition + of umlauts in plain.tex or german.tex). + Ordinarily, the hyphenation only accepts sequences of letters, + ligatures (which are expanded to their single characters), and + so-called "implicit kerns". An umlaut, however, is usually + represented as a letter character and another character consisting + of two dots ("dieresis character"), which are connected by + explicit kerns (not implicite ones!). Therefore, words containing + umlauts are not hyphenable words in TeX, which is not acceptable + for german texts. + + Therefore, we devised a "bypass" for umlauts as follows: An umlaut + is now represented as a special discretionary node (so-called + "dirty umlaut") as follows: + \discretionary{\kern4321sp m\kern<code>sp\kern<back>sp\kern-1em}% + {}% + {<umlaut>} + where the 4321sp is a "marker" for the "dirty umlaut", the "m" + letter is used to derive the font of the umlaut, <code> is + the font number that should be associated with this umlaut (the + font numbers of the umlauts are given below); and <back> is used + to cancel the preceding kerns, i.e.\ <back> = - (4321 + <code>). + + In other words, the prebreak list contains the information that + this is an umlaut (albeit a "dirty" one) and some more + information needed for the hyphenation, the postbreak list is + empty, and the main list contains the umlaut proper. By a + special if-statement in the line-break algorithm, a hyphenation + at a discretionary node of this format is suppressed, so that + always the umlaut of the main list is printed. + The font numbers for the lowercase umlauts (which are given + in the second \kern node) must be: + ae 228 + oe 246 + ue 252 + The codes for the uppercase umlauts can be chosen arbitrarily. + + In order to get the hyphenation for these "dirty umlauts" + running, one must include lccode assignments of the form + \lccode<code>=<lccode> + for each of the new letters (see example below). + + A typical declaration of the "dirty umlauts" runs like this: + +%%%%%%%%%%%%%%%%%%%%% declaration of dirty umlauts %%%%%%%%%%%%%%%%%%%%%% +\def\A"{\discretionary{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\"A}} +\def\a"{\discretionary{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\"a}} +\def\O"{\discretionary{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\"O}} +\def\o"{\discretionary{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\"o}} +\def\U"{\discretionary{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\"U}} +\def\u"{\discretionary{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\"u}} +\lccode196=228 % uppercase umlaut A +\lccode214=246 % uppercase umlaut O +\lccode220=252 % uppercase umlaut U +\lccode228=228 % uppercase umlaut a +\lccode246=246 % uppercase umlaut o +\lccode252=252 % uppercase umlaut u +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +When (if?) one day N.Schwarz's DC/EC fonts arrive, the changes of the +third kind can be eliminated. How long this will take ... well, wait and +see. +But when they arrive, it's not longer possible to choose the codes for +uppercase umlauts arbitrarily. The codes for uppercase umlauts will +then be those, shown in the example above. + +========================================================================= + +At first, we add a control sequence \SISISI. +@x +\def\PASCAL{Pascal} +@y +\def\SISISI{{\sl SISISI}} +\def\PASCAL{Pascal} + +\let\maybe=\iffalse % print only changed modules +@z + +------------------------------------------------------------------------- + +@x +@d banner=='This is TeX, Version 3.141' {printed when \TeX\ starts} +@y +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)' +@z + +------------------------------------------------------------------------- + +A number of procedures of SISISI are declared after the TeX program. As +these procedures are used in the hyphenation, of course, they must be +declared as `forward'. + In web2c gibt es keine forward's !!!! +%@x +%procedure initialize; {this procedure gets things started properly} +%@y +%@<forward declarations@> +%procedure initialize; {this procedure gets things started properly} +%@z + +------------------------------------------------------------------------- +%@x +%@d pool_name_length=8 +%@y +%@d pool_name_length=11 +% {number of characters of ``pool_f_name''} +%@z +%see the following change of the pool file name "pool_f_name" +------------------------------------------------------------------------- + +@x +@!pool_name='TeXformats:TEX.POOL '; +@y +@!pool_name='TeXformats:SITEX3.POOL '; +@z + +------------------------------------------------------------------------- + +@x +else bad_pool('! I can''t read TEX.POOL.') +@.I can't read TEX.POOL@> +@y +else bad_pool('! I can''t read SITEX3.POOL.') +@.I can't read TEX.POOL@> +@z +========================================================================= + +To have all messages, coming from SI_TEX, displayed on screen +and written to the log-file simultanously, we make the following, +additional definitions. + temp nicht mehr vorhanden, in log ve„ndert. +@x +@d wlog_ln(#)==write_ln(log_file,#) +@d wlog_cr==write_ln(log_file) +@y +@d wlog_ln(#)==write_ln(log_file,#) +@d wlog_cr==write_ln(log_file) + +@d si_put(#) == @+ begin + if (file_offset<>0)or(term_offset<>0) then print_ln; + if selector<>log_only then wterm(#); + if (selector=log_only)or(selector=term_and_log) then + wlog(#); + end +@d si_put_ln(#) == @+ begin + if (file_offset<>0)or(term_offset<>0) then print_ln; + if selector<>log_only then wterm_ln(#); + if (selector=log_only)or(selector=term_and_log) then + wlog_ln(#); + end +@d si_put_cr == print_ln + + +@d dbg_put(#) == {} +@d dbg_put_ln(#) == {} +@d dbg_put_cr == {} +@z +========================================================================= + +We add a new primitive \nebenhyphenpenalty for setting the penalty of a +minor hyphen: + +@x +@d int_pars=55 {total number of integer parameters} +@d count_base=int_base+int_pars {256 user \.{\\count} registers} +@y +@d neben_hyphen_penalty_code=55 {penalty for break after neben-hyphen} +@d si_debug_code=56 {value is treated as an set of active debugging sections} +@d supress_debug_mark_code=57 {same as above; if a section number is set, then + the output of the section number and the debugging output banner + of this section is supressed} +@d int_pars=58 {total number of integer parameters} +@d count_base=int_base+int_pars {256 user \.{\\count} registers} +@z +------------------------------------------------------------------------- +@x +@<Assign the values |depth_threshold:=show_box_depth|...@>= +@y +@d neben_hyphen_penalty==int_par(neben_hyphen_penalty_code) +@d si_debug(#) == if odd(int_par(si_debug_code) div #) then begin + if not odd(int_par(supress_debug_mark_code)div #) then + begin + si_put_cr; + si_put_ln(' <* debugging output section #',#:#,' *>'); + end; {marking supression} + { dig_count entfernt !!! } +@d gubed_si == end +@f si_debug == begin +@f gubed_si == end +@f gubed == nil + + +@<Assign the values |depth_threshold:=show_box_depth|...@>= +@z +------------------------------------------------------------------------- +@x +othercases print("[unknown integer parameter!]") +@y +neben_hyphen_penalty_code:print_esc("nebenhyphenpenalty"); +si_debug_code:print_esc("sidebug"); +supress_debug_mark_code:print_esc("supressdebugmark"); +othercases print("[unknown integer parameter!]") +@z +------------------------------------------------------------------------- +@x +@ @<Cases of |print_cmd_chr|...@>= +@y +primitive("nebenhyphenpenalty",assign_int,int_base+neben_hyphen_penalty_code);@/ +@!@:neben_hyphen_penalty_}{\.{\\nebenhyphenpenalty} primitive@> +primitive("sidebug",assign_int,int_base+si_debug_code); +primitive("supressdebugmark",assign_int,int_base+supress_debug_mark_code); +@ @<Cases of |print_cmd_chr|...@>= +@z + +========================================================================= + +As now hyphens may have different penalties, we must somehow associate +a penalty with a discretionary node. We do this by allowing a penalty +node as the first node in the prebreak list of a discretionary node. + +The following changes are in two case statements that check the nodes +in the sublists of a discretionary node; we add an empty case for +penalty nodes (two more case statements follow a little bit later). + +@x + othercases confusion("disc1") +@y + penalty_node: ; + othercases confusion("disc1") +@z +------------------------------------------------------------------------- +@x + othercases confusion("disc2") +@y + penalty_node: ; + othercases confusion("disc2") +@z + +========================================================================= + +MAIN CHANGE 2) + +The following change is in the line-break section, where try_break is +given the penalty stored in the penalty node. This change is the reason +for all other changes concerning penalties. Moreover, in this change +a line break is suppressed if the discretionary node is actually +a "dirty umlaut" (via "if not is_dirty_umlaut(cur_p) then ... try_break"). + +@x +begin s:=pre_break(cur_p); disc_width:=0; +if s=null then try_break(ex_hyphen_penalty,hyphenated) +else begin repeat @<Add the width of node |s| to |disc_width|@>; + s:=link(s); + until s=null; + act_width:=act_width+disc_width; + try_break(hyphen_penalty,hyphenated); + act_width:=act_width-disc_width; + end; +r:=replace_count(cur_p); s:=link(cur_p); +while r>0 do + begin @<Add the width of node |s| to |act_width|@>; + decr(r); s:=link(s); + end; +prev_p:=cur_p; cur_p:=s; goto done5; +end + +@y +begin + s:=pre_break(cur_p); disc_width:=0; + if s=null then try_break(ex_hyphen_penalty,hyphenated) + else if (type(s)=penalty_node) and (link(s)=null) then begin + flush_node_list(s); s := null; + try_break(ex_hyphen_penalty,hyphenated); end + else if not is_dirty_umlaut(cur_p) then begin + if type(s)=penalty_node then s:=link(s); + repeat @<Add the width of node |s| to |disc_width|@>; + s:=link(s); + until s=null; + act_width:=act_width+disc_width; + if type(pre_break(cur_p))=penalty_node then begin + try_break(penalty(pre_break(cur_p)),hyphenated) end + else begin try_break(hyphen_penalty,hyphenated); end; + act_width:=act_width-disc_width; + end; + r:=replace_count(cur_p); s:=link(cur_p); + while r>0 do begin + @<Add the width of node |s| to |act_width|@>; + decr(r); s:=link(s); + end; + prev_p:=cur_p; cur_p:=s; goto done5; +end + +@z + +========================================================================= + +Two more case statements. + +@x + othercases confusion("disc3") +@y + penalty_node: ; + othercases confusion("disc3") +@z + +------------------------------------------------------------------------- + +@x + othercases confusion("disc4") +@y + penalty_node: ; + othercases confusion("disc4") +@z + +========================================================================= + +There's a little problem, converting a device independent (``.dvi'') +to a post script file (``.ps''). I think that this program part could +cause this problem. so let's see... + +!a <-- = --> @x With this, i want to try to reproduce this error. + Because, after i had inserted this change, that error didn`t occur + again! +@<Modify the end of the line...@>= +q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false; +if q<>null then {|q| cannot be a |char_node|} + if type(q)=glue_node then + begin delete_glue_ref(glue_ptr(q)); + glue_ptr(q):=right_skip; + subtype(q):=right_skip_code+1; add_glue_ref(right_skip); + goto done; + end + else begin if type(q)=disc_node then + @<Change discretionary to compulsory and set + |disc_break:=true|@> + else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0; + end +else begin q:=temp_head; + while link(q)<>null do q:=link(q); + end; +@<Put the \(r)\.{\\rightskip} glue after node |q|@>; +done: +!a <-- = --> @y +@<Modify the end of the line...@>= +q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false; +if q<>null then {|q| cannot be a |char_node|} + if type(q)=glue_node then + begin delete_glue_ref(glue_ptr(q)); + glue_ptr(q):=right_skip; + subtype(q):=right_skip_code+1; add_glue_ref(right_skip); + goto done; + end + else begin + if type(q)=disc_node then begin + hyfdeb_b:=false; + if is_dirty_umlaut(q) then begin + si_debug(64) hyfdeb_b:=true; gubed_si; + si_put_cr; + si_put_ln(' ??? There's a line break at a dirty umlaut!?'); + end; + if not hyfdeb_b then begin + @<Change discretionary to compulsory and set |disc_break:=true|@> + end; + end else + if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0; + end else begin + q:=temp_head; + while link(q)<>null do q:=link(q); + end; +@<Put the \(r)\.{\\rightskip} glue after node |q|@>; +done: +!a <-- = --> @z + + +========================================================================= + +If the break actually occurs, the penalty node is made a separate list +with only one node, which is immediately flushed. + +@x +begin s:=pre_break(q); link(q):=s; +while link(s)<>null do s:=link(s); +pre_break(q):=null; q:=s; +end +@y +begin + s:=pre_break(q); + if type(s)=penalty_node then begin + s:=link(s); + link(pre_break(q)):= null; + flush_node_list(pre_break(q)); + end; + link(q):=s; + while link(s)<>null do s:=link(s); + pre_break(q):=null; q:=s; +end +@z + +========================================================================= + +The type `array[0..65] of 0..256' is needed more often, so we make it +an explicit type (see big SISISI change at end of change file). hc is +now declared of this type. + +@x +@!hc:array[0..65] of 0..256; {word to be hyphenated} +@!hn:small_number; {the number of positions occupied in |hc|} +@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} +@y +@!hc:a_word; {word to be hyphenated} +@!hn:small_number; {the number of positions occupied in |hc|} +@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} +{ some variables for debugging output } +@!hyfdeb_i,hyfdeb_j: integer; +@!hyfdeb_b:boolean; +@!si_p, si_q, si_r, si_s: pointer; +@z + +------------------------------------------------------------------------- + +Our hyphenation routines need even more "more local variables". + +@x +@ Hyphenation routines need a few more local variables. +@y +@!dirty_umlaut:array [-1..64] of pointer; {the [-1] field is used, if a + whatsit node occurs inbetween a word. This can happen due to + Partl's changes in ``german.sty'' } + +@ Hyphenation routines need a few more local variables. +@z + +------------------------------------------------------------------------- + +@x +@!j:small_number; {an index into |hc| or |hu|} +@y +@!qq:pointer; +@!j:small_number; {two indices into |hc| or |hu|} +@!jj:integer; +@z + +========================================================================= + +The dirty_umlaut array must be initialized for each word. +And we enable watching the node list, representing the word +to be hyphenated. + +@x +if s<>null then + begin @<Skip to node |ha|, or |goto done1| if no hyphenation +@y +si_p:=cur_p; si_q:=null; +for jj:=-1 to 64 do dirty_umlaut[jj] := null; +if s<>null then begin + si_debug(1) +{ hyfdeb_i:=depth_threshold; depth_threshold:=100; + hyfdeb_j:=breadth_max; breadth_max:=100; +} + show_node_list(si_p); +{ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; } + gubed_si; + @<Skip to node |ha|, or |goto done1| if no hyphenation +@z + +------------------------------------------------------------------------- + +@x + hyphenate; + end; +done1: end +@y + hyphenate; + end; +done1: +si_debug(32) + hyfdeb_i := depth_threshold; hyfdeb_j := breadth_max; + if si_q<>null then begin + depth_threshold:=100; {show all levels of a list} + breadth_max:=200; {show all nodes of one level of a list} + si_r:=link(si_q); link(si_q):=null; + end else begin + (* take the values, set by the user, for this variables! *) + breadth_max:=show_box_breadth; depth_threshold:=show_box_depth; + end; + show_node_list(si_p); + si_put_cr; + if si_q <> null then link( si_q ) := si_r; + + depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; +gubed_si; +end +@z + +========================================================================= + +MAIN CHANGE 1) + +Here, we add the SISISI-procedure abteilen for use in hyphenate and +another label done1. + +@x +procedure hyphenate; +label common_ending,done,found,found1,found2,not_found,exit; +var @<Local variables for hyphenation@>@; +@y + +@<Handling of dirty umlauts@> + +procedure hyphenate; +label common_ending,done,done1,found,found1,found2,not_found,exit; +var @<Local variables for hyphenation@>@; +@z + +========================================================================= + +MAIN CHANGE 3) + +The prehyphenation loop must now also skip over the "dirty umlauts". + +@x +loop@+ begin if is_char_node(s) then + begin c:=qo(character(s)); hf:=font(s); + end + else if type(s)=ligature_node then + if lig_ptr(s)=null then goto continue + else begin q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q); + end + else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue + else if type(s)=whatsit_node then + begin @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + goto continue; + end + else goto done1; + if lc_code(c)<>0 then + if (lc_code(c)=c)or(uc_hyph>0) then goto done2 +@y +loop@+ begin + if is_char_node(s) then begin + c:=qo(character(s)); hf:=font(s); + end else if type(s)=ligature_node then begin + if lig_ptr(s)=null then goto continue + else begin + q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q); + end + end else if is_dirty_umlaut(s) then begin + c:=get_char_of(s); hf:=get_font_of(s); + end else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue + else if type(s)=whatsit_node then begin + @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + goto continue; + end else goto done1; + + if lc_code(c)<>0 then + if (lc_code(c)=c)or(uc_hyph>0) then goto done2 +@z + +========================================================================= + +MAIN CHANGE 2) + +The interface variables for the hyphenation are extended: hyfpen[i] +holds the actual penalty of a hyphen at position i, hyf_disc[i] +contains a "special discretionary" for triple-consonant-hyphens and +ck-hyphens. hc_si is the word as given to the SISISI algorithm; +hyf_si is returned from SISISI and contains markers for the hyphens. + +After this change, there are many changes where `odd(hyf[i])' is +simply replaced by `hyfpen[i]<>inf_penalty'. + +Another procedure to be changed is `reconstitute': It now has to handle +special dicretionary nodes. For a detailed feeling about the code changes +in reconstitute, either (1) look through it bit by bit, or (2) ask Heini +Hofstaedter. + +@x + end + else if type(s)=ligature_node then + @<Move the characters of a ligature node to |hu| and |hc|; + but |goto done3| if they are not all letters@> +@y + end else if is_dirty_umlaut(s) then begin + if get_font_of(s)<>hf then goto done3; + c:=get_char_of(s); + if lc_code(c)=0 then goto done3; + if hn=63 then goto done3; + hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=lc_code(c); + dirty_umlaut[hn]:=s; + for jj:=1 to replace_count(s) do s:=link(s); + end else if type(s)=whatsit_node then begin + @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + dirty_umlaut[-1]:=s; + end else if type(s)=ligature_node then + @<Move the characters of a ligature node to |hu| and |hc|; + but |goto done3| if they are not all letters@> +@z + +========================================================================= + +MAIN CHANGE 3) + +Also in the conversion loop (where the node list is shuffled into the +hc array), we must skip a "dirty umlaut". + +@x +loop@+ begin if not(is_char_node(s)) then + case type(s) of + ligature_node: do_nothing; +@y +loop@+ begin +if not(is_char_node(s)) then + if is_dirty_umlaut(s) then begin + for jj:=1 to replace_count(s)-1 do s:=link(s); + end else + case type(s) of + ligature_node: do_nothing; +@z + +========================================================================= + +Well, there are a lot of new variables that are necessary for the new +hyphenation. Most of them are necessary for Heini's change in the +reconstitute function, where now discretionary nodes for hyphens with +more than one character (e.g. the german ck-hyphens or +three-consonant-hyphens) can be inserted. + +@x +@ @<Local variables for hyphenation@>= +@!i,@!j,@!l:0..65; {indices into |hc| or |hu|} +@!q,@!r,@!s:pointer; {temporary registers for list manipulation} +@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|} +@y +@!hyfpen:array [0..64] of integer; {penalties for possible discretionary + hyphens} +@!hyf_si:trennvektor; +@!hc_si:wort; +@!hyf_disc:array [0..64] of pointer; + +@ @<Local variables for hyphenation@>= +@!i,@!j,@!l,@!kk:0..65; {indices into |hc| or |hu|} +@!q,@!r,@!s,@!qq,@!qr,@!hold_r:pointer; {temporary registers for list manipulation} +@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|} + +@!xchg_char:array [0..10] of 0..256; {type of |hu| and |hc|} +@!add_char, {additional characters when hyphenating e.g.\ + Schiffahrt $\rightarrow$ Schif{\sl f}-fahrt: here + |add_char| = 1} +@!xchg_i,xchg_k,xchg_hu: 0..65; {type like |i|, |j| and |l| } +@!spec_hyf: pointer; {special hyphen; causes different spelling of the + word, when it is hyphenated at this point} +@!si_j:integer; +@z + +========================================================================= + +An odd->inf_penalty change. + +@x +for j:=l_hyf to hn-r_hyf do if odd(hyf[j]) then goto found1; +@y +for j:=l_hyf to hn-r_hyf do if hyfpen[j]<>inf_penalty then goto found1; +@z + +========================================================================= + +The new variable hold_r is initialized (the kern node is a dummy node, +as far as I can see). + +@x +if is_char_node(ha) then + if font(ha)<>hf then goto found2 +@y +hold_r := new_kern(1235); link(hold_r):=r; +if is_char_node(ha) then + if font(ha)<>hf then goto found2 +@z + +========================================================================= + +Initialize some variables if the list starts with a "dirty umlaut". + +@x +else if type(ha)=ligature_node then + if font(lig_char(ha))<>hf then goto found2 + else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1); +@y +else if is_dirty_umlaut(ha) then begin + if get_font_of(ha) <> hf then goto found2 + else begin init_list:=ha; init_lig := false; hu[0]:=get_char_of(ha); + end +end else if type(ha)=ligature_node then + if font(lig_char(ha))<>hf then goto found2 + else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1); +@z + +========================================================================= + +MAIN CHANGE 3) + +unhinge all "dirty umlauts". + +@x +common_ending: flush_node_list(r); +@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>; +flush_list(init_list) +@y +common_ending: +qq:=hold_r; +for kk:={1}j to hn do if dirty_umlaut[kk] <> null then begin + while link(qq) <> dirty_umlaut[kk] do qq := link(qq); + qr := link(qq); + for i:=1 to replace_count(qr) do + if qr<>null then qr:=link(qr) + else begin {test:} + si_put_ln('...??..X --> ????? !'); + end; {:test} + if qr<>null then begin + link(qq):=link(qr); link(qr):=null; + end else link(qq):=null; +end; +if dirty_umlaut[-1]<>null then begin + qq:=hold_r; + while (link(qq)<>dirty_umlaut[-1])and(link(qq)<>null) do qq:=link(qq); + if link(qq)=dirty_umlaut[-1] then begin + link(qq):=link(dirty_umlaut[-1]); + link(dirty_umlaut[-1]):=null; + end else begin + si_put(' *** ERROR: node list is damaged! '); + si_put_ln('(post hyphenation - unhinge a whatsit node)'); + end; +end; +{} +r:=hold_r; +while link(r)<>null do begin + if (mem_min<=link(r))and(link(r)<=mem_max) then r:=link(r) + else begin + wlog_cr; wterm_cr; + wlog_ln('???$ - ERROR in node list!'); + wterm_ln('???$ - ERROR in node list!'); + kk:=depth_threshold; l:=breadth_max; + depth_threshold:=100; breadth_max:=100; + show_node_list(hold_r); + link(r):=null; + depth_threshold:=kk; breadth_max:=l; + end; +end; +{} +flush_node_list(hold_r); +@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>; +flush_list(init_list) +@z + +------------------------------------------------------------------------ + +Another odd->inf_penalty change (this time only textual). + +@x +If there exists an index |k| in the range $j\le k\le m$ such that |hyf[k]| +is odd and such that the result of |reconstitute| would have been different +if $x_{k+1}$ had been |hchar|, then |reconstitute| sets |hyphen_passed| +to the smallest such~|k|. Otherwise it sets |hyphen_passed| to zero. +@y +If there exists an index |k| in the range $j\le k\le m$ such that +|hyfpen[k]<>inf_penalty| and such that the result of |reconstitute| +would have been different if $x_{k+1}$ had been |hchar|, then |reconstitute| +sets |hyphen_passed| to the smallest such~|k|. Otherwise it sets +|hyphen_passed| to zero. +@z + +------------------------------------------------------------------------- + +In the reconstitute function, we set the boundary value n immediately +before the next "dirty umlaut" by a simple for-loop starting at the +original n. + +@x +begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null; +@y +@!ii:small_number; +begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null; +for ii:=n downto j do + if dirty_umlaut[ii] <> null then n:=ii-1; +@z + +------------------------------------------------------------------------- + +Another odd->inf_penalty change. + +@x + if odd(hyf[j]) then cur_rh:=hchar@+else cur_rh:=non_char; +@y + if hyfpen[j]<>inf_penalty then cur_rh:=hchar@+else cur_rh:=non_char; +@z + +========================================================================= + +A first change in the reconstitute function. + +@x + else begin if hchar<non_char then if odd(hyf[j]) then + begin hyphen_passed:=j; hchar:=non_char; + end; + if op_byte(q)<kern_flag then + @<Carry out a ligature replacement, updating the cursor structure +@y + else begin if hchar<non_char then if hyfpen[j]<>inf_penalty then + begin hyphen_passed:=j; hchar:=non_char; + end; + if op_byte(q)<kern_flag then + @<Carry out a ligature replacement, updating the cursor structure +@z + + +------------------------------------------------------------------------- + +Now we are in the post-hyphenation's main loop; here must append a +"dirty umlaut" to the growing node list. This is simply done by an +if-statement that checks for the presence of a "dirty umlaut" and +appends it. + +Moreover, we have another textual odd->inf_penalty change. + +@x +repeat l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1; +if hyphen_passed=0 then + begin link(s):=link(hold_head); + while link(s)>null do s:=link(s); + if odd(hyf[j-1]) then + begin l:=j; hyphen_passed:=j-1; link(hold_head):=null; + end; + end; +if hyphen_passed>0 then + @<Create and append a discretionary node as an alternative to the + unhyphenated word, and continue to develop both branches until they + become equivalent@>; +until j>hn; +link(s):=q + +@ In this repeat loop we will insert another discretionary if |hyf[j-1]| is +odd, when both branches of the previous discretionary end at position |j-1|. +@y +if dirty_umlaut[-1]<>null then begin + {hook in the previous saved whatsit node before the first + character of the hyphenated word} + link(s):=dirty_umlaut[-1]; + s:=link(s); +end; +repeat + if dirty_umlaut[j]<>null then begin + link(s):=dirty_umlaut[j]; + while link(s)>null do s:=link(s); + link(hold_head):=null; + j:=j+1; hyphen_passed:=0; + if hyfpen[j-1]<>inf_penalty then begin + l:=j; hyphen_passed:=j-1; + si_debug(16) + si_put_ln(' *** append a hyphen immediatly after a dirty umlaut!'); + gubed_si; + end; + end else begin + l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1; + if hyphen_passed=0 then begin + link(s):=link(hold_head); + while link(s)>null do s:=link(s); + if hyfpen[j-1]<>inf_penalty then begin + l:=j; hyphen_passed:=j-1; link(hold_head):=null; + end; + end; + end; {if dirty_umlaut[j]<>null then-else} + if hyphen_passed>0 then + @<Create and append a discretionary node as an alternative to the + unhyphenated word, and continue to develop both branches until they + become equivalent@>; +until j>hn; +link(s):=q; +si_q:=s; {save the last node of the hyphenated word for debugging output} +for j:=0 to 64 do if hyf_disc[j]<>null then begin + flush_node_list( hyf_disc[j]); +end + +@ In this repeat loop we will insert another discretionary if +|hyfpen[j-1]<>inf_penalty|, when both branches of the previous +discretionary end at position |j-1|. +@z + +========================================================================= + +Another odd->inf_penalty change. + +@x +hyphen_passed:=j-1; link(hold_head):=null; +until not odd(hyf[j-1]) +@y +hyphen_passed:=j-1; link(hold_head):=null; +until (hyfpen[j-1]=inf_penalty) +@z + +========================================================================= + +Here comes the big reconstitution action (cheers to Heini!). + +@x +@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>= +minor_tail:=null; pre_break(r):=null; hyf_node:=new_character(hf,hyf_char); +if hyf_node<>null then + begin incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node); + end; +while l<=i do + begin l:=reconstitute(l,i,font_bchar[hf],non_char)+1; + if link(hold_head)>null then + begin if minor_tail=null then pre_break(r):=link(hold_head) +@y +As the value of |hyfpen[i]| is necessary for creating a penalty node, +we must create this node before we ``kill'' the hyphenation information in +|hyfpen[i]| by assigning |inf_penalty|. |minor_tail| contains the +pointer to the penalty node or |null|, if no such node has been created. + +@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>= +if (hyfpen[i]<>inf_penalty) and (hyfpen[i]<>hyphen_penalty) + then minor_tail:=new_penalty(hyfpen[i]) + else minor_tail:=null; +hyfpen[i]:=inf_penalty; +pre_break(r):=minor_tail; + +hyf_node:=new_character(hf,hyf_char); +{Exchange |pre_break|-list of the selfbuilt |disc_node| with |hu|} +xchg_k:=i; +if hyf_disc[xchg_k]<>null then begin + spec_hyf:=pre_break(hyf_disc[xchg_k]); + add_char:=subtype(spec_hyf); + xchg_i:=1; + repeat + spec_hyf:=link(spec_hyf); + if spec_hyf<>null then begin + xchg_char[xchg_i]:=qo(character(spec_hyf)); + incr(xchg_i); + end;{if} + until spec_hyf=null; + if hyf_node<>null then begin + xchg_char[xchg_i]:=hyf_char; + free_avail(hyf_node); + end else decr(xchg_i); + xchg_hu:=i-xchg_i+add_char+2; {this is the index of |hu| where the first + character is replaced by a character of the + |pre_break|-list of |spec_hyf|} + for xchg_k:=1 to xchg_i do begin + xchg_char[0]:=hu[xchg_hu]; + hu[xchg_hu]:=xchg_char[xchg_k]; + xchg_char[xchg_k]:=xchg_char[0]; + incr(xchg_hu); + end; {|for|} + xchg_k:=i; + i:=xchg_hu-1; + xchg_hu:=xchg_hu-xchg_i; +end {|if hyf_disc[]<>null|} +else if hyf_node<>null then begin + incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node); +end; +while l<=i do begin + l:=reconstitute(l,i,font_bchar[hf],non_char)+1; + if link(hold_head)>null then + begin if minor_tail=null then pre_break(r):=link(hold_head) +@z + +------------------------------------------------------------------------- + +... continued: + +@x +if hyf_node<>null then + begin hu[i]:=c; {restore the character in the hyphen position} + l:=i; decr(i); + end + +@y + if hyf_disc[xchg_k]<>null then begin +{ Restore the original word in |hu| } + i:=xchg_k; l:=i+1; + for xchg_k:=1 to xchg_i do begin + hu[xchg_hu]:=xchg_char[xchg_k]; + incr(xchg_hu); + end;{for} + end else if hyf_node<>null then begin + hu[i]:=c; {restore the character in the hyphen position} + l:=i; decr(i); + end + +@z + +========================================================================= + +MAIN CHANGE 1) + +Finally, we come to the SISISI hyphenation. At first, we define two +variables: + +@x +@ Assuming that these auxiliary tables have been set up properly, the +@y +@!funktioniert: boolean; +@!zerleg: integer; + +@ Assuming that these auxiliary tables have been set up properly, the +@z + +------------------------------------------------------------------------- + +And off we go; at first only slowly, ... + +@x +@<Find hyphen locations for the word in |hc|...@>= +@y +{\sl Here, the German Hyphenation of W.Barth and H.Nirschl has been added!} + + +@<Find hyphen locations for the word in |hc|...@>= +@z + +------------------------------------------------------------------------- + +... but now we kill all of Liang's code and replace it by some re- and +back-en- and decoding, a call to abteilen, and the construction of the +special discretionaries. Then we go right into the SISISI hyphenation. +========================================================================= +@x +if trie_char(cur_lang+1)<>qi(cur_lang) then return; {no patterns for |cur_lang|} +hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=256; {insert delimiters} +for j:=0 to hn-r_hyf+1 do + begin z:=trie_link(cur_lang+1)+hc[j]; l:=j; + while hc[l]=qo(trie_char(z)) do + begin if trie_op(z)<>min_quarterword then + @<Store \(m)maximum values in the |hyf| table@>; + incr(l); z:=trie_link(z)+hc[l]; + end; + end; +found: for j:=0 to l_hyf-1 do hyf[j]:=0; +for j:=0 to r_hyf-1 do hyf[hn-j]:=0 + +@ @<Store \(m)maximum values in the |hyf| table@>= +begin v:=trie_op(z); +repeat v:=v+op_start[cur_lang]; i:=l-hyf_distance[v]; +if hyf_num[v]>hyf[i] then hyf[i]:=hyf_num[v]; +v:=hyf_next[v]; +until v=min_quarterword; +end + +@ The exception table that is built by \TeX's \.{\\hyphenation} primitive is +@y + for j:=0 to hn do + hc_si[j] := ktab[hc[j]]; + si_debug(2) + si_put(' hc:'); + for j:=0 to hn do si_put( xchr[hc[j]] ); + si_put_ln(':'); + si_put(' hc_si:'); + for j:=0 to hn do si_put( xchr[rev_tab[hc_si[j]]] ); + si_put_ln(':'); + gubed_si; + si_debug(4) + si_put_ln('< decimal character codes >'); + si_put(' hc:'); + for j:=0 to hn do begin + si_put(hc[j]:3,'-'); + if ((j+1) mod 16)=0 then begin + si_put_cr; si_put(' '); + end; + end; + si_put_cr; + si_put(' hc_si:'); + for j:=0 to hn do begin + si_put( rev_tab[hc_si[j]]:3,'-' ); + if ((j+1) mod 16)=0 then begin + si_put_cr; si_put(' '); + end; + end; + si_put_cr; si_put_cr; + gubed_si; + + abteilen(hc_si,hyf_si,hn,funktioniert,zerleg); + for j:=0 to 64 do begin + hyf_disc[j]:=null; hyfpen[j]:=inf_penalty; + end; + if funktioniert then + for j:=0 to hn do begin + if hyf_si[j]=neben then hyfpen[j] := neben_hyphen_penalty + else if hyf_si[j]=haupt then hyfpen[j] := hyphen_penalty + else if hyf_si[j]=nebenck then begin + hyfpen[j+1] := neben_hyphen_penalty; + s:=get_node(small_node_size); {discretionary node erzeugen} + type(s):=disc_node; + hyf_disc[j+1]:=s; + {|pre_break|-Liste: } + pre_break(s):=new_penalty(neben_hyphen_penalty); s:=pre_break(s); + subtype(s):=0; { number of additional characters } + link(s):=new_character(hf,hu[j+2]); {'k' oder'K'} + link(link(s)):=null; + s:=hyf_disc[j+1]; + post_break(s):=null; link(s):=null; + end + else if hyf_si[j]=haupt3 then begin + hyfpen[j-1]:=hyphen_penalty; + s:=get_node(small_node_size); {discretionary node erzeugen} + type(s):=disc_node; + hyf_disc[j-1]:=s; + {|pre_break|-Liste: } + pre_break(s):=new_penalty(hyphen_penalty); s:=pre_break(s); + subtype(s):=1; + link(s):=new_character(hf,hu[j]); { Dreifachkonsonant } + link(link(s)):=null; + {|post_break|- und |link|-Liste: } + s:=hyf_disc[j-1]; + post_break(s):=null; + link(s):=null; + end + end; {|if funktioniert|} + si_debug(8) + if funktioniert then begin + for j:=0 to hn do + if hyfpen[j]<>inf_penalty then begin + if hyf_disc[j]<>null then begin + if subtype(pre_break(hyf_disc[j]))=0 then + si_put( xchr[hu[j+1]], '-' ) + else {if subty...} + si_put( xchr[hu[j+1]], xchr[hu[j+1]], '=' ); + { i hope so } + end else begin + si_put( xchr[hu[j]] ); + if hyfpen[j]=hyphen_penalty then + si_put('=') + else si_put('-'); + end; + end else begin + si_put( xchr[hu[j]] ); + end; + end else begin + si_put_ln(' no hyphens were found in this word!'); + end; + si_put_cr; + gubed_si; + goto done1; + +found: +hyfpen[0]:=inf_penalty; +for j:=1 to hn do + if odd(hyf[j]) then hyfpen[j]:=hyphen_penalty + else hyfpen[j]:=inf_penalty; + +done1: + +@ Das folgende Modul ersetzt die gesamte Liang'sche Trennung. Aufgabe +dieses Modules ist es, ein in hc (ein Array of 0..255 ) liegendes Wort +nach Trennstellen zu untersuchen und die gefundenen Trennstellen in +hyf (ebenfalls ein Array of neben...) an den entsprechenden Stellen +einzutragen. Die genaue Beschreibung der Vorgangsweise findet man im +INSTITUTSBERICHT NR. 26, TECHNISCHE UNIVERSIT\"AT WIEN, INSTITUT +F\"UR PRAKTISCHE INFORMATIK. + +Alle Prozeduren f\"ur die Silbentrennung \SISISI, die bei jedem +Start von TeX aufgerufen werden. + +@ Dieser Modul beinhaltet alle f\"ur die neue Silbentrennung |abteilen| +n\"otigen Initialisierungen bzw. Prozeduren, die nur einmal am Anfang +ausgef\"uhrt werden sollen. + +@<Set initial values of ...@>= + inittrennen; + +@ @<Constants in the outer block@>= + maxwl = 64; { Maximale Wortlaenge } + sonderzeichen= 0; + bst_a= 1; bst_b= 2; bst_c= 3; bst_d= 4; bst_e= 5; bst_f= 6; bst_g= 7; + bst_h= 8; bst_i= 9; bst_j=10; bst_k=11; bst_l=12; bst_m=13; bst_n=14; + bst_o=15; bst_p=16; bst_q=17; bst_r=18; bst_s=19; bst_t=20; bst_u=21; + bst_v=22; bst_w=23; bst_x=24; bst_y=25; bst_z=26; bst_ae=27; + bst_oe=28; bst_ue=29; bst_sz=30; trennzeichen=31; + keine = 1; neben = 2; nebenck = 3; haupt = 4 ; haupt3 = 5; + + tabsize = 8191; { 2**13 - 1 } + spec_letter_ID = 4321; + { const definitionen } + vok_a = 1; + vok_e = 2; + vok_i = 3; + vok_o = 4; + vok_u = 5; + vok_ae = 6; + vok_oe = 7; + vok_ue = 8; + vok_ie = 9; + vok_ai = 10; + vok_ei = 11; + vok_au = 12; + vok_aeu= 13; + vok_eu = 14; + vok_y = 15; + kons = 16; + +@ +@<Types in the outer block@>= + string80 = packed array [0..80] of eight_bits; + buchstabe = eight_bits; + a_word = array[0..maxwl] of 0..256; + wort = a_word; + sperrvektor=array [0..maxwl] of boolean; + dudt=array [0..maxwl] of boolean;{frueher kein type !!} + { trennung = (keine, neben, nebenck, haupt, haupt3); } + trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==> + zwischen Buchstabe i und i+1 wird getrennt } + ktabtype = packed array [0..255] of buchstabe; + verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C } + varr = array [0..maxwl] of verdschlue; + intarr = array [0..maxwl] of integer; + + { darf nicht als var Parameter uebergeben werden !!} + infotype = record + { frueher ein variantenRecord } + ausnahme:boolean; + untrennbar:boolean; + { erste :0..7; + zweite:0..7; } + erste :integer; + zweite:integer; + endung,vorsilbe,stamm,ehervor,stammallein:boolean; + end; + + infobyte = eight_bits; + + { darf nicht als var Parameter uebergeben werden !!} + tableentry=record + tabv:verdschlue; + tabb:infobyte; + frei:boolean; + wiederfrei:boolean; + end; + + hashelement = packed array [0..3] of eight_bits; + htabtype = packed array [0..tabsize] of hashelement; + +@ +@<Global variables@>= + ktab : ktabtype; + htab : htabtype; + anzahl : integer; + hashfile : alpha_file; + kombtab : array [1..5, 1..5] of integer; + konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]} + rev_tab: array[0..255]of integer; + + +@ Prozedurdefinitionen + +function dig_count( v: integer): integer; + { calculates the number of decimal digits of ``v'' } + var x, e, c: integer; +begin + x := v div 10; e:=1; c:=1; + while e<=x do begin + e := e * 10; incr(c); + end; + dig_count:=c; +end; + +@<Handling of dirty umlauts@>= + +procedure hashfunk (var w:wort; anfang,ende:integer; + var v:varr; var ind,k:intarr ); + + { -PRAK!- in C long statt integer } + var vacc, indacc, kacc : integer; + i : integer; +begin + vacc := 31415; indacc := 152; kacc := 271; +dbg_put_ln(' * HFNC ='); + for i := anfang to ende do begin +dbg_put(' * HFNC ',i-anfang:3,' A'); + vacc := (vacc * 31 + w [i]) mod 8388648; +dbg_put('B'); + v[i] := vacc; +dbg_put('C'); + indacc := (indacc * 33 + w[i]) mod (tabsize+1); +dbg_put('D'); + ind[i] := indacc; +dbg_put('E'); + kacc := (kacc * 15 + w[i]) mod ((tabsize+1) div 2); +dbg_put('F'); + k[i] := 2*kacc + 1; +dbg_put_ln('G'); + end; {|for|} +end; {|hashfunk|} + +procedure unpackinfo ( b:infobyte; + { var i:infotype } + var iausnahme :boolean; + var iuntrennbar :boolean; + var ierste :integer; + var izweite :integer; + var iendung :boolean; + var ivorsilbe :boolean; + var istamm :boolean; + var iehervor :boolean; + var istammallein:boolean ); +begin + { with i do begin } + if odd(b) then begin { 87654321 } + iausnahme:= true; + b:= b div 2; { 08765432 } + if odd(b) then iuntrennbar:= true + else iuntrennbar:= false; + b:=b div 2; { 00876543 } + ierste := b mod 8; { 00876xxx } + izweite := b div 8; { 00000876 } + end else begin + iausnahme:= false; { 87654321 } + b:= b div 2; { 08765432 } + if odd(b) then iendung:= true + else iendung:= false; + b:= b div 2; { 00876543 } + if odd(b) then ivorsilbe:= true + else ivorsilbe:= false; + b:= b div 2; { 00087654 } + if odd(b) then istamm:= true + else istamm:= false; + b:= b div 2; { 00008765 } + if odd(b) then iehervor:= true + else iehervor:= false; + b:= b div 2; { 00000876 } + if odd(b) then istammallein:= true + else istammallein:= false; + end; {|if-then-else|} + { end; |with|} +end; {|unpackinfo|} + + +procedure unpackentry( h:hashelement; + { var e:tableentry } + var etabv:verdschlue; + var etabb:infobyte; + var efrei:boolean; + var ewiederfrei:boolean ); +begin + { with e do begin } +dbg_put_cr; +dbg_put(' ==> UPCKNTY 1'); + etabv:= h[0]+h[1]*256+h[2]*256*256; +dbg_put(' 2'); + if odd(h[3]) then begin { Ausnahme } +dbg_put(' 3 A'); + etabb:= h[3]; +dbg_put('1'); + efrei:= false; + ewiederfrei:= false; + end + else begin +dbg_put(' 3 B'); + etabb:= h[3] mod 64; +dbg_put('1'); + { h[3]:=h[3] div 64;} {-PRAK!- in C ein var-Paramter, darf daher + nicht ver„ndert werden. } +dbg_put('2'); + { durch folgende 2 Abfragen ersetzt. -PRAK!- } + if odd(h[3] div 64) then efrei := true + else efrei := false; + if odd(h[3] div 128) then ewiederfrei := true + else ewiederfrei := false; + end; +dbg_put_ln('- 4'); + { end; |with|} +end; {|unpackentry|} + + +procedure hashsuch ( v:verdschlue; + ind,k : integer; + { var i:infotype; } + var iausnahme :boolean; + var iuntrennbar :boolean; + var ierste :integer; + var izweite :integer; + var iendung :boolean; + var ivorsilbe :boolean; + var istamm :boolean; + var iehervor :boolean; + var istammallein:boolean; + var g:boolean ); + +{ sucht Eintragung in der Hashtabelle, g ist TRUE falls gefunden } + var + gef,ngef:boolean; + j:integer; + entry : tableentry; + +begin + gef := false; ngef := false; j := ind; + repeat + unpackentry(htab[j],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei); + if entry.frei then ngef := true + else if (v = entry.tabv) and not entry.wiederfrei then begin + unpackinfo(entry.tabb,iausnahme,iuntrennbar,ierste,izweite, + iendung,ivorsilbe,istamm,iehervor,istammallein); + gef := true; + end else + j := (j+k) mod (tabsize + 1) + until gef or ngef; + g := gef; +end; {|hashsuch|} + + +procedure hashload ( var status:integer ); +{ einlesen der Hash-Tabelle von file fn } + var i : integer; + e : tableentry; +begin + { Orginal sitex3.cha -PRAK!- + for i:=1 to file_name_size do name_of_file:= ' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length := 3; + anzahl := 0; + if a_open_in(hashfile) then begin + } + + { geaendert !! -PRAK!- } + for i:=1 to file_name_size do name_of_file[i]:= ' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length := 3; + anzahl := 0; + { -PRAK!- texinputpath fr C notwendig } + if a_open_in(hashfile, TEX_INPUT_PATH) then begin + for i := 0 to tabsize do begin + { -PRAK!- in C Probleme mit den typen beim einlesen } + read (hashfile, htab[i][0]); { htab = packed array [0..tabsize] of } + read (hashfile, htab[i][1]); { hashelement, und } + read (hashfile, htab[i][2]); { hashelement = packed array 0..3 } + read (hashfile, htab[i][3]); + unpackentry (htab[i],e.tabv,e.tabb,e.frei,e.wiederfrei); + if not e.frei and not e.wiederfrei then anzahl := anzahl + 1; + end; {|for|} + status:= 0; + a_close(hashfile); + end else status:= 1; +end; {|hashload|} + + +procedure inittrennen; + var ch: 0..255; + bst: buchstabe; + i, status: integer; + is_iniTeX: boolean; +begin + { Konversionstabelle |ktab| initialisieren } + { ======================================== } + + for ch := 0 to 255 do begin + + { if (ch in [" ",",",";",":","-","/","?","!","(",")",".","""","'","^"]) then } + + case ch of + " ",",",";",":","-","/","?","!","(",")",".","""","'","^": + + if ch="." then ktab[ch]:= "." + else ktab[ch] := trennzeichen + { else ktab[ch] := sonderzeichen geht nicht !!} + end; { case } + +if (ktab[ch] <> ".") and (ktab[ch] <> trennzeichen) then ktab[ch] := sonderzeichen; + + end; { for } + for bst := bst_a to bst_z do begin + ktab[ord('A')+ord(bst)-ord(bst_a)]:=bst; + ktab[ord('a')+ord(bst)-ord(bst_a)]:=bst + end; + + { Umlaute und scharfes s - f\"ur ``production \TeX version'' } + ktab[255]:=bst_sz; + ktab[246]:=bst_oe; + ktab[252]:=bst_ue; + ktab[228]:=bst_ae; + + { Umlaute und scharfes s - f\"ur ``initialization \TeX version'' } + ktab["1"]:=bst_sz; + ktab["2"]:=bst_ue; + ktab["3"]:=bst_oe; + ktab["4"]:=bst_ae; + ktab[25]:=bst_sz; {?-wieso? HH} + +{testing:} +for i:=0 to 255 do rev_tab[ktab[i]]:=i; +rev_tab[ktab[255]]:=223; +xchr[223]:=chr(223); xchr[228]:=chr(228); xchr[246]:=chr(246); +xchr[252]:=chr(252); xchr[255]:=chr(223); xchr[ 25]:=chr(223); +{:end of testing} + + { Kombinationstabelle |kombtab| initialisieren } + { ============================================ } + { Diese Tabelle muss symetrisch sein, + kombtab[a,b] = kombtab[b,a] } + kombtab[ keine, keine] := keine; + kombtab[ keine, neben] := keine; + kombtab[ keine,nebenck] := keine; + kombtab[ keine, haupt] := keine; + kombtab[ keine, haupt3] := keine; + + kombtab[ neben, keine] := keine; + kombtab[ neben, neben] := neben; + kombtab[ neben,nebenck] := keine; + kombtab[ neben, haupt] := neben; + kombtab[ neben, haupt3] := keine; + + kombtab[nebenck, keine] := keine; + kombtab[nebenck, neben] := keine; + kombtab[nebenck,nebenck] := nebenck; + kombtab[nebenck, haupt] := keine; + kombtab[nebenck, haupt3] := keine; + + kombtab[ haupt, keine] := keine; + kombtab[ haupt, neben] := neben; + kombtab[ haupt,nebenck] := keine; + kombtab[ haupt, haupt] := haupt; + kombtab[ haupt, haupt3] := keine; + + kombtab[ haupt3, keine] := keine; + kombtab[ haupt3, neben] := keine; + kombtab[ haupt3,nebenck] := keine; + kombtab[ haupt3, haupt] := keine; + kombtab[ haupt3, haupt3] := haupt3; + + { Konsonantentabelle initialisieren } + for bst:=bst_a to bst_sz do konsonant[bst] := true; + konsonant[bst_a] := false; + konsonant[bst_e] := false; + konsonant[bst_i] := false; + konsonant[bst_o] := false; + konsonant[bst_u] := false; + konsonant[bst_ae] := false; + konsonant[bst_oe] := false; + konsonant[bst_ue] := false; + + +{ ================== Hashtabelle |htab| initialisieren ====================== + +Die Prozedur ``hashload'' darf im Initialisierungslauf von TeX auf +keinen Fall aufgerufen werden. Deshalb wird zun\"achst festgestellt, ob +dieser Programmlauf ein Initialisierungslauf ist oder nicht. Abh\"angig +davon wird ``hashload'' nur aufgerufen, wenn dies ein ``Arbeits''-lauf +(production-version) von \TeX ist. + +=============================================================================} + is_iniTeX:=false; + init is_iniTeX:=true; tini + if not is_iniTeX then begin + hashload(status); + if status <> 0 then begin + si_put_cr; + si_put_ln +(' * * * * * * * * * *!'); + si_put_ln('**** ERROR: Can not read hash-file!'); + si_put_cr; + jump_out; + end; + end; {|not iniTeX|} +end; {|inittrennen|} + + +procedure packinfo ( i:infotype; var b : infobyte ); +{ Byte: /zweite/zweite/zweite/erste/erste/erste/untrennbar/ausnahm/ } +{ bzw.: /0 /0 /stall /eherv/stamm/vors /endung /0 / } + +begin + b:=0; +dbg_put_cr; + { with i do begin } + if i.ausnahme then +begin +dbg_put(' ### PCKINF 1A utr:'); +if i.untrennbar then dbg_put('Y') else dbg_put('N'); +dbg_put_ln(',',ord(i.untrennbar):3,' 1.',i.erste:3,' 2.',i.zweite:3); + b:=1+2*ord(i.untrennbar)+4*i.erste+32*i.zweite +; dbg_put('B'); +end + else +begin +dbg_put(' ### PCKINF 2A'); + b:= 2*ord(i.endung)+4*ord(i.vorsilbe)+8*ord(i.stamm)+16*ord(i.ehervor) + +32*ord(i.stammallein); +dbg_put('B'); +end; + { end; with } +dbg_put_ln('-3'); +end; {|packinfo|} + +procedure packentry( e:tableentry; var h:hashelement ); +{ /infobyte+frei,wiederfrei/verdschhigh/verdschmiddle/verdschllow/ } + +begin + { with e do begin } +dbg_put_cr; +dbg_put(' +++ PCKNTY A'); + h[0]:= e.tabv mod 256; { 87654321abcdefghxxxxxxxx} +dbg_put('B'); + e.tabv:= e.tabv div 256; { 0000000087654321abcdefgh} +dbg_put('C'); + h[1]:= e.tabv mod 256; { 0000000087654321xxxxxxxx} +dbg_put('D'); + h[2]:= e.tabv div 256; { 000000000000000087654321} + +dbg_put('E'); + if odd(e.tabb) then h[3]:= e.tabb { Ausnahme !! } + else +begin +dbg_put('F1'); + h[3]:=e.tabb+64*ord(e.frei)+128*ord(e.wiederfrei); { wfxxxxxx } +dbg_put('-2'); +end; +dbg_put_ln('G'); + { end; |with|} +end; {|packentry|} + + + +procedure hashetr ( var w:wort; laenge:integer; i:infotype; + var g:boolean ); + + var v1: varr; + ind1, k1: intarr; + v: verdschlue; + ii,ind, k, j, e: integer; + gef,ngef:boolean; + entry: tableentry; + helem: hashelement; + +begin +dbg_put_ln(' ** HTR 1'); + if anzahl >= tabsize then begin +dbg_put_ln(' ** HTR 2a'); + g := false; + end + else begin +dbg_put_ln(' ** HTR 2b'); + if (anzahl < 10) or (anzahl mod 100 = 0) then begin + si_put_cr; si_put(' -Anzahl:',anzahl,'. '); + end; +dbg_put_ln(' ** HTR 3'); + hashfunk(w,1,laenge,v1,ind1,k1); +dbg_put_ln(' ** HTR 4'); + v := v1[laenge]; + ind := ind1[laenge]; + k := k1[laenge]; + gef := false; ngef := false; + repeat +dbg_put_ln(' ** HTR 5 A'); + unpackentry(htab[ind],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei); +dbg_put_ln(' ** HTR B'); + if entry.frei or entry.wiederfrei then begin + anzahl := anzahl + 1; + ngef := true; + entry.tabv := v; +dbg_put_ln(' ** HTR C1'); + packinfo (i,entry.tabb); +dbg_put_ln(' ** HTR D1'); + entry.frei := false; + entry.wiederfrei := false; +dbg_put_ln(' ** HTR E1'); + packentry(entry,helem); +dbg_put_ln(' ** HTR F1'); + for ii := 0 to 3 do + htab[ind][ii] := helem[ii]; + end else begin +dbg_put_ln(' ** HTR C2'); + gef := v = entry.tabv; + if not gef then ind := (ind+k) mod (tabsize + 1); +dbg_put_ln(' ** HTR D2'); + end; + until gef or ngef; +dbg_put_ln(' ** HTR 6'); + g := ngef; + end +end; {|hashetr|} + +procedure hashempty; + var i,j:integer; + elem : tableentry; + he : hashelement; +begin + { with elem do begin } + elem.tabv:=0; + elem.tabb := 0; { !!!!!! Irgend ein Affe hat diese Initialisierung vergessen. + ( Und dies ist eine Beleidigung fuer jeden Affen ) HM } + elem.frei := true; + elem.wiederfrei := false; + { end; } + packentry (elem, he); + for i := 0 to tabsize do + for j := 0 to 3 do + htab[i][j] := he[j]; + anzahl := 0; +end; {|hashempty|} + +procedure hashsave (var status:integer); +{ abspeichern der Hash-Tabelle auf file } + var i: integer; +begin + for i:=1 to file_name_size do name_of_file[i]:=' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length:=3; + if a_open_out(hashfile) then begin + for i := 0 to tabsize do begin + write (hashfile, htab[i][0]:4); + write (hashfile, htab[i][1]:4); + write (hashfile, htab[i][2]:4); + write (hashfile, htab[i][3]:4); + write_ln (hashfile); + end; + status:=0; + a_close(hashfile); + end else status:=1; +end; {|hashsave|} + + +function hashsize :integer; +begin + hashsize:=anzahl; +end; + + +procedure zahl(line:string80;var i:integer; ende:integer; var j:integer); + var aus: boolean; +begin + j:=0; + repeat + if i<=ende then + if ktab[line[i]]="." then i:=i+1 + else aus:=true + else aus:=true + until aus; + repeat + if i<=ende then begin + { if line[i] in ["0".."9"] then begin } + case line[i] of + "0","1","2","3","4","5","6","7","8","9": + begin j:=10*j+line[i]-"0";i:=i+1 + end; + { else aus:=true geht nicht !!! } + end; + if (line[i] <> "0") and + (line[i] <> "1") and + (line[i] <> "2") and + (line[i] <> "3") and + (line[i] <> "4") and + (line[i] <> "5") and + (line[i] <> "6") and + (line[i] <> "7") and + (line[i] <> "8") and + (line[i] <> "9") then aus :=true; + end else aus:=true + until aus; +end; {|zahl|} + + +procedure infobau(line: string80; anfang,ende: integer; + { var inform: infotype;} + var informausnahme :boolean; + var informuntrennbar :boolean; + var informerste :integer; + var informzweite :integer; + var informendung :boolean; + var informvorsilbe :boolean; + var informstamm :boolean; + var informehervor :boolean; + var informstammallein:boolean; + var g: boolean); + + var i,j:integer;ok,fehler:boolean; + b:buchstabe; +begin + g:=false; + { with inform do begin } { initialisierung } + informausnahme:=false; + informendung:=false; + informvorsilbe:=false; + informehervor:=false; + informstamm:=false; + informstammallein:=false; + i:=anfang; ok:=false; fehler:=false; + repeat + if i<=ende then + if line[i]="." then i:=i+1 else ok:=true + else fehler:=true + until ok or fehler; + if not fehler then begin + b:=ktab[line[i]]; + if b = bst_a then begin + {ausnahme} + informausnahme:=true; + i:=i+1; + if ktab[line[i]] = bst_u then begin + i := i + 1; informuntrennbar := true; + end else informuntrennbar := false; + zahl(line,i,ende,j); + if j=0 then begin + informerste:=7; informzweite:=7; + { Record-komponente ``zweite'' wird } + { initialisiert, damit beim packen keine } + { undefinierten Ergebnisse entstehen (die u.U. zu } + { RUN-TIME-ERRORS f\"uhren k\"onnen!) } + end else begin + j:=j-2; + if (j>=0) and (j<=6) then informerste:=j + else fehler:=true; + zahl(line,i,ende,j); + if j=0 then informzweite:=7 + else begin + j:=j-informerste-4; + if (j>=0) and (j<=6) then informzweite:=j + else fehler:=true; + end; + end; + if not fehler then g:=true; + end {|if b = bst_a |} + else begin + ok:=false; + repeat + case b of + {bst_v} 22: informvorsilbe:=true; + {bst_e} 5: informendung:=true; + {bst_s} 19: informstamm:=true; + {bst_b} 2: informehervor:=true; + {bst_t} 20: informstammallein:=true; + {trennzeichen} 31:; + othercases fehler:=true + endcases; + if i=ende then ok:=true + else begin + i:=i+1; + b:=ktab[line[i]] + end + until ok or fehler; + if not fehler then + g := (informvorsilbe or informendung or informstamm) + and (not informehervor or informvorsilbe and informendung) + and (not informstammallein or informstamm); + end; {|if b = bst_a then-else|} + end {|if not fehler|} + { end |with inform|} +end; {|infobau|} + + +procedure eintragen (line: string80; l: integer ); + var i, laenge: integer; + inform: infotype; + w: wort; + g: boolean; +begin + laenge := 1; + while line [laenge] <> "." do laenge := laenge + 1; + laenge := laenge -1; + if laenge >= 1 then begin + if laenge <= maxwl then begin + infobau(line,laenge+1,l, + inform.ausnahme,inform.untrennbar, + inform.erste,inform.zweite,inform.endung, + inform.vorsilbe,inform.stamm,inform.ehervor, + inform.stammallein,g); + + if not g then begin + si_put_cr; si_put(' Info falsch: ') + end else begin + for i:= 1 to laenge do w[i]:=ktab[line[i]]; + hashetr(w,laenge,inform,g); + if not g then begin + si_put_cr; si_put(' Tabellenfehler: '); + end; + end; + if not g then begin + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end + end {|if laenge <= maxwl|} + else begin + si_put_cr; si_put_ln(' zu langes Wort: '); + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end + end {|if laenge >= 1|} + else begin + si_put_cr; si_put_ln(' Falsche Zeile: '); + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end +end; {|eintragen|} + +{---------------------------------------------------------------------------} + +{ naechsterbst -> naechsterbst(i,tr,dudstop,b,w) } + +procedure naechsterbst(var i:integer;var tr:trennvektor; + var dudstop:sperrvektor;var b:buchstabe; + var w:wort); + begin + if (i>0) and (tr[i]=keine) and not dudstop[i] + then begin b:=w[i];i:=i-1 end + else b:=trennzeichen + end; +{---------------------------------------------------------------------------} +{ duden(tr) -> duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen) } + + procedure duden (tr:trennvektor; + var w:wort; + var tr1 :trennvektor; + var dudtr:trennvektor; + dud :dudt; { array [0..maxwl] of boolean; } + var dudstop:sperrvektor; + laenge : integer; + var ok :boolean; + var zerlegungen:integer ); + + { traegt in dudtr die Trennstellen nach Dudenregeln ein } + + { frueher mtype laut = (.....) } + + var i:integer; + j:integer; + zust:integer; + aus:boolean; + tre:integer; + letzte:integer; + l,lalt:integer;{ vormals laut } + b:buchstabe; + + + begin { duden } + i:=laenge; + for j := 0 to laenge do dudtr[j] := tr[j]; + while (i>0) and not dud [i] do i:=i-1; + while i>0 do begin + zust:=1; aus:=false; letzte := 0; + l:=kons; + b:=w[i]; + i:=i-1; + repeat + {naechsten Laut lesen} + { procedure nlaut; } + begin { nlaut } + tre:=i+1; + lalt:=l; + case b of + {bst_a } 1:begin l:=vok_a; naechsterbst(i,tr,dudstop,b,w) end; + {bst_o } 15:begin l:=vok_o; naechsterbst(i,tr,dudstop,b,w) end; + {bst_ue} 29:begin l:=vok_ue; naechsterbst(i,tr,dudstop,b,w) end; + {bst_oe} 28:begin l:=vok_oe; naechsterbst(i,tr,dudstop,b,w) end; + {bst_ae} 27:begin l:=vok_ae; naechsterbst(i,tr,dudstop,b,w) end; + {bst_e } 5:begin + l:=vok_e; naechsterbst(i,tr,dudstop,b,w); + if b = bst_i then begin + l:=vok_ie; + naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin + {ungetbst = } i := i + 1; + l:=vok_e; + b := bst_i; + end; + end + end; + {bst_i} 9:begin + l:=vok_i; naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin l:=vok_ei; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_a then begin l:=vok_ai; naechsterbst(i,tr,dudstop,b,w) end + end; + {bst_u} 21:begin + l:=vok_u; naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin l:=vok_eu; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_a then begin l:=vok_au; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_ae then begin l:=vok_aeu; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_q then begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end + end; + {bst_t} 20:begin + l:=kons; naechsterbst(i,tr,dudstop,b,w); + if b = bst_s then naechsterbst(i,tr,dudstop,b,w) + end; + {bst_h} 8:begin + l:=kons; naechsterbst(i,tr,dudstop,b,w); + if b = bst_c then begin + naechsterbst(i,tr,dudstop,b,w); + if b = bst_s then naechsterbst(i,tr,dudstop,b,w) + end + else if b = bst_p then naechsterbst(i,tr,dudstop,b,w) + else if b = bst_t then naechsterbst(i,tr,dudstop,b,w) + end; + {bst_b, bst_c, bst_d, bst_f, bst_g, bst_j, bst_k, bst_l, bst_m, + bst_n, bst_p, + bst_q, bst_r, bst_s, bst_v, bst_w, bst_x, bst_z, bst_sz } + + 2,3,4,6,7,10,11,12,13,14,16,17,18,19,22,23,24,26,30 : + + begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end; + {bst_y} 25:begin + l:=vok_y; + naechsterbst(i,tr,dudstop,b,w); + end; + {trennzeichen,sonderzeichen} + 31,0 :aus:=true + end; + end; { nlaut } + + if not aus then + {Naechster Zustand} + case zust of + 1:if l=kons then zust:=2 + else zust:=4; + 2:if l<>kons then zust:=3; + 3:if l=kons then zust:=6 + else if l<>lalt then begin + zust:=4; + letzte:=tre; + dudtr[letzte]:=neben + end; + 4:if l=kons then zust:=6 + else zust:=3; + 6:if l=kons then begin + zust:=2; + letzte:=tre; + if (w[tre]=bst_c) and (w[tre+1] = bst_k) then + dudtr[letzte]:=nebenck + else dudtr[letzte]:=neben + end + else begin + zust:=4; + letzte:=tre; + dudtr[letzte]:=neben + end + end + until aus; + if zust=2 then dudtr[letzte]:=keine + else if zust=4 then + { if not (lalt in [vok_ai,vok_ei,vok_au,vok_aeu,vok_eu,vok_ie]) then } + if (lalt < vok_ie) or (lalt > vok_eu) then + dudtr[letzte]:=keine; + while (i>0) and not dud[i] do i:=i-1 + end; + end { duden }; +{---------------------------------------------------------------------------} +{ procedure trennen (zustand : integer; anfang: integer; spv:sperrvektor; + var ok1 : boolean); +} + + procedure trennen ( + { trennen } + zustand : integer; + anfang : integer; + spv : sperrvektor; + var ok1 : boolean; + { abteilen } + var tr :trennvektor; + var dudtr:trennvektor; + var zerlegungen:integer ; + var dud:dudt; { array [0..maxwl] of boolean; } + var v:varr; + var ind,k:intarr; + var dudstop:sperrvektor; + { abteilen aufruf } + var w:wort; + var tr1:trennvektor; + laenge : integer ); + + { Zustand : 1 ... Es kann nur Vorsilbe oder Stamm kommen, + rechts muss noch ein Stamm kommen. + 2 ... Es kann Endung, Vorsilbe oder Stamm kommen. + 3 ... Es kann nur Vorsilbe oder Stamm kommen, im linken + Teil muessen noch Trennstellen eingefuegt werden, + rechts muss noch ein Stamm kommen. + 4 ... Es kann nur Vorsilbe oder Stamm kommen, im linken + Teil muessen noch Trennstellen eingefuegt werden. + 5 ... Trennstelle mit entfallenem Konsonanten } + + var + gef, nichtok:boolean; + schnitt:integer; + inform:infotype; + i:integer; + ok_stamm, ok_vor, ok_end, ok_help:boolean; + tri:integer; + { p_stamm } + i1,tre:integer; + ok : boolean; + stop_ptr :integer; + spvtmp :sperrvektor; { lokale Kopie des Sperrvektors, + fr die bersetzung nach C notwendig. + -PRAK!- } + + { procedure p_endung(var endok:boolean); } + + { procedure p_vorsilbe(var vorok:boolean); } + + { procedure p_stamm(var stok:boolean); } + + { procedure p_stammallein (var staok:boolean); } + + begin { trennen } + for i := 0 to maxwl do + spvtmp[i] := spv[i]; + ok1:=false; + if anfang = laenge + 1 + then { Ende des Wortes erreicht} + if (zustand = 2) or (zustand=4) then {erfolgreich zerschnitten } + begin + dud[anfang-1]:=true; + + {duden(tr);} + duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen); + + for i := laenge downto 1 do + begin + if dudtr[i-1] = haupt3 then + begin + dudtr[i-1] := keine; + tri := haupt3; + end + else + tri := dudtr[i]; + + if zerlegungen = 0 then + tr1[i] := tri + else + tr1[i] := kombtab[tr1[i],tri]; + end; + zerlegungen:=zerlegungen+1; + ok1:= true + end + else { kein Stamm im Wortrest ok1 = false } + else { restlichen Teil zerschneiden } + begin + hashfunk (w,anfang,laenge,v,ind,k); + schnitt := laenge; + nichtok := false; + repeat + { links abschneiden } + repeat + if spv[schnitt] then { Schnittstelle gesperrt } + gef:=false + else + begin + hashsuch (v[schnitt],ind[schnitt],k[schnitt], + inform.ausnahme,inform.untrennbar, + inform.erste,inform.zweite,inform.endung, + inform.vorsilbe,inform.stamm,inform.ehervor, + inform.stammallein,gef); + end; + if gef then + spv[schnitt]:=true + else + schnitt := schnitt - 1 + until gef or (schnitt = anfang - 1); + + if gef then { teilwortanfang ist bekanntes wort } + begin + if not inform.ausnahme then + begin + if inform.endung and (zustand=2) then + begin + + { --- p_endung(ok_end); --- } + ok_end:=false; + if (w[anfang]=bst_c) or (w[anfang]=bst_h) then + begin + dud[anfang-1]:=true; + tr[anfang-1]:=neben + end; + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv[schnitt+1]:=true; + trennen (2, schnitt+2, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_end := ok_help + end; + trennen (2, schnitt+1, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_end := ok_end or ok_help; + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + { --- p_endung(ok_end) - ende --- } + + ok1 := ok1 or ok_end + end + else + ok_end:=false; + if inform.vorsilbe + then begin + + { --- p_vorsilbe(ok_vor); --- } + { Trennstelle(n) vor der Vorsilbe eintragen } + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt; + end; + { Trennstellen innerhalb der Vorsilbe eintragen } + dud[schnitt]:=true; + { Rest des Wortes zerschneiden } + trennen(1, schnitt+1, spv, ok_vor, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + dud[schnitt]:=false; + { --- p_vorsilbe(ok_vor) - ende --- } + + ok1 := ok1 or ok_vor + end + else + ok_vor := false; + if inform.stamm and not ok_vor + then begin + if not inform.stammallein + then begin + + { --- p_stamm(ok_stamm); --- } + ok_stamm := false; + stop_ptr := 0; + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt + end; + {ev. Ausnahmetrennstellen eintragen} + if inform.ausnahme then begin + if inform.erste<>7 then begin + tre:=anfang+inform.erste+1; + tr[tre]:=neben; + if inform.zweite<>7 then begin + tre:=tre+inform.zweite+2; + if inform.untrennbar then begin + stop_ptr := tre; + dudstop[stop_ptr] := true; + end + else + tr[tre]:=neben + end + else begin + if inform.untrennbar then begin + tr[tre] := keine; + stop_ptr := tre; + dudstop[tre]:=true; + end + end + end + else begin {inform.erste = 7} + stop_ptr := schnitt-1; + dudstop[stop_ptr] := true + end + end; + + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv [schnitt+1] := true; + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_help + end; + + { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts } + if (schnitt >=2) and (schnitt < laenge) then + if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and + (w[schnitt] = w[schnitt-1]) then begin + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + end; + + { restlichen Teil zerschneiden } + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + + { eingetragene Trennstellen entfernen } + if inform.ausnahme then + for i1:=anfang-1 to schnitt do + begin + tr[i1]:=keine; + dud[i1]:=false; + dudstop[stop_ptr] := false; + end + else begin + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + end; + { --- p_stamm(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end + else + if (anfang=1) and (schnitt=laenge) + then begin + + { --- p_stammallein(ok_stamm); --- } + dud[anfang-1]:=true; + tr[anfang-1]:=haupt; + trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + { --- p_stammallein(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end; + end + end + else begin + + { --- p_stamm(ok_stamm); --- } + ok_stamm := false; + stop_ptr := 0; + + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt + end; + {ev. Ausnahmetrennstellen eintragen} + if inform.ausnahme then begin + if inform.erste<>7 then begin + tre:=anfang+inform.erste+1; + tr[tre]:=neben; + if inform.zweite<>7 then begin + tre:=tre+inform.zweite+2; + if inform.untrennbar then begin + stop_ptr := tre; + dudstop[stop_ptr] := true; + end + else + tr[tre]:=neben + end + else begin + if inform.untrennbar then begin + tr[tre] := keine; + stop_ptr := tre; + dudstop[tre]:=true; + end + end + end + else begin {inform.erste = 7} + stop_ptr := schnitt-1; + dudstop[stop_ptr] := true; + end; + end; + + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv [schnitt+1] := true; + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_help + end; + + { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts } + if (schnitt >=2) and (schnitt < laenge) then + if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and + (w[schnitt] = w[schnitt-1]) then begin + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + end; + + { restlichen Teil zerschneiden } + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + + { eingetragene Trennstellen entfernen } + if inform.ausnahme then + for i1:=anfang-1 to schnitt do + begin + tr[i1]:=keine; + dud[i1]:=false; + dudstop[stop_ptr] := false; + end + else begin + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + end; + { --- p_stamm(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end; + + {naechsten Schleifendurchlauf vorbereiten} + schnitt := schnitt - 1; + nichtok := schnitt = anfang - 1 + end + else { kein bekanntes Wort am Beginn des Teilwortes } + nichtok := true; + + until nichtok + end; + for i := 0 to maxwl do + spv[i] := spvtmp[i]; {spv wiederherstellen, C Version. -PRAK!- } + end { trennen }; + +{----------------------------------------------------------------------------} + +procedure abteilen ( var w:wort; var tr1:trennvektor; + laenge : integer; var ok:boolean; + var zerlegungen:integer ); + + label 99; + + { kommt in den outer Block } + { mtype sperrvektor=array [0..maxwl] of boolean; } + + var + i:integer; + dud:dudt; { array [0..maxwl] of boolean; } + v:varr; + ind,k:intarr; + spv,dudstop:sperrvektor; + tr, dudtr:trennvektor; + + begin { abteilen } + tr1[0] := keine; + for i:=0 to laenge do begin + tr[i]:=keine; spv[i]:=false; dudstop[i]:=false; dud[i]:=false; + if i > 0 then + if (w[i] = trennzeichen) or (w[i] = sonderzeichen) + then begin + zerlegungen := 0; + ok := false; + goto 99; + end; + end; + zerlegungen:=0; + trennen(3, 1, spv, ok, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + + for i:=0 to laenge do + if tr1[i]=nebenck then begin + tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- } + tr1[i-1]:=nebenck; {sprechend getrennt wird } + end; +99: + end;{ abteilen } +{----------------------------------------------------------------------------} + + {identification number for dirty umlauts; see description in + change file} + + function is_dirty_umlaut(p:pointer):boolean; + var res:boolean; + q:pointer; + begin + res:=false; + if p<>null then + if type(p)=disc_node then + if pre_break(p)<>null then + if link(pre_break(p))<>null then + if link(link(pre_break(p)))<>null then begin + q:=pre_break(p); + if type(q)=penalty_node then q:=link(q); + if (type(q)=kern_node)and(width(q)=spec_letter_ID)and + is_char_node(link(q))and(type(link(link(q)))=kern_node) then res:=true; + end; + is_dirty_umlaut:=res; + end; {|is_dirty_umlaut|} + + function get_char_of(s:pointer):integer; + var q:pointer; + begin + q:=pre_break(s); + if type(q)=penalty_node then q:=link(q); + get_char_of:=width(link(link(q))); + end; {|get_char_of|} + + function get_font_of(s:pointer):integer; + var q:pointer; + begin + q:=pre_break(s); + if type(q)=penalty_node then q:=link(q); + get_font_of:=font(link(q)); + end; {|get_font_of|} + +{----------------------------------------------------------------------------} + +@ Ende ... +@z + +========================================================================= + +@x +@ Now let's go back to the easier problem, of building the linked +trie. When \.{INITEX} has scanned the `\.{\\patterns}' control +sequence, it calls on |new_patterns| to do the right thing. + +@<Declare procedures for preprocessing hyph...@>= +procedure new_patterns; {initializes the hyphenation pattern data} +label done, done1; +var k,@!l:small_number; {indices into |hc| and |hyf|} +@!digit_sensed:boolean; {should the next digit be treated as a letter?} +@!v:quarterword; {trie op code} +@!p,@!q:trie_pointer; {nodes of trie traversed during insertion} +@!first_child:boolean; {is |p=trie_l[q]|?} +@!c:ASCII_code; {character being inserted} +begin if trie_not_ready then + begin set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}} + @<Enter all of the patterns into a linked trie, until coming to a right + brace@>; + end +else begin print_err("Too late for "); print_esc("patterns"); + help1("All patterns must be given before typesetting begins."); + error; link(garbage):=scan_toks(false,false); flush_list(def_ref); + end; +end; +@y +@ We do not build a trie (wether a linked nor a packed). Instead, we +create a hash table for the \SISISI-hyphenation algorithm. But we +still use the data provided by the `\.{\\patterns}' primitive. + +@<Declare procedures for preprocessing hyph...@>= +procedure new_patterns; {initializes the hyphenation pattern data} + label done; + var k: small_number; {index into |zeile|} + @!zeile:string80; { Silbe <space> Type <,> als Eintrag der Hashtabelle } + @!status:integer; + @!c:ASCII_code; {character being inserted} +begin + if trie_not_ready then begin + set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}} + + hashempty; { create the empty hash table } + @<Enter all of the patterns into a hash table, until coming to a right + brace; then skip an optional space@>; + hashsave(status); + if status<>0 then begin + wterm_ln('Fehler bei hash save !!!!!'{?}); + wlog_ln( 'Fehler bei hash save !!!!!'{?}); + end; + end else begin + print_err("Too late for "); print_esc("patterns"); + help1("All patterns must be given before typesetting begins."); + error; link(garbage):=scan_toks(false,false); flush_list(def_ref); + end; +end; +@z + + +-------------------------------------------------------------------------- + + +@x +@ Novices are not supposed to be using \.{\\patterns}, so the error +messages are terse. (Note that all error messages appear in \TeX's string +pool, even if they are used only by \.{INITEX}.) + +@<Enter all of the patterns into a linked trie...@>= +k:=0; hyf[0]:=0; digit_sensed:=false; +loop@+ begin get_x_token; + case cur_cmd of + letter,other_char:@<Append a new letter or a hyphen level@>; + spacer,right_brace: begin if k>0 then + @<Insert a new pattern into the linked trie@>; + if cur_cmd=right_brace then goto done; + k:=0; hyf[0]:=0; digit_sensed:=false; + end; + othercases begin print_err("Bad "); print_esc("patterns"); +@.Bad \\patterns@> + help1("(See Appendix H.)"); error; + end + endcases; + end; +done: +@y +@ Here we build the hash table for the \SISISI-hyphenation. + +@<Enter all of the patterns into a hash table, until coming to a right...@>= +for k:=0 to maxwl do zeile[k]:=" "; +k:=0; +loop@+ begin + get_x_token; { \SISISI Worttabelle hat das Format 'Text.Type,'. + Der Beistrich wird eigens abgefragt, da er in TeX + umdefiniert werden kann. } + if (cur_cmd = right_brace)or(cur_chr = ",") then + begin + { Ein Eintrag der Worttabelle - letzter + (|cur_cmd|=|right_brace|) - gelesen } + if k>0 then eintragen(zeile,k); { ein Eintrag vorhanden } + if cur_cmd = right_brace then goto done; + k := 0; { hyf[] ist \"uberfl\"ussig, da die + Trenninformation in zeile mitverpackt ist. } + end + else { Das Wort ist noch nicht fertig gelesen } + if (cur_cmd = letter) or (cur_cmd = other_char) + or (cur_cmd = spacer) or (cur_chr = ".") + then begin + @<Append a new letter or a hyphen level@>; + end else begin + print_err("Bad "); print_esc("patterns"); +@.Bad \\patterns@> + help1("(See Appendix H.)"); error; + end; +end; {|loop|} +done: +@z + +----------------------------------------------------------------------------- + + +@x +@ @<Append a new letter or a hyphen level@>= +if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then + begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter} + else begin cur_chr:=lc_code(cur_chr); + if cur_chr=0 then + begin print_err("Nonletter"); +@.Nonletter@> + help1("(See Appendix H.)"); error; + end; + end; + if k<63 then + begin incr(k); hc[k]:=cur_chr; hyf[k]:=0; digit_sensed:=false; + end; + end +else if k<63 then + begin hyf[k]:=cur_chr-"0"; digit_sensed:=true; + end +@y +@ @<Append a new letter or a hyphen level@>= +if (cur_chr<>" ")then begin + { Das Leerzeichen wird \"uberlesen! } + if (cur_chr <> ".") then begin + { der Punkt trennt die Silbe von der Silbenart und bleibt erhalten } + if (cur_chr<"0")or(cur_chr>"9") then begin + cur_chr:=lc_code(cur_chr); + if cur_chr=0 then begin + print_err("Nonletter"); +@.Nonletter@> + help1("(See Appendix H.)"); error; cur_chr:=128; + end; + end; + end; + if k<63 then begin + incr(k); zeile[k]:=cur_chr; + end; +end; +@z + +---------------------------------------------------------------------------- + + +@x +@ When the following code comes into play, the pattern $p_1\ldots p_k$ +appears in |hc[1..k]|, and the corresponding sequence of numbers $n_0\ldots +n_k$ appears in |hyf[0..k]|. + +@<Insert a new pattern into the linked trie@>= +begin @<Compute the trie op code, |v|, and set |l:=0|@>; +q:=0; hc[0]:=cur_lang; +while l<=k do + begin c:=hc[l]; incr(l); p:=trie_l[q]; first_child:=true; + while (p>0)and(c>so(trie_c[p])) do + begin q:=p; p:=trie_r[q]; first_child:=false; + end; + if (p=0)or(c<so(trie_c[p])) then + @<Insert a new trie node between |q| and |p|, and + make |p| point to it@>; + q:=p; {now node |q| represents $p_1\ldots p_l$} + end; +if trie_o[q]<>min_quarterword then + begin print_err("Duplicate pattern"); +@.Duplicate pattern@> + help1("(See Appendix H.)"); error; + end; +trie_o[q]:=v; +end +@y +@ Well, that was everything about the initialization of the \SISISI hash +table (at this place). + +All following sections, describing the initialization of the trie are +replaced by ``empty sections'' in order to have same section numbering +in SI\TeX as in \TeX. +@z + +---------------------------------------------------------------------------- + +@x +@ @<Insert a new trie node between |q| and |p|...@>= +begin if trie_ptr=trie_size then overflow("pattern memory",trie_size); +@:TeX capacity exceeded pattern memory}{\quad pattern memory@> +incr(trie_ptr); trie_r[trie_ptr]:=p; p:=trie_ptr; trie_l[p]:=0; +if first_child then trie_l[q]:=p@+else trie_r[q]:=p; +trie_c[p]:=si(c); trie_o[p]:=min_quarterword; +end +@y +@ ``Empty section''. +@z +------------------------------------------------------------------------------ +@x +@ @<Compute the trie op code, |v|...@>= +if hc[1]=0 then hyf[0]:=0; +if hc[k]=0 then hyf[k]:=0; +l:=k; v:=min_quarterword; +loop@+ begin if hyf[l]<>0 then v:=new_trie_op(k-l,hyf[l],v); + if l>0 then decr(l)@+else goto done1; + end; +done1: +@y +@ Further ``empty section''. +@z + +@x +@ Finally we put everything together: Here is how the trie gets to its +final, efficient form. +The following packing routine is rigged so that the root of the linked +tree gets mapped into location 1 of |trie|, as required by the hyphenation +algorithm. This happens because the first call of |first_fit| will +``take'' location~1. + +@<Declare procedures for preprocessing hyphenation patterns@>= +procedure init_trie; +var @!p:trie_pointer; {pointer for initialization} +@!j,@!k,@!t:integer; {all-purpose registers for initialization} +@!r,@!s:trie_pointer; {used to clean up the packed |trie|} +@!h:two_halves; {template used to zero out |trie|'s holes} +begin @<Get ready to compress the trie@>; +if trie_root<>0 then + begin first_fit(trie_root); trie_pack(trie_root); + end; +@y +@ Because we do not use the trie, we fill it with dummy data. +But the main reason, why we do not remove this procedure is, that +it is called and the used variables are referenced somewhere in \TeX. + + +@<Declare procedures for preprocessing hyphenation patterns@>= +procedure init_trie; + var @!p:trie_pointer; {pointer for initialization} + @!j,@!k,@!t:integer; {all-purpose registers for initialization} + @!r,@!s:trie_pointer; {used to clean up the packed |trie|} + @!h:two_halves; {template used to zero out |trie|'s holes} +begin + trie_root:=0; +@z + +========================================================================= + diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch b/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch new file mode 100644 index 0000000000..107fff2fe0 --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch @@ -0,0 +1,1937 @@ +% Change file for TeX in C, derived from various other change files. +% By Tim Morgan, UC Irvine ICS Department, and many others. +% +% Modification history: +% (05/28/86) ETM Started with TeX 2.0 +% (06/03/87) ETM Brought up to TeX 2.2 +% (09/26/87) ETM Brought up to TeX 2.3 +% (10/01/87) ETM Brought up to TeX 2.5 +% (12/21/87) ETM Brought up to TeX 2.7 +% (01/14/88) ETM Brought up to TeX 2.9 +% (02/20/88) PAM Revised format and module numbers +% (03/01/88) ETM Eliminated some unused variables and unnecesary tests +% (05/09/88) ETM Added yet another casting bug fix +% (06/21/88) ETM Brought up to TeX version 2.93 +% (12/11/88) ETM Brought up to TeX version 2.94 +% (01/12/89) PAM Brought up to TeX version 2.95 +% (02/14/89) ETM Brought up to TeX version 2.96 +% (03/10/89) ETM Brought up to TeX version 2.98 +% (07/06/89) ETM Brought up to TeX version 2.991 +% (11/30/89) KB To version 2.992 (8-bit). +% (01/10/90) SR To version 2.993. +% (03/27/90) KY To version 3.0. +% (more recent changes in ../ChangeLog.W2C and ChangeLog) +% +% The module numbers in this change file refer to the published text in +% TeX: The Program, Volume B of Computers&Typesetting, 1986. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [0] WEAVE: print changes only. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + \def\?##1]{\hbox to 1in{\hfil##1.\ }} + } +@y + \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }} + } +\let\maybe=\iffalse +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.2] banner +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)' +@y +@d banner=='This is TeX, C Version 3.141 (+SISISI 1.0)' +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.4] program header +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Actually the heading shown here is not quite normal: The |program| line +does not mention any |output| file, because \ph\ would ask the \TeX\ user +to specify a file name if |output| were specified here. +@^system dependencies@> + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +program TEX; {all file names are defined dynamically} +label @<Labels in the outer block@>@/ +@y + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +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; + {key control points} +@y +@<Labels in the outer block@>= +start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end; + {key control points} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.7] debug..gubed, stat..tats +% Here we change these WEB symbols, which are used much as #ifdef's +% are 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] Same, for `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] Turn off all 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: some enlarged, dvi_buf_size 16K for +% BSD I/O, file_name_size is set from the system constant. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Constants...@>= +@!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:SITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@y +@d file_name_size == PATH_MAX + +@<Constants...@>= +@!mem_max=262140; {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=3000; {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=100000; {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=15000; {maximum number of strings; must not exceed |max_halfword|} +@!string_vacancies=100000; {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=124000; {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=24000; {space for hyphenation patterns; should be larger for + \.{INITEX} than it is in production versions of \TeX} +@!trie_op_size=750; {space for ``opcodes'' in the hyphenation patterns} +@!neg_trie_op_size=-750; {for lower trie_op_hash array bound} +@!min_trie_op=0; {first possible trie op code for any language} +@!max_trie_op=500; {largest possible trie op code for any language} +@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8} +@!pool_name='sitex.pool'; {name comes from \.{site.h}.} + {string of length |file_name_size|; tells where the string pool appears} +@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX}; + must be substantially larger than |mem_bot| + and not greater than |mem_max|} +@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 it is a ``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), since to needs +% to be changed for the trip test. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=9500 {maximum number of control sequences; it should be at most + about |(mem_max-mem_min)/10|} +@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|} +@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.16] Use C macros for `incr' and `decr'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d incr(#) == #:=#+1 {increase a variable by unity} +@d decr(#) == #:=#-1 {decrease a variable by unity} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] The text_char type is used as an array index into xord. The +% default type `char' produces signed integers, which are bad array +% indices in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d text_char == char {the data type of characters in text files} +@y +@d text_char == ASCII_code {the data type of characters in text files} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [2.23] Allow any character as input. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +for i:=0 to @'37 do xchr[i]:=' '; +for i:=@'177 to @'377 do xchr[i]:=' '; +@y +for i:=0 to @'37 do xchr[i]:=chr(i); +for i:=@'177 to @'377 do xchr[i]:=chr(i); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.25] Remove file types we don't need. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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.27] Do file opening in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 are defined in C. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.28] Do file closing in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 the file closing routines as well. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.31] Do `input_ln' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 define |input_ln| in C, for efficiency. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.32] `term_in' and `term_out' are standard input and output. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!term_in:alpha_file; {the terminal as an input file} +@!term_out:alpha_file; {the terminal as an output file} +@y +@d term_in==stdin {the terminal as an input file} +@d term_out==stdout {the terminal as an output file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.33] We 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 defined in C. + +@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} +@y +these operations can be specified with {\mc UNIX}. |update_terminal| +does an |fflush| (via the macro |flush|). |clear_terminal| is redefined +to do nothing, since the user should control the terminal. +@^system dependencies@> + +@d update_terminal == flush (term_out) +@d clear_terminal == do_nothing +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.37] Reading 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} +label exit; +begin t_open_in; +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); + if loc<last then + begin init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out,'Please type the name of your input file.'); + end; +exit:end; +@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@> + +@p +function init_terminal:boolean; {gets the terminal input started} +label exit; +begin + t_open_in; + 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; write(term_out, '**'); update_terminal; +@.**@> + if not input_ln(term_in,true) then begin {this shouldn't happen} + 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); + + if loc<last then begin + init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out, 'Please type the name of your input file.'); + end; +exit: +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51] Open the pool file using a path, and can't do string +% assignments directly. (`strcpy' and `strlen' work here because +% `pool_name' is a constant string, and thus ends in a null and doesn't +% start with a space.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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); {copy the string} +name_of_file[0] := ' '; +name_of_file[strlen (pool_name) +1 ] := ' '; +name_length := strlen (pool_name); +if a_open_in (pool_file, TEX_POOL_PATH) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how +% it's read. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else bad_pool('! I can''t read SITEX3.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 sitex.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('! sitex.pool has no check sum.'); +@.TEX.POOL has no check sum@> +read(pool_file,m); read(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('! sitex.pool line doesn''t begin with two digits.'); +@z +@x + bad_pool('! TEX.POOL check sum doesn''t have nine digits.'); +@y + bad_pool('! sitex.pool check sum doesn''t have nine digits.'); +@z +@x +done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.'); +@y +done: if a<>@$ then bad_pool('! sitex.pool doesn''t match; tangle me again.'); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [5.61] Eliminate the misleading message ``(no format preloaded)''. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if format_ident=0 then wterm_ln(' (no format preloaded)') +else begin slow_print(format_ident); print_ln; + end; +@y +if format_ident>0 then slow_print(format_ident); +print_ln; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [6.81] Eliminate nonlocal goto, since C doesn't have them. +% 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'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Error hand...@>= +procedure jump_out; +begin goto end_of_TEX; +end; +@y +@d do_final_end==begin + update_terminal; + 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.84] Implement the switch-to-editor option. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +line ready to be edited. But such an extension requires some system +wizardry, so the present implementation simply types out the name of the +file that should be +edited and the relevant line number. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@y +line ready to be edited. +We do this by calling the external procedure |call_edit| with a pointer to +the filename, its length, and the line number. +However, here we just set up the variables that will be used as arguments, +since we don't want to do the switch-to-editor until after TeX has closed +its files. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@d edit_file==input_stack[base_ptr] +@z +@x +"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; +@y +"E": if base_ptr>0 then + begin + edit_name_start:=str_start[edit_file.name_field]; + edit_name_length:=str_start[edit_file.name_field+1] - + str_start[edit_file.name_field]; + edit_line:=line; + jump_out; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.104] `remainder' is a library routine on some systems, so change +% its name to avoid conflicts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!arith_error:boolean; {has arithmetic overflow occurred recently?} +@!remainder:scaled; {amount subtracted to get an exact division} +@y +@d remainder == tex_remainder +@<Glob...@>= +@!arith_error:boolean; {has arithmetic overflow occurred recently?} +@!remainder:scaled; {amount subtracted to get an exact division} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.109] Define glue_ratio in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!glue_ratio=real; {one-word representation of a glue expansion factor} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.110] Make it easy to build a bigger TeX. (Nothing is changed in +% the basic version.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=255 {largest allowable value in a |quarterword|} +@d min_halfword==0 {smallest allowable value in a |halfword|} +@d max_halfword==262143 {largest allowable value in a |halfword|} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.112] Efficiency. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +@^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 +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +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] We've put the memory structure into the include file +% `texmf.h', since it's too hard to translate automatically. Also, +% remove the `word_file' type. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!quarterword = min_quarterword..max_quarterword; {1/4 of a word} +@!halfword=min_halfword..max_halfword; {1/2 of a word} +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@!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 +@!quarterword=min_quarterword..max_quarterword; +@!halfword=min_halfword..max_halfword; +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@=#include "texmfmem.h";@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [9.116] Change `mem' to `zmem', so 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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [11.165] Fix the word `free' so that it doesn't conflict with the +% standard C library routine of the same name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) +@y +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) + +@d free==free_arr +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.174,176] Eliminate some unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + begin if (font(p)<font_base)or(font(p)>font_max) then + print_char("*") +@y + begin if (font(p)>font_max) then + print_char("*") +@z + +@x +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*") +@y +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)>font_max) then print_char("*") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.186] Don't worry about strange floating point values. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if glue_sign(p)=shrinking then print("- "); + if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?") + else if abs(g)>float_constant(20000) then +@y + if glue_sign(p)=shrinking then print("- "); + { The Unix |pc| folks removed this restriction with a remark that + invalid bit patterns were vanishingly improbable, so we follow + their example without really understanding it. + |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')| + |else| } + if fabs(g)>float_constant(20000) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [17.241] Do `fix_date_and_time' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +@^system dependencies@> +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 +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +It calls a macro-defined |date_and_time| routine. |date_and_time| +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. +@^system dependencies@> + +@d fix_date_and_time==date_and_time(time,day,month,year) +@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.262] Remove more unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@y +else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.513] Area and extension rules for filenames. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\.>' or `\.:', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the first +remaining `\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep track +of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any} +@!ext_delimiter:pool_pointer; {the relevant `\..', if any} +@y +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\./', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the last +`\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep +track of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\./', if any} +@!ext_delimiter:pool_pointer; {the most recent `\..', if any} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.514] TeX area directories. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d TEX_area=="TeXinputs:" +@.TeXinputs@> +@d TEX_font_area=="TeXfonts:" +@.TeXfonts@> +@y +In C, the default paths are specified in a separate +file, \.{site.h}. The file opening procedures do path searching +based either on those default paths, or on paths given by the user +in environment variables. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.516] more_name +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c=">")or(c=":") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length; +@y +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c="/") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if c="." then ext_delimiter:=cur_length; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.519] In pack_file_name, leave room for the extra null we append at +% the end of a filename in make_c_string. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if k<=file_name_size then name_length:=k@+else name_length:=file_name_size; +@y +if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.520] The 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} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@y +Under {\mc UNIX} we don't give the area part, instead depending +on the path searching that will happen during file opening. Also, the +length will be set in the main program. + +@d format_area_length=0 {length of its area part} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.521] Where `plain.fmt' is. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!TEX_format_default:packed array[1..format_default_length] of char; + +@ @<Set init...@>= +TEX_format_default:='TeXformats:plain.fmt'; +@y +@!format_default_length: integer; +@!TEX_format_default: c_char_pointer; + +@ We set the name of the default format file and the length of that name +in C, instead of Pascal, since we want them to depend on the name of the +program. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.523] Change to pack_buffered_name as with pack_file_name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if k<=file_name_size then name_length:=k@+else name_length:=file_name_size; +@y +if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.524] Format file opening: only try once, with path searching. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + pack_buffered_name(0,loc,j-1); {try first without the system file area} + if w_open_in(fmt_file) then goto found; + 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 + pack_buffered_name(0,loc,j-1); + if w_open_in(fmt_file) then goto found; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% (still [29.524]) replace `PLAIN' in error messages with `default'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.'); +@y + wterm_ln('Sorry, I can''t find that format;',' will try the default.'); +@z +@x + wterm_ln('I can''t find the PLAIN format file!'); +@.I can't find PLAIN...@> +@y + wterm_ln('I can''t find the default format file!'); +@.I can't find default format...@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.532] `logname' is declared in <unistd.h> on some systems. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +ship out a box of stuff, we shall use the macro |ensure_dvi_open|. +@y +ship out a box of stuff, we shall use the macro |ensure_dvi_open|. + +@d log_name == texmf_log_name +@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 + +@x +months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@y +months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Use a path when calling a_open_in to do a \input; also, try +% to open the file with and without the `.tex' extension, regardless of +% whether the file already has an extension. This allows filenames like +% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if cur_ext="" then cur_ext:=".tex"; +pack_cur_name; +loop@+ begin begin_file_reading; {set up |cur_file| and new level of input} + 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 +pack_cur_name; {Try with |".tex"|.} +loop@+begin + begin_file_reading; {set up |cur_file| and new level of input} + {Don't add |".tex"| if it's already there, + don't overflow |name_of_file|, + and don't add |".tex"| if |"foo"| and |"foo.tex"| are really the same + file, because of operating-system filename length limitations (e.g., + |"afourteenlongf"| and |"afourteenlongf.tex"| under System V).} + if (cur_ext <> ".tex") and (name_length + 5 < file_name_size) + and (not extension_irrelevant_p (name_of_file, 'tex')) + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + {Try without |".tex"|.} + if cur_ext = ".tex" then cur_ext := ""; + pack_cur_name; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; +@z + +% Knuth should fix this bug. +@x +if term_offset+length(name)>max_print_line-2 then print_ln +@y +if term_offset+length(name)>max_print_line-3 then print_ln +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Get rid of return of filename to string pool. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if name=str_ptr-1 then {we can conserve string pool space now} + begin flush_string; name:=cur_name; + end; +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [30.563] Fix TFM file opening. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +file_opened:=false; +if aire="" then pack_file_name(nom,TEX_font_area,".tfm") +else pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@y +file_opened:=false; +pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [32.597] We only want `eof' on the TFM file to be true if we +% previously had EOF, not if we're at EOF now. This is like `feof', and +% unlike our implementation of `eof' elsewhere. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if eof(tfm_file) then abort; +@y +if feof(tfm_file) then abort; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [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.875] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +repeat if type(r)<>delta_node then + begin line_diff:=line_number(r)-best_line; +@y +repeat if type(r)<>delta_node then + begin line_diff:=toint(line_number(r))-toint(best_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [42.920,921,923,924] Allow larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Comparatively few different number sequences $n_0\ldots n_k$ actually occur, +since most of the |n|'s are generally zero. Therefore the number sequences +are encoded in such a way that |trie_op|$(z_k)$ is only one byte long. +If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|. +@y +The theory that comparatively few different number sequences $n_0\ldots n_k$ +actually occur, since most of the |n|'s are generally zero, seems to fail +at least for the large German hyphenation patterns. +Therefore the number sequences cannot any longer be encoded in such a way +that |trie_op|$(z_k)$ is only one byte long. +We have introduced a new constant |max_trie_op| for the maximum allowable +hyphenation operation code value; |max_trie_op| might be different for +\TeX\ and \.{INITEX} and must not exceed |max_halfword|. +An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword| +or a quarterword otherwise. +@^system dependencies@> +If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|. +@z +@x +@!trie_pointer=0..trie_size; {an index into |trie|} +@y +@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode} +@!trie_pointer=0..trie_size; {an index into |trie|} +@z +@x +@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie} +@d trie_char(#)==trie[#].b1 {character matched at this trie location} +@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location} +@y +@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|, +and |trie_op| will no longer fit into one memory word; thus using web2c +we define |trie| as three array instead of an array of records. +The variant will be implented by reusing the opcode field later on with +another macro. +@d trie_link(#)==trie_trl[#] {``downward'' link in a trie} +@d trie_char(#)==trie_trc[#] {character matched at this trie location} +@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location} +@z +@x +@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|} +@y +@!trie_trl:array[trie_pointer] of halfword; {|trie_link|} +@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|} +@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|} +@z +@x +@!hyf_next:array[1..trie_op_size] of quarterword; {continuation code} +@y +@!hyf_next:array[1..trie_op_size] of trie_opcode; {continuation code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943] Larger tries, also in documentation parts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +|hyf_next[@t$v^\prime$@>]=min_quarterword|. +@y +|hyf_next[@t$v^\prime$@>]=min_trie_op|. +@z +@x +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad +@y +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.?] Hack around the negative lower bound here. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The hash table is called |trie_op_hash|, and the number of entries it contains +is |trie_op_ptr|. + +@<Glob...@>= +@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size; +@y +The hash table is called |trie_op_hash|, and the number of entries it contains +is |trie_op_ptr|. + +@<Glob...@>= +@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943,944] Larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!trie_used:array[ASCII_code] of quarterword; +@y +@!trie_used:array[ASCII_code] of trie_opcode; +@z +@x +@!trie_op_val:array[1..trie_op_size] of quarterword; +@y +@!trie_op_val:array[1..trie_op_size] of trie_opcode; +@z +@x +tini +@y +tini@; +@!max_op_used:trie_opcode; {largest opcode used for any language} +@!small_op:boolean; {flag used while dumping or undumping} +@z +@x +|new_trie_op| could return |min_quarterword| (thereby simply ignoring +@y +|new_trie_op| could return |min_trie_op| (thereby simply ignoring +@z +@x +function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword; +label exit; +var h:-trie_op_size..trie_op_size; {trial hash location} +@!u:quarterword; {trial op code} +@y +function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode; +label exit; +var h:neg_trie_op_size..trie_op_size; {trial hash location} +@!u:trie_opcode; {trial op code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (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+trie_op_size) +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944,945,946] And larger tries again. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if u=max_quarterword then + overflow("pattern memory ops per language", + max_quarterword-min_quarterword); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; +@y + if u=max_trie_op then + overflow("pattern memory ops per language", + max_trie_op-min_trie_op); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; + if u>max_op_used then max_op_used:=u; +@z +@x +op_start[0]:=-min_quarterword; +@y +op_start[0]:=-min_trie_op; +@z +@x +for k:=0 to 255 do trie_used[k]:=min_quarterword; +@y +for k:=0 to 255 do trie_used[k]:=min_trie_op; +@z +@x +trie_op_ptr:=0; +@y +max_op_used:=min_trie_op; +trie_op_ptr:=0; +@z +@x +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword; +@y +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.950,958,960,963] Larger tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d trie_back(#)==trie[#].lh {backward links in |trie| holes} +@y +@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links} +@z +@x +@<Move the data into |trie|@>= +h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|, + |trie_op:=min_quarterword|, |trie_char:=qi(0)|} +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do trie[r]:=h; +@y +@d clear_trie == {clear |trie[r]|} + begin trie_link(r):=0; + trie_op(r):=min_trie_op; + trie_char(r):=min_quarterword; {|trie_char:=qi(0)|} + end +@<Move the data into |trie|@>= +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do clear_trie; +@z +@x + repeat s:=trie_link(r); trie[r]:=h; r:=s; +@y + repeat s:=trie_link(r); clear_trie; r:=s; +@z +@x + @!h:two_halves; {template used to zero out |trie|'s holes} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [49.1275] Same stuff as for \input, this time for \openin. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if cur_ext="" then cur_ext:=".tex"; + pack_cur_name; + if a_open_in(read_file[n]) then read_open[n]:=just_open; +@y + pack_cur_name; {Try with |".tex"|.} + if (cur_ext <> ".tex") and (name_length + 5 < file_name_size) + and (not extension_irrelevant_p (name_of_file, 'tex')) + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open + else begin + if cur_ext = ".tex" then cur_ext := ""; + pack_cur_name; {Try without |".tex"|.} + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open; + end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1302] Eliminate now-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} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1303] Ditto, for `load_fmt_file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!x: integer; {something undumped} +@!w: four_quarters; {four ASCII codes} +@y +@!x: integer; {something undumped} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.??] Do reading and writing of `fmt_file' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@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 +@z + +@x +@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 +@z + +@x +x:=fmt_file^.int; +@y +undump_int(x); {This reads the first word of the \.{.fmt} file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] Make dumping/undumping more efficient. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +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 +dump_things(str_start[0], str_ptr+1); +dump_things(str_pool[0], pool_ptr); +@z + +@x +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 +undump_things(str_start[0], str_ptr+1); +undump_things(str_pool[0], pool_ptr); +@z + +@x +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 +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 + +@x +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 +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 +for k:=hi_mem_min to mem_end do undump_wd(mem[k]); +@y +undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +for j:=k to k+x-1 do undump_wd(eqtb[j]); +@y +undump_things(eqtb[k], x); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]); +@y +dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]); +@y +undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +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 +@<Dump the array info for internal font number |k|@>; +@z + +@x +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 +@<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 +@ @<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 +@ @<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); +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.1322] Reading font info for C (nearly done with undump stuff). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ @<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)(font_mem_size)(bchar_label[k]); +undump(min_quarterword)(non_char)(font_bchar[k]); +undump(min_quarterword)(non_char)(font_false_bchar[k]); +end +@y +@ 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); +end +@z + +% The hyphenation patterns. +% +@x +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 +dump_things(trie_trl[0], trie_max+1); +dump_things(trie_tro[0], trie_max+1); +dump_things(trie_trc[0], trie_max+1); +dump_int(trie_op_ptr); +dump_things(hyf_distance[1], trie_op_ptr); +dump_things(hyf_num[1], trie_op_ptr); +dump_things(hyf_next[1], trie_op_ptr); +@z + +@x +for k:=0 to j do undump_hh(trie[k]); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +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 +undump_things(trie_trl[0], j+1); +undump_things(trie_tro[0], j+1); +undump_things(trie_trc[0], j+1); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +undump_things(hyf_distance[1], j); +undump_things(hyf_num[1], j); +undump_things(hyf_next[1], j); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1327] As with TFM files, `eof' here means `have we previously +% encountered the end-of-file', not `are we at the end of the file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if (x<>69069)or eof(fmt_file) then goto bad_fmt +@y +if (x<>69069)or feof(fmt_file) then goto bad_fmt +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +print(" (preloaded format="); print(job_name); print_char(" "); +@y +print(" (format="); print(job_name); print_char(" "); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1332] `uexit' argument depends on `history'; add call to +% set_paths; make the main program a procedure, so that uses of `eqtb' +% will work. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@p begin @!{|start_here|} +@y +@p procedure tex_body; +begin @!{|start_here|} +@z + +@x +t_open_out; {open the terminal for output} +@y +t_open_out; {open the terminal for output} +{get default file paths from the environment} +set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT + + TFM_FILE_PATH_BIT); +@z + +@x +end_of_TEX: close_files_and_terminate; +final_end: ready_already:=0; +end. +@y +close_files_and_terminate; +final_end: do_final_end; +end {|tex_body|}; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1333] Print new line before termination; switch to editor if +% necessary. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + slow_print(log_name); print_char("."); + end; + end; +@y + slow_print(log_name); print_char("."); + end; + end; +print_ln; +if (edit_name_start<>0) and (interaction>batch_mode) then + call_edit(str_pool,edit_name_start,edit_name_length,edit_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [52.1338] Core-dump in debugging mode on 0 input. Under 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 + begin goto breakpoint;@\ {go to every label at least once} + breakpoint: m:=0; @{'BREAKPOINT'@}@\ + end +@y + dump_core {Do something to cause a core dump} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [54.1376] Add editor-switch variables to globals. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +This section should be replaced, if necessary, by any special +modifications of the program +that are necessary to make \TeX\ work at a particular installation. +It is usually best to design your change file so that all changes to +previous sections preserve the section numbering; then everybody's version +will be consistent with the published program. More extensive changes, +which introduce new sections, can be inserted here; then only the index +itself will get a new section number. +@^system dependencies@> +@y +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; +@z diff --git a/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch.other b/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch.other new file mode 100644 index 0000000000..ef710b8def --- /dev/null +++ b/obsolete/systems/sisisi/unix/SiTeX3.141/tex.ch.other @@ -0,0 +1,1964 @@ +% tex.ch for C compilation with web2c, derived from various other change files. +% By Tim Morgan, UC Irvine ICS Department, and many others. +% +% Modification history: +% (05/28/86) ETM Started with TeX 2.0 +% (06/03/87) ETM Brought up to TeX 2.2 +% (09/26/87) ETM Brought up to TeX 2.3 +% (10/01/87) ETM Brought up to TeX 2.5 +% (12/21/87) ETM Brought up to TeX 2.7 +% (01/14/88) ETM Brought up to TeX 2.9 +% (02/20/88) PAM Revised format and module numbers +% (03/01/88) ETM Eliminated some unused variables and unnecesary tests +% (05/09/88) ETM Added yet another casting bug fix +% (06/21/88) ETM Brought up to TeX version 2.93 +% (12/11/88) ETM Brought up to TeX version 2.94 +% (01/12/89) PAM Brought up to TeX version 2.95 +% (02/14/89) ETM Brought up to TeX version 2.96 +% (03/10/89) ETM Brought up to TeX version 2.98 +% (07/06/89) ETM Brought up to TeX version 2.991 +% (11/30/89) KB To version 2.992 (8-bit). +% (01/10/90) SR To version 2.993. +% (03/27/90) KY To version 3.0. +% (more recent changes in ChangeLog) +% +% The module numbers in this change file refer to the published text in +% TeX: The Program, Volume B of Computers&Typesetting. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [0] WEAVE: print changes only. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + \def\?##1]{\hbox to 1in{\hfil##1.\ }} + } +@y + \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }} + } +\let\maybe=\iffalse +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.2] banner +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)' +@y +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)' {more is printed later} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.4] program header +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Actually the heading shown here is not quite normal: The |program| line +does not mention any |output| file, because \ph\ would ask the \TeX\ user +to specify a file name if |output| were specified here. +@^system dependencies@> + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +program TEX; {all file names are defined dynamically} +label @<Labels in the outer block@>@/ +@y + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +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; + {key control points} +@y +@<Labels in the outer block@>= +start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end; + {key control points} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.7] debug..gubed, stat..tats +% Here we change these WEB symbols, which are used much as #ifdef's +% are 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] Same, for `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] Turn off all 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: some enlarged, dvi_buf_size 16K for +% BSD I/O, file_name_size is set from the system constant. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Constants...@>= +@!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:SITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@y +@d file_name_size == PATH_MAX + +@<Constants...@>= +@!mem_max=262140; {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=3000; {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=100000; {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=15000; {maximum number of strings; must not exceed |max_halfword|} +@!string_vacancies=100000; {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=124000; {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=30000; {space for hyphenation patterns; should be larger for + \.{INITEX} than it is in production versions of \TeX. This much is + needed for English, German, and Portuguese.} +@!trie_op_size=751; {space for ``opcodes'' in the hyphenation patterns; + should be relatively prime to 313, 361, and 1009, and prime.} +@!neg_trie_op_size=-751; {for lower |trie_op_hash| array bound; + must be equal to |-trie_op_size|.} +@!min_trie_op=0; {first possible trie op code for any language} +@!max_trie_op=500; {largest possible trie op code for any language} +@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8} +@!pool_name='sitex.pool'; + {string of length |file_name_size|; tells where the string pool appears} +@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX}; + must be substantially larger than |mem_bot|, + equal to |mem_max| in \.{INITEX}, else not greater than |mem_max|} +@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 it is a ``sensitive'' +% constant, we're going to make mem_top a #define in the C code for +% readability and ease of modification (it's up above) -- it needs +% to be changed for the trip test. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=9500 {maximum number of control sequences; it should be at most + about |(mem_max-mem_min)/10|} +@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|} +@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.16] Use C macros for `incr' and `decr'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d incr(#) == #:=#+1 {increase a variable by unity} +@d decr(#) == #:=#-1 {decrease a variable by unity} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] The text_char type is used as an array index into xord. The +% default type `char' produces signed integers, which are bad array +% indices in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d text_char == char {the data type of characters in text files} +@y +@d text_char == ASCII_code {the data type of characters in text files} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [2.23] Allow any character as input. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +for i:=0 to @'37 do xchr[i]:=' '; +for i:=@'177 to @'377 do xchr[i]:=' '; +@y +for i:=0 to @'37 do xchr[i]:=chr(i); +for i:=@'177 to @'377 do xchr[i]:=chr(i); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.25] Remove file types we don't need. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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.27] Do file opening in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 are defined in C. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.28] Do file closing in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 the file closing routines as well. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.31] Do `input_ln' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 define |input_ln| in C, for efficiency. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.32] `term_in' and `term_out' are standard input and output. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!term_in:alpha_file; {the terminal as an input file} +@!term_out:alpha_file; {the terminal as an output file} +@y +@d term_in==stdin {the terminal as an input file} +@d term_out==stdout {the terminal as an output file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.33] We 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 defined in C. + +@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} +@y +these operations can be specified with {\mc UNIX}. |update_terminal| +does an |fflush| (via the macro |flush|). |clear_terminal| is redefined +to do nothing, since the user should control the terminal. +@^system dependencies@> + +@d update_terminal == flush (term_out) +@d clear_terminal == do_nothing +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.37] Reading 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} +label exit; +begin t_open_in; +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); + if loc<last then + begin init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out,'Please type the name of your input file.'); + end; +exit:end; +@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@> + +@p +function init_terminal:boolean; {gets the terminal input started} +label exit; +begin + t_open_in; + 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; write(term_out, '**'); update_terminal; +@.**@> + if not input_ln(term_in,true) then begin {this shouldn't happen} + 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); + + if loc<last then begin + init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out, 'Please type the name of your input file.'); + end; +exit: +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51] Open the pool file using a path, and can't do string +% assignments directly. (`strcpy' and `strlen' work here because +% `pool_name' is a constant string, and thus ends in a null and doesn't +% start with a space.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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); {copy the string} +name_of_file[0] := ' '; +name_of_file[strlen (pool_name) +1 ] := ' '; +name_length := strlen (pool_name); +if a_open_in (pool_file, TEX_POOL_PATH) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how +% it's read. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else bad_pool('! I can''t read SITEX3.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 sitex.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('! sitex.pool has no check sum.'); +@.TEX.POOL has no check sum@> +read(pool_file,m); read(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('! sitex.pool line doesn''t begin with two digits.'); +@z +@x + bad_pool('! TEX.POOL check sum doesn''t have nine digits.'); +@y + bad_pool('! sitex.pool check sum doesn''t have nine digits.'); +@z +@x +done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.'); +@y +done: if a<>@$ then bad_pool('! sitex.pool doesn''t match; tangle me again.'); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [5.61] Eliminate the misleading message ``(no format preloaded)''. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +wterm(banner); +if format_ident=0 then wterm_ln(' (no format preloaded)') +else begin slow_print(format_ident); print_ln; + end; +@y +wterm (banner); +wterm (version_string); +if format_ident>0 then slow_print(format_ident); +print_ln; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [6.81] Eliminate nonlocal goto, since C doesn't have them. +% 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'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Error hand...@>= +procedure jump_out; +begin goto end_of_TEX; +end; +@y +@d do_final_end==begin + update_terminal; + 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.84] Implement the switch-to-editor option. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +line ready to be edited. But such an extension requires some system +wizardry, so the present implementation simply types out the name of the +file that should be +edited and the relevant line number. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@y +line ready to be edited. +We do this by calling the external procedure |call_edit| with a pointer to +the filename, its length, and the line number. +However, here we just set up the variables that will be used as arguments, +since we don't want to do the switch-to-editor until after TeX has closed +its files. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@d edit_file==input_stack[base_ptr] +@z +@x +"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; +@y +"E": if base_ptr>0 then + begin + edit_name_start:=str_start[edit_file.name_field]; + edit_name_length:=str_start[edit_file.name_field+1] - + str_start[edit_file.name_field]; + edit_line:=line; + jump_out; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.104] `remainder' is a library routine on some systems, so change +% its name to avoid conflicts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!arith_error:boolean; {has arithmetic overflow occurred recently?} +@!remainder:scaled; {amount subtracted to get an exact division} +@y +@d remainder == tex_remainder +@<Glob...@>= +@!arith_error:boolean; {has arithmetic overflow occurred recently?} +@!remainder:scaled; {amount subtracted to get an exact division} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.109] Define glue_ratio in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!glue_ratio=real; {one-word representation of a glue expansion factor} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.110] Make it easy to change constants. Do not increase +% max_quarterword without changing the memoryword structure in +% `texmfmem.h'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=255 {largest allowable value in a |quarterword|} +@d min_halfword==0 {smallest allowable value in a |halfword|} +@d max_halfword==262143 {largest allowable value in a |halfword|} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.112] Efficiency. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +@^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 +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +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] We've put the memory structure into the include file +% `texmf.h', since it's too hard to translate automatically. Also, +% remove the `word_file' type. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!quarterword = min_quarterword..max_quarterword; {1/4 of a word} +@!halfword=min_halfword..max_halfword; {1/2 of a word} +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@!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 +@!quarterword=min_quarterword..max_quarterword; +@!halfword=min_halfword..max_halfword; +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@=#include "texmfmem.h";@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [9.116] Change `mem' to `zmem', so 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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [11.165] Fix the word `free' so that it doesn't conflict with the +% standard C library routine of the same name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) +@y +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) + +@d free==free_arr +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.174,176] Eliminate some unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + begin if (font(p)<font_base)or(font(p)>font_max) then + print_char("*") +@y + begin if (font(p)>font_max) then + print_char("*") +@z + +@x +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*") +@y +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)>font_max) then print_char("*") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.186] Don't worry about strange floating point values. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if glue_sign(p)=shrinking then print("- "); + if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?") + else if abs(g)>float_constant(20000) then +@y + if glue_sign(p)=shrinking then print("- "); + { The Unix |pc| folks removed this restriction with a remark that + invalid bit patterns were vanishingly improbable, so we follow + their example without really understanding it. + |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')| + |else| } + if fabs(g)>float_constant(20000) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [17.241] Do `fix_date_and_time' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +@^system dependencies@> +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 +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +It calls a macro-defined |date_and_time| routine. |date_and_time| +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. +@^system dependencies@> + +@d fix_date_and_time==date_and_time(time,day,month,year) +@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.262] Remove more unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@y +else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.513] Area and extension rules for filenames. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\.>' or `\.:', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the first +remaining `\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep track +of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any} +@!ext_delimiter:pool_pointer; {the relevant `\..', if any} +@y +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\./', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the last +`\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep +track of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\./', if any} +@!ext_delimiter:pool_pointer; {the most recent `\..', if any} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.514] TeX area directories. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d TEX_area=="TeXinputs:" +@.TeXinputs@> +@d TEX_font_area=="TeXfonts:" +@.TeXfonts@> +@y +In C, the default paths are specified in a separate +file, \.{site.h}. The file opening procedures do path searching +based either on those default paths, or on paths given by the user +in environment variables. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.516] more_name +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c=">")or(c=":") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length; +@y +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c="/") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if c="." then ext_delimiter:=cur_length; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.519] In pack_file_name, leave room for the extra null we append at +% the end of a filename in make_c_string. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if k<=file_name_size then name_length:=k@+else name_length:=file_name_size; +@y +if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.520] The 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} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@y +Under {\mc UNIX} we don't give the area part, instead depending +on the path searching that will happen during file opening. Also, the +length will be set in the main program. + +@d format_area_length=0 {length of its area part} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.521] Where `plain.fmt' is. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!TEX_format_default:packed array[1..format_default_length] of char; + +@ @<Set init...@>= +TEX_format_default:='TeXformats:plain.fmt'; +@y +@!format_default_length: integer; +@!TEX_format_default: c_char_pointer; + +@ We set the name of the default format file and the length of that name +in C, instead of Pascal, since we want them to depend on the name of the +program. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.523] Change to pack_buffered_name as with pack_file_name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if k<=file_name_size then name_length:=k@+else name_length:=file_name_size; +@y +if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.524] Format file opening: only try once, with path searching. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + pack_buffered_name(0,loc,j-1); {try first without the system file area} + if w_open_in(fmt_file) then goto found; + 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 + pack_buffered_name(0,loc,j-1); + if w_open_in(fmt_file) then goto found; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% (still [29.524]) replace `PLAIN' in error messages with `default'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.'); +@y + wterm_ln('Sorry, I can''t find that format;',' will try the default.'); +@z +@x + wterm_ln('I can''t find the PLAIN format file!'); +@.I can't find PLAIN...@> +@y + wterm_ln('I can''t find the default format file!'); +@.I can't find default format...@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.532] `logname' is declared in <unistd.h> on some systems. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +ship out a box of stuff, we shall use the macro |ensure_dvi_open|. +@y +ship out a box of stuff, we shall use the macro |ensure_dvi_open|. + +@d log_name == texmf_log_name +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.536] Adjust for C string conventions. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!months:packed array [1..36] of char; {abbreviations of month names} +@y +@!months:c_char_pointer; +@z + +@x +begin wlog(banner); +slow_print(format_ident); print(" "); +print_int(day); print_char(" "); +months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@y +begin wlog (banner); +wlog (version_string); +slow_print(format_ident); print(" "); +print_int(day); print_char(" "); +months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Use a path when calling a_open_in to do a \input; also, try +% to open the file with and without the `.tex' extension, regardless of +% whether the file already has an extension. This allows filenames like +% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if cur_ext="" then cur_ext:=".tex"; +pack_cur_name; +loop@+ begin begin_file_reading; {set up |cur_file| and new level of input} + 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 +pack_cur_name; {Try with |".tex"|.} +loop@+begin + begin_file_reading; {set up |cur_file| and new level of input} + {Don't add |".tex"| if it's already there, + if it would overflow |name_of_file|, + or if |"foo"| and |"foo.tex"| are really the same + file, because of operating-system filename length limitations (e.g., + |"afourteenlongf"| and |"afourteenlongf.tex"| under System V).} + if (cur_ext <> ".tex") and (name_length + 5 < file_name_size) + and (not extension_irrelevant_p (name_of_file, 'tex')) + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + + {Try without |".tex"|.} + if cur_ext = ".tex" then cur_ext := ""; + pack_cur_name; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + + {Couldn't find the file. Put |".tex"| back into the filename if we + removed it, and then invoke an external program. If it succeeds, try + opening the file once more.} + if cur_ext = "" then begin + cur_ext := ".tex"; + pack_cur_name; + end; + if make_tex_tex then begin + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + end; +@z + +% Knuth should fix this -- sometimes lines go over the |max_print_line|. +% I don't remember what caused this, so I'll comment this out until it +% happens again. +% @x +% if term_offset+length(name)>max_print_line-2 then print_ln +% @y +% if term_offset+length(name)>max_print_line-3 then print_ln +% @z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Get rid of return of filename to string pool. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if name=str_ptr-1 then {we can conserve string pool space now} + begin flush_string; name:=cur_name; + end; +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [30.563] Don't use font_area's in TFM opening, and invoke an external +% program if the first open fails. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +file_opened:=false; +if aire="" then pack_file_name(nom,TEX_font_area,".tfm") +else pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@y +file_opened := false; +pack_file_name (nom, aire, ".tfm"); +if not b_open_in(tfm_file) then begin + if make_tex_tfm then begin + if not b_open_in(tfm_file) then abort; + end else + abort; +end; +file_opened:=true +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [32.597] We only want `eof' on the TFM file to be true if we +% previously had EOF, not if we're at EOF now. This is like `feof', and +% unlike our implementation of `eof' elsewhere. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if eof(tfm_file) then abort; +@y +if feof(tfm_file) then abort; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [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.875] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +repeat if type(r)<>delta_node then + begin line_diff:=line_number(r)-best_line; +@y +repeat if type(r)<>delta_node then + begin line_diff:=toint(line_number(r))-toint(best_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [42.920,921,923,924] Allow larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Comparatively few different number sequences $n_0\ldots n_k$ actually occur, +since most of the |n|'s are generally zero. Therefore the number sequences +are encoded in such a way that |trie_op|$(z_k)$ is only one byte long. +If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|. +@y +The theory that comparatively few different number sequences $n_0\ldots n_k$ +actually occur, since most of the |n|'s are generally zero, seems to fail +at least for the large German hyphenation patterns. +Therefore the number sequences cannot any longer be encoded in such a way +that |trie_op|$(z_k)$ is only one byte long. +We have introduced a new constant |max_trie_op| for the maximum allowable +hyphenation operation code value; |max_trie_op| might be different for +\TeX\ and \.{INITEX} and must not exceed |max_halfword|. +An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword| +or a quarterword otherwise. +@^system dependencies@> +If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|. +@z +@x +@!trie_pointer=0..trie_size; {an index into |trie|} +@y +@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode} +@!trie_pointer=0..trie_size; {an index into |trie|} +@z +@x +@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie} +@d trie_char(#)==trie[#].b1 {character matched at this trie location} +@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location} +@y +@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|, +and |trie_op| will no longer fit into one memory word; thus using web2c +we define |trie| as three array instead of an array of records. +The variant will be implented by reusing the opcode field later on with +another macro. +@d trie_link(#)==trie_trl[#] {``downward'' link in a trie} +@d trie_char(#)==trie_trc[#] {character matched at this trie location} +@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location} +@z +@x +@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|} +@y +@!trie_trl:array[trie_pointer] of halfword; {|trie_link|} +@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|} +@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|} +@z +@x +@!hyf_next:array[1..trie_op_size] of quarterword; {continuation code} +@y +@!hyf_next:array[1..trie_op_size] of trie_opcode; {continuation code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943] Larger tries, also in documentation parts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +|hyf_next[@t$v^\prime$@>]=min_quarterword|. +@y +|hyf_next[@t$v^\prime$@>]=min_trie_op|. +@z +@x +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad +@y +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943,944] Larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!trie_used:array[ASCII_code] of quarterword; +@y +@!trie_used:array[ASCII_code] of trie_opcode; +@z +@x +@!trie_op_val:array[1..trie_op_size] of quarterword; +@y +@!trie_op_val:array[1..trie_op_size] of trie_opcode; +@z +@x +tini +@y +tini@; +@!max_op_used:trie_opcode; {largest opcode used for any language} +@!small_op:boolean; {flag used while dumping or undumping} +@z +@x +|new_trie_op| could return |min_quarterword| (thereby simply ignoring +@y +|new_trie_op| could return |min_trie_op| (thereby simply ignoring +@z +@x +function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword; +label exit; +var h:-trie_op_size..trie_op_size; {trial hash location} +@!u:quarterword; {trial op code} +@y +function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode; +label exit; +var h:neg_trie_op_size..trie_op_size; {trial hash location} +@!u:trie_opcode; {trial op code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944] Another casting problem, and use |neg_trie_op_size|. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +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.944,945,946] And larger tries again. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if u=max_quarterword then + overflow("pattern memory ops per language", + max_quarterword-min_quarterword); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; +@y + if u=max_trie_op then + overflow("pattern memory ops per language", + max_trie_op-min_trie_op); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; + if u>max_op_used then max_op_used:=u; +@z +@x +op_start[0]:=-min_quarterword; +@y +op_start[0]:=-min_trie_op; +@z +@x +for k:=0 to 255 do trie_used[k]:=min_quarterword; +@y +for k:=0 to 255 do trie_used[k]:=min_trie_op; +@z +@x +trie_op_ptr:=0; +@y +max_op_used:=min_trie_op; +trie_op_ptr:=0; +@z +@x +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword; +@y +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.950,958,960,963] Larger tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d trie_back(#)==trie[#].lh {backward links in |trie| holes} +@y +@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links} +@z +@x +@<Move the data into |trie|@>= +h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|, + |trie_op:=min_quarterword|, |trie_char:=qi(0)|} +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do trie[r]:=h; +@y +@d clear_trie == {clear |trie[r]|} + begin trie_link(r):=0; + trie_op(r):=min_trie_op; + trie_char(r):=min_quarterword; {|trie_char:=qi(0)|} + end +@<Move the data into |trie|@>= +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do clear_trie; +@z +@x + repeat s:=trie_link(r); trie[r]:=h; r:=s; +@y + repeat s:=trie_link(r); clear_trie; r:=s; +@z +@x + @!h:two_halves; {template used to zero out |trie|'s holes} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [49.1275] Same stuff as for \input, this time for \openin. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if cur_ext="" then cur_ext:=".tex"; + pack_cur_name; + if a_open_in(read_file[n]) then read_open[n]:=just_open; +@y + pack_cur_name; {Try with |".tex"|.} + if (cur_ext <> ".tex") and (name_length + 5 < file_name_size) + and (not extension_irrelevant_p (name_of_file, 'tex')) + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open + else begin + if cur_ext = ".tex" then cur_ext := ""; + pack_cur_name; {Try without |".tex"|.} + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open; + end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1302] Eliminate now-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} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1303] Ditto, for `load_fmt_file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!x: integer; {something undumped} +@!w: four_quarters; {four ASCII codes} +@y +@!x: integer; {something undumped} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.??] Do reading and writing of `fmt_file' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@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 +@z + +@x +@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 +@z + +@x +x:=fmt_file^.int; +@y +undump_int(x); {This reads the first word of the \.{.fmt} file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] Make dumping/undumping more efficient. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +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 +dump_things(str_start[0], str_ptr+1); +dump_things(str_pool[0], pool_ptr); +@z + +@x +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 +undump_things(str_start[0], str_ptr+1); +undump_things(str_pool[0], pool_ptr); +@z + +@x +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 +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 + +@x +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 +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 +for k:=hi_mem_min to mem_end do undump_wd(mem[k]); +@y +undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +for j:=k to k+x-1 do undump_wd(eqtb[j]); +@y +undump_things(eqtb[k], x); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]); +@y +dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]); +@y +undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +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 +@<Dump the array info for internal font number |k|@>; +@z + +@x +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 +@<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 +@ @<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 +@ @<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); +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.1322] Reading font info for C (nearly done with undump stuff). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ @<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)(font_mem_size)(bchar_label[k]); +undump(min_quarterword)(non_char)(font_bchar[k]); +undump(min_quarterword)(non_char)(font_false_bchar[k]); +end +@y +@ 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); +end +@z + +% The hyphenation patterns. +% +@x +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 +dump_things(trie_trl[0], trie_max+1); +dump_things(trie_tro[0], trie_max+1); +dump_things(trie_trc[0], trie_max+1); +dump_int(trie_op_ptr); +dump_things(hyf_distance[1], trie_op_ptr); +dump_things(hyf_num[1], trie_op_ptr); +dump_things(hyf_next[1], trie_op_ptr); +@z + +@x +for k:=0 to j do undump_hh(trie[k]); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +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 +undump_things(trie_trl[0], j+1); +undump_things(trie_tro[0], j+1); +undump_things(trie_trc[0], j+1); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +undump_things(hyf_distance[1], j); +undump_things(hyf_num[1], j); +undump_things(hyf_next[1], j); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1327] As with TFM files, `eof' here means `have we previously +% encountered the end-of-file', not `are we at the end of the file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if (x<>69069)or eof(fmt_file) then goto bad_fmt +@y +if (x<>69069)or feof(fmt_file) then goto bad_fmt +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +print(" (preloaded format="); print(job_name); print_char(" "); +@y +print(" (format="); print(job_name); print_char(" "); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1332] `uexit' argument depends on `history'; add call to +% set_paths; make the main program a procedure, so that uses of `eqtb' +% will work. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@p begin @!{|start_here|} +@y +@p procedure tex_body; +begin @!{|start_here|} +@z + +@x +t_open_out; {open the terminal for output} +@y +t_open_out; {open the terminal for output} +{get default file paths from the environment} +set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT + + TFM_FILE_PATH_BIT); +@z + +@x +end_of_TEX: close_files_and_terminate; +final_end: ready_already:=0; +end. +@y +close_files_and_terminate; +final_end: do_final_end; +end {|tex_body|}; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1333] Print new line before termination; switch to editor if +% necessary. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + slow_print(log_name); print_char("."); + end; + end; +@y + slow_print(log_name); print_char("."); + end; + end; +print_ln; +if (edit_name_start<>0) and (interaction>batch_mode) then + call_edit(str_pool,edit_name_start,edit_name_length,edit_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [52.1338] Core-dump in debugging mode on 0 input. Under 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 + begin goto breakpoint;@\ {go to every label at least once} + breakpoint: m:=0; @{'BREAKPOINT'@}@\ + end +@y + dump_core {Do something to cause a core dump} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [54.1376] Add editor-switch variables to globals. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +This section should be replaced, if necessary, by any special +modifications of the program +that are necessary to make \TeX\ work at a particular installation. +It is usually best to design your change file so that all changes to +previous sections preserve the section numbering; then everybody's version +will be consistent with the published program. More extensive changes, +which introduce new sections, can be inserted here; then only the index +itself will get a new section number. +@^system dependencies@> +@y +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; +@z diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/MANIFEST b/obsolete/systems/sisisi/unix/iSiTeX3.14/MANIFEST new file mode 100644 index 0000000000..74f1f775bf --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/MANIFEST @@ -0,0 +1,20 @@ +Dieses Verzeichnis enthaelt: +============================ + +MANIFEST Dieses File +install Installationsskript fuer ISITEX +isiMakefile Ersetzt TEXDIR/Makefile +isicoerce.h Kommt nach TEXDIR/coerce.h +isiconvert Ersetzt TEXDIR/convert +isictex.ch Ersetzt TEXDIR/ctex.ch +isimakefile Ersetzt TEXSRC/makefile +isitex.defines Kommt nach TEXDIR, enthaelt zusaetzl. Definitionen +isitex.web.Z tex.web mit SISISI und ISITEX hineingetie'd +isitex10.c Kommt nach TEXDIR/tex10.c +isitex3.ch Changefile mit ISITEX +isitex6.c Kommt nach TEXDIR/tex6.c +isitex7.c Kommt nach TEXDIR/tex7.c +isitexd.h Kommt nach TEXDIR/texd.h +isiweb2c.c WEB2C Konverter mit groesseren Tabellen +isiweb2c.h ditto +isiweb2c.yacc Grammatik fuer WEB2C; auch fuer Zeigertypen diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/install b/obsolete/systems/sisisi/unix/iSiTeX3.14/install new file mode 100644 index 0000000000..bf477b1a0e --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/install @@ -0,0 +1,52 @@ +#!/bin/sh + +TEXSRC="/users/heinz/src/tex/TeX3.14" +TEXDIR=$TEXSRC/tex +WEBDIR=$TEXSRC/web +WEB2CDIR=$TEXSRC/web2c +ISITEXDIR="/users/heinz/src/tex/sisisi/isitex" + +cd $TEXSRC + +( cd $ISITEXDIR; uncompress <isitex.web.Z >$TEXDIR/tex.web;\ + cp isiMakefile $TEXDIR/Makefile;\ + cp isiconvert $TEXDIR/convert; cp isictex.ch $TEXDIR/ctex.ch;\ + cp isimakefile $TEXSRC/makefile; cp isitex.defines $TEXDIR;\ + cp isiweb2c.h $WEB2CDIR/web2c.h; cp isiweb2c.c $WEB2CDIR/web2c.c;\ + cp isiweb2c.yacc $WEB2CDIR/web2c.yacc ) + +make "CC=gcc" TeX +if [ ! -f $TEXDIR/stamp-convert ] +then + echo "*** ISITEX: tex.p not converted. Something's gone wrong. Stop." 1>&2 + exit 1 +fi + +( cd $ISITEXDIR; cp isitex6.c $TEXDIR/tex6.c; cp isitex7.c $TEXDIR/tex7.c;\ + cp isitex10.c $TEXDIR/tex10.c; cp isitexd.h $TEXDIR/texd.h;\ + cp isicoerce.h $TEXDIR/coerce.h ) + +make "CC=gcc" TeX +if [ ! -f $TEXDIR/virtex ] +then + echo "*** ISITEX: make failed. Stop." 1>&2 + exit 2 +fi + +( cd $TEXDIR; mv tex.pool isitex.pool ) + +make formats +if [ ! -f $TEXSRC/stamp-formats ] +then + echo "*** ISITEX: make formats failed. Stop." 1>&2 + exit 2 +fi + +echo +echo "ISITEX has been successfully compiled, and the format files have been" +echo "generated. Now follow the guidelines from the README file for further" +echo "installation. Do not forget to copy $TEXDIR/isitex.pool" +echo "to your TEXPOOL-Directory." +echo + +exit 0 diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiMakefile b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiMakefile new file mode 100644 index 0000000000..2392cf8f21 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiMakefile @@ -0,0 +1,201 @@ +# This file makes TeX in its various incarnations. +# +# The file ../common/texmf.h uses the symbol `TeX' to define certain +# things that are different for TeX and Metafont, hence the addition to +# CFLAGS. + +SITEDIR=.. +CC=gcc +OPT=-O +CFLAGS=$(OPT) -I$(SITEDIR) -DTeX +LDFLAGS= +LOADLIBES= +SHELL=/bin/sh +LN=ln + +# The formats we know how to make. +# +formats=amstex.fmt etex.fmt latex.fmt slitex.fmt tex.fmt \ +texinfo.fmt picplus.fmt + + +makeargs=SITEDIR="$(SITEDIR)" CC="$(CC)" OPT="$(OPT)" \ + LDFLAGS="$(LDFLAGS)" LOADLIBES="$(LOADLIBES)" + +.SUFFIXES: +.SUFFIXES: .o .c +.c.o: + $(CC) $(CFLAGS) -c $*.c + +# Routines used everywhere. +# +commondefines=../common/common.defines ../common/texmf.defines +commonh=../common/extra.h ../common/common.h +commono=../common/alloca.o ../common/extra.o + +# Routines used in both TeX and Metafont. +# +extrac=../common/texmf.c +extrah=../common/texmf.h ../common/endian.h +extrao=texmf.o + +# Routines used in TeX, Metafont, and BibTeX. +# +fileioc=../common/fileio.c +fileioh=../common/fileio.h +fileioo=fileio.o + +# We don't add `$(commono)' here, since it doesn't depend on anything in +# this directory, and we write a dependency for `$(objs)' below. +# +objs=$(fileioo) tex0.o tex1.o tex2.o tex3.o tex4.o tex5.o tex6.o tex7.o tex8.o tex9.o tex10.o +iobjs=iextra.o initex.o $(objs) +vobjs=tex-extra.o itex.o $(objs) + + +default: all + +all: initex virtex +triptrap: triptex + +initex: stamp-convert $(iobjs) $(commono) + $(CC) -o initex $(LDFLAGS) $(iobjs) $(commono) $(LOADLIBES) + +virtex: stamp-convert $(vobjs) $(commono) + $(CC) -o virtex $(LDFLAGS) $(vobjs) $(commono) $(LOADLIBES) + +run-trip: + rm -f trip.tex + -$(LN) TeXtrip/trip.tex . + ../texware/pltotf TeXtrip/trip.pl trip.tfm + -$(SHELL) -c '. ./tripenv; \ + ./triptex < TeXtrip/trip1.in > /dev/null 2>&1' + -diff TeXtrip/tripin.log trip.log + -$(SHELL) -c '. ./tripenv; \ + ./triptex < TeXtrip/trip2.in > trip.fot' + -diff TeXtrip/trip.log trip.log + -diff TeXtrip/trip.fot trip.fot + $(SHELL) -c '. ./tripenv; \ + ../texware/dvitype trip.dvi < TeXtrip/dvitype.in > trip.typ' + -diff TeXtrip/trip.typ trip.typ + + +# Make format files automatically. +# +fmts: $(formats) + +amstex.fmt: tex.fmt + ./initex \&./tex amstex \\dump + +etex.fmt: tex.fmt + touch eplain.aux # Makes cross-reference warnings work right. + ./initex \&./tex eplain \\dump + mv eplain.fmt etex.fmt + mv eplain.log etex.log + +# Until LaTeX and SLiTeX are updated, we must use a hacked version, that +# sets the new parameters to reasonable values. +# +latex.fmt: + ./initex lplain \\dump + mv lplain.fmt latex.fmt + mv lplain.log latex.log + +picplus.fmt: tex.fmt + ./initex \&./tex picplus \\dump + +slitex.fmt: + ./initex splain \\dump + mv splain.fmt slitex.fmt + mv splain.log slitex.log + +tex.fmt: + ./initex plain \\dump + mv plain.fmt tex.fmt + mv plain.log tex.log + +isitex.fmt: + ./initex siplain \\dump + mv siplain.fmt isitex.fmt + mv siplain.log isitex.log + +isilatex.fmt: + ./initex silplain \\dump + mv silplain.fmt isilatex.fmt + mv silplain.log isilatex.log + +# texinfo changes the escape character from `\' to `@'. +# +texinfo.fmt: tex.fmt + ./initex \&./tex texinfo @dump + + +# The `ini_to_trip' script changes texd.h, instead of the change file, so +# retangling is not necessary. After changing constants, making a +# triptex means making an initex. +# +triptex: stamp-trip $(iobjs) $(commono) + make $(makeargs) initex + mv initex triptex + +stamp-trip: stamp-convert + rm -f *.o + $(SHELL) ./ini_to_trip texd.h + touch stamp-trip + +# tangle produces tex.p and tex.pool. +# +tex.p: tex.web ctex.ch + ../web/tangle tex.web ctex.ch + +# The convert script produces tex[0-8].c, itex.c, coerce.h, and texd.h. +# The (hand-coded) memory.h is included in one of tex?.c files; it isn't +# really necessary to `convert' again if it changes, only to recompile +# those files, but describing that relationship is ugly to do. +# (Furthermore, memory.h is stable.) +# +stamp-convert: tex.p memory.h fixcoerce.h $(commondefines) + $(SHELL) ./convert + touch stamp-convert + +# The (hand-coded) file $(extrac) and the (generated) file itex.c have +# #ifdefs for INITEX, so we compile them differently. +# +iextra.o: $(extrac) texd.h $(extrah) $(commonh) + $(CC) $(CFLAGS) -I. -DINITEX -DINI -c $(extrac) + mv $(extrao) iextra.o + +initex.o: itex.c texd.h $(extrah) $(commonh) + $(CC) $(CFLAGS) -DINITEX -c itex.c && mv itex.o initex.o + +$(objs): stamp-convert texd.h +tex-extra.o: $(extrac) texd.h + rm -f tex-extra.c + $(LN) $(extrac) tex-extra.c + $(CC) $(CFLAGS) -I. -c tex-extra.c + +$(fileioo): $(fileioc) $(fileioh) + $(CC) $(CFLAGS) -I. -c $(fileioc) + +tex0.o: tex0.c +tex1.o: tex1.c +tex2.o: tex2.c +tex3.o: tex3.c +tex4.o: tex4.c +tex5.o: tex5.c +tex6.o: tex6.c +tex7.o: tex7.c +tex8.o: tex8.c +tex9.o: tex9.c +tex10.o: tex10.c + + +clean: + rm -f stamp-* *.o triptex initex virtex + rm -f texd.h coerce.h *.log *.fmt *.aux + rm -f 8terminal.tex trip.* tripos.tex dvitype.out + rm -f tex-extra.c + +veryclean: clean + rm -f tex?.c itex.c tex.p tex.pool texput.* + rm -f \#*\# *~ *.bak *.ckp core diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isicoerce.h b/obsolete/systems/sisisi/unix/iSiTeX3.14/isicoerce.h new file mode 100644 index 0000000000..57554163e7 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isicoerce.h @@ -0,0 +1,927 @@ +void initialize(); +#define initialize_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void println(); +#define println_regmem +void zprintchar(); +#define printchar(s) zprintchar((ASCIIcode) (s)) +#define printchar_regmem register memoryword *eqtb=zeqtb; +void zprint(); +#define print(s) zprint((integer) (s)) +#define print_regmem register memoryword *eqtb=zeqtb; +void zslowprint(); +#define slowprint(s) zslowprint((integer) (s)) +#define slowprint_regmem register memoryword *eqtb=zeqtb; +void zprintnl(); +#define printnl(s) zprintnl((strnumber) (s)) +#define printnl_regmem +void zprintesc(); +#define printesc(s) zprintesc((strnumber) (s)) +#define printesc_regmem register memoryword *eqtb=zeqtb; +void zprintthedigs(); +#define printthedigs(k) zprintthedigs((eightbits) (k)) +#define printthedigs_regmem +void zprintint(); +#define printint(n) zprintint((integer) (n)) +#define printint_regmem +void zprintcs(); +#define printcs(p) zprintcs((integer) (p)) +#define printcs_regmem register memoryword *eqtb=zeqtb; +void zsprintcs(); +#define sprintcs(p) zsprintcs((halfword) (p)) +#define sprintcs_regmem +void zprintfilename(); +#define printfilename(n, a, e) zprintfilename((integer) (n), (integer) (a), (integer) (e)) +#define printfilename_regmem +void zprintsize(); +#define printsize(s) zprintsize((integer) (s)) +#define printsize_regmem +void zprintwritewhatsit(); +#define printwritewhatsit(s, p) zprintwritewhatsit((strnumber) (s), (halfword) (p)) +#define printwritewhatsit_regmem register memoryword *mem=zmem; +void jumpout(); +#define jumpout_regmem +void error(); +#define error_regmem +void zfatalerror(); +#define fatalerror(s) zfatalerror((strnumber) (s)) +#define fatalerror_regmem +void zoverflow(); +#define overflow(s, n) zoverflow((strnumber) (s), (integer) (n)) +#define overflow_regmem +void zconfusion(); +#define confusion(s) zconfusion((strnumber) (s)) +#define confusion_regmem +boolean initterminal(); +#define initterminal_regmem +strnumber makestring(); +#define makestring_regmem +boolean zstreqbuf(); +#define streqbuf(s, k) zstreqbuf((strnumber) (s), (integer) (k)) +#define streqbuf_regmem +boolean zstreqstr(); +#define streqstr(s, t) zstreqstr((strnumber) (s), (strnumber) (t)) +#define streqstr_regmem +boolean getstringsstarted(); +#define getstringsstarted_regmem +void zprinttwo(); +#define printtwo(n) zprinttwo((integer) (n)) +#define printtwo_regmem +void zprinthex(); +#define printhex(n) zprinthex((integer) (n)) +#define printhex_regmem +void zprintromanint(); +#define printromanint(n) zprintromanint((integer) (n)) +#define printromanint_regmem +void printcurrentstring(); +#define printcurrentstring_regmem +void terminput(); +#define terminput_regmem +void zinterror(); +#define interror(n) zinterror((integer) (n)) +#define interror_regmem +void normalizeselector(); +#define normalizeselector_regmem +void pauseforinstructions(); +#define pauseforinstructions_regmem +integer zhalf(); +#define half(x) zhalf((integer) (x)) +#define half_regmem +scaled zrounddecimals(); +#define rounddecimals(k) zrounddecimals((smallnumber) (k)) +#define rounddecimals_regmem +void zprintscaled(); +#define printscaled(s) zprintscaled((scaled) (s)) +#define printscaled_regmem +scaled zmultandadd(); +#define multandadd(n, x, y, maxanswer) zmultandadd((integer) (n), (scaled) (x), (scaled) (y), (scaled) (maxanswer)) +#define multandadd_regmem +scaled zxovern(); +#define xovern(x, n) zxovern((scaled) (x), (integer) (n)) +#define xovern_regmem +scaled zxnoverd(); +#define xnoverd(x, n, d) zxnoverd((scaled) (x), (integer) (n), (integer) (d)) +#define xnoverd_regmem +halfword zbadness(); +#define badness(t, s) zbadness((scaled) (t), (scaled) (s)) +#define badness_regmem +void zprintword(); +#define printword(w) zprintword((memoryword) (w)) +#define printword_regmem +void zshowtokenlist(); +#define showtokenlist(p, q, l) zshowtokenlist((integer) (p), (integer) (q), (integer) (l)) +#define showtokenlist_regmem register memoryword *mem=zmem; +void runaway(); +#define runaway_regmem register memoryword *mem=zmem; +halfword getavail(); +#define getavail_regmem register memoryword *mem=zmem; +void zflushlist(); +#define flushlist(p) zflushlist((halfword) (p)) +#define flushlist_regmem register memoryword *mem=zmem; +halfword zgetnode(); +#define getnode(s) zgetnode((integer) (s)) +#define getnode_regmem register memoryword *mem=zmem; +void zfreenode(); +#define freenode(p, s) zfreenode((halfword) (p), (halfword) (s)) +#define freenode_regmem register memoryword *mem=zmem; +void sortavail(); +#define sortavail_regmem register memoryword *mem=zmem; +halfword newnullbox(); +#define newnullbox_regmem register memoryword *mem=zmem; +halfword newrule(); +#define newrule_regmem register memoryword *mem=zmem; +halfword znewligature(); +#define newligature(f, c, q) znewligature((quarterword) (f), (quarterword) (c), (halfword) (q)) +#define newligature_regmem register memoryword *mem=zmem; +halfword znewligitem(); +#define newligitem(c) znewligitem((quarterword) (c)) +#define newligitem_regmem register memoryword *mem=zmem; +halfword newdisc(); +#define newdisc_regmem register memoryword *mem=zmem; +halfword znewmath(); +#define newmath(w, s) znewmath((scaled) (w), (smallnumber) (s)) +#define newmath_regmem register memoryword *mem=zmem; +halfword znewspec(); +#define newspec(p) znewspec((halfword) (p)) +#define newspec_regmem register memoryword *mem=zmem; +halfword znewparamglue(); +#define newparamglue(n) znewparamglue((smallnumber) (n)) +#define newparamglue_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword znewglue(); +#define newglue(q) znewglue((halfword) (q)) +#define newglue_regmem register memoryword *mem=zmem; +halfword znewskipparam(); +#define newskipparam(n) znewskipparam((smallnumber) (n)) +#define newskipparam_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword znewkern(); +#define newkern(w) znewkern((scaled) (w)) +#define newkern_regmem register memoryword *mem=zmem; +halfword znewpenalty(); +#define newpenalty(m) znewpenalty((integer) (m)) +#define newpenalty_regmem register memoryword *mem=zmem; +void zcheckmem(); +#define checkmem(printlocs) zcheckmem((boolean) (printlocs)) +#define checkmem_regmem register memoryword *mem=zmem; +void zsearchmem(); +#define searchmem(p) zsearchmem((halfword) (p)) +#define searchmem_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zshortdisplay(); +#define shortdisplay(p) zshortdisplay((integer) (p)) +#define shortdisplay_regmem register memoryword *mem=zmem; +void zprintfontandchar(); +#define printfontandchar(p) zprintfontandchar((integer) (p)) +#define printfontandchar_regmem register memoryword *mem=zmem; +void zprintmark(); +#define printmark(p) zprintmark((integer) (p)) +#define printmark_regmem register memoryword *mem=zmem; +void zprintruledimen(); +#define printruledimen(d) zprintruledimen((scaled) (d)) +#define printruledimen_regmem +void zprintglue(); +#define printglue(d, order, s) zprintglue((scaled) (d), (integer) (order), (strnumber) (s)) +#define printglue_regmem +void zprintspec(); +#define printspec(p, s) zprintspec((integer) (p), (strnumber) (s)) +#define printspec_regmem register memoryword *mem=zmem; +void zprintfamandchar(); +#define printfamandchar(p) zprintfamandchar((halfword) (p)) +#define printfamandchar_regmem register memoryword *mem=zmem; +void zprintdelimiter(); +#define printdelimiter(p) zprintdelimiter((halfword) (p)) +#define printdelimiter_regmem register memoryword *mem=zmem; +void zprintsubsidiarydata(); +#define printsubsidiarydata(p, c) zprintsubsidiarydata((halfword) (p), (ASCIIcode) (c)) +#define printsubsidiarydata_regmem register memoryword *mem=zmem; +void zprintstyle(); +#define printstyle(c) zprintstyle((integer) (c)) +#define printstyle_regmem +void zprintskipparam(); +#define printskipparam(n) zprintskipparam((integer) (n)) +#define printskipparam_regmem +void zshownodelist(); +#define shownodelist(p) zshownodelist((integer) (p)) +#define shownodelist_regmem register memoryword *mem=zmem; +void zshowbox(); +#define showbox(p) zshowbox((halfword) (p)) +#define showbox_regmem register memoryword *eqtb=zeqtb; +void zdeletetokenref(); +#define deletetokenref(p) zdeletetokenref((halfword) (p)) +#define deletetokenref_regmem register memoryword *mem=zmem; +void zdeleteglueref(); +#define deleteglueref(p) zdeleteglueref((halfword) (p)) +#define deleteglueref_regmem register memoryword *mem=zmem; +void zflushnodelist(); +#define flushnodelist(p) zflushnodelist((halfword) (p)) +#define flushnodelist_regmem register memoryword *mem=zmem; +halfword zcopynodelist(); +#define copynodelist(p) zcopynodelist((halfword) (p)) +#define copynodelist_regmem register memoryword *mem=zmem; +void zprintmode(); +#define printmode(m) zprintmode((integer) (m)) +#define printmode_regmem +void pushnest(); +#define pushnest_regmem +void popnest(); +#define popnest_regmem register memoryword *mem=zmem; +void showactivities(); +#define showactivities_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zprintparam(); +#define printparam(n) zprintparam((integer) (n)) +#define printparam_regmem +void begindiagnostic(); +#define begindiagnostic_regmem register memoryword *eqtb=zeqtb; +void zenddiagnostic(); +#define enddiagnostic(blankline) zenddiagnostic((boolean) (blankline)) +#define enddiagnostic_regmem +void zprintlengthparam(); +#define printlengthparam(n) zprintlengthparam((integer) (n)) +#define printlengthparam_regmem +void zprintcmdchr(); +#define printcmdchr(cmd, chrcode) zprintcmdchr((quarterword) (cmd), (halfword) (chrcode)) +#define printcmdchr_regmem +void zshoweqtb(); +#define showeqtb(n) zshoweqtb((halfword) (n)) +#define showeqtb_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword zidlookup(); +#define idlookup(j, l) zidlookup((integer) (j), (integer) (l)) +#define idlookup_regmem +void zprimitive(); +#define primitive(s, c, o) zprimitive((strnumber) (s), (quarterword) (c), (halfword) (o)) +#define primitive_regmem register memoryword *eqtb=zeqtb; +void znewsavelevel(); +#define newsavelevel(c) znewsavelevel((groupcode) (c)) +#define newsavelevel_regmem +void zeqdestroy(); +#define eqdestroy(w) zeqdestroy((memoryword) (w)) +#define eqdestroy_regmem register memoryword *mem=zmem; +void zeqsave(); +#define eqsave(p, l) zeqsave((halfword) (p), (quarterword) (l)) +#define eqsave_regmem register memoryword *eqtb=zeqtb; +void zeqdefine(); +#define eqdefine(p, t, e) zeqdefine((halfword) (p), (quarterword) (t), (halfword) (e)) +#define eqdefine_regmem register memoryword *eqtb=zeqtb; +void zeqworddefine(); +#define eqworddefine(p, w) zeqworddefine((halfword) (p), (integer) (w)) +#define eqworddefine_regmem register memoryword *eqtb=zeqtb; +void zgeqdefine(); +#define geqdefine(p, t, e) zgeqdefine((halfword) (p), (quarterword) (t), (halfword) (e)) +#define geqdefine_regmem register memoryword *eqtb=zeqtb; +void zgeqworddefine(); +#define geqworddefine(p, w) zgeqworddefine((halfword) (p), (integer) (w)) +#define geqworddefine_regmem register memoryword *eqtb=zeqtb; +void zsaveforafter(); +#define saveforafter(t) zsaveforafter((halfword) (t)) +#define saveforafter_regmem +void zrestoretrace(); +#define restoretrace(p, s) zrestoretrace((halfword) (p), (strnumber) (s)) +#define restoretrace_regmem +void unsave(); +#define unsave_regmem register memoryword *eqtb=zeqtb; +void preparemag(); +#define preparemag_regmem register memoryword *eqtb=zeqtb; +void ztokenshow(); +#define tokenshow(p) ztokenshow((halfword) (p)) +#define tokenshow_regmem register memoryword *mem=zmem; +void printmeaning(); +#define printmeaning_regmem +void showcurcmdchr(); +#define showcurcmdchr_regmem +void showcontext(); +#define showcontext_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zbegintokenlist(); +#define begintokenlist(p, t) zbegintokenlist((halfword) (p), (quarterword) (t)) +#define begintokenlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void endtokenlist(); +#define endtokenlist_regmem +void backinput(); +#define backinput_regmem register memoryword *mem=zmem; +void backerror(); +#define backerror_regmem +void inserror(); +#define inserror_regmem +void beginfilereading(); +#define beginfilereading_regmem +void endfilereading(); +#define endfilereading_regmem +void clearforerrorprompt(); +#define clearforerrorprompt_regmem +void checkoutervalidity(); +#define checkoutervalidity_regmem register memoryword *mem=zmem; +void getnext(); +#define getnext_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void firmuptheline(); +#define firmuptheline_regmem register memoryword *eqtb=zeqtb; +void gettoken(); +#define gettoken_regmem +void macrocall(); +#define macrocall_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void insertrelax(); +#define insertrelax_regmem +void expand(); +#define expand_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void getxtoken(); +#define getxtoken_regmem +void xtoken(); +#define xtoken_regmem +void scanleftbrace(); +#define scanleftbrace_regmem +void scanoptionalequals(); +#define scanoptionalequals_regmem +boolean zscankeyword(); +#define scankeyword(s) zscankeyword((strnumber) (s)) +#define scankeyword_regmem register memoryword *mem=zmem; +void muerror(); +#define muerror_regmem +void scaneightbitint(); +#define scaneightbitint_regmem +void scancharnum(); +#define scancharnum_regmem +void scanfourbitint(); +#define scanfourbitint_regmem +void scanfifteenbitint(); +#define scanfifteenbitint_regmem +void scantwentysevenbitint(); +#define scantwentysevenbitint_regmem +void scanfontident(); +#define scanfontident_regmem register memoryword *eqtb=zeqtb; +void zfindfontdimen(); +#define findfontdimen(writing) zfindfontdimen((boolean) (writing)) +#define findfontdimen_regmem +void zscansomethinginternal(); +#define scansomethinginternal(level, negative) zscansomethinginternal((smallnumber) (level), (boolean) (negative)) +#define scansomethinginternal_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void scanint(); +#define scanint_regmem +void zscandimen(); +#define scandimen(mu, inf, shortcut) zscandimen((boolean) (mu), (boolean) (inf), (boolean) (shortcut)) +#define scandimen_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zscanglue(); +#define scanglue(level) zscanglue((smallnumber) (level)) +#define scanglue_regmem register memoryword *mem=zmem; +halfword scanrulespec(); +#define scanrulespec_regmem register memoryword *mem=zmem; +halfword zstrtoks(); +#define strtoks(b) zstrtoks((poolpointer) (b)) +#define strtoks_regmem register memoryword *mem=zmem; +halfword thetoks(); +#define thetoks_regmem register memoryword *mem=zmem; +void insthetoks(); +#define insthetoks_regmem register memoryword *mem=zmem; +void convtoks(); +#define convtoks_regmem register memoryword *mem=zmem; +halfword zscantoks(); +#define scantoks(macrodef, xpand) zscantoks((boolean) (macrodef), (boolean) (xpand)) +#define scantoks_regmem register memoryword *mem=zmem; +void zreadtoks(); +#define readtoks(n, r) zreadtoks((integer) (n), (halfword) (r)) +#define readtoks_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void passtext(); +#define passtext_regmem +void zchangeiflimit(); +#define changeiflimit(l, p) zchangeiflimit((smallnumber) (l), (halfword) (p)) +#define changeiflimit_regmem register memoryword *mem=zmem; +void conditional(); +#define conditional_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void beginname(); +#define beginname_regmem +boolean zmorename(); +#define morename(c) zmorename((ASCIIcode) (c)) +#define morename_regmem +void endname(); +#define endname_regmem +void zpackfilename(); +#define packfilename(n, a, e) zpackfilename((strnumber) (n), (strnumber) (a), (strnumber) (e)) +#define packfilename_regmem +void zpackbufferedname(); +#define packbufferedname(n, a, b) zpackbufferedname((smallnumber) (n), (integer) (a), (integer) (b)) +#define packbufferedname_regmem +strnumber makenamestring(); +#define makenamestring_regmem +strnumber zamakenamestring(); +#define amakenamestring(f) zamakenamestring((alphafile *) &(f)) +#define amakenamestring_regmem +strnumber zbmakenamestring(); +#define bmakenamestring(f) zbmakenamestring((bytefile *) &(f)) +#define bmakenamestring_regmem +strnumber zwmakenamestring(); +#define wmakenamestring(f) zwmakenamestring((wordfile *) &(f)) +#define wmakenamestring_regmem +void scanfilename(); +#define scanfilename_regmem +void zpackjobname(); +#define packjobname(s) zpackjobname((strnumber) (s)) +#define packjobname_regmem +void zpromptfilename(); +#define promptfilename(s, e) zpromptfilename((strnumber) (s), (strnumber) (e)) +#define promptfilename_regmem +void openlogfile(); +#define openlogfile_regmem register memoryword *eqtb=zeqtb; +void startinput(); +#define startinput_regmem register memoryword *eqtb=zeqtb; +internalfontnumber zreadfontinfo(); +#define readfontinfo(u, nom, aire, s) zreadfontinfo((halfword) (u), (strnumber) (nom), (strnumber) (aire), (scaled) (s)) +#define readfontinfo_regmem register memoryword *eqtb=zeqtb; +void zcharwarning(); +#define charwarning(f, c) zcharwarning((internalfontnumber) (f), (eightbits) (c)) +#define charwarning_regmem register memoryword *eqtb=zeqtb; +halfword znewcharacter(); +#define newcharacter(f, c) znewcharacter((internalfontnumber) (f), (eightbits) (c)) +#define newcharacter_regmem register memoryword *mem=zmem; +void dviswap(); +#define dviswap_regmem +void zdvifour(); +#define dvifour(x) zdvifour((integer) (x)) +#define dvifour_regmem +void zdvipop(); +#define dvipop(l) zdvipop((integer) (l)) +#define dvipop_regmem +void zdvifontdef(); +#define dvifontdef(f) zdvifontdef((internalfontnumber) (f)) +#define dvifontdef_regmem +void zmovement(); +#define movement(w, o) zmovement((scaled) (w), (eightbits) (o)) +#define movement_regmem register memoryword *mem=zmem; +void zprunemovements(); +#define prunemovements(l) zprunemovements((integer) (l)) +#define prunemovements_regmem register memoryword *mem=zmem; +void zspecialout(); +#define specialout(p) zspecialout((halfword) (p)) +#define specialout_regmem register memoryword *mem=zmem; +void zwriteout(); +#define writeout(p) zwriteout((halfword) (p)) +#define writeout_regmem register memoryword *mem=zmem; +void zoutwhat(); +#define outwhat(p) zoutwhat((halfword) (p)) +#define outwhat_regmem register memoryword *mem=zmem; +void hlistout(); +#define hlistout_regmem register memoryword *mem=zmem; +void vlistout(); +#define vlistout_regmem register memoryword *mem=zmem; +void zshipout(); +#define shipout(p) zshipout((halfword) (p)) +#define shipout_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zscanspec(); +#define scanspec(c, threecodes) zscanspec((groupcode) (c), (boolean) (threecodes)) +#define scanspec_regmem +halfword zhpack(); +#define hpack(p, w, m) zhpack((halfword) (p), (scaled) (w), (smallnumber) (m)) +#define hpack_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword zvpackage(); +#define vpackage(p, h, m, l) zvpackage((halfword) (p), (scaled) (h), (smallnumber) (m), (scaled) (l)) +#define vpackage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zappendtovlist(); +#define appendtovlist(b) zappendtovlist((halfword) (b)) +#define appendtovlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword newnoad(); +#define newnoad_regmem register memoryword *mem=zmem; +halfword znewstyle(); +#define newstyle(s) znewstyle((smallnumber) (s)) +#define newstyle_regmem register memoryword *mem=zmem; +halfword newchoice(); +#define newchoice_regmem register memoryword *mem=zmem; +void showinfo(); +#define showinfo_regmem register memoryword *mem=zmem; +halfword zfractionrule(); +#define fractionrule(t) zfractionrule((scaled) (t)) +#define fractionrule_regmem register memoryword *mem=zmem; +halfword zoverbar(); +#define overbar(b, k, t) zoverbar((halfword) (b), (scaled) (k), (scaled) (t)) +#define overbar_regmem register memoryword *mem=zmem; +halfword zcharbox(); +#define charbox(f, c) zcharbox((internalfontnumber) (f), (quarterword) (c)) +#define charbox_regmem register memoryword *mem=zmem; +void zstackintobox(); +#define stackintobox(b, f, c) zstackintobox((halfword) (b), (internalfontnumber) (f), (quarterword) (c)) +#define stackintobox_regmem register memoryword *mem=zmem; +scaled zheightplusdepth(); +#define heightplusdepth(f, c) zheightplusdepth((internalfontnumber) (f), (quarterword) (c)) +#define heightplusdepth_regmem +halfword zvardelimiter(); +#define vardelimiter(d, s, v) zvardelimiter((halfword) (d), (smallnumber) (s), (scaled) (v)) +#define vardelimiter_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword zrebox(); +#define rebox(b, w) zrebox((halfword) (b), (scaled) (w)) +#define rebox_regmem register memoryword *mem=zmem; +halfword zmathglue(); +#define mathglue(g, m) zmathglue((halfword) (g), (scaled) (m)) +#define mathglue_regmem register memoryword *mem=zmem; +void zmathkern(); +#define mathkern(p, m) zmathkern((halfword) (p), (scaled) (m)) +#define mathkern_regmem register memoryword *mem=zmem; +void flushmath(); +#define flushmath_regmem register memoryword *mem=zmem; +halfword zcleanbox(); +#define cleanbox(p, s) zcleanbox((halfword) (p), (smallnumber) (s)) +#define cleanbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zfetch(); +#define fetch(a) zfetch((halfword) (a)) +#define fetch_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakeover(); +#define makeover(q) zmakeover((halfword) (q)) +#define makeover_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakeunder(); +#define makeunder(q) zmakeunder((halfword) (q)) +#define makeunder_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakevcenter(); +#define makevcenter(q) zmakevcenter((halfword) (q)) +#define makevcenter_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakeradical(); +#define makeradical(q) zmakeradical((halfword) (q)) +#define makeradical_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakemathaccent(); +#define makemathaccent(q) zmakemathaccent((halfword) (q)) +#define makemathaccent_regmem register memoryword *mem=zmem; +void zmakefraction(); +#define makefraction(q) zmakefraction((halfword) (q)) +#define makefraction_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +scaled zmakeop(); +#define makeop(q) zmakeop((halfword) (q)) +#define makeop_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zmakeord(); +#define makeord(q) zmakeord((halfword) (q)) +#define makeord_regmem register memoryword *mem=zmem; +void zmakescripts(); +#define makescripts(q, delta) zmakescripts((halfword) (q), (scaled) (delta)) +#define makescripts_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +smallnumber zmakeleftright(); +#define makeleftright(q, style, maxd, maxh) zmakeleftright((halfword) (q), (smallnumber) (style), (scaled) (maxd), (scaled) (maxh)) +#define makeleftright_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void mlisttohlist(); +#define mlisttohlist_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void pushalignment(); +#define pushalignment_regmem register memoryword *mem=zmem; +void popalignment(); +#define popalignment_regmem register memoryword *mem=zmem; +void getpreambletoken(); +#define getpreambletoken_regmem register memoryword *eqtb=zeqtb; +void initalign(); +#define initalign_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zinitspan(); +#define initspan(p) zinitspan((halfword) (p)) +#define initspan_regmem +void initrow(); +#define initrow_regmem register memoryword *mem=zmem; +void initcol(); +#define initcol_regmem register memoryword *mem=zmem; +boolean fincol(); +#define fincol_regmem register memoryword *mem=zmem; +void finrow(); +#define finrow_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void finalign(); +#define finalign_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void alignpeek(); +#define alignpeek_regmem +halfword zfiniteshrink(); +#define finiteshrink(p) zfiniteshrink((halfword) (p)) +#define finiteshrink_regmem register memoryword *mem=zmem; +void ztrybreak(); +#define trybreak(pi, breaktype) ztrybreak((integer) (pi), (smallnumber) (breaktype)) +#define trybreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zpostlinebreak(); +#define postlinebreak(finalwidowpenalty) zpostlinebreak((integer) (finalwidowpenalty)) +#define postlinebreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +smallnumber zreconstitute(); +#define reconstitute(j, n, bchar, hchar) zreconstitute((smallnumber) (j), (smallnumber) (n), (halfword) (bchar), (halfword) (hchar)) +#define reconstitute_regmem register memoryword *mem=zmem; +void zhashfunk(); +#define hashfunk(w, anfang, ende, v, ind, k) zhashfunk( (w), (integer) (anfang), (integer) (ende), (v), (ind), (k)) +#define hashfunk_regmem +void zunpackinfo(); +#define unpackinfo(b, iausnahme, iuntrennbar, ierste, izweite, iendung, ivorsilbe, istamm, iehervor, istammallein) zunpackinfo((infobyte) (b), (boolean *) &(iausnahme), (boolean *) &(iuntrennbar), (integer *) &(ierste), (integer *) &(izweite), (boolean *) &(iendung), (boolean *) &(ivorsilbe), (boolean *) &(istamm), (boolean *) &(iehervor), (boolean *) &(istammallein)) +#define unpackinfo_regmem +void zunpackentry(); +#define unpackentry(h, etabv, etabb, efrei, ewiederfrei) zunpackentry( (h), (verdschlue *) &(etabv), (infobyte *) &(etabb), (boolean *) &(efrei), (boolean *) &(ewiederfrei)) +#define unpackentry_regmem +void zhashsuch(); +#define hashsuch(v, ind, k, iausnahme, iuntrennbar, ierste, izweite, iendung, ivorsilbe, istamm, iehervor, istammallein, g) zhashsuch((verdschlue) (v), (integer) (ind), (integer) (k), (boolean *) &(iausnahme), (boolean *) &(iuntrennbar), (integer *) &(ierste), (integer *) &(izweite), (boolean *) &(iendung), (boolean *) &(ivorsilbe), (boolean *) &(istamm), (boolean *) &(iehervor), (boolean *) &(istammallein), (boolean *) &(g)) +#define hashsuch_regmem +void zhashload(); +#define hashload(status) zhashload((integer *) &(status)) +#define hashload_regmem +void inittrennen(); +#define inittrennen_regmem +void zpackinfo(); +#define packinfo(i, b) zpackinfo((infotype) (i), (infobyte *) &(b)) +#define packinfo_regmem +void zpackentry(); +#define packentry(e, h) zpackentry((tableentry) (e), (h)) +#define packentry_regmem +void zhashetr(); +#define hashetr(w, laenge, i, g) zhashetr( (w), (integer) (laenge), (infotype) (i), (boolean *) &(g)) +#define hashetr_regmem +void hashempty(); +#define hashempty_regmem +void zhashsave(); +#define hashsave(status) zhashsave((integer *) &(status)) +#define hashsave_regmem +integer hashsize(); +#define hashsize_regmem +void zzahl(); +#define zahl(line, i, ende, j) zzahl( (line), (integer *) &(i), (integer) (ende), (integer *) &(j)) +#define zahl_regmem +void zinfobau(); +#define infobau(line, anfang, ende, informausnahme, informuntrennbar, informerste, informzweite, informendung, informvorsilbe, informstamm, informehervor, informstammallein, g) zinfobau( (line), (integer) (anfang), (integer) (ende), (boolean *) &(informausnahme), (boolean *) &(informuntrennbar), (integer *) &(informerste), (integer *) &(informzweite), (boolean *) &(informendung), (boolean *) &(informvorsilbe), (boolean *) &(informstamm), (boolean *) &(informehervor), (boolean *) &(informstammallein), (boolean *) &(g)) +#define infobau_regmem +void zeintragen(); +#define eintragen(line, l) zeintragen( (line), (integer) (l)) +#define eintragen_regmem +void znaechsterbst(); +#define naechsterbst(i, tr, dudstop, b, w) znaechsterbst((integer *) &(i), (tr), (dudstop), (buchstabe *) &(b), (w)) +#define naechsterbst_regmem +void zduden(); +#define duden(tr, w, tr1, dudtr, dud, dudstop, laenge, ok, zerlegungen) zduden( (tr), (w), (tr1), (dudtr), (dud), (dudstop), (integer) (laenge), (boolean *) &(ok), (integer *) &(zerlegungen)) +#define duden_regmem +void ztrennen(); +#define trennen(zustand, anfang, spv, ok1, alletr, tr, dudtr, zerlegungen, dud, v, ind, k, dudstop, w, tr1, laenge) ztrennen((integer) (zustand), (integer) (anfang), (spv), (boolean *) &(ok1), (alletr), (tr), (dudtr), (integer *) &(zerlegungen), (dud), (v), (ind), (k), (dudstop), (w), (tr1), (integer) (laenge)) +#define trennen_regmem +void zwchar(); +#define wchar(c) zwchar((halfword) (c)) +#define wchar_regmem +void zwwort(); +#define wwort(w, l) zwwort( (w), (integer) (l)) +#define wwort_regmem +void zwritewt(); +#define writewt(w, l, tr) zwritewt( (w), (integer) (l), (tr)) +#define writewt_regmem +void wjob(); +#define wjob_regmem +integer zvergl(); +#define vergl(wrt1, l1, wrt2, l2) zvergl( (wrt1), (integer) (l1), (wrt2), (integer) (l2)) +#define vergl_regmem +void zgleicheweg(); +#define gleicheweg(alletr, zerleg, laenge) zgleicheweg( (alletr), (integer *) &(zerleg), (integer) (laenge)) +#define gleicheweg_regmem +void zmdbeintragen(); +#define mdbeintragen(w, l, tr, neu, used, mdb) zmdbeintragen( (w), (integer) (l), (tr), (boolean) (neu), (boolean) (used), (mdbknoten *) &(mdb)) +#define mdbeintragen_regmem +void zmdmeintragen(); +#define mdmeintragen(w, l, tr, neu, mdm) zmdmeintragen( (w), (integer) (l), (tr), (boolean) (neu), (mdmknoten *) &(mdm)) +#define mdmeintragen_regmem +void zmdleintragen(); +#define mdleintragen(w, l, mdl) zmdleintragen( (w), (integer) (l), (mdlknoten *) &(mdl)) +#define mdleintragen_regmem +void zmdeeintragen(); +#define mdeeintragen(w, l, mde) zmdeeintragen( (w), (integer) (l), (mdeknoten *) &(mde)) +#define mdeeintragen_regmem +boolean zmdsuchen(); +#define mdsuchen(w, l, mdb, tr) zmdsuchen( (w), (integer) (l), (mdbknoten *) &(mdb), (tr)) +#define mdsuchen_regmem +boolean zinuse(); +#define inuse(w, l, mdb) zinuse( (w), (integer) (l), (mdbknoten) (mdb)) +#define inuse_regmem +void hsinit(); +#define hsinit_regmem +void zabteilen(); +#define abteilen(w, tr1, alletr, laenge, ok, zerlegungen) zabteilen( (w), (tr1), (alletr), (integer) (laenge), (boolean *) &(ok), (integer *) &(zerlegungen)) +#define abteilen_regmem +boolean zisdirtyumlaut(); +#define isdirtyumlaut(p) zisdirtyumlaut((halfword) (p)) +#define isdirtyumlaut_regmem register memoryword *mem=zmem; +integer zgetcharof(); +#define getcharof(s) zgetcharof((halfword) (s)) +#define getcharof_regmem register memoryword *mem=zmem; +integer zgetfontof(); +#define getfontof(s) zgetfontof((halfword) (s)) +#define getfontof_regmem register memoryword *mem=zmem; +void hyphenate(); +#define hyphenate_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +trieopcode znewtrieop(); +#define newtrieop(d, n, v) znewtrieop((smallnumber) (d), (smallnumber) (n), (trieopcode) (v)) +#define newtrieop_regmem +triepointer ztrienode(); +#define trienode(p) ztrienode((triepointer) (p)) +#define trienode_regmem +triepointer zcompresstrie(); +#define compresstrie(p) zcompresstrie((triepointer) (p)) +#define compresstrie_regmem +void zfirstfit(); +#define firstfit(p) zfirstfit((triepointer) (p)) +#define firstfit_regmem +void ztriepack(); +#define triepack(p) ztriepack((triepointer) (p)) +#define triepack_regmem +void ztriefix(); +#define triefix(p) ztriefix((triepointer) (p)) +#define triefix_regmem +void newpatterns(); +#define newpatterns_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void inittrie(); +#define inittrie_regmem +void zlinebreak(); +#define linebreak(finalwidowpenalty) zlinebreak((integer) (finalwidowpenalty)) +#define linebreak_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void newhyphexceptions(); +#define newhyphexceptions_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +halfword zprunepagetop(); +#define prunepagetop(p) zprunepagetop((halfword) (p)) +#define prunepagetop_regmem register memoryword *mem=zmem; +halfword zvertbreak(); +#define vertbreak(p, h, d) zvertbreak((halfword) (p), (scaled) (h), (scaled) (d)) +#define vertbreak_regmem register memoryword *mem=zmem; +halfword zvsplit(); +#define vsplit(n, h) zvsplit((eightbits) (n), (scaled) (h)) +#define vsplit_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void printtotals(); +#define printtotals_regmem +void zfreezepagespecs(); +#define freezepagespecs(s) zfreezepagespecs((smallnumber) (s)) +#define freezepagespecs_regmem register memoryword *eqtb=zeqtb; +void zboxerror(); +#define boxerror(n) zboxerror((eightbits) (n)) +#define boxerror_regmem register memoryword *eqtb=zeqtb; +void zensurevbox(); +#define ensurevbox(n) zensurevbox((eightbits) (n)) +#define ensurevbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zfireup(); +#define fireup(c) zfireup((halfword) (c)) +#define fireup_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void buildpage(); +#define buildpage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void appspace(); +#define appspace_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void insertdollarsign(); +#define insertdollarsign_regmem +void youcant(); +#define youcant_regmem +void reportillegalcase(); +#define reportillegalcase_regmem +boolean privileged(); +#define privileged_regmem +boolean itsallover(); +#define itsallover_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void appendglue(); +#define appendglue_regmem register memoryword *mem=zmem; +void appendkern(); +#define appendkern_regmem register memoryword *mem=zmem; +void offsave(); +#define offsave_regmem register memoryword *mem=zmem; +void extrarightbrace(); +#define extrarightbrace_regmem +void normalparagraph(); +#define normalparagraph_regmem register memoryword *eqtb=zeqtb; +void zboxend(); +#define boxend(boxcontext) zboxend((integer) (boxcontext)) +#define boxend_regmem register memoryword *mem=zmem; +void zbeginbox(); +#define beginbox(boxcontext) zbeginbox((integer) (boxcontext)) +#define beginbox_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zscanbox(); +#define scanbox(boxcontext) zscanbox((integer) (boxcontext)) +#define scanbox_regmem +void zpackage(); +#define package(c) zpackage((smallnumber) (c)) +#define package_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +smallnumber znormmin(); +#define normmin(h) znormmin((integer) (h)) +#define normmin_regmem +void znewgraf(); +#define newgraf(indented) znewgraf((boolean) (indented)) +#define newgraf_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void indentinhmode(); +#define indentinhmode_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void headforvmode(); +#define headforvmode_regmem +void endgraf(); +#define endgraf_regmem register memoryword *eqtb=zeqtb; +void begininsertoradjust(); +#define begininsertoradjust_regmem +void makemark(); +#define makemark_regmem register memoryword *mem=zmem; +void appendpenalty(); +#define appendpenalty_regmem register memoryword *mem=zmem; +void deletelast(); +#define deletelast_regmem register memoryword *mem=zmem; +void unpackage(); +#define unpackage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void appenditaliccorrection(); +#define appenditaliccorrection_regmem register memoryword *mem=zmem; +void appenddiscretionary(); +#define appenddiscretionary_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void builddiscretionary(); +#define builddiscretionary_regmem register memoryword *mem=zmem; +void makeaccent(); +#define makeaccent_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void alignerror(); +#define alignerror_regmem +void noalignerror(); +#define noalignerror_regmem +void omiterror(); +#define omiterror_regmem +void doendv(); +#define doendv_regmem +void cserror(); +#define cserror_regmem +void zpushmath(); +#define pushmath(c) zpushmath((groupcode) (c)) +#define pushmath_regmem +void initmath(); +#define initmath_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void starteqno(); +#define starteqno_regmem register memoryword *eqtb=zeqtb; +void zscanmath(); +#define scanmath(p) zscanmath((halfword) (p)) +#define scanmath_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void zsetmathchar(); +#define setmathchar(c) zsetmathchar((integer) (c)) +#define setmathchar_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void mathlimitswitch(); +#define mathlimitswitch_regmem register memoryword *mem=zmem; +void zscandelimiter(); +#define scandelimiter(p, r) zscandelimiter((halfword) (p), (boolean) (r)) +#define scandelimiter_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void mathradical(); +#define mathradical_regmem register memoryword *mem=zmem; +void mathac(); +#define mathac_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void appendchoices(); +#define appendchoices_regmem register memoryword *mem=zmem; +halfword zfinmlist(); +#define finmlist(p) zfinmlist((halfword) (p)) +#define finmlist_regmem register memoryword *mem=zmem; +void buildchoices(); +#define buildchoices_regmem register memoryword *mem=zmem; +void subsup(); +#define subsup_regmem register memoryword *mem=zmem; +void mathfraction(); +#define mathfraction_regmem register memoryword *mem=zmem; +void mathleftright(); +#define mathleftright_regmem register memoryword *mem=zmem; +void aftermath(); +#define aftermath_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void resumeafterdisplay(); +#define resumeafterdisplay_regmem +void getrtoken(); +#define getrtoken_regmem +void trapzeroglue(); +#define trapzeroglue_regmem register memoryword *mem=zmem; +void zdoregistercommand(); +#define doregistercommand(a) zdoregistercommand((smallnumber) (a)) +#define doregistercommand_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void alteraux(); +#define alteraux_regmem +void alterprevgraf(); +#define alterprevgraf_regmem +void alterpagesofar(); +#define alterpagesofar_regmem +void alterinteger(); +#define alterinteger_regmem +void alterboxdimen(); +#define alterboxdimen_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void znewfont(); +#define newfont(a) znewfont((smallnumber) (a)) +#define newfont_regmem register memoryword *eqtb=zeqtb; +void newinteraction(); +#define newinteraction_regmem +void prefixedcommand(); +#define prefixedcommand_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void doassignments(); +#define doassignments_regmem +void openorclosein(); +#define openorclosein_regmem +void issuemessage(); +#define issuemessage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void shiftcase(); +#define shiftcase_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void showwhatever(); +#define showwhatever_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void storefmtfile(); +#define storefmtfile_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void znewwhatsit(); +#define newwhatsit(s, w) znewwhatsit((smallnumber) (s), (smallnumber) (w)) +#define newwhatsit_regmem register memoryword *mem=zmem; +void znewwritewhatsit(); +#define newwritewhatsit(w) znewwritewhatsit((smallnumber) (w)) +#define newwritewhatsit_regmem register memoryword *mem=zmem; +void doextension(); +#define doextension_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void fixlanguage(); +#define fixlanguage_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void handlerightbrace(); +#define handlerightbrace_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void maincontrol(); +#define maincontrol_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void giveerrhelp(); +#define giveerrhelp_regmem register memoryword *eqtb=zeqtb; +boolean openfmtfile(); +#define openfmtfile_regmem +boolean loadfmtfile(); +#define loadfmtfile_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void closefilesandterminate(); +#define closefilesandterminate_regmem register memoryword *eqtb=zeqtb; +void finalcleanup(); +#define finalcleanup_regmem register memoryword *mem=zmem; +void initprim(); +#define initprim_regmem register memoryword *eqtb=zeqtb; +void debughelp(); +#define debughelp_regmem register memoryword *mem=zmem, *eqtb=zeqtb; +void texbody(); +#define texbody_regmem register memoryword *eqtb=zeqtb; +/* + * The C compiler ignores most unnecessary casts (i.e., casts of something + * to its own type). However, for structures, it doesn't. Therefore, + * we have to redefine these two macros so that they don't try to cast + * the argument (a memoryword) as a memoryword. + */ +#undef eqdestroy +#define eqdestroy(x) zeqdestroy(x) +#undef printword +#define printword(x) zprintword(x) diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiconvert b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiconvert new file mode 100644 index 0000000000..9fdda3605e --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiconvert @@ -0,0 +1,12 @@ +#!/bin/sh +# Convert TeX to C. +# + +cat ../common/common.defines ../common/texmf.defines isitex.defines tex.p \ + | ../web2c/web2c -t -h../common/texmf.h \ + | ../web2c/fixwrites -t \ + | ../web2c/regfix \ + | ../web2c/splitup + +cat coerce.h fixcoerce.h > xcoerce.h +mv xcoerce.h coerce.h diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isictex.ch b/obsolete/systems/sisisi/unix/iSiTeX3.14/isictex.ch new file mode 100644 index 0000000000..7e33680ab4 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isictex.ch @@ -0,0 +1,1878 @@ +% Change file for TeX in C, derived from various other change files. +% By Tim Morgan, UC Irvine ICS Department, and many others. +% +% +% Modification history: +% (05/28/86) ETM Started with TeX 2.0 +% (06/03/87) ETM Brought up to TeX 2.2 +% (09/26/87) ETM Brought up to TeX 2.3 +% (10/01/87) ETM Brought up to TeX 2.5 +% (12/21/87) ETM Brought up to TeX 2.7 +% (01/14/88) ETM Brought up to TeX 2.9 +% (02/20/88) PAM Revised format and module numbers +% (03/01/88) ETM Eliminated some unused variables and unnecesary tests +% (05/09/88) ETM Added yet another casting bug fix +% (06/21/88) ETM Brought up to TeX version 2.93 +% (12/11/88) ETM Brought up to TeX version 2.94 +% (01/12/89) PAM Brought up to TeX version 2.95 +% (02/14/89) ETM Brought up to TeX version 2.96 +% (03/10/89) ETM Brought up to TeX version 2.98 +% (07/06/89) ETM Brought up to TeX version 2.991 +% (11/30/89) KB To version 2.992 (8-bit). +% (01/10/90) SR To version 2.993. +% (03/27/90) KY To version 3.0. +% (more recent changes in ../ChangeLog.W2C) +% +% The module numbers in this change file refer to the published text in +% TeX: The Program, Volume B of Computers&Typesetting, 1986. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [0] WEAVE: print changes only. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + \def\?##1]{\hbox to 1in{\hfil##1.\ }} + } +@y + \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }} + } +\let\maybe=\iffalse +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.2] banner (changed to show trie extension version) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d banner=='This is TeX, Version 3.14 (+SISISI 1.0) {+iSi 92}' +@y +@d banner=='This is TeX, C Version 3.14t3 (+SISISI 1.0) {+iSi 92}' {printed when \TeX\ starts} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.4] program header +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Actually the heading shown here is not quite normal: The |program| line +does not mention any |output| file, because \ph\ would ask the \TeX\ user +to specify a file name if |output| were specified here. +@^system dependencies@> + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +program TEX; {all file names are defined dynamically} +label @<Labels in the outer block@>@/ +@y + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +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; + {key control points} +@y +@<Labels in the outer block@>= +start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end; + {key control points} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.7] debug..gubed, stat..tats +% Here we change these WEB symbols, which are used much as #ifdef's +% are 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] Same, for `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] Turn off all 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: some enlarged, dvi_buf_size 16K for +% BSD I/O, file_name_size becomes FILENAMESIZE. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Constants...@>= +@!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:ISITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@y +@d file_name_size == FILENAMESIZE {Get value from \.{site.h}.} +@<Constants...@>= +@!mem_max=262140; {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=3000; {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=60; {maximum number of simultaneous macro parameters} +@!nest_size=40; {maximum number of semantic levels simultaneously active} +@!max_strings=7500; {maximum number of strings; must not exceed |max_halfword|} +@!string_vacancies=74000; {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=100000; {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=24000; {space for hyphenation patterns; should be larger for + \.{INITEX} than it is in production versions of \TeX} +@!trie_op_size=750; {space for ``opcodes'' in the hyphenation patterns} +@!neg_trie_op_size=-750; {for lower trie_op_hash array bound} +@!min_trie_op=0; {first possible trie op code for any language} +@!max_trie_op=500; {largest possible trie op code for any language} +@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8} +@!pool_name='isitex.pool'; + {string of length |file_name_size|; tells where the string pool appears} +@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX}; + must be substantially larger than |mem_bot| + and not greater than |mem_max|} +@!nil=0; {Because web2c is too stupid to recognize Pascal's nil-pointer; HH} +@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 it is a ``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), since to needs +% to be changed for the trip test. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=9500 {maximum number of control sequences; it should be at most + about |(mem_max-mem_min)/10|} +@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|} +@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.16] Use C macros for `incr' and `decr'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d incr(#) == #:=#+1 {increase a variable by unity} +@d decr(#) == #:=#-1 {decrease a variable by unity} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] The text_char type is used as an array index into xord. The +% default type `char' produces signed integers, which are bad array +% indices in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d text_char == char {the data type of characters in text files} +@y +@d text_char == ASCII_code {the data type of characters in text files} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [2.23] Allow any character as input. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +for i:=0 to @'37 do xchr[i]:=' '; +for i:=@'177 to @'377 do xchr[i]:=' '; +@y +for i:=0 to @'37 do xchr[i]:=chr(i); +for i:=@'177 to @'377 do xchr[i]:=chr(i); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.25] Remove file types we don't need. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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.27] Do file opening in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 are defined in C. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.28] Do file closing in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 the file closing routines as well. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.31] Do `input_ln' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 define |input_ln| in C, for efficiency. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.32] `term_in' and `term_out' are standard input and output. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!term_in:alpha_file; {the terminal as an input file} +@!term_out:alpha_file; {the terminal as an output file} +@y +@d term_in==stdin {the terminal as an input file} +@d term_out==stdout {the terminal as an output file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.33] We 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 defined in C. + +@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} +@y +these operations can be specified with {\mc UNIX}. |update_terminal| +does an |fflush| (via the macro |flush|). |clear_terminal| is redefined +to do nothing, since the user should control the terminal. +@^system dependencies@> + +@d update_terminal == flush (term_out) +@d clear_terminal == do_nothing +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.37] Reading 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} +label exit; +begin t_open_in; +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); + if loc<last then + begin init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out,'Please type the name of your input file.'); + end; +exit:end; +@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@> + +@p +function init_terminal:boolean; {gets the terminal input started} +label exit; +begin + t_open_in; + 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; write(term_out, '**'); update_terminal; +@.**@> + if not input_ln(term_in,true) then begin {this shouldn't happen} + 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); + + if loc<last then begin + init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out, 'Please type the name of your input file.'); + end; +exit: +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51] Open the pool file using a path, and can't do string +% assignments directly. (`strcpy' and `strlen' work here because +% `pool_name' is a constant string, and thus ends in a null and doesn't +% start with a space.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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); {copy the string} +name_of_file[0] := ' '; +name_of_file[strlen (pool_name)+1] := ' '; +if a_open_in (pool_file, TEX_POOL_PATH) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how +% it's read. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else bad_pool('! I can''t read ISITEX3.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 isitex.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('! isitex.pool has no check sum.'); +@.TEX.POOL has no check sum@> +read(pool_file,m); read(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('! isitex.pool line doesn''t begin with two digits.'); +@z +@x + bad_pool('! TEX.POOL check sum doesn''t have nine digits.'); +@y + bad_pool('! isitex.pool check sum doesn''t have nine digits.'); +@z +@x +done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.'); +@y +done: if a<>@$ then bad_pool('! isitex.pool doesn''t match; tangle me again.'); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [5.61] Eliminate the misleading message ``(no format preloaded)''. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if format_ident=0 then wterm_ln(' (no format preloaded)') +else begin print(format_ident); print_ln; + end; +@y +if format_ident>0 then print(format_ident); +print_ln; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [6.81] Eliminate nonlocal goto, since C doesn't have them. +% 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'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Error hand...@>= +procedure jump_out; +begin goto end_of_TEX; +end; +@y +@d do_final_end==begin + update_terminal; + 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.84] Implement the switch-to-editor option. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +line ready to be edited. But such an extension requires some system +wizardry, so the present implementation simply types out the name of the +file that should be +edited and the relevant line number. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@y +line ready to be edited. +We do this by calling the external procedure |call_edit| with a pointer to +the filename, its length, and the line number. +However, here we just set up the variables that will be used as arguments, +since we don't want to do the switch-to-editor until after TeX has closed +its files. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@d edit_file==input_stack[base_ptr] +@z +@x +"E": if base_ptr>0 then + begin print_nl("You want to edit file "); +@.You want to edit file x@> + print(input_stack[base_ptr].name_field); + print(" at line "); print_int(line); + interaction:=scroll_mode; jump_out; +@y +"E": if base_ptr>0 then + begin + edit_name_start:=str_start[edit_file.name_field]; + edit_name_length:=str_start[edit_file.name_field+1] - + str_start[edit_file.name_field]; + edit_line:=line; + jump_out; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.109] Define glue_ratio in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!glue_ratio=real; {one-word representation of a glue expansion factor} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.110] Make it easy to build a bigger TeX. (Nothing is changed in +% the basic version.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=255 {largest allowable value in a |quarterword|} +@d min_halfword==0 {smallest allowable value in a |halfword|} +@d max_halfword==262143 {largest allowable value in a |halfword|} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.112] Efficiency. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +@^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 +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +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] Put the memory structure into an include file, since it's too +% hard to translate automatically. Also, remove the `word_file' type. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!quarterword = min_quarterword..max_quarterword; {1/4 of a word} +@!halfword=min_halfword..max_halfword; {1/2 of a word} +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@!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 +@!quarterword=min_quarterword..max_quarterword; +@!halfword=min_halfword..max_halfword; +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@=#include "memory.h";@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [9.116] Change `mem' to `zmem', so 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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [11.165] Fix the word `free' so that it doesn't conflict with the +% standard C library routine of the same name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) +@y +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) + +@d free==free_arr +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.174,176] Eliminate some unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + begin if (font(p)<font_base)or(font(p)>font_max) then + print_char("*") +@y + begin if (font(p)>font_max) then + print_char("*") +@z + +@x +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*") +@y +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)>font_max) then print_char("*") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.186] Don't worry about strange floating point values. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if glue_sign(p)=shrinking then print("- "); + if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?") + else if abs(g)>float_constant(20000) then +@y + if glue_sign(p)=shrinking then print("- "); + { The Unix |pc| folks removed this restriction with a remark that + invalid bit patterns were vanishingly improbable, so we follow + their example without really understanding it. + |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')| + |else| } + if fabs(g)>float_constant(20000) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [17.241] Do `fix_date_and_time' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +@^system dependencies@> +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 +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +It calls a macro-defined |date_and_time| routine. |date_and_time| +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. +@^system dependencies@> + +@d fix_date_and_time==date_and_time(time,day,month,year) +@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.262] Remove more unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@y +else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.513] Area and extension rules for filenames. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\.>' or `\.:', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the first +remaining `\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep track +of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any} +@!ext_delimiter:pool_pointer; {the relevant `\..', if any} +@y +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\./', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the last +`\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep +track of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\./', if any} +@!ext_delimiter:pool_pointer; {the most recent `\..', if any} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.514] TeX area directories. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d TEX_area=="TeXinputs:" +@.TeXinputs@> +@d TEX_font_area=="TeXfonts:" +@.TeXfonts@> +@y +In C, the default paths are specified in a separate +file, \.{site.h}. The file opening procedures do path searching +based either on those default paths, or on paths given by the user +in environment variables. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.516] more_name +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c=">")or(c=":") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length; +@y +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c="/") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if c="." then ext_delimiter:=cur_length; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.520] The 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} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@y +Under {\mc UNIX} we don't give the area part, instead depending +on the path searching that will happen during file opening. Also, the +length will be set in the main program. + +@d format_area_length=0 {length of its area part} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.521] Where `plain.fmt' is. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!TEX_format_default:packed array[1..format_default_length] of char; + +@ @<Set init...@>= +TEX_format_default:='TeXformats:plain.fmt'; +@y +@!format_default_length: integer; +@!TEX_format_default: c_char_pointer; + +@ We set the name of the default format file and the length of that name +in C, instead of Pascal, since we want them to depend on the name of the +program. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.524] Format file opening: only try once, with path searching. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + pack_buffered_name(0,loc,j-1); {try first without the system file area} + if w_open_in(fmt_file) then goto found; + 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 + pack_buffered_name(0,loc,j-1); + if w_open_in(fmt_file) then goto found; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% (still [29.524]) replace `PLAIN' in error messages with `default'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.'); +@y + wterm_ln('Sorry, I can''t find that format;',' will try the default.'); +@z +@x + wterm_ln('I can''t find the PLAIN format file!'); +@.I can't find PLAIN...@> +@y + wterm_ln('I can''t find the default format file!'); +@.I can't find default format...@> +@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 + +@x +months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@y +months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Use a path when calling a_open_in to do a \input; also, try +% to open the file with and without the `.tex' extension, regardless of +% whether the file already has an extension. This allows filenames like +% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if cur_ext="" then cur_ext:=".tex"; +pack_cur_name; +loop@+ begin begin_file_reading; {set up |cur_file| and new level of input} + 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 +pack_cur_name; {Try without |".tex"|.} +loop@+begin + begin_file_reading; {set up |cur_file| and new level of input} + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + pack_cur_name; {Try adding |".tex"|, even if we already have an extension.} + if name_length < file_name_size + 5 {Don't overflow the array.} + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; +@z + +% Knuth should fix this bug. +@x +if term_offset+length(name)>max_print_line-2 then print_ln +@y +if term_offset+length(name)>max_print_line-3 then print_ln +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Get rid of return of filename to string pool. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if name=str_ptr-1 then {we can conserve string pool space now} + begin flush_string; name:=cur_name; + end; +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [30.563] Fix TFM file opening. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +file_opened:=false; +if aire="" then pack_file_name(nom,TEX_font_area,".tfm") +else pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@y +file_opened:=false; +pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [32.597] We only want `eof' on the TFM file to be true if we +% previously had EOF, not if we're at EOF now. This is like `feof', and +% unlike our implementation of `eof' elsewhere. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if eof(tfm_file) then abort; +@y +if feof(tfm_file) then abort; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [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.875] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +repeat if type(r)<>delta_node then + begin line_diff:=line_number(r)-best_line; +@y +repeat if type(r)<>delta_node then + begin line_diff:=toint(line_number(r))-toint(best_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [42.920,921,923,924] Allow larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Comparatively few different number sequences $n_0\ldots n_k$ actually occur, +since most of the |n|'s are generally zero. Therefore the number sequences +are encoded in such a way that |trie_op|$(z_k)$ is only one byte long. +If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|. +@y +The theory that comparatively few different number sequences $n_0\ldots n_k$ +actually occur, since most of the |n|'s are generally zero, seems to fail +at least for the large German hyphenation patterns. +Therefore the number sequences cannot any longer be encoded in such a way +that |trie_op|$(z_k)$ is only one byte long. +We have introduced a new constant |max_trie_op| for the maximum allowable +hyphenation operation code value; |max_trie_op| might be different for +\TeX\ and \.{INITEX} and must not exceed |max_halfword|. +An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword| +or a quarterword otherwise. +@^system dependencies@> +If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|. +@z +@x +@!trie_pointer=0..trie_size; {an index into |trie|} +@y +@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode} +@!trie_pointer=0..trie_size; {an index into |trie|} +@z +@x +@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie} +@d trie_char(#)==trie[#].b1 {character matched at this trie location} +@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location} +@y +@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|, +and |trie_op| will no longer fit into one memory word; thus using web2c +we define |trie| as three array instead of an array of records. +The variant will be implented by reusing the opcode field later on with +another macro. +@d trie_link(#)==trie_trl[#] {``downward'' link in a trie} +@d trie_char(#)==trie_trc[#] {character matched at this trie location} +@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location} +@z +@x +@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|} +@y +@!trie_trl:array[trie_pointer] of halfword; {|trie_link|} +@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|} +@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|} +@z +%@x +% begin if trie_op(z)<>min_quarterword then +%@y +% begin if trie_op(z)<>min_trie_op then +%@z +%@x +%until v=min_quarterword; +%@y +%until v=min_trie_op; +%@z +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943] Larger tries, also in documentation parts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +|hyf_next[@t$v^\prime$@>]=min_quarterword|. +@y +|hyf_next[@t$v^\prime$@>]=min_trie_op|. +@z +@x +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad +@y +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad +@z +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.?] Hack around the negative lower bound here. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The hash table is called |trie_op_hash|, and the number of entries it contains +is |trie_op_ptr|. + +@<Glob...@>= +@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size; +@y +The hash table is called |trie_op_hash|, and the number of entries it contains +is |trie_op_ptr|. + +@<Glob...@>= +@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943,944] Larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!trie_used:array[ASCII_code] of quarterword; +@y +@!trie_used:array[ASCII_code] of trie_opcode; +@z +@x +@!trie_op_val:array[1..trie_op_size] of quarterword; +@y +@!trie_op_val:array[1..trie_op_size] of trie_opcode; +@z +@x +tini +@y +tini@; +@!max_op_used:trie_opcode; {largest opcode used for any language} +@!small_op:boolean; {flag used while dumping or undumping} +@z +@x +|new_trie_op| could return |min_quarterword| (thereby simply ignoring +@y +|new_trie_op| could return |min_trie_op| (thereby simply ignoring +@z +@x +function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword; +label exit; +var h:-trie_op_size..trie_op_size; {trial hash location} +@!u:quarterword; {trial op code} +@y +function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode; +label exit; +var h:neg_trie_op_size..trie_op_size; {trial hash location} +@!u:trie_opcode; {trial op code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (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+trie_op_size) +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944,945,946] And larger tries again. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if u=max_quarterword then + overflow("pattern memory ops per language", + max_quarterword-min_quarterword); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; +@y + if u=max_trie_op then + overflow("pattern memory ops per language", + max_trie_op-min_trie_op); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; + if u>max_op_used then max_op_used:=u; +@z +@x +op_start[0]:=-min_quarterword; +@y +op_start[0]:=-min_trie_op; +@z +@x +for k:=0 to 255 do trie_used[k]:=min_quarterword; +@y +for k:=0 to 255 do trie_used[k]:=min_trie_op; +@z +@x +trie_op_ptr:=0; +@y +max_op_used:=min_trie_op; +trie_op_ptr:=0; +@z +@x +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword; +@y +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode; +@z +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.947] And another. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.950,958,960,963] Larger tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d trie_back(#)==trie[#].lh {backward links in |trie| holes} +@y +@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links} +@z +@x +@<Move the data into |trie|@>= +h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|, + |trie_op:=min_quarterword|, |trie_char:=qi(0)|} +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do trie[r]:=h; +@y +@d clear_trie == {clear |trie[r]|} + begin trie_link(r):=0; + trie_op(r):=min_trie_op; + trie_char(r):=min_quarterword; {|trie_char:=qi(0)|} + end +@<Move the data into |trie|@>= +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do clear_trie; +@z +@x + repeat s:=trie_link(r); trie[r]:=h; r:=s; +@y + repeat s:=trie_link(r); clear_trie; r:=s; +@z +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [49.1275] Same stuff as for \input, this time for \openin. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if cur_ext="" then cur_ext:=".tex"; + pack_cur_name; + if a_open_in(read_file[n]) then read_open[n]:=just_open; +@y + pack_cur_name; + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open + else begin + pack_cur_name; + if name_length < file_name_size + 5 {Don't overflow the array.} + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open; + end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1302] Eliminate now-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} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1303] Ditto, for `load_fmt_file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!x: integer; {something undumped} +@!w: four_quarters; {four ASCII codes} +@y +@!x: integer; {something undumped} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.??] Do reading and writing of `fmt_file' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@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 +@z + +@x +@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 +@z + +@x +x:=fmt_file^.int; +@y +undump_int(x); {This reads the first word of the \.{.fmt} file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] Make dumping/undumping more efficient. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +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 +dump_things(str_start[0], str_ptr+1); +dump_things(str_pool[0], pool_ptr); +@z + +@x +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 +undump_things(str_start[0], str_ptr+1); +undump_things(str_pool[0], pool_ptr); +@z + +@x +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 +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 + +@x +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 +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 +for k:=hi_mem_min to mem_end do undump_wd(mem[k]); +@y +undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +for j:=k to k+x-1 do undump_wd(eqtb[j]); +@y +undump_things(eqtb[k], x); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]); +@y +dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]); +@y +undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +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 +@<Dump the array info for internal font number |k|@>; +@z + +@x +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 +@<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 +@ @<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 +@ @<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); +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.1322] Reading font info for C (nearly done with undump stuff). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ @<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)(font_mem_size)(bchar_label[k]); +undump(min_quarterword)(non_char)(font_bchar[k]); +undump(min_quarterword)(non_char)(font_false_bchar[k]); +end +@y +@ 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); +end +@z + +% The hyphenation patterns. +% +@x +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 +dump_things(trie_trl[0], trie_max+1); +dump_things(trie_tro[0], trie_max+1); +dump_things(trie_trc[0], trie_max+1); +dump_int(trie_op_ptr); +dump_things(hyf_distance[1], trie_op_ptr); +dump_things(hyf_num[1], trie_op_ptr); +dump_things(hyf_next[1], trie_op_ptr); +@z + +@x +for k:=0 to j do undump_hh(trie[k]); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +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 +undump_things(trie_trl[0], j+1); +undump_things(trie_tro[0], j+1); +undump_things(trie_trc[0], j+1); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +undump_things(hyf_distance[1], j); +undump_things(hyf_num[1], j); +undump_things(hyf_next[1], j); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1327] As with TFM files, `eof' here means `have we previously +% encountered the end-of-file', not `are we at the end of the file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if (x<>69069)or eof(fmt_file) then goto bad_fmt +@y +if (x<>69069)or feof(fmt_file) then goto bad_fmt +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +print(" (preloaded format="); print(job_name); print_char(" "); +@y +print(" (format="); print(job_name); print_char(" "); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1332] `uexit' argument depends on `history'; add call to +% set_paths; make the main program a procedure, so that uses of `eqtb' +% will work. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@p begin @!{|start_here|} +@y +@p procedure tex_body; +begin @!{|start_here|} +@z + +@x +t_open_out; {open the terminal for output} +@y +t_open_out; {open the terminal for output} +{get default file paths from the environment} +set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT + + TFM_FILE_PATH_BIT); +@z + +@x +end_of_TEX: close_files_and_terminate; +final_end: ready_already:=0; +end. +@y +close_files_and_terminate; +final_end: do_final_end; +end {|tex_body|}; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1333] Print new line before termination; switch to editor if +% necessary. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + print(log_name); print_char("."); + end; + end; +@y + print(log_name); print_char("."); + end; + end; +print_ln; +if (edit_name_start<>0) and (interaction>batch_mode) then + call_edit(str_pool,edit_name_start,edit_name_length,edit_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [52.1338] Core-dump in debugging mode on 0 input. Under 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 + begin goto breakpoint;@\ {go to every label at least once} + breakpoint: m:=0; @{'BREAKPOINT'@}@\ + end +@y + dump_core {Do something to cause a core dump} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [54.1376] Add editor-switch variables to globals. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +This section should be replaced, if necessary, by any special +modifications of the program +that are necessary to make \TeX\ work at a particular installation. +It is usually best to design your change file so that all changes to +previous sections preserve the section numbering; then everybody's version +will be consistent with the published program. More extensive changes, +which introduce new sections, can be inserted here; then only the index +itself will get a new section number. +@^system dependencies@> +@y +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; +@z diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isimakefile b/obsolete/systems/sisisi/unix/iSiTeX3.14/isimakefile new file mode 100644 index 0000000000..3a1d2425b7 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isimakefile @@ -0,0 +1,280 @@ +# Overall Makefile for making TeX, Metafont, and friends, using WEB to C. + + +# TeX 3.14 + Metafont 2.7 + web2c b. +# +version=5.84b + +# Directory that site.h is in relative to subdirectories, i.e., `..' +# means the directory containing this Makefile. +SITEDIR=.. + +# Default C compiler. +CC=gcc + +# Default flags to give the C compiler. (Don't define CFLAGS directly.) +OPT=-O + +# Default flags to give to the loader. +LDFLAGS= + +# Default libraries with which to link (libraries for the Metafont +# support are specified separately). +LOADLIBES= + +# Make sure we use the sh. If your sh is broken, you might try bash, +# the GNU replacement. +SHELL=/bin/sh + +# The yacc program to use on web2c/web2c.yacc. +YACC=bison -y + +# The lex program to use on web2c/web2c.lex. +LEX=lex +# -ll for lex, -lfl for flex. +LEXLIB=-ll + +# Need -D_POSIX_SOURCE here, perhaps, if on a POSIX system. +LEXCFLAGS= + +# How to make a link. +LN=ln -s + +# Support libraries for Metafont. +x10lib=-lX +x11lib=-lXt -lX11 +sunlib=-lsuntool -lsunwindow -lpixrect + +# This line should select the libraries that match what you said in site.h. +wlibs=$(x11lib) + +# These lines define the format and base files that `make fmts' and +# `make bases' will try to make, and `make install' will try to install. +# See README.W2C for a brief description of each of these formats. +formats=isitex.fmt isilatex.fmt +# etex.fmt \ +# amstex.fmt amslatex.fmt picplus.fmt texinfo.fmt +bases=mf.base cmmf.base + +# The name of the file that defines your local devices, for use with +# Metafont. (Only relevant during `make bases'.) I urge you to get the +# file `modes.mf', which defines all known modes, plus useful +# definitions for all fonts. It's available from ftp.cs.umb.edu +# [192.12.26.23] as pub/tex/modes.mf, among other places. +localmodes=modes + +# You may need INSTALL=cp on system V, if you don't have GNU install. +# Or you can install the programs by hand. +# $(fileinstall) is used for the format and base files, man files, and +# other non-executables, and $(programinstall) is used for +# the executables. +INSTALL=install -g tex -c +fileinstall=$(INSTALL) -m 664 +proginstall=$(INSTALL) -m 775 -s + +# These pathnames are used to customize the manual pages with local +# directory names; some of them are used in `make install'. They should +# match the system directories in the paths defined in `./site.h'. +bindir=/usr/local/bin +manext=l +mandir=/usr/man/man$(manext) + +texlibdir=/usr/local/lib/tex +texpooldir=$(texlibdir) +texinputdir=$(texlibdir)/inputs +texfontdir=$(texlibdir)/fonts +formatdir=$(texlibdir)/formats + +mflibdir=/usr/local/lib/mf +mfpooldir=$(mflibdir) +mfinputdir=$(mflibdir)/inputs +basedir=$(mflibdir)/bases + +# Where the Computer Modern sources are. +# (The man pages claim that you have installed the standard utility +# sources, like `grayf.mf' and `expr.mf', somewhere in $(mfinputdir).) +cmsources=/usr/local/src/other/TeX+MF/typefaces/cm + +default: all + + +# Stuff below here probably doesn't need to be changed. +# +alldirs=web tex mf texware mfware fontutil bibtex dviutil +triptrapdirs=tex texware mf mfware + +makeargs=SITEDIR="$(SITEDIR)" CC="$(CC)" OPT="$(OPT)" \ +SHELL="$(SHELL)" LDFLAGS="$(LDFLAGS)" LOADLIBES="$(LOADLIBES)" wlibs="$(wlibs)" + +web2c=web2c +web2cprograms=$(web2c)/web2c $(web2c)/regfix $(web2c)/splitup \ + $(web2c)/fixwrites +commonsources=common/alloca.c common/extra.c common/main.c common/endian.c + +triptrap: stamp-tangle stamp-common + for name in $(triptrapdirs); \ + do \ + (cd $${name}; make $(makeargs) LN="$(LN)" triptrap); \ + done + +run-triptrap: run-trip run-trap + +clean-triptrap: + cd tex; make veryclean + cd mf; make veryclean + +all: stamp-web2c stamp-common + for name in $(alldirs); \ + do \ + (cd $${name}; echo $${name}; make $(makeargs) all); \ + done + +TeX: stamp-web2c stamp-tangle stamp-common + cd tex; make $(makeargs) all + +BibTeX: stamp-web2c stamp-tangle stamp-common + cd bibtex; make $(makeargs) all + +run-trip: + cd tex; make run-trip + +MF: stamp-web2c stamp-tangle stamp-common + cd mf; make $(makeargs) all + +run-trap: + cd mf; make run-trap + + +# The targets below must be up to date for anything to be made. +# + +stamp-web2c: + cd $(web2c); \ + make $(makeargs) YACC="$(YACC)" LEX="$(LEX)" LEXLIB="$(LEXLIB)" all + touch stamp-web2c + +stamp-common: $(commonsources) + cd common; make $(makeargs) all + touch stamp-common + +stamp-tangle: stamp-web2c stamp-common + cd web; make $(makeargs) tangle + touch stamp-tangle + + +manpages: + cd man; make SITEDIR=$(SITEDIR) \ + bindir=$(bindir) texlibdir=$(texlibdir) \ + texpooldir=$(texpooldir) formatdir=$(formatdir) \ + texinputdir=$(texinputdir) texfontdir=$(texfontdir) \ + mflibdir=$(mflibdir) mfpooldir=$(mfpooldir) \ + basedir=$(basedir) mfinputdir=$(mfinputdir) \ + cmsources=$(cmsources) \ + all + +bases: stamp-bases +stamp-bases: + cd mf; MFPOOL=.; export MFPOOL; \ + make bases="$(bases)" localmodes="$(localmodes)" bases + touch stamp-bases + +formats: stamp-formats +stamp-formats: + cd tex; TEXPOOL=.; export TEXPOOL; make formats="$(formats)" fmts + touch stamp-formats + + +# Installation targets. +# +install-manpages: + cd man; make mandir=$(mandir) INSTALL="$(fileinstall)" \ + SITEDIR="$(SITEDIR)" manext=$(manext) install + +install: + if test -d $(bindir); then exit 0; else mkdir $(bindir); fi + $(proginstall) tex/initex $(bindir)/initex + $(proginstall) tex/virtex $(bindir)/virtex + $(proginstall) mf/inimf $(bindir)/inimf + $(proginstall) mf/virmf $(bindir)/virmf + $(proginstall) web/tangle $(bindir)/tangle + $(proginstall) web/weave $(bindir)/weave + $(proginstall) texware/dvitype $(bindir)/dvitype + $(proginstall) texware/pltotf $(bindir)/pltotf + $(proginstall) texware/tftopl $(bindir)/tftopl + $(proginstall) mfware/gftodvi $(bindir)/gftodvi + $(proginstall) mfware/gftopk $(bindir)/gftopk + $(proginstall) mfware/gftype $(bindir)/gftype + $(proginstall) mfware/mft $(bindir)/mft + $(proginstall) fontutil/pktogf $(bindir)/pktogf + $(proginstall) fontutil/pktype $(bindir)/pktype + $(proginstall) fontutil/vftovp $(bindir)/vftovp + $(proginstall) fontutil/vptovf $(bindir)/vptovf + $(proginstall) bibtex/bibtex $(bindir)/bibtex + $(proginstall) dviutil/dvicopy $(bindir)/dvicopy + if test -d $(texpooldir); then exit 0; else mkdir $(texpooldir); fi + -if test -s tex/tex.pool; \ + then (cd tex; $(fileinstall) tex.pool $(texpooldir) ); fi + if test -d $(mfpooldir); then exit 0; else mkdir $(mfpooldir); fi + -if test -s mf/mf.pool; \ + then (cd mf; $(fileinstall) mf.pool $(mfpooldir) ); fi + +install-formats: stamp-formats + if test -d $(formatdir); then exit 0; else -mkdir $(formatdir); fi + for f in $(formats); \ + do \ + rm -f $(bindir)/`basename $$f .fmt`; \ + ln $(bindir)/virtex $(bindir)/`basename $$f .fmt`; \ + $(fileinstall) tex/$$f $(formatdir); \ + done + cd $(formatdir); rm -f plain.fmt; ln tex.fmt plain.fmt + +install-bases: stamp-bases + if test -d $(basedir); then exit 0; else -mkdir $(basedir); fi + for f in $(bases); \ + do \ + rm -f $(bindir)/`basename $$f .base`; \ + ln $(bindir)/virmf $(bindir)/`basename $$f .base`; \ + $(fileinstall) mf/$$f $(basedir); \ + done + cd $(basedir); rm -f plain.base; ln mf.base plain.base + + +# Need GNU tar for this. +# +web2c-dist: web/tangleboot.pas + @echo -n "check -linet;tangleboot" + @echo "big{tex,mf.ch; trie change" + mv ChangeLog ChangeLog.W2C + cd ..; \ + find src-$(version) \! -name '*.web' -type f -print > /tmp/files; \ + tar czfT web2c-$(version).tar.Z /tmp/files; \ + ls -ld web* + mv ChangeLog.W2C ChangeLog + +web-dist: web/tangleboot.pas + cd ..; \ + find src-$(version) -name '*.web' -print > /tmp/webfest; \ + tar czfT web-$(version).tar.Z /tmp/webfest; \ + ls -ld web* + +web/tangleboot.pas: + cd web; make tangle.p; cp tangle.p tangleboot.pas; make veryclean + +clean: + rm -f stamp-* + for name in web2c common $(alldirs); \ + do \ + (cd $${name}; make clean); \ + done + +veryclean: + rm -f stamp-* + for name in web2c common man $(alldirs); \ + do \ + (cd $${name}; make veryclean); \ + done + rm -f \#*\# *~ *.bak *.ckp core + +.PHONY: default triptrap run-triptrap clean-triptrap all TeX run-trip \ + MF run-trap manpages bases formats install-manpages install \ + install-formats install-bases web2c-dist web-dist clean veryclean diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.defines b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.defines new file mode 100644 index 0000000000..276fe7eafc --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.defines @@ -0,0 +1,5 @@ +{Definitions for IsITeX: new(p) must be translated in p := malloc(sizeof(^p)), + so we have to define malloc and sizeof for web2c.} + +@define function malloc (); +@define function sizeof (); diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.web.gz b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.web.gz Binary files differnew file mode 100644 index 0000000000..3c502f8696 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex.web.gz diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex10.c b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex10.c new file mode 100644 index 0000000000..9e1b407c06 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex10.c @@ -0,0 +1,498 @@ +#define EXTERN extern +#include "texd.h" + +void giveerrhelp ( ) +{giveerrhelp_regmem + tokenshow ( eqtb [ 10821 ] .hh .v.RH ) ; +} +boolean openfmtfile ( ) +{/* 40 10 */ register boolean Result; openfmtfile_regmem + integer j ; + j = curinput .locfield ; + if ( buffer [ curinput .locfield ] == 38 ) + { + incr ( curinput .locfield ) ; + j = curinput .locfield ; + buffer [ last ] = 32 ; + while ( buffer [ j ] != 32 ) incr ( j ) ; + packbufferedname ( 0 , curinput .locfield , j - 1 ) ; + if ( wopenin ( fmtfile ) ) + goto lab40 ; + (void) fprintf( stdout , "%s%s\n", "Sorry, I can't find that format;" , " will try the default." ) ; + flush ( stdout ) ; + } + packbufferedname ( formatdefaultlength - 4 , 1 , 0 ) ; + if ( ! wopenin ( fmtfile ) ) + { + ; + (void) fprintf( stdout , "%s\n", "I can't find the default format file!" ) ; + Result = false ; + return(Result) ; + } + lab40: curinput .locfield = j ; + Result = true ; + return(Result) ; +} +void closefilesandterminate ( ) +{closefilesandterminate_regmem + integer k ; + {register integer for_end; k = 0 ; for_end = 15 ; if ( k <= for_end) do + if ( writeopen [ k ] ) + aclose ( writefile [ k ] ) ; + while ( k++ < for_end ) ; } + {register integer for_end; hsii = 1 ; for_end = FILENAMESIZE ; if ( hsii <= + for_end) do + { + nameoffile [ hsii ] = ' ' ; + } + while ( hsii++ < for_end ) ; } + hsij = strstart [ jobname ] ; + hsii = 1 ; + while ( hsij < strstart [ jobname + 1 ] ) { + + nameoffile [ hsii ] = xchr [ strpool [ hsij ] ] ; + hsij = hsij + 1 ; + hsii = hsii + 1 ; + } + nameoffile [ hsii ] = '.' ; + nameoffile [ hsii + 1 ] = 'm' ; + nameoffile [ hsii + 2 ] = 'e' ; + nameoffile [ hsii + 3 ] = 'm' ; + if ( ! aopenout ( hsmem ) ) + { + (void) fprintf( stdout , "%s\n", " =iSi=> cant a_open_out " ) ; + wjob () ; + (void) Fputs( stdout , ".mem " ) ; + (void) putc('\n', stdout ); + } + else { + + while ( mdm != nil ) { + + if ( inuse ( mdm ->w12 , mdm ->l1 , mdb ) ) + { + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> writing to " ) ; + wjob () ; + (void) Fputs( stdout , ".mem: " ) ; + writewt ( mdm ->w12 , mdm ->l1 , mdm ->tr1 ) ; + (void) putc('\n', stdout ); + } + (void) fprintf( hsmem , " %ld\n", (long)mdm ->l1 ) ; + {register integer for_end; k = 1 ; for_end = mdm ->l1 ; if ( k <= + for_end) do + { + (void) fprintf( hsmem , " %ld", (long)mdm ->w12 [ k ] ) ; + } + while ( k++ < for_end ) ; } + (void) putc('\n', hsmem ); + {register integer for_end; k = 1 ; for_end = mdm ->l1 ; if ( k <= + for_end) do + { + (void) fprintf( hsmem , " %ld", (long)mdm ->tr1 [ k ] ) ; + } + while ( k++ < for_end ) ; } + (void) putc('\n', hsmem ); + if ( mdm ->neu1 ) + { + (void) putc( Xchr ( 116 ) , hsmem ); + (void) putc('\n', hsmem ); + mdleintragen ( mdm ->w12 , mdm ->l1 , mdl ) ; + } + else { + + (void) putc( Xchr ( 102 ) , hsmem ); + (void) putc('\n', hsmem ); + } + } + else { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> " ) ; + wwort ( mdm ->w12 , mdm ->l1 ) ; + (void) Fputs( stdout , " not in use" ) ; + (void) putc('\n', stdout ); + } + } + mdm = mdm ->li ; + } + aclose ( hsmem ) ; + } + {register integer for_end; hsii = 1 ; for_end = FILENAMESIZE ; if ( hsii <= + for_end) do + { + nameoffile [ hsii ] = ' ' ; + } + while ( hsii++ < for_end ) ; } + hsij = strstart [ jobname ] ; + hsii = 1 ; + while ( hsij < strstart [ jobname + 1 ] ) { + + nameoffile [ hsii ] = xchr [ strpool [ hsij ] ] ; + hsij = hsij + 1 ; + hsii = hsii + 1 ; + } + nameoffile [ hsii ] = '.' ; + nameoffile [ hsii + 1 ] = 'l' ; + nameoffile [ hsii + 2 ] = 'e' ; + nameoffile [ hsii + 3 ] = 'x' ; + if ( ! aopenout ( hslex ) ) + (void) fprintf( stdout , "%s\n", " =iSi=> cant open hslex" ) ; + else { + + while ( mdl != nil ) { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> writing to " ) ; + wjob () ; + (void) Fputs( stdout , ".lex: " ) ; + wwort ( mdl ->w12 , mdl ->l1 ) ; + (void) putc('\n', stdout ); + } + (void) putc( Xchr ( mdl ->l1 ) , hslex ); + {register integer for_end; k = 1 ; for_end = mdl ->l1 ; if ( k <= + for_end) do + { + if ( mdl ->w12 [ k ] <= 26 ) + { + (void) putc( Xchr ( mdl ->w12 [ k ] + 96 ) , hslex ); + } + else { + + if ( mdl ->w12 [ k ] == 27 ) + { + (void) Fputs( hslex , "\"a" ) ; + } + else if ( mdl ->w12 [ k ] == 28 ) + { + (void) Fputs( hslex , "\"o" ) ; + } + else if ( mdl ->w12 [ k ] == 29 ) + { + (void) Fputs( hslex , "\"u" ) ; + } + else if ( mdl ->w12 [ k ] == 30 ) + { + (void) Fputs( hslex , "\"s" ) ; + } + else { + + (void) putc( '-' , hslex ); + } + } + } + while ( k++ < for_end ) ; } + (void) putc('\n', hslex ); + mdl = mdl ->li ; + } + aclose ( hslex ) ; + } + {register integer for_end; hsii = 1 ; for_end = FILENAMESIZE ; if ( hsii <= + for_end) do + { + nameoffile [ hsii ] = ' ' ; + } + while ( hsii++ < for_end ) ; } + hsij = strstart [ jobname ] ; + hsii = 1 ; + while ( hsij < strstart [ jobname + 1 ] ) { + + nameoffile [ hsii ] = xchr [ strpool [ hsij ] ] ; + hsij = hsij + 1 ; + hsii = hsii + 1 ; + } + nameoffile [ hsii ] = '.' ; + nameoffile [ hsii + 1 ] = 'e' ; + nameoffile [ hsii + 2 ] = 'd' ; + nameoffile [ hsii + 3 ] = 't' ; + if ( ! aopenout ( hsedt ) ) + (void) fprintf( stdout , "%s\n", " =iSi=> cant open hsedt" ) ; + else { + + while ( mde != nil ) { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> writing to " ) ; + wjob () ; + (void) Fputs( stdout , ".edt: " ) ; + wwort ( mde ->w12 , mde ->l1 ) ; + (void) putc('\n', stdout ); + } + {register integer for_end; k = 1 ; for_end = mde ->l1 ; if ( k <= + for_end) do + { + if ( mde ->w12 [ k ] <= 26 ) + { + (void) putc( Xchr ( mde ->w12 [ k ] + 96 ) , hsedt ); + } + else { + + if ( mde ->w12 [ k ] == 27 ) + { + (void) Fputs( hsedt , "\"a" ) ; + } + else if ( mde ->w12 [ k ] == 28 ) + { + (void) Fputs( hsedt , "\"o" ) ; + } + else if ( mde ->w12 [ k ] == 29 ) + { + (void) Fputs( hsedt , "\"u" ) ; + } + else if ( mde ->w12 [ k ] == 30 ) + { + (void) Fputs( hsedt , "\"s" ) ; + } + else { + + (void) Fputs( hsedt , "--" ) ; + } + } + } + while ( k++ < for_end ) ; } + (void) putc('\n', hsedt ); + mde = mde ->li ; + } + aclose ( hsedt ) ; + } + ; +#ifdef STAT + if ( eqtb [ 12694 ] .cint > 0 ) + if ( logopened ) + { + (void) fprintf( logfile , "%c\n", ' ' ) ; + (void) fprintf( logfile , "%s%s\n", "Here is how much of TeX's memory" , " you used:" ) ; + (void) fprintf( logfile , "%c%ld%s", ' ' , (long)strptr - initstrptr , " string" ) ; + if ( strptr != initstrptr + 1 ) + (void) putc( 's' , logfile ); + (void) fprintf( logfile , "%s%ld\n", " out of " , (long)maxstrings - initstrptr ) ; + (void) fprintf( logfile , "%c%ld%s%ld\n", ' ' , (long)poolptr - initpoolptr , " string characters out of " , (long)poolsize - initpoolptr ) ; + (void) fprintf( logfile , "%c%ld%s%ld\n", ' ' , (long)lomemmax - memmin + memend - himemmin + 2 , " words of memory out of " , (long)memend + 1 - memmin ) ; + (void) fprintf( logfile , "%c%ld%s%ld\n", ' ' , (long)cscount , " multiletter control sequences out of " , (long)9500 ) ; + (void) fprintf( logfile , "%c%ld%s%ld%s", ' ' , (long)fmemptr , " words of font info for " , (long)fontptr - 0 , " font" ) ; + if ( fontptr != 1 ) + (void) putc( 's' , logfile ); + (void) fprintf( logfile , "%s%ld%s%ld\n", ", out of " , (long)fontmemsize , " for " , (long)fontmax - 0 ) ; + (void) fprintf( logfile , "%c%ld%s", ' ' , (long)hyphcount , " hyphenation exception" ) ; + if ( hyphcount != 1 ) + (void) putc( 's' , logfile ); + (void) fprintf( logfile , "%s%ld\n", " out of " , (long)607 ) ; + (void) fprintf( logfile , "%c%ld%s%ld%s%ld%s%ld%s%ld%s%ld%s%ld%s%ld%s%ld%s%ld%c\n", ' ' , (long)maxinstack , "i," , (long)maxneststack , "n," , (long)maxparamstack , "p," , (long)maxbufstack + 1 , "b," , (long)maxsavestack + 6 , "s stack positions out of " , (long)stacksize , "i," , (long)nestsize , "n," , (long)paramsize , "p," , (long)bufsize , "b," , (long)savesize , 's' ) ; + } +#endif /* STAT */ + while ( curs > -1 ) { + + if ( curs > 0 ) + { + dvibuf [ dviptr ] = 142 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + else { + + { + dvibuf [ dviptr ] = 140 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + incr ( totalpages ) ; + } + decr ( curs ) ; + } + if ( totalpages == 0 ) + printnl ( 833 ) ; + else { + + { + dvibuf [ dviptr ] = 248 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + dvifour ( lastbop ) ; + lastbop = dvioffset + dviptr - 5 ; + dvifour ( 25400000L ) ; + dvifour ( 473628672L ) ; + preparemag () ; + dvifour ( eqtb [ 12680 ] .cint ) ; + dvifour ( maxv ) ; + dvifour ( maxh ) ; + { + dvibuf [ dviptr ] = maxpush / 256 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + { + dvibuf [ dviptr ] = maxpush % 256 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + { + dvibuf [ dviptr ] = ( totalpages / 256 ) % 256 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + { + dvibuf [ dviptr ] = totalpages % 256 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + while ( fontptr > 0 ) { + + if ( fontused [ fontptr ] ) + dvifontdef ( fontptr ) ; + decr ( fontptr ) ; + } + { + dvibuf [ dviptr ] = 249 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + dvifour ( lastbop ) ; + { + dvibuf [ dviptr ] = 2 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + k = 4 + ( ( dvibufsize - dviptr ) % 4 ) ; + while ( k > 0 ) { + + { + dvibuf [ dviptr ] = 223 ; + incr ( dviptr ) ; + if ( dviptr == dvilimit ) + dviswap () ; + } + decr ( k ) ; + } + if ( dvilimit == halfbuf ) + writedvi ( halfbuf , dvibufsize - 1 ) ; + if ( dviptr > 0 ) + writedvi ( 0 , dviptr - 1 ) ; + printnl ( 834 ) ; + print ( outputfilename ) ; + print ( 284 ) ; + printint ( totalpages ) ; + print ( 835 ) ; + if ( totalpages != 1 ) + printchar ( 115 ) ; + print ( 836 ) ; + printint ( dvioffset + dviptr ) ; + print ( 837 ) ; + bclose ( dvifile ) ; + } + if ( logopened ) + { + (void) putc('\n', logfile ); + aclose ( logfile ) ; + selector = selector - 2 ; + if ( selector == 17 ) + { + printnl ( 1268 ) ; + print ( logname ) ; + printchar ( 46 ) ; + } + } + println () ; + if ( ( editnamestart != 0 ) && ( interaction > 0 ) ) + calledit ( strpool , editnamestart , editnamelength , editline ) ; +} +#ifdef DEBUG +void debughelp ( ) +{/* 888 10 */ debughelp_regmem + integer k, l, m, n ; + while ( true ) { + + ; + printnl ( 1277 ) ; + flush ( stdout ) ; + read ( stdin , m ) ; + if ( m < 0 ) + return ; + else if ( m == 0 ) + dumpcore () ; + else { + + read ( stdin , n ) ; + switch ( m ) + {case 1 : + printword ( mem [ n ] ) ; + break ; + case 2 : + printint ( mem [ n ] .hh .v.LH ) ; + break ; + case 3 : + printint ( mem [ n ] .hh .v.RH ) ; + break ; + case 4 : + printword ( eqtb [ n ] ) ; + break ; + case 5 : + printword ( fontinfo [ n ] ) ; + break ; + case 6 : + printword ( savestack [ n ] ) ; + break ; + case 7 : + showbox ( n ) ; + break ; + case 8 : + { + breadthmax = 10000 ; + depththreshold = poolsize - poolptr - 10 ; + shownodelist ( n ) ; + } + break ; + case 9 : + showtokenlist ( n , 0 , 1000 ) ; + break ; + case 10 : + print ( n ) ; + break ; + case 11 : + checkmem ( n > 0 ) ; + break ; + case 12 : + searchmem ( n ) ; + break ; + case 13 : + { + read ( stdin , l ) ; + printcmdchr ( n , l ) ; + } + break ; + case 14 : + {register integer for_end; k = 0 ; for_end = n ; if ( k <= for_end) + do + print ( buffer [ k ] ) ; + while ( k++ < for_end ) ; } + break ; + case 15 : + { + fontinshortdisplay = 0 ; + shortdisplay ( n ) ; + } + break ; + case 16 : + panicking = ! panicking ; + break ; + default: + print ( 63 ) ; + break ; + } + } + } +} +#endif /* DEBUG */ diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex3.ch b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex3.ch new file mode 100644 index 0000000000..7bd37ad9c4 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex3.ch @@ -0,0 +1,1410 @@ +@x +@d banner=='This is TeX, Version 3.14 (+SISISI 1.0)' +@y +@d banner=='This is TeX, Version 3.14 (+SISISI 1.0) {+iSi 92}' +@z + + +@x +@!pool_name='TeXformats:SITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@y +@!pool_name='TeXformats:ISITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@z + + +@x +else bad_pool('! I can''t read SITEX3.POOL.'); +@.I can't read TEX.POOL@> +@y +else bad_pool('! I can''t read ISITEX3.POOL.'); +@.I can't read TEX.POOL@> +@z + + +@x +@!funktioniert: boolean; +@!zerleg: integer; +@y +@!funktioniert: boolean; +@!zerleg: integer; +@!alletr: trenn16; {iSi 920114} +@!auswahl, schnuller: char; +@!memkorr: boolean; {iSi 920914 doku.mem korrigieren ja/nein} +@!indexi: integer; +@!uebersprungen: boolean; {iSi 920921} +@!lex_ja, lex_ok: boolean; {iSi 920930 neue Eingabe `1E' statt `B'} +@z + + + +@x + abteilen(hc_si,hyf_si,hn,funktioniert,zerleg); + for j:=0 to 64 do begin + hyf_disc[j]:=null; hyfpen[j]:=inf_penalty; + end; +@y + if not hsstart then begin +{ wterm(' =iSi=> running hsinit'); wterm_cr; } + hsinit; + hsstart := true; +{ wterm(' =iSi=> finished hsinit'); wterm_cr } + end; + + if isidebug=1 then begin + wterm(' =iSi=> abteilen von '); wwort(hc_si, hn); + end; + + abteilen(hc_si,hyf_si, alletr {iSi 920114}, hn,funktioniert,zerleg); + + if not funktioniert then begin + if isidebug=1 then begin + wterm_cr; + wterm(' =iSi=> unbekanntes Wort: '); wwort(hc_si, hn); + wterm_cr; + wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr; + end; + if md_suchen(hc_si, hn, mdb, hyf_si) then begin + if isidebug=1 then begin + wterm(' =iSi=> gefunden in mdb: '); + writewt(hc_si, hn, hyf_si); + wterm_cr + end; + funktioniert := true + end else begin + if isidebug=1 then begin + wterm(' =iSi=> nicht gefunden in mdb: '); + wwort(hc_si, hn); wterm_cr; + end; + repeat + wterm_cr; wterm_cr; + wterm('"'); + wwort(hc_si, hn); + wterm('" ist ein unbekanntes Wort!'); + wterm_cr; + wterm(0:2); + wterm(': neues Wort, merken in "'); wjob; wterm('.lex"'); + wterm_cr; + wterm(1:2); + wterm(': neues Wort, Trennstellen angeben und merken in "'); wjob; + wterm('.lex"'); + wterm_cr; + wterm(9:2); + wterm(': Tippfehler! - merken im File "'); wjob; wterm('.edt"'); + wterm_cr; + wterm('Bitte waehlen Sie eine Bedeutung (0,1,9) aus:'); + wterm_cr; + read(term_in, schnuller); + auswahl := schnuller; + read_ln(term_in); + until ((xord[auswahl] >= 48) and (xord[auswahl] <= 49)) or + (auswahl = '9'); + if (auswahl = '0') then begin + { Da abteilen bei not funktioniert hyf_si unver"andert l"asst, } + { muss hier jetzt hyf_si ``gel"oscht'' werden. } + for indexi := 1 to hn do begin + hyf_si[indexi] := keine + end; + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, true, mdm); + funktioniert := true + end else if (auswahl = '9') then begin + mde_eintragen(hc_si, hn, mde) + end else begin + wterm('Bitte den Trennvektor angeben'); wterm_cr; + wterm(' ("-" Nebentrennstelle, "=" Haupttrennstelle, '); + wterm('"." Weiterruecken,'); wterm_cr; + wterm(' Trennstrich unter den Buchstaben angeben, hinter dem '); + wterm('getrennt werden soll):'); wterm_cr; + wwort(hc_si, hn); wterm_cr; + indexi := 1; uebersprungen := false; + read(term_in, auswahl); + while (xord[auswahl] <> 10) and (indexi <= hn) do begin + if (hc_si[indexi] >= 27) and + (hc_si[indexi] <= 30) and + not uebersprungen then begin + { Ist in hc_si[] ein Umlaut, so steht am Bildschirm "x. } + { Die Trennvektoreingabe unter dem " muss uebersprungen } + { werden. } + uebersprungen := true + end else begin + if auswahl = '.' then begin + hyf_si[indexi] := keine + end else if auswahl = '-' then begin + hyf_si[indexi] := neben + end else if auswahl = '=' then begin + hyf_si[indexi] := haupt + end else begin + hyf_si[indexi] := keine + end; + uebersprungen := false; + indexi := indexi+1 + end; + read(term_in, auswahl) + end; + while (indexi) <= hn do begin {Rest von hyf_si mit . auff"ullen} + hyf_si[indexi] := keine; + indexi := indexi+1 + end; + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, true, mdm); + funktioniert := true + end + end + end else begin + if isidebug=1 then begin + wterm(': '); writewt(hc_si, hn, hyf_si); wterm_cr + end + end; + + if zerleg >= 2 then begin + gleiche_weg(alletr, zerleg, hn); { eliminiert gleiche Trennvektoren } + if zerleg >= 2 then begin { jetzt sind es echte Alternativen } + if isidebug=1 then begin + wterm(' =iSi=> mehrdeutiges Wort: '); writewt(hc_si, hn, hyf_si); + wterm_cr; + wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr; + end; + if md_suchen(hc_si, hn, mdb, hyf_si) then begin + if isidebug=1 then begin + wterm(' =iSi=> gefunden in mdb: '); writewt(hc_si, hn, hyf_si); + wterm_cr + end + end else begin + if isidebug=1 then begin + wterm(' =iSi=> nicht gefunden in mdb: '); + wwort(hc_si, hn); wterm_cr + end; + if mehrdanz then begin + repeat + wterm_cr; wterm_cr; + wterm('`'); + wwort(hc_si, hn); + wterm(''' ist ein mehrdeutiges Wort!'); + wterm_cr; + wterm(0:2); { wterm('/A'); } + wterm(': nur die sicheren Trennstellen waehlen (also `'); + writewt(hc_si, hn, hyf_si); + wterm(''')'); + wterm_cr; + for indexi := 1 to zerleg do begin + wterm(indexi:2); { wterm('/'); wterm(xchr[65+indexi]); } + wterm(': `'); + writewt(hc_si, hn, alletr[indexi]); + wterm(''''); + wterm_cr + end; + wterm(9:2); + wterm(': Tippfehler! - merken im File `'); wjob; wterm('.edt'''); + wterm_cr; + wterm('Bitte waehlen Sie eine Bedeutung z.B. `0''+`Enter'' aus:'); + wterm_cr; + wterm(' (zusaetzlich `E'' z.B. `0E''+`Enter'': '); + wterm('Wort auch fuer LEXIKON vormerken)'); + wterm_cr; + read(term_in, schnuller); + auswahl := schnuller; + lex_ja := false; lex_ok := true; + if xord[schnuller] <> 32 then begin + read(term_in, schnuller); + if xord[schnuller] <> 10 then begin + if (schnuller = 'e') or (schnuller = 'E') then begin + lex_ja := true; { lex_ok := true } + end else begin + { lex_ja := false; } lex_ok := false + end; + read_ln(term_in); + end + end; + until (((xord[auswahl] >= 48) and (xord[auswahl] <= 48+zerleg)) or + (auswahl = '9')) and lex_ok; + if (auswahl = '0') or ((auswahl = '0') and lex_ja) then begin + if (auswahl = '0') and not lex_ja then begin + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, false, mdm) + end else begin { '0E' } + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, true, mdm) + end; + end else if (auswahl = '9') then begin + mde_eintragen(hc_si, hn, mde) + end else begin + hyf_si := alletr[xord[auswahl]-48]; + if not lex_ja then begin + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, false, mdm) + end else begin { lex_ja } + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, true, mdm) + end {if not lex_ja ...} + end {if (auswahl = ...} + end {if mehrdanz} + end {if md_suchen ...} + end {if zerleg >= 2} + end; {if zerleg >= 2} + + for j:=0 to 64 do begin + hyf_disc[j]:=null; hyfpen[j]:=inf_penalty; + end; +@z + + +@x +@<Types in the outer block@>= + string80 = packed array [0..80] of eight_bits; + buchstabe = eight_bits; + a_word = array[0..maxwl] of 0..256; + wort = a_word; + sperrvektor=array [0..maxwl] of boolean; + dudt=array [0..maxwl] of boolean;{frueher kein type !!} + { trennung = (keine, neben, nebenck, haupt, haupt3); } + trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==> + zwischen Buchstabe i und i+1 wird getrennt } + ktabtype = packed array [0..255] of buchstabe; + verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C } + varr = array [0..maxwl] of verdschlue; + intarr = array [0..maxwl] of integer; + + { darf nicht als var Parameter uebergeben werden !!} + infotype = record + { frueher ein variantenRecord } + ausnahme:boolean; + untrennbar:boolean; + { erste :0..7; + zweite:0..7; } + erste :integer; + zweite:integer; + endung,vorsilbe,stamm,ehervor,stammallein:boolean; + end; + + infobyte = eight_bits; + + { darf nicht als var Parameter uebergeben werden !!} + tableentry=record + tabv:verdschlue; + tabb:infobyte; + frei:boolean; + wiederfrei:boolean; + end; + + hashelement = packed array [0..3] of eight_bits; + htabtype = packed array [0..tabsize] of hashelement; + +@y +@<Types in the outer block@>= + string80 = packed array [0..80] of eight_bits; + buchstabe = eight_bits; + a_word = array[0..maxwl] of 0..256; + wort = a_word; + sperrvektor=array [0..maxwl] of boolean; + dudt=array [0..maxwl] of boolean;{frueher kein type !!} + { trennung = (keine, neben, nebenck, haupt, haupt3); } + trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==> + zwischen Buchstabe i und i+1 wird getrennt } + ktabtype = packed array [0..255] of buchstabe; + verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C } + varr = array [0..maxwl] of verdschlue; + intarr = array [0..maxwl] of integer; + + { darf nicht als var Parameter uebergeben werden !!} + infotype = record + { frueher ein variantenRecord } + ausnahme:boolean; + untrennbar:boolean; + { erste :0..7; + zweite:0..7; } + erste :integer; + zweite:integer; + endung,vorsilbe,stamm,ehervor,stammallein:boolean; + end; + + infobyte = eight_bits; + + { darf nicht als var Parameter uebergeben werden !!} + tableentry=record + tabv:verdschlue; + tabb:infobyte; + frei:boolean; + wiederfrei:boolean; + end; + + hashelement = packed array [0..3] of eight_bits; + htabtype = packed array [0..tabsize] of hashelement; + + trenn16 = array [1..16] of trennvektor; {iSi 921005 trenn8 -> trenn16} + + {iSi 920103 begin} + mdb_knoten = ^mdb_k; + mdm_knoten = ^mdm_k; + mdl_knoten = ^mdl_k; + mde_knoten = ^mde_k; {HHHHH} + + mdb_k = record + w12: wort; + l1: integer; + tr1: trennvektor; + neu1: boolean; + del1: boolean; {gel"oscht ja/nein} + used1: boolean; {noch in Verwendung ja/nein} + li, re: mdb_knoten; + end; + {iSi 920103 end} + + {iSi 920110 begin} + + mdm_k = record + w12: wort; + l1: integer; + tr1: trennvektor; + neu1: boolean; + li, re: mdm_knoten; + end; + mdl_k = record + w12: wort; + l1: integer; + li, re: mdl_knoten; + end; + mde_k = record {HHHHH} + w12: wort; + l1: integer; + li, re: mde_knoten; + end; + + {iSi 920110 end} + +@z + + + +@x +@<Global variables@>= + ktab : ktabtype; + htab : htabtype; + anzahl : integer; + hashfile : alpha_file; + kombtab : array [1..5, 1..5] of integer; + konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]} +@y +@<Global variables@>= + ktab : ktabtype; + htab : htabtype; + anzahl : integer; + hashfile : alpha_file; + + hsmem, hslex, hsedt: alpha_file; {iSi 920111} + + kombtab : array [1..5, 1..5] of integer; + konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]} + + hsstart: boolean; {iSi 920114} {ist mdb schon initialisiert?} + isidebug: integer; {iSi 920917} + auswahl, schnuller: char; {iSi 920917} + mehrdanz: boolean; {iSi 920924} {mehrdeutige W"orter anzeigen?} + mdb: mdb_knoten; {iSi 920111} + mdm: mdm_knoten; {iSi 920111} + mdl: mdl_knoten; {iSi 920114} + mde: mde_knoten; {iSi 920114} + mdb_schnuller: mdb_k; {iSi HH; um web2c zu ueberlisten: sizeof(var) statt } + mdm_schnuller: mdm_k; {sizeof(typ) } + mdl_schnuller: mdl_k; + mde_schnuller: mde_k; + + hsii, hsij: integer; {iSi 920114} {HS_Index_i, HS_Index_j} +@z + + + +@x + { Konsonantentabelle initialisieren } + for bst:=bst_a to bst_sz do konsonant[bst] := true; + konsonant[bst_a] := false; + konsonant[bst_e] := false; + konsonant[bst_i] := false; + konsonant[bst_o] := false; + konsonant[bst_u] := false; + konsonant[bst_ae] := false; + konsonant[bst_oe] := false; + konsonant[bst_ue] := false; +@y + { Konsonantentabelle initialisieren } + for bst:=bst_a to bst_sz do konsonant[bst] := true; + konsonant[bst_a] := false; + konsonant[bst_e] := false; + konsonant[bst_i] := false; + konsonant[bst_o] := false; + konsonant[bst_u] := false; + konsonant[bst_ae] := false; + konsonant[bst_oe] := false; + konsonant[bst_ue] := false; + +{ wterm_cr; wterm_cr; + wterm_ln('===================='); + wterm_ln('This is iSiTeX, HS92'); + wterm_ln('===================='); + wterm_cr; + + wterm_ln(' =iSi=> init mdb, mdm, mdl, mde'); } + mdb := nil; + mdm := nil; + mdl := nil; + mde := nil; + + hsstart := false; + isidebug := 0; + +@z + + +@x + procedure trennen ( + { trennen } + zustand : integer; + anfang : integer; + spv : sperrvektor; + var ok1 : boolean; + { abteilen } + var tr :trennvektor; + var dudtr:trennvektor; + var zerlegungen:integer ; + var dud:dudt; { array [0..maxwl] of boolean; } + var v:varr; + var ind,k:intarr; + var dudstop:sperrvektor; + { abteilen aufruf } + var w:wort; + var tr1:trennvektor; + laenge : integer ); +@y + procedure trennen ( + { trennen } + zustand : integer; + anfang : integer; + spv : sperrvektor; + var ok1 : boolean; + { abteilen } + var alletr: trenn16; {iSi HH} + var tr :trennvektor; + var dudtr:trennvektor; + var zerlegungen:integer ; + var dud:dudt; { array [0..maxwl] of boolean; } + var v:varr; + var ind,k:intarr; + var dudstop:sperrvektor; + { abteilen aufruf } + var w:wort; + var tr1:trennvektor; + laenge : integer ); +@z + +@x + gef, nichtok:boolean; + schnitt:integer; + inform:infotype; + i:integer; + ok_stamm, ok_vor, ok_end, ok_help:boolean; + tri:integer; + { p_stamm } + i1,tre:integer; + ok : boolean; + stop_ptr :integer; + spvtmp :sperrvektor; { lokale Kopie des Sperrvektors, + fr die bersetzung nach C notwendig. + -PRAK!- } +@y + gef, nichtok:boolean; + schnitt:integer; + inform:infotype; + i:integer; + ok_stamm, ok_vor, ok_end, ok_help:boolean; + tri:integer; + { p_stamm } + i1,tre:integer; + ok : boolean; + stop_ptr :integer; + spvtmp :sperrvektor; { lokale Kopie des Sperrvektors, + fr die bersetzung nach C notwendig. + -PRAK!- } + trlast: trennvektor; {iSi 920114} +@z + +@x + for i := laenge downto 1 do + begin + if dudtr[i-1] = haupt3 then + begin + dudtr[i-1] := keine; + tri := haupt3; + end + else + tri := dudtr[i]; + + if zerlegungen = 0 then + tr1[i] := tri + else + tr1[i] := kombtab[tr1[i],tri]; + end; + zerlegungen:=zerlegungen+1; + ok1:= true +@y + for i := laenge downto 1 do begin + if dudtr[i-1] = haupt3 then begin + dudtr[i-1] := keine; + tri := haupt3; + end + else + tri := dudtr[i]; + if zerlegungen = 0 then + tr1[i] := tri + else + tr1[i] := kombtab[tr1[i],tri]; + + trlast[i] := tri; {iSi 920114} + + end; + zerlegungen:=zerlegungen+1; + + alletr[zerlegungen] := trlast; {iSi 920114} + + ok1:= true +@z + + +@x + + trennen (2, schnitt+2, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+2, spv, ok_help, alletr, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+1, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+1, spv, ok_help, alletr, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen(1, schnitt+1, spv, ok_vor, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen(1, schnitt+1, spv, ok_vor, alletr, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+2, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen(5, schnitt, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+1, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (4, schnitt+1, spv, ok_stamm, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+2, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen(5, schnitt, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+1, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + + +@x +procedure abteilen ( var w:wort; var tr1:trennvektor; + laenge : integer; var ok:boolean; + var zerlegungen:integer ); +@y + +procedure wchar(c: halfword); +begin + if c = 27 then begin + wterm('"a') + end else if c = 28 then begin + wterm('"o') + end else if c = 29 then begin + wterm('"u') + end else if c = 30 then begin + wterm('"s') + end else begin + wterm(xchr[c+96]) + end +end; + +procedure wwort(w: wort; + l: integer); + var i: integer; +begin + for i := 1 to l do begin + wchar(w[i]) + end +end; + +procedure writewt(w: wort; + l: integer; + tr: trennvektor); + var i: integer; +begin + wchar(w[1]); + for i := 2 to l-1 do begin + if (tr[i-1] = nebenck) {and (w[i] = bst_c)} then begin + wterm('k'); + wterm('-') + end else if (tr[i] = haupt3) then begin + wterm(xchr[w[i]+96]); + wterm('='); + wterm(xchr[w[i]+96]); + end else if (tr[i] = haupt) then begin + wchar(w[i]); + wterm('=') + end else if (tr[i] = neben) then begin + wchar(w[i]); + wterm('-') + end else begin + wchar(w[i]) + end + end; + wchar(w[l]) +end; + +procedure wjob; + var i:integer; +begin + for i := str_start[job_name] to str_start[job_name+1]-1 do begin + wterm(xchr[str_pool[i]]) + end +end; + +function vergl(wrt1: wort; + l1: integer; + wrt2: wort; + l2: integer): integer; + label 99; + var i: integer; +begin + i := 1; + while (i <= l1) and (i <= l2) do begin + if wrt1[i] < wrt2[i] then begin + vergl := -1; + goto 99 + end else if wrt1[i] > wrt2[i] then begin + vergl := 1; + goto 99 + end; + i := i+1 + end; + if l1 < l2 then begin + vergl := -1; + goto 99 + end else if l1 > l2 then begin + vergl := 1; + goto 99 + end else begin + vergl := 0; + goto 99 + end; + 99: +end; + +procedure gleiche_weg (var alletr: trenn16; + var zerleg: integer; + laenge: integer); + +{ eliminiert bei Mehrdeutigkeiten (zerleg >= 2 !!!) eventuell gleiche } +{ trennvektoren und korrigiert alletr & zerleg } + + var i, j, k: integer; + gleich: boolean; + +begin + i := 1; + repeat + j := i+1; { zerleg >= 2 } + repeat + gleich := true; + k := 1; { laenge >= 1 } + repeat + if alletr[i][k] = alletr[j][k] then begin + k := k+1 + end else begin + gleich := false + end + until (k > laenge) or (gleich = false); + if gleich then begin + for k := j to zerleg-1 do begin + alletr[k] := alletr[k+1] + end; + zerleg := zerleg-1 + end else begin + j := j+1 + end + until j > zerleg; + i := i+1 + until i > zerleg-1 +end; + +procedure mdb_eintragen(w: wort; + l: integer; + tr: trennvektor; + neu: boolean; + used: boolean; + var mdb: mdb_knoten); + + var test: integer; +begin +{ wterm(' =iSi=> mdb_eintragen von '); writewt(w, l, tr); wterm_cr; } + if mdb = nil then begin + { new(mdb); } + mdb := malloc(sizeof(mdb_schnuller)); + mdb^.w12 := w; + mdb^.l1 := l; + mdb^.tr1 := tr; + mdb^.neu1 := neu; + mdb^.used1 := used; + mdb^.del1 := false; + mdb^.li := nil; + mdb^.re := nil; + if isidebug=1 then begin + wterm_cr + end + end else begin + test := vergl(w, l, mdb^.w12, mdb^.l1); + if test = -1 then begin + if isidebug=1 then begin +{ wterm(' =iSi=> kleiner als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; } + wterm('/') + end; + mdb_eintragen(w, l, tr, neu, used, mdb^.li) + end else if test = 1 then begin + if isidebug=1 then begin +{ wterm(' =iSi=> gr"osser als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; } + wterm('\') + end; + mdb_eintragen(w, l, tr, neu, used, mdb^.re) + end else begin + wterm(' =iSi=> mdb_eintragen vom gleichen Wort nocheinmal !!!'); + wterm_cr + end + end +end; + +{iSi 920102 end} +{iSi 920110 begin} + + procedure mdm_eintragen(w: wort; + l: integer; + tr: trennvektor; + neu: boolean; + var mdm: mdm_knoten); + var rechts: mdm_knoten; + begin + if mdm = nil then begin + { new(mdm); } + mdm := malloc(sizeof(mdm_schnuller)); + mdm^.w12 := w; + mdm^.l1 := l; + mdm^.tr1 := tr; + mdm^.neu1 := neu; + mdm^.li := nil; + mdm^.re := nil + end else if mdm^.re = nil then begin + { new(mdm^.re); } + mdm^.re := malloc(sizeof(mdm_schnuller)); + mdm^.re^.w12 := w; + mdm^.re^.l1 := l; + mdm^.re^.tr1 := tr; + mdm^.re^.neu1 := neu; + mdm^.re^.li := nil; + mdm^.re^.re := nil; + mdm^.li := mdm^.re + end else begin + rechts := mdm^.re; + { new(mdm^.re); } + mdm^.re := malloc(sizeof(mdm_schnuller)); + mdm^.re^.w12 := w; + mdm^.re^.l1 := l; + mdm^.re^.tr1 := tr; + mdm^.re^.neu1 := neu; + mdm^.re^.li := nil; + mdm^.re^.re := nil; + rechts^.li := mdm^.re + end + end; + + procedure mdl_eintragen(w: wort; + l: integer; + var mdl: mdl_knoten); + var rechts: mdl_knoten; + begin + if isidebug=1 then begin + wterm(' =iSi=> mdl_eintragen von '); wwort(w, l); wterm_cr; + end; + if mdl = nil then begin + { new(mdl); } + mdl := malloc(sizeof(mdl_schnuller)); + mdl^.w12 := w; + mdl^.l1 := l; + mdl^.li := nil; + mdl^.re := nil + end else if mdl^.re = nil then begin + { new(mdl^.re); } + mdl^.re := malloc(sizeof(mdl_schnuller)); + mdl^.re^.w12 := w; + mdl^.re^.l1 := l; + mdl^.re^.li := nil; + mdl^.re^.re := nil; + mdl^.li := mdl^.re + end else begin + rechts := mdl^.re; + { new(mdl^.re); } + mdl^.re := malloc(sizeof(mdl_schnuller)); + mdl^.re^.w12 := w; + mdl^.re^.l1 := l; + mdl^.re^.li := nil; + mdl^.re^.re := nil; + rechts^.li := mdl^.re + end + end; + procedure mde_eintragen(w: wort; + l: integer; + var mde: mde_knoten); + var rechts: mde_knoten; + begin + if isidebug=1 then begin + wterm(' =iSi=> mde_eintragen von '); wwort(w, l); wterm_cr; + end; + if mde = nil then begin + { new(mde); } + mde := malloc(sizeof(mde_schnuller)); + mde^.w12 := w; + mde^.l1 := l; + mde^.li := nil; + mde^.re := nil + end else if mde^.re = nil then begin + { new(mde^.re); } + mde^.re := malloc(sizeof(mde_schnuller)); + mde^.re^.w12 := w; + mde^.re^.l1 := l; + mde^.re^.li := nil; + mde^.re^.re := nil; + mde^.li := mde^.re + end else begin + rechts := mde^.re; + { new(mde^.re); } + mde^.re := malloc(sizeof(mde_schnuller)); + mde^.re^.w12 := w; + mde^.re^.l1 := l; + mde^.re^.li := nil; + mde^.re^.re := nil; + rechts^.li := mde^.re + end + end; + +{iSi 920110 end} +{isi 920111 begin} + +function md_suchen (w: wort; + l: integer; + var mdb: mdb_knoten; + var tr: trennvektor): boolean; + var test: integer; +begin + if mdb = nil then begin + md_suchen := false + end else begin + test := vergl(w, l, mdb^.w12, mdb^.l1); + if test = -1 then begin + md_suchen := md_suchen(w, l, mdb^.li, tr) + end else if test = 1 then begin + md_suchen := md_suchen(w, l, mdb^.re, tr) + end else begin + tr := mdb^.tr1; + mdb^.used1 := true; + md_suchen := true + end + end +end; + +function in_use (w: wort; + l: integer; + mdb: mdb_knoten): boolean; + var test: integer; +begin + if mdb = nil then begin + wterm(' =iSi=> in_use Fehler: '); wwort(w, l); + wterm(' nicht in mdb'); wterm_cr + end else begin + test := vergl(w, l, mdb^.w12, mdb^.l1); + if test = -1 then begin + in_use := in_use(w, l, mdb^.li) + end else if test = 1 then begin + in_use := in_use(w, l, mdb^.re) + end else begin + in_use := mdb^.used1; + if isidebug=1 then begin + if mdb^.used1 then begin + wterm(' =iSi=> '); wwort(w, l); wterm(' in use'); wterm_cr + end else begin + wterm(' =iSi=> '); wwort(w, l); wterm(' not in use'); wterm_cr + end + end + end + end +end; + +procedure hsinit; + var i, j, l: integer; + tr: trennvektor; + w: wort; + temp, auswahl, schnuller: char; + neu, memkorr: boolean; +begin + + wterm_cr; wterm_cr; + repeat + wterm_ln('iSi debug Info ? [J/N]'); + read(term_in, auswahl); + schnuller := auswahl; + read_ln(term_in); + until (xord[auswahl] = 74) or (xord[auswahl] = 78) or + (xord[auswahl] = 106) or (xord[auswahl] = 110); + wterm_cr; + if (xord[auswahl] = 74) or (xord[auswahl] = 106) then begin + isidebug := 1 + end else begin + isidebug := 0 + end; + + for i := 1 to file_name_size do begin + name_of_file[i] := ' ' + end; + j := str_start[job_name]; + i := 1; + while (j < str_start[job_name+1]) and + (i < file_name_size - 4) do begin + name_of_file[i] := xchr[str_pool[j]]; + j := j+1; + i := i+1 + end; + name_of_file[i] := '.'; + name_of_file[i+1] := 'm'; + name_of_file[i+2] := 'e'; + name_of_file[i+3] := 'm'; + + if not a_open_in(hsmem,TEX_INPUT_PATH) then begin + if isidebug=1 then begin + wterm(' =iSi=> cant a_open_in '); wjob; wterm('.mem'); + wterm_cr + end + end else begin + + repeat + wterm_cr; + wterm('Sollen Fehleintr"age gel"oscht werden? [J/N]'); wterm_cr; + read(term_in, auswahl); + schnuller := auswahl; + read_ln(term_in); + until (xord[auswahl] = 74) or (xord[auswahl] = 78) or + (xord[auswahl] = 106) or (xord[auswahl] = 110); + wterm_cr; wterm_cr; + if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin + memkorr := true + end else begin + memkorr := false + end; + + while not eof(hsmem) do begin + read(hsmem, l); + read_ln(hsmem); + for i := 1 to l do begin + read(hsmem, w[i]); + end; + read_ln(hsmem); + for i := 1 to l do begin + read(hsmem, tr[i]); + end; + read_ln(hsmem); + read(hsmem, temp); + read_ln(hsmem); + if temp = xchr[116] then neu := true else neu := false; {116 = t} + if isidebug=1 then begin + wterm(' =iSi=> reading from '); wjob; wterm('.mem: '); wwort(w, l); + wterm(', neu = '); wterm(temp); wterm_cr; + end; + + if memkorr then begin + repeat + wterm_cr; + wterm('Soll '); + writewt(w, l, tr); + wterm(' gel"oscht werden? [J/N]'); wterm_cr; + read(term_in, auswahl); + schnuller := auswahl; + read_ln(term_in); + until (xord[auswahl] = 74) or (xord[auswahl] = 78) or + (xord[auswahl] = 106) or (xord[auswahl] = 110); + wterm_cr; + if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin + { nichts tun, Wort wird nicht eingetragen } + end else begin + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr); + wterm_cr + end; + mdb_eintragen(w, l, tr, neu, false {used}, mdb); + mdm_eintragen(w, l, tr, neu, mdm); + end + end else begin + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr); + wterm_cr + end; + mdb_eintragen(w, l, tr, neu, false {used}, mdb); + mdm_eintragen(w, l, tr, neu, mdm) + end + end; + if isidebug=1 then begin + wterm_cr; +{ wterm(' =iSi=> closing '); wjob; wterm('.mem'); wterm_cr; } + end; + a_close(hsmem); + end; + + repeat + wterm_cr; + wterm_ln('Sollen mehrdeutige W"orter angezeigt werden? [J/N]'); + read(term_in, auswahl); + schnuller := auswahl; + read_ln(term_in); + until (xord[auswahl] = 74) or (xord[auswahl] = 78) or + (xord[auswahl] = 106) or (xord[auswahl] = 110); + wterm_cr; + if (xord[auswahl]=74) or (xord[auswahl]=106) then begin + mehrdanz := true + end else begin + mehrdanz := false + end + +end; + +{iSi 920111 end} + +procedure abteilen (var w:wort; var tr1:trennvektor; + var alletr: trenn16; {iSi 920114} + laenge : integer; var ok:boolean; + var zerlegungen:integer); +@z + + + +@x + var + i:integer; + dud:dudt; { array [0..maxwl] of boolean; } + v:varr; + ind,k:intarr; + spv,dudstop:sperrvektor; + tr, dudtr:trennvektor; +@y + var + i:integer; + iSi_j: integer; {iSi 920114} + dud:dudt; {array [0..maxwl] of boolean; } + v:varr; + ind,k:intarr; + tr, dudtr:trennvektor; + spv,dudstop:sperrvektor; +@z + + +@x + trennen(3, 1, spv, ok, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen(3, 1, spv, ok, alletr, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + + +@x + for i:=0 to laenge do + if tr1[i]=nebenck then begin + tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- } + tr1[i-1]:=nebenck; {sprechend getrennt wird } + end; +@y + for i:=0 to laenge do + if tr1[i]=nebenck then begin + tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- } + tr1[i-1]:=nebenck; {sprechend getrennt wird } + + for iSi_j := 1 to zerlegungen do begin {iSi 920114 begin} + if (alletr[iSi_j][i] = nebenck) then begin + alletr[iSi_j][i] := keine; + alletr[iSi_j][i-1] := nebenck + end + end {iSi 920114 end} + + end; +@z + + + +@x +@ @<Finish the extensions@>= +for k:=0 to 15 do if write_open[k] then a_close(write_file[k]) +@y +@ @<Finish the extensions@>= +for k:=0 to 15 do if write_open[k] then a_close(write_file[k]); + +for hsii := 1 to file_name_size do begin + name_of_file[hsii] := ' ' +end; +hsij := str_start[job_name]; +hsii := 1; +while hsij < str_start[job_name+1] do begin + name_of_file[hsii] := xchr[str_pool[hsij]]; + hsij := hsij+1; + hsii := hsii+1 +end; +name_of_file[hsii] := '.'; +name_of_file[hsii+1] := 'm'; +name_of_file[hsii+2] := 'e'; +name_of_file[hsii+3] := 'm'; + +if not a_open_out(hsmem) then begin + wterm_ln(' =iSi=> cant a_open_out '); wjob; wterm('.mem '); + wterm_cr +end else begin +{ wterm(' =iSi=> a_open_out '); wjob; wterm('.mem '); wterm_cr; } + while mdm <> nil do begin + if in_use(mdm^.w12, mdm^.l1, mdb) then begin + if isidebug=1 then begin + wterm(' =iSi=> writing to '); wjob; wterm('.mem: '); + writewt(mdm^.w12, mdm^.l1, mdm^.tr1); wterm_cr; + end; + write_ln(hsmem, mdm^.l1); + for k := 1 to mdm^.l1 do begin + write(hsmem, mdm^.w12[k]); + end; + write_ln(hsmem); + for k := 1 to mdm^.l1 do begin + write(hsmem, mdm^.tr1[k]); + end; + write_ln(hsmem); + if mdm^.neu1 then begin + write(hsmem, xchr[116]); + write_ln(hsmem); + mdl_eintragen(mdm^.w12, mdm^.l1, mdl) + end else begin + write(hsmem, xchr[102]); + write_ln(hsmem) + end + end else begin + if isidebug=1 then begin + wterm(' =iSi=> '); wwort(mdm^.w12, mdm^.l1); + wterm(' not in use'); + wterm_cr + end + end; + mdm := mdm^.li + end; + a_close(hsmem); +{ wterm(' =iSi=> a_close '); wjob; wterm('.mem '); wterm_cr; } +end; + +for hsii := 1 to file_name_size do begin + name_of_file[hsii] := ' ' +end; +hsij := str_start[job_name]; +hsii := 1; +while hsij < str_start[job_name+1] do begin + name_of_file[hsii] := xchr[str_pool[hsij]]; + hsij := hsij+1; + hsii := hsii+1 +end; +name_of_file[hsii] := '.'; +name_of_file[hsii+1] := 'l'; +name_of_file[hsii+2] := 'e'; +name_of_file[hsii+3] := 'x'; + +if not a_open_out(hslex) then + wterm_ln(' =iSi=> cant open hslex') +else begin +{ wterm(' =iSi=> a_open_out '); wjob; wterm('.lex '); wterm_cr; } + while mdl <> nil do begin + if isidebug=1 then begin + wterm(' =iSi=> writing to '); wjob; wterm('.lex: '); + wwort(mdl^.w12, mdl^.l1); + wterm_cr + end; + write(hslex, xchr[mdl^.l1]); + for k := 1 to mdl^.l1 do begin + if mdl^.w12[k] <= 26 then begin + write(hslex, xchr[mdl^.w12[k]+96]) + end else begin + if mdl^.w12[k] = 27 then begin + write(hslex, '"a') + end else if mdl^.w12[k] = 28 then begin + write(hslex, '"o') + end else if mdl^.w12[k] = 29 then begin + write(hslex, '"u') + end else if mdl^.w12[k] = 30 then begin + write(hslex, '"s') + end else begin + write(hslex, '-') + end + end + end; + write_ln(hslex); + mdl := mdl^.li + end; + a_close(hslex); +{ wterm(' =iSi=> a_close '); wjob; wterm('.lex '); wterm_cr; } +end; + +for hsii := 1 to file_name_size do begin + name_of_file[hsii] := ' ' +end; +hsij := str_start[job_name]; +hsii := 1; +while hsij < str_start[job_name+1] do begin + name_of_file[hsii] := xchr[str_pool[hsij]]; + hsij := hsij+1; + hsii := hsii+1 +end; +name_of_file[hsii] := '.'; +name_of_file[hsii+1] := 'e'; +name_of_file[hsii+2] := 'd'; +name_of_file[hsii+3] := 't'; + +if not a_open_out(hsedt) then + wterm_ln(' =iSi=> cant open hsedt') +else begin +{ wterm(' =iSi=> a_open_out '); wjob; wterm('.edt '); wterm_cr; } + while mde <> nil do begin + if isidebug=1 then begin + wterm(' =iSi=> writing to '); wjob; wterm('.edt: '); + wwort(mde^.w12, mde^.l1); + wterm_cr + end; + for k := 1 to mde^.l1 do begin + if mde^.w12[k] <= 26 then begin + write(hsedt, xchr[mde^.w12[k]+96]) + end else begin + if mde^.w12[k] = 27 then begin + write(hsedt, '"a') + end else if mde^.w12[k] = 28 then begin + write(hsedt, '"o') + end else if mde^.w12[k] = 29 then begin + write(hsedt, '"u') + end else if mde^.w12[k] = 30 then begin + write(hsedt, '"s') + end else begin + write(hsedt, '--') + end + end + end; + write_ln(hsedt); + mde := mde^.li + end; + a_close(hsedt); +{ wterm(' =iSi=> a_close '); wjob; wterm('.edt '); wterm_cr; } +end; +@z + diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex6.c b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex6.c new file mode 100644 index 0000000000..9f42dcdf35 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex6.c @@ -0,0 +1,2013 @@ +#define EXTERN extern +#include "texd.h" + +void zpostlinebreak ( finalwidowpenalty ) +integer finalwidowpenalty ; +{/* 30 31 */ postlinebreak_regmem + halfword q, r, s ; + boolean discbreak ; + boolean postdiscbreak ; + scaled curwidth ; + scaled curindent ; + quarterword t ; + integer pen ; + halfword curline ; + q = mem [ bestbet + 1 ] .hh .v.RH ; + curp = 0 ; + do { + r = q ; + q = mem [ q + 1 ] .hh .v.LH ; + mem [ r + 1 ] .hh .v.LH = curp ; + curp = r ; + } while ( ! ( q == 0 ) ) ; + curline = curlist .pgfield + 1 ; + do { + q = mem [ curp + 1 ] .hh .v.RH ; + discbreak = false ; + postdiscbreak = false ; + if ( q != 0 ) + if ( mem [ q ] .hh.b0 == 10 ) + { + deleteglueref ( mem [ q + 1 ] .hh .v.LH ) ; + mem [ q + 1 ] .hh .v.LH = eqtb [ 10290 ] .hh .v.RH ; + mem [ q ] .hh.b1 = 9 ; + incr ( mem [ eqtb [ 10290 ] .hh .v.RH ] .hh .v.RH ) ; + goto lab30 ; + } + else { + + if ( mem [ q ] .hh.b0 == 7 ) + { + t = mem [ q ] .hh.b1 ; + if ( t == 0 ) + r = mem [ q ] .hh .v.RH ; + else { + + r = q ; + while ( t > 1 ) { + + r = mem [ r ] .hh .v.RH ; + decr ( t ) ; + } + s = mem [ r ] .hh .v.RH ; + r = mem [ s ] .hh .v.RH ; + mem [ s ] .hh .v.RH = 0 ; + flushnodelist ( mem [ q ] .hh .v.RH ) ; + mem [ q ] .hh.b1 = 0 ; + } + if ( mem [ q + 1 ] .hh .v.RH != 0 ) + { + s = mem [ q + 1 ] .hh .v.RH ; + while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; + mem [ s ] .hh .v.RH = r ; + r = mem [ q + 1 ] .hh .v.RH ; + mem [ q + 1 ] .hh .v.RH = 0 ; + postdiscbreak = true ; + } + if ( mem [ q + 1 ] .hh .v.LH != 0 ) + { + s = mem [ q + 1 ] .hh .v.LH ; + if ( mem [ s ] .hh.b0 == 12 ) + { + s = mem [ s ] .hh .v.RH ; + mem [ mem [ q + 1 ] .hh .v.LH ] .hh .v.RH = 0 ; + flushnodelist ( mem [ q + 1 ] .hh .v.LH ) ; + } + mem [ q ] .hh .v.RH = s ; + while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; + mem [ q + 1 ] .hh .v.LH = 0 ; + q = s ; + } + mem [ q ] .hh .v.RH = r ; + discbreak = true ; + } + else if ( ( mem [ q ] .hh.b0 == 9 ) || ( mem [ q ] .hh.b0 == 11 ) ) + mem [ q + 1 ] .cint = 0 ; + } + else { + + q = memtop - 3 ; + while ( mem [ q ] .hh .v.RH != 0 ) q = mem [ q ] .hh .v.RH ; + } + r = newparamglue ( 8 ) ; + mem [ r ] .hh .v.RH = mem [ q ] .hh .v.RH ; + mem [ q ] .hh .v.RH = r ; + q = r ; + lab30: ; + r = mem [ q ] .hh .v.RH ; + mem [ q ] .hh .v.RH = 0 ; + q = mem [ memtop - 3 ] .hh .v.RH ; + mem [ memtop - 3 ] .hh .v.RH = r ; + if ( eqtb [ 10289 ] .hh .v.RH != 0 ) + { + r = newparamglue ( 7 ) ; + mem [ r ] .hh .v.RH = q ; + q = r ; + } + if ( curline > lastspecialline ) + { + curwidth = secondwidth ; + curindent = secondindent ; + } + else if ( eqtb [ 10812 ] .hh .v.RH == 0 ) + { + curwidth = firstwidth ; + curindent = firstindent ; + } + else { + + curwidth = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline ] .cint ; + curindent = mem [ eqtb [ 10812 ] .hh .v.RH + 2 * curline - 1 ] .cint ; + } + adjusttail = memtop - 5 ; + justbox = hpack ( q , curwidth , 0 ) ; + mem [ justbox + 4 ] .cint = curindent ; + appendtovlist ( justbox ) ; + if ( memtop - 5 != adjusttail ) + { + mem [ curlist .tailfield ] .hh .v.RH = mem [ memtop - 5 ] .hh .v.RH ; + curlist .tailfield = adjusttail ; + } + adjusttail = 0 ; + if ( curline + 1 != bestline ) + { + pen = eqtb [ 12676 ] .cint ; + if ( curline == curlist .pgfield + 1 ) + pen = pen + eqtb [ 12668 ] .cint ; + if ( curline + 2 == bestline ) + pen = pen + finalwidowpenalty ; + if ( discbreak ) + pen = pen + eqtb [ 12671 ] .cint ; + if ( pen != 0 ) + { + r = newpenalty ( pen ) ; + mem [ curlist .tailfield ] .hh .v.RH = r ; + curlist .tailfield = r ; + } + } + incr ( curline ) ; + curp = mem [ curp + 1 ] .hh .v.LH ; + if ( curp != 0 ) + if ( ! postdiscbreak ) + { + r = memtop - 3 ; + while ( true ) { + + q = mem [ r ] .hh .v.RH ; + if ( q == mem [ curp + 1 ] .hh .v.RH ) + goto lab31 ; + if ( ( q >= himemmin ) ) + goto lab31 ; + if ( ( mem [ q ] .hh.b0 < 9 ) ) + goto lab31 ; + if ( mem [ q ] .hh.b1 == 2 ) + if ( mem [ q ] .hh.b0 == 11 ) + goto lab31 ; + r = q ; + } + lab31: if ( r != memtop - 3 ) + { + mem [ r ] .hh .v.RH = 0 ; + flushnodelist ( mem [ memtop - 3 ] .hh .v.RH ) ; + mem [ memtop - 3 ] .hh .v.RH = q ; + } + } + } while ( ! ( curp == 0 ) ) ; + if ( ( curline != bestline ) || ( mem [ memtop - 3 ] .hh .v.RH != 0 ) ) + confusion ( 935 ) ; + curlist .pgfield = bestline - 1 ; +} +smallnumber zreconstitute ( j , n , bchar , hchar ) +smallnumber j ; +smallnumber n ; +halfword bchar ; +halfword hchar ; +{/* 22 30 */ register smallnumber Result; reconstitute_regmem + halfword p ; + halfword t ; + fourquarters q ; + halfword currh ; + halfword testchar ; + scaled w ; + fontindex k ; + smallnumber ii ; + hyphenpassed = 0 ; + t = memtop - 4 ; + w = 0 ; + mem [ memtop - 4 ] .hh .v.RH = 0 ; + {register integer for_end; ii = n ; for_end = j ; if ( ii >= for_end) do + if ( dirtyumlaut [ ii ] != 0 ) + n = ii - 1 ; + while ( ii-- > for_end ) ; } + curl = hu [ j ] ; + curq = t ; + if ( j == 0 ) + { + ligaturepresent = initlig ; + p = initlist ; + if ( ligaturepresent ) + lfthit = initlft ; + while ( p > 0 ) { + + { + mem [ t ] .hh .v.RH = getavail () ; + t = mem [ t ] .hh .v.RH ; + mem [ t ] .hh.b0 = hf ; + mem [ t ] .hh.b1 = mem [ p ] .hh.b1 ; + } + p = mem [ p ] .hh .v.RH ; + } + } + else if ( curl < 256 ) + { + mem [ t ] .hh .v.RH = getavail () ; + t = mem [ t ] .hh .v.RH ; + mem [ t ] .hh.b0 = hf ; + mem [ t ] .hh.b1 = curl ; + } + ligstack = 0 ; + { + if ( j < n ) + curr = hu [ j + 1 ] ; + else curr = bchar ; + if ( hyfpen [ j ] != 10000 ) + currh = hchar ; + else currh = 256 ; + } + lab22: if ( curl == 256 ) + { + k = bcharlabel [ hf ] ; + if ( k == fontmemsize ) + goto lab30 ; + else q = fontinfo [ k ] .qqqq ; + } + else { + + q = fontinfo [ charbase [ hf ] + curl ] .qqqq ; + if ( ( ( q .b2 ) % 4 ) != 1 ) + goto lab30 ; + k = ligkernbase [ hf ] + q .b3 ; + q = fontinfo [ k ] .qqqq ; + if ( q .b0 > 128 ) + { + k = ligkernbase [ hf ] + 256 * q .b2 + q .b3 + 32768L - 256 * ( 128 ) ; + q = fontinfo [ k ] .qqqq ; + } + } + if ( currh < 256 ) + testchar = currh ; + else testchar = curr ; + while ( true ) { + + if ( q .b1 == testchar ) + if ( q .b0 <= 128 ) + if ( currh < 256 ) + { + hyphenpassed = j ; + hchar = 256 ; + currh = 256 ; + goto lab22 ; + } + else { + + if ( hchar < 256 ) + if ( hyfpen [ j ] != 10000 ) + { + hyphenpassed = j ; + hchar = 256 ; + } + if ( q .b2 < 128 ) + { + if ( curl == 256 ) + lfthit = true ; + if ( j == n ) + if ( ligstack == 0 ) + rthit = true ; + { + if ( interrupt != 0 ) + pauseforinstructions () ; + } + switch ( q .b2 ) + {case 1 : + case 5 : + { + curl = q .b3 ; + ligaturepresent = true ; + } + break ; + case 2 : + case 6 : + { + curr = q .b3 ; + if ( ligstack > 0 ) + mem [ ligstack ] .hh.b1 = curr ; + else { + + ligstack = newligitem ( curr ) ; + if ( j == n ) + bchar = 256 ; + else { + + p = getavail () ; + mem [ ligstack + 1 ] .hh .v.RH = p ; + mem [ p ] .hh.b1 = hu [ j + 1 ] ; + mem [ p ] .hh.b0 = hf ; + } + } + } + break ; + case 3 : + { + curr = q .b3 ; + p = ligstack ; + ligstack = newligitem ( curr ) ; + mem [ ligstack ] .hh .v.RH = p ; + } + break ; + case 7 : + case 11 : + { + if ( ligaturepresent ) + { + p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ; + if ( lfthit ) + { + mem [ p ] .hh.b1 = 2 ; + lfthit = false ; + } + if ( false ) + if ( ligstack == 0 ) + { + incr ( mem [ p ] .hh.b1 ) ; + rthit = false ; + } + mem [ curq ] .hh .v.RH = p ; + t = p ; + ligaturepresent = false ; + } + curq = t ; + curl = q .b3 ; + ligaturepresent = true ; + } + break ; + default: + { + curl = q .b3 ; + ligaturepresent = true ; + if ( ligstack > 0 ) + { + if ( mem [ ligstack + 1 ] .hh .v.RH > 0 ) + { + mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ; + t = mem [ t ] .hh .v.RH ; + incr ( j ) ; + } + p = ligstack ; + ligstack = mem [ p ] .hh .v.RH ; + freenode ( p , 2 ) ; + if ( ligstack == 0 ) + { + if ( j < n ) + curr = hu [ j + 1 ] ; + else curr = bchar ; + if ( hyfpen [ j ] != 10000 ) + currh = hchar ; + else currh = 256 ; + } + else curr = mem [ ligstack ] .hh.b1 ; + } + else if ( j == n ) + goto lab30 ; + else { + + { + mem [ t ] .hh .v.RH = getavail () ; + t = mem [ t ] .hh .v.RH ; + mem [ t ] .hh.b0 = hf ; + mem [ t ] .hh.b1 = curr ; + } + incr ( j ) ; + { + if ( j < n ) + curr = hu [ j + 1 ] ; + else curr = bchar ; + if ( hyfpen [ j ] != 10000 ) + currh = hchar ; + else currh = 256 ; + } + } + } + break ; + } + if ( q .b2 > 4 ) + if ( q .b2 != 7 ) + goto lab30 ; + goto lab22 ; + } + w = fontinfo [ kernbase [ hf ] + 256 * q .b2 + q .b3 ] .cint ; + goto lab30 ; + } + if ( q .b0 >= 128 ) + if ( currh == 256 ) + goto lab30 ; + else { + + currh = 256 ; + goto lab22 ; + } + k = k + q .b0 + 1 ; + q = fontinfo [ k ] .qqqq ; + } + lab30: ; + if ( ligaturepresent ) + { + p = newligature ( hf , curl , mem [ curq ] .hh .v.RH ) ; + if ( lfthit ) + { + mem [ p ] .hh.b1 = 2 ; + lfthit = false ; + } + if ( rthit ) + if ( ligstack == 0 ) + { + incr ( mem [ p ] .hh.b1 ) ; + rthit = false ; + } + mem [ curq ] .hh .v.RH = p ; + t = p ; + ligaturepresent = false ; + } + if ( w != 0 ) + { + mem [ t ] .hh .v.RH = newkern ( w ) ; + t = mem [ t ] .hh .v.RH ; + w = 0 ; + } + if ( ligstack > 0 ) + { + curq = t ; + curl = mem [ ligstack ] .hh.b1 ; + ligaturepresent = true ; + { + if ( mem [ ligstack + 1 ] .hh .v.RH > 0 ) + { + mem [ t ] .hh .v.RH = mem [ ligstack + 1 ] .hh .v.RH ; + t = mem [ t ] .hh .v.RH ; + incr ( j ) ; + } + p = ligstack ; + ligstack = mem [ p ] .hh .v.RH ; + freenode ( p , 2 ) ; + if ( ligstack == 0 ) + { + if ( j < n ) + curr = hu [ j + 1 ] ; + else curr = bchar ; + if ( hyfpen [ j ] != 10000 ) + currh = hchar ; + else currh = 256 ; + } + else curr = mem [ ligstack ] .hh.b1 ; + } + goto lab22 ; + } + Result = j ; + return(Result) ; +} +void zhashfunk ( w , anfang , ende , v , ind , k ) +wort w ; +integer anfang ; +integer ende ; +varr v ; +intarr ind ; +intarr k ; +{hashfunk_regmem + long vacc, indacc, kacc ; + integer i ; + vacc = 31415L ; + indacc = 152L ; + kacc = 271L ; + {register integer for_end; i = anfang ; for_end = ende ; if ( i <= for_end) + do + { + ; + vacc = ( vacc * 31 + w [ i ] ) % 8388648L ; + v [ i ] = vacc ; + indacc = ( indacc * 33 + w [ i ] ) % ( tabsize + 1 ) ; + ind [ i ] = indacc ; + kacc = ( kacc * 15 + w [ i ] ) % ( ( tabsize + 1 ) / 2 ) ; + k [ i ] = 2 * kacc + 1 ; + } + while ( i++ < for_end ) ; } +} +void zunpackinfo ( b , iausnahme , iuntrennbar , ierste , izweite , iendung , +ivorsilbe , istamm , iehervor , istammallein ) +infobyte b ; +boolean * iausnahme ; +boolean * iuntrennbar ; +integer * ierste ; +integer * izweite ; +boolean * iendung ; +boolean * ivorsilbe ; +boolean * istamm ; +boolean * iehervor ; +boolean * istammallein ; +{unpackinfo_regmem + if ( odd ( b ) ) + { +(* iausnahme )= true ; + b = b / 2 ; + if ( odd ( b ) ) +(* iuntrennbar )= true ; + else (*iuntrennbar )= false ; + b = b / 2 ; +(* ierste )= b % 8 ; +(* izweite )= b / 8 ; + } + else { + +(* iausnahme )= false ; + b = b / 2 ; + if ( odd ( b ) ) +(* iendung )= true ; + else (*iendung )= false ; + b = b / 2 ; + if ( odd ( b ) ) +(* ivorsilbe )= true ; + else (*ivorsilbe )= false ; + b = b / 2 ; + if ( odd ( b ) ) +(* istamm )= true ; + else (*istamm )= false ; + b = b / 2 ; + if ( odd ( b ) ) +(* iehervor )= true ; + else (*iehervor )= false ; + b = b / 2 ; + if ( odd ( b ) ) +(* istammallein )= true ; + else (*istammallein )= false ; + } +} +void zunpackentry ( h , etabv , etabb , efrei , ewiederfrei ) +hashelement h ; +verdschlue * etabv ; +infobyte * etabb ; +boolean * efrei ; +boolean * ewiederfrei ; +{unpackentry_regmem + ; +(* etabv )= h [ 0 ] + h [ 1 ] * 256 + h [ 2 ] * 256 * 256 ; + if ( odd ( h [ 3 ] ) ) + { + ; +(* etabb )= h [ 3 ] ; +(* efrei )= false ; +(* ewiederfrei )= false ; + } + else { + + ; +(* etabb )= h [ 3 ] % 64 ; + if ( odd ( h [ 3 ] / 64 ) ) +(* efrei )= true ; + else (*efrei )= false ; + if ( odd ( h [ 3 ] / 128 ) ) +(* ewiederfrei )= true ; + else (*ewiederfrei )= false ; + } +} +void zhashsuch ( v , ind , k , iausnahme , iuntrennbar , ierste , izweite , +iendung , ivorsilbe , istamm , iehervor , istammallein , g ) +verdschlue v ; +integer ind ; +integer k ; +boolean * iausnahme ; +boolean * iuntrennbar ; +integer * ierste ; +integer * izweite ; +boolean * iendung ; +boolean * ivorsilbe ; +boolean * istamm ; +boolean * iehervor ; +boolean * istammallein ; +boolean * g ; +{hashsuch_regmem + boolean gef, ngef ; + integer j ; + tableentry entry ; + gef = false ; + ngef = false ; + j = ind ; + do { + unpackentry ( htab [ j ] , entry .tabv , entry .tabb , entry .frei , + entry .wiederfrei ) ; + if ( entry .frei ) + ngef = true ; + else if ( ( v == entry .tabv ) && ! entry .wiederfrei ) + { + unpackinfo ( entry .tabb , (*iausnahme ), (*iuntrennbar ), (*ierste ), (*izweite ), (* + iendung ), (*ivorsilbe ), (*istamm ), (*iehervor ), (*istammallein )) ; + gef = true ; + } + else j = ( j + k ) % ( tabsize + 1 ) ; + } while ( ! ( gef || ngef ) ) ; +(* g )= gef ; +} +void zhashload ( status ) +integer * status ; +{hashload_regmem + integer i ; + tableentry e ; + {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <= + for_end) do + nameoffile [ i ] = ' ' ; + while ( i++ < for_end ) ; } + nameoffile [ 1 ] = 'h' ; + nameoffile [ 2 ] = 'f' ; + nameoffile [ 3 ] = '3' ; + namelength = 3 ; + anzahl = 0 ; + if ( aopenin ( hashfile , TEXINPUTPATH ) ) + { + {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end) + do + { + int help; + fscanf ( hashfile, "%d", &help ); + htab [i][0] = (eightbits) help; + fscanf ( hashfile, "%d", &help ); + htab [i][1] = (eightbits) help; + fscanf ( hashfile, "%d", &help ); + htab [i][2] = (eightbits) help; + fscanf ( hashfile, "%d", &help ); + htab [i][3] = (eightbits) help; + unpackentry ( htab [ i ] , e .tabv , e .tabb , e .frei , e .wiederfrei + ) ; + if ( ! e .frei && ! e .wiederfrei ) + anzahl = anzahl + 1 ; + } + while ( i++ < for_end ) ; } +(* status )= 0 ; + aclose ( hashfile ) ; + } + else (*status )= 1 ; +} +void zpackinfo ( i , b ) +infotype i ; +infobyte * b ; +{packinfo_regmem +(* b )= 0 ; + if ( i .ausnahme ) + { + ; + if ( i .untrennbar ) + ; + else ; +(* b )= 1 + 2 * ord ( i .untrennbar ) + 4 * i .erste + 32 * i .zweite ; + } + else { + + ; +(* b )= 2 * ord ( i .endung ) + 4 * ord ( i .vorsilbe ) + 8 * ord ( i .stamm ) + + 16 * ord ( i .ehervor ) + 32 * ord ( i .stammallein ) ; + } +} +void zpackentry ( e , h ) +tableentry e ; +hashelement h ; +{packentry_regmem + ; + h [ 0 ] = e .tabv % 256 ; + e .tabv = e .tabv / 256 ; + h [ 1 ] = e .tabv % 256 ; + h [ 2 ] = e .tabv / 256 ; + if ( odd ( e .tabb ) ) + h [ 3 ] = e .tabb ; + else { + + ; + h [ 3 ] = e .tabb + 64 * ord ( e .frei ) + 128 * ord ( e .wiederfrei ) ; + } +} +void zhashetr ( w , laenge , i , g ) +wort w ; +integer laenge ; +infotype i ; +boolean * g ; +{hashetr_regmem + varr v1 ; + intarr ind1, k1 ; + verdschlue v ; + integer ind, k, j, e ; + boolean gef, ngef ; + tableentry entry ; + hashelement helem ; + if ( anzahl >= tabsize ) + { + ; +(* g )= false ; + } + else { + + ; + if ( ( anzahl < 10 ) || ( anzahl % 100 == 0 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s", " -Anzahl:" , (long)anzahl , ". " ) ; + } + } + hashfunk ( w , 1 , laenge , v1 , ind1 , k1 ) ; + v = v1 [ laenge ] ; + ind = ind1 [ laenge ] ; + k = k1 [ laenge ] ; + gef = false ; + ngef = false ; + do { + ; + unpackentry ( htab [ ind ] , entry .tabv , entry .tabb , entry .frei , + entry .wiederfrei ) ; + if ( entry .frei || entry .wiederfrei ) + { + anzahl = anzahl + 1 ; + ngef = true ; + entry .tabv = v ; + packinfo ( i , entry .tabb ) ; + entry .frei = false ; + entry .wiederfrei = false ; + packentry ( entry , helem ) ; + memcpy((void *)htab [ ind ] , (void *)helem , sizeof(hashelement)); + } + else { + + ; + gef = v == entry .tabv ; + if ( ! gef ) + ind = ( ind + k ) % ( tabsize + 1 ) ; + } + } while ( ! ( gef || ngef ) ) ; +(* g )= ngef ; + } +} +void hashempty ( ) +{hashempty_regmem + integer i ; + tableentry elem ; + hashelement he ; + elem .tabv = 0 ; + elem .tabb = 0 ; + elem .frei = true ; + elem .wiederfrei = false ; + packentry ( elem , he ) ; + {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end) + do + memcpy((void *)htab [ i ] , (void *)he, sizeof(hashelement)); + while ( i++ < for_end ) ; } + anzahl = 0 ; +} +void zhashsave ( status ) +integer * status ; +{hashsave_regmem + integer i ; + {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <= + for_end) do + nameoffile [ i ] = ' ' ; + while ( i++ < for_end ) ; } + nameoffile [ 1 ] = 'h' ; + nameoffile [ 2 ] = 'f' ; + nameoffile [ 3 ] = '3' ; + namelength = 3 ; + if ( aopenout ( hashfile ) ) + { + {register integer for_end; i = 0 ; for_end = tabsize ; if ( i <= for_end) + do + { + (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 0 ] ) ; + (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 1 ] ) ; + (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 2 ] ) ; + (void) fprintf( hashfile , "%4ld", (long)htab [ i ] [ 3 ] ) ; + (void) putc('\n', hashfile ); + } + while ( i++ < for_end ) ; } +(* status )= 0 ; + aclose ( hashfile ) ; + } + else (*status )= 1 ; +} +integer hashsize ( ) +{register integer Result; hashsize_regmem + Result = anzahl ; + return(Result) ; +} +void zzahl ( line , i , ende , j ) +string80 line ; +integer * i ; +integer ende ; +integer * j ; +{zahl_regmem + boolean aus ; +(* j )= 0 ; + do { + if ( (*i )<= ende ) + if ( ktab [ line [ (*i )] ] == 46 ) +(* i )= (*i )+ 1 ; + else aus = true ; + else aus = true ; + } while ( ! ( aus ) ) ; + do { + if ( (*i )<= ende ) + { + switch ( line [ (*i )] ) + {case 48 : + case 49 : + case 50 : + case 51 : + case 52 : + case 53 : + case 54 : + case 55 : + case 56 : + case 57 : + { +(* j )= 10 * (*j )+ line [ (*i )] - 48 ; +(* i )= (*i )+ 1 ; + } + break ; + } + if ( ( line [ (*i )] != 48 ) && ( line [ (*i )] != 49 ) && ( line [ (*i )] != 50 + ) && ( line [ (*i )] != 51 ) && ( line [ (*i )] != 52 ) && ( line [ (*i )] != 53 + ) && ( line [ (*i )] != 54 ) && ( line [ (*i )] != 55 ) && ( line [ (*i )] != 56 + ) && ( line [ (*i )] != 57 ) ) + aus = true ; + } + else aus = true ; + } while ( ! ( aus ) ) ; +} +void zinfobau ( line , anfang , ende , informausnahme , informuntrennbar , +informerste , informzweite , informendung , informvorsilbe , informstamm , +informehervor , informstammallein , g ) +string80 line ; +integer anfang ; +integer ende ; +boolean * informausnahme ; +boolean * informuntrennbar ; +integer * informerste ; +integer * informzweite ; +boolean * informendung ; +boolean * informvorsilbe ; +boolean * informstamm ; +boolean * informehervor ; +boolean * informstammallein ; +boolean * g ; +{infobau_regmem + integer i, j ; + boolean ok, fehler ; + buchstabe b ; +(* g )= false ; +(* informausnahme )= false ; +(* informendung )= false ; +(* informvorsilbe )= false ; +(* informehervor )= false ; +(* informstamm )= false ; +(* informstammallein )= false ; + i = anfang ; + ok = false ; + fehler = false ; + do { + if ( i <= ende ) + if ( line [ i ] == 46 ) + i = i + 1 ; + else ok = true ; + else fehler = true ; + } while ( ! ( ok || fehler ) ) ; + if ( ! fehler ) + { + b = ktab [ line [ i ] ] ; + if ( b == bsta ) + { +(* informausnahme )= true ; + i = i + 1 ; + if ( ktab [ line [ i ] ] == bstu ) + { + i = i + 1 ; +(* informuntrennbar )= true ; + } + else (*informuntrennbar )= false ; + zahl ( line , i , ende , j ) ; + if ( j == 0 ) + { +(* informerste )= 7 ; +(* informzweite )= 7 ; + } + else { + + j = j - 2 ; + if ( ( j >= 0 ) && ( j <= 6 ) ) +(* informerste )= j ; + else fehler = true ; + zahl ( line , i , ende , j ) ; + if ( j == 0 ) +(* informzweite )= 7 ; + else { + + j = j - (*informerste )- 4 ; + if ( ( j >= 0 ) && ( j <= 6 ) ) +(* informzweite )= j ; + else fehler = true ; + } + } + if ( ! fehler ) +(* g )= true ; + } + else { + + ok = false ; + do { + switch ( b ) + {case 22 : +(* informvorsilbe )= true ; + break ; + case 5 : +(* informendung )= true ; + break ; + case 19 : +(* informstamm )= true ; + break ; + case 2 : +(* informehervor )= true ; + break ; + case 20 : +(* informstammallein )= true ; + break ; + case 31 : + ; + break ; + default: + fehler = true ; + break ; + } + if ( i == ende ) + ok = true ; + else { + + i = i + 1 ; + b = ktab [ line [ i ] ] ; + } + } while ( ! ( ok || fehler ) ) ; + if ( ! fehler ) +(* g )= ( (*informvorsilbe )|| (*informendung )|| (*informstamm )) && ( ! (* + informehervor )|| (*informvorsilbe )&& (*informendung )) && ( ! (* + informstammallein )|| (*informstamm )) ; + } + } +} +void zeintragen ( line , l ) +string80 line ; +integer l ; +{eintragen_regmem + integer i, laenge ; + infotype inform ; + wort w ; + boolean g ; + laenge = 1 ; + while ( line [ laenge ] != 46 ) laenge = laenge + 1 ; + laenge = laenge - 1 ; + if ( laenge >= 1 ) + { + if ( laenge <= maxwl ) + { + infobau ( line , laenge + 1 , l , inform .ausnahme , inform .untrennbar + , inform .erste , inform .zweite , inform .endung , inform .vorsilbe , + inform .stamm , inform .ehervor , inform .stammallein , g ) ; + if ( ! g ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " Info falsch: " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " Info falsch: " ) ; + } + } + else { + + {register integer for_end; i = 1 ; for_end = laenge ; if ( i <= + for_end) do + w [ i ] = ktab [ line [ i ] ] ; + while ( i++ < for_end ) ; } + hashetr ( w , laenge , inform , g ) ; + if ( ! g ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " Tabellenfehler: " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " Tabellenfehler: " ) ; + } + } + } + if ( ! g ) + { + {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) + do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( line [ i ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( line [ i ] ) , logfile ); + } + while ( i++ < for_end ) ; } + println () ; + } + } + else { + + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", " zu langes Wort: " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", " zu langes Wort: " ) ; + } + {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( line [ i ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( line [ i ] ) , logfile ); + } + while ( i++ < for_end ) ; } + println () ; + } + } + else { + + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", " Falsche Zeile: " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", " Falsche Zeile: " ) ; + } + {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( line [ i ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( line [ i ] ) , logfile ); + } + while ( i++ < for_end ) ; } + println () ; + } +} +void znaechsterbst ( i , tr , dudstop , b , w ) +integer * i ; +trennvektor tr ; +sperrvektor dudstop ; +buchstabe * b ; +wort w ; +{naechsterbst_regmem + if ( ( (*i )> 0 ) && ( tr [ (*i )] == keine ) && ! dudstop [ (*i )] ) + { +(* b )= w [ (*i )] ; +(* i )= (*i )- 1 ; + } + else (*b )= trennzeichen ; +} +void zduden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , zerlegungen +) +trennvektor tr ; +wort w ; +trennvektor tr1 ; +trennvektor dudtr ; +dudt dud ; +sperrvektor dudstop ; +integer laenge ; +boolean * ok ; +integer * zerlegungen ; +{duden_regmem + integer i ; + integer j ; + integer zust ; + boolean aus ; + integer tre ; + integer letzte ; + integer l, lalt ; + buchstabe b ; + i = laenge ; + {register integer for_end; j = 0 ; for_end = laenge ; if ( j <= for_end) do + dudtr [ j ] = tr [ j ] ; + while ( j++ < for_end ) ; } + while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ; + while ( i > 0 ) { + + zust = 1 ; + aus = false ; + letzte = 0 ; + l = kons ; + b = w [ i ] ; + i = i - 1 ; + do { + { + tre = i + 1 ; + lalt = l ; + switch ( b ) + {case 1 : + { + l = voka ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 15 : + { + l = voko ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 29 : + { + l = vokue ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 28 : + { + l = vokoe ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 27 : + { + l = vokae ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 5 : + { + l = voke ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bsti ) + { + l = vokie ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bste ) + { + i = i + 1 ; + l = voke ; + b = bsti ; + } + } + } + break ; + case 9 : + { + l = voki ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bste ) + { + l = vokei ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bsta ) + { + l = vokai ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + } + break ; + case 21 : + { + l = voku ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bste ) + { + l = vokeu ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bsta ) + { + l = vokau ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bstae ) + { + l = vokaeu ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bstq ) + { + l = kons ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + } + break ; + case 20 : + { + l = kons ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bsts ) + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 8 : + { + l = kons ; + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bstc ) + { + naechsterbst ( i , tr , dudstop , b , w ) ; + if ( b == bsts ) + naechsterbst ( i , tr , dudstop , b , w ) ; + } + else if ( b == bstp ) + naechsterbst ( i , tr , dudstop , b , w ) ; + else if ( b == bstt ) + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 2 : + case 3 : + case 4 : + case 6 : + case 7 : + case 10 : + case 11 : + case 12 : + case 13 : + case 14 : + case 16 : + case 17 : + case 18 : + case 19 : + case 22 : + case 23 : + case 24 : + case 26 : + case 30 : + { + l = kons ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 25 : + { + l = voky ; + naechsterbst ( i , tr , dudstop , b , w ) ; + } + break ; + case 31 : + case 0 : + aus = true ; + break ; + } + } + if ( ! aus ) + switch ( zust ) + {case 1 : + if ( l == kons ) + zust = 2 ; + else zust = 4 ; + break ; + case 2 : + if ( l != kons ) + zust = 3 ; + break ; + case 3 : + if ( l == kons ) + zust = 6 ; + else if ( l != lalt ) + { + zust = 4 ; + letzte = tre ; + dudtr [ letzte ] = neben ; + } + break ; + case 4 : + if ( l == kons ) + zust = 6 ; + else zust = 3 ; + break ; + case 6 : + if ( l == kons ) + { + zust = 2 ; + letzte = tre ; + if ( ( w [ tre ] == bstc ) && ( w [ tre + 1 ] == bstk ) ) + dudtr [ letzte ] = nebenck ; + else dudtr [ letzte ] = neben ; + } + else { + + zust = 4 ; + letzte = tre ; + dudtr [ letzte ] = neben ; + } + break ; + } + } while ( ! ( aus ) ) ; + if ( zust == 2 ) + dudtr [ letzte ] = keine ; + else if ( zust == 4 ) + if ( ( lalt < vokie ) || ( lalt > vokeu ) ) + dudtr [ letzte ] = keine ; + while ( ( i > 0 ) && ! dud [ i ] ) i = i - 1 ; + } +} +void ztrennen ( zustand , anfang , spv , ok1 , alletr , tr , dudtr , +zerlegungen , dud , v , ind , k , dudstop , w , tr1 , laenge ) +integer zustand ; +integer anfang ; +sperrvektor spv ; +boolean * ok1 ; +trenn16 alletr ; +trennvektor tr ; +trennvektor dudtr ; +integer * zerlegungen ; +dudt dud ; +varr v ; +intarr ind ; +intarr k ; +sperrvektor dudstop ; +wort w ; +trennvektor tr1 ; +integer laenge ; +{trennen_regmem + boolean gef, nichtok ; + integer schnitt ; + infotype inform ; + integer i ; + boolean okstamm, okvor, okend, okhelp ; + integer tri ; + integer i1, tre ; + boolean ok ; + integer stopptr ; + sperrvektor spvtmp ; + trennvektor trlast ; + memcpy((void *)spvtmp, (void *)spv, sizeof(sperrvektor)) ; +(* ok1 )= false ; + if ( anfang == laenge + 1 ) + if ( ( zustand == 2 ) || ( zustand == 4 ) ) + { + dud [ anfang - 1 ] = true ; + duden ( tr , w , tr1 , dudtr , dud , dudstop , laenge , ok , (*zerlegungen )) + ; + {register integer for_end; i = laenge ; for_end = 1 ; if ( i >= for_end) + do + { + if ( dudtr [ i - 1 ] == haupt3 ) + { + dudtr [ i - 1 ] = keine ; + tri = haupt3 ; + } + else tri = dudtr [ i ] ; + if ( (*zerlegungen )== 0 ) + tr1 [ i ] = tri ; + else tr1 [ i ] = kombtab [ tr1 [ i ] ][ tri ] ; + trlast [ i ] = tri ; + } + while ( i-- > for_end ) ; } +(* zerlegungen )= (*zerlegungen )+ 1 ; + memcpy((void *)alletr[(*zerlegungen)],(void *)trlast,sizeof(trennvektor)); +(* ok1 )= true ; + } + else ; + else { + + hashfunk ( w , anfang , laenge , v , ind , k ) ; + schnitt = laenge ; + nichtok = false ; + do { + do { if ( spv [ schnitt ] ) + gef = false ; + else { + + hashsuch ( v [ schnitt ] , ind [ schnitt ] , k [ schnitt ] , inform + .ausnahme , inform .untrennbar , inform .erste , inform .zweite , + inform .endung , inform .vorsilbe , inform .stamm , inform .ehervor + , inform .stammallein , gef ) ; + } + if ( gef ) + spv [ schnitt ] = true ; + else schnitt = schnitt - 1 ; + } while ( ! ( gef || ( schnitt == anfang - 1 ) ) ) ; + if ( gef ) + { + if ( ! inform .ausnahme ) + { + if ( inform .endung && ( zustand == 2 ) ) + { + okend = false ; + if ( ( w [ anfang ] == bstc ) || ( w [ anfang ] == bsth ) ) + { + dud [ anfang - 1 ] = true ; + tr [ anfang - 1 ] = neben ; + } + if ( schnitt < laenge ) + if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] ) + { + spv [ schnitt + 1 ] = true ; + trennen ( 2 , schnitt + 2 , spv , okhelp , alletr , tr , dudtr , (* + zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okend = okhelp ; + } + trennen ( 2 , schnitt + 1 , spv , okhelp , alletr , tr , dudtr , (* + zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okend = okend || okhelp ; + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; +(* ok1 )= (*ok1 )|| okend ; + } + else okend = false ; + if ( inform .vorsilbe ) + { + if ( zustand == 1 ) + tr [ anfang - 1 ] = neben ; + else { + + dud [ anfang - 1 ] = true ; + if ( zustand == 5 ) + tr [ anfang - 1 ] = haupt3 ; + else tr [ anfang - 1 ] = haupt ; + } + dud [ schnitt ] = true ; + trennen ( 1 , schnitt + 1 , spv , okvor , alletr , tr , dudtr , (* + zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; + dud [ schnitt ] = false ; +(* ok1 )= (*ok1 )|| okvor ; + } + else okvor = false ; + if ( inform .stamm && ! okvor ) + { + if ( ! inform .stammallein ) + { + okstamm = false ; + stopptr = 0 ; + if ( zustand == 1 ) + tr [ anfang - 1 ] = neben ; + else { + + dud [ anfang - 1 ] = true ; + if ( zustand == 5 ) + tr [ anfang - 1 ] = haupt3 ; + else tr [ anfang - 1 ] = haupt ; + } + if ( inform .ausnahme ) + { + if ( inform .erste != 7 ) + { + tre = anfang + inform .erste + 1 ; + tr [ tre ] = neben ; + if ( inform .zweite != 7 ) + { + tre = tre + inform .zweite + 2 ; + if ( inform .untrennbar ) + { + stopptr = tre ; + dudstop [ stopptr ] = true ; + } + else tr [ tre ] = neben ; + } + else { + + if ( inform .untrennbar ) + { + tr [ tre ] = keine ; + stopptr = tre ; + dudstop [ tre ] = true ; + } + } + } + else { + + stopptr = schnitt - 1 ; + dudstop [ stopptr ] = true ; + } + } + if ( schnitt < laenge ) + if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] ) + { + spv [ schnitt + 1 ] = true ; + trennen ( 2 , schnitt + 2 , spv , okhelp , alletr , tr , dudtr + , (*zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge + ) ; + okstamm = okhelp ; + } + if ( ( schnitt >= 2 ) && ( schnitt < laenge ) ) + if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt + + 1 ] ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) ) + { + trennen ( 5 , schnitt , spv , okhelp , alletr , tr , dudtr , (* + zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) + ; + okstamm = okstamm || okhelp ; + } + trennen ( 2 , schnitt + 1 , spv , okhelp , alletr , tr , dudtr , (* + zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okstamm = okstamm || okhelp ; + if ( inform .ausnahme ) + {register integer for_end; i1 = anfang - 1 ; for_end = schnitt + ; if ( i1 <= for_end) do + { + tr [ i1 ] = keine ; + dud [ i1 ] = false ; + dudstop [ stopptr ] = false ; + } + while ( i1++ < for_end ) ; } + else { + + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; + } +(* ok1 )= (*ok1 )|| okstamm ; + } + else if ( ( anfang == 1 ) && ( schnitt == laenge ) ) + { + dud [ anfang - 1 ] = true ; + tr [ anfang - 1 ] = haupt ; + trennen ( 4 , schnitt + 1 , spv , okstamm , alletr , tr , dudtr + , (*zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) + ; + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; +(* ok1 )= (*ok1 )|| okstamm ; + } + } + } + else { + + okstamm = false ; + stopptr = 0 ; + if ( zustand == 1 ) + tr [ anfang - 1 ] = neben ; + else { + + dud [ anfang - 1 ] = true ; + if ( zustand == 5 ) + tr [ anfang - 1 ] = haupt3 ; + else tr [ anfang - 1 ] = haupt ; + } + if ( inform .ausnahme ) + { + if ( inform .erste != 7 ) + { + tre = anfang + inform .erste + 1 ; + tr [ tre ] = neben ; + if ( inform .zweite != 7 ) + { + tre = tre + inform .zweite + 2 ; + if ( inform .untrennbar ) + { + stopptr = tre ; + dudstop [ stopptr ] = true ; + } + else tr [ tre ] = neben ; + } + else { + + if ( inform .untrennbar ) + { + tr [ tre ] = keine ; + stopptr = tre ; + dudstop [ tre ] = true ; + } + } + } + else { + + stopptr = schnitt - 1 ; + dudstop [ stopptr ] = true ; + } + } + if ( schnitt < laenge ) + if ( ( w [ schnitt + 1 ] == bsts ) && ! spv [ schnitt + 1 ] ) + { + spv [ schnitt + 1 ] = true ; + trennen ( 2 , schnitt + 2 , spv , okhelp , alletr , tr , dudtr , (* + zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okstamm = okhelp ; + } + if ( ( schnitt >= 2 ) && ( schnitt < laenge ) ) + if ( konsonant [ w [ schnitt ] ] && ! konsonant [ w [ schnitt + 1 ] + ] && ( w [ schnitt ] == w [ schnitt - 1 ] ) ) + { + trennen ( 5 , schnitt , spv , okhelp , alletr , tr , dudtr , (* + zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okstamm = okstamm || okhelp ; + } + trennen ( 2 , schnitt + 1 , spv , okhelp , alletr , tr , dudtr , (* + zerlegungen ), dud , v , ind , k , dudstop , w , tr1 , laenge ) ; + okstamm = okstamm || okhelp ; + if ( inform .ausnahme ) + {register integer for_end; i1 = anfang - 1 ; for_end = schnitt + ; if ( i1 <= for_end) do + { + tr [ i1 ] = keine ; + dud [ i1 ] = false ; + dudstop [ stopptr ] = false ; + } + while ( i1++ < for_end ) ; } + else { + + tr [ anfang - 1 ] = keine ; + dud [ anfang - 1 ] = false ; + } +(* ok1 )= (*ok1 )|| okstamm ; + } + schnitt = schnitt - 1 ; + nichtok = schnitt == anfang - 1 ; + } + else nichtok = true ; + } while ( ! ( nichtok ) ) ; + } + memcpy((void *)spv, (void *)spvtmp, sizeof(sperrvektor)) ; +} +void zwchar ( c ) +halfword c ; +{wchar_regmem + if ( c == 27 ) + { + (void) Fputs( stdout , "\"a" ) ; + } + else if ( c == 28 ) + { + (void) Fputs( stdout , "\"o" ) ; + } + else if ( c == 29 ) + { + (void) Fputs( stdout , "\"u" ) ; + } + else if ( c == 30 ) + { + (void) Fputs( stdout , "\"s" ) ; + } + else { + + (void) putc( Xchr ( c + 96 ) , stdout ); + } +} +void zwwort ( w , l ) +wort w ; +integer l ; +{wwort_regmem + integer i ; + {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do + { + wchar ( w [ i ] ) ; + } + while ( i++ < for_end ) ; } +} +void zwritewt ( w , l , tr ) +wort w ; +integer l ; +trennvektor tr ; +{writewt_regmem + integer i ; + wchar ( w [ 1 ] ) ; + {register integer for_end; i = 2 ; for_end = l - 1 ; if ( i <= for_end) do + { + if ( ( tr [ i - 1 ] == nebenck ) ) + { + (void) putc( 'k' , stdout ); + (void) putc( '-' , stdout ); + } + else if ( ( tr [ i ] == haupt3 ) ) + { + (void) putc( Xchr ( w [ i ] + 96 ) , stdout ); + (void) putc( '=' , stdout ); + (void) putc( Xchr ( w [ i ] + 96 ) , stdout ); + } + else if ( ( tr [ i ] == haupt ) ) + { + wchar ( w [ i ] ) ; + (void) putc( '=' , stdout ); + } + else if ( ( tr [ i ] == neben ) ) + { + wchar ( w [ i ] ) ; + (void) putc( '-' , stdout ); + } + else { + + wchar ( w [ i ] ) ; + } + } + while ( i++ < for_end ) ; } + wchar ( w [ l ] ) ; +} +void wjob ( ) +{wjob_regmem + integer i ; + {register integer for_end; i = strstart [ jobname ] ; for_end = strstart [ + jobname + 1 ] - 1 ; if ( i <= for_end) do + { + (void) putc( Xchr ( strpool [ i ] ) , stdout ); + } + while ( i++ < for_end ) ; } +} +integer zvergl ( wrt1 , l1 , wrt2 , l2 ) +wort wrt1 ; +integer l1 ; +wort wrt2 ; +integer l2 ; +{/* 99 */ register integer Result; vergl_regmem + integer i ; + i = 1 ; + while ( ( i <= l1 ) && ( i <= l2 ) ) { + + if ( wrt1 [ i ] < wrt2 [ i ] ) + { + Result = -1 ; + goto lab99 ; + } + else if ( wrt1 [ i ] > wrt2 [ i ] ) + { + Result = 1 ; + goto lab99 ; + } + i = i + 1 ; + } + if ( l1 < l2 ) + { + Result = -1 ; + goto lab99 ; + } + else if ( l1 > l2 ) + { + Result = 1 ; + goto lab99 ; + } + else { + + Result = 0 ; + goto lab99 ; + } + lab99: ; + return(Result) ; +} +void zgleicheweg ( alletr , zerleg , laenge ) +trenn16 alletr ; +integer * zerleg ; +integer laenge ; +{gleicheweg_regmem + integer i, j, k ; + boolean gleich ; + i = 1 ; + do { + j = i + 1 ; + do { + gleich = true ; + k = 1 ; + do { + if ( alletr [ i ] [ k ] == alletr [ j ] [ k ] ) + { + k = k + 1 ; + } + else { + + gleich = false ; + } + } while ( ! ( ( k > laenge ) || ( gleich == false ) ) ) ; + if ( gleich ) + { + {register integer for_end; k = j ; for_end = (*zerleg )- 1 ; if ( k <= + for_end) do + { + memcpy((void *)alletr[k],(void *)alletr[k+1],sizeof(trennvektor)); + } + while ( k++ < for_end ) ; } +(* zerleg )= (*zerleg )- 1 ; + } + else { + + j = j + 1 ; + } + } while ( ! ( j > (*zerleg )) ) ; + i = i + 1 ; + } while ( ! ( i > (*zerleg )- 1 ) ) ; +} +void zmdbeintragen ( w , l , tr , neu , used , mdb ) +wort w ; +integer l ; +trennvektor tr ; +boolean neu ; +boolean used ; +mdbknoten * mdb ; +{mdbeintragen_regmem + integer test ; + if ( (*mdb )== nil ) + { +(* mdb )= (mdbknoten) malloc ( sizeof ( mdbschnuller ) ) ; +memcpy((void *)(* mdb )->w12 ,(void *) w ,sizeof(wort)); +(* mdb )->l1 = l ; +memcpy((void *)(* mdb )->tr1 ,(void *) tr,sizeof(trennvektor)) ; +(* mdb )->neu1 = neu ; +(* mdb )->used1 = used ; +(* mdb )->del1 = false ; +(* mdb )->li = nil ; +(* mdb )->re = nil ; + if ( isidebug == 1 ) + { + (void) putc('\n', stdout ); + } + } + else { + + test = vergl ( w , l , (*mdb )->w12 , (*mdb )->l1 ) ; + if ( test == -1 ) + { + if ( isidebug == 1 ) + { + (void) putc( '/' , stdout ); + } + mdbeintragen ( w , l , tr , neu , used , (*mdb )->li ) ; + } + else if ( test == 1 ) + { + if ( isidebug == 1 ) + { + (void) putc( '\\' , stdout ); + } + mdbeintragen ( w , l , tr , neu , used , (*mdb )->re ) ; + } + else { + + (void) Fputs( stdout , " =iSi=> mdb_eintragen vom gleichen Wort nocheinmal !!!" ) ; + (void) putc('\n', stdout ); + } + } +} +void zmdmeintragen ( w , l , tr , neu , mdm ) +wort w ; +integer l ; +trennvektor tr ; +boolean neu ; +mdmknoten * mdm ; +{mdmeintragen_regmem + mdmknoten rechts ; + if ( (*mdm )== nil ) + { +(* mdm )= (mdmknoten) malloc ( sizeof ( mdmschnuller ) ) ; + memcpy((void *)(* mdm )->w12 ,(void *) w,sizeof(wort)) ; +(* mdm )->l1 = l ; + memcpy((void *)(* mdm )->tr1 ,(void *) tr,sizeof(trennvektor)) ; +(* mdm )->neu1 = neu ; +(* mdm )->li = nil ; +(* mdm )->re = nil ; + } + else if ( (*mdm )->re == nil ) + { +(* mdm )->re = (mdmknoten) malloc ( sizeof ( mdmschnuller ) ) ; + memcpy((void *)(* mdm )->re ->w12 ,(void *) w ,sizeof(wort)); +(* mdm )->re ->l1 = l ; + memcpy((void *)(* mdm )->re ->tr1 ,(void *) tr,sizeof(trennvektor)) ; +(* mdm )->re ->neu1 = neu ; +(* mdm )->re ->li = nil ; +(* mdm )->re ->re = nil ; +(* mdm )->li = (*mdm )->re ; + } + else { + rechts = (*mdm )->re ; +(* mdm )->re = (mdmknoten) malloc ( sizeof (mdmschnuller ) ) ; + memcpy((void *)(* mdm )->re ->w12 ,(void *) w ,sizeof(wort)); +(* mdm )->re ->l1 = l ; + memcpy((void *)(* mdm )->re ->tr1 ,(void *) tr ,sizeof(trennvektor)); +(* mdm )->re ->neu1 = neu ; +(* mdm )->re ->li = nil ; +(* mdm )->re ->re = nil ; + rechts ->li = (*mdm )->re ; + } +} +void zmdleintragen ( w , l , mdl ) +wort w ; +integer l ; +mdlknoten * mdl ; +{mdleintragen_regmem + mdlknoten rechts ; + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mdl_eintragen von " ) ; + wwort ( w , l ) ; + (void) putc('\n', stdout ); + } + if ( (*mdl )== nil ) + { +(* mdl )= (mdlknoten) malloc ( sizeof ( mdlschnuller ) ) ; + memcpy((void *)(* mdl )->w12 ,(void *) w,sizeof(wort)) ; +(* mdl )->l1 = l ; +(* mdl )->li = nil ; +(* mdl )->re = nil ; + } + else if ( (*mdl )->re == nil ) + { +(* mdl )->re = (mdlknoten) malloc ( sizeof ( mdlschnuller ) ) ; + memcpy((void *)(* mdl )->re ->w12 ,(void *) w,sizeof(wort)) ; +(* mdl )->re ->l1 = l ; +(* mdl )->re ->li = nil ; +(* mdl )->re ->re = nil ; +(* mdl )->li = (*mdl )->re ; + } + else { + + rechts = (*mdl )->re ; +(* mdl )->re = (mdlknoten) malloc ( sizeof ( mdlschnuller ) ) ; + memcpy((void *)(* mdl )->re ->w12 ,(void *) w,sizeof(wort)) ; +(* mdl )->re ->l1 = l ; +(* mdl )->re ->li = nil ; +(* mdl )->re ->re = nil ; + rechts ->li = (*mdl )->re ; + } +} +void zmdeeintragen ( w , l , mde ) +wort w ; +integer l ; +mdeknoten * mde ; +{mdeeintragen_regmem + mdeknoten rechts ; + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mde_eintragen von " ) ; + wwort ( w , l ) ; + (void) putc('\n', stdout ); + } + if ( (*mde )== nil ) + { +(* mde )= (mdeknoten) malloc ( sizeof ( mdeschnuller ) ) ; + memcpy((void *)(* mde )->w12 ,(void *) w,sizeof(wort)) ; +(* mde )->l1 = l ; +(* mde )->li = nil ; +(* mde )->re = nil ; + } + else if ( (*mde )->re == nil ) + { +(* mde )->re = (mdeknoten) malloc ( sizeof ( mdeschnuller ) ) ; + memcpy((void *)(* mde )->re ->w12 ,(void *) w,sizeof(wort)) ; +(* mde )->re ->l1 = l ; +(* mde )->re ->li = nil ; +(* mde )->re ->re = nil ; +(* mde )->li = (*mde )->re ; + } + else { + + rechts = (*mde )->re ; +(* mde )->re = (mdeknoten) malloc ( sizeof ( mdeschnuller ) ) ; + memcpy((void *)(* mde )->re ->w12 ,(void *) w,sizeof(wort)) ; +(* mde )->re ->l1 = l ; +(* mde )->re ->li = nil ; +(* mde )->re ->re = nil ; + rechts ->li = (*mde )->re ; + } +} +boolean zmdsuchen ( w , l , mdb , tr ) +wort w ; +integer l ; +mdbknoten * mdb ; +trennvektor tr ; +{register boolean Result; mdsuchen_regmem + integer test ; + if ( (*mdb )== nil ) + { + Result = false ; + } + else { + + test = vergl ( w , l , (*mdb )->w12 , (*mdb )->l1 ) ; + if ( test == -1 ) + { + Result = mdsuchen ( w , l , (*mdb )->li , tr ) ; + } + else if ( test == 1 ) + { + Result = mdsuchen ( w , l , (*mdb )->re , tr ) ; + } + else { + + tr = (*mdb )->tr1 ; +(* mdb )->used1 = true ; + Result = true ; + } + } + return(Result) ; +} diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex7.c b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex7.c new file mode 100644 index 0000000000..e4ff53e97c --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitex7.c @@ -0,0 +1,2152 @@ +#define EXTERN extern +#include "texd.h" + +boolean zinuse ( w , l , mdb ) +wort w ; +integer l ; +mdbknoten mdb ; +{register boolean Result; inuse_regmem + integer test ; + if ( mdb == nil ) + { + (void) Fputs( stdout , " =iSi=> in_use Fehler: " ) ; + wwort ( w , l ) ; + (void) Fputs( stdout , " nicht in mdb" ) ; + (void) putc('\n', stdout ); + } + else { + + test = vergl ( w , l , mdb ->w12 , mdb ->l1 ) ; + if ( test == -1 ) + { + Result = inuse ( w , l , mdb ->li ) ; + } + else if ( test == 1 ) + { + Result = inuse ( w , l , mdb ->re ) ; + } + else { + + Result = mdb ->used1 ; + if ( isidebug == 1 ) + { + if ( mdb ->used1 ) + { + (void) Fputs( stdout , " =iSi=> " ) ; + wwort ( w , l ) ; + (void) Fputs( stdout , " in use" ) ; + (void) putc('\n', stdout ); + } + else { + + (void) Fputs( stdout , " =iSi=> " ) ; + wwort ( w , l ) ; + (void) Fputs( stdout , " not in use" ) ; + (void) putc('\n', stdout ); + } + } + } + } + return(Result) ; +} +void hsinit ( ) +{hsinit_regmem + integer i, j, l ; + trennvektor tr ; + wort w ; + char temp, auswahl, schnuller ; + boolean neu, memkorr ; + (void) putc('\n', stdout ); + (void) putc('\n', stdout ); + do { + (void) fprintf( stdout , "%s\n", "iSi debug Info ? [J/N]" ) ; + read ( stdin , auswahl ) ; + schnuller = auswahl ; + readln ( stdin ) ; + } while ( ! ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 78 ) || ( + xord [ auswahl ] == 106 ) || ( xord [ auswahl ] == 110 ) ) ) ; + (void) putc('\n', stdout ); + if ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 106 ) ) + { + isidebug = 1 ; + } + else { + + isidebug = 0 ; + } + {register integer for_end; i = 1 ; for_end = FILENAMESIZE ; if ( i <= + for_end) do + { + nameoffile [ i ] = ' ' ; + } + while ( i++ < for_end ) ; } + j = strstart [ jobname ] ; + i = 1 ; + while ( ( j < strstart [ jobname + 1 ] ) && ( i < FILENAMESIZE - 4 ) ) { + + nameoffile [ i ] = xchr [ strpool [ j ] ] ; + j = j + 1 ; + i = i + 1 ; + } + nameoffile [ i ] = '.' ; + nameoffile [ i + 1 ] = 'm' ; + nameoffile [ i + 2 ] = 'e' ; + nameoffile [ i + 3 ] = 'm' ; + if ( ! aopenin ( hsmem , TEXINPUTPATH ) ) + { + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> cant a_open_in " ) ; + wjob () ; + (void) Fputs( stdout , ".mem" ) ; + (void) putc('\n', stdout ); + } + } + else { + + do { + (void) putc('\n', stdout ); + (void) Fputs( stdout , "Sollen Fehleintr\"age gel\"oscht werden? [J/N]" ) ; + (void) putc('\n', stdout ); + read ( stdin , auswahl ) ; + schnuller = auswahl ; + readln ( stdin ) ; + } while ( ! ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 78 ) || + ( xord [ auswahl ] == 106 ) || ( xord [ auswahl ] == 110 ) ) ) ; + (void) putc('\n', stdout ); + (void) putc('\n', stdout ); + if ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 106 ) ) + { + memkorr = true ; + } + else { + + memkorr = false ; + } + while ( ! eof ( hsmem ) ) { + fscanf ( hsmem , "%d", &l ) ; + readln ( hsmem ) ; + {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do + { + fscanf ( hsmem , "%hd", &w [ i ] ) ; + } + while ( i++ < for_end ) ; } + readln ( hsmem ) ; + {register integer for_end; i = 1 ; for_end = l ; if ( i <= for_end) do + { + fscanf ( hsmem , "%d", &tr [ i ] ) ; + } + while ( i++ < for_end ) ; } + readln ( hsmem ) ; + fscanf ( hsmem , "%c", &temp ) ; + readln ( hsmem ) ; + if ( temp == xchr [ 116 ] ) + neu = true ; + else neu = false ; + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> reading from " ) ; + wjob () ; + (void) Fputs( stdout , ".mem: " ) ; + wwort ( w , l ) ; + (void) Fputs( stdout , ", neu = " ) ; + (void) fprintf( stdout , "%ld", (long)temp ) ; + (void) putc('\n', stdout ); + } + if ( memkorr ) + { + do { + (void) putc('\n', stdout ); + (void) Fputs( stdout , "Soll " ) ; + writewt ( w , l , tr ) ; + (void) Fputs( stdout , " gel\"oscht werden? [J/N]" ) ; + (void) putc('\n', stdout ); + read ( stdin , auswahl ) ; + schnuller = auswahl ; + readln ( stdin ) ; + } while ( ! ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 78 ) + || ( xord [ auswahl ] == 106 ) || ( xord [ auswahl ] == 110 ) ) ) ; + (void) putc('\n', stdout ); + if ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 106 ) ) + { + ; + } + else { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ; + writewt ( w , l , tr ) ; + (void) putc('\n', stdout ); + } + mdbeintragen ( w , l , tr , neu , false , mdb ) ; + mdmeintragen ( w , l , tr , neu , mdm ) ; + } + } + else { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ; + writewt ( w , l , tr ) ; + (void) putc('\n', stdout ); + } + mdbeintragen ( w , l , tr , neu , false , mdb ) ; + mdmeintragen ( w , l , tr , neu , mdm ) ; + } + } + if ( isidebug == 1 ) + { + (void) putc('\n', stdout ); + } + aclose ( hsmem ) ; + } + do { + (void) putc('\n', stdout ); + (void) fprintf( stdout , "%s\n", "Sollen mehrdeutige W\"orter angezeigt werden? [J/N]" ) + ; + read ( stdin , auswahl ) ; + schnuller = auswahl ; + readln ( stdin ) ; + } while ( ! ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 78 ) || ( + xord [ auswahl ] == 106 ) || ( xord [ auswahl ] == 110 ) ) ) ; + (void) putc('\n', stdout ); + if ( ( xord [ auswahl ] == 74 ) || ( xord [ auswahl ] == 106 ) ) + { + mehrdanz = true ; + } + else { + + mehrdanz = false ; + } +} +void zabteilen ( w , tr1 , alletr , laenge , ok , zerlegungen ) +wort w ; +trennvektor tr1 ; +trenn16 alletr ; +integer laenge ; +boolean * ok ; +integer * zerlegungen ; +{/* 99 */ abteilen_regmem + integer i ; + integer iSij ; + dudt dud ; + varr v ; + intarr ind, k ; + trennvektor tr, dudtr ; + sperrvektor spv, dudstop ; + tr1 [ 0 ] = keine ; + {register integer for_end; i = 0 ; for_end = laenge ; if ( i <= for_end) do + { + tr [ i ] = keine ; + spv [ i ] = false ; + dudstop [ i ] = false ; + dud [ i ] = false ; + if ( i > 0 ) + if ( ( w [ i ] == trennzeichen ) || ( w [ i ] == sonderzeichen ) ) + { +(* zerlegungen )= 0 ; +(* ok )= false ; + goto lab99 ; + } + } + while ( i++ < for_end ) ; } +(* zerlegungen )= 0 ; + trennen ( 3 , 1 , spv , (*ok ), alletr , tr , dudtr , (*zerlegungen ), dud , v , + ind , k , dudstop , w , tr1 , laenge ) ; + {register integer for_end; i = 0 ; for_end = laenge ; if ( i <= for_end) do + if ( tr1 [ i ] == nebenck ) + { + tr1 [ i ] = keine ; + tr1 [ i - 1 ] = nebenck ; + {register integer for_end; iSij = 1 ; for_end = (*zerlegungen ); if ( iSij + <= for_end) do + { + if ( ( alletr [ iSij ] [ i ] == nebenck ) ) + { + alletr [ iSij ] [ i ] = keine ; + alletr [ iSij ] [ i - 1 ] = nebenck ; + } + } + while ( iSij++ < for_end ) ; } + } + while ( i++ < for_end ) ; } + lab99: ; +} +boolean zisdirtyumlaut ( p ) +halfword p ; +{register boolean Result; isdirtyumlaut_regmem + boolean res ; + halfword q ; + res = false ; + if ( p != 0 ) + if ( mem [ p ] .hh.b0 == 7 ) + if ( mem [ p + 1 ] .hh .v.LH != 0 ) + if ( mem [ mem [ p + 1 ] .hh .v.LH ] .hh .v.RH != 0 ) + if ( mem [ mem [ mem [ p + 1 ] .hh .v.LH ] .hh .v.RH ] .hh .v.RH != 0 ) + { + q = mem [ p + 1 ] .hh .v.LH ; + if ( mem [ q ] .hh.b0 == 12 ) + q = mem [ q ] .hh .v.RH ; + if ( ( mem [ q ] .hh.b0 == 11 ) && ( mem [ q + 1 ] .cint == specletterID ) + && ( mem [ q ] .hh .v.RH >= himemmin ) && ( mem [ mem [ mem [ q ] .hh + .v.RH ] .hh .v.RH ] .hh.b0 == 11 ) ) + res = true ; + } + Result = res ; + return(Result) ; +} +integer zgetcharof ( s ) +halfword s ; +{register integer Result; getcharof_regmem + halfword q ; + q = mem [ s + 1 ] .hh .v.LH ; + if ( mem [ q ] .hh.b0 == 12 ) + q = mem [ q ] .hh .v.RH ; + Result = mem [ mem [ mem [ q ] .hh .v.RH ] .hh .v.RH + 1 ] .cint ; + return(Result) ; +} +integer zgetfontof ( s ) +halfword s ; +{register integer Result; getfontof_regmem + halfword q ; + q = mem [ s + 1 ] .hh .v.LH ; + if ( mem [ q ] .hh.b0 == 12 ) + q = mem [ q ] .hh .v.RH ; + Result = mem [ mem [ q ] .hh .v.RH ] .hh.b0 ; + return(Result) ; +} +void hyphenate ( ) +{/* 50 30 31 40 41 42 45 10 */ hyphenate_regmem + schar i, j, l, kk ; + halfword q, r, s, qq, qr, holdr ; + halfword bchar ; + short xchgchar[11] ; + schar addchar, xchgi, xchgk, xchghu ; + halfword spechyf ; + integer sij ; + halfword majortail, minortail ; + ASCIIcode c ; + schar cloc ; + integer rcount ; + halfword hyfnode ; + triepointer z ; + integer v ; + boolean funktioniert ; + integer zerleg ; + trenn16 alletr ; + char auswahl, schnuller ; + boolean memkorr ; + integer indexi ; + boolean uebersprungen ; + boolean lexja, lexok ; + hyphpointer h ; + strnumber k ; + poolpointer u ; + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + hyf [ j ] = 0 ; + while ( j++ < for_end ) ; } + h = hc [ 1 ] ; + incr ( hn ) ; + hc [ hn ] = curlang ; + {register integer for_end; j = 2 ; for_end = hn ; if ( j <= for_end) do + h = ( h + h + hc [ j ] ) % 607 ; + while ( j++ < for_end ) ; } + while ( true ) { + + k = hyphword [ h ] ; + if ( k == 0 ) + goto lab45 ; + if ( ( strstart [ k + 1 ] - strstart [ k ] ) < hn ) + goto lab45 ; + if ( ( strstart [ k + 1 ] - strstart [ k ] ) == hn ) + { + j = 1 ; + u = strstart [ k ] ; + do { + if ( strpool [ u ] < hc [ j ] ) + goto lab45 ; + if ( strpool [ u ] > hc [ j ] ) + goto lab30 ; + incr ( j ) ; + incr ( u ) ; + } while ( ! ( j > hn ) ) ; + s = hyphlist [ h ] ; + while ( s != 0 ) { + + hyf [ mem [ s ] .hh .v.LH ] = 1 ; + s = mem [ s ] .hh .v.RH ; + } + decr ( hn ) ; + goto lab40 ; + } + lab30: ; + if ( h > 0 ) + decr ( h ) ; + else h = 607 ; + } + lab45: decr ( hn ) ; + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + hcsi [ j ] = ktab [ hc [ j ] ] ; + while ( j++ < for_end ) ; } + if ( odd ( eqtb [ 12719 ] .cint / 2 ) ) + { + if ( ! odd ( eqtb [ 12720 ] .cint / 2 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)2 , " *>" ) + ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)2 , " *>" ) ; + } + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " hc:" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " hc:" ) ; + } + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( hc [ j ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( hc [ j ] ) , logfile ); + } + while ( j++ < for_end ) ; } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%c\n", ':' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%c\n", ':' ) ; + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " hc_si:" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " hc_si:" ) ; + } + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( revtab [ hcsi [ j ] ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( revtab [ hcsi [ j ] ] ) , logfile ); + } + while ( j++ < for_end ) ; } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%c\n", ':' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%c\n", ':' ) ; + } + } + if ( odd ( eqtb [ 12719 ] .cint / 4 ) ) + { + if ( ! odd ( eqtb [ 12720 ] .cint / 4 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)4 , " *>" ) + ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)4 , " *>" ) ; + } + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", "< decimal character codes >" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", "< decimal character codes >" ) ; + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " hc:" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " hc:" ) ; + } + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%ld%c", (long)hc [ j ] , '-' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%ld%c", (long)hc [ j ] , '-' ) ; + } + if ( ( ( j + 1 ) % 16 ) == 0 ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " " ) ; + } + } + } + while ( j++ < for_end ) ; } + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " hc_si:" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " hc_si:" ) ; + } + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%ld%c", (long)revtab [ hcsi [ j ] ] , '-' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%ld%c", (long)revtab [ hcsi [ j ] ] , '-' ) ; + } + if ( ( ( j + 1 ) % 16 ) == 0 ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " " ) ; + } + } + } + while ( j++ < for_end ) ; } + println () ; + println () ; + } + if ( ! hsstart ) + { + hsinit () ; + hsstart = true ; + } + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> abteilen von " ) ; + wwort ( hcsi , hn ) ; + } + abteilen ( hcsi , hyfsi , alletr , hn , funktioniert , zerleg ) ; + if ( ! funktioniert ) + { + if ( isidebug == 1 ) + { + (void) putc('\n', stdout ); + (void) Fputs( stdout , " =iSi=> unbekanntes Wort: " ) ; + wwort ( hcsi , hn ) ; + (void) putc('\n', stdout ); + (void) Fputs( stdout , " =iSi=> suchen in mdb: " ) ; + wwort ( hcsi , hn ) ; + (void) putc('\n', stdout ); + } + if ( mdsuchen ( hcsi , hn , mdb , hyfsi ) ) + { + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> gefunden in mdb: " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + } + funktioniert = true ; + } + else { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> nicht gefunden in mdb: " ) ; + wwort ( hcsi , hn ) ; + (void) putc('\n', stdout ); + } + do { + (void) putc('\n', stdout ); + (void) putc('\n', stdout ); + (void) putc( '"' , stdout ); + wwort ( hcsi , hn ) ; + (void) Fputs( stdout , "\" ist ein unbekanntes Wort!" ) ; + (void) putc('\n', stdout ); + (void) fprintf( stdout , "%ld", (long)0 ) ; + (void) Fputs( stdout , ": neues Wort, merken in \"" ) ; + wjob () ; + (void) Fputs( stdout , ".lex\"" ) ; + (void) putc('\n', stdout ); + (void) fprintf( stdout , "%ld", (long)1 ) ; + (void) Fputs( stdout , ": neues Wort, Trennstellen angeben und merken in \"" ) ; + wjob () ; + (void) Fputs( stdout , ".lex\"" ) ; + (void) putc('\n', stdout ); + (void) fprintf( stdout , "%ld", (long)9 ) ; + (void) Fputs( stdout , ": Tippfehler! - merken im File \"" ) ; + wjob () ; + (void) Fputs( stdout , ".edt\"" ) ; + (void) putc('\n', stdout ); + (void) Fputs( stdout , "Bitte waehlen Sie eine Bedeutung (0,1,9) aus:" ) ; + (void) putc('\n', stdout ); + read ( stdin , schnuller ) ; + auswahl = schnuller ; + readln ( stdin ) ; + } while ( ! ( ( ( xord [ auswahl ] >= 48 ) && ( xord [ auswahl ] <= 49 ) + ) || ( auswahl == '9' ) ) ) ; + if ( ( auswahl == '0' ) ) + { + {register integer for_end; indexi = 1 ; for_end = hn ; if ( indexi <= + for_end) do + { + hyfsi [ indexi ] = keine ; + } + while ( indexi++ < for_end ) ; } + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + } + mdbeintragen ( hcsi , hn , hyfsi , true , true , mdb ) ; + mdmeintragen ( hcsi , hn , hyfsi , true , mdm ) ; + funktioniert = true ; + } + else if ( ( auswahl == '9' ) ) + { + mdeeintragen ( hcsi , hn , mde ) ; + } + else { + + (void) Fputs( stdout , "Bitte den Trennvektor angeben" ) ; + (void) putc('\n', stdout ); + (void) Fputs( stdout , " (\"-\" Nebentrennstelle, \"=\" Haupttrennstelle, " ) ; + (void) Fputs( stdout , "\".\" Weiterruecken," ) ; + (void) putc('\n', stdout ); + (void) Fputs( stdout , " Trennstrich unter den Buchstaben angeben, hinter dem " ) ; + (void) Fputs( stdout , "getrennt werden soll):" ) ; + (void) putc('\n', stdout ); + wwort ( hcsi , hn ) ; + (void) putc('\n', stdout ); + indexi = 1 ; + uebersprungen = false ; + read ( stdin , auswahl ) ; + while ( ( xord [ auswahl ] != 10 ) && ( indexi <= hn ) ) { + + if ( ( hcsi [ indexi ] >= 27 ) && ( hcsi [ indexi ] <= 30 ) && ! + uebersprungen ) + { + uebersprungen = true ; + } + else { + + if ( auswahl == '.' ) + { + hyfsi [ indexi ] = keine ; + } + else if ( auswahl == '-' ) + { + hyfsi [ indexi ] = neben ; + } + else if ( auswahl == '=' ) + { + hyfsi [ indexi ] = haupt ; + } + else { + + hyfsi [ indexi ] = keine ; + } + uebersprungen = false ; + indexi = indexi + 1 ; + } + read ( stdin , auswahl ) ; + } + while ( ( indexi ) <= hn ) { + + hyfsi [ indexi ] = keine ; + indexi = indexi + 1 ; + } + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + } + mdbeintragen ( hcsi , hn , hyfsi , true , true , mdb ) ; + mdmeintragen ( hcsi , hn , hyfsi , true , mdm ) ; + funktioniert = true ; + } + } + } + else { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , ": " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + } + } + if ( zerleg >= 2 ) + { + gleicheweg ( alletr , zerleg , hn ) ; + if ( zerleg >= 2 ) + { + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mehrdeutiges Wort: " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + (void) Fputs( stdout , " =iSi=> suchen in mdb: " ) ; + wwort ( hcsi , hn ) ; + (void) putc('\n', stdout ); + } + if ( mdsuchen ( hcsi , hn , mdb , hyfsi ) ) + { + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> gefunden in mdb: " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + } + } + else { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> nicht gefunden in mdb: " ) ; + wwort ( hcsi , hn ) ; + (void) putc('\n', stdout ); + } + if ( mehrdanz ) + { + do { + (void) putc('\n', stdout ); + (void) putc('\n', stdout ); + (void) putc( '`' , stdout ); + wwort ( hcsi , hn ) ; + (void) Fputs( stdout , "' ist ein mehrdeutiges Wort!" ) ; + (void) putc('\n', stdout ); + (void) fprintf( stdout , "%ld", (long)0 ) ; + (void) Fputs( stdout , ": nur die sicheren Trennstellen waehlen (also `" ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) Fputs( stdout , "')" ) ; + (void) putc('\n', stdout ); + {register integer for_end; indexi = 1 ; for_end = zerleg ; if ( + indexi <= for_end) do + { + (void) fprintf( stdout , "%ld", (long)indexi ) ; + (void) Fputs( stdout , ": `" ) ; + writewt ( hcsi , hn , alletr [ indexi ] ) ; + (void) putc( '\'' , stdout ); + (void) putc('\n', stdout ); + } + while ( indexi++ < for_end ) ; } + (void) fprintf( stdout , "%ld", (long)9 ) ; + (void) Fputs( stdout , ": Tippfehler! - merken im File `" ) ; + wjob () ; + (void) Fputs( stdout , ".edt'" ) ; + (void) putc('\n', stdout ); + (void) Fputs( stdout , "Bitte waehlen Sie eine Bedeutung z.B. `0'+`Enter' aus:" ) ; + (void) putc('\n', stdout ); + (void) Fputs( stdout , " (zusaetzlich `E' z.B. `0E'+`Enter': " ) ; + (void) Fputs( stdout , "Wort auch fuer LEXIKON vormerken)" ) ; + (void) putc('\n', stdout ); + read ( stdin , schnuller ) ; + auswahl = schnuller ; + lexja = false ; + lexok = true ; + if ( xord [ schnuller ] != 32 ) + { + read ( stdin , schnuller ) ; + if ( xord [ schnuller ] != 10 ) + { + if ( ( schnuller == 'e' ) || ( schnuller == 'E' ) ) + { + lexja = true ; + } + else { + + lexok = false ; + } + readln ( stdin ) ; + } + } + } while ( ! ( ( ( ( xord [ auswahl ] >= 48 ) && ( xord [ auswahl ] + <= 48 + zerleg ) ) || ( auswahl == '9' ) ) && lexok ) ) ; + if ( ( auswahl == '0' ) || ( ( auswahl == '0' ) && lexja ) ) + { + if ( ( auswahl == '0' ) && ! lexja ) + { + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + } + mdbeintragen ( hcsi , hn , hyfsi , false , true , mdb ) ; + mdmeintragen ( hcsi , hn , hyfsi , false , mdm ) ; + } + else { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + } + mdbeintragen ( hcsi , hn , hyfsi , true , true , mdb ) ; + mdmeintragen ( hcsi , hn , hyfsi , true , mdm ) ; + } + } + else if ( ( auswahl == '9' ) ) + { + mdeeintragen ( hcsi , hn , mde ) ; + } + else { + memcpy((void *)hyfsi , (void *) alletr [ xord [ auswahl ] - 48 ], + sizeof(trennvektor)); + if ( ! lexja ) + { + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + } + mdbeintragen ( hcsi , hn , hyfsi , false , true , mdb ) ; + mdmeintragen ( hcsi , hn , hyfsi , false , mdm ) ; + } + else { + + if ( isidebug == 1 ) + { + (void) Fputs( stdout , " =iSi=> mdb/mdm_eintragen: " ) ; + writewt ( hcsi , hn , hyfsi ) ; + (void) putc('\n', stdout ); + } + mdbeintragen ( hcsi , hn , hyfsi , true , true , mdb ) ; + mdmeintragen ( hcsi , hn , hyfsi , true , mdm ) ; + } + } + } + } + } + } + {register integer for_end; j = 0 ; for_end = 64 ; if ( j <= for_end) do + { + hyfdisc [ j ] = 0 ; + hyfpen [ j ] = 10000 ; + } + while ( j++ < for_end ) ; } + if ( funktioniert ) + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + { + if ( hyfsi [ j ] == neben ) + hyfpen [ j ] = eqtb [ 12718 ] .cint ; + else if ( hyfsi [ j ] == haupt ) + hyfpen [ j ] = eqtb [ 12666 ] .cint ; + else if ( hyfsi [ j ] == nebenck ) + { + hyfpen [ j + 1 ] = eqtb [ 12718 ] .cint ; + s = getnode ( 2 ) ; + mem [ s ] .hh.b0 = 7 ; + hyfdisc [ j + 1 ] = s ; + mem [ s + 1 ] .hh .v.LH = newpenalty ( eqtb [ 12718 ] .cint ) ; + s = mem [ s + 1 ] .hh .v.LH ; + mem [ s ] .hh.b1 = 0 ; + mem [ s ] .hh .v.RH = newcharacter ( hf , hu [ j + 2 ] ) ; + mem [ mem [ s ] .hh .v.RH ] .hh .v.RH = 0 ; + s = hyfdisc [ j + 1 ] ; + mem [ s + 1 ] .hh .v.RH = 0 ; + mem [ s ] .hh .v.RH = 0 ; + } + else if ( hyfsi [ j ] == haupt3 ) + { + hyfpen [ j - 1 ] = eqtb [ 12666 ] .cint ; + s = getnode ( 2 ) ; + mem [ s ] .hh.b0 = 7 ; + hyfdisc [ j - 1 ] = s ; + mem [ s + 1 ] .hh .v.LH = newpenalty ( eqtb [ 12666 ] .cint ) ; + s = mem [ s + 1 ] .hh .v.LH ; + mem [ s ] .hh.b1 = 1 ; + mem [ s ] .hh .v.RH = newcharacter ( hf , hu [ j ] ) ; + mem [ mem [ s ] .hh .v.RH ] .hh .v.RH = 0 ; + s = hyfdisc [ j - 1 ] ; + mem [ s + 1 ] .hh .v.RH = 0 ; + mem [ s ] .hh .v.RH = 0 ; + } + } + while ( j++ < for_end ) ; } + if ( odd ( eqtb [ 12719 ] .cint / 8 ) ) + { + if ( ! odd ( eqtb [ 12720 ] .cint / 8 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)8 , " *>" ) + ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)8 , " *>" ) ; + } + } + if ( funktioniert ) + { + {register integer for_end; j = 0 ; for_end = hn ; if ( j <= for_end) do + if ( hyfpen [ j ] != 10000 ) + { + if ( hyfdisc [ j ] != 0 ) + { + if ( mem [ mem [ hyfdisc [ j ] + 1 ] .hh .v.LH ] .hh.b1 == 0 ) + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%c%c", Xchr ( hu [ j + 1 ] ) , '-' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%c%c", Xchr ( hu [ j + 1 ] ) , '-' ) ; + } + else { + + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%c%c%c", Xchr ( hu [ j + 1 ] ) , Xchr ( hu [ j + 1 ] ) , '=' ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%c%c%c", Xchr ( hu [ j + 1 ] ) , Xchr ( hu [ j + 1 ] ) , '=' ) ; + } + } + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( hu [ j ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( hu [ j ] ) , logfile ); + } + if ( hyfpen [ j ] == eqtb [ 12666 ] .cint ) + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( '=' , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( '=' , logfile ); + } + else { + + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( '-' , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( '-' , logfile ); + } + } + } + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) putc( Xchr ( hu [ j ] ) , stdout ); + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) putc( Xchr ( hu [ j ] ) , logfile ); + } + } + while ( j++ < for_end ) ; } + } + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", " no hyphens were found in this word!" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", " no hyphens were found in this word!" ) ; + } + } + println () ; + } + goto lab31 ; + lab40: hyfpen [ 0 ] = 10000 ; + {register integer for_end; j = 1 ; for_end = hn ; if ( j <= for_end) do + if ( odd ( hyf [ j ] ) ) + hyfpen [ j ] = eqtb [ 12666 ] .cint ; + else hyfpen [ j ] = 10000 ; + while ( j++ < for_end ) ; } + lab31: ; + {register integer for_end; j = lhyf ; for_end = hn - rhyf ; if ( j <= + for_end) do + if ( hyfpen [ j ] != 10000 ) + goto lab41 ; + while ( j++ < for_end ) ; } + return ; + lab41: ; + q = mem [ hb ] .hh .v.RH ; + mem [ hb ] .hh .v.RH = 0 ; + r = mem [ ha ] .hh .v.RH ; + mem [ ha ] .hh .v.RH = 0 ; + bchar = 256 ; + holdr = newkern ( 1235 ) ; + mem [ holdr ] .hh .v.RH = r ; + if ( ! ( hb >= himemmin ) ) + if ( mem [ hb ] .hh.b0 == 6 ) + if ( odd ( mem [ hb ] .hh.b1 ) ) + bchar = fontbchar [ hf ] ; + if ( ( ha >= himemmin ) ) + if ( mem [ ha ] .hh.b0 != hf ) + goto lab42 ; + else { + + initlist = ha ; + initlig = false ; + hu [ 0 ] = mem [ ha ] .hh.b1 ; + } + else if ( isdirtyumlaut ( ha ) ) + { + if ( getfontof ( ha ) != hf ) + goto lab42 ; + else { + + initlist = ha ; + initlig = false ; + hu [ 0 ] = getcharof ( ha ) ; + } + } + else if ( mem [ ha ] .hh.b0 == 6 ) + if ( mem [ ha + 1 ] .hh.b0 != hf ) + goto lab42 ; + else { + + initlist = mem [ ha + 1 ] .hh .v.RH ; + initlig = true ; + initlft = ( mem [ ha ] .hh.b1 > 1 ) ; + hu [ 0 ] = mem [ ha + 1 ] .hh.b1 ; + if ( initlist == 0 ) + if ( initlft ) + { + hu [ 0 ] = 256 ; + initlig = false ; + } + freenode ( ha , 2 ) ; + } + else { + + if ( ! ( r >= himemmin ) ) + if ( mem [ r ] .hh.b0 == 6 ) + if ( mem [ r ] .hh.b1 > 1 ) + goto lab42 ; + j = 1 ; + s = ha ; + initlist = 0 ; + goto lab50 ; + } + s = curp ; + while ( mem [ s ] .hh .v.RH != ha ) s = mem [ s ] .hh .v.RH ; + j = 0 ; + goto lab50 ; + lab42: s = ha ; + j = 0 ; + hu [ 0 ] = 256 ; + initlig = false ; + initlist = 0 ; + lab50: qq = holdr ; + {register integer for_end; kk = j ; for_end = hn ; if ( kk <= for_end) do + if ( dirtyumlaut [ kk ] != 0 ) + { + while ( mem [ qq ] .hh .v.RH != dirtyumlaut [ kk ] ) qq = mem [ qq ] .hh + .v.RH ; + qr = mem [ qq ] .hh .v.RH ; + {register integer for_end; i = 1 ; for_end = mem [ qr ] .hh.b1 ; if ( i + <= for_end) do + if ( qr != 0 ) + qr = mem [ qr ] .hh .v.RH ; + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", "...??..X --> ????? !" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", "...??..X --> ????? !" ) ; + } + } + while ( i++ < for_end ) ; } + if ( qr != 0 ) + { + mem [ qq ] .hh .v.RH = mem [ qr ] .hh .v.RH ; + mem [ qr ] .hh .v.RH = 0 ; + } + else mem [ qq ] .hh .v.RH = 0 ; + } + while ( kk++ < for_end ) ; } + if ( dirtyumlaut [ -1 ] != 0 ) + { + qq = holdr ; + while ( ( mem [ qq ] .hh .v.RH != dirtyumlaut [ -1 ] ) && ( mem [ qq ] .hh + .v.RH != 0 ) ) qq = mem [ qq ] .hh .v.RH ; + if ( mem [ qq ] .hh .v.RH == dirtyumlaut [ -1 ] ) + { + mem [ qq ] .hh .v.RH = mem [ dirtyumlaut [ -1 ] ] .hh .v.RH ; + mem [ dirtyumlaut [ -1 ] ] .hh .v.RH = 0 ; + } + else { + + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) Fputs( stdout , " *** ERROR: node list is damaged! " ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) Fputs( logfile , " *** ERROR: node list is damaged! " ) ; + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", "(post hyphenation - unhinge a whatsit node)" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", "(post hyphenation - unhinge a whatsit node)" ) ; + } + } + } + r = holdr ; + while ( mem [ r ] .hh .v.RH != 0 ) { + + if ( ( memmin <= mem [ r ] .hh .v.RH ) && ( mem [ r ] .hh .v.RH <= memmax + ) ) + r = mem [ r ] .hh .v.RH ; + else { + + (void) putc('\n', logfile ); + (void) putc('\n', stdout ); + (void) fprintf( logfile , "%s\n", "???$ - ERROR in node list!" ) ; + (void) fprintf( stdout , "%s\n", "???$ - ERROR in node list!" ) ; + kk = depththreshold ; + l = breadthmax ; + depththreshold = 100 ; + breadthmax = 100 ; + shownodelist ( holdr ) ; + mem [ r ] .hh .v.RH = 0 ; + depththreshold = kk ; + breadthmax = l ; + } + } + flushnodelist ( holdr ) ; + if ( dirtyumlaut [ -1 ] != 0 ) + { + mem [ s ] .hh .v.RH = dirtyumlaut [ -1 ] ; + s = mem [ s ] .hh .v.RH ; + } + do { + if ( dirtyumlaut [ j ] != 0 ) + { + mem [ s ] .hh .v.RH = dirtyumlaut [ j ] ; + while ( mem [ s ] .hh .v.RH > 0 ) s = mem [ s ] .hh .v.RH ; + mem [ memtop - 4 ] .hh .v.RH = 0 ; + j = j + 1 ; + hyphenpassed = 0 ; + if ( hyfpen [ j - 1 ] != 10000 ) + { + l = j ; + hyphenpassed = j - 1 ; + if ( odd ( eqtb [ 12719 ] .cint / 16 ) ) + { + if ( ! odd ( eqtb [ 12720 ] .cint / 16 ) ) + { + println () ; + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s%ld%s\n", " <* debugging output section #" , (long)16 , " *>" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s%ld%s\n", " <* debugging output section #" , (long)16 , " *>" ) ; + } + } + { + if ( ( fileoffset != 0 ) || ( termoffset != 0 ) ) + println () ; + if ( selector != 18 ) + (void) fprintf( stdout , "%s\n", " *** append a hyphen immediatly after a dirty umlaut!" ) ; + if ( ( selector == 18 ) || ( selector == 19 ) ) + (void) fprintf( logfile , "%s\n", " *** append a hyphen immediatly after a dirty umlaut!" ) ; + } + } + } + } + else { + + l = j ; + j = reconstitute ( j , hn , bchar , hyfchar ) + 1 ; + if ( hyphenpassed == 0 ) + { + mem [ s ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + while ( mem [ s ] .hh .v.RH > 0 ) s = mem [ s ] .hh .v.RH ; + if ( hyfpen [ j - 1 ] != 10000 ) + { + l = j ; + hyphenpassed = j - 1 ; + mem [ memtop - 4 ] .hh .v.RH = 0 ; + } + } + } + if ( hyphenpassed > 0 ) + do { + r = getnode ( 2 ) ; + mem [ r ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + mem [ r ] .hh.b0 = 7 ; + majortail = r ; + rcount = 0 ; + while ( mem [ majortail ] .hh .v.RH > 0 ) { + + majortail = mem [ majortail ] .hh .v.RH ; + incr ( rcount ) ; + } + i = hyphenpassed ; + hyf [ i ] = 0 ; + if ( ( hyfpen [ i ] != 10000 ) && ( hyfpen [ i ] != eqtb [ 12666 ] .cint + ) ) + minortail = newpenalty ( hyfpen [ i ] ) ; + else minortail = 0 ; + hyfpen [ i ] = 10000 ; + mem [ r + 1 ] .hh .v.LH = minortail ; + hyfnode = newcharacter ( hf , hyfchar ) ; + xchgk = i ; + if ( hyfdisc [ xchgk ] != 0 ) + { + spechyf = mem [ hyfdisc [ xchgk ] + 1 ] .hh .v.LH ; + addchar = mem [ spechyf ] .hh.b1 ; + xchgi = 1 ; + do { + spechyf = mem [ spechyf ] .hh .v.RH ; + if ( spechyf != 0 ) + { + xchgchar [ xchgi ] = mem [ spechyf ] .hh.b1 ; + incr ( xchgi ) ; + } + } while ( ! ( spechyf == 0 ) ) ; + if ( hyfnode != 0 ) + { + xchgchar [ xchgi ] = hyfchar ; + { + mem [ hyfnode ] .hh .v.RH = avail ; + avail = hyfnode ; + ; +#ifdef STAT + decr ( dynused ) ; +#endif /* STAT */ + } + } + else decr ( xchgi ) ; + xchghu = i - xchgi + addchar + 2 ; + {register integer for_end; xchgk = 1 ; for_end = xchgi ; if ( xchgk + <= for_end) do + { + xchgchar [ 0 ] = hu [ xchghu ] ; + hu [ xchghu ] = xchgchar [ xchgk ] ; + xchgchar [ xchgk ] = xchgchar [ 0 ] ; + incr ( xchghu ) ; + } + while ( xchgk++ < for_end ) ; } + xchgk = i ; + i = xchghu - 1 ; + xchghu = xchghu - xchgi ; + } + else if ( hyfnode != 0 ) + { + incr ( i ) ; + c = hu [ i ] ; + hu [ i ] = hyfchar ; + { + mem [ hyfnode ] .hh .v.RH = avail ; + avail = hyfnode ; + ; +#ifdef STAT + decr ( dynused ) ; +#endif /* STAT */ + } + } + while ( l <= i ) { + + l = reconstitute ( l , i , fontbchar [ hf ] , 256 ) + 1 ; + if ( mem [ memtop - 4 ] .hh .v.RH > 0 ) + { + if ( minortail == 0 ) + mem [ r + 1 ] .hh .v.LH = mem [ memtop - 4 ] .hh .v.RH ; + else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + minortail = mem [ memtop - 4 ] .hh .v.RH ; + while ( mem [ minortail ] .hh .v.RH > 0 ) minortail = mem [ + minortail ] .hh .v.RH ; + } + } + if ( hyfdisc [ xchgk ] != 0 ) + { + i = xchgk ; + l = i + 1 ; + {register integer for_end; xchgk = 1 ; for_end = xchgi ; if ( xchgk + <= for_end) do + { + hu [ xchghu ] = xchgchar [ xchgk ] ; + incr ( xchghu ) ; + } + while ( xchgk++ < for_end ) ; } + } + else if ( hyfnode != 0 ) + { + hu [ i ] = c ; + l = i ; + decr ( i ) ; + } + minortail = 0 ; + mem [ r + 1 ] .hh .v.RH = 0 ; + cloc = 0 ; + if ( bcharlabel [ hf ] < fontmemsize ) + { + decr ( l ) ; + c = hu [ l ] ; + cloc = l ; + hu [ l ] = 256 ; + } + while ( l < j ) { + + do { + l = reconstitute ( l , hn , bchar , 256 ) + 1 ; + if ( cloc > 0 ) + { + hu [ cloc ] = c ; + cloc = 0 ; + } + if ( mem [ memtop - 4 ] .hh .v.RH > 0 ) + { + if ( minortail == 0 ) + mem [ r + 1 ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + else mem [ minortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + minortail = mem [ memtop - 4 ] .hh .v.RH ; + while ( mem [ minortail ] .hh .v.RH > 0 ) minortail = mem [ + minortail ] .hh .v.RH ; + } + } while ( ! ( l >= j ) ) ; + while ( l > j ) { + + j = reconstitute ( j , hn , bchar , 256 ) + 1 ; + mem [ majortail ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + while ( mem [ majortail ] .hh .v.RH > 0 ) { + + majortail = mem [ majortail ] .hh .v.RH ; + incr ( rcount ) ; + } + } + } + if ( rcount > 127 ) + { + mem [ s ] .hh .v.RH = mem [ r ] .hh .v.RH ; + mem [ r ] .hh .v.RH = 0 ; + flushnodelist ( r ) ; + } + else { + + mem [ s ] .hh .v.RH = r ; + mem [ r ] .hh.b1 = rcount ; + } + s = majortail ; + hyphenpassed = j - 1 ; + mem [ memtop - 4 ] .hh .v.RH = 0 ; + } while ( ! ( ( hyfpen [ j - 1 ] == 10000 ) ) ) ; + } while ( ! ( j > hn ) ) ; + mem [ s ] .hh .v.RH = q ; + siq = s ; + {register integer for_end; j = 0 ; for_end = 64 ; if ( j <= for_end) do + if ( hyfdisc [ j ] != 0 ) + { + flushnodelist ( hyfdisc [ j ] ) ; + } + while ( j++ < for_end ) ; } + flushlist ( initlist ) ; +} +void newhyphexceptions ( ) +{/* 21 10 40 45 */ newhyphexceptions_regmem + smallnumber n ; + smallnumber j ; + hyphpointer h ; + strnumber k ; + halfword p ; + halfword q ; + strnumber s, t ; + poolpointer u, v ; + scanleftbrace () ; + if ( eqtb [ 12713 ] .cint <= 0 ) + curlang = 0 ; + else if ( eqtb [ 12713 ] .cint > 255 ) + curlang = 0 ; + else curlang = eqtb [ 12713 ] .cint ; + n = 0 ; + p = 0 ; + while ( true ) { + + getxtoken () ; + lab21: switch ( curcmd ) + {case 11 : + case 12 : + case 68 : + if ( curchr == 45 ) + { + if ( n < 63 ) + { + q = getavail () ; + mem [ q ] .hh .v.RH = p ; + mem [ q ] .hh .v.LH = n ; + p = q ; + } + } + else { + + if ( eqtb [ 11639 + curchr ] .hh .v.RH == 0 ) + { + { + if ( interaction == 3 ) + ; + printnl ( 262 ) ; + print ( 941 ) ; + } + { + helpptr = 2 ; + helpline [ 1 ] = 942 ; + helpline [ 0 ] = 943 ; + } + error () ; + } + else if ( n < 63 ) + { + incr ( n ) ; + hc [ n ] = eqtb [ 11639 + curchr ] .hh .v.RH ; + } + } + break ; + case 16 : + { + scancharnum () ; + curchr = curval ; + curcmd = 68 ; + goto lab21 ; + } + break ; + case 10 : + case 2 : + { + if ( n > 1 ) + { + incr ( n ) ; + hc [ n ] = curlang ; + { + if ( poolptr + n > poolsize ) + overflow ( 257 , poolsize - initpoolptr ) ; + } + h = 0 ; + {register integer for_end; j = 1 ; for_end = n ; if ( j <= for_end) + do + { + h = ( h + h + hc [ j ] ) % 607 ; + { + strpool [ poolptr ] = hc [ j ] ; + incr ( poolptr ) ; + } + } + while ( j++ < for_end ) ; } + s = makestring () ; + if ( hyphcount == 607 ) + overflow ( 944 , 607 ) ; + incr ( hyphcount ) ; + while ( hyphword [ h ] != 0 ) { + + k = hyphword [ h ] ; + if ( ( strstart [ k + 1 ] - strstart [ k ] ) < ( strstart [ s + 1 + ] - strstart [ s ] ) ) + goto lab40 ; + if ( ( strstart [ k + 1 ] - strstart [ k ] ) > ( strstart [ s + 1 + ] - strstart [ s ] ) ) + goto lab45 ; + u = strstart [ k ] ; + v = strstart [ s ] ; + do { + if ( strpool [ u ] < strpool [ v ] ) + goto lab40 ; + if ( strpool [ u ] > strpool [ v ] ) + goto lab45 ; + incr ( u ) ; + incr ( v ) ; + } while ( ! ( u == strstart [ k + 1 ] ) ) ; + lab40: q = hyphlist [ h ] ; + hyphlist [ h ] = p ; + p = q ; + t = hyphword [ h ] ; + hyphword [ h ] = s ; + s = t ; + lab45: ; + if ( h > 0 ) + decr ( h ) ; + else h = 607 ; + } + hyphword [ h ] = s ; + hyphlist [ h ] = p ; + } + if ( curcmd == 2 ) + return ; + n = 0 ; + p = 0 ; + } + break ; + default: + { + { + if ( interaction == 3 ) + ; + printnl ( 262 ) ; + print ( 679 ) ; + } + printesc ( 937 ) ; + print ( 938 ) ; + { + helpptr = 2 ; + helpline [ 1 ] = 939 ; + helpline [ 0 ] = 940 ; + } + error () ; + } + break ; + } + } +} +halfword zprunepagetop ( p ) +halfword p ; +{register halfword Result; prunepagetop_regmem + halfword prevp ; + halfword q ; + prevp = memtop - 3 ; + mem [ memtop - 3 ] .hh .v.RH = p ; + while ( p != 0 ) switch ( mem [ p ] .hh.b0 ) + {case 0 : + case 1 : + case 2 : + { + q = newskipparam ( 10 ) ; + mem [ prevp ] .hh .v.RH = q ; + mem [ q ] .hh .v.RH = p ; + if ( mem [ tempptr + 1 ] .cint > mem [ p + 3 ] .cint ) + mem [ tempptr + 1 ] .cint = mem [ tempptr + 1 ] .cint - mem [ p + 3 ] + .cint ; + else mem [ tempptr + 1 ] .cint = 0 ; + p = 0 ; + } + break ; + case 8 : + case 4 : + case 3 : + { + prevp = p ; + p = mem [ prevp ] .hh .v.RH ; + } + break ; + case 10 : + case 11 : + case 12 : + { + q = p ; + p = mem [ q ] .hh .v.RH ; + mem [ q ] .hh .v.RH = 0 ; + mem [ prevp ] .hh .v.RH = p ; + flushnodelist ( q ) ; + } + break ; + default: + confusion ( 954 ) ; + break ; + } + Result = mem [ memtop - 3 ] .hh .v.RH ; + return(Result) ; +} +halfword zvertbreak ( p , h , d ) +halfword p ; +scaled h ; +scaled d ; +{/* 30 45 90 */ register halfword Result; vertbreak_regmem + halfword prevp ; + halfword q, r ; + integer pi ; + integer b ; + integer leastcost ; + halfword bestplace ; + scaled prevdp ; + smallnumber t ; + prevp = p ; + leastcost = 1073741823L ; + activewidth [ 1 ] = 0 ; + activewidth [ 2 ] = 0 ; + activewidth [ 3 ] = 0 ; + activewidth [ 4 ] = 0 ; + activewidth [ 5 ] = 0 ; + activewidth [ 6 ] = 0 ; + prevdp = 0 ; + while ( true ) { + + if ( p == 0 ) + pi = -10000 ; + else switch ( mem [ p ] .hh.b0 ) + {case 0 : + case 1 : + case 2 : + { + activewidth [ 1 ] = activewidth [ 1 ] + prevdp + mem [ p + 3 ] .cint ; + prevdp = mem [ p + 2 ] .cint ; + goto lab45 ; + } + break ; + case 8 : + goto lab45 ; + break ; + case 10 : + if ( ( mem [ prevp ] .hh.b0 < 9 ) ) + pi = 0 ; + else goto lab90 ; + break ; + case 11 : + { + if ( mem [ p ] .hh .v.RH == 0 ) + t = 12 ; + else t = mem [ mem [ p ] .hh .v.RH ] .hh.b0 ; + if ( t == 10 ) + pi = 0 ; + else goto lab90 ; + } + break ; + case 12 : + pi = mem [ p + 1 ] .cint ; + break ; + case 4 : + case 3 : + goto lab45 ; + break ; + default: + confusion ( 955 ) ; + break ; + } + if ( pi < 10000 ) + { + if ( activewidth [ 1 ] < h ) + if ( ( activewidth [ 3 ] != 0 ) || ( activewidth [ 4 ] != 0 ) || ( + activewidth [ 5 ] != 0 ) ) + b = 0 ; + else b = badness ( h - activewidth [ 1 ] , activewidth [ 2 ] ) ; + else if ( activewidth [ 1 ] - h > activewidth [ 6 ] ) + b = 1073741823L ; + else b = badness ( activewidth [ 1 ] - h , activewidth [ 6 ] ) ; + if ( b < 1073741823L ) + if ( pi <= -10000 ) + b = pi ; + else if ( b < 10000 ) + b = b + pi ; + else b = 100000L ; + if ( b <= leastcost ) + { + bestplace = p ; + leastcost = b ; + bestheightplusdepth = activewidth [ 1 ] + prevdp ; + } + if ( ( b == 1073741823L ) || ( pi <= -10000 ) ) + goto lab30 ; + } + if ( ( mem [ p ] .hh.b0 < 10 ) || ( mem [ p ] .hh.b0 > 11 ) ) + goto lab45 ; + lab90: if ( mem [ p ] .hh.b0 == 11 ) + q = p ; + else { + + q = mem [ p + 1 ] .hh .v.LH ; + activewidth [ 2 + mem [ q ] .hh.b0 ] = activewidth [ 2 + mem [ q ] + .hh.b0 ] + mem [ q + 2 ] .cint ; + activewidth [ 6 ] = activewidth [ 6 ] + mem [ q + 3 ] .cint ; + if ( ( mem [ q ] .hh.b1 != 0 ) && ( mem [ q + 3 ] .cint != 0 ) ) + { + { + if ( interaction == 3 ) + ; + printnl ( 262 ) ; + print ( 956 ) ; + } + { + helpptr = 4 ; + helpline [ 3 ] = 957 ; + helpline [ 2 ] = 958 ; + helpline [ 1 ] = 959 ; + helpline [ 0 ] = 918 ; + } + error () ; + r = newspec ( q ) ; + mem [ r ] .hh.b1 = 0 ; + deleteglueref ( q ) ; + mem [ p + 1 ] .hh .v.LH = r ; + q = r ; + } + } + activewidth [ 1 ] = activewidth [ 1 ] + prevdp + mem [ q + 1 ] .cint ; + prevdp = 0 ; + lab45: if ( prevdp > d ) + { + activewidth [ 1 ] = activewidth [ 1 ] + prevdp - d ; + prevdp = d ; + } + prevp = p ; + p = mem [ prevp ] .hh .v.RH ; + } + lab30: Result = bestplace ; + return(Result) ; +} +halfword zvsplit ( n , h ) +eightbits n ; +scaled h ; +{/* 10 30 */ register halfword Result; vsplit_regmem + halfword v ; + halfword p ; + halfword q ; + v = eqtb [ 11078 + n ] .hh .v.RH ; + if ( curmark [ 3 ] != 0 ) + { + deletetokenref ( curmark [ 3 ] ) ; + curmark [ 3 ] = 0 ; + deletetokenref ( curmark [ 4 ] ) ; + curmark [ 4 ] = 0 ; + } + if ( v == 0 ) + { + Result = 0 ; + return(Result) ; + } + if ( mem [ v ] .hh.b0 != 1 ) + { + { + if ( interaction == 3 ) + ; + printnl ( 262 ) ; + print ( 335 ) ; + } + printesc ( 960 ) ; + print ( 961 ) ; + printesc ( 962 ) ; + { + helpptr = 2 ; + helpline [ 1 ] = 963 ; + helpline [ 0 ] = 964 ; + } + error () ; + Result = 0 ; + return(Result) ; + } + q = vertbreak ( mem [ v + 5 ] .hh .v.RH , h , eqtb [ 13239 ] .cint ) ; + p = mem [ v + 5 ] .hh .v.RH ; + if ( p == q ) + mem [ v + 5 ] .hh .v.RH = 0 ; + else while ( true ) { + + if ( mem [ p ] .hh.b0 == 4 ) + if ( curmark [ 3 ] == 0 ) + { + curmark [ 3 ] = mem [ p + 1 ] .cint ; + curmark [ 4 ] = curmark [ 3 ] ; + mem [ curmark [ 3 ] ] .hh .v.LH = mem [ curmark [ 3 ] ] .hh .v.LH + 2 ; + } + else { + + deletetokenref ( curmark [ 4 ] ) ; + curmark [ 4 ] = mem [ p + 1 ] .cint ; + incr ( mem [ curmark [ 4 ] ] .hh .v.LH ) ; + } + if ( mem [ p ] .hh .v.RH == q ) + { + mem [ p ] .hh .v.RH = 0 ; + goto lab30 ; + } + p = mem [ p ] .hh .v.RH ; + } + lab30: ; + q = prunepagetop ( q ) ; + p = mem [ v + 5 ] .hh .v.RH ; + freenode ( v , 7 ) ; + if ( q == 0 ) + eqtb [ 11078 + n ] .hh .v.RH = 0 ; + else eqtb [ 11078 + n ] .hh .v.RH = vpackage ( q , 0 , 1 , 1073741823L ) ; + Result = vpackage ( p , h , 0 , eqtb [ 13239 ] .cint ) ; + return(Result) ; +} +void printtotals ( ) +{printtotals_regmem + printscaled ( pagesofar [ 1 ] ) ; + if ( pagesofar [ 2 ] != 0 ) + { + print ( 310 ) ; + printscaled ( pagesofar [ 2 ] ) ; + print ( 335 ) ; + } + if ( pagesofar [ 3 ] != 0 ) + { + print ( 310 ) ; + printscaled ( pagesofar [ 3 ] ) ; + print ( 309 ) ; + } + if ( pagesofar [ 4 ] != 0 ) + { + print ( 310 ) ; + printscaled ( pagesofar [ 4 ] ) ; + print ( 973 ) ; + } + if ( pagesofar [ 5 ] != 0 ) + { + print ( 310 ) ; + printscaled ( pagesofar [ 5 ] ) ; + print ( 974 ) ; + } + if ( pagesofar [ 6 ] != 0 ) + { + print ( 311 ) ; + printscaled ( pagesofar [ 6 ] ) ; + } +} +void zfreezepagespecs ( s ) +smallnumber s ; +{freezepagespecs_regmem + pagecontents = s ; + pagesofar [ 0 ] = eqtb [ 13237 ] .cint ; + pagemaxdepth = eqtb [ 13238 ] .cint ; + pagesofar [ 7 ] = 0 ; + pagesofar [ 1 ] = 0 ; + pagesofar [ 2 ] = 0 ; + pagesofar [ 3 ] = 0 ; + pagesofar [ 4 ] = 0 ; + pagesofar [ 5 ] = 0 ; + pagesofar [ 6 ] = 0 ; + leastpagecost = 1073741823L ; + ; +#ifdef STAT + if ( eqtb [ 12696 ] .cint > 0 ) + { + begindiagnostic () ; + printnl ( 982 ) ; + printscaled ( pagesofar [ 0 ] ) ; + print ( 983 ) ; + printscaled ( pagemaxdepth ) ; + enddiagnostic ( false ) ; + } +#endif /* STAT */ +} +void zboxerror ( n ) +eightbits n ; +{boxerror_regmem + error () ; + begindiagnostic () ; + printnl ( 832 ) ; + showbox ( eqtb [ 11078 + n ] .hh .v.RH ) ; + enddiagnostic ( true ) ; + flushnodelist ( eqtb [ 11078 + n ] .hh .v.RH ) ; + eqtb [ 11078 + n ] .hh .v.RH = 0 ; +} +void zensurevbox ( n ) +eightbits n ; +{ensurevbox_regmem + halfword p ; + p = eqtb [ 11078 + n ] .hh .v.RH ; + if ( p != 0 ) + if ( mem [ p ] .hh.b0 == 0 ) + { + { + if ( interaction == 3 ) + ; + printnl ( 262 ) ; + print ( 984 ) ; + } + { + helpptr = 3 ; + helpline [ 2 ] = 985 ; + helpline [ 1 ] = 986 ; + helpline [ 0 ] = 987 ; + } + boxerror ( n ) ; + } +} +void zfireup ( c ) +halfword c ; +{/* 10 */ fireup_regmem + halfword p, q, r, s ; + halfword prevp ; + unsigned char n ; + boolean wait ; + integer savevbadness ; + scaled savevfuzz ; + halfword savesplittopskip ; + if ( mem [ bestpagebreak ] .hh.b0 == 12 ) + { + geqworddefine ( 12702 , mem [ bestpagebreak + 1 ] .cint ) ; + mem [ bestpagebreak + 1 ] .cint = 10000 ; + } + else geqworddefine ( 12702 , 10000 ) ; + if ( curmark [ 2 ] != 0 ) + { + if ( curmark [ 0 ] != 0 ) + deletetokenref ( curmark [ 0 ] ) ; + curmark [ 0 ] = curmark [ 2 ] ; + incr ( mem [ curmark [ 0 ] ] .hh .v.LH ) ; + deletetokenref ( curmark [ 1 ] ) ; + curmark [ 1 ] = 0 ; + } + if ( c == bestpagebreak ) + bestpagebreak = 0 ; + if ( eqtb [ 11333 ] .hh .v.RH != 0 ) + { + { + if ( interaction == 3 ) + ; + printnl ( 262 ) ; + print ( 335 ) ; + } + printesc ( 405 ) ; + print ( 998 ) ; + { + helpptr = 2 ; + helpline [ 1 ] = 999 ; + helpline [ 0 ] = 987 ; + } + boxerror ( 255 ) ; + } + insertpenalties = 0 ; + savesplittopskip = eqtb [ 10292 ] .hh .v.RH ; + if ( eqtb [ 12716 ] .cint <= 0 ) + { + r = mem [ memtop ] .hh .v.RH ; + while ( r != memtop ) { + + if ( mem [ r + 2 ] .hh .v.LH != 0 ) + { + n = mem [ r ] .hh.b1 ; + ensurevbox ( n ) ; + if ( eqtb [ 11078 + n ] .hh .v.RH == 0 ) + eqtb [ 11078 + n ] .hh .v.RH = newnullbox () ; + p = eqtb [ 11078 + n ] .hh .v.RH + 5 ; + while ( mem [ p ] .hh .v.RH != 0 ) p = mem [ p ] .hh .v.RH ; + mem [ r + 2 ] .hh .v.RH = p ; + } + r = mem [ r ] .hh .v.RH ; + } + } + q = memtop - 4 ; + mem [ q ] .hh .v.RH = 0 ; + prevp = memtop - 2 ; + p = mem [ prevp ] .hh .v.RH ; + while ( p != bestpagebreak ) { + + if ( mem [ p ] .hh.b0 == 3 ) + { + if ( eqtb [ 12716 ] .cint <= 0 ) + { + r = mem [ memtop ] .hh .v.RH ; + while ( mem [ r ] .hh.b1 != mem [ p ] .hh.b1 ) r = mem [ r ] .hh .v.RH + ; + if ( mem [ r + 2 ] .hh .v.LH == 0 ) + wait = true ; + else { + + wait = false ; + s = mem [ r + 2 ] .hh .v.RH ; + mem [ s ] .hh .v.RH = mem [ p + 4 ] .hh .v.LH ; + if ( mem [ r + 2 ] .hh .v.LH == p ) + { + if ( mem [ r ] .hh.b0 == 1 ) + if ( ( mem [ r + 1 ] .hh .v.LH == p ) && ( mem [ r + 1 ] .hh .v.RH + != 0 ) ) + { + while ( mem [ s ] .hh .v.RH != mem [ r + 1 ] .hh .v.RH ) s = mem + [ s ] .hh .v.RH ; + mem [ s ] .hh .v.RH = 0 ; + eqtb [ 10292 ] .hh .v.RH = mem [ p + 4 ] .hh .v.RH ; + mem [ p + 4 ] .hh .v.LH = prunepagetop ( mem [ r + 1 ] .hh .v.RH + ) ; + if ( mem [ p + 4 ] .hh .v.LH != 0 ) + { + tempptr = vpackage ( mem [ p + 4 ] .hh .v.LH , 0 , 1 , + 1073741823L ) ; + mem [ p + 3 ] .cint = mem [ tempptr + 3 ] .cint + mem [ + tempptr + 2 ] .cint ; + freenode ( tempptr , 7 ) ; + wait = true ; + } + } + mem [ r + 2 ] .hh .v.LH = 0 ; + n = mem [ r ] .hh.b1 ; + tempptr = mem [ eqtb [ 11078 + n ] .hh .v.RH + 5 ] .hh .v.RH ; + freenode ( eqtb [ 11078 + n ] .hh .v.RH , 7 ) ; + eqtb [ 11078 + n ] .hh .v.RH = vpackage ( tempptr , 0 , 1 , + 1073741823L ) ; + } + else { + + while ( mem [ s ] .hh .v.RH != 0 ) s = mem [ s ] .hh .v.RH ; + mem [ r + 2 ] .hh .v.RH = s ; + } + } + mem [ prevp ] .hh .v.RH = mem [ p ] .hh .v.RH ; + mem [ p ] .hh .v.RH = 0 ; + if ( wait ) + { + mem [ q ] .hh .v.RH = p ; + q = p ; + incr ( insertpenalties ) ; + } + else { + + deleteglueref ( mem [ p + 4 ] .hh .v.RH ) ; + freenode ( p , 5 ) ; + } + p = prevp ; + } + } + else if ( mem [ p ] .hh.b0 == 4 ) + { + if ( curmark [ 1 ] == 0 ) + { + curmark [ 1 ] = mem [ p + 1 ] .cint ; + incr ( mem [ curmark [ 1 ] ] .hh .v.LH ) ; + } + if ( curmark [ 2 ] != 0 ) + deletetokenref ( curmark [ 2 ] ) ; + curmark [ 2 ] = mem [ p + 1 ] .cint ; + incr ( mem [ curmark [ 2 ] ] .hh .v.LH ) ; + } + prevp = p ; + p = mem [ prevp ] .hh .v.RH ; + } + eqtb [ 10292 ] .hh .v.RH = savesplittopskip ; + if ( p != 0 ) + { + if ( mem [ memtop - 1 ] .hh .v.RH == 0 ) + if ( nestptr == 0 ) + curlist .tailfield = pagetail ; + else nest [ 0 ] .tailfield = pagetail ; + mem [ pagetail ] .hh .v.RH = mem [ memtop - 1 ] .hh .v.RH ; + mem [ memtop - 1 ] .hh .v.RH = p ; + mem [ prevp ] .hh .v.RH = 0 ; + } + savevbadness = eqtb [ 12690 ] .cint ; + eqtb [ 12690 ] .cint = 10000 ; + savevfuzz = eqtb [ 13242 ] .cint ; + eqtb [ 13242 ] .cint = 1073741823L ; + eqtb [ 11333 ] .hh .v.RH = vpackage ( mem [ memtop - 2 ] .hh .v.RH , + bestsize , 0 , pagemaxdepth ) ; + eqtb [ 12690 ] .cint = savevbadness ; + eqtb [ 13242 ] .cint = savevfuzz ; + if ( lastglue != 262143L ) + deleteglueref ( lastglue ) ; + pagecontents = 0 ; + pagetail = memtop - 2 ; + mem [ memtop - 2 ] .hh .v.RH = 0 ; + lastglue = 262143L ; + lastpenalty = 0 ; + lastkern = 0 ; + pagesofar [ 7 ] = 0 ; + pagemaxdepth = 0 ; + if ( q != memtop - 4 ) + { + mem [ memtop - 2 ] .hh .v.RH = mem [ memtop - 4 ] .hh .v.RH ; + pagetail = q ; + } + r = mem [ memtop ] .hh .v.RH ; + while ( r != memtop ) { + + q = mem [ r ] .hh .v.RH ; + freenode ( r , 4 ) ; + r = q ; + } + mem [ memtop ] .hh .v.RH = memtop ; + if ( ( curmark [ 0 ] != 0 ) && ( curmark [ 1 ] == 0 ) ) + { + curmark [ 1 ] = curmark [ 0 ] ; + incr ( mem [ curmark [ 0 ] ] .hh .v.LH ) ; + } + if ( eqtb [ 10813 ] .hh .v.RH != 0 ) + if ( deadcycles >= eqtb [ 12703 ] .cint ) + { + { + if ( interaction == 3 ) + ; + printnl ( 262 ) ; + print ( 1000 ) ; + } + printint ( deadcycles ) ; + print ( 1001 ) ; + { + helpptr = 3 ; + helpline [ 2 ] = 1002 ; + helpline [ 1 ] = 1003 ; + helpline [ 0 ] = 1004 ; + } + error () ; + } + else { + + outputactive = true ; + incr ( deadcycles ) ; + pushnest () ; + curlist .modefield = -1 ; + curlist .auxfield .cint = -65536000L ; + curlist .mlfield = - (integer) line ; + begintokenlist ( eqtb [ 10813 ] .hh .v.RH , 6 ) ; + newsavelevel ( 8 ) ; + normalparagraph () ; + scanleftbrace () ; + return ; + } + { + if ( mem [ memtop - 2 ] .hh .v.RH != 0 ) + { + if ( mem [ memtop - 1 ] .hh .v.RH == 0 ) + if ( nestptr == 0 ) + curlist .tailfield = pagetail ; + else nest [ 0 ] .tailfield = pagetail ; + else mem [ pagetail ] .hh .v.RH = mem [ memtop - 1 ] .hh .v.RH ; + mem [ memtop - 1 ] .hh .v.RH = mem [ memtop - 2 ] .hh .v.RH ; + mem [ memtop - 2 ] .hh .v.RH = 0 ; + pagetail = memtop - 2 ; + } + shipout ( eqtb [ 11333 ] .hh .v.RH ) ; + eqtb [ 11333 ] .hh .v.RH = 0 ; + } +} diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isitexd.h b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitexd.h new file mode 100644 index 0000000000..9016192dcb --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isitexd.h @@ -0,0 +1,532 @@ +#undef TRIP +#undef TRAP +#define STAT +#undef DEBUG +#include "../common/texmf.h" +#define memmax 262140L +#define memmin 0 +#define bufsize 3000 +#define errorline 79 +#define halferrorline 50 +#define maxprintline 79 +#define stacksize 300 +#define maxinopen 15 +#define fontmax 255 +#define fontmemsize 72000L +#define paramsize 60 +#define nestsize 40 +#define maxstrings 7500 +#define stringvacancies 74000L +#define poolsize 100000L +#define savesize 4000 +#define triesize 24000 +#define trieopsize 750 +#define negtrieopsize -750 +#define mintrieop 0 +#define maxtrieop 500 +#define dvibufsize 16384 +#define poolname "isitex.pool" +#define memtop 262140L +#define nil 0 +#define maxwl 64 +#define sonderzeichen 0 +#define bsta 1 +#define bstb 2 +#define bstc 3 +#define bstd 4 +#define bste 5 +#define bstf 6 +#define bstg 7 +#define bsth 8 +#define bsti 9 +#define bstj 10 +#define bstk 11 +#define bstl 12 +#define bstm 13 +#define bstn 14 +#define bsto 15 +#define bstp 16 +#define bstq 17 +#define bstr 18 +#define bsts 19 +#define bstt 20 +#define bstu 21 +#define bstv 22 +#define bstw 23 +#define bstx 24 +#define bsty 25 +#define bstz 26 +#define bstae 27 +#define bstoe 28 +#define bstue 29 +#define bstsz 30 +#define trennzeichen 31 +#define keine 1 +#define neben 2 +#define nebenck 3 +#define haupt 4 +#define haupt3 5 +#define tabsize 8191 +#define specletterID 4321 +#define voka 1 +#define voke 2 +#define voki 3 +#define voko 4 +#define voku 5 +#define vokae 6 +#define vokoe 7 +#define vokue 8 +#define vokie 9 +#define vokai 10 +#define vokei 11 +#define vokau 12 +#define vokaeu 13 +#define vokeu 14 +#define voky 15 +#define kons 16 +typedef unsigned char ASCIIcode ; +typedef unsigned char eightbits ; +typedef integer poolpointer ; +typedef integer strnumber ; +typedef unsigned char packedASCIIcode ; +typedef integer scaled ; +typedef integer nonnegativeinteger ; +typedef schar smallnumber ; +typedef unsigned char quarterword ; +typedef integer halfword ; +typedef schar twochoices ; +typedef schar fourchoices ; +#include "memory.h" +#include <malloc.h> +typedef schar glueord ; +typedef struct { + short modefield ; + halfword headfield, tailfield ; + integer pgfield, mlfield ; + memoryword auxfield ; + quarterword lhmfield, rhmfield ; +} liststaterecord ; +typedef schar groupcode ; +typedef struct { + quarterword statefield, indexfield ; + halfword startfield, locfield, limitfield, namefield ; +} instaterecord ; +typedef integer internalfontnumber ; +typedef integer fontindex ; +typedef integer dviindex ; +typedef integer trieopcode ; +typedef integer triepointer ; +typedef eightbits string80 [81] ; +typedef eightbits buchstabe ; +typedef short aword [maxwl + 1] ; +typedef aword wort ; +typedef boolean sperrvektor [maxwl + 1] ; +typedef boolean dudt [maxwl + 1] ; +typedef integer trennvektor [maxwl + 1] ; +typedef buchstabe ktabtype [256] ; +typedef unsigned long verdschlue ; +typedef verdschlue varr [maxwl + 1] ; +typedef integer intarr [maxwl + 1] ; +typedef struct { + boolean ausnahme ; + boolean untrennbar ; + integer erste ; + integer zweite ; + boolean endung, vorsilbe, stamm, ehervor, stammallein ; +} infotype ; +typedef eightbits infobyte ; +typedef struct { + verdschlue tabv ; + infobyte tabb ; + boolean frei ; + boolean wiederfrei ; +} tableentry ; +typedef eightbits hashelement [4] ; +typedef hashelement htabtype [tabsize + 1] ; +typedef trennvektor trenn16 [17] ; +typedef struct mdbk { + wort w12 ; + integer l1 ; + trennvektor tr1 ; + boolean neu1 ; + boolean del1 ; + boolean used1 ; + struct mdbk * li, * re ; +} mdbk ; +typedef struct mdmk { + wort w12 ; + integer l1 ; + trennvektor tr1 ; + boolean neu1 ; + struct mdmk * li, * re ; +} mdmk ; +typedef struct mdlk { + wort w12 ; + integer l1 ; + struct mdlk * li, * re ; +} mdlk ; +typedef struct mdek { + wort w12 ; + integer l1 ; + struct mdek * li, * re ; +} mdek ; +typedef mdbk * mdbknoten ; +typedef mdmk * mdmknoten ; +typedef mdlk * mdlknoten ; +typedef mdek * mdeknoten ; +typedef short hyphpointer ; +EXTERN integer bad ; +EXTERN ASCIIcode xord[256] ; +EXTERN ASCIIcode xchr[256] ; +EXTERN char nameoffile[FILENAMESIZE + 1] ; +EXTERN integer namelength ; +EXTERN ASCIIcode buffer[bufsize + 1] ; +EXTERN integer first ; +EXTERN integer last ; +EXTERN integer maxbufstack ; +EXTERN packedASCIIcode strpool[poolsize + 1] ; +EXTERN poolpointer strstart[maxstrings + 1] ; +EXTERN poolpointer poolptr ; +EXTERN strnumber strptr ; +EXTERN poolpointer initpoolptr ; +EXTERN strnumber initstrptr ; +#ifdef INITEX +EXTERN alphafile poolfile ; +#endif /* INITEX */ +EXTERN alphafile logfile ; +EXTERN schar selector ; +EXTERN schar dig[23] ; +EXTERN integer tally ; +EXTERN integer termoffset ; +EXTERN integer fileoffset ; +EXTERN ASCIIcode trickbuf[errorline + 1] ; +EXTERN integer trickcount ; +EXTERN integer firstcount ; +EXTERN schar interaction ; +EXTERN boolean deletionsallowed ; +EXTERN schar history ; +EXTERN schar errorcount ; +EXTERN strnumber helpline[6] ; +EXTERN schar helpptr ; +EXTERN boolean useerrhelp ; +EXTERN integer interrupt ; +EXTERN boolean OKtointerrupt ; +EXTERN boolean aritherror ; +EXTERN scaled remainder ; +EXTERN halfword tempptr ; +EXTERN memoryword +#define zmem (zzzaa - (int)(memmin)) + zzzaa[memmax - memmin + 1] ; +EXTERN halfword lomemmax ; +EXTERN halfword himemmin ; +EXTERN integer varused, dynused ; +EXTERN halfword avail ; +EXTERN halfword memend ; +EXTERN halfword rover ; +#ifdef DEBUG +EXTERN boolean +#define freearr (zzzab - (int)(memmin)) + zzzab[memmax - memmin + 1] ; +EXTERN boolean +#define wasfree (zzzac - (int)(memmin)) + zzzac[memmax - memmin + 1] ; +EXTERN halfword wasmemend, waslomax, washimin ; +EXTERN boolean panicking ; +#endif /* DEBUG */ +EXTERN integer fontinshortdisplay ; +EXTERN integer depththreshold ; +EXTERN integer breadthmax ; +EXTERN liststaterecord nest[nestsize + 1] ; +EXTERN integer nestptr ; +EXTERN integer maxneststack ; +EXTERN liststaterecord curlist ; +EXTERN short shownmode ; +EXTERN schar oldsetting ; +EXTERN memoryword zeqtb[13510] ; +EXTERN quarterword +#define xeqlevel (zzzad -12663) + zzzad[847] ; +EXTERN twohalves +#define hash (zzzae -514) + zzzae[9767] ; +EXTERN halfword hashused ; +EXTERN boolean nonewcontrolsequence ; +EXTERN integer cscount ; +EXTERN memoryword savestack[savesize + 1] ; +EXTERN integer saveptr ; +EXTERN integer maxsavestack ; +EXTERN quarterword curlevel ; +EXTERN groupcode curgroup ; +EXTERN integer curboundary ; +EXTERN integer magset ; +EXTERN eightbits curcmd ; +EXTERN halfword curchr ; +EXTERN halfword curcs ; +EXTERN halfword curtok ; +EXTERN instaterecord inputstack[stacksize + 1] ; +EXTERN integer inputptr ; +EXTERN integer maxinstack ; +EXTERN instaterecord curinput ; +EXTERN integer inopen ; +EXTERN integer openparens ; +EXTERN alphafile inputfile[maxinopen + 1] ; +EXTERN integer line ; +EXTERN integer linestack[maxinopen + 1] ; +EXTERN schar scannerstatus ; +EXTERN halfword warningindex ; +EXTERN halfword defref ; +EXTERN halfword paramstack[paramsize + 1] ; +EXTERN integer paramptr ; +EXTERN integer maxparamstack ; +EXTERN integer alignstate ; +EXTERN integer baseptr ; +EXTERN halfword parloc ; +EXTERN halfword partoken ; +EXTERN boolean forceeof ; +EXTERN halfword curmark[5] ; +EXTERN schar longstate ; +EXTERN halfword pstack[9] ; +EXTERN integer curval ; +EXTERN schar curvallevel ; +EXTERN smallnumber radix ; +EXTERN glueord curorder ; +EXTERN alphafile readfile[16] ; +EXTERN schar readopen[17] ; +EXTERN halfword condptr ; +EXTERN schar iflimit ; +EXTERN smallnumber curif ; +EXTERN integer ifline ; +EXTERN integer skipline ; +EXTERN strnumber curname ; +EXTERN strnumber curarea ; +EXTERN strnumber curext ; +EXTERN poolpointer areadelimiter ; +EXTERN poolpointer extdelimiter ; +EXTERN integer formatdefaultlength ; +EXTERN ccharpointer TEXformatdefault ; +EXTERN boolean nameinprogress ; +EXTERN strnumber jobname ; +EXTERN boolean logopened ; +EXTERN bytefile dvifile ; +EXTERN strnumber outputfilename ; +EXTERN strnumber logname ; +EXTERN bytefile tfmfile ; +EXTERN memoryword fontinfo[fontmemsize + 1] ; +EXTERN fontindex fmemptr ; +EXTERN internalfontnumber fontptr ; +EXTERN fourquarters fontcheck[fontmax + 1] ; +EXTERN scaled fontsize[fontmax + 1] ; +EXTERN scaled fontdsize[fontmax + 1] ; +EXTERN halfword fontparams[fontmax + 1] ; +EXTERN strnumber fontname[fontmax + 1] ; +EXTERN strnumber fontarea[fontmax + 1] ; +EXTERN eightbits fontbc[fontmax + 1] ; +EXTERN eightbits fontec[fontmax + 1] ; +EXTERN halfword fontglue[fontmax + 1] ; +EXTERN boolean fontused[fontmax + 1] ; +EXTERN integer hyphenchar[fontmax + 1] ; +EXTERN integer skewchar[fontmax + 1] ; +EXTERN fontindex bcharlabel[fontmax + 1] ; +EXTERN short fontbchar[fontmax + 1] ; +EXTERN short fontfalsebchar[fontmax + 1] ; +EXTERN integer charbase[fontmax + 1] ; +EXTERN integer widthbase[fontmax + 1] ; +EXTERN integer heightbase[fontmax + 1] ; +EXTERN integer depthbase[fontmax + 1] ; +EXTERN integer italicbase[fontmax + 1] ; +EXTERN integer ligkernbase[fontmax + 1] ; +EXTERN integer kernbase[fontmax + 1] ; +EXTERN integer extenbase[fontmax + 1] ; +EXTERN integer parambase[fontmax + 1] ; +EXTERN fourquarters nullcharacter ; +EXTERN integer totalpages ; +EXTERN scaled maxv ; +EXTERN scaled maxh ; +EXTERN integer maxpush ; +EXTERN integer lastbop ; +EXTERN integer deadcycles ; +EXTERN boolean doingleaders ; +EXTERN quarterword c, f ; +EXTERN scaled ruleht, ruledp, rulewd ; +EXTERN halfword g ; +EXTERN integer lq, lr ; +EXTERN eightbits dvibuf[dvibufsize + 1] ; +EXTERN dviindex halfbuf ; +EXTERN dviindex dvilimit ; +EXTERN dviindex dviptr ; +EXTERN integer dvioffset ; +EXTERN integer dvigone ; +EXTERN halfword downptr, rightptr ; +EXTERN scaled dvih, dviv ; +EXTERN scaled curh, curv ; +EXTERN internalfontnumber dvif ; +EXTERN integer curs ; +EXTERN scaled totalstretch[4], totalshrink[4] ; +EXTERN integer lastbadness ; +EXTERN halfword adjusttail ; +EXTERN integer packbeginline ; +EXTERN twohalves emptyfield ; +EXTERN fourquarters nulldelimiter ; +EXTERN halfword curmlist ; +EXTERN smallnumber curstyle ; +EXTERN smallnumber cursize ; +EXTERN scaled curmu ; +EXTERN boolean mlistpenalties ; +EXTERN internalfontnumber curf ; +EXTERN quarterword curc ; +EXTERN fourquarters curi ; +EXTERN integer magicoffset ; +EXTERN halfword curalign ; +EXTERN halfword curspan ; +EXTERN halfword curloop ; +EXTERN halfword alignptr ; +EXTERN halfword curhead, curtail ; +EXTERN halfword justbox ; +EXTERN halfword passive ; +EXTERN halfword printednode ; +EXTERN halfword passnumber ; +EXTERN scaled activewidth[7] ; +EXTERN scaled curactivewidth[7] ; +EXTERN scaled background[7] ; +EXTERN scaled breakwidth[7] ; +EXTERN boolean noshrinkerroryet ; +EXTERN halfword curp ; +EXTERN boolean secondpass ; +EXTERN boolean finalpass ; +EXTERN integer threshold ; +EXTERN integer minimaldemerits[4] ; +EXTERN integer minimumdemerits ; +EXTERN halfword bestplace[4] ; +EXTERN halfword bestplline[4] ; +EXTERN scaled discwidth ; +EXTERN halfword easyline ; +EXTERN halfword lastspecialline ; +EXTERN scaled firstwidth ; +EXTERN scaled secondwidth ; +EXTERN scaled firstindent ; +EXTERN scaled secondindent ; +EXTERN halfword bestbet ; +EXTERN integer fewestdemerits ; +EXTERN halfword bestline ; +EXTERN integer actuallooseness ; +EXTERN integer linediff ; +EXTERN aword hc ; +EXTERN smallnumber hn ; +EXTERN halfword ha, hb ; +EXTERN integer hyfdebi, hyfdebj ; +EXTERN boolean hyfdebb ; +EXTERN halfword sip, siq, sir, sis ; +EXTERN internalfontnumber hf ; +EXTERN short hu[64] ; +EXTERN integer hyfchar ; +EXTERN ASCIIcode curlang ; +EXTERN integer lhyf, rhyf ; +EXTERN halfword +#define dirtyumlaut (zzzaf +1) + zzzaf[66] ; +EXTERN schar hyf[65] ; +EXTERN halfword initlist ; +EXTERN boolean initlig ; +EXTERN boolean initlft ; +EXTERN integer hyfpen[65] ; +EXTERN trennvektor hyfsi ; +EXTERN wort hcsi ; +EXTERN halfword hyfdisc[65] ; +EXTERN smallnumber hyphenpassed ; +EXTERN halfword curl, curr ; +EXTERN halfword curq ; +EXTERN halfword ligstack ; +EXTERN boolean ligaturepresent ; +EXTERN boolean lfthit, rthit ; +EXTERN halfword trietrl[triesize + 1] ; +EXTERN halfword trietro[triesize + 1] ; +EXTERN quarterword trietrc[triesize + 1] ; +EXTERN smallnumber hyfdistance[trieopsize + 1] ; +EXTERN smallnumber hyfnum[trieopsize + 1] ; +EXTERN quarterword hyfnext[trieopsize + 1] ; +EXTERN integer opstart[256] ; +EXTERN ktabtype ktab ; +EXTERN htabtype htab ; +EXTERN integer anzahl ; +EXTERN alphafile hashfile ; +EXTERN alphafile hsmem, hslex, hsedt ; +EXTERN integer kombtab[6][6] ; +EXTERN boolean konsonant[31] ; +EXTERN boolean hsstart ; +EXTERN integer isidebug ; +EXTERN char auswahl, schnuller ; +EXTERN boolean mehrdanz ; +EXTERN mdbknoten mdb ; +EXTERN mdmknoten mdm ; +EXTERN mdlknoten mdl ; +EXTERN mdeknoten mde ; +EXTERN mdbk mdbschnuller ; +EXTERN mdmk mdmschnuller ; +EXTERN mdlk mdlschnuller ; +EXTERN mdek mdeschnuller ; +EXTERN integer hsii, hsij ; +EXTERN integer revtab[256] ; +EXTERN strnumber hyphword[608] ; +EXTERN halfword hyphlist[608] ; +EXTERN hyphpointer hyphcount ; +#ifdef INITEX +EXTERN integer +#define trieophash (zzzag - (int)(negtrieopsize)) + zzzag[trieopsize - negtrieopsize + 1] ; +EXTERN trieopcode trieused[256] ; +EXTERN ASCIIcode trieoplang[trieopsize + 1] ; +EXTERN trieopcode trieopval[trieopsize + 1] ; +EXTERN integer trieopptr ; +#endif /* INITEX */ +EXTERN trieopcode maxopused ; +EXTERN boolean smallop ; +#ifdef INITEX +EXTERN packedASCIIcode triec[triesize + 1] ; +EXTERN trieopcode trieo[triesize + 1] ; +EXTERN triepointer triel[triesize + 1] ; +EXTERN triepointer trier[triesize + 1] ; +EXTERN triepointer trieptr ; +EXTERN triepointer triehash[triesize + 1] ; +#endif /* INITEX */ +#ifdef INITEX +EXTERN boolean trietaken[triesize + 1] ; +EXTERN triepointer triemin[256] ; +EXTERN triepointer triemax ; +EXTERN boolean trienotready ; +#endif /* INITEX */ +EXTERN scaled bestheightplusdepth ; +EXTERN halfword pagetail ; +EXTERN schar pagecontents ; +EXTERN scaled pagemaxdepth ; +EXTERN halfword bestpagebreak ; +EXTERN integer leastpagecost ; +EXTERN scaled bestsize ; +EXTERN scaled pagesofar[8] ; +EXTERN halfword lastglue ; +EXTERN integer lastpenalty ; +EXTERN scaled lastkern ; +EXTERN integer insertpenalties ; +EXTERN boolean outputactive ; +EXTERN internalfontnumber mainf ; +EXTERN fourquarters maini ; +EXTERN fourquarters mainj ; +EXTERN fontindex maink ; +EXTERN halfword mainp ; +EXTERN integer mains ; +EXTERN halfword bchar ; +EXTERN halfword falsebchar ; +EXTERN boolean cancelboundary ; +EXTERN boolean insdisc ; +EXTERN halfword curbox ; +EXTERN halfword aftertoken ; +EXTERN boolean longhelpseen ; +EXTERN strnumber formatident ; +EXTERN wordfile fmtfile ; +EXTERN integer readyalready ; +EXTERN alphafile writefile[16] ; +EXTERN boolean writeopen[18] ; +EXTERN halfword writeloc ; +EXTERN poolpointer editnamestart ; +EXTERN integer editnamelength, editline, tfmtemp ; + +#include "coerce.h" diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.c b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.c new file mode 100644 index 0000000000..26de3e10c6 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.c @@ -0,0 +1,334 @@ +/* + * This program converts (mostly) the pseudo-Pascal generated by Tangle to C. + * The output depends on many C macros and some postprocessing by other + * programs. + * + * Arguments: + * -f: force strict interpretation of semantics of for stmt + * (never used with TeX and friends) + * -t: special optimizations for tex.p->tex.c + * -m: special optimizations for mf.p->mf.c + * -c: supply the base part of the name of the coerce.h file + * -h: supply the name of the standard header file + * -a: generate ANSI-style function prototypes + * -d: generate some additional debugging output + * + * The majority of this program (which includes ptoc.yacc and ptoc.lex) + * was written by Tomas Rokicki, with modifications by Tim Morgan, et al. + */ + +#include <stdio.h> +#include "web2cy.h" +#include "web2c.h" + + +/* Changing this value will probably stimulate bugs in some + preprocessors---those which want to put the expansion of a macro + entirely on one line. */ +#define max_line_length (78) +#define max_strings (50000) +#define hash_prime (101) +#define sym_table_size (8000) +#define unused (271828) + +/* Says whether to give voluminous progress reports. */ +boolean debug=FALSE; +int indent = 0; +int line_pos = 0; +int last_brace = 0; +int block_level = 0; +int last_tok; +int tex = 0, strict_for = 0, mf = 0; + +char safe_string[80]; +char var_list[800]; +char field_list[800]; +char last_id[80]; +char z_id[80]; +char next_temp[] = "zzzaa"; +char coerce_name[100] = "coerce.h"; + +long last_i_num; +int ii, l_s; +long lower_bound, upper_bound; +extern FILE *fopen(); +FILE *std; +FILE *coerce; +int pf_count = 1; +#ifdef ANSI +boolean ansi = TRUE; +#else +boolean ansi = FALSE; +#endif + +char *std_header = "null.h"; /* Default include filename */ + +char strings[max_strings]; +int hash_list[hash_prime]; +short global = 1; +#ifdef MS_DOS +struct sym_entry huge sym_table[sym_table_size]; +#else +struct sym_entry sym_table[sym_table_size]; +#endif +int next_sym_free = -1, next_string_free = 0; +int mark_sym_free, mark_string_free; + +extern int yyleng; +#ifdef FLEX +extern char *yytext; +#else /* LEX */ +#ifdef HP +extern unsigned char yytext[]; +#else /* not HP */ +extern char yytext[]; +#endif /* not HP */ +#endif /* LEX */ + +void find_next_temp() +{ + next_temp[4]++; + if (next_temp[4] > 'z') { + next_temp[4] = 'a'; + next_temp[3]++; + } +} + +void normal() +{ + std = stdout; +} + +void new_line() +{ + if (!std) + return; + if (line_pos > 0) { + (void) putc('\n', std); + line_pos = 0; + } +} + +void indent_line() +{ + new_line(); +} + + +/* Output the string S to `std'. */ + +void +my_output (s) + char *s; +{ + int len = strlen (s); + int less_indent = 0; + + if (!std) + return; + + if (line_pos + len > max_line_length) + indent_line (); + + if (indent > 1 && (strcmp(s, "case") == 0 || strcmp(s, "default") == 0)) + less_indent = 2; + + while (line_pos < indent * 2 - less_indent) + { + fputs (" ", std); + line_pos += 2; + } + + (void) fprintf (std, "%s ", s); + line_pos += len + 1; + + last_brace = (s[0] == '}'); +} + +void semicolon() +{ + if (!last_brace) { + my_output(";"); + indent_line(); + last_brace = 1; + } +} + + +/* Since a syntax error can never be recovered from, we exit here with + bad status. */ + +void yyerror(s) char *s; +{ + (void) fflush(stdout); + (void) fprintf(stderr, " %s\n", s); + (void) fprintf(stderr, "Last token = %d, ", last_tok); + (void) fprintf(stderr, "error buffer = `%s',\n\t", yytext); + (void) fprintf(stderr, "last id = `%s' (", last_id); + ii = search_table(last_id); + if (ii == -1) + (void) fprintf(stderr, "not in symbol table"); + else + switch (sym_table[ii].typ) { + case undef_id_tok: + (void) fprintf(stderr, "undefined"); + break; + case var_id_tok: + (void) fprintf(stderr, "variable"); + break; + case const_id_tok: + (void) fprintf(stderr, "constant"); + break; + case type_id_tok: + (void) fprintf(stderr, "type"); + break; + case proc_id_tok: + (void) fprintf(stderr, "parameterless procedure"); + break; + case proc_param_tok: + (void) fprintf(stderr, "procedure with parameters"); + break; + case fun_id_tok: + (void) fprintf(stderr, "parameterless function"); + break; + case fun_param_tok: + (void) fprintf(stderr, "function with parameters"); + break; + default: + (void) fprintf(stderr, "unknown!"); + break; + } + fprintf(stderr, ").\n"); + exit(1); + if (debug) { + (void) fprintf(stderr, "Next sym free = %d\n", next_sym_free); + (void) fprintf(stderr, "Mark sym = %d\n", mark_sym_free); + (void) fprintf(stderr, "Next string free = %d\n", next_string_free); + (void) fprintf(stderr, "Mark string = %d\n", mark_string_free); + } +} + +int hash(id) char *id; +{ + register int i = 0, j; + for (j = 0; id[j] != 0; j++) + i = (i + i + id[j]) % hash_prime; + return (i); +} + +int search_table(id) char *id; +{ + int ptr; + ptr = hash_list[hash(id)]; + while (ptr != -1) { + if (strcmp(id, sym_table[ptr].id) == 0) + return (ptr); + else + ptr = sym_table[ptr].next; + } + return (-1); +} + +int add_to_table(id) char *id; +{ + int h, ptr; + h = hash(id); + ptr = hash_list[h]; + hash_list[h] = (++next_sym_free); + sym_table[next_sym_free].next = ptr; + sym_table[next_sym_free].val = unused; + sym_table[next_sym_free].id = strings + next_string_free; + sym_table[next_sym_free].var_formal = FALSE; + sym_table[next_sym_free].var_not_needed = FALSE; + (void) strcpy(strings + next_string_free, id); + next_string_free += strlen(id) + 1; + return (next_sym_free); +} + +void remove_locals() +{ + int h, ptr; + for (h = 0; h < hash_prime; h++) { + next_sym_free = mark_sym_free; + next_string_free = mark_string_free; + ptr = hash_list[h]; + while (ptr > next_sym_free) + ptr = sym_table[ptr].next; + hash_list[h] = ptr; + } + global = 1; +} + +void +mark() +{ + mark_sym_free = next_sym_free; + mark_string_free = next_string_free; + global = 0; +} + + +void +initialize() +{ + register int i; + + for (i = 0; i < hash_prime; hash_list[i++] = -1) + ; + + normal (); + + coerce = fopen (coerce_name, "w"); + if (coerce == NULL) + { + perror (coerce_name); + exit (1); + } +} + +void +main (argc, argv) + int argc; + char *argv[]; +{ + int error, i; + + for (i=1; i < argc; i++) if (argv[i][0] == '-') switch (argv[i][1]) { + case 't': + tex = TRUE; + break; + case 'm': + mf = TRUE; + break; + case 'f': + strict_for = TRUE; + break; + case 'h': + std_header = &argv[i][2]; + break; + case 'd': + debug = TRUE; + break; + case 'a': + ansi = TRUE; + break; + case 'c': + (void) sprintf(coerce_name, "%s.h", &argv[i][2]); + break; + default: + fprintf(stderr, "Unknown option %s, ignored\n", argv[i]); + break; + } + else { + fprintf(stderr, "Unknown option %s, ignored\n", argv[i]); + } + + initialize (); + error = yyparse (); + new_line (); + + if (debug) + (void) fprintf(stderr, "%d symbols.\n", next_sym_free); + + exit(error); +} diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.h b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.h new file mode 100644 index 0000000000..3ddb64b98d --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.h @@ -0,0 +1,93 @@ +/* web2c.h: general includes for web2c. */ + +#include <stdio.h> +#include "site.h" +#include "common.h" + +#ifdef SYSV +#define bcopy(s,d,n) memcpy((d),(s),(n)) +#define bcmp(s1,s2,n) memcmp((s1),(s2),(n)) +#define bzero(s,n) memset((s),0,(n)) +#endif + +#ifdef __GNUC__ +#define alloca __builtin_alloca +#else +#ifdef sparc +#include <alloca.h> +#else +char *alloca (); +#endif +#endif + +#define ex_32 (2) +#define ex_real (3) +#define max(a,b) ((a>b)?a:b) + +extern int indent; +extern int line_pos; +extern int last_brace; +extern int block_level; +extern int ii; +extern int last_tok; + +extern char safe_string[80]; +extern char var_list[800]; +extern char field_list[800]; +extern char last_id[80]; +extern char z_id[80]; +extern char next_temp[]; + +extern long last_i_num; +extern int ii, l_s; +extern long lower_bound, upper_bound; +extern FILE *fopen(); +extern FILE *std; +extern int pf_count; + +#include "symtab.h" + +extern char strings[]; +extern int hash_list[]; +extern short global; +#ifdef MS_DOS +extern struct sym_entry huge sym_table[]; +#else +extern struct sym_entry sym_table[]; +#endif +extern int next_sym_free, next_string_free; +extern int mark_sym_free, mark_string_free; + +#ifdef FLEX_SCANNER +extern char *yytext; + +#else /* LEX */ +#ifdef HP +extern unsigned char yytext[]; +#else +extern char yytext[]; +#endif + +#endif /* LEX */ + +#ifdef ANSI +extern void exit(int); +extern int yyparse(void); +void find_next_temp(void); +void normal(void); +void new_line(void); +void indent_line(void); +void my_output(char *); +void semicolon(void); +void yyerror(char *); +int hash(char *); +int search_table(char *); +int add_to_table(char *); +void remove_locals(void); +void mark(void); +void initialize(void); +void main(int,char * *); +#else /* not ANSI */ +void find_next_temp(), normal(), new_line(), indent_line(), my_output(); +void semicolon(), yyerror(), remove_locals(), mark(), initialize(); +#endif /* not ANSI */ diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.yacc b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.yacc new file mode 100644 index 0000000000..92668dd113 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/isiweb2c.yacc @@ -0,0 +1,1347 @@ +/* web2c.yacc -- parse most of Pascal, and output C. */ + +%token array_tok begin_tok case_tok const_tok do_tok downto_tok else_tok + end_tok file_tok for_tok function_tok goto_tok if_tok label_tok + of_tok procedure_tok program_tok record_tok repeat_tok then_tok + to_tok type_tok until_tok var_tok while_tok integer_tok real_tok + others_tok r_num_tok i_num_tok string_literal_tok single_char_tok + assign_tok two_dots_tok unknown_tok undef_id_tok var_id_tok + proc_id_tok proc_param_tok fun_id_tok fun_param_tok const_id_tok + type_id_tok hhb0_tok hhb1_tok field_id_tok define_tok field_tok + break_tok + +%nonassoc '=' not_eq_tok '<' '>' less_eq_tok great_eq_tok +%left '+' '-' or_tok +%right unary_plus_tok unary_minus_tok +%left '*' '/' div_tok mod_tok and_tok +%right not_tok + +%{ +#include "web2c.h" + +#define symbol(x) sym_table[x].id +#define MAX_ARGS 50 + +static char fn_return_type[50], for_stack[300], control_var[50], + relation[3]; +static char arg_type[MAX_ARGS][30]; +static int last_type = -1, ids_typed; +char my_routine[100]; /* Name of routine being parsed, if any */ +static char array_bounds[80], array_offset[80]; +static int uses_mem, uses_eqtb, lower_sym, upper_sym; +static FILE *orig_std; +boolean doing_statements = FALSE; +static boolean var_formals = FALSE; +static int param_id_list[MAX_ARGS], ids_paramed=0; + +extern char conditional[], temp[], *std_header; +extern int tex, mf, strict_for; +extern boolean ansi; +extern FILE *coerce; +extern char coerce_name[]; +extern boolean debug; + +/* Forward refs */ +#ifdef ANSI +static long labs(long x); +static void compute_array_bounds(void); +static void fixup_var_list(void); +static void do_proc_args(void); +static void gen_function_head(void); +static boolean doreturn(char *label); +extern int yylex(void); +#else /* not ANSI */ +static long labs(); +static void compute_array_bounds(), fixup_var_list(); +static void do_proc_args(), gen_function_head(); +static boolean doreturn(); +#endif /* not ANSI */ + +/* Type hacking for AIX. */ +#ifdef AIX +#define UNSIGNED_SHORT_STRING "int" +#else +#define UNSIGNED_SHORT_STRING "unsigned short" +#endif + +%} + +%start PROGRAM + +%% + +PROGRAM: DEFS + PROGRAM_HEAD + {block_level++; + printf("#include \"%s\"\n", std_header);} + LABEL_DEC_PART CONST_DEC_PART TYPE_DEC_PART + VAR_DEC_PART + {printf("\n#include \"%s\"\n", coerce_name); } + P_F_DEC_PART + BODY + {YYACCEPT;} + ; + +DEFS: /* empty */ + | DEFS DEF + ; + +DEF: define_tok field_tok undef_id_tok ';' + { + ii = add_to_table(last_id); + sym_table[ii].typ = field_id_tok; + } + | define_tok function_tok undef_id_tok ';' + { + ii = add_to_table(last_id); + sym_table[ii].typ = fun_id_tok; + } + | define_tok const_tok undef_id_tok ';' + { + ii = add_to_table(last_id); + sym_table[ii].typ = const_id_tok; + } + | define_tok function_tok undef_id_tok '(' ')' ';' + { + ii = add_to_table(last_id); + sym_table[ii].typ = fun_param_tok; + } + | define_tok procedure_tok undef_id_tok ';' + { + ii = add_to_table(last_id); + sym_table[ii].typ = proc_id_tok; + } + | define_tok procedure_tok undef_id_tok '(' ')' ';' + { + ii = add_to_table(last_id); + sym_table[ii].typ = proc_param_tok; + } + | define_tok type_tok undef_id_tok ';' + { + ii = add_to_table(last_id); + sym_table[ii].typ = type_id_tok; + } + | define_tok type_tok undef_id_tok '=' + SUBRANGE_TYPE ';' + { + ii = add_to_table(last_id); + sym_table[ii].typ = type_id_tok; + sym_table[ii].val = lower_bound; + sym_table[ii].val_sym = lower_sym; + sym_table[ii].upper = upper_bound; + sym_table[ii].upper_sym = upper_sym; + } + | define_tok var_tok undef_id_tok ';' + { + ii = add_to_table(last_id); + sym_table[ii].typ = var_id_tok; + } + ; + +PROGRAM_HEAD: program_tok undef_id_tok ';' + ; + +BLOCK: + { if (block_level > 0) my_output("{"); + indent++; block_level++; + } + LABEL_DEC_PART + CONST_DEC_PART TYPE_DEC_PART + {if (block_level == 2) { + if (strcmp(fn_return_type, "void")) { + my_output("register"); + my_output(fn_return_type); + my_output("Result;"); + } + if (tex) { + (void) sprintf(safe_string, "%s_regmem", + my_routine); + my_output(safe_string); + indent_line(); + } + } + } + VAR_DEC_PART + {if (block_level == 1) + puts("\n#include \"coerce.h\""); + doing_statements = TRUE; + } + STAT_PART + {if (block_level == 2) { + if (strcmp(fn_return_type,"void")) { + my_output("return(Result)"); + semicolon(); + } + if (tex) { + if (uses_mem && uses_eqtb) + (void) fprintf(coerce, + "#define %s_regmem register memoryword *mem=zmem, *eqtb=zeqtb;\n", + my_routine); + else if (uses_mem) + (void) fprintf(coerce, + "#define %s_regmem register memoryword *mem=zmem;\n", + my_routine); + else if (uses_eqtb) + (void) fprintf(coerce, + "#define %s_regmem register memoryword *eqtb=zeqtb;\n", + my_routine); + else + (void) fprintf(coerce, + "#define %s_regmem\n", + my_routine); + } + my_routine[0] = '\0'; + } + indent--; block_level--; + my_output("}"); new_line(); + doing_statements = FALSE; + } + ; + +LABEL_DEC_PART: /* empty */ + | label_tok + { my_output("/*"); } + LABEL_LIST ';' + { my_output("*/"); } + ; + +LABEL_LIST: LABEL + | LABEL_LIST ',' LABEL + ; + +LABEL: i_num_tok + { my_output(temp); } + ; + +CONST_DEC_PART: /* empty */ + | const_tok CONST_DEC_LIST + { indent_line(); } + ; + +CONST_DEC_LIST: CONST_DEC + | CONST_DEC_LIST CONST_DEC + ; + +CONST_DEC: + { new_line(); my_output("#define"); } + undef_id_tok + { ii=add_to_table(last_id); + sym_table[ii].typ = const_id_tok; + my_output(last_id); + } + '=' CONSTANT ';' + { sym_table[ii].val=last_i_num; + new_line(); } + ; + +CONSTANT: i_num_tok + { + (void) sscanf(temp, "%ld", &last_i_num); + if (labs((long) last_i_num) > 32767) + (void) strcat(temp, "L"); + my_output(temp); + $$ = ex_32; + } + | r_num_tok + { my_output(temp); + $$ = ex_real; + } + | STRING + { $$ = 0; } + | CONSTANT_ID + { $$ = ex_32; } + ; + +STRING: string_literal_tok + { int i, j; char s[132]; + j = 1; + s[0] = '"'; + for (i=1; yytext[i-1]!=0; i++) { + if (yytext[i] == '\\' || yytext[i] == '"') + s[j++]='\\'; + else if (yytext[i] == '\'') i++; + s[j++] = yytext[i]; + } + s[j-1] = '"'; + s[j] = 0; + my_output(s); + } + | single_char_tok + { char s[5]; + s[0]='\''; + if (yytext[1] == '\\' || yytext[1] == '\'') { + s[2] = yytext[1]; + s[1] = '\\'; + s[3] = '\''; + s[4] = '\0'; + } + else { + s[1] = yytext[1]; + s[2]='\''; + s[3]='\0'; + } + my_output(s); + } + ; + +CONSTANT_ID: const_id_tok + { my_output(last_id); } + ; + +TYPE_DEC_PART: /* empty */ + | type_tok TYPE_DEF_LIST + ; + +TYPE_DEF_LIST: TYPE_DEF + | TYPE_DEF_LIST TYPE_DEF + ; + +TYPE_DEF: + { my_output("typedef"); } + undef_id_tok + { ii = add_to_table(last_id); + sym_table[ii].typ = type_id_tok; + (void) strcpy(safe_string, last_id); + last_type = ii; + } + '=' + { + array_bounds[0] = 0; + array_offset[0] = 0; + } + TYPE ';' + { if (*array_offset) { + fprintf(stderr, "Cannot typedef arrays with offsets\n"); + exit(1); + } + my_output(safe_string); + my_output(array_bounds); + semicolon(); + last_type = -1; + } + ; + +TYPE: SIMPLE_TYPE + | STRUCTURED_TYPE + ; + +SIMPLE_TYPE: SUBRANGE_TYPE + { if (last_type >= 0) { + sym_table[ii].val = lower_bound; + sym_table[ii].val_sym = lower_sym; + sym_table[ii].upper = upper_bound; + sym_table[ii].upper_sym = upper_sym; + ii= -1; + } +/* The following code says: if the bounds are known at translation time + * on an integral type, then we select the smallest type of data which + * can represent it in ANSI C. We only use unsigned types when necessary. + */ + if (lower_sym == -1 && upper_sym == -1) { + if (lower_bound>= -127 && upper_bound<=127) + my_output("schar"); + else if (lower_bound >= 0 + && upper_bound <= 255) + my_output("unsigned char"); + else if (lower_bound >= -32767 + && upper_bound <= 32767) + my_output("short"); + else if (lower_bound >= 0 + && upper_bound <= 65535) + my_output(UNSIGNED_SHORT_STRING); + else my_output("integer"); + } + else my_output("integer"); + } + | TYPE_ID + ; + +SUBRANGE_TYPE: SUB_CONSTANT two_dots_tok SUB_CONSTANT + ; + +POSSIBLE_PLUS: /* empty */ + | unary_plus_tok + ; + +SUB_CONSTANT: POSSIBLE_PLUS i_num_tok + {lower_bound = upper_bound; + lower_sym = upper_sym; + (void) sscanf(temp, "%ld", &upper_bound); + upper_sym = -1; /* no sym table entry */ + } + | const_id_tok + { lower_bound = upper_bound; + lower_sym = upper_sym; + upper_bound = sym_table[l_s].val; + upper_sym = l_s; + } + ; + +TYPE_ID: type_id_tok + {if (last_type >= 0) { + sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed; + sym_table[last_type].upper = sym_table[l_s].upper; + sym_table[last_type].upper_sym = sym_table[l_s].upper_sym; + sym_table[last_type].val = sym_table[l_s].val; + sym_table[last_type].val_sym = sym_table[l_s].val_sym; + } + my_output(last_id); } + ; + +STRUCTURED_TYPE: ARRAY_TYPE + {if (last_type >= 0) + sym_table[last_type].var_not_needed = TRUE;} + | RECORD_TYPE + | FILE_TYPE + {if (last_type >= 0) + sym_table[last_type].var_not_needed = TRUE;} + | POINTER_TYPE + {if (last_type >= 0) + sym_table[last_type].var_not_needed = FALSE;} + ; + +POINTER_TYPE: '^' type_id_tok + {if (last_type >= 0) { + sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed; + sym_table[last_type].upper = sym_table[l_s].upper; + sym_table[last_type].upper_sym = sym_table[l_s].upper_sym; + sym_table[last_type].val = sym_table[l_s].val; + sym_table[last_type].val_sym = sym_table[l_s].val_sym; + } + my_output(last_id); my_output("*"); } + | '^' undef_id_tok /* HH for Isitex */ + {if (last_type >= 0) { + sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed; + sym_table[last_type].upper = sym_table[l_s].upper; + sym_table[last_type].upper_sym = sym_table[l_s].upper_sym; + sym_table[last_type].val = sym_table[l_s].val; + sym_table[last_type].val_sym = sym_table[l_s].val_sym; + } + my_output(last_id); my_output("*"); } + ; + +ARRAY_TYPE: array_tok '[' INDEX_TYPE ']' of_tok COMPONENT_TYPE + | array_tok '[' INDEX_TYPE ',' INDEX_TYPE ']' of_tok + COMPONENT_TYPE + ; + +INDEX_TYPE: SUBRANGE_TYPE + { compute_array_bounds(); } + | type_id_tok + { lower_bound = sym_table[l_s].val; + lower_sym = sym_table[l_s].val_sym; + upper_bound = sym_table[l_s].upper; + upper_sym = sym_table[l_s].upper_sym; + compute_array_bounds(); + } + ; + +COMPONENT_TYPE: TYPE + ; + + +RECORD_TYPE: record_tok + { my_output("struct"); my_output("{"); indent++;} + FIELD_LIST end_tok + { indent--; my_output("}"); semicolon(); } + ; + +FIELD_LIST: RECORD_SECTION + | FIELD_LIST ';' RECORD_SECTION + ; + +RECORD_SECTION: + { field_list[0] = 0; } + FIELD_ID_LIST ':' + { + /*array_bounds[0] = 0; + array_offset[0] = 0;*/ + } + TYPE + { int i=0, j; char ltemp[80]; + while(field_list[i++] == '!') { + j = 0; + while (field_list[i]) + ltemp[j++] = field_list[i++]; + i++; + if (field_list[i] == '!') + ltemp[j++] = ','; + ltemp[j] = 0; + my_output(ltemp); + } + semicolon(); + } + | /* empty */ + ; + +FIELD_ID_LIST: FIELD_ID + | FIELD_ID_LIST ',' FIELD_ID + ; + +FIELD_ID: undef_id_tok + { int i=0, j=0; + while (field_list[i] == '!') + while(field_list[i++]); + ii = add_to_table(last_id); + sym_table[ii].typ = field_id_tok; + field_list[i++] = '!'; + while (last_id[j]) + field_list[i++] = last_id[j++]; + field_list[i++] = 0; + field_list[i++] = 0; + } + | field_id_tok + { int i=0, j=0; + while (field_list[i] == '!') + while(field_list[i++]); + field_list[i++] = '!'; + while (last_id[j]) + field_list[i++] = last_id[j++]; + field_list[i++] = 0; + field_list[i++] = 0; + } + ; + +FILE_TYPE: file_tok of_tok + { my_output("file_ptr /* of "); } + TYPE + { my_output("*/"); } + ; + +VAR_DEC_PART: /* empty */ + | var_tok VAR_DEC_LIST + ; + +VAR_DEC_LIST: VAR_DEC + | VAR_DEC_LIST VAR_DEC + ; + +VAR_DEC: + { var_list[0] = 0; + array_bounds[0] = 0; + array_offset[0] = 0; + var_formals = FALSE; + ids_paramed = 0; + } + VAR_ID_DEC_LIST ':' + { + array_bounds[0] = 0; + array_offset[0] = 0; + } + TYPE ';' + { fixup_var_list(); } + ; + +VAR_ID_DEC_LIST: VAR_ID + | VAR_ID_DEC_LIST ',' VAR_ID + ; + +VAR_ID: undef_id_tok + { int i=0, j=0; + ii = add_to_table(last_id); + sym_table[ii].typ = var_id_tok; + sym_table[ii].var_formal = var_formals; + param_id_list[ids_paramed++] = ii; + while (var_list[i] == '!') + while(var_list[i++]); + var_list[i++] = '!'; + while (last_id[j]) + var_list[i++] = last_id[j++]; + var_list[i++] = 0; + var_list[i++] = 0; + } + | var_id_tok + { int i=0, j=0; + ii = add_to_table(last_id); + sym_table[ii].typ = var_id_tok; + sym_table[ii].var_formal = var_formals; + param_id_list[ids_paramed++] = ii; + while (var_list[i] == '!') + while (var_list[i++]); + var_list[i++] = '!'; + while (last_id[j]) + var_list[i++] = last_id[j++]; + var_list[i++] = 0; + var_list[i++] = 0; + } + | field_id_tok + { int i=0, j=0; + ii = add_to_table(last_id); + sym_table[ii].typ = var_id_tok; + sym_table[ii].var_formal = var_formals; + param_id_list[ids_paramed++] = ii; + while (var_list[i] == '!') + while(var_list[i++]); + var_list[i++] = '!'; + while (last_id[j]) + var_list[i++] = last_id[j++]; + var_list[i++] = 0; + var_list[i++] = 0; + } + ; + +BODY: /* empty */ + | begin_tok + { my_output("void main_body() {"); + indent++; + new_line(); + } + STAT_LIST end_tok '.' + { indent--; my_output("}"); new_line(); } + ; + +P_F_DEC_PART: /* empty */ + | P_F_DEC + | P_F_DEC_PART P_F_DEC + ; + +P_F_DEC: PROCEDURE_DEC ';' + { indent_line(); remove_locals(); } + | FUNCTION_DEC ';' + { indent_line(); remove_locals(); } + ; + +PROCEDURE_DEC: PROCEDURE_HEAD BLOCK + ; + +PROCEDURE_HEAD: procedure_tok undef_id_tok + { ii = add_to_table(last_id); + if (debug) + (void) fprintf(stderr, "%3d Procedure %s\n", + pf_count++, last_id); + sym_table[ii].typ = proc_id_tok; + (void) strcpy(my_routine, last_id); + uses_eqtb = uses_mem = FALSE; + my_output("void"); + orig_std = std; + std = 0; + } + PARAM ';' + {(void) strcpy(fn_return_type, "void"); + do_proc_args(); + gen_function_head();} + | procedure_tok DECLARED_PROC + { ii = l_s; + if (debug) + (void) fprintf(stderr, "%3d Procedure %s\n", + pf_count++, last_id); + (void) strcpy(my_routine, last_id); + my_output("void"); + } + PARAM ';' + {(void) strcpy(fn_return_type, "void"); + do_proc_args(); + gen_function_head();} + ; + +PARAM: /* empty */ + { (void) strcpy(z_id, last_id); + mark(); + ids_paramed = 0; + } + | '(' + { if (ansi) (void) strcpy(z_id, last_id); + else (void) sprintf(z_id, "z%s", last_id); + ids_paramed = 0; + if (sym_table[ii].typ == proc_id_tok) + sym_table[ii].typ = proc_param_tok; + else if (sym_table[ii].typ == fun_id_tok) + sym_table[ii].typ = fun_param_tok; + mark(); + } + FORM_PAR_SEC_L ')' + ; + +FORM_PAR_SEC_L: FORM_PAR_SEC + | FORM_PAR_SEC_L ';' FORM_PAR_SEC + ; + +FORM_PAR_SEC1: { ids_typed = ids_paramed;} + VAR_ID_DEC_LIST ':' type_id_tok + {int i, need_var; + i = search_table(last_id); + need_var = !sym_table[i].var_not_needed; + for (i=ids_typed; i<ids_paramed; i++) { + (void) strcpy(arg_type[i], last_id); + if (need_var && sym_table[param_id_list[i]].var_formal) + (void) strcat(arg_type[i], " *"); + else sym_table[param_id_list[i]].var_formal = FALSE; + } + } + ; + +FORM_PAR_SEC: {var_formals = 0;} FORM_PAR_SEC1 + | var_tok {var_formals = 1;} FORM_PAR_SEC1 + ; + +DECLARED_PROC : proc_id_tok + | proc_param_tok + ; + +FUNCTION_DEC: FUNCTION_HEAD BLOCK + ; + +FUNCTION_HEAD: function_tok undef_id_tok + { orig_std = std; + std = 0; + ii = add_to_table(last_id); + if (debug) + (void) fprintf(stderr, "%3d Function %s\n", + pf_count++, last_id); + sym_table[ii].typ = fun_id_tok; + (void) strcpy(my_routine, last_id); + uses_eqtb = uses_mem = FALSE; + } + PARAM ':' + { normal(); + array_bounds[0] = 0; + array_offset[0] = 0; + } + RESULT_TYPE + {(void) strcpy(fn_return_type, yytext); + do_proc_args(); + gen_function_head(); + } + ';' + | + function_tok DECLARED_FUN + { orig_std = std; + std = 0; + ii = l_s; + if (debug) + (void) fprintf(stderr, "%3d Function %s\n", + pf_count++, last_id); + (void) strcpy(my_routine, last_id); + uses_eqtb = uses_mem = FALSE; + } + PARAM ':' + { normal(); + array_bounds[0] = 0; + array_offset[0] = 0; + } + RESULT_TYPE + {(void) strcpy(fn_return_type, yytext); + do_proc_args(); + gen_function_head(); + } + ';' + ; + +DECLARED_FUN : fun_id_tok + | fun_param_tok + ; + +RESULT_TYPE: TYPE + ; + +STAT_PART: begin_tok STAT_LIST end_tok + ; + +COMPOUND_STAT: begin_tok + {my_output("{"); indent++; new_line();} + STAT_LIST end_tok + { indent--; my_output("}"); new_line(); } + ; + +STAT_LIST: STATEMENT + | STAT_LIST ';' STATEMENT + ; + +STATEMENT: UNLAB_STAT + | S_LABEL ':' + UNLAB_STAT + ; + +S_LABEL: i_num_tok + {if (!doreturn(temp)) { + (void) sprintf(safe_string, "lab%s:", + temp); + my_output(safe_string); + } + } + ; + +UNLAB_STAT: SIMPLE_STAT + { semicolon(); } + | STRUCT_STAT + { semicolon(); } + ; + +SIMPLE_STAT: ASSIGN_STAT + | PROC_STAT + | GO_TO_STAT + | EMPTY_STAT + | break_tok + {my_output("break");} + ; + +ASSIGN_STAT: VARIABLE assign_tok + { my_output("="); } + EXPRESS + | FUNC_ID_AS assign_tok + { my_output("Result ="); } + EXPRESS + ; + +VARIABLE: var_id_tok + { if (strcmp(last_id, "mem") == 0) + uses_mem = 1; + else if (strcmp(last_id, "eqtb") == 0) + uses_eqtb = 1; + if (sym_table[l_s].var_formal) { + (void) putchar('('); + (void) putchar('*'); + my_output(last_id); + (void) putchar(')'); + } + else + my_output(last_id); + $$ = ex_32; + } + VAR_DESIG_LIST + | var_id_tok '^' '.' /* HH for Isitex */ + { if (sym_table[l_s].var_formal) { + (void) putchar('('); + (void) putchar('*'); + my_output(last_id); + (void) putchar(')'); + } + else + my_output(last_id); + (void) putchar('-'); + (void) putchar('>'); + $$ = ex_32; + } + FIELD_VARIABLE + | var_id_tok '^' + { (void) putchar('('); + (void) putchar('*'); + if (sym_table[l_s].var_formal) { + (void) putchar('('); + (void) putchar('*'); + my_output(last_id); + (void) putchar(')'); + } + else + my_output(last_id); + (void) putchar(')'); + $$ = ex_32; + } + | var_id_tok + { if (sym_table[l_s].var_formal) { + (void) putchar('('); + (void) putchar('*'); + my_output(last_id); + (void) putchar(')'); + } + else + my_output(last_id); + $$ = ex_32; } + ; + +FIELD_VARIABLE: field_id_tok + { my_output(last_id); } + VAR_DESIG_LIST + | field_id_tok '^' '.' + { my_output(last_id); + (void) putchar('-'); + (void) putchar('>'); + } + FIELD_VARIABLE + | field_id_tok + { my_output(last_id); } + ; + + +FUNC_ID_AS: fun_id_tok + { $$ = ex_32; } + | fun_param_tok + { $$ = ex_32; } + ; + +VAR_DESIG_LIST: VAR_DESIG + | VAR_DESIG_LIST VAR_DESIG + ; + +VAR_DESIG: '[' + { my_output("["); } + EXPRESS VAR_DESIG1 + { my_output("]"); } + | '.' field_id_tok + {if (tex || mf) { + if (strcmp(last_id, "int")==0) + my_output(".cint"); + else if (strcmp(last_id, "lh")==0) + my_output(".v.LH"); + else if (strcmp(last_id, "rh")==0) + my_output(".v.RH"); + else { + (void)sprintf(safe_string, ".%s", last_id); + my_output(safe_string); + } + } + else { + (void) sprintf(safe_string, ".%s", last_id); + my_output(safe_string); + } + } + | '.' hhb0_tok + { my_output(".hh.b0");} + | '.' hhb1_tok + { my_output(".hh.b1");} + ; + +VAR_DESIG1: ']' + | ',' + { my_output("][");} + EXPRESS ']' + ; + +EXPRESS: UNARY_OP EXPRESS %prec '*' + { $$ = $2; } + | EXPRESS '+' {my_output("+");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS '-' {my_output("-");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS '*' {my_output("*");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS div_tok {my_output("/");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS '=' {my_output("==");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS not_eq_tok {my_output("!=");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS mod_tok {my_output("%");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS '<' {my_output("<");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS '>' {my_output(">");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS less_eq_tok {my_output("<=");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS great_eq_tok {my_output(">=");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS and_tok {my_output("&&");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS or_tok {my_output("||");} EXPRESS + {$$ = max($1, $4);} + | EXPRESS '/' + { my_output("/ ((double)"); } + EXPRESS + {$$ = max($1, $4); my_output(")"); } + | FACTOR + { $$ = $1; } + ; + +UNARY_OP: unary_plus_tok + | unary_minus_tok + { my_output("- (integer)"); } + | not_tok + { my_output("!"); } + ; + +FACTOR: '(' + { my_output("("); } + EXPRESS ')' + { my_output(")"); $$ = $1; } + | VARIABLE + | CONSTANT + | fun_id_tok + { my_output(last_id); my_output("()"); } + | fun_param_tok + { my_output(last_id); } + PARAM_LIST + ; + +PARAM_LIST: '(' + { my_output("("); } + ACTUAL_PARAM_L ')' + { my_output(")"); } + ; + +ACTUAL_PARAM_L: ACTUAL_PARAM + | ACTUAL_PARAM_L ',' + { my_output(","); } + ACTUAL_PARAM + ; + +ACTUAL_PARAM: + EXPRESS WIDTH_FIELD + ; + +WIDTH_FIELD: ':' i_num_tok + | /* empty */ + ; + +PROC_STAT: proc_id_tok + { my_output(last_id); my_output("()"); } + | undef_id_tok + { my_output(last_id); + ii = add_to_table(last_id); + sym_table[ii].typ = proc_id_tok; + my_output("()"); + } + | proc_param_tok + { my_output(last_id); } + PARAM_LIST + ; + +GO_TO_STAT: goto_tok i_num_tok + {if (doreturn(temp)) { + if (strcmp(fn_return_type,"void")) + my_output("return(Result)"); + else + my_output("return"); + } else { + (void) sprintf(safe_string, "goto lab%s", + temp); + my_output(safe_string); + } + } + ; + +EMPTY_STAT: /* empty */ + ; + +STRUCT_STAT: COMPOUND_STAT + | CONDIT_STAT + | REPETIT_STAT + ; + +CONDIT_STAT: IF_STATEMENT + | CASE_STATEMENT + ; + +IF_STATEMENT: BEGIN_IF_STAT + | BEGIN_IF_STAT ELSE_STAT + ; + +BEGIN_IF_STAT: if_tok + { my_output("if"); my_output("("); } + EXPRESS + { my_output(")"); new_line();} + then_tok STATEMENT + ; + +ELSE_STAT: else_tok + { my_output("else"); } + STATEMENT + ; + +CASE_STATEMENT: case_tok + { my_output("switch"); my_output("("); } + EXPRESS of_tok + { my_output(")"); indent_line(); + my_output("{"); indent++; + } + CASE_EL_LIST END_CASE + { indent--; my_output("}"); new_line(); } + ; + +CASE_EL_LIST: CASE_ELEMENT + | CASE_EL_LIST ';' CASE_ELEMENT + ; + +CASE_ELEMENT: CASE_LAB_LIST ':' UNLAB_STAT + { my_output("break"); semicolon(); } + ; + +CASE_LAB_LIST: CASE_LAB + | CASE_LAB_LIST ',' CASE_LAB + ; + +CASE_LAB: i_num_tok + { my_output("case"); + my_output(temp); + my_output(":"); indent_line(); + } + | others_tok + { my_output("default:"); indent_line(); } + ; + +END_CASE: end_tok + | ';' end_tok + ; + +REPETIT_STAT: WHILE_STATEMENT + | REP_STATEMENT + | FOR_STATEMENT + ; + +WHILE_STATEMENT: while_tok + { my_output("while"); + my_output("("); + } + EXPRESS + { my_output(")"); } + do_tok STATEMENT + ; + +REP_STATEMENT: repeat_tok + { my_output("do"); my_output("{"); indent++; } + STAT_LIST until_tok + { indent--; my_output("}"); + my_output("while"); my_output("( ! ("); + } + EXPRESS + { my_output(") )"); } + ; + +FOR_STATEMENT: for_tok + { + my_output("{"); + my_output("register"); + my_output("integer"); + if (strict_for) + my_output("for_begin,"); + my_output("for_end;"); + } + CONTROL_VAR assign_tok + { if (strict_for) + my_output("for_begin"); + else + my_output(control_var); + my_output("="); } + FOR_LIST do_tok + { my_output("; if ("); + if (strict_for) my_output("for_begin"); + else my_output(control_var); + my_output(relation); + my_output("for_end)"); + if (strict_for) { + my_output("{"); + my_output(control_var); + my_output("="); + my_output("for_begin"); + semicolon(); + } + my_output("do"); + indent++; + new_line();} + STATEMENT + { + char *top = rindex(for_stack, '#'); + indent--; new_line(); + my_output("while"); + my_output("("); + my_output(top+1); + my_output(")"); + my_output(";"); + my_output("}"); + if (strict_for) + my_output("}"); + *top=0; + new_line(); + } + ; + +CONTROL_VAR: var_id_tok + {(void) strcpy(control_var, last_id); } + ; + +FOR_LIST: EXPRESS + { my_output(";"); } + to_tok + { + (void) strcpy(relation, "<="); + my_output("for_end"); + my_output("="); } + EXPRESS + { + (void) sprintf(for_stack + strlen(for_stack), + "#%s++ < for_end", control_var); + } + | EXPRESS + { my_output(";"); } + downto_tok + { + (void) strcpy(relation, ">="); + my_output("for_end"); + my_output("="); } + EXPRESS + { + (void) sprintf(for_stack + strlen(for_stack), + "#%s-- > for_end", control_var); + } + ; +%% + +static void compute_array_bounds() +{ + long lb; + char tmp[200]; + + if (lower_sym == -1) { /* lower is a constant */ + lb = lower_bound - 1; + if (lb==0) lb = -1; /* Treat lower_bound==1 as if lower_bound==0 */ + if (upper_sym == -1) /* both constants */ + (void) sprintf(tmp, "[%ld]", upper_bound - lb); + else { /* upper a symbol, lower constant */ + if (lb < 0) + (void) sprintf(tmp, "[%s + %ld]", + symbol(upper_sym), (-lb)); + else + (void) sprintf(tmp, "[%s - %ld]", + symbol(upper_sym), lb); + } + if (lower_bound < 0 || lower_bound > 1) { + if (*array_bounds) { + fprintf(stderr, "Cannot handle offset in second dimension\n"); + exit(1); + } + if (lower_bound < 0) { + (void) sprintf(array_offset, "+%ld", -lower_bound); + } else { + (void) sprintf(array_offset, "-%ld", lower_bound); + } + } + (void) strcat(array_bounds, tmp); + } + else { /* lower is a symbol */ + if (upper_sym != -1) /* both are symbols */ + (void) sprintf(tmp, "[%s - %s + 1]", symbol(upper_sym), + symbol(lower_sym)); + else { /* upper constant, lower symbol */ + (void) sprintf(tmp, "[%ld - %s]", upper_bound + 1, + symbol(lower_sym)); + } + if (*array_bounds) { + fprintf(stderr, "Cannot handle symbolic offset in second dimension\n"); + exit(1); + } + (void) sprintf(array_offset, "- (int)(%s)", symbol(lower_sym)); + (void) strcat(array_bounds, tmp); + } +} + +static void fixup_var_list() +{ + int i, j; + char output_string[100], real_symbol[100]; + + for (i=0; var_list[i++] == '!'; ) { + for (j=0; real_symbol[j++] = var_list[i++];); + if (*array_offset) { + (void) fprintf(std, "\n#define %s (%s %s)\n ", + real_symbol, next_temp, array_offset); + (void) strcpy(real_symbol, next_temp); + find_next_temp(); + } + (void) sprintf(output_string, "%s%s%c", + real_symbol, array_bounds, (var_list[i]=='!' ? ',' : ' ')); + my_output(output_string); + } + semicolon(); +} + + +/* + * If we're not processing TeX, we return 0 (false). Otherwise, + * return 1 if the label is "10" and we're not in one of four TeX + * routines where the line labeled "10" isn't the end of the routine. + * Otherwise, return 0. + */ +static boolean doreturn(label) +char *label; +{ + if (!tex) return(FALSE); + if (strcmp(label, "10")) return(FALSE); + if (strcmp(my_routine, "macrocall") == 0) return(FALSE); + if (strcmp(my_routine, "hpack") == 0) return(FALSE); + if (strcmp(my_routine, "vpackage") == 0) return(FALSE); + if (strcmp(my_routine, "trybreak") == 0) return(FALSE); + return(TRUE); +} + + +/* Return the absolute value of a long */ +static long labs(x) +long x; +{ + if (x < 0L) return(-x); + return(x); +} + +static void do_proc_args() +{ + int i, var; + + /* + * If we want ANSI code and one of the parameters is a var parameter, + * then use the #define to add the &. We do this by adding a 'z' at + * the front of the name. gen_function_head will do the real work. + */ + if (ansi) { + var = 0; + for (i=0; i<ids_paramed; ++i) + var += sym_table[param_id_list[i]].var_formal; + if (var) { + for (i=strlen(z_id); i>=0; --i) + z_id[i+1] = z_id[i]; + z_id[0] = 'z'; + } + } + + if (ansi) { + fprintf(coerce, "%s %s(", fn_return_type, z_id); + if (ids_paramed == 0) fprintf(coerce, "void"); + for (i=0; i<ids_paramed; i++) { + if (i > 0) putc(',', coerce); + fprintf(coerce, "%s %s", + arg_type[i], + symbol(param_id_list[i])); + } + fprintf(coerce, ");\n"); + } else + fprintf(coerce, "%s %s();\n", fn_return_type, z_id); +} + +static void gen_function_head() +{ + int i; + + if (strcmp(my_routine, z_id)) { + fprintf(coerce, "#define %s(", my_routine); + for (i=0; i<ids_paramed; i++) { + if (i > 0) + fprintf(coerce, ", %s", symbol(param_id_list[i])); + else + fprintf(coerce, "%s", symbol(param_id_list[i])); + } + fprintf(coerce, ") %s(", z_id); + for (i=0; i<ids_paramed; i++) { + if (i > 0) + fputs(", ", coerce); + if (!ansi) /* ansi doesn't need the cast */ + fprintf(coerce, "(%s) ", arg_type[i]); + fprintf(coerce, "%s(%s)", + sym_table[param_id_list[i]].var_formal?"&":"", + symbol(param_id_list[i])); + } + fprintf(coerce, ")\n"); + } + std = orig_std; + my_output(z_id); + my_output("("); + if (ansi) { + for (i=0; i<ids_paramed; i++) { + if (i > 0) my_output(","); + my_output(arg_type[i]); + my_output(symbol(param_id_list[i])); + } + my_output(")"); + indent_line(); + } else { /* Not ansi */ + for (i=0; i<ids_paramed; i++) { + if (i > 0) my_output(","); + my_output(symbol(param_id_list[i])); + } + my_output(")"); + indent_line(); + for (i=0; i<ids_paramed; i++) { + my_output(arg_type[i]); + my_output(symbol(param_id_list[i])); + semicolon(); + } + } +} diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.14/sitex3.ch b/obsolete/systems/sisisi/unix/iSiTeX3.14/sitex3.ch new file mode 100644 index 0000000000..048d9433cb --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.14/sitex3.ch @@ -0,0 +1,2827 @@ +========================================================================= + +SI_TEX.CHA Change file for SISISI-hyphenation in TeX 3.1 16.7.1991 + (c) for SISISI-hyphenation: Wilhelm Barth, Heinrich Nirschl + (c) for TeX changes: Heini Hofstaedter, Harald Mueller + + additional changes until 10. October 1991 HH +========================================================================= + +This is the change file for inclusion of SISISI into TeX V.3.14. + +There are three main changes in this file (which are of course quite +intermingled): + + 1) the replacement of Liang's hyphenation by SISISI. + + 2) the change of the interface of the actual hyphenation + to the post-hyphenation and the line-break algorithm. + + This change is necessary because in original TeX, only the + information "hyphen - no hyphen" can be transmitted to the + line break algorithm because of two "bottlenecks": + + 1. Hyphenation --> Post-Hyphenation: Here a hyphen at position i + is marked by the 1-bit information odd(hyf[i]). + 2. Post-Hyphenation --> Line-Breaking: Here a hyphen is marked + by the existence of a discretionary node. + + From SISISI, there must be more information flowing to the + line-break algorithm: + + a. Is a hyphen a main hyphen or a "nebenhyphen"? To this end, + a change is made such that a penalty node is allowed as + the first node in the prebreak list of a discretionary + node. This penalty node contains the penalty associated with + this specific hyphen. For "nebenhyphens", this value is set + by an additional primitive "\nebenhyphenpenalty". + Instead of the hyf-array, an array hyfpen is used that + contains the actual penalties; the old "if odd(hyf[i])" now + is converted ti "if hyfpen[i] <> inf_penalty". + + b. A hyphen may be more complicated than a single -: ck-hyphens + and triple-consonant-hyphens may be present. To include these, + another array hyf_disc is introduced that contains ready-made + discretionary nodes for such hyphens. + + At first, we simply wanted to include these discretionary + during the post-hyphenation into the new node list. But then + Heini felt that the impossiblity of ligatures with parts of such + a discretionary node was not acceptable; therefore he introdiced + the "x-mechanism" (characterized by many variables starting with + "x") and changed the reconstitute function so that more than the + single hyphen_char could be introduced into the reconstitution + process. + + 3) "Dirty" changes for the hyphenation of words with umlauts. + These changes are necessary because the umlauts in TeX are not + (necessarily) real characters, but something else (see definition + of umlauts in plain.tex or german.tex). + Ordinarily, the hyphenation only accepts sequences of letters, + ligatures (which are expanded to their single characters), and + so-called "implicit kerns". An umlaut, however, is usually + represented as a letter character and another character consisting + of two dots ("dieresis character"), which are connected by + explicit kerns (not implicite ones!). Therefore, words containing + umlauts are not hyphenable words in TeX, which is not acceptable + for german texts. + + Therefore, we devised a "bypass" for umlauts as follows: An umlaut + is now represented as a special discretionary node (so-called + "dirty umlaut") as follows: + \discretionary{\kern4321sp m\kern<code>sp\kern<back>sp\kern-1em}% + {}% + {<umlaut>} + where the 4321sp is a "marker" for the "dirty umlaut", the "m" + letter is used to derive the font of the umlaut, <code> is + the font number that should be associated with this umlaut (the + font numbers of the umlauts are given below); and <back> is used + to cancel the preceding kerns, i.e.\ <back> = - (4321 + <code>). + + In other words, the prebreak list contains the information that + this is an umlaut (albeit a "dirty" one) and some more + information needed for the hyphenation, the postbreak list is + empty, and the main list contains the umlaut proper. By a + special if-statement in the line-break algorithm, a hyphenation + at a discretionary node of this format is suppressed, so that + always the umlaut of the main list is printed. + The font numbers for the lowercase umlauts (which are given + in the second \kern node) must be: + ae 228 + oe 246 + ue 252 + The codes for the uppercase umlauts can be chosen arbitrarily. + + In order to get the hyphenation for these "dirty umlauts" + running, one must include lccode assignments of the form + \lccode<code>=<lccode> + for each of the new letters (see example below). + + A typical declaration of the "dirty umlauts" runs like this: + +%%%%%%%%%%%%%%%%%%%%% declaration of dirty umlauts %%%%%%%%%%%%%%%%%%%%%% +\def\A"{\discretionary{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\"A}} +\def\a"{\discretionary{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\"a}} +\def\O"{\discretionary{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\"O}} +\def\o"{\discretionary{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\"o}} +\def\U"{\discretionary{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\"U}} +\def\u"{\discretionary{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\"u}} +\lccode196=228 % uppercase umlaut A +\lccode214=246 % uppercase umlaut O +\lccode220=252 % uppercase umlaut U +\lccode228=228 % uppercase umlaut a +\lccode246=246 % uppercase umlaut o +\lccode252=252 % uppercase umlaut u +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +When (if?) one day N.Schwarz's DC/EC fonts arrive, the changes of the +third kind can be eliminated. How long this will take ... well, wait and +see. +But when they arrive, it's not longer possible to choose the codes for +uppercase umlauts arbitrarily. The codes for uppercase umlauts will +then be those, shown in the example above. + +========================================================================= + +At first, we add a control sequence \SISISI. +@x +\def\PASCAL{Pascal} +@y +\def\SISISI{{\sl SISISI}} +\def\PASCAL{Pascal} + +\let\maybe=\iffalse % print only changed modules +@z + +------------------------------------------------------------------------- + +@x +@d banner=='This is TeX, Version 3.14' {printed when \TeX\ starts} +@y +@d banner=='This is TeX, Version 3.14 (+SISISI 1.0)' +@z + +------------------------------------------------------------------------- + +A number of procedures of SISISI are declared after the TeX program. As +these procedures are used in the hyphenation, of course, they must be +declared as `forward'. + In web2c gibt es keine forward's !!!! +%@x +%procedure initialize; {this procedure gets things started properly} +%@y +%@<forward declarations@> +%procedure initialize; {this procedure gets things started properly} +%@z + +------------------------------------------------------------------------- +%@x +%@d pool_name_length=8 +%@y +%@d pool_name_length=11 +% {number of characters of ``pool_f_name''} +%@z +%see the following change of the pool file name "pool_f_name" +------------------------------------------------------------------------- + +@x +@!pool_name='TeXformats:TEX.POOL '; +@y +@!pool_name='TeXformats:SITEX3.POOL '; +@z + +------------------------------------------------------------------------- + +@x +else bad_pool('! I can''t read TEX.POOL.') +@.I can't read TEX.POOL@> +@y +else bad_pool('! I can''t read SITEX3.POOL.'); +@.I can't read TEX.POOL@> +@z +========================================================================= + +To have all messages, coming from SI_TEX, displayed on screen +and written to the log-file simultanously, we make the following, +additional definitions. + temp nicht mehr vorhanden, in log ve„ndert. +@x +@d wlog_ln(#)==write_ln(log_file,#) +@d wlog_cr==write_ln(log_file) +@y +@d wlog_ln(#)==write_ln(log_file,#) +@d wlog_cr==write_ln(log_file) + +@d si_put(#) == @+ begin + if (file_offset<>0)or(term_offset<>0) then print_ln; + if selector<>log_only then wterm(#); + if (selector=log_only)or(selector=term_and_log) then + wlog(#); + end +@d si_put_ln(#) == @+ begin + if (file_offset<>0)or(term_offset<>0) then print_ln; + if selector<>log_only then wterm_ln(#); + if (selector=log_only)or(selector=term_and_log) then + wlog_ln(#); + end +@d si_put_cr == print_ln + + +@d dbg_put(#) == {} +@d dbg_put_ln(#) == {} +@d dbg_put_cr == {} +@z +========================================================================= + +We add a new primitive \nebenhyphenpenalty for setting the penalty of a +minor hyphen: + +@x +@d int_pars=55 {total number of integer parameters} +@d count_base=int_base+int_pars {256 user \.{\\count} registers} +@y +@d neben_hyphen_penalty_code=55 {penalty for break after neben-hyphen} +@d si_debug_code=56 {value is treated as an set of active debugging sections} +@d supress_debug_mark_code=57 {same as above; if a section number is set, then + the output of the section number and the debugging output banner + of this section is supressed} +@d int_pars=58 {total number of integer parameters} +@d count_base=int_base+int_pars {256 user \.{\\count} registers} +@z +------------------------------------------------------------------------- +@x +@<Assign the values |depth_threshold:=show_box_depth|...@>= +@y +@d neben_hyphen_penalty==int_par(neben_hyphen_penalty_code) +@d si_debug(#) == if odd(int_par(si_debug_code) div #) then begin + if not odd(int_par(supress_debug_mark_code)div #) then + begin + si_put_cr; + si_put_ln(' <* debugging output section #',#:#,' *>'); + end; {marking supression} + { dig_count entfernt !!! } +@d gubed_si == end +@f si_debug == begin +@f gubed_si == end +@f gubed == nil + + +@<Assign the values |depth_threshold:=show_box_depth|...@>= +@z +------------------------------------------------------------------------- +@x +othercases print("[unknown integer parameter!]") +@y +neben_hyphen_penalty_code:print_esc("nebenhyphenpenalty"); +si_debug_code:print_esc("sidebug"); +supress_debug_mark_code:print_esc("supressdebugmark"); +othercases print("[unknown integer parameter!]") +@z +------------------------------------------------------------------------- +@x +@ @<Cases of |print_cmd_chr|...@>= +@y +primitive("nebenhyphenpenalty",assign_int,int_base+neben_hyphen_penalty_code);@/ +@!@:neben_hyphen_penalty_}{\.{\\nebenhyphenpenalty} primitive@> +primitive("sidebug",assign_int,int_base+si_debug_code); +primitive("supressdebugmark",assign_int,int_base+supress_debug_mark_code); +@ @<Cases of |print_cmd_chr|...@>= +@z + +========================================================================= + +As now hyphens may have different penalties, we must somehow associate +a penalty with a discretionary node. We do this by allowing a penalty +node as the first node in the prebreak list of a discretionary node. + +The following changes are in two case statements that check the nodes +in the sublists of a discretionary node; we add an empty case for +penalty nodes (two more case statements follow a little bit later). + +@x + othercases confusion("disc1") +@y + penalty_node: ; + othercases confusion("disc1") +@z +------------------------------------------------------------------------- +@x + othercases confusion("disc2") +@y + penalty_node: ; + othercases confusion("disc2") +@z + +========================================================================= + +MAIN CHANGE 2) + +The following change is in the line-break section, where try_break is +given the penalty stored in the penalty node. This change is the reason +for all other changes concerning penalties. Moreover, in this change +a line break is suppressed if the discretionary node is actually +a "dirty umlaut" (via "if not is_dirty_umlaut(cur_p) then ... try_break"). + +@x +begin s:=pre_break(cur_p); disc_width:=0; +if s=null then try_break(ex_hyphen_penalty,hyphenated) +else begin repeat @<Add the width of node |s| to |disc_width|@>; + s:=link(s); + until s=null; + act_width:=act_width+disc_width; + try_break(hyphen_penalty,hyphenated); + act_width:=act_width-disc_width; + end; +r:=replace_count(cur_p); s:=link(cur_p); +while r>0 do + begin @<Add the width of node |s| to |act_width|@>; + decr(r); s:=link(s); + end; +prev_p:=cur_p; cur_p:=s; goto done5; +end + +@y +begin + s:=pre_break(cur_p); disc_width:=0; + if s=null then try_break(ex_hyphen_penalty,hyphenated) + else if (type(s)=penalty_node) and (link(s)=null) then begin + flush_node_list(s); s := null; + try_break(ex_hyphen_penalty,hyphenated); end + else if not is_dirty_umlaut(cur_p) then begin + if type(s)=penalty_node then s:=link(s); + repeat @<Add the width of node |s| to |disc_width|@>; + s:=link(s); + until s=null; + act_width:=act_width+disc_width; + if type(pre_break(cur_p))=penalty_node then begin + try_break(penalty(pre_break(cur_p)),hyphenated) end + else begin try_break(hyphen_penalty,hyphenated); end; + act_width:=act_width-disc_width; + end; + r:=replace_count(cur_p); s:=link(cur_p); + while r>0 do begin + @<Add the width of node |s| to |act_width|@>; + decr(r); s:=link(s); + end; + prev_p:=cur_p; cur_p:=s; goto done5; +end + +@z + +========================================================================= + +Two more case statements. + +@x + othercases confusion("disc3") +@y + penalty_node: ; + othercases confusion("disc3") +@z + +------------------------------------------------------------------------- + +@x + othercases confusion("disc4") +@y + penalty_node: ; + othercases confusion("disc4") +@z + +========================================================================= + +There's a little problem, converting a device independent (``.dvi'') +to a post script file (``.ps''). I think that this program part could +cause this problem. so let's see... + +!a <-- = --> @x With this, i want to try to reproduce this error. + Because, after i had inserted this change, that error didn`t occur + again! +@<Modify the end of the line...@>= +q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false; +if q<>null then {|q| cannot be a |char_node|} + if type(q)=glue_node then + begin delete_glue_ref(glue_ptr(q)); + glue_ptr(q):=right_skip; + subtype(q):=right_skip_code+1; add_glue_ref(right_skip); + goto done; + end + else begin if type(q)=disc_node then + @<Change discretionary to compulsory and set + |disc_break:=true|@> + else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0; + end +else begin q:=temp_head; + while link(q)<>null do q:=link(q); + end; +@<Put the \(r)\.{\\rightskip} glue after node |q|@>; +done: +!a <-- = --> @y +@<Modify the end of the line...@>= +q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false; +if q<>null then {|q| cannot be a |char_node|} + if type(q)=glue_node then + begin delete_glue_ref(glue_ptr(q)); + glue_ptr(q):=right_skip; + subtype(q):=right_skip_code+1; add_glue_ref(right_skip); + goto done; + end + else begin + if type(q)=disc_node then begin + hyfdeb_b:=false; + if is_dirty_umlaut(q) then begin + si_debug(64) hyfdeb_b:=true; gubed_si; + si_put_cr; + si_put_ln(' ??? There's a line break at a dirty umlaut!?'); + end; + if not hyfdeb_b then begin + @<Change discretionary to compulsory and set |disc_break:=true|@> + end; + end else + if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0; + end else begin + q:=temp_head; + while link(q)<>null do q:=link(q); + end; +@<Put the \(r)\.{\\rightskip} glue after node |q|@>; +done: +!a <-- = --> @z + + +========================================================================= + +If the break actually occurs, the penalty node is made a separate list +with only one node, which is immediately flushed. + +@x +begin s:=pre_break(q); link(q):=s; +while link(s)<>null do s:=link(s); +pre_break(q):=null; q:=s; +end +@y +begin + s:=pre_break(q); + if type(s)=penalty_node then begin + s:=link(s); + link(pre_break(q)):= null; + flush_node_list(pre_break(q)); + end; + link(q):=s; + while link(s)<>null do s:=link(s); + pre_break(q):=null; q:=s; +end +@z + +========================================================================= + +The type `array[0..65] of 0..256' is needed more often, so we make it +an explicit type (see big SISISI change at end of change file). hc is +now declared of this type. + +@x +@!hc:array[0..65] of 0..256; {word to be hyphenated} +@!hn:small_number; {the number of positions occupied in |hc|} +@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} +@y +@!hc:a_word; {word to be hyphenated} +@!hn:small_number; {the number of positions occupied in |hc|} +@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} +{ some variables for debugging output } +@!hyfdeb_i,hyfdeb_j: integer; +@!hyfdeb_b:boolean; +@!si_p, si_q, si_r, si_s: pointer; +@z + +------------------------------------------------------------------------- + +Our hyphenation routines need even more "more local variables". + +@x +@ Hyphenation routines need a few more local variables. +@y +@!dirty_umlaut:array [-1..64] of pointer; {the [-1] field is used, if a + whatsit node occurs inbetween a word. This can happen due to + Partl's changes in ``german.sty'' } + +@ Hyphenation routines need a few more local variables. +@z + +------------------------------------------------------------------------- + +@x +@!j:small_number; {an index into |hc| or |hu|} +@y +@!qq:pointer; +@!j:small_number; {two indices into |hc| or |hu|} +@!jj:integer; +@z + +========================================================================= + +The dirty_umlaut array must be initialized for each word. +And we enable watching the node list, representing the word +to be hyphenated. + +@x +if s<>null then + begin @<Skip to node |ha|, or |goto done1| if no hyphenation +@y +si_p:=cur_p; si_q:=null; +for jj:=-1 to 64 do dirty_umlaut[jj] := null; +if s<>null then begin + si_debug(1) +{ hyfdeb_i:=depth_threshold; depth_threshold:=100; + hyfdeb_j:=breadth_max; breadth_max:=100; +} + show_node_list(si_p); +{ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; } + gubed_si; + @<Skip to node |ha|, or |goto done1| if no hyphenation +@z + +------------------------------------------------------------------------- + +@x + hyphenate; + end; +done1: end +@y + hyphenate; + end; +done1: +si_debug(32) + hyfdeb_i := depth_threshold; hyfdeb_j := breadth_max; + if si_q<>null then begin + depth_threshold:=100; {show all levels of a list} + breadth_max:=200; {show all nodes of one level of a list} + si_r:=link(si_q); link(si_q):=null; + end else begin + (* take the values, set by the user, for this variables! *) + breadth_max:=show_box_breadth; depth_threshold:=show_box_depth; + end; + show_node_list(si_p); + si_put_cr; + if si_q <> null then link( si_q ) := si_r; + + depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; +gubed_si; +end +@z + +========================================================================= + +MAIN CHANGE 1) + +Here, we add the SISISI-procedure abteilen for use in hyphenate and +another label done1. + +@x +procedure hyphenate; +label common_ending,done,found,found1,found2,not_found,exit; +var @<Local variables for hyphenation@>@; +@y + +@<Handling of dirty umlauts@> + +procedure hyphenate; +label common_ending,done,done1,found,found1,found2,not_found,exit; +var @<Local variables for hyphenation@>@; +@z + +========================================================================= + +MAIN CHANGE 3) + +The prehyphenation loop must now also skip over the "dirty umlauts". + +@x +loop@+ begin if is_char_node(s) then + begin c:=qo(character(s)); hf:=font(s); + end + else if type(s)=ligature_node then + if lig_ptr(s)=null then goto continue + else begin q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q); + end + else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue + else if type(s)=whatsit_node then + begin @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + goto continue; + end + else goto done1; + if lc_code(c)<>0 then + if (lc_code(c)=c)or(uc_hyph>0) then goto done2 +@y +loop@+ begin + if is_char_node(s) then begin + c:=qo(character(s)); hf:=font(s); + end else if type(s)=ligature_node then begin + if lig_ptr(s)=null then goto continue + else begin + q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q); + end + end else if is_dirty_umlaut(s) then begin + c:=get_char_of(s); hf:=get_font_of(s); + end else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue + else if type(s)=whatsit_node then begin + @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + goto continue; + end else goto done1; + + if lc_code(c)<>0 then + if (lc_code(c)=c)or(uc_hyph>0) then goto done2 +@z + +========================================================================= + +MAIN CHANGE 2) + +The interface variables for the hyphenation are extended: hyfpen[i] +holds the actual penalty of a hyphen at position i, hyf_disc[i] +contains a "special discretionary" for triple-consonant-hyphens and +ck-hyphens. hc_si is the word as given to the SISISI algorithm; +hyf_si is returned from SISISI and contains markers for the hyphens. + +After this change, there are many changes where `odd(hyf[i])' is +simply replaced by `hyfpen[i]<>inf_penalty'. + +Another procedure to be changed is `reconstitute': It now has to handle +special dicretionary nodes. For a detailed feeling about the code changes +in reconstitute, either (1) look through it bit by bit, or (2) ask Heini +Hofstaedter. + +@x + end + else if type(s)=ligature_node then + @<Move the characters of a ligature node to |hu| and |hc|; + but |goto done3| if they are not all letters@> +@y + end else if is_dirty_umlaut(s) then begin + if get_font_of(s)<>hf then goto done3; + c:=get_char_of(s); + if lc_code(c)=0 then goto done3; + if hn=63 then goto done3; + hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=lc_code(c); + dirty_umlaut[hn]:=s; + for jj:=1 to replace_count(s) do s:=link(s); + end else if type(s)=whatsit_node then begin + @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + dirty_umlaut[-1]:=s; + end else if type(s)=ligature_node then + @<Move the characters of a ligature node to |hu| and |hc|; + but |goto done3| if they are not all letters@> +@z + +========================================================================= + +MAIN CHANGE 3) + +Also in the conversion loop (where the node list is shuffled into the +hc array), we must skip a "dirty umlaut". + +@x +loop@+ begin if not(is_char_node(s)) then + case type(s) of + ligature_node: do_nothing; +@y +loop@+ begin +if not(is_char_node(s)) then + if is_dirty_umlaut(s) then begin + for jj:=1 to replace_count(s)-1 do s:=link(s); + end else + case type(s) of + ligature_node: do_nothing; +@z + +========================================================================= + +Well, there are a lot of new variables that are necessary for the new +hyphenation. Most of them are necessary for Heini's change in the +reconstitute function, where now discretionary nodes for hyphens with +more than one character (e.g. the german ck-hyphens or +three-consonant-hyphens) can be inserted. + +@x +@ @<Local variables for hyphenation@>= +@!i,@!j,@!l:0..65; {indices into |hc| or |hu|} +@!q,@!r,@!s:pointer; {temporary registers for list manipulation} +@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|} +@y +@!hyfpen:array [0..64] of integer; {penalties for possible discretionary + hyphens} +@!hyf_si:trennvektor; +@!hc_si:wort; +@!hyf_disc:array [0..64] of pointer; + +@ @<Local variables for hyphenation@>= +@!i,@!j,@!l,@!kk:0..65; {indices into |hc| or |hu|} +@!q,@!r,@!s,@!qq,@!qr,@!hold_r:pointer; {temporary registers for list manipulation} +@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|} + +@!xchg_char:array [0..10] of 0..256; {type of |hu| and |hc|} +@!add_char, {additional characters when hyphenating e.g.\ + Schiffahrt $\rightarrow$ Schif{\sl f}-fahrt: here + |add_char| = 1} +@!xchg_i,xchg_k,xchg_hu: 0..65; {type like |i|, |j| and |l| } +@!spec_hyf: pointer; {special hyphen; causes different spelling of the + word, when it is hyphenated at this point} +@!si_j:integer; +@z + +========================================================================= + +An odd->inf_penalty change. + +@x +for j:=l_hyf to hn-r_hyf do if odd(hyf[j]) then goto found1; +@y +for j:=l_hyf to hn-r_hyf do if hyfpen[j]<>inf_penalty then goto found1; +@z + +========================================================================= + +The new variable hold_r is initialized (the kern node is a dummy node, +as far as I can see). + +@x +if not is_char_node(hb) then + if type(hb)=ligature_node then if odd(subtype(hb)) then +@y +hold_r := new_kern(1235); link(hold_r):=r; +if not is_char_node(hb) then + if type(hb)=ligature_node then if odd(subtype(hb)) then +@z + +========================================================================= + +Initialize some variables if the list starts with a "dirty umlaut". + +@x +else if type(ha)=ligature_node then + if font(lig_char(ha))<>hf then goto found2 + else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1); +@y +else if is_dirty_umlaut(ha) then begin + if get_font_of(ha) <> hf then goto found2 + else begin init_list:=ha; init_lig := false; hu[0]:=get_char_of(ha); + end +end else if type(ha)=ligature_node then + if font(lig_char(ha))<>hf then goto found2 + else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1); +@z + +========================================================================= + +MAIN CHANGE 3) + +unhinge all "dirty umlauts". + +@x +common_ending: flush_node_list(r); +@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>; +flush_list(init_list) +@y +common_ending: +qq:=hold_r; +for kk:={1}j to hn do if dirty_umlaut[kk] <> null then begin + while link(qq) <> dirty_umlaut[kk] do qq := link(qq); + qr := link(qq); + for i:=1 to replace_count(qr) do + if qr<>null then qr:=link(qr) + else begin {test:} + si_put_ln('...??..X --> ????? !'); + end; {:test} + if qr<>null then begin + link(qq):=link(qr); link(qr):=null; + end else link(qq):=null; +end; +if dirty_umlaut[-1]<>null then begin + qq:=hold_r; + while (link(qq)<>dirty_umlaut[-1])and(link(qq)<>null) do qq:=link(qq); + if link(qq)=dirty_umlaut[-1] then begin + link(qq):=link(dirty_umlaut[-1]); + link(dirty_umlaut[-1]):=null; + end else begin + si_put(' *** ERROR: node list is damaged! '); + si_put_ln('(post hyphenation - unhinge a whatsit node)'); + end; +end; +{} +r:=hold_r; +while link(r)<>null do begin + if (mem_min<=link(r))and(link(r)<=mem_max) then r:=link(r) + else begin + wlog_cr; wterm_cr; + wlog_ln('???$ - ERROR in node list!'); + wterm_ln('???$ - ERROR in node list!'); + kk:=depth_threshold; l:=breadth_max; + depth_threshold:=100; breadth_max:=100; + show_node_list(hold_r); + link(r):=null; + depth_threshold:=kk; breadth_max:=l; + end; +end; +{} +flush_node_list(hold_r); +@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>; +flush_list(init_list) +@z + +------------------------------------------------------------------------ + +Another odd->inf_penalty change (this time only textual). + +@x +If there exists an index |k| in the range $j\le k\le m$ such that |hyf[k]| +is odd and such that the result of |reconstitute| would have been different +if $x_{k+1}$ had been |hchar|, then |reconstitute| sets |hyphen_passed| +to the smallest such~|k|. Otherwise it sets |hyphen_passed| to zero. +@y +If there exists an index |k| in the range $j\le k\le m$ such that +|hyfpen[k]<>inf_penalty| and such that the result of |reconstitute| +would have been different if $x_{k+1}$ had been |hchar|, then |reconstitute| +sets |hyphen_passed| to the smallest such~|k|. Otherwise it sets +|hyphen_passed| to zero. +@z + +------------------------------------------------------------------------- + +In the reconstitute function, we set the boundary value n immediately +before the next "dirty umlaut" by a simple for-loop starting at the +original n. + +@x +begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null; +@y +@!ii:small_number; +begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null; +for ii:=n downto j do + if dirty_umlaut[ii] <> null then n:=ii-1; +@z + +------------------------------------------------------------------------- + +Another odd->inf_penalty change. + +@x + if odd(hyf[j]) then cur_rh:=hchar@+else cur_rh:=non_char; +@y + if hyfpen[j]<>inf_penalty then cur_rh:=hchar@+else cur_rh:=non_char; +@z + +========================================================================= + +A first change in the reconstitute function. + +@x + else begin if hchar<non_char then if odd(hyf[j]) then + begin hyphen_passed:=j; hchar:=non_char; + end; + if op_byte(q)<kern_flag then + @<Carry out a ligature replacement, updating the cursor structure +@y + else begin if hchar<non_char then if hyfpen[j]<>inf_penalty then + begin hyphen_passed:=j; hchar:=non_char; + end; + if op_byte(q)<kern_flag then + @<Carry out a ligature replacement, updating the cursor structure +@z + + +------------------------------------------------------------------------- + +Now we are in the post-hyphenation's main loop; here must append a +"dirty umlaut" to the growing node list. This is simply done by an +if-statement that checks for the presence of a "dirty umlaut" and +appends it. + +Moreover, we have another textual odd->inf_penalty change. + +@x +repeat l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1; +if hyphen_passed=0 then + begin link(s):=link(hold_head); + while link(s)>null do s:=link(s); + if odd(hyf[j-1]) then + begin l:=j; hyphen_passed:=j-1; link(hold_head):=null; + end; + end; +if hyphen_passed>0 then + @<Create and append a discretionary node as an alternative to the + unhyphenated word, and continue to develop both branches until they + become equivalent@>; +until j>hn; +link(s):=q + +@ In this repeat loop we will insert another discretionary if |hyf[j-1]| is +odd, when both branches of the previous discretionary end at position |j-1|. +@y +if dirty_umlaut[-1]<>null then begin + {hook in the previous saved whatsit node before the first + character of the hyphenated word} + link(s):=dirty_umlaut[-1]; + s:=link(s); +end; +repeat + if dirty_umlaut[j]<>null then begin + link(s):=dirty_umlaut[j]; + while link(s)>null do s:=link(s); + link(hold_head):=null; + j:=j+1; hyphen_passed:=0; + if hyfpen[j-1]<>inf_penalty then begin + l:=j; hyphen_passed:=j-1; + si_debug(16) + si_put_ln(' *** append a hyphen immediatly after a dirty umlaut!'); + gubed_si; + end; + end else begin + l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1; + if hyphen_passed=0 then begin + link(s):=link(hold_head); + while link(s)>null do s:=link(s); + if hyfpen[j-1]<>inf_penalty then begin + l:=j; hyphen_passed:=j-1; link(hold_head):=null; + end; + end; + end; {if dirty_umlaut[j]<>null then-else} + if hyphen_passed>0 then + @<Create and append a discretionary node as an alternative to the + unhyphenated word, and continue to develop both branches until they + become equivalent@>; +until j>hn; +link(s):=q; +si_q:=s; {save the last node of the hyphenated word for debugging output} +for j:=0 to 64 do if hyf_disc[j]<>null then begin + flush_node_list( hyf_disc[j]); +end + +@ In this repeat loop we will insert another discretionary if +|hyfpen[j-1]<>inf_penalty|, when both branches of the previous +discretionary end at position |j-1|. +@z + +========================================================================= + +Another odd->inf_penalty change. + +@x +hyphen_passed:=j-1; link(hold_head):=null; +until not odd(hyf[j-1]) +@y +hyphen_passed:=j-1; link(hold_head):=null; +until (hyfpen[j-1]=inf_penalty) +@z + +========================================================================= + +Here comes the big reconstitution action (cheers to Heini!). + +@x +@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>= +minor_tail:=null; pre_break(r):=null; hyf_node:=new_character(hf,hyf_char); +if hyf_node<>null then + begin incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node); + end; +while l<=i do + begin l:=reconstitute(l,i,font_bchar[hf],non_char)+1; + if link(hold_head)>null then + begin if minor_tail=null then pre_break(r):=link(hold_head) +@y +As the value of |hyfpen[i]| is necessary for creating a penalty node, +we must create this node before we ``kill'' the hyphenation information in +|hyfpen[i]| by assigning |inf_penalty|. |minor_tail| contains the +pointer to the penalty node or |null|, if no such node has been created. + +@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>= +if (hyfpen[i]<>inf_penalty) and (hyfpen[i]<>hyphen_penalty) + then minor_tail:=new_penalty(hyfpen[i]) + else minor_tail:=null; +hyfpen[i]:=inf_penalty; +pre_break(r):=minor_tail; + +hyf_node:=new_character(hf,hyf_char); +{Exchange |pre_break|-list of the selfbuilt |disc_node| with |hu|} +xchg_k:=i; +if hyf_disc[xchg_k]<>null then begin + spec_hyf:=pre_break(hyf_disc[xchg_k]); + add_char:=subtype(spec_hyf); + xchg_i:=1; + repeat + spec_hyf:=link(spec_hyf); + if spec_hyf<>null then begin + xchg_char[xchg_i]:=qo(character(spec_hyf)); + incr(xchg_i); + end;{if} + until spec_hyf=null; + if hyf_node<>null then begin + xchg_char[xchg_i]:=hyf_char; + free_avail(hyf_node); + end else decr(xchg_i); + xchg_hu:=i-xchg_i+add_char+2; {this is the index of |hu| where the first + character is replaced by a character of the + |pre_break|-list of |spec_hyf|} + for xchg_k:=1 to xchg_i do begin + xchg_char[0]:=hu[xchg_hu]; + hu[xchg_hu]:=xchg_char[xchg_k]; + xchg_char[xchg_k]:=xchg_char[0]; + incr(xchg_hu); + end; {|for|} + xchg_k:=i; + i:=xchg_hu-1; + xchg_hu:=xchg_hu-xchg_i; +end {|if hyf_disc[]<>null|} +else if hyf_node<>null then begin + incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node); +end; +while l<=i do begin + l:=reconstitute(l,i,font_bchar[hf],non_char)+1; + if link(hold_head)>null then + begin if minor_tail=null then pre_break(r):=link(hold_head) +@z + +------------------------------------------------------------------------- + +... continued: + +@x +if hyf_node<>null then + begin hu[i]:=c; {restore the character in the hyphen position} + l:=i; decr(i); + end + +@y + if hyf_disc[xchg_k]<>null then begin +{ Restore the original word in |hu| } + i:=xchg_k; l:=i+1; + for xchg_k:=1 to xchg_i do begin + hu[xchg_hu]:=xchg_char[xchg_k]; + incr(xchg_hu); + end;{for} + end else if hyf_node<>null then begin + hu[i]:=c; {restore the character in the hyphen position} + l:=i; decr(i); + end + +@z + +========================================================================= + +MAIN CHANGE 1) + +Finally, we come to the SISISI hyphenation. At first, we define two +variables: + +@x +@ Assuming that these auxiliary tables have been set up properly, the +@y +@!funktioniert: boolean; +@!zerleg: integer; + +@ Assuming that these auxiliary tables have been set up properly, the +@z + +------------------------------------------------------------------------- + +And off we go; at first only slowly, ... + +@x +@<Find hyphen locations for the word in |hc|...@>= +@y +{\sl Here, the German Hyphenation of W.Barth and H.Nirschl has been added!} + + +@<Find hyphen locations for the word in |hc|...@>= +@z + +------------------------------------------------------------------------- + +... but now we kill all of Liang's code and replace it by some re- and +back-en- and decoding, a call to abteilen, and the construction of the +special discretionaries. Then we go right into the SISISI hyphenation. +========================================================================= +@x +if trie_char(cur_lang+1)<>qi(cur_lang) then return; {no patterns for |cur_lang|} +hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=256; {insert delimiters} +for j:=0 to hn-r_hyf+1 do + begin z:=trie_link(cur_lang+1)+hc[j]; l:=j; + while hc[l]=qo(trie_char(z)) do + begin if trie_op(z)<>min_quarterword then + @<Store \(m)maximum values in the |hyf| table@>; + incr(l); z:=trie_link(z)+hc[l]; + end; + end; +found: for j:=0 to l_hyf-1 do hyf[j]:=0; +for j:=0 to r_hyf-1 do hyf[hn-j]:=0 + +@ @<Store \(m)maximum values in the |hyf| table@>= +begin v:=trie_op(z); +repeat v:=v+op_start[cur_lang]; i:=l-hyf_distance[v]; +if hyf_num[v]>hyf[i] then hyf[i]:=hyf_num[v]; +v:=hyf_next[v]; +until v=min_quarterword; +end + +@ The exception table that is built by \TeX's \.{\\hyphenation} primitive is +@y + for j:=0 to hn do + hc_si[j] := ktab[hc[j]]; + si_debug(2) + si_put(' hc:'); + for j:=0 to hn do si_put( xchr[hc[j]] ); + si_put_ln(':'); + si_put(' hc_si:'); + for j:=0 to hn do si_put( xchr[rev_tab[hc_si[j]]] ); + si_put_ln(':'); + gubed_si; + si_debug(4) + si_put_ln('< decimal character codes >'); + si_put(' hc:'); + for j:=0 to hn do begin + si_put(hc[j]:3,'-'); + if ((j+1) mod 16)=0 then begin + si_put_cr; si_put(' '); + end; + end; + si_put_cr; + si_put(' hc_si:'); + for j:=0 to hn do begin + si_put( rev_tab[hc_si[j]]:3,'-' ); + if ((j+1) mod 16)=0 then begin + si_put_cr; si_put(' '); + end; + end; + si_put_cr; si_put_cr; + gubed_si; + + abteilen(hc_si,hyf_si,hn,funktioniert,zerleg); + for j:=0 to 64 do begin + hyf_disc[j]:=null; hyfpen[j]:=inf_penalty; + end; + if funktioniert then + for j:=0 to hn do begin + if hyf_si[j]=neben then hyfpen[j] := neben_hyphen_penalty + else if hyf_si[j]=haupt then hyfpen[j] := hyphen_penalty + else if hyf_si[j]=nebenck then begin + hyfpen[j+1] := neben_hyphen_penalty; + s:=get_node(small_node_size); {discretionary node erzeugen} + type(s):=disc_node; + hyf_disc[j+1]:=s; + {|pre_break|-Liste: } + pre_break(s):=new_penalty(neben_hyphen_penalty); s:=pre_break(s); + subtype(s):=0; { number of additional characters } + link(s):=new_character(hf,hu[j+2]); {'k' oder'K'} + link(link(s)):=null; + s:=hyf_disc[j+1]; + post_break(s):=null; link(s):=null; + end + else if hyf_si[j]=haupt3 then begin + hyfpen[j-1]:=hyphen_penalty; + s:=get_node(small_node_size); {discretionary node erzeugen} + type(s):=disc_node; + hyf_disc[j-1]:=s; + {|pre_break|-Liste: } + pre_break(s):=new_penalty(hyphen_penalty); s:=pre_break(s); + subtype(s):=1; + link(s):=new_character(hf,hu[j]); { Dreifachkonsonant } + link(link(s)):=null; + {|post_break|- und |link|-Liste: } + s:=hyf_disc[j-1]; + post_break(s):=null; + link(s):=null; + end + end; {|if funktioniert|} + si_debug(8) + if funktioniert then begin + for j:=0 to hn do + if hyfpen[j]<>inf_penalty then begin + if hyf_disc[j]<>null then begin + if subtype(pre_break(hyf_disc[j]))=0 then + si_put( xchr[hu[j+1]], '-' ) + else {if subty...} + si_put( xchr[hu[j+1]], xchr[hu[j+1]], '=' ); + { i hope so } + end else begin + si_put( xchr[hu[j]] ); + if hyfpen[j]=hyphen_penalty then + si_put('=') + else si_put('-'); + end; + end else begin + si_put( xchr[hu[j]] ); + end; + end else begin + si_put_ln(' no hyphens were found in this word!'); + end; + si_put_cr; + gubed_si; + goto done1; + +found: +hyfpen[0]:=inf_penalty; +for j:=1 to hn do + if odd(hyf[j]) then hyfpen[j]:=hyphen_penalty + else hyfpen[j]:=inf_penalty; + +done1: + +@ Das folgende Modul ersetzt die gesamte Liang'sche Trennung. Aufgabe +dieses Modules ist es, ein in hc (ein Array of 0..255 ) liegendes Wort +nach Trennstellen zu untersuchen und die gefundenen Trennstellen in +hyf (ebenfalls ein Array of neben...) an den entsprechenden Stellen +einzutragen. Die genaue Beschreibung der Vorgangsweise findet man im +INSTITUTSBERICHT NR. 26, TECHNISCHE UNIVERSIT\"AT WIEN, INSTITUT +F\"UR PRAKTISCHE INFORMATIK. + +Alle Prozeduren f\"ur die Silbentrennung \SISISI, die bei jedem +Start von TeX aufgerufen werden. + +@ Dieser Modul beinhaltet alle f\"ur die neue Silbentrennung |abteilen| +n\"otigen Initialisierungen bzw. Prozeduren, die nur einmal am Anfang +ausgef\"uhrt werden sollen. + +@<Set initial values of ...@>= + inittrennen; + +@ @<Constants in the outer block@>= + maxwl = 64; { Maximale Wortlaenge } + sonderzeichen= 0; + bst_a= 1; bst_b= 2; bst_c= 3; bst_d= 4; bst_e= 5; bst_f= 6; bst_g= 7; + bst_h= 8; bst_i= 9; bst_j=10; bst_k=11; bst_l=12; bst_m=13; bst_n=14; + bst_o=15; bst_p=16; bst_q=17; bst_r=18; bst_s=19; bst_t=20; bst_u=21; + bst_v=22; bst_w=23; bst_x=24; bst_y=25; bst_z=26; bst_ae=27; + bst_oe=28; bst_ue=29; bst_sz=30; trennzeichen=31; + keine = 1; neben = 2; nebenck = 3; haupt = 4 ; haupt3 = 5; + + tabsize = 8191; { 2**13 - 1 } + spec_letter_ID = 4321; + { const definitionen } + vok_a = 1; + vok_e = 2; + vok_i = 3; + vok_o = 4; + vok_u = 5; + vok_ae = 6; + vok_oe = 7; + vok_ue = 8; + vok_ie = 9; + vok_ai = 10; + vok_ei = 11; + vok_au = 12; + vok_aeu= 13; + vok_eu = 14; + vok_y = 15; + kons = 16; + +@ +@<Types in the outer block@>= + string80 = packed array [0..80] of eight_bits; + buchstabe = eight_bits; + a_word = array[0..maxwl] of 0..256; + wort = a_word; + sperrvektor=array [0..maxwl] of boolean; + dudt=array [0..maxwl] of boolean;{frueher kein type !!} + { trennung = (keine, neben, nebenck, haupt, haupt3); } + trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==> + zwischen Buchstabe i und i+1 wird getrennt } + ktabtype = packed array [0..255] of buchstabe; + verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C } + varr = array [0..maxwl] of verdschlue; + intarr = array [0..maxwl] of integer; + + { darf nicht als var Parameter uebergeben werden !!} + infotype = record + { frueher ein variantenRecord } + ausnahme:boolean; + untrennbar:boolean; + { erste :0..7; + zweite:0..7; } + erste :integer; + zweite:integer; + endung,vorsilbe,stamm,ehervor,stammallein:boolean; + end; + + infobyte = eight_bits; + + { darf nicht als var Parameter uebergeben werden !!} + tableentry=record + tabv:verdschlue; + tabb:infobyte; + frei:boolean; + wiederfrei:boolean; + end; + + hashelement = packed array [0..3] of eight_bits; + htabtype = packed array [0..tabsize] of hashelement; + +@ +@<Global variables@>= + ktab : ktabtype; + htab : htabtype; + anzahl : integer; + hashfile : alpha_file; + kombtab : array [1..5, 1..5] of integer; + konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]} + rev_tab: array[0..255]of integer; + + +@ Prozedurdefinitionen + +function dig_count( v: integer): integer; + { calculates the number of decimal digits of ``v'' } + var x, e, c: integer; +begin + x := v div 10; e:=1; c:=1; + while e<=x do begin + e := e * 10; incr(c); + end; + dig_count:=c; +end; + +@<Handling of dirty umlauts@>= + +procedure hashfunk (var w:wort; anfang,ende:integer; + var v:varr; var ind,k:intarr ); + + { -PRAK!- in C long statt integer } + var vacc, indacc, kacc : integer; + i : integer; +begin + vacc := 31415; indacc := 152; kacc := 271; +dbg_put_ln(' * HFNC ='); + for i := anfang to ende do begin +dbg_put(' * HFNC ',i-anfang:3,' A'); + vacc := (vacc * 31 + w [i]) mod 8388648; +dbg_put('B'); + v[i] := vacc; +dbg_put('C'); + indacc := (indacc * 33 + w[i]) mod (tabsize+1); +dbg_put('D'); + ind[i] := indacc; +dbg_put('E'); + kacc := (kacc * 15 + w[i]) mod ((tabsize+1) div 2); +dbg_put('F'); + k[i] := 2*kacc + 1; +dbg_put_ln('G'); + end; {|for|} +end; {|hashfunk|} + +procedure unpackinfo ( b:infobyte; + { var i:infotype } + var iausnahme :boolean; + var iuntrennbar :boolean; + var ierste :integer; + var izweite :integer; + var iendung :boolean; + var ivorsilbe :boolean; + var istamm :boolean; + var iehervor :boolean; + var istammallein:boolean ); +begin + { with i do begin } + if odd(b) then begin { 87654321 } + iausnahme:= true; + b:= b div 2; { 08765432 } + if odd(b) then iuntrennbar:= true + else iuntrennbar:= false; + b:=b div 2; { 00876543 } + ierste := b mod 8; { 00876xxx } + izweite := b div 8; { 00000876 } + end else begin + iausnahme:= false; { 87654321 } + b:= b div 2; { 08765432 } + if odd(b) then iendung:= true + else iendung:= false; + b:= b div 2; { 00876543 } + if odd(b) then ivorsilbe:= true + else ivorsilbe:= false; + b:= b div 2; { 00087654 } + if odd(b) then istamm:= true + else istamm:= false; + b:= b div 2; { 00008765 } + if odd(b) then iehervor:= true + else iehervor:= false; + b:= b div 2; { 00000876 } + if odd(b) then istammallein:= true + else istammallein:= false; + end; {|if-then-else|} + { end; |with|} +end; {|unpackinfo|} + + +procedure unpackentry( h:hashelement; + { var e:tableentry } + var etabv:verdschlue; + var etabb:infobyte; + var efrei:boolean; + var ewiederfrei:boolean ); +begin + { with e do begin } +dbg_put_cr; +dbg_put(' ==> UPCKNTY 1'); + etabv:= h[0]+h[1]*256+h[2]*256*256; +dbg_put(' 2'); + if odd(h[3]) then begin { Ausnahme } +dbg_put(' 3 A'); + etabb:= h[3]; +dbg_put('1'); + efrei:= false; + ewiederfrei:= false; + end + else begin +dbg_put(' 3 B'); + etabb:= h[3] mod 64; +dbg_put('1'); + { h[3]:=h[3] div 64;} {-PRAK!- in C ein var-Paramter, darf daher + nicht ver„ndert werden. } +dbg_put('2'); + { durch folgende 2 Abfragen ersetzt. -PRAK!- } + if odd(h[3] div 64) then efrei := true + else efrei := false; + if odd(h[3] div 128) then ewiederfrei := true + else ewiederfrei := false; + end; +dbg_put_ln('- 4'); + { end; |with|} +end; {|unpackentry|} + + +procedure hashsuch ( v:verdschlue; + ind,k : integer; + { var i:infotype; } + var iausnahme :boolean; + var iuntrennbar :boolean; + var ierste :integer; + var izweite :integer; + var iendung :boolean; + var ivorsilbe :boolean; + var istamm :boolean; + var iehervor :boolean; + var istammallein:boolean; + var g:boolean ); + +{ sucht Eintragung in der Hashtabelle, g ist TRUE falls gefunden } + var + gef,ngef:boolean; + j:integer; + entry : tableentry; + +begin + gef := false; ngef := false; j := ind; + repeat + unpackentry(htab[j],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei); + if entry.frei then ngef := true + else if (v = entry.tabv) and not entry.wiederfrei then begin + unpackinfo(entry.tabb,iausnahme,iuntrennbar,ierste,izweite, + iendung,ivorsilbe,istamm,iehervor,istammallein); + gef := true; + end else + j := (j+k) mod (tabsize + 1) + until gef or ngef; + g := gef; +end; {|hashsuch|} + + +procedure hashload ( var status:integer ); +{ einlesen der Hash-Tabelle von file fn } + var i : integer; + e : tableentry; +begin + { Orginal sitex3.cha -PRAK!- + for i:=1 to file_name_size do name_of_file:= ' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length := 3; + anzahl := 0; + if a_open_in(hashfile) then begin + } + + { geaendert !! -PRAK!- } + for i:=1 to file_name_size do name_of_file[i]:= ' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length := 3; + anzahl := 0; + { -PRAK!- texinputpath fr C notwendig } + if a_open_in(hashfile, TEX_INPUT_PATH) then begin + for i := 0 to tabsize do begin + { -PRAK!- in C Probleme mit den typen beim einlesen } + read (hashfile, htab[i][0]); { htab = packed array [0..tabsize] of } + read (hashfile, htab[i][1]); { hashelement, und } + read (hashfile, htab[i][2]); { hashelement = packed array 0..3 } + read (hashfile, htab[i][3]); + unpackentry (htab[i],e.tabv,e.tabb,e.frei,e.wiederfrei); + if not e.frei and not e.wiederfrei then anzahl := anzahl + 1; + end; {|for|} + status:= 0; + a_close(hashfile); + end else status:= 1; +end; {|hashload|} + + +procedure inittrennen; + var ch: 0..255; + bst: buchstabe; + i, status: integer; + is_iniTeX: boolean; +begin + { Konversionstabelle |ktab| initialisieren } + { ======================================== } + + for ch := 0 to 255 do begin + + { if (ch in [" ",",",";",":","-","/","?","!","(",")",".","""","'","^"]) then } + + case ch of + " ",",",";",":","-","/","?","!","(",")",".","""","'","^": + + if ch="." then ktab[ch]:= "." + else ktab[ch] := trennzeichen + { else ktab[ch] := sonderzeichen geht nicht !!} + end; { case } + +if (ktab[ch] <> ".") and (ktab[ch] <> trennzeichen) then ktab[ch] := sonderzeichen; + + end; { for } + for bst := bst_a to bst_z do begin + ktab[ord('A')+ord(bst)-ord(bst_a)]:=bst; + ktab[ord('a')+ord(bst)-ord(bst_a)]:=bst + end; + + { Umlaute und scharfes s - f\"ur ``production \TeX version'' } + ktab[255]:=bst_sz; + ktab[246]:=bst_oe; + ktab[252]:=bst_ue; + ktab[228]:=bst_ae; + + { Umlaute und scharfes s - f\"ur ``initialization \TeX version'' } + ktab["1"]:=bst_sz; + ktab["2"]:=bst_ue; + ktab["3"]:=bst_oe; + ktab["4"]:=bst_ae; + ktab[25]:=bst_sz; {?-wieso? HH} + +{testing:} +for i:=0 to 255 do rev_tab[ktab[i]]:=i; +rev_tab[ktab[255]]:=223; +xchr[223]:=chr(223); xchr[228]:=chr(228); xchr[246]:=chr(246); +xchr[252]:=chr(252); xchr[255]:=chr(223); xchr[ 25]:=chr(223); +{:end of testing} + + { Kombinationstabelle |kombtab| initialisieren } + { ============================================ } + { Diese Tabelle muss symetrisch sein, + kombtab[a,b] = kombtab[b,a] } + kombtab[ keine, keine] := keine; + kombtab[ keine, neben] := keine; + kombtab[ keine,nebenck] := keine; + kombtab[ keine, haupt] := keine; + kombtab[ keine, haupt3] := keine; + + kombtab[ neben, keine] := keine; + kombtab[ neben, neben] := neben; + kombtab[ neben,nebenck] := keine; + kombtab[ neben, haupt] := neben; + kombtab[ neben, haupt3] := keine; + + kombtab[nebenck, keine] := keine; + kombtab[nebenck, neben] := keine; + kombtab[nebenck,nebenck] := nebenck; + kombtab[nebenck, haupt] := keine; + kombtab[nebenck, haupt3] := keine; + + kombtab[ haupt, keine] := keine; + kombtab[ haupt, neben] := neben; + kombtab[ haupt,nebenck] := keine; + kombtab[ haupt, haupt] := haupt; + kombtab[ haupt, haupt3] := keine; + + kombtab[ haupt3, keine] := keine; + kombtab[ haupt3, neben] := keine; + kombtab[ haupt3,nebenck] := keine; + kombtab[ haupt3, haupt] := keine; + kombtab[ haupt3, haupt3] := haupt3; + + { Konsonantentabelle initialisieren } + for bst:=bst_a to bst_sz do konsonant[bst] := true; + konsonant[bst_a] := false; + konsonant[bst_e] := false; + konsonant[bst_i] := false; + konsonant[bst_o] := false; + konsonant[bst_u] := false; + konsonant[bst_ae] := false; + konsonant[bst_oe] := false; + konsonant[bst_ue] := false; + + +{ ================== Hashtabelle |htab| initialisieren ====================== + +Die Prozedur ``hashload'' darf im Initialisierungslauf von TeX auf +keinen Fall aufgerufen werden. Deshalb wird zun\"achst festgestellt, ob +dieser Programmlauf ein Initialisierungslauf ist oder nicht. Abh\"angig +davon wird ``hashload'' nur aufgerufen, wenn dies ein ``Arbeits''-lauf +(production-version) von \TeX ist. + +=============================================================================} + is_iniTeX:=false; + init is_iniTeX:=true; tini + if not is_iniTeX then begin + hashload(status); + if status <> 0 then begin + si_put_cr; + si_put_ln +(' * * * * * * * * * *!'); + si_put_ln('**** ERROR: Can not read hash-file!'); + si_put_cr; + jump_out; + end; + end; {|not iniTeX|} +end; {|inittrennen|} + + +procedure packinfo ( i:infotype; var b : infobyte ); +{ Byte: /zweite/zweite/zweite/erste/erste/erste/untrennbar/ausnahm/ } +{ bzw.: /0 /0 /stall /eherv/stamm/vors /endung /0 / } + +begin + b:=0; +dbg_put_cr; + { with i do begin } + if i.ausnahme then +begin +dbg_put(' ### PCKINF 1A utr:'); +if i.untrennbar then dbg_put('Y') else dbg_put('N'); +dbg_put_ln(',',ord(i.untrennbar):3,' 1.',i.erste:3,' 2.',i.zweite:3); + b:=1+2*ord(i.untrennbar)+4*i.erste+32*i.zweite +; dbg_put('B'); +end + else +begin +dbg_put(' ### PCKINF 2A'); + b:= 2*ord(i.endung)+4*ord(i.vorsilbe)+8*ord(i.stamm)+16*ord(i.ehervor) + +32*ord(i.stammallein); +dbg_put('B'); +end; + { end; with } +dbg_put_ln('-3'); +end; {|packinfo|} + +procedure packentry( e:tableentry; var h:hashelement ); +{ /infobyte+frei,wiederfrei/verdschhigh/verdschmiddle/verdschllow/ } + +begin + { with e do begin } +dbg_put_cr; +dbg_put(' +++ PCKNTY A'); + h[0]:= e.tabv mod 256; { 87654321abcdefghxxxxxxxx} +dbg_put('B'); + e.tabv:= e.tabv div 256; { 0000000087654321abcdefgh} +dbg_put('C'); + h[1]:= e.tabv mod 256; { 0000000087654321xxxxxxxx} +dbg_put('D'); + h[2]:= e.tabv div 256; { 000000000000000087654321} + +dbg_put('E'); + if odd(e.tabb) then h[3]:= e.tabb { Ausnahme !! } + else +begin +dbg_put('F1'); + h[3]:=e.tabb+64*ord(e.frei)+128*ord(e.wiederfrei); { wfxxxxxx } +dbg_put('-2'); +end; +dbg_put_ln('G'); + { end; |with|} +end; {|packentry|} + + + +procedure hashetr ( var w:wort; laenge:integer; i:infotype; + var g:boolean ); + + var v1: varr; + ind1, k1: intarr; + v: verdschlue; + ind, k, j, e: integer; + gef,ngef:boolean; + entry: tableentry; + helem: hashelement; + +begin +dbg_put_ln(' ** HTR 1'); + if anzahl >= tabsize then begin +dbg_put_ln(' ** HTR 2a'); + g := false; + end + else begin +dbg_put_ln(' ** HTR 2b'); + if (anzahl < 10) or (anzahl mod 100 = 0) then begin + si_put_cr; si_put(' -Anzahl:',anzahl,'. '); + end; +dbg_put_ln(' ** HTR 3'); + hashfunk(w,1,laenge,v1,ind1,k1); +dbg_put_ln(' ** HTR 4'); + v := v1[laenge]; + ind := ind1[laenge]; + k := k1[laenge]; + gef := false; ngef := false; + repeat +dbg_put_ln(' ** HTR 5 A'); + unpackentry(htab[ind],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei); +dbg_put_ln(' ** HTR B'); + if entry.frei or entry.wiederfrei then begin + anzahl := anzahl + 1; + ngef := true; + entry.tabv := v; +dbg_put_ln(' ** HTR C1'); + packinfo (i,entry.tabb); +dbg_put_ln(' ** HTR D1'); + entry.frei := false; + entry.wiederfrei := false; +dbg_put_ln(' ** HTR E1'); + packentry(entry,helem); +dbg_put_ln(' ** HTR F1'); + htab[ind] := helem; { -PRAK!- in C memcpy() } + end else begin +dbg_put_ln(' ** HTR C2'); + gef := v = entry.tabv; + if not gef then ind := (ind+k) mod (tabsize + 1); +dbg_put_ln(' ** HTR D2'); + end; + until gef or ngef; +dbg_put_ln(' ** HTR 6'); + g := ngef; + end +end; {|hashetr|} + +procedure hashempty; + var i:integer; + elem : tableentry; + he : hashelement; +begin + { with elem do begin } + elem.tabv:=0; + elem.tabb := 0; { !!!!!! Irgend ein Affe hat diese Initialisierung vergessen. + ( Und dies ist eine Beleidigung fuer jeden Affen ) HM } + elem.frei := true; + elem.wiederfrei := false; + { end; } + packentry (elem, he); + for i := 0 to tabsize do htab[i] := he; { -PRAK!- in C memcpy() } + anzahl := 0; +end; {|hashempty|} + +procedure hashsave (var status:integer); +{ abspeichern der Hash-Tabelle auf file } + var i: integer; +begin + for i:=1 to file_name_size do name_of_file[i]:=' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length:=3; + if a_open_out(hashfile) then begin + for i := 0 to tabsize do begin + write (hashfile, htab[i][0]:4); + write (hashfile, htab[i][1]:4); + write (hashfile, htab[i][2]:4); + write (hashfile, htab[i][3]:4); + write_ln (hashfile); + end; + status:=0; + a_close(hashfile); + end else status:=1; +end; {|hashsave|} + + +function hashsize :integer; +begin + hashsize:=anzahl; +end; + + +procedure zahl(line:string80;var i:integer; ende:integer; var j:integer); + var aus: boolean; +begin + j:=0; + repeat + if i<=ende then + if ktab[line[i]]="." then i:=i+1 + else aus:=true + else aus:=true + until aus; + repeat + if i<=ende then begin + { if line[i] in ["0".."9"] then begin } + case line[i] of + "0","1","2","3","4","5","6","7","8","9": + begin j:=10*j+line[i]-"0";i:=i+1 + end; + { else aus:=true geht nicht !!! } + end; + if (line[i] <> "0") and + (line[i] <> "1") and + (line[i] <> "2") and + (line[i] <> "3") and + (line[i] <> "4") and + (line[i] <> "5") and + (line[i] <> "6") and + (line[i] <> "7") and + (line[i] <> "8") and + (line[i] <> "9") then aus :=true; + end else aus:=true + until aus; +end; {|zahl|} + + +procedure infobau(line: string80; anfang,ende: integer; + { var inform: infotype;} + var informausnahme :boolean; + var informuntrennbar :boolean; + var informerste :integer; + var informzweite :integer; + var informendung :boolean; + var informvorsilbe :boolean; + var informstamm :boolean; + var informehervor :boolean; + var informstammallein:boolean; + var g: boolean); + + var i,j:integer;ok,fehler:boolean; + b:buchstabe; +begin + g:=false; + { with inform do begin } { initialisierung } + informausnahme:=false; + informendung:=false; + informvorsilbe:=false; + informehervor:=false; + informstamm:=false; + informstammallein:=false; + i:=anfang; ok:=false; fehler:=false; + repeat + if i<=ende then + if line[i]="." then i:=i+1 else ok:=true + else fehler:=true + until ok or fehler; + if not fehler then begin + b:=ktab[line[i]]; + if b = bst_a then begin + {ausnahme} + informausnahme:=true; + i:=i+1; + if ktab[line[i]] = bst_u then begin + i := i + 1; informuntrennbar := true; + end else informuntrennbar := false; + zahl(line,i,ende,j); + if j=0 then begin + informerste:=7; informzweite:=7; + { Record-komponente ``zweite'' wird } + { initialisiert, damit beim packen keine } + { undefinierten Ergebnisse entstehen (die u.U. zu } + { RUN-TIME-ERRORS f\"uhren k\"onnen!) } + end else begin + j:=j-2; + if (j>=0) and (j<=6) then informerste:=j + else fehler:=true; + zahl(line,i,ende,j); + if j=0 then informzweite:=7 + else begin + j:=j-informerste-4; + if (j>=0) and (j<=6) then informzweite:=j + else fehler:=true; + end; + end; + if not fehler then g:=true; + end {|if b = bst_a |} + else begin + ok:=false; + repeat + case b of + {bst_v} 22: informvorsilbe:=true; + {bst_e} 5: informendung:=true; + {bst_s} 19: informstamm:=true; + {bst_b} 2: informehervor:=true; + {bst_t} 20: informstammallein:=true; + {trennzeichen} 31:; + othercases fehler:=true + endcases; + if i=ende then ok:=true + else begin + i:=i+1; + b:=ktab[line[i]] + end + until ok or fehler; + if not fehler then + g := (informvorsilbe or informendung or informstamm) + and (not informehervor or informvorsilbe and informendung) + and (not informstammallein or informstamm); + end; {|if b = bst_a then-else|} + end {|if not fehler|} + { end |with inform|} +end; {|infobau|} + + +procedure eintragen (line: string80; l: integer ); + var i, laenge: integer; + inform: infotype; + w: wort; + g: boolean; +begin + laenge := 1; + while line [laenge] <> "." do laenge := laenge + 1; + laenge := laenge -1; + if laenge >= 1 then begin + if laenge <= maxwl then begin + infobau(line,laenge+1,l, + inform.ausnahme,inform.untrennbar, + inform.erste,inform.zweite,inform.endung, + inform.vorsilbe,inform.stamm,inform.ehervor, + inform.stammallein,g); + + if not g then begin + si_put_cr; si_put(' Info falsch: ') + end else begin + for i:= 1 to laenge do w[i]:=ktab[line[i]]; + hashetr(w,laenge,inform,g); + if not g then begin + si_put_cr; si_put(' Tabellenfehler: '); + end; + end; + if not g then begin + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end + end {|if laenge <= maxwl|} + else begin + si_put_cr; si_put_ln(' zu langes Wort: '); + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end + end {|if laenge >= 1|} + else begin + si_put_cr; si_put_ln(' Falsche Zeile: '); + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end +end; {|eintragen|} + +{---------------------------------------------------------------------------} + +{ naechsterbst -> naechsterbst(i,tr,dudstop,b,w) } + +procedure naechsterbst(var i:integer;var tr:trennvektor; + var dudstop:sperrvektor;var b:buchstabe; + var w:wort); + begin + if (i>0) and (tr[i]=keine) and not dudstop[i] + then begin b:=w[i];i:=i-1 end + else b:=trennzeichen + end; +{---------------------------------------------------------------------------} +{ duden(tr) -> duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen) } + + procedure duden (tr:trennvektor; + var w:wort; + var tr1 :trennvektor; + var dudtr:trennvektor; + dud :dudt; { array [0..maxwl] of boolean; } + var dudstop:sperrvektor; + laenge : integer; + var ok :boolean; + var zerlegungen:integer ); + + { traegt in dudtr die Trennstellen nach Dudenregeln ein } + + { frueher mtype laut = (.....) } + + var i:integer; + j:integer; + zust:integer; + aus:boolean; + tre:integer; + letzte:integer; + l,lalt:integer;{ vormals laut } + b:buchstabe; + + + begin { duden } + i:=laenge; + for j := 0 to laenge do dudtr[j] := tr[j]; + while (i>0) and not dud [i] do i:=i-1; + while i>0 do begin + zust:=1; aus:=false; letzte := 0; + l:=kons; + b:=w[i]; + i:=i-1; + repeat + {naechsten Laut lesen} + { procedure nlaut; } + begin { nlaut } + tre:=i+1; + lalt:=l; + case b of + {bst_a } 1:begin l:=vok_a; naechsterbst(i,tr,dudstop,b,w) end; + {bst_o } 15:begin l:=vok_o; naechsterbst(i,tr,dudstop,b,w) end; + {bst_ue} 29:begin l:=vok_ue; naechsterbst(i,tr,dudstop,b,w) end; + {bst_oe} 28:begin l:=vok_oe; naechsterbst(i,tr,dudstop,b,w) end; + {bst_ae} 27:begin l:=vok_ae; naechsterbst(i,tr,dudstop,b,w) end; + {bst_e } 5:begin + l:=vok_e; naechsterbst(i,tr,dudstop,b,w); + if b = bst_i then begin + l:=vok_ie; + naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin + {ungetbst = } i := i + 1; + l:=vok_e; + b := bst_i; + end; + end + end; + {bst_i} 9:begin + l:=vok_i; naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin l:=vok_ei; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_a then begin l:=vok_ai; naechsterbst(i,tr,dudstop,b,w) end + end; + {bst_u} 21:begin + l:=vok_u; naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin l:=vok_eu; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_a then begin l:=vok_au; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_ae then begin l:=vok_aeu; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_q then begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end + end; + {bst_t} 20:begin + l:=kons; naechsterbst(i,tr,dudstop,b,w); + if b = bst_s then naechsterbst(i,tr,dudstop,b,w) + end; + {bst_h} 8:begin + l:=kons; naechsterbst(i,tr,dudstop,b,w); + if b = bst_c then begin + naechsterbst(i,tr,dudstop,b,w); + if b = bst_s then naechsterbst(i,tr,dudstop,b,w) + end + else if b = bst_p then naechsterbst(i,tr,dudstop,b,w) + else if b = bst_t then naechsterbst(i,tr,dudstop,b,w) + end; + {bst_b, bst_c, bst_d, bst_f, bst_g, bst_j, bst_k, bst_l, bst_m, + bst_n, bst_p, + bst_q, bst_r, bst_s, bst_v, bst_w, bst_x, bst_z, bst_sz } + + 2,3,4,6,7,10,11,12,13,14,16,17,18,19,22,23,24,26,30 : + + begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end; + {bst_y} 25:begin + l:=vok_y; + naechsterbst(i,tr,dudstop,b,w); + end; + {trennzeichen,sonderzeichen} + 31,0 :aus:=true + end; + end; { nlaut } + + if not aus then + {Naechster Zustand} + case zust of + 1:if l=kons then zust:=2 + else zust:=4; + 2:if l<>kons then zust:=3; + 3:if l=kons then zust:=6 + else if l<>lalt then begin + zust:=4; + letzte:=tre; + dudtr[letzte]:=neben + end; + 4:if l=kons then zust:=6 + else zust:=3; + 6:if l=kons then begin + zust:=2; + letzte:=tre; + if (w[tre]=bst_c) and (w[tre+1] = bst_k) then + dudtr[letzte]:=nebenck + else dudtr[letzte]:=neben + end + else begin + zust:=4; + letzte:=tre; + dudtr[letzte]:=neben + end + end + until aus; + if zust=2 then dudtr[letzte]:=keine + else if zust=4 then + { if not (lalt in [vok_ai,vok_ei,vok_au,vok_aeu,vok_eu,vok_ie]) then } + if (lalt < vok_ie) or (lalt > vok_eu) then + dudtr[letzte]:=keine; + while (i>0) and not dud[i] do i:=i-1 + end; + end { duden }; +{---------------------------------------------------------------------------} +{ procedure trennen (zustand : integer; anfang: integer; spv:sperrvektor; + var ok1 : boolean); +} + + procedure trennen ( + { trennen } + zustand : integer; + anfang : integer; + spv : sperrvektor; + var ok1 : boolean; + { abteilen } + var tr :trennvektor; + var dudtr:trennvektor; + var zerlegungen:integer ; + var dud:dudt; { array [0..maxwl] of boolean; } + var v:varr; + var ind,k:intarr; + var dudstop:sperrvektor; + { abteilen aufruf } + var w:wort; + var tr1:trennvektor; + laenge : integer ); + + { Zustand : 1 ... Es kann nur Vorsilbe oder Stamm kommen, + rechts muss noch ein Stamm kommen. + 2 ... Es kann Endung, Vorsilbe oder Stamm kommen. + 3 ... Es kann nur Vorsilbe oder Stamm kommen, im linken + Teil muessen noch Trennstellen eingefuegt werden, + rechts muss noch ein Stamm kommen. + 4 ... Es kann nur Vorsilbe oder Stamm kommen, im linken + Teil muessen noch Trennstellen eingefuegt werden. + 5 ... Trennstelle mit entfallenem Konsonanten } + + var + gef, nichtok:boolean; + schnitt:integer; + inform:infotype; + i:integer; + ok_stamm, ok_vor, ok_end, ok_help:boolean; + tri:integer; + { p_stamm } + i1,tre:integer; + ok : boolean; + stop_ptr :integer; + spvtmp :sperrvektor; { lokale Kopie des Sperrvektors, + fr die bersetzung nach C notwendig. + -PRAK!- } + + { procedure p_endung(var endok:boolean); } + + { procedure p_vorsilbe(var vorok:boolean); } + + { procedure p_stamm(var stok:boolean); } + + { procedure p_stammallein (var staok:boolean); } + + begin { trennen } + spvtmp := spv; + ok1:=false; + if anfang = laenge + 1 + then { Ende des Wortes erreicht} + if (zustand = 2) or (zustand=4) then {erfolgreich zerschnitten } + begin + dud[anfang-1]:=true; + + {duden(tr);} + duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen); + + for i := laenge downto 1 do + begin + if dudtr[i-1] = haupt3 then + begin + dudtr[i-1] := keine; + tri := haupt3; + end + else + tri := dudtr[i]; + + if zerlegungen = 0 then + tr1[i] := tri + else + tr1[i] := kombtab[tr1[i],tri]; + end; + zerlegungen:=zerlegungen+1; + ok1:= true + end + else { kein Stamm im Wortrest ok1 = false } + else { restlichen Teil zerschneiden } + begin + hashfunk (w,anfang,laenge,v,ind,k); + schnitt := laenge; + nichtok := false; + repeat + { links abschneiden } + repeat + if spv[schnitt] then { Schnittstelle gesperrt } + gef:=false + else + begin + hashsuch (v[schnitt],ind[schnitt],k[schnitt], + inform.ausnahme,inform.untrennbar, + inform.erste,inform.zweite,inform.endung, + inform.vorsilbe,inform.stamm,inform.ehervor, + inform.stammallein,gef); + end; + if gef then + spv[schnitt]:=true + else + schnitt := schnitt - 1 + until gef or (schnitt = anfang - 1); + + if gef then { teilwortanfang ist bekanntes wort } + begin + if not inform.ausnahme then + begin + if inform.endung and (zustand=2) then + begin + + { --- p_endung(ok_end); --- } + ok_end:=false; + if (w[anfang]=bst_c) or (w[anfang]=bst_h) then + begin + dud[anfang-1]:=true; + tr[anfang-1]:=neben + end; + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv[schnitt+1]:=true; + trennen (2, schnitt+2, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_end := ok_help + end; + trennen (2, schnitt+1, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_end := ok_end or ok_help; + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + { --- p_endung(ok_end) - ende --- } + + ok1 := ok1 or ok_end + end + else + ok_end:=false; + if inform.vorsilbe + then begin + + { --- p_vorsilbe(ok_vor); --- } + { Trennstelle(n) vor der Vorsilbe eintragen } + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt; + end; + { Trennstellen innerhalb der Vorsilbe eintragen } + dud[schnitt]:=true; + { Rest des Wortes zerschneiden } + trennen(1, schnitt+1, spv, ok_vor, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + dud[schnitt]:=false; + { --- p_vorsilbe(ok_vor) - ende --- } + + ok1 := ok1 or ok_vor + end + else + ok_vor := false; + if inform.stamm and not ok_vor + then begin + if not inform.stammallein + then begin + + { --- p_stamm(ok_stamm); --- } + ok_stamm := false; + stop_ptr := 0; + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt + end; + {ev. Ausnahmetrennstellen eintragen} + if inform.ausnahme then begin + if inform.erste<>7 then begin + tre:=anfang+inform.erste+1; + tr[tre]:=neben; + if inform.zweite<>7 then begin + tre:=tre+inform.zweite+2; + if inform.untrennbar then begin + stop_ptr := tre; + dudstop[stop_ptr] := true; + end + else + tr[tre]:=neben + end + else begin + if inform.untrennbar then begin + tr[tre] := keine; + stop_ptr := tre; + dudstop[tre]:=true; + end + end + end + else begin {inform.erste = 7} + stop_ptr := schnitt-1; + dudstop[stop_ptr] := true + end + end; + + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv [schnitt+1] := true; + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_help + end; + + { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts } + if (schnitt >=2) and (schnitt < laenge) then + if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and + (w[schnitt] = w[schnitt-1]) then begin + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + end; + + { restlichen Teil zerschneiden } + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + + { eingetragene Trennstellen entfernen } + if inform.ausnahme then + for i1:=anfang-1 to schnitt do + begin + tr[i1]:=keine; + dud[i1]:=false; + dudstop[stop_ptr] := false; + end + else begin + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + end; + { --- p_stamm(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end + else + if (anfang=1) and (schnitt=laenge) + then begin + + { --- p_stammallein(ok_stamm); --- } + dud[anfang-1]:=true; + tr[anfang-1]:=haupt; + trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + { --- p_stammallein(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end; + end + end + else begin + + { --- p_stamm(ok_stamm); --- } + ok_stamm := false; + stop_ptr := 0; + + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt + end; + {ev. Ausnahmetrennstellen eintragen} + if inform.ausnahme then begin + if inform.erste<>7 then begin + tre:=anfang+inform.erste+1; + tr[tre]:=neben; + if inform.zweite<>7 then begin + tre:=tre+inform.zweite+2; + if inform.untrennbar then begin + stop_ptr := tre; + dudstop[stop_ptr] := true; + end + else + tr[tre]:=neben + end + else begin + if inform.untrennbar then begin + tr[tre] := keine; + stop_ptr := tre; + dudstop[tre]:=true; + end + end + end + else begin {inform.erste = 7} + stop_ptr := schnitt-1; + dudstop[stop_ptr] := true; + end; + end; + + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv [schnitt+1] := true; + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_help + end; + + { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts } + if (schnitt >=2) and (schnitt < laenge) then + if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and + (w[schnitt] = w[schnitt-1]) then begin + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + end; + + { restlichen Teil zerschneiden } + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + + { eingetragene Trennstellen entfernen } + if inform.ausnahme then + for i1:=anfang-1 to schnitt do + begin + tr[i1]:=keine; + dud[i1]:=false; + dudstop[stop_ptr] := false; + end + else begin + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + end; + { --- p_stamm(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end; + + {naechsten Schleifendurchlauf vorbereiten} + schnitt := schnitt - 1; + nichtok := schnitt = anfang - 1 + end + else { kein bekanntes Wort am Beginn des Teilwortes } + nichtok := true; + + until nichtok + end; + spv := spvtmp; { spv wiederherstellen, fr die C Version. -PRAK!- } + end { trennen }; + +{----------------------------------------------------------------------------} + +procedure abteilen ( var w:wort; var tr1:trennvektor; + laenge : integer; var ok:boolean; + var zerlegungen:integer ); + + label 99; + + { kommt in den outer Block } + { mtype sperrvektor=array [0..maxwl] of boolean; } + + var + i:integer; + dud:dudt; { array [0..maxwl] of boolean; } + v:varr; + ind,k:intarr; + spv,dudstop:sperrvektor; + tr, dudtr:trennvektor; + + begin { abteilen } + tr1[0] := keine; + for i:=0 to laenge do begin + tr[i]:=keine; spv[i]:=false; dudstop[i]:=false; dud[i]:=false; + if i > 0 then + if (w[i] = trennzeichen) or (w[i] = sonderzeichen) + then begin + zerlegungen := 0; + ok := false; + goto 99; + end; + end; + zerlegungen:=0; + trennen(3, 1, spv, ok, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + + for i:=0 to laenge do + if tr1[i]=nebenck then begin + tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- } + tr1[i-1]:=nebenck; {sprechend getrennt wird } + end; +99: + end;{ abteilen } +{----------------------------------------------------------------------------} + + {identification number for dirty umlauts; see description in + change file} + + function is_dirty_umlaut(p:pointer):boolean; + var res:boolean; + q:pointer; + begin + res:=false; + if p<>null then + if type(p)=disc_node then + if pre_break(p)<>null then + if link(pre_break(p))<>null then + if link(link(pre_break(p)))<>null then begin + q:=pre_break(p); + if type(q)=penalty_node then q:=link(q); + if (type(q)=kern_node)and(width(q)=spec_letter_ID)and + is_char_node(link(q))and(type(link(link(q)))=kern_node) then res:=true; + end; + is_dirty_umlaut:=res; + end; {|is_dirty_umlaut|} + + function get_char_of(s:pointer):integer; + var q:pointer; + begin + q:=pre_break(s); + if type(q)=penalty_node then q:=link(q); + get_char_of:=width(link(link(q))); + end; {|get_char_of|} + + function get_font_of(s:pointer):integer; + var q:pointer; + begin + q:=pre_break(s); + if type(q)=penalty_node then q:=link(q); + get_font_of:=font(link(q)); + end; {|get_font_of|} + +{----------------------------------------------------------------------------} + +@ Ende ... +@z + +========================================================================= + +@x +@ Now let's go back to the easier problem, of building the linked +trie. When \.{INITEX} has scanned the `\.{\\patterns}' control +sequence, it calls on |new_patterns| to do the right thing. + +@<Declare procedures for preprocessing hyph...@>= +procedure new_patterns; {initializes the hyphenation pattern data} +label done, done1; +var k,@!l:small_number; {indices into |hc| and |hyf|} +@!digit_sensed:boolean; {should the next digit be treated as a letter?} +@!v:quarterword; {trie op code} +@!p,@!q:trie_pointer; {nodes of trie traversed during insertion} +@!first_child:boolean; {is |p=trie_l[q]|?} +@!c:ASCII_code; {character being inserted} +begin if trie_not_ready then + begin set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}} + @<Enter all of the patterns into a linked trie, until coming to a right + brace@>; + end +else begin print_err("Too late for "); print_esc("patterns"); + help1("All patterns must be given before typesetting begins."); + error; link(garbage):=scan_toks(false,false); flush_list(def_ref); + end; +end; +@y +@ We do not build a trie (wether a linked nor a packed). Instead, we +create a hash table for the \SISISI-hyphenation algorithm. But we +still use the data provided by the `\.{\\patterns}' primitive. + +@<Declare procedures for preprocessing hyph...@>= +procedure new_patterns; {initializes the hyphenation pattern data} + label done; + var k: small_number; {index into |zeile|} + @!zeile:string80; { Silbe <space> Type <,> als Eintrag der Hashtabelle } + @!status:integer; + @!c:ASCII_code; {character being inserted} +begin + if trie_not_ready then begin + set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}} + + hashempty; { create the empty hash table } + @<Enter all of the patterns into a hash table, until coming to a right + brace; then skip an optional space@>; + hashsave(status); + if status<>0 then begin + wterm_ln('Fehler bei hash save !!!!!'{?}); + wlog_ln( 'Fehler bei hash save !!!!!'{?}); + end; + end else begin + print_err("Too late for "); print_esc("patterns"); + help1("All patterns must be given before typesetting begins."); + error; link(garbage):=scan_toks(false,false); flush_list(def_ref); + end; +end; +@z + + +-------------------------------------------------------------------------- + + +@x +@ Novices are not supposed to be using \.{\\patterns}, so the error +messages are terse. (Note that all error messages appear in \TeX's string +pool, even if they are used only by \.{INITEX}.) + +@<Enter all of the patterns into a linked trie...@>= +k:=0; hyf[0]:=0; digit_sensed:=false; +loop@+ begin get_x_token; + case cur_cmd of + letter,other_char:@<Append a new letter or a hyphen level@>; + spacer,right_brace: begin if k>0 then + @<Insert a new pattern into the linked trie@>; + if cur_cmd=right_brace then goto done; + k:=0; hyf[0]:=0; digit_sensed:=false; + end; + othercases begin print_err("Bad "); print_esc("patterns"); +@.Bad \\patterns@> + help1("(See Appendix H.)"); error; + end + endcases; + end; +done: +@y +@ Here we build the hash table for the \SISISI-hyphenation. + +@<Enter all of the patterns into a hash table, until coming to a right...@>= +for k:=0 to maxwl do zeile[k]:=" "; +k:=0; +loop@+ begin + get_x_token; { \SISISI Worttabelle hat das Format 'Text.Type,'. + Der Beistrich wird eigens abgefragt, da er in TeX + umdefiniert werden kann. } + if (cur_cmd = right_brace)or(cur_chr = ",") then + begin + { Ein Eintrag der Worttabelle - letzter + (|cur_cmd|=|right_brace|) - gelesen } + if k>0 then eintragen(zeile,k); { ein Eintrag vorhanden } + if cur_cmd = right_brace then goto done; + k := 0; { hyf[] ist \"uberfl\"ussig, da die + Trenninformation in zeile mitverpackt ist. } + end + else { Das Wort ist noch nicht fertig gelesen } + if (cur_cmd = letter) or (cur_cmd = other_char) + or (cur_cmd = spacer) or (cur_chr = ".") + then begin + @<Append a new letter or a hyphen level@>; + end else begin + print_err("Bad "); print_esc("patterns"); +@.Bad \\patterns@> + help1("(See Appendix H.)"); error; + end; +end; {|loop|} +done: +@z + +----------------------------------------------------------------------------- + + +@x +@ @<Append a new letter or a hyphen level@>= +if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then + begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter} + else begin cur_chr:=lc_code(cur_chr); + if cur_chr=0 then + begin print_err("Nonletter"); +@.Nonletter@> + help1("(See Appendix H.)"); error; + end; + end; + if k<63 then + begin incr(k); hc[k]:=cur_chr; hyf[k]:=0; digit_sensed:=false; + end; + end +else if k<63 then + begin hyf[k]:=cur_chr-"0"; digit_sensed:=true; + end +@y +@ @<Append a new letter or a hyphen level@>= +if (cur_chr<>" ")then begin + { Das Leerzeichen wird \"uberlesen! } + if (cur_chr <> ".") then begin + { der Punkt trennt die Silbe von der Silbenart und bleibt erhalten } + if (cur_chr<"0")or(cur_chr>"9") then begin + cur_chr:=lc_code(cur_chr); + if cur_chr=0 then begin + print_err("Nonletter"); +@.Nonletter@> + help1("(See Appendix H.)"); error; cur_chr:=128; + end; + end; + end; + if k<63 then begin + incr(k); zeile[k]:=cur_chr; + end; +end; +@z + +---------------------------------------------------------------------------- + + +@x +@ When the following code comes into play, the pattern $p_1\ldots p_k$ +appears in |hc[1..k]|, and the corresponding sequence of numbers $n_0\ldots +n_k$ appears in |hyf[0..k]|. + +@<Insert a new pattern into the linked trie@>= +begin @<Compute the trie op code, |v|, and set |l:=0|@>; +q:=0; hc[0]:=cur_lang; +while l<=k do + begin c:=hc[l]; incr(l); p:=trie_l[q]; first_child:=true; + while (p>0)and(c>so(trie_c[p])) do + begin q:=p; p:=trie_r[q]; first_child:=false; + end; + if (p=0)or(c<so(trie_c[p])) then + @<Insert a new trie node between |q| and |p|, and + make |p| point to it@>; + q:=p; {now node |q| represents $p_1\ldots p_l$} + end; +if trie_o[q]<>min_quarterword then + begin print_err("Duplicate pattern"); +@.Duplicate pattern@> + help1("(See Appendix H.)"); error; + end; +trie_o[q]:=v; +end +@y +@ Well, that was everything about the initialization of the \SISISI hash +table (at this place). + +All following sections, describing the initialization of the trie are +replaced by ``empty sections'' in order to have same section numbering +in SI\TeX as in \TeX. +@z + +---------------------------------------------------------------------------- + +@x +@ @<Insert a new trie node between |q| and |p|...@>= +begin if trie_ptr=trie_size then overflow("pattern memory",trie_size); +@:TeX capacity exceeded pattern memory}{\quad pattern memory@> +incr(trie_ptr); trie_r[trie_ptr]:=p; p:=trie_ptr; trie_l[p]:=0; +if first_child then trie_l[q]:=p@+else trie_r[q]:=p; +trie_c[p]:=si(c); trie_o[p]:=min_quarterword; +end +@y +@ ``Empty section''. +@z +------------------------------------------------------------------------------ +@x +@ @<Compute the trie op code, |v|...@>= +if hc[1]=0 then hyf[0]:=0; +if hc[k]=0 then hyf[k]:=0; +l:=k; v:=min_quarterword; +loop@+ begin if hyf[l]<>0 then v:=new_trie_op(k-l,hyf[l],v); + if l>0 then decr(l)@+else goto done1; + end; +done1: +@y +@ Further ``empty section''. +@z + +@x +@ Finally we put everything together: Here is how the trie gets to its +final, efficient form. +The following packing routine is rigged so that the root of the linked +tree gets mapped into location 1 of |trie|, as required by the hyphenation +algorithm. This happens because the first call of |first_fit| will +``take'' location~1. + +@<Declare procedures for preprocessing hyphenation patterns@>= +procedure init_trie; +var @!p:trie_pointer; {pointer for initialization} +@!j,@!k,@!t:integer; {all-purpose registers for initialization} +@!r,@!s:trie_pointer; {used to clean up the packed |trie|} +@!h:two_halves; {template used to zero out |trie|'s holes} +begin @<Get ready to compress the trie@>; +if trie_root<>0 then + begin first_fit(trie_root); trie_pack(trie_root); + end; +@y +@ Because we do not use the trie, we fill it with dummy data. +But the main reason, why we do not remove this procedure is, that +it is called and the used variables are referenced somewhere in \TeX. + + +@<Declare procedures for preprocessing hyphenation patterns@>= +procedure init_trie; + var @!p:trie_pointer; {pointer for initialization} + @!j,@!k,@!t:integer; {all-purpose registers for initialization} + @!r,@!s:trie_pointer; {used to clean up the packed |trie|} + @!h:two_halves; {template used to zero out |trie|'s holes} +begin + trie_root:=0; +@z + +========================================================================= + diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/install b/obsolete/systems/sisisi/unix/iSiTeX3.141/install new file mode 100644 index 0000000000..abf1e67cab --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/install @@ -0,0 +1,266 @@ +#!/bin/sh + +TEXSRC="/users/heinz/src/tex/TeX-3.141/TeX3.141" +MAKEDIR=$TEXSRC +TEXDIR=$MAKEDIR/tex +WEBDIR=$MAKEDIR/web +WEB2CDIR=$MAKEDIR/web2c +LIBDIR=$MAKEDIR/lib +SISISIDIR="/users/heinz/src/tex/sisisi/iSiTeX3.141" + +echo "*** iSiTeX 3.141 Installation program" +echo "*** =================================" +echo "***" +echo "*** Do not forget to retrieve the files *.tex and *.sty" +echo "*** from eiunix.tuwien.ac.at:/pub/sisisi/COMMON and" +echo "*** copy them into your TEXINPUTS path." +echo "***" +echo "*** You also have to get tie from the COMMON directory" +echo "*** and put it into a directory holding executables, so" +echo "*** it can be used by the installation." +echo "***" +echo "*** Before the installation can continue, you have to" +echo "*** follow the guidelines from the TeX3.141 distribution" +echo "*** and set the pathnames in the several Makefile.in" +echo "*** and site.h for your site's needs." +echo "***" +echo "*** Do not run configure, it is started by this script." +echo "***" +echo "*** If you want to stop the installation, press 'q' now." +echo "*** Press <cr> to continue." + +read x +if [ "$x" = "q" ] +then + exit +fi + + +echo +echo "Starting installation of iSiTeX3.141" +echo + +cd $TEXDIR +echo "Changing to $TEXDIR" +if [ ! -f tex.web.orig ] +then + echo "Saving tex.web in tex.web.orig" + mv tex.web tex.web.orig +fi +if [ ! -f tex.ch.orig ] +then + echo "Saving tex.ch in tex.ch.orig" + mv tex.ch tex.ch.orig +fi +if [ ! -f Makefile.orig ] +then + echo "Saving Makefile in Makefile.orig" + mv Makefile Makefile.orig +fi +echo "Modifying Makefile for tex9.c and tex10.c" +sed -e 's/^objs=/objs=tex9.o tex10.o /'\ + -e 's/^tex0.c/tex10.c tex0.c/'\ + -e 's/tex9\.o: tex8\.c/tex9.o: tex9.c/'\ + -e '/^tex9\.o:/a\ +tex10.o: tex10.c $(commonh)' < Makefile.orig > Makefile + +cd $SISISIDIR +echo "Changing to $SISISIDIR" +echo "Uncompressing isitex.web to $TEXDIR/tex.web" +uncompress <isitex.web.Z >$TEXDIR/tex.web +echo "Copying tex.ch to $TEXDIR/tex.ch" +cp tex.ch $TEXDIR/tex.ch + +cd $WEBDIR +echo "Changing to $WEBDIR" +if [ ! -f tangle.ch.orig ] +then + echo "Saving tangle.ch in tangle.ch.orig" + mv tangle.ch tangle.ch.orig +fi +echo "Modifying tangle.ch for bigger name space" +sed -e '/@!stack_size=50/i\ +@!max_toks=50000; {|1/zz| times the number of bytes in compressed \\PASCAL\\ code;\ + must be less than 65536}\ +@y\ +@!max_toks=60000; {|1/zz| times the number of bytes in compressed \\PASCAL\\ code;\ + must be less than 65536}\ +@z\ +\ +@x\ +@!max_names=4000; {number of identifiers, strings, module names;\ + must be less than 10240}\ +@y\ +@!max_names=9000; {number of identifiers, strings, module names;\ + must be less than 10240}\ +@z\ +\ +@x' < tangle.ch.orig > tangle.ch +sleep 5 +touch tangleboot.p +sleep 5 +touch tangleboot.c tangleboot.h + +cd $WEB2CDIR +echo "Changing to $WEB2CDIR" +if [ ! -f web2c.yacc.orig ] +then + echo "Saving web2c.yacc in web2c.yacc.orig" + mv web2c.yacc web2c.yacc.orig +fi +if [ ! -f web2c.c.orig ] +then + echo "Saving web2c.c in web2c.c.orig" + mv web2c.c web2c.c.orig +fi +if [ ! -f web2c.h.orig ] +then + echo "Saving web2c.h in web2c.h.orig" + mv web2c.h web2c.h.orig +fi +echo "Modifying web2c.[ch] for bigger tables" +sed -e 's/var_list\[.00]/var_list\[500]/'\ + -e 's/field_list\[.00]/field_list\[500]/' < web2c.c.orig > web2c.c +sed -e 's/var_list\[.00]/var_list\[500]/'\ + -e 's/field_list\[.00]/field_list\[500]/' < web2c.h.orig > web2c.h +echo "Modifying web2c.yacc for handling of pointer variables" +tie -m web2c.yacc web2c.yacc.orig $SISISIDIR/web2c.yacc.ch +if [ $? -ne 0 ] +then + echo "*** You have not installed tie, or an error during the" + echo "*** execution of tie has occured." + echo "***" + echo "*** Installation terminated." + exit 1 +fi + +cd $LIBDIR +echo "Changing to $LIBDIR" +if [ ! -f common.defines.orig ] +then + echo "Saving common.defines in common.defines.orig" + mv common.defines common.defines.orig +fi +echo "Modifying common.defines for definition of malloc and sizeof" +cp common.defines.orig common.defines +echo '{Definitions for IsITeX: new(p) is translated to p := malloc(sizeof(^p)), +so we have to define malloc and sizeof for web2c.} + +@define function malloc (); +@define function sizeof ();' >> common.defines + +cd $MAKEDIR +echo "Changing to $MAKEDIR" +echo "Running configure" +./configure + +echo "*** Now that configure has finished, you might want" +echo "*** to inspect or change the Makefiles, as suggested" +echo "*** in TeX3.141's README file." +echo "*** Press 's' to suspend the installation and start" +echo "*** an interactive shell, <cr> to continue." + +read x +if [ "$x" = "s" ] +then + echo "Type 'exit' to quit the shell and continue with the installation." + ${SHELL:-/bin/sh} +fi + +cd $MAKEDIR +echo "Changing to $MAKEDIR" +echo "Now starting: \`make TeX'" +make TeX + +cd $TEXDIR +echo "Now starting error correction" +echo "Changing to $TEXDIR" +echo "Correcting coerce.h" +sed -e 's/(string80)//g' -e 's/(sperrvektor)//g' -e 's/(wort)//g'\ + -e 's/(dudt)//g' -e 's/(intarr)//g' -e 's/(varr)//g'\ + -e 's/(trennvektor)//g' -e 's/(hashelement)//g' -e 's/(trenn16)//g'\ + -e 's/(infotype)//g' -e 's/(tableentry)//g' < coerce.h > coerce.h.new +mv coerce.h.new coerce.h +echo "Correcting texd.h" +tie -m texd.h.new texd.h $SISISIDIR/texd.h.ch +mv texd.h.new texd.h +echo "Correcting tex6.c" +sed -e 's/) ]/] )/g' -e 's/) ]/] )/g' -e 's/\(hashfile.*,.*\)"%ld"/\1"%4ld"/g'\ + -e 's/integer vacc/long vacc/' -e 's/\(vacc = [0-9][0-9]*\)/\1L/'\ + -e 's/\(indacc = [0-9][0-9]*\)/\1L/' -e 's/\(kacc = [0-9][0-9]*\)/\1L/'\ + -e 's/) + 96 ]/] + 96 )/g'\ + -e '/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*0.*].*).*;/i\ + integer help;'\ + -e 's/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*\([0-9]\).*].*).*;/\ + fscanf ( hashfile, "%d", \&help );\ + htab [i][\1] = (eightbits) help;/' < tex6.c > tex6.c.new +mv tex6.c.new tex6.c +echo "Correcting tex7.c" +sed -e 's/) ]/] )/g' -e 's/) ]/] )/g'\ + -e 's/read.*(.*hsmem.*l.*)/fscanf ( hsmem , "%d", \&l )/'\ + -e 's/read.*(.*hsmem.*w.*\[.*i.*)/fscanf ( hsmem , "%hd", \&w [ i ] )/'\ + -e 's/read.*(.*hsmem.*tr.*\[.*i.*)/fscanf ( hsmem , "%d", \&tr [ i ] )/'\ + -e 's/read.*(.*hsmem.*temp.*)/fscanf ( hsmem , "%c", \&temp )/'\ + < tex7.c > tex7.c.new +mv tex7.c.new tex7.c +echo "Correcting tex10.c" +sed -e 's/) ]/] )/g' -e 's/) ]/] )/g'\ + -e 's/fprintf(.*hsmem.*"%ld"/fprintf( hsmem , " %ld"/'\ + -e 's/) + 96 ]/] + 96 )/' < tex10.c > tex10.c.new +mv tex10.c.new tex10.c + +cd $MAKEDIR +echo "Returning to $MAKEDIR" +echo "Continuing: \`make TeX'" +make TeX + +cd $TEXDIR +if [ ! -x virtex ] +then + echo "*** There seems to be something wrong; virtex doesn't exist." + echo "*** Obviously, the installation has failed." + exit 1 +fi + +echo "Creating the formatfiles in $TEXDIR" +echo +echo "If siplain.tex, silplain.tex, sihyphen.tex and def_umlaut.tex are not" +echo "in one of the TEXINPUTS directories, you will now run into trouble." +echo "(You will be prompted for their pathnames and have to type in" +echo "the whole stuff.)" + +mv tex.pool isitex.pool +TEXPOOL=. ./initex siplain.tex \\dump +if [ -f siplain.fmt ] +then + mv siplain.fmt isitex.fmt + echo "...isitex.fmt created" +else + echo "isiplain.fmt not created for unknown reasons." +fi +TEXPOOL=. ./initex silplain.tex \\dump +if [ -f silplain.fmt ] +then + mv silplain.fmt isilatex.fmt + echo "...isilatex.fmt created" +else + echo "isilplain.fmt not created for unknown reasons." +fi + +echo "*** The installation is now complete." +echo "*** You should find the following files in $TEXDIR:" +echo "***" +echo "*** isitex.fmt, isilatex.fmt, hf3," +echo "*** isitex.pool, virtex and initex." +echo "***" +echo "*** Now copy isitex.fmt and isilatex.fmt into a TEXFORMAT-Dir," +echo "*** virtex and initex into a directory holding executables" +echo "*** (preferably as isivirtex and isiinitex), hf3 into" +echo "*** a TEXINPUTDIR, and isitex.pool into the TEXPOOLDIR." +echo "*** Also create links isilatex and isitex to isivirtex, and" +echo "*** a link named isiplain.fmt to isitex.fmt, all in the" +echo "*** appropriate directories. If you have SiTeX 3.141 already" +echo "*** installed, you needn't install the new hf3 again, as they" +echo "*** are identical." + +exit 0 diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/install.other b/obsolete/systems/sisisi/unix/iSiTeX3.141/install.other new file mode 100644 index 0000000000..f47f0cf9a1 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/install.other @@ -0,0 +1,263 @@ +#!/bin/sh + +TEXSRC="/users/heinz/src/tex/TeX-3.141/TeX3.141" +MAKEDIR=$TEXSRC/web2c-5.851d +TEXDIR=$MAKEDIR/tex +WEBDIR=$MAKEDIR/web +WEB2CDIR=$MAKEDIR/web2c +LIBDIR=$MAKEDIR/lib +SISISIDIR="/users/heinz/src/tex/sisisi/iSiTeX3.141" + +echo "*** iSiTeX 3.141 Installation program" +echo "*** =================================" +echo "***" +echo "*** Do not forget to retrieve the files *.tex and *.sty" +echo "*** from eiunix.tuwien.ac.at:/pub/sisisi/COMMON and" +echo "*** copy them into your TEXINPUTS path." +echo "***" +echo "*** You also have to get tie from the COMMON directory" +echo "*** and put it into a directory holding executables, so" +echo "*** it can be used by the installation." +echo "***" +echo "*** Before the installation can continue, you have to" +echo "*** follow the guidelines from the TeX3.141 distribution" +echo "*** and set the pathnames in the several Makefile.in" +echo "*** for your site's needs." +echo "***" +echo "*** Do not run configure, it is started by this script." +echo "***" +echo "*** If you want to stop the installation, press 'q' now." +echo "*** Press <cr> to continue." + +read x +if [ "$x" = "q" ] +then + exit +fi + + +echo +echo "Starting installation of iSiTeX3.141" +echo + +cd $TEXDIR +echo "Changing to $TEXDIR" +if [ ! -f tex.web.orig ] +then + echo "Saving tex.web in tex.web.orig" + mv tex.web tex.web.orig +fi +if [ ! -f tex.ch.orig ] +then + echo "Saving tex.ch in tex.ch.orig" + mv tex.ch tex.ch.orig +fi +if [ ! -f Makefile.in.orig ] +then + echo "Saving Makefile.in in Makefile.in.orig" + mv Makefile.in Makefile.in.orig +fi +echo "Modifying Makefile.in for tex9.c and tex10.c" +sed -e 's/#.*tex9_o.*9.o/tex9_o = tex9.o tex10.o/'\ + < Makefile.in.orig > Makefile.in + +cd $SISISIDIR +echo "Changing to $SISISIDIR" +echo "Uncompressing isitex.web to $TEXDIR/tex.web" +uncompress <isitex.web.Z >$TEXDIR/tex.web +echo "Copying tex.ch to $TEXDIR/tex.ch" +cp tex.ch $TEXDIR/tex.ch + +cd $WEBDIR +echo "Changing to $WEBDIR" +if [ ! -f tangle.ch.orig ] +then + echo "Saving tangle.ch in tangle.ch.orig" + mv tangle.ch tangle.ch.orig +fi +echo "Modifying tangle.ch for bigger name space" +sed -e '/@!stack_size=50/i\ +@!max_toks=50000; {|1/zz| times the number of bytes in compressed \\PASCAL\\ code;\ + must be less than 65536}\ +@y\ +@!max_toks=60000; {|1/zz| times the number of bytes in compressed \\PASCAL\\ code;\ + must be less than 65536}\ +@z\ +\ +@x\ +@!max_names=4000; {number of identifiers, strings, module names;\ + must be less than 10240}\ +@y\ +@!max_names=9000; {number of identifiers, strings, module names;\ + must be less than 10240}\ +@z\ +\ +@x' < tangle.ch.orig > tangle.ch +sleep 5 +touch tangleboot.p +sleep 5 +touch tangleboot.c tangleboot.h + +cd $WEB2CDIR +echo "Changing to $WEB2CDIR" +if [ ! -f web2c.yacc.orig ] +then + echo "Saving web2c.yacc in web2c.yacc.orig" + mv web2c.yacc web2c.yacc.orig +fi +if [ ! -f web2c.c.orig ] +then + echo "Saving web2c.c in web2c.c.orig" + mv web2c.c web2c.c.orig +fi +if [ ! -f web2c.h.orig ] +then + echo "Saving web2c.h in web2c.h.orig" + mv web2c.h web2c.h.orig +fi +echo "Modifying web2c.[ch] for bigger tables" +sed -e 's/var_list\[.00]/var_list\[500]/'\ + -e 's/field_list\[.00]/field_list\[500]/' < web2c.c.orig > web2c.c +sed -e 's/var_list\[.00]/var_list\[500]/'\ + -e 's/field_list\[.00]/field_list\[500]/' < web2c.h.orig > web2c.h +echo "Modifying web2c.yacc for handling of pointer variables" +tie -m web2c.yacc web2c.yacc.orig $SISISIDIR/web2c.yacc.ch +if [ $? -ne 0 ] +then + echo "*** You have not installed tie, or an error during the" + echo "*** execution of tie has occured." + echo "***" + echo "*** Installation terminated." + exit 1 +fi + +cd $LIBDIR +echo "Changing to $LIBDIR" +if [ ! -f common.defines.orig ] +then + echo "Saving common.defines in common.defines.orig" + mv common.defines common.defines.orig +fi +echo "Modifying common.defines for definition of malloc and sizeof" +cp common.defines.orig common.defines +echo '{Definitions for IsITeX: new(p) is translated to p := malloc(sizeof(^p)), +so we have to define malloc and sizeof for web2c.} + +@define function malloc (); +@define function sizeof ();' >> common.defines + +cd $MAKEDIR +echo "Changing to $MAKEDIR" +echo "Running configure" +./configure + +echo "*** Now that configure has finished, you might want" +echo "*** to inspect or change the Makefiles, as suggested" +echo "*** in TeX3.141's README file." +echo "*** Press 's' to suspend the installation and start" +echo "*** an interactive shell, <cr> to continue." + +read x +if [ "$x" = "s" ] +then + echo "Type 'exit' to quit the shell and continue with the installation." + ${SHELL:-/bin/sh} +fi + +cd $MAKEDIR +echo "Changing to $MAKEDIR" +echo "Now starting: \`make TeX'" +make TeX + +cd $TEXDIR +echo "Now starting error correction" +echo "Changing to $TEXDIR" +echo "Correcting coerce.h" +sed -e 's/(string80)//g' -e 's/(sperrvektor)//g' -e 's/(wort)//g'\ + -e 's/(dudt)//g' -e 's/(intarr)//g' -e 's/(varr)//g'\ + -e 's/(trennvektor)//g' -e 's/(hashelement)//g' -e 's/(trenn16)//g'\ + -e 's/(infotype)//g' -e 's/(tableentry)//g' < coerce.h > coerce.h.new +mv coerce.h.new coerce.h +echo "Correcting texd.h" +tie -m texd.h.new texd.h $SISISIDIR/texd.h.ch +mv texd.h.new texd.h +echo "Correcting tex6.c" +sed -e 's/) ]/] )/g' -e 's/) ]/] )/g' -e 's/\(hashfile.*,.*\)"%ld"/\1"%4ld"/g'\ + -e 's/integer vacc/long vacc/' -e 's/\(vacc = [0-9][0-9]*\)/\1L/'\ + -e 's/\(indacc = [0-9][0-9]*\)/\1L/' -e 's/\(kacc = [0-9][0-9]*\)/\1L/'\ + -e 's/) + 96 ]/] + 96 )/g'\ + -e '/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*0.*].*).*;/i\ + integer help;'\ + -e 's/read.*(.*hashfile.*,.*htab.*\[.*i.*].*\[.*\([0-9]\).*].*).*;/\ + fscanf ( hashfile, "%d", \&help );\ + htab [i][\1] = (eightbits) help;/' < tex6.c > tex6.c.new +mv tex6.c.new tex6.c +echo "Correcting tex7.c" +sed -e 's/) ]/] )/g' -e 's/) ]/] )/g'\ + -e 's/read.*(.*hsmem.*l.*)/fscanf ( hsmem , "%d", \&l )/'\ + -e 's/read.*(.*hsmem.*w.*\[.*i.*)/fscanf ( hsmem , "%hd", \&w [ i ] )/'\ + -e 's/read.*(.*hsmem.*tr.*\[.*i.*)/fscanf ( hsmem , "%d", \&tr [ i ] )/'\ + -e 's/read.*(.*hsmem.*temp.*)/fscanf ( hsmem , "%c", \&temp )/'\ + < tex7.c > tex7.c.new +mv tex7.c.new tex7.c +echo "Correcting tex10.c" +sed -e 's/) ]/] )/g' -e 's/) ]/] )/g'\ + -e 's/fprintf(.*hsmem.*"%ld"/fprintf( hsmem , " %ld"/'\ + -e 's/) + 96 ]/] + 96 )/' < tex10.c > tex10.c.new +mv tex10.c.new tex10.c + +cd $MAKEDIR +echo "Returning to $MAKEDIR" +echo "Continuing: \`make TeX'" +make TeX + +cd $TEXDIR +if [ ! -x virtex ] +then + echo "*** There seems to be something wrong; virtex doesn't exist." + echo "*** Obviously, the installation has failed." + exit 1 +fi + +echo "Creating the formatfiles in $TEXDIR" +echo +echo "If siplain.tex, silplain.tex, sihyphen.tex and def_umlaut.tex are not" +echo "in one of the TEXINPUTS directories, you will now run into trouble." +echo "(You will be prompted for their pathnames and have to type in" +echo "the whole stuff.)" + +mv tex.pool isitex.pool +TEXPOOL=. ./initex siplain.tex \\dump +if [ -f siplain.fmt ] +then + mv siplain.fmt isitex.fmt + echo "...isitex.fmt created" +else + echo "isiplain.fmt not created for unknown reasons." +fi +TEXPOOL=. ./initex silplain.tex \\dump +if [ -f silplain.fmt ] +then + mv silplain.fmt isilatex.fmt + echo "...isilatex.fmt created" +else + echo "isilplain.fmt not created for unknown reasons." +fi + +echo "*** The installation is now complete." +echo "*** You should find the following files in $TEXDIR:" +echo "***" +echo "*** isitex.fmt, isilatex.fmt, hf3," +echo "*** isitex.pool, virtex and initex." +echo "***" +echo "*** Now copy isitex.fmt and isilatex.fmt into a TEXFORMAT-Dir," +echo "*** virtex and initex into a directory holding executables" +echo "*** (preferably as isivirtex and isiinitex), hf3 into" +echo "*** a TEXINPUTDIR, and isitex.pool into the TEXPOOLDIR." +echo "*** Also create links isilatex and isitex to isivirtex, and" +echo "*** a link named isiplain.fmt to isitex.fmt, all in the" +echo "*** appropriate directories. If you have SiTeX 3.141 already" +echo "*** installed, you needn't install the new hf3 again, as they" +echo "*** are identical." + +exit 0 diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex.web.gz b/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex.web.gz Binary files differnew file mode 100644 index 0000000000..eb8fa3d2dd --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex.web.gz diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex3.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex3.ch new file mode 100644 index 0000000000..ecd0285f36 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/isitex3.ch @@ -0,0 +1,1431 @@ +@x +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)' +@y +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92}' +@z + + +@x +@!pool_name='TeXformats:SITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@y +@!pool_name='TeXformats:ISITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@z + + +@x +else bad_pool('! I can''t read SITEX3.POOL.') +@.I can't read TEX.POOL@> +@y +else bad_pool('! I can''t read ISITEX3.POOL.') +@.I can't read TEX.POOL@> +@z + + +@x +@!funktioniert: boolean; +@!zerleg: integer; +@y +@!funktioniert: boolean; +@!zerleg: integer; +@!alletr: trenn16; {iSi 920114} +@!auswahl, schnuller: char; +@!memkorr: boolean; {iSi 920914 doku.mem korrigieren ja/nein} +@!indexi: integer; +@!uebersprungen: boolean; {iSi 920921} +@!lex_ja, lex_ok: boolean; {iSi 920930 neue Eingabe `1E' statt `B'} +@z + + + +@x + abteilen(hc_si,hyf_si,hn,funktioniert,zerleg); + for j:=0 to 64 do begin + hyf_disc[j]:=null; hyfpen[j]:=inf_penalty; + end; +@y + if not hsstart then begin +{ wterm(' =iSi=> running hsinit'); wterm_cr; } + hsinit; + hsstart := true; +{ wterm(' =iSi=> finished hsinit'); wterm_cr } + end; + + if isidebug=1 then begin + wterm(' =iSi=> abteilen von '); wwort(hc_si, hn); + end; + + abteilen(hc_si,hyf_si, alletr {iSi 920114}, hn,funktioniert,zerleg); + + if not funktioniert then begin + if isidebug=1 then begin + wterm_cr; + wterm(' =iSi=> unbekanntes Wort: '); wwort(hc_si, hn); + wterm_cr; + wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr; + end; + if md_suchen(hc_si, hn, mdb, hyf_si) then begin + if isidebug=1 then begin + wterm(' =iSi=> gefunden in mdb: '); + writewt(hc_si, hn, hyf_si); + wterm_cr + end; + funktioniert := true + end else begin + if isidebug=1 then begin + wterm(' =iSi=> nicht gefunden in mdb: '); + wwort(hc_si, hn); wterm_cr; + end; + repeat + wterm_cr; wterm_cr; + wterm('"'); + wwort(hc_si, hn); + wterm('" ist ein unbekanntes Wort!'); + wterm_cr; + wterm(0:2); + wterm(': neues Wort, merken in "'); wjob; wterm('.lex"'); + wterm_cr; + wterm(1:2); + wterm(': neues Wort, Trennstellen angeben und merken in "'); wjob; + wterm('.lex"'); + wterm_cr; + wterm(9:2); + wterm(': Tippfehler! - merken im File "'); wjob; wterm('.edt"'); + wterm_cr; + wterm('Bitte waehlen Sie eine Bedeutung (0,1,9) aus:'); + wterm_cr; + read(term_in, schnuller); + auswahl := schnuller; + read_ln(term_in); + until ((xord[auswahl] >= 48) and (xord[auswahl] <= 49)) or + (auswahl = '9'); + if (auswahl = '0') then begin + { Da abteilen bei not funktioniert hyf_si unver"andert l"asst, } + { muss hier jetzt hyf_si ``gel"oscht'' werden. } + for indexi := 1 to hn do begin + hyf_si[indexi] := keine + end; + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, true, mdm); + funktioniert := true + end else if (auswahl = '9') then begin + mde_eintragen(hc_si, hn, mde) + end else begin + wterm('Bitte den Trennvektor angeben'); wterm_cr; + wterm(' ("-" Nebentrennstelle, "=" Haupttrennstelle, '); + wterm('"." Weiterruecken,'); wterm_cr; + wterm(' Trennstrich unter den Buchstaben angeben, hinter dem '); + wterm('getrennt werden soll):'); wterm_cr; + wwort(hc_si, hn); wterm_cr; + indexi := 1; uebersprungen := false; + read(term_in, auswahl); + while (xord[auswahl] <> 10) and (indexi <= hn) do begin + if (hc_si[indexi] >= 27) and + (hc_si[indexi] <= 30) and + not uebersprungen then begin + { Ist in hc_si[] ein Umlaut, so steht am Bildschirm "x. } + { Die Trennvektoreingabe unter dem " muss uebersprungen } + { werden. } + uebersprungen := true + end else begin + if auswahl = '.' then begin + hyf_si[indexi] := keine + end else if auswahl = '-' then begin + hyf_si[indexi] := neben + end else if auswahl = '=' then begin + hyf_si[indexi] := haupt + end else begin + hyf_si[indexi] := keine + end; + uebersprungen := false; + indexi := indexi+1 + end; + read(term_in, auswahl) + end; + while (indexi) <= hn do begin {Rest von hyf_si mit . auff"ullen} + hyf_si[indexi] := keine; + indexi := indexi+1 + end; + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, true, mdm); + funktioniert := true + end + end + end else begin + if isidebug=1 then begin + wterm(': '); writewt(hc_si, hn, hyf_si); wterm_cr + end + end; + + if zerleg >= 2 then begin + gleiche_weg(alletr, zerleg, hn); { eliminiert gleiche Trennvektoren } + if zerleg >= 2 then begin { jetzt sind es echte Alternativen } + if isidebug=1 then begin + wterm(' =iSi=> mehrdeutiges Wort: '); writewt(hc_si, hn, hyf_si); + wterm_cr; + wterm(' =iSi=> suchen in mdb: '); wwort(hc_si, hn); wterm_cr; + end; + if md_suchen(hc_si, hn, mdb, hyf_si) then begin + if isidebug=1 then begin + wterm(' =iSi=> gefunden in mdb: '); writewt(hc_si, hn, hyf_si); + wterm_cr + end + end else begin + if isidebug=1 then begin + wterm(' =iSi=> nicht gefunden in mdb: '); + wwort(hc_si, hn); wterm_cr + end; + if mehrdanz then begin + repeat + wterm_cr; wterm_cr; + wterm('`'); + wwort(hc_si, hn); + wterm(''' ist ein mehrdeutiges Wort!'); + wterm_cr; + wterm(0:2); { wterm('/A'); } + wterm(': nur die sicheren Trennstellen waehlen (also `'); + writewt(hc_si, hn, hyf_si); + wterm(''')'); + wterm_cr; + for indexi := 1 to zerleg do begin + wterm(indexi:2); { wterm('/'); wterm(xchr[65+indexi]); } + wterm(': `'); + writewt(hc_si, hn, alletr[indexi]); + wterm(''''); + wterm_cr + end; + wterm(9:2); + wterm(': Tippfehler! - merken im File `'); wjob; wterm('.edt'''); + wterm_cr; + wterm('Bitte waehlen Sie eine Bedeutung z.B. `0''+`Enter'' aus:'); + wterm_cr; + wterm(' (zusaetzlich `E'' z.B. `0E''+`Enter'': '); + wterm('Wort auch fuer LEXIKON vormerken)'); + wterm_cr; + read(term_in, schnuller); + auswahl := schnuller; + lex_ja := false; lex_ok := true; + if xord[schnuller] <> 32 then begin + read(term_in, schnuller); + if xord[schnuller] <> 10 then begin + if (schnuller = 'e') or (schnuller = 'E') then begin + lex_ja := true; { lex_ok := true } + end else begin + { lex_ja := false; } lex_ok := false + end; + read_ln(term_in); + end + end; + until (((xord[auswahl] >= 48) and (xord[auswahl] <= 48+zerleg)) or + (auswahl = '9')) and lex_ok; + if (auswahl = '0') or ((auswahl = '0') and lex_ja) then begin + if (auswahl = '0') and not lex_ja then begin + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, false, mdm) + end else begin { '0E' } + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, true, mdm) + end; + end else if (auswahl = '9') then begin + mde_eintragen(hc_si, hn, mde) + end else begin + for j := 0 to maxwl do + hyf_si[j] := alletr[xord[auswahl]-48][j]; + if not lex_ja then begin + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, false {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, false, mdm) + end else begin { lex_ja } + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); + writewt(hc_si, hn, hyf_si); wterm_cr + end; + mdb_eintragen(hc_si, hn, hyf_si, true {neu}, true {used}, mdb); + mdm_eintragen(hc_si, hn, hyf_si, true, mdm) + end {if not lex_ja ...} + end {if (auswahl = ...} + end {if mehrdanz} + end {if md_suchen ...} + end {if zerleg >= 2} + end; {if zerleg >= 2} + + for j:=0 to 64 do begin + hyf_disc[j]:=null; hyfpen[j]:=inf_penalty; + end; +@z + + +@x +@<Types in the outer block@>= + string80 = packed array [0..80] of eight_bits; + buchstabe = eight_bits; + a_word = array[0..maxwl] of 0..256; + wort = a_word; + sperrvektor=array [0..maxwl] of boolean; + dudt=array [0..maxwl] of boolean;{frueher kein type !!} + { trennung = (keine, neben, nebenck, haupt, haupt3); } + trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==> + zwischen Buchstabe i und i+1 wird getrennt } + ktabtype = packed array [0..255] of buchstabe; + verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C } + varr = array [0..maxwl] of verdschlue; + intarr = array [0..maxwl] of integer; + + { darf nicht als var Parameter uebergeben werden !!} + infotype = record + { frueher ein variantenRecord } + ausnahme:boolean; + untrennbar:boolean; + { erste :0..7; + zweite:0..7; } + erste :integer; + zweite:integer; + endung,vorsilbe,stamm,ehervor,stammallein:boolean; + end; + + infobyte = eight_bits; + + { darf nicht als var Parameter uebergeben werden !!} + tableentry=record + tabv:verdschlue; + tabb:infobyte; + frei:boolean; + wiederfrei:boolean; + end; + + hashelement = packed array [0..3] of eight_bits; + htabtype = packed array [0..tabsize] of hashelement; + +@y +@<Types in the outer block@>= + string80 = packed array [0..80] of eight_bits; + buchstabe = eight_bits; + a_word = array[0..maxwl] of 0..256; + wort = a_word; + sperrvektor=array [0..maxwl] of boolean; + dudt=array [0..maxwl] of boolean;{frueher kein type !!} + { trennung = (keine, neben, nebenck, haupt, haupt3); } + trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==> + zwischen Buchstabe i und i+1 wird getrennt } + ktabtype = packed array [0..255] of buchstabe; + verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C } + varr = array [0..maxwl] of verdschlue; + intarr = array [0..maxwl] of integer; + + { darf nicht als var Parameter uebergeben werden !!} + infotype = record + { frueher ein variantenRecord } + ausnahme:boolean; + untrennbar:boolean; + { erste :0..7; + zweite:0..7; } + erste :integer; + zweite:integer; + endung,vorsilbe,stamm,ehervor,stammallein:boolean; + end; + + infobyte = eight_bits; + + { darf nicht als var Parameter uebergeben werden !!} + tableentry=record + tabv:verdschlue; + tabb:infobyte; + frei:boolean; + wiederfrei:boolean; + end; + + hashelement = packed array [0..3] of eight_bits; + htabtype = packed array [0..tabsize] of hashelement; + + trenn16 = array [1..16] of trennvektor; {iSi 921005 trenn8 -> trenn16} + + {iSi 920103 begin} + mdb_knoten = ^mdb_k; + mdm_knoten = ^mdm_k; + mdl_knoten = ^mdl_k; + mde_knoten = ^mde_k; {HHHHH} + + mdb_k = record + w12: wort; + l1: integer; + tr1: trennvektor; + neu1: boolean; + del1: boolean; {gel"oscht ja/nein} + used1: boolean; {noch in Verwendung ja/nein} + li, re: mdb_knoten; + end; + {iSi 920103 end} + + {iSi 920110 begin} + + mdm_k = record + w12: wort; + l1: integer; + tr1: trennvektor; + neu1: boolean; + li, re: mdm_knoten; + end; + mdl_k = record + w12: wort; + l1: integer; + li, re: mdl_knoten; + end; + mde_k = record {HHHHH} + w12: wort; + l1: integer; + li, re: mde_knoten; + end; + + {iSi 920110 end} + +@z + + + +@x +@<Global variables@>= + ktab : ktabtype; + htab : htabtype; + anzahl : integer; + hashfile : alpha_file; + kombtab : array [1..5, 1..5] of integer; + konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]} +@y +@<Global variables@>= + ktab : ktabtype; + htab : htabtype; + anzahl : integer; + hashfile : alpha_file; + + hsmem, hslex, hsedt: alpha_file; {iSi 920111} + + kombtab : array [1..5, 1..5] of integer; + konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]} + + hsstart: boolean; {iSi 920114} {ist mdb schon initialisiert?} + isidebug: integer; {iSi 920917} + auswahl, schnuller: char; {iSi 920917} + mehrdanz: boolean; {iSi 920924} {mehrdeutige W"orter anzeigen?} + mdb: mdb_knoten; {iSi 920111} + mdm: mdm_knoten; {iSi 920111} + mdl: mdl_knoten; {iSi 920114} + mde: mde_knoten; {iSi 920114} + mdb_schnuller: mdb_k; {iSi HH; um web2c zu ueberlisten: sizeof(var) statt } + mdm_schnuller: mdm_k; {sizeof(typ) } + mdl_schnuller: mdl_k; + mde_schnuller: mde_k; + + hsii, hsij: integer; {iSi 920114} {HS_Index_i, HS_Index_j} +@z + + + +@x + { Konsonantentabelle initialisieren } + for bst:=bst_a to bst_sz do konsonant[bst] := true; + konsonant[bst_a] := false; + konsonant[bst_e] := false; + konsonant[bst_i] := false; + konsonant[bst_o] := false; + konsonant[bst_u] := false; + konsonant[bst_ae] := false; + konsonant[bst_oe] := false; + konsonant[bst_ue] := false; +@y + { Konsonantentabelle initialisieren } + for bst:=bst_a to bst_sz do konsonant[bst] := true; + konsonant[bst_a] := false; + konsonant[bst_e] := false; + konsonant[bst_i] := false; + konsonant[bst_o] := false; + konsonant[bst_u] := false; + konsonant[bst_ae] := false; + konsonant[bst_oe] := false; + konsonant[bst_ue] := false; + +{ wterm_cr; wterm_cr; + wterm_ln('===================='); + wterm_ln('This is iSiTeX, HS92'); + wterm_ln('===================='); + wterm_cr; + + wterm_ln(' =iSi=> init mdb, mdm, mdl, mde'); } + mdb := nil; + mdm := nil; + mdl := nil; + mde := nil; + + hsstart := false; + isidebug := 0; + +@z + + +@x + procedure trennen ( + { trennen } + zustand : integer; + anfang : integer; + spv : sperrvektor; + var ok1 : boolean; + { abteilen } + var tr :trennvektor; + var dudtr:trennvektor; + var zerlegungen:integer ; + var dud:dudt; { array [0..maxwl] of boolean; } + var v:varr; + var ind,k:intarr; + var dudstop:sperrvektor; + { abteilen aufruf } + var w:wort; + var tr1:trennvektor; + laenge : integer ); +@y + procedure trennen ( + { trennen } + zustand : integer; + anfang : integer; + spv : sperrvektor; + var ok1 : boolean; + { abteilen } + var alletr: trenn16; {iSi HH} + var tr :trennvektor; + var dudtr:trennvektor; + var zerlegungen:integer ; + var dud:dudt; { array [0..maxwl] of boolean; } + var v:varr; + var ind,k:intarr; + var dudstop:sperrvektor; + { abteilen aufruf } + var w:wort; + var tr1:trennvektor; + laenge : integer ); +@z + +@x + gef, nichtok:boolean; + schnitt:integer; + inform:infotype; + i:integer; + ok_stamm, ok_vor, ok_end, ok_help:boolean; + tri:integer; + { p_stamm } + i1,tre:integer; + ok : boolean; + stop_ptr :integer; + spvtmp :sperrvektor; { lokale Kopie des Sperrvektors, + fr die bersetzung nach C notwendig. + -PRAK!- } +@y + gef, nichtok:boolean; + schnitt:integer; + inform:infotype; + i:integer; + ok_stamm, ok_vor, ok_end, ok_help:boolean; + tri:integer; + { p_stamm } + i1,tre:integer; + ok : boolean; + stop_ptr :integer; + spvtmp :sperrvektor; { lokale Kopie des Sperrvektors, + fr die bersetzung nach C notwendig. + -PRAK!- } + trlast: trennvektor; {iSi 920114} +@z + +@x + for i := laenge downto 1 do + begin + if dudtr[i-1] = haupt3 then + begin + dudtr[i-1] := keine; + tri := haupt3; + end + else + tri := dudtr[i]; + + if zerlegungen = 0 then + tr1[i] := tri + else + tr1[i] := kombtab[tr1[i],tri]; + end; + zerlegungen:=zerlegungen+1; + ok1:= true +@y + for i := laenge downto 1 do begin + if dudtr[i-1] = haupt3 then begin + dudtr[i-1] := keine; + tri := haupt3; + end + else + tri := dudtr[i]; + if zerlegungen = 0 then + tr1[i] := tri + else + tr1[i] := kombtab[tr1[i],tri]; + + trlast[i] := tri; {iSi 920114} + + end; + zerlegungen:=zerlegungen+1; + + for i := 0 to maxwl do + alletr[zerlegungen][i] := trlast[i]; {iSi 920114} + + ok1:= true +@z + + +@x + + trennen (2, schnitt+2, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+2, spv, ok_help, alletr, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+1, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+1, spv, ok_help, alletr, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen(1, schnitt+1, spv, ok_vor, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen(1, schnitt+1, spv, ok_vor, alletr, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+2, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen(5, schnitt, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+1, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (4, schnitt+1, spv, ok_stamm, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+2, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen(5, schnitt, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + +@x + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen (2, schnitt+1, spv, ok_help, alletr, + tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + + +@x +procedure abteilen ( var w:wort; var tr1:trennvektor; + laenge : integer; var ok:boolean; + var zerlegungen:integer ); +@y + +procedure wchar(c: halfword); +begin + if c = 27 then begin + wterm('"a') + end else if c = 28 then begin + wterm('"o') + end else if c = 29 then begin + wterm('"u') + end else if c = 30 then begin + wterm('"s') + end else begin + wterm(xchr[c+96]) + end +end; + +procedure wwort(w: wort; + l: integer); + var i: integer; +begin + for i := 1 to l do begin + wchar(w[i]) + end +end; + +procedure writewt(w: wort; + l: integer; + tr: trennvektor); + var i: integer; +begin + wchar(w[1]); + for i := 2 to l-1 do begin + if (tr[i-1] = nebenck) {and (w[i] = bst_c)} then begin + wterm('k'); + wterm('-') + end else if (tr[i] = haupt3) then begin + wterm(xchr[w[i]+96]); + wterm('='); + wterm(xchr[w[i]+96]); + end else if (tr[i] = haupt) then begin + wchar(w[i]); + wterm('=') + end else if (tr[i] = neben) then begin + wchar(w[i]); + wterm('-') + end else begin + wchar(w[i]) + end + end; + wchar(w[l]) +end; + +procedure wjob; + var i:integer; +begin + for i := str_start[job_name] to str_start[job_name+1]-1 do begin + wterm(xchr[str_pool[i]]) + end +end; + +function vergl(wrt1: wort; + l1: integer; + wrt2: wort; + l2: integer): integer; + label 99; + var i: integer; +begin + i := 1; + while (i <= l1) and (i <= l2) do begin + if wrt1[i] < wrt2[i] then begin + vergl := -1; + goto 99 + end else if wrt1[i] > wrt2[i] then begin + vergl := 1; + goto 99 + end; + i := i+1 + end; + if l1 < l2 then begin + vergl := -1; + goto 99 + end else if l1 > l2 then begin + vergl := 1; + goto 99 + end else begin + vergl := 0; + goto 99 + end; + 99: +end; + +procedure gleiche_weg (var alletr: trenn16; + var zerleg: integer; + laenge: integer); + +{ eliminiert bei Mehrdeutigkeiten (zerleg >= 2 !!!) eventuell gleiche } +{ trennvektoren und korrigiert alletr & zerleg } + + var i, j, k, ii: integer; + gleich: boolean; + +begin + i := 1; + repeat + j := i+1; { zerleg >= 2 } + repeat + gleich := true; + k := 1; { laenge >= 1 } + repeat + if alletr[i][k] = alletr[j][k] then begin + k := k+1 + end else begin + gleich := false + end + until (k > laenge) or (gleich = false); + if gleich then begin + for k := j to zerleg-1 do begin + for ii := 0 to maxwl do + alletr[k][ii] := alletr[k+1][ii] + end; + zerleg := zerleg-1 + end else begin + j := j+1 + end + until j > zerleg; + i := i+1 + until i > zerleg-1 +end; + +procedure mdb_eintragen(w: wort; + l: integer; + tr: trennvektor; + neu: boolean; + used: boolean; + var mdb: mdb_knoten); + + var ii, test: integer; +begin +{ wterm(' =iSi=> mdb_eintragen von '); writewt(w, l, tr); wterm_cr; } + if mdb = nil then begin + { new(mdb); } + mdb := malloc(sizeof(mdb_schnuller)); + for ii := 0 to maxwl do + mdb^.w12[ii] := w[ii]; + mdb^.l1 := l; + for ii := 0 to maxwl do + mdb^.tr1[ii] := tr[ii]; + mdb^.neu1 := neu; + mdb^.used1 := used; + mdb^.del1 := false; + mdb^.li := nil; + mdb^.re := nil; + if isidebug=1 then begin + wterm_cr + end + end else begin + test := vergl(w, l, mdb^.w12, mdb^.l1); + if test = -1 then begin + if isidebug=1 then begin +{ wterm(' =iSi=> kleiner als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; } + wterm('/') + end; + mdb_eintragen(w, l, tr, neu, used, mdb^.li) + end else if test = 1 then begin + if isidebug=1 then begin +{ wterm(' =iSi=> gr"osser als '); wwort(mdb^.w12, mdb^.l1); wterm_cr; } + wterm('\') + end; + mdb_eintragen(w, l, tr, neu, used, mdb^.re) + end else begin + wterm(' =iSi=> mdb_eintragen vom gleichen Wort nocheinmal !!!'); + wterm_cr + end + end +end; + +{iSi 920102 end} +{iSi 920110 begin} + + procedure mdm_eintragen(w: wort; + l: integer; + tr: trennvektor; + neu: boolean; + var mdm: mdm_knoten); + var rechts: mdm_knoten; + ii: integer; + begin + if mdm = nil then begin + { new(mdm); } + mdm := malloc(sizeof(mdm_schnuller)); + for ii := 0 to maxwl do + mdm^.w12[ii] := w[ii]; + mdm^.l1 := l; + for ii := 0 to maxwl do + mdm^.tr1[ii] := tr[ii]; + mdm^.neu1 := neu; + mdm^.li := nil; + mdm^.re := nil + end else if mdm^.re = nil then begin + { new(mdm^.re); } + mdm^.re := malloc(sizeof(mdm_schnuller)); + for ii := 0 to maxwl do + mdm^.re^.w12[ii] := w[ii]; + mdm^.re^.l1 := l; + for ii := 0 to maxwl do + mdm^.re^.tr1[ii] := tr[ii]; + mdm^.re^.neu1 := neu; + mdm^.re^.li := nil; + mdm^.re^.re := nil; + mdm^.li := mdm^.re + end else begin + rechts := mdm^.re; + { new(mdm^.re); } + mdm^.re := malloc(sizeof(mdm_schnuller)); + for ii := 0 to maxwl do + mdm^.re^.w12[ii] := w[ii]; + mdm^.re^.l1 := l; + for ii := 0 to maxwl do + mdm^.re^.tr1[ii] := tr[ii]; + mdm^.re^.neu1 := neu; + mdm^.re^.li := nil; + mdm^.re^.re := nil; + rechts^.li := mdm^.re + end + end; + + procedure mdl_eintragen(w: wort; + l: integer; + var mdl: mdl_knoten); + var rechts: mdl_knoten; + ii: integer; + begin + if isidebug=1 then begin + wterm(' =iSi=> mdl_eintragen von '); wwort(w, l); wterm_cr; + end; + if mdl = nil then begin + { new(mdl); } + mdl := malloc(sizeof(mdl_schnuller)); + for ii := 0 to maxwl do + mdl^.w12[ii] := w[ii]; + mdl^.l1 := l; + mdl^.li := nil; + mdl^.re := nil + end else if mdl^.re = nil then begin + { new(mdl^.re); } + mdl^.re := malloc(sizeof(mdl_schnuller)); + for ii := 0 to maxwl do + mdl^.re^.w12[ii] := w[ii]; + mdl^.re^.l1 := l; + mdl^.re^.li := nil; + mdl^.re^.re := nil; + mdl^.li := mdl^.re + end else begin + rechts := mdl^.re; + { new(mdl^.re); } + mdl^.re := malloc(sizeof(mdl_schnuller)); + for ii := 0 to maxwl do + mdl^.re^.w12[ii] := w[ii]; + mdl^.re^.l1 := l; + mdl^.re^.li := nil; + mdl^.re^.re := nil; + rechts^.li := mdl^.re + end + end; + procedure mde_eintragen(w: wort; + l: integer; + var mde: mde_knoten); + var rechts: mde_knoten; + ii: integer; + begin + if isidebug=1 then begin + wterm(' =iSi=> mde_eintragen von '); wwort(w, l); wterm_cr; + end; + if mde = nil then begin + { new(mde); } + mde := malloc(sizeof(mde_schnuller)); + for ii := 0 to maxwl do + mde^.w12[ii] := w[ii]; + mde^.l1 := l; + mde^.li := nil; + mde^.re := nil + end else if mde^.re = nil then begin + { new(mde^.re); } + mde^.re := malloc(sizeof(mde_schnuller)); + for ii := 0 to maxwl do + mde^.re^.w12[ii] := w[ii]; + mde^.re^.l1 := l; + mde^.re^.li := nil; + mde^.re^.re := nil; + mde^.li := mde^.re + end else begin + rechts := mde^.re; + { new(mde^.re); } + mde^.re := malloc(sizeof(mde_schnuller)); + for ii := 0 to maxwl do + mde^.re^.w12[ii] := w[ii]; + mde^.re^.l1 := l; + mde^.re^.li := nil; + mde^.re^.re := nil; + rechts^.li := mde^.re + end + end; + +{iSi 920110 end} +{isi 920111 begin} + +function md_suchen (w: wort; + l: integer; + var mdb: mdb_knoten; + var tr: trennvektor): boolean; + var ii, test: integer; +begin + if mdb = nil then begin + md_suchen := false + end else begin + test := vergl(w, l, mdb^.w12, mdb^.l1); + if test = -1 then begin + md_suchen := md_suchen(w, l, mdb^.li, tr) + end else if test = 1 then begin + md_suchen := md_suchen(w, l, mdb^.re, tr) + end else begin + for ii := 0 to maxwl do + tr[ii] := mdb^.tr1[ii]; + mdb^.used1 := true; + md_suchen := true + end + end +end; + +function in_use (w: wort; + l: integer; + mdb: mdb_knoten): boolean; + var test: integer; +begin + if mdb = nil then begin + wterm(' =iSi=> in_use Fehler: '); wwort(w, l); + wterm(' nicht in mdb'); wterm_cr + end else begin + test := vergl(w, l, mdb^.w12, mdb^.l1); + if test = -1 then begin + in_use := in_use(w, l, mdb^.li) + end else if test = 1 then begin + in_use := in_use(w, l, mdb^.re) + end else begin + in_use := mdb^.used1; + if isidebug=1 then begin + if mdb^.used1 then begin + wterm(' =iSi=> '); wwort(w, l); wterm(' in use'); wterm_cr + end else begin + wterm(' =iSi=> '); wwort(w, l); wterm(' not in use'); wterm_cr + end + end + end + end +end; + +procedure hsinit; + var i, j, l: integer; + tr: trennvektor; + w: wort; + temp, auswahl, schnuller: char; + neu, memkorr: boolean; +begin + + wterm_cr; wterm_cr; + repeat + wterm_ln('iSi debug Info ? [J/N]'); + read(term_in, auswahl); + schnuller := auswahl; + read_ln(term_in); + until (xord[auswahl] = 74) or (xord[auswahl] = 78) or + (xord[auswahl] = 106) or (xord[auswahl] = 110); + wterm_cr; + if (xord[auswahl] = 74) or (xord[auswahl] = 106) then begin + isidebug := 1 + end else begin + isidebug := 0 + end; + + for i := 1 to file_name_size do begin + name_of_file[i] := ' ' + end; + j := str_start[job_name]; + i := 1; + while (j < str_start[job_name+1]) and + (i < file_name_size - 4) do begin + name_of_file[i] := xchr[str_pool[j]]; + j := j+1; + i := i+1 + end; + name_of_file[i] := '.'; + name_of_file[i+1] := 'm'; + name_of_file[i+2] := 'e'; + name_of_file[i+3] := 'm'; + + if not a_open_in(hsmem,TEX_INPUT_PATH) then begin + if isidebug=1 then begin + wterm(' =iSi=> cant a_open_in '); wjob; wterm('.mem'); + wterm_cr + end + end else begin + + repeat + wterm_cr; + wterm('Sollen Fehleintr"age gel"oscht werden? [J/N]'); wterm_cr; + read(term_in, auswahl); + schnuller := auswahl; + read_ln(term_in); + until (xord[auswahl] = 74) or (xord[auswahl] = 78) or + (xord[auswahl] = 106) or (xord[auswahl] = 110); + wterm_cr; wterm_cr; + if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin + memkorr := true + end else begin + memkorr := false + end; + + while not eof(hsmem) do begin + read(hsmem, l); + read_ln(hsmem); + for i := 1 to l do begin + read(hsmem, w[i]); + end; + read_ln(hsmem); + for i := 1 to l do begin + read(hsmem, tr[i]); + end; + read_ln(hsmem); + read(hsmem, temp); + read_ln(hsmem); + if temp = xchr[116] then neu := true else neu := false; {116 = t} + if isidebug=1 then begin + wterm(' =iSi=> reading from '); wjob; wterm('.mem: '); wwort(w, l); + wterm(', neu = '); wterm(temp); wterm_cr; + end; + + if memkorr then begin + repeat + wterm_cr; + wterm('Soll '); + writewt(w, l, tr); + wterm(' gel"oscht werden? [J/N]'); wterm_cr; + read(term_in, auswahl); + schnuller := auswahl; + read_ln(term_in); + until (xord[auswahl] = 74) or (xord[auswahl] = 78) or + (xord[auswahl] = 106) or (xord[auswahl] = 110); + wterm_cr; + if (xord[auswahl] = 74) or (xord [auswahl] = 106) then begin + { nichts tun, Wort wird nicht eingetragen } + end else begin + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr); + wterm_cr + end; + mdb_eintragen(w, l, tr, neu, false {used}, mdb); + mdm_eintragen(w, l, tr, neu, mdm); + end + end else begin + if isidebug=1 then begin + wterm(' =iSi=> mdb/mdm_eintragen: '); writewt(w, l, tr); + wterm_cr + end; + mdb_eintragen(w, l, tr, neu, false {used}, mdb); + mdm_eintragen(w, l, tr, neu, mdm) + end + end; + if isidebug=1 then begin + wterm_cr; +{ wterm(' =iSi=> closing '); wjob; wterm('.mem'); wterm_cr; } + end; + a_close(hsmem); + end; + + repeat + wterm_cr; + wterm_ln('Sollen mehrdeutige W"orter angezeigt werden? [J/N]'); + read(term_in, auswahl); + schnuller := auswahl; + read_ln(term_in); + until (xord[auswahl] = 74) or (xord[auswahl] = 78) or + (xord[auswahl] = 106) or (xord[auswahl] = 110); + wterm_cr; + if (xord[auswahl]=74) or (xord[auswahl]=106) then begin + mehrdanz := true + end else begin + mehrdanz := false + end + +end; + +{iSi 920111 end} + +procedure abteilen (var w:wort; var tr1:trennvektor; + var alletr: trenn16; {iSi 920114} + laenge : integer; var ok:boolean; + var zerlegungen:integer); +@z + + + +@x + var + i:integer; + dud:dudt; { array [0..maxwl] of boolean; } + v:varr; + ind,k:intarr; + spv,dudstop:sperrvektor; + tr, dudtr:trennvektor; +@y + var + i:integer; + iSi_j: integer; {iSi 920114} + dud:dudt; {array [0..maxwl] of boolean; } + v:varr; + ind,k:intarr; + tr, dudtr:trennvektor; + spv,dudstop:sperrvektor; +@z + + +@x + trennen(3, 1, spv, ok, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@y + trennen(3, 1, spv, ok, alletr, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); +@z + + +@x + for i:=0 to laenge do + if tr1[i]=nebenck then begin + tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- } + tr1[i-1]:=nebenck; {sprechend getrennt wird } + end; +@y + for i:=0 to laenge do + if tr1[i]=nebenck then begin + tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- } + tr1[i-1]:=nebenck; {sprechend getrennt wird } + + for iSi_j := 1 to zerlegungen do begin {iSi 920114 begin} + if (alletr[iSi_j][i] = nebenck) then begin + alletr[iSi_j][i] := keine; + alletr[iSi_j][i-1] := nebenck + end + end {iSi 920114 end} + + end; +@z + + + +@x +@ @<Finish the extensions@>= +for k:=0 to 15 do if write_open[k] then a_close(write_file[k]) +@y +@ @<Finish the extensions@>= +for k:=0 to 15 do if write_open[k] then a_close(write_file[k]); + +for hsii := 1 to file_name_size do begin + name_of_file[hsii] := ' ' +end; +hsij := str_start[job_name]; +hsii := 1; +while hsij < str_start[job_name+1] do begin + name_of_file[hsii] := xchr[str_pool[hsij]]; + hsij := hsij+1; + hsii := hsii+1 +end; +name_of_file[hsii] := '.'; +name_of_file[hsii+1] := 'm'; +name_of_file[hsii+2] := 'e'; +name_of_file[hsii+3] := 'm'; + +if not a_open_out(hsmem) then begin + wterm_ln(' =iSi=> cant a_open_out '); wjob; wterm('.mem '); + wterm_cr +end else begin +{ wterm(' =iSi=> a_open_out '); wjob; wterm('.mem '); wterm_cr; } + while mdm <> nil do begin + if in_use(mdm^.w12, mdm^.l1, mdb) then begin + if isidebug=1 then begin + wterm(' =iSi=> writing to '); wjob; wterm('.mem: '); + writewt(mdm^.w12, mdm^.l1, mdm^.tr1); wterm_cr; + end; + write_ln(hsmem, mdm^.l1); + for k := 1 to mdm^.l1 do begin + write(hsmem, mdm^.w12[k]); + end; + write_ln(hsmem); + for k := 1 to mdm^.l1 do begin + write(hsmem, mdm^.tr1[k]); + end; + write_ln(hsmem); + if mdm^.neu1 then begin + write(hsmem, xchr[116]); + write_ln(hsmem); + mdl_eintragen(mdm^.w12, mdm^.l1, mdl) + end else begin + write(hsmem, xchr[102]); + write_ln(hsmem) + end + end else begin + if isidebug=1 then begin + wterm(' =iSi=> '); wwort(mdm^.w12, mdm^.l1); + wterm(' not in use'); + wterm_cr + end + end; + mdm := mdm^.li + end; + a_close(hsmem); +{ wterm(' =iSi=> a_close '); wjob; wterm('.mem '); wterm_cr; } +end; + +for hsii := 1 to file_name_size do begin + name_of_file[hsii] := ' ' +end; +hsij := str_start[job_name]; +hsii := 1; +while hsij < str_start[job_name+1] do begin + name_of_file[hsii] := xchr[str_pool[hsij]]; + hsij := hsij+1; + hsii := hsii+1 +end; +name_of_file[hsii] := '.'; +name_of_file[hsii+1] := 'l'; +name_of_file[hsii+2] := 'e'; +name_of_file[hsii+3] := 'x'; + +if not a_open_out(hslex) then + wterm_ln(' =iSi=> cant open hslex') +else begin +{ wterm(' =iSi=> a_open_out '); wjob; wterm('.lex '); wterm_cr; } + while mdl <> nil do begin + if isidebug=1 then begin + wterm(' =iSi=> writing to '); wjob; wterm('.lex: '); + wwort(mdl^.w12, mdl^.l1); + wterm_cr + end; + write(hslex, xchr[mdl^.l1]); + for k := 1 to mdl^.l1 do begin + if mdl^.w12[k] <= 26 then begin + write(hslex, xchr[mdl^.w12[k]+96]) + end else begin + if mdl^.w12[k] = 27 then begin + write(hslex, '"a') + end else if mdl^.w12[k] = 28 then begin + write(hslex, '"o') + end else if mdl^.w12[k] = 29 then begin + write(hslex, '"u') + end else if mdl^.w12[k] = 30 then begin + write(hslex, '"s') + end else begin + write(hslex, '-') + end + end + end; + write_ln(hslex); + mdl := mdl^.li + end; + a_close(hslex); +{ wterm(' =iSi=> a_close '); wjob; wterm('.lex '); wterm_cr; } +end; + +for hsii := 1 to file_name_size do begin + name_of_file[hsii] := ' ' +end; +hsij := str_start[job_name]; +hsii := 1; +while hsij < str_start[job_name+1] do begin + name_of_file[hsii] := xchr[str_pool[hsij]]; + hsij := hsij+1; + hsii := hsii+1 +end; +name_of_file[hsii] := '.'; +name_of_file[hsii+1] := 'e'; +name_of_file[hsii+2] := 'd'; +name_of_file[hsii+3] := 't'; + +if not a_open_out(hsedt) then + wterm_ln(' =iSi=> cant open hsedt') +else begin +{ wterm(' =iSi=> a_open_out '); wjob; wterm('.edt '); wterm_cr; } + while mde <> nil do begin + if isidebug=1 then begin + wterm(' =iSi=> writing to '); wjob; wterm('.edt: '); + wwort(mde^.w12, mde^.l1); + wterm_cr + end; + for k := 1 to mde^.l1 do begin + if mde^.w12[k] <= 26 then begin + write(hsedt, xchr[mde^.w12[k]+96]) + end else begin + if mde^.w12[k] = 27 then begin + write(hsedt, '"a') + end else if mde^.w12[k] = 28 then begin + write(hsedt, '"o') + end else if mde^.w12[k] = 29 then begin + write(hsedt, '"u') + end else if mde^.w12[k] = 30 then begin + write(hsedt, '"s') + end else begin + write(hsedt, '--') + end + end + end; + write_ln(hsedt); + mde := mde^.li + end; + a_close(hsedt); +{ wterm(' =iSi=> a_close '); wjob; wterm('.edt '); wterm_cr; } +end; +@z + diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/sitex3.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/sitex3.ch new file mode 100644 index 0000000000..3c9a647f72 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/sitex3.ch @@ -0,0 +1,2834 @@ +========================================================================= + +SI_TEX.CHA Change file for SISISI-hyphenation in TeX 3.1 16.7.1991 + (c) for SISISI-hyphenation: Wilhelm Barth, Heinrich Nirschl + (c) for TeX changes: Heini Hofstaedter, Harald Mueller + (c) UNIX Version: F. Zwerina, H.-J. Szoldatics, Heinz Herbeck + + additional changes until 10. October 1991 HH + additional changes for TeX3.141 July 1993 Heinz Herbeck +========================================================================= + +This is the change file for inclusion of SISISI into TeX V.3.14. + +There are three main changes in this file (which are of course quite +intermingled): + + 1) the replacement of Liang's hyphenation by SISISI. + + 2) the change of the interface of the actual hyphenation + to the post-hyphenation and the line-break algorithm. + + This change is necessary because in original TeX, only the + information "hyphen - no hyphen" can be transmitted to the + line break algorithm because of two "bottlenecks": + + 1. Hyphenation --> Post-Hyphenation: Here a hyphen at position i + is marked by the 1-bit information odd(hyf[i]). + 2. Post-Hyphenation --> Line-Breaking: Here a hyphen is marked + by the existence of a discretionary node. + + From SISISI, there must be more information flowing to the + line-break algorithm: + + a. Is a hyphen a main hyphen or a "nebenhyphen"? To this end, + a change is made such that a penalty node is allowed as + the first node in the prebreak list of a discretionary + node. This penalty node contains the penalty associated with + this specific hyphen. For "nebenhyphens", this value is set + by an additional primitive "\nebenhyphenpenalty". + Instead of the hyf-array, an array hyfpen is used that + contains the actual penalties; the old "if odd(hyf[i])" now + is converted ti "if hyfpen[i] <> inf_penalty". + + b. A hyphen may be more complicated than a single -: ck-hyphens + and triple-consonant-hyphens may be present. To include these, + another array hyf_disc is introduced that contains ready-made + discretionary nodes for such hyphens. + + At first, we simply wanted to include these discretionary + during the post-hyphenation into the new node list. But then + Heini felt that the impossiblity of ligatures with parts of such + a discretionary node was not acceptable; therefore he introdiced + the "x-mechanism" (characterized by many variables starting with + "x") and changed the reconstitute function so that more than the + single hyphen_char could be introduced into the reconstitution + process. + + 3) "Dirty" changes for the hyphenation of words with umlauts. + These changes are necessary because the umlauts in TeX are not + (necessarily) real characters, but something else (see definition + of umlauts in plain.tex or german.tex). + Ordinarily, the hyphenation only accepts sequences of letters, + ligatures (which are expanded to their single characters), and + so-called "implicit kerns". An umlaut, however, is usually + represented as a letter character and another character consisting + of two dots ("dieresis character"), which are connected by + explicit kerns (not implicite ones!). Therefore, words containing + umlauts are not hyphenable words in TeX, which is not acceptable + for german texts. + + Therefore, we devised a "bypass" for umlauts as follows: An umlaut + is now represented as a special discretionary node (so-called + "dirty umlaut") as follows: + \discretionary{\kern4321sp m\kern<code>sp\kern<back>sp\kern-1em}% + {}% + {<umlaut>} + where the 4321sp is a "marker" for the "dirty umlaut", the "m" + letter is used to derive the font of the umlaut, <code> is + the font number that should be associated with this umlaut (the + font numbers of the umlauts are given below); and <back> is used + to cancel the preceding kerns, i.e.\ <back> = - (4321 + <code>). + + In other words, the prebreak list contains the information that + this is an umlaut (albeit a "dirty" one) and some more + information needed for the hyphenation, the postbreak list is + empty, and the main list contains the umlaut proper. By a + special if-statement in the line-break algorithm, a hyphenation + at a discretionary node of this format is suppressed, so that + always the umlaut of the main list is printed. + The font numbers for the lowercase umlauts (which are given + in the second \kern node) must be: + ae 228 + oe 246 + ue 252 + The codes for the uppercase umlauts can be chosen arbitrarily. + + In order to get the hyphenation for these "dirty umlauts" + running, one must include lccode assignments of the form + \lccode<code>=<lccode> + for each of the new letters (see example below). + + A typical declaration of the "dirty umlauts" runs like this: + +%%%%%%%%%%%%%%%%%%%%% declaration of dirty umlauts %%%%%%%%%%%%%%%%%%%%%% +\def\A"{\discretionary{\kern 4321sp m\kern 196sp\kern-4517sp\kern-1em}{}{\"A}} +\def\a"{\discretionary{\kern 4321sp m\kern 228sp\kern-4549sp\kern-1em}{}{\"a}} +\def\O"{\discretionary{\kern 4321sp m\kern 214sp\kern-4535sp\kern-1em}{}{\"O}} +\def\o"{\discretionary{\kern 4321sp m\kern 246sp\kern-4567sp\kern-1em}{}{\"o}} +\def\U"{\discretionary{\kern 4321sp m\kern 220sp\kern-4541sp\kern-1em}{}{\"U}} +\def\u"{\discretionary{\kern 4321sp m\kern 252sp\kern-4573sp\kern-1em}{}{\"u}} +\lccode196=228 % uppercase umlaut A +\lccode214=246 % uppercase umlaut O +\lccode220=252 % uppercase umlaut U +\lccode228=228 % uppercase umlaut a +\lccode246=246 % uppercase umlaut o +\lccode252=252 % uppercase umlaut u +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +When (if?) one day N.Schwarz's DC/EC fonts arrive, the changes of the +third kind can be eliminated. How long this will take ... well, wait and +see. +But when they arrive, it's not longer possible to choose the codes for +uppercase umlauts arbitrarily. The codes for uppercase umlauts will +then be those, shown in the example above. + +========================================================================= + +At first, we add a control sequence \SISISI. +@x +\def\PASCAL{Pascal} +@y +\def\SISISI{{\sl SISISI}} +\def\PASCAL{Pascal} + +\let\maybe=\iffalse % print only changed modules +@z + +------------------------------------------------------------------------- + +@x +@d banner=='This is TeX, Version 3.141' {printed when \TeX\ starts} +@y +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0)' +@z + +------------------------------------------------------------------------- + +A number of procedures of SISISI are declared after the TeX program. As +these procedures are used in the hyphenation, of course, they must be +declared as `forward'. + In web2c gibt es keine forward's !!!! +%@x +%procedure initialize; {this procedure gets things started properly} +%@y +%@<forward declarations@> +%procedure initialize; {this procedure gets things started properly} +%@z + +------------------------------------------------------------------------- +%@x +%@d pool_name_length=8 +%@y +%@d pool_name_length=11 +% {number of characters of ``pool_f_name''} +%@z +%see the following change of the pool file name "pool_f_name" +------------------------------------------------------------------------- + +@x +@!pool_name='TeXformats:TEX.POOL '; +@y +@!pool_name='TeXformats:SITEX3.POOL '; +@z + +------------------------------------------------------------------------- + +@x +else bad_pool('! I can''t read TEX.POOL.') +@.I can't read TEX.POOL@> +@y +else bad_pool('! I can''t read SITEX3.POOL.') +@.I can't read TEX.POOL@> +@z +========================================================================= + +To have all messages, coming from SI_TEX, displayed on screen +and written to the log-file simultanously, we make the following, +additional definitions. + temp nicht mehr vorhanden, in log ve„ndert. +@x +@d wlog_ln(#)==write_ln(log_file,#) +@d wlog_cr==write_ln(log_file) +@y +@d wlog_ln(#)==write_ln(log_file,#) +@d wlog_cr==write_ln(log_file) + +@d si_put(#) == @+ begin + if (file_offset<>0)or(term_offset<>0) then print_ln; + if selector<>log_only then wterm(#); + if (selector=log_only)or(selector=term_and_log) then + wlog(#); + end +@d si_put_ln(#) == @+ begin + if (file_offset<>0)or(term_offset<>0) then print_ln; + if selector<>log_only then wterm_ln(#); + if (selector=log_only)or(selector=term_and_log) then + wlog_ln(#); + end +@d si_put_cr == print_ln + + +@d dbg_put(#) == {} +@d dbg_put_ln(#) == {} +@d dbg_put_cr == {} +@z +========================================================================= + +We add a new primitive \nebenhyphenpenalty for setting the penalty of a +minor hyphen: + +@x +@d int_pars=55 {total number of integer parameters} +@d count_base=int_base+int_pars {256 user \.{\\count} registers} +@y +@d neben_hyphen_penalty_code=55 {penalty for break after neben-hyphen} +@d si_debug_code=56 {value is treated as an set of active debugging sections} +@d supress_debug_mark_code=57 {same as above; if a section number is set, then + the output of the section number and the debugging output banner + of this section is supressed} +@d int_pars=58 {total number of integer parameters} +@d count_base=int_base+int_pars {256 user \.{\\count} registers} +@z +------------------------------------------------------------------------- +@x +@<Assign the values |depth_threshold:=show_box_depth|...@>= +@y +@d neben_hyphen_penalty==int_par(neben_hyphen_penalty_code) +@d si_debug(#) == if odd(int_par(si_debug_code) div #) then begin + if not odd(int_par(supress_debug_mark_code)div #) then + begin + si_put_cr; + si_put_ln(' <* debugging output section #',#:#,' *>'); + end; {marking supression} + { dig_count entfernt !!! } +@d gubed_si == end +@f si_debug == begin +@f gubed_si == end +@f gubed == nil + + +@<Assign the values |depth_threshold:=show_box_depth|...@>= +@z +------------------------------------------------------------------------- +@x +othercases print("[unknown integer parameter!]") +@y +neben_hyphen_penalty_code:print_esc("nebenhyphenpenalty"); +si_debug_code:print_esc("sidebug"); +supress_debug_mark_code:print_esc("supressdebugmark"); +othercases print("[unknown integer parameter!]") +@z +------------------------------------------------------------------------- +@x +@ @<Cases of |print_cmd_chr|...@>= +@y +primitive("nebenhyphenpenalty",assign_int,int_base+neben_hyphen_penalty_code);@/ +@!@:neben_hyphen_penalty_}{\.{\\nebenhyphenpenalty} primitive@> +primitive("sidebug",assign_int,int_base+si_debug_code); +primitive("supressdebugmark",assign_int,int_base+supress_debug_mark_code); +@ @<Cases of |print_cmd_chr|...@>= +@z + +========================================================================= + +As now hyphens may have different penalties, we must somehow associate +a penalty with a discretionary node. We do this by allowing a penalty +node as the first node in the prebreak list of a discretionary node. + +The following changes are in two case statements that check the nodes +in the sublists of a discretionary node; we add an empty case for +penalty nodes (two more case statements follow a little bit later). + +@x + othercases confusion("disc1") +@y + penalty_node: ; + othercases confusion("disc1") +@z +------------------------------------------------------------------------- +@x + othercases confusion("disc2") +@y + penalty_node: ; + othercases confusion("disc2") +@z + +========================================================================= + +MAIN CHANGE 2) + +The following change is in the line-break section, where try_break is +given the penalty stored in the penalty node. This change is the reason +for all other changes concerning penalties. Moreover, in this change +a line break is suppressed if the discretionary node is actually +a "dirty umlaut" (via "if not is_dirty_umlaut(cur_p) then ... try_break"). + +@x +begin s:=pre_break(cur_p); disc_width:=0; +if s=null then try_break(ex_hyphen_penalty,hyphenated) +else begin repeat @<Add the width of node |s| to |disc_width|@>; + s:=link(s); + until s=null; + act_width:=act_width+disc_width; + try_break(hyphen_penalty,hyphenated); + act_width:=act_width-disc_width; + end; +r:=replace_count(cur_p); s:=link(cur_p); +while r>0 do + begin @<Add the width of node |s| to |act_width|@>; + decr(r); s:=link(s); + end; +prev_p:=cur_p; cur_p:=s; goto done5; +end + +@y +begin + s:=pre_break(cur_p); disc_width:=0; + if s=null then try_break(ex_hyphen_penalty,hyphenated) + else if (type(s)=penalty_node) and (link(s)=null) then begin + flush_node_list(s); s := null; + try_break(ex_hyphen_penalty,hyphenated); end + else if not is_dirty_umlaut(cur_p) then begin + if type(s)=penalty_node then s:=link(s); + repeat @<Add the width of node |s| to |disc_width|@>; + s:=link(s); + until s=null; + act_width:=act_width+disc_width; + if type(pre_break(cur_p))=penalty_node then begin + try_break(penalty(pre_break(cur_p)),hyphenated) end + else begin try_break(hyphen_penalty,hyphenated); end; + act_width:=act_width-disc_width; + end; + r:=replace_count(cur_p); s:=link(cur_p); + while r>0 do begin + @<Add the width of node |s| to |act_width|@>; + decr(r); s:=link(s); + end; + prev_p:=cur_p; cur_p:=s; goto done5; +end + +@z + +========================================================================= + +Two more case statements. + +@x + othercases confusion("disc3") +@y + penalty_node: ; + othercases confusion("disc3") +@z + +------------------------------------------------------------------------- + +@x + othercases confusion("disc4") +@y + penalty_node: ; + othercases confusion("disc4") +@z + +========================================================================= + +There's a little problem, converting a device independent (``.dvi'') +to a post script file (``.ps''). I think that this program part could +cause this problem. so let's see... + +!a <-- = --> @x With this, i want to try to reproduce this error. + Because, after i had inserted this change, that error didn`t occur + again! +@<Modify the end of the line...@>= +q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false; +if q<>null then {|q| cannot be a |char_node|} + if type(q)=glue_node then + begin delete_glue_ref(glue_ptr(q)); + glue_ptr(q):=right_skip; + subtype(q):=right_skip_code+1; add_glue_ref(right_skip); + goto done; + end + else begin if type(q)=disc_node then + @<Change discretionary to compulsory and set + |disc_break:=true|@> + else if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0; + end +else begin q:=temp_head; + while link(q)<>null do q:=link(q); + end; +@<Put the \(r)\.{\\rightskip} glue after node |q|@>; +done: +!a <-- = --> @y +@<Modify the end of the line...@>= +q:=cur_break(cur_p); disc_break:=false; post_disc_break:=false; +if q<>null then {|q| cannot be a |char_node|} + if type(q)=glue_node then + begin delete_glue_ref(glue_ptr(q)); + glue_ptr(q):=right_skip; + subtype(q):=right_skip_code+1; add_glue_ref(right_skip); + goto done; + end + else begin + if type(q)=disc_node then begin + hyfdeb_b:=false; + if is_dirty_umlaut(q) then begin + si_debug(64) hyfdeb_b:=true; gubed_si; + si_put_cr; + si_put_ln(' ??? There's a line break at a dirty umlaut!?'); + end; + if not hyfdeb_b then begin + @<Change discretionary to compulsory and set |disc_break:=true|@> + end; + end else + if (type(q)=math_node)or(type(q)=kern_node) then width(q):=0; + end else begin + q:=temp_head; + while link(q)<>null do q:=link(q); + end; +@<Put the \(r)\.{\\rightskip} glue after node |q|@>; +done: +!a <-- = --> @z + + +========================================================================= + +If the break actually occurs, the penalty node is made a separate list +with only one node, which is immediately flushed. + +@x +begin s:=pre_break(q); link(q):=s; +while link(s)<>null do s:=link(s); +pre_break(q):=null; q:=s; +end +@y +begin + s:=pre_break(q); + if type(s)=penalty_node then begin + s:=link(s); + link(pre_break(q)):= null; + flush_node_list(pre_break(q)); + end; + link(q):=s; + while link(s)<>null do s:=link(s); + pre_break(q):=null; q:=s; +end +@z + +========================================================================= + +The type `array[0..65] of 0..256' is needed more often, so we make it +an explicit type (see big SISISI change at end of change file). hc is +now declared of this type. + +@x +@!hc:array[0..65] of 0..256; {word to be hyphenated} +@!hn:small_number; {the number of positions occupied in |hc|} +@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} +@y +@!hc:a_word; {word to be hyphenated} +@!hn:small_number; {the number of positions occupied in |hc|} +@!ha,@!hb:pointer; {nodes |ha..hb| should be replaced by the hyphenated result} +{ some variables for debugging output } +@!hyfdeb_i,hyfdeb_j: integer; +@!hyfdeb_b:boolean; +@!si_p, si_q, si_r, si_s: pointer; +@z + +------------------------------------------------------------------------- + +Our hyphenation routines need even more "more local variables". + +@x +@ Hyphenation routines need a few more local variables. +@y +@!dirty_umlaut:array [-1..64] of pointer; {the [-1] field is used, if a + whatsit node occurs inbetween a word. This can happen due to + Partl's changes in ``german.sty'' } + +@ Hyphenation routines need a few more local variables. +@z + +------------------------------------------------------------------------- + +@x +@!j:small_number; {an index into |hc| or |hu|} +@y +@!qq:pointer; +@!j:small_number; {two indices into |hc| or |hu|} +@!jj:integer; +@z + +========================================================================= + +The dirty_umlaut array must be initialized for each word. +And we enable watching the node list, representing the word +to be hyphenated. + +@x +if s<>null then + begin @<Skip to node |ha|, or |goto done1| if no hyphenation +@y +si_p:=cur_p; si_q:=null; +for jj:=-1 to 64 do dirty_umlaut[jj] := null; +if s<>null then begin + si_debug(1) +{ hyfdeb_i:=depth_threshold; depth_threshold:=100; + hyfdeb_j:=breadth_max; breadth_max:=100; +} + show_node_list(si_p); +{ depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; } + gubed_si; + @<Skip to node |ha|, or |goto done1| if no hyphenation +@z + +------------------------------------------------------------------------- + +@x + hyphenate; + end; +done1: end +@y + hyphenate; + end; +done1: +si_debug(32) + hyfdeb_i := depth_threshold; hyfdeb_j := breadth_max; + if si_q<>null then begin + depth_threshold:=100; {show all levels of a list} + breadth_max:=200; {show all nodes of one level of a list} + si_r:=link(si_q); link(si_q):=null; + end else begin + (* take the values, set by the user, for this variables! *) + breadth_max:=show_box_breadth; depth_threshold:=show_box_depth; + end; + show_node_list(si_p); + si_put_cr; + if si_q <> null then link( si_q ) := si_r; + + depth_threshold:=hyfdeb_i; breadth_max:=hyfdeb_j; +gubed_si; +end +@z + +========================================================================= + +MAIN CHANGE 1) + +Here, we add the SISISI-procedure abteilen for use in hyphenate and +another label done1. + +@x +procedure hyphenate; +label common_ending,done,found,found1,found2,not_found,exit; +var @<Local variables for hyphenation@>@; +@y + +@<Handling of dirty umlauts@> + +procedure hyphenate; +label common_ending,done,done1,found,found1,found2,not_found,exit; +var @<Local variables for hyphenation@>@; +@z + +========================================================================= + +MAIN CHANGE 3) + +The prehyphenation loop must now also skip over the "dirty umlauts". + +@x +loop@+ begin if is_char_node(s) then + begin c:=qo(character(s)); hf:=font(s); + end + else if type(s)=ligature_node then + if lig_ptr(s)=null then goto continue + else begin q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q); + end + else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue + else if type(s)=whatsit_node then + begin @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + goto continue; + end + else goto done1; + if lc_code(c)<>0 then + if (lc_code(c)=c)or(uc_hyph>0) then goto done2 +@y +loop@+ begin + if is_char_node(s) then begin + c:=qo(character(s)); hf:=font(s); + end else if type(s)=ligature_node then begin + if lig_ptr(s)=null then goto continue + else begin + q:=lig_ptr(s); c:=qo(character(q)); hf:=font(q); + end + end else if is_dirty_umlaut(s) then begin + c:=get_char_of(s); hf:=get_font_of(s); + end else if (type(s)=kern_node)and(subtype(s)=normal) then goto continue + else if type(s)=whatsit_node then begin + @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + goto continue; + end else goto done1; + + if lc_code(c)<>0 then + if (lc_code(c)=c)or(uc_hyph>0) then goto done2 +@z + +========================================================================= + +MAIN CHANGE 2) + +The interface variables for the hyphenation are extended: hyfpen[i] +holds the actual penalty of a hyphen at position i, hyf_disc[i] +contains a "special discretionary" for triple-consonant-hyphens and +ck-hyphens. hc_si is the word as given to the SISISI algorithm; +hyf_si is returned from SISISI and contains markers for the hyphens. + +After this change, there are many changes where `odd(hyf[i])' is +simply replaced by `hyfpen[i]<>inf_penalty'. + +Another procedure to be changed is `reconstitute': It now has to handle +special dicretionary nodes. For a detailed feeling about the code changes +in reconstitute, either (1) look through it bit by bit, or (2) ask Heini +Hofstaedter. + +@x + end + else if type(s)=ligature_node then + @<Move the characters of a ligature node to |hu| and |hc|; + but |goto done3| if they are not all letters@> +@y + end else if is_dirty_umlaut(s) then begin + if get_font_of(s)<>hf then goto done3; + c:=get_char_of(s); + if lc_code(c)=0 then goto done3; + if hn=63 then goto done3; + hb:=s; incr(hn); hu[hn]:=c; hc[hn]:=lc_code(c); + dirty_umlaut[hn]:=s; + for jj:=1 to replace_count(s) do s:=link(s); + end else if type(s)=whatsit_node then begin + @<Advance \(p)past a whatsit node in the \(p)pre-hyphenation loop@>; + dirty_umlaut[-1]:=s; + end else if type(s)=ligature_node then + @<Move the characters of a ligature node to |hu| and |hc|; + but |goto done3| if they are not all letters@> +@z + +========================================================================= + +MAIN CHANGE 3) + +Also in the conversion loop (where the node list is shuffled into the +hc array), we must skip a "dirty umlaut". + +@x +loop@+ begin if not(is_char_node(s)) then + case type(s) of + ligature_node: do_nothing; +@y +loop@+ begin +if not(is_char_node(s)) then + if is_dirty_umlaut(s) then begin + for jj:=1 to replace_count(s)-1 do s:=link(s); + end else + case type(s) of + ligature_node: do_nothing; +@z + +========================================================================= + +Well, there are a lot of new variables that are necessary for the new +hyphenation. Most of them are necessary for Heini's change in the +reconstitute function, where now discretionary nodes for hyphens with +more than one character (e.g. the german ck-hyphens or +three-consonant-hyphens) can be inserted. + +@x +@ @<Local variables for hyphenation@>= +@!i,@!j,@!l:0..65; {indices into |hc| or |hu|} +@!q,@!r,@!s:pointer; {temporary registers for list manipulation} +@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|} +@y +@!hyfpen:array [0..64] of integer; {penalties for possible discretionary + hyphens} +@!hyf_si:trennvektor; +@!hc_si:wort; +@!hyf_disc:array [0..64] of pointer; + +@ @<Local variables for hyphenation@>= +@!i,@!j,@!l,@!kk:0..65; {indices into |hc| or |hu|} +@!q,@!r,@!s,@!qq,@!qr,@!hold_r:pointer; {temporary registers for list manipulation} +@!bchar:halfword; {right boundary character of hyphenated word, or |non_char|} + +@!xchg_char:array [0..10] of 0..256; {type of |hu| and |hc|} +@!add_char, {additional characters when hyphenating e.g.\ + Schiffahrt $\rightarrow$ Schif{\sl f}-fahrt: here + |add_char| = 1} +@!xchg_i,xchg_k,xchg_hu: 0..65; {type like |i|, |j| and |l| } +@!spec_hyf: pointer; {special hyphen; causes different spelling of the + word, when it is hyphenated at this point} +@!si_j:integer; +@z + +========================================================================= + +An odd->inf_penalty change. + +@x +for j:=l_hyf to hn-r_hyf do if odd(hyf[j]) then goto found1; +@y +for j:=l_hyf to hn-r_hyf do if hyfpen[j]<>inf_penalty then goto found1; +@z + +========================================================================= + +The new variable hold_r is initialized (the kern node is a dummy node, +as far as I can see). + +@x +if is_char_node(ha) then + if font(ha)<>hf then goto found2 +@y +hold_r := new_kern(1235); link(hold_r):=r; +if is_char_node(ha) then + if font(ha)<>hf then goto found2 +@z + +========================================================================= + +Initialize some variables if the list starts with a "dirty umlaut". + +@x +else if type(ha)=ligature_node then + if font(lig_char(ha))<>hf then goto found2 + else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1); +@y +else if is_dirty_umlaut(ha) then begin + if get_font_of(ha) <> hf then goto found2 + else begin init_list:=ha; init_lig := false; hu[0]:=get_char_of(ha); + end +end else if type(ha)=ligature_node then + if font(lig_char(ha))<>hf then goto found2 + else begin init_list:=lig_ptr(ha); init_lig:=true; init_lft:=(subtype(ha)>1); +@z + +========================================================================= + +MAIN CHANGE 3) + +unhinge all "dirty umlauts". + +@x +common_ending: flush_node_list(r); +@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>; +flush_list(init_list) +@y +common_ending: +qq:=hold_r; +for kk:={1}j to hn do if dirty_umlaut[kk] <> null then begin + while link(qq) <> dirty_umlaut[kk] do qq := link(qq); + qr := link(qq); + for i:=1 to replace_count(qr) do + if qr<>null then qr:=link(qr) + else begin {test:} + si_put_ln('...??..X --> ????? !'); + end; {:test} + if qr<>null then begin + link(qq):=link(qr); link(qr):=null; + end else link(qq):=null; +end; +if dirty_umlaut[-1]<>null then begin + qq:=hold_r; + while (link(qq)<>dirty_umlaut[-1])and(link(qq)<>null) do qq:=link(qq); + if link(qq)=dirty_umlaut[-1] then begin + link(qq):=link(dirty_umlaut[-1]); + link(dirty_umlaut[-1]):=null; + end else begin + si_put(' *** ERROR: node list is damaged! '); + si_put_ln('(post hyphenation - unhinge a whatsit node)'); + end; +end; +{} +r:=hold_r; +while link(r)<>null do begin + if (mem_min<=link(r))and(link(r)<=mem_max) then r:=link(r) + else begin + wlog_cr; wterm_cr; + wlog_ln('???$ - ERROR in node list!'); + wterm_ln('???$ - ERROR in node list!'); + kk:=depth_threshold; l:=breadth_max; + depth_threshold:=100; breadth_max:=100; + show_node_list(hold_r); + link(r):=null; + depth_threshold:=kk; breadth_max:=l; + end; +end; +{} +flush_node_list(hold_r); +@<Reconstitute nodes for the hyphenated word, inserting discretionary hyphens@>; +flush_list(init_list) +@z + +------------------------------------------------------------------------ + +Another odd->inf_penalty change (this time only textual). + +@x +If there exists an index |k| in the range $j\le k\le m$ such that |hyf[k]| +is odd and such that the result of |reconstitute| would have been different +if $x_{k+1}$ had been |hchar|, then |reconstitute| sets |hyphen_passed| +to the smallest such~|k|. Otherwise it sets |hyphen_passed| to zero. +@y +If there exists an index |k| in the range $j\le k\le m$ such that +|hyfpen[k]<>inf_penalty| and such that the result of |reconstitute| +would have been different if $x_{k+1}$ had been |hchar|, then |reconstitute| +sets |hyphen_passed| to the smallest such~|k|. Otherwise it sets +|hyphen_passed| to zero. +@z + +------------------------------------------------------------------------- + +In the reconstitute function, we set the boundary value n immediately +before the next "dirty umlaut" by a simple for-loop starting at the +original n. + +@x +begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null; +@y +@!ii:small_number; +begin hyphen_passed:=0; t:=hold_head; w:=0; link(hold_head):=null; +for ii:=n downto j do + if dirty_umlaut[ii] <> null then n:=ii-1; +@z + +------------------------------------------------------------------------- + +Another odd->inf_penalty change. + +@x + if odd(hyf[j]) then cur_rh:=hchar@+else cur_rh:=non_char; +@y + if hyfpen[j]<>inf_penalty then cur_rh:=hchar@+else cur_rh:=non_char; +@z + +========================================================================= + +A first change in the reconstitute function. + +@x + else begin if hchar<non_char then if odd(hyf[j]) then + begin hyphen_passed:=j; hchar:=non_char; + end; + if op_byte(q)<kern_flag then + @<Carry out a ligature replacement, updating the cursor structure +@y + else begin if hchar<non_char then if hyfpen[j]<>inf_penalty then + begin hyphen_passed:=j; hchar:=non_char; + end; + if op_byte(q)<kern_flag then + @<Carry out a ligature replacement, updating the cursor structure +@z + + +------------------------------------------------------------------------- + +Now we are in the post-hyphenation's main loop; here must append a +"dirty umlaut" to the growing node list. This is simply done by an +if-statement that checks for the presence of a "dirty umlaut" and +appends it. + +Moreover, we have another textual odd->inf_penalty change. + +@x +repeat l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1; +if hyphen_passed=0 then + begin link(s):=link(hold_head); + while link(s)>null do s:=link(s); + if odd(hyf[j-1]) then + begin l:=j; hyphen_passed:=j-1; link(hold_head):=null; + end; + end; +if hyphen_passed>0 then + @<Create and append a discretionary node as an alternative to the + unhyphenated word, and continue to develop both branches until they + become equivalent@>; +until j>hn; +link(s):=q + +@ In this repeat loop we will insert another discretionary if |hyf[j-1]| is +odd, when both branches of the previous discretionary end at position |j-1|. +@y +if dirty_umlaut[-1]<>null then begin + {hook in the previous saved whatsit node before the first + character of the hyphenated word} + link(s):=dirty_umlaut[-1]; + s:=link(s); +end; +repeat + if dirty_umlaut[j]<>null then begin + link(s):=dirty_umlaut[j]; + while link(s)>null do s:=link(s); + link(hold_head):=null; + j:=j+1; hyphen_passed:=0; + if hyfpen[j-1]<>inf_penalty then begin + l:=j; hyphen_passed:=j-1; + si_debug(16) + si_put_ln(' *** append a hyphen immediatly after a dirty umlaut!'); + gubed_si; + end; + end else begin + l:=j; j:=reconstitute(j,hn,bchar,qi(hyf_char))+1; + if hyphen_passed=0 then begin + link(s):=link(hold_head); + while link(s)>null do s:=link(s); + if hyfpen[j-1]<>inf_penalty then begin + l:=j; hyphen_passed:=j-1; link(hold_head):=null; + end; + end; + end; {if dirty_umlaut[j]<>null then-else} + if hyphen_passed>0 then + @<Create and append a discretionary node as an alternative to the + unhyphenated word, and continue to develop both branches until they + become equivalent@>; +until j>hn; +link(s):=q; +si_q:=s; {save the last node of the hyphenated word for debugging output} +for j:=0 to 64 do if hyf_disc[j]<>null then begin + flush_node_list( hyf_disc[j]); +end + +@ In this repeat loop we will insert another discretionary if +|hyfpen[j-1]<>inf_penalty|, when both branches of the previous +discretionary end at position |j-1|. +@z + +========================================================================= + +Another odd->inf_penalty change. + +@x +hyphen_passed:=j-1; link(hold_head):=null; +until not odd(hyf[j-1]) +@y +hyphen_passed:=j-1; link(hold_head):=null; +until (hyfpen[j-1]=inf_penalty) +@z + +========================================================================= + +Here comes the big reconstitution action (cheers to Heini!). + +@x +@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>= +minor_tail:=null; pre_break(r):=null; hyf_node:=new_character(hf,hyf_char); +if hyf_node<>null then + begin incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node); + end; +while l<=i do + begin l:=reconstitute(l,i,font_bchar[hf],non_char)+1; + if link(hold_head)>null then + begin if minor_tail=null then pre_break(r):=link(hold_head) +@y +As the value of |hyfpen[i]| is necessary for creating a penalty node, +we must create this node before we ``kill'' the hyphenation information in +|hyfpen[i]| by assigning |inf_penalty|. |minor_tail| contains the +pointer to the penalty node or |null|, if no such node has been created. + +@<Put the \(c)characters |hu[l..i]| and a hyphen into |pre_break(r)|@>= +if (hyfpen[i]<>inf_penalty) and (hyfpen[i]<>hyphen_penalty) + then minor_tail:=new_penalty(hyfpen[i]) + else minor_tail:=null; +hyfpen[i]:=inf_penalty; +pre_break(r):=minor_tail; + +hyf_node:=new_character(hf,hyf_char); +{Exchange |pre_break|-list of the selfbuilt |disc_node| with |hu|} +xchg_k:=i; +if hyf_disc[xchg_k]<>null then begin + spec_hyf:=pre_break(hyf_disc[xchg_k]); + add_char:=subtype(spec_hyf); + xchg_i:=1; + repeat + spec_hyf:=link(spec_hyf); + if spec_hyf<>null then begin + xchg_char[xchg_i]:=qo(character(spec_hyf)); + incr(xchg_i); + end;{if} + until spec_hyf=null; + if hyf_node<>null then begin + xchg_char[xchg_i]:=hyf_char; + free_avail(hyf_node); + end else decr(xchg_i); + xchg_hu:=i-xchg_i+add_char+2; {this is the index of |hu| where the first + character is replaced by a character of the + |pre_break|-list of |spec_hyf|} + for xchg_k:=1 to xchg_i do begin + xchg_char[0]:=hu[xchg_hu]; + hu[xchg_hu]:=xchg_char[xchg_k]; + xchg_char[xchg_k]:=xchg_char[0]; + incr(xchg_hu); + end; {|for|} + xchg_k:=i; + i:=xchg_hu-1; + xchg_hu:=xchg_hu-xchg_i; +end {|if hyf_disc[]<>null|} +else if hyf_node<>null then begin + incr(i); c:=hu[i]; hu[i]:=hyf_char; free_avail(hyf_node); +end; +while l<=i do begin + l:=reconstitute(l,i,font_bchar[hf],non_char)+1; + if link(hold_head)>null then + begin if minor_tail=null then pre_break(r):=link(hold_head) +@z + +------------------------------------------------------------------------- + +... continued: + +@x +if hyf_node<>null then + begin hu[i]:=c; {restore the character in the hyphen position} + l:=i; decr(i); + end + +@y + if hyf_disc[xchg_k]<>null then begin +{ Restore the original word in |hu| } + i:=xchg_k; l:=i+1; + for xchg_k:=1 to xchg_i do begin + hu[xchg_hu]:=xchg_char[xchg_k]; + incr(xchg_hu); + end;{for} + end else if hyf_node<>null then begin + hu[i]:=c; {restore the character in the hyphen position} + l:=i; decr(i); + end + +@z + +========================================================================= + +MAIN CHANGE 1) + +Finally, we come to the SISISI hyphenation. At first, we define two +variables: + +@x +@ Assuming that these auxiliary tables have been set up properly, the +@y +@!funktioniert: boolean; +@!zerleg: integer; + +@ Assuming that these auxiliary tables have been set up properly, the +@z + +------------------------------------------------------------------------- + +And off we go; at first only slowly, ... + +@x +@<Find hyphen locations for the word in |hc|...@>= +@y +{\sl Here, the German Hyphenation of W.Barth and H.Nirschl has been added!} + + +@<Find hyphen locations for the word in |hc|...@>= +@z + +------------------------------------------------------------------------- + +... but now we kill all of Liang's code and replace it by some re- and +back-en- and decoding, a call to abteilen, and the construction of the +special discretionaries. Then we go right into the SISISI hyphenation. +========================================================================= +@x +if trie_char(cur_lang+1)<>qi(cur_lang) then return; {no patterns for |cur_lang|} +hc[0]:=0; hc[hn+1]:=0; hc[hn+2]:=256; {insert delimiters} +for j:=0 to hn-r_hyf+1 do + begin z:=trie_link(cur_lang+1)+hc[j]; l:=j; + while hc[l]=qo(trie_char(z)) do + begin if trie_op(z)<>min_quarterword then + @<Store \(m)maximum values in the |hyf| table@>; + incr(l); z:=trie_link(z)+hc[l]; + end; + end; +found: for j:=0 to l_hyf-1 do hyf[j]:=0; +for j:=0 to r_hyf-1 do hyf[hn-j]:=0 + +@ @<Store \(m)maximum values in the |hyf| table@>= +begin v:=trie_op(z); +repeat v:=v+op_start[cur_lang]; i:=l-hyf_distance[v]; +if hyf_num[v]>hyf[i] then hyf[i]:=hyf_num[v]; +v:=hyf_next[v]; +until v=min_quarterword; +end + +@ The exception table that is built by \TeX's \.{\\hyphenation} primitive is +@y + for j:=0 to hn do + hc_si[j] := ktab[hc[j]]; + si_debug(2) + si_put(' hc:'); + for j:=0 to hn do si_put( xchr[hc[j]] ); + si_put_ln(':'); + si_put(' hc_si:'); + for j:=0 to hn do si_put( xchr[rev_tab[hc_si[j]]] ); + si_put_ln(':'); + gubed_si; + si_debug(4) + si_put_ln('< decimal character codes >'); + si_put(' hc:'); + for j:=0 to hn do begin + si_put(hc[j]:3,'-'); + if ((j+1) mod 16)=0 then begin + si_put_cr; si_put(' '); + end; + end; + si_put_cr; + si_put(' hc_si:'); + for j:=0 to hn do begin + si_put( rev_tab[hc_si[j]]:3,'-' ); + if ((j+1) mod 16)=0 then begin + si_put_cr; si_put(' '); + end; + end; + si_put_cr; si_put_cr; + gubed_si; + + abteilen(hc_si,hyf_si,hn,funktioniert,zerleg); + for j:=0 to 64 do begin + hyf_disc[j]:=null; hyfpen[j]:=inf_penalty; + end; + if funktioniert then + for j:=0 to hn do begin + if hyf_si[j]=neben then hyfpen[j] := neben_hyphen_penalty + else if hyf_si[j]=haupt then hyfpen[j] := hyphen_penalty + else if hyf_si[j]=nebenck then begin + hyfpen[j+1] := neben_hyphen_penalty; + s:=get_node(small_node_size); {discretionary node erzeugen} + type(s):=disc_node; + hyf_disc[j+1]:=s; + {|pre_break|-Liste: } + pre_break(s):=new_penalty(neben_hyphen_penalty); s:=pre_break(s); + subtype(s):=0; { number of additional characters } + link(s):=new_character(hf,hu[j+2]); {'k' oder'K'} + link(link(s)):=null; + s:=hyf_disc[j+1]; + post_break(s):=null; link(s):=null; + end + else if hyf_si[j]=haupt3 then begin + hyfpen[j-1]:=hyphen_penalty; + s:=get_node(small_node_size); {discretionary node erzeugen} + type(s):=disc_node; + hyf_disc[j-1]:=s; + {|pre_break|-Liste: } + pre_break(s):=new_penalty(hyphen_penalty); s:=pre_break(s); + subtype(s):=1; + link(s):=new_character(hf,hu[j]); { Dreifachkonsonant } + link(link(s)):=null; + {|post_break|- und |link|-Liste: } + s:=hyf_disc[j-1]; + post_break(s):=null; + link(s):=null; + end + end; {|if funktioniert|} + si_debug(8) + if funktioniert then begin + for j:=0 to hn do + if hyfpen[j]<>inf_penalty then begin + if hyf_disc[j]<>null then begin + if subtype(pre_break(hyf_disc[j]))=0 then + si_put( xchr[hu[j+1]], '-' ) + else {if subty...} + si_put( xchr[hu[j+1]], xchr[hu[j+1]], '=' ); + { i hope so } + end else begin + si_put( xchr[hu[j]] ); + if hyfpen[j]=hyphen_penalty then + si_put('=') + else si_put('-'); + end; + end else begin + si_put( xchr[hu[j]] ); + end; + end else begin + si_put_ln(' no hyphens were found in this word!'); + end; + si_put_cr; + gubed_si; + goto done1; + +found: +hyfpen[0]:=inf_penalty; +for j:=1 to hn do + if odd(hyf[j]) then hyfpen[j]:=hyphen_penalty + else hyfpen[j]:=inf_penalty; + +done1: + +@ Das folgende Modul ersetzt die gesamte Liang'sche Trennung. Aufgabe +dieses Modules ist es, ein in hc (ein Array of 0..255 ) liegendes Wort +nach Trennstellen zu untersuchen und die gefundenen Trennstellen in +hyf (ebenfalls ein Array of neben...) an den entsprechenden Stellen +einzutragen. Die genaue Beschreibung der Vorgangsweise findet man im +INSTITUTSBERICHT NR. 26, TECHNISCHE UNIVERSIT\"AT WIEN, INSTITUT +F\"UR PRAKTISCHE INFORMATIK. + +Alle Prozeduren f\"ur die Silbentrennung \SISISI, die bei jedem +Start von TeX aufgerufen werden. + +@ Dieser Modul beinhaltet alle f\"ur die neue Silbentrennung |abteilen| +n\"otigen Initialisierungen bzw. Prozeduren, die nur einmal am Anfang +ausgef\"uhrt werden sollen. + +@<Set initial values of ...@>= + inittrennen; + +@ @<Constants in the outer block@>= + maxwl = 64; { Maximale Wortlaenge } + sonderzeichen= 0; + bst_a= 1; bst_b= 2; bst_c= 3; bst_d= 4; bst_e= 5; bst_f= 6; bst_g= 7; + bst_h= 8; bst_i= 9; bst_j=10; bst_k=11; bst_l=12; bst_m=13; bst_n=14; + bst_o=15; bst_p=16; bst_q=17; bst_r=18; bst_s=19; bst_t=20; bst_u=21; + bst_v=22; bst_w=23; bst_x=24; bst_y=25; bst_z=26; bst_ae=27; + bst_oe=28; bst_ue=29; bst_sz=30; trennzeichen=31; + keine = 1; neben = 2; nebenck = 3; haupt = 4 ; haupt3 = 5; + + tabsize = 8191; { 2**13 - 1 } + spec_letter_ID = 4321; + { const definitionen } + vok_a = 1; + vok_e = 2; + vok_i = 3; + vok_o = 4; + vok_u = 5; + vok_ae = 6; + vok_oe = 7; + vok_ue = 8; + vok_ie = 9; + vok_ai = 10; + vok_ei = 11; + vok_au = 12; + vok_aeu= 13; + vok_eu = 14; + vok_y = 15; + kons = 16; + +@ +@<Types in the outer block@>= + string80 = packed array [0..80] of eight_bits; + buchstabe = eight_bits; + a_word = array[0..maxwl] of 0..256; + wort = a_word; + sperrvektor=array [0..maxwl] of boolean; + dudt=array [0..maxwl] of boolean;{frueher kein type !!} + { trennung = (keine, neben, nebenck, haupt, haupt3); } + trennvektor = array [0..maxwl] of integer; { Trennstelle bei i ==> + zwischen Buchstabe i und i+1 wird getrennt } + ktabtype = packed array [0..255] of buchstabe; + verdschlue = 0..8388647; { 2**23 - 1 } { -PRAK!- unsigned long in C } + varr = array [0..maxwl] of verdschlue; + intarr = array [0..maxwl] of integer; + + { darf nicht als var Parameter uebergeben werden !!} + infotype = record + { frueher ein variantenRecord } + ausnahme:boolean; + untrennbar:boolean; + { erste :0..7; + zweite:0..7; } + erste :integer; + zweite:integer; + endung,vorsilbe,stamm,ehervor,stammallein:boolean; + end; + + infobyte = eight_bits; + + { darf nicht als var Parameter uebergeben werden !!} + tableentry=record + tabv:verdschlue; + tabb:infobyte; + frei:boolean; + wiederfrei:boolean; + end; + + hashelement = packed array [0..3] of eight_bits; + htabtype = packed array [0..tabsize] of hashelement; + +@ +@<Global variables@>= + ktab : ktabtype; + htab : htabtype; + anzahl : integer; + hashfile : alpha_file; + kombtab : array [1..5, 1..5] of integer; + konsonant : array [1 .. 30] of boolean; {array [bst_a .. bst_sz]} + rev_tab: array[0..255]of integer; + + +@ Prozedurdefinitionen + +function dig_count( v: integer): integer; + { calculates the number of decimal digits of ``v'' } + var x, e, c: integer; +begin + x := v div 10; e:=1; c:=1; + while e<=x do begin + e := e * 10; incr(c); + end; + dig_count:=c; +end; + +@<Handling of dirty umlauts@>= + +procedure hashfunk (var w:wort; anfang,ende:integer; + var v:varr; var ind,k:intarr ); + + { -PRAK!- in C long statt integer } + var vacc, indacc, kacc : integer; + i : integer; +begin + vacc := 31415; indacc := 152; kacc := 271; +dbg_put_ln(' * HFNC ='); + for i := anfang to ende do begin +dbg_put(' * HFNC ',i-anfang:3,' A'); + vacc := (vacc * 31 + w [i]) mod 8388648; +dbg_put('B'); + v[i] := vacc; +dbg_put('C'); + indacc := (indacc * 33 + w[i]) mod (tabsize+1); +dbg_put('D'); + ind[i] := indacc; +dbg_put('E'); + kacc := (kacc * 15 + w[i]) mod ((tabsize+1) div 2); +dbg_put('F'); + k[i] := 2*kacc + 1; +dbg_put_ln('G'); + end; {|for|} +end; {|hashfunk|} + +procedure unpackinfo ( b:infobyte; + { var i:infotype } + var iausnahme :boolean; + var iuntrennbar :boolean; + var ierste :integer; + var izweite :integer; + var iendung :boolean; + var ivorsilbe :boolean; + var istamm :boolean; + var iehervor :boolean; + var istammallein:boolean ); +begin + { with i do begin } + if odd(b) then begin { 87654321 } + iausnahme:= true; + b:= b div 2; { 08765432 } + if odd(b) then iuntrennbar:= true + else iuntrennbar:= false; + b:=b div 2; { 00876543 } + ierste := b mod 8; { 00876xxx } + izweite := b div 8; { 00000876 } + end else begin + iausnahme:= false; { 87654321 } + b:= b div 2; { 08765432 } + if odd(b) then iendung:= true + else iendung:= false; + b:= b div 2; { 00876543 } + if odd(b) then ivorsilbe:= true + else ivorsilbe:= false; + b:= b div 2; { 00087654 } + if odd(b) then istamm:= true + else istamm:= false; + b:= b div 2; { 00008765 } + if odd(b) then iehervor:= true + else iehervor:= false; + b:= b div 2; { 00000876 } + if odd(b) then istammallein:= true + else istammallein:= false; + end; {|if-then-else|} + { end; |with|} +end; {|unpackinfo|} + + +procedure unpackentry( h:hashelement; + { var e:tableentry } + var etabv:verdschlue; + var etabb:infobyte; + var efrei:boolean; + var ewiederfrei:boolean ); +begin + { with e do begin } +dbg_put_cr; +dbg_put(' ==> UPCKNTY 1'); + etabv:= h[0]+h[1]*256+h[2]*256*256; +dbg_put(' 2'); + if odd(h[3]) then begin { Ausnahme } +dbg_put(' 3 A'); + etabb:= h[3]; +dbg_put('1'); + efrei:= false; + ewiederfrei:= false; + end + else begin +dbg_put(' 3 B'); + etabb:= h[3] mod 64; +dbg_put('1'); + { h[3]:=h[3] div 64;} {-PRAK!- in C ein var-Paramter, darf daher + nicht ver„ndert werden. } +dbg_put('2'); + { durch folgende 2 Abfragen ersetzt. -PRAK!- } + if odd(h[3] div 64) then efrei := true + else efrei := false; + if odd(h[3] div 128) then ewiederfrei := true + else ewiederfrei := false; + end; +dbg_put_ln('- 4'); + { end; |with|} +end; {|unpackentry|} + + +procedure hashsuch ( v:verdschlue; + ind,k : integer; + { var i:infotype; } + var iausnahme :boolean; + var iuntrennbar :boolean; + var ierste :integer; + var izweite :integer; + var iendung :boolean; + var ivorsilbe :boolean; + var istamm :boolean; + var iehervor :boolean; + var istammallein:boolean; + var g:boolean ); + +{ sucht Eintragung in der Hashtabelle, g ist TRUE falls gefunden } + var + gef,ngef:boolean; + j:integer; + entry : tableentry; + +begin + gef := false; ngef := false; j := ind; + repeat + unpackentry(htab[j],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei); + if entry.frei then ngef := true + else if (v = entry.tabv) and not entry.wiederfrei then begin + unpackinfo(entry.tabb,iausnahme,iuntrennbar,ierste,izweite, + iendung,ivorsilbe,istamm,iehervor,istammallein); + gef := true; + end else + j := (j+k) mod (tabsize + 1) + until gef or ngef; + g := gef; +end; {|hashsuch|} + + +procedure hashload ( var status:integer ); +{ einlesen der Hash-Tabelle von file fn } + var i : integer; + e : tableentry; +begin + { Orginal sitex3.cha -PRAK!- + for i:=1 to file_name_size do name_of_file:= ' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length := 3; + anzahl := 0; + if a_open_in(hashfile) then begin + } + + { geaendert !! -PRAK!- } + for i:=1 to file_name_size do name_of_file[i]:= ' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length := 3; + anzahl := 0; + { -PRAK!- texinputpath fr C notwendig } + if a_open_in(hashfile, TEX_INPUT_PATH) then begin + for i := 0 to tabsize do begin + { -PRAK!- in C Probleme mit den typen beim einlesen } + read (hashfile, htab[i][0]); { htab = packed array [0..tabsize] of } + read (hashfile, htab[i][1]); { hashelement, und } + read (hashfile, htab[i][2]); { hashelement = packed array 0..3 } + read (hashfile, htab[i][3]); + unpackentry (htab[i],e.tabv,e.tabb,e.frei,e.wiederfrei); + if not e.frei and not e.wiederfrei then anzahl := anzahl + 1; + end; {|for|} + status:= 0; + a_close(hashfile); + end else status:= 1; +end; {|hashload|} + + +procedure inittrennen; + var ch: 0..255; + bst: buchstabe; + i, status: integer; + is_iniTeX: boolean; +begin + { Konversionstabelle |ktab| initialisieren } + { ======================================== } + + for ch := 0 to 255 do begin + + { if (ch in [" ",",",";",":","-","/","?","!","(",")",".","""","'","^"]) then } + + case ch of + " ",",",";",":","-","/","?","!","(",")",".","""","'","^": + + if ch="." then ktab[ch]:= "." + else ktab[ch] := trennzeichen + { else ktab[ch] := sonderzeichen geht nicht !!} + end; { case } + +if (ktab[ch] <> ".") and (ktab[ch] <> trennzeichen) then ktab[ch] := sonderzeichen; + + end; { for } + for bst := bst_a to bst_z do begin + ktab[ord('A')+ord(bst)-ord(bst_a)]:=bst; + ktab[ord('a')+ord(bst)-ord(bst_a)]:=bst + end; + + { Umlaute und scharfes s - f\"ur ``production \TeX version'' } + ktab[255]:=bst_sz; + ktab[246]:=bst_oe; + ktab[252]:=bst_ue; + ktab[228]:=bst_ae; + + { Umlaute und scharfes s - f\"ur ``initialization \TeX version'' } + ktab["1"]:=bst_sz; + ktab["2"]:=bst_ue; + ktab["3"]:=bst_oe; + ktab["4"]:=bst_ae; + ktab[25]:=bst_sz; {?-wieso? HH} + +{testing:} +for i:=0 to 255 do rev_tab[ktab[i]]:=i; +rev_tab[ktab[255]]:=223; +xchr[223]:=chr(223); xchr[228]:=chr(228); xchr[246]:=chr(246); +xchr[252]:=chr(252); xchr[255]:=chr(223); xchr[ 25]:=chr(223); +{:end of testing} + + { Kombinationstabelle |kombtab| initialisieren } + { ============================================ } + { Diese Tabelle muss symetrisch sein, + kombtab[a,b] = kombtab[b,a] } + kombtab[ keine, keine] := keine; + kombtab[ keine, neben] := keine; + kombtab[ keine,nebenck] := keine; + kombtab[ keine, haupt] := keine; + kombtab[ keine, haupt3] := keine; + + kombtab[ neben, keine] := keine; + kombtab[ neben, neben] := neben; + kombtab[ neben,nebenck] := keine; + kombtab[ neben, haupt] := neben; + kombtab[ neben, haupt3] := keine; + + kombtab[nebenck, keine] := keine; + kombtab[nebenck, neben] := keine; + kombtab[nebenck,nebenck] := nebenck; + kombtab[nebenck, haupt] := keine; + kombtab[nebenck, haupt3] := keine; + + kombtab[ haupt, keine] := keine; + kombtab[ haupt, neben] := neben; + kombtab[ haupt,nebenck] := keine; + kombtab[ haupt, haupt] := haupt; + kombtab[ haupt, haupt3] := keine; + + kombtab[ haupt3, keine] := keine; + kombtab[ haupt3, neben] := keine; + kombtab[ haupt3,nebenck] := keine; + kombtab[ haupt3, haupt] := keine; + kombtab[ haupt3, haupt3] := haupt3; + + { Konsonantentabelle initialisieren } + for bst:=bst_a to bst_sz do konsonant[bst] := true; + konsonant[bst_a] := false; + konsonant[bst_e] := false; + konsonant[bst_i] := false; + konsonant[bst_o] := false; + konsonant[bst_u] := false; + konsonant[bst_ae] := false; + konsonant[bst_oe] := false; + konsonant[bst_ue] := false; + + +{ ================== Hashtabelle |htab| initialisieren ====================== + +Die Prozedur ``hashload'' darf im Initialisierungslauf von TeX auf +keinen Fall aufgerufen werden. Deshalb wird zun\"achst festgestellt, ob +dieser Programmlauf ein Initialisierungslauf ist oder nicht. Abh\"angig +davon wird ``hashload'' nur aufgerufen, wenn dies ein ``Arbeits''-lauf +(production-version) von \TeX ist. + +=============================================================================} + is_iniTeX:=false; + init is_iniTeX:=true; tini + if not is_iniTeX then begin + hashload(status); + if status <> 0 then begin + si_put_cr; + si_put_ln +(' * * * * * * * * * *!'); + si_put_ln('**** ERROR: Can not read hash-file!'); + si_put_cr; + jump_out; + end; + end; {|not iniTeX|} +end; {|inittrennen|} + + +procedure packinfo ( i:infotype; var b : infobyte ); +{ Byte: /zweite/zweite/zweite/erste/erste/erste/untrennbar/ausnahm/ } +{ bzw.: /0 /0 /stall /eherv/stamm/vors /endung /0 / } + +begin + b:=0; +dbg_put_cr; + { with i do begin } + if i.ausnahme then +begin +dbg_put(' ### PCKINF 1A utr:'); +if i.untrennbar then dbg_put('Y') else dbg_put('N'); +dbg_put_ln(',',ord(i.untrennbar):3,' 1.',i.erste:3,' 2.',i.zweite:3); + b:=1+2*ord(i.untrennbar)+4*i.erste+32*i.zweite +; dbg_put('B'); +end + else +begin +dbg_put(' ### PCKINF 2A'); + b:= 2*ord(i.endung)+4*ord(i.vorsilbe)+8*ord(i.stamm)+16*ord(i.ehervor) + +32*ord(i.stammallein); +dbg_put('B'); +end; + { end; with } +dbg_put_ln('-3'); +end; {|packinfo|} + +procedure packentry( e:tableentry; var h:hashelement ); +{ /infobyte+frei,wiederfrei/verdschhigh/verdschmiddle/verdschllow/ } + +begin + { with e do begin } +dbg_put_cr; +dbg_put(' +++ PCKNTY A'); + h[0]:= e.tabv mod 256; { 87654321abcdefghxxxxxxxx} +dbg_put('B'); + e.tabv:= e.tabv div 256; { 0000000087654321abcdefgh} +dbg_put('C'); + h[1]:= e.tabv mod 256; { 0000000087654321xxxxxxxx} +dbg_put('D'); + h[2]:= e.tabv div 256; { 000000000000000087654321} + +dbg_put('E'); + if odd(e.tabb) then h[3]:= e.tabb { Ausnahme !! } + else +begin +dbg_put('F1'); + h[3]:=e.tabb+64*ord(e.frei)+128*ord(e.wiederfrei); { wfxxxxxx } +dbg_put('-2'); +end; +dbg_put_ln('G'); + { end; |with|} +end; {|packentry|} + + + +procedure hashetr ( var w:wort; laenge:integer; i:infotype; + var g:boolean ); + + var v1: varr; + ind1, k1: intarr; + v: verdschlue; + ii,ind, k, j, e: integer; + gef,ngef:boolean; + entry: tableentry; + helem: hashelement; + +begin +dbg_put_ln(' ** HTR 1'); + if anzahl >= tabsize then begin +dbg_put_ln(' ** HTR 2a'); + g := false; + end + else begin +dbg_put_ln(' ** HTR 2b'); + if (anzahl < 10) or (anzahl mod 100 = 0) then begin + si_put_cr; si_put(' -Anzahl:',anzahl,'. '); + end; +dbg_put_ln(' ** HTR 3'); + hashfunk(w,1,laenge,v1,ind1,k1); +dbg_put_ln(' ** HTR 4'); + v := v1[laenge]; + ind := ind1[laenge]; + k := k1[laenge]; + gef := false; ngef := false; + repeat +dbg_put_ln(' ** HTR 5 A'); + unpackentry(htab[ind],entry.tabv,entry.tabb,entry.frei,entry.wiederfrei); +dbg_put_ln(' ** HTR B'); + if entry.frei or entry.wiederfrei then begin + anzahl := anzahl + 1; + ngef := true; + entry.tabv := v; +dbg_put_ln(' ** HTR C1'); + packinfo (i,entry.tabb); +dbg_put_ln(' ** HTR D1'); + entry.frei := false; + entry.wiederfrei := false; +dbg_put_ln(' ** HTR E1'); + packentry(entry,helem); +dbg_put_ln(' ** HTR F1'); + for ii := 0 to 3 do + htab[ind][ii] := helem[ii]; + end else begin +dbg_put_ln(' ** HTR C2'); + gef := v = entry.tabv; + if not gef then ind := (ind+k) mod (tabsize + 1); +dbg_put_ln(' ** HTR D2'); + end; + until gef or ngef; +dbg_put_ln(' ** HTR 6'); + g := ngef; + end +end; {|hashetr|} + +procedure hashempty; + var i,j:integer; + elem : tableentry; + he : hashelement; +begin + { with elem do begin } + elem.tabv:=0; + elem.tabb := 0; { !!!!!! Irgend ein Affe hat diese Initialisierung vergessen. + ( Und dies ist eine Beleidigung fuer jeden Affen ) HM } + elem.frei := true; + elem.wiederfrei := false; + { end; } + packentry (elem, he); + for i := 0 to tabsize do + for j := 0 to 3 do + htab[i][j] := he[j]; + anzahl := 0; +end; {|hashempty|} + +procedure hashsave (var status:integer); +{ abspeichern der Hash-Tabelle auf file } + var i: integer; +begin + for i:=1 to file_name_size do name_of_file[i]:=' '; + name_of_file[1]:='h'; + name_of_file[2]:='f'; + name_of_file[3]:='3'; + name_length:=3; + if a_open_out(hashfile) then begin + for i := 0 to tabsize do begin + write (hashfile, htab[i][0]:4); + write (hashfile, htab[i][1]:4); + write (hashfile, htab[i][2]:4); + write (hashfile, htab[i][3]:4); + write_ln (hashfile); + end; + status:=0; + a_close(hashfile); + end else status:=1; +end; {|hashsave|} + + +function hashsize :integer; +begin + hashsize:=anzahl; +end; + + +procedure zahl(line:string80;var i:integer; ende:integer; var j:integer); + var aus: boolean; +begin + j:=0; + repeat + if i<=ende then + if ktab[line[i]]="." then i:=i+1 + else aus:=true + else aus:=true + until aus; + repeat + if i<=ende then begin + { if line[i] in ["0".."9"] then begin } + case line[i] of + "0","1","2","3","4","5","6","7","8","9": + begin j:=10*j+line[i]-"0";i:=i+1 + end; + { else aus:=true geht nicht !!! } + end; + if (line[i] <> "0") and + (line[i] <> "1") and + (line[i] <> "2") and + (line[i] <> "3") and + (line[i] <> "4") and + (line[i] <> "5") and + (line[i] <> "6") and + (line[i] <> "7") and + (line[i] <> "8") and + (line[i] <> "9") then aus :=true; + end else aus:=true + until aus; +end; {|zahl|} + + +procedure infobau(line: string80; anfang,ende: integer; + { var inform: infotype;} + var informausnahme :boolean; + var informuntrennbar :boolean; + var informerste :integer; + var informzweite :integer; + var informendung :boolean; + var informvorsilbe :boolean; + var informstamm :boolean; + var informehervor :boolean; + var informstammallein:boolean; + var g: boolean); + + var i,j:integer;ok,fehler:boolean; + b:buchstabe; +begin + g:=false; + { with inform do begin } { initialisierung } + informausnahme:=false; + informendung:=false; + informvorsilbe:=false; + informehervor:=false; + informstamm:=false; + informstammallein:=false; + i:=anfang; ok:=false; fehler:=false; + repeat + if i<=ende then + if line[i]="." then i:=i+1 else ok:=true + else fehler:=true + until ok or fehler; + if not fehler then begin + b:=ktab[line[i]]; + if b = bst_a then begin + {ausnahme} + informausnahme:=true; + i:=i+1; + if ktab[line[i]] = bst_u then begin + i := i + 1; informuntrennbar := true; + end else informuntrennbar := false; + zahl(line,i,ende,j); + if j=0 then begin + informerste:=7; informzweite:=7; + { Record-komponente ``zweite'' wird } + { initialisiert, damit beim packen keine } + { undefinierten Ergebnisse entstehen (die u.U. zu } + { RUN-TIME-ERRORS f\"uhren k\"onnen!) } + end else begin + j:=j-2; + if (j>=0) and (j<=6) then informerste:=j + else fehler:=true; + zahl(line,i,ende,j); + if j=0 then informzweite:=7 + else begin + j:=j-informerste-4; + if (j>=0) and (j<=6) then informzweite:=j + else fehler:=true; + end; + end; + if not fehler then g:=true; + end {|if b = bst_a |} + else begin + ok:=false; + repeat + case b of + {bst_v} 22: informvorsilbe:=true; + {bst_e} 5: informendung:=true; + {bst_s} 19: informstamm:=true; + {bst_b} 2: informehervor:=true; + {bst_t} 20: informstammallein:=true; + {trennzeichen} 31:; + othercases fehler:=true + endcases; + if i=ende then ok:=true + else begin + i:=i+1; + b:=ktab[line[i]] + end + until ok or fehler; + if not fehler then + g := (informvorsilbe or informendung or informstamm) + and (not informehervor or informvorsilbe and informendung) + and (not informstammallein or informstamm); + end; {|if b = bst_a then-else|} + end {|if not fehler|} + { end |with inform|} +end; {|infobau|} + + +procedure eintragen (line: string80; l: integer ); + var i, laenge: integer; + inform: infotype; + w: wort; + g: boolean; +begin + laenge := 1; + while line [laenge] <> "." do laenge := laenge + 1; + laenge := laenge -1; + if laenge >= 1 then begin + if laenge <= maxwl then begin + infobau(line,laenge+1,l, + inform.ausnahme,inform.untrennbar, + inform.erste,inform.zweite,inform.endung, + inform.vorsilbe,inform.stamm,inform.ehervor, + inform.stammallein,g); + + if not g then begin + si_put_cr; si_put(' Info falsch: ') + end else begin + for i:= 1 to laenge do w[i]:=ktab[line[i]]; + hashetr(w,laenge,inform,g); + if not g then begin + si_put_cr; si_put(' Tabellenfehler: '); + end; + end; + if not g then begin + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end + end {|if laenge <= maxwl|} + else begin + si_put_cr; si_put_ln(' zu langes Wort: '); + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end + end {|if laenge >= 1|} + else begin + si_put_cr; si_put_ln(' Falsche Zeile: '); + for i:=1 to l do si_put( xchr[line[i]] ); + si_put_cr; + end +end; {|eintragen|} + +{---------------------------------------------------------------------------} + +{ naechsterbst -> naechsterbst(i,tr,dudstop,b,w) } + +procedure naechsterbst(var i:integer;var tr:trennvektor; + var dudstop:sperrvektor;var b:buchstabe; + var w:wort); + begin + if (i>0) and (tr[i]=keine) and not dudstop[i] + then begin b:=w[i];i:=i-1 end + else b:=trennzeichen + end; +{---------------------------------------------------------------------------} +{ duden(tr) -> duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen) } + + procedure duden (tr:trennvektor; + var w:wort; + var tr1 :trennvektor; + var dudtr:trennvektor; + dud :dudt; { array [0..maxwl] of boolean; } + var dudstop:sperrvektor; + laenge : integer; + var ok :boolean; + var zerlegungen:integer ); + + { traegt in dudtr die Trennstellen nach Dudenregeln ein } + + { frueher mtype laut = (.....) } + + var i:integer; + j:integer; + zust:integer; + aus:boolean; + tre:integer; + letzte:integer; + l,lalt:integer;{ vormals laut } + b:buchstabe; + + + begin { duden } + i:=laenge; + for j := 0 to laenge do dudtr[j] := tr[j]; + while (i>0) and not dud [i] do i:=i-1; + while i>0 do begin + zust:=1; aus:=false; letzte := 0; + l:=kons; + b:=w[i]; + i:=i-1; + repeat + {naechsten Laut lesen} + { procedure nlaut; } + begin { nlaut } + tre:=i+1; + lalt:=l; + case b of + {bst_a } 1:begin l:=vok_a; naechsterbst(i,tr,dudstop,b,w) end; + {bst_o } 15:begin l:=vok_o; naechsterbst(i,tr,dudstop,b,w) end; + {bst_ue} 29:begin l:=vok_ue; naechsterbst(i,tr,dudstop,b,w) end; + {bst_oe} 28:begin l:=vok_oe; naechsterbst(i,tr,dudstop,b,w) end; + {bst_ae} 27:begin l:=vok_ae; naechsterbst(i,tr,dudstop,b,w) end; + {bst_e } 5:begin + l:=vok_e; naechsterbst(i,tr,dudstop,b,w); + if b = bst_i then begin + l:=vok_ie; + naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin + {ungetbst = } i := i + 1; + l:=vok_e; + b := bst_i; + end; + end + end; + {bst_i} 9:begin + l:=vok_i; naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin l:=vok_ei; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_a then begin l:=vok_ai; naechsterbst(i,tr,dudstop,b,w) end + end; + {bst_u} 21:begin + l:=vok_u; naechsterbst(i,tr,dudstop,b,w); + if b = bst_e then begin l:=vok_eu; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_a then begin l:=vok_au; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_ae then begin l:=vok_aeu; naechsterbst(i,tr,dudstop,b,w) end + else if b = bst_q then begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end + end; + {bst_t} 20:begin + l:=kons; naechsterbst(i,tr,dudstop,b,w); + if b = bst_s then naechsterbst(i,tr,dudstop,b,w) + end; + {bst_h} 8:begin + l:=kons; naechsterbst(i,tr,dudstop,b,w); + if b = bst_c then begin + naechsterbst(i,tr,dudstop,b,w); + if b = bst_s then naechsterbst(i,tr,dudstop,b,w) + end + else if b = bst_p then naechsterbst(i,tr,dudstop,b,w) + else if b = bst_t then naechsterbst(i,tr,dudstop,b,w) + end; + {bst_b, bst_c, bst_d, bst_f, bst_g, bst_j, bst_k, bst_l, bst_m, + bst_n, bst_p, + bst_q, bst_r, bst_s, bst_v, bst_w, bst_x, bst_z, bst_sz } + + 2,3,4,6,7,10,11,12,13,14,16,17,18,19,22,23,24,26,30 : + + begin l:=kons; naechsterbst(i,tr,dudstop,b,w) end; + {bst_y} 25:begin + l:=vok_y; + naechsterbst(i,tr,dudstop,b,w); + end; + {trennzeichen,sonderzeichen} + 31,0 :aus:=true + end; + end; { nlaut } + + if not aus then + {Naechster Zustand} + case zust of + 1:if l=kons then zust:=2 + else zust:=4; + 2:if l<>kons then zust:=3; + 3:if l=kons then zust:=6 + else if l<>lalt then begin + zust:=4; + letzte:=tre; + dudtr[letzte]:=neben + end; + 4:if l=kons then zust:=6 + else zust:=3; + 6:if l=kons then begin + zust:=2; + letzte:=tre; + if (w[tre]=bst_c) and (w[tre+1] = bst_k) then + dudtr[letzte]:=nebenck + else dudtr[letzte]:=neben + end + else begin + zust:=4; + letzte:=tre; + dudtr[letzte]:=neben + end + end + until aus; + if zust=2 then dudtr[letzte]:=keine + else if zust=4 then + { if not (lalt in [vok_ai,vok_ei,vok_au,vok_aeu,vok_eu,vok_ie]) then } + if (lalt < vok_ie) or (lalt > vok_eu) then + dudtr[letzte]:=keine; + while (i>0) and not dud[i] do i:=i-1 + end; + end { duden }; +{---------------------------------------------------------------------------} +{ procedure trennen (zustand : integer; anfang: integer; spv:sperrvektor; + var ok1 : boolean); +} + + procedure trennen ( + { trennen } + zustand : integer; + anfang : integer; + spv : sperrvektor; + var ok1 : boolean; + { abteilen } + var tr :trennvektor; + var dudtr:trennvektor; + var zerlegungen:integer ; + var dud:dudt; { array [0..maxwl] of boolean; } + var v:varr; + var ind,k:intarr; + var dudstop:sperrvektor; + { abteilen aufruf } + var w:wort; + var tr1:trennvektor; + laenge : integer ); + + { Zustand : 1 ... Es kann nur Vorsilbe oder Stamm kommen, + rechts muss noch ein Stamm kommen. + 2 ... Es kann Endung, Vorsilbe oder Stamm kommen. + 3 ... Es kann nur Vorsilbe oder Stamm kommen, im linken + Teil muessen noch Trennstellen eingefuegt werden, + rechts muss noch ein Stamm kommen. + 4 ... Es kann nur Vorsilbe oder Stamm kommen, im linken + Teil muessen noch Trennstellen eingefuegt werden. + 5 ... Trennstelle mit entfallenem Konsonanten } + + var + gef, nichtok:boolean; + schnitt:integer; + inform:infotype; + i:integer; + ok_stamm, ok_vor, ok_end, ok_help:boolean; + tri:integer; + { p_stamm } + i1,tre:integer; + ok : boolean; + stop_ptr :integer; + spvtmp :sperrvektor; { lokale Kopie des Sperrvektors, + fr die bersetzung nach C notwendig. + -PRAK!- } + + { procedure p_endung(var endok:boolean); } + + { procedure p_vorsilbe(var vorok:boolean); } + + { procedure p_stamm(var stok:boolean); } + + { procedure p_stammallein (var staok:boolean); } + + begin { trennen } + for i := 0 to maxwl do + spvtmp[i] := spv[i]; + ok1:=false; + if anfang = laenge + 1 + then { Ende des Wortes erreicht} + if (zustand = 2) or (zustand=4) then {erfolgreich zerschnitten } + begin + dud[anfang-1]:=true; + + {duden(tr);} + duden(tr,w,tr1,dudtr,dud,dudstop,laenge,ok,zerlegungen); + + for i := laenge downto 1 do + begin + if dudtr[i-1] = haupt3 then + begin + dudtr[i-1] := keine; + tri := haupt3; + end + else + tri := dudtr[i]; + + if zerlegungen = 0 then + tr1[i] := tri + else + tr1[i] := kombtab[tr1[i],tri]; + end; + zerlegungen:=zerlegungen+1; + ok1:= true + end + else { kein Stamm im Wortrest ok1 = false } + else { restlichen Teil zerschneiden } + begin + hashfunk (w,anfang,laenge,v,ind,k); + schnitt := laenge; + nichtok := false; + repeat + { links abschneiden } + repeat + if spv[schnitt] then { Schnittstelle gesperrt } + gef:=false + else + begin + hashsuch (v[schnitt],ind[schnitt],k[schnitt], + inform.ausnahme,inform.untrennbar, + inform.erste,inform.zweite,inform.endung, + inform.vorsilbe,inform.stamm,inform.ehervor, + inform.stammallein,gef); + end; + if gef then + spv[schnitt]:=true + else + schnitt := schnitt - 1 + until gef or (schnitt = anfang - 1); + + if gef then { teilwortanfang ist bekanntes wort } + begin + if not inform.ausnahme then + begin + if inform.endung and (zustand=2) then + begin + + { --- p_endung(ok_end); --- } + ok_end:=false; + if (w[anfang]=bst_c) or (w[anfang]=bst_h) then + begin + dud[anfang-1]:=true; + tr[anfang-1]:=neben + end; + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv[schnitt+1]:=true; + trennen (2, schnitt+2, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_end := ok_help + end; + trennen (2, schnitt+1, spv, ok_help, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_end := ok_end or ok_help; + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + { --- p_endung(ok_end) - ende --- } + + ok1 := ok1 or ok_end + end + else + ok_end:=false; + if inform.vorsilbe + then begin + + { --- p_vorsilbe(ok_vor); --- } + { Trennstelle(n) vor der Vorsilbe eintragen } + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt; + end; + { Trennstellen innerhalb der Vorsilbe eintragen } + dud[schnitt]:=true; + { Rest des Wortes zerschneiden } + trennen(1, schnitt+1, spv, ok_vor, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + dud[schnitt]:=false; + { --- p_vorsilbe(ok_vor) - ende --- } + + ok1 := ok1 or ok_vor + end + else + ok_vor := false; + if inform.stamm and not ok_vor + then begin + if not inform.stammallein + then begin + + { --- p_stamm(ok_stamm); --- } + ok_stamm := false; + stop_ptr := 0; + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt + end; + {ev. Ausnahmetrennstellen eintragen} + if inform.ausnahme then begin + if inform.erste<>7 then begin + tre:=anfang+inform.erste+1; + tr[tre]:=neben; + if inform.zweite<>7 then begin + tre:=tre+inform.zweite+2; + if inform.untrennbar then begin + stop_ptr := tre; + dudstop[stop_ptr] := true; + end + else + tr[tre]:=neben + end + else begin + if inform.untrennbar then begin + tr[tre] := keine; + stop_ptr := tre; + dudstop[tre]:=true; + end + end + end + else begin {inform.erste = 7} + stop_ptr := schnitt-1; + dudstop[stop_ptr] := true + end + end; + + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv [schnitt+1] := true; + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_help + end; + + { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts } + if (schnitt >=2) and (schnitt < laenge) then + if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and + (w[schnitt] = w[schnitt-1]) then begin + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + end; + + { restlichen Teil zerschneiden } + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + + { eingetragene Trennstellen entfernen } + if inform.ausnahme then + for i1:=anfang-1 to schnitt do + begin + tr[i1]:=keine; + dud[i1]:=false; + dudstop[stop_ptr] := false; + end + else begin + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + end; + { --- p_stamm(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end + else + if (anfang=1) and (schnitt=laenge) + then begin + + { --- p_stammallein(ok_stamm); --- } + dud[anfang-1]:=true; + tr[anfang-1]:=haupt; + trennen (4, schnitt+1, spv, ok_stamm,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + {eingetragene Trennstellen loeschen} + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + { --- p_stammallein(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end; + end + end + else begin + + { --- p_stamm(ok_stamm); --- } + ok_stamm := false; + stop_ptr := 0; + + if zustand = 1 then + tr[anfang-1]:=neben + else begin + dud[anfang-1]:=true; + if zustand = 5 then + tr[anfang-1] := haupt3 + else + tr[anfang-1]:=haupt + end; + {ev. Ausnahmetrennstellen eintragen} + if inform.ausnahme then begin + if inform.erste<>7 then begin + tre:=anfang+inform.erste+1; + tr[tre]:=neben; + if inform.zweite<>7 then begin + tre:=tre+inform.zweite+2; + if inform.untrennbar then begin + stop_ptr := tre; + dudstop[stop_ptr] := true; + end + else + tr[tre]:=neben + end + else begin + if inform.untrennbar then begin + tr[tre] := keine; + stop_ptr := tre; + dudstop[tre]:=true; + end + end + end + else begin {inform.erste = 7} + stop_ptr := schnitt-1; + dudstop[stop_ptr] := true; + end; + end; + + { Fugen 's' bevorzugen } + if schnitt < laenge then + if (w[schnitt+1] = bst_s) and not spv[schnitt+1] + then begin + spv [schnitt+1] := true; + trennen (2, schnitt+2, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_help + end; + + { Sonderbehandlung eines in der Wortfuge entfallenen mitlauts } + if (schnitt >=2) and (schnitt < laenge) then + if konsonant[w[schnitt]] and not konsonant[w[schnitt+1]] and + (w[schnitt] = w[schnitt-1]) then begin + trennen(5, schnitt, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + end; + + { restlichen Teil zerschneiden } + trennen (2, schnitt+1, spv, ok_help,tr,dudtr, + zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + ok_stamm := ok_stamm or ok_help; + + { eingetragene Trennstellen entfernen } + if inform.ausnahme then + for i1:=anfang-1 to schnitt do + begin + tr[i1]:=keine; + dud[i1]:=false; + dudstop[stop_ptr] := false; + end + else begin + tr[anfang-1]:=keine; + dud[anfang-1]:=false; + end; + { --- p_stamm(ok_stamm) - ende --- } + + ok1 := ok1 or ok_stamm; + end; + + {naechsten Schleifendurchlauf vorbereiten} + schnitt := schnitt - 1; + nichtok := schnitt = anfang - 1 + end + else { kein bekanntes Wort am Beginn des Teilwortes } + nichtok := true; + + until nichtok + end; + for i := 0 to maxwl do + spv[i] := spvtmp[i]; {spv wiederherstellen, C Version. -PRAK!- } + end { trennen }; + +{----------------------------------------------------------------------------} + +procedure abteilen ( var w:wort; var tr1:trennvektor; + laenge : integer; var ok:boolean; + var zerlegungen:integer ); + + label 99; + + { kommt in den outer Block } + { mtype sperrvektor=array [0..maxwl] of boolean; } + + var + i:integer; + dud:dudt; { array [0..maxwl] of boolean; } + v:varr; + ind,k:intarr; + spv,dudstop:sperrvektor; + tr, dudtr:trennvektor; + + begin { abteilen } + tr1[0] := keine; + for i:=0 to laenge do begin + tr[i]:=keine; spv[i]:=false; dudstop[i]:=false; dud[i]:=false; + if i > 0 then + if (w[i] = trennzeichen) or (w[i] = sonderzeichen) + then begin + zerlegungen := 0; + ok := false; + goto 99; + end; + end; + zerlegungen:=0; + trennen(3, 1, spv, ok, + tr,dudtr,zerlegungen,dud,v,ind,k, + dudstop,w,tr1,laenge); + + for i:=0 to laenge do + if tr1[i]=nebenck then begin + tr1[i]:=keine; { c-k wird zu -ck da sp\"ater dement- } + tr1[i-1]:=nebenck; {sprechend getrennt wird } + end; +99: + end;{ abteilen } +{----------------------------------------------------------------------------} + + {identification number for dirty umlauts; see description in + change file} + + function is_dirty_umlaut(p:pointer):boolean; + var res:boolean; + q:pointer; + begin + res:=false; + if p<>null then + if type(p)=disc_node then + if pre_break(p)<>null then + if link(pre_break(p))<>null then + if link(link(pre_break(p)))<>null then begin + q:=pre_break(p); + if type(q)=penalty_node then q:=link(q); + if (type(q)=kern_node)and(width(q)=spec_letter_ID)and + is_char_node(link(q))and(type(link(link(q)))=kern_node) then res:=true; + end; + is_dirty_umlaut:=res; + end; {|is_dirty_umlaut|} + + function get_char_of(s:pointer):integer; + var q:pointer; + begin + q:=pre_break(s); + if type(q)=penalty_node then q:=link(q); + get_char_of:=width(link(link(q))); + end; {|get_char_of|} + + function get_font_of(s:pointer):integer; + var q:pointer; + begin + q:=pre_break(s); + if type(q)=penalty_node then q:=link(q); + get_font_of:=font(link(q)); + end; {|get_font_of|} + +{----------------------------------------------------------------------------} + +@ Ende ... +@z + +========================================================================= + +@x +@ Now let's go back to the easier problem, of building the linked +trie. When \.{INITEX} has scanned the `\.{\\patterns}' control +sequence, it calls on |new_patterns| to do the right thing. + +@<Declare procedures for preprocessing hyph...@>= +procedure new_patterns; {initializes the hyphenation pattern data} +label done, done1; +var k,@!l:small_number; {indices into |hc| and |hyf|} +@!digit_sensed:boolean; {should the next digit be treated as a letter?} +@!v:quarterword; {trie op code} +@!p,@!q:trie_pointer; {nodes of trie traversed during insertion} +@!first_child:boolean; {is |p=trie_l[q]|?} +@!c:ASCII_code; {character being inserted} +begin if trie_not_ready then + begin set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}} + @<Enter all of the patterns into a linked trie, until coming to a right + brace@>; + end +else begin print_err("Too late for "); print_esc("patterns"); + help1("All patterns must be given before typesetting begins."); + error; link(garbage):=scan_toks(false,false); flush_list(def_ref); + end; +end; +@y +@ We do not build a trie (wether a linked nor a packed). Instead, we +create a hash table for the \SISISI-hyphenation algorithm. But we +still use the data provided by the `\.{\\patterns}' primitive. + +@<Declare procedures for preprocessing hyph...@>= +procedure new_patterns; {initializes the hyphenation pattern data} + label done; + var k: small_number; {index into |zeile|} + @!zeile:string80; { Silbe <space> Type <,> als Eintrag der Hashtabelle } + @!status:integer; + @!c:ASCII_code; {character being inserted} +begin + if trie_not_ready then begin + set_cur_lang; scan_left_brace; {a left brace must follow \.{\\patterns}} + + hashempty; { create the empty hash table } + @<Enter all of the patterns into a hash table, until coming to a right + brace; then skip an optional space@>; + hashsave(status); + if status<>0 then begin + wterm_ln('Fehler bei hash save !!!!!'{?}); + wlog_ln( 'Fehler bei hash save !!!!!'{?}); + end; + end else begin + print_err("Too late for "); print_esc("patterns"); + help1("All patterns must be given before typesetting begins."); + error; link(garbage):=scan_toks(false,false); flush_list(def_ref); + end; +end; +@z + + +-------------------------------------------------------------------------- + + +@x +@ Novices are not supposed to be using \.{\\patterns}, so the error +messages are terse. (Note that all error messages appear in \TeX's string +pool, even if they are used only by \.{INITEX}.) + +@<Enter all of the patterns into a linked trie...@>= +k:=0; hyf[0]:=0; digit_sensed:=false; +loop@+ begin get_x_token; + case cur_cmd of + letter,other_char:@<Append a new letter or a hyphen level@>; + spacer,right_brace: begin if k>0 then + @<Insert a new pattern into the linked trie@>; + if cur_cmd=right_brace then goto done; + k:=0; hyf[0]:=0; digit_sensed:=false; + end; + othercases begin print_err("Bad "); print_esc("patterns"); +@.Bad \\patterns@> + help1("(See Appendix H.)"); error; + end + endcases; + end; +done: +@y +@ Here we build the hash table for the \SISISI-hyphenation. + +@<Enter all of the patterns into a hash table, until coming to a right...@>= +for k:=0 to maxwl do zeile[k]:=" "; +k:=0; +loop@+ begin + get_x_token; { \SISISI Worttabelle hat das Format 'Text.Type,'. + Der Beistrich wird eigens abgefragt, da er in TeX + umdefiniert werden kann. } + if (cur_cmd = right_brace)or(cur_chr = ",") then + begin + { Ein Eintrag der Worttabelle - letzter + (|cur_cmd|=|right_brace|) - gelesen } + if k>0 then eintragen(zeile,k); { ein Eintrag vorhanden } + if cur_cmd = right_brace then goto done; + k := 0; { hyf[] ist \"uberfl\"ussig, da die + Trenninformation in zeile mitverpackt ist. } + end + else { Das Wort ist noch nicht fertig gelesen } + if (cur_cmd = letter) or (cur_cmd = other_char) + or (cur_cmd = spacer) or (cur_chr = ".") + then begin + @<Append a new letter or a hyphen level@>; + end else begin + print_err("Bad "); print_esc("patterns"); +@.Bad \\patterns@> + help1("(See Appendix H.)"); error; + end; +end; {|loop|} +done: +@z + +----------------------------------------------------------------------------- + + +@x +@ @<Append a new letter or a hyphen level@>= +if digit_sensed or(cur_chr<"0")or(cur_chr>"9") then + begin if cur_chr="." then cur_chr:=0 {edge-of-word delimiter} + else begin cur_chr:=lc_code(cur_chr); + if cur_chr=0 then + begin print_err("Nonletter"); +@.Nonletter@> + help1("(See Appendix H.)"); error; + end; + end; + if k<63 then + begin incr(k); hc[k]:=cur_chr; hyf[k]:=0; digit_sensed:=false; + end; + end +else if k<63 then + begin hyf[k]:=cur_chr-"0"; digit_sensed:=true; + end +@y +@ @<Append a new letter or a hyphen level@>= +if (cur_chr<>" ")then begin + { Das Leerzeichen wird \"uberlesen! } + if (cur_chr <> ".") then begin + { der Punkt trennt die Silbe von der Silbenart und bleibt erhalten } + if (cur_chr<"0")or(cur_chr>"9") then begin + cur_chr:=lc_code(cur_chr); + if cur_chr=0 then begin + print_err("Nonletter"); +@.Nonletter@> + help1("(See Appendix H.)"); error; cur_chr:=128; + end; + end; + end; + if k<63 then begin + incr(k); zeile[k]:=cur_chr; + end; +end; +@z + +---------------------------------------------------------------------------- + + +@x +@ When the following code comes into play, the pattern $p_1\ldots p_k$ +appears in |hc[1..k]|, and the corresponding sequence of numbers $n_0\ldots +n_k$ appears in |hyf[0..k]|. + +@<Insert a new pattern into the linked trie@>= +begin @<Compute the trie op code, |v|, and set |l:=0|@>; +q:=0; hc[0]:=cur_lang; +while l<=k do + begin c:=hc[l]; incr(l); p:=trie_l[q]; first_child:=true; + while (p>0)and(c>so(trie_c[p])) do + begin q:=p; p:=trie_r[q]; first_child:=false; + end; + if (p=0)or(c<so(trie_c[p])) then + @<Insert a new trie node between |q| and |p|, and + make |p| point to it@>; + q:=p; {now node |q| represents $p_1\ldots p_l$} + end; +if trie_o[q]<>min_quarterword then + begin print_err("Duplicate pattern"); +@.Duplicate pattern@> + help1("(See Appendix H.)"); error; + end; +trie_o[q]:=v; +end +@y +@ Well, that was everything about the initialization of the \SISISI hash +table (at this place). + +All following sections, describing the initialization of the trie are +replaced by ``empty sections'' in order to have same section numbering +in SI\TeX as in \TeX. +@z + +---------------------------------------------------------------------------- + +@x +@ @<Insert a new trie node between |q| and |p|...@>= +begin if trie_ptr=trie_size then overflow("pattern memory",trie_size); +@:TeX capacity exceeded pattern memory}{\quad pattern memory@> +incr(trie_ptr); trie_r[trie_ptr]:=p; p:=trie_ptr; trie_l[p]:=0; +if first_child then trie_l[q]:=p@+else trie_r[q]:=p; +trie_c[p]:=si(c); trie_o[p]:=min_quarterword; +end +@y +@ ``Empty section''. +@z +------------------------------------------------------------------------------ +@x +@ @<Compute the trie op code, |v|...@>= +if hc[1]=0 then hyf[0]:=0; +if hc[k]=0 then hyf[k]:=0; +l:=k; v:=min_quarterword; +loop@+ begin if hyf[l]<>0 then v:=new_trie_op(k-l,hyf[l],v); + if l>0 then decr(l)@+else goto done1; + end; +done1: +@y +@ Further ``empty section''. +@z + +@x +@ Finally we put everything together: Here is how the trie gets to its +final, efficient form. +The following packing routine is rigged so that the root of the linked +tree gets mapped into location 1 of |trie|, as required by the hyphenation +algorithm. This happens because the first call of |first_fit| will +``take'' location~1. + +@<Declare procedures for preprocessing hyphenation patterns@>= +procedure init_trie; +var @!p:trie_pointer; {pointer for initialization} +@!j,@!k,@!t:integer; {all-purpose registers for initialization} +@!r,@!s:trie_pointer; {used to clean up the packed |trie|} +@!h:two_halves; {template used to zero out |trie|'s holes} +begin @<Get ready to compress the trie@>; +if trie_root<>0 then + begin first_fit(trie_root); trie_pack(trie_root); + end; +@y +@ Because we do not use the trie, we fill it with dummy data. +But the main reason, why we do not remove this procedure is, that +it is called and the used variables are referenced somewhere in \TeX. + + +@<Declare procedures for preprocessing hyphenation patterns@>= +procedure init_trie; + var @!p:trie_pointer; {pointer for initialization} + @!j,@!k,@!t:integer; {all-purpose registers for initialization} + @!r,@!s:trie_pointer; {used to clean up the packed |trie|} + @!h:two_halves; {template used to zero out |trie|'s holes} +begin + trie_root:=0; +@z + +========================================================================= + diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch new file mode 100644 index 0000000000..8508485c3a --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch @@ -0,0 +1,1938 @@ +% Change file for TeX in C, derived from various other change files. +% By Tim Morgan, UC Irvine ICS Department, and many others. +% +% Modification history: +% (05/28/86) ETM Started with TeX 2.0 +% (06/03/87) ETM Brought up to TeX 2.2 +% (09/26/87) ETM Brought up to TeX 2.3 +% (10/01/87) ETM Brought up to TeX 2.5 +% (12/21/87) ETM Brought up to TeX 2.7 +% (01/14/88) ETM Brought up to TeX 2.9 +% (02/20/88) PAM Revised format and module numbers +% (03/01/88) ETM Eliminated some unused variables and unnecesary tests +% (05/09/88) ETM Added yet another casting bug fix +% (06/21/88) ETM Brought up to TeX version 2.93 +% (12/11/88) ETM Brought up to TeX version 2.94 +% (01/12/89) PAM Brought up to TeX version 2.95 +% (02/14/89) ETM Brought up to TeX version 2.96 +% (03/10/89) ETM Brought up to TeX version 2.98 +% (07/06/89) ETM Brought up to TeX version 2.991 +% (11/30/89) KB To version 2.992 (8-bit). +% (01/10/90) SR To version 2.993. +% (03/27/90) KY To version 3.0. +% (more recent changes in ../ChangeLog.W2C and ChangeLog) +% +% The module numbers in this change file refer to the published text in +% TeX: The Program, Volume B of Computers&Typesetting, 1986. + + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [0] WEAVE: print changes only. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + \def\?##1]{\hbox to 1in{\hfil##1.\ }} + } +@y + \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }} + } +\let\maybe=\iffalse +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.2] banner +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92}' +@y +@d banner=='This is TeX, C Version 3.141 (+SISISI 1.0) {+iSi 92}' +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.4] program header +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Actually the heading shown here is not quite normal: The |program| line +does not mention any |output| file, because \ph\ would ask the \TeX\ user +to specify a file name if |output| were specified here. +@^system dependencies@> + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +program TEX; {all file names are defined dynamically} +label @<Labels in the outer block@>@/ +@y + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +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; + {key control points} +@y +@<Labels in the outer block@>= +start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end; + {key control points} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.7] debug..gubed, stat..tats +% Here we change these WEB symbols, which are used much as #ifdef's +% are 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] Same, for `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] Turn off all 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: some enlarged, dvi_buf_size 16K for +% BSD I/O, file_name_size is set from the system constant. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Constants...@>= +@!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:ISITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@y +@d file_name_size == PATH_MAX + +@<Constants...@>= +@!mem_max=262140; {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=3000; {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=100000; {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=15000; {maximum number of strings; must not exceed |max_halfword|} +@!string_vacancies=100000; {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=124000; {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=24000; {space for hyphenation patterns; should be larger for + \.{INITEX} than it is in production versions of \TeX} +@!trie_op_size=750; {space for ``opcodes'' in the hyphenation patterns} +@!neg_trie_op_size=-750; {for lower trie_op_hash array bound} +@!min_trie_op=0; {first possible trie op code for any language} +@!max_trie_op=500; {largest possible trie op code for any language} +@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8} +@!pool_name='isitex.pool'; {name comes from \.{site.h}.} + {string of length |file_name_size|; tells where the string pool appears} +@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX}; + must be substantially larger than |mem_bot| + and not greater than |mem_max|} +@!nil=0; {Because web2c is too stupid to recognize Pascal's nil-pointer; HH} +@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 it is a ``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), since to needs +% to be changed for the trip test. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=9500 {maximum number of control sequences; it should be at most + about |(mem_max-mem_min)/10|} +@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|} +@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.16] Use C macros for `incr' and `decr'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d incr(#) == #:=#+1 {increase a variable by unity} +@d decr(#) == #:=#-1 {decrease a variable by unity} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] The text_char type is used as an array index into xord. The +% default type `char' produces signed integers, which are bad array +% indices in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d text_char == char {the data type of characters in text files} +@y +@d text_char == ASCII_code {the data type of characters in text files} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [2.23] Allow any character as input. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +for i:=0 to @'37 do xchr[i]:=' '; +for i:=@'177 to @'377 do xchr[i]:=' '; +@y +for i:=0 to @'37 do xchr[i]:=chr(i); +for i:=@'177 to @'377 do xchr[i]:=chr(i); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.25] Remove file types we don't need. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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.27] Do file opening in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 are defined in C. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.28] Do file closing in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 the file closing routines as well. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.31] Do `input_ln' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 define |input_ln| in C, for efficiency. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.32] `term_in' and `term_out' are standard input and output. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!term_in:alpha_file; {the terminal as an input file} +@!term_out:alpha_file; {the terminal as an output file} +@y +@d term_in==stdin {the terminal as an input file} +@d term_out==stdout {the terminal as an output file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.33] We 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 defined in C. + +@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} +@y +these operations can be specified with {\mc UNIX}. |update_terminal| +does an |fflush| (via the macro |flush|). |clear_terminal| is redefined +to do nothing, since the user should control the terminal. +@^system dependencies@> + +@d update_terminal == flush (term_out) +@d clear_terminal == do_nothing +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.37] Reading 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} +label exit; +begin t_open_in; +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); + if loc<last then + begin init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out,'Please type the name of your input file.'); + end; +exit:end; +@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@> + +@p +function init_terminal:boolean; {gets the terminal input started} +label exit; +begin + t_open_in; + 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; write(term_out, '**'); update_terminal; +@.**@> + if not input_ln(term_in,true) then begin {this shouldn't happen} + 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); + + if loc<last then begin + init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out, 'Please type the name of your input file.'); + end; +exit: +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51] Open the pool file using a path, and can't do string +% assignments directly. (`strcpy' and `strlen' work here because +% `pool_name' is a constant string, and thus ends in a null and doesn't +% start with a space.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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); {copy the string} +name_of_file[0] := ' '; +name_of_file[strlen (pool_name) +1 ] := ' '; +name_length := strlen (pool_name); +if a_open_in (pool_file, TEX_POOL_PATH) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how +% it's read. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else bad_pool('! I can''t read ISITEX3.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 isitex.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('! isitex.pool has no check sum.'); +@.TEX.POOL has no check sum@> +read(pool_file,m); read(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('! isitex.pool line doesn''t begin with two digits.'); +@z +@x + bad_pool('! TEX.POOL check sum doesn''t have nine digits.'); +@y + bad_pool('! isitex.pool check sum doesn''t have nine digits.'); +@z +@x +done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.'); +@y +done: if a<>@$ then bad_pool('! isitex.pool doesn''t match; tangle me again.'); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [5.61] Eliminate the misleading message ``(no format preloaded)''. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if format_ident=0 then wterm_ln(' (no format preloaded)') +else begin slow_print(format_ident); print_ln; + end; +@y +if format_ident>0 then slow_print(format_ident); +print_ln; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [6.81] Eliminate nonlocal goto, since C doesn't have them. +% 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'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Error hand...@>= +procedure jump_out; +begin goto end_of_TEX; +end; +@y +@d do_final_end==begin + update_terminal; + 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.84] Implement the switch-to-editor option. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +line ready to be edited. But such an extension requires some system +wizardry, so the present implementation simply types out the name of the +file that should be +edited and the relevant line number. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@y +line ready to be edited. +We do this by calling the external procedure |call_edit| with a pointer to +the filename, its length, and the line number. +However, here we just set up the variables that will be used as arguments, +since we don't want to do the switch-to-editor until after TeX has closed +its files. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@d edit_file==input_stack[base_ptr] +@z +@x +"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; +@y +"E": if base_ptr>0 then + begin + edit_name_start:=str_start[edit_file.name_field]; + edit_name_length:=str_start[edit_file.name_field+1] - + str_start[edit_file.name_field]; + edit_line:=line; + jump_out; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.104] `remainder' is a library routine on some systems, so change +% its name to avoid conflicts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!arith_error:boolean; {has arithmetic overflow occurred recently?} +@!remainder:scaled; {amount subtracted to get an exact division} +@y +@d remainder == tex_remainder +@<Glob...@>= +@!arith_error:boolean; {has arithmetic overflow occurred recently?} +@!remainder:scaled; {amount subtracted to get an exact division} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.109] Define glue_ratio in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!glue_ratio=real; {one-word representation of a glue expansion factor} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.110] Make it easy to build a bigger TeX. (Nothing is changed in +% the basic version.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=255 {largest allowable value in a |quarterword|} +@d min_halfword==0 {smallest allowable value in a |halfword|} +@d max_halfword==262143 {largest allowable value in a |halfword|} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.112] Efficiency. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +@^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 +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +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] We've put the memory structure into the include file +% `texmf.h', since it's too hard to translate automatically. Also, +% remove the `word_file' type. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!quarterword = min_quarterword..max_quarterword; {1/4 of a word} +@!halfword=min_halfword..max_halfword; {1/2 of a word} +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@!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 +@!quarterword=min_quarterword..max_quarterword; +@!halfword=min_halfword..max_halfword; +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@=#include "texmfmem.h";@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [9.116] Change `mem' to `zmem', so 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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [11.165] Fix the word `free' so that it doesn't conflict with the +% standard C library routine of the same name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) +@y +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) + +@d free==free_arr +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.174,176] Eliminate some unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + begin if (font(p)<font_base)or(font(p)>font_max) then + print_char("*") +@y + begin if (font(p)>font_max) then + print_char("*") +@z + +@x +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*") +@y +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)>font_max) then print_char("*") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.186] Don't worry about strange floating point values. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if glue_sign(p)=shrinking then print("- "); + if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?") + else if abs(g)>float_constant(20000) then +@y + if glue_sign(p)=shrinking then print("- "); + { The Unix |pc| folks removed this restriction with a remark that + invalid bit patterns were vanishingly improbable, so we follow + their example without really understanding it. + |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')| + |else| } + if fabs(g)>float_constant(20000) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [17.241] Do `fix_date_and_time' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +@^system dependencies@> +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 +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +It calls a macro-defined |date_and_time| routine. |date_and_time| +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. +@^system dependencies@> + +@d fix_date_and_time==date_and_time(time,day,month,year) +@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.262] Remove more unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@y +else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.513] Area and extension rules for filenames. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\.>' or `\.:', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the first +remaining `\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep track +of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any} +@!ext_delimiter:pool_pointer; {the relevant `\..', if any} +@y +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\./', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the last +`\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep +track of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\./', if any} +@!ext_delimiter:pool_pointer; {the most recent `\..', if any} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.514] TeX area directories. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d TEX_area=="TeXinputs:" +@.TeXinputs@> +@d TEX_font_area=="TeXfonts:" +@.TeXfonts@> +@y +In C, the default paths are specified in a separate +file, \.{site.h}. The file opening procedures do path searching +based either on those default paths, or on paths given by the user +in environment variables. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.516] more_name +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c=">")or(c=":") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length; +@y +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c="/") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if c="." then ext_delimiter:=cur_length; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.519] In pack_file_name, leave room for the extra null we append at +% the end of a filename in make_c_string. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if k<=file_name_size then name_length:=k@+else name_length:=file_name_size; +@y +if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.520] The 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} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@y +Under {\mc UNIX} we don't give the area part, instead depending +on the path searching that will happen during file opening. Also, the +length will be set in the main program. + +@d format_area_length=0 {length of its area part} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.521] Where `plain.fmt' is. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!TEX_format_default:packed array[1..format_default_length] of char; + +@ @<Set init...@>= +TEX_format_default:='TeXformats:plain.fmt'; +@y +@!format_default_length: integer; +@!TEX_format_default: c_char_pointer; + +@ We set the name of the default format file and the length of that name +in C, instead of Pascal, since we want them to depend on the name of the +program. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.523] Change to pack_buffered_name as with pack_file_name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if k<=file_name_size then name_length:=k@+else name_length:=file_name_size; +@y +if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.524] Format file opening: only try once, with path searching. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + pack_buffered_name(0,loc,j-1); {try first without the system file area} + if w_open_in(fmt_file) then goto found; + 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 + pack_buffered_name(0,loc,j-1); + if w_open_in(fmt_file) then goto found; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% (still [29.524]) replace `PLAIN' in error messages with `default'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.'); +@y + wterm_ln('Sorry, I can''t find that format;',' will try the default.'); +@z +@x + wterm_ln('I can''t find the PLAIN format file!'); +@.I can't find PLAIN...@> +@y + wterm_ln('I can''t find the default format file!'); +@.I can't find default format...@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.532] `logname' is declared in <unistd.h> on some systems. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +ship out a box of stuff, we shall use the macro |ensure_dvi_open|. +@y +ship out a box of stuff, we shall use the macro |ensure_dvi_open|. + +@d log_name == texmf_log_name +@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 + +@x +months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@y +months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Use a path when calling a_open_in to do a \input; also, try +% to open the file with and without the `.tex' extension, regardless of +% whether the file already has an extension. This allows filenames like +% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if cur_ext="" then cur_ext:=".tex"; +pack_cur_name; +loop@+ begin begin_file_reading; {set up |cur_file| and new level of input} + 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 +pack_cur_name; {Try with |".tex"|.} +loop@+begin + begin_file_reading; {set up |cur_file| and new level of input} + {Don't add |".tex"| if it's already there, + don't overflow |name_of_file|, + and don't add |".tex"| if |"foo"| and |"foo.tex"| are really the same + file, because of operating-system filename length limitations (e.g., + |"afourteenlongf"| and |"afourteenlongf.tex"| under System V).} + if (cur_ext <> ".tex") and (name_length + 5 < file_name_size) + and (not extension_irrelevant_p (name_of_file, 'tex')) + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + {Try without |".tex"|.} + if cur_ext = ".tex" then cur_ext := ""; + pack_cur_name; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; +@z + +% Knuth should fix this bug. +@x +if term_offset+length(name)>max_print_line-2 then print_ln +@y +if term_offset+length(name)>max_print_line-3 then print_ln +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Get rid of return of filename to string pool. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if name=str_ptr-1 then {we can conserve string pool space now} + begin flush_string; name:=cur_name; + end; +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [30.563] Fix TFM file opening. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +file_opened:=false; +if aire="" then pack_file_name(nom,TEX_font_area,".tfm") +else pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@y +file_opened:=false; +pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [32.597] We only want `eof' on the TFM file to be true if we +% previously had EOF, not if we're at EOF now. This is like `feof', and +% unlike our implementation of `eof' elsewhere. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if eof(tfm_file) then abort; +@y +if feof(tfm_file) then abort; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [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.875] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +repeat if type(r)<>delta_node then + begin line_diff:=line_number(r)-best_line; +@y +repeat if type(r)<>delta_node then + begin line_diff:=toint(line_number(r))-toint(best_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [42.920,921,923,924] Allow larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Comparatively few different number sequences $n_0\ldots n_k$ actually occur, +since most of the |n|'s are generally zero. Therefore the number sequences +are encoded in such a way that |trie_op|$(z_k)$ is only one byte long. +If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|. +@y +The theory that comparatively few different number sequences $n_0\ldots n_k$ +actually occur, since most of the |n|'s are generally zero, seems to fail +at least for the large German hyphenation patterns. +Therefore the number sequences cannot any longer be encoded in such a way +that |trie_op|$(z_k)$ is only one byte long. +We have introduced a new constant |max_trie_op| for the maximum allowable +hyphenation operation code value; |max_trie_op| might be different for +\TeX\ and \.{INITEX} and must not exceed |max_halfword|. +An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword| +or a quarterword otherwise. +@^system dependencies@> +If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|. +@z +@x +@!trie_pointer=0..trie_size; {an index into |trie|} +@y +@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode} +@!trie_pointer=0..trie_size; {an index into |trie|} +@z +@x +@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie} +@d trie_char(#)==trie[#].b1 {character matched at this trie location} +@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location} +@y +@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|, +and |trie_op| will no longer fit into one memory word; thus using web2c +we define |trie| as three array instead of an array of records. +The variant will be implented by reusing the opcode field later on with +another macro. +@d trie_link(#)==trie_trl[#] {``downward'' link in a trie} +@d trie_char(#)==trie_trc[#] {character matched at this trie location} +@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location} +@z +@x +@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|} +@y +@!trie_trl:array[trie_pointer] of halfword; {|trie_link|} +@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|} +@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|} +@z +@x +@!hyf_next:array[1..trie_op_size] of quarterword; {continuation code} +@y +@!hyf_next:array[1..trie_op_size] of trie_opcode; {continuation code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943] Larger tries, also in documentation parts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +|hyf_next[@t$v^\prime$@>]=min_quarterword|. +@y +|hyf_next[@t$v^\prime$@>]=min_trie_op|. +@z +@x +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad +@y +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.?] Hack around the negative lower bound here. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The hash table is called |trie_op_hash|, and the number of entries it contains +is |trie_op_ptr|. + +@<Glob...@>= +@!init@! trie_op_hash:array[-trie_op_size..trie_op_size] of 0..trie_op_size; +@y +The hash table is called |trie_op_hash|, and the number of entries it contains +is |trie_op_ptr|. + +@<Glob...@>= +@!init@! trie_op_hash:array[neg_trie_op_size..trie_op_size] of 0..trie_op_size; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943,944] Larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!trie_used:array[ASCII_code] of quarterword; +@y +@!trie_used:array[ASCII_code] of trie_opcode; +@z +@x +@!trie_op_val:array[1..trie_op_size] of quarterword; +@y +@!trie_op_val:array[1..trie_op_size] of trie_opcode; +@z +@x +tini +@y +tini@; +@!max_op_used:trie_opcode; {largest opcode used for any language} +@!small_op:boolean; {flag used while dumping or undumping} +@z +@x +|new_trie_op| could return |min_quarterword| (thereby simply ignoring +@y +|new_trie_op| could return |min_trie_op| (thereby simply ignoring +@z +@x +function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword; +label exit; +var h:-trie_op_size..trie_op_size; {trial hash location} +@!u:quarterword; {trial op code} +@y +function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode; +label exit; +var h:neg_trie_op_size..trie_op_size; {trial hash location} +@!u:trie_opcode; {trial op code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +begin h:=abs(n+313*d+361*v+1009*cur_lang) mod (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+trie_op_size) +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944,945,946] And larger tries again. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if u=max_quarterword then + overflow("pattern memory ops per language", + max_quarterword-min_quarterword); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; +@y + if u=max_trie_op then + overflow("pattern memory ops per language", + max_trie_op-min_trie_op); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; + if u>max_op_used then max_op_used:=u; +@z +@x +op_start[0]:=-min_quarterword; +@y +op_start[0]:=-min_trie_op; +@z +@x +for k:=0 to 255 do trie_used[k]:=min_quarterword; +@y +for k:=0 to 255 do trie_used[k]:=min_trie_op; +@z +@x +trie_op_ptr:=0; +@y +max_op_used:=min_trie_op; +trie_op_ptr:=0; +@z +@x +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword; +@y +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.950,958,960,963] Larger tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d trie_back(#)==trie[#].lh {backward links in |trie| holes} +@y +@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links} +@z +@x +@<Move the data into |trie|@>= +h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|, + |trie_op:=min_quarterword|, |trie_char:=qi(0)|} +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do trie[r]:=h; +@y +@d clear_trie == {clear |trie[r]|} + begin trie_link(r):=0; + trie_op(r):=min_trie_op; + trie_char(r):=min_quarterword; {|trie_char:=qi(0)|} + end +@<Move the data into |trie|@>= +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do clear_trie; +@z +@x + repeat s:=trie_link(r); trie[r]:=h; r:=s; +@y + repeat s:=trie_link(r); clear_trie; r:=s; +@z +@x + @!h:two_halves; {template used to zero out |trie|'s holes} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [49.1275] Same stuff as for \input, this time for \openin. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if cur_ext="" then cur_ext:=".tex"; + pack_cur_name; + if a_open_in(read_file[n]) then read_open[n]:=just_open; +@y + pack_cur_name; {Try with |".tex"|.} + if (cur_ext <> ".tex") and (name_length + 5 < file_name_size) + and (not extension_irrelevant_p (name_of_file, 'tex')) + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open + else begin + if cur_ext = ".tex" then cur_ext := ""; + pack_cur_name; {Try without |".tex"|.} + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open; + end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1302] Eliminate now-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} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1303] Ditto, for `load_fmt_file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!x: integer; {something undumped} +@!w: four_quarters; {four ASCII codes} +@y +@!x: integer; {something undumped} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.??] Do reading and writing of `fmt_file' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@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 +@z + +@x +@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 +@z + +@x +x:=fmt_file^.int; +@y +undump_int(x); {This reads the first word of the \.{.fmt} file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] Make dumping/undumping more efficient. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +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 +dump_things(str_start[0], str_ptr+1); +dump_things(str_pool[0], pool_ptr); +@z + +@x +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 +undump_things(str_start[0], str_ptr+1); +undump_things(str_pool[0], pool_ptr); +@z + +@x +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 +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 + +@x +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 +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 +for k:=hi_mem_min to mem_end do undump_wd(mem[k]); +@y +undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +for j:=k to k+x-1 do undump_wd(eqtb[j]); +@y +undump_things(eqtb[k], x); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]); +@y +dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]); +@y +undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +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 +@<Dump the array info for internal font number |k|@>; +@z + +@x +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 +@<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 +@ @<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 +@ @<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); +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.1322] Reading font info for C (nearly done with undump stuff). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ @<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)(font_mem_size)(bchar_label[k]); +undump(min_quarterword)(non_char)(font_bchar[k]); +undump(min_quarterword)(non_char)(font_false_bchar[k]); +end +@y +@ 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); +end +@z + +% The hyphenation patterns. +% +@x +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 +dump_things(trie_trl[0], trie_max+1); +dump_things(trie_tro[0], trie_max+1); +dump_things(trie_trc[0], trie_max+1); +dump_int(trie_op_ptr); +dump_things(hyf_distance[1], trie_op_ptr); +dump_things(hyf_num[1], trie_op_ptr); +dump_things(hyf_next[1], trie_op_ptr); +@z + +@x +for k:=0 to j do undump_hh(trie[k]); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +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 +undump_things(trie_trl[0], j+1); +undump_things(trie_tro[0], j+1); +undump_things(trie_trc[0], j+1); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +undump_things(hyf_distance[1], j); +undump_things(hyf_num[1], j); +undump_things(hyf_next[1], j); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1327] As with TFM files, `eof' here means `have we previously +% encountered the end-of-file', not `are we at the end of the file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if (x<>69069)or eof(fmt_file) then goto bad_fmt +@y +if (x<>69069)or feof(fmt_file) then goto bad_fmt +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +print(" (preloaded format="); print(job_name); print_char(" "); +@y +print(" (format="); print(job_name); print_char(" "); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1332] `uexit' argument depends on `history'; add call to +% set_paths; make the main program a procedure, so that uses of `eqtb' +% will work. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@p begin @!{|start_here|} +@y +@p procedure tex_body; +begin @!{|start_here|} +@z + +@x +t_open_out; {open the terminal for output} +@y +t_open_out; {open the terminal for output} +{get default file paths from the environment} +set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT + + TFM_FILE_PATH_BIT); +@z + +@x +end_of_TEX: close_files_and_terminate; +final_end: ready_already:=0; +end. +@y +close_files_and_terminate; +final_end: do_final_end; +end {|tex_body|}; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1333] Print new line before termination; switch to editor if +% necessary. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + slow_print(log_name); print_char("."); + end; + end; +@y + slow_print(log_name); print_char("."); + end; + end; +print_ln; +if (edit_name_start<>0) and (interaction>batch_mode) then + call_edit(str_pool,edit_name_start,edit_name_length,edit_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [52.1338] Core-dump in debugging mode on 0 input. Under 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 + begin goto breakpoint;@\ {go to every label at least once} + breakpoint: m:=0; @{'BREAKPOINT'@}@\ + end +@y + dump_core {Do something to cause a core dump} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [54.1376] Add editor-switch variables to globals. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +This section should be replaced, if necessary, by any special +modifications of the program +that are necessary to make \TeX\ work at a particular installation. +It is usually best to design your change file so that all changes to +previous sections preserve the section numbering; then everybody's version +will be consistent with the published program. More extensive changes, +which introduce new sections, can be inserted here; then only the index +itself will get a new section number. +@^system dependencies@> +@y +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; +@z diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch.other b/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch.other new file mode 100644 index 0000000000..de3a033662 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/tex.ch.other @@ -0,0 +1,1965 @@ +% tex.ch for C compilation with web2c, derived from various other change files. +% By Tim Morgan, UC Irvine ICS Department, and many others. +% +% Modification history: +% (05/28/86) ETM Started with TeX 2.0 +% (06/03/87) ETM Brought up to TeX 2.2 +% (09/26/87) ETM Brought up to TeX 2.3 +% (10/01/87) ETM Brought up to TeX 2.5 +% (12/21/87) ETM Brought up to TeX 2.7 +% (01/14/88) ETM Brought up to TeX 2.9 +% (02/20/88) PAM Revised format and module numbers +% (03/01/88) ETM Eliminated some unused variables and unnecesary tests +% (05/09/88) ETM Added yet another casting bug fix +% (06/21/88) ETM Brought up to TeX version 2.93 +% (12/11/88) ETM Brought up to TeX version 2.94 +% (01/12/89) PAM Brought up to TeX version 2.95 +% (02/14/89) ETM Brought up to TeX version 2.96 +% (03/10/89) ETM Brought up to TeX version 2.98 +% (07/06/89) ETM Brought up to TeX version 2.991 +% (11/30/89) KB To version 2.992 (8-bit). +% (01/10/90) SR To version 2.993. +% (03/27/90) KY To version 3.0. +% (more recent changes in ChangeLog) +% +% The module numbers in this change file refer to the published text in +% TeX: The Program, Volume B of Computers&Typesetting. + + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [0] WEAVE: print changes only. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + \def\?##1]{\hbox to 1in{\hfil##1.\ }} + } +@y + \def\?##1]{\hbox{Changes to \hbox to 1em{\hfil##1}.\ }} + } +\let\maybe=\iffalse +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.2] banner +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92}' +@y +@d banner=='This is TeX, Version 3.141 (+SISISI 1.0) {+iSi 92}' {more is printed later} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.4] program header +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Actually the heading shown here is not quite normal: The |program| line +does not mention any |output| file, because \ph\ would ask the \TeX\ user +to specify a file name if |output| were specified here. +@^system dependencies@> + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +program TEX; {all file names are defined dynamically} +label @<Labels in the outer block@>@/ +@y + +@d mtype==t@&y@&p@&e {this is a \.{WEB} coding trick:} +@f mtype==type {`\&{mtype}' will be equivalent to `\&{type}'} +@f type==true {but `|type|' will not be treated as a reserved word} + +@p @t\4@>@<Compiler directives@>@/ +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; + {key control points} +@y +@<Labels in the outer block@>= +start_of_TEX@t\hskip-2pt@>, end_of_TEX@t\hskip-2pt@>,@,final_end; + {key control points} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.7] debug..gubed, stat..tats +% Here we change these WEB symbols, which are used much as #ifdef's +% are 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] Same, for `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] Turn off all 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: some enlarged, dvi_buf_size 16K for +% BSD I/O, file_name_size is set from the system constant. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Constants...@>= +@!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:ISITEX3.POOL '; + {string of length |file_name_size|; tells where the string pool appears} +@y +@d file_name_size == PATH_MAX + +@<Constants...@>= +@!mem_max=262140; {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=3000; {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=100000; {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=15000; {maximum number of strings; must not exceed |max_halfword|} +@!string_vacancies=100000; {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=124000; {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=30000; {space for hyphenation patterns; should be larger for + \.{INITEX} than it is in production versions of \TeX. This much is + needed for English, German, and Portuguese.} +@!trie_op_size=751; {space for ``opcodes'' in the hyphenation patterns; + should be relatively prime to 313, 361, and 1009, and prime.} +@!neg_trie_op_size=-751; {for lower |trie_op_hash| array bound; + must be equal to |-trie_op_size|.} +@!min_trie_op=0; {first possible trie op code for any language} +@!max_trie_op=500; {largest possible trie op code for any language} +@!dvi_buf_size=16384; {size of the output buffer; must be a multiple of 8} +@!pool_name='isitex.pool'; + {string of length |file_name_size|; tells where the string pool appears} +@!mem_top=262140; {largest index in the |mem| array dumped by \.{INITEX}; + must be substantially larger than |mem_bot|, + equal to |mem_max| in \.{INITEX}, else not greater than |mem_max|} +@!nil=0; {Because web2c is too stupid to recognize Pascal's nil-pointer; HH} +@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 it is a ``sensitive'' +% constant, we're going to make mem_top a #define in the C code for +% readability and ease of modification (it's up above) -- it needs +% to be changed for the trip test. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=9500 {maximum number of control sequences; it should be at most + about |(mem_max-mem_min)/10|} +@d hash_prime=7919 {a prime number equal to about 85\pct! of |hash_size|} +@d hyph_size=607 {another prime; the number of \.{\\hyphenation} exceptions} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [1.16] Use C macros for `incr' and `decr'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d incr(#) == #:=#+1 {increase a variable by unity} +@d decr(#) == #:=#-1 {decrease a variable by unity} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] The text_char type is used as an array index into xord. The +% default type `char' produces signed integers, which are bad array +% indices in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d text_char == char {the data type of characters in text files} +@y +@d text_char == ASCII_code {the data type of characters in text files} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [2.23] Allow any character as input. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +for i:=0 to @'37 do xchr[i]:=' '; +for i:=@'177 to @'377 do xchr[i]:=' '; +@y +for i:=0 to @'37 do xchr[i]:=chr(i); +for i:=@'177 to @'377 do xchr[i]:=chr(i); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.25] Remove file types we don't need. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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.27] Do file opening in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 are defined in C. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.28] Do file closing in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 the file closing routines as well. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.31] Do `input_ln' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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 define |input_ln| in C, for efficiency. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.32] `term_in' and `term_out' are standard input and output. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!term_in:alpha_file; {the terminal as an input file} +@!term_out:alpha_file; {the terminal as an output file} +@y +@d term_in==stdin {the terminal as an input file} +@d term_out==stdout {the terminal as an output file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.33] We 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 defined in C. + +@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} +@y +these operations can be specified with {\mc UNIX}. |update_terminal| +does an |fflush| (via the macro |flush|). |clear_terminal| is redefined +to do nothing, since the user should control the terminal. +@^system dependencies@> + +@d update_terminal == flush (term_out) +@d clear_terminal == do_nothing +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [3.37] Reading 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} +label exit; +begin t_open_in; +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); + if loc<last then + begin init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out,'Please type the name of your input file.'); + end; +exit:end; +@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@> + +@p +function init_terminal:boolean; {gets the terminal input started} +label exit; +begin + t_open_in; + 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; write(term_out, '**'); update_terminal; +@.**@> + if not input_ln(term_in,true) then begin {this shouldn't happen} + 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); + + if loc<last then begin + init_terminal:=true; + return; {return unless the line was all blank} + end; + write_ln(term_out, 'Please type the name of your input file.'); + end; +exit: +end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51] Open the pool file using a path, and can't do string +% assignments directly. (`strcpy' and `strlen' work here because +% `pool_name' is a constant string, and thus ends in a null and doesn't +% start with a space.) +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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); {copy the string} +name_of_file[0] := ' '; +name_of_file[strlen (pool_name) +1 ] := ' '; +name_length := strlen (pool_name); +if a_open_in (pool_file, TEX_POOL_PATH) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [4.51,52,53] Make `TEX.POOL' lowercase in messages, and change how +% it's read. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else bad_pool('! I can''t read ISITEX3.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 isitex.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('! isitex.pool has no check sum.'); +@.TEX.POOL has no check sum@> +read(pool_file,m); read(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('! isitex.pool line doesn''t begin with two digits.'); +@z +@x + bad_pool('! TEX.POOL check sum doesn''t have nine digits.'); +@y + bad_pool('! isitex.pool check sum doesn''t have nine digits.'); +@z +@x +done: if a<>@$ then bad_pool('! TEX.POOL doesn''t match; TANGLE me again.'); +@y +done: if a<>@$ then bad_pool('! isitex.pool doesn''t match; tangle me again.'); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [5.61] Eliminate the misleading message ``(no format preloaded)''. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +wterm(banner); +if format_ident=0 then wterm_ln(' (no format preloaded)') +else begin slow_print(format_ident); print_ln; + end; +@y +wterm (banner); +wterm (version_string); +if format_ident>0 then slow_print(format_ident); +print_ln; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [6.81] Eliminate nonlocal goto, since C doesn't have them. +% 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'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Error hand...@>= +procedure jump_out; +begin goto end_of_TEX; +end; +@y +@d do_final_end==begin + update_terminal; + 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.84] Implement the switch-to-editor option. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +line ready to be edited. But such an extension requires some system +wizardry, so the present implementation simply types out the name of the +file that should be +edited and the relevant line number. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@y +line ready to be edited. +We do this by calling the external procedure |call_edit| with a pointer to +the filename, its length, and the line number. +However, here we just set up the variables that will be used as arguments, +since we don't want to do the switch-to-editor until after TeX has closed +its files. +@^system dependencies@> + +There is a secret `\.D' option available when the debugging routines haven't +been commented~out. +@^debugging@> +@d edit_file==input_stack[base_ptr] +@z +@x +"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; +@y +"E": if base_ptr>0 then + begin + edit_name_start:=str_start[edit_file.name_field]; + edit_name_length:=str_start[edit_file.name_field+1] - + str_start[edit_file.name_field]; + edit_line:=line; + jump_out; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.104] `remainder' is a library routine on some systems, so change +% its name to avoid conflicts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@<Glob...@>= +@!arith_error:boolean; {has arithmetic overflow occurred recently?} +@!remainder:scaled; {amount subtracted to get an exact division} +@y +@d remainder == tex_remainder +@<Glob...@>= +@!arith_error:boolean; {has arithmetic overflow occurred recently?} +@!remainder:scaled; {amount subtracted to get an exact division} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [7.109] Define glue_ratio in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!glue_ratio=real; {one-word representation of a glue expansion factor} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.110] Make it easy to change constants. Do not increase +% max_quarterword without changing the memoryword structure in +% `texmfmem.h'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@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=255 {largest allowable value in a |quarterword|} +@d min_halfword==0 {smallest allowable value in a |halfword|} +@d max_halfword==262143 {largest allowable value in a |halfword|} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [8.112] Efficiency. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +@^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 +The inner loop of \TeX\ will run faster with respect to compilers +that don't optimize expressions like `|x+0|' and `|x-0|', if these +macros are simplified in the obvious way when |min_quarterword=0|. +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] We've put the memory structure into the include file +% `texmf.h', since it's too hard to translate automatically. Also, +% remove the `word_file' type. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!quarterword = min_quarterword..max_quarterword; {1/4 of a word} +@!halfword=min_halfword..max_halfword; {1/2 of a word} +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@!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 +@!quarterword=min_quarterword..max_quarterword; +@!halfword=min_halfword..max_halfword; +@!two_choices = 1..2; {used when there are two variants in a record} +@!four_choices = 1..4; {used when there are four variants in a record} +@=#include "texmfmem.h";@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [9.116] Change `mem' to `zmem', so 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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [11.165] Fix the word `free' so that it doesn't conflict with the +% standard C library routine of the same name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) +@y +been included. (You may want to decrease the size of |mem| while you +@^debugging@> +are debugging.) + +@d free==free_arr +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.174,176] Eliminate some unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + begin if (font(p)<font_base)or(font(p)>font_max) then + print_char("*") +@y + begin if (font(p)>font_max) then + print_char("*") +@z + +@x +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)<font_base)or(font(p)>font_max) then print_char("*") +@y +@p procedure print_font_and_char(@!p:integer); {prints |char_node| data} +begin if p>mem_end then print_esc("CLOBBERED.") +else begin if (font(p)>font_max) then print_char("*") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [12.186] Don't worry about strange floating point values. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if glue_sign(p)=shrinking then print("- "); + if abs(mem[p+glue_offset].int)<@'4000000 then print("?.?") + else if abs(g)>float_constant(20000) then +@y + if glue_sign(p)=shrinking then print("- "); + { The Unix |pc| folks removed this restriction with a remark that + invalid bit patterns were vanishingly improbable, so we follow + their example without really understanding it. + |if abs(mem[p+glue_offset].int)<@'4000000 then print('?.?')| + |else| } + if fabs(g)>float_constant(20000) then +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [17.241] Do `fix_date_and_time' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +@^system dependencies@> +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 +@ The following procedure, which is called just before \TeX\ initializes its +input and output, establishes the initial values of the date and time. +It calls a macro-defined |date_and_time| routine. |date_and_time| +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. +@^system dependencies@> + +@d fix_date_and_time==date_and_time(time,day,month,year) +@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.262] Remove more unsigned comparisons to zero. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else if (text(p)<0)or(text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@y +else if (text(p)>=str_ptr) then print_esc("NONEXISTENT.") +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.513] Area and extension rules for filenames. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\.>' or `\.:', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the first +remaining `\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep track +of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\.>' or `\.:', if any} +@!ext_delimiter:pool_pointer; {the relevant `\..', if any} +@y +@ The file names we shall deal with for illustrative purposes have the +following structure: If the name contains `\./', the file area +consists of all characters up to and including the final such character; +otherwise the file area is null. If the remaining file name contains +`\..', the file extension consists of all such characters from the last +`\..' to the end, otherwise the file extension is null. +@^system dependencies@> + +We can scan such file names easily by using two global variables that keep +track of the occurrences of area and extension delimiters: + +@<Glob...@>= +@!area_delimiter:pool_pointer; {the most recent `\./', if any} +@!ext_delimiter:pool_pointer; {the most recent `\..', if any} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.514] TeX area directories. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d TEX_area=="TeXinputs:" +@.TeXinputs@> +@d TEX_font_area=="TeXfonts:" +@.TeXfonts@> +@y +In C, the default paths are specified in a separate +file, \.{site.h}. The file opening procedures do path searching +based either on those default paths, or on paths given by the user +in environment variables. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.516] more_name +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c=">")or(c=":") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if (c=".")and(ext_delimiter=0) then ext_delimiter:=cur_length; +@y +else begin str_room(1); append_char(c); {contribute |c| to the current string} + if (c="/") then + begin area_delimiter:=cur_length; ext_delimiter:=0; + end + else if c="." then ext_delimiter:=cur_length; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.519] In pack_file_name, leave room for the extra null we append at +% the end of a filename in make_c_string. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if k<=file_name_size then name_length:=k@+else name_length:=file_name_size; +@y +if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.520] The 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} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@y +Under {\mc UNIX} we don't give the area part, instead depending +on the path searching that will happen during file opening. Also, the +length will be set in the main program. + +@d format_area_length=0 {length of its area part} +@d format_ext_length=4 {length of its `\.{.fmt}' part} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.521] Where `plain.fmt' is. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!TEX_format_default:packed array[1..format_default_length] of char; + +@ @<Set init...@>= +TEX_format_default:='TeXformats:plain.fmt'; +@y +@!format_default_length: integer; +@!TEX_format_default: c_char_pointer; + +@ We set the name of the default format file and the length of that name +in C, instead of Pascal, since we want them to depend on the name of the +program. +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.523] Change to pack_buffered_name as with pack_file_name. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if k<=file_name_size then name_length:=k@+else name_length:=file_name_size; +@y +if k<file_name_size then name_length:=k@+else name_length:=file_name_size-1; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.524] Format file opening: only try once, with path searching. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + pack_buffered_name(0,loc,j-1); {try first without the system file area} + if w_open_in(fmt_file) then goto found; + 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 + pack_buffered_name(0,loc,j-1); + if w_open_in(fmt_file) then goto found; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% (still [29.524]) replace `PLAIN' in error messages with `default'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + wterm_ln('Sorry, I can''t find that format;',' will try PLAIN.'); +@y + wterm_ln('Sorry, I can''t find that format;',' will try the default.'); +@z +@x + wterm_ln('I can''t find the PLAIN format file!'); +@.I can't find PLAIN...@> +@y + wterm_ln('I can''t find the default format file!'); +@.I can't find default format...@> +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.532] `logname' is declared in <unistd.h> on some systems. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +ship out a box of stuff, we shall use the macro |ensure_dvi_open|. +@y +ship out a box of stuff, we shall use the macro |ensure_dvi_open|. + +@d log_name == texmf_log_name +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.536] Adjust for C string conventions. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!months:packed array [1..36] of char; {abbreviations of month names} +@y +@!months:c_char_pointer; +@z + +@x +begin wlog(banner); +slow_print(format_ident); print(" "); +print_int(day); print_char(" "); +months:='JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@y +begin wlog (banner); +wlog (version_string); +slow_print(format_ident); print(" "); +print_int(day); print_char(" "); +months := ' JANFEBMARAPRMAYJUNJULAUGSEPOCTNOVDEC'; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Use a path when calling a_open_in to do a \input; also, try +% to open the file with and without the `.tex' extension, regardless of +% whether the file already has an extension. This allows filenames like +% `foo' and `foo.bar.tex', as well as `foo.tex' and `foo.bar'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if cur_ext="" then cur_ext:=".tex"; +pack_cur_name; +loop@+ begin begin_file_reading; {set up |cur_file| and new level of input} + 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 +pack_cur_name; {Try with |".tex"|.} +loop@+begin + begin_file_reading; {set up |cur_file| and new level of input} + {Don't add |".tex"| if it's already there, + if it would overflow |name_of_file|, + or if |"foo"| and |"foo.tex"| are really the same + file, because of operating-system filename length limitations (e.g., + |"afourteenlongf"| and |"afourteenlongf.tex"| under System V).} + if (cur_ext <> ".tex") and (name_length + 5 < file_name_size) + and (not extension_irrelevant_p (name_of_file, 'tex')) + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + + {Try without |".tex"|.} + if cur_ext = ".tex" then cur_ext := ""; + pack_cur_name; + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + + {Couldn't find the file. Put |".tex"| back into the filename if we + removed it, and then invoke an external program. If it succeeds, try + opening the file once more.} + if cur_ext = "" then begin + cur_ext := ".tex"; + pack_cur_name; + end; + if make_tex_tex then begin + if a_open_in (cur_file, TEX_INPUT_PATH) then goto done; + end; +@z + +% Knuth should fix this -- sometimes lines go over the |max_print_line|. +% I don't remember what caused this, so I'll comment this out until it +% happens again. +% @x +% if term_offset+length(name)>max_print_line-2 then print_ln +% @y +% if term_offset+length(name)>max_print_line-3 then print_ln +% @z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [29.537] Get rid of return of filename to string pool. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if name=str_ptr-1 then {we can conserve string pool space now} + begin flush_string; name:=cur_name; + end; +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [30.563] Don't use font_area's in TFM opening, and invoke an external +% program if the first open fails. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +file_opened:=false; +if aire="" then pack_file_name(nom,TEX_font_area,".tfm") +else pack_file_name(nom,aire,".tfm"); +if not b_open_in(tfm_file) then abort; +file_opened:=true +@y +file_opened := false; +pack_file_name (nom, aire, ".tfm"); +if not b_open_in(tfm_file) then begin + if make_tex_tfm then begin + if not b_open_in(tfm_file) then abort; + end else + abort; +end; +file_opened:=true +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [32.597] We only want `eof' on the TFM file to be true if we +% previously had EOF, not if we're at EOF now. This is like `feof', and +% unlike our implementation of `eof' elsewhere. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if eof(tfm_file) then abort; +@y +if feof(tfm_file) then abort; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [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.875] Another casting problem. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +repeat if type(r)<>delta_node then + begin line_diff:=line_number(r)-best_line; +@y +repeat if type(r)<>delta_node then + begin line_diff:=toint(line_number(r))-toint(best_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [42.920,921,923,924] Allow larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +Comparatively few different number sequences $n_0\ldots n_k$ actually occur, +since most of the |n|'s are generally zero. Therefore the number sequences +are encoded in such a way that |trie_op|$(z_k)$ is only one byte long. +If |trie_op(@t$z_k$@>)<>min_quarterword|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_quarterword|. +@y +The theory that comparatively few different number sequences $n_0\ldots n_k$ +actually occur, since most of the |n|'s are generally zero, seems to fail +at least for the large German hyphenation patterns. +Therefore the number sequences cannot any longer be encoded in such a way +that |trie_op|$(z_k)$ is only one byte long. +We have introduced a new constant |max_trie_op| for the maximum allowable +hyphenation operation code value; |max_trie_op| might be different for +\TeX\ and \.{INITEX} and must not exceed |max_halfword|. +An opcode will occupy a halfword if |max_trie_op| exceeds |max_quarterword| +or a quarterword otherwise. +@^system dependencies@> +If |trie_op(@t$z_k$@>)<>min_trie_op|, when $p_1\ldots p_k$ has matched +the letters in |hc[(l-k+1)..l@,]| of language |t|, +we perform all of the required operations +for this pattern by carrying out the following little program: Set +|v:=trie_op(@t$z_k$@>)|. Then set |v:=v+op_start[t]|, +|hyf[l-hyf_distance[v]]:=@tmax@>(hyf[l-hyf_distance[v]], hyf_num[v])|, +and |v:=hyf_next[v]|; repeat, if necessary, until |v=min_trie_op|. +@z +@x +@!trie_pointer=0..trie_size; {an index into |trie|} +@y +@!trie_opcode=min_trie_op..max_trie_op; {a trie opcode} +@!trie_pointer=0..trie_size; {an index into |trie|} +@z +@x +@ @d trie_link(#)==trie[#].rh {``downward'' link in a trie} +@d trie_char(#)==trie[#].b1 {character matched at this trie location} +@d trie_op(#)==trie[#].b0 {program for hyphenation at this trie location} +@y +@ For more than 255 trie op codes, the three fields |trie_link|, |trie_char|, +and |trie_op| will no longer fit into one memory word; thus using web2c +we define |trie| as three array instead of an array of records. +The variant will be implented by reusing the opcode field later on with +another macro. +@d trie_link(#)==trie_trl[#] {``downward'' link in a trie} +@d trie_char(#)==trie_trc[#] {character matched at this trie location} +@d trie_op(#)==trie_tro[#] {program for hyphenation at this trie location} +@z +@x +@!trie:array[trie_pointer] of two_halves; {|trie_link|, |trie_char|, |trie_op|} +@y +@!trie_trl:array[trie_pointer] of halfword; {|trie_link|} +@!trie_tro:array[trie_pointer] of halfword; {|trie_op| and |trie_link|} +@!trie_trc:array[trie_pointer] of quarterword; {|trie_char|} +@z +@x +@!hyf_next:array[1..trie_op_size] of quarterword; {continuation code} +@y +@!hyf_next:array[1..trie_op_size] of trie_opcode; {continuation code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943] Larger tries, also in documentation parts. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +|hyf_next[@t$v^\prime$@>]=min_quarterword|. +@y +|hyf_next[@t$v^\prime$@>]=min_trie_op|. +@z +@x +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_quarterword)|,\qquad +@y +$$\hbox{|@t$v^\prime$@>:=new_trie_op(0,1,min_trie_op)|,\qquad +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.943,944] Larger hyphenation tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!trie_used:array[ASCII_code] of quarterword; +@y +@!trie_used:array[ASCII_code] of trie_opcode; +@z +@x +@!trie_op_val:array[1..trie_op_size] of quarterword; +@y +@!trie_op_val:array[1..trie_op_size] of trie_opcode; +@z +@x +tini +@y +tini@; +@!max_op_used:trie_opcode; {largest opcode used for any language} +@!small_op:boolean; {flag used while dumping or undumping} +@z +@x +|new_trie_op| could return |min_quarterword| (thereby simply ignoring +@y +|new_trie_op| could return |min_trie_op| (thereby simply ignoring +@z +@x +function new_trie_op(@!d,@!n:small_number;@!v:quarterword):quarterword; +label exit; +var h:-trie_op_size..trie_op_size; {trial hash location} +@!u:quarterword; {trial op code} +@y +function new_trie_op(@!d,@!n:small_number;@!v:trie_opcode):trie_opcode; +label exit; +var h:neg_trie_op_size..trie_op_size; {trial hash location} +@!u:trie_opcode; {trial op code} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.944] Another casting problem, and use |neg_trie_op_size|. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +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.944,945,946] And larger tries again. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if u=max_quarterword then + overflow("pattern memory ops per language", + max_quarterword-min_quarterword); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; +@y + if u=max_trie_op then + overflow("pattern memory ops per language", + max_trie_op-min_trie_op); + incr(trie_op_ptr); incr(u); trie_used[cur_lang]:=u; + if u>max_op_used then max_op_used:=u; +@z +@x +op_start[0]:=-min_quarterword; +@y +op_start[0]:=-min_trie_op; +@z +@x +for k:=0 to 255 do trie_used[k]:=min_quarterword; +@y +for k:=0 to 255 do trie_used[k]:=min_trie_op; +@z +@x +trie_op_ptr:=0; +@y +max_op_used:=min_trie_op; +trie_op_ptr:=0; +@z +@x +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of quarterword; +@y +@t\hskip10pt@>@!trie_o:packed array[trie_pointer] of trie_opcode; +@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 + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [43.950,958,960,963] Larger tries. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@d trie_back(#)==trie[#].lh {backward links in |trie| holes} +@y +@d trie_back(#)==trie_tro[#] {use the opcode field now for backward links} +@z +@x +@<Move the data into |trie|@>= +h.rh:=0; h.b0:=min_quarterword; h.b1:=min_quarterword; {|trie_link:=0|, + |trie_op:=min_quarterword|, |trie_char:=qi(0)|} +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do trie[r]:=h; +@y +@d clear_trie == {clear |trie[r]|} + begin trie_link(r):=0; + trie_op(r):=min_trie_op; + trie_char(r):=min_quarterword; {|trie_char:=qi(0)|} + end +@<Move the data into |trie|@>= +if trie_root=0 then {no patterns were given} + begin for r:=0 to 256 do clear_trie; +@z +@x + repeat s:=trie_link(r); trie[r]:=h; r:=s; +@y + repeat s:=trie_link(r); clear_trie; r:=s; +@z +@x + @!h:two_halves; {template used to zero out |trie|'s holes} +@y +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [49.1275] Same stuff as for \input, this time for \openin. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + if cur_ext="" then cur_ext:=".tex"; + pack_cur_name; + if a_open_in(read_file[n]) then read_open[n]:=just_open; +@y + pack_cur_name; {Try with |".tex"|.} + if (cur_ext <> ".tex") and (name_length + 5 < file_name_size) + and (not extension_irrelevant_p (name_of_file, 'tex')) + then begin + name_of_file[name_length + 1] := "."; + name_of_file[name_length + 2] := "t"; + name_of_file[name_length + 3] := "e"; + name_of_file[name_length + 4] := "x"; + name_length := name_length + 4; + end; + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open + else begin + if cur_ext = ".tex" then cur_ext := ""; + pack_cur_name; {Try without |".tex"|.} + if a_open_in (read_file[n], TEX_INPUT_PATH) + then read_open[n] := just_open; + end; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1302] Eliminate now-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} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1303] Ditto, for `load_fmt_file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@!x: integer; {something undumped} +@!w: four_quarters; {four ASCII codes} +@y +@!x: integer; {something undumped} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.??] Do reading and writing of `fmt_file' in C. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@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 +@z + +@x +@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 +@z + +@x +x:=fmt_file^.int; +@y +undump_int(x); {This reads the first word of the \.{.fmt} file} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [??] Make dumping/undumping more efficient. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +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 +dump_things(str_start[0], str_ptr+1); +dump_things(str_pool[0], pool_ptr); +@z + +@x +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 +undump_things(str_start[0], str_ptr+1); +undump_things(str_pool[0], pool_ptr); +@z + +@x +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 +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 + +@x +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 +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 +for k:=hi_mem_min to mem_end do undump_wd(mem[k]); +@y +undump_things(mem[hi_mem_min], mem_end+1-hi_mem_min); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +while k<l do + begin dump_wd(eqtb[k]); incr(k); + end; +@y +dump_things(eqtb[k], l-k); +@z + +@x +for j:=k to k+x-1 do undump_wd(eqtb[j]); +@y +undump_things(eqtb[k], x); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do dump_hh(hash[p]); +@y +dump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +for p:=hash_used+1 to undefined_control_sequence-1 do undump_hh(hash[p]); +@y +undump_things(hash[hash_used+1], undefined_control_sequence-1-hash_used); +@z + +@x +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 +@<Dump the array info for internal font number |k|@>; +@z + +@x +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 +@<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 +@ @<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 +@ @<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); +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.1322] Reading font info for C (nearly done with undump stuff). +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@ @<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)(font_mem_size)(bchar_label[k]); +undump(min_quarterword)(non_char)(font_bchar[k]); +undump(min_quarterword)(non_char)(font_false_bchar[k]); +end +@y +@ 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); +end +@z + +% The hyphenation patterns. +% +@x +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 +dump_things(trie_trl[0], trie_max+1); +dump_things(trie_tro[0], trie_max+1); +dump_things(trie_trc[0], trie_max+1); +dump_int(trie_op_ptr); +dump_things(hyf_distance[1], trie_op_ptr); +dump_things(hyf_num[1], trie_op_ptr); +dump_things(hyf_next[1], trie_op_ptr); +@z + +@x +for k:=0 to j do undump_hh(trie[k]); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +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 +undump_things(trie_trl[0], j+1); +undump_things(trie_tro[0], j+1); +undump_things(trie_trc[0], j+1); +undump_size(0)(trie_op_size)('trie op size')(j); @+init trie_op_ptr:=j;@+tini +undump_things(hyf_distance[1], j); +undump_things(hyf_num[1], j); +undump_things(hyf_next[1], j); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1327] As with TFM files, `eof' here means `have we previously +% encountered the end-of-file', not `are we at the end of the file'. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +if (x<>69069)or eof(fmt_file) then goto bad_fmt +@y +if (x<>69069)or feof(fmt_file) then goto bad_fmt +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [50.1328] Eliminate possibly wrong word `preloaded' from format_idents. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +print(" (preloaded format="); print(job_name); print_char(" "); +@y +print(" (format="); print(job_name); print_char(" "); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1332] `uexit' argument depends on `history'; add call to +% set_paths; make the main program a procedure, so that uses of `eqtb' +% will work. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +@p begin @!{|start_here|} +@y +@p procedure tex_body; +begin @!{|start_here|} +@z + +@x +t_open_out; {open the terminal for output} +@y +t_open_out; {open the terminal for output} +{get default file paths from the environment} +set_paths (TEX_FORMAT_PATH_BIT + TEX_INPUT_PATH_BIT + TEX_POOL_PATH_BIT + + TFM_FILE_PATH_BIT); +@z + +@x +end_of_TEX: close_files_and_terminate; +final_end: ready_already:=0; +end. +@y +close_files_and_terminate; +final_end: do_final_end; +end {|tex_body|}; +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [51.1333] Print new line before termination; switch to editor if +% necessary. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x + slow_print(log_name); print_char("."); + end; + end; +@y + slow_print(log_name); print_char("."); + end; + end; +print_ln; +if (edit_name_start<>0) and (interaction>batch_mode) then + call_edit(str_pool,edit_name_start,edit_name_length,edit_line); +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [52.1338] Core-dump in debugging mode on 0 input. Under 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 + begin goto breakpoint;@\ {go to every label at least once} + breakpoint: m:=0; @{'BREAKPOINT'@}@\ + end +@y + dump_core {Do something to cause a core dump} +@z + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% [54.1376] Add editor-switch variables to globals. +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +@x +This section should be replaced, if necessary, by any special +modifications of the program +that are necessary to make \TeX\ work at a particular installation. +It is usually best to design your change file so that all changes to +previous sections preserve the section numbering; then everybody's version +will be consistent with the published program. More extensive changes, +which introduce new sections, can be inserted here; then only the index +itself will get a new section number. +@^system dependencies@> +@y +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; +@z diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/texd.h.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/texd.h.ch new file mode 100644 index 0000000000..266f7e219e --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/texd.h.ch @@ -0,0 +1,69 @@ +@x +typedef integer verdschlue ; +@y +typedef unsigned long verdschlue ; +@z + +@x +typedef mdbk * mdbknoten ; +typedef mdmk * mdmknoten ; +typedef mdlk * mdlknoten ; +typedef mdek * mdeknoten ; +typedef struct { + wort w12 ; + integer l1 ; + trennvektor tr1 ; + boolean neu1 ; + boolean del1 ; + boolean used1 ; + mdbknoten li, re ; +} mdbk ; +typedef struct { + wort w12 ; + integer l1 ; + trennvektor tr1 ; + boolean neu1 ; + mdmknoten li, re ; +} mdmk ; +typedef struct { + wort w12 ; + integer l1 ; + mdlknoten li, re ; +} mdlk ; +typedef struct { + wort w12 ; + integer l1 ; + mdeknoten li, re ; +} mdek ; +@y +typedef struct mdbk { + wort w12 ; + integer l1 ; + trennvektor tr1 ; + boolean neu1 ; + boolean del1 ; + boolean used1 ; + struct mdbk * li, * re ; +} mdbk ; +typedef struct mdmk { + wort w12 ; + integer l1 ; + trennvektor tr1 ; + boolean neu1 ; + struct mdmk * li, * re ; +} mdmk ; +typedef struct mdlk { + wort w12 ; + integer l1 ; + struct mdlk * li, * re ; +} mdlk ; +typedef struct mdek { + wort w12 ; + integer l1 ; + struct mdek * li, * re ; +} mdek ; +typedef mdbk * mdbknoten ; +typedef mdmk * mdmknoten ; +typedef mdlk * mdlknoten ; +typedef mdek * mdeknoten ; +@z diff --git a/obsolete/systems/sisisi/unix/iSiTeX3.141/web2c.yacc.ch b/obsolete/systems/sisisi/unix/iSiTeX3.141/web2c.yacc.ch new file mode 100644 index 0000000000..d4c7d238b4 --- /dev/null +++ b/obsolete/systems/sisisi/unix/iSiTeX3.141/web2c.yacc.ch @@ -0,0 +1,133 @@ +@x + | POINTER_TYPE + { if (last_type >= 0) + sym_table[last_type].var_not_needed = true; + } +@y + | POINTER_TYPE + { if (last_type >= 0) + sym_table[last_type].var_not_needed = false; + } +@z + +@x +POINTER_TYPE: '^' type_id_tok + {if (last_type >= 0) { + sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed; + sym_table[last_type].upper = sym_table[l_s].upper; + sym_table[last_type].upper_sym = sym_table[l_s].upper_sym; + sym_table[last_type].val = sym_table[l_s].val; + sym_table[last_type].val_sym = sym_table[l_s].val_sym; + } + my_output(last_id); my_output("*"); } + ; +@y +POINTER_TYPE: '^' type_id_tok + {if (last_type >= 0) { + sym_table[last_type].var_not_needed = sym_table[l_s].var_not_needed; + sym_table[last_type].upper = sym_table[l_s].upper; + sym_table[last_type].upper_sym = sym_table[l_s].upper_sym; + sym_table[last_type].val = sym_table[l_s].val; + sym_table[last_type].val_sym = sym_table[l_s].val_sym; + } + my_output(last_id); my_output("*"); } + | '^' undef_id_tok /* HH for Isitex */ + {if (last_type >= 0) { + sym_table[last_type].var_not_needed = + sym_table[l_s].var_not_needed; + sym_table[last_type].upper = sym_table[l_s].upper; + sym_table[last_type].upper_sym = sym_table[l_s].upper_sym; + sym_table[last_type].val = sym_table[l_s].val; + sym_table[last_type].val_sym = sym_table[l_s].val_sym; + } + my_output(last_id); my_output("*"); } + ; +@z + +@x +VARIABLE: var_id_tok + { if (strcmp(last_id, "mem") == 0) + uses_mem = 1; + else if (strcmp(last_id, "eqtb") == 0) + uses_eqtb = 1; + if (sym_table[l_s].var_formal) + (void) putchar('*'); + my_output(last_id); + $$ = ex_32; + } + VAR_DESIG_LIST + | var_id_tok + { if (sym_table[l_s].var_formal) + (void) putchar('*'); + my_output(last_id); $$ = ex_32; } + ; +@y +VARIABLE: var_id_tok + { if (strcmp(last_id, "mem") == 0) + uses_mem = 1; + else if (strcmp(last_id, "eqtb") == 0) + uses_eqtb = 1; + if (sym_table[l_s].var_formal) { + (void) putchar('('); + (void) putchar('*'); + my_output(last_id); + (void) putchar(')'); + } + else + my_output(last_id); + $$ = ex_32; + } + VAR_DESIG_LIST + | var_id_tok '^' '.' /* HH for Isitex */ + { if (sym_table[l_s].var_formal) { + (void) putchar('('); + (void) putchar('*'); + my_output(last_id); + (void) putchar(')'); + } + else + my_output(last_id); + (void) putchar('-'); + (void) putchar('>'); + $$ = ex_32; + } + FIELD_VARIABLE + | var_id_tok '^' + { (void) putchar('('); + (void) putchar('*'); + if (sym_table[l_s].var_formal) { + (void) putchar('('); + (void) putchar('*'); + my_output(last_id); + (void) putchar(')'); + } + else + my_output(last_id); + (void) putchar(')'); + $$ = ex_32; + } + | var_id_tok + { if (sym_table[l_s].var_formal) { + (void) putchar('('); + (void) putchar('*'); + my_output(last_id); + (void) putchar(')'); + } + else + my_output(last_id); + $$ = ex_32; } + ; + +FIELD_VARIABLE: field_id_tok + { my_output(last_id); } + VAR_DESIG_LIST + | field_id_tok '^' '.' + { my_output(last_id); + (void) putchar('-'); + (void) putchar('>'); + } + FIELD_VARIABLE + | field_id_tok + { my_output(last_id); } + ; +@z diff --git a/obsolete/systems/sisisi/unix/liesmich.txt b/obsolete/systems/sisisi/unix/liesmich.txt new file mode 100644 index 0000000000..f68d72180b --- /dev/null +++ b/obsolete/systems/sisisi/unix/liesmich.txt @@ -0,0 +1,139 @@ + + + Installationsanleitung fuer TeX mit SiSiSi-Silbentrennung unter UNIX + ==================================================================== + + +Die vorliegende Anleitung beschreibt das Installieren der beiden Varianten + + SiTeX (einfache Silbentrennung) + und iSiTeX (interaktive Variante) + +der `sicheren sinnentsprechenden Silbentrennung' (SiSiSi) fuer TeX3.14 oder +TeX3.141 unter UNIX. (Wenn Sie LaTeX statt TeX benutzen, dann koennen Sie die +Installation genauso durchfuehren). Die notwendigen Files finden Sie +ueber anonymes FTP auf eiunix.tuwien.ac.at im Verzeichnis /pub/sisisi, im +Unterverzeichnis COMMON (soweit sie alle Varianten betreffen) bzw. in einem +der speziellen Unterverzeichnisse. + + +1) Besorgen Sie sich den Sourcecode von TeX und installieren Sie TeX. +--------------------------------------------------------------------- + +Sie brauchen den Sourcecode einer der beiden Varianten von TeX, da Sie mit +SiTeX bzw. iSiTeX einen ganz neuen Algorithmus fuer die Silbentrennung +installieren muessen. + +Zusaetzlich muessen Sie TeX ohne Silbentrennung schon nach den Anweisungen +des README-Files von TeX installiert haben. + + +2) Legen Sie ein SiSiSi-Verzeichnis an und kopieren Sie die SiSiSi-Files. +------------------------------------------------------------------------- + +Legen Sie ein eigenes Verzeichnis fuer SiSiSi an. Kopieren Sie alle Files aus +einem der oben erwaehnten vier speziellen Unterverzeichnisse dort hinein. + +Das COMMON Verzeichnis enthaelt spezielle Worttabellen fuer SiSiSi +(def_umlaut.tex und sihyphen.tex). Ausserdem enthaelt es zwei weitere, von +der Variante (3.14 bzw. 3.141) abhaengige Unterverzeichnisse, die spezielle +Style- bzw. Format-Files enthalten (sigerman.sty, siplain.tex und +silplain.tex), ausserdem die Changefiles, die verwendet wurden um diese Files +aus den Originalfiles (german.sty, plain.tex und lplain.tex) zu erzeugen. +Kopieren Sie die Files aus COMMON und aus dem entsprechenden Unterverzeichnis +in Ihr TEXINPUTS-Verzeichnis, z.B. /usr/local/lib/tex/inputs, oder was immer +Sie beim Installieren von TeX als TEXINPUTS Pfad konfiguriert haben. + + +3) Erzeugen Sie SiTeX. +---------------------- + +In Ihrem neuen SiSiSi-Verzeichnis muessen Sie erst das File `install' +editieren. Sie muessen die Variablen TEXSRC und SISISIDIR auf den (absoluten) +Pfadnamen der Verzeichnisse setzen, in denen sich Ihre TeX-Sourcen bzw. die +SiSiSi-Sourcen befinden (TEXSRC bezieht sich auf das oberste Verzeichnis der +TeX-Sourcen, das, in dem sich das Top-Level Makefile befindet). + +Der Installation von [i]SiTeX3.141 liegt TeX3.141 in der auf +quepasa.cs.tu-berlin.de vorhandenen Version zugrunde. Fuer die Version von +Karl Berry auf ftp.cs.umb.edu gibt es spezielle Files, install.other und +tex.ch.other, die Sie aber vor der Verwendung in install und tex.ch umbenennen +muessen. + +Danach starten Sie in dem SiSiSi-Verzeichnis das Installationsskript mit +`./install' oder `sh install'. Dieses Skript kopiert zunaechst alle +notwendigen Files in die richtigen Verzeichnisse und startet dann ein `make', +wobei nur TeX erzeugt wird, nicht etwa auch MetaFont oder die anderen +Programme, die bei TeX dabei sind. + +Dabei werden die speziellen Programme virtex und initex mit Silbentrennung +erzeugt, und ebenso sitex.fmt und silatex.fmt, bzw. isitex.fmt und +isilatex.fmt bei der interaktiven Variante, in demselben Verzeichnis. + +Da SiTeX einen auf die deutsche Sprache zugeschnittenen Silbentrennalgorithmus +verwendet, kann es nicht sinnvoll fuer fremdsprachige Texte verwendet werden. + +Sie sollten also jetzt nicht einfach so weitermachen, wie im README File von +TeX beschrieben wird, da Sie sonst das bestehende TeX mit der +Original-Silbentrennung ueberschreiben und damit keine englischsprachigen +Dokumente mehr formatieren koennen. + +Kopieren Sie statt dessen ganz einfach per Hand (d.h. per cp-Befehl :-) das +neu entstandene virtex und initex unter neuem Namen in ein Verzeichnis in +Ihrem Suchpfad (z.B. nach /usr/local/bin), also etwa als sivirtex und siinitex +(bzw. isivirtex und isiinitex). +Ausserdem muessen Sie [i]sitex.fmt und [i]silatex.fmt (die Sie beide in TEXDIR +finden) in Ihr TEXFORMATS Verzeichnis kopieren, und einen Link namens +[i]siplain.fmt auf [i]sitex.fmt herstellen. Ebenso muessen Sie noch Links auf +[i]sivirtex erzeugen (im selben Verzeichnis wie [i]sivirtex), naemlich +[i]sitex und [i]silatex. Zu guter letzt kopieren Sie das File hf3 in eines der +TEXINPUTS Verzeichnisse (z.B. /usr/local/lib/tex/inputs), und das File +[i]sitex.pool in das TEXPOOL Verzeichnis. Diese Files finden Sie ebenfalls in +TEXDIR. + + +4) Die Benutzung. +----------------- + +Sie sollten jetzt TeX mit und ohne SiSiSi verwenden koennen. Bei den +SiSiSi-Varianten vergessen Sie nicht, sigerman.sty anstelle von german.sty zu +verwenden, also \documentstyle[sigerman] anstelle von \documentstyle[german]. +Die SISISI-Varianten geben sich in der Meldung nach dem Start durch ein +eingeschobenes `(+SISISI 1.0)' zu erkennen. + +Das einfache SiTeX koennen Sie genauso wie das urspruengliche TeX benutzen. +Eine ausfuehrliche Beschreibung der zusaetzlichen Moeglichkeiten, die die +interaktive Variante bietet, finden Sie in dem Institutsbericht, der als +LaTeX-File im COMMON/INST_BER-Verzeichnis steht. + + +5) Aendern der Worttabelle. +--------------------------- + +Das Aendern der Worttabelle erfolgt wie im Institutsbericht beschrieben. Danach +muessen Sie das File `sihyphen.tex' auf Ihr UNIX-System in den TEXINPUTS-Pfad +kopieren und mit den folgenden Befehlen die Hashtabelle und die Format-Files +neu erzeugen: + + siinitex siplain \\dump + siinitex silplain \\dump + +Dabei entstehen die Files hf3, siplain.fmt und silplain.fmt. hf3 kommt in ein +TEXINPUTS-Verzeichnis, siplain.fmt und silplain.fmt kommen als sitex.fmt und +silatex.fmt in das TEXFORMATS-Verzeichnis. + +Wenn Sie auch iSiTeX benutzen wollen, muessen Sie auch die iSiTeX Format-Files +neu erzeugen: + + isiinitex siplain \\dump + isiinitex silplain \\dump + +Das hf3 File ist identisch zu dem von SiTeX, siplain.fmt und silplain.fmt +sollten Sie aber als isitex.fmt und isilatex.fmt in das TEXFORMATS-Verzeichnis +stellen. + +------------------------------------------------------------------------------- + + +Kommentare, Fehlermeldungen, Verbesserungsvorschlaege und Erfolgsmeldungen +erbeten an heinz@eiunix.tuwien.ac.at |