From 00f237a3453838bbf26f9e9588a8689216c10a6b Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sat, 21 Mar 2009 01:00:42 +0000 Subject: new latex package tabularcalc 0.1 (19mar09) git-svn-id: svn://tug.org/texlive/trunk@12476 c570f23f-e606-0410-a88d-b1316a301751 --- .../tex/latex/tabularcalc/tabularcalc.sty | 316 +++++++++++++++++++++ 1 file changed, 316 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/tabularcalc/tabularcalc.sty (limited to 'Master/texmf-dist/tex') diff --git a/Master/texmf-dist/tex/latex/tabularcalc/tabularcalc.sty b/Master/texmf-dist/tex/latex/tabularcalc/tabularcalc.sty new file mode 100644 index 00000000000..268d26d0049 --- /dev/null +++ b/Master/texmf-dist/tex/latex/tabularcalc/tabularcalc.sty @@ -0,0 +1,316 @@ +% __________________________________________________ +% | | +% | | +% | tabularcalc v0.1 | +% | | +% | March 19 2009 | +% | | +% |__________________________________________________| +% +% This is tabularcalc.sty +% +% "tabularcalc" package consists of the 6 following files: +% tabularcalc.sty (this file) +% README +% tabularcalc_doc_fr.tex, tabularcalc_doc_fr.pdf (manual in french) +% tabularcalc_doc_en.tex, tabularcalc_doc_en.pdf (manual in english) +% +% Christian Tellechea 2009 +% email : unbonpetit@gmail.com +% ------------------------------------------------------------------- +% 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'. +% +% The Current Maintainer of this work is Christian Tellechea +% ------------------------------------------------------------------- + +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{tabularcalc}% + [2009/02/15 v0.1 Compute formulas in tables] +\RequirePackage{xstring} +\RequirePackage{numprint} +\RequirePackage{pgf,pgfmath} + +\newcommand\tabularcalcversion {0.1} +\newcommand\tabularcalcdate {2009/03/19} +\newcommand\tabularcalcfrenchdate {19 mars 2009} +\newcommand\tabularcalcenglishdate {March $19^{\mathrm{th}}$ 2009} +\newcount\tccol\newcount\tclin +\newif\iftc@showval + +\newcommand\tc@checkdefine[2]{\@ifdefinable#1{\def#1{#2}}{}} + +\newcommand\tc@addtomacro[2]{\expandafter\def\expandafter#1\expandafter{#1#2}} +\newcommand\tc@expaddtomacro[2]{% + \expandafter\tc@addtomacro\expandafter#1\expandafter{#2}} + +% choisit le moteur pour calculer l'expression contenue dans \tc@currentresult +% puis assigne le r\'esultat dans \tc@currentresult +\tc@checkdefine\tc@evalexpr{% + \expandafter\pgfmathparse\expandafter{\tc@currentresult}% + \let\tc@currentresult\pgfmathresult} + +\tc@checkdefine\noshowmark{} +\makeatother\def\noshowmark{@}\makeatletter + +\tc@checkdefine\startline{\rule[-1.2ex]{0pt}{4ex}} +\tc@checkdefine\tc@cellcode{} +\tc@checkdefine\tc@currentcellcode{} +\newcommand\resetcellcode{\let\tc@cellcode\@empty} + +\tc@checkdefine\numberletter{x} +\tc@checkdefine\listsep{,} + +% d\'efinit la routine d'affichage des valeurs +\tc@checkdefine\printvalue{} +\def\printvalue#1{\numprint{#1}} +% d\'efinit la routine d'affichage des r\'esultats +\tc@checkdefine\printresult{} +\def\printresult#1#2{\numprint{#1}} + +\newcommand\edefcellcode[3]{% + \ifx\@empty#1\@empty + \ifx\@empty#2\@empty + \tc@addtomacro\tc@cellcode{#3}% + \else + \tc@addtomacro\tc@cellcode{\ifnum\tccol=#2\relax#3\fi}% + \fi + \else + \ifx\@empty#2\@empty + \tc@addtomacro\tc@cellcode{\ifnum\tclin=#1\relax#3\fi}% + \else + \tc@addtomacro\tc@cellcode{% + \ifnum\tclin=#1\relax\ifnum\tccol=#2\relax#3\fi\fi}% + \fi + \fi} + +\newcommand\defcellcode[3]{\edefcellcode{#1}{#2}{\unexpanded{#3}}} + +\tc@checkdefine\tc@firstrule\hline +\tc@checkdefine\tc@interrule\hline +\tc@checkdefine\tc@updwnrule\hline + +% d\'efinit les 3 types de lignes +\newcommand\sethrule[3]{% + \def\tc@updwnrule{#1}\def\tc@firstrule{#2}\def\tc@interrule{#3}} + +\newcommand\resethrule{\sethrule\hline\hline\hline} + +\tc@checkdefine\tc@lastvline{} +\tc@checkdefine\tc@firstcoltype{|c|} +\tc@checkdefine\tc@othercoltype{c|} + +% d\'efinit les 3 types de colonnes +\newcommand\setcoltype[3][]{% + \def\tc@firstcoltype{#2}\def\tc@othercoltype{#3}\def\tc@lastvline{#1}} + +\newcommand\resetcoltype{\setcoltype{|c|}{c|}} + +\newcommand\htablecalc{\def\tc@orientation{h}\tc@deftablestart} +\newcommand\vtablecalc{\def\tc@orientation{v}\tc@deftablestart} + +\newcommand\tc@deftablestart[3][1]{% + \begingroup + \expandarg + \def\tc@nbformulas{#1}% + \StrCount{\listsep#3}\listsep[\tc@nbval]% \tc@nbval = nombre de valeurs + \let\tc@coltype\@empty + \tc@expaddtomacro\tc@coltype{\tc@firstcoltype*}% construit \tc@coltype + \expandafter\tc@addtomacro\expandafter\tc@coltype\expandafter + {\expandafter{\tc@nbval}}% qui contiendra par exemple |c|*{4}{c|} + \expandafter\tc@addtomacro\expandafter\tc@coltype\expandafter + {\expandafter{\tc@othercoltype}}% + \tc@expaddtomacro\tc@coltype\tc@lastvline + \let\tc@firstline\tc@updwnrule% 1ere ligne + \tclin\z@\tccol\z@ + \edef\tc@currentcellcode{\tc@cellcode}% + \tc@expaddtomacro\tc@firstline\tc@currentcellcode + \tc@expaddtomacro\tc@firstline{\startline#2&}% + \def\tc@valuelist{#3}% + \tc@expaddtomacro\tc@valuelist\listsep + \tclin\@ne\tccol\@ne + \csname tc@\tc@orientation readarg\endcsname} + +% lit tous les arguments {nom ligne}{formule} et les assigne dans les sc +% \tcline@i et \tc@formula@i et ainsi de suite, puis va \`a \tc@hbuildlines +\newcommand\tc@hreadarg[2]{% + \tccol\z@ + \@namedef{tc@line@\romannumeral\tclin}{}% + \edef\tc@currentcellcode{\tc@cellcode}% + \tc@expaddtocurrentline\tc@currentcellcode + \tc@expaddtocurrentline{\startline#1&}% + \@namedef{tc@formula@\romannumeral\tclin}{#2}% + \ifnum\tclin<\tc@nbformulas + \advance\tclin\@ne + \expandafter\tc@hreadarg + \else + \tccol\@ne + \expandafter\tc@hbuildlines + \fi}% + +\newcommand\tc@vreadarg[2]{% + \tclin\z@ + \edef\tc@currentcellcode{\tc@cellcode}% construit la 1\`ere ligne + \tc@expaddtomacro\tc@firstline{\tc@currentcellcode#1}% + \@namedef{tc@formula@\romannumeral\tccol}{#2}% + \ifnum\tccol<\tc@nbformulas + \tc@addtomacro\tc@firstline&% + \advance\tccol\@ne + \expandafter\tc@vreadarg + \else + \tclin\@ne\tccol\z@ + \loop% initialise les lignes \`a "\tc@currentcellcode\startline" + \@namedef{tc@line@\romannumeral\tclin}{}% + \edef\tc@currentcellcode{\tc@cellcode}% + \tc@expaddtocurrentline\tc@currentcellcode + \tc@expaddtocurrentline\startline + \ifnum\tclin<\tc@nbval + \advance\tclin\@ne + \repeat + \tclin\@ne + \expandafter\tc@vbuildlines + \fi}% + +\newcommand\tc@findskiplist{% + \IfBeginWith\tc@currentvalue\noshowmark + {\tc@showvalfalse% si le signe \noshowmark est pr\'esent... + \StrGobbleLeft\tc@currentvalue1[\tc@currentvalue]}% ...efface-le + {\tc@showvaltrue}% + \IfSubStr\tc@currentvalue[% s'il y a une skiplist... + {\let\tc@skiplist\tc@currentvalue + \StrBefore\tc@currentvalue[[\tc@currentvalue]% ce qui est avant "[" + \StrBehind\tc@skiplist\tc@currentvalue[\tc@skiplist]}% d\'efinit-la + {\let\tc@skiplist\@empty}} + +\newcommand\tc@addtocurrentline[1]{% + \expandafter\tc@addtomacro\csname tc@line@\romannumeral\tclin\endcsname + {#1}} + +\newcommand\tc@expaddtocurrentline[1]{% + \expandafter\tc@addtocurrentline\expandafter{#1}} + +% construit toutes les lignes du tableau par r\'ecursivit\'e principale sur +% le nombre de colonnes +\newcommand\tc@hbuildlines{% + \tclin\z@ + \StrBefore\tc@valuelist\listsep[\tc@currentvalue]% prend \tc@currentvalue + \StrBehind\tc@valuelist\listsep[\tc@valuelist]% purge \tc@valuelist + \ifx\@empty\tc@currentvalue + \else + \tc@findskiplist + \edef\tc@currentcellcode{\tc@cellcode}% + \tc@expaddtomacro\tc@firstline\tc@currentcellcode + \iftc@showval% pas de noshowmark : ajoute affichage valeur courante + \expandafter\tc@expaddtomacro\expandafter\tc@firstline + \expandafter{\expandafter\printvalue\expandafter + {\tc@currentvalue}}% + \fi + \tclin\@ne + \loop + \edef\tc@currentcellcode{\tc@cellcode}% + \tc@expaddtocurrentline\tc@currentcellcode + \tc@displaycurrentresult\tclin + \ifnum\tclin<\tc@nbformulas + \advance\tclin\@ne + \repeat% recommence pour toutes les lignes + \fi + \ifnum\tccol<\tc@nbval% s'il reste des colonnes + \tc@addtomacro\tc@firstline&% ajoute "&" \`a la 1\`ere ligne + \tclin\@ne + \loop% et ajoute "&" aux autres lignes + \tc@addtocurrentline&% + \ifnum\tclin<\tc@nbformulas + \advance\tclin\@ne + \repeat + \advance\tccol\@ne + \expandafter\tc@hbuildlines% recommence tout le processus + \else + \let\tc@nblines\tc@nbformulas + \expandafter\tc@printtabular% sinon, va afficher la table + \fi} + +% construit les lignes du tableau par r\'ecursivit\'e principale sur \tclin +\newcommand\tc@vbuildlines{% + \StrBefore\tc@valuelist\listsep[\tc@currentvalue]% prend \tc@currentvalue + \StrBehind\tc@valuelist\listsep[\tc@valuelist]% purge \tc@valuelist + \ifx\@empty\tc@currentvalue + \else + \tc@findskiplist + \iftc@showval% pas de noshowmark : ajoute affichage valeur courante + \expandafter\tc@expaddtocurrentline\expandafter + {\expandafter\printvalue\expandafter{\tc@currentvalue}}% + \fi + \tccol\@ne + \loop + \tc@addtocurrentline&% change de cellule dans la ligne en cours + \edef\tc@currentcellcode{\tc@cellcode}% + \tc@expaddtocurrentline\tc@currentcellcode + \tc@displaycurrentresult\tccol% ajoute le r\'esultat courant ou pas + \ifnum\tccol<\tc@nbformulas + \advance\tccol\@ne + \repeat% s'il reste des colonnes, recommence + \fi + \ifnum\tclin<\tc@nbval + \advance\tclin\@ne + \expandafter\tc@vbuildlines% s'il reste des lignes, recommence + \else + \let\tc@nblines\tc@nbval + \expandafter\tc@printtabular% sinon, va afficher la table + \fi} + +\newcommand\tc@displaycurrentresult[1]{% + \StrBetween\tc@skiplist[][\tc@nexttoskip]% + \ifx\@empty\tc@skiplist% pas de skiplist -> ajoute l'affichage de resultat + \tc@addcurrentresult#1 + \else + \ifnum\tc@nexttoskip=\z@% si 0, n'affiche rien + \else + \ifnum\tc@nexttoskip=#1% si le numero correspond + \StrBehind\tc@skiplist][\tc@skiplist]% purge la skiplist + \else% sinon, ajoute l'affichage de resultat + \tc@addcurrentresult#1% + \fi + \fi + \fi} + +\newcommand\tc@addcurrentresult[1]{% #1 : compteur courant + \expandafter\StrSubstitute% remplace "x" par la valeur courante + \csname tc@formula@\romannumeral#1\endcsname + \numberletter\tc@currentvalue[\tc@currentresult]% + \tc@evalexpr% \'evalue l'expression + \edef\tc@currentresult{{\tc@currentresult}{\tc@currentvalue}}% + \expandafter\tc@expaddtocurrentline\expandafter + {\expandafter\printresult\tc@currentresult}} + +\newcommand\tc@printcalclines{% + \csname tc@line@\romannumeral\tclin\endcsname% affiche la ni\`eme ligne + \ifnum\tclin<\tc@nblines% et s'il en reste encore \`a afficher + \\\tc@interrule% va \`a la ligne, met le filet + \global\advance\tclin\@ne + \expandafter\tc@printcalclines% et recommence + \fi}% + +\newcommand\tc@printtabular{% + \global\tclin\z@ + \def\tc@currentvalue{\begin{tabular}}% + \expandafter\tc@currentvalue\expandafter{\tc@coltype}% + \tc@firstline\\\tc@firstrule% 1\`ere ligne + 1er filet + \global\tclin\@ne + \tc@printcalclines% affichage des autres lignes + \\\tc@updwnrule% filet du bas + \end{tabular}% fin du tableau + \endgroup} +% +% Historique +%------------------------------------------------------------------------------ +%% v0.1 19/03/2009 : - Premi\`ere version +%------------------------------------------------------------------------------ \ No newline at end of file -- cgit v1.2.3