summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/pseudo/README.md
blob: 90df5792f4e2416d47e0d5caa34dac043fd96ca5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
# pseudo.sty

The **pseudo** package permits writing pseudocode without much fuss and with
quite a bit of configurability. Its main environment combines aspects of
`enumeration`, `tabbing` and `tabular` for nonintrusive line numbering,
indentation and highlighting, and there is functionality for typesetting
common syntactic elements such as keywords, identifiers and comments.

The package is written by [Magnus Lie Hetland](mailto:mlh@ntnu.no) and
released under the [MIT license](LICENSE).

## Using pseudo

You can find more detailed instructions in [the
documentation](doc/pseudo.pdf), but it's really quite simple to get started.
The package is [available via CTAN](https://ctan.org/pkg/pseudo), and so is
part of several TeX distributions. If the newest version isn't in yours, try
to run an update. In TeX Live, for example, you could run use the [TeX Live
Utility](http://amaxwell.github.io/tlutility/) (part of distributions such as
[MacTeX](https://tug.org/mactex/)). Alternatively, you can just download the
[pseudo.sty](pseudo.sty) file and drop it where your `latex` can find it
(possibly just in the same directory as your document).

Assuming you want numbered lines (the default) and have most text set as
keywords (set by the `kw` switch), you simply import **pseudo** using

```tex
\usepackage[kw]{pseudo}
```

and then set your pseudocode in a `pseudo` environment. Lines are terminated
by the normal `\\` command, which may be extended with one or more pluses or
minuses to indicate a change in indentation level. You suppress the automatic
numbering of the following line using a star (i.e., either `\\*`, or
`\begin{pseudo}*`), and can typeset a procedure header using `\hd{Name}(...)`.
For [example](https://mipmip.org/tidbits/pasa.pdf):

```tex
\begin{pseudo}*

    \hd{Backward}(V, E, v, i) \\

    $v.\id{label} = i$ \\

    for $(u,v)\in E$ \\+
        if $0 < v.\id{label} < i$ \\+
            \pr{Backward}(V, E, u, i) \\--

    for $(u,v)\in E$ \\+
        if $u.\id{label} \== 0$ \\+
            \pr{Backward}(V, E, u, i+1)

\end{pseudo}
```

This produces:

<img src="doc/fig/readmefig.svg"/>

There is also a starred version of the environment (`pseudo*`), which
is unnumbered.

The commands `\pr` and `\id` indicate procedure calls and identifiers.
If we hadn't used the `kw` option, the main text would not be set as keywords,
but as plain text. We could then use `\kw` to mark up keywords. Some of these
may be used a lot, so I might want to declare a shortcut. For example, if
I use

```tex
\DeclarePseudoKeyword \While {while}
```

I'd be able to use `\While` rather than `\kw{while}` later. Several such
formatting and declaration commands exist:

| Type of text | Command             | Declaration                                     |
| ------------ | ------------------- | ----------------------------------------------- |
| Keywords     | `\kw{while}`        | `\DeclarePseudoKeyword \While {while}`          |
| Constants    | `\cn{false}`        | `\DeclarePseudoConstant \False {false}`         |
| Identifiers  | `\id{rank}`         | `\DeclarePseudoIdentifier \Rank {rank}`         |
| Strings      | `\st{Hello!}`       | `\DeclarePseudoString \Hello {Hello!}`          |
| Procedures   | `\pr{Euclid}(a, b)` | `\DeclarePseudoProcedure \Euclid {Euclid}`      |
| Functions    | `\fn{length}(A)`    | `\DeclarePseudoFunction \Length {length}`       |
| Comments     | `\ct{Important!}`   | `\DeclarePseudoComment \Important {Important!}` |

For normal text (e.g., when using the `kw` switch), there is also `\tn` (along
with `\DeclarePseudoNormal`).

Since the short names of these commands are prone to collisions with other
packages, **pseudo** won't insist on using them. If you import **pseudo**
*after* some other package that already uses, say, `\id`, then **pseudo**
won't define it. All of these are still available with the `pseudo` prefix,
however (e.g., `\pseudoid`), and the declaration commands still work.

Beyond the styling of text, there are also the `\==` and `\..` commands
(also written `\eqs` and `\dts`) for typesetting double equals sign and double
dots.

This covers most of the core functionality, but there are also more obscure
features (such as dimming or highlighting lines) and a host of configuration
keys for getting the pseudocode looking more like you'd want it to. For
details, consult [the documentation](doc/pseudo.pdf).