diff options
author | Karl Berry <karl@freefriends.org> | 2013-09-05 22:37:01 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2013-09-05 22:37:01 +0000 |
commit | 74d2dc6f336ce377ad1fda6cb1b59ba10e5611bc (patch) | |
tree | bf29e1eba90e9d4997f91341402b4f567f9b23d0 /Master/texmf-dist/tex | |
parent | 1098b87bad357ad17ed46e5cf00ebdf7e0de373e (diff) |
arraysort (5sep13)
git-svn-id: svn://tug.org/texlive/trunk@31576 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/arraysort/arraysort.sty | 214 |
1 files changed, 214 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/arraysort/arraysort.sty b/Master/texmf-dist/tex/latex/arraysort/arraysort.sty new file mode 100644 index 00000000000..7c7455a1772 --- /dev/null +++ b/Master/texmf-dist/tex/latex/arraysort/arraysort.sty @@ -0,0 +1,214 @@ +%% +%% This is file `arraysort.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% arraysort.dtx (with options: `package') +%% +%% This is a generated file. +%% +%% Copyright (C) 2013 by Robert J Lee +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.2 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 +%% +%% and version 1.2 or later is part of all distributions of +%% LaTeX version 1999/12/01 or later. +%% +\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\ProvidesPackage{arraysort} + [2013/09/04 v1.0 sorting arrayjobx arrays] +\newcommand*{\arraysort@extrapkgs}{} +\DeclareOption{comparestr}{ + \g@addto@macro{\arraysort@extrapkgs}{ + \RequirePackage{pdftexcmds}% for comparison. TODO: use compare.sty optionally + } + \newcommand*{\arraysortcomparestr}[2]{% + \protected@edef\arraysort@left{#1}% + \protected@edef\arraysort@right{#2}% + \arraysort@comparestr% + } + \newcommand*{\arraysort@comparestr}{% + \protected@edef\arraysort@compresult{\pdf@strcmp{\arraysort@left}{\arraysort@right}}% + \ifthenelse{\equal{\arraysort@compresult}{0}}{% + \toggletrue{arraysortresequal}% + }{% + \togglefalse{arraysortresequal}% + \ifthenelse{\equal{\arraysort@compresult}{-1}}{% + \toggletrue{arraysortresult}% #2 > #1 + }{% + \togglefalse{arraysortresult}% #2 < #1 + }% + }% + } +} +\DeclareOption{comparenum}{ + \newcommand*{\arraysortcomparenum}[2]{% + \ifthenelse{\equal{#1}{#2}}{% + \toggletrue{arraysortresequal}% + }{% + \togglefalse{arraysortresequal}% + \ifthenelse{#2 > #1}{% + \toggletrue{arraysortresult}% + }{% + \togglefalse{arraysortresult}% + }% + }% + } +} +\newcommand*{\sortArrayPartitionMed}[4]{% + \setcounter{arraysort@temp1}{(#2 + #3) / 2}% + \edef\arraysort@midpos{\arabic{arraysort@temp1}}% + \testarray{#4}(#2)\protected@edef\arraysort@left{\temp@macro}% + \testarray{#4}(\arraysort@midpos)\protected@edef\arraysort@mid{\temp@macro}% + \testarray{#4}(#3)\protected@edef\arraysort@right{\temp@macro}% + \csname#1\endcsname{\arraysort@left}{\arraysort@mid}% + \iftoggle{arraysortresequal}{% + }{% + \iftoggle{arraysortresult}{% + \csname#1\endcsname{\arraysort@left}{\arraysort@right}% + \iftoggle{arraysortresequal}{% + }{% + \iftoggle{arraysortresult}{% + \csname#1\endcsname{\arraysort@mid}{\arraysort@right}% + \iftoggle{arraysortresequal}{% + }{% + \iftoggle{arraysortresult}{% + \arraysort@swap{#4}{#2}{\arraysort@midpos}% + }{% + \arraysort@swap{#4}{#2}{#3}% + }% + }% + }{% + }% + }% + }{% + \csname#1\endcsname{\arraysort@mid}{\arraysort@right}% + \iftoggle{arraysortresequal}{% + }{% + \iftoggle{arraysortresult}{% + \arraysort@swap{#4}{#2}{#3}% + }{% + \arraysort@swap{#4}{#2}{\arraysort@midpos}% + }% + }% + }% + }% + \sortArrayPartitionFirst{#1}{#2}{#3}{#4}% +} +\DeclareOption{randompart}{ + \g@addto@macro{\arraysort@extrapkgs}{ + \RequirePackage[quiet]{lcg} + } + \newcommand*{\sortArrayPartitionRand}[4]{% + \reinitrand[counter=arraysort@temp1,first=#2,last=#3,quiet=y]% + \rand% + \arraysort@swap{#4}{#2}{\arabic{arraysort@temp1}}% + \sortArrayPartitionFirst{#1}{#2}{#3}{#4}% + } +} +\newcommand*{\sortArrayPartitionMid}[4]{% + \setcounter{arraysort@temp1}{(#2 + #3) / 2}% + \arraysort@swap{#4}{#2}{\arabic{arraysort@temp1}}% + \sortArrayPartitionFirst{#1}{#2}{#3}{#4}% +} +\newcommand*{\sortArrayPartitionFirst}[4]{% + \setcounter{arraysort@partpos}{#2}% + \setcounter{arraysort@temp1}{#2 + 1}% + \setcounter{arraysort@endpos}{#3 + 1}% + \arraysort@repeats{arraysort@temp1}{\value{arraysort@temp1}}{\value{arraysort@endpos}}{1}{% + \testarray{#4}(\arabic{arraysort@temp1})% + \let\arraysort@cur\temp@macro% + \testarray{#4}(\arabic{arraysort@partpos})% + \protected@edef\arraysort@left{\arraysort@cur}% + \protected@edef\arraysort@right{\temp@macro}% + \csname#1\endcsname{\arraysort@left}{\arraysort@right}% #2 = cur, #3 = partition + \setcounter{arraysort@temp2}{\value{arraysort@partpos} + 1}% + \iftoggle{arraysortresequal}{% #2 = #3 + \arraysort@swap{#4}{\arabic{arraysort@partpos}}{\arabic{arraysort@temp2}}% + \arraysort@swap{#4}{\arabic{arraysort@partpos}}{\arabic{arraysort@temp1}}% + \stepcounter{arraysort@partpos}% + }{% + \iftoggle{arraysortresult}{% #3 > #2 + \ifthenelse{\equal{\arabic{arraysort@temp2}}{\arabic{arraysort@temp1}}}{% + \arraysort@swap{#4}{\arabic{arraysort@partpos}}{\arabic{arraysort@temp1}}% + }{% + \arraysort@swap{#4}{\arabic{arraysort@partpos}}{\arabic{arraysort@temp2}}% + \arraysort@swap{#4}{\arabic{arraysort@partpos}}{\arabic{arraysort@temp1}}% + }% + \stepcounter{arraysort@partpos}% + }{% + }% + }% + }% +} +\ProcessOptions\relax +\RequirePackage{arrayjobx} +\RequirePackage{calc} +\RequirePackage{ifthen} +\RequirePackage{etoolbox} +\RequirePackage{xargs} +\RequirePackage{macroswap} +\arraysort@extrapkgs +\let\arraysort@extrapkgs\relax +\newcommandx*\sortArray[5][1=arraysortcomparestr,2=1,5=sortArrayPartitionMed]{% + \ifcsname#1\endcsname% + \ifthenelse{#2>0}{% + \ifthenelse{#3>#2}{% + \ifcsname total@#4\endcsname% + \arraysort@sort{#1}{#2}{#3}{#4}{#5}% + \else% + \PackageError{arraysort}{Cannot sort unknown array #4}{}% + \fi% + }{% + \PackageError{arraysort}{Cannot sort; to index #3 greater than from index #2}{}% + }% + }{% + \PackageError{arraysort}{Cannot sort; Invalid from index #2}{}% + }% + \else% + \PackageError{arraysort}{Cannot sort by undefined comparator #1}{}% + \fi% +} +\newcommand*{\arraysort@sort}[5]{% + \csname#5\endcsname{#1}{#2}{#3}{#4}% + \edef\arraysort@partition{\value{arraysort@partpos}}% + \setcounter{arraysort@temp1}{\arraysort@partition - 1}% + \ifthenelse{#2 = \value{arraysort@temp1} \OR #2 > \value{arraysort@temp1}}{% + }{% + \edef\arraysort@to{\arabic{arraysort@temp1}}% + \arraysort@sort{#1}{#2}{\arraysort@to}{#4}{#5}% + }% + \setcounter{arraysort@temp1}{\arraysort@partition + 1}% + \ifthenelse{\value{arraysort@temp1} = #3 \OR #3 < \value{arraysort@temp1}}{% + }{% + \edef\arraysort@from{\arabic{arraysort@temp1}}% + \arraysort@sort{#1}{\arraysort@from}{#3}{#4}{#5}% + }% +} +\newcounter{arraysort@partpos} +\newcounter{arraysort@temp1} +\newcounter{arraysort@temp2} +\newcounter{arraysort@endpos} +\newtoggle{arraysortresult} +\newtoggle{arraysortresequal} +\newcommand*{\arraysort@repeats}[5]{% + \setcounter{#1}{#2}% + \ifthenelse{\equal{\value{#1}}{#3}}{% + }{% + #5% + \addtocounter{#1}{#4}% + \arraysort@repeats{#1}{\arabic{#1}}{#3}{#4}{#5}% + }% +} +\newcommand\arraysort@swap[3]{% + \gmacroswap{#1#2\string~}{#1#3\string~}% +} +\endinput +%% +%% End of file `arraysort.sty'. |