[comp.text.tex] Wanted: Latex style for Unix man pa

rchen@m.cs.uiuc.edu (09/06/90)

The manpage.sty that I wrote may not be exactly waht you want, but
I hope it helps.  The manpage.sty is for documenting a C++ library.

-Rong Chen @ University of Illinois at Urbana-Champaign

------------------------- manpage.sty --------------------------
% MANPAGE DOCUMENT STYLE -- Created 25 May 1990
% manpage.sty

% Rong Chen (rchen@cs.uiuc.edu)
% Department of Computer Science
% University of Illinois at Urbana-Champaign
% Urbana, IL 61801

% Copyright (c) 1990 by Rong Chen 
% Permission to copy all or part of this work is granted, provided
% that the copies are not made or distributed for resale, and that
% the copyright notice and this notice are retained.
% 
% THIS WORK IS PROVIDED ON AN "AS IS" BASIS.  THE AUTHOR PROVIDES NO
% WARRANTY WHATSOEVER, EITHER EXPRESS OR IMPLIED, REGARDING THE WORK,
% INCLUDING WARRANTIES WITH RESPECT TO ITS MERCHANTABILITY OR FITNESS
% FOR ANY PARTICULAR PURPOSE.

% This style option is designed to work with the report document style
% of LaTeX version 2.09.  Use \documentstyle[11pt,manpage]{report}
% 
% The commands that are created in the style file are:
%
% \begin{manpage}{Title}{Module}{Version} % see an example, all will be clear
% \end{manpage}                           % end of manpage environment
% \function#1  (e.g., \function{void demo(int dummy)})  % with \medskip added
% \function*#1 (e.g., \function*{void demo(int dummy)}) % no extra spacing
% \subtitle#1  (e.g., \subtitle{ANTHOR})  % fit into the same line if possible
% \subtitle*#1 (e.g., \subtitle*{AUTHOR}) % always break a newline (Unix style)
% "#1"         (e.g., "dummy_variable")   % argument is in italic&unbreakable
% \separator   % draw a line of linewith long to seperate suntitle from text
%
% The following characters (control-sequents) are defined (or redefined):
%
% \* --- the same as $\ast$
% \< --- the same as $\langle$
% \> --- the same as $\rangle$
% <  --- the same as $<$
% >  --- the same as $>$
% _  --- the same as \_
% +  --- the same as $+$
% |  --- the same as $\mid$
% ^  --- hat character that is defined as $\wedge$ being raised 0.6ex

% If you make any improvements, I'd like to hear about them.

\headheight 24pt          % See LaTeX book for definitions
\headsep 12pt
\textwidth 6.25in
\textheight 8.0in
\topmargin 0in
\marginparwidth 0pt
\oddsidemargin 0pt
\evensidemargin 0pt
\marginparsep 0pt
\parindent 0pt

\newdimen\argindent \argindent 3em  % indentation for function arguments

\newdimen\arg@dim         % temp variables that you don't want to know
\newdimen\line@siz
\newbox\arg@box

\catcode`\"=\active
\def\arg@quote#1"{\hbox{\it #1\/}} \def\tt@quote{{\tt \char`\"}}
\let"=\tt@quote

\def\separator{\rule{\linewidth}{0.5pt}}

\def\function{\@ifstar{\@func@star}{\@func@norm}}
\def\@func@star#1{\expandafter\@function#1 \\ }
\def\@func@norm#1{\expandafter\@function#1 \medskip\\ }

\def\@function#1(#2)#3 {
  \begingroup
  \setbox\arg@box=\hbox{\bf #1 \rm $($} \global\arg@dim\wd\arg@box
  \setbox\arg@box=\hbox{\rm $)$;}
  \global\line@siz\linewidth\global\advance\line@siz-\wd\arg@box
  \pagebreak[3]
  \expandafter\print@name#1 \@@{\rm $($}\def\@comma{}\ignorespaces
  \@for\@tempa:=#2\do{\ignorespaces
    \setbox\arg@box=\hbox{\@comma} \global\advance\arg@dim\wd\arg@box
    \unskip\@comma\def\@comma{\nobreak,\penalty-\@m\ }\ignorespaces
    \expandafter\print@arg\@tempa\@@\ignorespaces
  }~{\rm $)$\nobreak#3}
  \endgroup
}

\def\print@arg#1#2 #3\@@{
  \setbox\arg@box=\hbox{#1#2\expandafter\print@dummy#3=\@@}
  \global\advance\arg@dim\wd\arg@box
  \ifdim\arg@dim>\line@siz
    \global\arg@dim\argindent \global\advance\arg@dim\wd\arg@box
    \hfill\penalty-\@m\hbox{}\kern\argindent\fi
  \box\arg@box%
}

\def\print@name#1#2 #3\@@{
  \unskip\edef\tmp@name{#3}\ignorespaces
  \ifx\tmp@name\@empty{\bf #1#2 }\else{\rm #1#2 \bf #3}\fi
}

\def\print@dummy#1=#2\@@{
  {\it #1\/}\ifx #2\@nil\else{\rm $=$}\expandafter\strip@eq#2\fi
}

\def\strip@eq#1={{\rm #1}}

\def\subtitle{\@ifstar{\@subtit@star}{\@subtit@norm}}

\def\@subtit@star#1{
  \item[\hbox{\large\bf\begin{tabular}[t]{l}#1\end{tabular}}\hfill]
  \hfil\par
  \expandafter{\let\par=\space\ignorespaces\let\par=\endgraf}
}

\def\@subtit@norm#1{
  \setbox\arg@box=\hbox{\large\bf\begin{tabular}[t]{l}#1\end{tabular}}
  \ifdim \wd\arg@box > \labelwidth \item[\copy\arg@box\hfill]\hfil\par
  \else \dp\arg@box=0pt \item[\copy\arg@box\hfill] \fi
  \expandafter{\let\par=\space\ignorespaces\let\par=\endgraf}
}

\newenvironment{manpage}[3]{\@beginManpage#1\@@#2\@@#3\@@}{\@endManpage}

\def\@beginManpage#1\@@#2\@@#3\@@{
  \addcontentsline{toc}{section}{#2}
  \clearpage
  \gdef\@header{{#2}{#1}{#2}}
  \gdef\@footer{{#3}{\thepage}{\today}}
  \begin{list}{}{
    \setlength\labelwidth{1.2in}
    \setlength\leftmargin{\labelwidth}
    \addtolength\leftmargin{\labelsep}
    \topsep  5pt plus 2pt minus 2pt
    \itemsep 5pt plus 2pt minus 2pt
    \parsep 10pt plus 2pt minus 2pt
  }
  \raggedbottom
  \let"=\arg@quote
}

\def\@endManpage{
  \end{list} \clearpage \flushbottom
}

\def\@first#1#2#3{#1}
\def\@second#1#2#3{#2}
\def\@third#1#2#3{#3}

\def\ps@headings{
  \def\@oddhead{\parbox{\textwidth}{
    {\rm\ \ \expandafter\@first\@header\hfill
      \expandafter\@second\@header\hfill
      \expandafter\@third\@header\ \ } \\[.1cm]
    \hbox{}\rule[12pt]{\textwidth}{1pt}
  }}
  \def\@evenhead{\parbox{\textwidth}{
    {\rm\ \ \expandafter\@third\@header\hfill
      \expandafter\@second\@header\hfill
      \expandafter\@first\@header\ \ } \\[.1cm]
    \hbox{}\rule[12pt]{\textwidth}{1pt}
  }}
  \def\@oddfoot{\parbox{\textwidth}{
    \hbox{}\rule{\textwidth}{1pt} \\[.1cm]
    {\sl\ \ \expandafter\@first\@footer\hfill
      \rm\expandafter\@second\@footer\hfill
      \sl\expandafter\@third\@footer\ }
  }}
  \def\@evenfoot{\parbox{\textwidth}{
    \hbox{}\rule{\textwidth}{1pt} \\[.1cm]
    {\sl\ \ \expandafter\@third\@footer\hfill
      \rm\expandafter\@second\@footer\hfill
      \sl\expandafter\@first\@footer\ }
  }}
}

\gdef\@header{{}{}{}}
\gdef\@footer{{}{}{}}
\pagestyle{headings}

\catcode`\<=\active \def\mit@less{$\char`\<$} \let<=\mit@less
\catcode`\>=\active \def\mit@more{$\char`\>$} \let>=\mit@more
\def\<{$\langle$} \def\>{$\rangle$} \def\*{$\ast$}
%\catcode`\_=\active \def_={\kern.06em \vbox{\hrule width.3em}}
\catcode`\_=\active \global\let_=\_
\catcode`\^=\active \def\mit@wedge{\raise.06ex \hbox{\small $\wedge$}}
\let^=\mit@wedge
\catcode`\+=\active \def\mit@add{$\char43$} \let+=\mit@add
\catcode`\|=\active \def\mit@mid{$\mid$} \let|=\mit@mid
\def\dq{\tt \char`\" \rm }

------------------------------ example.tex -----------------------------
\documentstyle[11pt,twoside,manpage]{report}
\begin{document}

\begin{manpage}{OIM Library}{Button}{Draft}

\subtitle{Name}
    Button --- a graphical event object that can be turn-on turn-off

\subtitle{Declaration}
    \#include \<button.h\>

\function{Button(Point origin, Point corner, const~char\* label,
	   int foreground_color = WHITE,
	   int background_color = BLACK,
	   int frame_style      = IN_BORDER,
	   Boolean show_status  = SHOW)}
    Construct a button inside a rectangle area with lower left vertex at
    "origin" and upper right vertex at "corner".  A button is actually a
    round-cornered box in shape, so the "origin" and "corner" are located
    outside of the button area.  The "label" is for button label.  The
    first highlighted character in the label text will be the hot key when
    the mouse is disabled, otherwise highlighted text have no effects.
    For example, label "@N@ext" designate "N" as the hot key for the button
    if the mouse do not present; "@N@ext" and "Next" are the same when the
    mouse is enabled.  By default, if the mouse driver is loaded before
    program execution, it is enabled.  Other attributes are self-explanatory.
    Foreground color is also used for label color.

\function{Button(int left, int bottom, int right, int top, const~char\* label,
	   int foreground_color = WHITE,
	   int background_color = BLACK,
	   int frame_style      = IN_BORDER,
	   Boolean show_status  = SHOW)}
    Construct a button with "left", "bottom", "right" and "top" as its
    boundaries.  Button will be shown when created by default.

\subtitle{Description}
    Button is similar to electronic touch buttons in operation.  It can be
    pressed on or pressed off depending on its current status.  Usually,
    we use normal color to indicate for button "off" position and highlight
    color for button "on" position.  Button is an effect way to implement
    boolean variables that can toggled on a screen.  When the mouse is
    enabled, point the mouse cursor inside the button area to press the
    button.  When the mouse is disabled, a hot key have to be specified
    and press that key to trigger a button press operation.

\subtitle{Public \\ Operations}

\function{Boolean pressed()}
    Check if the button has been pressed, usually in a loop.  If it is,
    the switch action (highlight or redraw the button) is performed.

\function{Boolean isOn()}
    Return TRUE if the button is at "on" (highlighted) position.

\function{Boolean isOff()}
    Return TRUE if the button is at "off" (normal color) position.

\function{Boolean isHide()}
    Return TRUE if at least one hide operation is outstanding.

\function{void turnOn()}
    Highlight the button figure and set the button status to "on".

\function{void turnOff()}
    Redraw the button figure using the normal color and set the button
    status to "off".

\function{void show()}
    Set the hide status to false and draw the button figure in normal
    or highlight color depending on current button status.

\function{void hide()}
    Set the hide status to true and erase the button figure by drawing
    a box that covers the button, the color is taken from a pixel just
    outside of the button and fill-pattern is SOLID_FILL.

\subtitle{Virtual \\ Operations}

\function{Boolean isSelected(Point p)}
   This function is used in the event handler.  Return TRUE if the hot key
   is press when mouse is not enabled, when mouse is enabled check if the
   mouse cursor is pressed and it is inside the button figure.

\function{int status()}
   Returns 0 if the button is off and 1 if the button is on.
   This function is called in the event handler if there is a event
   function bonded to the button (see Event for more details).  The
   value of the function is passed to the event function as default
   argument value.

\function{int select()}
   The same as saying turnOn() when the button is off or turnOff() when
   the button is on.  This function is hardly needed.  It is here simply
   because the Event class has it defined and the Button class is a
   subclass of Event.

\function{void bind(void \hbox{\rm (\*{\it handler})(int)})}
   Associate a function (often referred as the button handler) with the
   button.  After the function "handler" is bonded to the button, it is
   invoked automatically every time the button is pressed by the event
   handler.  The argument value to the function is passed as the status
   of the button.  The default action taken by the event handler can be
   modified by changing the next function action().

\function{void action(int status)}
   The default action function called through the event handler.  It defines
   the behavior of the button module when a function is bonded to the button.
   Not to modify this function unless it is absolutely necessary because it
   redefines the semantics of all button objects.

\subtitle{See Also}
     Event, Choice, RoundBox

\subtitle{Author}
     Rong Chen at the Office for Information Management, UIUC. 9-1-89.

\end{manpage}
\newpage
\begin{verbatim}
    /* EXAMPLE 1 */
    #include <time.h>
    #include "key.h"
    #include "button.h"

    main() {
        Key key;
        Point a1(100, 100), a2(240, 130);
        Button a(a1, a2, "@F@irst Button", WHITE, RED);
        Button b(400, 100, 540, 120, "@S@econd Button", WHITE, BLUE);
        Point c1(250, 200), c2(400, 300);
        Button c(c1, c2, "@T@hird Button\nhas\nThree Lines", WHITE, GREEN);
        while (1) {
            if (a.pressed()) { /* sleep(1);  a.turnOff(); */ }
            if (b.pressed()) { sleep(1);  b.turnOff(); }
            if (c.pressed()) { break; }
        }
        a.hide(); b.hide(); key.waitFor(CR);
    }

    /* EXAMPLE 2 */
    #include <stdlib.h>
    #include "button.h"
    #include "box.h"

    void funcA(int) {
        Box infoBox(0, 0, MAX_X, 40, RED, CYAN);
        infoBox << "A button is pressed";
    }
    void funcB(int) {
        Box infoBox(0, 0, MAX_X, 40, BLUE, CYAN);
        infoBox << "B button is pressed";
    }
    void funcC(int) { exit(0); }

    main() {
        Button a(100, 100, 240, 130, "Button @A@", WHITE, RED);
        Button b(400, 100, 540, 120, "Button @B@", WHITE, BLUE);
        Button c(250, 200, 400, 300, "@E@xit", WHITE, GREEN);
        a.bind(funcA); b.bind(funcB); c.bind(funcC);
        Event::waitForEvents();
    }
\end{verbatim}

\end{document}