summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/nag
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/nag
Initial commit
Diffstat (limited to 'macros/latex/contrib/nag')
-rw-r--r--macros/latex/contrib/nag/README6
-rw-r--r--macros/latex/contrib/nag/nag.dtx1675
-rw-r--r--macros/latex/contrib/nag/nag.ins50
-rw-r--r--macros/latex/contrib/nag/nag.pdfbin0 -> 437781 bytes
4 files changed, 1731 insertions, 0 deletions
diff --git a/macros/latex/contrib/nag/README b/macros/latex/contrib/nag/README
new file mode 100644
index 0000000000..662fddcb8a
--- /dev/null
+++ b/macros/latex/contrib/nag/README
@@ -0,0 +1,6 @@
+Old habits die hard. All the same, there are commands, classes and
+packages which are outdated and superseded. nag provides routines to
+warn the user about the use of those. As an example, we provide an
+extension that detects many of the ``sins'' described in l2tabu.
+
+License: LaTeX Project Public License 1.3a or latex, maintained. \ No newline at end of file
diff --git a/macros/latex/contrib/nag/nag.dtx b/macros/latex/contrib/nag/nag.dtx
new file mode 100644
index 0000000000..0c677a254e
--- /dev/null
+++ b/macros/latex/contrib/nag/nag.dtx
@@ -0,0 +1,1675 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2005-10 by Ulrich M. Schwarz
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, either version 1.3a or, at your
+% option, any later version. The latest version of this license is in
+%
+% http://www.latex-project.org/lppl.txt
+%
+% \fi
+%
+%\iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage[l2tabu]{nag}
+\GetFileInfo{nag.sty}
+\typeout{\fileversion}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+\usepackage[scaled]{luximono}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{nag.dtx}
+\end{document}
+%</driver>
+%<*nagdemo>
+%% Test document: finding and complaining about obsolete macros.
+%%
+\RequirePackage[l2tabu, orthodox, experimental]{nag}[2007/12/21]
+\documentclass{article}
+%% some usual culprits
+\usepackage{times, a4wide, epsfig, palatino}
+%% some fancy packages
+\usepackage{subfig, topcapt, caption, hyperref}
+\begin{document}
+\typeout{Next: no complaint because frontmatter is not defined}
+\ifx\frontmatter\undefined
+\else
+ \typeout{FAILURE! I shouldn't know frontmatter!}
+\fi
+\typeout{Next: no complaing about label outside float not preceded by caption}
+\section{Tests}\label{sec:tests}
+\typeout{Next: it and bf complaints}
+{\it italics {\bf not bold italics}}
+
+\typeout{Next: not-an-env complaints}
+\begin{Large}
+ \begin{sffamily}
+ Large and sans.
+ \end{sffamily}
+\end{Large}
+
+\typeout{Next: center in float complaint}
+\begin{figure}
+ \begin{center}
+ Center in float.
+ \end{center}
+ \caption{\label{fig}Figs and dates.}
+\end{figure}
+
+\typeout{Next: no complaints: manually fake caption}
+\begin{figure}
+ I have a caption, you just can't see it.
+\makeatletter\nag@hascaptiontrue\makeatother
+ \label{date}
+\end{figure}
+
+\typeout{Next: no complaing about label outside float not preceded by caption}
+\section{More Tests}\label{sec:tests2}
+
+\typeout{Next: put-label-after-caption complaint}
+\begin{figure}
+ \label{coconut}\caption{Preceded, not followed, by label.}
+\end{figure}
+
+\typeout{Next: no-caption complaint}
+\begin{figure}
+ No caption, even a fake one.
+ But too big, this should get bottom-of-page warning.
+ \rule{1pt}{0.4\textheight}
+\end{figure}
+
+\typeout{Next: no complaint about subfloat and topcapt}
+\typeout{also: complaint about it in caption.}
+\begin{figure}
+ \subfloat{\label{sf:1}Subfig number~\ref{sf:1} with label.}
+ \subfloat[\label{sf:17}Strange subfig]{Subfig~\ref{sf:17} with label elsewhere.}
+ \caption{Figure: \it's a sin!}
+\end{figure}
+
+\begin{figure}
+ \topcaption{A topcaption.}
+ \subfloat{\label{sf:2}Subfig~\ref{sf:2} with label, but no caption.}
+\end{figure}
+
+\typeout{Next: no robustness issues}
+\begin{minipage}{5cm}
+ foo\footnote{bar}
+\end{minipage}
+
+\typeout{Shouldn't cause trouble to have dollars in headings.}
+\section{Maths tests, like if $1+1=2$}
+
+\typeout{Next: three complaints in total concerning $$ and eqnarray}
+
+A \TeX-style displayed equation:
+$$ 1+1=2 $$
+
+Not an equation at all:
+$ $ 1+1=2 $ $
+
+An in line equation:
+$1+1=2$
+
+Two inline equations, double dollar is dollar dollar in resticted
+horizontal mode (onlyamsmath gets this wrong):
+$a+b=c$$1+1=2$
+
+An eqnarray:
+\begin{eqnarray}
+1+1 &=& 2
+\end{eqnarray}
+
+A bracket-style equation:
+\[1+1=2\]
+
+A starred eqnarray:
+\begin{eqnarray*}
+1+1 &=& 2
+\end{eqnarray*}
+
+A double-dollar in a hbox:
+\hbox{$$}
+
+\typeout{Next: appendix complaints}
+\begin{appendix}
+ \begin{center}
+ It's a center environment.
+ \end{center}
+\typeout{Next: no over complaint, centerline complaint, no frac complaint}
+ Over etc. warning removed for compatibility with \LaTeX\ without amsmath.
+
+ \centerline{Furthermore, $4\over 2=2$.}
+ $\frac 42$
+\end{appendix}
+\typeout{Next: unmatched endflushright}
+This is not flushright, in spite of a endflushright coming up.
+\endflushright
+\typeout{Next: unclosed center}
+{\center Smack in the middle, but center used as a switch\par}
+\typeout{Next: mismatched endflushright}
+
+Another endflushright, this is brace-mismatched and otherwise totally
+unsuited for closing the center command above.
+\endflushright
+
+\typeout{Next: a warning that is not uppercased.}
+\MakeUppercase{\it's a sin!}
+
+\typeout{Next: another warning about it in a caption, in the LoF this time.}
+\listoffigures
+\AtEndDocument{\typeout{You should get 25 warnings and one info in the log.}}
+\end{document}
+%</nagdemo>
+%
+%\fi
+%
+% \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 \~}
+%\CheckSum{624}
+%
+%\DoNotIndex{\if,\else,\fi,\PackageWarning,\PackageWarningNoLine,\typeout}
+%\DoNotIndex{\@for,\addtocounter,\arabic,\centering,\csname,\CurrentOption}
+%\DoNotIndex{\DeclareOption,\def,\do,\endcsname,\expandafter,\ifnum,\ifx}
+%\DoNotIndex{\InputIfFileExists,\let,\lq,\rq,\MessageBreak,\protect}
+%\DoNotIndex{\space,\stepcounter,\the,\value,\relax,\ProcessOptions}
+%\DoNotIndex{\ifcsname,\@ifundefined,\flo,\begingroup,\endgroup}
+%\DoNotIndex{\or,\vbox,\vskip,\z@,\wd,\vtop,\tmp@a,\tmp@b,\tw@}
+%\DoNotIndex{\@nil,\@nx,\@ne,\@tempcnta,\@tempcntb,\@tempdima,\@tempskipb}
+%\DoNotIndex{\foo,\endfoo,\ht,\dp,\wd,\hrule,\ifcase,\ifdim}
+%
+%\changes{0.1}{2005/03/29}{First official version.}
+%\changes{0.2}{2005/05/08}{Rephrased umlaut.sty warning, suggested by
+%Patrick Happel.}
+%\changes{0.2}{2005/05/08}{Added abort.nag, suggested by Michael Zedler}
+%\changes{0.3}{2005/07/07}{New ifdefined that won't relax the commands}
+%\changes{0.4}{2006/04/19}{Handling command vs. environment; bugfixes}
+% \changes{0.5}{2006/07/08}{Handle the case that somebody else relaxes
+% the ver@-commands. Stack-based NotASwitch.}
+%\changes{0.55}{2007/03/31}{Some spaces crept in in 0.5}
+%\changes{0.60alpha}{2007/04/03}{ changes the way label/caption is handled,
+% this eliminates the current limit of some thousand floats you can have in
+% your document. (I wonder why nobody noticed). }
+%\changes{0.60alpha2}{2007/04/08}{ is more careful around commands that
+% aren't there. }
+%\changes{0.60alpha4}{2007/04/23}{ handles eqnarray itself and has code in
+% nag-experimental.cfg to handle double-dollar in a more robust way that
+% onlyamsmath.}
+%\changes{0.60alpha4}{2007/04/23}{ tarballs now unpack into a subdirectory
+% like proper citizens should.}
+%\changes{0.60alpha5}{2007/05/10}{ improves compatibility with subfig.}
+%\changes{0.60}{2007/05/10}{ fixes double-dollar in conjunction with
+% hyperref; documents incompatiblity with rotating.}
+%\changes{0.61alpha1}{2007/11/10}{ fixes warnings in toc/lof/lot and
+% unsightly uppercasing. }
+%\changes{0.61alpha2}{2007/11/26}{ fixes the warnings, without generating
+% too many duplicates.}
+%\changes{0.61alpha3}{2007/12/21}{ warns about inputs that fail (in
+% particular includes that fail) and notes if a float has position t/b but is
+% too large to ever go into such a position (log only). }
+%\changes{0.61alpha4}{2008/01/04}{ exempts the complaints counter from
+% include trickery. (Previously, nag would get confused if you includeonly
+% only some chapters.) }
+%\changes{0.61alpha5}{2008/01/27}{ introduces compatibility hacks with
+% version control packages which rely on dollar having constant catcode.
+% (Workaround for svninfo and rcs, all other packages now disable
+% double-dollar
+% checking.) }
+%\changes{0.61}{2008/02/10}{ is 0.61alpha5 with some typos in the docs
+% fixed.}
+%\changes{0.62}{2007/07/30}{ fixes a bug in the float placement code and
+% adds more compatibility with the caption package.}
+%\changes{0.621}{2010/04/05}{Bugfix concerning unknown command in math mode}
+%\changes{0.622}{2010/05/17}{Bugfix: math in captions catcode issue}
+%\changes{0.623}{2010/08/15}{Tracing code in experimental: nofiles}
+%\changes{0.623}{2010/08/15}{Tracing code in experimental: changing labels}
+%\changes{0.623}{2010/08/15}{New error message: no room for a ... and eTeX}
+%\changes{0.7}{2011/11/25}{IncompatiblePackages,RecommendPackage,BadFileLoadOrder}
+%
+%\GetFileInfo{nag.sty}
+%\newcommand\pkg[1]{\textsf{#1}}
+%\title{The \pkg{nag} package\ignorespaces%
+% \thanks{This document corresponds to \pkg{nag}~\fileversion,
+% dated~\filedate. Other versions can be found at http://absatzen.de/}}
+% \author{Dr. Ulrich Michael Schwarz\ignorespaces%
+% \thanks{\texttt{ulmi@absatzen.de}}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% Old habits die hard. All the same, there are commands, classes and
+% packages which are outdated and superseded. \pkg{nag} provides
+% routines to warn the user about the use of those. As an example, we
+% provide an extension that detects many of the ``sins'' described in
+% \pkg{l2tabu}.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{User-side considerations.}
+%
+% \subsection{Installation.}
+%
+% Process \texttt{nag.ins} with \LaTeX\ to obtain some files:
+% \texttt{nag.sty} and \texttt{nag-l2tabu.cfg} et al. must go to a place where
+% \LaTeX\ will find them, like the local TEXMF tree. (If all else fails and
+% you need it to work \emph{right now}, having them in the same
+% directory as the \LaTeX\ file you want to use them on may work under
+% many circumstances.) You can, as usual, run \LaTeX\ on
+% \texttt{nag.dtx} to obtain this documentation, including the
+% implemenation docs. (This is recommended if you plan to extend
+% \pkg{nag} to handle your own packages.) \texttt{nagdemo.tex} is
+% a horrible document that will show you many of the warnings that
+% \pkg{nag} can generate.
+%
+% \subsection{Usage.}
+%
+% Add the following to the beginning your main document (Comments and
+% |\listfiles| can be safely left before it, though):
+% \begin{verbatim}
+% \RequirePackage[l2tabu, orthodox]{nag}\end{verbatim}
+% This will check for many common mistakes, and give some hints on what
+% to use instead. However, you should always refer to l2tabu for a more
+% detailed explanation of the whats and whys: it gives more information
+% than can be possibly pressed into two lines of error message.
+% Orthodox checks for pitfalls that are not technically incorrect. If
+% you know what you're doing, omit orthodox.
+%
+% \subsection{Known bugs}
+% currently none.
+%
+% \subsection{\texttt{nag-l2tabu.cfg}}
+%
+% In a nutshell, \texttt{nag-l2tabu.cfg} detects the following:
+% \begin{itemize}
+% \item Usage of the 2.09-style font commands |\it|, |\bf|, |\rm|,
+% |\sc|, |\sl|, |\tt| and |\cal|.
+% \item Usage of |\centerline|.
+% \item Usage of the outdated packages \pkg{epsfig}, \pkg{psfig},
+% \pkg{epsf}, \pkg{doublespace}, \pkg{fancyheadings}, \pkg{scrpage},
+% \pkg{umlaut}, \pkg{isolatin}, \pkg{isolatin1}, \pkg{t1enc},
+% \pkg{caption2}, \pkg{psfonts}, \pkg{mathptm}, \pkg{times},
+% \pkg{palatino}, \pkg{mathpple}, \pkg{euler} and \pkg{utopia}, and of
+% the outdated class \pkg{scrlttr}.
+% \item Figures and tables without caption (this is not technically
+% in l2tabu, but the people who have floats without captions tend
+% to ask ``Why is \LaTeX\ moving my pictures away from where I
+% put them?''), labels within floats
+% that do not reference the caption, and usage of the center
+% environment within floats.
+%\end{itemize}
+%
+% It is beyond the possibilities of this package to detect things like
+% use of \TeX\ assignment syntax, or direct change of paper
+% parameters, or reliable detection of user-issued |\sloppy|.
+% eqnarray is handled as of 0.60alpha4, and there is code for \$\$ in
+% experimental since 0.60alpha4, which has been moved to l2tabu in 0.60.
+%
+% {\bfseries\label{disclaimer} Be warned, that this package will possibly balk at
+% legitimate use, and not find illegitimate use in all cases. It is a
+% tool, not a replacement for study of \pkg{l2tabu}.}
+%
+% \iffalse
+%<*l2tabunag>
+% \fi
+% \begin{macrocode}
+\ProvidesFile{nag-l2tabu.cfg}
+ [2010/05/17 v2.11 l2tabu rules for nag.sty (ulmi)]
+%%
+%% The sins.
+%%
+%% Section numbers refer to l2tabuen 1.7 revised/enlarged dated 2004OCT24
+%% \S 1.1
+\ObsoletePackage{a4wide}{the \lq a4paper\rq\space class option}
+\ObsoletePackage{a4}{the \lq a4paper\rq\space class option}
+%% \S 1.2--1.5 cannot reasonably be checked programmatically
+%% \S 1.6
+% \end{macrocode}
+% Hacking galore ahead! We will make the dollar active. Since unlike
+% \pkg{onlyamsmath}, we do not change the user's command to \LaTeX\ or
+% \pkg{amsmath} commands, we need to store the old double dollar
+% sequence as well as the single dollar.
+% \begin{macrocode}
+\def\nag@doubledollar{$$}%$$
+\def\nag@singledollar{$}%$
+% \end{macrocode}
+% This is used to hide our redefinition in unprotected expanding
+% context. This should not happen: you are expected to \emph{always}
+% use protected means of expansion in \LaTeX, but fecal matter
+% happens. See below for a good trick to distinguish expansion from
+% executing context.
+% \begin{macrocode}
+\def\nag@expanding@voodoo#1#2#3{\relax\relax\nag@singledollar}
+
+\def\nag@maybedispmath{%
+ \texorpdfstring{%
+ %% in TeX context, do tricky stuff.
+ \ifinner\expandafter\@firstoftwo
+ \else\expandafter\@secondoftwo\fi
+ {%% in inner mode, $$ is an empty formula, so no testing wanted.
+ \nag@singledollar}%
+ {%%
+ \ifx\protect\@typeset@protect\expandafter\@firstoftwo
+ \else\expandafter\@secondoftwo\fi
+ {%% normal case: looks like typesetting
+ %% protect against strictly expanding context
+ %% like TeX' \message: the first expanding voodoo will expand,
+ %% removing the rest, inserting \relax\relax$ instead. This is
+ %% not totally transparent, but \let\relax\relax is as close
+ %% to a no-op as we can get.
+ \let\nag@expanding@voodoo\nag@expanding@voodoo
+ \protect\nag@maybe@dispmath}%
+ {%% some other case, hide ourselves
+ \nag@singledollar}%
+ }%
+ }{%
+ %% in pdf context, just be a math shift. This creates the "math
+ %% shift not allowed" warnings we all love.
+ \nag@singledollar
+ }%
+}
+% \end{macrocode}
+% If the user doesn't load \pkg{hyperref}, we have to fake its
+% \cmd{\texorpdfstring} command. Note that this will break any package that
+% is foolish enough to detect \pkg{hyperref} by testing for
+% definedness of \cmd{\texorpdfstring}.
+% \begin{macrocode}
+\AtBeginDocument{\providecommand\texorpdfstring{\@firstoftwo}}
+\AtBeginDocument{\catcode`$\active}%$
+\AtEndDocument{\catcode`$=3\relax}
+% \end{macrocode}
+% Now, the proper testing. (Yes, the above is just the
+% technicalities.) We use the kernel's \cmd{\@ifnextchar} to look for
+% a possible second dollar. Note however, this would allow skipping of
+% spaces between them, and \$\_\$ is not a displayed equation start in
+% \TeX. We work around this by re\cmd{\let}ting \cmd{\@sptoken} to
+% something that cannot legally appear in the source.
+% \begin{macrocode}
+\def\nag@quark{\nag@quark}
+\bgroup
+ \catcode`$\active%$
+ \gdef\nag@maybe@dispmath{%
+ \bgroup
+ \let\@sptoken\nag@quark% prevent skipping of spaces
+ \@ifnextchar${%$%
+ \ifmmode
+ % we already warned upon entering.
+ \else
+ \nag@warn{%
+ \nag@doubledollar...\nag@doubledollar\space is obsolete.\MessageBreak
+ Use \string\[...\string\] et al. instead}%
+ \fi
+ \egroup\expandafter\nag@doubledollar\@gobble
+ }{%
+ \egroup\nag@singledollar
+ }%
+ }
+ % we do the assignment here, which means any package that redefines
+ % \$ as well will silently disable us. This is a feature.
+ \global\let$\nag@maybedispmath%$
+\egroup
+% \end{macrocode}
+% \changes{0.61alpha6}{2008/01/27}{Compatibility w/ VCS packages, pgf}
+%% new in 2.1alpha1: more compat testing. Version control keywords are dollar-delimited.
+%% all five implementations get it wrong.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \@ifpackageloaded{rcs}{%
+ % this redefinition is functionally equivalent,
+ % but does not share actual code.
+ \renewcommand\RCS{\bgroup%
+ \catcode`\_ =\active
+ \catcode`\$=3 % this line added for compatibility.
+ \csname RCS_get_argument\endcsname
+ }
+ \PackageInfo{nag}{rcs.sty hack applied}%
+ }{}%
+ \@ifpackageloaded{svninfo}{%
+ \g@addto@macro\@svnBeginRead{\catcode`\$ 3 }%
+ \PackageInfo{nag}{svninfo.sty hack applied}%
+ }{}%
+ \@ifpackageloaded{svn}{%
+ \PackageInfo{nag}{svn.sty is broken: disabling dollar check}%
+ \catcode`\$ 3
+ }{}%
+ \@ifpackageloaded{rcsinfo}{%
+ \PackageInfo{nag}{rcsinfo.sty is broken: disabling dollar check}%
+ \catcode`\$ 3
+ }{}%
+ \@ifpackageloaded{pgf}{%
+ \PackageInfo{nag}{pgf.sty is broken: disabling dollar check}%
+ \catcode`\$ 3
+ }{}%
+}
+
+
+%% \S 1.7 cannot reasonably be checked programmatically
+%% \S 1.8 \sloppy is called by parbox, among others, and would
+%% give many spurious warnings.
+%% \S 2.1.1
+\ObsoleteCS[an old LaTeX 2.09 command]{bf}
+ {\protect\bfseries\space or \protect\textbf}
+\ObsoleteCS[an old LaTeX 2.09 command]{it}
+ {\protect\itshape\space or \protect\textit}
+\ObsoleteCS[an old LaTeX 2.09 command]{rm}
+ {\protect\rmfamily\space or \protect\textrm}
+\ObsoleteCS[an old LaTeX 2.09 command]{sc}
+ {\protect\scshape\space or \protect\textsc}
+\ObsoleteCS[an old LaTeX 2.09 command]{sf}
+ {\protect\sffamily\space or \protect\textsf}
+\ObsoleteCS[an old LaTeX 2.09 command]{sl}
+ {\protect\slshape\space or \protect\textsl}
+\ObsoleteCS[an old LaTeX 2.09 command]{tt}
+ {\protect\ttfamily\space or \protect\texttt}
+\ObsoleteCS[an old LaTeX 2.09 command]{cal}
+ {\protect\mathcal}% Hmm, this is not in l2tabu?
+%% \S 2.1.2
+%% Gone with 1.8 because this never worked for the kernel \frac anyway.
+%% \ObsoleteCS[TeX]{over}{\protect\frac}
+%% \ObsoleteCS[TeX]{choose}{\protect\frac\space or amsmath's \protect\binom}
+%% \S 2.1.3
+\ObsoleteCS[TeX]{centerline}{\protect\centering\space or center environment}
+%% \S 2.2.1
+\ObsoleteClass{scrlettr}{the scrlttr2 package}
+%% \S 2.2.2
+\ObsoletePackage{epsf}{the graphicx package}
+\ObsoletePackage{psfig}{the graphicx package}
+\ObsoletePackage[deprecated]{epsfig}{the graphicx package directly}
+%% \S 2.2.3
+\ObsoletePackage{doublespace}{the setspace package}
+%% \S 2.2.4
+\ObsoletePackage{fancyheadings}{the fancyhdr or scrpage2 packages}
+\ObsoletePackage{scrpage}{the scrpage2 package}
+%% \S 2.2.5
+\ObsoletePackage{isolatin}{the inputenc package with option latin1}
+\ObsoletePackage{umlaut}{the inputenc package with suitable option
+ (latin1, utf8 ...)}
+\ObsoletePackage{isolatin1}{the inputenc package with option latin1}
+%% \S 2.2.6
+\ObsoletePackage{t1enc}{the fontenc package with option T1}
+%% \S 2.2.7 we don't check for bst yet.
+%% (This is in l2tabu 1.8)
+\ObsoletePackage{caption2}{the caption package v3.0 or later}
+%% \S 2.3.1-3
+\ObsoletePackage{times}
+ {the mathptmx, helvet (option scaled=.9), courier packages}
+\ObsoletePackage{pslatex}
+ {the mathptmx, helvet (option scaled=.9), courier packages}
+\ObsoletePackage{mathptm}
+ {the mathptmx package}
+%% \S 2.3.4-5
+\ObsoletePackage{palatino}
+ {the mathpazo, helvet (option scaled=.95), courier packages}
+\ObsoletePackage{mathpple}{the mathpazo package}
+%% \S 2.3.6 can't be checked
+%% \S 2.3.7
+\ObsoletePackage{euler}{the eulervm package}
+\ObsoletePackage{utopia}{the fourier package}
+%% \S 3.1
+\NagDeclareFloat{figure}\NagDeclareFloat{table}%
+\g@addto@macro\nag@labels{,label,caption@xlabel}%
+% \changes{0.60}{2007/03/31}{alternate center-in-float check, doesn't
+% take up as many macro names}
+\nag@prepend{endcenter}{%
+ \ifx\@captype\@undefined\else
+ \nag@warn{\lq center\rq\space environment in \@captype.\MessageBreak
+ Maybe you want \protect\centering\space instead}%
+ \fi
+}%
+%% The latter two are used by KOMA-Script, the last by hypcap.
+% \changes{0.53}{2007/03/21}{hypcap support. (H.G.Krauth\"auser)}
+% \changes{0.53}{2007/03/21}{topcapt support.}
+\g@addto@macro\nag@captions{,caption,captionabove,captionbelow,hc@caption,topcaption}%
+
+%% \S 3.2
+\NotAnEnvironment{appendix}%
+%% In the same vein:
+\@for\sectioning:=frontmatter,mainmatter,backmatter\do{%
+ \expandafter\NotAnEnvironment\expandafter{\sectioning}%
+}
+%% \S 3.3
+%% It's more trouble than it's worth to have another warning for
+%% align*, since it passes through align.
+\ObsoleteEnv{eqnarray}{amsmath's align}
+%% \S 3.4 -- nothing to be done --
+% \end{macrocode}
+% \iffalse
+%</l2tabunag>
+% \fi
+%
+% \subsection{\texttt{nag-orthodox.cfg}}
+% \texttt{nag-orthodox.cfg} warns about usage that is not technically
+% incorrect, but will mostly do things an unwary user may not expect.
+% This includes in particular the usage of font size and style switches
+% as environments (line spacing will be off if the environment does not
+% contain a trailing \string\par, spurious spaces might occur since the
+% switches don't \string\ignorespaces), and, conversely, the usage of
+% center etc. environments as unclosed switches. (Detection of the
+% latter might still be somewhat brittle.)
+% \iffalse
+%<*orthodoxnag>
+% \fi
+% \begin{macrocode}
+\ProvidesFile{nag-orthodox.cfg}
+ [2006/04/19 v1.8 strict rules for nag.sty (ulmi)]
+\@for\fontcmd:=tiny,small,footnotesize,normalsize,large,Large,%
+ LARGE,huge,Huge\do{%
+ \expandafter\NotAnEnvironment\expandafter{\fontcmd}%
+}%
+\@for\fontcmd:=sffamily,rmfamily,ttfamily,%
+ bfseries,mdseries,scshape,%
+ itshape,upshape\do{%
+ \expandafter\NotAnEnvironment\expandafter{\fontcmd}%
+}%
+\@for\justsw:=centering,raggedleft,raggedright,%
+ RaggedLeft,RaggedRight\do{%
+ \expandafter\NotAnEnvironment\expandafter{\justsw}%
+}
+\@for\justenv:=center,flushleft,flushright\do{%
+ \expandafter\NotASwitch\expandafter{\justenv}%
+}
+% \end{macrocode}
+%\iffalse
+%</orthodoxnag>
+%\fi
+%
+% \subsection{\texttt{nag-abort.cfg}}
+% Requesting this nag file will turn all complaints into errors.
+%
+% \iffalse
+%<*abortnag>
+%\fi
+% \begin{macrocode}
+\ProvidesFile{nag-abort.cfg}
+ [2007/11/10 v0.2 treat complaints as errors (ulmi)]
+\DeclareRobustCommand\nag@warn[1]{%
+ \addtocounter{nag@sins}{1}%
+ \PackageError{nag}{#1}{#1}%
+}
+\DeclareRobustCommand\nag@warnNoLine[1]{%
+ \addtocounter{nag@sins}{1}%
+ \PackageError{nag}{#1}{#1}%
+}
+% \end{macrocode}
+%\iffalse
+%</abortnag>
+%<*experimentalnag>
+%\fi
+%\subsection{\texttt{nag-experimental.cfg}}
+% Functionality that needs more testing.
+% \begin{macrocode}
+\ProvidesFile{nag-experimental.cfg}
+ [2009/07/04 v0.62alpha2 experimental additions to nag (ulmi)]
+% \end{macrocode}
+%
+% Patch handling of nofiles: suppressed lines give an
+% Info-level message in the logfile now. The message
+% doesn't quite give the original line, but a sanitized
+% version. Reason: otherwise, we might need to execute
+% the setup code \#2.
+%
+% \begin{macrocode}
+\long\def\nag@protected@dontwrite#1#2#3%
+ {\write\m@ne{}%
+ \def\nag@line{#3}%
+ \@onelevel@sanitize\nag@line
+ \PackageInfo{nag}{%
+ \string\nofiles\space in effect.
+ Did not write line \MessageBreak
+ `\nag@line'
+ }%
+ \if@nobreak\ifvmode\nobreak\fi\fi}%
+
+\if@filesw
+ \def\nofiles{%
+ \@fileswfalse
+ \typeout{No auxiliary output files.^^J}%
+ \global\let\protected@write=\nag@protected@dontwrite
+ \let\makeindex\relax
+ \let\makeglossary\relax}
+\else
+ % already \nofiles.
+ \global\let\protected@write=\nag@protected@dontwrite
+\fi
+% \end{macrocode}
+%
+% Amend ``no space for a new foo'' message to point out
+% e\TeX\ alleviates some problems in that area.
+% \begin{macrocode}
+\gdef\ch@ck#1#2#3{%
+ \ifnum\count1#1<#2\else
+ \errhelp{%
+ eTeX has more counters, dimens, etc., maybe
+ that will help.
+ }
+ \errmessage{No room for a new #3}%
+\fi}
+% \end{macrocode}
+%
+% \begin{macrocode}
+\def\@testdef #1#2#3{%
+ \def\reserved@a{#3}%
+ \expandafter \ifx \csname #1@#2\endcsname\reserved@a
+ \else
+ \@tempswatrue
+ \begingroup
+ \@onelevel@sanitize\reserved@a
+ \expandafter\let\expandafter\nag@tmpb\csname #1@#2\endcsname
+ \ifx\nag@tmpb\relax
+ \let\nag@tmpb\@empty
+ \else
+ \@onelevel@sanitize\nag@tmpb
+ \fi
+ \PackageInfo{nag}{%
+ Label `#2' appears to have changed from\MessageBreak
+ `\nag@tmpb'\MessageBreak
+ to `\reserved@a'
+ }%
+ \endgroup
+ \fi}
+% \end{macrocode}
+%
+%
+% Check if a float that may be positioned b is actually small
+% enough for bottomfraction etc.
+% \changes{0.62alpha1}{2008/03/19}{Bigger warning if all float positions fail}
+% \changes{0.62alpha2}{2009/07/04}{Fix for marginpar etc which don't have fps}
+% \begin{macrocode}
+\let\@xa\expandafter
+\newif\ifnag@dofloatsizecheck
+\newif\ifnag@allfloatpositionsfailed
+\newcommand\nag@allfloatsizechecks{}%
+\newcommand\nag@onefloatsizecheck[2]{%
+ % #1 is size fraction of textheight,
+ % #2 is position to say in warning.
+ \ifdim \ht\@currbox>#1\textheight
+ \@tempdima -#1\textheight
+ \advance \@tempdima \ht\@currbox
+ \PackageInfo{nag}{Float too large for #2 by \the\@tempdima}%
+ % note we do not truncate.
+ % also, it's too late to add "p" now.
+ \else
+ \nag@allfloatpositionsfailedfalse
+ \fi
+}
+% \@currbox is current float box,
+% \@fps is the current list of float specifiers.
+\renewcommand\@largefloatcheck{%
+ \ifdim \ht\@currbox>\textheight
+ \@tempdima -\textheight
+ \advance \@tempdima \ht\@currbox
+ \@latex@warning {Float too large for page by \the\@tempdima}%
+ \ht\@currbox \textheight
+ \fi
+ %% the preceding is the original check.
+ \nag@dofloatsizechecktrue
+ \nag@allfloatpositionsfailedtrue
+ \def\nag@allfloatsizechecks{}%
+ \@xa\@xa\@xa\@tfor\@xa\@xa\@xa\nag@fltsz@tmp\@xa\@xa\@xa:\@xa\@xa\@xa=\csname @fps\endcsname\do{%
+ \ifx\nag@fltsz@tmp\relax
+ \nag@dofloatsizecheckfalse
+ \fi
+ \if\nag@fltsz@tmp !
+ \nag@dofloatsizecheckfalse
+ \else
+ \if\nag@fltsz@tmp t
+ \g@addto@macro\nag@allfloatsizechecks
+ {\nag@onefloatsizecheck{\topfraction}{top of page}}%
+ \else
+ \if\nag@fltsz@tmp b
+ \g@addto@macro\nag@allfloatsizechecks
+ {\nag@onefloatsizecheck{\bottomfraction}{bottom of page}}%
+ \else
+ \if\nag@fltsz@tmp p
+ \nag@allfloatpositionsfailedfalse
+ \fi
+ \fi
+ \fi
+ \fi
+ }%
+ \ifnag@dofloatsizecheck
+ \nag@allfloatsizechecks
+ \ifnag@allfloatpositionsfailed
+ \nag@warn{All float specifiers `\@fps' won't work}%
+ \fi
+ \fi
+}%
+% \end{macrocode}
+% More experimental code: warning about files that were
+% requested but not there. The really important one would
+% be a check for include (this is just a typeout in the kernel?!).
+% But as it is, we get warnings that point out missing ToC, LoF etc.
+% \begin{macrocode}
+\def\@input#1{%
+ \IfFileExists{#1}{\@@input\@filef@und}{%
+ \typeout{No file #1.}
+ \@latex@warning{File `#1' not found}
+ %{The file `#1' was requested but not found }
+ \protected@edef\nag@nofile{File `#1' requested, but not found}%
+ \@xa\AtEndDocument\@xa{%
+ \@xa\@latex@info@no@line\@xa{%
+ \nag@nofile
+ }%
+ }%
+}}%
+%
+\def\@input@#1{\InputIfFileExists{#1}{}{%
+ \typeout{No file #1.}
+ \@latex@warning{File `#1' not found}
+ {The file `#1' was requested but not found }
+ \edef\nag@nofile{File `#1' requested, but not found}%
+ \@xa\AtEndDocument\@xa{%
+ \@xa\@latex@info@no@line\@xa{%
+ \nag@nofile
+ }%
+ }%
+}}%
+%
+% \end{macrocode}
+%\iffalse
+%</experimentalnag>
+%
+%<*nag>
+%\fi
+% \section{Author-side considerations and implementation.}
+% If you are a package or class author and want to extend the range
+% of \pkg{nag} (or prevent \pkg{nag} from criticizing
+% your macros), please see the description below, in
+% sections~\ref{sec:obsol-cmds} and following. It is
+% probably wise to group new rules in a seperate nag file:
+% users can request nag files by passing their name as a package
+% parameter, as shown above for the example of l2tabu.
+%
+% \subsection{Low-level tools.}
+% Identify ourselves.
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{nag}[2011/11/25 0.7 warning about old commands (ulmi)]
+\let\@xa\expandafter
+\let\@nx\noexpand
+% \end{macrocode}
+% First of all, two counters we need. The first is used to
+% generate running numbers for replacement macros, the latter is
+% stepped for each complaint we have, so that the user gets a
+% frighteningly high number, showing how sinful he or she is.
+% \changes{0.61alpha1}{2007/11/10}{roman counter (external file issue)}
+% \changes{0.61alpha4}{2008/01/01}{sin counter should not be saved by include}
+% \begin{macrocode}
+\newcounter{nag@c}
+\renewcommand\thenag@c{\roman{nag@c}}%
+\setcounter{nag@c}{1}%
+\begingroup
+ \let\@addtoreset\@gobbletwo
+ \newcounter{nag@sins}%
+\endgroup
+% \end{macrocode}
+%
+% \begin{macro}{\nag@prepend}
+% |\nag@prepend|\marg{cs}\marg{something}:
+% Prepend \meta{something} to the macro definition of |\|\meta{cs}.
+%
+% In reality, we do call indirection: save old macro away,
+% redefine macro to do the something, call old macro.
+% (With thanks to Juergen Goebel, Heiko Oberdiek and Rolf Niepraschk
+% (\pkg{savesym}))
+%
+% From $0.60\alpha_2$ on, nag is more robust about not defining
+% commands that are not there. Now, they're not even relaxed.
+% \begin{macrocode}
+\newcommand\nag@ifundefined[1]{%
+ \begingroup
+ \@ifundefined{#1}{\endgroup\@firstoftwo}{\endgroup\@secondoftwo}%
+}
+% \end{macrocode}
+% \changes{0.51}{2006/10/21}{bugfix}
+% Don't define the macro if it's not there. This confuses caption,
+% which loads ragged2e AtBeginDocument, at which point, RaggedLeft
+% et al. were already defined by us.
+% \changes{0.52}{2007/02/25}{info}
+% \changes{0.60alpha2}{2007/04/08}{don't even relax unknown
+% commands (J.Sommer)}
+% \dots but \emph{do} log a message.
+% \changes{0.61alpha1}{2007/11/10}{Extra indirection of warnings
+% for robustness (uppercasing/LoF issues)}
+% \changes{0.61alpha2}{2007/11/26}{Creep under existing robust cover}
+% \begin{macrocode}
+\newcommand\nag@prepend[2]{%
+ \nag@ifundefined{#1}{%
+ % if it doesn't exist, don't do anything.
+ \PackageInfo{nag}{%
+ Command \@backslashchar#1\space not defined, skipping amendment%
+ }%
+ }{%
+ \nag@ifundefined{#1 }{%
+ \let\nag@maybespace\@empty
+ }{%
+ \let\nag@maybespace\space
+ %\PackageInfo{nag}{%
+ % Command \@backslashchar#1\space appears robust\MessageBreak
+ % Modifying `\@backslashchar#1\space' instead.
+ %}%
+ }%
+ \@xa\let
+ \csname nag@@#1@\thenag@c\@xa\endcsname
+ \csname #1\nag@maybespace\endcsname
+ \@xa\DeclareRobustCommand\csname nag@@warning@\thenag@c\@xa\endcsname{%
+ #2%
+ }%
+ \@xa\nag@pr@p@nd\csname #1\nag@maybespace\@xa\endcsname
+ \csname nag@@#1@\thenag@c\@xa\endcsname
+ \csname nag@@warning@\thenag@c\@xa\endcsname
+% \end{macrocode}
+% Fun with scoping: one might think we can get away with a (non-local)
+% |\advance\c@nag@c 1\relax| here. This would lead to less hashtable
+% usage. Problem: if a nag@@foo@17 macro ever escapes its scope, it
+% might be bound to something else entirely. This might occur with
+% some of the fancier table packages which use external files?
+% \begin{macrocode}
+ \stepcounter{nag@c}%
+ }%
+}
+\newcommand\nag@pr@p@nd[3]{%
+ \def#1{#3#2}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\nag@warn}
+% All complaints to the user run through one of these two macros,
+% with or without source line.
+% \changes{0.61alpha1}{2007/11/10}{Made robust.}
+% \begin{macrocode}
+\DeclareRobustCommand\nag@warn{%
+ \addtocounter{nag@sins}{1}%
+ \PackageWarning{nag}%
+}
+\DeclareRobustCommand\nag@warnNoLine{%
+ \addtocounter{nag@sins}{1}%
+ \PackageWarningNoLine{nag}%
+}
+\providecommand\PackageInfoNoLine[2]{%
+ \PackageInfo{#1}{#2\@gobble}%
+}
+\DeclareRobustCommand\nag@suggestNoLine[1]{%
+ \PackageInfoNoLine{nag}{#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Obsoletifying commands.}\label{sec:obsol-cmds}
+%
+% (No, I do not think that is a proper word either.)
+%
+% \begin{macro}{\ObsoleteCS}
+% Usage: |\ObsoleteCS|\oarg{reason}\marg{CS}\marg{suggestions}
+% Mark |\|\meta{CS} as obsolete. \meta{reason} defaults to
+% obsolete. When the macro is used anyway, the following
+% warning is logged:
+%
+% \noindent|Command \|\meta{CS}| is |\meta{reason}|. Use |\meta{suggestions}| instead.|
+% \begin{macrocode}
+\newcommand\ObsoleteCS[3][obsolete]{%
+ \AtBeginDocument{%
+ \nag@prepend{#2}{%
+ \nag@warn{%
+ Command \@backslashchar#2 is #1.
+ \MessageBreak
+ Use #3 instead}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ObsoleteEnv}
+% \changes{0.60alpha4}{2007/04/23}{There was no ObsoleteEnv?!}
+% \begin{macrocode}
+\newcommand\ObsoleteEnv[3][obsolete]{%
+ \AtBeginDocument{%
+ \nag@prepend{#2}{%
+ \nag@warn{%
+ Environment #2 is #1.
+ \MessageBreak
+ Use #3 instead}%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Obsoletifying packages and classes.}
+%
+% Checking for packages and classes is done by looking for
+% |ver@foo.sty|, which holds the version information that is also
+% displayed by |\listfiles|. This means that we're out of luck if
+% fontenc ever becomes obsolete, because that won't be detected.
+%
+% First, define a macro to check if a control sequence is defined.
+% Unlike |\@ifundefined|, this will not define the control sequence
+% to |\relax|, but the arguments will be executed in a group. For
+% our purposes, this doesn't matter, because we only give a warning
+% (and |\addtocounter| already is |\global|).
+% \begin{macrocode}
+\newcommand\nag@ifcsname[3]{%
+ \begingroup\@ifundefined{#1}{#3}{#2}\endgroup
+}
+% \end{macrocode}
+% Just because we can, use $\epsilon$\TeX' |\ifcsname| if we can. This
+% bootstrapping gives me a big grin\dots Note we add an extra group
+% for compatibility with the non-$\epsilon$ case.
+% \changes{0.52}{2007/02/25}{made eTeX-ifcsname more robust}
+% \begin{macrocode}
+\nag@ifcsname{ifcsname}{%
+ \renewcommand*\nag@ifcsname[3]{%
+ \begingroup
+ % assume it won't be there.
+ \let\tmp@a\@secondoftwo
+ \ifcsname #1\endcsname
+ % It still might be relax from some other test. Thanks to J\"org
+ % Sommer for finding this bug.
+ \expandafter\ifx\csname #1\endcsname\relax
+ \else
+ % it's there after all
+ \let\tmp@a\@firstoftwo
+ \fi
+ \fi
+ \tmp@a{#2}{#3}%
+ \endgroup
+ }%
+% \end{macrocode}
+% This way of escaping the grouping gives me an even
+% bigger grin.
+% \begin{macrocode}
+ \global\let\nag@ifcsname\nag@ifcsname
+}{}
+% \end{macrocode}
+%
+% \begin{macro}{\ObsoletePackage}
+% Usage: |\ObsoletePackage|\oarg{reason}\marg{package}\marg{%
+% alternative}. Mark \meta{package} as obsolete. \meta{reason} defaults
+% to obsolete. If the \meta{package} is used anyway, at the end of
+% the compilation, the following warning will be displayed:
+%
+% \noindent|Package |\meta{package}| is |\meta{reason}|. Use |
+% \meta{alternative}| instead.|
+% \begin{macrocode}
+\newcommand\ObsoletePackage[3][obsolete]{%
+ \AtEndDocument{%
+% |\@clsextension| is onlypreamble, for some reason.
+ \nag@ifcsname{ver@#2.sty}{%
+ \nag@warnNoLine{%
+ Package #2 is #1.\MessageBreak
+ Use #3 instead}%
+ }{}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SuggestedPackage}
+% Usage: |\SuggestedPackage|\oarg{reason}\marg{package}
+% \begin{macrocode}
+\newcommand\SuggestedPackage[2][might be useful to you]{%
+ \AtEndDocument{%
+ \nag@ifcsname{ver@#2.sty}{%
+ % Attaboy!
+ }{%
+ \nag@suggestNoLine{%
+ Not loaded: Package #2 #1}%
+ }%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IncompatiblePackages}
+% Usage: |\IncompatiblePackages|\oarg{reason}\marg{package}\marg{package}\marg{hint}
+% \begin{macrocode}
+\newcommand\IncompatiblePackages[4][are incompatible]{%
+ \AtEndDocument{%
+ \nag@ifcsname{ver@#2.sty}{%
+ \nag@ifcsname{ver@#3.sty}{%
+ \nag@warnNoLine{%
+ Packages #2 and #3 #1.\MessageBreak
+ #4}%
+ }{}%
+ }{}
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ObsoleteClass}
+% Usage: |\ObsoleteClass|\oarg{reason}\marg{class}\marg{%
+% alternative}. Mark \meta{class} as obsolete. \meta{reason} defaults
+% to obsolete. If the \meta{class} is used anyway, at the end of
+% the compilation, the following warning will be displayed:
+%
+% \noindent|Class |\meta{class}| is |\meta{reason}|. Use |
+% \meta{alternative}| instead.|
+% \begin{macrocode}
+\newcommand\ObsoleteClass[3][obsolete]{%
+ \AtEndDocument{%
+% |\@clsextension| is onlypreamble, for some reason.
+ \nag@ifcsname{ver@#2.cls}{%
+ \nag@warnNoLine{%
+ Class #2 is #1.\MessageBreak
+ Use #3 instead}%
+ }{}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\BadFileLoadOrder}
+% \begin{macrocode}
+\def\nag@quark{\nag@quark}
+\ifx\@listfiles\@undefined
+ % emulate a silent listfiles
+ \def\@listfiles#1\@@{}%
+\fi
+\newcommand\BadFileLoadOrder[3][This might cause problems]{%
+ \AtEndDocument{%
+ \nag@ifLoadOrder{#2}{#3}{%
+ \nag@warnNoLine{%
+ `#3' loaded after `#2'.\MessageBreak
+ #1}%
+ }%
+ }%
+}
+\def\nag@ifLoadOrder#1#2{%
+ \def\nag@tmporder@a ##1#1##2\relax{%
+ \ifx\nag@quark##2\nag@quark
+ \noexpand\@gobble
+ \else
+ \nag@tmporder@b ##2,#2\relax
+ \fi
+ }%
+ \def\nag@tmporder@b ##1#2##2\relax{%
+ \ifx\nag@quark##2\nag@quark
+ \noexpand\@gobble
+ \else
+ \noexpand\@firstofone
+ \fi
+ }%
+ \@xa\protected@edef\@xa\nag@tmporder\@xa{\@xa\nag@tmporder@a\@filelist,,#1\relax}%
+ \nag@tmporder
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Common float errors and no-nos.}
+%
+% We do the following:
+% \begin{itemize}
+% \item check for presence of a caption
+% \item check for absence of the center environment
+% \item check that a label comes only after a caption
+% \end{itemize}
+%
+% First of all, we define two ifs to memorize whether we have a
+% label and/or a caption in the float already. Package writers may
+% want to set these manually behind \pkg{nag}'s back. In this
+% way, they can suppress possible warnings if they know what
+% they're doing -- we only check at the end of the float
+% environment, which gives them plenty of time to call
+% |\csname nag@haslabeltrue\endcsname| et al.
+% (Thanks to Markus Kohm for pointing out this need.)
+% We initialize |\nag@hascaption| to be true because since 0.60,
+% |\label| always checks if it's after a caption, even outside of
+% floats.
+% \begin{macrocode}
+\newif\ifnag@haslabel
+\newif\ifnag@hascaption\nag@hascaptiontrue
+% \end{macrocode}
+% Now, to the work proper: as of 0.60, it is sufficient to set the
+% label and caption flags to false. |\endcenter| now always checks
+% if it is inside a float (looking at |\@captype|). The label and
+% caption commands are amended only once. This should be
+% sufficient: captions are not handled by letting |\caption| to the
+% proper command upon float entry, so we assume nobody redefines
+% |\caption| at runtime, or they provide more entries to
+% |\nag@captions|. Similar for |\label|, and we do not care about
+% the flag setting outside of floats.
+% \begin{macrocode}
+\newcommand\nag@hackfloat[1]{%
+ \nag@prepend{#1}{%
+ \global\nag@haslabelfalse\global\nag@hascaptionfalse
+ }%
+ \nag@prepend{end#1}{%
+ \ifnag@hascaption\relax\else
+ \nag@warn%
+ {#1 with no \protect\caption}%
+ \fi
+ % labels outside floats shouldn't complain:
+ \global\nag@hascaptiontrue
+ % (we do this always because it needs to be global)
+ }%
+}
+% \end{macrocode}
+% Add checks to all macros named by |\nag@labels|
+% and |\nag@captions|, respectively.
+% \changes{0.3}{2005/07/07}{Fixed missing globals}
+% Scoping of presence-of-caption information:
+% \changes{0.4}{2006/04/19}{bugfix}
+% Well, maybe I should do it the way the kernel does, which means
+% a label is just as local as |\refstepcounter|'s |\@currentlabel|
+% information as of v0.4. I think we can leave captions global.
+% \changes{0.60}{2007/03/31}{Captions/Labels now done only once, and not every time
+% we enter a float}
+% \changes{0.60}{2007/03/31}{@preamblecmds}
+% Big old hack: we do this at |\@preamblecmds|-time, which is after
+% |\AtBeginDocument|, since hyperref loads nameref ABD, and nameref
+% steps all over label. \emph{Note:} We cannot use |\nag@prepend|
+% for this, since it would break the pkgindoc package, which nobody
+% has ever heard of, but it's in the kernel and relies on certain
+% tokens being present in the expansion of |\@preamblecmds|. Now,
+% you pretty much cannot get any later than this.
+%
+% \emph{Note:} we cannot exchange the order of the for loops here:
+% if a cs generates both a label and a caption, it shouldn't get
+% complained about.
+% \begin{macrocode}
+\AtBeginDocument{%
+\g@addto@macro{\@preamblecmds}{%
+ \@for\labelprovider:=\nag@labels\do{%
+ \ifx\labelprovider\@empty\else
+ \nag@prepend{\labelprovider}%
+ {\nag@captioncheck\nag@haslabeltrue}%
+ \fi
+ }%
+ \@for\captionprovider:=\nag@captions\do{%
+ \ifx\captionprovider\@empty\else
+ \nag@prepend{\captionprovider}{\global\nag@hascaptiontrue}%
+ \fi
+ }%
+}%
+}
+\newcommand\nag@captioncheck{%
+ \ifnag@hascaption\else
+ \nag@warn{\protect\label\space in float, but not after
+ \protect\caption}%
+ \fi
+}
+% \end{macrocode}
+% Define the lists of commands that are floats, generate labels,
+% and generate captions, respectively. We don't start with defined
+% floats (that is for nag-l2tabu.cfg to set up). Since v0.52, we handle
+% an empty name, so the lists may be empty. Also, no labels and
+% captions are provided by default since v0.52. This has been moved
+% to nag-l2tabu.cfg.
+% See also
+% |\NagDeclareFloat|, which is the user-level wrapper for new
+% floats. Since there are no packages to define new
+% caption or label commands on an user level, there is no wrapper
+% for those.
+% \begin{macrocode}
+\def\nag@floats{}
+\def\nag@labels{}
+\def\nag@captions{}
+% \end{macrocode}
+%
+% We call the above for each float environment named via
+% |\nag@floats|:
+% \begin{macrocode}
+\newcommand\nag@floatsetup{%
+ \@for\flo:=\nag@floats\do{%
+ \ifx\flo\@empty\else
+ \@xa\nag@hackfloat\@xa{\flo}%
+ \fi
+ }%
+}
+% \end{macrocode}
+% but only after all other packages get their chance to add to the
+% list:
+% \begin{macrocode}
+\AtBeginDocument{%
+ \nag@floatsetup
+}
+% \end{macrocode}
+%
+% At the very end, we will display a running total of complaints.
+% \begin{macrocode}
+\AtBeginDocument{%
+ \AtEndDocument{%
+ \ifnum\value{nag@sins}>0%
+ \PackageWarningNoLine{nag}{\arabic{nag@sins} complaints
+ in total}%
+ \else
+ \typeout{No complaints by nag.}%
+ \fi
+ }%
+}
+% \end{macrocode}
+%
+% \section{Switch vs. Environment}
+%
+% People often use switches as environments and vice versa. This is
+% dangerous in because it tends to \emph{almost} work.
+% (Consider font size commands in particular, but also |\centering|
+% vs. |center| environment.) As usual, ``it's not an error if you
+% know what you're doing''. In particular, it is perfectly valid
+% code to use the |\foo|\dots|\endfoo| syntax. So, |\NotASwitch|
+% needs to trace the calls to |\foo| and see if they match with
+% corresponding |\endfoo|s with its own stack. This might still be
+% brittle. Fortunately, it is currently only needed for
+% nag-orthodox, where it checks for the justification environments.
+%
+% First of all, a helper macro we hinge upon:
+% \changes{0.53}{2007/03/20}{bugfix: more Robustness. (J\"org Sommer)}
+% \begin{macrocode}
+\DeclareRobustCommand\nag@ifCurrentEnvironment[3]{%
+ \bgroup
+ \def\tmp@a{#1}%
+ \ifx\@currenvir\tmp@a
+ #2%
+ \else
+ #3%
+ \fi
+ \egroup
+}
+% \end{macrocode}
+% And now, the two variations there are:
+% \begin{macro}{\NotAnEnvironment}
+% Usage:|\NotAnEnvironment|\marg{command}
+% Issue an error if the user calls |\begin{command}| and not
+% |\command| directly.
+% \begin{macrocode}
+\newcommand\NotAnEnvironment[1]{%
+ \AtBeginDocument{%
+ \nag@prepend{#1}{%
+ \nag@ifCurrentEnvironment{#1}{%
+ \nag@warn{%
+ There is no environment ``#1''.\MessageBreak
+ Maybe you want a grouped \@backslashchar#1
+ }%
+ }{% OK case.
+ }%
+ }%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% |\NotASwitch| is a bit more involved:
+% \begin{macro}{\NotASwitch}
+% Usage:|\NotASwitch|\marg{command}
+% Issue an error if the user calls |\command| and not
+% |\begin{command}| and mis-nests calls or doesn't call
+% |\endcommand| at all.
+% \changes{0.54}{2007/03/27}{bugfix: can't get around the token register. (J\"org Sommer)}
+% \begin{macrocode}
+% we need to maintain a stack of environments that are used in the
+% \foo...\endfoo way.
+\newcommand\nag@envstack{\relax}
+
+\DeclareRobustCommand\nag@beginenv[1]{%
+ % push a begin-entry onto the stack. Form is
+ % |{\foo{lineno}}| for environment foo.
+ \bgroup
+ \@xa\toks@\@xa{\nag@envstack}%
+ \xdef\nag@envstack{%
+ \@nx{%
+ \@xa\@nx\csname #1\endcsname
+ \@nx{\the\inputlineno\@nx}%
+ \@nx}%
+ \the\toks@
+ }%
+ \egroup
+}
+\DeclareRobustCommand\nag@endenv[1]{%
+ % extract the first entry.
+ \@xa\nag@end@nv\nag@envstack\@nil #1\@nil
+}
+
+\def\nag@end@nv#1#2\@nil #3\@nil{%
+ \def\tmp@a{#1}%
+ \def\tmp@b{\relax}%
+ \ifx\tmp@a\tmp@b
+ % This was the end-of-stack flag.
+ \nag@warn{``\@backslashchar end#3'' without matching
+ ``\@backslashchar #3''}
+ \else
+ % We may assume this is a proper entry. See if the begin-token on
+ % the stack matches what |\nag@endenv| was passed.
+ \@xa\ifx\csname #3\@xa\endcsname\@firstoftwo #1%
+ %OK case, just pop the entry.
+ \gdef\nag@envstack{#2}%
+ \else
+ % error case
+ \nag@warn{%
+ You cannot close ``\@xa\string\@firstoftwo #1'' on line
+ \@secondoftwo #1 with ``\@backslashchar end#3''%
+ }%
+ % leave it on the stack. Some case of misnesting will always cause
+ % horrible amounts of follow-up errors. Also, scare them!
+ \fi
+ \fi
+}
+% \end{macrocode}
+% At the end, we complain about all the entries that are still on
+% the stack.
+% \begin{macrocode}
+\AtEndDocument{%
+ \@xa\@tfor\@xa\looseends\@xa:\@xa=\nag@envstack\do{%
+ \@xa\ifx\looseends\relax\else
+ \nag@warnNoLine{Unmatched
+ ``\@xa\@xa\@xa\string\@xa\@firstoftwo\looseends''
+ command on line
+ \@xa\@xa\@xa\string\@xa\@secondoftwo\looseends%
+ }%
+ \fi
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% Now, the user-side command is easy.
+% \begin{macrocode}
+\newcommand\NotASwitch[1]{%
+ \AtBeginDocument{%
+ \nag@prepend{#1}{%
+ \nag@beginenv{#1}%
+ }%
+ \nag@prepend{end#1}{%
+ \nag@endenv{#1}%
+ }%
+ }%
+}
+% \end{macrocode}
+%
+% \section{Compatibility issues}
+% \subsection{The \pkg{caption} package}
+% Axel Sommerfeldt's \pkg{caption} package loads the \pkg{ragged2e}
+% package AtBeginDocument (regardless of whether it is needed).
+% This is too late for us to amend the |\RaggedFoo| commands with
+% |\NotAnEnvironment|. Since v0.51 of \pkg{nag}, they will then be
+% skipped (with information in the log). Earlier versions would
+% fail because by time \pkg{ragged2e} was loaded, the commands were
+% already defined by the amendment process. To make sure the
+% commands \emph{are} amended, load \pkg{ragged2e} explicitly
+% yourself.
+%
+% \subsection{The \pkg{subfig} package}
+% Starting with v0.52 of \pkg{nag}, we recognize the fact that the
+% |\subfloat| command from Steven D. Cochran's \pkg{subfig} package
+% is a caption-provider for its fourth argument. Earlier versions
+% would flag use of |\label| as inappropriate. The current
+% implementation works with versions close enough to v1.3 of
+% \pkg{subfig}. Since the change is a one-liner, I hope it will be
+% integrated into future versions of \pkg{subfig}.
+% \changes{0.52}{2007/02/25}{twiddle subfig's bowels}
+% \begin{macrocode}
+\AtBeginDocument{%
+ \nag@ifcsname{ver@subfig.sty}{%
+ \PackageInfo{nag}{Attempting subfig hack\@gobble}%
+ \nag@maybehacksubfig
+ }{%
+ }%
+}
+\def\nag@maybehacksubfig{%
+ %
+ % of course, i need to touch the single longest definition in
+ % subfig.sty, to amend one single command...
+ %
+ % The definition is taken from subfig.sty 1.3 dated 2005/07/05 by
+ % S.D. Chochran, where it is called sf@@@subfloat, and appears here
+ % under the conditions of section 6 of the LPPL 1.3. The subfig
+ % package is available on a CTAN mirror near you.
+ %
+ \long\def\nag@@original@@sf@@@subfloat##1[##2][##3]##4{%
+ \@ifundefined{FBsc@max}{%
+ }{%
+ \FB@readaux{\let\FBsuboheight\relax}%
+ }%
+ \@tempcnta=\@ne
+ \if@minipage
+ \@tempcnta=\z@
+ \else\ifdim \lastskip=\z@ \else
+ \@tempcnta=\tw@
+ \fi\fi
+ \ifmaincaptiontop
+ \sf@top=\sf@nearskip
+ \sf@bottom=\sf@farskip
+ \else
+ \sf@top=\sf@farskip
+ \sf@bottom=\sf@nearskip
+ \fi
+ \leavevmode
+ \setbox\@tempboxa \hbox{%
+ ##4}%
+ \@tempdima=\wd\@tempboxa
+ \@ifundefined{FBsc@max}{%
+ }{%
+ \global\advance\Xhsize-\wd\@tempboxa
+ \dimen@=\ht\@tempboxa
+ \advance\dimen@\dp\@tempboxa
+ \ifdim\dimen@>\FBso@max
+ \global\FBso@max\dimen@
+ \fi
+ }%
+ \vtop\bgroup
+ \vbox\bgroup
+ \ifcase\@tempcnta
+ \@minipagefalse
+ \or
+ \vskip\sf@top
+ \or
+ \ifdim \lastskip=\z@ \else
+ \@tempskipb\sf@top\relax\@xaddvskip
+ \fi
+ \fi
+ \sf@ifpositiontop{%
+ \ifx \@empty##3\relax \else
+ \sf@subcaption{##1}{##2}{##3}%
+ \vskip\sf@capskip
+ \vskip\sf@captopadj
+ \fi\egroup
+ \hrule width0pt height0pt depth0pt
+ \box\@tempboxa
+ }{%
+ \@ifundefined{FBsc@max}{%
+ \box\@tempboxa
+ }{%
+ \ifx\FBsuboheight\relax
+ \box\@tempboxa
+ \else
+ \vbox to \FBsuboheight{\FBafil\box\@tempboxa\FBbfil}%
+ \fi}%
+ \egroup
+ \ifx \@empty##3\relax \else
+ \vskip\sf@capskip
+ \hrule width0pt height0pt depth0pt
+ \sf@subcaption{##1}{##2}{##3}%
+ \fi
+ }%
+ \vskip\sf@bottom
+ \egroup
+ \@ifundefined{FBsc@max}{%
+ }{%
+ \addtocounter{FRobj}{-1}%
+ \ifnum\c@FRobj=0\else
+ \subfloatrowsep
+ \fi
+ }%
+ \ifmaincaptiontop\else
+ \global\advance\@nameuse{c@\@captype}\m@ne
+ \fi
+ \endgroup\ignorespaces}%
+ %
+ \expandafter\ifx\csname sf@@@subfloat\endcsname\nag@@original@@sf@@@subfloat
+ % yup, that's it.
+ \PackageInfo{nag}{OK, equivalent to subfig 1.3, redefining
+ \@backslashchar sf@@@subfloat\@gobble}%
+ \global\long\def\sf@@@subfloat##1[##2][##3]##4{%
+ \@ifundefined{FBsc@max}{%
+ }{%
+ \FB@readaux{\let\FBsuboheight\relax}%
+ }%
+ \@tempcnta=\@ne
+ \if@minipage
+ \@tempcnta=\z@
+ \else\ifdim \lastskip=\z@ \else
+ \@tempcnta=\tw@
+ \fi\fi
+ \ifmaincaptiontop
+ \sf@top=\sf@nearskip
+ \sf@bottom=\sf@farskip
+ \else
+ \sf@top=\sf@farskip
+ \sf@bottom=\sf@nearskip
+ \fi
+ \leavevmode
+ \setbox\@tempboxa \hbox{%
+ %% ulmi: new 2007/02/25: #4 may contain label command
+ \csname nag@hascaptiontrue\endcsname
+ %% and that was it.
+ ##4}%
+ \@tempdima=\wd\@tempboxa
+ \@ifundefined{FBsc@max}{%
+ }{%
+ \global\advance\Xhsize-\wd\@tempboxa
+ \dimen@=\ht\@tempboxa
+ \advance\dimen@\dp\@tempboxa
+ \ifdim\dimen@>\FBso@max
+ \global\FBso@max\dimen@
+ \fi
+ }%
+ \vtop\bgroup
+ %% ulmi: new 2007/05/10: #2, #3 may contain label command
+ \csname nag@hascaptiontrue\endcsname
+ %% and that was it.
+ \vbox\bgroup
+ \ifcase\@tempcnta
+ \@minipagefalse
+ \or
+ \vskip\sf@top
+ \or
+ \ifdim \lastskip=\z@ \else
+ \@tempskipb\sf@top\relax\@xaddvskip
+ \fi
+ \fi
+ \sf@ifpositiontop{%
+ \ifx \@empty##3\relax \else
+ \sf@subcaption{##1}{##2}{##3}%
+ \vskip\sf@capskip
+ \vskip\sf@captopadj
+ \fi\egroup
+ \hrule width0pt height0pt depth0pt
+ \box\@tempboxa
+ }{%
+ \@ifundefined{FBsc@max}{%
+ \box\@tempboxa
+ }{%
+ \ifx\FBsuboheight\relax
+ \box\@tempboxa
+ \else
+ \vbox to \FBsuboheight{\FBafil\box\@tempboxa\FBbfil}%
+ \fi}%
+ \egroup
+ \ifx \@empty##3\relax \else
+ \vskip\sf@capskip
+ \hrule width0pt height0pt depth0pt
+ \sf@subcaption{##1}{##2}{##3}%
+ \fi
+ }%
+ \vskip\sf@bottom
+ \egroup
+ \@ifundefined{FBsc@max}{%
+ }{%
+ \addtocounter{FRobj}{-1}%
+ \ifnum\c@FRobj=0\else
+ \subfloatrowsep
+ \fi
+ }%
+ \ifmaincaptiontop\else
+ \global\advance\@nameuse{c@\@captype}\m@ne
+ \fi
+ \endgroup\ignorespaces}%
+ \else
+ \PackageInfo{nag}{Not redefining sf@@@subfloat, it looks odd\@gobble}
+ \fi
+}
+% \end{macrocode}
+%
+% \subsection{The \pkg{float} package}
+% Sorry, there is no way for \pkg{nag} to automatically add new
+% float types to check them for captions. However, since v0.52,
+% there is an user-level command |\NagDeclareFloat| that will do
+% the bookkeeping for you, i.e. after your call to |\newfloat|, you
+% call |\NagDeclareFloat| with the first argument to |\newfloat|.
+% \changes{0.52}{2007/02/25}{Command NagDeclareFloat added}
+% \begin{macrocode}
+\newcommand*\NagDeclareFloat[1]{\g@addto@macro\nag@floats{,#1}}
+% \end{macrocode}
+%
+% \subsection{The \pkg{topcapt} package and the \pkg{subfig} package}
+% nagdemo exhibits an error when topcapt and subfig are used
+% together, i.e. \pkg{subfig} thinks the caption has not been
+% stepped already. This is not a bug in \pkg{nag}.
+%
+% \subsection{The \pkg{rotating} package}
+% \pkg{rotating} uses \cmd{\centerline} to place rotated floats. As
+% far as I can see, the usage is legitimate there, and using
+% \cmd{\centering} instead would change behaviour when the float's
+% dimension are larger than the text body. (Currently, the height
+% of the figure may exceed \cmd{\textwidth} without warning.) If this
+% bothers you, go read the warning on p.~\pageref{disclaimer} again.
+%
+% \subsection{Version control packages}
+% Common version control systems like rcs, cvs, svn insert their keywords
+% between dollar signs. Packages that parse these keywords define their
+% commands and usually assume catcode 3, which is not true if either
+% \pkg{onlyamsmath} or \pkg{nag} is loaded. Special handling is
+% introduced for \pkg{rcs} and \pkg{svninfo}. In case of \pkg{rcsinfo},
+% \pkg{svn} and \pkg{pgf} (yes, it's got internal VC handling that fails
+% when \cmd{\pgfuselibrary} is used outside the preamble -- thanks to
+% Ralf Th\"ole for spotting this one), dollar checking is disabled.
+%
+% \section{Loading extensions}
+% Finally, we deal with package options.
+% This is simple: just try to input appropriate nag files.
+% \changes{0.4}{2006/04/19}{config file names changed to free extension}
+% \begin{macrocode}
+\DeclareOption*{%
+ \InputIfFileExists{nag-\CurrentOption.cfg}{%
+ \PackageInfo{nag}{%
+ Loaded nag-\CurrentOption.cfg
+ }
+ }{%
+ \InputIfFileExists{\CurrentOption.nag}{%
+ \PackageWarningNoLine{nag}{%
+ Loaded old-style config file \CurrentOption.nag.\MessageBreak
+ Consider renaming the file to nag-\CurrentOption.cfg
+ }%
+ }{%
+ \PackageWarningNoLine{nag}{Required ruleset
+ \CurrentOption, and it wasn't there}
+ }%
+ }
+}
+\ProcessOptions*
+% \end{macrocode}
+%\iffalse
+%</nag>
+%\fi
+% \PrintChanges
+%\PrintIndex
+%\Finale
+%\iffalse
+%%X Local Variables:
+%%X mode: latex
+%%X End:
+%\fi
diff --git a/macros/latex/contrib/nag/nag.ins b/macros/latex/contrib/nag/nag.ins
new file mode 100644
index 0000000000..d317aa777c
--- /dev/null
+++ b/macros/latex/contrib/nag/nag.ins
@@ -0,0 +1,50 @@
+%%
+%% This is a bog-standard .ins file: nag.ins
+%%
+\input docstrip.tex
+\keepsilent
+\preamble
+This is a generated file.
+
+This file is part of the `nag' package.
+The `nag' package has the LPPL maintenance status: maintained.
+Current Maintainer is Ulrich M. Schwarz, ulmi@absatzen.de
+
+Copyright (C) 2005-8 by Ulrich M. Schwarz.
+
+This file may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3a 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
+
+\endpreamble
+
+\generate{\file{nag.sty}{\from{nag.dtx}{nag}}
+ \file{nag-l2tabu.cfg}{\from{nag.dtx}{l2tabunag}}
+ \file{nag-abort.cfg}{\from{nag.dtx}{abortnag}}
+ \file{nag-orthodox.cfg}{\from{nag.dtx}{orthodoxnag}}
+ \file{nag-experimental.cfg}{\from{nag.dtx}{experimentalnag}}
+ \file{nagdemo.tex}{\from{nag.dtx}{nagdemo}}}
+\Msg{*********************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the}
+\Msg{* following files into a directory searched by TeX:}
+\Msg{*}
+\Msg{* \space\space nag.sty}
+\Msg{* \space\space nag-l2tabu.cfg}
+\Msg{* \space\space nag-abort.cfg}
+\Msg{* \space\space nag-orthodox.cfg}
+\Msg{* \space\space nag-experimental.cfg}
+\Msg{*}
+\Msg{* To produce the fully-indexed documentation run}
+\Msg{latex nag.dtx}
+\Msg{makeindex -s gglo.ist -o nag.gls nag.glo}
+\Msg{makeindex -s gind.ist -o nag.ind nag.idx}
+\Msg{latex nag.dtx}
+\Msg{*}
+\Msg{* To see something happen, run}
+\Msg{latex nagdemo}
+\Msg{* Happy TeXing!}
+\Msg{*********************************************************}
+\endbatchfile
diff --git a/macros/latex/contrib/nag/nag.pdf b/macros/latex/contrib/nag/nag.pdf
new file mode 100644
index 0000000000..128487367d
--- /dev/null
+++ b/macros/latex/contrib/nag/nag.pdf
Binary files differ