diff options
Diffstat (limited to 'macros/startex/startex.dtx')
-rw-r--r-- | macros/startex/startex.dtx | 2734 |
1 files changed, 2734 insertions, 0 deletions
diff --git a/macros/startex/startex.dtx b/macros/startex/startex.dtx new file mode 100644 index 0000000000..7b1181d926 --- /dev/null +++ b/macros/startex/startex.dtx @@ -0,0 +1,2734 @@ +\def \CodeVersion {1.04} +\def \CodeDate {11th March 1999} +% +% \iffalse ^^A Comment out driver code, so LaTeX can read this file as it is. +% +%<*driver> +\documentclass{ltxdoc} +\usepackage{varioref,amssymbols} +\EnableCrossrefs +\RecordChanges +\CodelineIndex +\renewcommand{\levelchar}{?} + +\title{The \starTeX{} source code} +\author{Dag Langmyhr\\ Department of Informatics\\ + University of Oslo\\[3mm] + \textsf{dag@ifi.uio.no}}% +\date{Version \CodeVersion, \CodeDate} + +\newcommand{\hex}[1]{\texttt{``#1}} +\newcommand{\stcs}[1]{\texttt{<#1>}} +\newcommand{\stenv}[1]{\stcs{#1}\dots\hspace{0.1pt}\stcs{/#1}} +\newcommand{\ParX}{\texttt{\textit{x}}} +\newcommand{\ps}{\textsc{Post\-Script}} +\newcommand{\starTeX}{Star\TeX} +\newcommand{\xx}{\textit{x}} + +\newfont{\StdECR}{ecrm1000} +\newfont{\CompECR}{tcrm1000} + +\begin{document} +\maketitle + +\DoNotIndex{\#,\$,\&,\\,\{,\},\^,\_,\~} +\DoNotIndex{\active,\advance,\alpha} +\DoNotIndex{\begingroup,\beta,\bgroup} +\DoNotIndex{\catcode,\Cdef,\chi,\csname} +\DoNotIndex{\day,\def,\Delta,\delta,\Df,\dots,\dump} +\DoNotIndex{\edef,\egroup,\endcsname,\endgraf,\endgroup,\epsilon,\eta} +\DoNotIndex{\Gamma,\gamma,\gdef,\global} +\DoNotIndex{\halign,\hangafter,\hangindent,\hbadness,\hbox,\hfil,\hfuzz} +\DoNotIndex{\hoffset,\hrule,\hsize} +\DoNotIndex{\iota,\input,\inputlineno} +\DoNotIndex{\kappa,\kern} +\DoNotIndex{\Lambda,\lambda,\language,\LaTeX,\leavevmode,\leftskip,\let,\llap} +\DoNotIndex{\magstep,\magstephalf,\mathcode,\message,\month,\mu} +\DoNotIndex{\newbox,\newcount,\newdimen,\newif,\newlinechar,\newread} +\DoNotIndex{\newskip,\newwrite,\next,\Next,\noalign,\nu} +\DoNotIndex{\obeylines,\obeyspaces,\offinterlineskip,\Omega,\omega} +\DoNotIndex{\openin,\openout,\over} +\DoNotIndex{\pageno,\par,\parindent,\parskip,\penalty,\Phi,\phi,\pm,\Pr} +\DoNotIndex{\Pi,\pi,\Psi,\psi} +\DoNotIndex{\raggedright,\Re,\relax,\rightskip,\rho,\rlap} +\DoNotIndex{\setbox,\Sigma,\sigma,\space,\string,\strut,\supereject} +\DoNotIndex{\tau,\TeX,\the,\Theta,\theta,\time,\times,\TmpA,\TmpB,\tolerance} +\DoNotIndex{\topinsert} +\DoNotIndex{\tracingcommands,\tracingmacros,\tracingoutput,\tracingrestores} +\DoNotIndex{\uccode,\unskip,\Uparrow,\Updownarrow,\uppercase,\Upsilon,\upsilon} +\DoNotIndex{\varepsilon,\varphi,\varpi,\varrho,\varsigma,\vartheta} +\DoNotIndex{\vbox,\vdots,\vfill,\voffset,\vrule,\vsize,\vskip} +\DoNotIndex{\wd} +\DoNotIndex{\Xi,\xi} +\DoNotIndex{\year} +\DoNotIndex{\zeta} + +\DeleteShortVerb{\|}\MakeShortVerb{\"} +\DocInput{startex.dtx} +\end{document} +%</driver> +% +% \fi +% +% \CheckSum{2563} +%% \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 \~} +% +% \tableofcontents +% +% \RecordChanges +% \StopEventually{\PrintIndex\PrintChanges} +% +% \section{The \starTeX{} format} +% \begin{macrocode} +%<*code> +% \end{macrocode} +% This file contains the documented source code of \starTeX{}, a +% simplified and more robust \TeX{} format intended for students +% writing their first report or essay. For more information on +% \starTeX{}, see the other files accompanying this. +% +% The main guidelines for this implementation are: +% \begin{itemize} +% \item \starTeX{} is implemented on top of plain \TeX{}. +% +% \item All names defined in the \starTeX{} implementation contain +% at least one uppercase letter, like \cs{Cdef} or \cs{NewEnvir}. +% This makes it easier to distinguish +% them from \TeX's internal names and the names defined in plain +% \TeX{}, nearly all of which consist of lowercase letters only. +% +% \item Most \TeX{} macro packages tend to use a rather terse +% programming style, like +% \begin{quote} +% \verb*:\advance\var\@ne: +% \end{quote} +% This improves processing speed and reduces storage, but make the +% code more difficult to read. Since this is a package which aims to +% be easily understandable and adaptable, I will use a more verbose style: +% \begin{quote} +% \verb*:\advance \var by 1: +% \end{quote} +% \end{itemize} +% To avoid possible confusion, \starTeX{} commands will be called +% \emph{commands} in this document, while \TeX{} commands will be +% called \emph{macros}. +% +% \subsection{States} +% \begin{macro}{\State} +% To avoid improper nesting, such as use of \stcs{psfig} within a +% \stcs{table}, we introduce a global state variable. Its values are +% given in table~\ref{tab:states}. +% \begin{table} +% \begin{center} +% \begin{tabular}{|c|l|} +% \hline +% \textbf{Value}& \textbf{State}\\ +% \hline\hline +% \texttt{x}& Ordinary body text\\ +% \texttt{p}& Inside a \stcs{psfig} caption\\ +% \texttt{t}& Inside a \stcs{table} caption\\ +% \texttt{r}& Inside a \stcs{table} row\\ +% \hline +% \end{tabular} +% \end{center} +% \caption{The possible values of \cs{State}}\label{tab:states} +% \end{table} +% The initial state is body text: +% \begin{macrocode} +\let \State = x +% \end{macrocode} +% \end{macro} +% +% \subsection{Command handling} +% \begin{macro}{\Command} +% \starTeX{} uses the syntax \stcs{\xx} for its commands rather than +% the usual \cs{\xx}. This is easily implemented by making "<" an +% active character calling the macro \cs{Command}. The command name is +% the text between the "<" and a subsequent ">". +% +% \cs{Command} first checks whether the command immediately +% follows a "<define>" in which case it is being defined; +% \cs{DefineCmd} handles that. Otherwise, \cs{Command} converts the +% command name into lowercase and +% checks whether it has been defined. If so, it is called; +% otherwise an error message is produced and the command is ignored. +% \begin{macrocode} +\def \Command #1>{\ifDefining + \def \Next {\lowercase{\DefineCmd{#1}}}% + \else + \lowercase{\expandafter\ifx \csname >#1\endcsname}\relax + \Error{Unknown command <#1> ignored.}{}% + \let \Next = \relax + \else + \def \Next {\lowercase{\csname >#1\endcsname}}% + \fi + \fi \Next } +% \end{macrocode} +% \end{macro} +% The "<" character must be bound to \cs{Command}: +% \begin{macrocode} +{\catcode `\< = \active \global\let < = \Command } +% \end{macrocode} +% +% \subsubsection{Internal form of command names} +% All \starTeX{} commands are represented by a \TeX{} macro whose name +% is constructed by \cs{csname}. To avoid confusion with predefined +% \TeX{} macros, an initial ">"\footnote{The character \texttt{>} was +% chosen as it cannot possibly occur in a command name.} +% is inserted; for example, the name of \stcs{h1} is +% represented by "\csname >h1\endcsname". +% +% \begin{macro}{\Cdef} +% To simplify the declaration of \starTeX{} commands, the macro +% \cs{Cdef} is defined. It takes two parameters: "#1" is the command name +% (with no uppercase letters and no angle brackets), and +% "#2" is the command definition. +% \begin{macrocode} +\def \Cdef #1#2{\expandafter\gdef \csname >#1\endcsname{#2}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Ccall} +% In case we need to call \starTeX{} commands from \TeX{} code, a +% \cs{Ccall} macro is introduced. +% \begin{macrocode} +\def \Ccall #1{\csname >#1\endcsname} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{User-defined commands} +% \begin{macro}{<define>} +% \begin{macro}{\ifDefining} +% The implementation of \stcs{define} is a little sneaky; it just sets +% a flag \cs{ifDefining}. When the following command name is +% found, the \cs{Command} routine checks the state of the flag and +% calls \cs{DefineCmd} when the flag is raised.\footnote{This means that +% the user can insert text between the \stcs{define} and the command +% name, and this will be typeset as normal text. There is a +% slight chance that this might confuse some users, but I prefer this +% solution to using much more complicated code.} +% \begin{macrocode} +\newif \ifDefining +\Cdef {define}{\Definingtrue} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\DefineCmd} +% The command \cs{DefineCmd} is used to define a new user command; +% "#1" is the new command name (already translated into lowercase) and +% "#2" is the definition. +% The main job of \cs{DefineCmd} is to check whether the definition is +% legal. There are two reasons why it may not be legal: +% \begin{itemize} +% \item The definition may be nested, as in +% \begin{quote} +% "<define><comm-1>...<define><comm-2>..." +% \end{quote} +% This is checked using a counter \cs{CallLevel} which is +% incremented whenever a user-defined command is called, and +% decremented on return; see the definition of \cs{Call} and +% \cs{Return} below. +% +% \item The command may already be defined. +% \end{itemize} +% If the definition is legal, \cs{FetchDef} is called to perform the +% actual defining. +% \begin{macrocode} +\def \DefineCmd #1{\Definingfalse + \ifnum \CallLevel>0 + \Error{Nested definitions are not allowed;}% + {the definition of <#1> is ignored.}\let \Next = \relax + \else + \expandafter\ifx \csname>#1\endcsname\relax + \def \Next {\begingroup \catcode`\^^M = 12 \FetchDef{#1}}% + \else + \Error{Command <#1> already defined;}{this definition ignored.}% + \def \Next {\begingroup \catcode`\^^M = 12 \IgnoreDef{#1}}% + \fi + \fi \Next } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\FetchDef} +% \cs{FetchDef} defines the macro by using everything up to the +% end-of-line mark as the definition. This implies modifying the +% \cs{catcode} of the end-of-line character ("^^M"). Also note +% that calls on \cs{Call} and \cs{Return} are inserted into the +% definition. +% \begin{macrocode} +\begingroup \catcode`\^^M = 12 + \gdef \FetchDef #1#2^^M{\expandafter% + \gdef\csname>#1\endcsname {\Call #2\Return }\endgroup }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{\IgnoreDef} +% I also define \cs{IgnoreDef} which is quite similar to +% \cs{FetchDef}, but no command is +% defined. It is used to ignore the rest of the line in case +% the user tries an illegal definition. +% \begin{macrocode} + \gdef \IgnoreDef #1#2^^M{\endgroup }% +\endgroup +% \end{macrocode} +% \end{macro} +% \begin{macro}{\CallLevel} +% Finally, we must declare the user command level counter +% \cs{CallLevel}: +% \begin{macrocode} +\newcount \CallLevel +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Call} +% \begin{macro}{\Return} +% We must also define the two commands used for incrementing and +% decrementing the counter: +% \begin{macrocode} +\def \Call {\global\advance \CallLevel by 1 } +\def \Return {\global\advance \CallLevel by -1 } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Catcode modifications} +% \starTeX{} uses only one special character: "<", which must be +% active. All the other special characters of \TeX{} and \LaTeX{} are +% assigned suitable \cs{catcode}s turning them into ordinary +% characters. +% +% \begin{macro}{\SpecialCatCodes} +% \cs{SpecialCatCodes} sets the \cs{catcode}s to the \starTeX{} +% values: +% \begin{macrocode} +\def \SpecialCatCodes {% + \catcode `\\ = 12 \catcode `\{ = 12 \catcode `\} = 12 + \catcode `\$ = 12 \catcode `\& = 12 \catcode `\# = 12 + \catcode `\^ = 12 \catcode `\_ = 12 \catcode `\~ = 12 + \catcode `\% = 12 \catcode `\< = \active } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\StandardCatCodes} +% \cs{StandardCatCodes} restores the \cs{catcode}s to their normal +% values. This is necessary when reading for instance style files. +% \begin{macrocode} +\def \StandardCatCodes {% + \catcode `\\ = 0 \catcode `\{ = 1 \catcode `\} = 2 + \catcode `\$ = 3 \catcode `\& = 4 \catcode `\# = 6 + \catcode `\^ = 7 \catcode `\_ = 8 \catcode `\~ = \active + \catcode `\% = 14 \catcode `\< = 12 } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Environments} +% A \starTeX{} environment is a piece of text enclosed in a +% \stcs{\xx}\dots\stcs{/\xx} pair. +% +% \begin{macro}{\NewEnvir} +% \cs{NewEnvir} is used to start a new environment. It has three +% parameters: "#1" is the name of the environment, "#2" is +% the \TeX{} commands used to start the new environment (usually just +% a \cs{begingroup}), and "#3" is +% the \TeX{} commands used to terminate the environment (usually just +% a \cs{endgroup}). +% +% \begin{macro}{\PrevEnv} +% \begin{macro}{\PrevEnvLine} +% \begin{macro}{\CurEnv} +% \begin{macro}{\CurEnvExit} +% \begin{macro}{\CurEnvLine} +% \cs{NewEnvir} saves information about the current environment's name +% (in \cs{CurEnv}), the line on which it starts (in \cs{CurEnvLine}) and +% which command is used to exit it (in \cs{CurEnvExit}). It also keeps +% tracks of the outer environment's name (in \cs{PrevEnv}) and start line +% (in \cs{PrevEnvLine}) for better error reporting and error recovery. +% \begin{macrocode} +\def \NewEnvir #1#2#3{#2\relax + \let \PrevEnv = \CurEnv \PrevEnvLine = \CurEnvLine + \def \CurEnv {#1}\def \CurEnvExit {#3}\CurEnvLine = \inputlineno } +% \end{macrocode} +% We need default definitions of \cs{CurEnv} and \cs{CurEnvExit}: +% \begin{macrocode} +\def \CurEnv {}\def \CurEnvExit {\relax} +% \end{macrocode} +% We also need to declare the two line counters: +% \begin{macrocode} +\newcount \CurEnvLine \newcount \PrevEnvLine +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\EndEnvir} +% \cs{EndEnvir} is used to terminate an environment. It check that the +% correct environment is terminated, and tries to correct user +% mistakes. It checks for the following situations: +% \begin{itemize} +% \item If the name of the environment to be terminated is the same as +% that of the current environment, everything is OK, and we can safely +% leave the current environment. +% +% \item If the name of the terminated environment is not the name of +% the current one, but matches the name of the outer environment, +% we assume that the user has forgotten a \stcs{/\xx} command. +% An error message is given, and both the current environment and the +% outer one are terminated. +% +% \item If the name of the terminated environment matches neither the +% current nor the outer environment, we assume that the user has just +% misspelled the command. The best thing we can do in this case is to +% give an error message and ignore the command. If the user had +% intended to terminate the current environment, we get erroneous +% processing of the following text, but the situation will normalize +% when the outer environment is terminated. +% \end{itemize} +% \begin{macrocode} +\def \EndEnvir #1{% + \ifTextEqual{#1}{\CurEnv}\let \Next = \CurEnvExit + \else \EnvirError{#1}\fi + \Next } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\EnvirError} +% \cs{EnvirError} is an auxiliary command giving a proper error +% message and placing---in \cs{Next}---the best command to recover +% from the error. +% \begin{macrocode} +\def \EnvirError #1{\ifTextEqual{#1}{\PrevEnv}% + \Error{<\CurEnv> on line \the\CurEnvLine\space terminated by + </#1>.}{An extra </\CurEnv> has been inserted.}% + \def \Next {\CurEnvExit \CurEnvExit }% + \else + \Error{<\CurEnv> on line \the\CurEnvLine\space terminated by + </#1>.}{The </#1> will be ignored.}% + \let \Next = \relax + \fi } +% \end{macrocode} +% \end{macro} +% +% \subsection{Document styles} +% \begin{macro}{<style>} +% The command \stcs{style} is called to read a document style. It +% calls \cs{ReadStyle} to do the actual work. +% \begin{macrocode} +\Cdef {style}{\IfNextChar{[}{\ReadStyle}% + {\Error{No style name given;}{the syntax is: <style>[style name].}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ReadStyle} +% \begin{macro}{\StyleLine} +% \cs{ReadStyle} reads the style file (with extension +% \texttt{.stx}) using the standard \TeX{} \cs{catcode}s. Afterwards, the +% \stcs{style} command is redefined, since \stcs{style} should be +% called once only. Also, the current line number is saved (in +% \cs{StyleLine}) in case it is needed later in an error message. +% \begin{macrocode} +\def \ReadStyle [#1]{\IfFileExists{#1.stx}% + {\edef \StyleLine {\the\inputlineno}% + \Cdef {style}{\Error{Command <style> already used on line + \StyleLine;}{this use of <style> is ignored.}}% + \StandardCatCodes \input #1.stx + \SpecialCatCodes }% + {\Error{Style file `#1.stx' could not be found;}% + {style definition ignored.}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Fonts} +% \starTeX{} allows the user a limited amount of font selection: +% \begin{itemize} +% \item use of \textbf{bold text} using \stcs{b}\dots\stcs{/b}, +% +% \item use of \textit{italic text} using \stcs{i}\dots\stcs{/i}, and +% +% \item use of \texttt{typewriter text} using \stcs{tt}\dots\stcs{/tt}. +% \end{itemize} +% All other font changes, including font size changes, are done by the +% document style. +% +% Since the font change commands mentioned above may be combined, +% \starTeX{} uses an internal font naming scheme in which a font name +% consists of five parts, as shown in table\vref{tab:fontname}. For +% example, the font ``Standard bold roman italic normal-size'' is +% represented internally as "F-RSBIN". +% +% \begin{table} +% \begin{center} +% \begin{tabular}{|l|l|l|l|l|} +% \hline +% \textbf{Kind}& \textbf{Alternate}& \textbf{Bold}& +% \textbf{Italic}& \textbf{Size}\\ +% \hline\hline +% "R" (Roman)& "S" (Standard)& "M" (Medium)& "U" (Upright)& +% "X" (Extra large)\\ +% "T" (Teletype)& "A" (Alternate)& "B" (Bold)& "I" (Italic)& +% "L" (Large)\\ +% &&&& "N" (Normal)\\ +% &&&& "S" (Small)\\ +% \hline +% \end{tabular} +% \end{center} +% \caption{The five parts of the internal \starTeX{} text font name} +% \label{tab:fontname} +% \end{table} +% +% \begin{table} +% \begin{center} +% \begin{tabular}{|l|l|l|} +% \hline +% \textbf{Size}& \textbf{Position}& \textbf{Family}\\ +% \hline\hline +% "X" (Extra large)& "N" (Normal)& "0" (Roman math)\\ +% "L" (Large)& "S" (Script)& "1" (Italic math)\\ +% "N" (Normal)& "X" (Scriptscript)& "2" (Math symbols)\\ +% "S" (Small)& & "3" (Large math symbols)\\ +% & & "4" (Bold math)\\ +% & & "5" (Extended italic math)\\ +% & & "6" (AMS symbols B)\\ +% \hline +% \end{tabular} +% \end{center} +% \caption{The three parts of the internal \starTeX{} math font +% name}\label{tab:mathfont} +% \end{table} +% +% \subsubsection{Font definitions} +% \begin{macro}{\FontDef} +% The macro \cs{FontDef} is used to define a \starTeX{} font pair. To be +% more precise, it defines which \TeX{} font specifications to use for +% each internal \starTeX{} font name. "#1" gives the font kind, "#2" +% the boldness, "#3" whether the font is italic or not, and "#4" the font +% size. Two fonts are defined for each +% internal \starTeX{} name: the standard Cork encoded font (in "#5") +% and the additional companion font (in "#6"). +% \begin{macrocode} +\def \FontDef #1#2#3#4#5#6{% + \expandafter\def \csname F-#1S#2#3#4\endcsname {#5}% + \expandafter\def \csname F-#1A#2#3#4\endcsname {#6}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MathFontDef} +% Similarly, \cs{MathFontDef} is used to define a math font. "#1" is +% the size, "#2" is the family, and "#3"--"#5" are the three fonts to +% be used as math text font, script font and scriptscript font. +% \begin{macrocode} +\def \MathFontDef #1#2#3#4#5{% + \expandafter\def \csname M-#1N#2\endcsname {#3}% + \expandafter\def \csname M-#1S#2\endcsname {#4}% + \expandafter\def \csname M-#1X#2\endcsname {#5}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Predefined fonts} +% The following fonts are predefined, which means that they are the +% fonts the user will get unless the document style dictates +% otherwise. +% +% The fonts used are the so-called \emph{EC fonts}. +% Since there are no bold typewriter characters in this set, +% ordinary typewriter characters are used instead. +% +% Also defined are various size dependant values: +% \begin{description} +% \item[\cs{LineSkip}\ParX{}] line skip, and +% +% \item[\cs{CodeSkip}\ParX{}] line skip in code listings. +% \end{description} +% +% \paragraph{Normal size fonts} +% An 11 point (actually 10.95 pt) font is the standard text font. +% \changes{1.02}{1998/01/12}{Changed from `dc' to `ec' fonts.} +% \begin{macrocode} +\def \XIpt { at 10.95pt} +\FontDef{R}{M}{U}{N}{ecrm1095}{tcrm1095} +\FontDef{R}{M}{I}{N}{ecti1095}{tcti1095} +\FontDef{R}{B}{U}{N}{ecbx1095}{tcbx1095} +\FontDef{R}{B}{I}{N}{ecbi1095}{tcbi1095} +\FontDef{T}{M}{U}{N}{ectt1095}{tctt1095} +\FontDef{T}{M}{I}{N}{ecit1095}{tcit1095} +\FontDef{T}{B}{U}{N}{ectt1095}{tctt1095} +\FontDef{T}{B}{I}{N}{ecit1095}{tcit1095} +\MathFontDef{N}{0}{cmr10\XIpt}{cmr8}{cmr6} +\MathFontDef{N}{1}{cmmi10\XIpt}{cmmi8}{cmmi6} +\MathFontDef{N}{2}{cmsy10\XIpt}{cmsy8}{cmsy6} +\MathFontDef{N}{3}{cmex10\XIpt}{cmex10\XIpt}{cmex10\XIpt} +\MathFontDef{N}{4}{cmbx10\XIpt}{cmbx8}{cmbx6} +\MathFontDef{N}{5}{ecti1095}{ecti0800}{ecti0600} +\MathFontDef{N}{6}{msbm10\XIpt}{msbm8}{msbm6} +\def \LineSkipN {12pt} \def \CodeSkipN {11pt plus 0.0pt minus 0.1pt} +% \end{macrocode} +% +% \paragraph{Large fonts} +% The slightly larger characters are 14.4 pt. +% \begin{macrocode} +\def \XIVpt { at 14.4pt} +\FontDef{R}{M}{U}{L}{ecrm1440}{tcrm1440} +\FontDef{R}{M}{I}{L}{ecti1440}{tcti1440} +\FontDef{R}{B}{U}{L}{ecbx1440}{tcbx1440} +\FontDef{R}{B}{I}{L}{ecbi1440}{tcbi1440} +\FontDef{T}{M}{U}{L}{ectt1440}{tctt1440} +\FontDef{T}{M}{I}{L}{ecit1440}{tcit1440} +\FontDef{T}{B}{U}{L}{ectt1440}{tctt1440} +\FontDef{T}{B}{I}{L}{ecit1440}{tcit1440} +\MathFontDef{L}{0}{cmr12\XIVpt}{cmr10}{cmr8} +\MathFontDef{L}{1}{cmmi12\XIVpt}{cmmi10}{cmmi8} +\MathFontDef{L}{2}{cmsy10\XIVpt}{cmsy10}{cmsy8} +\MathFontDef{L}{3}{cmex10\XIVpt}{cmex10\XIVpt}{cmex10\XIVpt} +\MathFontDef{L}{4}{cmbx12\XIVpt}{cmbx10}{cmbx8} +\MathFontDef{L}{5}{ecti1440}{ecti1000}{ecti0800} +\MathFontDef{L}{6}{msbm10\XIVpt}{msbm10}{msbm8} +\def \LineSkipL {15pt} +% \end{macrocode} +% +% \paragraph{The extra large fonts} +% The largest fonts are 17.28~pt. +% \begin{macrocode} +\def \XVIIpt { at 17.28pt} +\FontDef{R}{M}{U}{X}{ecrm1728}{tcrm1728} +\FontDef{R}{M}{I}{X}{ecti1728}{tcti1728} +\FontDef{R}{B}{U}{X}{ecbx1728}{tcbx1728} +\FontDef{R}{B}{I}{X}{ecbi1728}{tcbi1728} +\FontDef{T}{M}{U}{X}{ectt1728}{tctt1728} +\FontDef{T}{M}{I}{X}{ecit1728}{tcit1728} +\FontDef{T}{B}{U}{X}{ectt1728}{tctt1728} +\FontDef{T}{B}{I}{X}{ecit1728}{tcit1728} +\MathFontDef{X}{0}{cmr17}{cmr12\XIVpt}{cmr9} +\MathFontDef{X}{1}{cmmi12\XVIIpt}{cmmi12}{cmmi9} +\MathFontDef{X}{2}{cmsy10\XVIIpt}{cmsy10 at 12pt}{cmsy9} +\MathFontDef{X}{3}{cmex10\XVIIpt}{cmex10\XVIIpt}{cmex10\XVIIpt} +\MathFontDef{X}{4}{cmbx12\XVIIpt}{cmbx12}{cmbx9} +\MathFontDef{X}{5}{ecti1728}{ecti1200}{ecti0900} +\MathFontDef{X}{6}{msbm10\XVIIpt}{msbm10 at 12pt}{msbm9} +\def \LineSkipX {17pt} +% \end{macrocode} +% +% \paragraph{Small fonts} +% A smaller font for footnotes and other special text is 10~pt. +% \begin{macrocode} +\FontDef{R}{M}{U}{S}{ecrm1000}{tcrm1000} +\FontDef{R}{M}{I}{S}{ecti1000}{tcti1000} +\FontDef{R}{B}{U}{S}{ecbx1000}{tcbx1000} +\FontDef{R}{B}{I}{S}{ecbi1000}{tcbi1000} +\FontDef{T}{M}{U}{S}{ectt1000}{tctt1000} +\FontDef{T}{M}{I}{S}{ecit1000}{tcit1000} +\FontDef{T}{B}{U}{S}{ectt1000}{tctt1000} +\FontDef{T}{B}{I}{S}{ecit1000}{tcit1000} +\MathFontDef{S}{0}{cmr10}{cmr7}{cmr5} +\MathFontDef{S}{1}{cmmi10}{cmmi7}{cmmi5} +\MathFontDef{S}{2}{cmsy10}{cmsy7}{cmsy5} +\MathFontDef{S}{3}{cmex10}{cmex10}{cmex10} +\MathFontDef{S}{4}{cmbx10}{cmbx7}{cmbx5} +\MathFontDef{S}{5}{ecti1000}{ecti0700}{ecti0500} +\MathFontDef{S}{6}{msbm10}{msbm7}{msbm5} +\def \LineSkipS {11pt} +% \end{macrocode} +% +% \subsubsection{Font selection} +% \begin{macro}{\FontAlt} +% \begin{macro}{\FontBold} +% \begin{macro}{\FontItal} +% \begin{macro}{\FontKind} +% \begin{macro}{\FontSize} +% Selecting a \starTeX{} font is a two-step procedure: +% \begin{enumerate} +% \item Define \cs{FontKind}, \cs{FontAlt}, \cs{FontBold}, +% \cs{FontItal} and +% \cs{FontSize} to contain the correct letters, as shown in +% table\vref{tab:fontname}. +% +% \item Call \cs{SelectFont}. +% \end{enumerate} +% (The reason for this procedure is to avoid loading unused fonts.) +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\SelectFont} +% As mentioned, "\SelectFont" selects a font according to the +% specifications given. +% \begin{macrocode} +\def \SelectFont {% + \edef \ThisFont {F-\FontKind\FontAlt\FontBold\FontItal\FontSize}% + \font \CurFont = \csname\ThisFont\endcsname \CurFont } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\ResetFont} +% \cs{ResetFont} provides standard settings for the various \starTeX{} +% font parameters. +% \begin{macrocode} +\def \ResetFont {% + \def \FontKind{R}\def \FontAlt{S}\def \FontBold{M}% + \def \FontItal{U}\def \FontSize{N}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\CheckItCorr} +% \cs{CheckItCorr} is called after every group of italic text. Unless +% the following character is a low character like `\texttt{.}' or +% `\texttt{,}', an italic correction command \cs{/} is inserted. +% \begin{macrocode} +\def \CheckItCorr {% + \IfNextCharTwo{.}{,}{}{\/}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Font size selection} +% \begin{macro}{\SetSize} +% \cs{SetSize} is used to set various parameters connected with a size +% change. It also contains a call on \cs{SelectFont}. +% \begin{macrocode} +\def \SetSize #1{\def \FontSize{#1}\SelectFont + \baselineskip = \csname LineSkip#1\endcsname + \ParIndent = \StdParIndent } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{\starTeX{} commands for font changes} +% \begin{macro}{<b>} +% \begin{macro}{</b>} +% \begin{macro}{<i>} +% \begin{macro}{</i>} +% \begin{macro}{<tt>} +% \begin{macro}{</tt>} +% The following commands are used to indicate bold, italic, or +% typewriter text. +% \begin{macrocode} +\Cdef {b}{\NewEnvir{b}{\begingroup}{\endgroup}% + \def\FontBold{B}\SelectFont} +\Cdef {/b}{\EndEnvir{b}} +\Cdef {i}{\NewEnvir{i}{\begingroup}{\endgroup\CheckItCorr}% + \def\FontItal{I}\SelectFont} +\Cdef {/i}{\EndEnvir{i}} +\Cdef {tt}{\NewEnvir{tt}{\begingroup}{\endgroup}% + \def\FontKind{T}\SelectFont} +\Cdef {/tt}{\EndEnvir{tt}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} + +% \subsection{Body text} +% A \starTeX{} file is enclosed in a \stenv{body} environment. The main +% reason for this is to be able to detect the end of the document and +% terminate properly.\footnote{An \cs{everyeof} +% command---had it existed---would have made the \stenv{body} environment +% superfluous, thus removing yet another possible error source. +% ($\varepsilon$-\TeX\cite{etex} does provide such a primitive, but +% I have chosen not to apply it as use of $\varepsilon$-\TeX{} is not +% yet very widespread.)} It is also used to print an introductory +% message. +% +% \begin{macro}{<body>} +% \stcs{body} just redefines itself to produce an error message if +% used a second time; this is to ensure that it is only used once. +% \begin{macrocode} +\Cdef {body}{\NewEnvir{body}{\begingroup}{\endgroup}% + \message{^^JThis is StarTeX, version \CodeVersion^^J}% + \global\everypar = {\NewPar }% + \xdef \BodyLine {\the\inputlineno}% + \Cdef {body}{\Error{Command <body> already used on line \BodyLine;}% + {this use of <body> was ignored.}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\BodyError} +% If the user has forgotten the \stenv{body} environment, the first +% text paragraph will trigger the \cs{BodyError} macro. +% \begin{macrocode} +\def \BodyError {\message{^^JThis is StarTeX, version \CodeVersion^^J}% + \Error{A <body>...</body> environment should surround + the whole document.}{A missing <body> was inserted.}% + \global\everypar = {\NewPar }} +% \end{macrocode} +% \end{macro} +% \begin{macro}{</body>} +% \stcs{/body} is used to terminate the document. This involves two things: +% \begin{enumerate} +% \item the current page must be terminated, and +% +% \item the \texttt{.aux} file must be check to determine whether any +% references have changed. +% The \texttt{.aux} file must be checked if both +% \begin{itemize} +% \item an \texttt{.aux} file has been read (\cs{ifAuxRead} is true), +% and +% +% \item a new \texttt{.aux} file has been created (\cs{ifAuxOpen} is +% true). +% \end{itemize} +% If we already know that a rerun is necessary (because \cs{ifRerun} +% is true), there is no need to check the \texttt{.aux} file. +% \end{enumerate} +% \begin{macrocode} +\Cdef {/body}{\EndEnvir{body}\endgraf\vfill\supereject + \let \Next = \CheckAux + \ifRerun \let \Next = \relax \fi + \ifAuxRead \else \let \Next = \relax \fi + \ifAuxOpen \else \let \Next = \relax \fi + \Next +% \end{macrocode} +% Give a warning if rerunning \starTeX{} is necessary. +% \begin{macrocode} + \ifRerun \Warning{Cross-references are not correct;}% + {please run StarTeX again.}\fi +% \end{macrocode} +% And now, we can finally terminate the run. +% \begin{macrocode} + \end} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Paragraph breaking} +% \begin{macro}{<p>} +% The \starTeX{} command \stcs{p} is used to separate paragraphs: +% \begin{macrocode} +\Cdef {p}{\endgraf} +% \end{macrocode} +% \end{macro} +% Blank lines are just ignored: +% \begin{macrocode} +\def \par {} +% \end{macrocode} +% \starTeX{} uses parameters which allow rather sloppy paragraph +% setting: +% \begin{macrocode} +\pretolerance = 2500 \tolerance = 9999 \hbadness = 10000 +\emergencystretch = 3cm +% \end{macrocode} +% The reasons for this are: +% \begin{itemize} +% \item If a good set of breaks is possible, \TeX{} will still choose +% that. +% +% \item If no good breaks are possible, it is better to have a sloppily +% set paragraph than problem lines sticking into the margin. The +% potential users of \starTeX{} tend to just ignore messages about +% overfull boxes. +% \end{itemize} +% Note, however, that \cs{hfuzz} has not been increased, as such a +% change is immediately visible and gives a poor impression. +% +% \subsubsection{Paragraph indentation} +% The paragraph handling mechanism must be able to let some paragraphs +% be indented and others not; for instance, the first paragraph +% following a title should not be indented, while the subsequent +% ones should be. +% +% In \starTeX{} this is solved by disabling the original +% \cs{parindent} and instead insert a call on \cs{NewPar} at +% the start of every paragraph. However, \cs{everypar} is initialized +% to \cs{BodyError} to detect a missing \stenv{body} environment; the +% \stcs{body} command will set \cs{everypar} correctly. +% \begin{macrocode} +\parindent = 0pt \everypar = {\BodyError } +% \end{macrocode} +% \begin{macro}{\NewPar} +% This \cs{NewPar} inserts an indentation \cs{ParIndent} wide if +% \cs{ifIndent} is true.\footnote{We cannot use the standard +% \cs{parindent} to this, as that is inserted when the +% paragraph is started, in other words before \cs{NewPar} is +% called.} It also sets \cs{ifIndent} to true, ensuring the +% indentation of subsequent paragraphs. \cs{NewPar} sets \cs{parskip} +% to its standard current value \cs{CurParSkip}. +% \begin{macrocode} +\def \NewPar {\ifIndent \kern \ParIndent \fi \Indenttrue + \global\parskip = \CurParSkip } +% \end{macrocode} +% \end{macro} +% (In some environments, like \stenv{list}, no paragraphs are +% indented. By setting \cs{ParIndent} to 0~pt, the whole paragraph +% indentation mechanism is disabled.) +% +% \begin{macro}{\ParIndent} +% \begin{macro}{\ifIndent} +% \begin{macro}{\StdParIndent} +% We must declare \cs{ParIndent} and \cs{ifIndent}, and also +% \cs{StdParIndent} which holds the value to which \cs{ParIndent} is +% set when it is not 0: +% \begin{macrocode} +\newskip \ParIndent \def \StdParIndent {1em} +\newif \ifIndent +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Paragraph separation} +% Sometimes it is necessary to omit the paragraph +% separation (the vertical space inserted between every paragraph), +% for instance after having inserted some special vertical space. This +% is done by setting \cs{parskip} to 0~pt. The following paragraph +% will reset this to \cs{CurParSkip} so that subsequent paragraphs +% will have the standard separation; see the definition of \cs{NewPar} +% above. +% +% \begin{macro}{\CurParSkip} +% \cs{CurParSkip} must be defined: +% \begin{macrocode} +\newskip \CurParSkip +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\AddVspace} +% Several insertions of vertical space (with \cs{vskip}) should not +% just accumulate; this will lead to excessive vertical spacing. +% Instead, \cs{AddVspace} should be used; it inserts the maximum of +% the last space (if any) and the current one, and it also sets +% \cs{parskip} to 0~pt so that the automatic paragraph separation will +% not interfere. +% \begin{macrocode} +\def \AddVspace #1{\ifvmode \else \endgraf \fi + \skip1 = #1\relax + \ifdim \lastskip < \skip1 \relax + \ifdim \lastskip > 0pt \vskip -\lastskip \fi + \vskip \skip1 + \fi \parskip = 0pt \relax } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{The document head} +% This section implements the various commands used at the start of +% the document. +% +% \begin{macro}{<title>} +% \begin{macro}{</title>} +% \stenv{title} is used to set the document title. It is centered, and +% uses the biggest fonts available. +% \begin{macrocode} +\Cdef {title}{\AddVspace{30pt plus 10pt} + \NewEnvir{title}{\begingroup}{\endgraf\endgroup} + \leftskip = 2cm plus 1fill \rightskip = \leftskip + \ParIndent = 0pt \CurParSkip = 0pt + \ResetFont \SetSize{X}} +\Cdef {/title}{\EndEnvir{title}% + \AddVspace{20pt plus 4pt}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{<author>} +% \begin{macro}{</author>} +% \stenv{author} is used for the author's name. It is set like +% \stenv{title}, but uses a smaller font. +% \begin{macrocode} +\Cdef {author}{\AddVspace{10pt plus 3pt} + \NewEnvir{author}{\begingroup}{\endgraf\endgroup} + \leftskip = 2cm plus 1fill \rightskip = \leftskip + \ParIndent = 0pt \CurParSkip = 0pt + \ResetFont \SetSize{L}} +\Cdef {/author}{\EndEnvir{author}% + \AddVspace{20pt plus 4pt}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{<info>} +% \begin{macro}{</info>} +% \stenv{info} is used for additional information, like the date. It +% is centered, but uses the normal text font. +% \begin{macrocode} +\Cdef {info}{\AddVspace{10pt plus 3pt} + \NewEnvir{info}{\begingroup}{\endgraf\endgroup} + \leftskip = 2cm plus 1fill \rightskip = \leftskip + \ParIndent = 0pt \CurParSkip = 0pt + \ResetFont \SetSize{N}} +\Cdef {/info}{\EndEnvir{info}% + \AddVspace{20pt plus 4pt}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{<abstract>} +% \begin{macro}{</abstract>} +% \stenv{abstract} is used for the short abstract usually given with +% each document. It is set with indented margins, and the type is +% smaller than the text type. The word `Abstract' is set in boldface. +% \begin{macrocode} +\Cdef {abstract}{\AddVspace{10pt plus 3pt} + \NewEnvir{abstract}{\begingroup}{\endgraf\endgroup} + \ResetFont \def \FontBold{B} \SetSize{S} \CurParSkip = 0pt + \leftskip = 2cm \rightskip = \leftskip \Indentfalse + \centerline{\AbstractName} + \ResetFont \SetSize{S}\Indentfalse } +\Cdef {/abstract}{\EndEnvir{abstract}% + \AddVspace{10pt plus 2pt}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Sectioning commands} +% To keep track of the section numbers, we need four counters: +% \begin{macrocode} +\newcount \SectI \newcount \SectII +\newcount \SectIII \newcount \SectIV +% \end{macrocode} +% \begin{macro}{\Heading} +% Since most of the work of a sectioning command is the same +% irrespective of its level, the common code has been place in +% \cs{Heading} which has four parameters: "#1" is the vertical space +% before the section, "#2" is the font size (\texttt{N}, \texttt{L} or +% \texttt{X}), "#3" tells whether to use bold type or not (\texttt{B} +% or \texttt{M}), and "#4" is the \TeX{} command to produce the +% section number. +% \begin{macrocode} +\def \Heading #1#2#3#4{\AddVspace{#1} + \def \FontBold {#3} \SetSize{#2} + \setbox0 = \hbox{#4\kern 0.5\baselineskip} + \hangindent = \wd0 \hangafter = 1 \raggedright + \ParIndent = 0pt \CurParSkip = 0pt \leavevmode \box0 } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{<h1>} +% \stcs{H1} must update the counters and add vertical space. The rest +% of the work is done by \cs{Heading}. +% \begin{macrocode} +\Cdef {h1}{\endgraf + \global\advance \SectI by 1 + \global\SectII = 0 \global\SectIII = 0 \global\SectIV = 0 + \edef \CurDef {\SectIim} + \NewEnvir{h1}{\begingroup}{\endgroup} + \Heading{24pt plus 12pt minus 3pt}{X}{B}{\SectIim}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{</h1>} +% \stcs{/H1} terminates the heading. It adds some vertical space +% (protcted with a top \cs{penalty} so that a page break will never +% occur) and sets \cs{Indentfalse} to prevent indentation of the +% following line. +% \begin{macrocode} +\Cdef {/h1}{\endgraf + \nobreak\vskip 6pt plus 1.5pt + \EndEnvir{h1} \Indentfalse } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{<h2>} +% \begin{macro}{</h2>} +% \stcs{H2} and \stcs{/h2} work more or less like \stcs{h1} and +% \stcs{/h1}: +% \begin{macrocode} +\Cdef {h2}{\endgraf + \global\advance \SectII by 1 + \global\SectIII = 0 \global\SectIV = 0 + \edef \CurDef {\SectIIim} + \NewEnvir{h2}{\begingroup}{\endgroup} + \Heading{14pt plus 7pt minus 2pt}{L}{B}{\SectIIim}} +\Cdef {/h2}{\endgraf + \nobreak\vskip 4pt plus 1pt + \EndEnvir{h2}\Indentfalse } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{<h3>} +% \begin{macro}{</h3>} +% \stcs{H3} and \stcs{/h3} work more or less like the two preceding +% ones: +% \begin{macrocode} +\Cdef {h3}{\endgraf + \global\advance \SectIII by 1 \global\SectIV = 0 + \edef \CurDef {\SectIIIim} + \NewEnvir{h3}{\begingroup}{\endgroup} + \Heading{10pt plus 5pt minus 1pt}{N}{B}{\SectIIIim}} +\Cdef {/h3}{\endgraf + \nobreak\vskip 2pt plus 1pt + \EndEnvir{h3}\Indentfalse } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{<h4>} +% \begin{macro}{</h4>} +% \stcs{H4} and \stcs{/h4} are slightly different from the previous +% ones in that they use a run-in title (the text continues on the same +% line as the title): +% \begin{macrocode} +\Cdef {h4}{\AddVspace{8pt plus 4pt minus 1pt} + \global\advance \SectIV by 1 + \edef \CurDef {\SectIVim} + \NewEnvir{h4}{\begingroup}{\endgroup} + \def \FontBold{B}\SelectFont \Indentfalse \SectIVim } +\Cdef {/h4}{\kern 0.5\baselineskip + \EndEnvir{h4}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Lists} +% \begin{macro}{<list>} +% \begin{macro}{</list>} +% The \stenv{list} environment increases the left margin and sets the +% item counter to 0; everything +% else is handled by the various kinds of \cs{item}. +% \begin{macrocode} +\Cdef {list}{\AddVspace{\ListSkip} + \NewEnvir{list}{\begingroup}{\endgroup} + \advance \leftskip by \ListIndent + \Indentfalse \CurParSkip = \ListSkip \ParIndent = 0pt + \ItemCount = 0 } +\Cdef {/list}{\endgraf + \EndEnvir{list} \Indentfalse } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{<item>} +% \stcs{item} inserts a bulleted item. +% \begin{macrocode} +\Cdef {item}{\endgraf \Indentfalse + \leavevmode\llap{\BulletItemFormat}\ignorespaces } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{<numitem>} +% \stcs{numitem} gives a numbered item. +% \begin{macrocode} +\Cdef {numitem}{\endgraf + \advance \ItemCount by 1 \edef \CurDef {\the\ItemCount} + \Indentfalse + \leavevmode\llap{\NumItemFormat{\ItemCount}}\ignorespaces } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ItemCount} +% The item counter \cs{ItemCount} must also be declared: +% \begin{macrocode} +\newcount \ItemCount +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{<textitem>} +% \begin{macro}{</textitem>} +% The \stenv{textitem} environment starts another item with a bold +% text. +% \begin{macrocode} +\Cdef {textitem}{\endgraf + \NewEnvir{textitem}{\begingroup}{\endgroup} + \def \FontBold {B}\SelectFont \leavevmode \kern -\ListIndent + \ignorespaces } +\Cdef {/textitem}{\unskip + \EndEnvir{textitem}% + \hskip 1em \ignorespaces } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Displays} +% \begin{macro}{<display>} +% \begin{macro}{</display>} +% A \stenv{display} environment is implemented by increasing both +% margins. +% \begin{macrocode} +\Cdef {display}{\AddVspace{\DisplayPreSkip} + \NewEnvir{display}{\begingroup}{\endgroup}% + \advance \leftskip by \DisplayIndent + \advance \rightskip by \DisplayIndent + \CurParSkip = \DisplayParSkip \ParIndent = 0pt \relax } +\Cdef {/display}{\AddVspace{\DisplayPostSkip} + \EndEnvir{display}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Code} +% Handling code like computer programs is quite easy. It involves +% \begin{itemize} +% \item changing "<"'s \cs{catcode} into that of an ordinary +% character, +% +% \item making space and end-of-lines into active characters with a +% suitable definition, and +% +% \item selecting a fixed-width font and a suitable leading. +% \end{itemize} +% It is necessary to remember whether the code followed a "<p>". +% If so, some vertical space will be added before and after the code. +% \begin{macrocode} +\newif \ifCodePar +% \end{macrocode} +% \begin{macro}{\CodeSetup} +% All the initialization is handled by the \cs{CodeSetup} macro: +% \begin{macrocode} +\def \CodeSetup {\ifvmode \CodePartrue \AddVspace{\DisplayPreSkip} + \else \CodeParfalse \fi + \def\FontKind{T}\SelectFont + \baselineskip = \CodeSkipN \CurParSkip = 0pt \ParIndent = 0pt + \catcode`\< = 12 \frenchspacing \obeylines \obeyspaces } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\obeylines} +% Plain \TeX's definition of \cs{obeylines} must be redefined since +% \cs{par} has been changed: +% \begin{macrocode} +\begingroup + \catcode`\^^M = \active % + \gdef\obeylines{\catcode`\^^M=\active \def^^M{\endgraf\leavevmode}}% +\endgroup +% \end{macrocode} +% \end{macro} +% \begin{macro}{\obeyspaces} +% The appearance of a space when \cs{obeyspaces} is +% in effect must also be modified. By inserting a \cs{leavevmode}, we +% will not lose spaces at the beginning of a line. +% \begin{macrocode} +\begingroup + \obeyspaces\gdef {\leavevmode\space}% +\endgroup +% \end{macrocode} +% \end{macro} +% \begin{macro}{\CodeFinish} +% After the code, \cs{CodeFinish} is called to terminate the mode. +% It adds the needed vertical space. +% \begin{macrocode} +\def \CodeFinish {\ifCodePar + \def \Next {\endgraf \vskip -\baselineskip \vskip \DisplayPostSkip + \global\Indentfalse }% + \else + \let \Next = \relax + \fi \Next } +% \end{macrocode} +% \end{macro} +% \begin{macro}{<code>} +% Time has come to write the user interface. The \stenv{code} +% environment reads the code as parameter to the command \cs{ReadCode}. +% \begin{macrocode} +\Cdef {code}{\NewEnvir{code}{\begingroup}{\endgroup}% + \CodeSetup \ReadCode } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ReadCode} +% \begin{macro}{</code>} +% \cs{ReadCode} just inserts the code (which is parameter "#1") +% and terminates the environment. +% \begin{macrocode} +\begingroup + \catcode `\< = 12 + \gdef \ReadCode #1</code>{#1\CodeFinish\EndEnvir{code}}% +\endgroup +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{<codefile>} +% \stcs{codefile} checks for correct syntax. If the file name is given +% properly, \cs{ReadCodeFile} is called to perform the actual reading. +% \begin{macrocode} +\Cdef {codefile}{\IfNextChar{[}% + {\ReadCodeFile}% + {\Error{No code file name given;}% + {the syntax is <codefile>[file name].}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\ReadCodeFile} +% \cs{ReadCodeFile} just reads the specified file +% \begin{macrocode} +\def \ReadCodeFile [#1]{\endgraf \begingroup + \CodeSetup + \IfFileExists{#1}{\input #1}% + {\Error{Code file `#1' cound not be found.}{}} + \CodeFinish \endgroup } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Footnotes} +% \begin{macro}{<footnote>} +% \begin{macro}{</footnote>} +% Implementing footnotes is easy, as the mechanism is ready in plain +% \TeX\@. +% \begin{macrocode} +\Cdef {footnote}{\NewEnvir{footnote}% + {\global\advance \FootnoteCnt by 1 + \footnote{\FootnoteIm{\FootnoteCnt}}\bgroup + \edef \CurDef {\the\FootnoteCnt}}% + {\egroup}% + \ResetFont \SetSize{S}} +\Cdef {/footnote}{\EndEnvir{footnote}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\FootnoteCnt} +% We must remember to declare the footnote counter: +% \begin{macrocode} +\newcount \FootnoteCnt +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Page headers and footers} +% By default, \starTeX{} has the same headers and footer as \TeX\@. +% The footer must, however, be redefined so that it always uses the +% same font as the body text. +% \begin{macrocode} +\footline = {\ResetFont\SelectFont \hfil \folio \hfil} +% \end{macrocode} +% +% \subsection{Customization} +% This section contains definitions that are likely to be changed in +% local adaptions. +% +% \subsubsection{Sizes} +% \begin{macro}{\DisplayIndent} +% \begin{macro}{\DisplayParSkip} +% \begin{macro}{\DisplayPostSkip} +% \begin{macro}{\DisplayPreskip} +% The following four sizes determine the appearance of displays. +% \begin{macrocode} +\def \DisplayIndent {\ListIndent} +\def \DisplayParSkip {\ListParSkip} +\def \DisplayPostSkip {5pt plus 2pt minus 1pt\relax} +\def \DisplayPreSkip {5pt plus 2pt minus 1pt\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\ListIndent} +% \begin{macro}{\ListParSkip} +% \begin{macro}{\ListSkip} +% The next three are used when setting lists. +% \begin{macrocode} +\def \ListIndent {25pt\relax} +\def \ListParSkip {\ListSkip} +\def \ListSkip {10pt plus 2pt minus 1pt\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Formats} +% \begin{macro}{\SectIim} +% \begin{macro}{\SectIIim} +% \begin{macro}{\SectIIIim} +% \begin{macro}{\SectIVim} +% \cs{SetcIim}, \cs{SectIIim}, \cs{SectIIIim} and \cs{SectIVim} define +% what the section number at various levels should look +% like. +% \begin{macrocode} +\def \SectIim {\the\SectI} +\def \SectIIim {\SectIim.\the\SectII} +\def \SectIIIim {\SectIIim.\the\SectIII} +\def \SectIVim {\SectIIIim.\the\SectIV} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\FootnoteIm} +% \cs{FootnoteIm} defines the appearance of the footnote mark; "#1" is +% the footnote number. +% \begin{macrocode} +\def \FootnoteIm #1{$^{\the #1}$} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\FigIm} +% \begin{macro}{\TabIm} +% \cs{FigIm} and \cs{TabIm} define the appearance of the figure and +% table counters, respectively. +% \begin{macrocode} +\def \FigIm {\the\FigCnt} +\def \TabIm {\the\TabCnt} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macro}{\BulletItemFormat} +% \begin{macro}{\NumItemFormat} +% The two commands \cs{BulletItemFormat} and \cs{NumItemFormat} define +% the appearance of the marks used by \stcs{item} and \stcs{numitem}, +% respectively. +% \begin{macrocode} +\def \BulletItemFormat {$\bullet$\kern 6pt\relax} +\def \NumItemFormat #1{\the#1.\kern 4pt\relax} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Character set} +% This version of \starTeX{} uses \textsc{iso}~8859-1 as its standard +% character set. (Users of other character sets will have to modify +% this.) +% +% \begin{macro}{\E} +% \cs{E} is used to redefine the encoding of a character; this is +% done by making the character active. "#1" is the character's number, +% and "#2" is the \TeX{} code to which it is to be defined. +% The implementation of \cs{E} uses the standard technique of +% defining a \cs{uccode} and then calling \cs{uppercase} to +% insert the correct character where it is defined.) +% \begin{macrocode} +\def \E #1#2{\catcode#1 = \active + \begingroup \uccode`\~ = #1\uppercase{\endgroup \def ~{#2}}} +% \end{macrocode} +% \end{macro} +% There are five different kinds of reencoding: +% \begin{itemize} +% \item Some characters are reencoded to a different character in the +% same font using the \cs{char} primitive; examples are +% 161~({\StdECR \symbol{189}}) and 163~({\StdECR \symbol{191}}). +% \end{itemize} +% \begin{macrocode} +\E{161}{\char189 } \E{163}{\char191 } \E{167}{\char159 } +\E{171}{\char19 } \E{184}{\char11 } \E{187}{\char20 } +\E{191}{\char190 } \E{223}{\char255 } \E{255}{\char184 } +% \end{macrocode} +% +% \begin{macro}{\CC} +% \begin{itemize} +% \item Other characters can be found in the \emph{Companion font}, +% known to \starTeX{} as the Alternate font. The macro \cs{CC} is +% used for this; its parameter "#1" is the character's position in the +% companion font. Examples are 162~({\CompECR \symbol{162}}) and +% 164~({\CompECR \symbol{164}}). +% \end{itemize} +% \begin{macrocode} +\def \CC #1{{\def\FontAlt{A}\SelectFont \char#1}} +\E{162}{\CC{162}} \E{164}{\CC{164}} \E{165}{\CC{165}} +\E{166}{\CC{166}} \E{168}{\CC{168}} \E{169}{\CC{169}} +\E{170}{\CC{170}} \E{172}{\CC{172}} \E{174}{\CC{174}} +\E{175}{\CC{175}} \E{176}{\CC{176}} \E{180}{\CC{180}} +\E{182}{\CC{182}} \E{186}{\CC{186}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MC} +% \begin{itemize} +% \item A few characters are math characters, like 185~({\CompECR +% \symbol{185}}) and 246~({\CompECR \symbol{246}}). They are defined using +% the macro \cs{MC} which has two parameters: "#1" is the character's +% position in the companion font to be used in text mode, and +% "#2" is some \TeX{} code to be used in math mode. +% \end{itemize} +% \begin{macrocode} +\def \MC #1#2{\ifmmode #2 \else \CC{#1}\fi } +\E{177}{\MC{177}{\pm}} \E{178}{\MC{178}{^2{}}} +\E{179}{\MC{179}{^3{}}} \E{181}{\MC{181}{\mu}} +\E{183}{\MC{183}{\cdot}} \E{185}{\MC{185}{^1{}}} +\E{188}{\MC{188}{{1\over4}}} \E{189}{\MC{189}{{1\over2}}} +\E{190}{\MC{190}{{3\over4}}} \E{215}{\MC{214}{\times}} +\E{247}{\MC{246}{\div}} +% \end{macrocode} +% \end{macro} +% +% \begin{itemize} +% \item Character 160 is a ``non-break space'' which is treated just +% like a \textasciitilde{} in \TeX. +% \end{itemize} +% \begin{macrocode} +\E{160}{\nobreak\ } +% \end{macrocode} +% +% \begin{itemize} +% \item Character 173 is a ``soft hyphen'' which is treated like "\-" +% in \TeX. +% \end{itemize} +% \begin{macrocode} +\E{173}{\-} +% \end{macrocode} +% +% \subsubsection{Language-specific definitions} +% \begin{macro}{\Abstractname} +% \begin{macro}{\Figurename} +% \begin{macro}{\Tablename} +% These three names vary from one language to another. +% \begin{macrocode} +\def \AbstractName {Abstract} +\def \FigureName {Figure} +\def \TableName {Table} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\TimeSep} +% Not all languages use a ``\texttt{:}'' to separate the hours, +% minutes, and seconds. +% \begin{macrocode} +\def \TimeSep {:} +% \end{macrocode} +% \end{macro} +% \begin{macro}{<today>} +% \begin{macro}{\Month} +% \begin{macro}{\Th} +% The \stcs{today} command should be redefined for each language. +% To simplify the code, two auxiliary macros are defined: \cs{Month} +% gives the name of the month, and \cs{Th} gives the correct suffix +% for the day of the month. +% \begin{macrocode} +\Cdef {today}{\the\day\Th{\day} \Month\space\the\year} +\def \Month {\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 } +\def \Th #1{% + \ifnum #1=1 st\else\ifnum #1=21 st\else\ifnum #1=31 st\else + \ifnum #1=2 nd\else\ifnum #1=22 nd\else + \ifnum #1=3 rd\else\ifnum #1=23 rd\else th\fi\fi\fi\fi\fi\fi\fi } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{<now>} +% The \stcs{now} command will quite probably remain unchanged for most +% languages (except for the \cs{TimeSep}; see above), but is given +% here just the same. +% \begin{macrocode} +\Cdef {now}{\Minutes = \time \Hours = \Minutes + \divide \Hours by 60 \Htemp = \Hours \multiply \Htemp by -60 + \advance \Minutes by \Htemp + \the\Hours \TimeSep \ifnum \Minutes > 9 \else 0\fi \the\Minutes } +% \end{macrocode} +% The three counters used by \stcs{now} must be defined. +% \begin{macrocode} +\newcount \Minutes \newcount \Hours \newcount \Htemp +% \end{macrocode} +% \end{macro} +% +% \subsection{Math mode} +% A few modifications to the \TeX{} math mode are necessary. +% +% The "<" character must be active also in math mode. +% \begin{macrocode} +\mathcode`< = "8000 +% \end{macrocode} +% \begin{macro}{<math>} +% \begin{macro}{</math>} +% The inline math mode "$"\dots"$" is called \stenv{math} in \starTeX. +% \begin{macrocode} +\Cdef {math}{\MathFonts \NewEnvir{math}{$}{$}} +\Cdef {/math}{\EndEnvir{math}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{<displaymath>} +% \begin{macro}{</displaymath>} +% The display math environment "$$"\dots"$$" is also available in +% \starTeX{} using the notation \stenv{displaymath}. +% \begin{macrocode} +\Cdef {displaymath}{\endgraf \MathFonts \NewEnvir{displaymath}{$$}{$$}} +\Cdef {/displaymath}{\EndEnvir{displaymath}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Math fonts} +% \begin{macro}{\MSetFont} +% The \cs{MSetFont} macro is used to simplify the definition of math +% fonts. It takes two parameters: "#1" is the math font element being +% defined (i.e., \cs{textfont0}), and "#2" is the font name. +% \begin{macrocode} +\def \MSetFont #1#2{\font \NewMFont = \csname #2\endcsname + #1 = \NewMFont } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MathFonts} +% The \cs{MathFonts} macro is called whenever math mode is entered. It +% will define all the required math fonts. To avoid unnecessary work, +% new fonts will only be assigned if the font size has changed since +% the last time. +% \begin{macrocode} +\def \MathFonts {\if \FontSize \LastMathSize \else + \MSetFont{\textfont0}{M-\FontSize N0}% + \MSetFont{\scriptfont0}{M-\FontSize S0}% + \MSetFont{\scriptscriptfont0}{M-\FontSize X0}% + \MSetFont{\textfont1}{M-\FontSize N1}% + \MSetFont{\scriptfont1}{M-\FontSize S1}% + \MSetFont{\scriptscriptfont1}{M-\FontSize X1}% + \MSetFont{\textfont2}{M-\FontSize N2}% + \MSetFont{\scriptfont2}{M-\FontSize S2}% + \MSetFont{\scriptscriptfont2}{M-\FontSize X2}% + \MSetFont{\textfont3}{M-\FontSize N3}% + \MSetFont{\scriptfont3}{M-\FontSize S3}% + \MSetFont{\scriptscriptfont3}{M-\FontSize X3}% + \MSetFont{\textfont4}{M-\FontSize N4}% + \MSetFont{\scriptfont4}{M-\FontSize S4}% + \MSetFont{\scriptscriptfont4}{M-\FontSize X4}% + \MSetFont{\textfont5}{M-\FontSize N5}% + \MSetFont{\scriptfont5}{M-\FontSize S5}% + \MSetFont{\scriptscriptfont5}{M-\FontSize X5}% + \MSetFont{\textfont6}{M-\FontSize N6}% + \MSetFont{\scriptfont6}{M-\FontSize S6}% + \MSetFont{\scriptscriptfont6}{M-\FontSize X6}% + \let \LastMathSize = \FontSize + \fi } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LastMathSize} +% \cs{LastMathSize} contains the last math size used. It +% must be initialized to an unused value so that the math fonts are +% always loaded the first time math mode is entered. +% \begin{macrocode} +\def \LastMathSize {?} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Letters} +% The standard 26 letters are already defined, but we must define the +% others, like `\'e' and `\AA'. These are taken from the \textsc{ecti} +% font (number~5 in \starTeX). +% \begin{macrocode} +\def \Df #1{\mathcode"#1 = "05#1 \relax } +\Df{C0}\Df{C1}\Df{C2}\Df{C3}\Df{C4}\Df{C5}\Df{C6}\Df{C7} +\Df{C8}\Df{C9}\Df{CA}\Df{CB}\Df{CC}\Df{CD}\Df{CE}\Df{CF} +\Df{D0}\Df{D1}\Df{D2}\Df{D3}\Df{D4}\Df{D5}\Df{D6} +\Df{D8}\Df{D9}\Df{DA}\Df{DB}\Df{DC}\Df{DD}\Df{DE}\Df{DF} +\Df{E0}\Df{E1}\Df{E2}\Df{E3}\Df{E4}\Df{E5}\Df{E6}\Df{E7} +\Df{E8}\Df{E9}\Df{EA}\Df{EB}\Df{EC}\Df{ED}\Df{EE}\Df{EF} +\Df{F0}\Df{F1}\Df{F2}\Df{F3}\Df{F4}\Df{F5}\Df{F6} +\Df{F8}\Df{F9}\Df{FA}\Df{FB}\Df{FC}\Df{FD}\Df{FE}\Df{FF} +% \end{macrocode} +% +% \subsubsection{Bold letters} +% \begin{macro}{<bolda>} +% \begin{macro}{<bolducA>} +% The bold letters \stcs{bolda}\dots\stcs{boldz} and +% \stcs{bolducA}\dots\stcs{bolducZ} are intended for use i math mode. +% They are found on the \textsc{cmbx} font (number~4 in \starTeX). +% \changes{1.04}{1999/03/10}{Added \stcs{bolda}, \stcs{bolducA}, and +% related commands.} +% \begin{macrocode} +\def \Df #1#2#3{\Cdef{bold#1}{\MSy{\mathchar"04#2}}% + \Cdef{bolduc#1}{\MSy{\mathchar"04#3}}} +\Df{a}{61}{41}\Df{b}{62}{42}\Df{c}{63}{43}\Df{d}{64}{44} +\Df{e}{65}{45}\Df{f}{66}{46}\Df{g}{67}{47}\Df{h}{68}{48} +\Df{i}{69}{49}\Df{j}{6A}{4A}\Df{k}{6B}{4B}\Df{l}{6C}{4C} +\Df{m}{6D}{4D}\Df{n}{6E}{4E}\Df{o}{6F}{4F}\Df{p}{70}{50} +\Df{q}{71}{51}\Df{r}{72}{52}\Df{s}{73}{53}\Df{t}{74}{54} +\Df{u}{75}{55}\Df{v}{76}{56}\Df{w}{77}{57}\Df{x}{78}{58} +\Df{y}{79}{59}\Df{z}{7A}{5A} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Operators} +% \begin{macro}{\MSy} +% \cs{MSy} is used to insert a mathematical symbol. It will expand to +% "#1", and insert a math mode environment ("$"\dots"$") if required. +% \begin{macrocode} +\def \MSy #1{\ifmmode #1\else $#1$\fi } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\MOp} +% \cs{MOp} is also used to insert the mathematical symbol "#2", but +% gives an error message if not in a math environment. Parameter "#1" +% is the \starTeX{} command name, which is used in the error message. +% \begin{macrocode} +\def \MOp #1#2{\ifmmode \def \MNext {#2}\else + \Error{Command <#1> is only allowed in math mode;}% + {command ignored.}\let \MNext = \relax \fi + \MNext } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Mdef} +% \cs{Mdef} is used to define a \starTeX{} mathematical symbol +% command whenever the \starTeX{} command is +% identical to the name of the +% corresponding \TeX{} macro; parameter "#1" is the name of both. +% \begin{macrocode} +\def \Mdef #1{\Cdef{#1}{\MSy{\csname #1\endcsname}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Odef} +% \cs{Odef} is similar to \cs{Mdef} but is for definitions based on +% \cs{MOp} rather than \cs{MSy}. +% \begin{macrocode} +\def \Odef #1{\Cdef{#1}{\MOp{#1}{\csname #1\endcsname}}} +% \end{macrocode} +% \end{macro} +% These commands are now used to define all the standard unary and +% binary operators. +% \begin{macrocode} +\Mdef{amalg} \Mdef{bigcirc} \Mdef{bigtriangleup} +\Mdef{bigtriangledown} \Mdef{bullet} \Mdef{cap} \Mdef{circ} +\Mdef{cup} \Mdef{dagger} \Mdef{ddagger} \Mdef{diamond} \Mdef{mp} +\Mdef{odot} \Mdef{ominus} \Mdef{oplus} \Mdef{oslash} \Mdef{otimes} +\Mdef{setminus} \Mdef{sqcap} \Mdef{sqcup} \Mdef{star} +\Mdef{triangleleft} \Mdef{triangleright} \Mdef{uplus} \Mdef{vee} +\Mdef{wedge} \Mdef{wr} +% \end{macrocode} +% +% \subsubsection{Relations} +% These are the various relations available. +% \changes{1.01}{1996/11/29}{Added forgotten operator \stcs{propto}.} +% \begin{macrocode} +\Mdef{approx} \Mdef{asymp} \Mdef{bowtie} \Mdef{cong} \Mdef{doteq} +\Mdef{dashv} \Mdef{equiv} \Mdef{frown} \Mdef{geq} \Mdef{gg} \Mdef{in} +\Mdef{leq} \Mdef{ll} \Mdef{mid} \Mdef{models} \Mdef{neq} \Mdef{ni} +\Mdef{notin} \Mdef{parallel} \Mdef{perp} \Mdef{prec} \Mdef{preceq} +\Mdef{propto} \Mdef{sim} \Mdef{simeq} \Mdef{smile} \Mdef{sqsubseteq} +\Mdef{sqsupseteq} \Mdef{subset} \Mdef{subseteq} \Mdef{supset} +\Mdef{supseteq} \Mdef{succ} \Mdef{succeq} \Mdef{vdash} +% \end{macrocode} +% \begin{macro}{<gt>} +% \begin{macro}{<lt>} +% The two symbols \stcs{gt} and \stcs{lt} must be defined; the former +% is not really necessary, but is included for symmetry reasons. Note +% also that the definition of \stcs{lt} is slightly tricky since "<" +% is an active symbol in math mode. +% \begin{macrocode} + \Cdef{gt}{>} + \Cdef{lt}{\ifmmode \mathchar"313C \else <\fi} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Delimitiers} +% In addition to (), [], $\{\}$ and $\vert$, the following delimiters +% are defined: +% \begin{macrocode} +\Mdef{langle} \Mdef{lceil} \Mdef{lfloor} \Mdef{rangle} +\Mdef{rceil} \Mdef{rfloor} +% \end{macrocode} +% +% \subsubsection{Arrows} +% All the standard arrows are included. +% \begin{macrocode} +\Mdef{leftarrow} \Mdef{rightarrow} \Mdef{leftrightarrow} +\Mdef{longleftarrow} \Mdef{longrightarrow} \Mdef{longleftrightarrow} +\Mdef{uparrow} \Mdef{downarrow} +\Mdef{updownarrow} \Mdef{nearrow} \Mdef{nwarrow} \Mdef{searrow} +\Mdef{swarrow} \Mdef{mapsto} \Mdef{longmapsto} \Mdef{hookleftarrow} +\Mdef{hookrightarrow} \Mdef{leftharpoonup} \Mdef{rightharpoonup} +\Mdef{leftharpoondown} \Mdef{rightharpoondown} \Mdef{rightleftharpoons} +% \end{macrocode} +% In \TeX, some arrows use uppercase letters to indicate double +% arrows. I use the prefix "double" instead. +% \begin{macrocode} +\Cdef{doubleleftarrow}{\MSy{\Leftarrow}} +\Cdef{doublerightarrow}{\MSy{\Rightarrow}} +\Cdef{doubleleftrightarrow}{\MSy{\Leftrightarrow}} +\Cdef{doublelongleftarrow}{\MSy{\Longleftarrow}} +\Cdef{doublelongrightarrow}{\MSy{\Longrightarrow}} +\Cdef{doublelongleftrightarrow}{\MSy{\Longleftrightarrow}} +\Cdef{doubleuparrow}{\MSy{\Uparrow}} +\Cdef{doubledownarrow}{\MSy{\Downarrow}} +\Cdef{doubleupdownarrow}{\MSy{\Updownarrow}} +% \end{macrocode} +% +% \subsubsection{Big symbols} +% These are the big symbols. +% \begin{macrocode} +\Odef{bigcap} \Odef{bigcup} \Odef{bigodot} \Odef{bigoplus} +\Odef{bigotimes} \Odef{bigsqcup} \Odef{biguplus} \Odef{bigvee} +\Odef{bigwedge} \Odef{int} \Odef{oint} \Odef{prod} \Odef{sum} +% \end{macrocode} +% +% \subsubsection{Function names} +% Some names are defined as commands to ensure that they will be +% printed in the correct font. +% \changes{1.01}{1996/11/29}{Name of \cs{sup} operator changed to +% \stcs{sup-op} because of name clash with the \stcs{sup} command used +% for indices. (Detected by Marco Paggi, +% \textsf{aampaggi@input.lognet.it}.)} +% \begin{macrocode} +\Mdef{arccos} \Mdef{arcsin} \Mdef{arctan} \Mdef{arg} \Mdef{cos} +\Mdef{cosh} \Mdef{cot} \Mdef{coth} \Mdef{csc} \Mdef{deg} \Mdef{det} +\Mdef{dim} \Mdef{exp} \Mdef{gcd} \Mdef{hom} \Mdef{inf} \Mdef{ker} +\Mdef{lg} \Mdef{lim} \Mdef{liminf} \Mdef{limsup} \Mdef{ln} +\Mdef{log} \Mdef{max} \Mdef{min} \Mdef{sec} \Mdef{sin} \Mdef{sinh} +\Cdef{sup-op}{\MSy{\sup}} \Mdef{tan} \Mdef{tanh} +% \end{macrocode} +% \stcs{pr} must be given a special definition as its name in plain \TeX{} +% has an uppercase letter. +% \begin{macrocode} +\Cdef{pr}{\MSy{\Pr}} +% \end{macrocode} +% +% \subsubsection{Greek letters} +% The lowercase Greek letters can be found just using the plain \TeX{} +% name. +% \begin{macrocode} +\Mdef{alpha} \Mdef{beta} \Mdef{gamma} \Mdef{delta} \Mdef{epsilon} +\Mdef{varepsilon} \Mdef{zeta} \Mdef{eta} \Mdef{theta} \Mdef{vartheta} +\Mdef{iota} \Mdef{kappa} \Mdef{lambda} \Mdef{mu} \Mdef{nu} \Mdef{xi} +\Cdef {omicron}{\MSy{o}} \Mdef{pi} \Mdef{varpi} \Mdef{rho} \Mdef{varrho} +\Mdef{sigma} \Mdef{varsigma} \Mdef{tau} \Mdef{upsilon} \Mdef{phi} +\Mdef{varphi} \Mdef{chi} \Mdef{psi} \Mdef{omega} +% \end{macrocode} +% The uppercase Greek letters can be found in the \textsc{cmr} +% font, which is font no 0 in \starTeX. +% Those that also exist in the Latin alphabet, can be found in their +% normal position, while the special Greek letters are placed at the +% beginning of the font table. +% \begin{macrocode} +\def \Df #1#2{\Cdef{#1}{\MSy{\mathchar"#2}}} +\Df{ucalpha}{0041} \Df{ucbeta}{0042} \Df{ucgamma}{0000} +\Df{ucdelta}{0001} \Df{ucepsilon}{0045} \Df{uczeta}{005A} +\Df{uceta}{0048} \Df{uctheta}{0002} \Df{uciota}{0049} +\Df{uckappa}{004B} \Df{uclambda}{0003} \Df{ucmu}{004D} +\Df{ucnu}{004E} \Df{ucxi}{0004} \Df{ucomicron}{004F} +\Df{ucpi}{0005} \Df{ucrho}{0050} \Df{ucsigma}{0006} +\Df{uctau}{0054} \Df{ucupsilon}{0007} \Df{ucphi}{0008} +\Df{ucchi}{0058} \Df{ucpsi}{0009} \Df{ucomega}{000a} +% \end{macrocode} +% +% \subsubsection{Blackboard set letters} +% The socalled ``blackboard bold'' letters $\Bbb{C}$, $\Bbb{N}$, +% $\Bbb{R}$ and $\Bbb{Z}$ are used to denote the standard sets. +% \changes{1.03}{1998/04/30}{Added the various set names. (Suggested +% by Christian Sommerfeldt \O{}ien, \textsf{christso@ifi.uio.no}.)} +% \begin{macrocode} +\def \Df #1#2{\Cdef{#1}{\MSy{\mathchar"06#2}}} +\Df{cset}{43} \Df{nset}{4E} \Df{rset}{52} \Df{zset}{5A} +% \end{macrocode} +% +% \subsubsection{Calligraphic letters} +% \begin{macro}{cala} +% The calligraphic letters can be found in font~2. +% \changes{1.04}{1999/03/10}{Fixed a bug in the \stcs{calA} and +% related commands.} +% \begin{macrocode} +\def \Df #1#2{\Cdef{cal#1}{\MSy{\mathchar"02#2}}} +\Df{a}{41} \Df{b}{42} \Df{c}{43} \Df{d}{44} \Df{e}{45} +\Df{f}{46} \Df{g}{47} \Df{h}{48} \Df{i}{49} \Df{j}{4A} +\Df{k}{4B} \Df{l}{4C} \Df{m}{4D} \Df{n}{4E} \Df{o}{4F} +\Df{p}{50} \Df{q}{51} \Df{r}{52} \Df{s}{53} \Df{t}{54} +\Df{u}{55} \Df{v}{56} \Df{w}{57} \Df{x}{58} \Df{y}{59} +\Df{z}{5A} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Other symbols} +% A few symbols are left. +% \begin{macrocode} +\Mdef{aleph} \Mdef{angle} \Mdef{bot} \Mdef{ell} \Mdef{emptyset} +\Mdef{exists} \Mdef{forall} \Mdef{hbar} \Mdef{nabla} \Mdef{neg} +\Odef{not} \Mdef{partial} \Mdef{surd} \Mdef{top} \Mdef{wp} +\Cdef{infinity}{\MSy{\infty}} \Cdef{im}{\MSy{\Im}} \Cdef{re}{\MSy{\Re}} +\Cdef{,}{{,}} +\Cdef{:}{\MSy{\vdots}} +\Cdef{:::}{\MSy{\cdots}} +% \end{macrocode} +% \begin{macro}{<...>} +% The definition of \stcs{...} has a minute space to allow \starTeX{} +% to split the line. +% \begin{macrocode} +\Cdef{...}{\MSy{\ldots}\hskip 0.001pt \relax } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Subscripts and superscripts} +% \begin{macro}{<sub>} +% \begin{macro}{</sub>} +% \begin{macro}{<sup>} +% \begin{macro}{</sup>} +% The sub- and superscripts in equations are accessible through +% \stenv{sub} and \stenv{sup}. +% \begin{macrocode} +\Cdef {sub}{\MOp{sub}{\NewEnvir{sub}{_\bgroup}{\egroup}}} +\Cdef {/sub}{\MOp{/sub}{\EndEnvir{sub}}} +\Cdef {sup}{\MOp{sup}{\NewEnvir{sup}{^\bgroup}{\egroup}}} +\Cdef {/sup}{\MOp{/sup}{\EndEnvir{sup}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Fractions} +% \begin{macro}{<frac>} +% \begin{macro}{<over>} +% \begin{macro}{</frac>} +% Fractions are set with in a +% \stcs{frac}\dots\stcs{over}\dots\stcs{/frac} environment. +% \begin{macrocode} +\Cdef {frac}{\MOp{frac}{\NewEnvir{frac}{\bgroup}{\egroup}% + \NOver = 0\relax}} +\Cdef {over}{\MOp{over}{\FracOver}} +\Cdef {/frac}{\MOp{/frac}{\ifnum \NOver = 0 + \Error{No <over> in the <frac>...<over>...</frac> environment.}{}\fi + \EndEnvir{frac}}} +\def \FracOver {\ifTextEqual{\CurEnv}{frac}% + \ifnum \NOver = 0 \over + \else \Error{Only one <over> may occur in each <frac>...</frac> + environment.}{}% + \fi \advance \NOver by 1 + \else \Error{<over> only allowed in a + <frac>...<over>...</frac> environment.}{}% + \fi } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% To check for legal use of \stcs{over}, a counter named \cs{NOver} is +% used. +% \begin{macrocode} +\newcount \NOver +% \end{macrocode} +% +% \subsubsection{Roots} +% \begin{macro}{<sqrt>} +% \begin{macro}{</sqrt>} +% The \stenv{sqrt} environment is just an interface to the \cs{sqrt} +% macro in plain \TeX. +% \begin{macrocode} +\Cdef {sqrt}{\MOp{sqrt}{\NewEnvir{sqrt}{\sqrt\bgroup}{\egroup}}} +\Cdef {/sqrt}{\MOp{/sqrt}{\EndEnvir{sqrt}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{PostScript figures} +% \begin{macro}{<psfig>} +% \begin{macro}{</psfig>} +% \starTeX{} allows the inclusion of \ps{} figures through the +% \stenv{psfig} environment. It checks if the command is allowed in the +% current state, and, if it is, \cs{PSfig} is called; if not, +% \cs{PSfigError} is called instead. +% \begin{macrocode} +\Cdef {psfig}{\if \State x \let \Next = \PSfig \else + \let \Next = \PSfigError \fi + \Next } +\Cdef {/psfig}{\AddVspace{6pt plus 1pt} + \ifx \PSfile \relax \else + \centerline{\epsfbox{\PSfile}}% + \AddVspace{10pt plus 2pt minus 1pt} + \fi + \EndEnvir{psfig}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% The actual inclusion of the \ps{} file in handled by \cs{epsfbox} +% from the file \texttt{epsf.tex} which is provided with the +% \textsc{dvips} program. +% \begin{macrocode} +\input epsf.tex +% \end{macrocode} +% \begin{macro}{\PSfig} +% \cs{PSfig} checks whether the user has remembered to provide the +% file name; if so, \cs{PSfetch} is called to check the \ps{} file. +% \begin{macrocode} +\def \PSfig{\NewEnvir{psfig}{\topinsert}{\endinsert} + \let \PSfile = \relax \let \State = p + \IfNextChar{[}% + {\PSfetch}% + {\Error{No file name for PostScript figure;}% + {the syntax is: <psfig>[file name]caption text</psfig>.}% + \PScaption}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\PSfigError} +% \cs{PSfigError} gives an error message and starts a dummy +% environment. +% \begin{macrocode} +\def \PSfigError {\endgraf + \Error{Calls on <psfig> not allowed inside <psfig> or <table>;}% + {the command was ignored.}% + \NewEnvir{psfig}{\begingroup}{\endgroup}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\PSfetch} +% \cs{PSfetch} checks that the \ps{} exists, and notes its name in +% \cs{PSfile}. +% \begin{macrocode} +\def \PSfetch [#1]{\IfFileExists{#1}% + {\gdef \PSfile {#1}}% + {\Error{PostScript file `#1' could not be found.}{}}% + \PScaption } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\epsfsize} +% \cs{epsfsize} is used by \cs{epsfbox} to scale the \ps{} figure. +% We want figures to fill either 80\% of the text width or 40\% of the +% text height. This is done by comparing +% $\frac{0.8\mbox{\cs{hsize}}}{\mathtt{\#1}}$ and +% $\frac{0.4\mbox{\cs{vsize}}}{\mathtt{\#2}}$, where "#1" and "#2" +% are the horizontal and vertical original sizes of the the figure. +% \begin{macrocode} +\def \epsfsize #1#2{0pt \dimen1 = 0.8\hsize \dimen2 = 0.4\vsize + \floatdiv{\dimen2}{#1}{#2}% + \ifdim \dimen1 < \divres \epsfxsize = 0.8\hsize + \else \epsfysize = 0.4\vsize \fi } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\PScaption} +% The formatting of the caption is done by \cs{PScaption}: +% \begin{macrocode} +\def \PScaption {\global\advance \FigCnt by 1 + \edef \CurDef {\the\FigCnt} + \leftskip = 0.1\hsize \rightskip = \leftskip + \ResetFont \SetSize{S}\Indentfalse + \FigureName~\FigIm: \ignorespaces } +% \end{macrocode} +% \end{macro} +% \cs{PScaption} needs a counter to count the figures: +% \begin{macrocode} +\newcount \FigCnt +% \end{macrocode} +% +% \subsection{Tables} +% \begin{macro}{<table>} +% \begin{macro}{</table>} +% Tables are created with the \stenv{table} environment. It checks whether +% the command is allowed in the current state and calls +% \cs{Table} if it is; otherwise it calls \cs{TableError}. +% \begin{macrocode} +\Cdef {table}{\if \State x\let \Next = \Table \else + \let \Next = \TableError \fi + \Next } +\Cdef {/table}{\EndEnvir{table}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% The table is temporarily placed in a box so that it may be centered +% when output. +% \begin{macrocode} +\newbox \TableBox +% \end{macrocode} +% \begin{macro}{\Table} +% \cs{Table} starts the table environment. +% \begin{macrocode} +\def \Table{\topinsert + \NewEnvir{table}{\TableCaption}{\LastRow\endinsert}% + \let \State = t} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\TableCaption} +% The formatting of the table caption is done by \cs{TableCaption}: +% \begin{macrocode} +\def \TableCaption {\global\advance \TabCnt by 1 + \edef \CurDef {\the\TabCnt} + \leftskip = 0.1\hsize \rightskip = \leftskip + \ResetFont \SetSize{S}\Indentfalse + \TableName~\TabIm: \ignorespaces } +% \end{macrocode} +% \end{macro} +% \cs{TableCaption} needs a counter to count the tables: +% \begin{macrocode} +\newcount \TabCnt +% \end{macrocode} +% \begin{macro}{\TableError} +% \cs{TableError} gives an error message and starts a dummy +% environment. +% \begin{macrocode} +\def \TableError {\endgraf + \Error{Calls on <table> not allowed inside <psfig> + or <table>;}{the command was ignored.}% + \NewEnvir{table}{\begingroup}{\endgroup}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Table rows} +% \begin{macro}{<row>} +% \begin{macro}{\Row} +% The command \stcs{row} is the interface to \cs{Row} which is used to +% start another table row. Its actions depend on the current state. +% \begin{macrocode} +\Cdef {row}{\Row} +\def \Row {\if \State t\FirstRow\NewRow \else + \if \State r\EndRow\NewRow \else + \Error{The <row> command is only allowed inside a + <table>.}{The command was ignored.}\fi\fi } +% \end{macrocode} +% \end{macro} +% \end{macro} +% \begin{macro}{\FirstRow} +% \cs{FirstRow} is called prior to the first table row. +% \begin{macrocode} +\def \FirstRow {\endgraf \ResetFont \SelectFont \let \State = r% + \setbox\TableBox = \hbox\bgroup \vbox\bgroup \offinterlineskip + \halign\bgroup \vrule ##\strut&& + \kern 6pt \hfil ##\unskip \hfil \kern 6pt \vrule \cr + \noalign{\hrule}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\NewRow} +% \cs{NewRow} is used to start another table row. +% \begin{macrocode} +\def \NewRow {&} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\EndRow} +% The command \cs{EndRow} is used to terminate the current table row. +% \begin{macrocode} +\def \EndRow {\cr \noalign{\hrule}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LastRow} +% The command \cs{LastRow} is used to terminate the last table row. +% \begin{macrocode} +\def \LastRow {\if \State r\EndRow\PrintTable\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\PrintTable} +% \cs{PrintTable} is the final command used when processing a table. +% It terminates the table structure and outputs it. +% \begin{macrocode} +\def \PrintTable {\egroup\egroup\egroup + \AddVspace{6pt plus 2pt minus 1pt} + \centerline{\box\TableBox}% + \AddVspace{10pt plus 4pt minus 2pt}} +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Table columns} +% \begin{macro}{<col>} +% \stcs{col} is used to start another table column. +% \begin{macrocode} +\Cdef {col}{\if \State r&\else + \Error{The <col> command is only allowed after a <row> + inside a <table>.}{The command was ignored.}\fi} +% \end{macrocode} +% \end{macro} +% +% \subsection{Cross-references} +% This section describes the various commands used for +% cross-referencing. +% +% The basic idea is the same as the one used in \LaTeX: an extra file (with +% extension \texttt{.aux}) contains all the labels defined in the +% document. There are two reasons for this: +% \begin{itemize} +% \item Using a separate file makes it possible to have forward +% references. +% \item When processing a document, the page number of each label is +% not known until the page is actually written to the \textsc{dvi} +% file. The \cs{write} command is, consequently, delayed until that stage +% of the processing, so using a file will always give us the +% correct page number. +% \end{itemize} +% \begin{macro}{\ifAuxOpen} +% The \texttt{.aux} file is only created when there are \stcs{label} +% commands in the document. The first \stcs{label} creates the file, +% and the flag \cs{ifAuxOpen} indicates whether this has been done. +% \begin{macrocode} +\newif \ifAuxOpen +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Defining labels} +% \begin{macro}{<label>} +% \stcs{label} is used to define another cross-reference label. The +% value of the label is the current value of \cs{CurDef} which is set +% by \stcs{h1}, \stcs{table}, etc. +% +% \stcs{label} first checks the syntax, and then alters the +% \cs{catcode} of "<" in case there are any "<"s in the label. +% Finally, it calls \cs{NewLabel} to perform the actual definition. +% \begin{macrocode} +\Cdef {label}{\IfNextChar{[}% + {\begingroup \catcode`\< = 12 \NewLabel}% + {\Error{No label given;}% + {the syntax is <label>[your label].}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\NewLabel} +% \cs{NewLabel} first reads the old ".aux" file (unless it has already +% been read) and opens a new ".aux" file (unless that has been done). +% \begin{macrocode} +\def \NewLabel [#1]{\endgroup + \ifAuxRead \else \ReadAuxFile \fi + \ifAuxOpen \else + \immediate\openout \NewAuxFile = \jobname.aux + \global\AuxOpentrue \fi +% \end{macrocode} +% Then, it checks whether the label has been previously defined, and +% prints an error message if it has been. Otherwise, it notes the +% definition and writes the necessary data to the ".aux" +% file.\footnote{Note the trick of redefining \cs{the} so that +% \cs{pageno} is not expanded until the page is completed. This was +% found in \cite[Exercise~21.10]{texbook}.} +% \begin{macrocode} + \expandafter\ifx \csname L]#1\endcsname \relax + \expandafter\edef \csname L]#1\endcsname{\the\inputlineno}% + {\let \the = 0\relax + \edef \WriteCurDef {\write \NewAuxFile + {\string\LabelDef + ]#1]\the\pageno]\CurDef E-o-LabelDef\string\relax}}% + \WriteCurDef }% + \else + \Error{Label `#1' already defined on line \csname L]#1\endcsname;}% + {this definition is ignored.}% + \fi } +% \end{macrocode} +% \end{macro} +% Note that when a label \emph{\texttt{xxx}} is defined, a macro named +% \cs{L]\emph{xxx}} is defined, and its definition is the line number. +% This is used to give a better error message in case there are +% multiple definitions of that label. +% +% The new ".aux" file must be declared. +% \begin{macrocode} +\newwrite \NewAuxFile +% \end{macrocode} +% We must also define an initial value for \cs{CurDef} in case the +% user calls \stcs{label} prior to the first \stcs{h\emph{x}}. +% \begin{macrocode} +\edef \CurDef {0} +% \end{macrocode} +% +% \subsubsection{Reading the cross-reference label file} +% When the user first references a label (using a \stcs{ref} command), +% the \texttt{.aux} file is read to find all the labels that were +% defined during the previous run. Each label will be represented by +% to macros: +% \begin{description} +% \item[\texttt{R]\emph{xxx}}] gives the reference, i.e.~``2.1'' if +% the label was defined in Section~2.1 of the document. +% \item[\texttt{P]\emph{xxx}}] gives the page number where the label +% was placed. +% \end{description} +% \begin{macro}{\ReadAuxFile} +% \cs{ReadAuxFile} reads the ".aux" file produced by the previous run. +% It redefines the \cs{catcode} of "<" in case that characters occurs +% in a label. +% \begin{macrocode} +\def \ReadAuxFile {\IfFileExists{\jobname.aux}% + {\begingroup + \def \LabelDef {\begingroup + \catcode `\\ = 12\relax \FetchLabel }% + \catcode `\< = 12 \catcode `\\ = 0\relax + \input \jobname.aux + \global\AuxReadtrue + \endgroup }% + {\global\Reruntrue}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\LabelDef} +% A \starTeX{} ".aux" file consists of a sequence of calls on +% \cs{LabelDef}. \cs{LabelDef} just alters the \cs{catcode} of "\" (in +% case there are "\"s in the label), and calls \cs{FetchLabel} to do +% the actual definition. +% \begin{macrocode} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\FetchLabel} +% \cs{FetchLabel} has three parameters. +% The label is parameter "#1"; it is enclosed by a set +% of "]"s.\footnote{We can be certain that no \texttt{]} occurs in the +% label.} Parameter "#2" is the referenced page number; it is also +% terminated by a "]". The label reference is parameter "#3"; it is +% terminated by the text ``\texttt{E-o-LabelDef}''. +% \begin{macrocode} +\def \FetchLabel ]#1]#2]#3E-o-LabelDef{% + \expandafter\gdef \csname R]#1\endcsname {#3}% + \expandafter\gdef \csname P]#1\endcsname {#2}% + \endgroup } +% \end{macrocode} +% \end{macro} +% The flag \cs{ifAuxRead} tells whether the ".aux" file from the +% previous run has been read. +% \begin{macrocode} +\newif \ifAuxRead +% \end{macrocode} +% The flag \cs{ifRerun} is set whenever it is detected that a new +% label has been defined or the definition of a label has been +% modified. This implies that it is necessary to run \starTeX{} +% again.\footnote{It would be nice to be able to +% do this automatically, but that is not possible with the present +% \TeX.} +% \begin{macrocode} +\newif \ifRerun +% \end{macrocode} +% +% \subsubsection{Checking the \texttt{.aux} file} +% \begin{macro}{\CheckAux} +% At the end of each run, the \texttt{.aux} file is checked by +% \cs{CheckAux} to see if +% any label were modified during the run. If so, the flag \cs{ifRerun} +% is set. +% \begin{macrocode} +\def \CheckAux {\immediate\closeout \NewAuxFile + \begingroup + \def \LabelDef {\begingroup + \catcode `\\ = 12 \relax \CheckLabel }% + \catcode `\< = 12 \catcode `\\ = 0\relax + \input \jobname.aux + \endgroup } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\CheckLabel} +% \cs{CheckLabel} does the actual checking by comparing the new +% definition with the old one. +% \begin{macrocode} +\def \CheckLabel ]#1]#2]#3E-o-LabelDef{% + \ifTextEqual{#2++#3}% + {\csname P]#1\endcsname++\csname R]#1\endcsname}% + \else + \global\Reruntrue + \fi \endgroup } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Referencing labels} +% \begin{macro}{<ref>} +% \stcs{ref} is used to reference a label. It checks the syntax, and +% calls \cs{GiveRef} to produce the actual reference. +% \begin{macrocode} +\Cdef {ref}{\IfNextChar{[}% + {\begingroup \catcode `\< = 12 \relax \GiveRef }% + {\Error{No label referenced;}{the syntax is <ref>[your label].}}} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\GiveRef} +% \cs{GiveRef} checks whether the reference has been defined, and, if +% it is defined, typesets the reference in the format specified by +% \cs{RefFormat}. +% \begin{macrocode} +\def \GiveRef [#1]{\ifAuxRead \else \ReadAuxFile \fi + \expandafter\ifx \csname R]#1\endcsname \relax + [label #1]% + \Error{Label `#1' not defined.}{}\global\Reruntrue + \else + \RefFormat{\csname R]#1\endcsname}{\csname P]#1\endcsname}% + \fi \endgroup } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\RefFormat} +% The macro \cs{RefFormat} gives the appearance of the reference. The +% default is a number followed by ``on page +% \emph{x}'' unless the reference is to the same page.\footnote{The +% page test used will not always give the correct result; if the +% reference is very near the top or the bottom of a page, +% \cs{pageno} will sometimes be 1 off. This is not a serious problem, +% as the referenced object in that case will be very close to the +% reference. +% +% This problem was solved in the \texttt{varioref}\cite{varioref} package in +% \LaTeX, but the solution is somewhat complicated, +% so I have chosen to stick with the simple solution even if it is +% not optimal.} +% \begin{macrocode} +\def \RefFormat #1#2{#1\ifTextEqual{#2}{\the\pageno}\else + \space on page~#2\fi } +% \end{macrocode} +% \end{macro} +% +% \subsection{Miscellaneous other commands} +% +% \subsubsection{Symbols and logos} +% \begin{macro}{<>} +% \begin{macro}{<->} +% \begin{macro}{<-->} +% \begin{macro}{<--->} +% \begin{macro}{<``>} +% \begin{macro}{<''>} +% \begin{macro}{<tex>} +% \begin{macro}{<latex>} +% \begin{macro}{<startex>} +% Here is the definition of some symbols that the user needs for +% quality typesetting. +% \begin{macrocode} +{\catcode`\~ = 12 \Cdef {~}{\nobreak\ }} +\Cdef {}{\null} +\Cdef {-}{\-} \Cdef {--}{--} \Cdef {---}{---} +\Cdef {``}{``} \Cdef {''}{''} +\Cdef {tex}{\TeX} \Cdef {latex}{La\TeX} \Cdef {startex}{Star\TeX} +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% +% \subsubsection{Error handling} +% \begin{macro}{\Error} +% This macro gives an error message with one or two lines of text. +% (The second line is omitted if it is empty.) +% \begin{macrocode} +\def \Error #1#2{% + \message{^^J** StarTeX error detected on line \the\inputlineno:^^J}% + \message{\space\space\space #1^^J}% + \ifTextEqual{#2}{}\else \message{\space\space\space #2^^J}\fi} +% \end{macrocode} +% \end{macro} +% \begin{macro}{\Warning} +% This macro gives a warning with one or two lines of text. +% (The second line is omitted if it is empty.) +% \begin{macrocode} +\def \Warning #1#2{% + \message{^^J** StarTeX warning:^^J}% + \message{\space\space\space #1^^J}% + \ifTextEqual{#2}{}\else \message{\space\space\space #2^^J}\fi} +% \end{macrocode} +% \end{macro} +% We need to modify the \cs{newlinechar} in order to produce a line +% feed when we want it. The \textsc{lf} character (\textsc{ascii} code +% 10 = \texttt{\symbol{94}\symbol{94}J}) seems a good choice. +% \begin{macrocode} +\newlinechar = `^^J +% \end{macrocode} +% +% \subsubsection{Comments} +% \begin{macro}{<comment>} +% \begin{macro}{</comment>} +% The environment \stenv{comment} is defined to make it possible for +% the user to add comments to his or her \starTeX{} code. It uses +% \cs{SkipComment} to fetch the comment text. +% \begin{macrocode} +\Cdef {comment}{\NewEnvir{comment}{\begingroup}{\endgroup}% + \catcode `\< = 12 \SkipComment } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\SkipComment} +% \cs{SkipComment} works just like \cs{ReadCode} for a \stenv{code} +% environment, except that the code is simply ignored. +% \begin{macrocode} +{\catcode `\< = 12 + \gdef \SkipComment #1</comment>{\EndEnvir{comment}}} +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsubsection{Text handling} +% There is very little text handling in \starTeX, but a few +% macros are necessary. +% +% \begin{macro}{\ifTextEqual} +% The macro \cs{ifTextEqual}\footnote{The name \cs{ifTextEqual} starts +% with a lowercase \cs{if}- to show its relationship to the various +% \cs{if}\dots{} macros of primitive \TeX\@. \cs{ifTextEqual} is +% used just like these, which means that it must have a corresponding +% \cs{fi}. It may also have an \cs{else} part. Note, however, that +% calls on \cs{ifTextEqual} may not occur inside other \cs{if}s.} +% tests if the two texts "#1" and "#2" are equal. +% This is achieved by letting the \TeX{} primitive \cs{ifx} do the +% job. +% \begin{macrocode} +\def \ifTextEqual #1#2{\edef \TmpA {#1}\edef \TmpB {#2}% + \ifx \TmpA\TmpB } +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\IfNextChar} +% Sometimes we need to check the next input character, for instance to +% see if it is a "[". The macro \cs{IfNextChar} expands into "#2" if +% the next input character is "#1"; otherwise it expands into "#3". +% +% The \TeX{} primitive \cs{futurelet} is used to implement +% \cs{IfNextChar}; it was designed just for this. +% Note that the call on \cs{IfNextChar} must be at the very end of the +% macro in which it occurs. +% \begin{macrocode} +\def \IfNextChar #1#2#3{\def \TestChar {#1}% + \def \AltA {#2}\def \AltB {#3}% + \futurelet \NextChar \TestNextChar } +\def \TestNextChar {% + \if \NextChar \TestChar \let\Next=\AltA \else \let\Next=\AltB \fi + \Next } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\IfNextCharTwo} +% A similar macro testing whether the following character is one of +% two possible alternatives, is also necessary. It takes four +% parameters: "#1" and "#2" are the two characters to check for, and +% the result of \cs{IfNextCharTwo} is "#3" if the next character is +% either of the two alternatives, or else "#4". +% \begin{macrocode} +\def \IfNextCharTwo #1#2#3#4{\def \TestChar {#1}\def \TestCharX {#2}% + \def \AltA {#3}\def \AltB {#4}% + \futurelet \NextChar \TestNextCharTwo } +\def \TestNextCharTwo {% + \if \NextChar \TestChar \let \Next = \AltA \else + \if \NextChar \TestCharX \let \Next = \AltA \else + \let \Next = \AltB + \fi \fi + \Next } +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Numerical operations} +% \begin{macro}{\floatdiv} +% \TeX{} has no floating-point division, so a routine like +% \cs{floatdiv} is necessary. It computes +% $\frac{\mbox{\texttt{\scriptsize \#1}}\times +% \mbox{\texttt{\scriptsize \#2}}} +% {\mbox{\texttt{\scriptsize \#3}}}$ and places the result in +% \cs{divres}.\footnote{The algorithm used is taken from the code in +% \texttt{epsf.tex}.} All parameters must be \cs{dimen} registers. +% \begin{macrocode} +\def \floatdiv #1#2#3{\divtemp = #1\divide \divtemp by #3% + \divres = #2\multiply \divres by \divtemp + \multiply \divtemp by #3% + \divrem = #1\advance \divrem by -\divtemp + \divtemp = #2% + \loop + \multiply \divrem by 2 \divide \divtemp by 2 + \ifnum \divtemp > 0 + \ifnum \divrem < #3\else + \advance \divrem by -#3\advance \divres by \divtemp + \fi + \repeat } +% \end{macrocode} +% \end{macro} +% The necessary registers must be declared: +% \begin{macrocode} +\newdimen \divrem \newdimen \divres \newdimen \divtemp +% \end{macrocode} +% +% \subsubsection{File operations} +% \begin{macro}{\ifFileExists} +% To provide better error messages, \starTeX{} tests whether a file +% exists before any attempt is made to read it. \cs{ifFileExists} +% first checks if file "#1" exists;\footnote{This checking is done by +% using \cs{ifeof} which means that empty files will be regarded as +% non-existant; this should not really be a problem.} if it does, the +% file is closed and "#2" is executed, otherwise "#3" is executed. +% \begin{macrocode} +\def \IfFileExists #1#2#3{\openin\TestFile = #1 + \ifeof\TestFile \def \Next {#3}\else + \closein\TestFile \def \Next {#2}\fi + \Next } +% \end{macrocode} +% \end{macro} +% \begin{macro}{\TestFile} +% We must also define the input file we use for testing. +% \begin{macrocode} +\newread \TestFile +% \end{macrocode} +% \end{macro} +% +% \subsubsection{Format creation} +% \begin{macro}{<make-new-format>} +% \stcs{make-new-format} is used by the system to make a new format; it +% is not intended to be called by the user. +% \begin{macrocode} +\Cdef {make-new-format}{\dump} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{<trace-on>} +% \begin{macro}{<trace-off>} +% \stcs{trace-on} is used during debugging to trace the +% expansion of commands, and \stcs{trace-off} turns this tracing off. +% Using tracing requires insight into both the inner +% mechanisms of \starTeX{} as well as \TeX{} itself. +% \begin{macrocode} +\Cdef {trace-on}{\tracingcommands = 1 \tracingmacros = 1 + \tracingrestores = 1 \tracingoutput = 1 \relax } +\Cdef {trace-off}{\tracingcommands = 0 \tracingmacros = 0 + \tracingrestores = 0 \tracingoutput = 0 \relax } +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Final initialization} +% In the final initialization, we need to load the hyphenation +% patterns defined at this site: +% \begin{macrocode} +\input startex.lan +% \end{macrocode} +% We select the default text font: +% \begin{macrocode} +\ResetFont \SetSize{N} +% \end{macrocode} +% Our very last initialization is to modify the \cs{catcode}s: +% \begin{macrocode} +\endinput \SpecialCatCodes +%</code> +% \end{macrocode} +% +% \section{Language definitions} +% This section describes the file "startex.lan" that defines which +% hyphenation patterns are known to \starTeX\@. It should be adapted +% to the needs of each local installation. +% \begin{macrocode} +%<*languages> +% \end{macrocode} +% +% \begin{macro}{\DefLang} +% The macro \cs{DefLang} is used to defined a new language. It has +% three parameters: "#1" is the internal number of the language, "#2" +% is the internal name of the language, and "#3" is the name of the +% file from which to read hyphenation patterns for the language. +% \begin{macrocode} +\def \DefLang #1#2#3{\expandafter\def \csname L-#2\endcsname {#1}% + \language = #1 \input #3}% +% \end{macrocode} +% \end{macro} +% Only one language (Norwegian) is predefined here, as this file will +% have to be adapted to local needs anyhow. +% \begin{macrocode} +\DefLang{1}{norsk}{nohyph2.tex}% +% \end{macrocode} +% \texttt{american} (American English) +% has already been defined as language~0 by plain \TeX. +% \begin{macrocode} +\expandafter\def \csname L-american\endcsname {0}% +% \end{macrocode} +% We want American English as our default: +% \begin{macrocode} +\language = 0 +%</languages> +% \end{macrocode} +% +% \section{Sample document styles} +% Included are also four document styles: +% \begin{description} +% \item[article] is used for ordinary articles. As this +% is the default definition of \starTeX, this style is empty. +% +% \item[a4-article] is just an adaption of \emph{article} to fit +% A4~paper. +% +% \item[ifi-article] is the style used for articles at Ifi +% (``Institutt for informatikk'', the Department of Informatics at the +% Univeristy of Oslo). It uses Concorde as the main text font, +% Palatino for its math, and A4 paper. (If you want to use this style, +% you must have access to a Concorde font; the Palatino Math is +% available at \textsc{ctan}.) +% +% \item[ifi-artikkel] is \emph{ifi-article} adapted to Norwegian text. +% \end{description} +% Each style file contains the necessary redefinitions. +% +% \subsection{Paper size} +% Every style except \emph{article} uses A4 paper. The margins are set +% to 2.5~cm. +% \begin{macrocode} +%<*a4-article|ifi-article|ifi-artikkel> +\hoffset = -1in \advance \hoffset by 2.5cm \hsize = 16cm +\voffset = -1in \advance \voffset by 2.5cm \vsize = 24.7cm +%</a4-article|ifi-article|ifi-artikkel> +% \end{macrocode} +% \subsection{Language adaption} +% The \emph{ifi-artikkel} is for text in Norwegian. We must select the +% correct language and adjust \cs{lefthyphenmin} and +% \cs{righthyphenmin}. +% \begin{macrocode} +%<*ifi-artikkel> +\language = \csname L-norsk\endcsname +\lefthyphenmin = 1 \righthyphenmin = 2 +% \end{macrocode} +% \begin{macro}{\AbstractName} +% \begin{macro}{\FigureName} +% \begin{macro}{\TableName} +% \begin{macro}{\TimeSep} +% Some names must also be redefined. +% \begin{macrocode} +\def \AbstractName {Sammendrag}% +\def \FigureName {Figur}% +\def \TableName {Tabell}% +\def \TimeSep {.}% +% \end{macrocode} +% \end{macro} +% \end{macro} +% \end{macro} +% \end{macro} +% \begin{macro}{\RefFormat} +% The format for references must be translated into Norwegian. +% \begin{macrocode} +\def \RefFormat #1#2{#1\ifTextEqual{#2}{\the\pageno}\else + \space p\aa{} side~#2\fi }% +% \end{macrocode} +% \end{macro} +% \begin{macro}{<today>} +% \begin{macro}{\Month} +% Finally, the date command \stcs{today} must be redefined. +% \begin{macrocode} +\Cdef {today}{\the\day.\space \Month\space \the\year }% +\def \Month {\ifcase \month \or januar\or februar\or mars\or + april\or mai\or juni\or juli\or august\or september\or + oktober\or november\or desember\fi }% +%</ifi-artikkel> +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \subsection{Text font} +% The two \emph{ifi-} styles use Concorde\footnote{In the Karl Berry +% font name scheme \cite{fontname}, Concorde is known as \emph{poc-}.} as +% the main body text +% font; it is the official font of the University of Oslo. Since +% Concorde is a wider font than \textsc{ecr}, and because it has a +% larger x-height, a smaller font size is used. The EC +% Companion font is kept for the special symbols. +% \begin{macrocode} +%<*ifi-article|ifi-artikkel> +\FontDef{R}{M}{U}{N}{pocr8t at 9.8pt}{tcrm1095}% +\FontDef{R}{M}{I}{N}{pocri8t at 9.8pt}{tcti1095}% +\FontDef{R}{B}{U}{N}{pocb8t at 9.8pt}{tcbx1095}% +\FontDef{R}{B}{I}{N}{pocbi8t at 9.8pt}{tcbi1095}% +\FontDef{T}{M}{U}{N}{pcrr8t at 9.8pt}{tctt1095}% +\FontDef{T}{M}{I}{N}{pcrro8t at 9.8pt}{tcit1095}% +\FontDef{T}{B}{U}{N}{pcrb8t at 9.8pt}{tctt1095}% +\FontDef{T}{B}{I}{N}{pcrbo8t at 9.8pt}{tcit1095}% +\FontDef{R}{M}{U}{L}{pocr8t at 12.9pt}{tcrm1440}% +\FontDef{R}{M}{I}{L}{pocri8t at 12.9pt}{tcti1440}% +\FontDef{R}{B}{U}{L}{pocb8t at 12.9pt}{tcbx1440}% +\FontDef{R}{B}{I}{L}{pocbi8t at 12.9pt}{tcbi1440}% +\FontDef{T}{M}{U}{L}{pcrr8t at 12.9pt}{tctt1440}% +\FontDef{T}{M}{I}{L}{pcrro8t at 12.9pt}{tcit1440}% +\FontDef{T}{B}{U}{L}{pcrb8t at 12.9pt}{tctt1440}% +\FontDef{T}{B}{I}{L}{pcrbo8t at 12.9pt}{tcit1440}% +\FontDef{R}{M}{U}{X}{pocr8t at 15.5pt}{tcrm1728}% +\FontDef{R}{M}{I}{X}{pocri8t at 15.5pt}{tcti1728}% +\FontDef{R}{B}{U}{X}{pocb8t at 15.5pt}{tcbx1728}% +\FontDef{R}{B}{I}{X}{pocbi8t at 15.5pt}{tcbi1728}% +\FontDef{T}{M}{U}{X}{pcrr8t at 15.5pt}{tctt1728}% +\FontDef{T}{M}{I}{X}{pcrro8t at 15.5pt}{tcit1728}% +\FontDef{T}{B}{U}{X}{pcrb8t at 15.5pt}{tctt1728}% +\FontDef{T}{B}{I}{X}{pcrro8t at 15.5pt}{tcit1728}% +\FontDef{R}{M}{U}{S}{pocr8t at 8.9pt}{tcrm1000}% +\FontDef{R}{M}{I}{S}{pocri8t at 8.9pt}{tcti1000}% +\FontDef{R}{B}{U}{S}{pocb8t at 8.9pt}{tcbx1000}% +\FontDef{R}{B}{I}{S}{pocbi8t at 8.9pt}{tcbi1000}% +\FontDef{T}{M}{U}{S}{pcrr8t at 8.9pt}{tctt1000}% +\FontDef{T}{M}{I}{S}{pcrro8t at 8.9pt}{tcit1000}% +\FontDef{T}{B}{U}{S}{pcrb8t at 8.9pt}{tctt1000}% +\FontDef{T}{B}{I}{S}{pcrbo8t at 8.9pt}{tcit1000}% +% \end{macrocode} +% The ``Math Palatino'' font is used for math. +% \changes{1.04}{1999/02/25}{Changed math font to ``Palatino Math'' +% for the Ifi document styles.} +% \begin{macrocode} +\def \XIIpt { at 12pt} +\def \Xpt { at 10pt} +\def \IXpt { at 9pt} +\def \VIIIpt { at 8pt} +\def \VIIpt { at 7pt} +\def \VIpt { at 6pt} +\def \Vpt { at 5pt} +\MathFontDef{N}{0}{zppler7t\XIpt}{zppler7t\VIIIpt}{zppler7t\VIpt} +\MathFontDef{N}{1}{zppler7m\XIpt}{zppler7m\VIIIpt}{zppler7m\VIpt} +\MathFontDef{N}{2}{zppler7y\XIpt}{zppler7y\VIIIpt}{zppler7y\VIpt} +\MathFontDef{N}{3}{zppler7v\XIpt}{zppler7v\XIpt}{zppler7v\XIpt} +\MathFontDef{N}{4}{zppleb7t\XIpt}{zppleb7t\VIIIpt}{zppleb7t\VIpt} +\MathFontDef{N}{5}{pplri8t\XIpt}{pplri8t\VIIIpt}{pplri8t\VIpt} +\MathFontDef{L}{0}{zppler7t\XIVpt}{zppler7t\Xpt}{zppler7t\VIIIpt} +\MathFontDef{L}{1}{zppler7m\XIVpt}{zppler7m\Xpt}{zppler7m\VIIIpt} +\MathFontDef{L}{2}{zppler7y\XIVpt}{zppler7y\Xpt}{zppler7y\VIIIpt} +\MathFontDef{L}{3}{zppler7v\XIVpt}{zppler7v\XIVpt}{zppler7v\XIVpt} +\MathFontDef{L}{4}{zppleb7t\XIVpt}{zppleb7t\Xpt}{zppleb7t\VIIIpt} +\MathFontDef{L}{5}{pplri8t\XIVpt}{pplri8t\Xpt}{pplri8t\VIIIpt} +\MathFontDef{X}{0}{zppler7t\XVIIpt}{zppler7t\XIIpt}{zppler7t\IXpt} +\MathFontDef{X}{1}{zppler7m\XVIIpt}{zppler7m\XIIpt}{zppler7m\IXpt} +\MathFontDef{X}{2}{zppler7y\XVIIpt}{zppler7y\XIIpt}{zppler7y\IXpt} +\MathFontDef{X}{3}{zppler7v\XVIIpt}{zppler7v\XVIIpt}{zppler7v\XVIIpt} +\MathFontDef{X}{4}{zppleb7t\XVIIpt}{zppleb7t\XIIpt}{zppleb7t\IXpt} +\MathFontDef{X}{5}{pplri8t\XVIIpt}{pplri8t\XIIpt}{pplri8t\IXpt} +\MathFontDef{S}{0}{zppler7t\Xpt}{zppler7t\VIIpt}{zppler7t\Vpt} +\MathFontDef{S}{1}{zppler7m\Xpt}{zppler7m\VIIpt}{zppler7m\Vpt} +\MathFontDef{S}{2}{zppler7y\Xpt}{zppler7y\VIIpt}{zppler7y\Vpt} +\MathFontDef{S}{3}{zppler7v\Xpt}{zppler7v\Xpt}{zppler7v\Xpt} +\MathFontDef{S}{4}{zppleb7t\Xpt}{zppleb7t\VIIpt}{zppleb7t\Vpt} +\MathFontDef{S}{5}{pplri8t\Xpt}{pplri8t\VIIpt}{pplri8t\Vpt} +% \end{macrocode} +% We must select the newly selected standard font. +% \begin{macrocode} +\SelectFont +%</ifi-article|ifi-artikkel> +% \end{macrocode} +% +% \bibliography{startex} +% \bibliographystyle{plain} +% +% \clearpage +% \Finale +\endinput |