From f97a5d61adae591bc262091b48989cf2ab69f6ec Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 4 May 2015 23:33:48 +0000 Subject: cntperchap (4may15) git-svn-id: svn://tug.org/texlive/trunk@37188 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/cntperchap/cntperchap.sty | 246 +++++++++++++++++++++ 1 file changed, 246 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/cntperchap/cntperchap.sty (limited to 'Master/texmf-dist/tex') diff --git a/Master/texmf-dist/tex/latex/cntperchap/cntperchap.sty b/Master/texmf-dist/tex/latex/cntperchap/cntperchap.sty new file mode 100644 index 00000000000..62c1e57f6e5 --- /dev/null +++ b/Master/texmf-dist/tex/latex/cntperchap/cntperchap.sty @@ -0,0 +1,246 @@ +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{cntperchap}[2015/05/03 v0.1 -- store counter values per chapter]% +%% +%% License: LaTeX Project Public License version 1.3 +%% Copyright (2015) Dr. Christian Hupfer +%% Author: Christian Hupfer christian.hupfer@yahoo.de +%% +%% 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 (at your option) 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. +%% +%% This work has the LPPL maintenance status `maintained'. +%% +%% This work consists of all files listed in README +%% +%%%% + + +\RequirePackage{ifthen} +\RequirePackage{assoccnt} +\RequirePackage{morewrites} +\RequirePackage{xpatch} +\RequirePackage{xparse} + + + +%%%% Command options + +\define@boolkey{cpskeys}{autodefine}[false]{} + +\presetkeys{cpskeys}{autodefine=false}{}% + + +%%%% Package options +\newif\ifcpsautodefine +\cpsautodefinefalse +\newif\ifcpsdraftmode +\cpsdraftmodetrue + +\DeclareOptionX{draft}{\cpsdraftmodetrue} +\DeclareOptionX{final}{\cpsdraftmodefalse} +\DeclareOptionX{autodefine}{\cpsautodefinetrue\presetkeys{cpskeys}{autodefine=true}{}} + +\ProcessOptionsX* + +\newcommand{\cpscounterlistname}{@counterstowatch} + +\listcsadd{\cpscounterlistname}{} + + + +%%%% Internal commands + +\newcounter{cps@@currentchapter} +\newcounter{cps@@togglecounter} +\newcounter{cps@@tempcounter} +\newcounter{cps@@cpscounters} + +\NewDocumentCommand{\cpschapterstarthook}{}{% + \stepcounter{cps@@currentchapter}% + \ifnumgreater{\value{cps@@currentchapter}}{0}{% + \StoreCountersPerChapter% + }{}% + \ResetTotalCounters% +} + + +% Prepending the \chapter command with some starter hook + +\xpretocmd{\chapter}{\cpschapterstarthook}{}{} + + +% This is a modified version from \@starttoc, being defined in latex.ltx +\newcommand{\@startcountertoc}[1]{% + \begingroup% + % Generate the file handle first + \expandafter\newwrite\csname tf@cps#1\endcsname% + \makeatletter + % Read first before deleting it + \ifcsdef{tf@cps#1}{% + \IfFileExists{\jobname.cps#1}{% + \immediate\openin\csname tf@cps#1\endcsname \jobname.cps#1\relax% + \@readcounternumbersfromfile{#1}% + }{% + % Oops, the file is not there :-( + }% + }{% + \typeout{No #1{} counter values so far}% + }% + \if@filesw + % Write only if not `\nofiles` is specified + \immediate\openout \csname tf@cps#1\endcsname \jobname.cps#1\relax% + \fi% + \@nobreakfalse% + \endgroup% +} + + +\newcommand{\@readcounternumbersfromfile}[1]{% + \setcounter{cps@@togglecounter}{0}% + \whiledo {\value{cps@@togglecounter} < 1}{% + \expandafter\read\csname tf@cps#1\endcsname to \cps@@numberfromfile% + \ifeof\csname tf@cps#1\endcsname% + \stepcounter{cps@@togglecounter}% + \else% + \listcsxadd{#1countlist}{\cps@@numberfromfile}% + \fi% + }% +} + +\newcommand{\@cpsstorecounter}[1]{% + \addtocontents{cps#1}{% + \number\value{cps@total#1}% + }% +} + + +\newcommand{\@cpscsloop}[1]{% + \ifnumgreater{\value{cps@@cpscounters}}{0}{% + \expandafter\forlistcsloop{\csname #1\endcsname}{\cpscounterlistname} + }{% + }% +} + +\newcommand{\@cpsloopstorecounters}{% + \ifnumgreater{\value{cps@@cpscounters}}{0}{% + \forlistcsloop{\@cpsstorecounter}{\cpscounterlistname}% + }{% + }% +} + +\newcommand{\@registercounterperchapter}[1]{% + \listcsxadd{\cpscounterlistname}{#1}% + \stepcounter{cps@@cpscounters}% + \listcsxadd{#1countlist}{}% + \newcounter{cps@total#1}% + \DeclareAssociatedCounters{#1}{cps@total#1}% +} + +%% Searches the list of counter values for the correct chapter +\newcommand{\@cpssearchcountervalue}[3]{% + \ifnumequal{#1}{\value{#2}}{% + #3\listbreak% + }{% + \stepcounter{#2}% + }% +} + + +%%%%%%%%%%%%%% User commands %%%%%%%%%%%%%%%%%%%% + + +\newcommand{\RegisterCounterPerChapter}[2][]{% + \begingroup + \setkeys{cpskeys}{#1}% + \ifltxcounter{#2}{% + \@registercounterperchapter{#2}% + }{% + \ifKV@cpskeys@autodefine + \newcounter{#2}% + \@registercounterperchapter{#2}% + \else% + % Ignore non existing counters + \fi + }% + \endgroup +} + +\newcommand{\RegisterCountersPerChapter}[1]{% + \forcsvlist{\RegisterCounterPerChapter}{#1}% +} + +% Prevent usage later in document body +\@onlypreamble{\RegisterCounterPerChapter} +\@onlypreamble{\RegisterCountersPerChapter} + +\newcommand{\ResetTotalCounter}[1]{% + \setcounter{cps@total#1}{0}% +} + + +% Reset all total counters +\newcommand{\ResetTotalCounters}{% + \ifnumgreater{\value{cps@@cpscounters}}{0}{% + \forlistcsloop{\ResetTotalCounter}{\cpscounterlistname}% + }{}% +} + +%% Only for statistical purposes. Do not use it in a production run +\newcommand{\IndividualCounterStatistics}[2][\number\value{cps@@currentchapter}]{% + \ifcpsdraftmode + \noindent Chapter #1~ has \GetTotalCounter[#1]{#2} #2(s)\par + \fi +}% + + + + +%% Only for statistical purposes. Do not use it in a production run +\newcommand{\ShowStatistics}[1][\number\value{cps@@currentchapter}]{% + \ifcpsdraftmode% + \ifnumgreater{\value{cps@@cpscounters}}{0}{% + \forlistcsloop{\IndividualCounterStatistics[\number#1]}{\cpscounterlistname}% + }{% + \typeout{No counters registered}% + }% + \fi% +} + +\newcommand{\GetTotalCounter}[2][\number\value{cps@@currentchapter}]{% + \setcounter{cps@@tempcounter}{0}% + \ifcsdef{#2countlist}{% + \forlistcsloop{\@cpssearchcountervalue{#1}{cps@@tempcounter}}{#2countlist}% + }{% + \typeout{Warning: List for counter #2 not defined}% + }% Failure branch should be improved +} + +\newcommand{\StartCounterToc}{% + \ifnumgreater{\value{cps@@cpscounters}}{0}{% + \forlistcsloop{\@startcountertoc}{\cpscounterlistname}% + }{% + }% +} + +\newcommand{\StoreCountersPerChapter}{% + \@cpsloopstorecounters% +} + +\AtBeginDocument{% + % Grab the counter 'tocs' + \StartCounterToc% +} + + +\AtEndDocument{% + % Write the counter values to the file + \StoreCountersPerChapter% +} + + +\endinput -- cgit v1.2.3