summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/tabularcalc/tabularcalc.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2009-03-21 01:00:42 +0000
committerKarl Berry <karl@freefriends.org>2009-03-21 01:00:42 +0000
commit00f237a3453838bbf26f9e9588a8689216c10a6b (patch)
tree78d4d608ace2a162d6e81c55ae26b175ca745780 /Master/texmf-dist/tex/latex/tabularcalc/tabularcalc.sty
parentccda74df68c8c59e050534aff356bb3bd9f95755 (diff)
new latex package tabularcalc 0.1 (19mar09)
git-svn-id: svn://tug.org/texlive/trunk@12476 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/tabularcalc/tabularcalc.sty')
-rw-r--r--Master/texmf-dist/tex/latex/tabularcalc/tabularcalc.sty316
1 files changed, 316 insertions, 0 deletions
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