From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining 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#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{tie,defaultfirstpage,defaultlastpage} +\ProcessOptionsX*\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