summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/fixme
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/fixme
Initial commit
Diffstat (limited to 'macros/latex/contrib/fixme')
-rw-r--r--macros/latex/contrib/fixme/NEWS162
-rw-r--r--macros/latex/contrib/fixme/README.md74
-rw-r--r--macros/latex/contrib/fixme/THANKS37
-rw-r--r--macros/latex/contrib/fixme/fixme.dtx4543
-rw-r--r--macros/latex/contrib/fixme/fixme.el687
-rw-r--r--macros/latex/contrib/fixme/fixme.ins78
-rw-r--r--macros/latex/contrib/fixme/fixme.pdfbin0 -> 394702 bytes
7 files changed, 5581 insertions, 0 deletions
diff --git a/macros/latex/contrib/fixme/NEWS b/macros/latex/contrib/fixme/NEWS
new file mode 100644
index 0000000000..7e9c520dfc
--- /dev/null
+++ b/macros/latex/contrib/fixme/NEWS
@@ -0,0 +1,162 @@
+ WHAT'S NEW IN FIXME
+
+
+Copyright (C) 1998-2002, 2004-2007, 2009, 2013, 2017-2019 Didier Verna
+
+Author: Didier Verna <didier@didierverna.net>
+
+This file is part of FiXme.
+
+FiXme may be distributed and/or modified under the conditions of the LaTeX
+Project Public License, either version 1.3 of this license or (at your option)
+any later version. The latest version of this license is in
+http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all
+distributions of LaTeX version 2005/12/01 or later.
+
+FiXme consists of the files listed in the file `README.md'.
+
+
+* Version 4.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.
+
+* Version 4.4
+** Handle existing yet empty lox files 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.
+
+* Version 4.3
+** Add a paragraph about the duplication of notes in captions
+upon exchange with Kreuvf.
+** Update support for the KOMA-Script classes to the tocbasic interface
+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 bracket parsing problems
+thanks to Joseph Wright and Lars Madsen.
+
+* Version 4.2
+** Improve Danish translation
+thanks to Lars Madsen.
+** Fix buglet in redefinition of \@wrindex
+reported by Norman Gray.
+
+* Version 4.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.
+
+* Version 4.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 alternate 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 log and console messages.
+** Heavy internals refactoring.
+
+* Version 3.4
+** \fixme, \fxerror, \fxwarning and \fxnote are now robust
+thanks to Will Robertson.
+** Fix incompatibility with KOMA-Script classes
+when the lox file is inexistent, reported by Philipp Stephani.
+
+* Version 3.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 KOMA-Script classes version 2006/07/30 v2.95b
+suggested by Jens Remus.
+** Documentation improvements
+suggested by Brian van den Broek.
+** Fix incompatibility with AMS-Art
+reported by Lars Madsen: \@starttoc takes 2 arguments.
+** Fix bug in \fixme@footnotetrue
+reported by Stefan Mann: a typo in the macro name.
+
+* Version 3.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 AMS-Book
+reported by Claude Lacoursière: \@starttoc takes 2 arguments.
+** Fix incompatibility with Beamer
+reported by Akim Demaille: protect contents of lox file in environments.
+
+* Version 3.1
+** Fix bug in environments
+reported by Arnold Beckmann: they were visible in final mode.
+
+* Version 3.0
+** Added fixme environments
+providing similar functionalities as already existing macros.
+** Added an optional first argument to the note insertion commands
+to change the layout locally.
+** Fix bug in marginal notes
+reported by Akim Demaille: they could mess up the document's layout by
+flushing it right.
+
+* Version 2.2
+** New option "silent" to suppress notes logging.
+** Support for Danish
+thanks to Kim Rud Bille.
+
+* Version 2.1
+** Use \nobreakspace instead of the tilda character:
+this avoids conflicts with Babel and Spanish environments.
+** Fix bug in index handling
+reported by Knut Lickert: index entries were
+unconditionally built.
+
+* Version 2.0
+** New feature: note levels.
+** New feature: note counters, FiXme usage summary.
+** Suggestions from Kasper B. Graversen.
+** Support for Spanish
+thanks to Augustín Martín.
+
+* Version 1.5
+** New `inline' layout option:
+puts notes directly in the text.
+
+* Version 1.4
+** Support for the koma-script classes.
+** Fix bug in \listoffixmes
+reported by Ulf Jaenicke-Roessler: the command didn't work when called before
+the first fixme note.
+
+* Version 1.3
+** Support for Italian
+thanks to Riccardo Murri.
+
+* Version 1.2
+** Support for German
+thanks to Harald Harders.
+
+
+
+
+Local Variables:
+mode: outline
+End:
diff --git a/macros/latex/contrib/fixme/README.md b/macros/latex/contrib/fixme/README.md
new file mode 100644
index 0000000000..9e6ea65248
--- /dev/null
+++ b/macros/latex/contrib/fixme/README.md
@@ -0,0 +1,74 @@
+ABOUT FIXME
+===========
+
+Copyright (C) 1998-2002, 2004-2007, 2009, 2013, 2017 Didier Verna
+
+Author: Didier Verna <didier@didierverna.net>
+
+This file is part of FiXme.
+
+FiXme may be distributed and/or modified under the conditions of the LaTeX
+Project Public License, either version 1.3 of this license or (at your option)
+any later version. The latest version of this license is in
+http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all
+distributions of LaTeX version 2005/12/01 or later.
+
+FiXme consists of the following files:
+
+- README.md (this file)
+- NEWS
+- fixme.ins
+- fixme.dtx
+- fixme.el
+- THANKS
+
+
+Description
+-----------
+FiXme is a collaborative annotation tool for LaTeX documents. Annotating a
+document refers here 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 disappear 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](https://www.gnu.org/software/auctex/).
+
+FiXme homepage: http://www.lrde.epita.fr/~didier/software/latex.php#fixme
+
+
+Installation
+------------
+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](https://www.lrde.epita.fr/~didier/software/latex.php#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 LaTeX can find them. 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]
+
+If you're an AUCTeX user, you may also install the file `fixme.el` in a
+suitable AUCTeX style directory.
diff --git a/macros/latex/contrib/fixme/THANKS b/macros/latex/contrib/fixme/THANKS
new file mode 100644
index 0000000000..efd61bb808
--- /dev/null
+++ b/macros/latex/contrib/fixme/THANKS
@@ -0,0 +1,37 @@
+ THANK YOU!
+
+
+Copyright (C) 2007, 2009, 2013, 2017, 2018 Didier Verna
+
+Author: Didier Verna <didier@didierverna.net>
+
+This file is part of FiXme.
+
+FiXme may be distributed and/or modified under the conditions of the LaTeX
+Project Public License, either version 1.3 of this license or (at your option)
+any later version. The latest version of this license is in
+http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all
+distributions of LaTeX version 2005/12/01 or later.
+
+FiXme consists of the files listed in the file `README.md'.
+
+
+* Contributors
+
+** The following persons have contributed code, bug reports, localization,
+** suggestions etc.:
+
+Soeren Wolfers, Frank Mittelbach, Ikumi Keita, Arash Esbati, Kreuvf, Dirk
+Surmann, Victor Porton, Joseph Wright, Lars Madsen, Norman Gray, Sébastien
+Mengin, Michael Kubovy, Mark Edgington, Rasmus Villemoes, Philipp Stephani,
+Will Robertson, Jochen Wuttke, Jens Remus, Brian van den Broek, Stefan Mann,
+Marcel Maretic, Claude Lacoursière, Arnold Beckmann, Akim Demaille, Kim Rud
+Bille, Knut Lickert, Kasper B. Graversen, Augustín Martín, Ulf
+Jaenicke-Roessler, Riccardo Murri, Harald Harders.
+
+
+
+
+Local Variables:
+mode: outline
+End:
diff --git a/macros/latex/contrib/fixme/fixme.dtx b/macros/latex/contrib/fixme/fixme.dtx
new file mode 100644
index 0000000000..6cf902ef5f
--- /dev/null
+++ b/macros/latex/contrib/fixme/fixme.dtx
@@ -0,0 +1,4543 @@
+% \iffalse
+%
+% fixme.dtx --- docTeX file for FiXme
+%
+% Copyright (C) 1998-2002, 2004-2007, 2009, 2013, 2017-2019 Didier Verna
+%
+% Author: Didier Verna <didier@didierverna.net>
+%
+% This file is part of FiXme.
+%
+% FiXme may be distributed and/or modified under the conditions of the LaTeX
+% Project Public License, either version 1.3 of this license or (at your
+% option) any later version. The latest version of this license is in
+% http://www.latex-project.org/lppl.txt and version 1.3 or later is part of
+% all distributions of LaTeX version 2005/12/01 or later.
+%
+% FiXme consists of the files listed in the file `README.md'.
+%
+%
+% Commentary:
+%
+%
+% Code:
+%
+%<*driver>
+\documentclass[a4paper]{ltxdoc}
+\usepackage{xspace}
+
+\usepackage{dox}[2009/09/21]
+\doxitem[idxtype=env.]{Env}{environment}{environments}
+\doxitem[idxtype=opt.]{Option}{option}{options}
+\doxitem[idxtype=cnt.]{Counter}{counter}{counters}
+\doxitem[idxtype=lang.]{Lang}{lang}{languages}
+\doxitem[idxtype=cond.]{Cond}{cond}{conditionals}
+\doxitem{Face}{face}{faces}
+\doxitem{Color}{color}{colors}
+\doxitem[idxtype={note lt.}]{Layout}{layout}{note layouts}
+\doxitem[idxtype={env. lt.}]{EnvLayout}{envlayout}{env. layouts}
+\doxitem[idxtype={target lt.}]{TargetLayout}{targetlayout}{target layouts}
+\doxitem{Theme}{theme}{themes}
+
+% #### NOTE: I don't want to \usepackage{fixme} just for getting the file
+% information. So here what I do: generate a header with only the
+% \ProvidesPackage command, and also the \fixmelogo. Then, I \input it so that
+% \GetFileInfo works. However, I need to manually set the current file name
+% and extension that would normally be set by \RequirePackage. Also, note that
+% the call to \GetFileInfo below needs to use the extension of the header,
+% that is inc instead of sty, even the file fixme.inc does not really exist.
+\makeatletter
+ \def\@currname{fixme}
+ \def\@currext{inc}
+\makeatother
+\input{header.inc}
+% \OnlyDescription
+\CodelineIndex
+% \RecordChanges
+\setcounter{secnumdepth}{4}
+\begin{document}
+\DocInput{fixme.dtx}
+\end{document}
+%</driver>
+%
+% \fi
+%
+% \CheckSum{1769}
+% \GetFileInfo{fixme.inc}
+%% \CharacterTable
+%% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+%% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+%% Digits \0\1\2\3\4\5\6\7\8\9
+%% Exclamation \! Double quote \" Hash (number) \#
+%% Dollar \$ Percent \% Ampersand \&
+%% Acute accent \' Left paren \( Right paren \)
+%% Asterisk \* Plus \+ Comma \,
+%% Minus \- Point \. Solidus \/
+%% Colon \: Semicolon \; Less than \<
+%% Equals \= Greater than \> Question mark \?
+%% Commercial at \@ Left bracket \[ Backslash \\
+%% Right bracket \] Circumflex \^ Underscore \_
+%% Grave accent \` Left brace \{ Vertical bar \|
+%% Right brace \} Tilde \~}
+%
+% \MakeShortVerb{\|}
+%
+% \makeatletter
+% \def\ps@mystyle{
+% \def\@oddfoot{\hfil\thepage\hfil}
+% \def\@evenfoot{\hfil\thepage\hfil}
+% \def\@evenhead{\hfil\slshape\leftmark}
+% \def\@oddhead{\slshape\rightmark\hfil}}
+% \renewcommand\paragraph{\@startsection{paragraph}{4}{\z@}{%
+% -3.25ex\@plus -1ex \@minus -.2ex}{%
+% 1.5ex \@plus .2ex}{%
+% \normalfont\normalsize\bfseries}}
+% \makeatother
+%
+% \newcommand*\DescribeBooleanOption[1]{%
+% {\let\oldpdo\PrintDescribeOption%
+% \def\PrintDescribeOption##1{\oldpdo{[no]##1}}%
+% \let\oldsoi\SpecialOptionIndex%
+% \def\SpecialOptionIndex##1{\oldsoi{##1}\oldsoi{no##1}}%
+% \DescribeOption{#1}}}
+%
+% \newenvironment{booleanoption}[1]{%
+% \let\oldpon\PrintOptionName%
+% \def\PrintOptionName##1{\oldpon{[no]##1}}%
+% \let\oldsmoi\SpecialMainOptionIndex%
+% \def\SpecialMainOptionIndex##1{\oldsmoi{##1}\oldsmoi{no##1}}%
+% \begin{option}{#1}}{%
+% \end{option}}
+%
+% ^^A Let's not depend on varioref for just that:
+% \newcommand\sectionref[1]{\ref{#1} on page \pageref{#1}}
+%
+% \newcommand\etc{\textit{etc.}\xspace}
+% \newcommand\vs{\textit{vs.}\xspace}
+% \newcommand\ie{\textit{i.e.}\xspace}
+% \newcommand\komascript{\textsc{Koma}-Script\xspace}
+% \newcommand\auctex{AUC\TeX\xspace}
+% \newcommand\emacs{\textsf{Emacs}\xspace}
+%
+% \newcommand\fx{\fixmelogo\xspace}
+% \newcommand\packagecopyright{%
+% Copyright \copyright{} 1998--2002, 2004--2007, 2009, 2013, 2017-2019 Didier Verna}
+%
+% \pagestyle{mystyle}
+% \newcommand\fxmarkright{%
+% \markright{\hskip-.5\marginparwidth \fx \fileversion{} (\filedate)}}
+% \fxmarkright
+%
+% \date{\texttt{\fileversion{} (\filedate)}}
+% \title{\fx{} -- Collaborative annotation tool for \LaTeX\footnote{%
+% \fx homepage: %
+% \texttt{http://www.lrde.epita.fr/\~{}didier/software/latex.php\#fixme}}}
+% \author{Didier Verna\\
+% \texttt{mailto:didier@didierverna.net}\\
+% \texttt{http://www.lrde.epita.fr/\~{}didier/}}
+% \maketitle
+%
+%
+% \begin{abstract}
+% \fx is a collaborative annotation tool for \LaTeX{} 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.
+%
+% \fx 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 \fx is extensible, giving you the possibility to
+% create new layouts or even complete ``themes'', and also comes with
+% support for \auctex.
+%
+% The \fx package is \packagecopyright{}, and distributed under the
+% terms of the LPPL license.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Installation}
+% \subsection{Extraction}
+% If you are building \fx from the tarball you need to execute the following
+% steps in order to extract the necessary files. \fx also requires the
+% \textsf{DoX} package (version 2.0, release date 2009/09/21 or later), to
+% build. It is not required to use the package.
+% \begin{verbatim}
+% [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
+% \end{verbatim}
+% After that, you need to install the generated documentation and style files
+% to a location where \LaTeX{} can find them.
+%
+% \subsection{TDS-compliant layout}
+% For a TDS-compliant layout, the following locations are suggested:
+% \begin{verbatim}
+% [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]
+% \end{verbatim}
+%
+% \subsection{\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. \fx supports \auctex by providing a style file named
+% \texttt{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 \LaTeX{} styles directory). Please refer
+% to the \auctex documentation for more information on this.
+%
+% \section{Features summary}
+% If you're new to \fx, 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 \sectionref{sec:manual:history}) to see what's new.
+% \subparagraph{Annotation levels} \fx 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.
+% \subparagraph{Layouts and themes} \fx 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. \fx also comes with support
+% for ``themes'', globally modifying existing layouts, or providing new ones.
+% \subparagraph{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.
+% \subparagraph{Listing and indexing} Annotations may be indexed and
+% summarized in a ``list of fixmes''.
+% \subparagraph{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.
+% \subparagraph{Modes} All these features are actually available when you're
+% working in \texttt{draft} mode. In \texttt{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).
+% \subparagraph{Authoring} \fx provides support for collaborative annotating
+% by allowing you to ``register'' several authors.
+% \subparagraph{Internationalization} \fx currently supports 7 different
+% languages and features automatic language tracking for multilingual
+% documents.
+%
+% \section{Using \fx}
+% \subsection{Initialization}
+% \subsubsection{Requirements}
+% In order to work properly, \fx requires the presence of some \LaTeX{}
+% packages. You don't have to load them explicitly though. As long as
+% \LaTeX{} can locate them, they will be used automatically. \fx currently
+% depends on \texttt{xspace}, \texttt{ifthen}, \texttt{verbatim} and
+% \texttt{xkeyval} (version 2.5f, release date 2006/11/18 or later).
+%
+% \subsubsection{Loading the package}
+% In order to load \fx, simply say |\usepackage[|\meta{options}|]{fixme}|
+% in the preamble of your document. There is an important number of options
+% that you can use in order to customize \fx's default or global behavior.
+% These options will be discussed when appropriate.
+%
+% There might be times where you would like to use \LaTeX{} commands in
+% package options (for example, see section \sectionref{sec:manual:faces}). In
+% such a case, you should know that \LaTeX{} normally can't handle this. In
+% order to make it work, you need to use the \texttt{xkvltxp} package first,
+% like this:
+% \begin{verbatim}
+% \usepackage{xkvltxp}
+% \usepackage[myoption=\mymacro]{fixme}
+% \end{verbatim}
+%
+% \subsubsection{Global setup modification}
+% \DescribeMacro{\fxsetup}\marg{options}\\
+% Another way of customizing \fx's global behavior is to use the
+% \cs{fxsetup} command. \cs{fxsetup} understands the same options as the
+% package itself and can be used in the preamble as well as in the document's
+% body.
+%
+% \subsubsection{Local setup modification}
+% Finally, note that unless specified otherwise, all package options are also
+% understood by the annotation commands or environments described in
+% section \sectionref{sec:manual:insertion}. The effect is then local to that
+% particular command.
+%
+% \subsection{Inserting \fx notes\label{sec:manual:insertion}}
+% \subsubsection{Commands}
+% \DescribeMacro{\fxnote}
+% \DescribeMacro{\fxwarning}
+% \DescribeMacro{\fxerror}
+% \DescribeMacro{\fxfatal}\oarg{options}\marg{note}\\
+% \fx provides four annotation commands corresponding to different
+% levels of importance (notes, warnings, errors and fatal errors).
+% \cs{fxfatal} is a bit different from the other ones, as will be explained in
+% section \sectionref{sec:manual:behavior}.\par
+% \begin{quotation}\itshape
+% \DescribeMacro{\fixme}
+% \textbf{Warning:} as of version 4, the \cs{fixme} command is a synonym for
+% \cs{fxfatal} and is considered deprecated.
+% \end{quotation}
+%
+% \subsubsection{Targeted commands}
+% \DescribeMacro{\fxnote*}
+% \DescribeMacro{\fxwarning*}
+% \DescribeMacro{\fxerror*}
+% \DescribeMacro{\fxfatal*}\oarg{options}\marg{note}\marg{text}\\
+% Sometimes, you might not only want to issue a \fx 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, \fx 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.
+%
+% \subsubsection{Environments}
+% \begin{quotation}\itshape
+% \textbf{Warning:} as of version 4.0, the environment interface has changed
+% and is \emph{not} backward-compatible.
+% \end{quotation}
+% \DescribeEnv{anfxnote}
+% \DescribeEnv{anfxwarning}
+% \DescribeEnv{anfxerror}
+% \DescribeEnv{anfxfatal}\oarg{options}\marg{summary}\\
+% \fx 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. \fx 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 \sectionref{sec:manual:layout}): the environment's contents will
+% always appear inline, and the \meta{summary} will obey all active annotation
+% layouts except for the \texttt{inline} one, just as if it had been passed to
+% one of the \fx annotation commands described in the previous section.
+% \begin{quotation}\itshape
+% \DescribeEnv{afixme}
+% \textbf{Warning:} as of version 4, the \texttt{afixme} environement is a
+% synonym for \texttt{anfxfatal}, and is considered deprecated.
+% \end{quotation}
+%
+%
+%
+% \subsubsection{Targeted environments}
+% \DescribeEnv{anfxnote*}
+% \DescribeEnv{anfxwarning*}
+% \DescribeEnv{anfxerror*}
+% \DescribeEnv{anfxfatal*}\oarg{options}\marg{summary}\marg{text}\\
+% \fx 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.
+%
+% \subsection{List of \fx's\label{sec:manual:lox}}
+% \DescribeMacro{\listoffixmes}
+% \fx remembers where you put your annotations in a toc-like file whose
+% extension is \texttt{lox}. The \cs{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 \texttt{article},
+% \texttt{report} and \texttt{book} classes and the AMS ones. If loaded, \fx
+% will also use the \texttt{tocbasic} package which makes it compliant with
+% the \komascript classes and any other document using it. If another class
+% is used, the \texttt{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 \texttt{final}
+% mode, regardless of the presence of remaining annotations (see
+% section \sectionref{sec:manual:behavior}).
+%
+% \subsection{Controlling the behavior of \fx\label{sec:manual:behavior}}
+% \DescribeOption{final}
+% \DescribeOption{draft}
+% The behavior of \fx is controlled by the two standard options
+% \texttt{final} and \texttt{draft}. These options are usually given to
+% \cs{documentclass} which in turn passes them to all packages. In addition,
+% you can also use them as options to \cs{usepackage}, in the call to
+% \cs{fxsetup}, and even to the annotation commands and environments.
+%
+% In \texttt{draft} mode, annotations are recorded in the log file and appear
+% in the document as specified by the layout settings (see section
+% \sectionref{sec:manual:layout}). Additionally, warnings, errors and fatal
+% errors are also displayed on the terminal.
+%
+% In final mode, non fatal annotations (those generated by \cs{fxnote},
+% \cs{fxwarning}, \cs{fxerror} and their corresponding environments) are still
+% logged, but they're not typeset. On the other hand, fatal ones (those
+% generated by the \cs{fxfatal} command and the \texttt{anfxfatal}
+% environment) will throw a \LaTeX{} 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 \fx 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 \texttt{final} mode, you can use something like
+% this:
+% \begin{verbatim}
+% \fxfatal[draft]{bla bla}
+% \end{verbatim}
+%
+% \DescribeOption{status}
+% By default, \fx is in \texttt{final} mode (\LaTeX{} itself behaves that
+% way). If you're manipulating the document status at the level of \fx
+% itself (as opposed to the \cs{documentclass} level), then the preferred way
+% to do this is to use the \texttt{status} option, and give it the value
+% \texttt{final} or \texttt{draft}.
+%
+% \subsection{Controlling the layout of annotations\label{sec:manual:layout}}
+% 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.
+%
+% \subsubsection{Selecting a layout}
+% \paragraph{Individual control}
+% For each annotation layout, there is a corresponding boolean option (for
+% instance, the ``inline'' layout is controlled by the \texttt{inline}
+% option). These options are understood by the package itself, the
+% \cs{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
+% \texttt{true}. For instance, these two forms are equivalent:
+% \begin{verbatim}
+% \fxnote[inline]{note...}
+% \fxnote[inline=true]{note...}
+% \end{verbatim}
+% For convenience, each layout option has a counterpart that deactivates the
+% corresponding layout. The counterpart option has the same name, prefixed
+% with \texttt{no} (for instance, \texttt{noinline}). Again, these options are
+% understood by the package itself, the \cs{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:
+% \begin{verbatim}
+% \fxsetup{inline=false}
+% \fxsetup{noinline}
+% \end{verbatim}
+%
+% \paragraph{Global control}
+% \DescribeOption{layout}
+% \DescribeOption{morelayout}
+% An even more convenient way to specify the required layout is to use the
+% \texttt{layout} and \texttt{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 \texttt{no}\meta{option} form as well).
+%
+% While the \texttt{morelayout} option \emph{adds} to the current layout
+% configuration, the \texttt{layout} one completely overrides it. For
+% instance, knowing that by default, only the \texttt{margin} layout is
+% active, the following forms are all equivalent:
+% \begin{verbatim}
+% \usepackage[nomargin,inline,index]{fixme}
+% \usepackage[margin=false,inline=true,index=true]{fixme}
+% \usepackage[morelayout={nomargin,inline,index}]{fixme}
+% \usepackage[layout={inline,index}]{fixme}
+% \end{verbatim}
+% Again, these two options are understood by the package itself, the
+% \cs{fxsetup} command and also locally by every annotation command or
+% environment (with the same usage restrictions, discussed in the next
+% section).
+%
+% \noindent\DescribeMacro{\fxuselayouts}\marg{name,\ldots}\\
+% Finally, an alternative way of selecting (or deselecting) several layouts
+% simultaneously is to use the \cs{fxuselayouts} command, giving it a
+% comma-separated list of layout options as its only, mandatory, argument.
+%
+% \subsubsection{Built-in \vs external layouts}
+% Annotation layouts are provided either in the core of \fx, 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 \cs{usepackage} options. As a
+% result, layout options are restricted and you have three possibilities for
+% using an external layout:
+% \begin{enumerate}
+% \item Use its corresponding option in a call to \cs{fxsetup} in the
+% preamble, like this: |\fxsetup{|\meta{option}|}|. This will load it
+% \emph{and} select it immediately.
+% \item Use the \cs{fxuselayouts} command in the preamble like this:\\
+% |\fxuselayouts{|\meta{name}|}|. This is strictly equivalent to the
+% previous solution.
+% \end{enumerate}
+% \DescribeMacro{\fxloadlayouts}\marg{name,\ldots}
+% \begin{enumerate}
+% \item[3]
+% If on the other hand you want to load one or several external layouts
+% \emph{without} using them immediately (perhaps in order to use them
+% locally in some specific annotation), use the \cs{fxloadlayouts} command
+% in the preamble like this: |\fxloadlayouts{|\meta{name}|,...}|. After
+% that, you can select any of those layouts anywhere you wish.
+% \end{enumerate}
+%
+% \subsubsection{Available layouts}
+% \DescribeBooleanOption{inline}
+% \DescribeBooleanOption{margin}
+% \DescribeBooleanOption{footnote}
+% \DescribeBooleanOption{index}
+% \DescribeLayout[noprint]{inline}
+% \DescribeLayout[noprint]{margin}
+% \DescribeLayout[noprint]{footnote}
+% \DescribeLayout[noprint]{index}
+% Table \ref{table:layouts} lists the annotation layouts currently distributed
+% with \fx. By default, only the \texttt{margin} layout is active. Most of
+% these layouts should be self-explanatory, but some precisions are given
+% below.
+% \begin{table}
+% \centering
+% \DeleteShortVerb{\|}
+% \begin{tabular}{|l|c|p{7cm}|}
+% \hline
+% \textbf{Name} & \textbf{External} & \textbf{Description}\\
+% \hline\hline
+% \texttt{inline} & & Display note inline\\
+% \texttt{margin} & & Display note in the margin\\
+% \texttt{footnote} & & Display note in a footnote\\
+% \texttt{index} & & Display note in the index\\
+% \texttt{marginclue} & & Display a marginal clue\\
+% \texttt{marginnote} & \texttt{*} & Display non-floating note in the
+% margin\\
+% \texttt{pdfnote} & \texttt{*} & Display note as inline PDF comment\\
+% \texttt{pdfmargin} & \texttt{*} & Display note as marginal PDF
+% comment\\
+% \texttt{pdfsignote} & \texttt{*} & Display signed note ala
+% \texttt{pdfnote}\\
+% \texttt{pdfsigmargin} & \texttt{*} & Display signed note ala
+% \texttt{pdfmargin}\\
+% \texttt{pdfcnote} & \texttt{*} & Display colored note ala
+% \texttt{pdfnote}\\
+% \texttt{pdfcmargin} & \texttt{*} & Display colored note ala
+% \texttt{pdfmargin}\\
+% \texttt{pdfcsignote} & \texttt{*} & Display colored note ala
+% \texttt{pdfcsignote}\\
+% \texttt{pdfcsigmargin} & \texttt{*} & Display colored note ala
+% \texttt{pdfsigmargin}\\
+% \hline
+% \end{tabular}
+% \MakeShortVerb{\|}
+% \caption{Available annotation layouts}
+% \label{table:layouts}
+% \end{table}
+% \paragraph{\texttt{marginclue}}
+% \DescribeBooleanOption{marginclue}
+% \DescribeLayout[noprint]{marginclue}
+% If your preferred layout is \texttt{inline} or say, \texttt{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 \texttt{inline} or
+% \texttt{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).
+%
+% \paragraph{\texttt{marginnote}}\label{sec:manual:marginnote}
+% \DescribeBooleanOption{marginnote}
+% \DescribeLayout[noprint]{marginnote}
+% The \texttt{marginnote} layout is an alternate (external) way to display
+% annotations in the margin, using the eponymous package. Contrary to \LaTeX's
+% standard marginal paragraphs, the ones issued by \texttt{marginnote} are
+% constructed in a non-floating way. This might be an advantage in some
+% situations but \texttt{marginnote} also comes with some disadvantages of its
+% own. For more information, please refer to \texttt{marginnote}'s
+% documentation, and also read the next section. Also, note that it is not
+% currently possible to pass options to the \cs{marginnote} command through
+% this layout.
+%
+% For a reasonably robust marginal layout accross all annotations, including
+% those issued in floats, consider using \texttt{marginnote} in conjunction
+% with \texttt{innerlayout=noinline} (see
+% section \sectionref{sec:manual:inner}).
+%
+% \paragraph{PDF comments}
+% \DescribeBooleanOption{pdfnote}
+% \DescribeLayout[noprint]{pdfnote}
+% \DescribeBooleanOption{pdfmargin}
+% \DescribeLayout[noprint]{pdfmargin}
+% \DescribeBooleanOption{pdfsignote}
+% \DescribeLayout[noprint]{pdfsignote}
+% \DescribeBooleanOption{pdfsigmargin}
+% \DescribeLayout[noprint]{pdfsigmargin}
+% \DescribeBooleanOption{pdfcnote}
+% \DescribeLayout[noprint]{pdfcnote}
+% \DescribeBooleanOption{pdfcmargin}
+% \DescribeLayout[noprint]{pdfcmargin}
+% \DescribeBooleanOption{pdfcsignote}
+% \DescribeLayout[noprint]{pdfcsignote}
+% \DescribeBooleanOption{pdfcsigmargin}
+% \DescribeLayout[noprint]{pdfcsigmargin}
+% The PDF format comes with a concept of \emph{comment}, which \fx 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 \texttt{pdfnote} and
+% \texttt{pdfmargin} layouts use the \texttt{pdfcomment} package to display
+% annotations as PDF inline or marginal comments.
+%
+% The \texttt{sig} versions additionally display the author's tag (see
+% \sectionref{sec:manual:modes}) as a signature instead of as a prefix.
+%
+% The versions with a \texttt{c} in their name (as in \textbf{c}olor) use one
+% of four different colors named \texttt{fx}\meta{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.
+%
+% \subsubsection{Inner layout}\label{sec:manual:inner}
+% 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 \sectionref{sec:manual:othercommonproblems} for some others. One
+% frequent reason (described below) can be handled automatically by \fx.
+%
+% 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.
+%
+% \DescribeOption{innerlayout}
+% The good news is that this situation can be detected automatically. \fx
+% provides an option named \texttt{innerlayout} that allows you to specify an
+% alternative layout setting to use when \TeX{} is in \emph{inner} mode. In
+% addition to that, \fx automatically disables the \texttt{margin} and
+% \texttt{marginclue} layouts. If you really want to use marginal paragraphs
+% in inner mode, a good idea is then to set your inner layout to
+% \texttt{marginnote} (see section \ref{sec:manual:marginnote}).
+%
+% Using \texttt{innerlayout} is not as trivial as it may seem: it
+% \emph{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 \texttt{layout} and \texttt{morelayout} options. This means that
+% your alternative layout can either \emph{add} to the existing one, or
+% \emph{override} it. Here are some examples to clarify things a little. You
+% should try to understand them.
+% \begin{itemize}
+% \item By default, the \fx inner layout is set to just \texttt{inline}.
+% This can be simulated by the following call:
+% \begin{verbatim}
+% \usepackage[layout=margin,innerlayout={layout=inline}]{fixme}
+% \end{verbatim}
+% \item The following happens to give the same result in our particular case,
+% while having a different semantics:
+% \begin{verbatim}
+% \usepackage[layout=margin,innerlayout=inline]{fixme}
+% \end{verbatim}
+% \item If you have set \fx to use a safe layout globally (for instance,
+% \texttt{inline} and \texttt{index}), and you want to use the same layout
+% in inner mode, then you should provide an \emph{empty} inner layout, like
+% this:
+% \begin{verbatim}
+% \fxsetup{layout={inline,index},innerlayout=}
+% \end{verbatim}
+% What would happen if you didn't provide the \texttt{innerlayout} option?
+% \end{itemize}
+%
+% One final remark on the \texttt{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, \texttt{marginnote})~, you need to load it
+% explicitely in the preamble first. Use \cs{fxloadlayouts} for that.
+%
+% \subsubsection{Other common layout
+% problems\label{sec:manual:othercommonproblems}}
+% This section describes some other common problems that people have
+% encountered using \fx. Although \fx might not be directly responsible
+% for them, it is still good to keep them in mind.
+%
+% \subparagraph{Annotations in captions being counted twice} You are most
+% likely using \cs{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 \fx annotation in the caption
+% will consequently be generated twice as well. The solution to this problem
+% is to use the optional argument to \cs{caption}, for example:
+% \begin{verbatim}
+% \caption[caption text]{caption text\fxnote{yuck!}}
+% \end{verbatim}
+%
+% \subparagraph{Footnotes and margin paragraphs in floats} Using footnotes in
+% figures (and \emph{a fortiori} in a figure's caption) does not work in
+% general. Although there are some workarounds out there (for instance, using
+% \cs{footnotemark} and \cs{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
+% \LaTeX. 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.
+%
+% \subparagraph{Marginal paragraphs showing up on the wrong margin} You want
+% to look at the \texttt{mparhack} package.
+%
+% \subparagraph{ACM classes compatibility} The ACM \textsc{Sig} classes
+% (\texttt{acm\_proc\_article-sp} and \texttt{sig-alternate}) forbid the use
+% of \cs{marginpar}, so if you use these classes, don't forget to choose
+% another layout for \fx, and also avoid using marginal clues.
+%
+% \subparagraph{Annotation indexing}
+% Remember that some characters are special in an index entry (the \texttt{!}
+% for instance). \fx currently does nothing to escape those characters, so
+% avoid using them in your annotations.
+%
+% \subsection{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 \fx 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 \sectionref{sec:manual:layout}.
+%
+% \DescribeOption{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 \texttt{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, \texttt{target} is set the special value
+% \texttt{thepage}, which as you guessed means to use the page number.
+%
+% The name "target" bears an intentional resemblance to \fx'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:
+% \begin{verbatim}
+% \usepackage{hyperref}
+% \fxfatal[layout=index,target=hyperref]{Fill in PDF fields (title etc.)}
+% \end{verbatim}
+%
+% \subsection{Controlling the layout of
+% environments\label{sec:manual:envlayoutcontrol}}
+% As discussed in section \sectionref{sec:manual:insertion}, the contents of a
+% \fx 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''.
+%
+% \subsubsection{Selecting a layout}
+% \DescribeOption{envlayout}
+% The desired environment layout can be selected with the \texttt{envlayout}
+% option. Contrary to the annotation layouts, only one environment layout can
+% be active at a time. The \texttt{envlayout} option is understood by the
+% package itself, the \cs{fxsetup} command and all the annotation environments
+% (not the commands!). There are some restrictions on its usage however, as
+% discussed in the next section.
+%
+% \noindent\DescribeMacro{\fxuseenvlayout}\marg{name}\\
+% An alternative way of selecting an environment layout is to use the
+% \cs{fxuseenvlayout} command, giving it the layout's name as its only,
+% mandatory, argument.
+%
+% \subsubsection{Built-in \vs external layouts}
+% Environments layouts are provided either in the core of \fx, 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 \texttt{envlayout} option might involve loading the
+% relevant file first.
+%
+% \noindent\DescribeMacro{\fxloadenvlayouts}\marg{name,\ldots}\\
+% For technical reasons, it is not possible to do such a thing outside the
+% preamble, neither in the middle of processing \cs{usepackage} options. As a
+% result, the \texttt{envlayout} option is restricted and you have three
+% possibilities for using an external layout:
+% \begin{enumerate}
+% \item Use the \texttt{envlayout} option in a call to \cs{fxsetup} in the
+% preamble, like this: |\fxsetup{envlayout=name}|. This will load it
+% \emph{and} select it immediately.
+% \item Use the \cs{fxuseenvlayout} command in the preamble like this:\\
+% |\fxuseenvlayout{name}|. This is strictly equivalent to the previous
+% solution.
+% \item If on the other hand you want to load one or several environment
+% layouts \emph{without} using them immediately (perhaps in order to use
+% them locally in some specific annotation), use the \cs{fxloadenvlayouts}
+% command in the preamble like this: |\fxloadenvlayouts{|\meta{name}|,...}|.
+% After that, you can select any of those layouts anywhere you wish.
+% \end{enumerate}
+%
+% \subsubsection{Available layouts\label{sec:manual:envlayoutslist}}
+% Table \ref{table:envlayouts} lists the environment layouts currently
+% distributed with \fx.
+% \begin{itemize}
+% \item \DescribeEnvLayout{plain}
+% The \texttt{plain} environment layout prints its contents as-is, only
+% in bold font (by default) in order to distinguish it from the surrounding
+% text.
+% \item \DescribeEnvLayout{signature}
+% The \texttt{signature} environment layout prints the author's tag (see
+% \sectionref{sec:manual:modes}) as a signature instead of as a prefix. This
+% layout is used by the \texttt{signature} theme (see section
+% \sectionref{sec:manual:themes}).
+% \item \DescribeEnvLayout{color}
+% \DescribeColor{fxnote}
+% \DescribeColor{fxwarning}
+% \DescribeColor{fxerror}
+% \DescribeColor{fxfatal}
+% The \texttt{color} environment layout uses one of four colors named
+% \texttt{fx}\meta{level} (according 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 \texttt{color} theme (see section
+% \sectionref{sec:manual:themes}).
+% \item \DescribeEnvLayout{colorsig}
+% The \texttt{colorsig} environment layout combines the features of the
+% \texttt{signature} and \texttt{color} ones. This layout is used by the
+% \texttt{colorsig} theme (see section \sectionref{sec:manual:themes}).
+% \end{itemize}
+% \begin{table}
+% \centering
+% \DeleteShortVerb{\|}
+% \begin{tabular}{|l|c|p{7cm}|}
+% \hline
+% \textbf{Name} & \textbf{External} & \textbf{Description}\\
+% \hline\hline
+% \texttt{plain} & & Display contents as-is\\
+% \texttt{signature} & & Display signed contents\\
+% \texttt{color} & \texttt{*} & Display contents in color\\
+% \texttt{colorsig} & \texttt{*} & Display signed contents in color\\
+% \hline
+% \end{tabular}
+% \MakeShortVerb{\|}
+% \caption{Available environment layouts}
+% \label{table:envlayouts}
+% \end{table}
+%
+% \subsection{Controlling the layout of
+% targets\label{sec:manual:targetlayoutcontrol}}
+% As discussed in section \sectionref{sec:manual:insertion}, the starred
+% versions of the \fx 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''.
+%
+% \subsubsection{Selecting a layout}
+% \DescribeOption{targetlayout}
+% The desired layout can be selected with the \texttt{targetlayout} option.
+% Contrary to the annotation layouts, only one target layout can be active at
+% a time. The \texttt{targetlayout} option is understood by the package
+% itself, the \cs{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.
+%
+% \noindent\DescribeMacro{\fxusetargetlayout}\marg{name}\\
+% An alternative way of selecting a target layout is to use the
+% \cs{fxusetargetlayout} command, giving it the layout's name as its only,
+% mandatory, argument.
+%
+% \subsubsection{Built-in \vs external layouts}
+% Target layouts are provided either in the core of \fx, 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 \texttt{targetlayout} option might involve loading the relevant
+% file first.
+%
+% \noindent\DescribeMacro{\fxloadtargetlayouts}\marg{name,\ldots}\\
+% For technical reasons, it is not possible to do such a thing outside the
+% preamble, neither in the middle of processing \cs{usepackage} options. As a
+% result, the \texttt{targetlayout} option is restricted and you have two
+% possibilities for using an external layout:
+% \begin{enumerate}
+% \item Use the \texttt{targetlayout} option in a call to \cs{fxsetup} in the
+% preamble, like this: |\fxsetup{targetlayout=name}|. This will load it
+% \emph{and} select it immediately.
+% \item Use the \cs{fxusetargetlayout} command in the preamble like this:\\
+% |\fxusetargetlayout{name}|. This is strictly equivalent to the previous
+% solution.
+% \item If on the other hand you want to load one or several target layouts
+% \emph{without} using them immediately (perhaps in order to use them
+% locally in some specific annotation), use the \cs{fxloadtargetlayouts}
+% command in the preamble like this:
+% |\fxloadtargetlayouts{|\meta{name}|,...}|. After that, you can select any
+% of those layouts anywhere you wish.
+% \end{enumerate}
+%
+% \subsubsection{Available layouts\label{sec:manual:targetlayoutslist}}
+% Table \ref{table:targetlayouts} lists the target layouts currently
+% distributed with \fx.
+% \begin{itemize}
+% \item \DescribeTargetLayout{plain}
+% The \texttt{plain} target layout displays its contents as-is, only in
+% italics (by default) in order to distinguish it from the surrounding text.
+% \item \DescribeTargetLayout{changebar}
+% The \texttt{changebar} target layout displays a vertical bar in the
+% margin, on the side of the target text.
+% \item \DescribeTargetLayout{color}
+% \DescribeColor{fxtarget}
+% The \texttt{color} target layout uses the color named \texttt{fxtarget}
+% to display the target text. This layout is used by the \texttt{color}
+% and \texttt{colorsig} themes (see section \sectionref{sec:manual:themes}).
+% \item \DescribeTargetLayout{colorcb}
+% \DescribeColor{fxnote}
+% \DescribeColor{fxwarning}
+% \DescribeColor{fxerror}
+% \DescribeColor{fxfatal}
+% The \texttt{colorcb} target layout uses one of four colors named
+% \texttt{fx}\meta{level} (according to the annotation's importance
+% level) to display a colored vertical bar in the margin, on the side of the
+% target text.
+% \end{itemize}
+% \begin{table}
+% \centering
+% \DeleteShortVerb{\|}
+% \begin{tabular}{|l|c|p{7cm}|}
+% \hline
+% \textbf{Name} & \textbf{External} & \textbf{Description}\\
+% \hline\hline
+% \texttt{plain} & & Display target as-is\\
+% \texttt{changebar} & \texttt{*} & Display a vertical bar aside target\\
+% \texttt{color} & \texttt{*} & Display target in color\\
+% \texttt{colorcb} & \texttt{*} & Display a colored vertical bar aside
+% target\\
+% \hline
+% \end{tabular}
+% \caption{Available target layouts}
+% \label{table:targetlayouts}
+% \MakeShortVerb{\|}
+% \end{table}
+%
+% \subsection{Faces\label{sec:manual:faces}}
+% In the \fx 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. \fx provides several faces that allow you to further
+% customize the layout of annotations or their targets.
+%
+% \subsubsection{Setting face values}
+% There are different ways to customize a face. The first one is to use the
+% corresponding face option. For each face \meta{name}, their is a
+% \meta{name}\texttt{face} option. For instance, the ``inline'' face is
+% controlled by the \texttt{inlineface} option. Face options are
+% understood by the package itself, the \cs{fxsetup} command and locally by
+% all annotation commands or environments. Here is an example:
+% \begin{verbatim}
+% \fxsetup{inlineface=\bfseries}
+% \end{verbatim}
+%
+% Since you will probably want to use \LaTeX{} commands in face values, you
+% should know that \LaTeX{} normally can't handle such commands in package
+% options. If you want this to work, you need to use the \texttt{xkvltxp}
+% package first, like this:
+% \begin{verbatim}
+% \usepackage{xkvltxp}
+% \usepackage[inlineface=\bfseries]{fixme}
+% \end{verbatim}
+%
+% \noindent\DescribeMacro{\fxsetface}\marg{name}\marg{value}\\
+% Another way to customize a face is to use the \cs{fxsetface} command by
+% providing the face name and the face value as two mandatory arguments. For
+% example:
+% \begin{verbatim}
+% \fxsetface{inline}{\bfseries}
+% \end{verbatim}
+%
+% \subsubsection{Available faces}
+% \subparagraph{The \texttt{inline} face}
+% \DescribeFace{inline}
+% By default, the \texttt{inline} annotation layout displays its contents in
+% bold font, to distinguish the note from the surrounding text. This is
+% controlled by the \texttt{inline} face whose value is \cs{bfseries} by
+% default.
+%
+% \subparagraph{The \texttt{margin} face}
+% \DescribeFace{margin}
+% By default, the \texttt{margin} and \texttt{marginclue} layouts display
+% their contents in footnote size. This is controlled by the \texttt{margin}
+% face whose value is \cs{footnotesize} by default.
+%
+% \subparagraph{The \texttt{env} face}
+% \DescribeFace{env}
+% By default, the \texttt{plain} environment layout displays its contents in
+% bold font, to distinguish it from the surrounding text. This is controlled
+% by the \texttt{env} face whose value is \cs{bfseries} by default. The
+% \texttt{color} and \texttt{colorsig} environment layouts honor this face as
+% well, but reset it to \meta{nothing} first. You should probably keep the
+% same value for the \texttt{inline} and \texttt{env} faces, since they are
+% both used to display annotations within the document's body.
+%
+% \subparagraph{The \texttt{signature} face}
+% \DescribeFace{signature}
+% The \texttt{signature} environment layout honors the \texttt{env} face, and
+% adds a \texttt{signature} face on top of it for the signature part. It is
+% set to \cs{itshape} by default. The \texttt{colorsig} environment layout
+% honors this face as well.
+%
+% \subparagraph{The \texttt{target} face}
+% \DescribeFace{target}
+% By default, the \texttt{plain} target layout displays its contents in
+% italics, to distinguish it from the surrounding text. This is controlled by
+% the \texttt{target} face whose value is \cs{itshape} by default. The
+% \texttt{changebar}, \texttt{color} and \texttt{colorcb} target layouts honor
+% this face as well, but reset it to \meta{nothing} first.
+%
+% \subsection{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.
+%
+% \DescribeBooleanOption{silent}
+% You have the ability to suppress logging altogether by using the
+% \texttt{silent} option. This option is understood by the package itself, the
+% \cs{fxsetup} command and all annotation commands and environments. Just
+% as individual layout options, \texttt{silent} is a boolean option, so all
+% those forms are possible: \texttt{silent}, equivalent to
+% \texttt{silent=true}, and \texttt{nosilent}, equivalent to
+% \texttt{silent=false} (the default).
+%
+% \subsection{Controlling the language of \fx\label{sec:manual:i18n}}
+% \subsubsection{Available languages}
+% \DescribeOption{english}
+% \DescribeOption{french}
+% \DescribeOption{francais}
+% \DescribeOption{spanish}
+% \DescribeOption{italian}
+% \DescribeOption{german}
+% \DescribeOption{ngerman}
+% \DescribeOption{danish}
+% \DescribeOption{croatian}
+% \fx currently supports English (the default), French, Spanish, Italian,
+% German, Danish and Croatian. You can select your preferred language by using
+% the corresponding language option. These options usually appear in the call
+% to \cs{documentclass} or \cs{usepackage}, but they are also understood by
+% \cs{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 \texttt{french} and \texttt{francais}
+% options are synonyms. The \texttt{german} and \texttt{ngerman} options are
+% currently equivalent.
+%
+% \DescribeOption{lang}
+% If you're manipulating language settings at the level of \fx itself (as
+% opposed to the \cs{documentclass} level), then the preferred way to specify
+% a language is to use the \texttt{lang} option, and give it the language name
+% as a value. For instance:
+% \begin{verbatim}
+% \usepackage[lang=french]{fixme}
+% \end{verbatim}
+%
+% \subsubsection{Language tracking}
+% \DescribeOption{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
+% \sectionref{sec:manual:modes}). \fx provides a boolean option named
+% \texttt{langtrack}. When specified, \fx assumes that you're using
+% \texttt{babel} and automatically switches to the current language (as
+% specified by \texttt{babel}'s \cs{languagename} command), without requiring
+% an explicit language option.
+%
+% \DescribeOption{defaultlang}
+% In the case where tracking falls on a language unsupported by \fx, a
+% warning will be issued and \fx will switch to the language specified by
+% the \texttt{defaultlang} option (\texttt{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 \sectionref{sec:code:i18n}).
+%
+% 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.
+%
+% \subsubsection{Indexing in different languages}
+% If your document contains annotations written in different languages, and
+% you have requested the \texttt{index} layout, \fx will not only classify the
+% notes by their level of importance, but also by language. For example, if
+% you have \fx warnings in both English and French, you will find two
+% different subcategories for warnings in the index: one called ``Warnings''
+% and one called ``Avertissements''.
+%
+% \subsection{Standalone or collaborative mode\label{sec:manual:modes}}
+% \fx supports collaborative annotations as well as ``standalone'',
+% single-author documents.
+%
+% \subsubsection{Standalone mode}
+% By default, \fx 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.
+% \begin{itemize}
+% \item All the built-in annotation layouts (index excepted) put the \fx logo
+% in front of every note. This is also true for the environments. The idea
+% is to distinguish \fx contents from the rest of the document (for instance
+% other marginal notes or footnotes).
+% \item All annotations are indexed under the main \fx category, and sorted by
+% importance level, but the \fx logo is not repeated constantly (that would
+% be useless).
+% \item Similarly, the list of fixmes does not clutter itself with the logo,
+% because we already know that its contents is specific to \fx.
+% \end{itemize}
+% As a matter of fact, when you see the \fx logo appear somewhere, you're not
+% actually contemplating it, but rather the annotation's \emph{author}. It
+% just happens that by default (meaning in standalone mode), the only author
+% is \fx itself.
+%
+% \DescribeOption{author}
+% In standalone mode, you might be annoyed by this orgy of \fx logos. This
+% might happen if for instance you're using the \texttt{margin} layout and you
+% \emph{know} there is nothing but \fx annotations in there. In such a case,
+% you will most likely want to change the author to \emph{nothing}. This can
+% be acomplished by using the \texttt{author} option, which is understood by
+% the package itself, the \cs{fxsetup} command and all the annotation
+% commands or environments. Doing something like the following will get rid of
+% the damn logo for good:
+% \begin{verbatim}
+% \usepackage[author=]{fixme}
+% \end{verbatim}
+%
+% \subsubsection{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:
+% \begin{verbatim}
+% \fxfatal[author=JD]{rephrase this}
+% \end{verbatim}
+% 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, \fx offers an easier way to achieve this.
+%
+% \paragraph{Registering new authors}
+% \DescribeMacro{\FXRegisterAuthor}\marg{cmdprefix}\marg{envprefix}\marg{tag}\\
+% The command \cs{FXRegisterAuthor} registers a new author with \fx. It takes
+% three arguments: the last one (\meta{tag}) is just the same as the value you
+% would pass to the \texttt{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 \meta{cmdprefix}) and environments
+% (prefixed with \meta{envprefix}) will be created. To clarify, suppose that
+% we have registered John like this:
+% \begin{verbatim}
+% \FXRegisterAuthor{jd}{ajd}{JD}
+% \end{verbatim}
+% Now, John can use the commands \cs{jdnote}, \cs{jdwarning} \etc, along with
+% their starred versions, and he can also use the environments
+% \texttt{ajdnote}, \texttt{ajdwarning} \etc, along with their starred
+% versions as well. If you really want to know the whole story, it turns out
+% that the main \fx interface described in section
+% \sectionref{sec:manual:insertion} is created with this single line of code:
+% \begin{verbatim}
+% \FXRegisterAuthor{fx}{anfx}{fixme}
+% \end{verbatim}
+%
+% \textbf{Warning!} \meta{cmdprefix} and \meta{envprefix} need to be
+% different, or you will get very strange errors. The technical reason is that
+% in \LaTeX, an environment named \texttt{foo} is defined in terms of two
+% commands: \cs{foo} and \cs{endfoo} (yes, this is silly; the first one should
+% really be \cs{beginfoo}). As a consequence, if you use the same prefix, you
+% will get a name clash between the annotation commands and environments.
+%
+% \paragraph{Fun with the \texttt{author} option}
+% Some precisions about the author option are in order here. When a new
+% author is registered with \fx, the generated commands and environments
+% work by \emph{presetting} the author option to the specified \meta{tag}.
+% This means that it is still possible to override it explicitely like this:
+% \begin{verbatim}
+% \jdfatal[author=Anonymous]{For $500.00, you got your Ph.D.}
+% \end{verbatim}
+% I don't see any good reason for doing it though, the above example
+% notwithstanding.^^A $ AUCTeX hack to prevent math-mode
+%
+% The final remark is about the default \texttt{fx*} user interface: the
+% \texttt{fixme} default user is special in that it is the only registered
+% user to honor a global \texttt{author} option (provided in the call to
+% \cs{usepackage} or \cs{fxsetup}). The intended use of this is that the
+% \emph{main} author of the document uses the \texttt{fx*} interface
+% (preferably with a personal \texttt{author} setting, different from the \fx
+% logo), and all other authors are registered via \cs{FXRegisterAuthor}.
+%
+% \paragraph{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 \fx is in standalone mode by default, so the
+% (only) tag does not appear in those places.
+%
+% \noindent
+% \DescribeOption{singleuser}
+% \DescribeOption{multiuser}
+% \DescribeOption{mode}
+% If you want this additional information, you've got to ask \fx to
+% globally switch to collaborative mode. This can be done with either one of
+% the three options \texttt{singleuser}, \texttt{mutliuser} or \texttt{mode}.
+% \texttt{singleuser} and \texttt{multiuser} are boolean options. The
+% \texttt{mode} option takes a value of either \texttt{singleuser} or
+% \texttt{multiuser}. This is the preferred way to switch the mode. These
+% options are understood globally by \cs{usepackage} or \cs{fxsetup}, and also
+% locally by the annotation commands or environments.
+%
+% When collaborative mode is active, \fx 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.
+%
+% \subsection{Themes\label{sec:manual:themes}}
+% Themes are orthogonal to layouts: they provide a way to modify the overall
+% appearance of \fx 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.
+%
+% \subsubsection{Using themes}
+% \DescribeOption{theme}
+% The interface for using a theme is quite simple: use the \texttt{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 \fx but instead they are provided
+% as independent files. As a consequence, the \texttt{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.
+%
+% \noindent\DescribeMacro{\fxusetheme}\marg{name}\\
+% An alternative to the \texttt{theme} option is to use the \cs{fxusetheme}
+% command, which takes the theme's name as its only mandatory argument.
+%
+% \subsubsection{Available themes}
+% \fx comes with a number of predefined themes listed below.
+%
+% \paragraph{The \texttt{signature} theme}
+% \DescribeTheme{signature}
+% This theme uses the \texttt{signature} environment layout (see section
+% \sectionref{sec:manual:envlayoutslist}), and overrides the built-in ones to
+% display the author tags as a signature (\ie at the end of the annotations)
+% instead of as a prefix. All original layout faces are honored.
+%
+% \paragraph{The \texttt{color} theme}
+% \DescribeTheme{color}
+% This theme uses the \texttt{color} environment and target layouts (see
+% sections \sectionref{sec:manual:envlayoutslist} and
+% \sectionref{sec:manual:targetlayoutslist}), 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 \texttt{inline} one is reset to
+% \meta{nothing}. Remember that the \texttt{env} and \texttt{target} faces are
+% reset as well (this is actually done by the \texttt{color} environment and
+% target layouts).
+%
+% \paragraph{The \texttt{colorsig} theme}
+% \DescribeTheme{colorsig}
+% This theme combines the features of the \texttt{color} and
+% \texttt{signature} ones. All original layout faces are honored, but
+% the \texttt{inline} one is reset to \meta{nothing}.
+%
+% \section{Extending \fx}
+% Hear hear, this is where you start spending more time hacking \LaTeX{} than
+% actually writing your document\ldots
+%
+% \subsection{Modifying existing layouts}
+% \fx 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 \cs{renewcommand} them (in
+% fact, you should use \cs{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.
+%
+% \subsubsection{Modifying existing annotation layouts}
+% \DescribeMacro[noindex]{\FXLayout\meta{name}}
+% \marg{type}\marg{annotation}\marg{author}\\
+% \DescribeMacro[noprint]{\FXLayoutInline}
+% \DescribeMacro[noprint]{\FXLayoutMargin}
+% \DescribeMacro[noprint]{\FXLayoutFootnote}
+% \DescribeMacro[noprint]{\FXLayoutIndex}
+% \DescribeMacro[noprint]{\FXLayoutMarginClue}
+% Each annotation layout is implemented as a macro taking three mandatory
+% arguments. By convention, this macro is named \cs{FXLayout}\meta{name}, for
+% instance \cs{FXLayoutInline}. \meta{type} is the annotation type. It can be
+% one of \texttt{note}, \texttt{warning}, \texttt{error} and \texttt{fatal}.
+% \meta{annotation} is the annotation itself, and \meta{author} is the
+% author's tag.
+%
+% \subsubsection{Modifying existing environment layouts}
+% \DescribeMacro[noindex]{\FXEnvLayout\meta{name}Begin}
+% \DescribeMacro[noindex]{\FXEnvLayout\meta{name}End}\marg{type}\marg{author}\\
+% \DescribeMacro[noprint]{\FXEnvLayoutPlainBegin}
+% \DescribeMacro[noprint]{\FXEnvLayoutPlainEnd}
+% \DescribeMacro[noprint]{\FXEnvLayoutSignatureBegin}
+% \DescribeMacro[noprint]{\FXEnvLayoutSignatureEnd}
+% \DescribeMacro[noprint]{\FXEnvLayoutColorBegin}
+% \DescribeMacro[noprint]{\FXEnvLayoutColorEnd}
+% \DescribeMacro[noprint]{\FXEnvLayoutColorSigBegin}
+% \DescribeMacro[noprint]{\FXEnvLayoutColorSigEnd}
+% \begin{sloppypar}\noindent
+% Each environment layout is implemented as two macros taking two mandatory
+% arguments. By convention, these macros are named
+% \cs{FXEnvLayout}\meta{name}\texttt{Begin} and
+% \cs{FXEnvLayout}\meta{name}\texttt{End}, for instance
+% \cs{FXEnvLayoutPlainBegin} and \cs{FXEnvLayoutPlainEnd}. \meta{type} is
+% the annotation type. It can be one of \texttt{note}, \texttt{warning},
+% \texttt{error} and \texttt{fatal}. \meta{author} is the author's tag.
+% \end{sloppypar}
+%
+% \subsubsection{Modifying existing target layouts}
+% \DescribeMacro[noindex]{\FXTargetLayout\meta{name}}\marg{type}\marg{target}\\
+% \DescribeMacro[noprint]{\FXTargetLayoutPlain}
+% \DescribeMacro[noprint]{\FXTargetLayoutColor}
+% Each target layout is implemented as a macro taking two mandatory arguments.
+% By convention, this macro is named \cs{FXTargetLayout}\meta{name}, for
+% instance \cs{FXTargetLayoutPlain}. \meta{type} is the annotation type. It
+% can be one of \texttt{note}, \texttt{warning}, \texttt{error} and
+% \texttt{fatal}. \meta{target} is the textual target.
+%
+% \subsection{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 \fx aware of this addition. This is called ``registering'' a layout.
+%
+% \subsubsection{Registering a new annotation layout}
+% \paragraph{Early \vs late layouts} Normally, \fx typesets your annotations
+% at the current position in the text, using a sensible order for built-in
+% layouts. For instance, the \texttt{footnote} layout, if active, is performed
+% before the \texttt{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
+% \texttt{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 \texttt{changebar} target layout and \texttt{margin} annotation layout).
+% As for built-in layouts, only the \texttt{margin} and \texttt{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.
+%
+% \paragraph{Registering late layouts}
+% \begin{sloppypar}
+% \DescribeMacro{\FXRegisterLayout}\oarg{mutex}\marg{name}\marg{macro}\\
+% In order to register a late annotation layout with \fx, use the command
+% \cs{FXRegisterLayout}. This macro has two mandatory arguments: the layout
+% \meta{name} (at least 3 characters long) and the associated layout
+% \meta{macro}. For instance, the \texttt{inline} layout is registered like
+% this:
+% \end{sloppypar}
+% \begin{verbatim}
+% \FXRegisterLayout{inline}{\FXLayoutInline}
+% \end{verbatim}
+% Once registered, the new layout gets a boolean option \meta{name} and is
+% also recognized by the \texttt{layout} and \texttt{morelayout} options, as
+% well as by the \cs{fxuselayouts} command as \meta{name}.
+%
+% The first (optional) argument \meta{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 \texttt{margin} and \texttt{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.
+%
+% \paragraph{Registering early layouts}
+% \DescribeMacro{\FXRegisterLayout*}\oarg{mutex}\marg{name}\marg{macro}\\
+% In order to register an early annotation layout with \fx, use the starred
+% form of \cs{FXRegisterLayout}. Everything else behaves the same.
+%
+% \paragraph{Providing a layout}
+% \DescribeMacro{\FXProvidesLayout}\marg{name}\oarg{release information}\\
+% If you want to save your layout externally, you need to store it in a file
+% named \texttt{fxlayout}\meta{name}\texttt{.sty} and advertise it by calling
+% \cs{FXProvidesLayout}. It will then be recognized by the \cs{fxloadlayouts}
+% command as \meta{name}.
+%
+% \subsubsection{Registering a new environment layout}
+% \begin{sloppypar}
+% \DescribeMacro{\FXRegisterEnvLayout}\marg{name}\marg{begin}\marg{end}\\
+% In order to register a new environment layout with \fx, use the command
+% \cs{FXRegisterEnvLayout}. This macro has three mandatory arguments: the
+% layout \meta{name} and the associated \meta{begin} and \meta{end} macros.
+% For instance, the \texttt{color} layout is registered like this:
+% \end{sloppypar}
+% \begin{verbatim}
+% \FXRegisterEnvLayout{color}{\FXEnvLayoutColorBegin}{\FXEnvLayoutColorEnd}
+% \end{verbatim}
+% Once registered, the new layout is recognized by the \texttt{envlayout}
+% option and by the \cs{fxuseenvlayout} command as \meta{name}.
+%
+% \noindent
+% \DescribeMacro{\FXProvidesEnvLayout}\marg{name}\oarg{release information}\\
+% If you want to save your layout externally, you need to store it in a file
+% named \texttt{fxenvlayout}\meta{name}\texttt{.sty} and advertise it by
+% calling \cs{FXProvidesEnvLayout}. It will then be recognized by the
+% \cs{fxloadenvlayouts} commands as \meta{name}.
+%
+% \subsubsection{Registering a new target layout}
+% \begin{sloppypar}
+% \DescribeMacro{\FXRegisterTargetLayout}\marg{name}\marg{macro}\\
+% In order to register a new target layout with \fx, use the command
+% \cs{FXRegisterTargetLayout}. This macro has two mandatory arguments: the
+% layout \meta{name} and the associated \meta{macro}. For instance, the
+% \texttt{color} layout is registered like this:
+% \end{sloppypar}
+% \begin{verbatim}
+% \FXRegisterTargetLayout{color}{\FXTargetLayoutColor}
+% \end{verbatim}
+% Once registered, the new layout is recognized by the \texttt{targetlayout}
+% option and by the \cs{fxusetargetlayout} as \meta{name}.
+%
+% \noindent
+% \DescribeMacro{\FXProvidesTargetLayout}\marg{name}\oarg{release
+% information}\\
+% If you want to save your layout externally, you need to store it in a file
+% named \texttt{fxtargetlayout}\meta{name}\texttt{.sty} and advertise it by
+% calling \cs{FXProvidesTargetLayout}. It will then be recognized by the
+% \cs{fxloadtargetlayouts} commands as \meta{name}.
+%
+% \subsection{Adding new options}
+% \begin{quotation}\itshape
+% \textbf{Note:} \fx uses the \texttt{xkeyval} package for its underlying
+% options management, so some knowledge of this package is required in order
+% to understand the remainder of this section.
+% \end{quotation}
+% Yet another way to customize \fx is to plug additional behavior in, by way
+% of options. As of version 4.5, \fx 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. \fx currently provides three option
+% families: \texttt{Layout}, \texttt{EnvLayout}, and
+% \texttt{TargetLayout}. Obviously, these families allow you to define options
+% that will affect the behavior of the corresponding three kinds of layouts.
+%
+% For each family, \fx provides five commands wrapping around \texttt{xkeyval}
+% to define special kinds of options (\emph{keys} in the \texttt{xkeyval}
+% jargon). They are explained below.
+%
+% \noindent\DescribeMacro[noindex]{\FXDefine\meta{family}Key}
+% \marg{key}\oarg{default}\marg{function}\\
+% \DescribeMacro[noprint]{\FXDefineLayoutKey}
+% \DescribeMacro[noprint]{\FXDefineEnvLayoutKey}
+% \DescribeMacro[noprint]{\FXDefineTargetLayoutKey}
+% Define an \texttt{xkeyval} ordinary \meta{key} belonging to \meta{family}.
+%
+% \noindent\DescribeMacro[noindex]{\FXDefine\meta{family}CmdKey}
+% \oarg{mp}\marg{key}\oarg{default}\marg{function}\\
+% \DescribeMacro[noprint]{\FXDefineLayoutCmdKey}
+% \DescribeMacro[noprint]{\FXDefineEnvLayoutCmdKey}
+% \DescribeMacro[noprint]{\FXDefineTargetLayoutCmdKey}
+% Define an \texttt{xkeyval} command \meta{key} belonging to \meta{family}.
+%
+% \noindent\DescribeMacro[noindex]{\FXDefine\meta{family}ChoiceKey}
+% \marg{key}\oarg{bin}\marg{alternatives}\oarg{default}\marg{function}\\
+% \DescribeMacro[noprint]{\FXDefineLayoutChoiceKey}
+% \DescribeMacro[noprint]{\FXDefineEnvLayoutChoiceKey}
+% \DescribeMacro[noprint]{\FXDefineTargetLayoutChoiceKey}
+% Define an \texttt{xkeyval} choice \meta{key} belonging to \meta{family}.
+%
+% \noindent\DescribeMacro[noindex]{\FXDefine\meta{family}VoidKey}
+% \marg{key}\marg{func}\\
+% \DescribeMacro[noprint]{\FXDefineLayoutVoidKey}
+% \DescribeMacro[noprint]{\FXDefineEnvLayoutVoidKey}
+% \DescribeMacro[noprint]{\FXDefineTargetLayoutVoidKey}
+% A ``void \meta{key}'' is an option that is not supposed to get an
+% argument. This property is automatically checked everytime the option is
+% used.
+%
+% \noindent\DescribeMacro[noindex]{\FXDefine\meta{family}BoolKey}
+% \oarg{func}\marg{key}\\
+% \DescribeMacro[noprint]{\FXDefineLayoutBoolKey}
+% \DescribeMacro[noprint]{\FXDefineEnvLayoutBoolKey}
+% \DescribeMacro[noprint]{\FXDefineTargetLayoutBoolKey}
+% Finally, a ``boolean \meta{key}'' is like an \texttt{xkeyval} one, with the
+% addition that for every such \texttt{key}, there is a void \texttt{nokey}
+% counterpart.
+%
+% Every new option you define is inserted into the global options management
+% mechanism, which has some implications.
+% \begin{itemize}
+% \item First of all, new options are automatically available almost
+% everywhere, and in particular in the \cs{fxsetup} macro, in the
+% annotations commands and environments, \etc Note however that the
+% \texttt{EnvLayout} and \texttt{TargetLayout} family options are only
+% processed when it makes sense, that is, when environments or targeted
+% commands are involved.
+% \item 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 \texttt{vadj} option like this:
+% |\FXDefineLayoutKey{vadj}{\def\marginnotevadjust{#1}}|, which you can then
+% use like that: |\fxnote[vadj=.5ex]{...}|.
+% \item Finally, and again, because options are treated globally, beware of
+% name clashes! Every option name must be unique within a family.
+% \end{itemize}
+%
+% \subsection{Creating a new theme}
+% Creating a new theme may involve anything from using (by way of
+% \cs{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.
+%
+% \noindent
+% \DescribeMacro{\FXRequireLayouts}\marg{layout names}\\
+% In order to use external layouts in a theme, use the command
+% \cs{FXRequireLayouts}, passing it a list of \meta{layout names} as
+% argument.\\
+% \DescribeMacro{\FXRequireEnvLayout}
+% \DescribeMacro{\FXRequireTargetLayout}\marg{name}\\
+% In order to use and external environment or target layout in a theme, use
+% the commands \cs{FXRequire*Layout} and give them the layout's name as
+% argument.
+%
+% \noindent
+% \DescribeMacro{\FXProvidesTheme}\marg{name}\oarg{release information}\\
+% A theme should be saved in a file named
+% \texttt{fxtheme}\meta{name}\texttt{.sty} and advertised by calling
+% \cs{FXProvidesTheme}. It will then be recognized by the \texttt{theme}
+% option and the \cs{fxusetheme} command.
+%
+% \subsection{Internationalization}
+% \DescribeMacro[noindex]{\fx\meta{lang}name}
+% \DescribeMacro[noindex]{\fx\meta{lang}sname}
+% \DescribeMacro[noprint]{\fxenglishnotename}
+% \DescribeMacro[noprint]{\fxenglishnotesname}
+% \DescribeMacro[noprint]{\fxenglishwarningname}
+% \DescribeMacro[noprint]{\fxenglishwarningsname}
+% \DescribeMacro[noprint]{\fxenglisherrorname}
+% \DescribeMacro[noprint]{\fxenglisherrorsname}
+% \DescribeMacro[noprint]{\fxenglishfatalname}
+% \DescribeMacro[noprint]{\fxenglishfatalsname}
+% \DescribeMacro[noprint]{\fxfrenchnotename}
+% \DescribeMacro[noprint]{\fxfrenchnotesname}
+% \DescribeMacro[noprint]{\fxfrenchwarningname}
+% \DescribeMacro[noprint]{\fxfrenchwarningsname}
+% \DescribeMacro[noprint]{\fxfrencherrorname}
+% \DescribeMacro[noprint]{\fxfrencherrorsname}
+% \DescribeMacro[noprint]{\fxfrenchfatalname}
+% \DescribeMacro[noprint]{\fxfrenchfatalsname}
+% \DescribeMacro[noprint]{\fxspanishnotename}
+% \DescribeMacro[noprint]{\fxspanishnotesname}
+% \DescribeMacro[noprint]{\fxspanishwarningname}
+% \DescribeMacro[noprint]{\fxspanishwarningsname}
+% \DescribeMacro[noprint]{\fxspanisherrorname}
+% \DescribeMacro[noprint]{\fxspanisherrorsname}
+% \DescribeMacro[noprint]{\fxspanishfatalname}
+% \DescribeMacro[noprint]{\fxspanishfatalsname}
+% \DescribeMacro[noprint]{\fxitaliannotename}
+% \DescribeMacro[noprint]{\fxitaliannotesname}
+% \DescribeMacro[noprint]{\fxitalianwarningname}
+% \DescribeMacro[noprint]{\fxitalianwarningsname}
+% \DescribeMacro[noprint]{\fxitalianerrorname}
+% \DescribeMacro[noprint]{\fxitalianerrorsname}
+% \DescribeMacro[noprint]{\fxitalianfatalname}
+% \DescribeMacro[noprint]{\fxitalianfatalsname}
+% \DescribeMacro[noprint]{\fxgermannotename}
+% \DescribeMacro[noprint]{\fxgermannotesname}
+% \DescribeMacro[noprint]{\fxgermanwarningname}
+% \DescribeMacro[noprint]{\fxgermanwarningsname}
+% \DescribeMacro[noprint]{\fxgermanerrorname}
+% \DescribeMacro[noprint]{\fxgermanerrorsname}
+% \DescribeMacro[noprint]{\fxgermanfatalname}
+% \DescribeMacro[noprint]{\fxgermanfatalsname}
+% \DescribeMacro[noprint]{\fxdanishnotename}
+% \DescribeMacro[noprint]{\fxdanishnotesname}
+% \DescribeMacro[noprint]{\fxdanishwarningname}
+% \DescribeMacro[noprint]{\fxdanishwarningsname}
+% \DescribeMacro[noprint]{\fxdanisherrorname}
+% \DescribeMacro[noprint]{\fxdanisherrorsname}
+% \DescribeMacro[noprint]{\fxdanishfatalname}
+% \DescribeMacro[noprint]{\fxdanishfatalsname}
+% \DescribeMacro[noprint]{\fxcroatiannotename}
+% \DescribeMacro[noprint]{\fxcroatiannotesname}
+% \DescribeMacro[noprint]{\fxcroatianwarningname}
+% \DescribeMacro[noprint]{\fxcroatianwarningsname}
+% \DescribeMacro[noprint]{\fxcroatianerrorname}
+% \DescribeMacro[noprint]{\fxcroatianerrorsname}
+% \DescribeMacro[noprint]{\fxcroatianfatalname}
+% \DescribeMacro[noprint]{\fxcroatianfatalsname}
+% \fx's language control has been described in section
+% \sectionref{sec:manual:i18n}. For every supported language \meta{lang}, a
+% number of macros define the language-dependent part of \fx. The commands
+% \cs{fx}\meta{lang}\texttt{notename}, \cs{fx}\meta{lang}\texttt{notesname},
+% and their equivalent for the other annotation levels define the singular and
+% plural forms of the note names.\\
+% \DescribeMacro[noindex]{\ \unskip\meta{lang}listfixmename}
+% \DescribeMacro[noprint]{\englishlistfixmename}
+% \DescribeMacro[noprint]{\frenchlistfixmename}
+% \DescribeMacro[noprint]{\spanishlistfixmename}
+% \DescribeMacro[noprint]{\italianlistfixmename}
+% \DescribeMacro[noprint]{\germanlistfixmename}
+% \DescribeMacro[noprint]{\danishlistfixmename}
+% \DescribeMacro[noprint]{\croatianlistfixmename}
+% The title for the list of fixmes is defined by the command
+% \cs{}\meta{lang}\texttt{listfixmename}.
+%
+% All of these commands may be renewed, and their values will be honored by
+% \fx in all situations, including potential language changes across the
+% document.
+%
+% \section{History\label{sec:manual:history}}
+% \begin{itemize}
+% \item[v4.5] Public interface for extending \fx 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.
+% \item[v4.4] Handle existing yet empty lox file properly, meaning don't
+% actually typeset an empty list of corrections.\\
+% Don't update the \texttt{lox} file in final mode, avoiding potential
+% typesetting artifacts, reported by Lars Madsen.\\
+% Various internals and documentation improvements.
+% \item[v4.3] Add a paragraph about the duplication of notes in captions, upon
+% exchange with Kreuvf.\\
+% Update support for the \komascript classes by using the
+% \texttt{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.
+% \item[v4.2] Improve Danish translation, thanks to Lars Madsen.\\
+% Fix buglet in \cs{@wrindex} redefinition, reported by Norman Gray.
+% \item[v4.1] 8 new PDF-specific annotation layouts.\\
+% New annotation layout: \texttt{marginnote}, suggested by S\'ebastien
+% Mengin.\\
+% Better mechanism for handling layout mutual exclusion.\\
+% Fix bug in inner layout processing.
+% \item[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 \texttt{key=value} argument syntax in the whole user
+% interface.\\
+% New command \cs{fxsetup}.\\
+% Homogenize the log and console messages.\\
+% Heavy internals refactoring.
+% \item[v3.4] \cs{fixme}, \cs{fxerror}, \cs{fxwarning} and \cs{fxnote} are now
+% robust, thanks to Will Robertson.\\
+% Fix incompatibility with \komascript classes version of \cs{@starttoc}
+% when the lox file is inexistent, reported by Philipp Stephani.
+% \item[v3.3] Document incompatibility between marginal layout and the ACM
+% SIG classes, reported by Jochen Wuttke.\\
+% Honor \texttt{twoside} option in marginal layout, suggested by Jens
+% Remus.\\
+% Support for \komascript classes version 2006/07/30 v2.95b, suggested by
+% Jens Remus.\\
+% Documentation improvements suggested by Brian van den Broek.\\
+% Fix incompatibility with \texttt{amsart} reported by Lars Madsen:
+% \cs{@starttoc} takes two arguments.\\
+% Fix bug reported by Stefan Mann: a typo in the \cs{fixme@footnotetrue}
+% macro name.
+% \item[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 \texttt{amsbook} reported by Claude
+% Lacoursi\`ere: \cs{@starttoc} takes two arguments.\\
+% Fix incompatibility with Beamer reported by Akim Demaille: protect
+% contents of lox file.
+% \item[v3.1] Fix bug reported by Arnold Beckmann: the environments were
+% visible in final mode.
+% \item[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.
+% \item[v2.2] New option \texttt{silent} to suppress notes logging.\\
+% Support for Danish thanks to Kim Rud Bille.
+% \item[v2.1] Use \cs{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.
+% \item[v2.0] New feature: note levels.\\
+% New feature: \fx note counters and usage summary.\\
+% Suggestions from Kasper B. Graversen.\\
+% Support for Spanish thanks to Agust\'in Mart\'in.
+% \item[v1.5] New appearance option: \texttt{inline}.
+% \item[v1.4] Support for the \komascript classes.\\
+% Fix bug reported by Ulf Jaenicke-Roessler: the \cs{listoffixmes} command
+% didn't work when called before the first \fx note.
+% \item[v1.3] Support for Italian thanks to Riccardo Murri.
+% \item[v1.2] Support for German thanks to Harald Harders.
+% \end{itemize}
+%
+% \StopEventually{\vfill\hfill\small \packagecopyright{}.}
+%
+% \section{Implementation}
+% \subsection{Preamble}
+% \begin{macrocode}
+%<fixme>
+\NeedsTeXFormat{LaTeX2e}
+%<*header>
+\ProvidesPackage{fixme}[2019/01/03 v4.5 Collaborative annotations for LaTeX2e]
+
+%</header>
+% \end{macrocode}
+% Some required packages:
+% \begin{macrocode}
+%<*fixme>
+\RequirePackage{ifthen}
+\RequirePackage{verbatim}
+\RequirePackage{xkeyval}[2006/11/18]
+
+%</fixme>
+% \end{macrocode}
+% \begin{macro}{\fixmelogo}
+% The \fx logo:
+% \begin{macrocode}
+%<*header>
+\newcommand\fixmelogo{\textsf{FiXme}}
+
+%</header>
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Utilities}
+% \subsubsection{Miscellaneous}
+% \begin{macro}{\@fxpkginfo}
+% \begin{macro}{\@fxpkgwarning}
+% \marg{msg}\\
+% Issue a \fx package info or warning:
+% \begin{macrocode}
+%<*fixme>
+\newcommand\@fxpkginfo{\PackageInfo{FiXme}}
+\newcommand\@fxpkgwarning{\PackageWarning{FiXme}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@fxpkgerror}
+% \marg{shortmsg}\marg{longmsg}\\
+% Issue a \fx package error:
+% \begin{macrocode}
+\newcommand\@fxpkgerror{\PackageError{FiXme}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxaddtolist}
+% \marg{list}\marg{elt}\\
+% Add \meta{elt} at the end of \meta{list}. We should check for duplicates,
+% but this is not currently done.
+% \begin{macrocode}
+\newcommand*\@fxaddtolist[2]{%
+ \expandafter\ifx\csname #1\endcsname\relax%
+ \expandafter\def\csname #1\endcsname{#2}%
+ \else%
+ \expandafter\ifx\csname #1\endcsname\empty%
+ \expandafter\g@addto@macro\csname #1\endcsname{#2}%
+ \else%
+ \expandafter\g@addto@macro\csname #1\endcsname{,#2}%
+ \fi%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \subsubsection{Key-value management (\texttt{xkeyval})}
+% \paragraph{Shortcuts}
+% The following macros are simple shortcuts for using \texttt{xkeyval} with
+% the \texttt{fx} prefix.
+% \begin{macro}{\@fxkeyifundefined}
+% \marg{families}\marg{key}\marg{then}\marg{else}
+% \begin{macrocode}
+\newcommand\@fxkeyifundefined{\key@ifundefined[fx]}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxdefinekey}
+% \marg{family}\marg{key}\oarg{default}\marg{function}
+% \begin{macrocode}
+\newcommand\@fxdefinekey{\define@key[fx]}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxdefinecmdkey}
+% \marg{family}\oarg{mp}\marg{key}\oarg{default}\marg{function}
+% \begin{macrocode}
+\newcommand\@fxdefinecmdkey{\define@cmdkey[fx]}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxdefinechoicekey}
+% \marg{family}\marg{key}\oarg{bin}\marg{alternatives}\ignorespaces
+% \oarg{default}\marg{function}
+% \begin{macrocode}
+\newcommand\@fxdefinechoicekey{\define@choicekey[fx]}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxsetkeys}
+% \marg{families}\oarg{na}\marg{keys}
+% \begin{macrocode}
+\newcommand\@fxsetkeys{\setkeys[fx]}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxpresetkeys}
+% \marg{families}\marg{head keys}\marg{tail keys}
+% \begin{macrocode}
+%% Note: currently unused
+%% \newcommand\@fxpresetkeys{\presetkeys[fx]}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{Wrappers}
+% \begin{macro}{\@fxvoidkeyerror}
+% \marg{key}\marg{value}\\
+% Issue a \fx error about a void \meta{key} misuse (see below):
+% \begin{macrocode}
+\newcommand*\@fxvoidkeyerror[2]{%
+ \@fxpkgerror{misuse of key '#1'}{%
+ You have given the key '#1' the argument '#2' but it takes
+ none.\MessageBreak
+ Type X to quit, fix that key and re-run LaTeX.\MessageBreak}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxdefinevoidkey}
+% \marg{family}\marg{key}\marg{func}\\
+% A \fx ``void \meta{key}'' isn't supposed to get an argument.
+% \begin{macrocode}
+\newcommand*\@fxdefinevoidkey[3]{%
+ \define@key[fx]{#1}{#2}[]{%
+ \ifthenelse{\equal{##1}{}}{%
+ #3}{%
+ \@fxvoidkeyerror{#2}{##1}}}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxdefineboolkey}
+% \oarg{func}\marg{family}\marg{key}\\
+% A \fx ``boolean \meta{key}'' is like an \texttt{xkeyval} one, with the
+% addition that for every such \texttt{key}, there is a void \texttt{nokey}
+% counterpart.
+% \begin{macrocode}
+\newcommand*\@fxdefineboolkey[3][]{%
+ \define@boolkey[fx]{#2}{#3}[true]{#1}
+ \@fxdefinevoidkey{#2}{no#3}{\@nameuse{fx@#2@#3}{false}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \paragraph{Extension-level option creation interface}
+% \begin{macro}{\@fxdefineoptioninterface}
+% \marg{family}\marg{infix}
+% \begin{macro}[noindex]{\FXDefine...Key}
+% \begin{macro}[noindex]{\FXDefine...CmdKey}
+% \begin{macro}[noindex]{\FXDefine...ChoiceKey}
+% \begin{macro}[noindex]{\FXDefine...VoidKey}
+% \begin{macro}[noindex]{\FXDefine...BoolKey}
+% This macro defines the extension-level interface allowing users to define
+% new \texttt{xkeyval} options for a certain \meta{family}. Note that the core
+% of \fx could use those interfaces once defined, but it wouldn't bring much
+% to the picture. Indeed, it basically boils down to using a \meta{family}
+% within the names of the macros instead of as an argument (and avoiding the
+% use of the ``at'' character).
+% \begin{macrocode}
+\newcommand*\@fxdefineoptioninterface[2]{%
+ \expandafter\newcommand\csname FXDefine#2Key\endcsname{%
+ \@fxdefinekey{#1}}%
+ \expandafter\newcommand\csname FXDefine#2CmdKey\endcsname{%
+ \@fxdefinecmdkey{#1}}%
+ \expandafter\newcommand\csname FXDefine#2ChoiceKey\endcsname{%
+ \@fxdefinechoicekey{#1}}%
+ \expandafter\newcommand\csname FXDefine#2VoidKey\endcsname{%
+ \@fxdefinevoidkey{#1}}%
+ \expandafter\newcommand\expandafter*\csname FXDefine#2BoolKey\endcsname[2][]{%
+ \@fxdefineboolkey[##1]{#1}{##2}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{List macros}
+% \subsubsection{Contents lines\label{sec:code:contentsline}}
+% \begin{macro}{\l@fixme}
+% We use the same layout as for the list of figures.
+% \begin{macrocode}
+\let\l@fixme\l@figure
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxdottedtocline}
+% \marg{tocdepth}\marg{indent}\marg{numwidth}\marg{contents}\marg{target}\\
+% This macro is copied almost verbatim from \LaTeX'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 \meta{target} text take all the space
+% it needs.
+% \begin{macrocode}
+\newcommand*\@fxdottedtocline[5]{%
+ \ifnum #1>\c@tocdepth \else
+ \vskip \z@ \@plus.2\p@
+ {\leftskip #2\relax \rightskip \@tocrmarg \parfillskip -\rightskip
+ \parindent #2\relax\@afterindenttrue
+ \interlinepenalty\@M
+ \leavevmode
+ \@tempdima #3\relax
+ \advance\leftskip \@tempdima \null\nobreak\hskip -\leftskip
+ {#4}\nobreak
+ \leaders\hbox{$\m@th
+ \mkern \@dotsep mu\hbox{.}\mkern \@dotsep
+ mu$}\hfill
+ \nobreak
+ #5\par}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fxcontentsline}
+% \marg{contents}\marg{target}\\
+% Similar to \LaTeX's \cs{contentsline} macro, but temporarily bind
+% \cs{@dottedtocline} to our own version. The nice thing about this
+% implementation is that we can still use \cs{l@fixme} (remember that it is
+% bound to \cs{l@figure}) without exactly knowing what its definition is.
+% This macro is at the user level because \cs{contentsline} is, but it is
+% not currently documented in the user manual.
+% \begin{macrocode}
+\newcommand*\fxcontentsline[2]{%
+ \begingroup%
+ \let\@dottedtocline\@fxdottedtocline%
+ \l@fixme{#1}{#2}%
+ \endgroup}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fxaddcontentsline}
+% \marg{contents}\\
+% Wrapper around \LaTeX's \cs{addcontentsline} macro to handle the
+% \texttt{target} option. If a specific target is provided, we can't use the
+% normal \cs{addcontentsline} macro for reasons explained above, so we use
+% our own version of \cs{contentsline} instead. This macro is at the user
+% level because \cs{addcontentsline} is, but it is not currently documented
+% in the user manual.
+% \begin{macrocode}
+\newcommand*\fxaddcontentsline[1]{%
+ \ifthenelse{\equal{\cmdfx@note@target}{thepage}}{%
+ \addcontentsline{lox}{fixme}{#1}}{%
+ \addtocontents{lox}{\protect\fxcontentsline{#1}{\cmdfx@note@target}}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{List headers}
+% \fx recognizes the standard \texttt{article}, \texttt{report} and
+% \texttt{book} classes, the AMS ones, and adapts the list header
+% accordingly. It also detects when the package \texttt{basictoc} is loaded
+% and uses it, which notably makes it compliant with the \komascript classes
+% as well. Otherwise, the standard \texttt{article} layout is used.
+%
+% \paragraph{\texttt{article} version}
+% \begin{macro}{\@lox@prtc@article}
+% \begin{macro}{\@lox@psttc@article}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\@lox@prtc@article{%
+ \section*{\@fxlistfixmename%
+ \@mkboth{\MakeUppercase\@fxlistfixmename}{\MakeUppercase\@fxlistfixmename}}}
+\let\@lox@psttc@article\relax
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \paragraph{\texttt{report} version}
+% \begin{macro}{\@lox@prtc@report}
+% \begin{macro}{\@lox@psttc@report}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\@lox@prtc@report{%
+ \if@twocolumn
+ \@restonecoltrue\onecolumn
+ \else
+ \@restonecolfalse
+ \fi
+ \chapter*{\@fxlistfixmename%
+ \@mkboth{\MakeUppercase\@fxlistfixmename}{\MakeUppercase\@fxlistfixmename}}}
+\newcommand\@lox@psttc@report{\if@restonecol\twocolumn\fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \paragraph{\texttt{book} version}
+% \begin{macro}{\@lox@prtc@book}
+% \begin{macro}{\@lox@psttc@book}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\@lox@prtc@book{%
+ \if@twocolumn
+ \@restonecoltrue\onecolumn
+ \else
+ \@restonecolfalse
+ \fi
+ \chapter*{\@fxlistfixmename%
+ \@mkboth{\MakeUppercase\@fxlistfixmename}{\MakeUppercase\@fxlistfixmename}}}
+\newcommand\@lox@psttc@book{\if@restonecol\twocolumn\fi}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Status/class-dependent implementation}
+% \begin{macro}{\lox@final}
+% \begin{macro}{\lox@draft}
+% In the new implementation of the \texttt{draft} mode below, we not only
+% check that the \texttt{lox} file exists, but also that it is not empty
+% before actually typesetting anything.
+% \begin{macrocode}
+\let\lox@final\relax
+
+\newread\lox@file
+\newif\iflox@typeset
+\def\lox@eol{\par}
+\newcommand\lox@draft{%
+ \lox@typesetfalse%
+ \openin\lox@file\jobname.lox\relax
+ \ifeof\lox@file\else
+ \read\lox@file to \lox@maybeeol
+ \ifeof\lox@file
+ \ifx\lox@maybeeol\lox@eol\else\lox@typesettrue\fi
+ \else
+ \lox@typesettrue
+ \fi
+ \fi
+ \closein\lox@file
+ \iflox@typeset\@lox@prtc\@starttoc{lox}\@lox@psttc\else\@starttoc{lox}\fi}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\lox@draft@ams}
+% The \texttt{amsbook} and \texttt{amsart} classes have the very ugly idea
+% of redefining the \cs{@starttoc} macro to take two arguments. Therefore, I
+% need to provide a specific version of the \cs{listoffixmes} macro:
+% \begin{macrocode}
+\newcommand\lox@draft@ams{\@starttoc{lox}\@fxlistfixmename}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Faces}
+% \begin{macro}{\fxsetface}
+% \marg{name}\marg{value}
+% \begin{macrocode}
+\newcommand*\fxsetface[2]{\@fxsetkeys{face}{#1face=#2}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxnewface}
+% \oarg{default}\marg{name}\\
+% A face is just a command key:
+% \begin{macrocode}
+\newcommand*\@fxnewface[2][]{%
+ \@fxdefinecmdkey{face}{#2face}{}%
+ \fxsetface{#2}{#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxuseface}
+% \marg{name}
+% \begin{macrocode}
+\newcommand*\@fxuseface[1]{\@nameuse{cmdfx@face@#1face}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Annotation layouts}
+% \subsubsection{Layout modes}
+% \begin{option}{multiuser}
+% \begin{option}{singleuser}
+% \begin{option}{mode}
+% These options specify whether \fx should function in standalone or
+% collaborative mode, allowing the different layouts to tweak their output.
+% \begin{macrocode}
+\@fxdefineboolkey[%
+ \ifthenelse{\equal{#1}{true}}{%
+ \fx@mode@singleuserfalse}{%
+ \fx@mode@singleusertrue}]{%
+ mode}{multiuser}
+\@fxdefineboolkey[%
+ \ifthenelse{\equal{#1}{true}}{%
+ \fx@mode@multiuserfalse}{%
+ \fx@mode@multiusertrue}]{%
+ mode}{singleuser}
+\@fxdefinechoicekey{mode}{mode}{multiuser,singleuser}{\@fxsetkeys{mode}{#1}}
+
+% \end{macrocode}
+% \end{option}
+% \end{option}
+% \end{option}
+%
+% \subsubsection{Layout creation}
+% Separating between ``early'' and ``late'' layouts is needed in starred
+% context, that is, when we are using targeted commands or environments.
+% \begin{macro}{\@fxearlylayouts}
+% \begin{macro}{\@fxlatelayouts}
+% Comma-separated lists of available early and late layouts.
+% \begin{macrocode}
+\let\@fxearlylayouts\empty
+\let\@fxlatelayouts\empty
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\FXProvidesLayout}
+% \marg{name}\oarg{release information}
+% \begin{macrocode}
+\newcommand*\FXProvidesLayout[1]{\ProvidesPackage{fxlayout#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxrecordlayoutmutex}
+% \marg{layout}\marg{layouts}\\
+% Record mutual exclusion between \meta{layout} and the comma-separated list
+% of \meta{layouts}. For each \meta{layout}, the mutual exclusion list is
+% stored in \cs{@fxlayout@}\meta{layout}\texttt{@mutex}.
+% \begin{macrocode}
+\newcommand*\@fxrecordlayoutmutex[2]{%
+ \edef\@fxlts{\zap@space#2 \@empty}%
+ \def\@fxexpr{\@fxaddtolist{@fxlayout@#1@mutex}}%
+ \expandafter\@fxexpr\expandafter{\@fxlts}%
+ \@for\@fxlt:=\@fxlts\do{\@fxaddtolist{@fxlayout@\@fxlt @mutex}{#1}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxhandlelayoutmutex}
+% \marg{layout}\\
+% Handle \meta{layout}'s mutual exclusion list.
+% \begin{macrocode}
+\newcommand*\@fxhandlelayoutmutex[1]{%
+ \ifthenelse{\boolean{fx@layout@#1}}{%
+ \def\@fxexpr{\@for\@fxlt:=}%
+ \expandafter\@fxexpr\csname @fxlayout@#1@mutex\endcsname\do{%
+ \@ifundefined{iffx@layout@\@fxlt}{}{%
+ \ifthenelse{\boolean{fx@layout@\@fxlt}}{%
+ \@fxpkgwarning{%
+ #1 layout requested;\MessageBreak
+ turning \@fxlt\space layout off}%
+ \@nameuse{fx@layout@\@fxlt}{false}}{}}}}{}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@FXRegisterLayout}
+% \marg{when}\oarg{mutex}\marg{name}\marg{funcname}\\
+% Register a new layout with \fx. 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
+% \cs{let} to the real one, because themes might want to redefine latter. An
+% optional mutual exclusion list may also be given.
+% \begin{macrocode}
+\def\@FXRegisterLayout#1[#2]#3#4{%
+ \@fxkeyifundefined{layout}{#3}{%
+ \@fxrecordlayoutmutex{#3}{#2}%
+ \@fxdefineboolkey[\@fxhandlelayoutmutex{#3}]{layout}{#3}%
+ \expandafter\def\csname @fxlayout@#3\endcsname{#4}%
+ \@fxaddtolist{@fx#1layouts}{#3}}{%
+ \@fxpkgerror{layout '#3' already registered}{%
+ You have called \string\FXRegisterLayout\space with a name already
+ in use.\MessageBreak
+ If you want to modify an existing layout, renew its
+ command.\MessageBreak
+ Otherwise, you must choose a different name.}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\FXRegisterLayout}
+% \begin{macro}{\FXRegisterLayout*}
+% \meta{\texttt{*}}\oarg{mutex}\marg{name}\marg{funcname}\\
+% And the use-level interface:
+% \begin{macrocode}
+\newcommand\FXRegisterLayout{%
+ \@ifstar{%
+ \@ifnextchar[%]
+ {\@FXRegisterLayout{early}}{\@FXRegisterLayout{early}[]}}{%
+ \@ifnextchar[%]
+ {\@FXRegisterLayout{late}}{\@FXRegisterLayout{late}[]}}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}[noindex]{\FXDefineLayout...Key}
+% \begin{macro}[noprint]{\FXDefineLayoutKey}
+% \begin{macro}[noprint]{\FXDefineLayoutCmdKey}
+% \begin{macro}[noprint]{\FXDefineLayoutChoiceKey}
+% \begin{macro}[noprint]{\FXDefineLayoutVoidKey}
+% \begin{macro}[noprint]{\FXDefineLayoutBoolKey}
+% Finally, the extension-level option creation interface:
+% \begin{macrocode}
+\@fxdefineoptioninterface{layout}{Layout}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Standard textual dispositions}
+% \begin{macro}{\@fxtextstd}
+% \marg{type}\marg{note}\marg{author}\\
+% The standard text disposition.
+% \begin{macrocode}
+\newcommand*\@fxtextstd[3]{\ignorespaces#3 \fxnotename{#1}: #2}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxsignature}
+% \marg{author}\\
+% Typeset the signature part unless \meta{author} is empty. Note that
+% \cs{ifthenelse} is fragile, so we need to make the signature stuff robust.
+% \begin{macrocode}
+\DeclareRobustCommand*\@fxsignature[1]{%
+ \ifthenelse{\equal{#1}{}}{}{ -- {\@fxuseface{signature}#1}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxsigstd}
+% \marg{type}\marg{note}\marg{author}\\
+% The standard signature disposition.
+% \begin{macrocode}
+\newcommand*\@fxsigstd[3]{\fxnotename{#1}: #2\@fxsignature{#3}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Built-in layouts}
+% Let's start with the early layouts, and continue with the late ones.
+% \paragraph{Margin}
+% \begin{layout}[noprint]{margin}
+% \begin{face}{margin}
+% \mbox{}
+% \begin{macrocode}
+\@fxnewface{margin}
+% \end{macrocode}
+% \end{face}
+% \begin{macro}{\FXLayoutMargin}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutMargin[3]{%
+ \marginpar[\raggedleft\@fxuseface{margin}\@fxtextstd{#1}{#2}{#3}]{%
+ \raggedright\@fxuseface{margin}\@fxtextstd{#1}{#2}{#3}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@margin}
+% \begin{booleanoption}{margin}
+% \mbox{}
+% \begin{macrocode}
+\FXRegisterLayout*{margin}{\FXLayoutMargin}
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \paragraph{Margin clue}
+% \begin{layout}[noprint]{marginclue}
+% \begin{macro}{\FXLayoutMarginCLue}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutMarginClue[3]{%
+ \marginpar[%
+ {\raggedleft\@fxuseface{margin}\ignorespaces#3 \fxnotename{#1}!}]{%
+ \raggedright\@fxuseface{margin}\ignorespaces#3 \fxnotename{#1}!}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@marginclue}
+% \begin{booleanoption}{marginclue}
+% \mbox{}
+% \begin{macrocode}
+\FXRegisterLayout*[margin]{marginclue}{\FXLayoutMarginClue}
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \paragraph{Footnote}
+% \begin{layout}[noprint]{footnote}
+% \begin{macro}{\FXLayoutFootnote}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutFootnote[3]{\footnote{\@fxtextstd{#1}{#2}{#3}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@footnote}
+% \begin{booleanoption}{footnote}
+% \mbox{}
+% \begin{macrocode}
+\FXRegisterLayout{footnote}{\FXLayoutFootnote}
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \paragraph{Inline}
+% \begin{layout}[noprint]{inline}
+% \begin{face}{inline}
+% \mbox{}
+% \begin{macrocode}
+\@fxnewface{inline}
+% \end{macrocode}
+% \end{face}
+% \begin{macro}{\FXLayoutInline}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutInline[3]{ \@fxuseface{inline}\@fxtextstd{#1}{#2}{#3}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@inline}
+% \begin{booleanoption}{inline}
+% \mbox{}
+% \begin{macrocode}
+\FXRegisterLayout{inline}{\FXLayoutInline}
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \paragraph{Index}
+% \begin{layout}[noprint]{index}
+% \begin{macro}{\fixmeindexname}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\fixmeindexname{\fixmelogo}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@wrindex}
+% \marg{contents}\\
+% A replacement for \LaTeX's standard \cs{@wrindex} macro to deal with the
+% \texttt{target} option. When given, it is supposed to replace the page
+% number, just as in the list of fixmes.
+% \begin{macrocode}
+\def\@wrindex#1{%
+ \ifthenelse{\equal{\cmdfx@note@target}{thepage}}{%
+ \protected@write\@indexfile{}{\string\indexentry{#1}{\thepage}}}{%
+ \protected@write\@indexfile{}{\string\indexentry{#1}{\cmdfx@note@target}}}%
+ \endgroup
+ \@esphack}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxnotekey}
+% \begin{macro}{\@fxwarningkey}
+% \begin{macro}{\@fxerrorkey}
+% \begin{macro}{\@fxfatalkey}
+% The keys used to sort indexed annotations by importance level:
+% \begin{macrocode}
+\newcommand\@fxnotekey{***a}
+\newcommand\@fxwarningkey{***b}
+\newcommand\@fxerrorkey{***c}
+\newcommand\@fxfatalkey{***d}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\FXLayoutIndex}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutIndex[3]{%
+ \iffx@mode@multiuser%
+ \index{***@\fixmeindexname:%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !\@nameuse{thefx#1count}: #3: #2}%
+ \index{***#3@\fixmeindexname{} (#3):%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !\@nameuse{thefx#1count}: #2}%
+ \else%
+ \index{***@\fixmeindexname:%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !\@nameuse{thefx#1count}: #2}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@index}
+% \begin{booleanoption}{index}
+% \mbox{}
+% \begin{macrocode}
+\FXRegisterLayout{index}{\FXLayoutIndex}
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \paragraph{Contents line\label{sec:code:contentslinelayout}}
+% The contents of the \texttt{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 \cs{@@@fxnote@late@draft}.
+% \begin{macro}{\FXLayoutContentsLine}
+% \marg{type}\marg{note}\marg{author}\\
+% \begin{macrocode}
+\newcommand*\FXLayoutContentsLine[3]{%
+ \iffx@mode@multiuser%
+ \fxaddcontentsline{\@fxtextstd{#1}{#2}{#3}}%
+ \else%
+ \fxaddcontentsline{\fxnotename{#1}: #2}%
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Layout loading}
+% \begin{macro}{\fxloadlayouts}
+% \marg{name,\ldots}
+% \begin{macrocode}
+\newcommand*\fxloadlayouts[1]{%
+ \edef\@fxlts{\zap@space#1 \@empty}%
+ \@for\@fxlt:=\@fxlts\do{\usepackage{fxlayout#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Layout control}
+% \begin{macro}{\@fxsetlayoutkeys}
+% \marg{keys}
+% This macro would probably be overkill if we didn't need to
+% \cs{expandafter} it at some point (See \cs{@fxhandleinnermode}).
+% \begin{macrocode}
+\newcommand\@fxsetlayoutkeys{\@fxsetkeys{layout}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxparselayout}
+% Utility macro to detect the \texttt{no}\meta{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\ldots
+% \begin{macrocode}
+\def\@fxparselayout#1#2#3\relax{\def\@fxltprefix{#1#2}\def\@fxltrest{#3}}
+% \begin{macro}{\fxuselayouts}
+% \marg{[no]names}\\
+% First, ensure that those layouts are available, then activate them.
+% \cs{\FXRequireLayouts} is a better style for theme programming.
+% \begin{macrocode}
+\newcommand*\fxuselayouts[1]{%
+ \edef\@fxlts{\zap@space#1 \@empty}%
+ \@for\@fxlt:=\@fxlts\do{%
+ \expandafter\@fxparselayout\@fxlt\relax%
+ \ifthenelse{\equal{\@fxltprefix}{no}}{%
+ \let\@fxltname\@fxltrest}{%
+ \let\@fxltname\@fxlt}%
+ \@fxkeyifundefined{layout}{\@fxltname}{\fxloadlayouts{\@fxltname}}{}}%
+ \@fxsetkeys{layout}{#1}}
+\let\FXRequireLayouts\fxuselayouts
+
+% \end{macrocode}
+% \end{macro}
+% \begin{option}{innerlayout}
+% The alternative inner mode layout:
+% \begin{macrocode}
+\@fxdefinecmdkey{layout}{innerlayout}{}
+% \end{macrocode}
+% \end{option}
+% \begin{option}{morelayout}
+% The \texttt{morelayout} option adds to the existing layout configuration.
+% The implementation is trivial, as it simply boils down to calling
+% \cs{setkeys} on its argument. There are several advantages in doing this.
+% \begin{enumerate}
+% \item It is possible to disable a layout by using the
+% \texttt{no}\meta{layout} form. For example,
+% |morelayout={inline,nomargin}| will work.
+% \item A wrong layout name (for instance, misspelled) will trigger an
+% \texttt{xkeyval} error.
+% \end{enumerate}
+% \begin{macrocode}
+\@fxdefinekey{layout}{morelayout}{\fxuselayouts{#1}}
+% \end{macrocode}
+% \end{option}
+% \begin{option}{layout}
+% The \texttt{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 \texttt{no}\meta{layout} form is valid but has no
+% effect.
+% \begin{macrocode}
+\@fxdefinekey{layout}{layout}{%
+ \edef\@fxlayouts{\@fxearlylayouts,\@fxlatelayouts}%
+ \@for\@fxlt:=\@fxlayouts\do{%
+ \@nameuse{fx@layout@\@fxlt}{false}}%
+ \fxuselayouts{#1}}
+
+% \end{macrocode}
+% \end{option}
+%
+% \subsection{Environment Layouts}
+% \subsubsection{Layout creation}
+% \begin{macro}{\FXProvidesEnvLayout}
+% \marg{name}\oarg{release information}
+% \begin{macrocode}
+\newcommand*\FXProvidesEnvLayout[1]{\ProvidesPackage{fxenvlayout#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\FXRegisterEnvLayout}
+% \marg{name}\marg{beginfuncname}\marg{endfuncname}\\
+% Register a new environment layout with \fx. This currently only involves
+% constructing the translation macros. The translation macros in question
+% can't be \cs{let} to the real ones, because themes or users might want to
+% redefine the latter.
+% \begin{macrocode}
+\newcommand*\FXRegisterEnvLayout[3]{%
+ \@ifundefined{@fxenvlayout@#1@begin}{%
+ \expandafter\def\csname @fxenvlayout@#1@begin\endcsname{#2}%
+ \expandafter\def\csname @fxenvlayout@#1@end\endcsname{#3}}{%
+ \@fxpkgerror{environment layout '#2' already registered}{%
+ You have called \string\FXRegisterEnvLayout\space with a name already in
+ use.\MessageBreak
+ If you want to modify an existing environment layout, renew its
+ commands.\MessageBreak
+ Otherwise, you must choose a different name.}}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[noindex]{\FXDefineEnvLayout...Key}
+% \begin{macro}[noprint]{\FXDefineEnvLayoutKey}
+% \begin{macro}[noprint]{\FXDefineEnvLayoutCmdKey}
+% \begin{macro}[noprint]{\FXDefineEnvLayoutChoiceKey}
+% \begin{macro}[noprint]{\FXDefineEnvLayoutVoidKey}
+% \begin{macro}[noprint]{\FXDefineEnvLayoutBoolKey}
+% The extension-level option creation interface:
+% \begin{macrocode}
+\@fxdefineoptioninterface{envlayout}{EnvLayout}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Built-in layouts}
+% \paragraph{Plain}
+% \begin{envlayout}[noprint]{plain}
+% \begin{face}{env}
+% \mbox{}
+% \begin{macrocode}
+\@fxnewface{env}
+% \end{macrocode}
+% \end{face}
+% \begin{macro}{\FXEnvLayoutPlainBegin}
+% \begin{macro}{\FXEnvLayoutPlainEnd}
+% \marg{type}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXEnvLayoutPlainBegin[2]{%
+ \@fxuseface{env}\ignorespaces#2 \fxnotename{#1}: \ignorespaces}
+\newcommand*\FXEnvLayoutPlainEnd[2]{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@fxenvlayout@plain@begin}
+% \begin{macro}{\@fxenvlayout@plain@end}
+% \begin{macrocode}
+\FXRegisterEnvLayout{plain}{\FXEnvLayoutPlainBegin}{\FXEnvLayoutPlainEnd}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{envlayout}
+%
+% \paragraph{Signature}
+% \begin{envlayout}{signature}
+% \begin{face}{signature}
+% \mbox{}
+% \begin{macrocode}
+\@fxnewface[\itshape]{signature}
+% \end{macrocode}
+% \end{face}
+% \begin{macro}{\FXEnvLayoutSignatureBegin}
+% \begin{macro}{\FXEnvLayoutSignatureEnd}
+% \marg{type}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXEnvLayoutSignatureBegin[2]{%
+ \@fxuseface{env}\fxnotename{#1}: \ignorespaces}
+\newcommand*\FXEnvLayoutSignatureEnd[2]{\@fxsignature{#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@fxenvlayout@signature@begin}
+% \begin{macro}{\@fxenvlayout@signature@end}
+% \mbox{}
+% \begin{macrocode}
+\FXRegisterEnvLayout{signature}{%
+ \FXEnvLayoutSignatureBegin}{\FXEnvLayoutSignatureEnd}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{envlayout}
+%
+% \subsubsection{Layout selection}
+% \begin{macro}{\@fxselectenvlayout}
+% \marg{name}
+% \begin{macro}{\@fxenvlayout@begin}
+% \begin{macro}{\@fxenvlayout@end}
+% \marg{type}\marg{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.
+% \begin{macrocode}
+\newcommand*\@fxselectenvlayout[1]{%
+ \expandafter\let\expandafter\@fxenvlayout@begin%
+ \csname @fxenvlayout@#1@begin\endcsname%
+ \expandafter\let\expandafter\@fxenvlayout@end%
+ \csname @fxenvlayout@#1@end\endcsname}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Layout loading}
+% \begin{macro}{\fxloadenvlayouts}
+% \marg{name,\ldots}
+% \begin{macrocode}
+\newcommand*\fxloadenvlayouts[1]{%
+ \edef\@fxlts{\zap@space#1 \@empty}%
+ \@for\@fxlt:=\@fxlts\do{\usepackage{fxenvlayout#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Layout control}
+% \begin{macro}{\fxuseenvlayout}
+% \begin{macro}{\FXRequireEnvLayout}
+% \marg{name}\\
+% \cs{FXRequireEnvLayout} is a better style for theme programming.
+% \begin{macrocode}
+\newcommand*\fxuseenvlayout[1]{%
+ \@ifundefined{@fxenvlayout@#1@begin}{\fxloadenvlayouts{#1}}{}%
+ \@fxselectenvlayout{#1}}
+\let\FXRequireEnvLayout\fxuseenvlayout
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{option}{envlayout}
+% \mbox{}
+% \begin{macrocode}
+\@fxdefinekey{envlayout}{envlayout}{\fxuseenvlayout{#1}}
+
+% \end{macrocode}
+% \end{option}
+%
+% \subsection{Target Layouts}
+% \subsubsection{Layout creation}
+% \begin{macro}{\FXProvidesTargetLayout}
+% \marg{name}\oarg{release information}
+% \begin{macrocode}
+\newcommand*\FXProvidesTargetLayout[1]{\ProvidesPackage{fxtargetlayout#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\FXRegisterTargetLayout}
+% \marg{name}\marg{funcname}\\
+% Register a new target layout with \fx. This currently only involves
+% constructing the translation macro. The translation macro in question
+% can't be \cs{let} to the real one, because themes or user might want to
+% redefine the latter.
+% \begin{macrocode}
+\newcommand*\FXRegisterTargetLayout[2]{%
+ \@ifundefined{@fxtargetlayout@#1}{%
+ \expandafter\def\csname @fxtargetlayout@#1\endcsname{#2}}{%
+ \@fxpkgerror{target layout '#1' already registered}{%
+ You have called \string\FXRegisterTargetLayout\space with a name
+ already in use.\MessageBreak
+ If you want to modify an existing target layout, renew its
+ command.\MessageBreak
+ Otherwise, you must choose another name.}}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[noindex]{\FXDefineTargetLayout...Key}
+% \begin{macro}[noprint]{\FXDefineTargetLayoutKey}
+% \begin{macro}[noprint]{\FXDefineTargetLayoutCmdKey}
+% \begin{macro}[noprint]{\FXDefineTargetLayoutChoiceKey}
+% \begin{macro}[noprint]{\FXDefineTargetLayoutVoidKey}
+% \begin{macro}[noprint]{\FXDefineTargetLayoutBoolKey}
+% The extension-level option creation interface:
+% \begin{macrocode}
+\@fxdefineoptioninterface{targetlayout}{TargetLayout}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Built-in layouts}
+% \paragraph{Plain}
+% \begin{targetlayout}[noprint]{plain}
+% \begin{face}{target}
+% \mbox{}
+% \begin{macrocode}
+\@fxnewface{target}
+% \end{macrocode}
+% \end{face}
+% \begin{macro}{\FXTargetLayoutPlain}
+% \marg{target}
+% \begin{macrocode}
+\newcommand\FXTargetLayoutPlain[2]{\@fxuseface{target}#2}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxtargetlayout@plain}
+% \begin{macrocode}
+\FXRegisterTargetLayout{plain}{\FXTargetLayoutPlain}
+
+% \end{macrocode}
+% \end{macro}
+% \end{targetlayout}
+%
+% \subsubsection{Layout selection}
+% \begin{macro}{\@fxselecttargetlayout}
+% \marg{name}
+% \begin{macro}{\@@fxtargetlayout}
+% \marg{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.
+% \begin{macrocode}
+\newcommand*\@fxselecttargetlayout[1]{%
+ \expandafter\let\expandafter\@@fxtargetlayout%
+ \csname @fxtargetlayout@#1\endcsname}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Target layout loading}
+% \begin{macro}{\fxloadtargetlayouts}
+% \marg{name,\ldots}
+% \begin{macrocode}
+\newcommand*\fxloadtargetlayouts[1]{%
+ \edef\@fxlts{\zap@space#1 \@empty}%
+ \@for\@fxlt:=\@fxlts\do{\usepackage{fxtargetlayout#1}}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Target layout control}
+% \begin{macro}{\fxusetargetlayout}
+% \begin{macro}{\FXRequireTargetLayout}
+% \marg{name}\\
+% \cs{FXRequireTargetLayout} is a better style for theme programming.
+% \begin{macrocode}
+\newcommand*\fxusetargetlayout[1]{%
+ \@ifundefined{@fxtargetlayout@#1}{\fxloadtargetlayouts{#1}}{}%
+ \@fxselecttargetlayout{#1}}
+\let\FXRequireTargetLayout\fxusetargetlayout
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{option}{targetlayout}
+% \mbox{}
+% \begin{macrocode}
+\@fxdefinekey{targetlayout}{targetlayout}{\fxusetargetlayout{#1}}
+
+% \end{macrocode}
+% \end{option}
+%
+% \subsubsection{Status-dependant versions}
+% \begin{macro}{\@fxtargetlayout@final}
+% \begin{macro}{\@fxtargetlayout@draft}
+% \marg{target}\\
+% In \texttt{final} mode, the target is typeset as-is. In \texttt{draft}
+% mode, we use the selected layout.
+% \begin{macrocode}
+\newcommand\@fxtargetlayout@final[2]{#2}
+\newcommand\@fxtargetlayout@draft[2]{%
+ \begingroup\@@fxtargetlayout{#1}{#2}\endgroup}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Logging}
+% \subsubsection{Logging macros}
+% \begin{macro}{\FXLogNote}
+% \begin{macro}{\FXLogWarning}
+% \begin{macro}{\FXLogerror}
+% \begin{macro}{\FXLogFatal}
+% \marg{msg}
+% \begin{macrocode}
+\newcommand*\FXLogNote[1]{%
+ \GenericInfo{%
+ (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
+ FiXme Note: '#1'}}
+\newcommand*\FXLogWarning[1]{%
+ \GenericWarning{%
+ (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
+ FiXme Warning: '#1'}}
+\newcommand*\FXLogError[1]{%
+ \GenericWarning{%
+ (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
+ FiXme Error: '#1'}}
+\newcommand*\FXLogFatal[1]{%
+ \GenericWarning{%
+ (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
+ FiXme Fatal Error: '#1'}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@fxlog@note}
+% \begin{macro}{\@fxlog@warning}
+% \begin{macro}{\@fxlog@error}
+% \begin{macro}{\@fxlog@fatal}
+% In order for the generic note dispatcher to be able to call the logging
+% macros (see section \sectionref{sec:code:lowlevelcmd}), we need an easier
+% translation mechanism from the annotation type to the actual macro
+% name. The translation macros in question can't be \cs{let} to the real
+% one, because users might want to redefine the actual log macros later.
+% \begin{macrocode}
+\def\@fxlog@note{\FXLogNote}
+\def\@fxlog@warning{\FXLogWarning}
+\def\@fxlog@error{\FXLogError}
+\def\@fxlog@fatal{\FXLogFatal}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Logging control}
+% \begin{booleanoption}{silent}
+% Whether to log the annotations:
+% \begin{macrocode}
+\@fxdefineboolkey{log}{silent}
+
+% \end{macrocode}
+% \end{booleanoption}
+%
+% \subsection{\fx notes}
+% \subsubsection{Note parameters}
+% \begin{counter}{fixmecount}
+% \begin{counter}{fxnotecount}
+% \begin{counter}{fxwarningcount}
+% \begin{counter}{fxerrorcount}
+% \begin{counter}{fxfatalcount}
+% \texttt{fixmecount} maintains the total of all annotations, regardless of
+% their level. Each note type also gets its own counter:
+% \begin{macrocode}
+\newcounter{fixmecount}
+\newcounter{fxnotecount}
+\newcounter{fxwarningcount}
+\newcounter{fxerrorcount}
+\newcounter{fxfatalcount}
+
+% \end{macrocode}
+% \end{counter}
+% \end{counter}
+% \end{counter}
+% \end{counter}
+% \end{counter}
+% \begin{option}{author}
+% An annotation ``author'' allows to distinguish notes from different
+% persons in collaborative mode.
+% \begin{macrocode}
+\@fxdefinecmdkey{note}{author}{}
+% \end{macrocode}
+% \end{option}
+% \begin{option}{target}
+% An annotation ``target'' may replace the page number in the list of
+% corrections or in the index (see also section
+% \sectionref{sec:code:contentslinelayout}).
+% \begin{macrocode}
+\@fxdefinecmdkey{note}{target}{}
+% \end{macrocode}
+% \end{option}
+%
+% \subsubsection{Layout dispatch\label{sec:code:layoutdispatch}}
+% \begin{macro}{\@fxhandleinnermode}
+% Handle the case where \TeX{} is in inner mode. We use the alternative
+% layout provided by the \texttt{innerlayout} option, and we make sure to
+% disable both the \texttt{margin} and \texttt{marginclue} layout forms.
+% This is done by appending \texttt{nomargin} and \texttt{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.
+% \begin{macrocode}
+\newcommand\@fxhandleinnermode{%
+ \ifinner%
+ \ifthenelse{\boolean{fx@layout@margin}}{%
+ \@fxpkginfo{%
+ inner mode detected;\MessageBreak
+ turning margin layout form off}}{%
+ \ifthenelse{\boolean{fx@layout@marginclue}}{%
+ \@fxpkginfo{%
+ inner mode detected;\MessageBreak
+ turning marginclue layout form off}}{}}%
+ \expandafter\@fxsetlayoutkeys\expandafter{%
+ \cmdfx@layout@innerlayout,nomargin,nomarginclue}%
+ \fi}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxissueearlydraftlayouts}
+% \begin{macro}{\@fxissuelatedraftlayouts}
+% \marg{type}\marg{note}\\
+% Dispatch all active draft mode layouts. \cs{@fxissueearlydraftlayouts}
+% takes care of dispatching early layouts, but before that, handles the
+% inner mode case. \cs{@fxissuelatedraftlayouts} just dispatches late
+% layouts.
+% \begin{macrocode}
+\newcommand*\@fxissueearlydraftlayouts[2]{%
+ \@fxhandleinnermode%
+ \@for\@fxlt:=\@fxearlylayouts\do{%
+ \@nameuse{iffx@layout@\@fxlt}%
+ \@nameuse{@fxlayout@\@fxlt}{#1}{#2}{\cmdfx@note@author}%
+ \fi}}
+\newcommand*\@fxissuelatedraftlayouts[2]{%
+ \@for\@fxlt:=\@fxlatelayouts\do{%
+ \@nameuse{iffx@layout@\@fxlt}%
+ \@nameuse{@fxlayout@\@fxlt}{#1}{#2}{\cmdfx@note@author}%
+ \fi}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@fxissuecommonlayouts}
+% \marg{type}\marg{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
+% \texttt{lox} file, but this could lead to typesetting artifacts even in
+% final mode (because of the whatsit introduced by \cs{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 \texttt{draft} mode by
+% \cs{@@@fxnote@late@draft}.
+% \begin{macrocode}
+\newcommand*\@fxissuecommonlayouts[2]{%
+ \iffx@log@silent\else\@nameuse{@fxlog@#1}{#2}\fi}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Status-dependent implementation\label{sec:code:lowlevelcmd}}
+% \begin{macro}{\@@@fxnote@early@final}
+% \begin{macro}{\@@@fxnote@late@final}
+% \begin{macro}{\@@@fxnote@early@draft}
+% \begin{macro}{\@@@fxnote@late@draft}
+% \marg{type}\marg{note}\\
+% The lower-level macros that perform the real job. In \texttt{final} mode,
+% early work is only to check for remaining fatal annotations and late work
+% is to dispatch common layouts.
+% \begin{macrocode}
+\newcommand*\@@@fxnote@early@final[2]{%
+ \ifthenelse{\equal{#1}{fatal}}{%
+ \@fxpkgerror{'#2' fatal error left in final version}{%
+ You are currently processing in final mode,\MessageBreak
+ but you still have some FiXme fatal errors left behind.\MessageBreak
+ Type X to quit, fix your document (or switch back to draft
+ mode),\MessageBreak
+ and rerun LaTeX.}}{}}
+\newcommand*\@@@fxnote@late@final[2]{\@fxissuecommonlayouts{#1}{#2}}
+% \end{macrocode}
+% In \texttt{draft} mode, early work is to dispatch early layouts, while late
+% work is to dispatch both late \emph{and} common layouts, and update the
+% \texttt{lox} file.
+% \begin{macrocode}
+\newcommand*\@@@fxnote@early@draft[2]{%
+ \@fxissueearlydraftlayouts{#1}{#2}}
+\newcommand*\@@@fxnote@late@draft[2]{%
+ \@fxissuelatedraftlayouts{#1}{#2}%
+ \FXLayoutContentsLine{#1}{#2}{\cmdfx@note@author}%
+ \@fxissuecommonlayouts{#1}{#2}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Standard version}
+% \begin{macro}{\@fxpostconfigure}
+% This macro is used in \cs{@@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
+% \cs{fixmelogo} if it still is \texttt{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
+% post-configuration done sooner, they perform it themselves and rebind this
+% macro to \cs{relax}.
+% \begin{macrocode}
+\newcommand*\@fxpostconfigure{%
+ \ifthenelse{\equal{\cmdfx@note@author}{fixme}}{%
+ \@fxsetkeys{note}{author=\fixmelogo}}{}%
+ \iffx@lang@langtrack%
+ \@fxkeyifundefined{lang}{\languagename}{%
+ \@fxpkgwarning{unknown language '\languagename';\MessageBreak
+ falling back to \@fxdefaultlang}%
+ \@fxsetkeys{lang}{\@fxdefaultlang}}{%
+ \@fxsetkeys{lang}{\languagename}}
+ \fi}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxendgroup}
+% This macro is used in \cs{@@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 \cs{relax} and close the group themselves later
+% on.
+% \begin{macrocode}
+\let\@fxendgroup\endgroup
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@fxnote@early}
+% \marg{type}\marg{note}\\
+% Counters need to be updated regardless of the mode.
+% \begin{macrocode}
+\def\@@fxnote@early#1#2{%
+ \@fxpostconfigure%
+ \stepcounter{fixmecount}%
+ \stepcounter{fx#1count}%
+ \@@@fxnote@early{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@fxnote@late}
+% \begin{macrocode}
+\def\@@fxnote@late#1#2{%
+ \@@@fxnote@late{#1}{#2}%
+ \@fxendgroup}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@fxnote}
+% \marg{type}\marg{note}\\
+% This macro is used everywhere outside a starred context, because in that
+% case, we do early and late work in a row.
+% \begin{macrocode}
+\def\@@fxnote#1#2{%
+ \@@fxnote@early{#1}{#2}%
+ \@@fxnote@late{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxnote}
+% \marg{type}\oarg{options}\marg{note}
+% \begin{macrocode}
+\def\@fxnote#1[#2]#3{%
+ \@fxsetkeys{mode,status,lang,log,note,face,layout}{#2}%
+ \@@fxnote{#1}{#3}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Starred version}
+% \begin{macro}{\@@fxsnote}
+% \marg{type}\marg{note}\marg{text}\\
+% Post-configuration is done here because it's the code path confluent for
+% all starred commands. Relaxing post-configuration afterwards is to prevent
+% \cs{@@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.
+% \begin{macrocode}
+\long\def\@@fxsnote#1#2#3{%
+ \@fxpostconfigure\let\@fxpostconfigure\relax%
+ \@@fxnote@early{#1}{#2}\@fxtargetlayout{#1}{#3}\@@fxnote@late{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxsnote}
+% \marg{type}\oarg{options}\marg{note}\marg{text}\\
+% Note the \texttt{targetlayout} family here.
+% \begin{macrocode}
+\long\def\@fxsnote#1[#2]#3#4{%
+ \@fxsetkeys{mode,status,lang,log,note,face,layout,targetlayout}{#2}%
+ \@@fxsnote{#1}{#3}{#4}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{User-level interface generation}
+% \begin{macro}{\@fxpreconfigure}
+% \marg{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 \cs{FXRegisterAuthor}. This however is not done for the
+% built-in \texttt{fixme} author, because this one should honor a global
+% setting.
+% \begin{macrocode}
+\newcommand*\@fxpreconfigure[1]{%
+ \ifthenelse{\equal{#1}{fixme}}{}{\@fxsetkeys{note}{author=#1}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxnewnotemacro}
+% \marg{prefix}\marg{type}\marg{author}\\
+% This macro defines the user-level interface:
+% \begin{macrocode}
+\newcommand*\@fxnewnotemacro[3]{%
+ \expandafter\DeclareRobustCommand\csname #1#2\endcsname{%
+ \begingroup%
+ \@fxpreconfigure{#3}%
+ \@ifstar{%
+ \@ifnextchar[%]
+ {\@fxsnote{#2}}{\@@fxsnote{#2}}}{%
+ \@ifnextchar[%]
+ {\@fxnote{#2}}{\@@fxnote{#2}}}}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{\fx environments}
+% A \fx environment's summary is laid out by the corresponding macro, but
+% the \texttt{inline} layout is disabled. This is as easy as appending
+% \texttt{noinline} to the end of the options list.
+% \subsubsection{Status-dependent implementation}
+% \begin{macro}{\@@@@fxbeginenv@final}
+% \begin{macro}{\@@@@fxbeginenv@draft}
+% \begin{macro}{\@fxendenv@final}
+% \begin{macro}{\@fxendenv@draft}
+% \marg{type}\\
+% In final mode, \texttt{verbatim}'s \texttt{comment} environment is used to
+% suppress output.
+% \begin{macrocode}
+\def\@@@@fxbeginenv@final#1{\comment}
+\def\@@@@fxbeginenv@draft#1{\@fxenvlayout@begin{#1}{\cmdfx@note@author}}
+\def\@fxendenv@final#1{\endcomment}
+\def\@fxendenv@draft#1{\unskip\@fxenvlayout@end{#1}{\cmdfx@note@author}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Standard versions}
+% \begin{macro}{\@@@fxbeginenv}
+% \begin{macro}{\@@fxbeginenv}
+% \marg{type}\marg{summary}\\
+% Post-configuration is done here (it's the code path confluent for all
+% non-starred environments). Relaxing post-configuration afterwards is to
+% prevent \cs{@@fxnote} from doing it again.
+% \begin{macrocode}
+\def\@@@fxbeginenv#1#2{%
+ \@fxpostconfigure\let\@fxpostconfigure\relax%
+ \@@fxnote{#1}{#2}%
+ \@@@@fxbeginenv{#1}}
+\def\@@fxbeginenv#1#2{%
+ \@fxsetkeys{layout}{noinline}%
+ \@@@fxbeginenv{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@fxbeginenv}
+% \marg{type}\oarg{options}\marg{summary}
+% \begin{macrocode}
+\def\@fxbeginenv#1[#2]#3{%
+ \@fxsetkeys{mode,status,lang,log,note,face,layout,envlayout}{#2,noinline}%
+ \@@@fxbeginenv{#1}{#3}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Starred versions}
+% \begin{macro}{\@@@fxbeginsenv}
+% \begin{macro}{\@@fxbeginsenv}
+% \marg{type}\marg{summary}\marg{text}\\
+% Post-configuration is done here (it's the code path confluent for all
+% starred environments). Relaxing post-configuration afterwards is to
+% prevent \cs{@@fxsnote} from doing it again.
+% \begin{macrocode}
+\long\def\@@@fxbeginsenv#1#2#3{%
+ \@fxpostconfigure\let\@fxpostconfigure\relax%
+ \@@fxsnote{#1}{#2}{#3}%
+ \@@@@fxbeginenv{#1}}
+\long\def\@@fxbeginsenv#1#2#3{%
+ \@fxsetkeys{layout}{noinline}%
+ \@@@fxbeginsenv{#1}{#2}{#3}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@fxbeginenv}
+% \marg{type}\oarg{options}\marg{summary}\marg{text}\\
+% Note the \texttt{targetlayout} family here.
+% \begin{macrocode}
+\long\def\@fxbeginsenv#1[#2]#3#4{%
+ \@fxsetkeys{mode,status,lang,log,note,face,layout,envlayout,targetlayout}{%
+ #2,noinline}%
+ \@@@fxbeginsenv{#1}{#3}{#4}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{User-level interface generation}
+% \begin{macro}{\@fxnewnoteenvs}
+% \marg{prefix}\marg{type}\marg{author}\\
+% This macro defines the user-level interface. The ending macros are
+% identical. Also, the environments close their own group, so we prevent
+% \cs{@@fxnote} from doing so by temporarily rebinding \cs{@fxendgroup} to
+% \cs{relax}.
+% \begin{macrocode}
+\newcommand*\@fxnewnoteenvs[3]{%
+ \expandafter\def\csname #1#2\endcsname{%
+ \begingroup%
+ \let\@fxendgroup\relax%
+ \@fxpreconfigure{#3}%
+ \@ifnextchar[%]
+ {\@fxbeginenv{#2}}{\@@fxbeginenv{#2}}}
+ \expandafter\def\csname end#1#2\endcsname{%
+ \@fxendenv{#2}%
+ \endgroup}%
+ \expandafter\long\expandafter\def\csname #1#2*\endcsname{%
+ \begingroup%
+ \let\@fxendgroup\relax%
+ \@fxpreconfigure{#3}%
+ \@ifnextchar[%]
+ {\@fxbeginsenv{#2}}{\@@fxbeginsenv{#2}}}
+ \expandafter\def\csname end#1#2*\endcsname{%
+ \@fxendenv{#2}%
+ \endgroup}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{\fx authors}
+% \begin{macro}{\FXRegisterAuthor}
+% \marg{cmdprefix}\marg{envprefix}\marg{name}\\
+% This macro creates the whole user-level interface for a particular author:
+% \begin{macrocode}
+\newcommand*\FXRegisterAuthor[3]{%
+ \@ifundefined{#1note}{}{%
+ \@fxpkgerror{command prefix '#1' already in use}{%
+ You have called \string\FXRegisterAuthor\space with a command prefix
+ already in use.\MessageBreak
+ Please choose another one.}}%
+ \@ifundefined{#2note}{}{%
+ \@fxpkgerror{environment prefix '#2' already in use}{%
+ You have called \string\FXRegisterAuthor\space with an environment
+ prefix already in use.\MessageBreak
+ Please choose another one.}}%
+ \@fxnewnotemacro{#1}{note}{#3}%
+ \@fxnewnotemacro{#1}{warning}{#3}%
+ \@fxnewnotemacro{#1}{error}{#3}%
+ \@fxnewnotemacro{#1}{fatal}{#3}%
+ \@fxnewnoteenvs{#2}{note}{#3}%
+ \@fxnewnoteenvs{#2}{warning}{#3}%
+ \@fxnewnoteenvs{#2}{error}{#3}%
+ \@fxnewnoteenvs{#2}{fatal}{#3}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}[noindex]{\fx...[*]}
+% \begin{environment}[noindex]{anfx...[*]}
+% \begin{macro}[noprint]{\fxnote}
+% \begin{macro}[noprint]{\fxwarning}
+% \begin{macro}[noprint]{\fxerror}
+% \begin{macro}[noprint]{\fxfatal}
+% \begin{macro}[noprint]{\fxnote*}
+% \begin{macro}[noprint]{\fxwarning*}
+% \begin{macro}[noprint]{\fxerror*}
+% \begin{macro}[noprint]{\fxfatal*}
+% \begin{environment}[noprint]{anfxnote}
+% \begin{environment}[noprint]{anfxwarning}
+% \begin{environment}[noprint]{anfxerror}
+% \begin{environment}[noprint]{anfxfatal}
+% \begin{environment}[noprint]{anfxnote*}
+% \begin{environment}[noprint]{anfxwarning*}
+% \begin{environment}[noprint]{anfxerror*}
+% \begin{environment}[noprint]{anfxfatal*}
+% And we use it to create the \fx default user:
+% \begin{macrocode}
+\FXRegisterAuthor{fx}{anfx}{fixme}
+% \end{macrocode}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{environment}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{environment}
+% \end{macro}
+% \begin{macro}{\fixme}
+% \oarg{options}\marg{note}\\
+% Deprecate \cs{fixme}:
+% \begin{macrocode}
+\DeclareRobustCommand\fixme{%
+ \@fxpkgwarning{\string\fixme\space is deprecated;\MessageBreak
+ please use \string\fxfatal\space instead}%
+ \fxfatal}
+% \end{macrocode}
+% \end{macro}
+% \begin{environment}{afixme}
+% Deprecate the \texttt{afixme} environment:
+% \begin{macrocode}
+\def\afixme{%
+ \@fxpkgwarning{The 'afixme' environment is deprecated;\MessageBreak
+ please use 'anfxfatal' instead}%
+ \anfxfatal}
+\let\endafixme\endanfxfatal
+% \end{macrocode}
+% \end{environment}
+%
+% \subsection{Internationalization\label{sec:code:i18n}}
+% \begin{macro}{\@fxlanguages}
+% This macro lists all the supported languages, including aliases:
+% \begin{macrocode}
+\newcommand*\@fxlanguages{%
+ english,french,francais,spanish,italian,german,ngerman,danish,croatian}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Language definitions}
+% \paragraph{English}
+% \begin{lang}{english}
+% \begin{macro}[noindex]{\fxenglish...[s]name}
+% \begin{macro}[noprint]{\fxenglishnotename}
+% \begin{macro}[noprint]{\fxenglishnotesname}
+% \begin{macro}[noprint]{\fxenglishwarningname}
+% \begin{macro}[noprint]{\fxenglishwarningsname}
+% \begin{macro}[noprint]{\fxenglisherrorname}
+% \begin{macro}[noprint]{\fxenglisherrorsname}
+% \begin{macro}[noprint]{\fxenglishfatalname}
+% \begin{macro}[noprint]{\fxenglishfatalsname}
+% \begin{macro}{\englishlistfixmename}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\fxenglishnotename{Note}
+\newcommand\fxenglishnotesname{Notes}
+\newcommand\fxenglishwarningname{Warning}
+\newcommand\fxenglishwarningsname{Warnings}
+\newcommand\fxenglisherrorname{Error}
+\newcommand\fxenglisherrorsname{Errors}
+\newcommand\fxenglishfatalname{Fatal}
+\newcommand\fxenglishfatalsname{Fatal errors}
+\newcommand\englishlistfixmename{List of Corrections}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{lang}
+%
+% \paragraph{French}
+% \begin{lang}{french}
+% \begin{lang}{francais}
+% \begin{macro}[noindex]{\fxfrench...[s]name}
+% \begin{macro}[noprint]{\fxfrenchnotename}
+% \begin{macro}[noprint]{\fxfrenchnotesname}
+% \begin{macro}[noprint]{\fxfrenchwarningname}
+% \begin{macro}[noprint]{\fxfrenchwarningsname}
+% \begin{macro}[noprint]{\fxfrencherrorname}
+% \begin{macro}[noprint]{\fxfrencherrorsname}
+% \begin{macro}[noprint]{\fxfrenchfatalname}
+% \begin{macro}[noprint]{\fxfrenchfatalsname}
+% \begin{macro}{\frenchlistfixmename}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\fxfrenchnotename{Note}
+\newcommand\fxfrenchnotesname{Notes}
+\newcommand\fxfrenchwarningname{Attention}
+\newcommand\fxfrenchwarningsname{Avertissements}
+\newcommand\fxfrencherrorname{Erreur}
+\newcommand\fxfrencherrorsname{Erreurs}
+\newcommand\fxfrenchfatalname{Fatal}
+\newcommand\fxfrenchfatalsname{Erreurs fatales}
+\newcommand\frenchlistfixmename{Liste des Corrections}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{lang}
+% \end{lang}
+%
+% \paragraph{Spanish}
+% \begin{lang}{spanish}
+% \begin{macro}[noindex]{\fxspanish...[s]name}
+% \begin{macro}[noprint]{\fxspanishnotename}
+% \begin{macro}[noprint]{\fxspanishnotesname}
+% \begin{macro}[noprint]{\fxspanishwarningname}
+% \begin{macro}[noprint]{\fxspanishwarningsname}
+% \begin{macro}[noprint]{\fxspanisherrorname}
+% \begin{macro}[noprint]{\fxspanisherrorsname}
+% \begin{macro}[noprint]{\fxspanishfatalname}
+% \begin{macro}[noprint]{\fxspanishfatalsname}
+% \begin{macro}{\spanishlistfixmename}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\fxspanishnotename{Nota}
+\newcommand\fxspanishnotesname{Notas}
+\newcommand\fxspanishwarningname{Aviso}
+\newcommand\fxspanishwarningsname{Avisos}
+\newcommand\fxspanisherrorname{Error}
+\newcommand\fxspanisherrorsname{Errores}
+\newcommand\fxspanishfatalname{Fatal}
+\newcommand\fxspanishfatalsname{Errores fatales}
+\newcommand\spanishlistfixmename{Lista de Correcciones}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{lang}
+%
+% \paragraph{Italian}
+% \begin{lang}{italian}
+% \begin{macro}[noindex]{\fxitalian...[s]name}
+% \begin{macro}[noprint]{\fxitaliannotename}
+% \begin{macro}[noprint]{\fxitaliannotesname}
+% \begin{macro}[noprint]{\fxitalianwarningname}
+% \begin{macro}[noprint]{\fxitalianwarningsname}
+% \begin{macro}[noprint]{\fxitalianerrorname}
+% \begin{macro}[noprint]{\fxitalianerrorsname}
+% \begin{macro}[noprint]{\fxitalianfatalname}
+% \begin{macro}[noprint]{\fxitalianfatalsname}
+% \begin{macro}{\italianlistfixmename}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\fxitaliannotename{Nota}
+\newcommand\fxitaliannotesname{Note}
+\newcommand\fxitalianwarningname{Avviso}
+\newcommand\fxitalianwarningsname{Avvisi}
+\newcommand\fxitalianerrorname{Errore}
+\newcommand\fxitalianerrorsname{Errori}
+\newcommand\fxitalianfatalname{Fatale}
+\newcommand\fxitalianfatalsname{Errori fatali}
+\newcommand\italianlistfixmename{Corrigenda}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{lang}
+%
+% \paragraph{German}
+% \begin{lang}{german}
+% \begin{lang}{ngerman}
+% \begin{macro}[noindex]{\fxgerman...[s]name}
+% \begin{macro}[noprint]{\fxgermannotename}
+% \begin{macro}[noprint]{\fxgermannotesname}
+% \begin{macro}[noprint]{\fxgermanwarningname}
+% \begin{macro}[noprint]{\fxgermanwarningsname}
+% \begin{macro}[noprint]{\fxgermanerrorname}
+% \begin{macro}[noprint]{\fxgermanerrorsname}
+% \begin{macro}[noprint]{\fxgermanfatalname}
+% \begin{macro}[noprint]{\fxgermanfatalsname}
+% \begin{macro}{\germanlistfixmename}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\fxgermannotename{Anm}
+\newcommand\fxgermannotesname{Anmerkungen}
+\newcommand\fxgermanwarningname{Warnung}
+\newcommand\fxgermanwarningsname{Warnungen}
+\newcommand\fxgermanerrorname{Fehler}
+\newcommand\fxgermanerrorsname{Fehler}
+\newcommand\fxgermanfatalname{Verh\"angnisvoll}
+\newcommand\fxgermanfatalsname{Verh\"angnisvolle fehler}
+\newcommand\germanlistfixmename{Verzeichnis der Korrekturen}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{lang}
+% \end{lang}
+%
+% \paragraph{Danish}
+% \begin{lang}{danish}
+% \begin{macro}[noindex]{\fxdanish...[s]name}
+% \begin{macro}[noprint]{\fxdanishnotename}
+% \begin{macro}[noprint]{\fxdanishnotesname}
+% \begin{macro}[noprint]{\fxdanishwarningname}
+% \begin{macro}[noprint]{\fxdanishwarningsname}
+% \begin{macro}[noprint]{\fxdanisherrorname}
+% \begin{macro}[noprint]{\fxdanisherrorsname}
+% \begin{macro}[noprint]{\fxdanishfatalname}
+% \begin{macro}[noprint]{\fxdanishfatalsname}
+% \begin{macro}{\danishlistfixmename}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\fxdanishnotename{Note}
+\newcommand\fxdanishnotesname{Noter}
+\newcommand\fxdanishwarningname{Advarsel}
+\newcommand\fxdanishwarningsname{Advarsler}
+\newcommand\fxdanisherrorname{Fejl}
+\newcommand\fxdanisherrorsname{Fejl}
+\newcommand\fxdanishfatalname{Fatal}
+\newcommand\fxdanishfatalsname{Fatale fejl}
+\newcommand\danishlistfixmename{Rettelser}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{lang}
+%
+% \paragraph{Croatian}
+% \begin{lang}{croatian}
+% \begin{macro}[noindex]{\fxcroatian...[s]name}
+% \begin{macro}[noprint]{\fxcroatiannotename}
+% \begin{macro}[noprint]{\fxcroatiannotesname}
+% \begin{macro}[noprint]{\fxcroatianwarningname}
+% \begin{macro}[noprint]{\fxcroatianwarningsname}
+% \begin{macro}[noprint]{\fxcroatianerrorname}
+% \begin{macro}[noprint]{\fxcroatianerrorsname}
+% \begin{macro}[noprint]{\fxcroatianfatalname}
+% \begin{macro}[noprint]{\fxcroatianfatalsname}
+% \begin{macro}{\croatianlistfixmename}
+% \mbox{}
+% \begin{macrocode}
+\newcommand\fxcroatiannotename{Poruka}
+\newcommand\fxcroatiannotesname{Poruke}
+\newcommand\fxcroatianwarningname{Upozorenja}
+\newcommand\fxcroatianwarningsname{Upozorenje}
+\newcommand\fxcroatianerrorname{Gre\v ska}
+\newcommand\fxcroatianerrorsname{Greske}
+\newcommand\fxcroatianfatalname{Fatalan}
+\newcommand\fxcroatianfatalsname{Kobne gre\v ske}
+\newcommand\croatianlistfixmename{Popis korekcija}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{lang}
+%
+% \subsubsection{Language tracking}
+% \begin{option}{langtrack}
+% Whether to track the value of \cs{languagename} automatically:
+% \begin{macrocode}
+\@fxdefineboolkey{lang}{langtrack}
+% \end{macrocode}
+% \end{option}
+% \begin{option}{defaultlang}
+% Which language to use when tracking leads to an unsuported language:
+% \begin{macrocode}
+\def\@fxexpr{\@fxdefinechoicekey{lang}{defaultlang}[\@fxdefaultlang]}
+\expandafter\@fxexpr\expandafter{\@fxlanguages}{}
+
+% \end{macrocode}
+% \end{option}
+%
+% \subsubsection{Language options}
+% \begin{option}{lang}
+% \begin{macro}{\@fxlang}
+% Store the current language in \cs{@fxlang} after having handled language
+% aliases, and disable language tracking:
+% \begin{macrocode}
+\def\@fxexpr{\@fxdefinechoicekey{lang}{lang}[\@fxlang]}
+\expandafter\@fxexpr\expandafter{\@fxlanguages}{%
+ \ifthenelse{\equal{#1}{francais}}{\def\@fxlang{french}}{%
+ \ifthenelse{\equal{#1}{ngerman}}{\def\@fxlang{german}}{}}%
+ \@fxsetkeys{lang}{langtrack=false}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{option}
+% \begin{option}{english}
+% \begin{option}{french}
+% \begin{option}{francais}
+% \begin{option}{spanish}
+% \begin{option}{italian}
+% \begin{option}{german}
+% \begin{option}{ngerman}
+% \begin{option}{danish}
+% \begin{option}{croatian}
+% Create individual language options:
+% \begin{macrocode}
+\@for\@fxlg:=\@fxlanguages\do{
+ \def\@fxexprone{\@fxdefinevoidkey{lang}}
+ \edef\@fxexprtwo{{\@fxlg}{\noexpand\@fxsetkeys{lang}{lang=\@fxlg}}}
+ \expandafter\@fxexprone\@fxexprtwo}
+
+% \end{macrocode}
+% \end{option}
+% \end{option}
+% \end{option}
+% \end{option}
+% \end{option}
+% \end{option}
+% \end{option}
+% \end{option}
+% \end{option}
+%
+% \subsubsection{Language abstraction layer}
+% \begin{macro}{\@fxlistfixmename}
+% Construct the ``list of fixmes'' title in a language dependent fashion:
+% \begin{macrocode}
+\newcommand*\@fxlistfixmename{\@nameuse{\@fxlang listfixmename}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fxnotename}
+% \begin{macro}{\fxnotesname}
+% \marg{type}\\
+% Construct the notes names in a language dependent fashion:
+% \begin{macrocode}
+\newcommand*\fxnotename[1]{\@nameuse{fx\@fxlang#1name}}
+\newcommand*\fxnotesname[1]{\@nameuse{fx\@fxlang#1sname}}
+
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Document status processing}
+% \begin{macro}{\@@@fxnote@early}
+% \begin{macro}{\@@@fxnote@late}
+% \begin{macro}{\@@@@fxbeginenv}
+% \begin{macro}{\@fxendenv}
+% \begin{macro}{\@fxtargetlayout}
+% \begin{macro}{\listoffixmes}
+% \begin{option}{final}
+% \begin{option}{draft}
+% \begin{option}{status}
+% Select draft or final versions of internal macros (some of
+% them also depending on the document class):
+% \begin{macrocode}
+\@fxdefinevoidkey{status}{final}{%
+ \let\@@@fxnote@early\@@@fxnote@early@final%
+ \let\@@@fxnote@late\@@@fxnote@late@final%
+ \let\@@@@fxbeginenv\@@@@fxbeginenv@final
+ \let\@fxendenv\@fxendenv@final%
+ \let\@fxtargetlayout\@fxtargetlayout@final%
+ \let\listoffixmes\lox@final}
+\@fxdefinevoidkey{status}{draft}{%
+ \let\@@@fxnote@early\@@@fxnote@early@draft%
+ \let\@@@fxnote@late\@@@fxnote@late@draft%
+ \let\@@@@fxbeginenv\@@@@fxbeginenv@draft
+ \let\@fxendenv\@fxendenv@draft%
+ \let\@fxtargetlayout\@fxtargetlayout@draft%
+ \let\listoffixmes\lox@draft}
+\@fxdefinechoicekey{status}{status}{final,draft}{\@fxsetkeys{status}{#1}}
+
+% \end{macrocode}
+% \end{option}
+% \end{option}
+% \end{option}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsection{Theme support}
+% \begin{macro}{\FXProvidesTheme}
+% \marg{name}\oarg{release information}
+% \begin{macrocode}
+\newcommand*\FXProvidesTheme[1]{\ProvidesPackage{fxtheme#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\fxusetheme}
+% \marg{name}
+% \begin{macrocode}
+\newcommand*\fxusetheme[1]{\usepackage{fxtheme#1}}
+% \end{macrocode}
+% \end{macro}
+% \begin{option}{theme}
+% \mbox{}
+% \begin{macrocode}
+\@fxdefinekey{theme}{theme}{\fxusetheme{#1}}
+% \end{macrocode}
+% \end{option}
+%
+% \subsection{Finale}
+% \subsubsection{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 \texttt{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, \cs{@ifclassloaded} is an
+% \cs{@onlypreamble} macro\ldots
+%
+% 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 \cs{marginpar} back again. Normally these classes issue an error
+% if \cs{marginpar} is used. However, the 2.3 / June 2007 versions are buggy
+% and the error actually triggers a stack overflow in \LaTeX\ldots (patch
+% submitted). Oh boy, these classes are a mess.
+% \begin{macro}{\@lox@prtc}
+% \begin{macro}{\@lox@psttc}
+% \begin{macro}{\@lox@draft}
+% \begin{macrocode}
+\@ifclassloaded{article}{%
+ \let\@lox@prtc\@lox@prtc@article%
+ \let\@lox@psttc\@lox@psttc@article}{%
+ \@ifclassloaded{report}{%
+ \let\@lox@prtc\@lox@prtc@report%
+ \let\@lox@psttc\@lox@psttc@report}{%
+ \@ifclassloaded{book}{%
+ \let\@lox@prtc\@lox@prtc@book%
+ \let\@lox@psttc\@lox@psttc@book}{%
+ \@ifclassloaded{amsbook}{%
+ \let\lox@draft\lox@draft@ams}{%
+ \@ifclassloaded{amsart}{%
+ \let\lox@draft\lox@draft@ams}{%
+ %% Use the article layout by default.
+ \let\@lox@prtc\@lox@prtc@article%
+ \let\@lox@psttc\@lox@psttc@article}}}}}
+
+% \end{macrocode}
+% This overrides any previous class-based settings but makes the list of
+% corrections compliant with the \komascript classes and any document using
+% the \texttt{tocbasic} package.
+% \begin{macrocode}
+\@ifpackageloaded{tocbasic}{%
+ \addtotoclist[fixme]{lox}%
+ \renewcommand\lox@draft{\listoftoc[\@fxlistfixmename]{lox}}}{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \subsubsection{Options Processing}
+% First, we execute some options to initialize \fx to something sensible,
+% and then we process the user ones. Note the abscence of the \texttt{theme}
+% family here.
+% \begin{macrocode}
+\ExecuteOptionsX[fx]<%
+ mode,status,lang,log,note,face,layout,envlayout,targetlayout>{%
+ mode=singleuser,%
+ status=final,%
+ lang=english,%
+ langtrack=false,%
+ defaultlang=english,%
+ nosilent,%
+ author=fixme,%
+ target=thepage,%
+ layout=margin,%
+ innerlayout={layout=inline},%
+ envlayout=plain,%
+ targetlayout=plain,%
+ inlineface=\bfseries,%
+ marginface=\footnotesize,%
+ envface=\bfseries,%
+ targetface=\itshape}
+\ProcessOptionsX*[fx]<%
+ mode,status,lang,log,note,face,layout,envlayout,targetlayout>
+
+% \end{macrocode}
+%
+% \subsubsection{The \cs{fxsetup} macro}
+% \begin{macro}{\fxsetup}
+% \marg{options}\\
+% The inevitable setup macro, extremely impressive yet as trivial as can be
+% with the \texttt{xkeyval} package\ldots \cs{fxsetup} is the only place
+% where the \texttt{theme} family is processed.
+% \begin{macrocode}
+\newcommand*\fxsetup[1]{%
+ \@fxsetkeys{%
+ mode,status,lang,log,note,face,layout,envlayout,targetlayout,theme}{%
+ #1}}
+
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\fx summary}
+% Finally, output a summary giving the number of fixme notes at the end of the
+% compilation:
+% \begin{macrocode}
+\AtEndDocument{%
+ \iffx@log@silent\else
+ \GenericWarning{%
+ (FiXme)\@spaces\@spaces}{%
+ FiXme Summary: Number of notes: \thefxnotecount,\MessageBreak%
+ Number of warnings: \thefxwarningcount,\MessageBreak%
+ Number of errors: \thefxerrorcount,\MessageBreak%
+ Number of fatal errors: \thefxfatalcount,\MessageBreak%
+ Total: \thefixmecount\@gobble}%
+ \fi}
+%</fixme>
+% \end{macrocode}
+%
+% \appendix
+% \section{External Layouts}
+% \subsection{Annotation layouts}
+% \subsubsection{The \texttt{marginnote} layout}
+% \begin{layout}{marginnote}
+% \mbox{}
+% \begin{macrocode}
+%<*fxlayoutmarginnote>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesLayout{marginnote}
+
+\RequirePackage{marginnote}
+
+% \end{macrocode}
+% \begin{macro}{\FXLayoutMarginNote}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutMarginNote[3]{%
+ \marginnote[\raggedleft\@fxuseface{margin}\@fxtextstd{#1}{#2}{#3}]{%
+ \raggedright\@fxuseface{margin}\@fxtextstd{#1}{#2}{#3}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@marginnote}
+% \begin{booleanoption}{marginnote}
+% \begin{macrocode}
+\FXRegisterLayout*[margin,marginclue]{marginnote}{\FXLayoutMarginNote}
+%</fxlayoutmarginnote>
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \subsubsection{The \texttt{pdfnote} layout}
+% \begin{layout}{pdfnote}
+% \mbox{}
+% \begin{macrocode}
+%<*fxlayoutpdfnote>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesLayout{pdfnote}
+
+\RequirePackage{pdfcomment}
+
+% \end{macrocode}
+% \begin{macro}{\FXLayoutPDFNote}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutPDFNote[3]{%
+ \pdfcomment[author={#3}]{\@fxtextstd{#1}{#2}{#3}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@pdfnote}
+% \begin{booleanoption}{pdfnote}
+% \begin{macrocode}
+\FXRegisterLayout{pdfnote}{\FXLayoutPDFNote}
+%</fxlayoutpdfnote>
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \subsubsection{The \texttt{pdfmargin} layout}
+% \begin{layout}{pdfmargin}
+% \mbox{}
+% \begin{macrocode}
+%<*fxlayoutpdfmargin>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesLayout{pdfmargin}
+
+\RequirePackage{pdfcomment}
+
+% \end{macrocode}
+% \begin{macro}{\FXLayoutPDFMargin}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutPDFMargin[3]{%
+ \pdfmargincomment[author={#3}]{\@fxtextstd{#1}{#2}{#3}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@pdfmargin}
+% \begin{booleanoption}{pdfmargin}
+% \begin{macrocode}
+\FXRegisterLayout*[margin,marginclue,marginnote]{pdfmargin}{%
+ \FXLayoutPDFMargin}
+%</fxlayoutpdfmargin>
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \subsubsection{The \texttt{pdfsignote} layout}
+% \begin{layout}{pdfsignote}
+% \mbox{}
+% \begin{macrocode}
+%<*fxlayoutpdfsignote>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesLayout{pdfsignote}
+
+\RequirePackage{pdfcomment}
+
+% \end{macrocode}
+% \begin{macro}{\FXLayoutPDFSigNote}
+% \marg{type}\marg{note}\marg{author}\\
+% Warning: this layout cannot use \cs{@fxsignature} properly, because of the
+% presence of an \cs{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
+% \cs{@fxsignature} accordingly. This is a bit clumsy but it works\ldots
+% \begin{macrocode}
+\newcommand*\FXLayoutPDFSigNote[3]{%
+ \begingroup%
+ \ifthenelse{\equal{#3}{}}{%
+ \def\@fxsignature##1{}}{%
+ \def\@fxsignature##1{ -- {\@fxuseface{signature}#1}}}%
+ \pdfcomment[author={#3}]{\@fxsigstd{#1}{#2}{#3}}%
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@pdfsignote}
+% \begin{booleanoption}{pdfsignote}
+% \begin{macrocode}
+\FXRegisterLayout[pdfnote]{pdfsignote}{\FXLayoutPDFSigNote}
+%</fxlayoutpdfsignote>
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \subsubsection{The \texttt{pdfsigmargin} layout}
+% \begin{layout}{pdfsigmargin}
+% \mbox{}
+% \begin{macrocode}
+%<*fxlayoutpdfsigmargin>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesLayout{pdfsigmargin}
+
+\RequirePackage{pdfcomment}
+
+% \end{macrocode}
+% \begin{macro}{\FXLayoutPDFSigMargin}
+% \marg{type}\marg{note}\marg{author}\\
+% Warning: this layout cannot use \cs{@fxsignature} properly, because of the
+% presence of an \cs{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
+% \cs{@fxsignature} accordingly. This is a bit clumsy but it works\ldots
+% \begin{macrocode}
+\newcommand*\FXLayoutPDFSigMargin[3]{%
+ \begingroup%
+ \ifthenelse{\equal{#3}{}}{%
+ \def\@fxsignature##1{}}{%
+ \def\@fxsignature##1{ -- {\@fxuseface{signature}#1}}}%
+ \pdfmargincomment[author={#3}]{\@fxsigstd{#1}{#2}{#3}}%
+ \endgroup}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@pdfsigmargin}
+% \begin{booleanoption}{pdfsigmargin}
+% \begin{macrocode}
+\FXRegisterLayout*[margin,marginclue,marginnote,pdfmargin]{pdfsigmargin}{%
+ \FXLayoutPDFSigMargin}
+%</fxlayoutpdfsigmargin>
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \subsubsection{The \texttt{pdfcnote} layout}
+% \begin{layout}{pdfcnote}
+% \mbox{}
+% \begin{macrocode}
+%<*fxlayoutpdfcnote>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesLayout{pdfcnote}
+
+\RequirePackage{pdfcomment}
+\RequirePackage{xcolor}
+
+% \end{macrocode}
+% \begin{color}{fxnote}
+% \begin{color}{fxwarning}
+% \begin{color}{fxerror}
+% \begin{color}{fxfatal}
+% Environments use the same colors as the notes themselves because
+% their contents really is a longer note.
+% \begin{macrocode}
+\definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
+\definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
+\definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
+\definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}
+
+% \end{macrocode}
+% \end{color}
+% \end{color}
+% \end{color}
+% \end{color}
+% \begin{macro}{\@fxdocolon}
+% \marg{author}\\
+% Add a colon after the author tag, unless empty.
+% \begin{macrocode}
+\providecommand*\@fxdocolon[1]{%
+ \ifthenelse{\equal{#1}{}}{\def\@fxcolon{}}{\def\@fxcolon{: }}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\FXLayoutPDFCNote}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutPDFCNote[3]{%
+ \@fxdocolon{#3}%
+ \pdfcomment[author={#3},color={fx#1}]{\ignorespaces#3\@fxcolon#2}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@pdfcnote}
+% \begin{booleanoption}{pdfcnote}
+% \begin{macrocode}
+\FXRegisterLayout[pdfnote]{pdfcnote}{\FXLayoutPDFCNote}
+%</fxlayoutpdfcnote>
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \subsubsection{The \texttt{pdfcmargin} layout}
+% \begin{layout}{pdfcmargin}
+% \mbox{}
+% \begin{macrocode}
+%<*fxlayoutpdfcmargin>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesLayout{pdfcmargin}
+
+\RequirePackage{pdfcomment}
+\RequirePackage{xcolor}
+
+% \end{macrocode}
+% \begin{color}{fxnote}
+% \begin{color}{fxwarning}
+% \begin{color}{fxerror}
+% \begin{color}{fxfatal}
+% Environments use the same colors as the notes themselves because their
+% contents really is a longer note.
+% \begin{macrocode}
+\definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
+\definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
+\definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
+\definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}
+
+% \end{macrocode}
+% \end{color}
+% \end{color}
+% \end{color}
+% \end{color}
+% \begin{macro}{\@fxdocolon}
+% \marg{author}\\
+% Add a colon after the author tag, unless empty.
+% \begin{macrocode}
+\providecommand*\@fxdocolon[1]{%
+ \ifthenelse{\equal{#1}{}}{\def\@fxcolon{}}{\def\@fxcolon{: }}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\FXLayoutPDFCMargin}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutPDFCMargin[3]{%
+ \@fxdocolon{#3}%
+ \pdfmargincomment[author={#3},color={fx#1}]{\ignorespaces#3\@fxcolon#2}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@pdfcmargin}
+% \begin{booleanoption}{pdfcmargin}
+% \begin{macrocode}
+\FXRegisterLayout*[margin,marginclue,marginnote,pdfmargin]{pdfcmargin}{%
+ \FXLayoutPDFCMargin}
+%</fxlayoutpdfcmargin>
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \subsubsection{The \texttt{pdfcsignote} layout}
+% \begin{layout}{pdfcsignote}
+% \mbox{}
+% \begin{macrocode}
+%<*fxlayoutpdfcsignote>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesLayout{pdfcsignote}
+
+\RequirePackage{pdfcomment}
+\RequirePackage{xcolor}
+
+% \end{macrocode}
+% \begin{color}{fxnote}
+% \begin{color}{fxwarning}
+% \begin{color}{fxerror}
+% \begin{color}{fxfatal}
+% Environments use the same colors as the notes themselves because their
+% contents really is a longer note.
+% \begin{macrocode}
+\definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
+\definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
+\definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
+\definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}
+
+% \end{macrocode}
+% \end{color}
+% \end{color}
+% \end{color}
+% \end{color}
+% \begin{macro}{\FXLayoutPDFCSigNote}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutPDFCSigNote[3]{%
+ \pdfcomment[author={#3},color={fx#1}]{#2\@fxsignature{#3}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@pdfcsignote}
+% \begin{booleanoption}{pdfcsignote}
+% \begin{macrocode}
+\FXRegisterLayout[pdfnote,pdfcnote]{pdfcsignote}{\FXLayoutPDFCSigNote}
+%</fxlayoutpdfcsignote>
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \subsubsection{The \texttt{pdfcsigmargin} layout}
+% \begin{layout}{pdfcsigmargin}
+% \mbox{}
+% \begin{macrocode}
+%<*fxlayoutpdfcsigmargin>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesLayout{pdfcsigmargin}
+
+\RequirePackage{pdfcomment}
+\RequirePackage{xcolor}
+
+% \end{macrocode}
+% \begin{color}{fxnote}
+% \begin{color}{fxwarning}
+% \begin{color}{fxerror}
+% \begin{color}{fxfatal}
+% Environments use the same colors as the notes themselves because their
+% contents really is a longer note.
+% \begin{macrocode}
+\definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
+\definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
+\definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
+\definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}
+
+% \end{macrocode}
+% \end{color}
+% \end{color}
+% \end{color}
+% \end{color}
+% \begin{macro}{\FXLayoutPDFCSigMargin}
+% \marg{type}\marg{note}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXLayoutPDFCSigMargin[3]{%
+ \pdfmargincomment[author={#3},color={fx#1}]{#2\@fxsignature{#3}}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxlayout@pdfcsigmargin}
+% \begin{booleanoption}{pdfcsigmargin}
+% \begin{macrocode}
+\FXRegisterLayout*[margin,marginclue,marginnote,pdfmargin,pdfsigmargin]{%
+ pdfcsigmargin}{%
+ \FXLayoutPDFCSigMargin}
+%</fxlayoutpdfcsigmargin>
+% \end{macrocode}
+% \end{booleanoption}
+% \end{macro}
+% \end{layout}
+%
+% \subsection{Environment layouts}
+% \subsubsection{The \texttt{color} layout}
+% \begin{envlayout}{color}
+% \mbox{}
+% \begin{macrocode}
+%<*fxenvlayoutcolor>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesEnvLayout{color}
+
+\RequirePackage{color}
+
+% \end{macrocode}
+% \begin{macro}{\@fxdocolon}
+% \marg{author}\\
+% Add a colon after the author tag, unless empty.
+% \begin{macrocode}
+\providecommand*\@fxdocolon[1]{%
+ \ifthenelse{\equal{#1}{}}{\def\@fxcolon{}}{\def\@fxcolon{: }}}
+
+% \end{macrocode}
+% \end{macro}
+% \begin{color}{fxnote}
+% \begin{color}{fxwarning}
+% \begin{color}{fxerror}
+% \begin{color}{fxfatal}
+% Environments use the same colors as the notes themselves because their
+% contents really is a longer note.
+% \begin{macrocode}
+\definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
+\definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
+\definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
+\definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}
+
+\fxsetface{env}{}
+
+% \end{macrocode}
+% \end{color}
+% \end{color}
+% \end{color}
+% \end{color}
+% \begin{macro}{\FXEnvLayoutColorBegin}
+% \begin{macro}{\FXEnvLayoutColorEnd}
+% \marg{type}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXEnvLayoutColorBegin[2]{%
+ \@fxdocolon{#2}%
+ \@fxuseface{env}\color{fx#1}\ignorespaces#2\@fxcolon\ignorespaces}
+\newcommand*\FXEnvLayoutColorEnd[2]{}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@fxenvlayout@color@begin}
+% \begin{macro}{\@fxenvlayout@color@end}
+% \begin{macrocode}
+\FXRegisterEnvLayout{color}{\FXEnvLayoutColorBegin}{\FXEnvLayoutColorEnd}
+%</fxenvlayoutcolor>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{envlayout}
+%
+% \subsubsection{The \texttt{colorsig} layout}
+% \begin{envlayout}{colorsig}
+% \mbox{}
+% \begin{macrocode}
+%<*fxenvlayoutcolorsig>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesEnvLayout{colorsig}
+
+\RequirePackage{color}
+
+% \end{macrocode}
+% \begin{face}{signature}
+% \mbox{}
+% \begin{macrocode}
+\@fxnewface[\itshape]{signature}
+% \end{macrocode}
+% \end{face}
+% \begin{color}{fxnote}
+% \begin{color}{fxwarning}
+% \begin{color}{fxerror}
+% \begin{color}{fxfatal}
+% Environments use the same colors as the notes themselves because their
+% contents really is a longer note.
+% \begin{macrocode}
+\definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
+\definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
+\definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
+\definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}
+
+\fxsetface{env}{}
+
+% \end{macrocode}
+% \end{color}
+% \end{color}
+% \end{color}
+% \end{color}
+% \begin{macro}{\FXEnvLayoutColorSigBegin}
+% \begin{macro}{\FXEnvLayoutColorSigEnd}
+% \marg{type}\marg{author}
+% \begin{macrocode}
+\newcommand*\FXEnvLayoutColorSigBegin[2]{\@fxuseface{env}\color{fx#1}}
+\newcommand*\FXEnvLayoutColorSigEnd[2]{\@fxsignature{#2}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \begin{macro}{\@fxenvlayout@colorsig@begin}
+% \begin{macro}{\@fxenvlayout@colorsig@end}
+% \begin{macrocode}
+\FXRegisterEnvLayout{colorsig}{%
+ \FXEnvLayoutColorSigBegin}{\FXEnvLayoutColorSigEnd}
+%</fxenvlayoutcolorsig>
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{envlayout}
+%
+% \subsection{Target Layouts}
+% Since target layouts don't include author information, they're orthogonal to
+% (and hence usable in) prefix/signature display.
+%
+% \subsubsection{The \texttt{changebar} layout}
+% \begin{targetlayout}{changebar}
+% \mbox{}
+% \begin{macrocode}
+%<*fxtargetlayoutchangebar>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesTargetLayout{changebar}
+
+\RequirePackage{changebar}
+\setlength{\changebarsep}{5pt}
+
+\fxsetface{target}{}
+% \end{macrocode}
+% \begin{macro}{\FXTargetLayoutChangeBar}
+% \marg{target}
+% \begin{macrocode}
+\newcommand\FXTargetLayoutChangeBar[2]{\cbstart\@fxuseface{target}#2\cbend}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxtargetlayout@changebar}
+% \begin{macrocode}
+\FXRegisterTargetLayout{changebar}{\FXTargetLayoutChangeBar}
+%</fxtargetlayoutchangebar>
+% \end{macrocode}
+% \end{macro}
+% \end{targetlayout}
+%
+% \subsubsection{The \texttt{color} layout}
+% \begin{targetlayout}{color}
+% \mbox{}
+% \begin{macrocode}
+%<*fxtargetlayoutcolor>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesTargetLayout{color}
+
+\RequirePackage{color}
+\definecolor{fxnote}{rgb}{0.0000,0.6000,0.0000}
+\definecolor{fxwarning}{rgb}{1.0000,0.5490,0.0000}
+\definecolor{fxerror}{rgb}{1.0000,0.2706,0.0000}
+\definecolor{fxfatal}{rgb}{1.0000,0.0000,0.0000}
+
+% \end{macrocode}
+% \begin{color}{fxtarget}
+% \mbox{}
+% \begin{macrocode}
+\definecolor{fxtarget}{rgb}{0.3725,0.6196,0.6275}
+
+\fxsetface{target}{}
+
+% \end{macrocode}
+% \end{color}
+% \begin{macro}{\FXTargetLayoutColor}
+% \marg{target}
+% \begin{macrocode}
+\newcommand\FXTargetLayoutColor[2]{\@fxuseface{target}\color{fxtarget}#2}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxtargetlayout@color}
+% \begin{macrocode}
+\FXRegisterTargetLayout{color}{\FXTargetLayoutColor}
+%</fxtargetlayoutcolor>
+% \end{macrocode}
+% \end{macro}
+% \end{targetlayout}
+%
+% \subsubsection{The \texttt{colorcb} layout}
+% \begin{targetlayout}{colorcb}
+% \mbox{}
+% \begin{macrocode}
+%<*fxtargetlayoutcolorcb>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesTargetLayout{colorcb}
+
+\RequirePackage{color}
+
+\RequirePackage[color]{changebar}
+\setlength{\changebarsep}{5pt}
+
+\fxsetface{target}{}
+% \end{macrocode}
+% \begin{macro}{\FXTargetLayoutColorCB}
+% \marg{target}
+% \begin{macrocode}
+\newcommand\FXTargetLayoutColorCB[2]{%
+ \cbstart\cbcolor{fx#1}\@fxuseface{target}#2\cbend}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@fxtargetlayout@colorcb}
+% \begin{macrocode}
+\FXRegisterTargetLayout{colorcb}{\FXTargetLayoutColorCB}
+%</fxtargetlayoutcolorcb>
+% \end{macrocode}
+% \end{macro}
+% \end{targetlayout}
+%
+% \section{Themes}
+% \subsection{The \texttt{signature} theme}
+% \begin{theme}{signature}
+% \mbox{}
+% \begin{macrocode}
+%<*fxthemesignature>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesTheme{signature}
+
+\fxuseenvlayout{signature}
+
+\renewcommand*\FXLayoutFootnote[3]{\footnote{\@fxsigstd{#1}{#2}{#3}}}
+\renewcommand*\FXLayoutMargin[3]{%
+ \marginpar[{\raggedleft\@fxuseface{margin}\@fxsigstd{#1}{#2}{#3}}]{%
+ \raggedright\@fxuseface{margin}\@fxsigstd{#1}{#2}{#3}}}
+\renewcommand*\FXLayoutMarginClue[3]{%
+ \marginpar[{\raggedleft\@fxuseface{margin}\fxnotename{#1}!\@fxsignature{#3}}]{%
+ \raggedright\@fxuseface{margin}\fxnotename{#1}!\@fxsignature{#3}}}
+\renewcommand*\FXLayoutInline[3]{{ \@fxuseface{inline}\@fxsigstd{#1}{#2}{#3}}}
+\renewcommand*\FXLayoutIndex[3]{%
+ \iffx@mode@multiuser%
+ \index{***@\fixmeindexname:%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !\@nameuse{thefx#1count}: #2\@fxsignature{#3}}%
+ \index{***#3@\fixmeindexname{} (#3):%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !\@nameuse{thefx#1count}: #2}%
+ \else%
+ \index{***@\fixmeindexname:%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !\@nameuse{thefx#1count}: #2}%
+ \fi}
+\renewcommand*\FXLayoutContentsLine[3]{%
+ \iffx@mode@multiuser%
+ \fxaddcontentsline{\@fxsigstd{#1}{#2}{#3}}%
+ \else%
+ \fxaddcontentsline{\fxnotename{#1}: #2}%
+ \fi}
+%</fxthemesignature>
+% \end{macrocode}
+% \end{theme}
+%
+% \subsection{The \texttt{color} theme}
+% \begin{theme}{color}
+% \mbox{}
+% \begin{macrocode}
+%<*fxthemecolor>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesTheme{color}
+
+\RequirePackage{color}
+
+\FXRequireEnvLayout{color}
+\FXRequireTargetLayout{color}
+
+\fxsetface{inline}{}
+
+\renewcommand*\FXLayoutFootnote[3]{%
+ \@fxdocolon{#3}%
+ \footnote{\color{fx#1}\ignorespaces#3\@fxcolon#2}}
+\renewcommand*\FXLayoutMargin[3]{%
+ \@fxdocolon{#3}%
+ \marginpar[%
+ {\raggedleft\@fxuseface{margin}\color{fx#1}\ignorespaces#3\@fxcolon#2}]{%
+ \raggedright\@fxuseface{margin}\color{fx#1}\ignorespaces#3\@fxcolon#2}}
+\renewcommand*\FXLayoutMarginClue[3]{%
+ \marginpar[{\raggedleft\@fxuseface{margin}\color{fx#1}\ignorespaces#3!}]{%
+ \raggedright\@fxuseface{margin}\color{fx#1}\ignorespaces#3!}}
+\renewcommand*\FXLayoutInline[3]{%
+ \@fxdocolon{#3}%
+ { \textcolor{fx#1}{\@fxuseface{inline}\ignorespaces#3\@fxcolon#2}}}
+\renewcommand*\FXLayoutIndex[3]{%
+ \iffx@mode@multiuser%
+ \index{***@\fixmeindexname:%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !{\color{fx#1}\@nameuse{thefx#1count}: #3: #2}}%
+ \index{***#3@\fixmeindexname{} (#3):%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !{\color{fx#1}\@nameuse{thefx#1count}: #2}}%
+ \else%
+ \index{***@\fixmeindexname:%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !{\color{fx#1}\@nameuse{thefx#1count}: #2}}%
+ \fi}
+
+\renewcommand*\FXLayoutContentsLine[3]{%
+ \@fxdocolon{#3}%
+ \iffx@mode@multiuser%
+ \fxaddcontentsline{\color{fx#1}\ignorespaces#3\@fxcolon#2}%
+ \else%
+ \fxaddcontentsline{\color{fx#1}#2}%
+ \fi}
+%</fxthemecolor>
+% \end{macrocode}
+% \end{theme}
+%
+% \subsection{The \texttt{colorsig} theme}
+% \begin{theme}{colorsig}
+% \begin{macrocode}
+%<*fxthemecolorsig>
+\NeedsTeXFormat{LaTeX2e}
+\FXProvidesTheme{colorsig}
+
+\RequirePackage{color}
+
+\FXRequireEnvLayout{colorsig}
+\FXRequireTargetLayout{color}
+
+\fxsetface{inline}{}
+
+\renewcommand*\FXLayoutFootnote[3]{\footnote{\color{fx#1}#2\@fxsignature{#3}}}
+\renewcommand*\FXLayoutMargin[3]{%
+ \marginpar[{\raggedleft\@fxuseface{margin}\color{fx#1}#2\@fxsignature{#3}}]{%
+ \raggedright\@fxuseface{margin}\color{fx#1}#2\@fxsignature{#3}}}
+\renewcommand*\FXLayoutMarginClue[3]{%
+ \marginpar[{\raggedleft\@fxuseface{margin}\color{fx#1}!\@fxsignature{#3}}]{%
+ \raggedright\@fxuseface{margin}\color{fx#1}!\@fxsignature{#3}}}
+\renewcommand*\FXLayoutInline[3]{%
+ { \textcolor{fx#1}{\@fxuseface{inline}#2\@fxsignature{#3}}}}
+\renewcommand*\FXLayoutIndex[3]{%
+ \iffx@mode@multiuser%
+ \index{***@\fixmeindexname:%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !{\color{fx#1}\@nameuse{thefx#1count}: #2\@fxsignature{#3}}}%
+ \index{***#3@\fixmeindexname{} (#3):%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !{\color{fx#1}\@nameuse{thefx#1count}: #2}}%
+ \else%
+ \index{***@\fixmeindexname:%
+ !\@nameuse{@fx#1key}@\fxnotesname{#1}:%
+ !{\color{fx#1}\@nameuse{thefx#1count}: #2}}%
+ \fi}
+\renewcommand*\FXLayoutContentsLine[3]{%
+ \iffx@mode@multiuser%
+ \fxaddcontentsline{\color{fx#1}#2\@fxsignature{#3}}%
+ \else%
+ \fxaddcontentsline{\color{fx#1}#2}%
+ \fi}
+%</fxthemecolorsig>
+% \end{macrocode}
+% \end{theme}
+%
+% ^^A \PrintChanges
+% ^^A Nobody messes up with the marks in this document, but \index@prologue.
+% ^^A That sucks.
+% \makeatletter{\let\markboth\@gobbletwo\PrintIndex}\makeatother
+% \Finale
+%
+% ^^A Local variables:
+% ^^A eval : (add-hook 'TeX-update-style-hook (lambda () (doxitems "option" "counter" "lang" "cond" "face" "color" "theme")) nil t)
+% ^^A eval: (add-hook 'TeX-update-style-hook (lambda () (doxitem "\\(env\\|target\\)?layout")) nil t)
+% ^^A End:
+% ^^A fixme.dtx ends here.
diff --git a/macros/latex/contrib/fixme/fixme.el b/macros/latex/contrib/fixme/fixme.el
new file mode 100644
index 0000000000..b140e87882
--- /dev/null
+++ b/macros/latex/contrib/fixme/fixme.el
@@ -0,0 +1,687 @@
+;;; fixme.el --- AUCTeX style file for FiXme
+
+;; Copyright (C) 2000, 2002, 2004, 2006, 2009, 2017, 2019 Didier Verna
+
+;; Author: Didier Verna <didier@didierverna.net>
+;; Keywords: tex abbrev data
+
+;; This file is part of FiXme.
+
+;; FiXme may be distributed and/or modified under the conditions of the LaTeX
+;; Project Public License, either version 1.3 of this license or (at your
+;; option) any later version. The latest version of this license is in
+;; http://www.latex-project.org/lppl.txt and version 1.3 or later is part of
+;; all distributions of LaTeX version 2005/12/01 or later.
+
+;; FiXme consists of all files listed in the file `README.md'.
+
+
+;;; Commentary:
+
+
+;;; Code:
+
+
+;; ===========================================================================
+;; Utilities
+;; ===========================================================================
+
+(defun LaTeX-fixme-xkeyval-boolean-values (items)
+ "Create a sorted list of XKeyVal boolean values for ITEMS.
+Every item leads to two strings: \"item\" and \"noitem\"."
+ (sort (mapcan (lambda (item) `(,item ,(concat "no" item))) items)
+ #'string<))
+
+(defun LaTeX-fixme-xkeyval-boolean-option (item)
+ "Create an XKeyVal boolean option for ITEM.
+This creates a list of the form (\"ITEM\" (\"true\" \"false\"))."
+ `(,item ("true" "false")))
+
+(defun LaTeX-fixme-option< (option1 option2)
+ "Return t if the car of OPTION1 is STRING< to the car of OPTION2.
+This function is used as a predicate for sorting XKeyVal option
+lists."
+ (string< (car option1) (car option2)))
+
+(defun LaTeX-fixme-xkeyval-boolean-options (items)
+ "Create a sorted list of XKeyVal boolean options for ITEMS.
+Every item leads to two lists: (\"item\" (\"true\" \"false\"))
+and (\"noitem\" (\"true\" \"false\"))."
+ (sort (mapcar #'LaTeX-fixme-xkeyval-boolean-option
+ (LaTeX-fixme-xkeyval-boolean-values items))
+ #'LaTeX-fixme-option<))
+
+;; The two functions below steal AUCTeX's mechanism for reading key=value
+;; lists of options, only without the =value part. This is probably suboptimal
+;; because that part could still be entered manually (withtout, completion
+;; that is) although it's not supposed to, but it's simpler to do it this way.
+(defun LaTeX-fixme-read-key (optional key-list &optional prompt)
+ "Prompt for keys in KEY-LIST and return them.
+If OPTIONAL is non-nil, indicate in the prompt that we are
+reading an optional argument. KEY-LIST is a list of strings.
+Use PROMPT as the prompt string."
+ (multi-prompt-key-value
+ (TeX-argument-prompt optional prompt "Keys")
+ (if (symbolp key-list)
+ (eval key-list)
+ (mapcar #'list key-list))))
+
+(defun LaTeX-fixme-arg-key (optional key-list &optional prompt)
+ "Prompt for keys in KEY-LIST and insert them as a TeX macro argument.
+If OPTIONAL is non-nil, insert as an optional argument. KEY-LIST
+is a list of strings. Use PROMPT as the prompt string."
+ (TeX-argument-insert (LaTeX-fixme-read-key optional key-list prompt)
+ optional))
+
+(defun LaTeX-fixme-file-feature (kind)
+ "Return the KIND of feature name provided by the current file, or nil.
+KIND may be one of \"layout\", \"envlout\", \"targetlayout\" or
+\"theme\", in order to attempt matching the file name with
+\"fxKIND<feature>.sty\"."
+ (let ((file-name (buffer-file-name)))
+ (when file-name
+ (setq file-name (file-name-nondirectory file-name))
+ (when (string-match (concat (regexp-quote (concat "fx" kind))
+ "\\(.+\\)\\.sty")
+ file-name)
+ (match-string 1 file-name)))))
+
+(defun maybe-upcase-initials (string-or-nil)
+ "Upcase STRING-OR-NIL initials if it is a string, or return \"\"."
+ (if string-or-nil (upcase-initials string-or-nil) ""))
+
+
+
+;; ===========================================================================
+;; Options
+;; ===========================================================================
+
+;; Status processing
+;; -----------------
+(defvar LaTeX-fixme-status-options
+ '(("draft")
+ ("final")
+ ("status" ("draft" "final")))
+ "FiXme document status options.")
+
+
+;; Layouts
+;; -------
+(defvar LaTeX-fixme-builtin-layouts
+ '("footnote" "index" "inline" "margin" "marginclue")
+ "FiXme builtin layouts.")
+
+(defvar LaTeX-fixme-builtin-layout-boolean-values
+ (LaTeX-fixme-xkeyval-boolean-values LaTeX-fixme-builtin-layouts)
+ "FiXme built-in layout boolean values.")
+
+(defvar LaTeX-fixme-builtin-layout-boolean-options
+ (LaTeX-fixme-xkeyval-boolean-options LaTeX-fixme-builtin-layouts)
+ "FiXme built-in layout boolean options.")
+
+(defvar LaTeX-fixme-external-layouts
+ '("marginnote"
+ "pdfcmargin" "pdfcnote" "pdfcsigmargin" "pdfcsignote"
+ "pdfmargin" "pdfnote" "pdfsigmargin" "pdfsignote")
+ "FiXme external layouts.")
+
+(defvar LaTeX-fixme-external-layout-boolean-values
+ (LaTeX-fixme-xkeyval-boolean-values LaTeX-fixme-external-layouts)
+ "FiXme external layout boolean values.")
+
+(defvar LaTeX-fixme-external-layout-boolean-options
+ (LaTeX-fixme-xkeyval-boolean-options LaTeX-fixme-external-layouts)
+ "FiXme external layout boolean options.")
+
+(defvar LaTeX-fixme-layouts
+ (sort (copy-sequence `(,@LaTeX-fixme-builtin-layouts
+ ,@LaTeX-fixme-external-layouts))
+ #'string<)
+ "FiXme layouts.")
+
+(defvar LaTeX-fixme-layout-boolean-values
+ (LaTeX-fixme-xkeyval-boolean-values LaTeX-fixme-layouts)
+ "FiXme layout boolean values.")
+
+(defvar LaTeX-fixme-layout-boolean-options
+ (LaTeX-fixme-xkeyval-boolean-options LaTeX-fixme-layouts)
+ "FiXme layout boolean options.")
+
+;; #### FIXME: this is not totally correct. The layout, morelayout and
+;; innerlayout options accept either a single value, or a comma-separated list
+;; of such.
+(defvar LaTeX-fixme-layout-options
+ (sort (copy-sequence
+ `(,@LaTeX-fixme-layout-boolean-options
+ ("layout" ,LaTeX-fixme-layout-boolean-values)
+ ("morelayout" ,LaTeX-fixme-layout-boolean-values)
+ ("innerlayout" (,@LaTeX-fixme-layout-boolean-values
+ ("layout" ,LaTeX-fixme-layout-boolean-values)
+ ("morelayout",LaTeX-fixme-layout-boolean-values)))))
+ #'LaTeX-fixme-option<)
+ "FiXme layout options.")
+
+
+;; Environment layouts
+;; -------------------
+(defvar LaTeX-fixme-builtin-env-layouts
+ '("plain" "signature")
+ "FiXme builtin environment layouts.")
+
+(defvar LaTeX-fixme-external-env-layouts
+ '("color" "colorsig")
+ "FiXme external environment layouts.")
+
+(defvar LaTeX-fixme-env-layouts
+ (sort (copy-sequence `(,@LaTeX-fixme-builtin-env-layouts
+ ,@LaTeX-fixme-external-env-layouts))
+ #'string<)
+ "FiXme environment layouts.")
+
+(defvar LaTeX-fixme-envlayout-option
+ `("envlayout" ,LaTeX-fixme-env-layouts)
+ "FiXme envlayout option.")
+
+
+;; Target layouts
+;; --------------
+(defvar LaTeX-fixme-builtin-target-layouts
+ '("changebar" "plain")
+ "FiXme builtin target layouts.")
+
+(defvar LaTeX-fixme-external-target-layouts
+ '("color" "colorcb")
+ "FiXme external target layouts.")
+
+(defvar LaTeX-fixme-target-layouts
+ (sort (copy-sequence `(,@LaTeX-fixme-builtin-target-layouts
+ ,@LaTeX-fixme-external-target-layouts))
+ #'string<)
+ "FiXme target layouts.")
+
+(defvar LaTeX-fixme-targetlayout-option
+ `("targetlayout" ,LaTeX-fixme-target-layouts)
+ "FiXme targetlayout option.")
+
+
+;; Target option
+;; -------------
+(defvar LaTeX-fixme-target-option
+ '("target" ("thepage"))
+ "FiXme target option.")
+
+
+;; Faces
+;; -----
+(defun LaTeX-fixme-face-option (face)
+ "Return the face option corresponding to FACE.
+This is (\"FACEface\")."
+ `(,(concat face "face")))
+
+(defvar LaTeX-fixme-common-faces '("inline" "margin" "signature")
+ "FiXme common faces.")
+
+(defvar LaTeX-fixme-common-face-options
+ (sort (mapcar #'LaTeX-fixme-face-option LaTeX-fixme-common-faces)
+ #'LaTeX-fixme-option<)
+ "FiXme common face options.")
+
+(defvar LaTeX-fixme-env-face "env"
+ "FiXme environment face.")
+
+(defvar LaTeX-fixme-env-face-option
+ (LaTeX-fixme-face-option LaTeX-fixme-env-face)
+ "FiXme env face option.")
+
+(defvar LaTeX-fixme-target-face "target"
+ "FiXme environment face.")
+
+(defvar LaTeX-fixme-target-face-option
+ (LaTeX-fixme-face-option LaTeX-fixme-target-face)
+ "FiXme target face option.")
+
+(defvar LaTeX-fixme-faces
+ (sort (copy-sequence `(,@LaTeX-fixme-common-faces
+ ,LaTeX-fixme-env-face ,LaTeX-fixme-target-face))
+ #'string<)
+ "FiXme faces.")
+
+(defvar LaTeX-fixme-face-options
+ (sort (mapcar #'LaTeX-fixme-face-option LaTeX-fixme-faces)
+ #'LaTeX-fixme-option<)
+ "FiXme face options.")
+
+
+;; Logging
+;; -------
+(defvar LaTeX-fixme-logging-options
+ (LaTeX-fixme-xkeyval-boolean-options '("silent"))
+ "FiXme logging options.")
+
+
+;; Languages
+;; ---------
+(defvar LaTeX-fixme-languages
+ '("croatian" "danish" "english" "francais" "french" "german" "italian"
+ "ngerman" "spanish")
+ "FiXme Languages.")
+
+;; #### NOTE: langtrack not included
+(defvar LaTeX-fixme-language-options
+ (sort `(,@(mapcar #'list LaTeX-fixme-languages)
+ ("lang" ,LaTeX-fixme-languages)
+ ("defaultlang" ,LaTeX-fixme-languages))
+ #'LaTeX-fixme-option<)
+ "FiXme options for language selection.")
+
+(defvar LaTeX-fixme-langtrack-option
+ (LaTeX-fixme-xkeyval-boolean-option "langtrack")
+ "FiXme langtrack option.")
+
+
+;; Authoring
+;; ---------
+(defvar LaTeX-fixme-author-option
+ '("author")
+ "FiXme author option.")
+
+
+(defvar LaTeX-fixme-mode-options
+ (sort (copy-sequence `(,(LaTeX-fixme-xkeyval-boolean-option "singleuser")
+ ,(LaTeX-fixme-xkeyval-boolean-option "multiuser")
+ ("mode" ("multiuser""singleuser"))))
+ #'LaTeX-fixme-option<)
+ "FiXme mode options.")
+
+
+;; Themes
+;; ------
+(defvar LaTeX-fixme-themes
+ '("color" "colorsig" "signature")
+ "FiXme themes.")
+
+(defvar LaTeX-fixme-theme-option
+ `("theme" ,LaTeX-fixme-themes)
+ "FiXme theme option.")
+
+
+;; Macro-dependent
+;; ---------------
+(defun LaTeX-fixme-annotation-options (&optional targeted)
+ "Return a specification for the optional argument to FiXme annotations.
+Mostly all, except for envlayout, envface, langtrack and theme.
+TARGETED is for the starred versions, where additional options
+exist (targetlayout and targetface)."
+ `[ TeX-arg-key-val
+ ,(sort (copy-sequence `(,@LaTeX-fixme-status-options
+ ,@LaTeX-fixme-layout-options
+ ,@LaTeX-fixme-common-face-options
+ ,LaTeX-fixme-target-option
+ ,@(when targeted
+ `(,LaTeX-fixme-targetlayout-option
+ ,LaTeX-fixme-target-face-option))
+ ,@LaTeX-fixme-logging-options
+ ,@LaTeX-fixme-language-options
+ ,LaTeX-fixme-author-option
+ ,@LaTeX-fixme-mode-options))
+ #'LaTeX-fixme-option<) ])
+
+;; #### WARNING: gross hack. This function makes the targeted annotations look
+;; like they're taking a single mandatory argument, whereas they actually take
+;; 2.
+(defun LaTeX-fixme-targeted-annotation-hack (optional)
+ "Hook for targeted FiXme annotations.
+This function inserts a first couple of braces and a second one,
+potentially with the active region's contents within it. The point is left
+inside the first couple of braces."
+ (TeX-argument-insert "" nil)
+ (TeX-parse-argument optional nil))
+
+
+;; #### NOTE: an even DWIMer thing to do would be to make the MACRO argument
+;; depend on the NAME one, in case the user changed it from the initial input.
+(defvar LaTeX-fixme-args-register-layout
+ `([ (LaTeX-fixme-arg-key ,LaTeX-fixme-layouts "Incompatible layout(s)") ]
+ (TeX-arg-eval TeX-read-string "Name: " (LaTeX-fixme-file-feature "layout"))
+ (TeX-arg-eval TeX-read-string "Macro: "
+ (concat TeX-esc "FXLayout"
+ (maybe-upcase-initials
+ (LaTeX-fixme-file-feature "layout")))))
+ "FiXme layout registration arguments.
+An optional mutual exclusion list, a layout name and the
+corresponding macro.")
+
+;; #### NOTE: OPTIONALP is ignored.
+(defun LaTeX-fixme-boolean-option-definition (optionalp)
+ "Hook for boolean option definitions.
+Prompt for, and insert a key between braces.
+When TeX-insert-macro is called with a prefix argument, first insert an empty
+pair of square brackets for a function definition, and leave point inside."
+ (cond (current-prefix-arg
+ (insert "[")
+ (let ((point (point)))
+ (insert "]")
+ (TeX-arg-string nil "Key")
+ (goto-char point)))
+ (t
+ (TeX-arg-string nil "Key"))))
+
+
+;; Environment-dependent
+;; ---------------------
+;; #### NOTE: this function compensates for the fact that AUCTeX doesn't
+;; understand t arguments in environments as it does in macros (the point is
+;; always left within the argument's body). The other solution (actually, the
+;; previous one) was to prompt for the annotation summary, but I find that
+;; less convenient to edit it in the minibuffer, rather than in the file
+;; directly.
+(defun LaTeX-fixme-insert-environment (environment)
+ "Insert a FiXme annotation ENVIRONMENT.
+Prompt for arguments, and leave point within the first couple of
+braces, where the annotation summary needs to go. For targeted
+environments, use the active region as the second mandatory
+argument."
+ (let* ((targeted (string-match "\\*" environment))
+ (options-list (sort (copy-sequence
+ (append LaTeX-fixme-status-options
+ LaTeX-fixme-layout-options
+ LaTeX-fixme-common-face-options
+ LaTeX-fixme-logging-options
+ LaTeX-fixme-language-options
+ LaTeX-fixme-mode-options
+ (list LaTeX-fixme-envlayout-option
+ LaTeX-fixme-env-face-option
+ LaTeX-fixme-target-option
+ LaTeX-fixme-author-option)
+ (when targeted
+ (list LaTeX-fixme-targetlayout-option
+ LaTeX-fixme-target-face-option))))
+ #'LaTeX-fixme-option<))
+ (options (TeX-read-key-val t options-list))
+ (target (when (and targeted (TeX-active-mark))
+ (prog1 (buffer-substring (point) (mark))
+ (delete-region (point) (mark))))))
+ (LaTeX-insert-environment
+ environment
+ (concat (when (and options (not (string= options "")))
+ (format "[%s]" options))
+ (concat TeX-grop TeX-grcl)
+ (when targeted
+ (concat TeX-grop target TeX-grcl))))
+ (when target
+ (LaTeX-fill-environment nil)
+ (indent-according-to-mode)
+ ;; #### NOTE: for some reason, doing this after DELETE-REGION doesn't
+ ;; work (maybe something related to the insertion of the environment) so
+ ;; I'm deferring it to here.
+ (TeX-deactivate-mark))
+ (LaTeX-find-matching-begin)
+ (re-search-forward TeX-grcl)
+ (when (= (char-after) ?\[)
+ (forward-list))
+ (forward-char)))
+
+
+
+;; ===========================================================================
+;; Style Hooks
+;; ===========================================================================
+
+(TeX-add-style-hook "fixme"
+ (lambda ()
+
+ (TeX-add-symbols
+ `("fxsetup" (TeX-arg-key-val ,(sort (copy-sequence
+ `(,@LaTeX-fixme-status-options
+ ,@LaTeX-fixme-layout-options
+ ,@LaTeX-fixme-common-face-options
+ ,LaTeX-fixme-envlayout-option
+ ,LaTeX-fixme-env-face-option
+ ,LaTeX-fixme-targetlayout-option
+ ,LaTeX-fixme-target-face-option
+ ,LaTeX-fixme-target-option
+ ,@LaTeX-fixme-logging-options
+ ,@LaTeX-fixme-language-options
+ ,LaTeX-fixme-langtrack-option
+ ,LaTeX-fixme-author-option
+ ,@LaTeX-fixme-mode-options
+ ,LaTeX-fixme-theme-option))
+ #'LaTeX-fixme-option<)))
+
+ `("fxnote" ,(LaTeX-fixme-annotation-options) t)
+ `("fxwarning" ,(LaTeX-fixme-annotation-options) t)
+ `("fxerror" ,(LaTeX-fixme-annotation-options) t)
+ `("fxfatal" ,(LaTeX-fixme-annotation-options) t)
+ ;; #### NOTE: \fixme is obsolete so I don't want to support it here.
+
+ `("fxnote*" ,(LaTeX-fixme-annotation-options t)
+ LaTeX-fixme-targeted-annotation-hack)
+ `("fxwarning*" ,(LaTeX-fixme-annotation-options t)
+ LaTeX-fixme-targeted-annotation-hack)
+ `("fxerror*" ,(LaTeX-fixme-annotation-options t)
+ LaTeX-fixme-targeted-annotation-hack)
+ `("fxfatal*" ,(LaTeX-fixme-annotation-options t)
+ LaTeX-fixme-targeted-annotation-hack)
+
+ '("listoffixmes" 0)
+
+ `("fxuselayouts" (TeX-arg-key-val ,LaTeX-fixme-layout-boolean-options
+ "Layout options"))
+ `("fxloadlayouts" (LaTeX-fixme-arg-key ,LaTeX-fixme-external-layouts
+ "External layouts"))
+
+ '("fxuseenvlayout" (TeX-arg-eval completing-read "Environment layout: "
+ LaTeX-fixme-env-layouts))
+ `("fxloadenvlayouts" (LaTeX-fixme-arg-key
+ ,LaTeX-fixme-external-env-layouts
+ "External environment layout(s)"))
+
+ '("fxusetargetlayout" (TeX-arg-eval completing-read "Target layout: "
+ LaTeX-fixme-target-layouts))
+ `("fxloadtargetlayouts" (LaTeX-fixme-arg-key
+ ,LaTeX-fixme-external-target-layouts
+ "External target layout(s)"))
+
+ '("fxsetface" (TeX-arg-eval completing-read "Face: " LaTeX-fixme-faces) t)
+
+ '("FXRegisterAuthor"
+ ;; #### WARNING: this really is a dirty, dirty trick. We construct a
+ ;; single argument out of 3, and let AUCTeX enclose the whole thing
+ ;; with the missing pair of braces...
+ (TeX-arg-eval
+ let* ((tag (read-from-minibuffer "Tag: "))
+ (cmd (read-from-minibuffer "Command prefix: " (downcase tag)))
+ (env (read-from-minibuffer "Environment prefix: "
+ (concat "a" (downcase cmd)))))
+ (concat cmd TeX-grcl
+ TeX-grop env TeX-grcl
+ TeX-grop tag)))
+
+ '("fxusetheme" (TeX-arg-eval completing-read "Theme: " LaTeX-fixme-themes))
+
+ `("FXRegisterLayout" ,@LaTeX-fixme-args-register-layout)
+ `("FXRegisterLayout*" ,@LaTeX-fixme-args-register-layout)
+ '("FXProvidesLayout"
+ (TeX-arg-eval TeX-read-string "Name: "
+ (LaTeX-fixme-file-feature "layout"))
+ [ TeX-arg-version ])
+ `("FXRequireLayouts" (LaTeX-fixme-arg-key ,LaTeX-fixme-external-layouts
+ "External layout(s)"))
+
+ '("FXRegisterEnvLayout"
+ (TeX-arg-eval TeX-read-string "Name: "
+ (LaTeX-fixme-file-feature "envlayout"))
+ (TeX-arg-eval TeX-read-string "Opening macro: "
+ (concat TeX-esc "FXEnvLayout"
+ (maybe-upcase-initials
+ (LaTeX-fixme-file-feature "envlayout"))
+ "Begin"))
+ (TeX-arg-eval TeX-read-string "Closing macro: "
+ (concat TeX-esc "FXEnvLayout"
+ (maybe-upcase-initials
+ (maybe-LaTeX-fixme-file-feature "envlayout"))
+ "End")))
+ '("FXProvidesEnvLayout"
+ (TeX-arg-eval TeX-read-string "Name: "
+ (LaTeX-fixme-file-feature "envlayout"))
+ [ TeX-arg-version ])
+ '("FXRequireEnvLayout" (TeX-arg-eval completing-read
+ "External environment layout: "
+ LaTeX-fixme-external-env-layouts))
+
+ '("FXRegisterTargetLayout"
+ (TeX-arg-eval TeX-read-string "Name: "
+ (LaTeX-fixme-file-feature "targetlayout"))
+ (TeX-arg-eval TeX-read-string "Macro: "
+ (concat TeX-esc "FXTargetLayout"
+ (maybe-upcase-initials
+ (LaTeX-fixme-file-feature "targetlayout")))))
+ '("FXProvidesTargetLayout"
+ (TeX-arg-eval TeX-read-string "Name: "
+ (LaTeX-fixme-file-feature "targetlayout"))
+ [ TeX-arg-version ])
+ '("Fxrequiretargetlayout"
+ (TeX-arg-eval completing-read "External target layout: "
+ LaTeX-fixme-external-target-layouts))
+
+ '("FXProvidesTheme"
+ (TeX-arg-eval TeX-read-string "Name: "
+ (LaTeX-fixme-file-feature "theme"))
+ [ TeX-arg-version ]))
+
+ (let ((families '("Layout" "EnvLayout" "TargetLayout")))
+ (apply #'TeX-add-symbols
+ (mapcar (lambda (macro)
+ (cons macro
+ '("Key" [ "Default" ] t)))
+ (mapcar (lambda (family) (concat "FXDefine" family "Key"))
+ families)))
+ (apply #'TeX-add-symbols
+ (mapcar (lambda (macro)
+ (cons macro
+ '([ "Macro prefix" ] "Key" [ "Default" ] t)))
+ (mapcar (lambda (family)
+ (concat "FXDefine" family "CmdKey"))
+ families)))
+ (apply #'TeX-add-symbols
+ (mapcar (lambda (macro)
+ (cons macro
+ '("Key" [ "Bin" ] "Alternatives" [ "Default" ] t)))
+ (mapcar (lambda (family)
+ (concat "FXDefine" family "ChoiceKey"))
+ families)))
+ (apply #'TeX-add-symbols
+ (mapcar (lambda (macro) (cons macro '("Key" t)))
+ (mapcar (lambda (family)
+ (concat "FXDefine" family "VoidKey"))
+ families)))
+ (apply #'TeX-add-symbols
+ (mapcar (lambda (macro)
+ (cons macro '(LaTeX-fixme-boolean-option-definition)))
+ (mapcar (lambda (family)
+ (concat "FXDefine" family "BoolKey"))
+ families))))
+
+ (apply #'TeX-add-symbols
+ (mapcan (lambda (macro)
+ (mapcar (lambda (language)
+ (list (concat "fx" language macro) 0))
+ ;; #### NOTE: francais is an alias to french.
+ (remove "francais" LaTeX-fixme-languages)))
+ (mapcar (lambda (macro) (concat macro "name"))
+ '("note" "notes"
+ "warning" "warnings"
+ "error" "errors"
+ "fatal" "fatals"))))
+
+ (apply #'TeX-add-symbols
+ (mapcar (lambda (language)
+ (list (concat language "listfixmename") 0))
+ ;; #### NOTE: francais is an alias to french.
+ (remove "francais" LaTeX-fixme-languages)))
+
+
+ (LaTeX-add-environments
+ `("anfxnote" LaTeX-fixme-insert-environment)
+ `("anfxwarning" LaTeX-fixme-insert-environment)
+ `("anfxerror" LaTeX-fixme-insert-environment)
+ `("anfxfatal" LaTeX-fixme-insert-environment)
+
+ `("anfxnote*" LaTeX-fixme-insert-environment)
+ `("anfxwarning*" LaTeX-fixme-insert-environment)
+ `("anfxerror*" LaTeX-fixme-insert-environment)
+ `("anfxfatal*" LaTeX-fixme-insert-environment))
+
+
+ (when (and (featurep 'font-latex)
+ (eq TeX-install-font-lock 'font-latex-setup))
+ (font-latex-add-keywords '(("fxsetup" "{")
+
+ "listoffixmes"
+
+ ("fxuselayouts" "{")
+ ("fxloadlayouts" "{")
+
+ ("fxuseenvlayout" "{")
+ ("fxloadenvlayouts" "{")
+
+ ("fxusetargetlayout" "{")
+ ("fxloadtargetlayouts" "{")
+
+ ("fxsetface" "{{")
+
+ ("FXRegisterAuthor" "{{{")
+
+ ("fxusetheme" "{")
+
+ ("FXRegisterLayout" "*[{{")
+ ("FXProvidesLayout" "{[")
+ ("FXRequireLayout" "{")
+
+ ("FXRegisterEnvLayout" "{{{")
+ ("FXProvidesEnvLayout" "{[")
+ ("FXRequireEnvLayout" "{")
+
+ ("FXRegisterTargetLayout" "{{")
+ ("FXProvidesTargetLayout" "{[")
+ ("FXRequireTargetLayout" "{")
+
+ ("FXDefineLayoutKey" "{[{")
+ ("FXDefineEnvLayoutKey" "{[{")
+ ("FXDefineTargetLayoutKey" "{[{")
+
+ ("FXDefineLayoutCmdKey" "[{[{")
+ ("FXDefineEnvLayoutCmdKey" "[{[{")
+ ("FXDefineTargetLayoutCmdKey" "[{[{")
+
+ ("FXDefineLayoutChoiceKey" "{[{[{")
+ ("FXDefineEnvLayoutChoiceKey" "{[{[{")
+ ("FXDefineTargetLayoutChoiceKey" "{[{[{")
+
+ ("FXDefineLayoutVoidKey" "{{")
+ ("FXDefineEnvLayoutVoidKey" "{{")
+ ("FXDefineTargetLayoutVoidKey" "{{")
+
+ ("FXDefineLayoutBoolKey" "[{")
+ ("FXDefineEnvLayoutBoolKey" "[{")
+ ("FXDefineTargetLayoutBoolKey" "[{")
+
+ ("FXProvidesTheme" "{["))
+ 'function)
+ ;; The starred version of the 4 macros below takes a second mandatory
+ ;; argument. We skip this since it would confuse font-latex when used as
+ ;; the non-starred version
+ (font-latex-add-keywords '(("fxnote" "*[{")
+ ("fxwarning" "*[{")
+ ("fxerror" "*[{")
+ ("fxfatal" "*[{"))
+ 'textual)))
+ LaTeX-dialect)
+
+
+
+;;; Local variables:
+;;; eval: (put 'TeX-add-style-hook 'lisp-indent-function 1)
+;;; End:
+
+;;; fixme.el ends here
diff --git a/macros/latex/contrib/fixme/fixme.ins b/macros/latex/contrib/fixme/fixme.ins
new file mode 100644
index 0000000000..9ad1a0d14b
--- /dev/null
+++ b/macros/latex/contrib/fixme/fixme.ins
@@ -0,0 +1,78 @@
+%%% fixme.ins --- Installation file for FiXme
+
+%% Copyright (C) 1998-2002, 2004, 2007, 2009, 2013, 2017-2019 Didier Verna
+
+%% Author: Didier Verna <didier@didierverna.net>
+
+%% This file is part of FiXme.
+
+%% FiXme may be distributed and/or modified under the conditions of the LaTeX
+%% Project Public License, either version 1.3 of this license or (at your
+%% option) any later version. The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt and version 1.3 or later is part of
+%% all distributions of LaTeX version 2005/12/01 or later.
+
+%% FiXme consists of the files listed in the file `README.md'.
+
+
+%%% Commentary:
+
+
+%%% Code:
+
+\NeedsTeXFormat{LaTeX2e}
+\input docstrip.tex
+\InputIfFileExists{ltxpkg.tex}{}{}
+\askforoverwritefalse
+\keepsilent
+
+\preamble
+^^J^^J
+Copyright (C) 1998-2002, 2004-2007, 2009, 2013, 2017-2019 Didier Verna^^J
+This file is part of FiXme.^^J
+FiXme may be distributed and/or modified under the conditions of the LaTeX
+Project Public License, either version 1.3 of this license or (at your option)
+any later version. The latest version of this license is in
+http://www.latex-project.org/lppl.txt and version 1.3 or later is part of all
+distributions of LaTeX version 2005/12/01 or later.^^J
+FiXme consists of the files listed in the file `README'.^^J
+\endpreamble
+
+\BaseDirectory{.}
+\DeclareDir{themes}{themes}
+\DeclareDir{layouts}{layouts}
+\DeclareDir{envlayouts}{layouts/env}
+\DeclareDir{targetlayouts}{layouts/target}
+\generate{
+ \file{header.inc}{\from{fixme.dtx}{header}}
+ \file{fixme.sty}{\from{fixme.dtx}{header,fixme}}}
+\generate{\usedir{themes}
+ \file{fxthemesignature.sty}{\from{fixme.dtx}{fxthemesignature}}
+ \file{fxthemecolor.sty}{\from{fixme.dtx}{fxthemecolor}}
+ \file{fxthemecolorsig.sty}{\from{fixme.dtx}{fxthemecolorsig}}}
+%% #### FIXME: it seems that too many commands in \generate breaks ltxpkg (I
+%% don't understand why): after a couple of outputs, the rest happens on
+%% stdout instead of on the \newwrite, so I've split the command below in 3.
+\generate{\usedir{layouts}
+ \file{fxlayoutmarginnote.sty}{\from{fixme.dtx}{fxlayoutmarginnote}}
+ \file{fxlayoutpdfnote.sty}{\from{fixme.dtx}{fxlayoutpdfnote}}
+ \file{fxlayoutpdfmargin.sty}{\from{fixme.dtx}{fxlayoutpdfmargin}}}
+\generate{\usedir{layouts}
+ \file{fxlayoutpdfsignote.sty}{\from{fixme.dtx}{fxlayoutpdfsignote}}
+ \file{fxlayoutpdfsigmargin.sty}{\from{fixme.dtx}{fxlayoutpdfsigmargin}}
+ \file{fxlayoutpdfcnote.sty}{\from{fixme.dtx}{fxlayoutpdfcnote}}}
+\generate{\usedir{layouts}
+ \file{fxlayoutpdfcmargin.sty}{\from{fixme.dtx}{fxlayoutpdfcmargin}}
+ \file{fxlayoutpdfcsignote.sty}{\from{fixme.dtx}{fxlayoutpdfcsignote}}
+ \file{fxlayoutpdfcsigmargin.sty}{\from{fixme.dtx}{fxlayoutpdfcsigmargin}}}
+\generate{\usedir{envlayouts}
+ \file{fxenvlayoutcolor.sty}{\from{fixme.dtx}{fxenvlayoutcolor}}
+ \file{fxenvlayoutcolorsig.sty}{\from{fixme.dtx}{fxenvlayoutcolorsig}}}
+\generate{\usedir{targetlayouts}
+ \file{fxtargetlayoutchangebar.sty}{\from{fixme.dtx}{fxtargetlayoutchangebar}}
+ \file{fxtargetlayoutcolor.sty}{\from{fixme.dtx}{fxtargetlayoutcolor}}
+ \file{fxtargetlayoutcolorcb.sty}{\from{fixme.dtx}{fxtargetlayoutcolorcb}}}
+
+\endbatchfile
+
+%%% fixme.ins ends here
diff --git a/macros/latex/contrib/fixme/fixme.pdf b/macros/latex/contrib/fixme/fixme.pdf
new file mode 100644
index 0000000000..47c6d8f161
--- /dev/null
+++ b/macros/latex/contrib/fixme/fixme.pdf
Binary files differ