% This is PROGLTX.DOC as of 25 May 90 %--------------------------------------------------------- % (c) 1989,1990 by J.Schrod. copy conditions see below % % Macro package for the documentation of programs % LaTeX style option % MAKEPROG is needed % % % DATE PERSON REMARK % 92-01-15 rlb add newsloppy environment (based on comment by % Frank Mittlebach. Don't force a \newpage in % Chapters, Just put a bigger space there. % 89-11-18 js repaired the handling of `|' (verbatim and \index). % 89-10-05 js first version (for TeX89) % % author's current address: % % Detig$\,\cdot\,$Schrod \TeX{}sys % Joachim Schrod % Kranichweg 1 % % D-6074 R\"odermark-Urberach % FR Germany % % Tel. (+6074) 1617 % Bitnet: XITIJSCH@DDATHD21 % documented with itself... %%%% %%%% %%%% These TeX macros were documented with the documentation system %%%% MAKEPROG and automatically converted to the current form. %%%% If you have MAKEPROG available you may transform it back to %%%% the original input: Remove every occurence of three percents %%%% and one optional blank from the beginning of a line and remove %%%% every line which starts with four percents. The following lex %%%% program will do this: %%%% %%%% %% %%%% %%%% ^%%%\ ? ; %%%% ^%%%%.*\n ; %%%% %%%% MAKEPROG may be obtained over the net from the Bitnet-Listserver %%%% LISTSERV@DHDURZ1 (filelist WEBWARE), from tuglib@science.utah.edu, %%%% or via ftp from june.cs.washington.edu. %%%% %%%% %%% \documentstyle[progltx]{article} %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% % %%% % local macros %%% % %%% \let\mc=\small % for names like GNU %%% \def\WEB{{\tt WEB\/}} %%% \def\GNU{{\mc GNU}} %%% % %%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%% \begin{document} %%% \title{ %%% Documenting programs in a \WEB{} style\\ %%% The {\tt progltx\/} style option %%% } %%% \author{\sc Joachim Schrod} %%% \maketitle %%% \chap Introduction. %%% \WEB{} systems allow the documentation of programs by supporting the %%% separation in program fragments which can be collected and rearranged %%% afterwards. This allows {\it top-down\/} programming as well as the %%% {\it bottom-up\/} design of programs. Each program fragment can be %%% documented, usually with \TeX{}\@. A disadvantadge is that \WEB{} %%% actually exists only for a few programming languages (Pascal, C, %%% Modula-2). Besides, building up \WEB{} systems for ``exotic'' %%% programming languages like \TeX{} is very difficult. %%% This macro package was built to allow good documentation for programs %%% in languages for which \WEB{} doesn't exist. It separates a program %%% text in sections that can be documented. All sections, collected %%% sequentially, will result in the complete program. In every section %%% begin and end of the program part are marked with |\beginprog| and %%% |\endprog|, this program part will be formatted as it is input %%% (``verbatim''). %%% Originally these macros were written for the usage with Plain \TeX{} %%% resp.\ on top of the \WEB{} macro package |webmac.tex|. But often the %%% requirement has been told to me that a \LaTeX{} version would be %%% useful, too---well, here it is. But even with \LaTeX{} I have decided %%% that still |\beginprog| and |\endprog| must be used for the markup of %%% the program parts, not |\begin{prog}| or |\end{prog}| which would be %%% more ``\LaTeX{}-like.'' The reason behind this is that I didn't want %%% to maintain two versions of the {\mc MAKEPROG\/} processor---but {\mc %%% MAKEPROG\/} wants to see the non-\LaTeX{}-like macros. But everybody %%% is encouraged to change it by themselves (it is {\it very\/} easy). %%% The user of these macros may use the usual sectioning macros of %%% \LaTeX{} for structuring his documentation. Additionally we provide a %%% |progdoc|-compatible (i.e.\ \WEB{}-like) markup with the two macros %%% |\chap| and |\sect|. %%% In the documentation part of a section text pieces, e.g.\ names of %%% variables, can be inserted verbatim to demonstrate the connection to %%% the program text. These parts are included in vertical bars %%% (`{\tt\vbar}') This makes this style option extremely useful if your %%% identifiers (or your file names) include characters which would be %%% special characters for \TeX{} otherwise. (One example of these %%% program languages is \TeX{} itself, but just enclose the macro names %%% in vertical bars and {\tt \vbar|\relax|\vbar}.) %%% The macros |\makevertother| and |\makevertactive| are available to %%% activate and deactivate the special behaviour of the vertical bar but %%% these macros should be needed seldom because the usual cases as the %%% usage within |verbatim| and |tabular| environments or |\index| macros %%% etc.\ are handled. %%% If a vertical bar must be used in the original fashion you can use two %%% command sequences: |\origvert| holds the meaning of the vertical bar %%% at the time this macro file was read in and |\vbar| is the character %%% with the {\mc ASCII\/} code of the vertical bar (i.e.~|"EC|) in the %%% current font. %%% The new notion of |\verb| must not be used within parameters of %%% macros, e.g.\ in the argument of |\section| etc.---it will result in %%% an error message by \TeX{}\@. Furthermore within the preamble of a %%% |tabular|, an |array| environment, or the |\multicolumn| command the %%% vertical bar has the same meaning as before. (That means within %%% |@{|\ldots|}| it is an ordinary character and otherwise it specifies a %%% vertical rule between the columns. %%% This macro package does not offer the automatic creation of an index %%% because it is not known which syntactical tokens the language has that %%% should be mentioned in an index. But of course all \LaTeX{} stuff like %%% |\index|, |\tableofcontents|, etc.\ may be used. %%% \sect This program is free software; you can redistribute it and/or %%% modify it under the terms of the \GNU{} General Public License as %%% published by the Free Software Foundation; either version~1, or (at your %%% option) any later version. %%% This program is distributed in the hope that it will be useful, but %%% {\bf without any warranty\/}; without even the implied warranty of %%% {\bf merchantability\/} or {\bf fitness for a particular purpose}. See %%% the \GNU{} General Public License for more details. %%% You should have received a copy of the \GNU{} General Public License %%% along with this program; if not, write to the Free Software Foundation, %%% Inc., 675~Mass Ave, Cambridge, MA~02139, USA. %%% \sect We have to realize three parts: (1)~the formatting of rather %%% small verbatim texts in a line, (2)~the formatting of larger parts of %%% program and (3)~the document structuring elements for the separation %%% of the sections. %%% \begin{sloppypar} %%% Before we start we declare some shorthands for category codes. By %%% declaring the underscore~`(|_|)' as a letter we can use it in our %%% macros names. (I agree with D.~Knuth that %%% |\identifier_several_words_long| is more readable than %%% |\IdentifierSeveralWordsLong| and in every case better than %%% |\p@@@s|.) But as we have to restore the category codes at the end %%% of this macro file we store its former value in the control %%% sequence |\uscode|. This method is better than the usage of a %%% group because not all macros have to be defined global this way. %%% \end{sloppypar} %%% \beginprog \chardef\escape=0 \chardef\open=1 \chardef\close=2 \chardef\letter=11 \chardef\other=12 %\chardef\active=13 % is defined in Plain already \chardef\uscode=\catcode`\_ \catcode`\_=\letter %%% \endprog %%% \chap Local Verbatim Formatting. %%% The main point of every verbatim formatting is the switching of the %%% character codes of all characters that have a special \TeX{} meaning. %%% This can be done with the control sequence |\dospecials| that applies %%% the control sequence |\do| to all special characters. Additionally, %%% every line is regarded as a paragraph without indentation. Between %%% two paragraphs, i.e.\ between two lines, no extra space is set. %%% Finally all blanks and tabular characters shall be obeyed and the %%% inter word space after sentence terminators shall not be enlarged. %%% The activation of the tabular characters with |\obeytabs| is %%% equivalent to |\obeyspaces| in {\tt plain.tex}. %%% \begin{sl} %%% As a matter of fact, I would like to use the character set with the %%% extended {\mc ASCII} (like in\/ \WEB{}) for setting the verbatim texts %%% in monospace. But then I must code many\/ |\@getfont|'s\,\dots %%% \end{sl} %%% \beginprog %\font\tentex=cmtex10 % typewriter extended ASCII 10pt %\let\ttex=\tentex % only with base size 10pt \def\ttex{\tt} % as a substitute \def\setup_verbatim{% \def\do##1{\catcode`##1\other}\dospecials \parskip\z@skip \parindent\z@ \catcode`\`\active \@noligs \obeylines \@vobeyspaces \obeytabs \frenchspacing \ttex } \let\tab=\space \begingroup \catcode`\^^I=\active% % Attention: no tabs! \gdef\obeytabs{\catcode`\^^I=\active\def^^I{\tab}} \global\let^^I=\tab% % if an active tab appears in a \write \endgroup %%% \endprog %%% \sect After having saved the old meaning of `{\tt\vbar}' in %%% |\origvert| and after declaring |\vbar| as a synonym for the character %%% that has the code of a vertical bar in the actual font, the vertical %%% bar can be made active. Then we call |\setup_verbatim|. But the %%% newline characters shall not be processed, they shall be regarded like %%% blank space. This can be reached by defining |\par| as |\space|. %%% The next vertical bar in the input closes the group which becomes an %%% (unbreakable) |\hbox| then. The old meanings of the special %%% characters and of the vertical bar are restored and \TeX{} is in %%% normal (horizontal) mode again. %%% \beginprog \let\origvert=| \chardef\vbar=`\| \def\makebaractive{\catcode`\|\active} \def\makebarother{\catcode`\|\other} \makebaractive \def|{% \leavevmode \hbox\bgroup \let\par\space \setup_verbatim \let|\egroup } %%% \endprog %%% \sect A problem with this definition of the vertical bar is that %%% the bar is not a normal character any more but there exists situations %%% where the \LaTeX{} macros assumes this: %%% % %%% \begin{itemize} %%% \item In a |verbatim| environment a vertical bar must be typeset if it %%% occurs in the input. %%% \item In a |tabular| or an |array| environment a vertical bar is used %%% to denote rules between columns in the table. These environments must %%% be started with a parameter which is a ``preamble,'' the same preamble %%% construction is used to specify the format of multi-column entries. %%% \item In an output of an index entry the vertical bar must not result %%% in an error message. Usually index entries are typeset in a seperate %%% \TeX{} run where |idverb| is not used as a style option and the %%% vertical bar is therefore useful. This is no problem in section %%% headings or captions etc. Because they take their argument as a %%% parameter in every case the vertical bar can never be used there. But %%% |\origvert| resp.\ |\vbar| may be used there. %%% \end{itemize} %%% % %%% In the next sections we handle each of these problems. %%% \sect Before we start a |verbatim| environment we just redefine the %%% vertical bar as an ordinary character. Because this is within the %%% environment grouping the end of the environment will reestablish the %%% special meaning. %%% \beginprog \let\@@verbatim=\@verbatim \def\@verbatim{% \makebarother \@@verbatim } %%% \endprog %%% \sect Special care is needed in the |tabular| and the |array| %%% environment. Both environments are begun by one macro (|\@tabarray|), %%% we redefine it so that the bar can be used in the preamble %%% specification. The same problem occurs in |\multicolumn|, it is %%% solved the same way. After the preamble construction (with %%% |\@mkpream|) the special meaning of the bar can be switched on %%% again---this allows the usage of the new meaning in the body of a %%% table. %%% Of course this mean that the ``verbatim identifier'' facility can %%% not be used within a preamble of a table. Furthermore it can not %%% be used within the |\multicolumn| statement, neither in the %%% preamble part (the second parameter) nor within the text part (the %%% third parameter). %%% \beginprog \let\@@tabarray=\@tabarray \def\@tabarray{% \makebarother \@@tabarray } \def\multicolumn#1{% \multispan{#1}% \begingroup \makebarother \restof_multicolumn } \def\restof_multicolumn#1#2{% \@mkpream{#1}% \def\@sharp{#2}% \let\protect\relax \let\@startpbox\@@startpbox \let\@endpbox\@@endpbox \@arstrut \@preamble \endgroup \ignorespaces } \let\@@mkpream=\@mkpream \def\@mkpream#1{% \@@mkpream{#1}% \makebaractive } %%% \endprog %%% \sect Before an index entry is scanned almost all special characters %%% are transformed into ordinary characters. The only exceptions are the %%% opening and the closing brace because they are needed to delimit the %%% argument. This transformation is done with |\@sanitize|, this macro %%% must be called within a group. We just append the transformation of %%% the vertical bar. %%% \beginprog \begingroup \def\@makeother{\noexpand\@makeother\noexpand} \xdef\@sanitize{\@sanitize\@makeother\|} \endgroup %%% \endprog %%% \chap Fragments in Verbatim. %%% We need macros to format the program fragments without any %%% linebreaking. Such a text area shall start with the macro %%% |\beginprog| and end with |\endprog|, i.e.\ as a kind of a %%% |prog|-environment. The macro |\endprog| must stand at the very %%% beginning of a line and must be followed by white space (blank, tab or %%% newline character). After |\beginprog| as well as after %%% |\endprog| the rest of the line is ignored. %%% Two demands must be regarded: There should be no length restrictions %%% for the processed text, and the tabular characters should be expanded %%% so that this macro works on PC's and on VAXes etc., too. %%% \sect The implementation method is quite simple: We read the next %%% line, test, wether the end is reached (by comparing with the end line) %%% and otherwise set the line actually read. Every character is %%% inspected and tabular characters are expanded. %%% The verbatim text is started with |\begin_verbatim| which will be %%% either called by |\beginprog| or by |\beginverbatim|. These macros %%% will also define the contents of the end line. %%% Whether a line is set or whether the end of the processed area is %%% reached is indicated by the switch |\if@print|. At the beginning of %%% the |\begin_verbatim| macro most settings are done with %%% |\setup_verbatim| (the vertical bar must be handled separately) %%% and the rest of the line is ignored. As everything is done within %%% a group, the end of the verbatim text can be processed by simply %%% closing this group. %%% For the user it looks as if |\endprog| or |\endverbatim| %%% terminates the processing, but it just serves for the %%% identification of the end, the true processing is done with the %%% internal macro |\end_verbatim|. %%% \beginprog \newif\if@print \def\begin_verbatim{% \endgraf \bigbreak \begingroup \setup_verbatim \makebarother \@printtrue \ignore_rest_line } \let\end_verbatim=\endgroup % internal command ! %%% \endprog %%% \sect {\sloppy %%% The first line is ignored, all the other lines are identified with %%% |\set_next_line| and processed with |\do_set|. This separation in %%% identification and processing allows that the line end character is %%% active in the definition only for a short time. %%% \par} %%% When a line is to be formatted, we first check with |\check_print| %%% wether it contains the end line, otherwise it is printed with %%% |\print_char|. The printing must be done for every character %%% individually because we want to check for tabular characters; the %%% exact algorithm is described below. Here we just have to note that %%% |\print_char| is used with two parameters of which the second one is %%% finished with the token |\end_line|. The first parameter is the first %%% character of the line, the second parameter is the rest of the line. %%% If the line is empty, the argument of |\do_set| is empty, too; so the %%% activation of |\print_char| must be finished with two |\end_line|. %%% Then the first |\end_line| is the first argument for |\print_char| and %%% the second argument is empty. But if the line did contain something, %%% the second |\end_line| is evaluated, for this case it is defined as %%% |\relax|. %%% At last we call |\set_next_line| again to format the next line. If %%% the end is reached, i.e.\ if the sample line was found, %%% |\set_next_line| will be redefined as |\relax|. This can be done %%% because the original meaning is restored while closing the group %%% with |\end_verbatim|. %%% \beginprog \begingroup \obeylines% % ^^M is active! ==> every line must end with % \gdef\ignore_rest_line#1^^M{\set_next_line}% \gdef\set_next_line#1^^M{\do_set{#1}}% \endgroup \def\do_set#1{% \endgraf \check_print{#1}% \if@print \indent \print_char#1\end_line\end_line \else \let\set_next_line\end_verbatim \fi \set_next_line } \let\end_line=\relax %%% \endprog %%% \sect {\sloppy %%% Before we look at the problem of formatting a line, we declare %%% |\check_print| that checks the end of the verbatim mode. We have to %%% do two things: we must split everything in front of the first blank %%% or tabular character and compare for identity with |\endprog|. The %%% splitting is easy because the line which is our first argument %%% contains blanks and tabulators as active characters. First we call %%% |\cut_at_tab| that demands a tabular character as separator for its %%% two pramenters so that everything in the line in front of the first %%% tabulator is part of the first parameter. If there is no tabular %%% character in the line, we append one so that the second parameter is %%% empty. The same trick is used to separate the part in front of the %%% first blank character from the resulting first part. %%% \par} %%% The check is done with |\do_check|. We use a separate macro here so %%% that we can indent it (in the following definition blanks are active!) %%% \beginprog \begingroup \obeyspaces\obeytabs \gdef\check_print#1{\cut_at_tab#1^^I\end_line} \gdef\cut_at_tab#1^^I#2\end_line{\check_first_part#1 \end_line}% blank ! \gdef\check_first_part#1 #2\end_line{\do_check{#1}} \endgroup %%% \endprog %%% \sect %%% \begin{sloppypar} %%% |\do_check| compares the line with a sample line that is %%% available in |\end_verbatim_line|. This macro will be defined later. %%% \end{sloppypar} %%% \beginprog \def\do_check#1{% \def\@line{#1}% \ifx \@line\end_verbatim_line \@printfalse \fi } %%% \endprog %%% \sect Now we can set a line: we start with the first character, %%% followed by the rest of the line. Each character is counted in %%% |\char_count|. At the beginning of a line |\char_count| is~0, this %%% is reset at the end of the line. %%% \beginprog \newcount\char_count \char_count\z@ \def\print_char#1#2\end_line{% \print_first_char{#1}% \print_rest_of_line{#2}% } %%% \endprog %%% \sect For each character that is set |\char_count| is incremented. %%% If a character is a tabulator, we set with |\print_tab| the fitting %%% amount of blank characters, otherwise the character itself. We must %%% compare the character that is stored in |\@char| with a macro of which %%% the ``first-level'' expansion is an active tabulator. For this case %%% we declare |\@tab|. %%% \beginprog {\obeytabs\gdef\@tab{^^I}} \def\print_first_char#1{% \def\@char{#1}% \advance \char_count\@ne \ifx \@char\@tab \print_tab \else \@char \fi } %%% \endprog %%% \sect If we want to fill the line with blank spaces up to the next %%% column with a number that can be divided by~8, we must be able to %%% compute the column number modulo~8, but \TeX{} has no modulo operator. %%% So we define the macro |\mod_viii| that computes its argument modulo~8 %%% and returns the result in the counter |\count_mod_viii|. For the %%% computation we need the temporary counter |\count@|. %%% \beginprog \newcount\count_mod_viii \def\mod_viii#1{% \count@ #1\relax \count_mod_viii\count@ \divide \count@ 8\relax \multiply \count@ 8\relax \advance \count_mod_viii -\count@ } %%% \endprog %%% \sect Now we can declare |\print_tab|. We must remember that %%% |\char_count| was incremented already, if we set only one blank %%% character the counter keeps untouched. %%% \beginprog \def\print_tab{% \loop \space \mod_viii\char_count \ifnum \count_mod_viii>\z@ \advance \char_count\@ne \repeat } %%% \endprog %%% \sect If the rest of the line is empty, we are ready. |\char_count| %%% is reset to~0 for the next line. %%% Inside the |\else| part of |\ifx| |\print_char| should not be used %%% directly because this costs too much storage of \TeX{}\@. Instead we %%% set a control sequence |\next| that is processed afterwards, depending %%% on the result of the comparison. (This tail recursion will be %%% discovered by \TeX{} and handled appropriately.) If there is still %%% something to set, we use |\print_char| again, otherwise a %%% syntactically similar macro that expands to |\relax|. %%% \beginprog \def\print_rest_of_line#1{% \def\@line{#1}% \ifx \@line\empty \char_count\z@ \def\next##1\end_line{\relax}% \else \let\next\print_char \fi \next#1\end_line } %%% \endprog %%% \sect {\sloppy %%% Now we are ready to define the two ``user accessible'' macros %%% |\beginprog| and |\beginverbatim|. They must define the prototyp end %%% line |\end_verbatim_line| which will be compared against every line %%% in the verbatim text. During the definition of %%% |\end_verbatim_line| it must be cared for that the escape character~`|\|' %%% is a printable character: A comparison with |\ifx| demands identical %%% category codes. As a temporary escape character we use the slash. %%% \par} %%% \beginprog {\catcode`\/=\escape % / is temporary escape char \catcode`\\=\other /gdef/beginprog{% /gdef/end_verbatim_line{\endprog}% /begin_verbatim } /gdef/beginverbatim{% /gdef/end_verbatim_line{\endverbatim}% /begin_verbatim } } % here \endgroup can't be used %%% \endprog %%% \chap Document Structuring. %%% In addition to the normal \LaTeX{} structuring markups we will %%% provide a markup for a layout of the document that is like in %%% \WEB{}. This can be done easily. All sections are numbered, the %%% number of the next section is stored in the counter |section|. We %%% distinguish between main sections which start a group of sections %%% and between normal sections within a group. %%% The main sections are started with the macro |\chap|. It has one %%% parameter, the title of the section group. This parameter must be %%% terminated by a dot. We start a new page, typeset the title in %%% bold face and separate it from the section text with a |\medskip|. %%% This text, the documentation part of the section, is formatted %%% without paragraph indentation. %%% If the \WEB{}-like macros are used every section number should be %%% output with a following dot. We want to establish this when we use the %%% |\chap| or the |\sect| macro the first time. Furthermore the new page %%% at the begin of a main section should not be started at the first %%% |\chap| because a title may precede it (and the title should not %%% be on a seperate page unless explicitely requested). Instead a %%% skip of (approximately) 2~pica should be set. To achieve %%% both goals a macro |\chap_intro| is defined that defines |\thesection| %%% appropriately, skips the 2~pica, and redefines itself to %%% |\newpage|---we then just have to call |\chap_intro| at the beginning %%% of |\chap|. The same applies to |\sect_intro|. %%% \beginprog \newskip\pre_sect_skip \pre_sect_skip=2pc plus 1pc minus 6pt \def\chap_intro{% \gdef\thesection{\arabic{section}.}% \gdef\chap_intro{\bigbreak}% \addvspace{\pre_sect_skip}% } \def\sect_intro{% \gdef\thesection{\arabic{section}.}% \global\let\sect_intro\relax } %%% \endprog %%% \sect Now we will have a look at the {\it wonderful\/} internal %%% interface of \LaTeX{}\@. With ``wonderful'' I mean that I'm always %%% full of wonder why it was designed in this way. E.g., if anybody %%% can explain to me why the coding of the non-indentation of the first %%% line in the following paragraph was combined with the coding of %%% the skip which will come in front of the section---I will be thankful %%% for the rest of my life. Such different things should be kept %%% different, i.e., the suppression of the indentation should not be %%% hidden in the sign of a skip! The same comment applies to the combined %%% coding of the skip below the section heading resp.\ to the right %%% of a run-in heading. %%% \begin{quote} \it %%% I want the following layout: no indentation in the following %%% paragraph\/ {\rm but no} space in front of the section heading. %%% How do I code a value of\/ $\sl -0 pt$? %%% \end{quote} %%% % %%% Well, a work-around is to use a value of $\rm -1\,sp$ because the %%% reader will not see this distance---but in my opinions this is no %%% good programming style. In this special case I have luck, too: %%% the skip is not set anyway, either it is discarded by the preceding %%% |\newpage| or it is not added by |\addvspace| because of the preceding %%% |\pre_sect_skip|. %%% \beginprog \def\chap#1.{% \chap_intro \@startsection{section}{1}% {\z@}% {\m@ne sp}% {\medskipamount}% {\normalsize\bf}% {#1.}% } %%% \endprog %%% \sect Normal sections are started with |\sect|. This macro has no %%% parameter. Between two paragraphs we skip |\pre_sect_skip|. %%% Between the section number and the text one quad of space is set. %%% We have to take care for empty documentation parts where the %%% program part (i.e.\ |\beginprog|) will follow immediately. Then %%% the program part should begin on a new line and not behind the %%% section number. So we provide |\null| as an empty documentation %%% part in every case. %%% Now again the design of |\@startsection| comes in hand: \LaTeX{} %%% always leaves a quad after the section number (by the way, %%% this is not mentioned in the documentation---you have to look %%% in the macros to figure this out). Because our section header %%% consists only of the number we have to code a value of $\rm %%% -0\,pt$\,\dots %%% \begin{quote} %%% Again: {\it non-orthogonal design is bad design}. %%% \end{quote} %%% \beginprog \def\sect{% \sect_intro \@startsection{section}{1}% {\z@}% {\pre_sect_skip}% {\m@ne sp}% {\normalsize\bf}% {\null}% } %%% \endprog %%% \sect Finally, the |newsloppy| environment. As pointed out by %%% Frank Mittelbach, {\LaTeX}'s |\sloppy| environment is just a %%% little too sloppy. The tolerence value with which it allows {\TeX} to %%% break at is considered infinite. Using a value just short of this %%% improves output considerably. %%% \beginprog \newcount\pl_tolerance \pl_tolerance = 9999 \newenvironment{newsloppy}% {\begingroup\tolerance\pl_tolerance}% {\endgroup} %%% \endprog %%% \sect We are finished and just have to restore the category code. %%% \beginprog \catcode`\_=\uscode \endinput %%% \endprog %%% \end{document}