From 63c4f21a5716ebbed11926d0bfbb26d656a766ea Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Sat, 18 Jul 2020 03:01:08 +0000
Subject: CTAN sync 202007180301

---
 macros/latex/contrib/thmtools/source/unique.dtx | 175 ++++++++++++++++++++++++
 1 file changed, 175 insertions(+)
 create mode 100644 macros/latex/contrib/thmtools/source/unique.dtx

(limited to 'macros/latex/contrib/thmtools/source/unique.dtx')

diff --git a/macros/latex/contrib/thmtools/source/unique.dtx b/macros/latex/contrib/thmtools/source/unique.dtx
new file mode 100644
index 0000000000..bf013ca6d4
--- /dev/null
+++ b/macros/latex/contrib/thmtools/source/unique.dtx
@@ -0,0 +1,175 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2005-2014 by Ulrich M. Schwarz
+% Copyright (C) 2019      by Frank Mittelbach
+% Copyright (C) 2020-     by Yukai Chou
+%
+% This file may be distributed and/or modified under the conditions of
+% the LaTeX Project Public License, version 1.3c.
+% The license can be obtained from
+% http://www.latex-project.org/lppl/lppl-1.3c.txt
+%
+% \fi
+%
+%\iffalse
+%<*code>
+%\fi
+%    Two macros are provided: |\setuniqmark| takes a single parameter,
+%    the name, which should be a string of letters. |\ifuniqmark| takes
+%    three parameters: a name, a true-part and a false-part. The true
+%    part is executed if and only if there was exactly one call to
+%    |\setuniqmark| with the given name during the previous \LaTeX\ run.
+%
+%    Example application: legal documents are often very strongly numbered.
+%    However, if a section has only a single paragraph, this paragraph is
+%    not numbered separately, this only occurs from two paragraphs onwards.
+%
+%    It's also possible to not-number the single theorem in your paper, but
+%    fall back to numbering when you add another one.
+%
+%     \StopEventually{}
+%
+%    \begin{macrocode}
+
+\DeclareOption{unq}{%
+  \newwrite\uniq@channel
+  \InputIfFileExists{\jobname.unq}{}{}%
+  \immediate\openout\uniq@channel=\jobname.unq
+  \AtEndDocument{%
+    \immediate\closeout\uniq@channel%
+  }
+}
+\DeclareOption{aux}{%
+  \let\uniq@channel\@auxout
+}
+
+%    \end{macrocode}
+%
+%
+%    \iffalse $Id: unique.dtx,v 1.4 2010/04/25 19:37:46 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\uniq@channel{%
+    \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}%
+}
+\ExecuteOptions{aux}
+\ProcessOptions\relax
+%    \end{macrocode}
+%\iffalse
+%</code>
+%\fi
-- 
cgit v1.2.3

