FiXme – Collaborative annotation tool for L^{A}TEX^{∗}

Didier Verna

          mailto:didier@didierverna.net
        http://www.lrde.epita.fr/~didier/
                v4.5 (2019/01/03)

Abstract

FiXme is a collaborative annotation tool for L^{A}TEX documents. Annotating a document here refers to inserting meta-notes, that is, notes that do not belong to the document itself, but rather to its development or reviewing process. Such notes may involve things of different importance levels, ranging from simple “fix the spelling” flags to critical “this paragraph is a lie” mentions. Annotations like this should be visible during the development or reviewing phase, but should normally disapear in the final version of the document.

FiXme is designed to ease and automate the process of managing collaborative annotations, by offering a set of predefined note levels and layouts, the possibility to register multiple authors, to reference annotations by listing and indexing etc. FiXme is extensible, giving you the possibility to create new layouts or even complete “themes”, and also comes with support for AUCTEX.

The FiXme package is Copyright \begin{matrix}c \\ ◯ \end{matrix} 1998–2002, 2004–2007, 2009, 2013, 2017-2019 Didier Verna, and distributed under the terms of the LPPL license.

Contents

1 Installation 4 1.1 Extraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 1.2 TDS-compliant layout . . . . . . . . . . . . . . . . . . . . . . . . . 5 1.3 AUCTEX support . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2 Features summary 5

3 Using FiXme 6

3.1 Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.1.1 Requirements . . . . . . . . . . . . . . . . . . . . . . . . . . 6 3.1.2 Loading the package . . . . . . . . . . . . . . . . . . . . . . 6 3.1.3 Global setup modification . . . . . . . . . . . . . . . . . . . 6 3.1.4 Local setup modification . . . . . . . . . . . . . . . . . . . . 6

FiXme v4.5 (2019/01/03)

3.2 Inserting FiXme notes . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.2.1 Commands . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.2.2 Targeted commands . . . . . . . . . . . . . . . . . . . . . . 7 3.2.3 Environments . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.2.4 Targeted environments . . . . . . . . . . . . . . . . . . . . . 7

∗FiXme homepage: http://www.lrde.epita.fr/~didier/software/latex.php#fixme

3.3 List of FiXme’s . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 3.4 Controlling the behavior of FiXme . . . . . . . . . . . . . . . . . . 8 3.5 Controlling the layout of annotations . . . . . . . . . . . . . . . . . 8

3.5.1 Selecting a layout . . . . . . . . . . . . . . . . . . . . . . . . 8 3.5.2 Built-in vs. external layouts . . . . . . . . . . . . . . . . . . 9 3.5.3 Available layouts . . . . . . . . . . . . . . . . . . . . . . . . 10 3.5.4 Inner layout . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 3.5.5 Other common layout problems . . . . . . . . . . . . . . . . 12

3.6 Corollary: floating annotations . . . . . . . . . . . . . . . . . . . . 13 3.7 Controlling the layout of environments . . . . . . . . . . . . . . . . 13

3.7.1 Selecting a layout . . . . . . . . . . . . . . . . . . . . . . . . 14 3.7.2 Built-in vs. external layouts . . . . . . . . . . . . . . . . . . 14 3.7.3 Available layouts . . . . . . . . . . . . . . . . . . . . . . . . 14

3.8 Controlling the layout of targets . . . . . . . . . . . . . . . . . . . 15 3.8.1 Selecting a layout . . . . . . . . . . . . . . . . . . . . . . . . 15 3.8.2 Built-in vs. external layouts . . . . . . . . . . . . . . . . . . 15 3.8.3 Available layouts . . . . . . . . . . . . . . . . . . . . . . . . 16

3.9 Faces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.9.1 Setting face values . . . . . . . . . . . . . . . . . . . . . . . 16 3.9.2 Available faces . . . . . . . . . . . . . . . . . . . . . . . . . 17

3.10 Controlling the logging of annotations . . . . . . . . . . . . . . . . 17 3.11 Controlling the language of FiXme . . . . . . . . . . . . . . . . . . 18

3.11.1 Available languages . . . . . . . . . . . . . . . . . . . . . . 18 3.11.2 Language tracking . . . . . . . . . . . . . . . . . . . . . . . 18 3.11.3 Indexing in different languages . . . . . . . . . . . . . . . . 18

3.12 Standalone or collaborative mode . . . . . . . . . . . . . . . . . . . 18 3.12.1 Standalone mode . . . . . . . . . . . . . . . . . . . . . . . . 19 3.12.2 Collaborative mode . . . . . . . . . . . . . . . . . . . . . . 19

3.13 Themes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.13.1 Using themes . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.13.2 Available themes . . . . . . . . . . . . . . . . . . . . . . . . 21

4 Extending FiXme 22

4.1 Modifying existing layouts . . . . . . . . . . . . . . . . . . . . . . . 22 4.1.1 Modifying existing annotation layouts . . . . . . . . . . . . 22 4.1.2 Modifying existing environment layouts . . . . . . . . . . . 22 4.1.3 Modifying existing target layouts . . . . . . . . . . . . . . . 22

4.2 Creating new layouts . . . . . . . . . . . . . . . . . . . . . . . . . . 22 4.2.1 Registering a new annotation layout . . . . . . . . . . . . . 23 4.2.2 Registering a new environment layout . . . . . . . . . . . . 24 4.2.3 Registering a new target layout . . . . . . . . . . . . . . . . 24

4.3 Adding new options . . . . . . . . . . . . . . . . . . . . . . . . . . 24 4.4 Creating a new theme . . . . . . . . . . . . . . . . . . . . . . . . . 25 4.5 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

5 History 26 6 Implementation 28

6.1 Preamble . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 6.2 Utilities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28

6.2.1 Miscellaneous . . . . . . . . . . . . . . . . . . . . . . . . . . 28 6.2.2 Key-value management (xkeyval) . . . . . . . . . . . . . . 29

6.3 List macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 6.3.1 Contents lines . . . . . . . . . . . . . . . . . . . . . . . . . . 30 6.3.2 List headers . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 6.3.3 Status/class-dependent implementation . . . . . . . . . . . 32

6.4 Faces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.5 Annotation layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

6.5.1 Layout modes . . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.5.2 Layout creation . . . . . . . . . . . . . . . . . . . . . . . . . 33 6.5.3 Standard textual dispositions . . . . . . . . . . . . . . . . . 34 6.5.4 Built-in layouts . . . . . . . . . . . . . . . . . . . . . . . . . 35 6.5.5 Layout loading . . . . . . . . . . . . . . . . . . . . . . . . . 37 6.5.6 Layout control . . . . . . . . . . . . . . . . . . . . . . . . . 37

6.6 Environment Layouts . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.6.1 Layout creation . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.6.2 Built-in layouts . . . . . . . . . . . . . . . . . . . . . . . . . 38 6.6.3 Layout selection . . . . . . . . . . . . . . . . . . . . . . . . 39 6.6.4 Layout loading . . . . . . . . . . . . . . . . . . . . . . . . . 39 6.6.5 Layout control . . . . . . . . . . . . . . . . . . . . . . . . . 40

6.7 Target Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 6.7.1 Layout creation . . . . . . . . . . . . . . . . . . . . . . . . . 40 6.7.2 Built-in layouts . . . . . . . . . . . . . . . . . . . . . . . . . 40 6.7.3 Layout selection . . . . . . . . . . . . . . . . . . . . . . . . 41 6.7.4 Target layout loading . . . . . . . . . . . . . . . . . . . . . 41 6.7.5 Target layout control . . . . . . . . . . . . . . . . . . . . . . 41 6.7.6 Status-dependant versions . . . . . . . . . . . . . . . . . . . 41

6.8 Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 6.8.1 Logging macros . . . . . . . . . . . . . . . . . . . . . . . . . 41 6.8.2 Logging control . . . . . . . . . . . . . . . . . . . . . . . . . 42

6.9 FiXme notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 6.9.1 Note parameters . . . . . . . . . . . . . . . . . . . . . . . . 42 6.9.2 Layout dispatch . . . . . . . . . . . . . . . . . . . . . . . . 43 6.9.3 Status-dependent implementation . . . . . . . . . . . . . . . 44 6.9.4 Standard version . . . . . . . . . . . . . . . . . . . . . . . . 44 6.9.5 Starred version . . . . . . . . . . . . . . . . . . . . . . . . . 45 6.9.6 User-level interface generation . . . . . . . . . . . . . . . . . 45

6.10 FiXme environments . . . . . . . . . . . . . . . . . . . . . . . . . . 46 6.10.1 Status-dependent implementation . . . . . . . . . . . . . . . 46 6.10.2 Standard versions . . . . . . . . . . . . . . . . . . . . . . . 46 6.10.3 Starred versions . . . . . . . . . . . . . . . . . . . . . . . . 47 6.10.4 User-level interface generation . . . . . . . . . . . . . . . . . 47

6.11 FiXme authors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 6.12 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

6.12.1 Language definitions . . . . . . . . . . . . . . . . . . . . . . 48 6.12.2 Language tracking . . . . . . . . . . . . . . . . . . . . . . . 50 6.12.3 Language options . . . . . . . . . . . . . . . . . . . . . . . . 50

6.12.4 Language abstraction layer . . . . . . . . . . . . . . . . . . 51 6.13 Document status processing . . . . . . . . . . . . . . . . . . . . . . 51 6.14 Theme support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 6.15 Finale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

6.15.1 Class-dependent settings . . . . . . . . . . . . . . . . . . . . 52 6.15.2 Options Processing . . . . . . . . . . . . . . . . . . . . . . . 52 6.15.3 The \fxsetup macro . . . . . . . . . . . . . . . . . . . . . . 53 6.15.4 FiXme summary . . . . . . . . . . . . . . . . . . . . . . . . 53

A External Layouts 54

A.1 Annotation layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 A.1.1 The marginnote layout . . . . . . . . . . . . . . . . . . . . 54 A.1.2 The pdfnote layout . . . . . . . . . . . . . . . . . . . . . . 54 A.1.3 The pdfmargin layout . . . . . . . . . . . . . . . . . . . . . 54 A.1.4 The pdfsignote layout . . . . . . . . . . . . . . . . . . . . 55 A.1.5 The pdfsigmargin layout . . . . . . . . . . . . . . . . . . . 55 A.1.6 The pdfcnote layout . . . . . . . . . . . . . . . . . . . . . . 56 A.1.7 The pdfcmargin layout . . . . . . . . . . . . . . . . . . . . 56 A.1.8 The pdfcsignote layout . . . . . . . . . . . . . . . . . . . . 57 A.1.9 The pdfcsigmargin layout . . . . . . . . . . . . . . . . . . 58

A.2 Environment layouts . . . . . . . . . . . . . . . . . . . . . . . . . . 58 A.2.1 The color layout . . . . . . . . . . . . . . . . . . . . . . . . 58 A.2.2 The colorsig layout . . . . . . . . . . . . . . . . . . . . . . 59

A.3 Target Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 A.3.1 The changebar layout . . . . . . . . . . . . . . . . . . . . . 60 A.3.2 The color layout . . . . . . . . . . . . . . . . . . . . . . . . 60 A.3.3 The colorcb layout . . . . . . . . . . . . . . . . . . . . . . 60

B Themes 61 B.1 The signature theme . . . . . . . . . . . . . . . . . . . . . . . . . 61 B.2 The color theme . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 B.3 The colorsig theme . . . . . . . . . . . . . . . . . . . . . . . . . . 63

1 Installation

1.1 Extraction

If you are building FiXme from the tarball you need to execute the following steps in order to extract the necessary files. FiXme also requires the DoX package (version 2.0, release date 2009/09/21 or later), to build. It is not required to use the package.

[pdf]latex fixme.ins
[pdf]latex fixme.dtx
[pdf]latex fixme.dtx
makeindex -s gind fixme.idx
[pdf]latex fixme.dtx
[pdf]latex fixme.dtx

After that, you need to install the generated documentation and style files to a location where L^{A}TEX can find them.

1.2 TDS-compliant layout

For a TDS-compliant layout, the following locations are suggested:

 [TEXMF]/tex/latex/fixme/fixme.sty
 [TEXMF]/tex/latex/fixme/layouts/fxlayout*.sty
 [TEXMF]/tex/latex/fixme/layouts/env/fxenvlayout*.sty
 [TEXMF]/tex/latex/fixme/layouts/target/fxtargetlayout*.sty
 [TEXMF]/tex/latex/fixme/themes/fxtheme*.sty
 [TEXMF]/doc/latex/fixme/fixme.[pdf|dvi]

1.3 AUCTEX support

AUCTEX is a powerful major mode for editing TEX documents in Emacs. In particular, it provides automatic completion of command names once they are known. FiXme supports AUCTEX by providing a style file named fixme.el which contains AUCTEX definitions for the relevant commands. This file should be installed in a place where AUCTEX can find it (usually in a subdirectory of your L^{A}TEX styles directory). Please refer to the AUCTEX documentation for more information on this.

2 Features summary

If you’re new to FiXme, you might be interested in a brief summary of the features it provides. Otherwise, you may only take a look at the History section (section 5 on page 26) to see what’s new.

Annotation levels FiXme annotations may be of four different importance levels, ranging from simple not-so-important notices to critical things that must absolutely be fixed in the final version.

Layouts and themes FiXme gives you full and extensible control on the layout of these annotations: they can be displayed inline, as marginal paragraphs, as footnotes and also in any kind of user-defined way. All these “layouts” may be combined together. FiXme also comes with support for “themes”, globally modifying existing layouts, or providing new ones.

Annotation targets Annotations may be “targeted” to a specific portion of text that will be highlighted, and on the contrary “floating” around, in which case they may even appear in the document’s preamble.

Listing and indexing Annotations may be indexed and summarized in a “list of fixmes”.

Logging Annotations are recorded in the log file, and (depending on their importance level) some of them are displayed on the terminal during compilation. A final summary is also created at the end of the compilation process.

Modes All these features are actually available when you’re working in draft mode. In final mode, the behavior is slightly different: any remaining critical note generates an error (the compilation aborts), while non critical ones are just removed from the document’s body (they’re still recorded in the log file though).

Authoring FiXme provides support for collaborative annotating by allowing you to “register” several authors.

Internationalization FiXme currently supports 7 different languages and features automatic language tracking for multilingual documents.

3 Using FiXme

3.1 Initialization

3.1.1 Requirements

In order to work properly, FiXme requires the presence of some L^{A}TEX packages. You don’t have to load them explicitly though. As long as L^{A}TEX can locate them, they will be used automatically. FiXme currently depends on xspace, ifthen, verbatim and xkeyval (version 2.5f, release date 2006/11/18 or later).

3.1.2 Loading the package

In order to load FiXme, simply say \usepackage[⟨options⟩]{fixme} in the preamble of your document. There is an important number of options that you can use in order to customize FiXme’s default or global behavior. These options will be discussed when appropriate.

There might be times where you would like to use L^{A}TEX commands in package options (for example, see section 3.9 on page 16). In such a case, you should know that L^{A}TEX normally can’t handle this. In order to make it work, you need to use the xkvltxp package first, like this:

 \usepackage{xkvltxp}
 \usepackage[myoption=\mymacro]{fixme}

3.1.3 Global setup modification

\fxsetup  {⟨options⟩}

Another way of customizing FiXme’s global behavior is to use the \fxsetup command. \fxsetup understands the same options as the package itself and can be used in the preamble as well as in the document’s body.

3.1.4 Local setup modification

Finally, note that unless specified otherwise, all package options are also understood by the annotation commands or environments described in section 3.2 on page 7. The effect is then local to that particular command.

3.2 Inserting FiXme notes

3.2.1 Commands

\fxnote [⟨options⟩]{⟨note⟩}

\fxwarning
\fxerror
\fxfatal

FiXme provides four annotation commands corresponding to different levels of importance (notes, warnings, errors and fatal errors). \fxfatal is a bit different from the other ones, as will be explained in section 3.4 on page 8.

\fixme Warning: as of version 4, the \fixme command is a synonym for \fxfatal and is considered deprecated.

3.2.2 Targeted commands

\fxnote* [⟨options⟩]{⟨note⟩}{⟨text⟩}

\fxwarning*
\fxerror*
\fxfatal*

Sometimes, you might not only want to issue a FiXme note, but also highlight the relevant part of the text to which it applies. This is what I call “targeting” the annotation. As of version 4, FiXme provides starred versions of its annotation commands to do that. In star form, these commands expect an additional mandatory argument containing the text to be highlighted.

3.2.3 Environments

Warning: as of version 4.0, the environment interface has changed and is not backward-compatible.

anfxnote [⟨options⟩]{⟨summary⟩}

anfxwarning
anfxerror
anfxfatal

FiXme annotations are normally meant to be short: consider that they are likely to go in the list of fixmes and in the index for instance. If you feel the need for writing longer comments, the environments described below might come in handy. FiXme provides four annotation environments; one for every note level. These environments take one mandatory argument (meant to be a short summary of the long note) and behave in exactly the same way as their command counterpart. The layout policy is a bit different though (see section 3.5 on page 8): the environment’s contents will always appear inline, and the ⟨summary⟩ will obey all active annotation layouts except for the inline one, just as if it had been passed to one of the FiXme annotation commands described in the previous section.

afixme Warning: as of version 4, the afixme environement is a synonym for anfxfatal, and is considered deprecated.

3.2.4 Targeted environments

anfxnote* [⟨options⟩]{⟨summary⟩}{⟨text⟩}

anfxwarning*
anfxerror*
anfxfatal*

FiXme environments can also be targeted to a specific portion of text. When using the starred version, the environments expect one additional mandatory argument: the text in question that will be highlighted.

3.3 List of FiXme’s

\listoffixmes FiXme remembers where you put your annotations in a toc-like file whose extension is lox. The \listoffixmes command generates the annotations lists in a manner similar to that of the “list of figures”. A standard layout is automatically selected for the article, report and book classes and the AMS ones. If loaded, FiXme will also use the tocbasic package which makes it compliant with the Koma-Script classes and any other document using it. If another class is used, the article layout is selected. Also, note that if there isn’t any annotation left in the document, this command doesn’t generate an empty list, but rather stays silent. It also stays silent in final mode, regardless of the presence of remaining annotations (see section 3.4 on page 8).

3.4 Controlling the behavior of FiXme

final The behavior of FiXme is controlled by the two standard options final and draft. draft These options are usually given to \documentclass which in turn passes them to

all packages. In addition, you can also use them as options to \usepackage, in the call to \fxsetup, and even to the annotation commands and environments.

In draft mode, annotations are recorded in the log file and appear in the document as specified by the layout settings (see section 3.5 on page 8). Additionally, warnings, errors and fatal errors are also displayed on the terminal.

In final mode, non fatal annotations (those generated by \fxnote, \fxwarning, \fxerror and their corresponding environments) are still logged, but they’re not typeset. On the other hand, fatal ones (those generated by the \fxfatal command and the anfxfatal environment) will throw a L^{A}TEX error and thus interrupt or abort compilation with an informative message. This will help you track down forgotten important caveats in your document.

Let me rephrase: final documents can only have FiXme notes, warnings, and (non fatal) errors left. Of course, this is not completely true: remember that these options are understood locally by all the annotation commands and environments, so even in final mode, you can use something like this:

 \fxfatal[draft]{bla bla}

status By default, FiXme is in final mode (L^{A}TEX itself behaves that way). If you’re manipulating the document status at the level of FiXme itself (as opposed to the \documentclass level), then the preferred way to do this is to use the status option, and give it the value final or draft.

3.5 Controlling the layout of annotations

Annotations can appear in several forms in your document. Each of these forms can be individually selected, or they can be combined together to some extend.

3.5.1 Selecting a layout

3.5.1.1 Individual control

For each annotation layout, there is a corresponding boolean option (for instance, the “inline” layout is controlled by the inline option). These options are understood by the package itself, the \fxsetup command and also locally by every annotation command or environment. There are some restrictions on their usage however, as discussed in the next section.

To activate a layout, use the option alone or give it a value of true. For instance, these two forms are equivalent:

 \fxnote[inline]{note...}
 \fxnote[inline=true]{note...}

For convenience, each layout option has a counterpart that deactivates the corresponding layout. The counterpart option has the same name, prefixed with no (for instance, noinline). Again, these options are understood by the package itself, the \fxsetup command and also locally by every annotation command or environment (with the same usage restrictions, discussed in the next section). For instance, these two forms are equivalent:

 \fxsetup{inline=false}
 \fxsetup{noinline}

3.5.1.2 Global control

layout An even more convenient way to specify the required layout is to use the layout morelayout and morelayout options. In fact, the use of individual control is considered more

or less deprecated. Both of these options take a comma-separated list of the individual options described above (this includes the no⟨option⟩ form as well).

While the morelayout option adds to the current layout configuration, the layout one completely overrides it. For instance, knowing that by default, only the margin layout is active, the following forms are all equivalent:

 \usepackage[nomargin,inline,index]{fixme}
 \usepackage[margin=false,inline=true,index=true]{fixme}
 \usepackage[morelayout={nomargin,inline,index}]{fixme}
 \usepackage[layout={inline,index}]{fixme}

Again, these two options are understood by the package itself, the \fxsetup command and also locally by every annotation command or environment (with the same usage restrictions, discussed in the next section).

\fxuselayouts  {⟨name,. . . ⟩}

Finally, an alternative way of selecting (or deselecting) several layouts simultaneously is to use the \fxuselayouts command, giving it a comma-separated list of layout options as its only, mandatory, argument.

3.5.2 Built-in vs. external layouts

Annotation layouts are provided either in the core of FiXme, or in separate files loaded dynamically on demand. Simple layouts are typically built-in, whereas those requiring additional packages are external, so that they don’t consume TEX resources if not used. As a consequence, selecting an external layout might involve loading the relevant file first.

For technical reasons, it is not possible to do such a thing outside the preamble, neither in the middle of processing \usepackage options. As a result, layout options are restricted and you have three possibilities for using an external layout:

Name  External Description

inline Display note inline margin Display note in the margin footnote Display note in a footnote index Display note in the index marginclue Display a marginal clue marginnote * Display non-floating note in the margin pdfnote * Display note as inline PDF comment pdfmargin * Display note as marginal PDF comment pdfsignote * Display signed note ala pdfnote

pdfsigmargin       *  Display signed note ala pdfmargin

pdfcnote * Display colored note ala pdfnote pdfcmargin * Display colored note ala pdfmargin

pdfcsignote        *  Display colored note ala pdfcsignote
pdfcsigmargin      *  Display colored note ala pdfsigmargin

Table 1: Available annotation layouts

1. Use its corresponding option in a call to \fxsetup in the preamble, like this: \fxsetup{⟨option⟩}. This will load it and select it immediately.

2. Use the \fxuselayouts command in the preamble like this:

\fxuselayouts{⟨name⟩}. This is strictly equivalent to the previous solution.

\fxloadlayouts  {⟨name,. . . ⟩}

3 If on the other hand you want to load one or several external layouts without using them immediately (perhaps in order to use them locally in some specific annotation), use the \fxloadlayouts command in the preamble like this: \fxloadlayouts{⟨name⟩,...}. After that, you can select any of those layouts anywhere you wish.

3.5.3 Available layouts

[no]inline Table 1 lists the annotation layouts currently distributed with FiXme.

[no]margin
[no]footnote
[no]index

By default, only the margin layout is active. Most of these layouts should be self-explanatory, but some precisions are given below.

3.5.3.1 marginclue

[no]marginclue If your preferred layout is inline or say, footnote, it might be somewhat difficult to localize the annotation on the page, especially its vertical position. That’s where marginal clues come into play. A marginal clue does not display the annotation’s contents, but only an indication that there is one at that (vertical) position. So you need to use another layout as well (again, typically inline or footnote) in order to get the actual annotation.

Obviously, the margin and margin clue layouts are mutually exclusive, so if you try to activate both, only the most recently activated one will be enabled (and you’ll get a notice in the log file and on the terminal).

3.5.3.2 marginnote

[no]marginnote The marginnote layout is an alternate (external) way to display annotations in the margin, using the eponymous package. Contrary to L^{A}TEX’s standard marginal paragraphs, the ones issued by marginnote are constructed in a non-floating way. This might be an advantage in some situations but marginnote also comes with some disadvantages of its own. For more information, please refer to marginnote’s documentation, and also read the next section. Also, note that it is not currently possible to pass options to the \marginnote command through this layout.

For a reasonably robust marginal layout accross all annotations, including those issued in floats, consider using marginnote in conjunction with innerlayout=noinline (see section 3.5.4 on page 11).

3.5.3.3 PDF comments

[no]pdfnote The PDF format comes with a concept of comment, which

[no]pdfmargin
[no]pdfsignote
[no]pdfsigmargin
[no]pdfcnote
[no]pdfcmargin
[no]pdfcsignote
[no]pdfcsigmargin

FiXme can use to display its own annotations. Support for PDF comments varies across PDF viewers. Acrobat Reader is usually considered a reference, and MacOS X’s Preview supports them reasonably well. The pdfnote and pdfmargin layouts use the pdfcomment package to display annotations as PDF inline or marginal comments.

The sig versions additionally display the author’s tag (see 3.12 on page 18) as a signature instead of as a prefix.

The versions with a c in their name (as in color) use one of four different colors named fx⟨level⟩ (according to the annotation’s importance level). They also avoid printing the annotation’s level since this information is already conveyed by the color.

3.5.4 Inner layout

There might be various reasons for you to change the layout locally for one particular annotation: creating a floating one is an example, see also section 3.5.5 on page 12 for some others. One frequent reason (described below) can be handled automatically by FiXme.

Remember that the default layout is to use margin paragraphs. Unfortunately, margin paragraphs are forbidden by TEX in several situations, like a figure’s caption for instance. If you try that, you will get a cryptic “Not in outer par mode” error message.

innerlayout The good news is that this situation can be detected automatically. FiXme provides an option named innerlayout that allows you to specify an alternative layout setting to use when TEX is in inner mode. In addition to that, FiXme automatically disables the margin and marginclue layouts. If you really want to use marginal paragraphs in inner mode, a good idea is then to set your inner layout to marginnote (see section 3.5.3.2).

Using innerlayout is not as trivial as it may seem: it really is an alternative layout configuration, and as such, you can use any combination you like of individual layout options, or you can even use the layout and morelayout options. This means that your alternative layout can either add to the existing one, or override it. Here are some examples to clarify things a little. You should try to understand them.

• By default, the FiXme inner layout is set to just inline. This can be simulated by the following call:

      \usepackage[layout=margin,innerlayout={layout=inline}]{fixme}

• The following happens to give the same result in our particular case, while having a different semantics:

      \usepackage[layout=margin,innerlayout=inline]{fixme}

• If you have set FiXme to use a safe layout globally (for instance, inline and index), and you want to use the same layout in inner mode, then you should provide an empty inner layout, like this:

      \fxsetup{layout={inline,index},innerlayout=}

What would happen if you didn’t provide the innerlayout option?

One final remark on the innerlayout option: this option is not processed immediately when you specify it, but instead, its value is stored and used only when needed. As a result, if you plan to use an external layout in inner mode (typically, marginnote) , you need to load it explicitely in the preamble first. Use

\fxloadlayouts for that.

3.5.5 Other common layout problems

This section describes some other common problems that people have encountered using FiXme. Although FiXme might not be directly responsible for them, it is still good to keep them in mind.

Annotations in captions being counted twice You are most likely using \listofsomething (figure, table, or any other kind of float). Note that a caption will be used twice here: once in the float itself, and once in the list of floats. Any FiXme annotation in the caption will consequently be generated twice as well. The solution to this problem is to use the optional argument to \caption, for example:

 \caption[caption text]{caption text\fxnote{yuck!}}

Footnotes and margin paragraphs in floats Using footnotes in figures (and a fortiori in a figure’s caption) does not work in general. Although there are some workarounds out there (for instance, using \footnotemark and \footnotetext directly), there is no completely reliable solution and it is not possible to detect that situation automatically. Similarly, marginal paragraphs will cause problems in a figure (even when not in its caption) because floats can’t be nested in L^{A}TEX. Usual symptoms of these situations are: a footnote not being typeset, compilation breakage with the “Floats lost” message etc. If you’re facing this problem, you need to change your layout locally.

Marginal paragraphs showing up on the wrong margin You want to look at the mparhack package.

ACM classes compatibility The ACM Sig classes (acm proc article-sp and sig-alternate) forbid the use of \marginpar, so if you use these classes, don’t forget to choose another layout for FiXme, and also avoid using marginal clues.

Annotation indexing Remember that some characters are special in an index entry (the ! for instance). FiXme currently does nothing to escape those characters, so avoid using them in your annotations.

3.6 Corollary: floating annotations

At some point, people suggested that it would be nice to have global annotations, not related to any portion of the text in particular. Such annotations could be general comments about the whole document, and could even be issued in the preamble. This is what I call “floating” annotations.

I know you don’t care, but originally, I started writing a new set of commands to do just that. However, with the flexibility that FiXme 4.0 provides, I quickly realized that such commands were an unnecessary addition.

Since floating anotations are not supposed to relate to any part of the text, they should not be typeset anywhere in it. This is especially true if you want to put some of them in the document’s preamble. However, even a preamble annotation could be recorded and displayed in the index or in the list of fixmes. And it turns out that you can specify all that with the layout options described in section 3.5 on page 8.

target The only remaining problem is the page number, which normally appears in the list of fixmes and in the index: if you choose to reference a floating annotation that way, the page number is likely to be completely meaningless. To compensate, a new option named target is provided. When used, the given value will replace the page number in both the index and the list of fixmes. The target can be anything you like, but should remain rather short. By default, target is set the special value thepage, which as you guessed means to use the page number.

The name ”target” bears an intentional resemblance to FiXme’s targeted commands and environments, because we are indeed targetting the annotation to something. The only difference is that in the case of floating annotations, the target is non-textual.

Here is an example of a floating annotation that would typically appear in the document’s preamble:

 \usepackage{hyperref}
 \fxfatal[layout=index,target=hyperref]{Fill in PDF fields (title etc.)}

3.7 Controlling the layout of environments

As discussed in section 3.2 on page 7, the contents of a FiXme environment (a longer annotation) always appears inline. However, the exact way this contents is typeset (in draft mode only) is subject to a layout of its own, called the “environment layout”.

3.7.1 Selecting a layout

envlayout The desired environment layout can be selected with the envlayout option. Contrary to the annotation layouts, only one environment layout can be active at a time. The envlayout option is understood by the package itself, the \fxsetup command and all the annotation environments (not the commands!). There are some restrictions on its usage however, as discussed in the next section.

\fxuseenvlayout  {⟨name⟩}

An alternative way of selecting an environment layout is to use the \fxuseenvlayout command, giving it the layout’s name as its only, mandatory, argument.

3.7.2 Built-in vs. external layouts

Environments layouts are provided either in the core of FiXme, or in separate files loaded dynamically on demand. Simple layouts are typically built-in, whereas those requiring additional packages are external, so that they don’t consume TEX resources if not used. As a consequence, selecting an external layout with the envlayout option might involve loading the relevant file first.

\fxloadenvlayouts  {⟨name,. . . ⟩}

For technical reasons, it is not possible to do such a thing outside the preamble, neither in the middle of processing \usepackage options. As a result, the envlayout option is restricted and you have three possibilities for using an external layout:

1. Use the envlayout option in a call to \fxsetup in the preamble, like this: \fxsetup{envlayout=name}. This will load it and select it immediately.

2. Use the \fxuseenvlayout command in the preamble like this:

\fxuseenvlayout{name}. This is strictly equivalent to the previous solution.

3. If on the other hand you want to load one or several environment layouts without using them immediately (perhaps in order to use them locally in some specific annotation), use the \fxloadenvlayouts command in the preamble like this: \fxloadenvlayouts{⟨name⟩,...}. After that, you can select any of those layouts anywhere you wish.

3.7.3 Available layouts

Table 2 lists the environment layouts currently distributed with FiXme.

plain • The plain environment layout prints its contents as-is, only in bold font (by default) in order to distinguish it from the surrounding text.

signature • The signature environment layout prints the author’s tag (see 3.12 on page 18) as a signature instead of as a prefix. This layout is used by the signature theme (see section 3.13 on page 21).

color • The color environment layout uses one of four colors named fx⟨level⟩ (ac-

fxnote
fxwarning
fxerror
fxfatal

cording to the annotation’s importance level) to display its contents. It also avoids printing the annotation level, since that information is already conveyed by the color. This layout is used by the color theme (see section 3.13 on page 21).

Name  External Description

plain Display contents as-is signature Display signed contents color * Display contents in color colorsig * Display signed contents in color

Table 2: Available environment layouts

colorsig • The colorsig environment layout combines the features of the signature and color ones. This layout is used by the colorsig theme (see section 3.13 on page 21).

3.8 Controlling the layout of targets

As discussed in section 3.2 on page 7, the starred versions of the FiXme annotation commands and environments let you highlight a portion of text which is relevant to the current annotation. The exact way this textual target is typeset (in draft mode only; otherwise it is typeset as-is) is subject to a layout of its own, called the “target layout”.

3.8.1 Selecting a layout

targetlayout The desired layout can be selected with the targetlayout option. Contrary to the annotation layouts, only one target layout can be active at a time. The targetlayout option is understood by the package itself, the \fxsetup command and all the starred versions of the annotation commands and environments. There are some restrictions on its usage however, as discussed in the next section.

\fxusetargetlayout  {⟨name⟩}

An alternative way of selecting a target layout is to use the \fxusetargetlayout command, giving it the layout’s name as its only, mandatory, argument.

3.8.2 Built-in vs. external layouts

Target layouts are provided either in the core of FiXme, or in separate files loaded dynamically on demand. Simple layouts are typically built-in, whereas those requiring additional packages are external, so that they don’t consume TEX resources if not used. As a consequence, selecting an external layout with the targetlayout option might involve loading the relevant file first.

\fxloadtargetlayouts  {⟨name,. . . ⟩}

For technical reasons, it is not possible to do such a thing outside the preamble, neither in the middle of processing \usepackage options. As a result, the targetlayout option is restricted and you have two possibilities for using an external layout:

1. Use the targetlayout option in a call to \fxsetup in the preamble, like this: \fxsetup{targetlayout=name}. This will load it and select it immediately.

2. Use the \fxusetargetlayout command in the preamble like this: \fxusetargetlayout{name}. This is strictly equivalent to the previous solution.

Name  External Description

plain Display target as-is

changebar * Display a vertical bar aside target color * Display target in color colorcb * Display a colored vertical bar aside target

Table 3: Available target layouts

3. If on the other hand you want to load one or several target layouts without using them immediately (perhaps in order to use them locally in some specific annotation), use the \fxloadtargetlayouts command in the preamble like this: \fxloadtargetlayouts{⟨name⟩,...}. After that, you can select any of those layouts anywhere you wish.

3.8.3 Available layouts

Table 3 lists the target layouts currently distributed with FiXme.

plain • The plain target layout displays its contents as-is, only in italics (by default) in order to distinguish it from the surrounding text.

changebar • The changebar target layout displays a vertical bar in the margin, on the side of the target text.

color • The color target layout uses the color named fxtarget to display the target fxtarget text. This layout is used by the color and colorsig themes (see section

3.13 on page 21).

colorcb • The colorcb target layout uses one of four colors named fx⟨level⟩ (according

fxnote
fxwarning
fxerror
fxfatal

to the annotation’s importance level) to display a colored vertical bar in the margin, on the side of the target text.

3.9 Faces

In the FiXme jargon, a “face” characterizes the visual aspect of some portion of text. If you’re familiar with the Emacs editor, this will come as no surprise to you. FiXme provides several faces that allow you to further customize the layout of annotations or their targets.

3.9.1 Setting face values

There are different ways to customize a face. The first one is to use the corresponding face option. For each face ⟨name⟩, their is a ⟨name⟩face option. For instance, the “inline” face is controlled by the inlineface option. Face options are understood by the package itself, the \fxsetup command and locally by all annotation commands or environments. Here is an example:

 \fxsetup{inlineface=\bfseries}

Since you will probably want to use L^{A}TEX commands in face values, you should know that L^{A}TEX normally can’t handle such commands in package options. If you want this to work, you need to use the xkvltxp package first, like this:

 \usepackage{xkvltxp}
 \usepackage[inlineface=\bfseries]{fixme}
\fxsetface  {⟨name⟩}{⟨value⟩}

Another way to customize a face is to use the \fxsetface command by providing the face name and the face value as two mandatory arguments. For example:

 \fxsetface{inline}{\bfseries}

3.9.2 Available faces

inline The inline face By default, the inline annotation layout displays its contents in bold font, to distinguish the note from the surrounding text. This is controlled by the inline face whose value is \bfseries by default.

margin The margin face By default, the margin and marginclue layouts display their contents in footnote size. This is controlled by the margin face whose value

is \footnotesize by default.

env The env face By default, the plain environment layout displays its contents in bold font, to distinguish it from the surrounding text. This is controlled by the env face whose value is \bfseries by default. The color and colorsig environment layouts honor this face as well, but reset it to ⟨nothing⟩ first. You should probably keep the same value for the inline and env faces, since they are both used to display annotations within the document’s body.

signature The signature face The signature environment layout honors the env face, and adds a signature face on top of it for the signature part. It is set to \itshape by default. The colorsig environment layout honors this face as well.

target The target face By default, the plain target layout displays its contents in italics, to distinguish it from the surrounding text. This is controlled by the target face whose value is \itshape by default. The changebar, color and colorcb target layouts honor this face as well, but reset it to ⟨nothing⟩ first.

3.10 Controlling the logging of annotations

As well as being displayed in the document itself, all annotations are “logged” in different ways: by default, simple notes are recorded in the log file while the others (warnings, errors and fatal errors) are also displayed on the terminal output during compilation.

[no]silent You have the ability to suppress logging altogether by using the silent option. This option is understood by the package itself, the \fxsetup command and all annotation commands and environments. Just as individual layout options, silent is a boolean option, so all those forms are possible: silent, equivalent to

silent=true, and nosilent, equivalent to silent=false (the default).

3.11 Controlling the language of FiXme

3.11.1 Available languages

english FiXme currently supports English (the default), French, Spanish, Italian, Ger-

french
francais
spanish
italian
german
ngerman
danish
croatian

man, Danish and Croatian. You can select your preferred language by using the corresponding language option. These options usually appear in the call to

\documentclass or \usepackage, but they are also understood by \fxsetup and

all the annotation commands or environments. This allows you to change the selected language either globally or locally, and at any point in the document. The french and francais options are synonyms. The german and ngerman options are currently equivalent.

If you’re manipulating language settings at the level of FiXme itself (as opposed

lang to the \documentclass level), then the preferred way to specify a language is to use the lang option, and give it the language name as a value. For instance:

 \usepackage[lang=french]{fixme}

3.11.2 Language tracking

langtrack If the document you’re working on has parts written in different languages, it might be the case that the annotations should follow the current language as well (especially if you’re in collaborative mode; see section 3.12 on page 18). FiXme provides a boolean option named langtrack. When specified, FiXme assumes that you’re using babel and automatically switches to the current language (as specified by babel’s \languagename command), without requiring an explicit language option.

defaultlang In the case where tracking falls on a language unsupported by FiXme, a warning will be issued and FiXme will switch to the language specified by the defaultlang option (english by default). If you happen to get one of these warnings, please consider sending me a patch with support for this new language (see section 6.12 on page 48).

Finally, note that specifying a language explicitely (by means of a language option) in the annotation commands and environments always takes precedence over the language tracking behavior.

3.11.3 Indexing in different languages

If your document contains annotations written in different languages, and you have requested the index layout, FiXme will not only classify the notes by their level of importance, but also by language. For example, if you have FiXme warnings in both English and French, you will find two different subcategories for warnings in the index: one called “Warnings” and one called “Avertissements”.

3.12 Standalone or collaborative mode

FiXme supports collaborative annotations as well as “standalone”, single-author documents.

3.12.1 Standalone mode

By default, FiXme is in standalone mode, meaning that it assumes there is only one person annotating the document. This has several implications on the layout. If you’ve tried it already, you may have noticed the following points.

• All the built-in annotation layouts (index excepted) put the FiXme logo in front of every note. This is also true for the environments. The idea is to distinguish FiXme contents from the rest of the document (for instance other marginal notes or footnotes).

• All annotations are indexed under the main FiXme category, and sorted by importance level, but the FiXme logo is not repeated constantly (that would be useless).

• Similarly, the list of fixmes does not clutter itself with the logo, because we already know that its contents is specific to FiXme.

As a matter of fact, when you see the FiXme logo appear somewhere, you’re not actually contemplating it, but rather the annotation’s author. It just happens that by default (meaning in standalone mode), the only author is FiXme itself.

author In standalone mode, you might be annoyed by this orgy of FiXme logos. This might happen if for instance you’re using the margin layout and you know there is nothing but FiXme annotations in there. In such a case, you will most likely want to change the author to nothing. This can be acomplished by using the author option, which is understood by the package itself, the \fxsetup command and all the annotation commands or environments. Doing something like the following will get rid of the damn logo for good:

 \usepackage[author=]{fixme}

3.12.2 Collaborative mode

If, on the other hand, you’re working in collaboration with other people, every potential “fixer” might want to tag his or her own annotations. So assuming that John Doe is another author, he would most likely do something like this:

 \fxfatal[author=JD]{rephrase this}

And suddenly, John’s fatal comment will be prefixed with his initials. This is not a very satisfactory solution however, because it would require you to explicitely provide the author’s tag in every single note you create. Fortunately, FiXme offers an easier way to achieve this.

3.12.2.1 Registering new authors

\FXRegisterAuthor {⟨cmdprefix⟩}{⟨envprefix⟩}{⟨tag⟩} The command \FXRegisterAuthor registers a new author with FiXme. It takes three arguments: the last one (⟨tag⟩) is just the same as the value you would pass to the author option: it will serve as a prefix (or signature) for John’s annotations. In addition to that, a complete new set of user-level commands (prefixed with ⟨cmdprefix⟩) and environments (prefixed with ⟨envprefix⟩) will be created. To clarify, suppose that we have registered John like this:

 \FXRegisterAuthor{jd}{ajd}{JD}

Now, John can use the commands \jdnote, \jdwarning etc., along with their starred versions, and he can also use the environments ajdnote, ajdwarning etc., along with their starred versions as well. If you really want to know the whole story, it turns out that the main FiXme interface described in section 3.2 on page 7 is created with this single line of code:

 \FXRegisterAuthor{fx}{anfx}{fixme}

Warning! ⟨cmdprefix⟩ and ⟨envprefix⟩ need to be different, or you will get very strange errors. The technical reason is that in L^{A}TEX, an environment named foo is defined in terms of two commands: \foo and \endfoo (yes, this is silly; the first one should really be \beginfoo). As a consequence, if you use the same prefix, you will get a name clash between the annotation commands and environments.

3.12.2.2 Fun with the author option

Some precisions about the author option are in order here. When a new author is registered with FiXme, the generated commands and environments work by presetting the author option to the specified ⟨tag⟩. This means that it is still possible to override it explicitely like this:

 \jdfatal[author=Anonymous]{For $500.00, you got your Ph.D.}

I don’t see any good reason for doing it though, the above example notwithstanding.

The final remark is about the default fx* user interface: the fixme default user is special in that it is the only registered user to honor a global author option (provided in the call to \usepackage or \fxsetup). The intended use of this is that the main author of the document uses the fx* interface (preferably with a personal author setting, different from the FiXme logo), and all other authors are

registered via \FXRegisterAuthor.

3.12.2.3 Globally switching to collaborative mode

We’re getting close, but we’re not quite there yet. Perhaps you would like to see the tags from the different authors in the list of fixmes, or even in the index? Remember that FiXme is in standalone mode by default, so the (only) tag does not appear in those places.

singleuser If you want this additional information, you’ve got to ask FiXme to globally switch

multiuser
mode

to collaborative mode. This can be done with either one of the three options

singleuser, mutliuser or mode. singleuser and multiuser are boolean op-

tions. The mode option takes a value of either singleuser or multiuser. This is the preferred way to switch the mode. These options are understood globally by \usepackage or \fxsetup, and also locally by the annotation commands or environments.

When collaborative mode is active, FiXme adjusts the list of fixmes layout to display the authors tags as well. Additionally, the annotations are indexed as before, but additional index entries, sorted by author, are generated as well.

3.13 Themes

Themes are orthogonal to layouts: they provide a way to modify the overall appearance of FiXme by overriding the existing layouts and/or by providing new ones. In fact, a theme can be any kind of customization that you would otherwise put in your preamble.

3.13.1 Using themes

theme The interface for using a theme is quite simple: use the theme option and give it the name of the theme you want to use. Themes are always external: there are none in the core of FiXme but instead they are provided as independent files. As a consequence, the theme option has the same usage restrictions as all the layout options we’ve encountered so far. Moreover, it is not possible to “maintain” several themes and switch between them in a single document. Themes can be loaded only in the preamble.

\fxusetheme  {⟨name⟩}

An alternative to the theme option is to use the \fxusetheme command, which takes the theme’s name as its only mandatory argument.

3.13.2 Available themes

FiXme comes with a number of predefined themes listed below.

3.13.2.1 The signature theme

signature This theme uses the signature environment layout (see section 3.7.3 on page 14), and overrides the built-in ones to display the author tags as a signature (i.e. at the end of the annotations) instead of as a prefix. All original layout faces are honored.

3.13.2.2 The color theme

color This theme uses the color environment and target layouts (see sections 3.7.3 on page 14 and 3.8.3 on page 16), and overrides the built-in ones to use different colors for the different annotation levels. As a consequence, it also avoids printing the annotation names because this information is already contained in the colors themselves. All original layout faces are honored, but the inline one is reset to ⟨nothing⟩. Remember that the env and target faces are reset as well (this is actually done by the color environment and target layouts).

3.13.2.3 The colorsig theme

colorsig This theme combines the features of the color and signature ones. All original layout faces are honored, but the inline one is reset to ⟨nothing⟩.

4 Extending FiXme

Hear hear, this is where you start spending more time hacking L^{A}TEX than actually writing your document…

4.1 Modifying existing layouts

FiXme annotations, environment and target layouts are implemented as a (set of) commands conforming to strict prototypes. If you’re not happy with the way they perform, you have the possibility to \renewcommand them (in fact, you should use \renewcommand* for annotation and environment layouts). In such a case, it is probably best to have a look at the code in order to figure out how the original ones are written. However, a description of their prototypes is given below.

4.1.1 Modifying existing annotation layouts

\FXLayout⟨name ⟩ {⟨type⟩}{⟨annotation⟩}{⟨author⟩} Each annotation layout is implemented as a macro taking three mandatory arguments. By convention, this macro is named \FXLayout⟨name⟩, for instance \FXLayoutInline. ⟨type⟩ is the annotation type. It can be one of note, warning, error and fatal. ⟨annotation⟩ is the annotation itself, and ⟨author⟩ is the author’s tag.

4.1.2 Modifying existing environment layouts

\FXEnvLayout⟨name ⟩Begin  {⟨type⟩}{⟨author⟩}
\FXEnvLayout⟨name ⟩End

Each environment layout is implemented as two macros taking two mandatory arguments. By convention, these macros are named \FXEnvLayout⟨name⟩Begin

and \FXEnvLayout⟨name⟩End, for instance \FXEnvLayoutPlainBegin and

\FXEnvLayoutPlainEnd. ⟨type⟩ is the annotation type. It can be one of note, warning, error and fatal. ⟨author⟩ is the author’s tag.

4.1.3 Modifying existing target layouts

\FXTargetLayout⟨name ⟩ {⟨type⟩}{⟨target⟩}

Each target layout is implemented as a macro taking two mandatory arguments. By convention, this macro is named \FXTargetLayout⟨name⟩, for instance \FXTargetLayoutPlain. ⟨type⟩ is the annotation type. It can be one of note, warning, error and fatal. ⟨target⟩ is the textual target.

4.2 Creating new layouts

Creating a new layout first requires that you write new layout macros as described in the previous section. Once you’ve done that, the next step is to make FiXme aware of this addition. This is called “registering” a layout.

4.2.1 Registering a new annotation layout

4.2.1.1 Early vs. late layouts

Normally, FiXme typesets your annotations at the current position in the text, using a sensible order for built-in layouts. For instance, the footnote layout, if active, is performed before the inline one, so that the footnote mark is sticked to the preceding text and not to the annotation. When using targeted commands or environments, the situation is a bit more complex: some layouts make more sense at the beginning of the textual target, and some others at the end. The former ones are called “early layouts” and the later ones are called “late layouts”. A typical example of an early layout is the margin one: if you’re highlighting a long portion of text, it is more convenient to see the marginal note appear near the top of that text, rather than near the end of it (a nice illustration of this is to combine the changebar target layout and margin annotation layout). As for built-in layouts, only the margin and marginclue ones are early. All others are late. When you create a new layout, you need to decide whether it is an early or a late one.

4.2.1.2 Registering late layouts

\FXRegisterLayout  [⟨mutex⟩]{⟨name⟩}{⟨macro⟩}

In order to register a late annotation layout with FiXme, use the command \FXRegisterLayout. This macro has two mandatory arguments: the layout ⟨name⟩ (at least 3 characters long) and the associated layout ⟨macro⟩. For instance, the inline layout is registered like this:

 \FXRegisterLayout{inline}{\FXLayoutInline}

Once registered, the new layout gets a boolean option ⟨name⟩ and is also recognized by the layout and morelayout options, as well as by the \fxuselayouts command as ⟨name⟩.

The first (optional) argument ⟨mutex⟩ is a comma-separated list of other layout names that should be in mutual exclusion with the layout we are registering (for example, the margin and marginclue layouts are in mutual exclusion). Note that mutual exclusion between two layouts need only be registered once. In other words, a previsouly registered layout will automatically be made aware of subsequent mutex declarations.

4.2.1.3 Registering early layouts

\FXRegisterLayout*  [⟨mutex⟩]{⟨name⟩}{⟨macro⟩}

In order to register an early annotation layout with FiXme, use the starred form of \FXRegisterLayout. Everything else behaves the same.

4.2.1.4 Providing a layout

\FXProvidesLayout {⟨name⟩}[⟨release information⟩] If you want to save your layout externally, you need to store it in a file named fxlayout⟨name⟩.sty and advertise it by calling \FXProvidesLayout. It will then be recognized by the \fxloadlayouts command as ⟨name⟩.

4.2.2 Registering a new environment layout

\FXRegisterEnvLayout  {⟨name⟩}{⟨begin⟩}{⟨end⟩}

In order to register a new environment layout with FiXme, use the command \FXRegisterEnvLayout. This macro has three mandatory arguments: the layout ⟨name⟩ and the associated ⟨begin⟩ and ⟨end⟩ macros. For instance, the color layout is registered like this:

 \FXRegisterEnvLayout{color}{\FXEnvLayoutColorBegin}{\FXEnvLayoutColorEnd}

Once registered, the new layout is recognized by the envlayout option and by the \fxuseenvlayout command as ⟨name⟩.

\FXProvidesEnvLayout {⟨name⟩}[⟨release information⟩] If you want to save your layout externally, you need to store it in a file named

fxenvlayout⟨name⟩.sty and advertise it by calling \FXProvidesEnvLayout. It

will then be recognized by the \fxloadenvlayouts commands as ⟨name⟩.

4.2.3 Registering a new target layout

\FXRegisterTargetLayout  {⟨name⟩}{⟨macro⟩}

In order to register a new target layout with FiXme, use the command \FXRegisterTargetLayout. This macro has two mandatory arguments: the layout ⟨name⟩ and the associated ⟨macro⟩. For instance, the color layout is registered like this:

 \FXRegisterTargetLayout{color}{\FXTargetLayoutColor}

Once registered, the new layout is recognized by the targetlayout option and by

the \fxusetargetlayout as ⟨name⟩.
\FXProvidesTargetLayout  {⟨name⟩}[⟨release information⟩]

If you want to save your layout externally, you need to store it in a file named

fxtargetlayout⟨name⟩.sty and advertise it by calling \FXProvidesTargetLayout.

It will then be recognized by the \fxloadtargetlayouts commands as ⟨name⟩.

4.3 Adding new options

Note: FiXme uses the xkeyval package for its underlying options management, so some knowledge of this package is required in order to understand the remainder of this section.

Yet another way to customize FiXme is to plug additional behavior in, by way of options. As of version 4.5, FiXme provides a convenient interface for creating new options, and associate them with code to execute.

First of all, new options must belong to a “family”, which essentially defines exactly where they make sense. FiXme currently provides three option families: Layout, EnvLayout, and TargetLayout. Obviously, these families allow you to define options that will affect the behavior of the corresponding three kinds of layouts.

For each family, FiXme provides five commands wrapping around xkeyval to define special kinds of options (keys in the xkeyval jargon). They are explained below.

\FXDefine⟨family ⟩Key {⟨key⟩}[⟨default⟩]{⟨function⟩}

Define an xkeyval ordinary ⟨key⟩ belonging to ⟨family⟩.

\FXDefine⟨family ⟩CmdKey [⟨mp⟩]{⟨key⟩}[⟨default⟩]{⟨function⟩}

Define an xkeyval command ⟨key⟩ belonging to ⟨family⟩.

\FXDefine⟨family ⟩ChoiceKey {⟨key⟩}[⟨bin⟩]{⟨alternatives⟩}[⟨default⟩]{⟨function⟩}

Define an xkeyval choice ⟨key⟩ belonging to ⟨family⟩.

\FXDefine⟨family ⟩VoidKey  {⟨key⟩}{⟨func⟩}

A “void ⟨key⟩” is an option that is not supposed to get an argument. This property is automatically checked everytime the option is used.

\FXDefine⟨family ⟩BoolKey  [⟨func⟩]{⟨key⟩}

Finally, a “boolean ⟨key⟩” is like an xkeyval one, with the addition that for every such key, there is a void nokey counterpart.

Every new option you define is inserted into the global options management mechanism, which has some implications.

• First of all, new options are automatically available almost everywhere, and in particular in the \fxsetup macro, in the annotations commands and environments, etc. Note however that the EnvLayout and TargetLayout family options are only processed when it makes sense, that is, when environments or targeted commands are involved.

• Because new options are treated globally, they may affect every layout (existing, loaded in the future, etc.) and of course, also the built-in ones. Suppose, for example, that you want the ability to adjust the vertical position of the marginal notes layout. One solution is to create a vadj option like

     this: \FXDefineLayoutKey{vadj}{\def\marginnotevadjust{#1}}, which
     you can then use like that: \fxnote[vadj=.5ex]{...}.

• Finally, and again, because options are treated globally, beware of name clashes! Every option name must be unique within a family.

4.4 Creating a new theme

Creating a new theme may involve anything from using (by way of \fxsetup) or modifying existing layouts, to providing new ones. If your new theme has specific layouts, you may consider writing them in seperate files as described before, in order to make them more generally available.

\FXRequireLayouts  {⟨layout names⟩}

In order to use external layouts in a theme, use the command \FXRequireLayouts, passing it a list of ⟨layout names⟩ as argument.

\FXRequireEnvLayout  {⟨name⟩}

\FXRequireTargetLayout In order to use and external environment or target layout in a theme, use the

commands \FXRequire*Layout and give them the layout’s name as argument.

\FXProvidesTheme {⟨name⟩}[⟨release information⟩] A theme should be saved in a file named fxtheme⟨name⟩.sty and advertised by calling \FXProvidesTheme. It will then be recognized by the theme option and

the \fxusetheme command.

4.5 Internationalization

\fx⟨lang ⟩name FiXme’s language control has been described in section 3.11 on page 18. For every

\fx⟨lang ⟩sname

supported language ⟨lang⟩, a number of macros define the language-dependent part of FiXme. The commands \fx⟨lang⟩notename, \fx⟨lang⟩notesname, and their equivalent for the other annotation levels define the singular and plural forms of the note names.

\⟨lang ⟩listfixmename The title for the list of fixmes is defined by the command \⟨lang⟩listfixmename.

All of these commands may be renewed, and their values will be honored by FiXme in all situations, including potential language changes across the document.

5 History

v4.5 Public interface for extending FiXme with new key/value options. Revamp the AUCTEX support, with help from Arash Esbati and Ikumi Keita. Fix PDF signature layouts not working anymore, reported by Soeren Wolfers. Fix spurious space at the end of environments contents, reported by Frank Mittelbach.

v4.4 Handle existing yet empty lox file properly, meaning don’t actually typeset an empty list of corrections. Don’t update the lox file in final mode, avoiding potential typesetting artifacts, reported by Lars Madsen. Various internals and documentation improvements.

v4.3 Add a paragraph about the duplication of notes in captions, upon exchange with Kreuvf. Update support for the Koma-Script classes by using the tocbasic interface when available, reported by Dirk Surmann. Separate inline notes from the text they follow, suggested by Victor Porton. Fix potential inline layouts color leakage, reported by Victor Porton. Fix several parsing problems when passing optional arguments containing brackets, thanks to Joseph Wright and Lars Madsen.

v4.2 Improve Danish translation, thanks to Lars Madsen.

Fix buglet in \@wrindex redefinition, reported by Norman Gray.

v4.1 8 new PDF-specific annotation layouts.

New annotation layout: marginnote, suggested by Sébastien Mengin. Better mechanism for handling layout mutual exclusion. Fix bug in inner layout processing.

v4.0 Support for collaborative annotations, suggested by Michael Kubovy. Support for “targeted” notes and environments (highlighting a portion of text), suggested by Mark Edgington. Support for “floating notes” (not specific to any portion of text), suggested by Rasmus Villemoes. Support for alternative layout autoswitch in TEX’s inner mode, suggested by Will Robertson. Support for automatic language tracking in multilingual documents. Support for themes. Extended support for user-provided layouts.

Support for key=value argument syntax in the whole user interface. New command \fxsetup. Homogenize the log and console messages. Heavy internals refactoring.

v3.4 \fixme, \fxerror, \fxwarning and \fxnote are now robust, thanks to Will Robertson. Fix incompatibility with Koma-Script classes version of \@starttoc when the lox file is inexistent, reported by Philipp Stephani.

v3.3 Document incompatibility between marginal layout and the ACM SIG classes, reported by Jochen Wuttke. Honor twoside option in marginal layout, suggested by Jens Remus. Support for Koma-Script classes version 2006/07/30 v2.95b, suggested by Jens Remus. Documentation improvements suggested by Brian van den Broek. Fix incompatibility with amsart reported by Lars Madsen: \@starttoc takes two arguments. Fix bug reported by Stefan Mann: a typo in the \fixme@footnotetrue macro name.

v3.2 Added the marginclue layout option which only signals a fixme in the margin, withtout the actual contents. Support for Croatian thanks to Marcel Maretic. Fix incompatibility with amsbook reported by Claude Lacoursière: \@starttoc takes two arguments. Fix incompatibility with Beamer reported by Akim Demaille: protect contents of lox file.

v3.1 Fix bug reported by Arnold Beckmann: the environments were visible in final mode.

v3.0 Added environments corresponding to the annotation commands. Added an optional first argument to the annotation commands to change the layout locally. Fix bug reported by Akim Demaille: marginal notes could mess up the document’s layout by flushing it right.

v2.2 New option silent to suppress notes logging.

Support for Danish thanks to Kim Rud Bille.

v2.1 Use \nobreakspace instead of the tilda character. This avoids conflicts with Babel in Spanish environments. Fix bug reported by Knut Lickert: index entries were unconditionally built.

v2.0 New feature: note levels.

New feature: FiXme note counters and usage summary. Suggestions from Kasper B. Graversen. Support for Spanish thanks to Agustín Martín.

v1.5 New appearance option: inline. v1.4 Support for the Koma-Script classes.

Fix bug reported by Ulf Jaenicke-Roessler: the \listoffixmes command didn’t work when called before the first FiXme note.

v1.3 Support for Italian thanks to Riccardo Murri.

v1.2 Support for German thanks to Harald Harders.

6 Implementation

6.1 Preamble

1 ⟨fixme⟩

 2 \NeedsTeXFormat{LaTeX2e}

3 ⟨∗header⟩

 4 \ProvidesPackage{fixme}[2019/01/03 v4.5 Collaborative annotations for LaTeX2e]

5

6 ⟨/header⟩

Some required packages:

7 ⟨∗fixme⟩

 8 \RequirePackage{ifthen}
 9 \RequirePackage{verbatim}
10 \RequirePackage{xkeyval}[2006/11/18]

11

12 ⟨/fixme⟩

\fixmelogo The FiXme logo:

13 ⟨∗header⟩

14 \newcommand\fixmelogo{\textsf{FiXme}}

15

16 ⟨/header⟩

6.2 Utilities

6.2.1 Miscellaneous

\begin{matrix}\@fxpkginfo \\ \@fxpkgwarning \end{matrix}  \{⟨msg⟩\}

Issue a FiXme package info or warning:

17 ⟨∗fixme⟩

18 \newcommand\@fxpkginfo{\PackageInfo{FiXme}}
19 \newcommand\@fxpkgwarning{\PackageWarning{FiXme}}

\@fxpkgerror {⟨shortmsg⟩}{⟨longmsg⟩} Issue a FiXme package error:

20 \newcommand\@fxpkgerror{\PackageError{FiXme}}

21

\@fxaddtolist  {⟨list⟩}{⟨elt⟩}

Add ⟨elt⟩ at the end of ⟨list⟩. We should check for duplicates, but this is not currently done.

22 \newcommand*\@fxaddtolist[2]{%
23 \expandafter\ifx\csname #1\endcsname\relax%
24  \expandafter\def\csname #1\endcsname{#2}%

25 \else%
26  \expandafter\ifx\csname #1\endcsname\empty%
27  \expandafter\g@addto@macro\csname #1\endcsname{#2}%
28  \else%
29  \expandafter\g@addto@macro\csname #1\endcsname{,#2}%
30  \fi%
31 \fi}

32

6.2.2 Key-value management (xkeyval)

6.2.2.1 Shortcuts

The following macros are simple shortcuts for using xkeyval with the fx prefix.

\@fxkeyifundefined {⟨families⟩}{⟨key⟩}{⟨then⟩}{⟨else⟩}

33 \newcommand\@fxkeyifundefined{\key@ifundefined[fx]}

\@fxdefinekey {⟨family⟩}{⟨key⟩}[⟨default⟩]{⟨function⟩}

34 \newcommand\@fxdefinekey{\define@key[fx]}

\@fxdefinecmdkey {⟨family⟩}[⟨mp⟩]{⟨key⟩}[⟨default⟩]{⟨function⟩}

35 \newcommand\@fxdefinecmdkey{\define@cmdkey[fx]}

\@fxdefinechoicekey {⟨family⟩}{⟨key⟩}[⟨bin⟩]{⟨alternatives⟩}[⟨default⟩]{⟨function⟩}

36 \newcommand\@fxdefinechoicekey{\define@choicekey[fx]}

\@fxsetkeys {⟨families⟩}[⟨na⟩]{⟨keys⟩}

37 \newcommand\@fxsetkeys{\setkeys[fx]}

\@fxpresetkeys {⟨families⟩}{⟨head keys⟩}{⟨tail keys⟩}

38 %%      Note: currently unused
39 %%      \newcommand\@fxpresetkeys{\presetkeys[fx]}

40

6.2.2.2 Wrappers

\@fxvoidkeyerror  {⟨key⟩}{⟨value⟩}

Issue a FiXme error about a void ⟨key⟩ misuse (see below):

41 \newcommand*\@fxvoidkeyerror[2]{%
42 \@fxpkgerror{misuse of key '#1'}{%
43  You have given the key '#1' the argument '#2' but it takes
44  none.\MessageBreak
45  Type X to quit, fix that key and re-run LaTeX.\MessageBreak}}
\@fxdefinevoidkey  {⟨family⟩}{⟨key⟩}{⟨func⟩}

A FiXme “void ⟨key⟩” isn’t supposed to get an argument.

46 \newcommand*\@fxdefinevoidkey[3]{%
47 \define@key[fx]{#1}{#2}[]{%
48  \ifthenelse{\equal{##1}{}}{%
49  #3}{%
50  \@fxvoidkeyerror{#2}{##1}}}}

51

\@fxdefineboolkey  [⟨func⟩]{⟨family⟩}{⟨key⟩}

A FiXme “boolean ⟨key⟩” is like an xkeyval one, with the addition that for every such key, there is a void nokey counterpart.

52 \newcommand*\@fxdefineboolkey[3][]{%
53 \define@boolkey[fx]{#2}{#3}[true]{#1}
54 \@fxdefinevoidkey{#2}{no#3}{\@nameuse{fx@#2@#3}{false}}}

55

6.2.2.3 Extension-level option creation interface

\@fxdefineoptioninterface  {⟨family⟩}{⟨infix⟩}
\FXDefine...Key \FXDefine...CmdKey \FXDefine...ChoiceKey \FXDefine...VoidKey \FXDefine...BoolKey This macro defines the extension-level interface allowing users to define new

xkeyval options for a certain ⟨family⟩. Note that the core of FiXme could use those interfaces once defined, but it wouldn’t bring much to the picture. Indeed, it basically boils down to using a ⟨family⟩ within the names of the macros instead of as an argument (and avoiding the use of the “at” character).

56 \newcommand*\@fxdefineoptioninterface[2]{%
57 \expandafter\newcommand\csname FXDefine#2Key\endcsname{%
58  \@fxdefinekey{#1}}%
59 \expandafter\newcommand\csname FXDefine#2CmdKey\endcsname{%
60  \@fxdefinecmdkey{#1}}%
61 \expandafter\newcommand\csname FXDefine#2ChoiceKey\endcsname{%
62  \@fxdefinechoicekey{#1}}%
63 \expandafter\newcommand\csname FXDefine#2VoidKey\endcsname{%
64  \@fxdefinevoidkey{#1}}%
65 \expandafter\newcommand\expandafter*\csname FXDefine#2BoolKey\endcsname[2][]{%
66  \@fxdefineboolkey[##1]{#1}{##2}}}

67

6.3 List macros

6.3.1 Contents lines

\l@fixme We use the same layout as for the list of figures.

68 \let\l@fixme\l@figure

\@fxdottedtocline {⟨tocdepth⟩}{⟨indent⟩}{⟨numwidth⟩}{⟨contents⟩}{⟨target⟩} This macro is copied almost verbatim from L^{A}TEX’s core. The intent is to do a similar layout, but replacing the last argument, normally a page number, by arbitrary text (in our case, a note’s target). The original macro defines a restricted width to typeset the page number which is much too short for us, so we just let the ⟨target⟩ text take all the space it needs.

69 \newcommand*\@fxdottedtocline[5]{%
70 \ifnum #1>\c@tocdepth \else
71  \vskip \z@ \@plus.2\p@
72  {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
73  \parindent #2\relax\@afterindenttrue
74  \interlinepenalty\@M
75  \leavevmode
76  \@tempdima #3\relax
77  \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
78  {#4}\nobreak

79  \leaders\hbox{$\m@th
80  \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
81  mu$}\hfill
82  \nobreak
83  #5\par}%
84 \fi}
\fxcontentsline  {⟨contents⟩}{⟨target⟩}

Similar to L^{A}TEX’s \contentsline macro, but temporarily bind \@dottedtocline to our own version. The nice thing about this implementation is that we can still use \l@fixme (remember that it is bound to \l@figure) without exactly knowing what its definition is. This macro is at the user level because \contentsline is, but it is not currently documented in the user manual.

85 \newcommand*\fxcontentsline[2]{%
86 \begingroup%
87 \let\@dottedtocline\@fxdottedtocline%
88 \l@fixme{#1}{#2}%
89 \endgroup}

90

\fxaddcontentsline  {⟨contents⟩}

Wrapper around L^{A}TEX’s \addcontentsline macro to handle the target option. If a specific target is provided, we can’t use the normal \addcontentsline macro for reasons explained above, so we use our own version of \contentsline instead. This macro is at the user level because \addcontentsline is, but it is not currently documented in the user manual.

91 \newcommand*\fxaddcontentsline[1]{%
92 \ifthenelse{\equal{\cmdfx@note@target}{thepage}}{%
93  \addcontentsline{lox}{fixme}{#1}}{%
94  \addtocontents{lox}{\protect\fxcontentsline{#1}{\cmdfx@note@target}}}}

95

6.3.2 List headers

FiXme recognizes the standard article, report and book classes, the AMS ones, and adapts the list header accordingly. It also detects when the package basictoc is loaded and uses it, which notably makes it compliant with the Koma-Script classes as well. Otherwise, the standard article layout is used.

6.3.2.1 article version

\@lox@prtc@article
\@lox@psttc@article
96 \newcommand\@lox@prtc@article{%
97 \section*{\@fxlistfixmename%
98  \@mkboth{\MakeUppercase\@fxlistfixmename}{\MakeUppercase\@fxlistfixmename}}}
99 \let\@lox@psttc@article\relax

100

6.3.2.2 report version

\@lox@prtc@report
\@lox@psttc@report
101 \newcommand\@lox@prtc@report{%

102 \if@twocolumn
103  \@restonecoltrue\onecolumn
104 \else
105  \@restonecolfalse
106 \fi
107 \chapter*{\@fxlistfixmename%
108  \@mkboth{\MakeUppercase\@fxlistfixmename}{\MakeUppercase\@fxlistfixmename}}}
109 \newcommand\@lox@psttc@report{\if@restonecol\twocolumn\fi}

110

6.3.2.3 book version

\@lox@prtc@book
\@lox@psttc@book
111 \newcommand\@lox@prtc@book{%
112 \if@twocolumn
113  \@restonecoltrue\onecolumn
114 \else
115  \@restonecolfalse
116 \fi
117 \chapter*{\@fxlistfixmename%
118  \@mkboth{\MakeUppercase\@fxlistfixmename}{\MakeUppercase\@fxlistfixmename}}}
119 \newcommand\@lox@psttc@book{\if@restonecol\twocolumn\fi}

120

6.3.3 Status/class-dependent implementation

\lox@final \lox@draft In the new implementation of the draft mode below, we not only check that the lox file exists, but also that it is not empty before actually typesetting anything.

121 \let\lox@final\relax

122

123 \newread\lox@file
124 \newif\iflox@typeset
125 \def\lox@eol{\par}
126 \newcommand\lox@draft{%
127 \lox@typesetfalse%
128 \openin\lox@file\jobname.lox\relax
129 \ifeof\lox@file\else
130  \read\lox@file to \lox@maybeeol
131  \ifeof\lox@file
132  \ifx\lox@maybeeol\lox@eol\else\lox@typesettrue\fi
133  \else
134  \lox@typesettrue
135  \fi
136 \fi
137 \closein\lox@file
138 \iflox@typeset\@lox@prtc\@starttoc{lox}\@lox@psttc\else\@starttoc{lox}\fi}

\lox@draft@ams The amsbook and amsart classes have the very ugly idea of redefining the \@starttoc macro to take two arguments. Therefore, I need to provide a specific version of the \listoffixmes macro:

139 \newcommand\lox@draft@ams{\@starttoc{lox}\@fxlistfixmename}

140

6.4 Faces

\fxsetface  {⟨name⟩}{⟨value⟩}
141 \newcommand*\fxsetface[2]{\@fxsetkeys{face}{#1face=#2}}
\@fxnewface  [⟨default⟩]{⟨name⟩}

A face is just a command key:

142 \newcommand*\@fxnewface[2][]{%
143 \@fxdefinecmdkey{face}{#2face}{}%
144 \fxsetface{#2}{#1}}
\@fxuseface  {⟨name⟩}
145 \newcommand*\@fxuseface[1]{\@nameuse{cmdfx@face@#1face}}

146

6.5 Annotation layouts

6.5.1 Layout modes

multiuser singleuser mode These options specify whether FiXme should function in standalone or collaborative mode, allowing the different layouts to tweak their output.

147 \@fxdefineboolkey[%
148 \ifthenelse{\equal{#1}{true}}{%
149  \fx@mode@singleuserfalse}{%
150  \fx@mode@singleusertrue}]{%
151  mode}{multiuser}
152 \@fxdefineboolkey[%
153 \ifthenelse{\equal{#1}{true}}{%
154  \fx@mode@multiuserfalse}{%
155  \fx@mode@multiusertrue}]{%
156  mode}{singleuser}
157 \@fxdefinechoicekey{mode}{mode}{multiuser,singleuser}{\@fxsetkeys{mode}{#1}}

158

6.5.2 Layout creation

Separating between “early” and “late” layouts is needed in starred context, that is, when we are using targeted commands or environments.

\@fxearlylayouts \@fxlatelayouts Comma-separated lists of available early and late layouts.

159 \let\@fxearlylayouts\empty
160 \let\@fxlatelayouts\empty

\FXProvidesLayout {⟨name⟩}[⟨release information⟩]

161 \newcommand*\FXProvidesLayout[1]{\ProvidesPackage{fxlayout#1}}
\@fxrecordlayoutmutex  {⟨layout⟩}{⟨layouts⟩}

Record mutual exclusion between ⟨layout⟩ and the comma-separated list of ⟨layouts⟩. For each ⟨layout⟩, the mutual exclusion list is stored in \@fxlayout@⟨layout⟩@mutex.

162 \newcommand*\@fxrecordlayoutmutex[2]{%
163 \edef\@fxlts{\zap@space#2 \@empty}%
164 \def\@fxexpr{\@fxaddtolist{@fxlayout@#1@mutex}}%
165 \expandafter\@fxexpr\expandafter{\@fxlts}%
166 \@for\@fxlt:=\@fxlts\do{\@fxaddtolist{@fxlayout@\@fxlt @mutex}{#1}}}

\@fxhandlelayoutmutex  {⟨layout⟩}

Handle ⟨layout⟩’s mutual exclusion list.

167 \newcommand*\@fxhandlelayoutmutex[1]{%
168 \ifthenelse{\boolean{fx@layout@#1}}{%
169  \def\@fxexpr{\@for\@fxlt:=}%
170  \expandafter\@fxexpr\csname @fxlayout@#1@mutex\endcsname\do{%
171  \@ifundefined{iffx@layout@\@fxlt}{}{%
172  \ifthenelse{\boolean{fx@layout@\@fxlt}}{%
173  \@fxpkgwarning{%
174  #1 layout requested;\MessageBreak
175  turning \@fxlt\space layout off}%
176  \@nameuse{fx@layout@\@fxlt}{false}}{}}}}{}}

177

\@FXRegisterLayout {⟨when⟩}[⟨mutex⟩]{⟨name⟩}{⟨funcname⟩} Register a new layout with FiXme. This currently involves creating the boolean layout option with an optional function argument, constructing the translation macro to call the actual layout macro, and updating the appropriate layout list (early or late). The translation macro can’t be \let to the real one, because themes might want to redefine latter. An optional mutual exclusion list may also be given.

178 \def\@FXRegisterLayout#1[#2]#3#4{%
179 \@fxkeyifundefined{layout}{#3}{%
180  \@fxrecordlayoutmutex{#3}{#2}%
181  \@fxdefineboolkey[\@fxhandlelayoutmutex{#3}]{layout}{#3}%
182  \expandafter\def\csname @fxlayout@#3\endcsname{#4}%
183  \@fxaddtolist{@fx#1layouts}{#3}}{%
184  \@fxpkgerror{layout '#3' already registered}{%
185  You have called \string\FXRegisterLayout\space with a name already
186  in use.\MessageBreak
187  If you want to modify an existing layout, renew its
188  command.\MessageBreak
189  Otherwise, you must choose a different name.}}}
\begin{matrix}\FXRegisterLayout \\ \FXRegisterLayout* \end{matrix} ⟨* ⟩[⟨mutex⟩]\{⟨name⟩\}\{⟨funcname⟩\}

And the use-level interface:

190 \newcommand\FXRegisterLayout{%
191 \@ifstar{%
192  \@ifnextchar[%]
193  {\@FXRegisterLayout{early}}{\@FXRegisterLayout{early}[]}}{%
194  \@ifnextchar[%]
195  {\@FXRegisterLayout{late}}{\@FXRegisterLayout{late}[]}}}

196

\FXDefineLayout...Key Finally, the extension-level option creation interface:

197 \@fxdefineoptioninterface{layout}{Layout}

198

6.5.3 Standard textual dispositions

\@fxtextstd {⟨type⟩}{⟨note⟩}{⟨author⟩} The standard text disposition.

199 \newcommand*\@fxtextstd[3]{\ignorespaces#3 \fxnotename{#1}: #2}

\@fxsignature  {⟨author⟩}

Typeset the signature part unless ⟨author⟩ is empty. Note that \ifthenelse is fragile, so we need to make the signature stuff robust.

200 \DeclareRobustCommand*\@fxsignature[1]{%
201 \ifthenelse{\equal{#1}{}}{}{ -- {\@fxuseface{signature}#1}}}

\@fxsigstd {⟨type⟩}{⟨note⟩}{⟨author⟩} The standard signature disposition.

202 \newcommand*\@fxsigstd[3]{\fxnotename{#1}: #2\@fxsignature{#3}}

6.5.4 Built-in layouts

Let’s start with the early layouts, and continue with the late ones.

6.5.4.1 Margin

margin
203 \@fxnewface{margin}
\FXLayoutMargin  {⟨type⟩}{⟨note⟩}{⟨author⟩}
204 \newcommand*\FXLayoutMargin[3]{%
205 \marginpar[\raggedleft\@fxuseface{margin}\@fxtextstd{#1}{#2}{#3}]{%
206  \raggedright\@fxuseface{margin}\@fxtextstd{#1}{#2}{#3}}}
\@fxlayout@margin
[no]margin
207 \FXRegisterLayout*{margin}{\FXLayoutMargin}

6.5.4.2 Margin clue

\FXLayoutMarginCLue  {⟨type⟩}{⟨note⟩}{⟨author⟩}
208 \newcommand*\FXLayoutMarginClue[3]{%
209 \marginpar[%
210 {\raggedleft\@fxuseface{margin}\ignorespaces#3 \fxnotename{#1}!}]{%
211  \raggedright\@fxuseface{margin}\ignorespaces#3 \fxnotename{#1}!}}
\@fxlayout@marginclue
[no]marginclue
212 \FXRegisterLayout*[margin]{marginclue}{\FXLayoutMarginClue}

6.5.4.3 Footnote

\FXLayoutFootnote  {⟨type⟩}{⟨note⟩}{⟨author⟩}
213 \newcommand*\FXLayoutFootnote[3]{\footnote{\@fxtextstd{#1}{#2}{#3}}}
\@fxlayout@footnote
[no]footnote
214 \FXRegisterLayout{footnote}{\FXLayoutFootnote}

6.5.4.4 Inline

inline
215 \@fxnewface{inline}
\FXLayoutInline  {⟨type⟩}{⟨note⟩}{⟨author⟩}
216 \newcommand*\FXLayoutInline[3]{ \@fxuseface{inline}\@fxtextstd{#1}{#2}{#3}}
\@fxlayout@inline
[no]inline
217 \FXRegisterLayout{inline}{\FXLayoutInline}

6.5.4.5 Index

\fixmeindexname
218 \newcommand\fixmeindexname{\fixmelogo}
\@wrindex  {⟨contents⟩}

A replacement for L^{A}TEX’s standard \@wrindex macro to deal with the target option. When given, it is supposed to replace the page number, just as in the list of fixmes.

219 \def\@wrindex#1{%
220 \ifthenelse{\equal{\cmdfx@note@target}{thepage}}{%
221  \protected@write\@indexfile{}{\string\indexentry{#1}{\thepage}}}{%
222  \protected@write\@indexfile{}{\string\indexentry{#1}{\cmdfx@note@target}}}%
223 \endgroup
224 \@esphack}

\@fxnotekey \@fxwarningkey \@fxerrorkey \@fxfatalkey The keys used to sort indexed annotations by importance level:

225 \newcommand\@fxnotekey{***a}
226 \newcommand\@fxwarningkey{***b}
227 \newcommand\@fxerrorkey{***c}
228 \newcommand\@fxfatalkey{***d}
\FXLayoutIndex  {⟨type⟩}{⟨note⟩}{⟨author⟩}
229 \newcommand*\FXLayoutIndex[3]{%
230 \iffx@mode@multiuser%
231  \index{***@\fixmeindexname:%
232  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
233  !\@nameuse{thefx#1count}: #3: #2}%
234  \index{***#3@\fixmeindexname{} (#3):%
235  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
236  !\@nameuse{thefx#1count}: #2}%
237 \else%
238  \index{***@\fixmeindexname:%
239  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
240  !\@nameuse{thefx#1count}: #2}%
241 \fi}
\@fxlayout@index
[no]index
242 \FXRegisterLayout{index}{\FXLayoutIndex}

6.5.4.6 Contents line

The contents of the lox file is handled through this pseudo-layout. It follows the normal layout design, but is not registered the usual way because we don’t want to give the user control over it. It is triggered explicitely by \@@@fxnote@late@draft.

\FXLayoutContentsLine  {⟨type⟩}{⟨note⟩}{⟨author⟩}
243 \newcommand*\FXLayoutContentsLine[3]{%
244 \iffx@mode@multiuser%
245  \fxaddcontentsline{\@fxtextstd{#1}{#2}{#3}}%
246 \else%
247  \fxaddcontentsline{\fxnotename{#1}: #2}%
248 \fi}

249

6.5.5 Layout loading

\fxloadlayouts  {⟨name,. . . ⟩}
250 \newcommand*\fxloadlayouts[1]{%
251 \edef\@fxlts{\zap@space#1 \@empty}%
252 \@for\@fxlt:=\@fxlts\do{\usepackage{fxlayout#1}}}

253

6.5.6 Layout control

\@fxsetlayoutkeys {⟨keys⟩} This macro would probably be overkill if we didn’t need to \expandafter

 it at some point (See \@fxhandleinnermode).
254 \newcommand\@fxsetlayoutkeys{\@fxsetkeys{layout}}

\@fxparselayout Utility macro to detect the no⟨name⟩ form of layout options. The drawback of this technique is that layout options must be at least 3 characters long. No big deal though…

255 \def\@fxparselayout#1#2#3\relax{\def\@fxltprefix{#1#2}\def\@fxltrest{#3}}
256 % \begin{macro}{\fxuselayouts}
257 %   \marg{[no]names}\\
258 %   First, ensure that those layouts are available, then activate them.
259 %   \cs{\FXRequireLayouts} is a better style for theme programming.
260 %    \begin{macrocode}
261 \newcommand*\fxuselayouts[1]{%
262 \edef\@fxlts{\zap@space#1 \@empty}%
263 \@for\@fxlt:=\@fxlts\do{%
264  \expandafter\@fxparselayout\@fxlt\relax%
265  \ifthenelse{\equal{\@fxltprefix}{no}}{%
266  \let\@fxltname\@fxltrest}{%
267  \let\@fxltname\@fxlt}%
268  \@fxkeyifundefined{layout}{\@fxltname}{\fxloadlayouts{\@fxltname}}{}}%
269 \@fxsetkeys{layout}{#1}}
270 \let\FXRequireLayouts\fxuselayouts

271

innerlayout The alternative inner mode layout:

272 \@fxdefinecmdkey{layout}{innerlayout}{}

morelayout The morelayout option adds to the existing layout configuration. The implementation is trivial, as it simply boils down to calling \setkeys on its argument. There are several advantages in doing this.

1. It is possible to disable a layout by using the no⟨layout⟩ form. For example,

     morelayout={inline,nomargin} will work.

2. A wrong layout name (for instance, misspelled) will trigger an xkeyval error.

273 \@fxdefinekey{layout}{morelayout}{\fxuselayouts{#1}}

layout The layout option lets the user specify exactly which ones she wants to use. Not very difficult to implement either: it works by first deactivating all layouts, and then activating the provided ones as before. Note that the use of the no⟨layout⟩ form is valid but has no effect.

274 \@fxdefinekey{layout}{layout}{%
275 \edef\@fxlayouts{\@fxearlylayouts,\@fxlatelayouts}%
276 \@for\@fxlt:=\@fxlayouts\do{%
277  \@nameuse{fx@layout@\@fxlt}{false}}%
278 \fxuselayouts{#1}}

279

6.6 Environment Layouts

6.6.1 Layout creation

\FXProvidesEnvLayout {⟨name⟩}[⟨release information⟩]

280 \newcommand*\FXProvidesEnvLayout[1]{\ProvidesPackage{fxenvlayout#1}}

\FXRegisterEnvLayout {⟨name⟩}{⟨beginfuncname⟩}{⟨endfuncname⟩} Register a new environment layout with FiXme. This currently only involves constructing the translation macros. The translation macros in question can’t be \let to the real ones, because themes or users might want to redefine the latter.

281 \newcommand*\FXRegisterEnvLayout[3]{%
282 \@ifundefined{@fxenvlayout@#1@begin}{%
283  \expandafter\def\csname @fxenvlayout@#1@begin\endcsname{#2}%
284  \expandafter\def\csname @fxenvlayout@#1@end\endcsname{#3}}{%
285  \@fxpkgerror{environment layout '#2' already registered}{%
286  You have called \string\FXRegisterEnvLayout\space with a name already in
287  use.\MessageBreak
288  If you want to modify an existing environment layout, renew its
289  commands.\MessageBreak
290  Otherwise, you must choose a different name.}}}

291

\FXDefineEnvLayout...Key The extension-level option creation interface:

292 \@fxdefineoptioninterface{envlayout}{EnvLayout}

293

6.6.2 Built-in layouts

6.6.2.1 Plain

env
294 \@fxnewface{env}

\begin{matrix}\FXEnvLayoutPlainBegin \\ \FXEnvLayoutPlainEnd \end{matrix}  \{⟨type⟩\}\{⟨author⟩\}
295 \newcommand*\FXEnvLayoutPlainBegin[2]{%
296 \@fxuseface{env}\ignorespaces#2 \fxnotename{#1}: \ignorespaces}
297 \newcommand*\FXEnvLayoutPlainEnd[2]{}
\@fxenvlayout@plain@begin
\@fxenvlayout@plain@end
298 \FXRegisterEnvLayout{plain}{\FXEnvLayoutPlainBegin}{\FXEnvLayoutPlainEnd}

299

6.6.2.2 Signature

signature signature
300 \@fxnewface[\itshape]{signature}
\begin{matrix}\FXEnvLayoutSignatureBegin \\ \FXEnvLayoutSignatureEnd \end{matrix}  \{⟨type⟩\}\{⟨author⟩\}
301 \newcommand*\FXEnvLayoutSignatureBegin[2]{%
302 \@fxuseface{env}\fxnotename{#1}: \ignorespaces}
303 \newcommand*\FXEnvLayoutSignatureEnd[2]{\@fxsignature{#2}}
\@fxenvlayout@signature@begin
\@fxenvlayout@signature@end
304 \FXRegisterEnvLayout{signature}{%
305 \FXEnvLayoutSignatureBegin}{\FXEnvLayoutSignatureEnd}

306

6.6.3 Layout selection

\@fxselectenvlayout  {⟨name⟩}
\begin{matrix}\@fxenvlayout@begin \\ \@fxenvlayout@end \end{matrix}  \{⟨type⟩\}\{⟨author⟩\}

This is much simpler than standard layout management because only one environment layout at a time is possible. Using a specific environment layout boils down to possibly loading it, and binding the beginning and ending macros to the proper translation ones.

307 \newcommand*\@fxselectenvlayout[1]{%
308 \expandafter\let\expandafter\@fxenvlayout@begin%
309  \csname @fxenvlayout@#1@begin\endcsname%
310 \expandafter\let\expandafter\@fxenvlayout@end%
311  \csname @fxenvlayout@#1@end\endcsname}

312

6.6.4 Layout loading

\fxloadenvlayouts  {⟨name,. . . ⟩}
313 \newcommand*\fxloadenvlayouts[1]{%
314 \edef\@fxlts{\zap@space#1 \@empty}%
315 \@for\@fxlt:=\@fxlts\do{\usepackage{fxenvlayout#1}}}

316

6.6.5 Layout control

\begin{matrix}\fxuseenvlayout \\ \FXRequireEnvLayout \end{matrix}  \{⟨name⟩\}

\FXRequireEnvLayout is a better style for theme programming.

317 \newcommand*\fxuseenvlayout[1]{%
318 \@ifundefined{@fxenvlayout@#1@begin}{\fxloadenvlayouts{#1}}{}%
319 \@fxselectenvlayout{#1}}
320 \let\FXRequireEnvLayout\fxuseenvlayout
envlayout
321 \@fxdefinekey{envlayout}{envlayout}{\fxuseenvlayout{#1}}

322

6.7 Target Layouts

6.7.1 Layout creation

\FXProvidesTargetLayout  {⟨name⟩}[⟨release information⟩]
323 \newcommand*\FXProvidesTargetLayout[1]{\ProvidesPackage{fxtargetlayout#1}}
\FXRegisterTargetLayout  {⟨name⟩}{⟨funcname⟩}

Register a new target layout with FiXme. This currently only involves constructing the translation macro. The translation macro in question can’t be \let to the real one, because themes or user might want to redefine the latter.

324 \newcommand*\FXRegisterTargetLayout[2]{%
325 \@ifundefined{@fxtargetlayout@#1}{%
326  \expandafter\def\csname @fxtargetlayout@#1\endcsname{#2}}{%
327  \@fxpkgerror{target layout '#1' already registered}{%
328  You have called \string\FXRegisterTargetLayout\space with a name
329  already in use.\MessageBreak
330  If you want to modify an existing target layout, renew its
331  command.\MessageBreak
332  Otherwise, you must choose another name.}}}

333

\FXDefineTargetLayout...Key The extension-level option creation interface:

334 \@fxdefineoptioninterface{targetlayout}{TargetLayout}

335

6.7.2 Built-in layouts

6.7.2.1 Plain

target
336 \@fxnewface{target}
\FXTargetLayoutPlain  {⟨target⟩}
337 \newcommand\FXTargetLayoutPlain[2]{\@fxuseface{target}#2}
\@fxtargetlayout@plain
338 \FXRegisterTargetLayout{plain}{\FXTargetLayoutPlain}

339

6.7.3 Layout selection

\@fxselecttargetlayout  {⟨name⟩}
\@@fxtargetlayout  {⟨target⟩}

This is much simpler than standard layout management because only one target layout at a time is possible. Using a specific target layout boils down to possibly loading it, and binding the layout macro to the proper translation one.

340 \newcommand*\@fxselecttargetlayout[1]{%
341 \expandafter\let\expandafter\@@fxtargetlayout%
342  \csname @fxtargetlayout@#1\endcsname}

343

6.7.4 Target layout loading

\fxloadtargetlayouts  {⟨name,. . . ⟩}
344 \newcommand*\fxloadtargetlayouts[1]{%
345 \edef\@fxlts{\zap@space#1 \@empty}%
346 \@for\@fxlt:=\@fxlts\do{\usepackage{fxtargetlayout#1}}}

347

6.7.5 Target layout control

\begin{matrix}\fxusetargetlayout \\ \FXRequireTargetLayout \end{matrix}  \{⟨name⟩\}

\FXRequireTargetLayout is a better style for theme programming.

348 \newcommand*\fxusetargetlayout[1]{%
349 \@ifundefined{@fxtargetlayout@#1}{\fxloadtargetlayouts{#1}}{}%
350 \@fxselecttargetlayout{#1}}
351 \let\FXRequireTargetLayout\fxusetargetlayout
targetlayout
352 \@fxdefinekey{targetlayout}{targetlayout}{\fxusetargetlayout{#1}}

353

6.7.6 Status-dependant versions

\begin{matrix}\@fxtargetlayout@final \\ \@fxtargetlayout@draft \end{matrix}  \{⟨target⟩\}

In final mode, the target is typeset as-is. In draft mode, we use the selected layout.

354 \newcommand\@fxtargetlayout@final[2]{#2}
355 \newcommand\@fxtargetlayout@draft[2]{%
356 \begingroup\@@fxtargetlayout{#1}{#2}\endgroup}

357

6.8 Logging

6.8.1 Logging macros

\begin{matrix}\FXLogNote \\ \FXLogWarning \\ \FXLogerror \\ \FXLogFatal \end{matrix}  \{⟨msg⟩\}
358 \newcommand*\FXLogNote[1]{%
359 \GenericInfo{%
360  (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
361  FiXme Note: '#1'}}

362 \newcommand*\FXLogWarning[1]{%
363 \GenericWarning{%
364  (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
365  FiXme Warning: '#1'}}
366 \newcommand*\FXLogError[1]{%
367 \GenericWarning{%
368  (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
369  FiXme Error: '#1'}}
370 \newcommand*\FXLogFatal[1]{%
371 \GenericWarning{%
372  (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
373  FiXme Fatal Error: '#1'}}

374

\@fxlog@note \@fxlog@warning \@fxlog@error \@fxlog@fatal In order for the generic note dispatcher to be able to call the logging macros (see section 6.9.3 on page 44), we need an easier translation mechanism from the annotation type to the actual macro name. The translation macros in question can’t be \let to the real one, because users might want to redefine the actual log macros later.

375 \def\@fxlog@note{\FXLogNote}
376 \def\@fxlog@warning{\FXLogWarning}
377 \def\@fxlog@error{\FXLogError}
378 \def\@fxlog@fatal{\FXLogFatal}

379

6.8.2 Logging control

[no]silent Whether to log the annotations:

380 \@fxdefineboolkey{log}{silent}

381

6.9 FiXme notes

6.9.1 Note parameters

fixmecount fxnotecount fxwarningcount fxerrorcount fxfatalcount  fixmecount maintains the total of all annotations, regardless of their level. Each

note type also gets its own counter:

382 \newcounter{fixmecount}
383 \newcounter{fxnotecount}
384 \newcounter{fxwarningcount}
385 \newcounter{fxerrorcount}
386 \newcounter{fxfatalcount}

387

author An annotation “author” allows to distinguish notes from different persons in collaborative mode.

388 \@fxdefinecmdkey{note}{author}{}

target An annotation “target” may replace the page number in the list of corrections or in the index (see also section 6.5.4.6 on page 37).

389 \@fxdefinecmdkey{note}{target}{}

6.9.2 Layout dispatch

\@fxhandleinnermode Handle the case where TEX is in inner mode. We use the alternative layout provided by the innerlayout option, and we make sure to disable both the margin and marginclue layout forms. This is done by appending nomargin and nomarginclue to the inner layout value (this also renders nasty user settings harmless). Before that, we provide some informative message if risky layout forms were active.

390 \newcommand\@fxhandleinnermode{%
391 \ifinner%
392  \ifthenelse{\boolean{fx@layout@margin}}{%
393  \@fxpkginfo{%
394  inner mode detected;\MessageBreak
395  turning margin layout form off}}{%
396  \ifthenelse{\boolean{fx@layout@marginclue}}{%
397  \@fxpkginfo{%
398  inner mode detected;\MessageBreak
399  turning marginclue layout form off}}{}}%
400  \expandafter\@fxsetlayoutkeys\expandafter{%
401  \cmdfx@layout@innerlayout,nomargin,nomarginclue}%
402 \fi}
\begin{matrix}\@fxissueearlydraftlayouts \\ \@fxissuelatedraftlayouts \end{matrix}  \{⟨type⟩\}\{⟨note⟩\}

Dispatch all active draft mode layouts. \@fxissueearlydraftlayouts takes care of dispatching early layouts, but before that, handles the inner mode case. \@fxissuelatedraftlayouts just dispatches late layouts.

403 \newcommand*\@fxissueearlydraftlayouts[2]{%
404 \@fxhandleinnermode%
405 \@for\@fxlt:=\@fxearlylayouts\do{%
406  \@nameuse{iffx@layout@\@fxlt}%
407  \@nameuse{@fxlayout@\@fxlt}{#1}{#2}{\cmdfx@note@author}%
408  \fi}}
409 \newcommand*\@fxissuelatedraftlayouts[2]{%
410 \@for\@fxlt:=\@fxlatelayouts\do{%
411  \@nameuse{iffx@layout@\@fxlt}%
412  \@nameuse{@fxlayout@\@fxlt}{#1}{#2}{\cmdfx@note@author}%
413  \fi}}
\@fxissuecommonlayouts  {⟨type⟩}{⟨note⟩}

Dispatch all mode-independent layouts (actually, “layout” is to be taken in a slightly broader sense here). This macro executes all operations that need to be performed regardless of the document status. This currently means logging the annotations. Previously, this code also updated the lox file, but this could lead to typesetting artifacts even in final mode (because of the whatsit introduced by \write), which is highly undesirable, and besides, there’s no point in keeping that information up to date, since it won’t be typeset. So from now on, the contents lines are only generated in draft mode by \@@@fxnote@late@draft.

414 \newcommand*\@fxissuecommonlayouts[2]{%
415 \iffx@log@silent\else\@nameuse{@fxlog@#1}{#2}\fi}

416

6.9.3 Status-dependent implementation

\begin{matrix}\@@@fxnote@early@final \\ \@@@fxnote@late@final \\ \@@@fxnote@early@draft \\ \@@@fxnote@late@draft \end{matrix}  \{⟨type⟩\}\{⟨note⟩\}

The lower-level macros that perform the real job. In final mode, early work is only to check for remaining fatal annotations and late work is to dispatch common layouts.

417 \newcommand*\@@@fxnote@early@final[2]{%
418 \ifthenelse{\equal{#1}{fatal}}{%
419  \@fxpkgerror{'#2' fatal error left in final version}{%
420  You are currently processing in final mode,\MessageBreak
421  but you still have some FiXme fatal errors left behind.\MessageBreak
422  Type X to quit, fix your document (or switch back to draft
423  mode),\MessageBreak
424  and rerun LaTeX.}}{}}
425 \newcommand*\@@@fxnote@late@final[2]{\@fxissuecommonlayouts{#1}{#2}}

In draft mode, early work is to dispatch early layouts, while late work is to dispatch both late and common layouts, and update the lox file.

426 \newcommand*\@@@fxnote@early@draft[2]{%
427 \@fxissueearlydraftlayouts{#1}{#2}}
428 \newcommand*\@@@fxnote@late@draft[2]{%
429 \@fxissuelatedraftlayouts{#1}{#2}%
430 \FXLayoutContentsLine{#1}{#2}{\cmdfx@note@author}%
431 \@fxissuecommonlayouts{#1}{#2}}

432

6.9.4 Standard version

\@fxpostconfigure This macro is used in \@@fxnote@early below, after processing user options (even when there is none), to postconfigure some aspects of the annotations. Currently, this involves two things: setting the author to \fixmelogo if it still is fixme, and automatically tracking the current language if required (note that all other language options turn tracking off, meaning that one can override language tracking locally by providing a language explicitely). Since environments need the postconfiguration done sooner, they perform it themselves and rebind this macro to

\relax.
433 \newcommand*\@fxpostconfigure{%
434 \ifthenelse{\equal{\cmdfx@note@author}{fixme}}{%
435  \@fxsetkeys{note}{author=\fixmelogo}}{}%
436 \iffx@lang@langtrack%
437  \@fxkeyifundefined{lang}{\languagename}{%
438  \@fxpkgwarning{unknown language '\languagename';\MessageBreak
439  falling back to \@fxdefaultlang}%
440  \@fxsetkeys{lang}{\@fxdefaultlang}}{%
441  \@fxsetkeys{lang}{\languagename}}
442 \fi}

443

\@fxendgroup This macro is used in \@@fxnote@late below to close the group opened at the user level. Since environments need the group opened for a longer time, they rebind it to \relax and close the group themselves later on.

444 \let\@fxendgroup\endgroup

\@@fxnote@early  {⟨type⟩}{⟨note⟩}

Counters need to be updated regardless of the mode.

445 \def\@@fxnote@early#1#2{%
446  \@fxpostconfigure%
447  \stepcounter{fixmecount}%
448  \stepcounter{fx#1count}%
449  \@@@fxnote@early{#1}{#2}}
\@@fxnote@late
450 \def\@@fxnote@late#1#2{%
451  \@@@fxnote@late{#1}{#2}%
452 \@fxendgroup}
\@@fxnote  {⟨type⟩}{⟨note⟩}

This macro is used everywhere outside a starred context, because in that case, we do early and late work in a row.

453 \def\@@fxnote#1#2{%
454 \@@fxnote@early{#1}{#2}%
455 \@@fxnote@late{#1}{#2}}

\@fxnote {⟨type⟩}[⟨options⟩]{⟨note⟩}

456 \def\@fxnote#1[#2]#3{%
457 \@fxsetkeys{mode,status,lang,log,note,face,layout}{#2}%
458 \@@fxnote{#1}{#3}}

459

6.9.5 Starred version

\@@fxsnote {⟨type⟩}{⟨note⟩}{⟨text⟩} Post-configuration is done here because it’s the code path confluent for all starred commands. Relaxing post-configuration afterwards is to prevent \@@fxnote@early from doing it again. Note that this is the only place where we actually do early and late work not in a row.

460 \long\def\@@fxsnote#1#2#3{%
461 \@fxpostconfigure\let\@fxpostconfigure\relax%
462 \@@fxnote@early{#1}{#2}\@fxtargetlayout{#1}{#3}\@@fxnote@late{#1}{#2}}

\@fxsnote {⟨type⟩}[⟨options⟩]{⟨note⟩}{⟨text⟩} Note the targetlayout family here.

463 \long\def\@fxsnote#1[#2]#3#4{%
464 \@fxsetkeys{mode,status,lang,log,note,face,layout,targetlayout}{#2}%
465 \@@fxsnote{#1}{#3}{#4}}

466

6.9.6 User-level interface generation

\@fxpreconfigure  {⟨author⟩}

This macro is used at the beginning of every user-level entry point (here for notes, and also in the environments section), to preconfigure some aspects of the annotations, before possibly processing options. Currently, this only involves presetting the note’s author to the one specified in the call to \FXRegisterAuthor. This however is not done for the built-in fixme author, because this one should honor a global setting.

467 \newcommand*\@fxpreconfigure[1]{%
468 \ifthenelse{\equal{#1}{fixme}}{}{\@fxsetkeys{note}{author=#1}}}
\@fxnewnotemacro  {⟨prefix⟩}{⟨type⟩}{⟨author⟩}

This macro defines the user-level interface:

469 \newcommand*\@fxnewnotemacro[3]{%
470 \expandafter\DeclareRobustCommand\csname #1#2\endcsname{%
471  \begingroup%
472  \@fxpreconfigure{#3}%
473  \@ifstar{%
474  \@ifnextchar[%]
475  {\@fxsnote{#2}}{\@@fxsnote{#2}}}{%
476  \@ifnextchar[%]
477  {\@fxnote{#2}}{\@@fxnote{#2}}}}}

6.10 FiXme environments

A FiXme environment’s summary is laid out by the corresponding macro, but the inline layout is disabled. This is as easy as appending noinline to the end of the options list.

6.10.1 Status-dependent implementation

\begin{matrix}\@@@@fxbeginenv@final \\ \@@@@fxbeginenv@draft \\ \@fxendenv@final \\ \@fxendenv@draft \end{matrix}  \{⟨type⟩\}

In final mode, verbatim’s comment environment is used to suppress output.

478 \def\@@@@fxbeginenv@final#1{\comment}
479 \def\@@@@fxbeginenv@draft#1{\@fxenvlayout@begin{#1}{\cmdfx@note@author}}
480 \def\@fxendenv@final#1{\endcomment}
481 \def\@fxendenv@draft#1{\unskip\@fxenvlayout@end{#1}{\cmdfx@note@author}}

482

6.10.2 Standard versions

\begin{matrix}\@@@fxbeginenv \\ \@@fxbeginenv \end{matrix}  \{⟨type⟩\}\{⟨summary⟩\}

Post-configuration is done here (it’s the code path confluent for all non-starred environments). Relaxing post-configuration afterwards is to prevent \@@fxnote from doing it again.

483 \def\@@@fxbeginenv#1#2{%
484 \@fxpostconfigure\let\@fxpostconfigure\relax%
485 \@@fxnote{#1}{#2}%
486 \@@@@fxbeginenv{#1}}
487 \def\@@fxbeginenv#1#2{%
488 \@fxsetkeys{layout}{noinline}%
489 \@@@fxbeginenv{#1}{#2}}

\@fxbeginenv {⟨type⟩}[⟨options⟩]{⟨summary⟩}

490 \def\@fxbeginenv#1[#2]#3{%
491 \@fxsetkeys{mode,status,lang,log,note,face,layout,envlayout}{#2,noinline}%
492 \@@@fxbeginenv{#1}{#3}}

493

6.10.3 Starred versions

\begin{matrix}\@@@fxbeginsenv \\ \@@fxbeginsenv \end{matrix}  \{⟨type⟩\}\{⟨summary⟩\}\{⟨text⟩\}

Post-configuration is done here (it’s the code path confluent for all starred environments). Relaxing post-configuration afterwards is to prevent \@@fxsnote from doing it again.

494 \long\def\@@@fxbeginsenv#1#2#3{%
495 \@fxpostconfigure\let\@fxpostconfigure\relax%
496 \@@fxsnote{#1}{#2}{#3}%
497 \@@@@fxbeginenv{#1}}
498 \long\def\@@fxbeginsenv#1#2#3{%
499 \@fxsetkeys{layout}{noinline}%
500 \@@@fxbeginsenv{#1}{#2}{#3}}

\@fxbeginenv {⟨type⟩}[⟨options⟩]{⟨summary⟩}{⟨text⟩} Note the targetlayout family here.

501 \long\def\@fxbeginsenv#1[#2]#3#4{%
502 \@fxsetkeys{mode,status,lang,log,note,face,layout,envlayout,targetlayout}{%
503  #2,noinline}%
504 \@@@fxbeginsenv{#1}{#3}{#4}}

505

6.10.4 User-level interface generation

\@fxnewnoteenvs  {⟨prefix⟩}{⟨type⟩}{⟨author⟩}

This macro defines the user-level interface. The ending macros are identical. Also, the environments close their own group, so we prevent \@@fxnote from doing so by temporarily rebinding \@fxendgroup to \relax.

506 \newcommand*\@fxnewnoteenvs[3]{%
507 \expandafter\def\csname #1#2\endcsname{%
508  \begingroup%
509  \let\@fxendgroup\relax%
510  \@fxpreconfigure{#3}%
511  \@ifnextchar[%]
512  {\@fxbeginenv{#2}}{\@@fxbeginenv{#2}}}
513 \expandafter\def\csname end#1#2\endcsname{%
514  \@fxendenv{#2}%
515  \endgroup}%
516 \expandafter\long\expandafter\def\csname #1#2*\endcsname{%
517  \begingroup%
518  \let\@fxendgroup\relax%
519  \@fxpreconfigure{#3}%
520  \@ifnextchar[%]
521  {\@fxbeginsenv{#2}}{\@@fxbeginsenv{#2}}}
522 \expandafter\def\csname end#1#2*\endcsname{%
523  \@fxendenv{#2}%
524  \endgroup}}

525

6.11 FiXme authors

\FXRegisterAuthor {⟨cmdprefix⟩}{⟨envprefix⟩}{⟨name⟩} This macro creates the whole user-level interface for a particular author:

526 \newcommand*\FXRegisterAuthor[3]{%
527 \@ifundefined{#1note}{}{%
528  \@fxpkgerror{command prefix '#1' already in use}{%
529  You have called \string\FXRegisterAuthor\space with a command prefix
530  already in use.\MessageBreak
531  Please choose another one.}}%
532 \@ifundefined{#2note}{}{%
533  \@fxpkgerror{environment prefix '#2' already in use}{%
534  You have called \string\FXRegisterAuthor\space with an environment
535  prefix already in use.\MessageBreak
536  Please choose another one.}}%
537 \@fxnewnotemacro{#1}{note}{#3}%
538 \@fxnewnotemacro{#1}{warning}{#3}%
539 \@fxnewnotemacro{#1}{error}{#3}%
540 \@fxnewnotemacro{#1}{fatal}{#3}%
541 \@fxnewnoteenvs{#2}{note}{#3}%
542 \@fxnewnoteenvs{#2}{warning}{#3}%
543 \@fxnewnoteenvs{#2}{error}{#3}%
544 \@fxnewnoteenvs{#2}{fatal}{#3}}

545

{\fx...[*] \atop anfx...[*]} And we use it to create the FiXme default user:

546 \FXRegisterAuthor{fx}{anfx}{fixme}

\fixme [⟨options⟩]{⟨note⟩} Deprecate \fixme:

547 \DeclareRobustCommand\fixme{%
548 \@fxpkgwarning{\string\fixme\space is deprecated;\MessageBreak
549  please use \string\fxfatal\space instead}%
550 \fxfatal}

afixme Deprecate the afixme environment:

551 \def\afixme{%
552 \@fxpkgwarning{The 'afixme' environment is deprecated;\MessageBreak
553  please use 'anfxfatal' instead}%
554 \anfxfatal}
555 \let\endafixme\endanfxfatal

6.12 Internationalization

\@fxlanguages This macro lists all the supported languages, including aliases:

556 \newcommand*\@fxlanguages{%
557 english,french,francais,spanish,italian,german,ngerman,danish,croatian}

558

6.12.1 Language definitions

6.12.1.1 English

english
\fxenglish...[s]name

\englishlistfixmename

559 \newcommand\fxenglishnotename{Note}
560 \newcommand\fxenglishnotesname{Notes}
561 \newcommand\fxenglishwarningname{Warning}

48

562 \newcommand\fxenglishwarningsname{Warnings}
563 \newcommand\fxenglisherrorname{Error}
564 \newcommand\fxenglisherrorsname{Errors}
565 \newcommand\fxenglishfatalname{Fatal}
566 \newcommand\fxenglishfatalsname{Fatal errors}
567 \newcommand\englishlistfixmename{List of Corrections}

568

6.12.1.2 French

french
francais
\fxfrench...[s]name

\frenchlistfixmename

569 \newcommand\fxfrenchnotename{Note}
570 \newcommand\fxfrenchnotesname{Notes}
571 \newcommand\fxfrenchwarningname{Attention}
572 \newcommand\fxfrenchwarningsname{Avertissements}
573 \newcommand\fxfrencherrorname{Erreur}
574 \newcommand\fxfrencherrorsname{Erreurs}
575 \newcommand\fxfrenchfatalname{Fatal}
576 \newcommand\fxfrenchfatalsname{Erreurs fatales}
577 \newcommand\frenchlistfixmename{Liste des Corrections}

578

6.12.1.3 Spanish

spanish
\fxspanish...[s]name

\spanishlistfixmename

579 \newcommand\fxspanishnotename{Nota}
580 \newcommand\fxspanishnotesname{Notas}
581 \newcommand\fxspanishwarningname{Aviso}
582 \newcommand\fxspanishwarningsname{Avisos}
583 \newcommand\fxspanisherrorname{Error}
584 \newcommand\fxspanisherrorsname{Errores}
585 \newcommand\fxspanishfatalname{Fatal}
586 \newcommand\fxspanishfatalsname{Errores fatales}
587 \newcommand\spanishlistfixmename{Lista de Correcciones}

588

6.12.1.4 Italian

italian
\fxitalian...[s]name

\italianlistfixmename

589 \newcommand\fxitaliannotename{Nota}
590 \newcommand\fxitaliannotesname{Note}
591 \newcommand\fxitalianwarningname{Avviso}
592 \newcommand\fxitalianwarningsname{Avvisi}
593 \newcommand\fxitalianerrorname{Errore}
594 \newcommand\fxitalianerrorsname{Errori}
595 \newcommand\fxitalianfatalname{Fatale}
596 \newcommand\fxitalianfatalsname{Errori fatali}
597 \newcommand\italianlistfixmename{Corrigenda}

598

6.12.1.5 German

german
ngerman
\fxgerman...[s]name

\germanlistfixmename

49

599 \newcommand\fxgermannotename{Anm}
600 \newcommand\fxgermannotesname{Anmerkungen}
601 \newcommand\fxgermanwarningname{Warnung}
602 \newcommand\fxgermanwarningsname{Warnungen}
603 \newcommand\fxgermanerrorname{Fehler}
604 \newcommand\fxgermanerrorsname{Fehler}
605 \newcommand\fxgermanfatalname{Verh\"angnisvoll}
606 \newcommand\fxgermanfatalsname{Verh\"angnisvolle fehler}
607 \newcommand\germanlistfixmename{Verzeichnis der Korrekturen}

608

6.12.1.6 Danish

danish
\fxdanish...[s]name

\danishlistfixmename

609 \newcommand\fxdanishnotename{Note}
610 \newcommand\fxdanishnotesname{Noter}
611 \newcommand\fxdanishwarningname{Advarsel}
612 \newcommand\fxdanishwarningsname{Advarsler}
613 \newcommand\fxdanisherrorname{Fejl}
614 \newcommand\fxdanisherrorsname{Fejl}
615 \newcommand\fxdanishfatalname{Fatal}
616 \newcommand\fxdanishfatalsname{Fatale fejl}
617 \newcommand\danishlistfixmename{Rettelser}

618

6.12.1.7 Croatian

croatian
\fxcroatian...[s]name

\croatianlistfixmename

619 \newcommand\fxcroatiannotename{Poruka}
620 \newcommand\fxcroatiannotesname{Poruke}
621 \newcommand\fxcroatianwarningname{Upozorenja}
622 \newcommand\fxcroatianwarningsname{Upozorenje}
623 \newcommand\fxcroatianerrorname{Gre\v ska}
624 \newcommand\fxcroatianerrorsname{Greske}
625 \newcommand\fxcroatianfatalname{Fatalan}
626 \newcommand\fxcroatianfatalsname{Kobne gre\v ske}
627 \newcommand\croatianlistfixmename{Popis korekcija}

628

6.12.2 Language tracking

langtrack Whether to track the value of \languagename automatically:

629 \@fxdefineboolkey{lang}{langtrack}

defaultlang Which language to use when tracking leads to an unsuported language:

630 \def\@fxexpr{\@fxdefinechoicekey{lang}{defaultlang}[\@fxdefaultlang]}
631 \expandafter\@fxexpr\expandafter{\@fxlanguages}{}

632

6.12.3 Language options

lang \@fxlang Store the current language in \@fxlang after having handled language aliases, and disable language tracking:

633 \def\@fxexpr{\@fxdefinechoicekey{lang}{lang}[\@fxlang]}
634 \expandafter\@fxexpr\expandafter{\@fxlanguages}{%
635 \ifthenelse{\equal{#1}{francais}}{\def\@fxlang{french}}{%
636  \ifthenelse{\equal{#1}{ngerman}}{\def\@fxlang{german}}{}}%
637 \@fxsetkeys{lang}{langtrack=false}}

638

english french francais spanish italian german ngerman danish croatian Create individual language options:
639 \@for\@fxlg:=\@fxlanguages\do{
640 \def\@fxexprone{\@fxdefinevoidkey{lang}}
641 \edef\@fxexprtwo{{\@fxlg}{\noexpand\@fxsetkeys{lang}{lang=\@fxlg}}}
642 \expandafter\@fxexprone\@fxexprtwo}

643

6.12.4 Language abstraction layer

\@fxlistfixmename Construct the “list of fixmes” title in a language dependent fashion:

644 \newcommand*\@fxlistfixmename{\@nameuse{\@fxlang listfixmename}}
\begin{matrix}\fxnotename \\ \fxnotesname \end{matrix}  \{⟨type⟩\}

Construct the notes names in a language dependent fashion:

645 \newcommand*\fxnotename[1]{\@nameuse{fx\@fxlang#1name}}
646 \newcommand*\fxnotesname[1]{\@nameuse{fx\@fxlang#1sname}}

647

6.13 Document status processing

\@@@fxnote@early \@@@fxnote@late \@@@@fxbeginenv \@fxendenv \@fxtargetlayout \listoffixmes final draft status Select draft or final versions of internal macros (some of them also depending on

the document class):

648 \@fxdefinevoidkey{status}{final}{%
649 \let\@@@fxnote@early\@@@fxnote@early@final%
650 \let\@@@fxnote@late\@@@fxnote@late@final%
651 \let\@@@@fxbeginenv\@@@@fxbeginenv@final
652 \let\@fxendenv\@fxendenv@final%
653 \let\@fxtargetlayout\@fxtargetlayout@final%
654 \let\listoffixmes\lox@final}
655 \@fxdefinevoidkey{status}{draft}{%
656 \let\@@@fxnote@early\@@@fxnote@early@draft%
657 \let\@@@fxnote@late\@@@fxnote@late@draft%
658 \let\@@@@fxbeginenv\@@@@fxbeginenv@draft
659 \let\@fxendenv\@fxendenv@draft%
660 \let\@fxtargetlayout\@fxtargetlayout@draft%
661 \let\listoffixmes\lox@draft}
662 \@fxdefinechoicekey{status}{status}{final,draft}{\@fxsetkeys{status}{#1}}

663

6.14 Theme support

\FXProvidesTheme {⟨name⟩}[⟨release information⟩]

664 \newcommand*\FXProvidesTheme[1]{\ProvidesPackage{fxtheme#1}}
\fxusetheme  {⟨name⟩}
665 \newcommand*\fxusetheme[1]{\usepackage{fxtheme#1}}

theme
666 \@fxdefinekey{theme}{theme}{\fxusetheme{#1}}

6.15 Finale

6.15.1 Class-dependent settings

Currently, our class dependencies only matter in draft mode, so one could argue that it is not optimal to handle this here. However, it would be incorrect to do it in the draft option code because this option can be switched at any point in the document (remember that it is understood even by the annotation macros and environments) and the stuff below should only be executed once. Besides,

\@ifclassloaded is an \@onlypreamble macro. . .

As documented, marginal notes are incompatible with the ACM SIG classes. Initially, I thought I would detect these classes and issue an error if marginal layout (or clue) is active. However, I changed my mind, because nothing prevents somebody to write a new class on top of these ones and authorize \marginpar back again. Normally these classes issue an error if \marginpar is used. However, the 2.3 / June 2007 versions are buggy and the error actually triggers a stack overflow in L^{A}TEX… (patch submitted). Oh boy, these classes are a mess.

\@lox@prtc \@lox@psttc \@lox@draft
667 \@ifclassloaded{article}{%
668 \let\@lox@prtc\@lox@prtc@article%
669 \let\@lox@psttc\@lox@psttc@article}{%
670 \@ifclassloaded{report}{%
671  \let\@lox@prtc\@lox@prtc@report%
672  \let\@lox@psttc\@lox@psttc@report}{%
673  \@ifclassloaded{book}{%
674  \let\@lox@prtc\@lox@prtc@book%
675  \let\@lox@psttc\@lox@psttc@book}{%
676  \@ifclassloaded{amsbook}{%
677  \let\lox@draft\lox@draft@ams}{%
678  \@ifclassloaded{amsart}{%
679  \let\lox@draft\lox@draft@ams}{%
680  %% Use the article layout by default.
681  \let\@lox@prtc\@lox@prtc@article%
682  \let\@lox@psttc\@lox@psttc@article}}}}}

683

This overrides any previous class-based settings but makes the list of corrections compliant with the Koma-Script classes and any document using the tocbasic package.

684 \@ifpackageloaded{tocbasic}{%
685 \addtotoclist[fixme]{lox}%
686 \renewcommand\lox@draft{\listoftoc[\@fxlistfixmename]{lox}}}{}

6.15.2 Options Processing

First, we execute some options to initialize FiXme to something sensible, and then we process the user ones. Note the abscence of the theme family here.

687 \ExecuteOptionsX[fx]<%
688 mode,status,lang,log,note,face,layout,envlayout,targetlayout>{%

689 mode=singleuser,%
690 status=final,%
691 lang=english,%
692 langtrack=false,%
693 defaultlang=english,%
694 nosilent,%
695 author=fixme,%
696 target=thepage,%
697 layout=margin,%
698 innerlayout={layout=inline},%
699 envlayout=plain,%
700 targetlayout=plain,%
701 inlineface=\bfseries,%
702 marginface=\footnotesize,%
703 envface=\bfseries,%
704 targetface=\itshape}
705 \ProcessOptionsX*[fx]<%
706 mode,status,lang,log,note,face,layout,envlayout,targetlayout>

707

6.15.3 The \fxsetup macro

\fxsetup  {⟨options⟩}

The inevitable setup macro, extremely impressive yet as trivial as can be with the xkeyval package… \fxsetup is the only place where the theme family is processed.

708 \newcommand*\fxsetup[1]{%
709 \@fxsetkeys{%
710  mode,status,lang,log,note,face,layout,envlayout,targetlayout,theme}{%
711  #1}}

712

6.15.4 FiXme summary

Finally, output a summary giving the number of fixme notes at the end of the compilation:

713 \AtEndDocument{%
714 \iffx@log@silent\else
715  \GenericWarning{%
716  (FiXme)\@spaces\@spaces}{%
717  FiXme Summary: Number of notes: \thefxnotecount,\MessageBreak%
718  Number of warnings: \thefxwarningcount,\MessageBreak%
719  Number of errors: \thefxerrorcount,\MessageBreak%
720  Number of fatal errors: \thefxfatalcount,\MessageBreak%
721  Total: \thefixmecount\@gobble}%
722 \fi}

723 ⟨/fixme⟩

A External Layouts

A.1 Annotation layouts

A.1.1 The marginnote layout

marginnote

724 ⟨∗fxlayoutmarginnote⟩

725 \NeedsTeXFormat{LaTeX2e}
726 \FXProvidesLayout{marginnote}

727

728 \RequirePackage{marginnote}

729

\FXLayoutMarginNote  {⟨type⟩}{⟨note⟩}{⟨author⟩}
730 \newcommand*\FXLayoutMarginNote[3]{%
731 \marginnote[\raggedleft\@fxuseface{margin}\@fxtextstd{#1}{#2}{#3}]{%
732  \raggedright\@fxuseface{margin}\@fxtextstd{#1}{#2}{#3}}}
\@fxlayout@marginnote
[no]marginnote
733 \FXRegisterLayout*[margin,marginclue]{marginnote}{\FXLayoutMarginNote}

734 ⟨/fxlayoutmarginnote⟩

A.1.2 The pdfnote layout

pdfnote

735 ⟨∗fxlayoutpdfnote⟩

736 \NeedsTeXFormat{LaTeX2e}
737 \FXProvidesLayout{pdfnote}

738

739 \RequirePackage{pdfcomment}

740

\FXLayoutPDFNote  {⟨type⟩}{⟨note⟩}{⟨author⟩}
741 \newcommand*\FXLayoutPDFNote[3]{%
742 \pdfcomment[author={#3}]{\@fxtextstd{#1}{#2}{#3}}}
\@fxlayout@pdfnote
[no]pdfnote
743 \FXRegisterLayout{pdfnote}{\FXLayoutPDFNote}

744 ⟨/fxlayoutpdfnote⟩

A.1.3 The pdfmargin layout

pdfmargin

745 ⟨∗fxlayoutpdfmargin⟩

746 \NeedsTeXFormat{LaTeX2e}
747 \FXProvidesLayout{pdfmargin}

748

749 \RequirePackage{pdfcomment}

750

\FXLayoutPDFMargin  {⟨type⟩}{⟨note⟩}{⟨author⟩}
751 \newcommand*\FXLayoutPDFMargin[3]{%
752 \pdfmargincomment[author={#3}]{\@fxtextstd{#1}{#2}{#3}}}

\@fxlayout@pdfmargin
[no]pdfmargin
753 \FXRegisterLayout*[margin,marginclue,marginnote]{pdfmargin}{%
754 \FXLayoutPDFMargin}

755 ⟨/fxlayoutpdfmargin⟩

A.1.4 The pdfsignote layout

pdfsignote

756 ⟨∗fxlayoutpdfsignote⟩

757 \NeedsTeXFormat{LaTeX2e}
758 \FXProvidesLayout{pdfsignote}

759

760 \RequirePackage{pdfcomment}

761

\FXLayoutPDFSigNote  {⟨type⟩}{⟨note⟩}{⟨author⟩}

Warning: this layout cannot use \@fxsignature properly, because of the presence of an \ifthenelse inside, and that, eventough it was declared robust. This problem seems to affect PDF layouts only. The workaround I use below is to externalize the conditional and temporarily redefine \@fxsignature accordingly. This is a bit clumsy but it works…

762 \newcommand*\FXLayoutPDFSigNote[3]{%
763 \begingroup%
764  \ifthenelse{\equal{#3}{}}{%
765  \def\@fxsignature##1{}}{%
766  \def\@fxsignature##1{ -- {\@fxuseface{signature}#1}}}%
767  \pdfcomment[author={#3}]{\@fxsigstd{#1}{#2}{#3}}%
768 \endgroup}
\@fxlayout@pdfsignote
[no]pdfsignote
769 \FXRegisterLayout[pdfnote]{pdfsignote}{\FXLayoutPDFSigNote}

770 ⟨/fxlayoutpdfsignote⟩

A.1.5 The pdfsigmargin layout

pdfsigmargin

771 ⟨∗fxlayoutpdfsigmargin⟩

772 \NeedsTeXFormat{LaTeX2e}
773 \FXProvidesLayout{pdfsigmargin}

774

775 \RequirePackage{pdfcomment}

776

\FXLayoutPDFSigMargin  {⟨type⟩}{⟨note⟩}{⟨author⟩}

Warning: this layout cannot use \@fxsignature properly, because of the presence of an \ifthenelse inside, and that, eventough it was declared robust. This problem seems to affect PDF layouts only. The workaround I use below is to externalize the conditional and temporarily redefine \@fxsignature accordingly. This is a bit clumsy but it works…

777 \newcommand*\FXLayoutPDFSigMargin[3]{%
778 \begingroup%
779  \ifthenelse{\equal{#3}{}}{%

780  \def\@fxsignature##1{}}{%
781  \def\@fxsignature##1{ -- {\@fxuseface{signature}#1}}}%
782  \pdfmargincomment[author={#3}]{\@fxsigstd{#1}{#2}{#3}}%
783 \endgroup}
\@fxlayout@pdfsigmargin
[no]pdfsigmargin
784 \FXRegisterLayout*[margin,marginclue,marginnote,pdfmargin]{pdfsigmargin}{%
785 \FXLayoutPDFSigMargin}

786 ⟨/fxlayoutpdfsigmargin⟩

A.1.6 The pdfcnote layout

pdfcnote

787 ⟨∗fxlayoutpdfcnote⟩

788 \NeedsTeXFormat{LaTeX2e}
789 \FXProvidesLayout{pdfcnote}

790

791 \RequirePackage{pdfcomment}
792 \RequirePackage{xcolor}

793

fxnote fxwarning fxerror fxfatal Environments use the same colors as the notes themselves because their contents really is a longer note.

794 \definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
795 \definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
796 \definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
797 \definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}

798

\@fxdocolon  {⟨author⟩}

Add a colon after the author tag, unless empty.

799 \providecommand*\@fxdocolon[1]{%
800 \ifthenelse{\equal{#1}{}}{\def\@fxcolon{}}{\def\@fxcolon{: }}}

801

\FXLayoutPDFCNote  {⟨type⟩}{⟨note⟩}{⟨author⟩}
802 \newcommand*\FXLayoutPDFCNote[3]{%
803 \@fxdocolon{#3}%
804 \pdfcomment[author={#3},color={fx#1}]{\ignorespaces#3\@fxcolon#2}}
\@fxlayout@pdfcnote
[no]pdfcnote
805 \FXRegisterLayout[pdfnote]{pdfcnote}{\FXLayoutPDFCNote}

806 ⟨/fxlayoutpdfcnote⟩

A.1.7 The pdfcmargin layout

pdfcmargin

807 ⟨∗fxlayoutpdfcmargin⟩

808 \NeedsTeXFormat{LaTeX2e}
809 \FXProvidesLayout{pdfcmargin}

810

811 \RequirePackage{pdfcomment}
812 \RequirePackage{xcolor}

813

fxnote fxwarning fxerror fxfatal Environments use the same colors as the notes themselves because their contents really is a longer note.

814 \definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
815 \definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
816 \definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
817 \definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}

818

\@fxdocolon  {⟨author⟩}

Add a colon after the author tag, unless empty.

819 \providecommand*\@fxdocolon[1]{%
820 \ifthenelse{\equal{#1}{}}{\def\@fxcolon{}}{\def\@fxcolon{: }}}

821

\FXLayoutPDFCMargin  {⟨type⟩}{⟨note⟩}{⟨author⟩}
822 \newcommand*\FXLayoutPDFCMargin[3]{%
823 \@fxdocolon{#3}%
824 \pdfmargincomment[author={#3},color={fx#1}]{\ignorespaces#3\@fxcolon#2}}
\@fxlayout@pdfcmargin
[no]pdfcmargin
825 \FXRegisterLayout*[margin,marginclue,marginnote,pdfmargin]{pdfcmargin}{%
826 \FXLayoutPDFCMargin}

827 ⟨/fxlayoutpdfcmargin⟩

A.1.8 The pdfcsignote layout

pdfcsignote

828 ⟨∗fxlayoutpdfcsignote⟩

829 \NeedsTeXFormat{LaTeX2e}
830 \FXProvidesLayout{pdfcsignote}

831

832 \RequirePackage{pdfcomment}
833 \RequirePackage{xcolor}

834

fxnote fxwarning fxerror fxfatal Environments use the same colors as the notes themselves because their contents really is a longer note.

835 \definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
836 \definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
837 \definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
838 \definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}

839

\FXLayoutPDFCSigNote  {⟨type⟩}{⟨note⟩}{⟨author⟩}
840 \newcommand*\FXLayoutPDFCSigNote[3]{%
841 \pdfcomment[author={#3},color={fx#1}]{#2\@fxsignature{#3}}}
\@fxlayout@pdfcsignote
[no]pdfcsignote
842 \FXRegisterLayout[pdfnote,pdfcnote]{pdfcsignote}{\FXLayoutPDFCSigNote}

843 ⟨/fxlayoutpdfcsignote⟩

A.1.9 The pdfcsigmargin layout

pdfcsigmargin

844 ⟨∗fxlayoutpdfcsigmargin⟩

845 \NeedsTeXFormat{LaTeX2e}
846 \FXProvidesLayout{pdfcsigmargin}

847

848 \RequirePackage{pdfcomment}
849 \RequirePackage{xcolor}

850

fxnote fxwarning fxerror fxfatal Environments use the same colors as the notes themselves because their contents really is a longer note.

851 \definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
852 \definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
853 \definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
854 \definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}

855

\FXLayoutPDFCSigMargin  {⟨type⟩}{⟨note⟩}{⟨author⟩}
856 \newcommand*\FXLayoutPDFCSigMargin[3]{%
857 \pdfmargincomment[author={#3},color={fx#1}]{#2\@fxsignature{#3}}}
\@fxlayout@pdfcsigmargin
[no]pdfcsigmargin
858 \FXRegisterLayout*[margin,marginclue,marginnote,pdfmargin,pdfsigmargin]{%
859 pdfcsigmargin}{%
860 \FXLayoutPDFCSigMargin}

861 ⟨/fxlayoutpdfcsigmargin⟩

A.2 Environment layouts

A.2.1 The color layout

color

862 ⟨∗fxenvlayoutcolor⟩

863 \NeedsTeXFormat{LaTeX2e}
864 \FXProvidesEnvLayout{color}

865

866 \RequirePackage{color}

867

\@fxdocolon  {⟨author⟩}

Add a colon after the author tag, unless empty.

868 \providecommand*\@fxdocolon[1]{%
869 \ifthenelse{\equal{#1}{}}{\def\@fxcolon{}}{\def\@fxcolon{: }}}

870

fxnote fxwarning fxerror fxfatal Environments use the same colors as the notes themselves because their contents really is a longer note.

871 \definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
872 \definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
873 \definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
874 \definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}

875

876 \fxsetface{env}{}

877

\begin{matrix}\FXEnvLayoutColorBegin \\ \FXEnvLayoutColorEnd \end{matrix}  \{⟨type⟩\}\{⟨author⟩\}
878 \newcommand*\FXEnvLayoutColorBegin[2]{%
879 \@fxdocolon{#2}%
880 \@fxuseface{env}\color{fx#1}\ignorespaces#2\@fxcolon\ignorespaces}
881 \newcommand*\FXEnvLayoutColorEnd[2]{}
\@fxenvlayout@color@begin
\@fxenvlayout@color@end
882 \FXRegisterEnvLayout{color}{\FXEnvLayoutColorBegin}{\FXEnvLayoutColorEnd}

883 ⟨/fxenvlayoutcolor⟩

A.2.2 The colorsig layout

colorsig

884 ⟨∗fxenvlayoutcolorsig⟩

885 \NeedsTeXFormat{LaTeX2e}
886 \FXProvidesEnvLayout{colorsig}

887

888 \RequirePackage{color}

889

signature
890 \@fxnewface[\itshape]{signature}

fxnote fxwarning fxerror fxfatal Environments use the same colors as the notes themselves because their contents really is a longer note.

891 \definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
892 \definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
893 \definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
894 \definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}

895

896 \fxsetface{env}{}

897

\begin{matrix}\FXEnvLayoutColorSigBegin \\ \FXEnvLayoutColorSigEnd \end{matrix}  \{⟨type⟩\}\{⟨author⟩\}
898 \newcommand*\FXEnvLayoutColorSigBegin[2]{\@fxuseface{env}\color{fx#1}}
899 \newcommand*\FXEnvLayoutColorSigEnd[2]{\@fxsignature{#2}}
\@fxenvlayout@colorsig@begin
\@fxenvlayout@colorsig@end
900 \FXRegisterEnvLayout{colorsig}{%
901 \FXEnvLayoutColorSigBegin}{\FXEnvLayoutColorSigEnd}

902 ⟨/fxenvlayoutcolorsig⟩

A.3 Target Layouts

Since target layouts don’t include author information, they’re orthogonal to (and hence usable in) prefix/signature display.

A.3.1 The changebar layout

changebar

903 ⟨∗fxtargetlayoutchangebar⟩

904 \NeedsTeXFormat{LaTeX2e}
905 \FXProvidesTargetLayout{changebar}

906

907 \RequirePackage{changebar}
908 \setlength{\changebarsep}{5pt}

909

910 \fxsetface{target}{}
\FXTargetLayoutChangeBar  {⟨target⟩}
911 \newcommand\FXTargetLayoutChangeBar[2]{\cbstart\@fxuseface{target}#2\cbend}
\@fxtargetlayout@changebar
912 \FXRegisterTargetLayout{changebar}{\FXTargetLayoutChangeBar}

913 ⟨/fxtargetlayoutchangebar⟩

A.3.2 The color layout

color

914 ⟨∗fxtargetlayoutcolor⟩

915 \NeedsTeXFormat{LaTeX2e}
916 \FXProvidesTargetLayout{color}

917

918 \RequirePackage{color}
919 \definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
920 \definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
921 \definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
922 \definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}

923

fxtarget
924 \definecolor{fxtarget}{rgb}{0.3725,0.6196,0.6275}

925

926 \fxsetface{target}{}

927

\FXTargetLayoutColor  {⟨target⟩}
928 \newcommand\FXTargetLayoutColor[2]{\@fxuseface{target}\color{fxtarget}#2}
\@fxtargetlayout@color
929 \FXRegisterTargetLayout{color}{\FXTargetLayoutColor}

930 ⟨/fxtargetlayoutcolor⟩

A.3.3 The colorcb layout

colorcb

931 ⟨∗fxtargetlayoutcolorcb⟩

932 \NeedsTeXFormat{LaTeX2e}
933 \FXProvidesTargetLayout{colorcb}

934

935 \RequirePackage{color}

936

937 \RequirePackage[color]{changebar}
938 \setlength{\changebarsep}{5pt}

939

940 \fxsetface{target}{}
\FXTargetLayoutColorCB  {⟨target⟩}
941 \newcommand\FXTargetLayoutColorCB[2]{%
942 \cbstart\cbcolor{fx#1}\@fxuseface{target}#2\cbend}
\@fxtargetlayout@colorcb
943 \FXRegisterTargetLayout{colorcb}{\FXTargetLayoutColorCB}

944 ⟨/fxtargetlayoutcolorcb⟩

B Themes

B.1 The signature theme

signature

945 ⟨∗fxthemesignature⟩

946 \NeedsTeXFormat{LaTeX2e}
947 \FXProvidesTheme{signature}

948

949 \fxuseenvlayout{signature}

950

951 \renewcommand*\FXLayoutFootnote[3]{\footnote{\@fxsigstd{#1}{#2}{#3}}}
952 \renewcommand*\FXLayoutMargin[3]{%
953 \marginpar[{\raggedleft\@fxuseface{margin}\@fxsigstd{#1}{#2}{#3}}]{%
954  \raggedright\@fxuseface{margin}\@fxsigstd{#1}{#2}{#3}}}
955 \renewcommand*\FXLayoutMarginClue[3]{%
956 \marginpar[{\raggedleft\@fxuseface{margin}\fxnotename{#1}!\@fxsignature{#3}}]{%
957  \raggedright\@fxuseface{margin}\fxnotename{#1}!\@fxsignature{#3}}}
958 \renewcommand*\FXLayoutInline[3]{{ \@fxuseface{inline}\@fxsigstd{#1}{#2}{#3}}}
959 \renewcommand*\FXLayoutIndex[3]{%
960 \iffx@mode@multiuser%
961  \index{***@\fixmeindexname:%
962  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
963  !\@nameuse{thefx#1count}: #2\@fxsignature{#3}}%
964  \index{***#3@\fixmeindexname{} (#3):%
965  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
966  !\@nameuse{thefx#1count}: #2}%
967 \else%
968  \index{***@\fixmeindexname:%
969  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
970  !\@nameuse{thefx#1count}: #2}%
971 \fi}
972 \renewcommand*\FXLayoutContentsLine[3]{%
973 \iffx@mode@multiuser%
974  \fxaddcontentsline{\@fxsigstd{#1}{#2}{#3}}%
975 \else%
976  \fxaddcontentsline{\fxnotename{#1}: #2}%
977 \fi}

978 ⟨/fxthemesignature⟩

B.2 The color theme

color

979 ⟨∗fxthemecolor⟩

 980 \NeedsTeXFormat{LaTeX2e}
 981 \FXProvidesTheme{color}

982

 983 \RequirePackage{color}

984

 985 \FXRequireEnvLayout{color}
 986 \FXRequireTargetLayout{color}

987

 988 \fxsetface{inline}{}

989

 990 \renewcommand*\FXLayoutFootnote[3]{%
 991 \@fxdocolon{#3}%
 992 \footnote{\color{fx#1}\ignorespaces#3\@fxcolon#2}}
 993 \renewcommand*\FXLayoutMargin[3]{%
 994 \@fxdocolon{#3}%
 995 \marginpar[%
 996 {\raggedleft\@fxuseface{margin}\color{fx#1}\ignorespaces#3\@fxcolon#2}]{%
 997  \raggedright\@fxuseface{margin}\color{fx#1}\ignorespaces#3\@fxcolon#2}}
 998 \renewcommand*\FXLayoutMarginClue[3]{%
 999 \marginpar[{\raggedleft\@fxuseface{margin}\color{fx#1}\ignorespaces#3!}]{%
1000  \raggedright\@fxuseface{margin}\color{fx#1}\ignorespaces#3!}}
1001 \renewcommand*\FXLayoutInline[3]{%
1002 \@fxdocolon{#3}%
1003 { \textcolor{fx#1}{\@fxuseface{inline}\ignorespaces#3\@fxcolon#2}}}
1004 \renewcommand*\FXLayoutIndex[3]{%
1005 \iffx@mode@multiuser%
1006  \index{***@\fixmeindexname:%
1007  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
1008  !{\color{fx#1}\@nameuse{thefx#1count}: #3: #2}}%
1009  \index{***#3@\fixmeindexname{} (#3):%
1010  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
1011  !{\color{fx#1}\@nameuse{thefx#1count}: #2}}%
1012 \else%
1013  \index{***@\fixmeindexname:%
1014  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
1015  !{\color{fx#1}\@nameuse{thefx#1count}: #2}}%
1016 \fi}

1017

1018 \renewcommand*\FXLayoutContentsLine[3]{%
1019 \@fxdocolon{#3}%
1020 \iffx@mode@multiuser%
1021  \fxaddcontentsline{\color{fx#1}\ignorespaces#3\@fxcolon#2}%
1022 \else%
1023  \fxaddcontentsline{\color{fx#1}#2}%
1024 \fi}

1025 ⟨/fxthemecolor⟩

B.3 The colorsig theme

colorsig

1026 ⟨∗fxthemecolorsig⟩

1027 \NeedsTeXFormat{LaTeX2e}
1028 \FXProvidesTheme{colorsig}

1029

1030 \RequirePackage{color}

1031

1032 \FXRequireEnvLayout{colorsig}
1033 \FXRequireTargetLayout{color}

1034

1035 \fxsetface{inline}{}

1036

1037 \renewcommand*\FXLayoutFootnote[3]{\footnote{\color{fx#1}#2\@fxsignature{#3}}}
1038 \renewcommand*\FXLayoutMargin[3]{%
1039 \marginpar[{\raggedleft\@fxuseface{margin}\color{fx#1}#2\@fxsignature{#3}}]{%
1040  \raggedright\@fxuseface{margin}\color{fx#1}#2\@fxsignature{#3}}}
1041 \renewcommand*\FXLayoutMarginClue[3]{%
1042 \marginpar[{\raggedleft\@fxuseface{margin}\color{fx#1}!\@fxsignature{#3}}]{%
1043  \raggedright\@fxuseface{margin}\color{fx#1}!\@fxsignature{#3}}}
1044 \renewcommand*\FXLayoutInline[3]{%
1045 { \textcolor{fx#1}{\@fxuseface{inline}#2\@fxsignature{#3}}}}
1046 \renewcommand*\FXLayoutIndex[3]{%
1047 \iffx@mode@multiuser%
1048  \index{***@\fixmeindexname:%
1049  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
1050  !{\color{fx#1}\@nameuse{thefx#1count}: #2\@fxsignature{#3}}}%
1051  \index{***#3@\fixmeindexname{} (#3):%
1052  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
1053  !{\color{fx#1}\@nameuse{thefx#1count}: #2}}%
1054 \else%
1055  \index{***@\fixmeindexname:%
1056  !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
1057  !{\color{fx#1}\@nameuse{thefx#1count}: #2}}%
1058 \fi}
1059 \renewcommand*\FXLayoutContentsLine[3]{%
1060 \iffx@mode@multiuser%
1061  \fxaddcontentsline{\color{fx#1}#2\@fxsignature{#3}}%
1062 \else%
1063  \fxaddcontentsline{\color{fx#1}#2}%
1064 \fi}

1065 ⟨/fxthemecolorsig⟩

Index

Numbers written in italic refer to the page where the corresponding entry is described; numbers underlined refer to the code line of the definition; numbers in roman refer to the code lines where the entry is used.

Symbols

  \@@@@fxbeginenv . . . \underline{648}
  \@@@@fxbeginenv@draft

. . . . . . . . . . . \underline{478}

                           \@@@@fxbeginenv@final

. . . . . . . . . . . \underline{478}

                                                     \@@@fxbeginenv . . . . \underline{483}
                                                     \@@@fxbeginsenv . . . \underline{494}
                                                     \@@@fxnote@early . . \underline{648}

\@@@fxnote@early@draft

. . . . . . . . . . . \underline{417}

\@@@fxnote@early@final

. . . . . . . . . . . \underline{417}

\@@@fxnote@late . . . \underline{648}
\@@@fxnote@late@draft

. . . . . . . . . . . \underline{417}

\@@@fxnote@late@final

. . . . . . . . . . . \underline{417}

\@@fxbeginenv . . . . . \underline{483}
\@@fxbeginsenv . . . . \underline{494}

\@@fxnote . . . . . . . . \underline{453}

\@@fxnote@early . . . \underline{445}
\@@fxnote@late . . . . \underline{450}
\@@fxsnote . . . . . . . \underline{460}
\@@fxtargetlayout . \underline{340}
\@FXRegisterLayout . \underline{178}
\@fxaddtolist . . . . . \underline{22}
\@fxbeginenv . . \underline{490}, \underline{501}
\@fxdefineboolkey . \underline{52}
\@fxdefinechoicekey   \underline{36}
\@fxdefinecmdkey . . \underline{35}
\@fxdefinekey . . . . . \underline{34}
\@fxdefineoptioninterface

. . . . . . . . . . . . \underline{56}

\@fxdefinevoidkey . \underline{46}
\@fxdocolon \underline{799}, \underline{819}, \underline{868}
\@fxdottedtocline . \underline{69}
\@fxearlylayouts . . \underline{159}
\@fxendenv . . . . . . . \underline{648}
\@fxendenv@draft . . \underline{478}
\@fxendenv@final . . \underline{478}
\@fxendgroup . . . . . . \underline{444}
\@fxenvlayout@begin  \underline{307}
\@fxenvlayout@color@begin

. . . . . . . . . . . \underline{882}

\@fxenvlayout@color@end

. . . . . . . . . . . \underline{882}

\@fxenvlayout@colorsig@begin

. . . . . . . . . . . \underline{900}

\@fxenvlayout@colorsig@end

. . . . . . . . . . . \underline{900}

\@fxenvlayout@end . \underline{307}
\@fxenvlayout@plain@begin

. . . . . . . . . . . \underline{298}

\@fxenvlayout@plain@end

. . . . . . . . . . . \underline{298}

\@fxenvlayout@signature@begin

. . . . . . . . . . . \underline{304}

\@fxenvlayout@signature@end

. . . . . . . . . . . \underline{304}

\@fxerrorkey . . . . . . \underline{225}
\@fxfatalkey . . . . . . \underline{225}
\@fxhandleinnermode  \underline{390}

\@fxhandlelayoutmutex

. . . . . . . . . . . \underline{167}

\@fxissuecommonlayouts

. . . . . . . . . . . \underline{414}

\@fxissueearlydraftlayouts

. . . . . . . . . . . \underline{403}

\@fxissuelatedraftlayouts

. . . . . . . . . . . \underline{403}

\@fxkeyifundefined . \underline{33}

\@fxlang . . . . . . . . . \underline{633}

\@fxlanguages . . . . . \underline{556}
\@fxlatelayouts . . . \underline{159}
\@fxlayout@footnote  \underline{214}
\@fxlayout@index . . \underline{242}
\@fxlayout@inline . \underline{217}
\@fxlayout@margin . \underline{207}
\@fxlayout@marginclue

. . . . . . . . . . . \underline{212}

\@fxlayout@marginnote

. . . . . . . . . . . \underline{733}

\@fxlayout@pdfcmargin

. . . . . . . . . . . \underline{825}

\@fxlayout@pdfcnote  \underline{805}
\@fxlayout@pdfcsigmargin

. . . . . . . . . . . \underline{858}

\@fxlayout@pdfcsignote

. . . . . . . . . . . \underline{842}

\@fxlayout@pdfmargin

. . . . . . . . . . . \underline{753}

\@fxlayout@pdfnote . \underline{743}
\@fxlayout@pdfsigmargin

. . . . . . . . . . . \underline{784}

\@fxlayout@pdfsignote

. . . . . . . . . . . \underline{769}

\@fxlistfixmename . \underline{644}
\@fxlog@error . . . . . \underline{375}
\@fxlog@fatal . . . . . \underline{375}
\@fxlog@note . . . . . . \underline{375}
\@fxlog@warning . . . \underline{375}
\@fxnewface . . . . . . . \underline{142}
\@fxnewnoteenvs . . . \underline{506}
\@fxnewnotemacro . . \underline{469}

\@fxnote . . . . . . . . . \underline{456}

\@fxnotekey . . . . . . . \underline{225}
\@fxparselayout . . . \underline{255}
\@fxpkgerror . . . . . . \underline{20}
\@fxpkginfo . . . . . . . \underline{17}
\@fxpkgwarning . . . . \underline{17}
\@fxpostconfigure . \underline{433}
\@fxpreconfigure . . \underline{467}
\@fxpresetkeys . . . . \underline{38}
\@fxrecordlayoutmutex

. . . . . . . . . . . \underline{162}

\@fxselectenvlayout  \underline{307}

\@fxselecttargetlayout

. . . . . . . . . . . \underline{340}

\@fxsetkeys . . . . . . . \underline{37}
\@fxsetlayoutkeys . \underline{254}
\@fxsignature . . . . . \underline{200}
\@fxsigstd . . . . . . . \underline{202}

\@fxsnote . . . . . . . . \underline{463}

\@fxtargetlayout . . \underline{648}
\@fxtargetlayout@changebar

. . . . . . . . . . . \underline{912}

\@fxtargetlayout@color

. . . . . . . . . . . \underline{929}

\@fxtargetlayout@colorcb

. . . . . . . . . . . \underline{943}

\@fxtargetlayout@draft

. . . . . . . . . . . \underline{354}

\@fxtargetlayout@final

. . . . . . . . . . . \underline{354}

\@fxtargetlayout@plain

. . . . . . . . . . . \underline{338}

\@fxtextstd . . . . . . . \underline{199}
\@fxuseface . . . . . . . \underline{145}
\@fxvoidkeyerror . . \underline{41}
\@fxwarningkey . . . . \underline{225}
\@lox@draft . . . . . . . \underline{667}
\@lox@prtc . . . . . . . \underline{667}
\@lox@prtc@article . \underline{96}
\@lox@prtc@book . . . \underline{111}
\@lox@prtc@report . \underline{101}
\@lox@psttc . . . . . . . \underline{667}
\@lox@psttc@article   \underline{96}
\@lox@psttc@book . . \underline{111}
\@lox@psttc@report . \underline{101}

\@wrindex . . . . . . . . \underline{219}

A

afixme (env.) …. 7, \underline{551} anfxerror (env.) . 7, \underline{546} anfxerror* (env.) . 7, \underline{546} anfxfatal (env.) . 7, \underline{546} anfxfatal* (env.) . 7, \underline{546} anfxnote (env.) . . 7, \underline{546} anfxnote* (env.) . 7, \underline{546}

anfxwarning (env.) 7, \underline{546}
anfxwarning* (env.) 7, \underline{546}

author (opt.) … 19, \underline{388}

C

changebar (target lt.)

. . . . . . . . 16, \underline{903} color (env. lt.) . . 14, \underline{862} color (target lt.) 16, \underline{914} color (theme) . . 21, \underline{979} colorcb (target lt.) 16, \underline{931} colors:

fxerror . . . . . . .

14, 16, \underline{794}, \underline{814}, \underline{835}, \underline{851}, \underline{871}, \underline{891}

fxfatal . . . . . . .

14, 16, \underline{794}, \underline{814}, \underline{835}, \underline{851}, \underline{871}, \underline{891}

fxnote . . . . . . . .

14, 16, \underline{794}, \underline{814}, \underline{835}, \underline{851}, \underline{871}, \underline{891}

fxtarget … 16, \underline{924}

fxwarning . . . . . .

14, 16, \underline{794}, \underline{814}, \underline{835}, \underline{851}, \underline{871}, \underline{891}

colorsig (env. lt.) 15, \underline{884} colorsig (theme) 21, \underline{1026} counters:

fixmecount . . . . . \underline{382}
fxerrorcount . . . \underline{382}
fxfatalcount . . . \underline{382}
fxnotecount . . . . \underline{382}
fxwarningcount . \underline{382}

croatian (lang.) …. \underline{619} croatian (opt.) . 18, \underline{639}

\croatianlistfixmename

. . . . . . . . 26, \underline{619}

D

danish (lang.) . . . . . \underline{609} danish (opt.) … 18, \underline{639}

\danishlistfixmename

. . . . . . . . 26, \underline{609} defaultlang (opt.) 18, \underline{630} draft (opt.) . . . . . 8, \underline{648}

E

english (lang.) . . . . . \underline{559} english (opt.) . . 18, \underline{639}

\englishlistfixmename

. . . . . . . . 26, \underline{559} env (face) . . . . . . 17, \underline{294} env. layouts:

color . . . . . . 14, \underline{862} colorsig … 15, \underline{884} plain . . . . . . 14, \underline{294}

signature . . . 14, \underline{300}

environments:

afixme . . . . . . 7, \underline{551}

anfxerror . . . . 7, \underline{546}
anfxerror* . . . 7, \underline{546}
anfxfatal . . . . 7, \underline{546}
anfxfatal* . . . 7, \underline{546}

anfxnote …. 7, \underline{546}

anfxnote* . . . . 7, \underline{546}

   anfxwarning . . 7, \underline{546}
   anfxwarning* . 7, \underline{546}

envlayout (opt.) . 14, \underline{321}

F

faces:

env . . . . . . . . 17, \underline{294} inline . . . . . 17, \underline{215} margin . . . . . 17, \underline{203} signature 17, \underline{300}, \underline{890} target . . . . . 17, \underline{336}

final (opt.) . . . . . 8, \underline{648} \fixme . . . . . . . . . 7, \underline{547} fixmecount (cnt.) … \underline{382}

\fixmeindexname . . . \underline{218}
\fixmelogo . . . . . . . \underline{13}

footnote (note lt.) 10, \underline{213} footnote (opt.) . 10, \underline{214} francais (lang.) …. \underline{569} francais (opt.) . 18, \underline{639} french (lang.) . . . . . \underline{569} french (opt.) … 18, \underline{639}

\frenchlistfixmename

. . . . . . . . 26, \underline{569}

\fxaddcontentsline . \underline{91}
\fxcontentsline . . . \underline{85}
\fxcroatianerrorname

. . . . . . . . 25, \underline{619}

\fxcroatianerrorsname

. . . . . . . . 25, \underline{619}

\fxcroatianfatalname

. . . . . . . . 25, \underline{619}

\fxcroatianfatalsname

. . . . . . . . 25, \underline{619}

\fxcroatiannotename

. . . . . . . . 25, \underline{619}

\fxcroatiannotesname

. . . . . . . . 25, \underline{619}

\fxcroatianwarningname

. . . . . . . . 25, \underline{619}

\fxcroatianwarningsname

. . . . . . . . 25, \underline{619}

\fxdanisherrorname .

. . . . . . . . 25, \underline{609}

\fxdanisherrorsname

. . . . . . . . 25, \underline{609}

\fxdanishfatalname .

. . . . . . . . 25, \underline{609}

\fxdanishfatalsname

. . . . . . . . 25, \underline{609}

\fxdanishnotename .

. . . . . . . . 25, \underline{609}

\fxdanishnotesname .

. . . . . . . . 25, \underline{609}

                          \fxdanishwarningname

. . . . . . . . 25, \underline{609}

                          \fxdanishwarningsname

. . . . . . . . 25, \underline{609}

                          \FXDefineEnvLayoutBoolKey

. . . . . . . . 25, \underline{292}

                          \FXDefineEnvLayoutChoiceKey

. . . . . . . . 25, \underline{292}

                          \FXDefineEnvLayoutCmdKey

. . . . . . . . 25, \underline{292}

                          \FXDefineEnvLayoutKey

. . . . . . . . 25, \underline{292}

                          \FXDefineEnvLayoutVoidKey

. . . . . . . . 25, \underline{292}

                          \FXDefineLayoutBoolKey

. . . . . . . . 25, \underline{197}

                          \FXDefineLayoutChoiceKey

. . . . . . . . 25, \underline{197}

                          \FXDefineLayoutCmdKey

. . . . . . . . 25, \underline{197}

                          \FXDefineLayoutKey .

. . . . . . . . 25, \underline{197}

                          \FXDefineLayoutVoidKey

. . . . . . . . 25, \underline{197}

                          \FXDefineTargetLayoutBoolKey

. . . . . . . . 25, \underline{334}

                          \FXDefineTargetLayoutChoiceKey

. . . . . . . . 25, \underline{334}

                          \FXDefineTargetLayoutCmdKey

. . . . . . . . 25, \underline{334}

                          \FXDefineTargetLayoutKey

. . . . . . . . 25, \underline{334}

                          \FXDefineTargetLayoutVoidKey

. . . . . . . . 25, \underline{334}

                          \fxenglisherrorname

. . . . . . . . 25, \underline{559}

                          \fxenglisherrorsname

. . . . . . . . 25, \underline{559}

                          \fxenglishfatalname

. . . . . . . . 25, \underline{559}

                          \fxenglishfatalsname

. . . . . . . . 25, \underline{559}

                          \fxenglishnotename .

. . . . . . . . 25, \underline{559}

                          \fxenglishnotesname

. . . . . . . . 25, \underline{559}

                          \fxenglishwarningname

. . . . . . . . 25, \underline{559}

                          \fxenglishwarningsname

. . . . . . . . 25, \underline{559}

                          \FXEnvLayoutColorBegin

. . . . . . . . 22, \underline{878}

                          \FXEnvLayoutColorEnd

. . . . . . . . 22, \underline{878}

\FXEnvLayoutColorSigBegin

. . . . . . . . 22, \underline{898}

\FXEnvLayoutColorSigEnd

. . . . . . . . 22, \underline{898}

\FXEnvLayoutPlainBegin

. . . . . . . . 22, \underline{295}

\FXEnvLayoutPlainEnd

. . . . . . . . 22, \underline{295}

\FXEnvLayoutSignatureBegin

. . . . . . . . 22, \underline{301}

\FXEnvLayoutSignatureEnd

. . . . . . . . 22, \underline{301} \fxerror . . . . . . . 7, \underline{546} fxerror (color) . . . . .

14, 16, \underline{794}, \underline{814}, \underline{835}, \underline{851}, \underline{871}, \underline{891}

\fxerror* . . . . . . 7, \underline{546}

fxerrorcount (cnt.) . \underline{382}

\fxfatal . . . . . . . 7, \underline{546} fxfatal (color) . . . . .

14, 16, \underline{794}, \underline{814}, \underline{835}, \underline{851}, \underline{871}, \underline{891}

\fxfatal* . . . . . . 7, \underline{546}

fxfatalcount (cnt.) . \underline{382}
\fxfrencherrorname .

. . . . . . . . 25, \underline{569}

\fxfrencherrorsname

. . . . . . . . 25, \underline{569}

\fxfrenchfatalname .

. . . . . . . . 25, \underline{569}

\fxfrenchfatalsname

. . . . . . . . 25, \underline{569}

\fxfrenchnotename .

. . . . . . . . 25, \underline{569}

\fxfrenchnotesname .

. . . . . . . . 25, \underline{569}

\fxfrenchwarningname

. . . . . . . . 25, \underline{569}

\fxfrenchwarningsname

. . . . . . . . 25, \underline{569}

\fxgermanerrorname .

. . . . . . . . 25, \underline{599}

\fxgermanerrorsname

. . . . . . . . 25, \underline{599}

\fxgermanfatalname .

. . . . . . . . 25, \underline{599}

\fxgermanfatalsname

. . . . . . . . 25, \underline{599}

\fxgermannotename .

. . . . . . . . 25, \underline{599}

\fxgermannotesname .

. . . . . . . . 25, \underline{599}

\fxgermanwarningname

. . . . . . . . 25, \underline{599}

\fxgermanwarningsname

. . . . . . . . 25, \underline{599}

\fxitalianerrorname

. . . . . . . . 25, \underline{589}

\fxitalianerrorsname

. . . . . . . . 25, \underline{589}

\fxitalianfatalname

. . . . . . . . 25, \underline{589}

\fxitalianfatalsname

. . . . . . . . 25, \underline{589}

\fxitaliannotename .

. . . . . . . . 25, \underline{589}

\fxitaliannotesname

. . . . . . . . 25, \underline{589}

\fxitalianwarningname

. . . . . . . . 25, \underline{589}

\fxitalianwarningsname

. . . . . . . . 25, \underline{589}

\FXLayoutContentsLine

. . . . . . . . . . . \underline{243}

\FXLayoutFootnote .

. . . . . . . . 22, \underline{213}

\FXLayoutIndex . 22, \underline{229}
\FXLayoutInline 22, \underline{216}
\FXLayoutMargin 22, \underline{204}
\FXLayoutMarginCLue  \underline{208}
\FXLayoutMarginClue 22
\FXLayoutMarginNote  \underline{730}
\FXLayoutPDFCMargin  \underline{822}
\FXLayoutPDFCNote . \underline{802}
\FXLayoutPDFCSigMargin

. . . . . . . . . . . \underline{856}

\FXLayoutPDFCSigNote

. . . . . . . . . . . \underline{840}

\FXLayoutPDFMargin . \underline{751}
\FXLayoutPDFNote . . \underline{741}
\FXLayoutPDFSigMargin

. . . . . . . . . . . \underline{777}

\FXLayoutPDFSigNote  \underline{762}
\fxloadenvlayouts .

. . . . . . . . 14, \underline{313}

\fxloadlayouts . 10, \underline{250}
\fxloadtargetlayouts

. . . . . . . . 15, \underline{344}

\FXLogerror . . . . . . . \underline{358}
\FXLogFatal . . . . . . . \underline{358}
\FXLogNote . . . . . . . \underline{358}
\FXLogWarning . . . . . \underline{358}

\fxnote . . . . . . . . 7, \underline{546} fxnote (color) . . . . .

14, 16, \underline{794}, \underline{814}, \underline{835}, \underline{851}, \underline{871}, \underline{891}

\fxnote* . . . . . . . 7, \underline{546}

fxnotecount (cnt.) . . \underline{382}

                          \fxnotename . . . . . . . \underline{645}
                          \fxnotesname . . . . . . \underline{645}
                          \FXProvidesEnvLayout

. . . . . . . . 24, \underline{280}

                          \FXProvidesLayout .

. . . . . . . . 23, \underline{161}

                          \FXProvidesTargetLayout

. . . . . . . . 24, \underline{323}

                          \FXProvidesTheme 25, \underline{664}
                          \FXRegisterAuthor .

. . . . . . . . 19, \underline{526}

                          \FXRegisterEnvLayout

. . . . . . . . 24, \underline{281}

                          \FXRegisterLayout .

. . . . . . . . 23, \underline{190}

                          \FXRegisterLayout* .

. . . . . . . . 23, \underline{190}

                          \FXRegisterTargetLayout

. . . . . . . . 24, \underline{324}

                          \FXRequireEnvLayout

. . . . . . . . 25, \underline{317}

                          \FXRequireLayouts . 25
                          \FXRequireTargetLayout

. . . . . . . . 25, \underline{348}

                          \fxsetface . . . . 17, \underline{141}

\fxsetup . . . . . . . 6, \underline{708}

                          \fxspanisherrorname

. . . . . . . . 25, \underline{579}

                          \fxspanisherrorsname

. . . . . . . . 25, \underline{579}

                          \fxspanishfatalname

. . . . . . . . 25, \underline{579}

                          \fxspanishfatalsname

. . . . . . . . 25, \underline{579}

                          \fxspanishnotename .

. . . . . . . . 25, \underline{579}

                          \fxspanishnotesname

. . . . . . . . 25, \underline{579}

                          \fxspanishwarningname

. . . . . . . . 25, \underline{579}

                          \fxspanishwarningsname

. . . . . . . . 25, \underline{579} fxtarget (color) . 16, \underline{924}

                          \FXTargetLayoutChangeBar

. . . . . . . . . . . \underline{911}

                          \FXTargetLayoutColor

. . . . . . . . 22, \underline{928}

                          \FXTargetLayoutColorCB

. . . . . . . . . . . \underline{941}

                          \FXTargetLayoutPlain

. . . . . . . . 22, \underline{337}

                          \fxuseenvlayout 14, \underline{317}
                          \fxuselayouts . . . . . . 9

\fxusetargetlayout .

. . . . . . . . 15, \underline{348}

\fxusetheme . . . . 21, \underline{665}
\fxwarning . . . . . 7, \underline{546}

fxwarning (color) … 14, 16, \underline{794}, \underline{814}, \underline{835}, \underline{851}, \underline{871}, \underline{891}

\fxwarning* . . . . . 7, \underline{546}
fxwarningcount (cnt.) \underline{382}

G

german (lang.) . . . . . \underline{599} german (opt.) … 18, \underline{639}

\germanlistfixmename

. . . . . . . . 26, \underline{599}

I

index (note lt.) . . 10, \underline{218} index (opt.) …. 10, \underline{242} inline (face) … 17, \underline{215} inline (note lt.) . 10, \underline{215} inline (opt.) … 10, \underline{217} innerlayout (opt.) 11, \underline{272} italian (lang.) . . . . . \underline{589} italian (opt.) . . 18, \underline{639}

\italianlistfixmename

. . . . . . . . 26, \underline{589}

L

\l@fixme . . . . . . . . . \underline{68} lang (opt.) . . . . . 18, \underline{633} langtrack (opt.) . 18, \underline{629} languages:

croatian . . . . . . \underline{619} danish . . . . . . . . \underline{609} english . . . . . . . \underline{559} francais . . . . . . \underline{569} french . . . . . . . . \underline{569} german . . . . . . . . \underline{599} italian . . . . . . . \underline{589} ngerman . . . . . . . \underline{599} spanish . . . . . . . \underline{579}

layout (opt.) …. 9, \underline{274}

\listoffixmes . . . 7, \underline{648}
\lox@draft . . . . . . . \underline{121}
\lox@draft@ams . . . . \underline{139}
\lox@final . . . . . . . \underline{121}

M

margin (face) … 17, \underline{203} margin (note lt.) . 10, \underline{203} margin (opt.) … 10, \underline{207}

marginclue (note lt.)

. . . . . . . . 10, \underline{208} marginclue (opt.) 10, \underline{212}

marginnote (note lt.)

. . . . . . . . 11, \underline{724} marginnote (opt.) 11, \underline{733} mode (opt.) . . . . . 20, \underline{147} morelayout (opt.) . 9, \underline{273} multiuser (opt.) . 20, \underline{147}

N

ngerman (lang.) . . . . . \underline{599} ngerman (opt.) . . 18, \underline{639} nofootnote (opt.) 10, \underline{214} noindex (opt.) . . 10, \underline{242} noinline (opt.) . 10, \underline{217} nomargin (opt.) . 10, \underline{207}

nomarginclue (opt.) .

. . . . . . . . 10, \underline{212}

nomarginnote (opt.) .

. . . . . . . . 11, \underline{733}

nopdfcmargin (opt.) .

. . . . . . . . 11, \underline{825} nopdfcnote (opt.) 11, \underline{805}

nopdfcsigmargin

(opt.) … 11, \underline{858}

nopdfcsignote (opt.)

. . . . . . . . 11, \underline{842} nopdfmargin (opt.) 11, \underline{753} nopdfnote (opt.) . 11, \underline{743}

nopdfsigmargin (opt.)

. . . . . . . . 11, \underline{784}

nopdfsignote (opt.) .

. . . . . . . . 11, \underline{769} nosilent (opt.) . 17, \underline{380} note layouts:

footnote … 10, \underline{213} index . . . . . . 10, \underline{218} inline . . . . . 10, \underline{215} margin . . . . . 10, \underline{203}

marginclue . . 10, \underline{208}
marginnote . . 11, \underline{724}
pdfcmargin . . 11, \underline{807}

pdfcnote … 11, \underline{787}

pdfcsigmargin 11, \underline{844}
pdfcsignote . 11, \underline{828}
pdfmargin . . . 11, \underline{745}

pdfnote …. 11, \underline{735}

pdfsigmargin 11, \underline{771}
pdfsignote . . 11, \underline{756}

O

options:

author . . . . . 19, \underline{388} croatian … 18, \underline{639} danish . . . . . 18, \underline{639}

defaultlang . 18, \underline{630}

draft . . . . . . . 8, \underline{648} english …. 18, \underline{639}

envlayout . . . 14, \underline{321}

final . . . . . . . 8, \underline{648} footnote … 10, \underline{214} francais … 18, \underline{639} french . . . . . 18, \underline{639} german . . . . . 18, \underline{639} index . . . . . . 10, \underline{242} inline . . . . . 10, \underline{217}

innerlayout . 11, \underline{272}

italian …. 18, \underline{639} lang . . . . . . . 18, \underline{633}

langtrack . . . 18, \underline{629}

layout . . . . . . 9, \underline{274} margin . . . . . 10, \underline{207}

marginclue . . 10, \underline{212}
marginnote . . 11, \underline{733}

mode . . . . . . . 20, \underline{147}

morelayout . . . 9, \underline{273}
multiuser . . . 20, \underline{147}

ngerman …. 18, \underline{639}

nofootnote . . 10, \underline{214}

noindex …. 10, \underline{242} noinline … 10, \underline{217} nomargin … 10, \underline{207}

nomarginclue 10, \underline{212}
nomarginnote 11, \underline{733}
nopdfcmargin 11, \underline{825}
nopdfcnote . . 11, \underline{805}
nopdfcsigmargin

. . . . . . . . 11, \underline{858}

nopdfcsignote 11, \underline{842}
nopdfmargin . 11, \underline{753}
nopdfnote . . . 11, \underline{743}
nopdfsigmargin .

. . . . . . . . 11, \underline{784}

nopdfsignote 11, \underline{769}

nosilent … 17, \underline{380}

pdfcmargin . . 11, \underline{825}

pdfcnote … 11, \underline{805}

pdfcsigmargin 11, \underline{858}
pdfcsignote . 11, \underline{842}
pdfmargin . . . 11, \underline{753}

pdfnote …. 11, \underline{743}

pdfsigmargin 11, \underline{784}
pdfsignote . . 11, \underline{769}

silent . . . . . 17, \underline{380}

singleuser . . 20, \underline{147}

spanish …. 18, \underline{639} status . . . . . . 8, \underline{648} target . . . . . 13, \underline{389}

targetlayout 15, \underline{352}

theme . . . . . . 21, \underline{666}

P

pdfcmargin (note lt.)

. . . . . . . . 11, \underline{807} pdfcmargin (opt.) 11, \underline{825} pdfcnote (note lt.) 11, \underline{787} pdfcnote (opt.) . 11, \underline{805}

pdfcsigmargin (note

lt.) . . . . . 11, \underline{844}

pdfcsigmargin (opt.)

. . . . . . . . 11, \underline{858}

pdfcsignote (note lt.)

. . . . . . . . 11, \underline{828} pdfcsignote (opt.) 11, \underline{842} pdfmargin (note lt.) .

. . . . . . . . 11, \underline{745} pdfmargin (opt.) . 11, \underline{753} pdfnote (note lt.) 11, \underline{735} pdfnote (opt.) . . 11, \underline{743}

pdfsigmargin (note lt.)

. . . . . . . . 11, \underline{771}

pdfsigmargin (opt.) .

. . . . . . . . 11, \underline{784}

pdfsignote (note lt.)

. . . . . . . . 11, \underline{756} pdfsignote (opt.) 11, \underline{769} plain (env. lt.) . . 14, \underline{294} plain (target lt.) 16, \underline{336}

S

signature (env. lt.) .

. . . . . . . . 14, \underline{300} signature (face) ….

. . . . . 17, \underline{300}, \underline{890} signature (theme) 21, \underline{945} silent (opt.) … 17, \underline{380} singleuser (opt.) 20, \underline{147} spanish (lang.) . . . . . \underline{579} spanish (opt.) . . 18, \underline{639}

                          \spanishlistfixmename

. . . . . . . . 26, \underline{579} status (opt.) …. 8, \underline{648}

T target (face) … 17, \underline{336} target (opt.) … 13, \underline{389} target layouts:

                             changebar . . . 16, \underline{903}

color . . . . . . 16, \underline{914} colorcb …. 16, \underline{931} plain . . . . . . 16, \underline{336}

                          targetlayout (opt.) .

. . . . . . . . 15, \underline{352} theme (opt.) …. 21, \underline{666} themes:

color . . . . . . 21, \underline{979} colorsig . . 21, \underline{1026}

                             signature . . . 21, \underline{945}

Copyright \begin{matrix}c \\ ◯ \end{matrix} 1998–2002, 2004–2007, 2009, 2013, 2017-2019 Didier Verna.