Received: by nummer-3.proteosys id <01C19443.4F5C9F4C@nummer-3.proteosys>; Thu, 3 Jan 2002 11:42:15 +0100 Return-Path: <@vm.gmd.de:LATEX-L@DHDURZ1.BITNET> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="----_=_NextPart_001_01C19443.4F5C9F4C" x-vm-v5-data: ([nil nil nil nil nil nil nil nil nil][nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil nil]) X-MimeOLE: Produced By Microsoft Exchange V6.5 Content-class: urn:content-classes:message Subject: Typesetting paths with line breaks Date: Tue, 5 Nov 1991 21:28:36 +0100 Message-ID: X-MS-Has-Attach: X-MS-TNEF-Correlator: From: "Nelson H. F. Beebe" Sender: "LaTeX-L Mailing list" To: "Rainer M. Schoepf" Reply-To: "LaTeX-L Mailing list" Status: R X-Status: X-Keywords: X-UID: 447 This is a multi-part message in MIME format. ------_=_NextPart_001_01C19443.4F5C9F4C Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable I'm going to post the following style file to tex-archives in a while, but I invite comments first from the LATEX-L list. It seems to me that this kind of facility is important enough to be considered in a future LaTeX implementation. In the meantime, it is available as a .sty file compatible with all TeX macro packages. %%% @LaTeX-style-file{ %%% author =3D "Philip Taylor", %%% version =3D "3.02", %%% date =3D "23-Oct-1991 13:45:12", %%% filename =3D "path.sty", %%% address =3D "The Computer Centre %%% RHBNC, University of London %%% Egham Hill %%% Egham, Surrey TW20 0EX, ENGLAND %%% Tel: +44 784 443172 %%% Fax: +44 784 434348 %%% checksum =3D "20022 300 1599 12491", %%% email =3D "P.Taylor@Vax.Rhbnc.Ac.Uk (Internet)", %%% codetable =3D "ISO/ASCII", %%% keywords =3D "file name, filename, path name, pathname, %%% discretionary, discretionaries", %%% supported =3D "yes", %%% docstring =3D {Computer filenames, host names, and e-mail %%% addresses tend to be long strings that %%% cause line breaking problems for TeX. %%% Sometimes rather long strings are %%% encountered; here are two examples: %%% %%% = Friesland%rz.informatik.uni-hamburg.dbp.de%germany.csnet@relay.cs.net %%% %%% mighty-mouse-gw.scrc.symbolics.com %%% %%% This file defines a macro, \path|...|, %%% similar to LaTeX's \verb|...| macro, that %%% sets the text in the typewriter font, %%% allowing hyphen-less line breaks at %%% punctuation characters. %%% %%% The default set of punctuation characters is %%% defined as %%% %%% \discretionaries = |~!@$%^&*()_+`-=3D#{"}[]:;'<>,.?\/| %%% %%% However, you can change it as needed, for %%% example %%% %%% \discretionaries +@%!.+ %%% %%% would assign to it the set @ % ! . which %%% commonly occur in electronic mail addresses. %%% %%% The delimiter characters surrounding the %%% arguments to \discretionaries and \path %%% will normally be a punctuation character not %%% found in the argument, and not otherwise %%% significant to TeX. In particular, backslash %%% cannot be used as a delimiter. In the rare %%% event that this is required, set %%% %%% \specialpathdelimiterstrue %%% %%% This practice is not recommended, because TeX %%% then runs about four times slower while it is %%% typesetting \path\...\ requests. %%% \specialpathdelimitersfalse is the normal %%% setting. %%% %%% This file may be used in Plain TeX or AmSTeX %%% by %%% %%% \input path.sty %%% %%% and in LaTeX by %%% %%% \documentstyle[...,path,...]{...} %%% %%% The checksum field above contains a CRC-16 %%% checksum as the first value, followed by the %%% equivalent of the standard UNIX wc (word %%% count) utility output of lines, words, and %%% characters. This is produced by Robert %%% Solovay's checksum utility.} %%% } %%% = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D % = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D % % The \path Macro % % An early prototype of this code which was developed by Nelson H. F. % Beebe used a recursive macro to peel off one % character at a time, then with a nest of \ifx statements, test for % each punctuation character, and if one is found, insert discretionary % linebreaks in the form of \- or \penalty0. While this usually works, % it is not entirely satisfactory, because the nested \ifx statements % are ugly, and the recursion can exhaust TeX's macro stack for % arguments longer than about 30 characters. % % A second version by NHFB built upon the ideas used by the LaTeX % \verb|...| macro; this was mostly successful, but was flawed by its % inability to handle at least the three characters ^ [ ], by loss of % use of @ for naming internal private macros, and by its inability to % allow the set of characters at which breaks are permissible. % % The problem was then passed off to Philip Taylor, who wrote this third % version which fully solves the problem. Phil therefore gets the % author credit in the file header above. [Gee, thanks ! ** Phil] % % = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D \immediate\write16{This is path.sty, Version 3.02 <23-Oct-1991 = 13:45:12>} %%% We will regrettably need one \count variable with an open name, %%% in which to save the category code of commercial-at ... \newcount \ATcode \ATcode =3D \catcode `\@ %%% Make commercial-at a letter to provide concealed control sequences \catcode `\@ =3D 11 %%% and then declare two \count variables with concealed names \newcount \c@tcode \newcount \c@unter %%% and a boolean variable with an open name, to specify the nature of %%% the delimiters which will be associated with the \path command \newif \ifspecialpathdelimiters %%% We need to define control sequences which expand to both %%% active and passive spaces ... \begingroup \catcode `\ =3D 10 \gdef \passivesp@ce { } \catcode `\ =3D 13\relax% \gdef\activesp@ce{ }% \endgroup %%% \discretionaries will define a macro \discr@ti@n@ri@s which will %%% make every character between the first and final a %%% discretionary breakpoint. \def \discretionaries %%% % start a group (ended in \discr@ti@naries ), % make every character (apart from space) active, % then transfer control to \discr@tionaries ... {\begingroup \c@tcodes =3D 13 \discr@tionaries } %%% \discr@tionaries will receive as parameter the initial %%% which will delimit the set of discretionaries; this %%% will be active. \def \discr@tionaries #1%%% % knowing the initial , define \discr@ti@naries with a % delimited parameter structure, the final delimiter being % the second instance of {\def \discr@ti@naries ##1#1%%% % \discr@ti@naries will receive as parameter the set of % characters which are to be made discretionaries; it ends the % group and then defines \discr@ti@n@ries, a tail-recursive % macro, which will quietly process each of the % discretionaries in turn ... {\endgroup \def \discr@ti@n@ries ####1%%% or % by checking to see if it has reached the end of the % list, i.e. comparing its parameter with the known final % ... {\if \noexpand ####1\noexpand #1% % if they match, there is no more to do ... \let \n@xt =3D \relax \else % otherwise the character becomes active and is % defined as a discretionary with the three texts % , thus suppressing true % hyphenation; the macro then prepares to process % the next character. \catcode `####1 =3D 13 \def ####1{\discretionary {\char `####1}{}{\char `####1}}% \let \n@xt =3D \discr@ti@n@ries \fi % here either tail recursion occurs, if there are more % characters to process, or tail recursion ceases if all % have been exhausted \n@xt }% % of course, none of this must take place during the \stress % {call} of \discretionaries; execution is deferred until % another macro such as \path calls the concealed action % macro \discr@ti@n@ri@s; we therefore define this macro to % have the desired effect. \def \discr@ti@n@ri@s {\discr@ti@n@ries ##1#1}% }% % and finally invoke \discr@ti@naries to process the set of % discretionary characters; it will take everything up to the % second instance of as its parameter (and therefore as the % set of characters to be processed). \discr@ti@naries } %%% \path, which is the user interface to \p@th, first checks %%% to see whether \specialpathdelimiters is or ; %%% if , it needs to take special action to ensure that %%% \stress {all} characters (apart from ) are acceptable %%% as delimiters; this is very time-consuming, and should be %%% avoided if at all possible. It also defines \endp@th, to %%% close the appropriate number of groups, and finally transfers %%% control to \p@th \def \path {\ifspecialpathdelimiters \begingroup \c@tcodes =3D 12 \def \endp@th {\endgroup \endgroup}% \else \let \endp@th =3D \endgroup \fi \p@th } %%% \p@th, which has essentially the same syntax as \discretionaries, %%% expects to be followed by a , a , and a second instance %%% of ; it will typeset in the \tt font with hyphenation %%% inhibited --- breaks (but not true hyphenation) are allowed at any %%% or all of the special characters which have %%% previously been declared as \discretionaries. \def \p@th #1%%% % it starts by opening a group (ended in \p@@th) ... % switches to \tt, and inhibits hyphenation; % allows breaks at \discretionaries; saves the % catcode of the initial , because if it has also been % declared within \discretionaries, the initial and final % won't match (which would be a disaster); \c@tcode is overloaded, % but there is no conflict that I can detect ... % invokes \discr@ti@n@ri@s to render active the set of special % characters which have previously been declared as % \discretionaries; each of these characters will expand to a real % \discretionary, with replacement texts ; and % re-instates the catcode of the initial . {\begingroup \tt \c@tcode =3D \catcode `#1 \discr@ti@n@ri@s \catcode `\ =3D \active \expandafter \edef \activesp@ce {\passivesp@ce \hbox {}}% \catcode `#1 =3D \c@tcode % it next defines an inner macro \p@@th with delimited parameter % structure, the final delimiter being the same as the initial % delimiter which it has itself received as #1. \def \p@@th ##1#1% % Within \p@@th, % permissible breakpoints are specified, % the path is typeset, % and the group(s) ended. {\hbox {}##1% \endp@th }% \p@@th } %%% \c@tcodes expects to be followed by the r-h-s of a numeric %%% assignment optionally including the assignment operator; it saves %%% the value of the r-h-s in \c@tcode, and invokes \c@tc@des. \def \c@tcodes {\afterassignment \c@tc@des \c@tcode} %%% \c@tc@des uses the value saved in \c@tcode, and assigns it to the %%% \catcode of all characters with the single exception of , %%% which retains its normal catcode of 10; on exit, every single %%% character apart from will have the catcode which followed %%% \c@tcodes. The code is optimised to avoid unnecessary usage of %%% save-stack space. \def \c@tc@des {\c@unter =3D 0 \loop \ifnum \catcode \c@unter =3D \c@tcode \else \catcode \c@unter =3D \c@tcode \fi \ifnum \c@unter < 255 \advance \c@unter by 1 \repeat \catcode `\ =3D 10 } %%% We restore the original catcode of commercial-at \catcode `\@ =3D \ATcode %%% Define a default set of discretionary break characters %%% to include all punctuation characters except vertical %%% bar \discretionaries |~!@$%^&*()_+`-=3D#{}[]:";'<>,.?\/| \endinput =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Nelson H.F. Beebe Center for Scientific Computing Department of Mathematics 220 South Physics Building University of Utah Salt Lake City, UT 84112 USA Tel: (801) 581-5254 FAX: (801) 581-4148 Internet: beebe@math.utah.edu =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ------_=_NextPart_001_01C19443.4F5C9F4C Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Typesetting paths with line breaks

I'm going to post the following style file to = tex-archives in a while,
but I invite comments first from the LATEX-L = list.  It seems to me that
this kind of facility is important enough to be = considered in a future
LaTeX implementation.  In the meantime, it is = available as a .sty file
compatible with all TeX macro packages.

%%%  @LaTeX-style-file{
%%%     = author          =3D = "Philip Taylor",
%%%     = version         =3D = "3.02",
%%%     = date            = =3D "23-Oct-1991 13:45:12",
%%%     = filename        =3D = "path.sty",
%%%     = address         =3D "The = Computer Centre
%%%          &= nbsp;           &n= bsp; RHBNC, University of London
%%%          &= nbsp;           &n= bsp; Egham Hill
%%%          &= nbsp;           &n= bsp; Egham, Surrey TW20 0EX, ENGLAND
%%%          &= nbsp;           &n= bsp; Tel:   +44 784 443172
%%%          &= nbsp;           &n= bsp; Fax:   +44 784 434348
%%%     = checksum        =3D "20022 300 = 1599 12491",
%%%     = email           =3D = "P.Taylor@Vax.Rhbnc.Ac.Uk (Internet)",
%%%     = codetable       =3D = "ISO/ASCII",
%%%     = keywords        =3D "file name, = filename, path name, pathname,
%%%          &= nbsp;           &n= bsp; discretionary, discretionaries",
%%%     = supported       =3D = "yes",
%%%     = docstring       =3D {Computer filenames, = host names, and e-mail
%%%          &= nbsp;           &n= bsp; addresses tend to be long strings that
%%%          &= nbsp;           &n= bsp; cause line breaking problems for TeX.
%%%          &= nbsp;           &n= bsp; Sometimes rather long strings are
%%%          &= nbsp;           &n= bsp; encountered; here are two examples:
%%%
%%% = Friesland%rz.informatik.uni-hamburg.dbp.de%germany.csnet@relay.cs.net
%%%
%%%          &= nbsp;           &n= bsp; mighty-mouse-gw.scrc.symbolics.com
%%%
%%%          &= nbsp;           &n= bsp; This file defines a macro, \path|...|,
%%%          &= nbsp;           &n= bsp; similar to LaTeX's \verb|...| macro, that
%%%          &= nbsp;           &n= bsp; sets the text in the typewriter font,
%%%          &= nbsp;           &n= bsp; allowing hyphen-less line breaks at
%%%          &= nbsp;           &n= bsp; punctuation characters.
%%%
%%%          &= nbsp;           &n= bsp; The default set of punctuation characters is
%%%          &= nbsp;           &n= bsp; defined as
%%%
%%%          &= nbsp;           &n= bsp; \discretionaries = |~!@$%^&*()_+`-=3D#{"}[]:;'<>,.?\/|
%%%
%%%          &= nbsp;           &n= bsp; However, you can change it as needed, for
%%%          &= nbsp;           &n= bsp; example
%%%
%%%          &= nbsp;           &n= bsp; \discretionaries +@%!.+
%%%
%%%          &= nbsp;           &n= bsp; would assign to it the set @ % ! . which
%%%          &= nbsp;           &n= bsp; commonly occur in electronic mail addresses.
%%%
%%%          &= nbsp;           &n= bsp; The delimiter characters surrounding the
%%%          &= nbsp;           &n= bsp; arguments to \discretionaries and \path
%%%          &= nbsp;           &n= bsp; will normally be a punctuation character not
%%%          &= nbsp;           &n= bsp; found in the argument, and not otherwise
%%%          &= nbsp;           &n= bsp; significant to TeX.  In particular, backslash
%%%          &= nbsp;           &n= bsp; cannot be used as a delimiter.  In the rare
%%%          &= nbsp;           &n= bsp; event that this is required, set
%%%
%%%          &= nbsp;           &n= bsp; \specialpathdelimiterstrue
%%%
%%%          &= nbsp;           &n= bsp; This practice is not recommended, because TeX
%%%          &= nbsp;           &n= bsp; then runs about four times slower while it is
%%%          &= nbsp;           &n= bsp; typesetting \path\...\ requests.
%%%          &= nbsp;           &n= bsp; \specialpathdelimitersfalse is the normal
%%%          &= nbsp;           &n= bsp; setting.
%%%
%%%          &= nbsp;           &n= bsp; This file may be used in Plain TeX or AmSTeX
%%%          &= nbsp;           &n= bsp; by
%%%
%%%          &= nbsp;           &n= bsp; \input path.sty
%%%
%%%          &= nbsp;           &n= bsp; and in LaTeX by
%%%
%%%          &= nbsp;           &n= bsp; \documentstyle[...,path,...]{...}
%%%
%%%          &= nbsp;           &n= bsp; The checksum field above contains a CRC-16
%%%          &= nbsp;           &n= bsp; checksum as the first value, followed by the
%%%          &= nbsp;           &n= bsp; equivalent of the standard UNIX wc (word
%%%          &= nbsp;           &n= bsp; count) utility output of lines, words, and
%%%          &= nbsp;           &n= bsp; characters.  This is produced by Robert
%%%          &= nbsp;           &n= bsp; Solovay's checksum utility.}
%%%  }
%%% = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

% = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
%
%          &nb= sp;           &nbs= p;   The \path Macro
%
% An early prototype of this code which was developed = by Nelson H. F.
% Beebe <beebe@math.utah.edu> used a recursive = macro to peel off one
% character at a time, then with a nest of \ifx = statements, test for
% each punctuation character, and if one is found, = insert discretionary
% linebreaks in the form of \- or \penalty0.  = While this usually works,
% it is not entirely satisfactory, because the nested = \ifx statements
% are ugly, and the recursion can exhaust TeX's macro = stack for
% arguments longer than about 30 characters.
%
% A second version by NHFB built upon the ideas used = by the LaTeX
% \verb|...| macro; this was mostly successful, but = was flawed by its
% inability to handle at least the three characters ^ = [ ], by loss of
% use of @ for naming internal private macros, and by = its inability to
% allow the set of characters at which breaks are = permissible.
%
% The problem was then passed off to Philip Taylor, = who wrote this third
% version which fully solves the problem.  Phil = therefore gets the
% author credit in the file header above.  [Gee, = thanks !  ** Phil]
%
% = =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D

\immediate\write16{This is path.sty, Version 3.02 = <23-Oct-1991 13:45:12>}

%%% We will regrettably need one \count variable with = an open name,
%%% in which to save the category code of = commercial-at ...

\newcount \ATcode
\ATcode =3D \catcode `\@

%%% Make commercial-at a letter to provide concealed = control sequences

\catcode `\@ =3D 11

%%% and then declare two \count variables with = concealed names

\newcount \c@tcode
\newcount \c@unter

%%% and a boolean variable with an open name, to = specify the nature of
%%% the delimiters which will be associated with the = \path command

\newif \ifspecialpathdelimiters

%%% We need to define control sequences which expand = to both
%%% active and passive spaces ...

\begingroup
\catcode `\ =3D 10
\gdef \passivesp@ce { }
\catcode `\ =3D 13\relax%
\gdef\activesp@ce{ }%
\endgroup

%%% \discretionaries will define a macro = \discr@ti@n@ri@s which will
%%% make every character between the first and final = <delim> a
%%% discretionary breakpoint.

\def \discretionaries %%% <delim> <chars> = <delim>
     % start a group (ended in = \discr@ti@naries ),
     % make every character = (apart from space) active,
     % then transfer control to = \discr@tionaries ...
    {\begingroup
        \c@tcodes = =3D 13
        = \discr@tionaries
    }

%%% \discr@tionaries will receive as parameter the = initial <delim>
%%% which will delimit the set of discretionaries; = this <delim>
%%% will be active.

\def \discr@tionaries #1%%% <delim>
     % knowing the initial = <delim>, define \discr@ti@naries with a
     % delimited parameter = structure, the final delimiter being
     % the second instance of = <delim>
    {\def \discr@ti@naries ##1#1%%% = <chars> <delim>
          % = \discr@ti@naries will receive as parameter the set of
          % = characters which are to be made discretionaries; it ends the
          % group = and then defines \discr@ti@n@ries, a tail-recursive
          % macro, = which will quietly process each of the
          % = discretionaries in turn ...
         = {\endgroup
          \def = \discr@ti@n@ries ####1%%% <char> or <delim>
          &nbs= p;    % by checking to see if it has reached the end of = the
          &nbs= p;    % list, i.e. comparing its parameter with the known = final
          &nbs= p;    % <delim> ...
          &nbs= p;   {\if   \noexpand ####1\noexpand #1%
          &nbs= p;          % if they = match, there is no more to do ...
          &nbs= p;          \let \n@xt =3D = \relax
          &nbs= p;    \else
          &nbs= p;          % otherwise the = character becomes active and is
          &nbs= p;          % defined as a = discretionary with the three texts
          &nbs= p;          % <self> = <empty> <self>, thus suppressing true
          &nbs= p;          % hyphenation; = the macro then prepares to process
          &nbs= p;          % the next = character.
          &nbs= p;          \catcode `####1 = =3D 13
          &nbs= p;          \def = ####1{\discretionary
          &nbs= p;            = ;           {\char = `####1}{}{\char `####1}}%
          &nbs= p;          \let \n@xt =3D = \discr@ti@n@ries
          &nbs= p;    \fi
          &nbs= p;    % here either tail recursion occurs, if there are = more
          &nbs= p;    % characters to process, or tail recursion ceases = if all
          &nbs= p;    % have been exhausted
          &nbs= p;    \n@xt
          &nbs= p;   }%
          % of = course, none of this must take place during the \stress
          % {call} = of \discretionaries; execution is deferred until
          % = another macro such as \path calls the concealed action
          % macro = \discr@ti@n@ri@s; we therefore define this macro to
          % have = the desired effect.
          \def = \discr@ti@n@ri@s {\discr@ti@n@ries ##1#1}%
         = }%
     % and finally invoke = \discr@ti@naries to process the set of
     % discretionary characters; = it will take everything up to the
     % second instance of = <delim> as its parameter (and therefore as the
     % set of characters to be = processed).
     \discr@ti@naries
    }

%%% \path, which is the user interface to \p@th, first = checks
%%% to see whether \specialpathdelimiters is = <true> or <false>;
%%% if <true>, it needs to take special action = to ensure that
%%% \stress {all} characters (apart from = <space>) are acceptable
%%% as delimiters; this is very time-consuming, and = should be
%%% avoided if at all possible.  It also defines = \endp@th, to
%%% close the appropriate number of groups, and = finally transfers
%%% control to \p@th

\def \path
    {\ifspecialpathdelimiters
        = \begingroup
        \c@tcodes = =3D 12
        \def = \endp@th {\endgroup \endgroup}%
     \else
        \let = \endp@th =3D \endgroup
     \fi
     \p@th
    }

%%% \p@th, which has essentially the same syntax as = \discretionaries,
%%% expects to be followed by a <delim>, a = <path>, and a second instance
%%% of <delim>; it will typeset <path> in = the \tt font with hyphenation
%%% inhibited --- breaks (but not true hyphenation) = are allowed at any
%%% or all of the special characters which = have
%%% previously been declared as = \discretionaries.

\def \p@th #1%%% <delim>
     % it starts by opening a = group (ended in \p@@th) ...
     % switches to \tt, and = inhibits hyphenation;
     % allows breaks at = \discretionaries;  saves the
     % catcode of the initial = <delim>, because if it has also been
     % declared within = \discretionaries, the initial and final <delim>
     % won't match (which would = be a disaster); \c@tcode is overloaded,
     % but there is no conflict = that I can detect ...
     % invokes \discr@ti@n@ri@s = to render active the set of special
     % characters which have = previously been declared as
     % \discretionaries; each of = these characters will expand to a real
     % \discretionary, with = replacement texts <self> <null> <self>; and
     % re-instates the catcode of = the initial <delim>.
    {\begingroup
        \tt
        \c@tcode = =3D \catcode `#1
        = \discr@ti@n@ri@s
        \catcode = `\ =3D \active
        = \expandafter \edef \activesp@ce {\passivesp@ce \hbox {}}%
        \catcode = `#1 =3D \c@tcode
        % it next = defines an inner macro \p@@th with delimited parameter
        % = structure, the final delimiter being the same as the initial
        % = delimiter which it has itself received as #1.
        \def = \p@@th ##1#1% <chars> <delim>
          &nbs= p;  % Within \p@@th,
          &nbs= p;  % permissible breakpoints are specified,
          &nbs= p;  % the path is typeset,
          &nbs= p;  % and the group(s) ended.
          &nbs= p; {\hbox {}##1%
          &nbs= p;  \endp@th
          &nbs= p; }%
     \p@@th
    }

%%% \c@tcodes expects to be followed by the r-h-s of a = numeric
%%% assignment optionally including the assignment = operator; it saves
%%% the value of the r-h-s in \c@tcode, and invokes = \c@tc@des.

\def \c@tcodes {\afterassignment \c@tc@des = \c@tcode}

%%% \c@tc@des uses the value saved in \c@tcode, and = assigns it to the
%%% \catcode of all characters with the single = exception of <space>,
%%% which retains its normal catcode of 10; on exit, = every single
%%% character apart from <space> will have the = catcode which followed
%%% \c@tcodes.  The code is optimised to avoid = unnecessary usage of
%%% save-stack space.

\def \c@tc@des
    {\c@unter =3D 0
     \loop
          &nbs= p; \ifnum \catcode \c@unter =3D \c@tcode
          &nbs= p; \else
          &nbs= p;     \catcode \c@unter =3D \c@tcode
          &nbs= p; \fi
     \ifnum \c@unter < = 255
          &nbs= p; \advance \c@unter by 1
     \repeat
     \catcode `\ =3D 10
    }

%%% We restore the original catcode of = commercial-at

\catcode `\@ =3D \ATcode

%%% Define a default set of discretionary break = characters
%%% to include all punctuation characters except = vertical
%%% bar

\discretionaries = |~!@$%^&*()_+`-=3D#{}[]:";'<>,.?\/|

\endinput


=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
Nelson H.F. Beebe
Center for Scientific Computing
Department of Mathematics
220 South Physics Building
University of Utah
Salt Lake City, UT 84112
USA
 Tel: (801) 581-5254
 FAX: (801) 581-4148
 Internet: beebe@math.utah.edu
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=

------_=_NextPart_001_01C19443.4F5C9F4C--