a2ps, version 4.10.2

General Purpose PostScript Generating Utility

Edition 4.10.2, 5 May 1998

Akim Demaille
Miguel Santana


Table of Contents


Introduction

This document describes @pack version 4.10.2. The latest versions may be found on the @href{http://www.inf.enst.fr/~demaille/a2ps/,a2ps home page}.

We tried to make this document informative and pleasant. It tries to be more than a plain reference guide, and intends to offer information about the concepts or tools etc. that are related to printing PostScript. This is why it is now that big: to offer you all the information you might want, not because @pack is difficult to use.

Please, send us emailcards :). Whatever the comment is, or if you just like @pack{}, write to @email{Miguel.Santana@st.com, Miguel Santana} and Akim Demaille.

Description

@pack formats files for printing on a PostScript printer.

The format used is nice and compact: normally two pages on each physical page, borders surrounding pages, headers with useful information (page number, printing date, file name or supplied header), line numbering, pretty-printing, symbol substitution etc. This is very useful for making archive listings of programs.

Compared to the previous versions, @pack version 4.10.2 provides:

  1. various configuration files (see section Configuration Files)
  2. some powerful escapes to define the headers the way you want (see section Escapes);
  3. a totally open approach of fonts and encodings;
  4. a rather strong support of Latin 2, 3, 4, 5 and 6 encodings, thanks to Ogonkify (see section `Overview' in Ogonkify manual), written by Juliusz Chroboczek.
  5. fully customizable output style: fonts, background and foreground colors, line numbering style etc. (see section Designing PostScript Prologues).
  6. the ability to delegate the processing of some files to other filters (see section Your Delegations).
  7. and of course, the ability to pretty-print sources written in quite a few various languages (see section Pretty Printing).

Version Numbering Scheme

@pack is alive. To let you know its status, the version numbers are structured à la Linux.

What is to be understood in `a2ps version x.y.zt'?

Reporting Bugs

We try hard to make @pack portable on any Unix platform, and bug free. But sometimes there can still be bad surprises, even after having compiled and checked @pack on several very different platforms.

You may encounter some of these problems yourself. In any case, please never abandon without giving us a chance. We need information from everybody so that mistakes get fixed as fast as possible.

So, if you have a problem (configuration error, compilation error, runtime error, documentation error or unclear), first check on @href{http://www.inf.enst.fr/~demaille/a2ps/,a2ps home page} and in the FAQ (see section Frequently asked questions) if the issue has not been addressed yet. If it is not the case, but it appears that the version of @pack you have is old, consider upgrading.

If the problem persists, send us a mail (a2ps-bugs@inf.enst.fr) which subject is `a2ps version: short-description' and which content mentions the name of your machine and OS, the version of @pack{}, every detail you have on your compiler, and as much traces as possible (the error messages you get on the screen, or the output of make when it fails etc.).

Be sure to get a quick answer.

@pack Mailing List

There is a mailing list in which are discussed various topics around @pack{}. There are also announcements about the version in alpha testing, requests for comments, new sheets, etc.

To subscribe to the list, send a mail to a2ps-request@inf.enst.fr, with `subscribe' in the body.

Please, note that the mailing list is by no means a bug reporting address: use a2ps-bugs@inf.enst.fr instead.

Helping the Development

If you like @pack and if you feel like helping, there are several things you can do.

Translation
The interface of @pack is under GNU gettext which means that all the messages can be translated, without having to look at the code of @pack{}: you don't need to be a programmer at all. All the details are available on @href{http://www.inf.enst.fr/~demaille/a2ps/po/, the a2ps translation page}.
Style Sheets
Since @pack is evolving and getting more powerful, the style sheets should be checked and improved. There are too many so that the authors work on them. Therefore if you feel your favorite language is not honored as it should be, improve the style sheet! (see section Pretty Printing for details.)
Encodings
@pack is wide open to any 8-bit encoding. If your language is not covered today by @pack{}, you can easily provide the support yourself. Honestly, the trickiest part is to find correct free fonts that support your mother tongue (see section Encoding Files, to know more).
Fonts
There are still some characters missing in Ogonkify. See @href{http://www.dcs.ed.ac.uk/home/jec/ogonkify/missing.html, the list of missing characters} and @href{http://www.dcs.ed.ac.uk/home/jec/ogonkify/, the Ogonkify home page} for details.
Documentation
If you feel something is missing or is unclear, send us your contributions.
Porting
Porting a program to special architectures (MS-DOS, OS/2 etc.), or building special packages (e.g., RPM) requires having an access to these architectures. If you feel like maintaining such a port, tell us.
Features
Well, if you feel like doing something else, go ahead!

User's Guide

This chapter is devoted to people who don't know @pack yet: we try to give a soft and smooth introduction to the most useful features. For a reference manual, see section Invoking @pack. For the definition of some words, see section Glossary, for questions you have, see section Frequently asked questions.

Purpose

@pack is a program that takes a text file (i.e., human readable), and makes a PostScript file out of it. Typically output is sent to a printer.

How to print

To print a file `doc.txt', just give it to @pack{}: the default setting should be the one you'd like:

gargantua ~ $ a2ps doc.txt
[doc.txt (plain): 9 pages on 5 sheets]
[Total: 9 pages on 5 sheets] sent to the default printer

@pack sent the file `doc.txt' to the default printer, writing two columns of text on a single face of the sheet. Indeed, by default @pack uses the option `-2', standing for two virtual pages.

Basics for Printing

Say you want to print the C file `bar.c', and its header `foo.h', on 4 virtual pages, and save it into the file `foobar.ps'. Just hit:

gargantua $ a2ps foo.h bar.c -4 -o foobar.ps
[foo.h (C): 1 page on 1 sheet]
[bar.c (C): 3 pages on 1 sheet]
[Total: 4 pages on 2 sheets] saved into the file `foobar.ps'

The option `-4' tells @pack to make four virtual pages: two rows by two columns. The option `-o foobar.ps' (which is the short version of `--output=foobar.ps') specifies the output file. Long options must always be separated by spaces, though short options with no arguments may be grouped.

Note too that the options may be specified before or after the files, it does not matter.

If you send `foobar.ps' to a printer, you'll discover that the keywords were highlighted, that the strings and comments have a different face. Indeed, @pack is a pretty-printer: if it knows the (programming) language in which your file is written, it will try to make it look nice and clear on the paper.

But too bad: `foo.h' is only one virtual page long, and `bar.c' takes three. Moreover, the comments are essential in those files. And even worse: the system's default printer is out of ink. Thanks god, precious options may help you:

gargantua $ a2ps -A4 foo.h bar.c --prologue=gray -P lw   
[foo.h (C): 1 page on 1 sheet]
[bar.c (C): 3 pages on 1 sheet]
[Total: 4 pages on 1 sheet] sent to the printer `lw'

Here the option `-A' is used to Allow several files on the same sheet, `-P lw' means to print on the printer named `lw', and finally, the long option `--prologue' requires the use one of the alternative printing styles. There are other prologues (see option `--prologue' in section Input Options), and you can even design yours (see section Designing PostScript Prologues).

Special Printers

There are three special printers pre-defined.

The first one, void, sends the output to the trash. Its main use is to see how many pages would have been used.

gargantua ~ $ a2ps -P void parsessh.c
[parsessh.c (C): 33 pages on 17 sheets]
[Total: 33 pages on 17 sheets] sent to the printer `void'

The second, display sends the output to ghostview, so that you can check the output without printing. Of course if you don't have ghostview, it won't work... And it is up to you to configure another displaying application (see section Your Printers).

The last, file saves the output into a file named after the file you printed (e.g., saves into `foo.ps' when you print `foo.c').

Using Delegations

@pack can decide that @pack itself is not the right tool to do what you want. In that case it delegates the task to other programs. What you should retain from this, is, forget that there are delegations. Indeed, the interface with the delegations has been designed so that you don't need to be aware that they exist to use them. Do as usual.

As an example, if you need to print a PostScript file, just hit:

gargantua ~ $ a2ps article.ps -d 
[article.ps (ps, delegated to PsNup): 7 pages on 4 sheets]
[Total: 8 pages on 4 sheets] sent to the default printer

While honoring your defaults settings, @pack delegates the task to put two virtual pages per physical page to psnup, a powerful filter part of the famous psutils by Angus Duggan.

Suppose now that you want to display a Texinfo file. Then, provided you have all the programs @pack needs, just hit

gargantua ~ $ a2ps a2ps.texi -P display
[a2ps.texi (texinfo, delegated to texi2dvi): 75 pages on 38 sheets]
[Total: 76 pages on 38 sheets] sent to the printer `display'

Once the read documentation, you know you want to print just pages 10 to 20, plus the cover. Just hit:

gargantua ~ $ a2ps a2ps.texi --pages=1,10-20 -d
[a2ps.texi (texinfo, delegated to texi2dvi): 13 pages on 7 sheets]
[Total: 14 pages on 7 sheets] sent to the default printer

A final word: compressed files can be treated in the very same way:

gargantua ~ $ a2ps a2ps.texi.gz -a1,10-20 -d
[a2ps.texi (compressed, delegated to Gzip-a2ps): 13 pages on 7 sheets]
[Total: 14 pages on 7 sheets] sent to the default printer

You should be aware that:

Checking the Defaults

If @pack did not have the behavior expected, this may be because of the default settings given by your system administrator. Checking those default values is easy:

gargantua ~ $ a2ps --list=defaults
Configuration status of a2ps 4.10.2
Sheets:
  default paper         = A4
  layout per page       = 2 x 1 (landscape, rows first)
  borders               = yes
  compact mode          = yes
  inside margin         = 0
More stuff deleted here
Internals:
  verbosity level     = 2
  file command        = /usr/ucb/file -L
  temporary directory = 
  library path        = 
        /inf/soft/infthes/demaille/.a2ps
        /usr/local/share/a2ps/sheets
        /usr/local/share/a2ps/ps
        /usr/local/share/a2ps/encoding
        /usr/local/share/a2ps/afm
        /usr/local/share/a2ps/printers
        /usr/local/share/a2ps

Remember that the on-line help is always available. Moreover, if your screen is small, you may pipe it into more. Just trust this:

a2ps --help | more

Important parameters

Many things are parameterizable in @pack{}, but two things are just essential to make sure everything goes right:

The paper
Make sure that the paper @pack uses is the same as your printer (See section Sheets Options, option `--medium').
The encoding
Make sure that the encoding @pack uses is the same as the standard alphabet in your country (See section Input Options, option `--encoding').

Both values may be checked with `a2ps --list=defaults'.

Localizing

@pack provides some Native Language Support, that is speaking your mother tongue. It uses three special features for non-English languages:

the tongue
i.e., the language used by the interface,
the date
i.e., the format and the words used in the language to specify a date,
the ordering
i.e., the alphabetic order that corresponds to your tongue (for instance the French letter `é' is to be considered has an `e', which is not what says its ASCII code).

To use these features, you may set your environment variable LANG to the standard code representing your language:

ca
Catalan
cs
Czech
de
German
es
Spanish
fr
French
it
Italian
ko
Korean
nl
Dutch
pl
Polish
pt
Portugese
se
Swedish
tr
Turkish

The problem with this approach is that a lot more than just messages and time information is affected: especially the way numbers are written changes, what may cause problems with awk and such.

So if you just want messages, time format and sorting order to be localized, then define:

set LC_MESSAGES=fr ; export LC_MESSAGES
set LC_TIME=fr     ; export LC_TIME
set LC_COLLATE=fr  ; export LC_COLLATE

Interfacing with other programs

Here are some tips on how to use @pack with other programs.

elm

Once you are in elm, hit o to enter in the options edition menu, hit p to edit the printer command, and enter `a2ps -2gEmail --strip=3 %s -d'. The option `-g' is given because there are some special escapes that @pack understands, and replaces with the correct character.

pine

Jan Chrillesen suggests us how to use @pack with the Pine mail-reader. Add the following to `.pinerc' (of course you can put it in `pine.conf' as well):

# Your printer selection
printer=a2ps -2gEmail --strip=3 -d

# Special print command if it isn't one of the standard printers
personal-print-command=a2ps -2gEmail --strip=3 -d

Netscape

This is actually valid for any program that generates PostScript that you want to post-process with @pack{}. Use the following command:

a2ps

Not too hard, isn't it?

Nevertheless, this setting suppose your world is OK, your file(1) detects correctly PostScript files, and your @pack is configured to delagate. In case one one these conditions is not met, use:

a2ps -ZEps

Do not forget to tell Netscape whether your printer supports colors, and the type of paper it uses.

Invoking @pack

Calling @pack is fairly simple:

a2ps Options... Files...

If no Files... are given, @pack prints its standard input. If `-' appears in the Files..., it designates the standard input too.

Command line options

To read the options and arguments that you give, @pack uses GNU getopt, hence:

Here after a boolean is considered as true (i.e. setting the option on), if boolean is `yes', or `1'; as false if it equals `no' or `0'; and raise an error otherwise. The corresponding short option takes no arguments, but corresponds to a positive answer.

When an argument is presented between square brackets, it means that it is optional. Optional arguments to short option must never be separated from the option.

Tasks Options

Task options specify the task @pack will perform. It will not print, it executes the task and exits successfully.

Option: -V
Option: --version
print version and exit successfully.

Option: -h
Option: --help
Print a short help, and exit successfully.

Option: --copyright
Display Copyright and copying conditions, and exit successfully.

Option: --guess
Act like file does: display the (key of the) type of the Files.

For instance, on a C file, you expect it to answer `c', and upon a PostScript file, `ps'.

This can be very useful on broken systems to understand why a file is printed with a bad style sheet (see section Style Sheet Files).

Option: --list=topic
Display a report on @pack{}' status with respect to topic, and exit successfully. topic can be any non-ambiguous abbreviation of:
`defaults'
`options'
Give an extensive report on @pack configuration and installation.
`features'
Known media, encodings, languages, prologues, printers, variables, delegations and user options are reported. In a word, anything that you may define.
`delegations'
Detailed list of the delegations. See section Your Delegations.
`encodings'
Detailed list of known encodings. See section Some Encodings.
`variables'
Detailed list of the variable. See section Your Escapes.
`media'
Detailed list of known media. See section Your Media.
`prologues'
Detailed list of PostScript prologues. See section Designing PostScript Prologues.
`printers'
Detailed list of printers and named outputs. See section Your Printers.
`style-sheets'
Detailed list of the known style sheets. See section Known Style Sheets.
`user-options'
Detailed list of the user options. See section Your Shortcuts

There are also options meant for the maintainers only, presented for sake of completeness.

`texinfo-style-sheets'
`ssh-texi'
Detailed list of known style sheets in Texinfo format. If the sheet verbosity is set, report version numbers, requirements and ancestors.
`html-style-sheets'
`ssh-html'
Detailed list of the style sheets in HTML format.
`texinfo-encodings'
`edf-texi'
Detailed list of encodings, in Texinfo format.
`texinfo-prologues'
`pro-texi'
Detailed list of prologues, in Texinfo format.

Global Options

These options are related to the interface between you and @pack{}.

Option: -q
Option: --quiet
Option: --silent
be really quiet

Option: -v[level]
Option: --verbose[=level]
tell what we are doing. At

There is also an interface made for the maintainer with finer grained selection of the verbosity level. level is a list of tokens (non ambiguous abbreviation are valid) separated by either `,' or `+'. The tokens may be:

`configuration'
`options'
reading the configurations files and the options,
`encodings'
the encodings,
`expert'
more detailed information is provided: PPD listings is exhaustive,
`files'
inputs and outputs,
`fonts'
the fonts,
`escapes'
`meta-sequences'
the expansion of escapes,
`parsers'
any parsing process (style sheets, PPD files etc.),
`pathwalk'
`pw'
the search for files,
`ppd'
PPD processing,
`sheets'
the style sheets,
`stats'
statistics on some internal data structures,
`tools'
launched programs or shell commands ; triggers the escape `?V' on (see section Available Escapes),
`all'
all the messages.

Option: -=shortcut
Option: --user-option=shortcut
use the shortcut defined by the user. See section Your Shortcuts.

Note that contrary to the other options, this special construct cannot be after the files to print. This is actually a bug. If somebody sees how to fix this, please send us a patch.

Option: --debug
enable debugging features. They are:

Option: --variable=key[:value]
Without value, unset the variable key. Otherwise, set it to value. See section Your Escapes for more details.

Sheets Options

This options specify the general layout, how the sheet should be used.

Option: -M medium
Option: --medium=medium
use output medium medium. See the output of `a2ps --list=media' for the list of supported media. Typical values are `A3', `A4', `A5', `B4', `B5', `Letter', `Legal'. `A4dj', `Letterdj' are also defined for Desk Jet owners, since that printer needs bigger margins.

Option: -r
Option: --landscape
print in landscape mode

Option: -R
Option: --portrait
print in portrait mode

Option: --columns=num
specify the number of columns of virtual pages per physical page.

Option: --rows=num
specify the number of rows of virtual pages per physical page.

Option: --major=direction
specify whether the virtual pages should be first filled in rows (direction = `rows') or in columns (direction = `columns').

Option: -1
1 x 1 portrait, 80 chars/line, major rows (i.e. alias for `--columns=1 --rows=1 --portrait --chars-per-line=80 --major=rows').

Option: -2
2 x 1 landscape, 80 chars/line, major rows.

Option: -3
3 x 1 landscape, 80 chars/line, major rows.

Option: -4
2 x 2 portrait, 80 chars/line, major rows.

Option: -5
5 x 1 landscape, 80 chars/line, major rows.

Option: -6
3 x 2 landscape, 80 chars/line, major rows.

Option: -7
7 x 1 landscape, 80 chars/line, major rows.

Option: -8
4 x 2 landscape, 80 chars/line, major rows.

Option: -9
3 x 3 portrait, 80 chars/line, major rows.

Option: -j
Option: --borders=boolean
print borders around virtual pages.

Option: -A
Option: --compact=boolean
Compact mode for a sequence of files. This option allows the printing of more than one file on the same page. Otherwise, the beginning of each file will be printed in a new sheet.

Option: --margin[=num]
Specify the size of the margin (num PostScript points, or 12 points without arguments) to leave in the inside (i.e. left for the front side page, and right for the back side). This is intended to ease the binding.

Pages Options

This options are related to the content of the virtual pages.

Option: --line-numbers=number
print the line numbers from number lines to number lines.

Option: -C
Alias for `--line-numbers=5'.

Option: -f size[unit]
Option: --font-size=size[unit]
scale font to size for body text. size is a float number, and unit can be `cm' for centimeters, `points' for PostScript points, and `in' for inches. Default unit in `inches'.

To change the fonts used, change the current prologue (see section Designing PostScript Prologues.

Option: -l num
Option: --chars-per-line=num
Set the number of columns per page. num is the real number of columns devoted to the body of the text, i.e., no matter whether lines are numbered or not.

Option: -L num
Option: --lines-per-page=num
Set the lines per virtual page for printing. The font size is automatically scaled up to fill in the whole page. This is useful for printing preformatted documents which have a fixed number of lines per page. The minimum number of lines per page is set at 40 and maximum is at 160. If a number less than 40 is supplied, scaling will be turned off.

Option: -m
Option: --catman
Understand UNIX manual output ie: 66 lines per page and possible bolding and underlining sequences. The understanding of bolding and underlining is there by default even if `--catman' is not specified.

If your file is actually a UNIX manual input, i.e., a roff file, then depending whether you left @pack delegate or not, you will get a readable version of the text described, or a pretty-printed version of the describing file (see section Your Delegations).

Option: -T num
Option: --tabsize=num
set tabulator size to num. This option is ignored if --interpret=no is given.

Option: --non-printable-format=format
specify how non-printable chars are printed. format can be
`caret'
Use classical Unix representation: `^A', `M-^B' etc.
`space'
A space is written instead of the non-printable character.
`question-mark'
A `?' is written instead of the non-printable character.
`octal'
For instance `\001', `177' etc.
`hexa'
For instance `\x01', `\xfe' etc.
`emacs'
For instance `C-h', `M-C-c' etc.

Headings Options

These are the options through which you may define the information you want to see all around the pages.

All these options support text as an argument, which is composed of plain strings and escapes. See section Escapes for details.

Option: -B
Option: --no-header
no page headers at all.

Option: -b[text]
Option: --header[=text]
set the page header

Option: --center-title[=text]
Option: --left-title[=text]
Option: --right-title[=text]
Set virtual page center, left and right titles to text.

Option: -u[text]
Option: --underlay[=text]
use text as under lay (or water mark), i.e., in a light gray, and under every page.

Option: --left-footer[=text]
Option: --footer[=text]
Option: --right-footer[=text]
Set sheet footers to text.

Input Options

Option: -a[Page range]
Option: --pages[=Page range]
With no argument, print all the page, otherwise select the pages to print. Page range is a list of interval, such as `-a1': print only the first page, `-a-3,4,6,10-': print the first 3 pages, page 4 and 6, and all the page after 10 (included). Giving `toc' prints the table of content whatever its page number is.

The pages referred to are the input pages, not the output pages, that is, in `-2', printing with `-a1' will print the first virtual page, i.e., you will get half the page filled.

Note that page selection does work with the delegations (see section Your Delegations).

Option: -c
Option: --truncate-lines=boolean
Cut lines too large to be printed inside the borders. The maximum line size depends on format and font size used and whether line numbering is enabled.

Option: -i
Option: --interpret=boolean
interpret tab and ff chars. This means that `^L' jumps to a new (virtual) pages, `tab' advances to the next tabulation.

Option: --end-of-line=type
Specify what sequence of characters denotes the end of line. type can be:
n
unix
`\n'.
r
mac
`\r'.
nr
`\n\r'. As far as we know, this type of end-of-line is not used.
pc
rn
`\r\n'. This is the type of end-of-line on MS-DOS.
any
auto
Any of the previous cases. This last case prevents the bad surprises with files from PC (trailing `^M').

Option: -X key
Option: --encoding=key
Use the input encoding identified by key. See section Some Encodings, and the result of `a2ps --list=encodings' to know what encodings are supported. Typical values are `ASCII', `latin1'... `latin6', `ison' etc.

Option: --stdin=filename
Give the name filename to the files read through the standard input.

Option: -t name
Option: --title=name
Give the name name to the document. Escapes can be used (see section Escapes).

This is used for instance in the name given to the document from within the PostScript code (so that GhostView and others can display a file with its real title, instead of just the PostScript file name).

It is not the name of the output. It is just a logical title.

Option: --prologue=prologue
Use prologue as the PostScript prologue for @pack{}. prologue must be in a file named `prologue.pro', which must be in a directory of your library path (see section Library Files). Available prologues are:
`bold'
This style is meant to replace the old option code(-b)code of a2ps 4.3. It is a copy of the black and white prologue, but in which all the fonts are in Bold.
`bw'
Style is plain: pure black and white, with standard fonts.
`color'
Colors are used to highlight the keywords.
`gray'
Gray foreground is used for comments and labels.
`gray2'
Black foreground is used for comments and labels.
`matrix'
The layout is the same as `bw', but alternating gray and white lines. There are two macros defining the behavior: `pro.matrix.cycle' defines the length of the cycle (number of white and gray lines). It defaults to 6. `pro.matrix.gray' defines the number of gray lines. Default is 3.

Option: --print-anyway=boolean
force binary printing. By default, the whole print job is stopped as soon as a binary file is detected. To detect such a file we make use of a very simple heuristic: if the first sheet of the file contains more than 40% of non-printing characters, it's a binary file. @pack also asks file(1) what it thinks of the type of the file. If file(1) answers `data', the file will also be considered as binary, hence not printed.

Option: -Z
Option: --delegate=boolean
Enable delegation of some files to delegated applications. If delegating is on, then @pack will not process the file by itself, but will call an application which handles the file in another way. If delegation is off, then @pack will process every file itself.

Typically most people don't want to pretty-print a PostScript source file, but want to print what describes that file. Then set the delegations on.

See section Your Delegations for information on delegating, and option `--list=delegations' for the applications your @pack knows.

Option: --toc[=format]
Generate a Table of Content, which format is an escape (see section Escapes) processed as a PreScript file (see section PreScript). If no format is given, don't generate the Table of Content.

Note that it is mostly useful to define a variable (see section Your Escapes), for instance, in your `a2psrc' file:

Variable: toc.mine \
\\Keyword{Table of Content}\n\
#-1!f\
|$2# \\keyword{$-.20n} sheets $3s< to $3s> ($2s#) \
pages $3p<-$3p> $4l# lines\n||\
\\Keyword{End of toc}\n

and to give that variable name as argument to `--toc': `a2ps *.c --toc=#{toc.mine}'.

Note too that you can generate only the table of content using `--pages':

a2ps *.c --toc=#{toc.mine} -atoc

Pretty Printing Options

These options are related to the pretty printing features of @pack{}.

Option: --highlight-level=level
Specify the level of highlighting. level can be
`none'
no highlighting
`normal'
regular highlighting
`heavy'
even more highlighting.

See the documentation of the style sheets (`--list=style-sheets') for a description of `heavy' highlighting.

Option: -g
Alias for `--highlight-level=heavy'.

Option: -E [language]
Option: --pretty-print[=language]
With no arguments, set automatic style selection on. Otherwise, set style to language. Note that setting language to `plain' turns off pretty-printing. See section Known Style Sheets, and the output of `--list=style-sheets' for the available style sheets.

If language is `key.ssh', then don't look in the library path, but use the file `key.ssh'. This is to ease debugging non installed style sheets.

Option: --strip-level=num
Depending on the value of num:
`0'
everything is printed;
`1'
regular comments are not printed
`2'
strong comments are not printed
`3'
no comment is printed.

This option is valuable for instance in java in which case strong comments are the so called documentation comments, or in SDL for which some graphical editors pollutes the specification with internal data as comments.

Note that the current implementation is not satisfactory: some undesired blank lines remain. This is planed to be fixed.

Output Options

These are the options to specify what you want to do out of what @pack produces. Only a single destination is possible at a time, i.e., if ever there are several options `-o', `-P' or `-d', the last one is honored.

Option: -o file
Option: --output=file
leave output to file file. If file is `-', leave output to the standard output.

Option: --version-control=type
to avoid loosing a file, @pack offers backup services. This is enabled when the output file already exists.

The type of backups made can be set with the VERSION_CONTROL environment variable, which can be overridden by this option. If VERSION_CONTROL is not set and this option is not given, the default backup type is `existing'. The value of the VERSION_CONTROL environment variable and the argument to this option are like the GNU Emacs `version-control' variable; they also recognize synonyms that are more descriptive. The valid values are (unique abbreviations are accepted):

`none'
`off'
Never make backups (override existing files).
`t'
`numbered'
Always make numbered backups.
`nil'
`existing'
Make numbered backups of files that already have them, simple backups of the others.
`never'
`simple'
Always make simple backups.

Option: --suffix=suffix
The suffix used for making simple backup files can be set with the SIMPLE_BACKUP_SUFFIX environment variable, which can be overridden by this option. If neither of those is given, the default is `~', as it is in Emacs.

Option: -P name
Option: --printer=name
send output to printer name. See item `Printer:' and `Unknown printer:' in section Your Printers and results of option `--list=defaults' to see the bindings between printer names and commands.

Option: -d
send output to the default printer. See item `DefaultPrinter:' in section Your Printers.

PostScript Options

The following options are related only to variations you want to produce onto a PostScript output.

Option: --ppd[=key]
With no argument, set automatic PPD selection, otherwise set the PPD to key. FIXME: what to read.

Option: -n num
Option: --copies=num
print num copies of each page

Option: -s num
Option: --side=num
number of sheet sides. num is of course 1 or 2. Not only does this option requires Duplex from the printer, but it also enables duplex features from @pack (e.g., the margin changes from front pages to back pages etc.).

Option: -D key[:value]
Option: --setpagedevice=key[:value]
Pass a page device definition to the generated PostScript output. If no value is given, key is removed from the definitions. Note that several `-D' can be accumulated.

For example, command

a2ps -DDuplex:true -DManualFeed:true report.pre

prints file `report.pre' in duplex (two sides) mode manually fed.

Page device operators are implementation dependent but they are standardized. See section Page Device Options for details.

Option: -S key[:value]
Option: -S key[::value]
Option: --statusdict=key[:value]
Option: --statusdict=key[::value]
Pass a statusdict definition to the generated PostScript output. statusdict operators and variables are implementation dependent; see the documentation of your printer for details. See section Statusdict Options for details. Several `-S' options can be accumulated.

If no value is given, key is removed from the definitions.

With a single colon, pass a call to an operator, for instance:

a2ps -Ssetpapertray:1 quicksort.c

prints file `quicksort.c' by using paper from the paper tray 1 (assuming that printer supports paper tray selection).

With two colons, define variable key to equal value. For instance:

a2ps -Spapertray::1 quicksort.c

produces

  /papertray 1 def

in the PostScript.

Option: -k
Option: --page-prefeed
enable page prefeeding. It consists in positioning the sheet in the printing area while the PostScript is interpreted (instead of waiting the end of the interpretation of the page before pushing the sheet). It can lead to an significant speed up of the printing.

@pack quotes the access to that feature, so that non supporting printers won't fail.

Option: -K
Option: --no-page-prefeed
disable page prefeeding.

Escapes

The escapes are some sequences of characters that will be replaced by their values. They are very much like variables.

Use of Escapes

They are used in several places in @pack{}:

Page markers
Headers, footers, titles and the water mark (see section Headings Options), in general to print the name of file, page number etc. On a new sheet @pack first draws the water mark, then the content of the first page, then the frame of the first page, (ditto with the others), and finally the sheet header and footers. This order must be taken into account for some escapes (e.g., `$l.', `$l^').
Named output
To specify the generic name of the file to produce, or how to access a printer (see section Your Printers).
Delegation
To specify the command associated to a delegation (see section Your Delegations).
Table of Content
To specify an index/table of content printed at the end of the job.
Variables in PostScript prologue
To allow the user to change some parameters to your prologues (see section Designing PostScript Prologues).

General Structure of the Escapes

All format directives can also be given in format

escape width directive

where

escape
In general
`%'
escapes are related to general information (e.g., the current date, the user's name etc.),
`#'
escapes are related to the output (e.g., the output file name) or to the options you gave (e.g., the number of virtual pages etc.), or to special constructions (e.g., enumerations of the files, or tests etc.),
`$'
escapes are related to the current input file (e.g., its name, its current page number etc.),
`\'
introduces classical escaping, or quoting, sequences (e.g., `\n', `\f' etc.).
width
Specifies the width of the column to which the escape is printed. There are three forms for width
`+paddinginteger'
the result of the expansion is prefixed by the character padding so that the whole result is as long as integer. For instance `$+.10n' with a file name `$n'=`foo.c' gives `.....foo.c'. If no padding is given, ` ' (white space) is used.
`-paddinginteger'
Idem as above, except that completion is done on the left: `$+.10n' gives `foo.c.....'.
`integer'
which is a short cut for `+integer'. For example, escape `$5P' will expand to something like `   12'.
directive
See section Available Escapes.

Available Escapes

Supported escapes are:

`\\'
character `\'
`\%'
character `%'
`\$'
character `$'
`\#'
character `#'
`#?cond|if_true|if_false|'
this may be used for conditional assignment. The separator (presented here as `|') may be any character. if_true and if_false may be defined exactly the same way as regular headers, included escapes and the `#?' construct. The available tests are:
`#?1'
`#?2'
`#?3'
true if tag 1, 2 or 3 is not empty. See item `$t1' for explanation.
`#?d'
true if Duplex printing is requested (`-s2').
`#?j'
true if bordering is asked (`-j').
`#?l'
true if printing in landscape mode.
`#?o'
true if only one virtual page per page (i.e., `#v' is 1).
`#?p'
a page range has been specified (i.e., `#p' is not empty).
`#?q'
true if @pack is in quiet mode.
`#?r'
true if major is rows (`--major=rows').
`#?v'
true if printing on the back side of the sheet (verso).
`#?V'
true if verbosity level includes the `tools' flag (See section Global Options option `--verbosity'.
`#!key|in|between|'
Used for enumerations. The separator (presented here as `|') may be any character. in and between are escapes. The enumerations may be:
`#!$'
enumeration of the command line options. In this case in in never used, but is replaced by the arguments.
`#!f'
enumeration of the input files in the other they were given.
`#!F'
enumeration of the input files in the alphabetical order of their names.
`#!s'
enumeration of the files appearing in the current sheet.
For instance, the escapes `The files printed were: #!f|$n|, |.' evaluated with input `a2ps NEWS main.c -o foo.ps', gives `The files printed were: NEWS, main.c.'. As an exception, `#!' escapes use the width as the maximum number of objects to enumerate if it is positive, e.g., `#10!f|$n|, |' lists only the ten first file names. If width is negative, then it does not enumerate the -width last objects (e.g., `#-1!f|$n|, |' lists all the files but the last).
`${var}'
value of the environment variable var if defined, nothing otherwise.
`${var:-word}'
if the environment variable var is defined, then its value, otherwise word.
`${var:+word}'
if the environment variable var is defined, then word, otherwise nothing.
`$[num]'
value of the numth argument given on the command line. Note that $[0] is the name under which @pack has been called.
`#{key}'
expansion of the variable key if defined, nothing otherwise (see section Your Escapes)
`#{key:-word}'
if the variable var is defined, then its expansion, otherwise word.
`#{key:+word}'
if the variable var is defined, then word, otherwise nothing.
`#.'
the extension corresponding to the current output language (e.g. `ps').
`%*'
current time in 24-hour format with seconds `hh:mm:ss'
`$*'
file modification time in 24-hour format with seconds `hh:mm:ss'
`$#'
the sequence number of the current input file
`%#'
the total number of files
`%a'
the localized equivalent for `Printed by User Name'
`%A'
the localized equivalent for `Printed by User Name from Host Name'
`%a{username}'
the localized equivalent for `Printed by username'
`%A{username@hostname}'
the localized equivalent for `Printed by username from hostname'. These two are provided in the case @pack would be used by the print service: since neither of the user name nor the host name can be known at the time the files reach @pack{}, these options should be used.
`%c'
trailing component of the current working directory
`%C'
current time in `hh:mm:ss' format
`$C'
file modification time in `hh:mm:ss' format
`%d'
current working directory
`$d'
directory part of the current file (`.' if the directory part is empty).
`%D'
current date in `yy-mm-dd' format
`$D'
file modification date in `yy-mm-dd' format
`%D{string}'
format current date according to string with the strftime(3) function.
`$D{string}'
format file's last modification date according to string with the strftime(3) function.
`%e'
current date in localized short format (e.g., `Jul 4, 76' in English, or `14 Juil 89' in French).
`$e'
file modification date in localized short format.
`%E'
current date in localized long format (e.g., `July 4, 76' in English, or `Samedi 14 Juillet 89' in French).
`$E'
file modification date in localized long format.
`$f'
full file name (with directory and suffix).
`\f'
character `\f' (form feed).
`#f0'
`#f9'
ten temporary file names. You can do anything you want with them, @pack removes them at the end of the job. It is useful for the delegations (see section Your Delegations) and for the printer commands (see section Your Printers).
`%F'
current date in `dd.mm.yyyy' format.
`$F'
file modification date in `dd.mm.yyyy' format.
`#h'
medium height in PostScript points
`$l^'
top most line number of the current page
`$l.'
current line number. To print the page number and the line interval in the right title, use `--right-title="$q:$l^-$l."'.
`$l#'
number of lines in the current file.
`%m'
the host name up to the first `.' character
`%M'
the full host name
`\n'
the character `\n' (new line).
`%n'
the user login name
`$n'
input file name without the directory part.
`%N'
the user's pw_gecos field up to the first `,' character (typically his/her full name).
`$N'
input file name without the directory, and without its suffix (e.g., on `foo.c', it will produce `foo').
`#o'
name of the output, before substitution (i.e., argument of `-P', or of `-o').
`#O'
name of the output, after substitution. If output goes to a file, then the name of the file. If the output is a symbolic printer (see section Your Printers), the result of the evaluation. For instance, if the symbolic printer `file' is defined as `> $n.%.', then `#O' returns `foo.c.ps' when printing `foo.c' to PostScript. `#o' would have returned `file'.
`#p'
the range of the page to print from this page. For instance if the user asked `--pages=1-10,15', and the current page is 8, then `#p' evaluates to `1-3,8'.
`$p^'
number of the first page of this file appearing on the current sheet. Note that `$p.', evaluated at the end of sheet, is also the number of the last page of this file appearing on this sheet.
`$p-'
interval of the page number of the current file appearing on the current sheet. It is the same as `$p^-$p.', if `$p^' and `$p.' are different, otherwise it is equal to `$p.'.
`%p.'
current page number
`$p.'
page number for this file
`%p#'
total number of pages printed
`$p#'
number of pages of the current file
`$p<'
number of the first page of the current file
`$p>'
number of the last page of the current file
`%q'
localized equivalent for `Page %p.'
`$q'
localized equivalent for `Page $p.'
`%Q'
localized equivalent for `Page %p./%p#'
`$Q'
localized equivalent for `Page $p./$p#'
`$s<'
number of the first sheet of the current file
`%s.'
current sheet number
`$s.'
sheet number for the current file
`$s>'
number of the last sheet of the current file
`%s#'
total number of sheets
`$s#'
number of sheets of the current file
`%t'
current time in 12-hour am/pm format
`$t'
file modification time in 12-hour am/pm format
`$t1'
`$t2'
`$t3'
Content of tag 1, 2 and 3. Tags are pieces of text @pack fetches in the files, according to the style. For instance, in mail-folder style, tag 1 is the title of the mail, and tag 2 its author.
`%T'
current time in 24-hour format `hh:mm'
`$T'
file modification time in 24-hour format `hh:mm'
`#v'
number of virtual sheets
`%V'
the version string of @pack{}.
`#w'
medium width in PostScript points
`%W'
current date in `mm/dd/yy' format
`$W'
file modification date in `mm/dd/yy' format

Exit status

The following exit values are returned:

`0'
@pack terminated normally.
`1'
an error occured.
`2'
bad argument was given.
`3'
unknown language was given.

Library Files

To be general and to allow as much customization as possible, @pack avoids to hard code its knowledge (encodings, PostScript routines, etc.), and tries to split it in various files. Hence it needs a path, i.e., a list of directories, in which it may find the files it needs.

The exact value of this library path is available by `a2ps --list=defaults'. Typically its value is:

gargantua ~ $ a2ps --list=defaults
Configuration status of a2ps 4.10.2
More stuff deleted here
Internals:
  verbosity level     = 2
  file command        = /usr/ucb/file -L
  temporary directory = 
  library path        = 
        /inf/soft/infthes/demaille/.a2ps
        /usr/local/share/a2ps/sheets
        /usr/local/share/a2ps/ps
        /usr/local/share/a2ps/encoding
        /usr/local/share/a2ps/afm
        /usr/local/share/a2ps/printers
        /usr/local/share/a2ps

You may change this default path through the configuration files (see section Your Library Path), and with the environment variable A2PS_LIBRARY.

If you plan to define yourself some files for @pack{}, they should be in one of those directories.

Configuration Files

@pack reads several files before the command line options. In the order, they are:

  1. the system configuration file (usually `/usr/local/etc/a2ps.cfg')
  2. the user's home configuration file (`$HOME/.a2ps/a2psrc')
  3. the local file (`./.a2psrc')

In these files, empty lines and lines starting with `#' are comments.

The other lines have all the following form:

Topic: Arguments

where Topic: is a keyword related to what you are customizing, and Arguments the customization. Arguments may be spread on several lines, provided that the last character of a line to continue is a `\'.

In the following sections, each Topic: is detailed.

Your Library Path

To define the default library path, you can use:

Configuration Setting: LibraryPath: path
Set the library path the path.

Configuration Setting: AppendLibraryPath: path
Add path at the end of the current library path.

Configuration Setting: PrependLibraryPath: path
Add path at the beginning of the current library path.

The environment variable A2PS_LIBRARY overrides these entries.

Note that for users configuration files, it is better not to set the library path, because the system's configuration has certainly been built to cope with your system's peculiarities. Use `AppendLibraryPath:' and `PrependLibraryPath:'.

Your Default Options

Configuration Setting: Options: options+
Give @pack a list of command line options. options+ is any sequence of regular command line options (see section Invoking @pack).

It is the correct way to define the default behavior you expect from @pack{}. If for instance you want to use Letter as medium, then use:

Options: --medium=Letter

It is exactly the same as always giving @pack the option `--medium=Letter' at run time.

The quoting mechanism is a bit painful: you need to quote the whole options+. For instance

Options: --right-title='Page $p' --center-title='Hello world'

is wrong. Write

Options: '--right-title=Page $p' '--center-title=Hello world'

Your Media

Configuration Setting: Medium: name dimensions
Define the medium name to have the dimensions (in PostScript points, i.e., 1/72 of inch).

There are two formats supported:

long
in which you must give both the size of the whole sheet, and the size of the printable area:
# A4 for Desk Jets
#      name     w      h     llx   lly   urx    ury
Medium: A4dj    595    842    24    50    571    818
where wxh are the dimension of the sheet, and the four other stand for lower left x and y, upper right x and y.
short
in which a surrounding margin of 24 points is used
# A4 
#      name     w      h
Medium: A4      595    842
is the same as
# A4 
#      name     w      h
Medium: A4      595    842    24    24    571    818

Your Printers

A general scheme is used, so that whatever the way you should address the printers on your system, the interface is still the same. Actually, the interface is so flexible, that you should understand `named destination' when we write `printer'.

Configuration Setting: Printer: name [PPD-key] destination
Specify the destination of the output when the option `-P name' is given. If PPD-key is given, declare the printer name to be described by the PPD file `PPD-key.ppd'.

The destination must be of one of the following forms:

`| command'
in which case the output is piped into command.
`> file'
in which case the output is saved into file.

Configuration Setting: UnknownPrinter: [PPD-key] destination
Specify the destination of the output when when the option `-P name' is given, but there is no `Printer:' entry for name.

Configuration Setting: DefaultPrinter: [PPD-key] destination
Specify the destination of the output when when the option `-d' (send to default output) is given.

Escapes expansion is performed on destination (see section Escapes). Recall that `#o' is evaluated to the destination name, i.e., the argument given to `-P'.

For instance

# My Default Printer is called dominique
DefaultPrinter: | lp -d dominique

# `a2ps foo.c -P bar' will pipe into `lp -d bar'
UnknownPrinter: | lp -d #o

# `a2ps -P foo' saves into the file `foo'
Printer: foo > foo.ps
Printer: wc | wc
Printer: lw | lp -d printer-with-a-rather-big-name

# E.g. `a2ps foo.c bar.h -P file' will save into `foo.c.ps'
Printer: file > $n.#.

# E.g. `a2ps foo.c bar.h -P home' will save into `foo.ps'
# in user's home
Printer: home > ${HOME}/$N.#.

# Here we address a printer which is not PostScript
Printer: deskj | gs -q -sDEVICE=ljet3d -sOutputFile=- - \
         | lpr -P laserwriter -h -l 

MS-DOS users, and non-PostScript printer owners should take advantage in getting good configuration of these entries.

Your Shortcuts

You can define some kind of `Macro Options' which stands for a set of options.

Configuration Setting: UserOption: shortcut options...
Define the shortcut to be the list of options.... When @pack{} is called with `--user-option=shortcut' (or `-=shortcut'), consider the list of options....

Examples are

# This emulates a line printer: no features at all
# call a2ps -=lp to use it
UserOption: lp -1m --pretty-print=plain -B --borders=no

# When printing mail, I want to use the right style sheet with strong
# highlight level, and total stripping
UserOption: mail -Email -g --strip=3

Your PostScript magic number

@pack produces full DSC conformant PostScript which is something that only PS wizards may understand(2). Adobe said

Thou shalt start your PostScript DSC conformant files with

%!PS-Adobe-3.0

The bad news is that some printers will reject this header. Then you may change this header without any worry since the PostScript produced by @pack is also 100% PostScript level 1(3).

Configuration Setting: OutputFirstLine: magic-number
Specify the header of the produced PostScript file to be magic-number. Typical values include `%!PS-Adobe-2.0', or just `%!'.

Your Page Labels

In the PostScript file is dropped information on where sheets begin and end, so that post processing tools know where is the physical page 1, 2 etc. With this information can be also stored a label, i.e., a human readable text (typically the logical page numbers), which is for instance what GhostView shows as the list of page numbers.

@pack lets you define what you want in this field.

Configuration Setting: PageLabelFormat: format
Specify the format to use to label the PostScript pages. format can use Escapes (see section Escapes). Two variables are predefined for this: `#{pl.short}' and `#{pl.long}'.

Your Escapes

Escapes are actually used so much, that it is pleasant to write sophisticated strings, that one would like not to repeat all the time. As with user short cuts, you can define "macro escapes", i.e., variables:

Configuration Setting: Variable: key value
Define the escape `#{key}' to be a short cut for value. key must not have any character from `:(){}'.

As as example, here is a variable for psnup, which encloses all the option passing one would like. Delegations are then easier to write:

Variable: psnup psnup -#v -q #?j|-d|| #?r||-c| -w#w -h#h

It is strongly suggested to follow a `.' (dot) separated hierarchy, starting with:

`pro'
for variables used in prologues (see section Designing PostScript Prologues). Moreover, specify the name of the prologue (e.g., `pro.matrix.gray').
`ps'
for variables related to PostScript matters, such as the page label (which is associated to ps.page_label), the header etc.
`pl'
for page label formats. See section Your Page Labels the option `--page-label' in section Input Options.
`toc'
for toc formats. See the option `--toc' in section Input Options.

Your Delegations

There are some files you don't really want @pack to pretty-print, typically page description files (e.g., PostScript files, roff files, etc.). You can let @pack delegate the treatment of these files to other applications. The behavior at run time depends upon the option `--delegate' (see section Input Options).

Defining a Delegation

Configuration Setting: Delegation: name in:out command
Define the delegation name. It is to be applied upon files of type in when output type is out(4) thanks to command. Both in and out are @pack type keys such as defined in `sheets.map' (see section The Entry in `sheets.map').

command should produce the file on its standard output. Of course escapes substitution is performed on command (see section Escapes). In particular, command should use the input file `$f'.

# In general, people don't want to pretty-print PostScript files.
# Pass the PostScript files to psnup
Delegation: PsNup ps:ps \
        psselect #?V||-q| -p#?p|#p|-| $f | \
        psnup -#v -q #?j|-d|| #?r||-c| -w#w -h#h

Advantage should be taken from the variables, to encapsulate the peculiarities of the various programs.

# Passes the options to psnup.
# The files (in and out) are to be given
Variable: psnup psnup -#v #?V||-q| #?j|-d|| #?r||-c| -w#w -h#h

# Passes to psselect for PS page selection
Variable: psselect psselect #?V||-q| -p#?p|#p|-|

# In general, people don't want to pretty-print PostScript files.
# Pass the PostScript files to psnup
Delegation: PsNup ps:ps     #{psselect} $f | #{psnup}

Temporary file names (`#f0' to `#f9') are available for complex commands.

# Pass DVI files to dvips.
# A problem with dvips is that even on failure it dumps its prologue,
# hence it looks like a success (output is produced).
# To avoid that, we use an auxiliary file and a conditional call to
# psnup instead of piping.
Delegation: dvips dvi:ps    #{dvips} $f -o #f0 && #{psnup} #f0

Guide Line for Delegations

First of all, select carefully the applications you will use for the delegations. If a filter is known to cause problems, try to avoid it in delegations(5). As a thumb rule, you should check that the PostScript generating applications produce files that start by:

%!PS-Adobe-3.0

There are some services expected from the delegations. The delegations you may write should honor:

the input file
available through the escape `$f'.
the medium
the dimension of the medium selected by the user are available through `#w' and `#h'.
the page layout
the number of virtual pages is `#v'.
the page range
the page range (in a form `1-2,4-6,10-' for instance) is available by `#p'.
the verbosity level
please, do not make your delegations verbose by default. The silent mode should always be requested, unless `#?V' is set.

If ever you need several commands, do not use `;' to separate them, since it may prevent detection of failure. Use `&&' instead.

The slogan "the sooner, the better" should be applied here: in the processing chain, it is better to ask a service to the first application that supports it. An example will make it clear: when processing a DVI file, dvips knows better the page numbers than psselect would. So a DVI to PostScript delegation should ask the page selection (`#p') to dvips, instead of using psselect later in the chain.

There is a list of possible delegations, on the page @href{http://www.inf.enst.fr/~demaille/a2ps/delegations.html, `Delegations for a2ps'}. If you know others, please let us know.

Your Internal Details

There are settings that only meant for @pack that you can tune by yourself.

Configuration Setting: TemporaryDirectory: path
Specify a directory in which the temporary files are put. Default is `/tmp', or `/var/tmp', or `$TMPDIR' according your environment.

Configuration Setting: FileCommand: command
The command to run to call file(1) on a file. If possible, make it follow the symbolic links.

Documentation Format

In various places a documentation can be given. Since some parts of this document and of web pages are extracted from documentations, some tags are needed to provide a better layout. The format is a mixture made out of Texinfo like commands, but built so that quick and easy processing can be made.

These tags are:

`code('text`)code'
Typeset text like a piece of code. This should be used for keys, variables, options etc. For instance the documentation of the bold prologue mentions the bw prologue:
Documentation
This style is meant to replace the old option
code(-b)code of a2ps 4.3.  It is a copy of the
black and white prologue, but in which all the
fonts are in Bold.
EndDocumentation
`href('link`)href('text`)href'
Specifies a hyper text link displayed as text.
`@example'
`@end example'
They must be alone on the line. The text between these tags is displayed in a code-like fonts. This should be used for including a piece of code. For instance, in the documentation of the gnuc style sheet:
documentation is
 "Declaration of functions are highlighted"
 "emph(only)emph if you start the function name"
 "in the first column, and it is followed by an"
 "opening parenthesis.  In other words, if you"
 "write"
 "@example"
 "int main (void)"
 "@end example"
 "it won't work.  Write:"
 "@example"
 "int"
 "main (void)"
 "@end example"
end documentation
`@itemize'
`@item' text
`@end itemize'
Typeset a list of items. The opening and closing tags must be alone on the line.

Map Files

Many things are defined through files. There is a general scheme to associate an object to the files to use: map files. They are typically used to:

The syntax of these files is:

The map files used in @pack are:

`encoding.map'
Resolving encodings aliases.
`fonts.map'
Mapping font names to font file names.
`sheets.map'
Rules to decide what style sheet to use.

Font Files

Even when a PostScript printer knows the fonts you want to use, using these fonts requires some description files.

Fonts Map File

See section Map Files, for a description of the map files. This file associates the font-key to a font name. For instance:

Courier                 pcrr
Courier-Bold            pcrb
Courier-BoldOblique     pcrbo
Courier-Oblique         pcrro

associates to font named Courier, the key pcrr. To be recognized, the font name must be exact: courier and COURIER are not admitted.

A small tool is provided with @pack{}: make_fonts_map.sh. It collects the information on the font files @pack can see, and generates a valid font map file, `fonts.map.new'.

Fonts Description Files

There are two kinds of data @pack needs to use a font:

Adding More Font Support

FIXME: A few words on how to make a2ps use more fonts. Don't forget some words on broken fonts such as those seen for Cyrillic support.

Style Sheet Files

The style sheets are defined in various files. See see section Pretty Printing for the structure of these files. As for most other features, there is main file, a road map, which defines in which condition a style sheet should be used (see section Map Files). This file is `sheets.map'.

It format is simple:

`pattern style-key'
if the current file name matches pattern, then select style style-key (i.e. file `style-key.ssh'). The special style-key `binary' tells @pack to consider that the file should not be printed, and will be ignored, unless option `--print-anyway' is given.
`** pattern style-key'
if the result of a call to file(1) matches pattern, then select style style-key. Note that only the first two fields of the answer of file(1) are considered. E.g., in the following case
gargantua $ file a2ps
a2ps:   ELF 32-bit MSB executable SPARC Version 1,\
        dynamically linked, stripped
`ELF32-bit' will be matched against pattern.

If a style name can't be found, the plain style is used.

Two things are to retain from this:

  1. if the file is presented through stdin, then @pack will run file(1). However, unless you specify a fake file name with `--stdin', pattern matching upon the name is turn off. In general you can expect correct delegations, but almost never pretty printing.
  2. if file is wrong on some files, @pack may use bad style sheets. In this case, do try option `--guess', compare it with the output of file, and if the culprit is file, go and complain to your system administrator :-), or fix it by defining your own filename pattern matching rules.

Encodings

@pack is trying to support the various usual encodings that its users use. This chapter presents what an encoding is, how the encodings support is handled within @pack{}, and some encodings it supports.

What is an Encoding

This section is actually taken from the web pages of @href{http://www.alis.com/, Alis Technologies inc.}

Document encoding is the most important but also the most sensitive and explosive topic in Internet internationalization. It is an essential factor since most of the information distributed over the Internet is in text format. But the history of the Internet is such that the predominant - and in some cases the only possible - encoding is the very limited ASCII, which can represent only a handful of languages, only three of which are used to any great extent: English, Indonesian and Swahili.

All the other languages, spoken by more than 90% of the world's population, must fall back on other character sets. And there is a plethora of them, created over the years to satisfy writing constraints and constantly changing technological limitations. The ISO international character set registry contains only a small fraction; IBM's character registry is over three centimeters thick; Microsoft and Apple each have a bunch of their own, as do other software manufacturers and editors.

The problem is not that there are too few but rather too many choices, at least whenever Internet standards allow them. And the surplus is a real problem; if every Arabic user made his own choice among the three dozen or so codes available for this language, there is little likelihood that his "neighbor" would do the same and that they would thus be able to understand each other. This example is rather extreme, but it does illustrate the importance of standards in the area of internationalization. For a group of users sharing the same language to be able to communicate,

  1. the code used in the shared document must always be identified (labeling)
  2. they must agree on a small number of codes - only one, if possible (standards);
  3. their software must recognize and process all codes (versatility)

Certain character sets stand out either because of their status as an official national or international standard, or simply because of their widespread use.

First off, there is the ISO 8859 standards series that standardize a dozen character sets that are useful for a large number of languages using the Latin, Cyrillic, Arabic, Greek and Hebrew alphabets. These standards have a limited range of application (8 bits per character, a maximum of 190 characters, no combining) but where they suffice (as they do for 10 of the 20 most widely used languages), they should be used on the Internet in preference to other codes. For all other languages, national standards should preferably be chosen or, if none are available, a well-known and widely-used code should be the second choice.

Even when we limit ourselves to the most widely used standards, the overabundance remains considerable, and this significantly complicates life for truly international software developers and users of several languages, especially when such languages can only be represented by a single code. It was to resolve this problem that both Unicode and the ISO 10646 International standard were created. Two standards? Oh no! Their designers soon realized the problem and were able to cooperate to the extent of making the character set repertoires and coding identical.

ISO 10646 (and Unicode) contain over 30,000 characters capable of representing most of the living languages within a single code. All of these characters, except for the Han (Chinese characters also used in Japanese and Korean), have a name. And there is still room to encode the missing languages as soon as enough of the necessary research is done. Unicode can be used to represent several languages, using different alphabets, within the same electronic document.

Encoding Files

The support of the encodings in @pack is completely taken out of the code. That is to say, adding, removing or changing anything in its support for an encoding does not require programming, nor even being a programmer.

See section What is an Encoding, if you want to know more about this.

Encoding Map File

See section Map Files, for a description of the map files.

The meaningful lines of the `encoding.map' file have the form:

alias      key
iso-8859-1 latin1
latin1     latin1
l1         latin1

where

alias
specifies any name under which the encoding may be used. It influences the option `--encoding', but also the encodings dynamically required, as for instance in the mail style sheet (support for MIME). When encoding is asked, the lower case version of encoding must be equal to alias.
key
specifies the prefix of the file describing the encoding (`key.edf', section Encoding Description Files).

Encoding Description Files

The encoding description file describing the encoding key is named `key.edf'. It is subject to the same rules as any other @pack file:

The entries are

`Name:'
Specifies the full name of the encoding. Please, try to use the official name if there is one.
Name: ISO-8859-1
`Documentation/EndDocumentation'
Introduces the documentation on the encoding (see section Documentation Format). Typical informations expected are the other important names this encoding has, and the languages it covers.
Documentation
Also known as ISO Latin 1, or Latin 1.  It is a superset
of ASCII, and covers most West-European languages.
EndDocumentation
`Substitute:'
Introduces a font substitution. The most common fonts (e.g., Courier, Times-Roman...) do not support many encodings (for instance it does not support Latin 2). To avoid that Latin 2 users have to replace everywhere calls to Courier, @pack allows to specify that whenever a font is called in an encoding, then another font should be used. For instance in `latin2.edf' one can read:
# Fonts from Ogonkify offer full support of ISO Latin 2
Substitute: Courier              Courier-Ogonki
Substitute: Courier-Bold         Courier-Bold-Ogonki
Substitute: Courier-BoldOblique  Courier-BoldOblique-Ogonki
Substitute: Courier-Oblique      Courier-Oblique-Ogonki
`Default:'
Introduces the name of the font that should be used when a font (not substituted as per the previous item) is called but provides to poor a support of the encoding. The Courier equivalent is the best choice.
Default: Courier-Ogonki
`Vector:'
Introduces the PostScript encoding vector, that is a list of the 256 PostScript names of the characters. Note that only the printable characters are named in PostScript (e.g., `bell' in ASCII (^G) should not be named). The special name `.notdef' is to be used when the character is not printable. Warning. Make sure to use real, official, PostScript names. Using names such as `c123' may be the sign you use unusual names. On the other hand PostScript names such as `afii8879' are common.

Some Encodings

Most of the following information is a courtesy of @href{http://www.alis.com/, Alis Technologies inc.} and of Roman Czyborra's page about @href{http://wwwwbs.cs.tu-berlin.de/~czyborra/charsets/, The ISO 8859 Alphabet Soup}. See section What is an Encoding presents an instructive presentation of the encodings.

The known encodings are:

Encoding: ASCII (`ascii.edf')
US-ASCII.

Encoding: CP1250 (`cp1250.edf')
Microsoft's CP-1250 encoding (aka CeP).

Encoding: HPRoman (`hp.edf')
The 8 bits Roman encoding for HP.

Encoding: IBMPC (`ibmpc.edf')
Several characters may be missing, especially Greek letters and some mathematical symbols.

Encoding: ISO-8859-1 (`latin1.edf')
The ISO-8859-1 character set, often simply referred to as Latin 1, can represent most Western European languages including: Albanian, Catalan, Danish, Dutch, English, Faroese, Finnish, French, Galician, German, Irish, Icelandic, Italian, Norwegian, Portuguese, Spanish and Swedish.

Encoding: ISO-8859-10 (`latin6.edf')
Latin 6 (or ISO-8859-10) adds the last letters from Greenlandic and Lapp which were missing in Latin 4, and thereby covers all Scandinavia.

Support is provided thanks to Ogonkify.

Encoding: ISO-8859-2 (`latin2.edf')
The Latin 2 character set supports the Slavic languages of Central Europe which use the Latin alphabet. The ISO-8859-2 set is used for the following languages: Czech, Croat, German, Hungarian, Polish, Romanian, Slovak and Slovenian.

Support is provided thanks to Ogonkify.

Encoding: ISO-8859-3 (`latin3.edf')
This character set is used for Esperanto, Galician, Maltese and Turkish.

Support is provided thanks to Ogonkify.

Encoding: ISO-8859-4 (`latin4.edf')
Some letters were added to the ISO-8859-4 to support languages such as Estonian, Latvian and Lithuanian. It is an incomplete precursor of the Latin 6 set.

Support is provided thanks to Ogonkify.

Encoding: ISO-8859-5 (`iso5.edf')
The ISO-8859-5 set is used for various forms of the Cyrillic alphabet. It supports Bulgarian, Byelorussian, Macedonian, Serbian and Ukrainian.

The Cyrillic alphabet was created by St. Cyril in the 9th century from the upper case letters of the Greek alphabet. The more ancient Glagolithic (from the ancient Slav glagol, which means "word"), was created for certain dialects from the lower case Greek letters. These characters are still used by Dalmatian Catholics in their liturgical books. The kings of France were sworn in at Reims using a Gospel in Glagolithic characters attributed to St. Jerome.

Note that Russians seem to prefer the KOI8-R character set to the ISO set for computer purposes. KOI8-R is composed using the lower half (the first 128 characters) of the corresponding American ASCII character set.

Encoding: ISO-8859-9 (`latin5.edf')
The ISO 8859-9 set, or Latin 5, replaces the rarely used Icelandic letters from Latin 1 with Turkish letters.

Support is provided thanks to Ogonkify.

Encoding: KOI8 (`koi8.edf')
KOI-8 (+Ëë) is a subset of ISO-IR-111 that can be used in Serbia, Belarus etc.

Encoding: Macintosh (`mac.edf')
For the Macintosh encoding. The support is not sufficient, and a lot of characters may be missing at the end of the job (especially Greek letters).

Pretty Printing

The main feature of @pack is its pretty-printing capabilities. Two different levels of pretty printing can be reached:

Note that the difference is up to the author of the style sheet.

Syntactic limits

@pack is not a powerful syntactic pretty-printer: it just handles lexical structures, i.e., if in your favorite language

IF IF == THEN THEN THEN := ELSE ELSE ELSE := IF

is legal, then @pack is not the tool you need. Indeed @pack just looks for some keywords, or some sequences.

Known Style Sheets

Style Sheet: 68000 (`68000.ssh')

Style Sheet: a2ps configuration file (`a2psrc.ssh')
Meant to print files such as `a2ps.cfg', or `.a2ps/a2psrc', etc.

Style Sheet: a2ps style sheet (`ssh.ssh')
Second level of highligthing (option `-g')) substitutes the LaTeX symbols.

Style Sheet: Ada (`ada.ssh')

Style Sheet: Bourne Shell (`sh.ssh')
Some classical program names, or builtin, are highlighted in the second level of pretty-printing.

Style Sheet: C (`c.ssh')
This style does not high light the function definitions. Another style which high lights them, GNUish C, is provided (gnuc.ssh). It works only if you respect some syntactic conventions.

Style Sheet: C Shell (`csh.ssh')
Written by Jim Diamond. Some classical program names, and/or builtins, are highlighted in the second level of pretty-printing.

Style Sheet: C++ (`cpp.ssh')

Style Sheet: CAML (`caml.ssh')
This style should also suit other versions of ML (caml light, SML etc.)

Style Sheet: ChangeLog (`chlog.ssh')
This style covers the usual ChangeLog files.

Style Sheet: Claire (`claire.ssh')
Claire is a high-level functional and object-oriented language with advanced rule processing capabilities. It is intended to allow the programmer to express complex algorithms with fewer lines and in an elegant and readable manner.

To provide a high degree of expressivity, CLAIRE uses:

To achieve its goal of readability, CLAIRE uses

More information on claire can be found on @href{http://www.ens.fr/~laburthe/claire.html,claire home page}.

Style Sheet: Common Lisp (`clisp.ssh')
Written by Juliusz Chroboczek.

Style Sheet: Coq Vernacular (`coqv.ssh')
This style is devoted to the Coq v 5.10 vernacular language.

Style Sheet: Eiffel (`eiffel.ssh')

Style Sheet: Emacs Lisp (`elisp.ssh')

Style Sheet: Encapsulated PostScript (`eps.ssh')
Illegal PostScript operators are highlighted as Errors.

Style Sheet: Fortran (`fortran.ssh')
Written by Denis Girou.

Style Sheet: GNUish C (`gnuc.ssh')
Declaration of functions are highlighted emph(only)emph if you start the function name in the first column, and it is followed by an opening parenthesis. In other words, if you write
int main (void)

it won't work. Write:

int
main (void)

Style Sheet: idl (`idl.ssh')
Written by Robert S. Mallozzi. Style sheet for IDL (Interactive Data Language). http://www.rsinc.com

Style Sheet: InstallShield 5 (`is5rul.ssh')
Written by Alex. InstallShield5 _TM_ RUL script.

Style Sheet: Java (`java.ssh')
Documentation comments are mapped to strong comments, and any other comment is plain comment.

Style Sheet: LACE (`lace.ssh')
This is meant for the Eiffel equivalent of the Makefiles.

Style Sheet: Lex (`lex.ssh')
In addition to the C constructs, it highlights the declaration of states, and some special `%' commands.

Style Sheet: Mail Folder (`mail.ssh')
To use from elm and others, it is better to specify `-g -Email', since the file sent to printer is no longer truly a mail folder. This style also suits to news. `--strip' options are also useful (they strip "useless" headers).

Whenever the changes of encoding are clear, a2ps sets itself the encoding for the parts concerned.

Tag 1 is the subject, and Tag 2 the author of the mail/news.

Note: This style sheet is _very_ difficult to write. Please don't report behavior you don't like. Just send me improvements, or write a Bison parser for mails.

Style Sheet: Makefile (`make.ssh')
Special tokens, and non terminal declarations are highlighted.

Style Sheet: MATLAB 4 (`matlab4.ssh')
Written by Marco De la Cruz. Note that comments in the code should have a space after the %

Style Sheet: Modula 2 (`modula2.ssh')
Written by Peter Bartke.

Style Sheet: Modula 3 (`modula3.ssh')

Style Sheet: o2c (`o2c.ssh')

Style Sheet: Oberon (`oberon.ssh')

Style Sheet: Objective C (`objc.ssh')
Written by Paul Shum.

Style Sheet: Octave (`octave.ssh')
Written by C.P. Earls.

Style Sheet: Oracle parameter file (`initora.ssh')
Written by Pierre Mareschal. For init.ora parameter files.

Style Sheet: Oracle PL/SQL (`plsql.ssh')
Written by Pierre Mareschal. This style is to be checked.

Style Sheet: Oracle SQL (`sql.ssh')
Written by Pierre Mareschal. a2ps-sql Pretty Printer Version 1.0.0 beta - 18-MAR-97 For comments, support for -- /*..*/ and //. This style is to be checked.

Style Sheet: Oracle SQL-PL/SQL-SQL*Plus (`oracle.ssh')
Written by Pierre Mareschal. 18-MAR-97 For comments, support for -- /*..*/ and //. This style is to be checked.

Style Sheet: Pascal (`pascal.ssh')
The standard Pascal is covered by this style. But some extension have been added too, hence modern Pascal programs should be correctly handled. Heavy highlighting maps mathematical symbols to their typographic equivalents.

Style Sheet: Perl (`perl.ssh')
Written by Denis Girou.

Style Sheet: Perl (Old) (`oldperl.ssh')
Written by Denis Girou.

Style Sheet: PostScript (`ps.ssh')
Only some keywords are high lighted, because otherwise listings are quickly becoming a big bold spot.

Style Sheet: PostScript Printer Description (`ppd.ssh')
Support for Adobe's PPD files.

Style Sheet: PreScript (`pre.ssh')
This style defines commands in the canonic syntax of a2ps. It is meant to be used either as an input language, and to highlight the table of contents etc.

It can be a good choice of destination language for people who want to produce text to print (e.g. pretty-printing, automated documentation etc.) but who definitely do not want to learn PostScript, nor to require the use of LaTeX.

Style Sheet: PreTeX (`pretex.ssh')
This style sheets provides LaTeX-like commands to format text. It is an alternative to the PreScript style sheet, in which formating commands are specified in a more a2ps related syntax.

It provides by the use of LaTeX like commands, a way to describe the pages that this program should produce.

Style Sheet: Prolog (`prolog.ssh')
Under construction.

Style Sheet: Promela (`promela.ssh')
There is no way for this program to highlight send and receive primitives.

Style Sheet: Python (`python.ssh')

Style Sheet: Reference Card (`card.ssh')
This style sheet is meant to process help messages generated by Unix applications. It highlights the options (-short or --long), and their arguments. Normal use of this style sheet is through the shell script card (part of the a2ps package), but a typical hand-driven use is:
program --help | a2ps -Ecard

Style Sheet: Sather (`sather.ssh')

Style Sheet: Scheme (`scheme.ssh')
This style sheet is looking for a maintainer and/or comments.

Style Sheet: SDL-88 (`sdl88.ssh')
Written by Jean-Philippe Cottin. --strip-level=2 is very useful: it cancels the graphical information left by graphic editors. Only the pure specification is then printed.

Style Sheet: SQL 92 (`sql92.ssh')
Written by Pierre Mareschal. 18-MAR-97 This style is to be checked.

Style Sheet: Symbols (`symbols.ssh')
This style sheet should be a precursor for any style sheet which uses LaTeX like symbols.

Style Sheet: tcsh (`tcsh.ssh')
Written by Jim Diamond.

Style Sheet: TeX (`tex.ssh')
Written by Denis Girou. This is the style for (La)TeX files. It's mainly useful for people who develop (La)TeX packages. With `-g', common mathematical symbols are represented graphically.

Style Sheet: Texinfo (`texinfo.ssh')
Definitely being built. With the option -g, the nodes will be printed on separated pages which title is the name of the node.

Style Sheet: TeXScript (`texscript.ssh')
TeXScript is the new name of what used to be called PreScript. New PreScript has pure a2ps names, PreTeX has pure TeX names, and TeXScript mixes both.

Style Sheet: tk (`tk.ssh')
Since everything, or almost, is a string, what is printed is not always what you would like.

Style Sheet: Tool Command Language (`tcl.ssh')
Since everything, or almost, is a string, what is printed is not always what you would like.

Style Sheet: Unity (`unity.ssh')
Written by Jean-Philippe Cottin. The graphic conversion of the symbols (option `-g') is nice.

Style Sheet: VERILOG (`verilog.ssh')
Written by Edward Arthur. This style is devoted to the VERILOG hardware description language.

Style Sheet: VHDL (`vhdl.ssh')
Written by Thomas Parmelan. Non-textual operators are not highlighted. Some logical operators are printed as graphical symbols in the second level of pretty-printing.

Style Sheet: VRML (`vrml.ssh')
Written by Nadine Richard. According to @href{http://vag.vrml.org/VRML2.0/FINAL/spec/part1/grammar.html,Grammar Definition Version 2.0 ISO/IEC CD 14772}

Style Sheet: wdiff (`udiff.ssh')
This style is meant to be used onto the output unidiffs, that is to say output from `diff -u'.

Typical use of this style is:

diff -u old new | a2ps -Eudiff

The prologue code(diff)code helps to highlight the differences (`a2ps -Ewdiff --prologue=diff').

Style Sheet: wdiff (`wdiff.ssh')
This style is meant to be used onto the output of Franc,ois Pinard's program code(wdiff)code. code(wdiff)code is a utility that underlines the differences of words between to files. Where code(diff)code make only the difference between lines that have changed, code(wdiff)code reports words that have changed inside the lines.

Typical use of this style is:

wdiff old new | a2ps -Ewdiff

code(wdiff)code can be found in usual GNU repositories. The prologue code(diff)code helps to highlight the differences (`a2ps -Ewdiff --prologue=diff').

Style Sheet: Yacc (`yacc.ssh')
Special tokens, and non terminal declarations are highlighted.

Style Sheet: zsh (`zsh.ssh')

Type Setting Style Sheets

This section presents a few style sheets that define page description languages (compared to most other style sheet meant to pretty print source files).

Symbol

The style sheet Symbol introduces easy to type keywords to obtain the special characters of the PostScript font Symbol. The keywords are named to provide a LaTeX taste. These keywords are also the names used when designing a style sheet, hence to get the full list, see section A Bit of Syntax.

If you want to know the correspondence, it is suggested to print the style sheet file of Symbol:

a2ps -g symbol.ssh

PreScript

PreScript has been designed in conjunction with @pack{}. Since bold sequences, special characters etc. were implemented in @pack{}, we thought it would be good to allow direct access to those features: PreScript became an input language for @pack{}, where special font treatments are specified in an ssh syntax (see section Style Sheets Implementation).

The main advantages for using PreScript are:

It can be a good candidate for generation of PostScript output (syntactic pretty-printers, generation of various reports etc.).

Syntax

Every command name begins with a backslash (`\'). If the command uses an argument, it is given between curly braces with no spaces between the command name and the argument.

The main limit on PreScript is that no command can be used inside another command. For instance the following line will be badly interpreted by @pack{}:

\Keyword{Problems using \keyword{recursive \copyright} calls}

The correct way to write this in PreScript is

\Keyword{Problems using} \keyword{recursive} \copyright \Keyword{calls}.

Everything from an unquoted % to the end of line is ignored (comments).

PreScript Commands

These commands required arguments.

`\keyword{text}'
`\Keyword{text}'
Highlight lightly/strongly the given text. Should be used only for a couple of adjacent words.
`\comment{text}'
`\Comment{text}'
The text is given a special face. The text may be removed if option `--strip' is used.
`\label{text}'
`\Label{text}'
text should be considered as a definition, or an important point in the structure of the whole text.
`\string{text}'
Write text with string's face (e.g., in font Times).
`\error{text}'
Write text with error's face (generally a very different face, so that you see immediately).
`\symbol{text}'
text is written in the PostScript symbol font. This feature is not compatible with LaTeX. It is recommended, when possible, to use the special keywords denoting symbols, which are compatible with LaTeX (see section Symbol).
`\header{text}'
`\footer{text}'
Use text as header (footer) for the current page. If several headers or footers are defined on the same page, the last one is taken into account.
`\encoding{key}'
Change dynamically the current encoding. After this command, the text is printed using the encoding corresponding to key.

Examples

PreScript and @pack can be used for one-the-fly formating. For instance, on the `passwd' file:

ypcat passwd |
 awk -F: \
   '{print "\Keyword{" $5 "} (" $1 ") \rightarrow\keyword{" $7 "}"}'\
 | a2ps -Epre -P

@PreTeX{}

The aim of the PreTeX style sheet is to provide something similar to PreScript, but with a more LaTeX like syntax.

Special characters

`$' is ignored in PreTeX for compatibility with LaTeX, and `%' introduces a comment. Hence they are the only symbols which have to be quoted by a `\'. The following characters should also be quoted to produce good LaTeX files, but are accepted by PreScript: `_', `&', `#'.

Note that inside a command, like \textbf, the quotation mechanism does not work in PreScript (\textrm{#$%} writes `#$%') though LaTeX still requires quotation. Hence whenever special characters or symbols are introduced, they should be at the outer most level.

@PreTeX Commands

These commands required arguments.

`\section{Title}'
`\subsection{Title}'
`\subsubsection{Title}.'
Used to specify the title of a section, subsection or subsubsection.
`\textbf{text}'
`\textit{text}'
`\textbi{text}'
`\textrm{text}'
write text in bold, italic, bold-italic, Times. Default font is Courier.
`\textsy{text}'
text is written in the PostScript symbol font. This feature is not compatible with LaTeX. It is recommended, when possible, to use the special keywords denoting symbols, which are compatible with LaTeX (See the style sheet Symbol).
`\header{text}'
`\footer{text}'
Use text as header (footer) for the current page. If several headers or footers are defined on the same page, the last one is taken into account.
`\verb+text+'
Quote text so that no special sequence will be interpreted. In `\verb+quoted string+' `+' can be any symbol in `+', `!', `|', `#', `='.
`\begin{document}'
`\end{document}'
`\begin{itemize}'
`\end{itemize}'
`\begin{enumerate}'
`\end{enumerate}'
`\begin{description}'
`\end{description}'
These commands are legal in @LaTeX but have no sense in @PreTeX{}. Hence there are simply ignored and not printed (if immediately followed by an end-of-line).

Differences with @LaTeX

The following symbols, inherited from the style sheet Symbol, are not supported by LaTeX:

`\Alpha', `\apple', `\Beta', `\carriagereturn', `\Chi', `\Epsilon', `\Eta', `\florin', `\Iota', `\Kappa', `\Mu', `\Nu', `\Omicron', `\omicron', `\radicalex', `\register', `\Rho', `\suchthat', `\Tau', `\therefore', `\trademark', `\varUpsilon', `\Zeta'.

LaTeX is more demanding about special symbols. Most of them must be in so-called math mode, which means that the command must be inside `$' signs. For instance, though

If \forall x \in E, x \in F then E \subseteq F.

is perfectly legal in @PreTeX{}, it should be written

If $\forall x \in E, x \in F$ then $E \subseteq F$.

for LaTeX. Since in @PreTeX every `$' is discarded (unless quoted by a `\'), the second form is also admitted.

@TeXScript{}

TeXScript is a replacement of the old version of PreScript: it combines both the @pack{}-like and the LaTeX-like syntaxes through inheritance of both PreScript and PreTeX.

In addition it provides commands meant to ease processing of file for @pack by LaTeX.

Everything between `%%TeXScript:skip' and `%%TeXScript:piks' will be ignored in @TeXScript, so that there can be inserted command definitions for LaTeX exclusively.

The commands `\textbi' (for bold-italic) and `\textsy' (for symbol) do not exist in LaTeX. They should be defined in the preamble:

%%TeXScript:skip 
\newcommand{\textbi}[1]{\textbf{\textit{#1}}}
\newcommand{\textsy}[1]{#1}
%%TeXScript:piks

There is no way in @TeXScript to get an automatic numbering. There is no equivalent to the LaTeX environment enumerate. But every command beginning by \text is doubled by a command beginning by `\magic'. @pack behaves the same way on both families of commands. Hence, if one specifies that arguments of those functions should be ignored in the preamble of the LaTeX document, the numbering is emulated. For instance

\begin{enumerate}
\magicbf{1.}\item First line
\magicbf{2.}\item Second line
\end{enumerate}

will be treated the same way both in @TeXScript and LaTeX.

`\header' and `\footer', are not understood by LaTeX.

Faces

A face is an attribute given to a piece of text, which specifies how it should look like. Since @pack is devoted to pretty-printing source files, the faces it uses are related to the syntactic entities that can be encountered in a file.

The faces @pack uses are:

`Plain'
This corresponds to the text body.
`Keyword'
`Keyword_strong'
These are related to the keywords that may appear in a text.
`Comment'
`Comment_strong'
These are related to comments in the text. Remember that comments should be considered as non essential ("Aaaeaaarg" says the programmer); indeed, the user might suppress the comments thanks (?) to the option `--strip-level'. Hence, never use these faces just because you think they look better on, say, strings.
`Label'
`Label_strong'
These are used when a point of extreme importance, or a sectioning point, is met. Typically, functions declarations etc.
`String'
Used mainly for string and character literals.
`Error'
Used to underline the presence of an error. For instance in Encapsulated PostScript, some PostScript operators are forbidden: they are underlined as errors.

Actually, there is also the face `Symbol', but this one is particular: it is not legal changing its font.

Style sheets semantics

@pack pretty prints a source file thanks to style sheets, one per language. In the following is described how the style sheets are defined. You may skip this section if you don't care how @pack does this, and if you don't expect to implement new styles.

Name and key

Every style sheet has both a key, and a name. The name can be clean and beautiful, with any character you might want. The key is in fact the prefix part of the file name, and is alpha-numerical, lower case, and less than 8 characters long.

Anywhere @pack needs to recognize a style sheet by a name, it uses the key (in the `sheets.map' file, with the option `-E', etc.).

As an example, C++ is implemented in a file called `cpp.ssh', in which the name is declared to be `C++'.

The rationale is that not every system accepts any character in the file name (e.g., no `+' in MS-DOS). Moreover, it allows to make symbolic links on the ssh files (e.g., `ln -s cpp.ssh c++.ssh' let's you use `-E c++').

Comments

ssh files can include the name of its author, a version number, a documentation note and a requirement on the version of @pack{}. For instance, if a style sheet requires @pack version 4.9.6, then @pack version 4.9.5 will reject it.

Alphabets

@pack needs to know the beginning and the end of a word, especially keywords. Hence it needs two alphabets: the first one specifying by which letters an identifier can begin, and the second one for the rest of the word. If you prefer, a keyword starts with a character belonging to the first alphabet, and a character not pertaining to the second is a separator.

Case sensitivity

If the style is case insensitive, then matching is case insensitive (keywords, operators and sequences).

P-Rules

A P-rule (Pretty printing rule), or rule for short, is a structure which consists of two items:

lhs
left-hand side
its source string, with which the source file is compared;
rhs
right hand side
a list of faced strings which will replace the text matched in the pretty-printed output. A faced string is composed of

Just a short example: `(foo, bar, Keyword_strong)' as a rule means that every input occurrence of `foo' will be replaced by `bar', written with the Keyword_strong face.

If the destination string is empty, then @pack will use the source string. This is different from giving the source string as a destination string if the case is different. An example will make it fairly clear.

Let foobar be a case insensitive style sheet including the rules `(foo, "", Keyword)' and `(bar, bar, Keyword)'. Then, on the input `FOO BAR', @pack will produce `FOO bar' in Keyword.

@pack implements two different ways to match a string. The difference comes from that some keywords are sensitive to the delimiters around them (such as `unsigned' and `int' in C, which are definitely not the same thing as `unsignedint'), and others not (in C, `!=' is "different from" both in `a != b' and `a!=b').

The first ones are called keywords in @pack jargon, and the seconds are operators. Operators are matched anywhere they appear, while keywords need to have separators around them (see section Alphabets).

Let us give a more complicated example: that of the Yacc rules. A rule in Yacc is of the form:

a_rule : part1 part2 ;

Suppose you want to highlight these rules. To recognize them, you will write a regular expression specifying that:

  1. it must start at the beginning of the line,
  2. then there is string composed of symbols, which is what you want to highlight,
  3. and a colon, which can be preceded by blank characters.

The regexp you want is: `/^[a-zA-Z0-9_]*[\t ]*:/'. But with the rule `/^[a-zA-Z0-9_]*[\t ]*:/, "", Label_strong' the blanks and the colon are highlighted too. Hence you need to specify some parts in the regexp (see section `Back-reference Operator' in Regex manual), and use a longer list of destination strings. The correct rule is

(/^\\([a-zA-Z0-9_]*\\)\\([\t ]*:\\)/, \1 Label_strong, \2 Plain)

Since it is a bit painful to read, regexps can be spread upon several lines. It is strongly suggested to break them by groups, and to document the group:

(/^\\([a-zA-Z0-9_]*\\)/    # \1. Name of the rule
 /\\([\t ]*:\\)/           # \2. Trailing space and colon
 \1 Label_strong, \2 Plain)

Sequences

A sequence is a string between two markers, along with a list of exceptions. A marker is a fixed string. Typical examples are comments, string (with usually `"' as opening and closing markers, and `\\' and `\"' as exceptions) etc. Three faces are used: one for the initial marker, one for the core of the sequence, and a last one for the final maker.

Optional entries

There are two levels of pretty-printing encoded in the style sheets. By default, @pack uses the first level, called normal, unless the option `-g' is specified, in which case, heavy highlighting is invoked, i.e., optional keywords, operators and sequences are considered.

Style Sheets Implementation

A Bit of Syntax

Here are the lexical rules underlying the style sheet language:

Style Sheet Header

The definition of the name of the style sheet is:

style name is
  # body of the style sheet
end style

The following constructions are optional:

version
To define the version number of the style sheet
version is version-number
written
To define the author(s).
written by authors
Giving your email is useful for bug reports about style sheets.
written by "Some Body <Some.Body@some.whe.re>"
requires
To specify the version of @pack it requires. @pack won't accept a file which requires a higher version number than its own.
requires a2ps a2ps-version-number
documentation
To leave extra comments people should read.
documentation is
   strings
end documentation
strings may be a list of strings, without comas, in which case new lines are automatically inserted between each item. See section Documentation Format for details on the format. Please, write useful comments, not `This style is devoted to C files', since the name is here for that, nor `Report errors to mail@me.somewhere', since written by is there for that.
documentation is
    "Not all the keywords are used, to avoid too much"
    "bolding. Heavy highlighting (code(-g)code), covers"
    "the whole language."
end documentation

Syntax of the Words

There are two things @pack needs to know: what is symbol consistent, and whether the style is case insensitive.

alphabet
To define two different alphabets, use
first alphabet is string
second alphabet is string
If both are identical, you may use the shortcut
alphabets are string
The default alphabets are
first alphabet is
  "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"
second alphabet is
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_\
0123456789"
Note that it is on purpose that no characters interval are used.
case
case insensitive        # e.g., C, C++ etc.
case sensitive          # e.g., Perl, Sather, Java etc.
The default is case insensitive.

Inheriting from Other Style Sheets

It is possible to extend an existing style. The syntax is:

ancestors are
   ancestor_1[, ancestor_2...]
end ancestors

where ancestor1 etc. are style sheet keys.

For semantics, the rules are the following:

As an example, both C++ and Objective C style sheets extend the C style sheet:

style "Objective C" is
#[...]
ancestors are
   c
end ancestors
#[...]
end style

To the biggest surprise of the author, mutually dependent style sheets do work!

Syntax for the P-Rules

See section P-Rules, for the definition of P-rule.

Because of various short cuts, there are many ways to declare a rule:

rules     ::= rule_1 `,' rule_2...
rule      ::= `(' lhs rhs `)'
           | lhs srhs ;
lhs       ::= string | regex ;
rhs       ::= srhs `,' ...
srhs      ::= latex-keyword | expansion face
expansion ::= string | `\'num | <nothing>;
face      ::= face-keyword | <nothing>;

The rules are the following:

Declaring the keywords and the operators

Basically, keywords and operators are lists of rules. The syntax is:

keywords are
  rules
end keywords

or

keywords in face-keyword are
  rules
end keywords

in which case the default face is set to face-keyword.

As an example:

keywords in Keyword_strong are
  /foo*/,
  "bar" "BAR" Keyword,
  -> \rightarrow
end keywords

is valid.

The syntax for the operators is the same, and both constructs can be qualified with an optional flag, in which case they are taken into account in the heavy highlighting mode (see section Pretty Printing Options).

This is an extract of the C style sheet:

optional operators are
   -> \rightarrow,
   && \wedge,
   || \vee,
   != \neq,
   == \equiv,
   # We need to protect these, so that <= is not replaced in <<=
   <<=,
   >>=,
   <= \leq,
   >= \geq,
   ! \not
end operators

Note how `<<=' and `>>=' are protected (there are defined to be written as is when met in the source). This is to prevent the two last characters of `<<=' from being converted into a `less or equal' sign.

The order in which you define the elements of a category (but the sequences) does not matter. But since @pack sorts them at run time, it may save time if the alphabetical C-order is more or less followed.

You should be aware that when declaring a keyword with a regular expression as lhs, then @pack automatically makes this expression matching only if there are no character of the first alphabet both just before, and just after the string.

In term of implementation, it means that

keywords are
  /foo\\|bar/
end keywords

is exactly the same as

operators are
  /\\b\\(foo\\|bar\\)\\b/
end operators

This can cause problems if you use anchors (e.g. $, or ^) in keywords: the matcher will be broken. In this particular case, define your keywords as operators, taking care of the `\\b' by yourself.

See section `Match-word-boundary Operator' in Regex manual, for details on `\b'.

Declaring the sequences

Sequences admit several declarations too:

sequences      ::= sequences are
                     sequence_1 `,' sequence_2...
                   end sequences
sequence       ::= rule in_face close_opt exceptions_opt
                 | C-string
                 | C-char
                 ;
close_opt      ::= rule
                 | closers are 
                     rules
                   end closers
                 | <nothing>
                 ;
exceptions_opt ::= exceptions are 
                     rules
                   end exceptions
                 | <nothing>
                 ;

The rules are:

As a first example, the definition of C-string is:

sequences are
 "\"" Plain String "\"" Plain
     exceptions are
        "\\\\", "\\\""
     end exceptions
end sequences

The following example comes from `ssh.ssh', the style sheet for style sheet files, in which there are two kinds of pseudo-strings: the strings (`"example"'), and the regular expressions (`/example/'). We do not want the content of the pseudo-strings in the face String.

sequences are
  # The comments
  "#" Comment,

  # The name of the style sheet
  "style " Keyword_strong (Label + Index1) " is" Keyword_strong,

  # Strings are exactly the C-strings, though we don't want to
  # have them in the "string" face
  "\"" Plain "\""
     exceptions are
        "\\\\", "\\\""
     end exceptions,

  # Regexps
  "/" Plain "/"
     exceptions are
        "\\\\", "\\\/"
     end exceptions

end sequences

The order between sequences does matter. For instance in Java, `/**' introduces strong comments, and `/*' comments. `/**' must be declared before `/*', or it will be hidden.

There are actually some sequences that could have been implemented as operators with a specific regular expression (that goes up to the closer). Nevertheless be aware of a big difference: regular expression are applied to a single line of the source file, hence, they cannot match on several lines. For instance, the C comments,

/* 
 * a comment
 */

cannot be implemented with operators, though C++ comments can:

//
// a comment
//

A tutorial on style sheets

In this section a simple example of style sheet is entirely covered: that of `ChangeLog' files.

`ChangeLog' files are some kind of memory of changes done to files, so that various programmers can understand what happened to the sources. This helps a lot, for instance, in guessing what recent changes may have introduced new bugs.

Example and syntax

First of all, here is a sample of a `ChangeLog' file, taken from the `misc/' directory of the original @pack package:

Sun Apr 27 14:29:22 1997  Akim Demaille  <demaille@inf.enst.fr>

        * base.ps: Merged in color.ps, since now a lot is
          common [added box and underline features].

Fri Apr 25 14:05:20 1997  Akim Demaille  <demaille@inf.enst.fr>

        * color.ps: Added box and underline routines.

Mon Mar 17 20:39:11 1997  Akim Demaille  <demaille@gargantua.enst.fr>

        * base.ps: Got rid of CourierBack and reencoded_backspace_font.
          Now the C has to handle this by itself.

Sat Mar  1 19:12:22 1997  Akim Demaille  <demaille@gargantua.enst.fr>

        * *.enc: they build their own dictionaries, to ease multi
          lingual documents.

The syntax is really simple: A line specifying the author and the date of the changes, then a list of changes, all of them starting with an star followed by the name of the files concerned, then optionally between parentheses the functions affected, and then some comments.

Implementation

Quite naturally the style will be called ChangeLog, hence:

style ChangeLog is
written by "Akim Demaille <demaille@inf.enst.fr>"
version is 1.0
requires a2ps 4.9.5

documentation is
   "This is a tutorial style sheet.\n"
end documentation
  ...
end style

A first interesting and easy entry is that of function names, between `(' and `)':

sequences are
  "(" Plain Label ")" Plain
end sequences

A small problem that may occur is that there can be several functions mentioned separated by commas, that we don't want to highlight this way. Commas, here, are exceptions. Since regular expressions are not yet implemented in @pack{}, there is a simple but stupid way to avoid that white spaces are all considered as part of a function name, namely defining two exceptions: one which captures a single comma, and a second, capturing a comma and its trailing space.

For the file names, the problem is a bit more delicate, since they may end with `:', or when starts the list of functions. Then, we define two sequences, each one with one of the possible closers, the exceptions being attached to the first one:

sequences are
  "* " Plain Label_strong ":" Plain
     exceptions are
        ", " Plain, "," Plain
     end exceptions,
  "* " Plain Label_strong " " Plain
end sequences

Finally, let us say that some words have a higher importance in the core of text: those about removing or adding something.

keywords in Keyword_strong are
  add, added, remove, removed
end keywords

Since they may appear in lower or upper, of mixed case, the style will be defined as case insensitive.

Finally, we end up with this style sheet file, in which an optional highlighting of the mail address of the author is done. Saving the file is last step. But do not forget that a style sheet has both a name as nice as you may want (such as `Common Lisp'), and a key on which there are strict rules: the prefix must be alpha-numerical, lower case, with no more than 8 characters. Let's chose `chlog.ssh'.

# This is a tutorial on a2ps' style sheets
style ChangeLog is
written by "Akim Demaille <demaille@inf.enst.fr>"
version is 1.0
requires a2ps 4.9.5

documentation is
   "Second level of high lighting covers emails."
end documentation

sequences are
  "(" Plain Label ")" Plain
     exceptions are
        ", " Plain, "," Plain
     end exceptions,
  "* " Plain Label_strong ":" Plain
     exceptions are
        ", " Plain, "," Plain
     end exceptions,
  "* " Plain Label_strong " " Plain
end sequences

keywords in Keyword_strong are
  add, added, remove, removed
end keywords

optional sequences are
   < Plain Keyword > Plain
end sequences
end style

The Entry in `sheets.map'

The last touch is to include the pattern rules about `ChangeLog' files (which could appear as `ChangeLog.old' etc.) in `sheets.map':

# ChangeLog files
ChangeLog*                 chlog

This won't work... Well, not always. Not for instance if you print `misc/ChangeLog'. This is not a bug, but truly a feature, since sometimes one gets more information about the type of a file from its path, than from the file name.

Here, to match the preceding path that may appear, just use `*':

# ChangeLog files
*ChangeLog*                chlog

If you want to be more specific (`FooChangeLog' should not match), use:

# ChangeLog files
ChangeLog*                 chlog
*/ChangeLog*               chlog

More Sophisticated Rules

The example we have presented until now uses only basic features, and does not take advantage of the regexp. In this section we should how to write more evolved pretty printing rules.

The target will be the lines like:

Sun Apr 27 14:29:22 1997  Akim Demaille  <demaille@inf.enst.fr>

Fri Apr 25 14:05:20 1997  Akim Demaille  <demaille@inf.enst.fr>

There are three fields: the date, the name, the mail. These lines all start at the beginning of line. The last field is the easier to recognize: is starts with a `<', and finishes with a `>'. Its rule is then `/<[^>]+>/'. It is now easier to specify the second: it is composed only of words, at least one, separated by blanks, and is followed by the mail: `/[[:alpha:]]+\\([ \t]+[[:alpha:]]+\\)*/'. To concatenate the two, we introduce optional blanks, and we put each one into a pair of `\\('-`\\)' to make each one a recognizable part:

\\([[:alpha:]]+\\([ \t]+[[:alpha:]]+\\)*\\)
\\(.+\\)
\\(<[^>]+>\\)

Now the first part is rather easy: it starts at the beginning of the line, finishes with a digit. Once again, it is separated from the following field by blanks. Split by groups (see section `Grouping Operators' in Regex manual), we have:

^
\\([^\t ].*[0-9]\\)
\\([ \t]+\\)
\\([[:alpha:]]+\\([ \t]+[[:alpha:]]+\\)*\\)
\\(.+\\)
\\(<[^>]+>\\)

Now the destination is composed of back references to those groups, together with a face:

# We want to highlight the date and the maintainer name
optional operators are
  (/^\\([^\t ].*[0-9]\\)/                        # \1. The date
   /\\([ \t]+\\)/                                # \2. Spaces
   /\\([[:alpha:]]+\\([ \t]+[[:alpha:]]+\\)*\\)/ # \3. Name
   /\\(.+\\)/                                    # \5. space and <
   /\\(<[^>]+\\)>/                               # \6. email
   \1 Keyword, \2 Plain, \3 Keyword_strong, 
   \5 Plain, \6 Keyword, > Plain)
end operators

Notice the way regexps are written, to ease reading.

PostScript

This chapter is devoted to the information which is only relevant to PostScript.

Page Device Options

Page device is a PostScript level 2 feature that offers an uniform interface to control printer's output device. @pack protects all page device options inside an if block so they have no effect in level 1 interpreters. Although all level 2 interpreters support page device, they do not have to support all page device options. For example some printers can print in duplex mode and some can not. Refer to the documentation of your printer for supported options.

Here are some usable page device options which can be selected with the `-D' option (`--setpagedevice'). For a complete listing, see PostScript Language Reference Manual: section 4.11 Device Setup.

Collate boolean
how output is organized when printing multiple copies
Duplex boolean
duplex (two side) printing
ManualFeed boolean
manual feed paper tray
OutputFaceUp boolean
print output `face up' or `face down'
Tumble boolean
how opposite sides are positioned in duplex printing

Statusdict Options

The statusdict is a special storage entity in PostScript (called a dictionary), in which some variables and operators determine the behavior of the printer. This is an historic horror that existed before page device definitions were defined. They are even more printer dependent, and are provided only for the people who don't have a level printer. In any case, refer to the documentation of your printer for supported options.

Here are some statusdict definitions in which you might be interested:

manualfeed boolean
Variable which determine that the manual fed paper tray will be used. Use is `-Smanualfeed::true'.
setmanualfeed boolean
Idem as the previous point, but use is `-Ssetmanualfeed:true'.
setduplexmode boolean
If boolean, then print in Duplex mode. Use if `-Ssetduplexmode:true'.

Colors in PostScript

Nevertheless, here are some tips on how to design your PostScript styles. It is strongly recommended to use `gray.pro' or `color.pro' as a template.

There are two PostScript instructions you might want to use in your new PostScript prologue:

setgray
this instruction must be preceded by a number between 0 (black) and 1 (white). It defines the gray level used.
setrgbcolor
this instruction must be preceded by three numbers between 0 (0 %) and 1 (100%). Those three numbers are related to red, green and blue proportions used to designate a color.

@pack uses two upper level procedures, BG and FG, but both use an argument as in setrgbcolor. So if you wanted a gray shade, just give three times the same ratio.

@pack PostScript Files

@pack uses several types of PostScript files. Some are standards, such as font files, and others are meant for a2ps only.

All a2ps files have two parts, one being the comments, and the other being the content, separated by the following line:

% code follows this line

Designing PostScript Prologues

It is pretty known that satisfying the various human tastes is an NEXPTIME-hard problem, so @pack offers ways to customize its output through the prologue files. But since the authors feel a little small against NEXPTIME, they agreed on the fact that you are the one who will design the look you like.

Hence in this section, you will find what you need to know to be able to customize @pack output.

Basically, @pack uses faces which are associated to their "meaning" in the text. @pack let's you change the way the faces look.

Definition of the faces

There are three things that define a face:

Its font
You should never call the font by yourself, because sometimes @pack may decide that another font would be better. This is what happens for instance if a font does not support the encoding you use. Hence, never set the font by yourself, but ask @pack to do it. This is done through a line:
%Face: face real-font-name size
This line tells @pack that the font of face is real-font-name. It will replace this line by the correct PostScript line to call the needed font, and will do everything needed to set up the font. The size of the text body is bfs.
Its background color
There are two cases:
  1. You want a background color, then give the RGB (see section Colors in PostScript) ratio and true to BG:
    0.8 0.8 0 true BG
    
  2. You don't want a background color, then call BG with false:
    false BG
    
Its foreground color
As BG, call FG with an RGB ratio:
0 0.5 0 FG
Its underlining
UL requires a boolean argument, depending whether you want or not the current face to be underlined.
true UL
Its boxing
Requiring a boolean, BX let's a face have a box drawn around.

Prologue File Format

Prologue files for @pack must have `pro' as suffix. Documentation (reported with `--list-prologues') can be included in the comment part:

Documentation
This prologue is the same as the prologue code(pb)code, but using
the bold version of the fonts.
EndDocumentation
% code follows this line

See section Documentation Format for more on the format.

A step by step example

We strongly suggest our readers not to start from scratch, but to copy one of the available styles (see the result of `a2ps --list=prologues'), to drop it in one of @pack directories (say `$HOME/.a2ps', and to patch it until you like it.

Here, we will start from `color.pro', trying to give it a funky look.

Say you want the keywords to be in Helvetica, drawn in a flashy pink on a light green. And strong keywords, in Times Bold Italic in brown on a soft Hawaïan sea green (you are definitely a fine art amateur).

Then you need to look for `k' and `K':

/k {
  false BG
  0 0 0.9 FG
%Face: Keyword Courier bfs
  Show
} bind def

/K {
  false BG
  0 0 0.8 FG
%Face: Keyword_strong Courier-Bold bfs
  Show
} bind def

and turn it into:

/k {
  0.2 1 0.2 true BG
  1 0.2 1 FG
%Face: Keyword Helvetica bfs
  Show
} bind def

/K {
  0.4 0.2 0 true BG
  0.5 1 1 FG
%Face: Keyword_strong Times-BoldItalic bfs
  Show
} bind def

Waouh! It looks great!

A bit trickier: let change the way the line numbers are printed.

First, let's look for the font definition:

%%BeginSetup
% The font for line numbering
/f# /Helvetica findfont bfs .6 mul scalefont def
%%EndSetup

Let it be in Times, twice bigger than the body font.

%%BeginSetup
% The font for line numbering
/f# /Times-Roman findfont bfs 2 mul scalefont def
%%EndSetup

How about its foreground color?

% Function print line number (<string> # -)
/# {
  gsave
    sx cw mul 2 div neg 0 rmoveto
    f# setfont
    0.8 0.1 0.1 FG
    c-show
  grestore
} bind def

Let it be blue. Now you know the process: just put `0 0 1' as FG arguments.

Programming with the Library

@pack offers to the programmer an access to its generating routines. This section documents the API.

But since this section is empty, or almost, if I were you, I would go in contrib/sample to see how it works...

Initialization and Closing of Calls to liba2ps

Function: struct a2ps_job * a2ps_job_new (void)
Build a new storage unit for the library.

Function: void a2ps_read_sys_config (struct a2ps_job * job)
Set job with the default settings defined in the configuration file of the system.

Function: void a2ps_read_config (struct a2ps_job * job, char * path, char * filename)
Set job with the default settings defined in the configuration file `path/filename'. path can be NULL, filename cannot.

Print Jobs

A print job should be seen as associated to a single output.

Function: void a2ps_open_output_session (struct a2ps_job * job)
Initialize job for a new print job.

Function: void a2ps_close_output_session (struct a2ps_job * job)
Closes the current print job, and sends the output.

File Jobs

A file job should be seen as a single input.

Function: void a2ps_new_input_session (struct a2ps_job * job, char * name)
Create and open a new file job in job. name can be NULL, in which case its name is defaulted to that of stdin.

Function: void a2ps_close_input_session (struct a2ps_job * job)
End the current input session.

Printing Functions

These are the functions to be used to send content to liba2ps.

Function: void a2ps_print_char (struct a2ps_job * job, unsigned char c, face_t face)
Print the char c in face in job.

Function: void a2ps_print_string (struct a2ps_job * job, unsigned char * string, face_t face)
Print the C string string in face in job.

Function: void a2ps_print_buffer (struct a2ps_job * job, unsigned char * buffer, size_t len, face_t face)
Print the len first characters contained in buffer with face into job.

Contributions

card

Many users of @pack have asked for a reference card, presenting a summary of the options. In fact, something closely related to the output of `@pack --help'.

The first version of this reference card was a PreScript file (see section PreScript) to be printed by @pack{}. Very soon a much better scheme was found: using a style sheet to pretty print directly the output of `@pack --help'! A first advantage is then that the reference cards can be printed in the tongue you choose.

A second was that this treatment could be applied to any application supporting a `--help'-like option.

Invoking card

card [options] applications

card is a shell script which tries to guess how to get your applications' help message (typically by the options `--help' or `-h'), and pretty prints it thanks to @pack{} (or the content of the environment variable `A2PS' if it is set).

Supported options are:

Option: -h
Option: --help
print a short help message and exit successfully.

Option: -V
Option: --version
report the version and exit successfully.

Option: -D
Option: --debug
enter in debug mode.

Option: -l language
Option: --language=language
specify the language in which the reference card should be printed. language should be the symbol used by LC_ALL etc. (such as `fr', `it' etc.).

If the applications don't support internationalization, English will be used.

Option: --command=command
Don't try to guess the applications' way to report their help message, but rather use the call command. A typical example is
card --command="cc -flags"

Any option that is not recognized by card is passed to @pack{} (see section Invoking @pack). Be aware that these options must not be separated from their arguments. For instance

card gmake gtar --command="cc -flags" -Pdisplay

builds the reference card of GNU make, GNU tar (automatic detection of `--help' support), and cc thanks to `-flags'. Since `-P' is not supported by card, it is passed to @pack{}.

Caution when Using card

Remember that card runs the programs you give it, and the commands you supplied. Hence if there is a silly programs that has a weird behavior given the option `-h' etc., beware of the result.

It is even more clear using `--command': avoid running `card --command="rm -rf *"', because the result will be exactly what you think it will be!

psmandup

I personally hate to print documents of hundreds of pages on a single sided printer. Too bad, here there are no Duplex printers. The idea is then simply first to print the odd pages, then the even in reversed order. To make sure one flips the page in the meanwhile, the second half should be printed from the manual feed tray.

Make a shell script that automates this, and you get psmandup.

Invoking psmandup

psmandup [options] [file]

produce a manual duplex version of the PostScript file (or of the standard input if no file is given, or if file is `-'). Once the first half is printed, put the sheet stack in the manual feed tray for the second half.

Supported options are:

Option: -h
Option: --help
print a short help message and exit successfully.

Option: -V
Option: --version
report the version and exit successfully.

Option: -D
Option: --debug
enter in debug mode.

Option: -o file
Option: --output=file
specify the file in which is saved the output.

Option: -n
Option: --no-fix
psmandup will fail on ill designed PostScript. Actually it is the psutils that fail. To avoid this, by default the PostScript file is sanitized by fixps.

When given this option, don't run fixps. This is meant to be used when fixps has already been used higher in the processing chain.

psmandup makes the assumptions that the printer is Level 2, and support manual feeding. The file should be reasonably sane, otherwise psmandup fails miserably.

Typical use is

psmandup file.ps | lp

or can be logged into @pack{}' printer commands (see section Your Printers).

pdiff

The shell script pdiff aims to pretty print diff between files. It basically uses GNU diff (see section `Overview' in Comparing and Merging Files) or GNU wdiff (see section `The word difference finder' in GNU wdiff) to extract the diff, then calls @pack with the correct settings to get a nice, printed contextual diff.

Invoking pdiff

pdiff [options] file-1 file-2

make a pretty comparison between file-1 and file-2.

Supported options are:

Option: -h
Option: --help
print a short help message and exit successfully.

Option: -V
Option: --version
report the version and exit successfully.

Option: -D
Option: --debug
enter in debug mode.

Option: -w
Option: --words
Look for words differences (default). White space differences are not considered.

Option: -w
Option: --lines
Look for lines differences.

Any option that is not recognized by pdiff is passed to @pack{} (see section Invoking @pack). Be aware that these options must not be separated from their arguments. For instance

pdiff -l -Pdisplay COPYING COPYING.LIB

Comparse the files `COPYING' and `COPYING.LIB', and prints it on the printer display (usually ghostview or gv). Since `-P' is not supported by pdiff, it is passed to @pack{}.

fixps

The shell script fixps tries its best to fix common problems in PostScript files that may prevent post processing. It makes heavy use of the psutils. It is a good idea to use fixps upstream in the PostScript to PostScript delegations.

Invoking fixps

fixps [options] [file]

sanitize the PostScript file (or of the standard input if no file is given, or if file is `-').

Supported options are:

Option: -h
Option: --help
print a short help message and exit successfully.

Option: -V
Option: --version
report the version and exit successfully.

Option: -D
Option: --debug
enter in debug mode.

Option: -o file
Option: --output=file
specify the file in which is saved the output.

@pack Emacs mode

FIXME: Document me.

Various

We collected in this chapter the things that had no place in the rest of the document.

Security issues

Note. I am not really aware of security problems. I am just making assumptions upon my poor knowledge, so if somebody sees things that should be reported here, or problem I'm not aware of, please contact us so that this note gets extended or fixed.

One should understand that any program that has not been written to be secure is never secure. It is of course the case of @pack{}.

Do not panic, there are no reason for you to worry. Nevertheless we can yet imagine ways to obtain illegal rights thanks to some features of @pack{}, especially virtual printers.

If @pack is run by root, then the files it may create are owned by root. This can for instance happen if you install @pack as one of lp or lpr filter.

Then, if one of the virtual printer creates say a shell script, it is owned by root too. With just a bit of habit, it should not be difficult then to access privileged access to the system.

In what conditions could it happen? Only if there are some printers defined in the system configuration file of @pack{}, or in root's home directory `.a2ps/a2psrc'. Hence, make sure to carefully write the commands to the preconfigured printers.

As you can see, this is quite science fiction, nevertheless, you might wanted to know.

Non PostScript printers

Here are some tips we have on how to use a non PostScript printer. If somebody feels like writing a more precise documentation, he really is welcome.

From Clayton Weaver

(for a bj200ex on os2 from linux) This is a shell script called as a filter from an ":if=/usr/local/bin/filtername" entry in /etc/printcap on linux:

#!/bin/bash

gs -q -sDevice=bj200 -sOutputfile=- -r360 -dNOPAUSE -dSAFER -

The device is a gs device name, input is the ending "-" (stdin), output is stdout, -q is "no messages". Can be used with

lpr -Pprintername -Ffilter_path_and_name infile.ps

or just `lpr -Pprintcap_printername infile.ps' if the filter is specified in the printcap `:if=' entry for that "printcap_printername". Either way, lpr on linux runs it in a sub shell, so you don't want "exec" before the gs command (that kills the sub shell and leaves gs running with no way to communicate its stdout back to lpr).

You can print directly from gs, I've done it on OS/2 by specifying "lpt1" as the output device, but printing to a remote printer I need lpr and lpd to handle transmitting the job, so this way works better for me.

Regards, Clayton Weaver (Seattle)

From Pierre Juillot

To print toto.ps on my desk-jet, I hit:

> gsdj toto.ps

where `gsdj' is

#!/bin/sh
#                            05-06-1996           
# to print a PostScript file using GhostScript on the  
# desk-jet 500 (dj) or the printer specified via  the 
# environment variable LPOPTS 
# using GhostScript 
# exec gs -q -dNOPAUSE -sPAPERSIZE=a4 -sDEVICE=djet500 \
exec gs -q -dNOPAUSE -sPAPERSIZE=a4 -sDEVICE=deskjet \
     -sOutputFile="|lp -onb -ddj -or $LPOPTS " $* quit.ps

These tips in a2ps

To use these examples, first see section Your Printers. The translations would be in one of your configuration files, say `$HOME/.a2ps/a2psrc':

Printer: lpt1 | gs -q -sDevice=bj200 -sOutputfile=- -r360 -dNOPAUSE \
        -dSAFER > lpt1
UnknownPrinter:  | gs -q -dNOPAUSE -sPAPERSIZE=a4 -sDEVICE=deskjet \
     -sOutputFile="|lp -onb -ddj -or #o" quit.ps

Frequently asked questions

Please, before sending us mail, make sure the problem you have is not known, and explained. Moreover, avoid using the mailing list for asking question about the options, etc. It has been built for announces and suggestions, not to contact the authors.

Why Does ...?

Error related questions.

Relocation Error

When I have just compiled @pack{}, and I first try it, I have weird
errors such as:

gargantua ~T $ a2ps --help
ld.so.1: a2ps: fatal: relocation error: symbol not found:
       ps_comment_hook: referenced in a2ps
zsh: 7294 killed     a2ps --help

This is due to a mix between several versions of the liba2ps. To fix the problem, make sure to run `make install' in the `lib/' directory and then in the `src/' directory. Removing the previous `liba2ps.so' files may help.

Printer Errors

There are two ways that printing can fail: silently, or with an diagnostic.

First check that you did not give exotic options to an old printer (typically, avoid printing on two sides on a printer that does not support it). Avoid use of options `-D' (see section Page Device Options) and `-S' (see section Statusdict Options).

If the trouble persists, please try again but with the option `--debug' (a PostScript error handler is down-loaded), and then send us:

  1. the file that gives problems
  2. the error message that was printed.

Cannot Print in Duplex

If your printer is too old, then @pack will not be able to send it the code it needs when `-s2' is specified. This is because your printer uses an old and not standardized interface for special features.

So you need to

  1. specify that you want Duplex mode: `-s2',
  2. remove at hand the standardized call to the Duplex feature: `-DDuplex',
  3. add the non standard call to the Duplex features. Try `-Ssetduplexmode:true'.

Since this is painful to hit, a User Option (see section Your Shortcuts) should help.

Printing goes beyond the frame of the paper

You are currently printing with a bad medium, for instance using A4 paper within @pack{}, while your printer uses Letter paper. See section Sheets Options, option `--medium' for more.

What I get on the printer is long and incomprehensible

You are probably printing a PostScript file or equivalent. Try to print with `-Z': @pack will try to do his best to find what is the program that can help you (see section Your Delegations). In case of doubt, don't hesitate to save into a file, and check the content with GhostView, or such:

$ a2ps my_weird_file -Z -o mwf.ps
$ ghostview mwf.ps

If it is not correct, ask for help around you.

Why Not ...?

Why not having used yacc and such

There are several reasons why we decided not to use grammars to parse the files. First it would have made the design of the style sheets much more tricky, and today @pack would know only 4 or 5 languages.

Second, it limits the number of persons who could build a style sheet.

Third, mixing several parsers within one program is not easy. Moreover, its would have been ten times bigger.

Fourth, we did not feel the need for such a powerful tool: handling the keywords and the sequences is just what the users expect.

Fifth, any extension of @pack would have required to recompile.

And last but not least, using a parser requires that the sources are syntactic bug free, what is too strong a requirement.

Nevertheless, PreScript gives the possibility to have on the one hand a syntactic parser which would produce PreScript code, and on the other hand, @pack{}, which would make it PostScript. This schema seems to us a good compromise. If it is still not enough for you, you can use the library (see section Programming with the Library).

How Can I ...?

How Can I Leave Room for Binding?

The option `--margin[=size]' is meant for this. See section Sheets Options.

How Can I Print stdin?

@pack prints the standard input if you give no file name, or if you gave `-' as file name. Automatic style selection is of course much weaker: without the file name, @pack can only get file(1)'s opinion (see section Style Sheet Files). In general it means most delegations are safe, but there will probably be no pretty-printing.

YOU can supply a name to the standard input (`--stdin=name') with which it could guess the language.

How Can I Change the Font?

See section Designing PostScript Prologues, for details. Make sure that all the information @pack needs is available (see section Font Files).

How Can I Simulate the Old Option `-b'?

By the past, @pack had an option `-b' with which the fonts were bold. Since now the fonts are defined by prologues (see section Designing PostScript Prologues) this option no longer makes sense. A replacement prologue is provided: `bold'. To use it, give the option `--prologue=bold'.

How Can I Print on Non PostScript Printers?

@pack is specialized in PostScript generation. Nevertheless many printers do not understand PostScript, most notably personal Jet printers. GhostScript is a true PostScript interpretor which is able to convert PostScript code into another format (most notably for X11 or other screen devices, which explains why GhostScript is needed by tools such as GhostView, or gv etc.).

GhostScript might be the tool you need. It support conversion to many different non PostScript printer. To know more, see @href{http://www.cs.wisc.edu/~ghost/index.html, GhostScript home page}.

What next?

There are some features we would like to implement. Some are the following ones. If you feel like helping, don't hesitate to contact us.

EPSF

@pack should be able to generate EPS files in a short while.

Spelling checking, syntax fixing.

When printing a human file (only English may be supported), spelling should be checked. When pretty-printing, syntax errors should be underlined.

No just kidding :). Do it yourself...

Glossary

This section settles some terms used through out this document, and provides the definitions of some terms you probably want to know about.

Adobe
Adobe is the firm who designed and owns the PostScript language. The patent that printer manufacturers must pay to Adobe is the main reason why PostScript printers are so expansive.
AFM file
AFM stands for Adobe Font Metrics. These files contain everything one needs to know about a font: the width of the characters, the available characters etc.
Charset
Code Set
Cf. Encoding.
Delegate
Another filter (application) which @pack may call to process some files. This feature is especially meant for page description files (see section Your Delegations).
DSC
Document Structuring Conventions
Because PostScript is a language, any file describing a document can have an arbitrary complexity. To ease the post-processing of PostScript files, the document should follow some conventions. Basically there are two kinds of conventions to follow:
Page Independence
Special comments state where the pages begin and end. With these comments (and the fact that the code describing a page starts and ends somewhere, which is absolutely not necessary in PostScript), very simple programs (such as psnup, psselect etc.) can post process PostScript files.
Requirements
Special features may be needed to run correctly the file. Some comments specify what services are expected from the printer (e.g., fonts, duplex printing, color etc.), and other what features are provided by the file itself (e.g., fonts, procsets etc.), so that a print manager can decide that a file cannot be printed on that printer, or that it is possible if the file is slightly modified (e.g., adding a required font not known by the printer) etc.
The DSC are edited by Adobe. A document which respects them is said to be DSC conformant. A document which is not is said to be a Micro$oft junk. Of course @pack follows all the DSC.
Encoding
Association of human readable characters, and computers' internal numbered representation. In other words, they are the alphabets, which are different according to your country/mother tongue. E.g.: ASCII, Latin 1, corresponding to Western Europe etc. See section What is an Encoding to know more about encodings.
GhostScript
GhostScript is a full PostScript interpreter running under many various systems (Unixes, MS-DOS, Mac etc.). It can be used either to view PostScript files (in general thanks to a graphic interface such as GhostView or gv ...), or to translate the PostScript in another format (for instance PCL, PDF, and many formats supported by some printers such as the Desk Jets). Thanks to GhostScript many people not owning a PostScript printer are still able to use the PostScript technology.
Face
A virtual style given to some text. For instance, Keyword, Comment are faces.
Headings
Everything that goes around the page and is not part of the text body. Typically the title, footer etc.
Key
Many objects used in @pack{}, such as encodings, have both a key and a name. The word name is used for a symbol, a label, which is only meant to be nice to read by a human. For instance `ISO Latin 1' is a name. @pack{} never uses a name, but the key. A key is the identifier of a unique object. This is information that @pack processes, hence, whenever you need to specify an object to @pack{}, use the key, not its name. For instance `latin1' is the unique identifier of the `ISO Latin 1' encoding.
Logical page
Cf. Virtual page.
lhs
left hand side
See P-rule.
Medium
Official name (by Adobe) given to the output physical support. In other words, it means the description of a sheet, e.g., A4, Letter etc.
Name
See Key.
Page
A single side of a sheet.
Page Description Language
A language that describes some text (which may be enriched with pointers, pictures etc.) and its layout. HTML, PostScript, LaTeX, roff and others are such languages. A file written in those languages is not made to be read as is by a human, but to be transformed (or compiled) into a readable form.
PCL
FIXME:
PFA file
PostScript Font in ASCII format. This file can be directly down loaded to provide support for another font.
PFB file
PostScript Font in Binary format. In PFA files there are long sequences of hexadecimal digits. Here these digits are represented by their value, hence compressing 2 characters in a PFA into 1 in the PFB. This is the only advantage since a PFB file cannot be directly sent to printer: it must first be decompressed (hence turned into a PFA file) before being used.
PostScript
PostScript is a page description language designed for Raster output devices. It is even more powerful than that: unlike to HTML, or roff, but as TeX and LaTeX, it is truly a programming language which main purpose is to draw (on sheets). Most programs are a list of instructions that describes lines, shades of gray, or text to draw on a page. This is the language that most printers understand. Note that the fact that PostScript is a programming language is responsible of both its success and its failure. It is a big win for the PostScript programmer who can easily implement a lot of nice visual effects. It is a big loss because the page descriptions can have an arbitrary complexity, hence rendering can be really slow (remember the first Laser you had, or even GhostScript. PDF has been invented by Adobe to remedy these problems). PostScript is a trademark of Adobe Systems Incorporated.
PPD file
PostScript Printer Description file. These files report everything one needs to know about a printer: the known fonts, the patches that should be down loaded, the available memory, the trays, the way to ask it duplex printing, the supported media, etc. PostScript has pretended to be a device independent page description language, and the PPD files are here to prove that device independence was a failure.
ProcSet
Set of (PostScript) procedures.
Prologue
PostScript being a language, a typical PostScript program (i.e. a typical PostScript file) consists of two parts. The first part is composed of resources, such as fonts, procsets, etc. and the second part of calls to these procedures. The first part is called the prologue, and the second, the script.
P-rule
Pretty printing rule. It is composed of a left-hand side, (lhs for short), and a right-hand side, (rhs). The lhs describes when the rule is triggered (i.e., the pattern of text to match), and the rhs specifies the pretty printed output. See section P-Rules, for more semantical details, and see section Syntax for the P-Rules, for implementation.
psutils
The @href{http://www.dcs.ed.ac.uk/home/ajcd/psutils/index.html, psutils} is a set of tools for PostScript post processing written by @href{http://www.dcs.ed.ac.uk/home/ajcd/, Angus Duggan}. They let you resize the frame into which the page is drawn, reorder or select pages, put several pages onto a single sheet, etc. To allow the psutils to run correctly, the PostScript files must be DSC conformant, and the bad news is that many PostScript drivers produce files which are not. For some common cases (e.g., Micro$oft tools), Angus Duggan included in the package some tools (named fix...ps) to fix typical problems. fixps is a collection of recipes on when to run what fix tool.
Raster Output Device
Behind these words is hidden the general class of devices which have Pixels that can be addressed individually: Laser, Ink or Dot printers, but also regular screens etc. It is typically opposed to the class of devices which plot, i.e., have a pen that they move on the paper.
rhs
right hand side
See P-rule.
Script
See Prologue.
Sheet
The physical support of the printing: it may support one or two pages, depending on your printing options.
Style sheet
Set of rules used by @pack to give a face to the strings of a file. In @pack{}, each programming language which is supported is defined via one style-sheet.
Virtual page
Area on a physical page in which @pack draws the content of a file. There may be several virtual pages on a physical page.

Genesis

Here are some words on @pack and its history.

History

The initial version was a shell program written by Evan Kirshenbaum. It was very slow and contained many bugs.

A new version was written in C by Miguel Santana to improve execution speed and portability. Many new features and improvements have been added since this first version. Many contributions (changes, fixes, ideas) were done by @pack users in order to improve it.

From the latest version from Miguel Santana (4.3), Emmanuel Briot implemented bold faces for keywords in Ada, C and C++.

From that version, Akim Demaille generalized the pretty-printing capabilities, implemented more languages support, and other features.

Contributors

Since the very beginning of @pack{}, many people have brought help:

Translators

Some people worked on the translation of @pack{}:

Thanks

Patrick Andries, from @href{http://www.alis.com/,Alis Technologies inc.} and Roman Czyborra (see his @href{http://wwwwbs.cs.tu-berlin.de/~czyborra/, home page}), provided us with important information on encodings. We strongly recommend that you go and read these pages: there is a lot to learn.

Juliusz Chroboczek worked a lot on the integration of the products of Ogonkify (such as Latin 2 etc. fonts) in @pack{}. Without his help, and the time is devoted to both @pack and ogonkify, many non west-European people would still be unable to print easily texts written in their mother tongue.

Denis Girou brought a constant and valuable support through out the genesis of pretty-printing @pack{}. His comments on both the program and the documentation are the origin of many pleasant features (such as `--prologue').

Copying

The subroutines and source code in the @pack package are "free"; this means that everyone is free to use them and free to redistribute them on a free basis. The @pack{}-related programs are not in the public domain; they are copyrighted and there are restrictions on their distribution, but these restrictions are designed to permit everything that a good cooperating citizen would want to do. What is not allowed is to try to prevent others from further sharing any version of these programs that they might get from you.

Specifically, we want to make sure that you have the right to give away copies of the programs that relate to @pack{}, that you receive source code or else can get it if you want it, that you can change these programs or use pieces of them in new free programs, and that you know you can do these things.

To make sure that everyone has such rights, we have to forbid you to deprive anyone else of these rights. For example, if you distribute copies of the @pack{}-related code, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must tell them their rights.

Also, for our own protection, we must make certain that everyone finds out that there is no warranty for the programs that relate to @pack{}. If these programs are modified by someone else and passed on, we want their recipients to know that what they have is not what we distributed, so that any problems introduced by others will not reflect on our reputation.

The precise conditions of the licenses for the programs currently being distributed that relate to @pack are found in the General Public Licenses that accompany them.

Concept Index

%

  • `%!'
  • .

  • `.a2ps'
  • .afm
  • .edf
  • .map
  • .pfa
  • .pfb
  • :

  • `:'
  • a

  • `a2psrc'
  • Adobe
  • AFM, AFM
  • Agus Duggan
  • Alphabets
  • `AppendLibraryPath:'
  • b

  • Bug
  • c

  • Charset
  • Code Set
  • Command line options
  • Configuration Files
  • Copying
  • d

  • `DefaultPrinter:'
  • Delegate
  • `Delegation:'
  • Delegations
  • display
  • Document Structuring Conventions
  • DSC
  • e

  • EDF
  • elm
  • Encoding, Encoding
  • Escape
  • Escapes
  • Exit status
  • f

  • Face, Face
  • file
  • g

  • GhostScript
  • h

  • Headers
  • Headings
  • k

  • Key
  • key
  • Keyword
  • l

  • lhs
  • Library files
  • `LibraryPath:'
  • Logical page
  • m

  • make_fonts_map.sh
  • Map files
  • Markers
  • Medium
  • `Medium:'
  • n

  • Non PostScript printers
  • o

  • Operator
  • Optional entries
  • Options
  • `Options:'
  • `OutputFirstLine:', `OutputFirstLine:'
  • p

  • P-Rule
  • P-rule
  • Page
  • Page Description Language
  • Page device
  • Page prefeed
  • Page Range
  • `PageLabelFormat:'
  • PCL
  • PFA file
  • PFB file
  • pine
  • PostScript
  • PPD file
  • `PrependLibraryPath:'
  • PreScript
  • Pretty printing
  • `Printer:'
  • ProcSet
  • Prologue, Prologue
  • psutils
  • r

  • Raster Output Device
  • Regular expression
  • rhs
  • Rule
  • s

  • Script
  • Separator
  • Sequences
  • setpagedevice
  • Sheet
  • `sheets.map'
  • statusdict
  • Style sheet, Style sheet
  • Symbol conversion
  • t

  • `TemporaryDirectory:', `TemporaryDirectory:'
  • u

  • Under lay
  • `UnknownPrinter:'
  • `UserOption:'
  • v

  • Variable
  • `Variable:'
  • Virtual page
  • void
  • w

  • Water mark
  • Function Index

    a

  • a2ps_close_input_session
  • a2ps_close_output_session
  • a2ps_job_new
  • a2ps_new_input_session
  • a2ps_open_output_session
  • a2ps_print_buffer
  • a2ps_print_char
  • a2ps_print_string
  • a2ps_read_config
  • a2ps_read_sys_config

  • Footnotes

    (1)

    A classical Unix trick to make the difference between the option `-2', and the file `-2' is to type `./-2'.

    (2)

    Basically it means the the PostScript that a2ps generates is really modular. In other words, any kind of post-processing may be applied to the files it produced.

    (3)

    That is to say, there are no PostScript printers that don't understand these files.

    (4)

    Current a2ps only handles PostScript output, i.e. out=`ps'

    (5)

    Because hiding its use into a2ps just makes it even more difficult to the users to know why it failed. Let them use it at hand.


    This document was generated on 20 June 1998 using the texi2html translator version 1.51a.