From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001
From: Norbert Preining <norbert@preining.info>
Date: Mon, 2 Sep 2019 13:46:59 +0900
Subject: Initial commit

---
 macros/latex/contrib/pagerange/pagerange.sty | 237 +++++++++++++++++++++++++++
 1 file changed, 237 insertions(+)
 create mode 100644 macros/latex/contrib/pagerange/pagerange.sty

(limited to 'macros/latex/contrib/pagerange/pagerange.sty')

diff --git a/macros/latex/contrib/pagerange/pagerange.sty b/macros/latex/contrib/pagerange/pagerange.sty
new file mode 100644
index 0000000000..c6be8784ae
--- /dev/null
+++ b/macros/latex/contrib/pagerange/pagerange.sty
@@ -0,0 +1,237 @@
+%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+% This is file 'pagerange.sty', version 0.5.                                %
+%                                                                           %
+% This work may be distributed and/or modified under the conditions         %
+% of the LaTeX Project Public License, either version 1.3 of this           %
+% license or any later version. The latest version of this license          %
+% is in http://www.latex-project.org/lppl.txt and version 1.3 or later      %
+% is part of all distributions of LaTeX version 2005/12/01 or later.        %
+%                                                                           %
+% The LPPL maintenance status of this software is 'author-maintained'.      %
+%                                                                           %
+% This software is provided 'as it is', without warranty of any kind,       %
+% either expressed or implied, including, but not limited to, the           %
+% implied warranties of merchantability and fitness for a particular        %
+% purpose.                                                                  %
+%                                                                           %
+% Copyright (c) 2010 Ahmed Musa (a.musa@rocketmail.com).                    %
+%+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++%
+\begingroup
+\catcode064 11\relax% @
+\catcode123 01\relax% {
+\catcode125 02\relax% }
+\def\prg@tempa{\endgroup
+  \edef\prg@restorecodes{%
+    \catcode035 \the\catcode035\relax% #
+    \catcode064 \the\catcode064\relax% @
+    \catcode123 \the\catcode123\relax% {
+    \catcode125 \the\catcode125\relax% }
+    \catcode061 \the\catcode061\relax% =
+    \catcode038 \the\catcode038\relax% &
+  }%
+}
+\prg@tempa
+\catcode061 12\relax% =
+\catcode035 06\relax% #
+\catcode064 11\relax% @
+\catcode123 01\relax% {
+\catcode125 02\relax% }
+\catcode038 03\relax% &
+\AtEndOfPackage{\prg@restorecodes}
+\ProvidesPackage{pagerange}%
+  [2010/02/04 v0.5 Split page ranges intelligently (Ahmed Musa)]
+\NeedsTeXFormat{LaTeX2e}[1996/12/01]
+\@ifpackageloaded{lastpage}{}{\RequirePackage{lastpage}[1994/06/25]}
+\@ifpackageloaded{xkeyval}{}{\RequirePackage{xkeyval}[2008/08/13]}
+\ifcase0%
+  \ifx\eTeXversion\@undefined 1\else\ifnum\eTeXversion<\tw@ 1\fi\fi
+\else
+  \@latex@error{eTeX not loaded or old version.\MessageBreak
+    This package requires eTeX version 2 or later.}\@ehc
+\fi
+\newcommand*\prg@ifdefinable[1]{%
+  \edef\reserved@a{\expandafter\@gobble\string#1}%
+  \begingroup
+  \ifdefined#1%
+    \aftergroup\@notdefinable
+  \else
+    \edef\reserved@b{\expandafter\@carcube\reserved@a xxx\@nil}%
+    \ifx\reserved@b\@qend
+      \aftergroup\@notdefinable
+    \else
+      \ifx\reserved@a\@qrelax
+        \aftergroup\@notdefinable
+      \else
+        \aftergroup\@firstofone
+      \fi
+    \fi
+  \fi
+  \endgroup
+}
+\prg@ifdefinable\prg@protect@relax\relax
+\prg@ifdefinable\prg@star@or@long\relax
+\prg@ifdefinable\prg@pdef\relax
+\prg@ifdefinable\prg@@def\relax
+\def\prg@star@or@long#1{%
+  \@ifstar{\let\prg@protect@relax\protected#1}%
+    {\def\prg@protect@relax{\protected\long}#1}%
+}
+\let\prg@protect@relax\protected
+\protected\def\prg@pdef{\prg@star@or@long\prg@@def}
+\def\prg@@def#1{\prg@ifdefinable#1{\prg@protect@relax\def#1}}
+\prg@pdef\prg@warn#1{\PackageWarningNoLine{pagerange}{#1}}
+\prg@pdef\prg@err#1{\PackageError{pagerange}{#1}\@ehc}
+\prg@ifdefinable\prg@tempcnta{\newcount\prg@tempcnta}
+\prg@ifdefinable\prg@tempcntb{\newcount\prg@tempcntb}
+\prg@ifdefinable\prg@tempcntc{\newcount\prg@tempcntc}
+\def\prg@c@r#1#2{%
+  \unless\ifx#2\null
+    \prg@err{Inadmissible multiple arguments '\string#1\string#2'
+      \MessageBreak for '\string\prg@ifdef' test}%
+  \fi
+}
+\prg@ifdefinable\prg@ifdef\relax
+\def\prg@ifdef#1{%
+  \prg@c@r#1\null
+  \csname @\ifdefined#1\expandafter first\else
+    \expandafter second\fi oftwo\endcsname
+}
+\prg@ifdefinable\prg@ifundef\relax
+\def\prg@ifundef#1{%
+  \prg@ifdef{#1}{\csname @\ifx#1\relax\expandafter first\else
+    \expandafter second\fi oftwo\endcsname}{\@firstoftwo}%
+}
+\def\prg@ifcsundef#1{\expandafter\prg@ifundef\csname#1\endcsname}
+\prg@pdef*\prg@check@ifdef#1{%
+  \prg@ifcsundef{#1}{}{%
+    \prg@err{\expandafter\noexpand\csname#1\endcsname already defined}%
+  }%
+  \prg@check@ifdef
+}
+\prg@check@ifdef{pagerange}{pagestart}{pageend}{getpagenumber}%
+  {pagerangeoptions}\iffalse\fi\fi\endcsname{}{}
+\prg@pdef\prg@ifblank#1{\prg@ifbl@nk#1&&\@secondoftwo\@firstoftwo:}
+\long\def\prg@ifbl@nk#1#2&#3#4#5:{#4}
+\prg@pdef\prg@xifblank#1{\begingroup
+  \protected@edef\prg@tempa{\endgroup\noexpand\prg@ifblank{#1}}%
+  \prg@tempa
+}
+\prg@pdef\prg@ifmacro#1{%
+  \begingroup
+  \edef\prg@tempa{\endgroup
+    \def\noexpand\getparameter####1\detokenize{macro}:####2&{%
+      \noexpand\prg@ifblank{####2}{\noexpand\@secondoftwo}%
+        {\noexpand\@firstoftwo}%
+    }%
+    \noexpand\expandafter\noexpand\getparameter%
+    \noexpand\meaning\noexpand#1\detokenize{macro}:&%
+  }\prg@tempa
+}
+\def\prg@ismacro@err#1{%
+  \prg@err{%
+    Illegal tie '#1'.\MessageBreak
+    Note that the 'tie' has been expanded once\MessageBreak
+    and may be different from what you submitted.\MessageBreak
+    Perhaps you've used an active character as 'tie'
+  }%
+}
+\define@cmdkey[KV]{pagerange}[prg@]{tie}[-]{%
+  \edef\@tempa{\expandafter\noexpand\prg@tie}%
+  \edef\prg@tie{\prg@tie}%
+  \let\@@protect\protect\let\protect\@empty
+  \expandafter\prg@ifmacro\expandafter{\prg@tie}{%
+    \restore@protect\prg@ismacro@err\@tempa
+  }{}%
+  \restore@protect
+}
+\define@boolkey[KV]{pagerange}[prg@]{acceptempty}[true]{}
+\define@cmdkey[KV]{pagerange}[prg@]{defaultfirstpage}[1]{}
+\define@cmdkey[KV]{pagerange}[prg@]{defaultlastpage}%
+  [\getpagenumber{LastPage}]{}
+\DeclareOptionX*{\prg@warn{Unknown option '\CurrentOption' ignored}}
+\ExecuteOptionsX<pagerange>{tie,defaultfirstpage,defaultlastpage}
+\ProcessOptionsX*<pagerange>\relax
+\long\def\pagerangeoptions#1{\setkeys[KV]{pagerange}{#1}}
+\prg@pdef\prg@forall#1#2\do#3{%
+  #3{#1}%
+  \expandafter\ifx\expandafter\@empty\detokenize{#2}\@empty%
+    \relax
+  \else
+    \prg@forall#2\do{#3}%
+  \fi
+}
+\let\pagestart\@empty
+\let\pageend\@empty
+\prg@tempcntc=\z@
+\prg@pdef*\prg@split@pagerange#1{%
+  \def\reserved@a{#1}%
+  \ifx\reserved@a\prg@tie
+    \advance\prg@tempcntc\@ne
+  \fi
+  \ifnum\prg@tempcntc=\z@
+    \g@addto@macro\pagestart{#1}%
+  \else\ifnum\prg@tempcntc=\@ne
+    \ifx\reserved@a\prg@tie\else
+      \g@addto@macro\pageend{#1}%
+    \fi
+  \else\ifnum\prg@tempcntc>\@ne
+    \prg@err{Multiple ties in page range.\MessageBreak
+      Please use only one tie}%
+  \fi\fi\fi
+}
+\prg@tempcnta=\z@\prg@tempcntb=\z@
+\def\pagerange#1{%
+  \let\pagestart\@empty
+  \let\pageend\@empty
+  \prg@tempcntc=\z@
+  \prg@xifblank{#1}{%
+    \ifprg@acceptempty
+      \prg@warn{Blank page range supplied:\MessageBreak
+        I've therefore set the range as 1-1 and continued}
+      \let\pagestart\prg@defaultfirstpage
+      \let\pageend\prg@defaultlastpage
+    \else
+      \prg@err{Blank page range.\MessageBreak
+        If you really mean blank pagerange,\MessageBreak
+        then also use 'acceptempty' boolean option
+      }%
+    \fi
+  }{%
+    \begingroup\edef\prg@tempa{\endgroup%
+      \prg@forall#1\noexpand\do{\prg@split@pagerange}}%
+    \prg@tempa
+  }%
+  \ifx\@empty\pagestart
+    \ifnum\prg@tempcntc=\@ne
+      \let\pagestart\prg@defaultfirstpage
+    \fi
+  \fi
+  \prg@tempcnta=\number\pagestart\relax
+  \ifx\@empty\pageend
+    \prg@tempcntb=\@M
+    \ifnum\prg@tempcntc=\@ne
+      \let\pageend\prg@defaultlastpage
+    \fi
+  \else
+    \prg@tempcntb=\number\pageend\relax
+  \fi
+  \ifnum\prg@tempcnta>\prg@tempcntb
+    \prg@err{Inconsistent page range: Page \pageend\space > \pagestart}%
+  \fi
+}
+\def\prg@carr#1#2#3\@nil{%
+  \expandafter\ifx\expandafter\relax\detokenize{#3}\relax
+    \prg@err{Problem with page reference}
+  \fi
+  #2%
+}
+\def\getpagenumber#1{%
+  \prg@ifcsundef{r@#1}{\prg@defaultfirstpage}{%
+    \expandafter\expandafter\expandafter\prg@carr
+    \csname r@#1\endcsname\prg@defaultfirstpage\@nil
+  }%
+}
+
+\endinput
+
+%%% End of file pagerange.sty %%%
\ No newline at end of file
-- 
cgit v1.2.3

