% ^^A -*-LaTeX-*-
%\iffalse
%<*pl>
%\fi
\def\filename{pl.dtx}
\def\fileversion{3.2}
\def\filedate{2026-05-23}
\def\docversion{3.2}
\def\docdate{2026-05-23}
%\iffalse
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\typeout{%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%
   Prolog Documentation in LaTeX. Version \fileversion\@spaces gene \filedate
%% 
%% Purpose:
%%   Style option for LaTeX to provide routines to document Prolog programs.
%%
%% Documentation: see seperate LaTeX document `pl.tex'
%%
%% Author: Gerd Neugebauer
%%         Brechklinge 10
%%         69256 Mauer (Germany)
%% Mail:   gene@gerd-neugebauer.de
%%
%% Copyright (C) 1995-2026 Gerd Neugebauer
%%
%%  pl.dtx is distributed in the hope  that it will  be useful, but WITHOUT
%%  ANY WARRANTY.    No author or   distributor accepts  responsibility  to
%%  anyone for the  consequences of using  it or for  whether it serves any
%%  particular purpose or works at all, unless he says so in writing.
%%
%%  Everyone is granted permission to copy, modify and redistribute pl.dtx,
%%  provided this copyright notice  is preserved and any modifications  are
%%  indicated.
%%
%%
%%  This  style is still under  development and may  be replaced with a new
%%  version  which  provides an enhanced   functionality.  Any comments are
%%  welcome but don't expect ANY help from my side.
%%
}
%\fi
%
%    \title{Literate Programming:\\Prolog Documentation with \LaTeX}
%    \author{Gerd Neugebauer\\
%           Brechklinge 10\\
%           69256 Mauer (Germany)\\
%           Net: {\tt gene@gerd-neugebauer.de}}
%
%    \date{{\footnotesize This document describes pl version \fileversion\
%          as of \filedate.}}
%
%    \maketitle
%
% ^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% \DoNotIndex{\@ifnextchar,\box,\dimen,\divide,\newif,\noindent,\normalsize}
% \DoNotIndex{\obeyspaces,\other,\raggedright,\relax,\rule}
% \DoNotIndex{\sf,\smallskip,\textwidth,\tiny,\wd,\endgraf}
% \DoNotIndex{\empty,\fbox,\fboxrule,\fboxsep}
% \DoNotIndex{\ifdim,\medskip,\multiply,\message}
% \DoNotIndex{\par,\parbox,\parshape}
% \DoNotIndex{\@,\@@par,\@beginparpenalty,\@empty}
% \DoNotIndex{\@flushglue,\@gobble,\@input}
% \DoNotIndex{\@makefnmark,\@makeother,\@maketitle}
% \DoNotIndex{\@namedef,\@ne,\@spaces,\@tempa}
% \DoNotIndex{\@tempb,\@tempswafalse,\@tempswatrue}
% \DoNotIndex{\@thanks,\@thefnmark,\@topnum}
% \DoNotIndex{\@@,\@elt,\@forloop,\@fortmp,\@gtempa,\@totalleftmargin}
% \DoNotIndex{\",\/,\@ifundefined,\@nil,\@verbatim,\@vobeyspaces}
% \DoNotIndex{\|,\~,\ ,\ProvidesPackage}
% \DoNotIndex{\advance,\aftergroup,\begingroup,\bgroup}
% \DoNotIndex{\mathcal,\csname,\def,\documentclass,\documentstyle}
% \DoNotIndex{\dospecials,\edef,\egroup}
% \DoNotIndex{\else,\endcsname,\endgroup,\endinput,\endtrivlist}
% \DoNotIndex{\expandafter,\fi,\fnsymbol,\futurelet,\gdef,\global}
% \DoNotIndex{\hbox,\hss,\if,\if@inlabel,\if@tempswa,\if@twocolumn}
% \DoNotIndex{\ifcase}
% \DoNotIndex{\ifcat,\iffalse,\ifx,\ignorespaces,\index,\input,\item}
% \DoNotIndex{\jobname,\kern,\leavevmode,\leftskip,\let,\llap,\lower}
% \DoNotIndex{\m@ne,\next,\newpage,\nobreak,\noexpand,\nonfrenchspacing}
% \DoNotIndex{\obeylines,\or,\protect,\raggedleft,\rightskip,\rm,\sc}
% \DoNotIndex{\setbox,\setcounter,\small,\space,\string,\strut}
% \DoNotIndex{\strutbox}
% \DoNotIndex{\thefootnote,\thispagestyle,\topmargin,\trivlist,\tt}
% \DoNotIndex{\twocolumn,\typeout,\vss,\vtop,\xdef,\z@}
% \DoNotIndex{\,,\@bsphack,\@esphack,\@noligs,\@vobeyspaces,\@xverbatim}
% \DoNotIndex{\`,\catcode,\end,\escapechar,\frenchspacing,\glossary}
% \DoNotIndex{\hangindent,\hfil,\hfill,\hskip,\hspace,\ht,\it,\langle}
% \DoNotIndex{\leaders,\long,\makelabel,\marginpar,\markboth,\mathcode}
% \DoNotIndex{\mathsurround,\mbox,\newcount,\newdimen,\newskip}
% \DoNotIndex{\nopagebreak}
% \DoNotIndex{\parfillskip,\parindent,\parskip,\penalty,\raise,\rangle}
% \DoNotIndex{\section,\setlength,\TeX,\topsep,\underline,\unskip,\verb}
% \DoNotIndex{\vskip,\vspace,\widetilde,\\,\%,\@date,\@defpar}
% \DoNotIndex{\[,\{,\},\]}
% \DoNotIndex{\count@,\ifnum,\loop,\today,\uppercase,\uccode}
% \DoNotIndex{\baselineskip,\begin,\tw@}
% \DoNotIndex{\discretionary,\immediate,\makeatletter,\makeatother}
% \DoNotIndex{\repeat,\scriptsize,\selectfont,\the,\undefined}
% \DoNotIndex{\arabic,\do,\makeindex,\null,\number,\show,\write,\@ehc}
% \DoNotIndex{\@author,\@ehc,\@ifstar,\@sanitize,\@title,\everypar}
% \DoNotIndex{\if@minipage,\if@restonecol,\ifeof,\ifmmode}
% \DoNotIndex{\settowidth,\@resetonecoltrue,\@resetonecolfalse,\bf}
% \DoNotIndex{\clearpage,\closein,\lowercase,\@inlabelfalse}
% \DoNotIndex{\selectfont,\mathcode,\newmathalphabet,\rmdefault}
% \DoNotIndex{\bfdefault}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   \CheckSum{468}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%  \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         \~}
%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%   \setcounter{IndexColumns}{2}
%   \def\PredicateIndex#1{}
%   \MakeShortVerb{"}
%
% ^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
%    \section*{Introduction}
%
%    Inspired by the idea behind the web system I felt the need to
%    have a system to write documented Prolog programs. But instead of
%    having to transform the common source into program or
%    documentation the central idea was to develop a method to have
%    one common source which can be interpreted by a
%    Prolog\footnote{C-Prolog, Quintus-Prolog, or ECLiPSe at that
%    time.} system as well as by \LaTeX.  To achieve this goal the
%    \LaTeX\ commands are hidden from Prolog by enclosing them in
%    comments.
%    
%    The C-Prolog allows two kinds of comments. The first kind starts
%    with a "%" and ends at the end of the line. This is also a comment
%    for \LaTeX.  The other Prolog comment starts with "/*" and ends
%    with "*/".  This seemed to be the right way to hide the \LaTeX\
%    documentation commands from the Prolog interpreter.
%   
%    The only problem was to define a starting sequence to open the
%    first comment.  This sequence must be an executable Prolog
%    command as well as a valid \LaTeX{} command. The first approach
%    was to modify both --- the Prolog program and the \LaTeX\ style
%    --- to find a common statement. The pre 2.0 versions of the pl
%    style option took this decision.  One problem came up when the
%    author tried to incorporate the module system of Prolog.  This
%    system requires that the first statement in a module is the
%    declaration of the module name possibly together with the list of
%    predicates to be exported. This restriction led to the approach
%    taken in version 2.0 and later.  In modules nearly no change has
%    to be made.  The module declaration is defined as a valid \LaTeX\
%    macro.
%    
%   
%    \section{The \LaTeX\ Documentation Driver File}
%    
%    The \LaTeX\ main file ties together the whole documentation. This
%    file should contain the "\documentclass" command together with
%    the appropriate "\usepackage" or the "\documentsyle" command with
%    the style option "pl".\smallskip
%    
%    \noindent
%    \unitlength=\textwidth\advance\unitlength-65mm
%    \begin{minipage}{\unitlength}
%      \indent The only special command which is required in this file is the
%      command "\PrologInput". This command inserts the Prolog file
%      given as argument at the current position. The formatting
%      directives described below are activated.
%      
%      The command "\PrologInput" may occur several times in this main
%      file.  It may be mixed with simple input or include
%      commands. "\PrologInput" can be used nested, as long as the
%      other requirements described in this document are fulfilled.
%    \end{minipage}
%    \hfill
%    \begin{minipage}{58mm}
%    {\small%
%      "\documentclass[...]{...}"\\
%      "\usepackage{pl}"\\
%      "\begin{document}"\\
%      "..."\\
%      "\PrologInput{file1.pl}"\\
%      "\PrologInput{file2.pl}"\\
%      "..."\\
%      "\PrologInput{filen.pl}"\\
%      "..."\\
%      "\end{document}"}
%    \end{minipage}\smallskip
%    
%    
%    The commands meant for the Prolog files can also be used in a plain
%    \LaTeX{} context. Nevertheless those commands have been developed
%    with the application of documenting Prolog in mind. The contents of
%    the Prolog files and the additional macros provided by pl will
%    be described in the next sections.   
%   
%   
%
%    \section{The Prolog Files}
%    
%    \subsection{Starting Modules}
%    
%    Prolog files can come in two variants: either it is a Prolog
%    module or a plain Prolog file. Modules are distinguished from
%    files by a specific first Prolog statement.  This module
%    declaration can have the form\footnote{e.g. in Quintus-Prolog}
%    
%    {\it ":- module(" Name"," Exports ")."}
%    
%    Alternatively it may have the form
%    
%    {\it ":- module_interface(" Name ")."}
%    
%    These module declarations have to be the first Prolog instructions in
%    the file.
%
%    In addition to those Prolog instructions we need to use the rule
%    that the terminating point (.) of the module declaration is
%    followed immediately by \verb*+ /*+. Note the single space which is
%    necessary for the Prolog parser to work properly.
% 
%    Thus a Prolog module documented with pl starts e.g. with 
%   
%    {\it ":- module\_interface(" Name "). /*"}
%   
%    Before this line there should be only Prolog comments starting with
%    "%". These comments are also ignored by \TeX. Thus they do
%    neither appear in the documentation nor are the evaluated by Prolog.
%   
%   
%    \subsection{Starting Plain Files}
%   
%    Plain Prolog files are those files not starting with a module
%    declaration. For technical reasons plain files can not start with code
%    directly but requires a C-style comment at the beginning. The contents
%    of this comment is typeset by \LaTeX.
%
%    In general this restriction seems to be too hard. It is always a good
%    idea to start a file with some general remarks and comments.
%
%   
%   
%    \subsection{Ending Prolog Files}
%   
%    The Prolog file should end with
%
%    "\EndProlog*/"
%    
%    From the Prolog  point of view the  file consists now of the declaration
%    of a module (or a dummy predicate). The rest is purely comment. From the
%    \LaTeX\   point  of view   it   contains  two   macros  and  nothing  in
%    between. Thus everything in between will be interpreted as \LaTeX\ input
%    only.
%   
%    \subsection{Prolog Code}
%   
%    To include additional Prolog statements in this file enclose them in 
%
%    "\PL*/"
%   
%    "/*PL"
%
%    This forces the   Prolog system to  interpret  the code, and the \LaTeX\
%    system to typeset it in a verbatim-like environment.
%   
%    The Prolog code may contain every characters except the string
%    "/*PL". For some reasons which are opaque to me spaces at the
%    beginning of a line of Prolog code are ignored. To force proper
%    indentation you should use {\sc tab} characters at the beginning of the
%    line. 
%   
%   
%    \subsection*{Options for the Code Layout}
%   
%    The  options    are  implemented  as    macros.  To   change  them   use
%    "\renewcommand".
%   
%    \begin{description}
%      \item [\tt \char92 PrologModule]\ \\
%      Macro to typeset  the module  definition. In general  this  may be a
%      sectioning command  producing an appropriate    title. It takes  two
%      arguments --- the two arguments of the "module" declaration.
%     
%      The default is "\section{{\tt #1}}"
%      \item [\tt \char92 PrologFile]\ \\
%      Same as above but for non module files.
%    
%      The default is "\section{{\tt #1}}"
%      \item [\tt \char92 PrologFont]\ \\
%      Macro to select the font used  for printing the  listing part.  This
%      should  be  a    non-pro\-portional   font.    The      default   is
%      "\small\tt".
%    
%      \item [\tt \char92 PrologListFont]\ \\
%      Macro to select  the font used for  printing  the export  list.  The
%      default is "\small\tt".
%    
%      \item [\tt \char92 PrologListIndent]\ \\
%      Macro to select the indentation of the export list. This should be a
%      length. The default is "2em".
%    
%      \item [\tt \char92 PrologRuleWidth]\ \\
%      Macro to select the  width of the rule  to separate Prolog code from
%      text. This should be a length. The default is "0pt".
%    
%      \item [\tt \char92 PrologNumberFont]\ \\
%      Font to be used when typesetting line numbers.
%    \end{description}
%    
%    The following flags can be set by simply including the commands in
%    the \LaTeX{} part of the document. Since they are mainly of a
%    global nature the preamble of the driver file would be a good place
%    for them.
%    
%    \begin{description}
%      \item [\tt \char92 PrologNumberLinestrue]\ \\
%        Turn on line numbering.
%      \item [\tt \char92 PrologNumberLinesfalse]\ \\
%        Turn off line numbering.
% 
%      \item [\tt \char92 PrologDialect\char251{\em Dialect}\char253]\ \\
%      Declare the dialect of the used Prolog. This is mainly important to
%      make the syntax of the modules known to pl. {\em Dialect}\/ can
%      take one of the following values: {\tt eclipse}, {\tt quintus}, {\tt
%      sixtus}, {\tt cprolog}, {\tt swiprolog}, {\tt sbprolog}, or {\tt
%      binprolog}.
%    \end{description}
%    
%    \section{Predicate Templates}
%
%    Predicate templates provide a nice way to typeset a predicate
%    head with some additional information.  A usual predicate is
%    characterized by the name/arity, arguments and the file it can be
%    found in. Two boxes are used to contain this information. The
%    right one contains the file name; The left one contains the
%    predicate description.  The box for the file name has a default
%    width which will be enlarged if the file name doesn't fit into
%    it. The predicate description if surrounded by a frame and
%    formatted in the following way. If the predicate description fits
%    in one line then it is typeset in one line.  Otherwise the second
%    and following lines are indented. This indentation tries to align
%    beneath the first argument. If the predicate name is very long
%    this might not be desirable. Thus the indentation has a maximal
%    value which will not be exceeded.
%    
%    The \LaTeX\ part of the file contains the following template
%    
%    "\Predicate pred/1(arg)."
%    
%    Note that the ")." have {\em no}\/ space in between.
%    
%    \subsection*{Options}
%    
%    The   options  are  implemented   as  macros.    To   change   them  use
%    "\renewcommand".
%    
%    \begin{description}
%      \item [\tt \char92 PredicateFont]\ \\
%      Macro containing   the   font changing  command  for the  predicate
%      description. The default is "\normalsize\tt".
%    
%      \item [\tt \char92 PredicateSkip]\ \\
%      Macro containing  the spacing  before  and after the predicate
%      description.  The  default is  "\smallskip".
%    
%      \item [\tt \char92 PredicateIndent]\ \\
%      Macro  containing  the  maximal  length of the    indentation of the
%      predicate description.  The default  is "5em".   If this  value
%      is very large   then the arguments  are  always aligned  beneath the
%      first one.
%
%      \item [\tt \char92 PredicateFileFont]\ \\
%      Macro containing  the font changing command  for the file name. The
%      default is "\small\sf".
%    
%      \item [\tt \char92 PredicateFileWidth]\ \\
%      Macro containing the  minimal width of  the box containing  the file
%      name.  The default is "5em".  If  this value is "0pt" then
%      only the file name determines the width of the box.
%    
%      \item [\tt \char92 PredicateFileExtension]\ \\
%      Macro containing the   extension of the prolog  file.   This text is
%      typeset right after the file  name stored in "\PrologFILE". The
%      default is empty.
%    \end{description}
%    
%    \begin{figure}[t]
%    {\dimen255=\textwidth\advance\dimen255 by-1mm\divide\dimen255 150
%    \setlength{\unitlength}{\dimen255}
%    \begin{picture}(150,52)
%      \linethickness{.1pt}
%      \put(  0, 0){\line(0,1){8}}
%      \put(  0, 8){\line(1,0){150}}
%      \put(150, 0){\line(0,1){8}}
%      \put(  0, 0){\makebox(150,8){\bf Succeding Text}}
%      \put( 75,12){\vector(0,1){4}}
%      \put( 75,12){\vector(0,-1){4}}
%      \put( 77,12){\makebox(0,0)[l]{\scriptsize\tt \char92 PredicateSkip \char92 par }}
%      {\thicklines\put(  0,16){\framebox(110,20){\bf Predicate Description}}}
%      \put(130,25){\framebox(20,4){\bf File}}
%      \put(150,35){\makebox(0,0)[r]{\parbox[r]{60mm}{\raggedleft\scriptsize\tt
%      \char92 PredicateFileFont\\%
%      \char92 PrologFile\\%
%      \char92 PredicateFileExtension}}}
%      \put(1,17){%
%      \begin{picture}(0,0)
%        \put( 10, 2){\vector(1,0){10}}
%        \put( 10, 2){\vector(-1,0){10}}
%        \put( -1,-3){\makebox(0,0)[l]{\scriptsize\tt\char92 PredicateIndent}}
%        \put( 20, 0){\line(1,0){87}}
%        \put( 20, 0){\line(0,1){12}}
%        \put(  0,12){\line(0,1){ 6}}
%        \put(  0,12){\line(1,0){20}}
%        \put(  0,18){\line(1,0){107}}
%        \put(107, 0){\line(0,1){18}}
%        \put(  2,16){\makebox(0,0)[l]{\scriptsize\tt \char92 PredicateFont}}
%      \end{picture}}
%      \put(130,18){\vector(1,0){20}}
%      \put(130,18){\vector(-1,0){20}}
%      \put(130,16){\makebox(0,0){\scriptsize\tt \char92 PredicateFileIndent}}
%      
%      \put(112,24){\vector(1,0){2}}
%      \put(112,24){\vector(-1,0){2}}
%      \put(112,22){\makebox(0,0)[l]{\scriptsize\tt \char92 PredicateFileSep}}
%      
%      \put(  0,44){\line(0,1){8}}
%      \put(  0,44){\line(1,0){150}}
%      \put(150,44){\line(0,1){8}}
%      \put(  0,44){\makebox(150,8){\bf Preceding Text}}
%      \put( 75,40){\vector(0,1){4}}
%      \put( 75,40){\vector(0,-1){4}}
%      \put( 77,40){\makebox(0,0)[l]{\scriptsize\tt \char92 PredicateSkip \char92 par }}
%    \end{picture}
%    }
%    \caption{The {\tt \char92 Predicate} command}
%    \end{figure}
%    
%    \def\PrologFILE{prolog}
%    
%    \noindent
%    "\Predicate foo_bar/6(Argument1, Argument2, Argument3,"\\
%    "                  Argument4, Argument5, Argument6)."
%
%    \Predicate foo_bar/6(Argument1, Argument2, Argument3,
%                      Argument4, Argument5, Argument6).
%    \def\PrologFILE{very\_Long\_Prolog\_File}
%    \Predicate foo_bar/6(Argument1, Argument2, Argument3,
%                      Argument4, Argument5, Argument6).
%    
%    \noindent
%    "\Predicate this_is_a_very_long_predicate/5("\\
%    "    Argument1, Argument2, Argument3, Argument4, Argument5)."
%
%    \def\PrologFILE{prolog}
%    \Predicate this_is_a_very_long_predicate/5(
%        Argument1, Argument2, Argument3, Argument4, Argument5).
%    
%    
%    \subsection{The Underscore}
%    
%    One thing which occurs very often  in program listings is the underscore
%    "_".   The problem arises that \LaTeX\  uses the underscore only in
%    math mode  to denote subscripts.   For the comands  described above the
%    "_" can be  simply  used as  is.   Beware, don't expect  math  mode
%    subscript to work there.
%    
%    The macro "\WithUnderscore" is provided by pl to
%    execute some commands where the underscore does have the meaning of a
%    plain character. 
%    
%    Example:
%    
%    It can be highly desirable to protect the index. Otherwise any
%    indexed predicate containing an underscore would wrack \LaTeX. This
%    can be done with a construction like the following one:
%    
%    "\WithUnderscore{\printindex}"
%    
%    
%    \subsection{Inline Code}
%    The style  option  {\tt idtt} allows    to typeset some   text using the
%    teletype  font ("\tt").   The text  has simply to  be enclosed in "|".
%    
%    The same effect can be achieved with the command
%    "\MakeShortVerb" defined in {\sf doc.sty}. To use this you
%    have to add the style option {\tt doc} and place the following
%    command in the preamble:
%    
%    "\MakeShortVerb{|}"
%    
%    Example:
%    
%    You type "|proc_1|" and you get {\tt proc\_1}.
%    
%    
%    \section*{Bugs and Problems}
%    
%    \begin{itemize}
%      \item The bugs and problems of earlier releases have been corrected.
%    \end{itemize}
% 
%    
%    \newpage
%    \section*{A Sample}
%    
%    {\catcode`\%=14 \Listing{sample.pl}}
%    \newpage
%    \PrologInput{sample.pl}
%
%
% ^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%   \StopEventually{}
% ^^A%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%    \newpage
% 
%    \section{The Implementation}
%
%    \begin{macrocode}
\ifx\documentclass\relax \else
  \ProvidesPackage{pl}[\filedate\space Gerd Neugebauer (\fileversion)]
\fi
%    \end{macrocode}
%
%    \subsection{Options and Defaults}
% 
%    First of all we define the macros containing the default values for
%    certain options. The user may redefine them with "\renewcommand" to
%    adapt them to the personal preferences.
%
%    \begin{macrocode}
\def\PrologFont{\small\tt}
%    \end{macrocode}
%    The macro "\PrologFont" contains the font changing command executed
%    to typeset the Prolog code in the verbatim-like environment.
%
%    \begin{macrocode}
\def\PrologIndent{2em}
%    \end{macrocode}
%    The macro "\PrologIndent" contains the indentation of the Prolog
%    code in the verbatim-like environment.
%
%    \begin{macrocode}
\def\PrologNumberFont{\tiny\rm}
%    \end{macrocode}
%    The macro "\PrologNumberFont" contains the font changing command
%    used to typeset the line numbers (if enabled) in the verbatim-like
%    environment.
%
%    \begin{macrocode}
\def\PrologRuleWidth{0pt}
%    \end{macrocode}
%    The macro "\PrologRuleWidth" contains the width of the rule
%    separating Prolog code and text.
%
%    \begin{macrocode}
\def\PrologListFont{\small\tt}
%    \end{macrocode}
%    The macro "\PrologListFont" contains the font changing command
%    to typeset a Prolog list (exports).
%
%    \begin{macrocode}
\def\PrologListIndent{2em}
%    \end{macrocode}
%    The macro "\PrologListIndent" contains the indentation for a Prolog
%    list (exports).
%
%    \begin{macrocode}
\def\PrologModule#1#2{\section{The Module {\tt #1}}}
%    \end{macrocode}
%    The macro "\PrologModule" contains the command which is called at
%    the beginning of a module. The first argument is the name of the
%    module. The second argument is the list of exports.
%
%    This macro is supposed to be redefined by the user with
%    "\renewcommand". 
%
%    \begin{macrocode}
\def\PrologFile#1#2{\section{The File {\tt #1}}}
%    \end{macrocode}
%    The macro "\PrologFile" contains the command which is called at
%    the beginning of a non-module Prolog file. The first argument is the name
%    of the module. The second argument is usually empty.
%
%    This macro is supposed to be redefined by the user with
%    "\renewcommand". 
%
%    \begin{macrocode}
\def\PredicateFont{\tt}
%    \end{macrocode}
%    The macro "\PredicateFont" contains the font switching command
%    used in "\Predicate" for the body of the predicate description.
%
%    \begin{macrocode}
\def\PredicateFileFont{\small\sf}
%    \end{macrocode}
%    The macro "\PredicateFileFont" contains the font switching command
%    used in "\Predicate" for the file name
%
%    \begin{macrocode}
\def\PredicateSkip{\smallskip}
%    \end{macrocode}
%    The macro "\PredicateSkip" contains the skip command executed before
%    and after "\Predicate".
%
%    \begin{macrocode}
\def\PredicateIndent{5em}
%    \end{macrocode}
%    The macro "\PredicateIndent" contains length of the
%    maximal indentation in the macro "\Predicate".
%
%    \begin{macrocode}
\def\PredicateFileExtension{}
%    \end{macrocode}
%    The macro "\PredicateFileExtension" contains the text appended to
%    file name in the "\Predicate" command.
%
%    \begin{macrocode}
\def\PredicateFileWidth{5em}
%    \end{macrocode}
%    The macro "\PredicateFileWidth" contains the minimum width of the
%    file name in the "\Predicate" command. Shorter file names are padded
%    to this length.
%
%    \begin{macrocode}
\def\PredicateFileSep{1em}
%    \end{macrocode}
%    The macro "\PredicateFileSep" contains the width of the
%    separating space between the predicate description and the file name.
%
%    \begin{macrocode}
\def\PredicateBoxSep{3pt}
%    \end{macrocode}
%    The macro "\PredicateBoxSep" contains the amount of space between
%    the box and contents in the "\Predicate" command. This is similar to
%    "\fboxsep" in \LaTeX.
%
%    \begin{macrocode}
\def\PredicateBoxRule{0.5pt}
%    \end{macrocode}
%    The macro "\PredicateBoxRule" contains the line thickness of box in
%    the "\Predicate" command. This is similar to "\fboxrule" in
%    \LaTeX. 
%
%    \begin{macrocode}
\def\PredicateIndex#1{\index{#1}}
%    \end{macrocode}
%    The macro "\PredicateIndex" contains the command which is called to
%    put a predicate into an index. The argument is the string to index.
%
%    This macro may be redefined by the user with "\renewcommand". 
%
%    \begin{macrocode}
\newif\ifPrologNumberLines
%    \end{macrocode}
%    switch to enable line numbering
%
%
%
%    \subsection{Internals}
% 
%    \begin{macrocode}
\def\PrologEXPORTS{}
%    \end{macrocode}
%    The macro "\PrologEXPORTS" contains the current list of exports.
%
%    \begin{macrocode}
\def\PrologFILE{}
%    \end{macrocode}
%    The macro "\PrologFILE" contains the current module or file
%    name. This is not supposed to be set by the user. Nevertheless
%    there might be occasions where this is necessary (e.g. in the
%    documentation of this style option).
%
%
%    \subsection{Configuration Commands}
%    The different Prolog dialects have different ways to declare
%    modules. Thus pl needs to know which dialect is currently used. This
%    influences how "PrologInput" handles the first Prolog clause.
%
%    \begin{macrocode}
\def\PrologDialect#1{%
  \@ifundefined{PL@start@module@#1}%
                {\message{*** Prolog dialect #1 is undefined. Ignored.}}%
                {\gdef\PL@Dialect{#1}}}
\def\PL@Dialect{eclipse}
%    \end{macrocode}
%    The command "\PrologDialect" can be used to declare the Prolog
%    dialect used. The value is stored in the macro "\PL@Dialect" for
%    later use. This is only done if an appropriate macro to handle a module
%    are defined.
%
%
%    \begin{macrocode}
\gdef\PL@@delayed{}
%    \end{macrocode}
%    Keep some characters which were read in advance.
%
%
%
%    \begin{macrocode}
\newcount\PL@line
%    \end{macrocode}
%    We allocate a new counter for the line number of Prolog code (if
%    enabled).
%
%
%
%    \subsection{Typesetting Prolog Code}
%
%    Prolog code is typeset is a verbatim-like way. For this purpose a
%    modified version of the verbatim environment from the \TeX\ book is
%    used. For an explanation see pages 380--382 in the \TeX\ book.
%
%    \begin{macrocode}
\gdef\PL@code@setup{\PrologFont\parskip=0ex\parindent=0pt
  \ifx\PL@@delayed\empty\else%
    \parbox{\PrologIndent}{%
      \ifPrologNumberLines \PrologNumberFont \the\PL@line%
      \global\advance\PL@line1
      \else\ \fi}\PL@@delayed%
    \gdef\PL@@delayed{}\par
  \fi%
  \def\par{\leavevmode\egroup\box0\endgraf}
  \def\do##1{\catcode`##1=12 }\dospecials
  \obeyspaces
  \obeylines
%  \catcode`\`=\other
  \catcode`\^^I=13
  \everypar{\parbox{\PrologIndent}{%
      \ifPrologNumberLines \PrologNumberFont \the\PL@line%
      \global\advance\PL@line1
      \fi
      \hfill}\PL@code@startbox}}
%    \end{macrocode}
% 
%
%    \begin{macrocode}
\def\PL@code@startbox{\setbox0=\hbox\bgroup}
%    \end{macrocode}
% 
%
%    \begin{macrocode}
{\catcode`\^^I=13
 \gdef^^I{\leavevmode\egroup
   \dimen0=\wd0 % the width so far, or since the previous tab
   \setbox1=\hbox{\PrologFont\space}\dimen1=8\wd1
   \divide\dimen0   by\dimen1
   \multiply\dimen0 by\dimen1 % compute previous multiple of tab
   \advance\dimen0  by\dimen1 % advance to next multiple of tab
   \wd0=\dimen0 \box0 \PL@code@startbox}%
}
{\obeyspaces\global\let =\ }
%    \end{macrocode}
% 
%
%    \begin{macrocode}
\def\PL*/{\PL@PL@init%
  \begingroup
  \PL@code@setup
  \PL@doPL}
%    \end{macrocode}
% 
% 
%    "|" is temporary escape character to catch the end "/*PL"
%    \begin{macrocode}
{\catcode`\|=0 \catcode`\\=12
  |obeylines|gdef|PL@doPL^^M#1/*PL{#1|endgroup|PL@PL@exit}}
%    \end{macrocode}
% 
%
%    Initialization macro
%    \begin{macrocode}
\def\PL@PL@init{%
        \ifdim\PrologRuleWidth>0pt%
          \par\noindent\rule{\textwidth}{\PrologRuleWidth}\par%
        \else\medskip\par\fi}
%    \end{macrocode}
%
%
%
%    \begin{macrocode}
\def\PL@PL@exit{%
        \ifdim\PrologRuleWidth>0pt%
          \vspace{-2ex}\noindent\rule{\textwidth}{\PrologRuleWidth}\par%
        \else\smallskip\par\fi}
%    \end{macrocode}
%
%
%
%
%    Dirty hack.
%    make : active to catch :-
%    use a group to hide the changes
%    \begin{macrocode}
\def\PL@INIT{\begingroup\catcode`:=13\catcode`/=13}
%    \end{macrocode}
%
%
%
%    \begin{macrocode}
\def\PL@EXIT{\endgroup}
%    \end{macrocode}
%
%
%
%    we make : active and include the file
%    \begin{macrocode}
\gdef\PrologInput{%
  \begingroup
  \catcode`\_=12
  \PL@Input
}
%    \end{macrocode}
%
%
%    \begin{macrocode}
\PL@INIT
\gdef\PL@Input#1{%
  \gdef\PrologFILE{#1}%
  \gdef\PrologMODULE{}%
  \gdef\PrologEXPORTS{}%
  \global\PL@line=1%
  \endgroup
  \PL@INIT%
  \let:=\PL@COLON
  \let/=\PL@SLASH
  \input{#1}%
  \gdef\PrologFILE{}%
  \gdef\PrologMODULE{}%
  \gdef\PrologEXPORTS{}%
  }
\PL@EXIT
%    \end{macrocode}
%
%
%
%    \subsection{End a File of Prolog Code}
% 
%    At the end of a file there is a "*/" which terminates the last
%    comment for Prolog. Those two characters are stripped away by the macro
%    "\EndProlog".
%
%    \begin{macrocode}
\def\EndProlog#1*/{}
%    \end{macrocode}
%
%    \subsection{Definition for Various File Types}
%
%    \subsubsection{Definitions for Non-Module Files}
%
%    A file can start with "/*". This case is handled by making the
%    "/" active and binding it to the command "\PL@SLASH". This
%    command checks if the next character is a "*". In this case the
%    catcodes of "/" and ":" can be restored to their defaults. This
%    is done by "\PL@EXIT".
% 
%    Finally the underscore "_" is made active and
%    "\PL@start@star" is called to do the rest.
%
%    \begin{macrocode}
\def\PL@SLASH{\@ifnextchar*{%
    \PL@EXIT
    \PL@US@start
    \PL@SLASH@STAR}{/}}
%    \end{macrocode}
%
%
%
%
%
%    \begin{macrocode}
\def\PL@SLASH@STAR*{%
  \PrologFile{\PrologFILE}{}%
  \PL@US@end}
%    \end{macrocode}
%
%
%
% 
%
%
%    \begin{macrocode}
\def\PL@COLON{\@ifnextchar-{\PL@goal}{: }}
%    \end{macrocode}
%
%
%
%    \begin{macrocode}
\def\PL@goal-{%
  \PL@EXIT
  \PL@US@start
  \@ifnextchar m{\csname PL@start@module@\PL@Dialect\endcsname}%
  {\@ifnextchar t{\PL@start@true}%
    {\csname PL@start@file@\PL@Dialect\endcsname}}}
%    \end{macrocode}
%
%
%    \begin{macrocode}
\def\PL@start@true true. /*{%
  \PrologFile{\PrologFILE}{}%
  \PL@US@end}
%    \end{macrocode}
%
%
%    \subsubsection{Definitions for ECLiPSe-Prolog}
%
%    The beginning of a module file in eclipse can be in one of the following
%    forms:
%
%    \begin{description}
%    \item[:- module\_interface({\em Module})] 
%    \item[:- module({\em Module})] 
%    \end{description}
%
%    We strip away the actual predicate name getting the rest in the macro
%    parameter \#1. The complete module declaration is stored in the macro
%    "\PL@delayed" to be inserted later.
%    \begin{macrocode}
\def\PL@start@module@eclipse module#1(#2). /*{%
  \global\PL@line=1
  \gdef\PL@@delayed{:- module#1(#2).}
  \gdef\PrologMODULE{#2}%
  \catcode`\,=13 %
  \PrologModule{\PrologFILE}{}%
  \PL@US@end}
%    \end{macrocode}
%
%
%
%    \subsubsection{Definitions for Quintus-Prolog}
%
%    The beginning of a module file in Quintus is in the following form:
%
%    \begin{description}
%    \item[:- module({\em Module},{\em Exports})] \ 
%    \end{description}
%
%
%    \begin{macrocode}
\def\PL@start@module@quintus module(#1,{%
  \global\PL@line=1
  \gdef\PrologFILE{#1}%
  \catcode`\,=13 %
  \PL@start@module@quintus@}
%    \end{macrocode}
%
%
%
%    \begin{macrocode}
\def\PL@start@module@quintus@[#1]). /*{%
  \gdef\PrologEXPORTS{#1}%
  \PrologModule{\PrologFILE}{#1}%
  \PL@US@end}
%    \end{macrocode}
%
%    \subsubsection{Definitions for C-Prolog}
%
%    I don't know if C-Prolog has a module system nowadays. The last time I
%    checked it had none. If nobody has a better idea I use Quintus Prolog
%    syntax in this case even it does not make any sense.
%
%    \begin{macrocode}
\let\PL@start@module@cprolog=\PL@start@module@quintus
%    \end{macrocode}
%
%    \subsubsection{Definitions for Sixtus-Prolog}
%
%    I don't know what's used in Sixtus-Prolog. So I use the same value as for
%    eclipse.
%
%    \begin{macrocode}
\let\PL@start@module@sixtus=\PL@start@module@eclipse
%    \end{macrocode}
%
%    \subsubsection{Definitions for SWI-Prolog}
%
%    Fortunately the module system of SWI-Prolog is compatible with the module
%    system of Quintus Prolog. So we just use the definition here again.
%
%    \begin{macrocode}
\let\PL@start@module@swiprolog=\PL@start@module@quintus
%    \end{macrocode}
%
%    \subsubsection{Definitions for SB-Prolog}
%
%    I don't know if C-Prolog has a module system nowadays. The last time I
%    checked it had none. If nobody has a better idea I use Quintus Prolog
%    syntax in this case even it does not make any sense.
%
%    \begin{macrocode}
\let\PL@start@module@sbprolog=\PL@start@module@quintus
%    \end{macrocode}
%
%    \subsubsection{Definitions for bin-Prolog}
%
%    I don't know what's used in bin-Prolog. So I use the same value as for
%    eclipse.
%
%    \begin{macrocode}
\let\PL@start@module@binprolog=\PL@start@module@eclipse
%    \end{macrocode}
%
%
%
%
%    \subsection{Typeset a Boxed Predicate Description}
%
%    The first step is to protect the underscores in the predicate names and
%    the arguments.
%
%
%    \begin{macrocode}
\def\Predicate{\PL@US@start\Predicate@}
%    \end{macrocode}
%
%    The syntax is oriented towards Prolog syntax. The name and the arity of
%    the predicate may not contain "/" or "(". 
%
%    \begin{macrocode}
\def\Predicate@#1/#2(#3).{%
  \PredicateSkip\par\noindent%
  {\setbox1=\hbox{\PredicateFileFont \PrologFILE\PredicateFileExtension}%
   \fboxrule=\PredicateBoxRule%
   \fboxsep=\PredicateBoxSep%
   \fbox{\PredicateIndex{#1/#2}%
         \dimen255=\wd1
         \ifdim\dimen255<\PredicateFileWidth \dimen255=\PredicateFileWidth \fi
         \dimen255=-\dimen255
         \advance\dimen255 by-\PredicateFileSep
         \advance\dimen255 by \textwidth
         \parbox{\dimen255}{\raggedright
                 \setbox0=\hbox{\normalsize\PredicateFont #1(}
                 \dimen254=\wd0
        
                 \ifdim\dimen254>\PredicateIndent \dimen254=\PredicateIndent\fi
                 \dimen253=\dimen255 \advance\dimen253 by -\dimen254
                 \parshape=2 0mm \dimen255 \dimen254 \dimen253
                 \normalsize\PredicateFont #1\ifx\@empty#3 \else(#3)\fi
        }}%
    \hfill \box1\PredicateSkip\par
  }\PL@US@end}
%    \end{macrocode}
%
%
%
%
%
%
%
%    \subsection{Typeset a List of Prolog Predicates}
% 
%
%    \begin{macrocode}
\def\PrologList{\par\noindent%
  \PL@US@start
  \PrologListFont
  \catcode`\,=13%
  \parindent=\PrologListIndent\parskip=0pt\par
  \PL@List}
%    \end{macrocode}
%
%
%
%    \begin{macrocode}
{\catcode`\,=13 
\gdef\PL@List[#1]{%
  \def,{\par}%
  #1
  \PL@US@end\par}
}
%    \end{macrocode}
%
%
%    \begin{macrocode}
\def\PrologListEXPORTS{\PrologList[\PrologEXPORTS]}
%    \end{macrocode}
%
%
%
%
%    \subsection{Special Treatment of the Underscore}
%
%    We define two macros to activate and deactivate the underscore
%    respectively. Those two macros have to come in pairs always. The first
%    one opens a group to protect the changes. The closing macro simply closes
%    the group, thus undoing the effects of the first macro.
%
%    \begin{macrocode}
\def\PL@US@start{\begingroup\catcode`\_=13 }
\def\PL@US@end{\endgroup }
%    \end{macrocode}
%
%
%
%    \begin{macrocode}
\def\WithUnderscore{\begingroup\catcode`\_=13 \With@Underscore}
\def\With@Underscore#1{#1\endgroup}
%    \end{macrocode}
%
%    \subsection{Misc}
%
%    A spin off product of this style file is a macro to include a file
%    verbatim. Such a macro is also provided by the verbatim package and
%    others. Nevertheless I have left it in. 
%
%    \begin{macrocode}
\def\Listing#1{\par\begingroup%
  \PL@line=1%
  \PL@code@setup%
  \input{#1}%
  \endgroup}
%    \end{macrocode}
%
%\iffalse
%</pl>
%<*pcode>
%\fi
%    \section{Backward Compatibility Mode: {\tt pcode.sty}}
%
%    For backward compatibility some macros are defined in a style file under
%    the old name {\tt pcode.sty}. The new style file has to be accessible
%    under the new name {\tt pl.sty}. This file is loaded before some macros
%    are defined.
%
%    \begin{macrocode}
\ifx\PrologFont\relax\else\input pl.sty\fi
%    \end{macrocode}
%
%    In former versions mainly the Prolog dialect Quintus has been
%    supported. Thus a boolean was enough to tell apart the dialects Quintus
%    and eclipse --- which came next. This is emulated with the next two
%    macros.
%
%    \begin{macrocode}
\def\PrologQuintustrue{\PrologDialect{quintus}}
\def\PrologQuintusfalse{\PrologDialect{eclipse}}
%    \end{macrocode}
%
%    The macro "\WithUnderscore" was named "\WithActiveUnderscore"
%    in a former version of {\tt pcode.sty}. The {\em Active} part of the name
%    was misleading for users. Thus it has been removed. The old name is made
%    an alias for the new one.
%
%    \begin{macrocode}
\let\WithActiveUnderscore=\WithUnderscore
%    \end{macrocode}
%
%    In an ancient version of {\tt pcode.sty} the macro "\EndProlog" was
%    named "\StopProlog". Thus we make an alias for the old name.
%
%    \begin{macrocode}
\let\StopProlog=\EndProlog
%    \end{macrocode}
%
%    Make "\PL@INIT" usable for the user as well. I don't know where
%    this might be used. It has been in the old version, so I put it into the
%    compatibility mode.
%
%    \begin{macrocode}
\let\PrologInit=\PL@INIT
%    \end{macrocode}
%
%\iffalse
%</pcode>
%\fi
%    \Finale
%
\endinput
