From bd8c84d3086241f36de1b38eec9ca56b3672af31 Mon Sep 17 00:00:00 2001
From: Karl Berry <karl@freefriends.org>
Date: Mon, 21 Sep 2009 22:54:55 +0000
Subject: fixme 4.0 (21sep09)

git-svn-id: svn://tug.org/texlive/trunk@15411 c570f23f-e606-0410-a88d-b1316a301751
---
 Master/texmf-dist/tex/latex/fixme/fixme.sty | 1067 ++++++++++++++++-----------
 1 file changed, 656 insertions(+), 411 deletions(-)

(limited to 'Master/texmf-dist/tex/latex/fixme/fixme.sty')

diff --git a/Master/texmf-dist/tex/latex/fixme/fixme.sty b/Master/texmf-dist/tex/latex/fixme/fixme.sty
index 3b1f4677662..91683fa26bc 100644
--- a/Master/texmf-dist/tex/latex/fixme/fixme.sty
+++ b/Master/texmf-dist/tex/latex/fixme/fixme.sty
@@ -4,7 +4,7 @@
 %%
 %% The original source files were:
 %%
-%% fixme.dtx 
+%% fixme.dtx  (with options: `header,fixme')
 %% 
 
 
@@ -39,68 +39,104 @@
 %%   Grave accent  \`     Left brace    \{     Vertical bar  \|
 %%   Right brace   \}     Tilde         \~}
 \NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{fixme}[2009/07/16 v3.4
-Insert fixme notes in your documents]
+\ProvidesPackage{fixme}[2009/09/21 v4.0 Insert fixme notes in your documents]
 
 \RequirePackage{ifthen}
 \RequirePackage{verbatim}
-
-\newcommand*\fixmelogo{\textsf{FiXme}}
-
+\RequirePackage{xkeyval}[2006/11/18]
+
+\newcommand\fixmelogo{\textsf{FiXme}}
+
+\newcommand\@fxpkginfo{\PackageInfo{FiXme}}
+\newcommand\@fxpkgwarning{\PackageWarning{FiXme}}
+\newcommand\@fxpkgerror{\PackageError{FiXme}}
+
+\newcommand\@fxkeyifundefined{\key@ifundefined[fx]}
+\newcommand\@fxdefinekey{\define@key[fx]}
+\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}}
+\newcommand*\@fxdefinevoidkey[3]{%
+  \define@key[fx]{#1}{#2}[]{%
+    \ifthenelse{\equal{##1}{}}{%
+      #3}{%
+      \@fxvoidkeyerror{#2}{##1}}}}
+
+\newcommand*\@fxdefineboolkey[3][]{%
+  \define@boolkey[fx]{#2}{#3}[true]{#1}
+  \@fxdefinevoidkey{#2}{no#3}{\@nameuse{fx@#2@#3}{false}}}
+
+\newcommand\@fxdefinecmdkey{\define@cmdkey[fx]}
+
+\newcommand\@fxdefinechoicekey{\define@choicekey[fx]}
+
+\newcommand\@fxsetkeys{\setkeys[fx]}
+%%      Note: currently unused
+%%      \newcommand\@fxpresetkeys{\presetkeys[fx]}
 \let\l@fixme\l@figure
-\newcommand\listoffixmes{}
-\def\listoffixmes@final{}
-\def\listoffixmes@draft{%
-  \IfFileExists{\jobname .lox}{%
-    \@listoffixmes@pretoc%
-    \@starttoc{lox}%
-    \@listoffixmes@posttoc}{%
-    \@starttoc{lox}}}
-
-\def\listoffixmes@draft@ams{\@starttoc{lox}\listfixmename}
+\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}
+\newcommand*\fxcontentsline[2]{%
+  \begingroup%
+  \let\@dottedtocline\@fxdottedtocline%
+  \l@fixme{#1}{#2}%
+  \endgroup}
 
-\newcommand*\listfixmename{}
+\newcommand*\fxaddcontentsline[1]{%
+  \ifthenelse{\equal{\cmdfx@note@target}{thepage}}{%
+    \addcontentsline{lox}{fixme}{#1}}{%
+    \addtocontents{lox}{\protect\fxcontentsline{#1}{\cmdfx@note@target}}}}
 
-\def\@listoffixmes@pretoc@article{%
-  \section*{\listfixmename%
-    \@mkboth{\MakeUppercase\listfixmename}{\MakeUppercase\listfixmename}}%
-  }
-\def\@listoffixmes@posttoc@article{}
+\newcommand\@lox@prtc@article{%
+  \section*{\@fxlistfixmename%
+    \@mkboth{\MakeUppercase\@fxlistfixmename}{\MakeUppercase\@fxlistfixmename}}}
+\let\@lox@psttc@article\relax
 
-\def\@listoffixmes@pretoc@report{%
+\newcommand\@lox@prtc@report{%
   \if@twocolumn
     \@restonecoltrue\onecolumn
   \else
     \@restonecolfalse
   \fi
-  \chapter*{\listfixmename%
-    \@mkboth{\MakeUppercase\listfixmename}{\MakeUppercase\listfixmename}}%
-  }
-\def\@listoffixmes@posttoc@report{\if@restonecol\twocolumn\fi}
+  \chapter*{\@fxlistfixmename%
+    \@mkboth{\MakeUppercase\@fxlistfixmename}{\MakeUppercase\@fxlistfixmename}}}
+\newcommand\@lox@psttc@report{\if@restonecol\twocolumn\fi}
 
-\def\@listoffixmes@pretoc@book{%
+\newcommand\@lox@prtc@book{%
   \if@twocolumn
     \@restonecoltrue\onecolumn
   \else
     \@restonecolfalse
   \fi
-  \chapter*{\listfixmename%
-    \@mkboth{\MakeUppercase\listfixmename}{\MakeUppercase\listfixmename}}%
-  }
-\def\@listoffixmes@posttoc@book{\if@restonecol\twocolumn\fi}
+  \chapter*{\@fxlistfixmename%
+    \@mkboth{\MakeUppercase\@fxlistfixmename}{\MakeUppercase\@fxlistfixmename}}}
+\newcommand\@lox@psttc@book{\if@restonecol\twocolumn\fi}
 
-\newcommand*\lox@heading{\float@listhead{\listfixmename}}
+\newcommand\lox@heading{\float@listhead{\@fxlistfixmename}}
 
-\def\@listoffixmes@pretoc@scrartcl{%
+\newcommand\@lox@prtc@scrartcl{%
   \begingroup%
     \lox@heading%
-    \setparsizes{0}{0}{\z@\@plus 1fil}\par@updaterelative
-  }
-\def\@listoffixmes@posttoc@scrartcl{%
-  \endgroup
-  }
+    \setparsizes{0}{0}{\z@\@plus 1fil}\par@updaterelative}
+\let\@lox@psttc@scrartcl\endgroup
 
-\def\@listoffixmes@pretoc@scrreprt{%
+\newcommand\@lox@prtc@scrreprt{%
   \begingroup%
     \if@twocolumn
       \@restonecoltrue\onecolumn
@@ -108,14 +144,12 @@ Insert fixme notes in your documents]
       \@restonecolfalse
     \fi
     \lox@heading%
-    \setparsizes{0}{0}{\z@\@plus 1fil}\par@updaterelative
-  }
-\def\@listoffixmes@posttoc@scrreprt{%
+    \setparsizes{0}{0}{\z@\@plus 1fil}\par@updaterelative}
+\newcommand\@lox@psttc@scrreprt{%
     \if@restonecol\twocolumn\fi
-  \endgroup
-  }
+  \endgroup}
 
-\def\@listoffixmes@pretoc@scrbook{%
+\newcommand\@lox@prtc@scrbook{%
   \begingroup%
     \if@twocolumn
       \@restonecoltrue\onecolumn
@@ -123,386 +157,597 @@ Insert fixme notes in your documents]
       \@restonecolfalse
     \fi
     \lox@heading%
-    \setparsizes{0}{0}{\z@\@plus 1fil}\par@updaterelative
-}
-\def\@listoffixmes@posttoc@scrbook{%
+    \setparsizes{0}{0}{\z@\@plus 1fil}\par@updaterelative}
+\newcommand\@lox@psttc@scrbook{%
     \if@restonecol\twocolumn\fi
+  \endgroup}
+
+\let\lox@final\relax
+\newcommand\lox@draft{%
+  \IfFileExists{\jobname .lox}{%
+    \@lox@prtc%
+    \@starttoc{lox}%
+    \@lox@psttc}{%
+    \@starttoc{lox}}}
+\newcommand\lox@draft@ams{\@starttoc{lox}\@fxlistfixmename}
+
+\newcommand*\fxsetface[2]{\@fxsetkeys{face}{#1face=#2}}
+\newcommand*\@fxnewface[2][]{%
+  \@fxdefinecmdkey{face}{#2face}{}%
+  \fxsetface{#2}{#1}}
+\newcommand*\@fxuseface[1]{\@nameuse{cmdfx@face@#1face}}
+
+\@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}}
+
+\let\@fxearlylayouts\empty
+\let\@fxlatelayouts\empty
+\newcommand*\FXProvidesLayout[1]{\ProvidesPackage{fxlayout#1}}
+\def\@FXRegisterLayout#1[#2]#3#4{%
+  \@fxkeyifundefined{layout}{#3}{%
+    \@fxdefineboolkey[#2]{layout}{#3}%
+    \expandafter\def\csname @fxlayout@#3\endcsname{#4}%
+    \expandafter\ifx\csname @fx#1layouts\endcsname\empty%
+      \expandafter\g@addto@macro\csname @fx#1layouts\endcsname{#3}%
+    \else%
+      \expandafter\g@addto@macro\csname @fx#1layouts\endcsname{,#3}%
+    \fi}{%
+    \@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.}}}
+\newcommand\FXRegisterLayout{%
+  \@ifstar{%
+    \@ifnextchar[%]
+    {\@FXRegisterLayout{early}}{\@FXRegisterLayout{early}[]}}{%
+    \@ifnextchar[%]
+    {\@FXRegisterLayout{late}}{\@FXRegisterLayout{late}[]}}}
+
+\@fxnewface{margin}
+\newcommand*\FXLayoutMargin[3]{%
+  \marginpar[%
+  \raggedleft\@fxuseface{margin}\ignorespaces#3 \fxnotename{#1}: #2]{%
+    \raggedright\@fxuseface{margin}\ignorespaces#3 \fxnotename{#1}: #2}}
+\FXRegisterLayout*[%
+  \ifthenelse{\boolean{fx@layout@margin}\and\boolean{fx@layout@marginclue}}{%
+    \@fxpkgwarning{%
+      marginal notes requested;\MessageBreak
+      turning marginal clues off}%
+    \fx@layout@marginclue{false}}]{%
+    margin}{\FXLayoutMargin}
+\newcommand*\FXLayoutMarginClue[3]{%
+  \marginpar[%
+  \raggedleft\@fxuseface{margin}\ignorespaces#3 \fxnotename{#1}!]{%
+    \raggedright\@fxuseface{margin}\ignorespaces#3 \fxnotename{#1}!}}
+\FXRegisterLayout*[%
+  \ifthenelse{\boolean{fx@layout@marginclue}\and\boolean{fx@layout@margin}}{%
+    \@fxpkgwarning{%
+      marginal clues requested;\MessageBreak
+      turning marginal notes off}%
+    \fx@layout@margin{false}}]{%
+    marginclue}{\FXLayoutMarginClue}
+\newcommand*\FXLayoutFootnote[3]{%
+  \footnote{\ignorespaces#3 \fxnotename{#1}: #2}}
+\FXRegisterLayout{footnote}{\FXLayoutFootnote}
+\@fxnewface{inline}
+\newcommand*\FXLayoutInline[3]{%
+  {\@fxuseface{inline}\ignorespaces#3 \fxnotename{#1}: #2}}
+\FXRegisterLayout{inline}{\FXLayoutInline}
+\newcommand\fixmeindexname{\fixmelogo}
+\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
-}
-
-\newcommand\FXInline[2]{%
-  \textbf{#1}: \emph{#2}}
-\newcommand\FXMargin[2]{%
-  \marginpar[\footnotesize\raggedleft\textbf{#1}: \emph{#2}]{%
-    \footnotesize\raggedright\textbf{#1}: \emph{#2}}}
-\newcommand\FXMarginClue[1]{%
-  \marginpar[\footnotesize\raggedleft\textbf{#1}~!]{%
-    \footnotesize\raggedright\textbf{#1}~!}}
-\newcommand\FXFootnote[2]{%
-  \footnote{\textbf{#1}: \emph{#2}}}
-
-\newcommand*\fixmeindexname{}
-\newcommand\FXIndex[1]{%
-  \index{***@\fixmeindexname:!#1}}
-
-\newcommand*\fixmefatalprefix{}
-\newcommand\FiXmeInline[1]{\FXInline{\fixmefatalprefix}{#1}}
-\newcommand\FiXmeMargin[1]{\FXMargin{\fixmefatalprefix}{#1}}
-\newcommand\FiXmeFootnote[1]{\FXFootnote{\fixmefatalprefix}{#1}}
-\newcommand\FiXmeUser[1]{}
-\let\FiXmeUser\empty
-
-\newcommand\FiXmeIndex[1]{\FXIndex{#1}}
-\newcommand\FiXmeInfo[1]{}
-\newcommand\FiXmeWarning[1]{}
-
-\newif\iffixme@inline
-\newif\iffixme@margin
-\newif\iffixme@marginclue
-\newif\iffixme@footnote
-\newif\iffixme@user
-\newif\iffixme@index
-
-\let\fixme@setinline\fixme@inlinetrue
-\def\fixme@setmargin{%
-  \iffixme@marginclue%
-    \PackageWarning{FiXme}{%
-      Marginal notes requested; turning marginal clues off}%
-    \fixme@margincluefalse%
-  \fi%
-  \fixme@margintrue}
-\def\fixme@setmarginclue{%
-  \iffixme@margin%
-    \PackageWarning{FiXme}{%
-      Marginal clues requested; turning marginal notes off}%
-    \fixme@marginfalse%
-  \fi%
-  \fixme@margincluetrue}
-\let\fixme@setfootnote\fixme@footnotetrue
-\let\fixme@setuser\fixme@usertrue
-\let\fixme@setindex\fixme@indextrue
-
-\def\fixme@text#1#2{%
-  \iffixme@inline\FXInline{#1}{#2}\fi%
-  \iffixme@margin\FXMargin{#1}{#2}\fi%
-  \iffixme@marginclue\FXMarginClue{#1}\fi%
-  \iffixme@footnote\FXFootnote{#1}{#2}\fi%
-  \iffixme@user\FXUser{#1}{#2}\fi}
-
-\DeclareOption{inline}{\fixme@setinline}
-\DeclareOption{noinline}{\fixme@inlinefalse}
-\DeclareOption{margin}{\fixme@setmargin}
-\DeclareOption{nomargin}{\fixme@marginfalse}
-\DeclareOption{marginclue}{\fixme@setmarginclue}
-\DeclareOption{nomarginclue}{\fixme@margincluefalse}
-\DeclareOption{footnote}{\fixme@footnotetrue}
-\DeclareOption{nofootnote}{\fixme@footnotefalse}
-\DeclareOption{user}{\fixme@usertrue}
-\DeclareOption{nouser}{\fixme@userfalse}
-\DeclareOption{index}{\fixme@indextrue}
-\DeclareOption{noindex}{\fixme@indexfalse}
-
-\DeclareOption{info}{}
-\DeclareOption{noinfo}{}
-\DeclareOption{warning}{}
-\DeclareOption{nowarning}{}
-
-\newcommand\FXNote[1]{%
+  \@esphack}
+\newcommand\@fxnotekey{***a}
+\newcommand\@fxwarningkey{***b}
+\newcommand\@fxerrorkey{***c}
+\newcommand\@fxfatalkey{***d}
+\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}
+\FXRegisterLayout{index}{\FXLayoutIndex}
+\newcommand*\FXLayoutContentsLine[3]{%
+  \iffx@mode@multiuser%
+    \fxaddcontentsline{\ignorespaces#3 \fxnotename{#1}: #2}%
+  \else%
+    \fxaddcontentsline{\fxnotename{#1}: #2}%
+  \fi}
+
+\newcommand*\fxloadlayouts[1]{%
+  \edef\@fxlts{\zap@space#1 \@empty}%
+  \@for\@fxlt:=\@fxlts\do{\usepackage{fxlayout#1}}}
+
+\def\@fxparselayout#1#2#3\relax{\def\@fxltprefix{#1#2}\def\@fxltrest{#3}}
+\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
+
+\@fxdefinecmdkey{layout}{innerlayout}{}
+\@fxdefinekey{layout}{morelayout}{\fxuselayouts{#1}}
+\@fxdefinekey{layout}{layout}{%
+  \edef\@fxlayouts{\@fxearlylayouts,\@fxlatelayouts}%
+  \@for\@fxlt:=\@fxlayouts\do{%
+    \@nameuse{fx@layout@\@fxlt}{false}}%
+  \fxuselayouts{#1}}
+
+\newcommand*\FXProvidesEnvLayout[1]{\ProvidesPackage{fxenvlayout#1}}
+\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.}}}
+
+\@fxnewface{env}
+\newcommand*\FXEnvLayoutPlainBegin[2]{%
+  \@fxuseface{env}\ignorespaces#2 \fxnotename{#1}: \ignorespaces}
+\newcommand*\FXEnvLayoutPlainEnd[2]{}
+\FXRegisterEnvLayout{plain}{\FXEnvLayoutPlainBegin}{\FXEnvLayoutPlainEnd}
+
+\@fxnewface[\itshape]{signature}
+\newcommand*\@fxdosig[1]{%
+  \ifthenelse{\equal{#1}{}}{\def\@fxsignature{}}{%
+    \def\@fxsignature{ -- {\@fxuseface{signature}#1}}}}
+\newcommand*\FXEnvLayoutSignatureBegin[2]{%
+  \@fxuseface{env}\fxnotename{#1}: \ignorespaces}
+\newcommand*\FXEnvLayoutSignatureEnd[2]{\@fxdosig{#2}\@fxsignature}
+\FXRegisterEnvLayout{signature}{%
+  \FXEnvLayoutSignatureBegin}{\FXEnvLayoutSignatureEnd}
+
+\newcommand*\@fxselectenvlayout[1]{%
+  \expandafter\let\expandafter\@fxenvlayout@begin%
+    \csname @fxenvlayout@#1@begin\endcsname%
+  \expandafter\let\expandafter\@fxenvlayout@end%
+    \csname @fxenvlayout@#1@end\endcsname}
+
+\newcommand*\fxloadenvlayouts[1]{%
+  \edef\@fxlts{\zap@space#1 \@empty}%
+  \@for\@fxlt:=\@fxlts\do{\usepackage{fxenvlayout#1}}}
+
+\newcommand*\fxuseenvlayout[1]{%
+  \@ifundefined{@fxenvlayout@#1@begin}{\fxloadenvlayouts{#1}}{}%
+  \@fxselectenvlayout{#1}}
+\let\FXRequireEnvLayout\fxuseenvlayout
+\@fxdefinekey{envlayout}{envlayout}{\fxuseenvlayout{#1}}
+
+\newcommand*\FXProvidesTargetLayout[1]{\ProvidesPackage{fxtargetlayout#1}}
+\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.}}}
+
+\@fxnewface{target}
+\newcommand\FXTargetLayoutPlain[2]{\@fxuseface{target}#2}
+\FXRegisterTargetLayout{plain}{\FXTargetLayoutPlain}
+
+\newcommand*\@fxselecttargetlayout[1]{%
+  \expandafter\let\expandafter\@@fxtargetlayout%
+    \csname @fxtargetlayout@#1\endcsname}
+
+\newcommand*\fxloadtargetlayouts[1]{%
+  \edef\@fxlts{\zap@space#1 \@empty}%
+  \@for\@fxlt:=\@fxlts\do{\usepackage{fxtargetlayout#1}}}
+
+\newcommand*\fxusetargetlayout[1]{%
+  \@ifundefined{@fxtargetlayout@#1}{\fxloadtargetlayouts{#1}}{}%
+  \@fxselecttargetlayout{#1}}
+\let\FXRequireTargetLayout\fxusetargetlayout
+\@fxdefinekey{targetlayout}{targetlayout}{\fxusetargetlayout{#1}}
+
+\newcommand\@fxtargetlayout@final[2]{#2}
+\newcommand\@fxtargetlayout@draft[2]{%
+  \begingroup\@@fxtargetlayout{#1}{#2}\endgroup}
+
+\newcommand*\FXLogNote[1]{%
   \GenericInfo{%
     (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
-    Package FiXme Note: `#1'}}
-\newcommand\FXWarning[1]{%
-  \PackageWarning{FiXme}{`#1'}}
-\newcommand\FXError[1]{%
+    FiXme Note: '#1'}}
+\newcommand*\FXLogWarning[1]{%
   \GenericWarning{%
     (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
-    Package FiXme Error: `#1'}}
-\newcommand\FXFatal[1]{%
+    FiXme Warning: '#1'}}
+\newcommand*\FXLogError[1]{%
   \GenericWarning{%
     (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
-    Package FiXme: `#1'}}
+    FiXme Error: '#1'}}
+\newcommand*\FXLogFatal[1]{%
+  \GenericWarning{%
+    (FiXme)\@spaces\@spaces\@spaces\@spaces}{%
+    FiXme Fatal Error: '#1'}}
 
-\newif\iffixme@silent
+\def\@fxlog@note{\FXLogNote}
+\def\@fxlog@warning{\FXLogWarning}
+\def\@fxlog@error{\FXLogError}
+\def\@fxlog@fatal{\FXLogFatal}
 
-%% Options that control whether to be silent or not:
-\DeclareOption{silent}{\fixme@silenttrue}
-\DeclareOption{nosilent}{\fixme@silentfalse}
+\@fxdefineboolkey{log}{silent}
 
 \newcounter{fixmecount}
-\newcounter{fixmenotecount}
-\newcounter{fixmewarningcount}
-\newcounter{fixmeerrorcount}
-\newcounter{fixmefatalcount}
-
-\newcommand*\fixmenoteprefix{}
-\newcommand*\fixmenoteindexname{}
-\def\fixme@note@draft#1{%
-  \fixme@text{\fixmenoteprefix}{#1}%
-  \iffixme@index\FXIndex{\fixmenoteindexname\thefixmenotecount: #1}\fi%
-  \iffixme@silent\else\FXNote{#1}\fi%
-  \addcontentsline{lox}{fixme}{\protect\fixmenoteprefix: #1}}
-\def\fixme@note@final#1{%
-  \iffixme@silent\else\FXNote{#1}\fi%
-  \addcontentsline{lox}{fixme}{\protect\fixmenoteprefix: #1}}
-
-\newcommand*\fixmewarningprefix{}
-\newcommand*\fixmewarningindexname{}
-\def\fixme@warning@draft#1{%
-  \fixme@text{\fixmewarningprefix}{#1}%
-  \iffixme@index\FXIndex{\fixmewarningindexname\thefixmewarningcount: #1}\fi%
-  \iffixme@silent\else\FXWarning{#1}\fi%
-  \addcontentsline{lox}{fixme}{\protect\fixmewarningprefix: #1}}
-\def\fixme@warning@final#1{%
-  \iffixme@silent\else\FXWarning{#1}\fi%
-  \addcontentsline{lox}{fixme}{\protect\fixmewarningprefix: #1}}
-
-\newcommand*\fixmeerrorprefix{}
-\newcommand*\fixmeerrorindexname{}
-\def\fixme@error@draft#1{%
-  \fixme@text{\fixmeerrorprefix}{#1}%
-  \iffixme@index\FXIndex{\fixmeerrorindexname\thefixmeerrorcount: #1}\fi%
-  \iffixme@silent\else\FXError{#1}\fi%
-  \addcontentsline{lox}{fixme}{\protect\fixmeerrorprefix: #1}}
-\def\fixme@error@final#1{%
-  \iffixme@silent\else\FXError{#1}\fi%
-  \addcontentsline{lox}{fixme}{\protect\fixmeerrorprefix: #1}}
-
-\newcommand*\fixmefatalindexname{}
-\def\fixme@fatal@draft#1{%
-  \iffixme@inline\FiXmeInline{#1}\fi%
-  \iffixme@margin\FiXmeMargin{#1}\fi%
-  \iffixme@marginclue\FXMarginClue{\fixmefatalprefix}\fi%
-  \iffixme@footnote\FiXmeFootnote{#1}\fi%
-  \iffixme@user\FiXmeUser{#1}\fi%
-  \iffixme@index\FiXmeIndex{%
-    \fixmefatalindexname\thefixmefatalcount: #1}\fi%
-  \iffixme@silent\else\FXFatal{#1}\fi%
-  \addcontentsline{lox}{fixme}{\protect\fixmefatalprefix: #1}}
-\def\fixme@fatal@final#1{%
-  \PackageError{FiXme}{`#1' fixme left in final version}{%
-    You are processing your document in final mode,\MessageBreak
-    but you still have some critical FiXme's left behind.\MessageBreak
-    Type X to quit, fix your document, and rerun LaTeX.}}
-
-\def\@@fixme#1#2{%
-  \stepcounter{fixmecount}%
-  \stepcounter{fixme#1count}%
-  \csname fixme@#1\endcsname{#2}}
-\def\@fixme#1[#2]#3{%
-  \bgroup%
-  \fixme@inlinefalse%
-  \fixme@marginfalse%
-  \fixme@margincluefalse%
-  \fixme@footnotefalse%
-  \fixme@userfalse%
-  \fixme@indexfalse%
-  \@for\fixme@option:=#2\do{%
-    \expandafter\ifx\csname fixme@\fixme@option true\endcsname\relax
-      \PackageError{FiXme}{Unknown layout option `\fixme@option'}{%
-You have given an invalid option to \string\fixme, or an \string\fx %
-command.\MessageBreak
-Valid options are `inline', `margin', `marginclue', `footnote', %
-`user',\MessageBreak
-and `index'.\MessageBreak
-Type X to quit, fix your document, and rerun LaTeX.}%
-      \else%
-      \csname fixme@set\fixme@option\endcsname%
-    \fi}%
-  \@@fixme{#1}{#3}%
-  \egroup}
-\DeclareRobustCommand\fxnote{\@ifnextchar[%]
-  {\@fixme{note}}{\@@fixme{note}}}
-\DeclareRobustCommand\fxwarning{\@ifnextchar[%]
-  {\@fixme{warning}}{\@@fixme{warning}}}
-\DeclareRobustCommand\fxerror{\@ifnextchar[%]
-  {\@fixme{error}}{\@@fixme{error}}}
-\DeclareRobustCommand\fixme{\@ifnextchar[%]
-  {\@fixme{fatal}}{\@@fixme{fatal}}}
-
-\newcommand\FXEnvBegin{\begin{quotation}}
-\newcommand\FXEnvEnd{\end{quotation}}
-
-\def\@fxenvbegin@draft#1#2{%
-  \FXEnvBegin
-  \edef\fixme@args{inline%
-    \iffixme@index,index\fi%
-    \iffixme@marginclue,marginclue\fi}%
-  \csname#1\endcsname[\fixme@args]{#2}}
-\def\@fxenvbegin@final#1#2{
-  \edef\fixme@args{inline%
-    \iffixme@index,index\fi%
-    \iffixme@marginclue,marginclue\fi}%
-  \csname#1\endcsname[\fixme@args]{#2}
-  \comment
-}
-
-\def\@fxenvend@draft{\FXEnvEnd}
-\def\@fxenvend@final{\endcomment}
-
-\newenvironment{anfxnote}[1][]{%
-  \@fxenvbegin{fxnote}{#1}}{%
-  \@fxenvend}
-\newenvironment{anfxwarning}[1][]{%
-  \@fxenvbegin{fxwarning}{#1}}{%
-  \@fxenvend}
-\newenvironment{anfxerror}[1][]{%
-  \@fxenvbegin{fxerror}{#1}}{%
-  \@fxenvend}
-\newenvironment{afixme}[1][]{%
-  \@fxenvbegin{fixme}{#1}}{%
-  \@fxenvend}
-
-\DeclareOption{english}{%
-  \renewcommand*\fixmenoteprefix{\fixmelogo\nobreakspace Note}
-  \renewcommand*\fixmewarningprefix{\fixmelogo\nobreakspace Warning}
-  \renewcommand*\fixmeerrorprefix{\fixmelogo\nobreakspace Error}
-  \renewcommand*\fixmefatalprefix{\fixmelogo}
-  \renewcommand*\fixmeindexname{\fixmelogo}
-  \renewcommand*\fixmenoteindexname{**a@Notes:!}
-  \renewcommand*\fixmewarningindexname{**b@Warnings:!}
-  \renewcommand*\fixmeerrorindexname{**c@Errors:!}
-  \renewcommand*\fixmefatalindexname{}
-  \renewcommand*{\listfixmename}{List of Corrections}}
-\DeclareOption{french}{%
-  \renewcommand*\fixmenoteprefix{\fixmelogo\nobreakspace Note}
-  \renewcommand*\fixmewarningprefix{\fixmelogo\nobreakspace Attention}
-  \renewcommand*\fixmeerrorprefix{\fixmelogo\nobreakspace Erreur}
-  \renewcommand*\fixmefatalprefix{\fixmelogo}
-  \renewcommand*\fixmeindexname{\fixmelogo}
-  \renewcommand*\fixmenoteindexname{**a@Notes:!}
-  \renewcommand*\fixmewarningindexname{**b@Avertissements:!}
-  \renewcommand*\fixmeerrorindexname{**c@Erreurs:!}
-  \renewcommand*\fixmefatalindexname{}
-  \renewcommand*{\listfixmename}{Liste des Corrections}}
-\DeclareOption{francais}{\ExecuteOptions{french}}
-\DeclareOption{spanish}{%
-  \renewcommand*\fixmenoteprefix{\fixmelogo\nobreakspace Nota}
-  \renewcommand*\fixmewarningprefix{\fixmelogo\nobreakspace Aviso}
-  \renewcommand*\fixmeerrorprefix{\fixmelogo\nobreakspace Error}
-  \renewcommand*\fixmefatalprefix{\fixmelogo}
-  \renewcommand*\fixmeindexname{\fixmelogo}
-  \renewcommand*\fixmenoteindexname{**a@Notas:!}
-  \renewcommand*\fixmewarningindexname{**b@Avisos:!}
-  \renewcommand*\fixmeerrorindexname{**c@Errores:!}
-  \renewcommand*\fixmefatalindexname{}
-  \renewcommand*{\listfixmename}{Lista de Correcciones}}
-\DeclareOption{italian}{%
-  \renewcommand*\fixmenoteprefix{\fixmelogo\nobreakspace Nota}
-  \renewcommand*\fixmewarningprefix{\fixmelogo\nobreakspace Avviso}
-  \renewcommand*\fixmeerrorprefix{\fixmelogo\nobreakspace Errore}
-  \renewcommand*\fixmefatalprefix{\fixmelogo}
-  \renewcommand*\fixmeindexname{\fixmelogo}
-  \renewcommand*\fixmenoteindexname{**a@Note:!}
-  \renewcommand*\fixmewarningindexname{**b@Avvisi:!}
-  \renewcommand*\fixmeerrorindexname{**c@Errori:!}
-  \renewcommand*\fixmefatalindexname{}
-  \renewcommand*{\listfixmename}{Corrigenda}}
-\DeclareOption{german}{%
-  \renewcommand*\fixmenoteprefix{\fixmelogo\nobreakspace Anm}
-  \renewcommand*\fixmewarningprefix{\fixmelogo\nobreakspace Warnung}
-  \renewcommand*\fixmeerrorprefix{\fixmelogo\nobreakspace Fehler}
-  \renewcommand*\fixmefatalprefix{\fixmelogo}
-  \renewcommand*\fixmeindexname{\fixmelogo}
-  \renewcommand*\fixmenoteindexname{**a@Anmerkungen:!}
-  \renewcommand*\fixmewarningindexname{**b@Warnungen:!}
-  \renewcommand*\fixmeerrorindexname{**c@Fehler:!}
-  \renewcommand*\fixmefatalindexname{}
-  \renewcommand*{\listfixmename}{Verzeichnis der Korrekturen}}
-\DeclareOption{ngerman}{%
-  \ExecuteOptions{german}}
-\DeclareOption{danish}{%
-  \renewcommand*\fixmenoteprefix{\fixmelogo\nobreakspace Note}
-  \renewcommand*\fixmewarningprefix{\fixmelogo\nobreakspace Advarsel}
-  \renewcommand*\fixmeerrorprefix{\fixmelogo\nobreakspace Fejl}
-  \renewcommand*\fixmefatalprefix{\fixmelogo}
-  \renewcommand*\fixmeindexname{\fixmelogo}
-  \renewcommand*\fixmenoteindexname{**a@Noter:!}
-  \renewcommand*\fixmewarningindexname{**b@Advarsler:!}
-  \renewcommand*\fixmeerrorindexname{**c@Fejl:!}
-  \renewcommand*\fixmefatalindexname{}
-  \renewcommand*{\listfixmename}{Rettelser}}
-\DeclareOption{croatian}{%
-  \renewcommand*\fixmenoteprefix{\fixmelogo\nobreakspace Poruka}
-  \renewcommand*\fixmewarningprefix{\fixmelogo\nobreakspace Upozorenje}
-  \renewcommand*\fixmeerrorprefix{\fixmelogo\nobreakspace Gre\v ska}
-  \renewcommand*\fixmefatalprefix{\fixmelogo}
-  \renewcommand*\fixmeindexname{\fixmelogo}
-  \renewcommand*\fixmenoteindexname{**a@Poruke:!}
-  \renewcommand*\fixmewarningindexname{**b@Upozorenja:!}
-  \renewcommand*\fixmeerrorindexname{**c@Greske:!}
-  \renewcommand*\fixmefatalindexname{}
-  \renewcommand*{\listfixmename}{Popis korekcija}}
-
-\DeclareOption{final}{
-  \let\fixme@note\fixme@note@final
-  \let\fixme@warning\fixme@warning@final
-  \let\fixme@error\fixme@error@final
-  \let\fixme@fatal\fixme@fatal@final
-  \let\@fxenvbegin\@fxenvbegin@final
-  \let\@fxenvend\@fxenvend@final
-  \let\listoffixmes\listoffixmes@final
-  }
-
-\DeclareOption{draft}{
-  \@ifclassloaded{article}{
-    \let\@listoffixmes@pretoc\@listoffixmes@pretoc@article
-    \let\@listoffixmes@posttoc\@listoffixmes@posttoc@article}{
-    \@ifclassloaded{report}{
-      \let\@listoffixmes@pretoc\@listoffixmes@pretoc@report
-      \let\@listoffixmes@posttoc\@listoffixmes@posttoc@report}{
-      \@ifclassloaded{book}{
-\let\@listoffixmes@pretoc\@listoffixmes@pretoc@book
-\let\@listoffixmes@posttoc\@listoffixmes@posttoc@book}{
-\@ifclassloaded{scrartcl}{
-  \let\@listoffixmes@pretoc\@listoffixmes@pretoc@scrartcl
-  \let\@listoffixmes@posttoc\@listoffixmes@posttoc@scrartcl}{
-  \@ifclassloaded{scrreprt}{
-    \let\@listoffixmes@pretoc\@listoffixmes@pretoc@scrreprt
-    \let\@listoffixmes@posttoc\@listoffixmes@posttoc@scrreprt}{
-    \@ifclassloaded{scrbook}{
-      \let\@listoffixmes@pretoc\@listoffixmes@pretoc@scrbook
-      \let\@listoffixmes@posttoc\@listoffixmes@posttoc@scrbook}{
-      \@ifclassloaded{amsbook}{
-\let\listoffixmes@draft\listoffixmes@draft@ams}{
-\@ifclassloaded{amsart}{
-  \let\listoffixmes@draft\listoffixmes@draft@ams}{
-  %% Use the article layout by default.
-  \let\@listoffixmes@pretoc\@listoffixmes@pretoc@article
-  \let\@listoffixmes@posttoc\@listoffixmes@posttoc@article}
-      }
-    }
-  }
-}
-      }
-    }
-  }
-  \let\fixme@note\fixme@note@draft
-  \let\fixme@warning\fixme@warning@draft
-  \let\fixme@error\fixme@error@draft
-  \let\fixme@fatal\fixme@fatal@draft
-  \let\@fxenvbegin\@fxenvbegin@draft
-  \let\@fxenvend\@fxenvend@draft
-  \let\listoffixmes\listoffixmes@draft
-}
-
-\ExecuteOptions{english,final,margin,nosilent}
-\ProcessOptions*
-
-\AtBeginDocument{%
-  \ifx\FiXmeUser\empty
-    \renewcommand\FiXmeUser[1]{\FXUser{\fixmefatalprefix}{#1}}
+\newcounter{fxnotecount}
+\newcounter{fxwarningcount}
+\newcounter{fxerrorcount}
+\newcounter{fxfatalcount}
+
+\@fxdefinecmdkey{note}{author}{}
+\@fxdefinecmdkey{note}{target}{}
+\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\fxuselayouts\expandafter{%
+      \cmdfx@layout@innerlayout,nomargin,nomarginclue}%
+  \fi}
+\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}}
+\newcommand*\@fxissuecommonlayouts[2]{%
+  \FXLayoutContentsLine{#1}{#2}{\cmdfx@note@author}%
+  \iffx@log@silent\else\@nameuse{@fxlog@#1}{#2}\fi}
+
+\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}}
+\newcommand*\@@@fxnote@early@draft[2]{%
+  \@fxissueearlydraftlayouts{#1}{#2}}
+\newcommand*\@@@fxnote@late@draft[2]{%
+  \@fxissuelatedraftlayouts{#1}{#2}%
+  \@fxissuecommonlayouts{#1}{#2}}
+
+\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}
 
+\let\@fxendgroup\endgroup
+\def\@@fxnote@early#1#2{%
+    \@fxpostconfigure%
+    \stepcounter{fixmecount}%
+    \stepcounter{fx#1count}%
+    \@@@fxnote@early{#1}{#2}}
+\def\@@fxnote@late#1#2{%
+    \@@@fxnote@late{#1}{#2}%
+  \@fxendgroup}
+\def\@@fxnote#1#2{%
+  \@@fxnote@early{#1}{#2}%
+  \@@fxnote@late{#1}{#2}}
+\def\@fxnote#1[#2]#3{%
+  \@fxsetkeys{mode,status,lang,log,note,face,layout}{#2}%
+  \@@fxnote{#1}{#3}}
+
+\long\def\@@fxsnote#1#2#3{%
+  \@fxpostconfigure\let\@fxpostconfigure\relax%
+  \@@fxnote@early{#1}{#2}\@fxtargetlayout{#1}{#3}\@@fxnote@late{#1}{#2}}
+\long\def\@fxsnote#1[#2]#3#4{%
+  \@fxsetkeys{mode,status,lang,log,note,face,layout,targetlayout}{#2}%
+  \@@fxsnote{#1}{#3}{#4}}
+
+\newcommand*\@fxpreconfigure[1]{%
+  \ifthenelse{\equal{#1}{fixme}}{}{\@fxsetkeys{note}{author=#1}}}
+\newcommand*\@fxnewnotemacro[3]{%
+  \expandafter\DeclareRobustCommand\csname #1#2\endcsname{%
+    \begingroup%
+      \@fxpreconfigure{#3}%
+      \@ifstar{%
+        \@ifnextchar[%]
+        {\@fxsnote{#2}}{\@@fxsnote{#2}}}{%
+        \@ifnextchar[%]
+        {\@fxnote{#2}}{\@@fxnote{#2}}}}}
+\def\@@@@fxbeginenv@final#1{\comment}
+\def\@@@@fxbeginenv@draft#1{\@fxenvlayout@begin{#1}{\cmdfx@note@author}}
+\def\@fxendenv@final#1{\endcomment}
+\def\@fxendenv@draft#1{\@fxenvlayout@end{#1}{\cmdfx@note@author}}
+
+\def\@@@fxbeginenv#1#2{%
+  \@fxpostconfigure\let\@fxpostconfigure\relax%
+  \@@fxnote{#1}{#2}%
+  \@@@@fxbeginenv{#1}}
+\def\@@fxbeginenv#1#2{%
+  \@fxsetkeys{layout}{noinline}%
+  \@@@fxbeginenv{#1}{#2}}
+\def\@fxbeginenv#1[#2]#3{%
+  \@fxsetkeys{mode,status,lang,log,note,face,layout,envlayout}{#2,noinline}%
+  \@@@fxbeginenv{#1}{#3}}
+
+\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}}
+\long\def\@fxbeginsenv#1[#2]#3#4{%
+  \@fxsetkeys{mode,status,lang,log,note,face,layout,envlayout,targetlayout}{%
+    #2,noinline}%
+  \@@@fxbeginsenv{#1}{#3}{#4}}
+
+\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}}
+
+\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}}
+
+\FXRegisterAuthor{fx}{anfx}{fixme}
+\DeclareRobustCommand\fixme{%
+  \@fxpkgwarning{\string\fixme\space is deprecated;\MessageBreak
+    please use \string\fxfatal\space instead}%
+  \fxfatal}
+\def\afixme{%
+  \@fxpkgwarning{The 'afixme' environment is deprecated;\MessageBreak
+    please use 'anfxfatal' instead}%
+  \anfxfatal}
+\let\endafixme\endanfxfatal
+\newcommand*\@fxlanguages{%
+  english,french,francais,spanish,italian,german,ngerman,danish,croatian}
+
+\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}
+
+\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}
+
+\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}
+
+\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}
+
+\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}
+
+\newcommand\fxdanishnotename{Note}
+\newcommand\fxdanishnotesname{Noter}
+\newcommand\fxdanishwarningname{Advarsel}
+\newcommand\fxdanishwarningsname{Advarsler}
+\newcommand\fxdanisherrorname{Fejl}
+\newcommand\fxdanisherrorsname{Fejl}
+\newcommand\fxdanishfatalname{D\o delige}
+\newcommand\fxdanishfatalsname{Sk\ae bnesvangre fejl}
+\newcommand\danishlistfixmename{Rettelser}
+
+\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}
+
+\@fxdefineboolkey{lang}{langtrack}
+\def\@fxexpr{\@fxdefinechoicekey{lang}{defaultlang}[\@fxdefaultlang]}
+\expandafter\@fxexpr\expandafter{\@fxlanguages}{}
+
+\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}}
+
+\@for\@fxlg:=\@fxlanguages\do{
+  \def\@fxexprone{\@fxdefinevoidkey{lang}}
+  \edef\@fxexprtwo{{\@fxlg}{\noexpand\@fxsetkeys{lang}{lang=\@fxlg}}}
+  \expandafter\@fxexprone\@fxexprtwo}
+
+\newcommand*\@fxlistfixmename{\@nameuse{\@fxlang listfixmename}}
+\newcommand*\fxnotename[1]{\@nameuse{fx\@fxlang#1name}}
+\newcommand*\fxnotesname[1]{\@nameuse{fx\@fxlang#1sname}}
+
+\@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}}
+
+\newcommand*\FXProvidesTheme[1]{\ProvidesPackage{fxtheme#1}}
+\newcommand*\fxusetheme[1]{\usepackage{fxtheme#1}}
+\@fxdefinekey{theme}{theme}{\fxusetheme{#1}}
+\@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{scrartcl}{%
+\let\@lox@prtc\@lox@prtc@scrartcl%
+\let\@lox@psttc\@lox@psttc@scrartcl}{%
+\@ifclassloaded{scrreprt}{%
+  \let\@lox@prtc\@lox@prtc@scrreprt%
+  \let\@lox@psttc\@lox@psttc@scrreprt}{%
+  \@ifclassloaded{scrbook}{%
+    \let\@lox@prtc\@lox@prtc@scrbook%
+    \let\@lox@psttc\@lox@psttc@scrbook}{%
+    \@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}}}}}}}}
+
+\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>
+
+\newcommand*\fxsetup[1]{%
+  \@fxsetkeys{%
+    mode,status,lang,log,note,face,layout,envlayout,targetlayout,theme}{%
+    #1}}
+
 \AtEndDocument{%
-  \GenericWarning{%
-    (FiXme)\@spaces\@spaces\@spaces\@spaces
-  }{%
-    Package FiXme Summary: Number of notes: \thefixmenotecount,\MessageBreak%
-    Number of warnings: \thefixmewarningcount,\MessageBreak%
-    Number of errors: \thefixmeerrorcount,\MessageBreak%
-    Number of fatal errors: \thefixmefatalcount,\MessageBreak%
-    Total: \thefixmecount\@gobble%
-  }}
+  \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}
 \endinput
 %%
 %% End of file `fixme.sty'.
-- 
cgit v1.2.3

