summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/thmtools/unique.dtx
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/thmtools/unique.dtx')
-rw-r--r--Master/texmf-dist/source/latex/thmtools/unique.dtx190
1 files changed, 190 insertions, 0 deletions
diff --git a/Master/texmf-dist/source/latex/thmtools/unique.dtx b/Master/texmf-dist/source/latex/thmtools/unique.dtx
new file mode 100644
index 00000000000..ee045b08e40
--- /dev/null
+++ b/Master/texmf-dist/source/latex/thmtools/unique.dtx
@@ -0,0 +1,190 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2005-7 by Ulrich M. Schwarz
+%
+%Redistribution and use in source and binary forms, with or without
+%modification, are permitted provided that the following conditions
+%are met:
+%1. Redistributions of source code must retain the above copyright
+% notice, this list of conditions and the following disclaimer.
+%2. Redistributions in binary form must reproduce the above copyright
+% notice, this list of conditions and the following disclaimer in the
+% documentation and/or other materials provided with the distribution.
+%3. All advertising materials mentioning features or use of this software
+% must display the following acknowledgement:
+% This product includes software developed by Ulrich M. Schwarz
+%4. Neither the name of the author nor the names of his contributors
+% may be used to endorse or promote products derived from this software
+% without specific prior written permission.
+%
+%THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+%INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+%FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+%AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+%OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+%SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+%INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+%CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+%ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+%POSSIBILITY OF SUCH DAMAGE.
+%
+%
+% \fi
+%
+%\iffalse
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{unique}
+
+\usepackage[T1]{fontenc}
+\usepackage{fourier}
+\usepackage[scaled=0.87]{luximono, helvet}
+\newcommand\pkg{\textsf}
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\GetFileInfo{unique.sty}
+\author{Ulrich M. Schwarz\thanks{ulmi at absatzen dot de}}
+\title{The \pkg{unique} package\thanks{%
+ This documents \pkg{unique}~\fileversion, dated~\filedate.
+ Newer versions might be found at http://absatzen.de
+}}
+\begin{document}
+ \maketitle
+ \DocInput{unique.dtx}
+\end{document}
+%</driver>
+%<*code>
+%\fi
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{unique}[2007/07/29 v0.1 test for uniqueness (ulmi)]
+% \end{macrocode}
+%
+% \section{Implementation and Usage}
+%
+% \iffalse $Id: unique.dtx,v 1.2 2008/02/10 10:23:32 ulmi Exp $\fi
+% \begin{macro}{\setuniqmark}
+% Call this with a name to set the corresponding uniqmark. The name must
+% be suitable for |\csname|-constructs, i.e. fully expansible to a
+% string of characters. If you use some counter values to generate this,
+% it might be a good idea to try and use hyperref's |\theH...| macros,
+% which have similar restrictions. You can check whether a particular
+% |\setuniqmark| was called more than once during \emph{the last run}
+% with |\ifuniq|.
+% \begin{macrocode}
+\newcommand\setuniqmark[1]{%
+ \expandafter\ifx\csname uniq@now@#1\endcsname\relax
+ \global\@namedef{uniq@now@#1}{\uniq@ONE}%
+ \else
+ \expandafter\ifx\csname uniq@now@#1\endcsname\uniq@MANY\else
+ \immediate\write\@auxout{%
+ \string\uniq@setmany{#1}%
+ }%
+ \ifuniq{#1}{%
+ \uniq@warnnotunique{#1}%
+ }{}%
+ \fi
+ \global\@namedef{uniq@now@#1}{\uniq@MANY}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifuniq}
+% Companion to |\setuniqmark|: if the uniqmark given in the first
+% argument was called more than once, execute the second argument,
+% otherwise execute the first argument. Note than no call to
+% |\setuniqmark| for a particular uniqmark at all means that this
+% uniqmark is unique.
+%
+% This is a lazy version: we could always say false if we already had two calls
+% to setuniqmark this run, but we have to rerun for any ifuniq prior
+% to the first setuniqmark anyway, so why bother?
+% \begin{macrocode}
+\newcommand\ifuniq[1]{%
+ \expandafter\ifx\csname uniq@last@#1\endcsname\uniq@MANY
+ \expandafter \@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% Two quarks to signal if we have seen an uniqmark more than once.
+% \begin{macrocode}
+\def\uniq@ONE{\uniq@ONE}
+\def\uniq@MANY{\uniq@MANY}
+% \end{macrocode}
+% Flag: suggest a rerun?
+% \begin{macrocode}
+\newif\if@uniq@rerun
+% \end{macrocode}
+%
+% Helper macro: a call to this is written to the .aux file when we see
+% an uniqmark for the second time. This sets the right information for
+% the next run. It also checks on subsequent runs if the number of
+% uniqmarks drops to less than two, so that we'll need a rerun.
+% \begin{macrocode}
+\def\uniq@setmany#1{%
+ \global\@namedef{uniq@last@#1}{\uniq@MANY}%
+ \AtEndDocument{%
+ \uniq@warnifunique{#1}%
+ }%
+}
+% \end{macrocode}
+%
+% Warning if something is unique now. This always warns if the
+% setting for this run is not ``many'', because it was generated
+% by a setmany from the last run.
+% \begin{macrocode}
+\def\uniq@warnifunique#1{%
+ \expandafter\ifx\csname uniq@now@#1\endcsname\uniq@MANY\else
+ \PackageWarningNoLine{uniq}{%
+ `#1' is unique now.\MessageBreak
+ Rerun LaTeX to pick up the change%
+ }%
+ \@uniq@reruntrue
+ \fi
+}
+% \end{macrocode}
+%
+% Warning if we have a second uniqmark this run around. Since this is
+% checked immediately, we could give the line of the second
+% occurence, but we do not do so for symmetry.
+% \begin{macrocode}
+\def\uniq@warnnotunique#1{%
+ \PackageWarningNoLine{uniq}{%
+ `#1' is not unique anymore.\MessageBreak
+ Rerun LaTeX to pick up the change%
+ }%
+ \@uniq@reruntrue
+}
+% \end{macrocode}
+%
+% Maybe advise a rerun (duh!). This is executed at the end of the
+% second reading of the aux-file. If you manage to set uniqmarks
+% after that (though I cannot imagine why), you might need reruns
+% without being warned, so don't to that.
+% \begin{macrocode}
+\def\uniq@maybesuggestrerun{%
+ \if@uniq@rerun
+ \PackageWarningNoLine{uniq}{%
+ Uniquenesses have changed. \MessageBreak
+ Rerun LaTeX to pick up the change%
+ }%
+ \fi
+}
+% \end{macrocode}
+%
+% Make sure the check for rerun is pretty late in processing, so it
+% can catch all of the uniqmarks (hopefully).
+% \begin{macrocode}
+\AtEndDocument{%
+ \immediate\write\@auxout{\string\uniq@maybesuggestrerun}%
+}
+% \end{macrocode}
+%\iffalse
+%</code>
+%\fi