From e5bb7a83e26e4320c31744b69bfebb066a3182f0 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Mon, 13 Sep 2010 16:17:59 +0000 Subject: new latex package csvsimple 1.00 (28jul10) git-svn-id: svn://tug.org/texlive/trunk@19699 c570f23f-e606-0410-a88d-b1316a301751 --- .../texmf-dist/tex/latex/csvsimple/csvsimple.sty | 369 +++++++++++++++++++++ 1 file changed, 369 insertions(+) create mode 100644 Master/texmf-dist/tex/latex/csvsimple/csvsimple.sty (limited to 'Master/texmf-dist/tex/latex/csvsimple') diff --git a/Master/texmf-dist/tex/latex/csvsimple/csvsimple.sty b/Master/texmf-dist/tex/latex/csvsimple/csvsimple.sty new file mode 100644 index 00000000000..fb045fc9fa6 --- /dev/null +++ b/Master/texmf-dist/tex/latex/csvsimple/csvsimple.sty @@ -0,0 +1,369 @@ +%% The LaTeX package csvsimple - version 1.00 (2010/07/28) +%% csvsimple.sty: Simple LaTeX CSV file processing +%% +%% ------------------------------------------------------------------------------------------- +%% Copyright (c) 2008-2010 by Prof. Dr. Dr. Thomas F. Sturm +%% ------------------------------------------------------------------------------------------- +%% +%% 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 `author-maintained'. +%% +%% This work consists of all files listed in README +%% +\NeedsTeXFormat{LaTeX2e} +\ProvidesPackage{csvsimple}[2010/07/28 version 1.00 LaTeX CSV file processing] + +\RequirePackage{pgfkeys,ifthen} + + +%---- general + +\def\csv@warning#1{\PackageWarning{csvsimple}{#1}} + +\newread\csv@file +\newcounter{csvinputline} +\newcounter{csvrow} +\newcounter{csvcol} + +\def\csv@empty{} + +\def\csv@addto@macro#1#2{% + \begingroup% + \toks@\expandafter{#1#2}% + \xdef#1{\the\toks@}% + \endgroup% + } + +\long\def\csviffirstrow#1#2{% + \ifnum\c@csvrow=1% + \long\def\csviffirstrow@doit{#1}% + \else% + \long\def\csviffirstrow@doit{#2}% + \fi% + \csviffirstrow@doit% +} + +\long\def\csvifoddrow#1#2{% + \ifodd\c@csvrow% + \long\def\csvifoddrow@doit{#1}% + \else% + \long\def\csvifoddrow@doit{#2}% + \fi% + \csvifoddrow@doit% +} + +\def\csv@and{&} + +\def\csvlinetotablerow{% + \setcounter{csvcol}{0}% + \stepcounter{csvcol}\csv@current@col% + \whiledo{\thecsvcol<\csv@columncount}{\csv@and\stepcounter{csvcol}\csv@current@col}% +} + + +%---- breaking lines + +% This command removes leading and trailing spaces from . I found +% the original code on the web. The original author was Michael Downes, who +% provided the code as an answer to 'around the bend' question #15. +\catcode`\Q=3 +\def\TrimSpaces#1{% + \begingroup% + \aftergroup\toks\aftergroup0\aftergroup{% + \expandafter\trimb\expandafter\noexpand#1Q Q}% + \global\edef#1{\the\toks0}% +} +\def\trimb#1 Q{\trimc#1Q} +\def\trimc#1Q#2{\afterassignment\endgroup \vfuzz\the\vfuzz#1} +\catcode`\Q=11 + +% needs \csv@termination +\def\csv@breakline#1,{% + \ifx\csv@termination#1\let\nextcol=\relax\else% + \let\nextcol=\csv@breakline% + \stepcounter{csvcol}% + \edef\csv@col@body{#1}\TrimSpaces\csv@col@body% + \expandafter\xdef\csname csvcol\roman{csvcol}\endcsname{\csv@col@body}% + \fi% + \nextcol% + } + +% adds \csv@termination +\def\csv@scanline#1{% + \setcounter{csvcol}{0}% + \csv@breakline#1,\csv@termination,% + } + +% expands a CSV line and scans content +\def\csv@escanline#1{% + \edef\@csv@scanline{\noexpand\csv@scanline{#1}}% + \@csv@scanline% + } + + +%---- the loop + +\def\csv@AtEndLoop{\csv@addto@macro\@endloophook} +\let\@endloophook\csv@empty + +\def\csv@current@col{\csname csvcol\roman{csvcol}\endcsname} + +% head names +\def\set@csv@head{% + \toks0={\gdef##1}% + \toks1=\expandafter{\csname csvcol\roman{csvcol}\endcsname}% + \edef\temp{\noexpand\pgfkeysdef{/csv head/\csv@current@col}{\the\toks0{\the\toks1}\noexpand\csv@AtEndLoop{\the\toks0{}}}}% + \temp% +} + +% head line +\def\csv@processheadline{% + \csvreadnext% + \csv@escanline{\csvline}% + \xdef\csv@columncount{\thecsvcol}% + \setcounter{csvcol}{0}% + \loop% + \stepcounter{csvcol}% + \set@csv@head% + \ifnum\thecsvcol<\csv@columncount\repeat% + \toks@=\expandafter{\csv@columnnames}% + \edef\csv@processkeys{\noexpand\pgfkeys{/csv head/.cd,\the\toks@}}% + \csv@processkeys% + \csv@posthead% +} + +% check filter +\def\csv@checkfilter{% + \csv@prefiltercommand% + \csv@iffilter{% + \stepcounter{csvrow}% + \let\csv@usage=\csv@do@linecommand% + }{}% +} + +% check columns +\def\csv@checkcolumncount{% + \ifnum\thecsvcol=\csv@columncount% + \csv@checkfilter% + \else + \csv@columncounterror% + \fi% +} + +\def\csv@nocheckcolumncount{% + \csv@checkfilter% +} + +% normal line +\def\csv@do@linecommand{% + \csv@do@latepostline% + \csv@do@preline% + \csv@body% + \csv@postline% +} + +\gdef\csvreadnext{% + \global\read\csv@file to\csvline% + \stepcounter{csvinputline}% +} + +% reads and processes a CSV file +\def\csvloop#1{% + % reset + \global\let\@endloophook\csv@empty% + % options + \csvset{default,every csv,#1}% + \csv@prereading% + \setcounter{csvinputline}{0}% + % start reading + \openin\csv@file=\csv@filename\relax% + \ifeof\csv@file% + \csv@warning{File \csv@filename\ not existent, not readable, or empty!}% + \else% + % the head line + \csv@opt@processheadline% + \fi% + % + \setcounter{csvrow}{0}% + \gdef\csv@do@preline{% + \csv@prefirstline% + \global\let\csv@do@preline=\csv@preline% + }% + \gdef\csv@do@latepostline{% + \csv@lateposthead% + \global\let\csv@do@latepostline=\csv@latepostline% + }% + % command for the reading loop + \gdef\csv@iterate{% + \let\csv@usage=\csv@empty% + \csvreadnext% + \ifeof\csv@file% + \global\let\csv@next=\csv@empty% + \else% + \global\let\csv@next=\csv@iterate% + \if\par\csvline\relax% + \else% + \csv@escanline{\csvline}% + % check and decide + \csv@opt@checkcolumncount% + \fi% + \fi% + % do or do not + \csv@usage% + \csv@next}% + \ifeof\csv@file% + \global\let\csv@next=\csv@empty% + \else% + \global\let\csv@next=\csv@iterate% + \fi% + \csv@next% + \closein\csv@file% + \@endloophook% + \csv@latepostlastline% + \csv@postreading% +} + +% user command +\long\def\csv@reader[#1]#2#3#4{% + \global\long\def\csv@@body{#4}% + \csvloop{#1,file={#2},column names={#3},command=\csv@@body}% +} + +\def\csvreader{% + \@ifnextchar[{\csv@reader}{\csv@reader[]}} + + +%---- keys + +\pgfkeys{/handlers/.gstore in/.code=\pgfkeysalso{\pgfkeyscurrentpath/.code=\gdef#1{##1}}} +\pgfkeys{/csv/.is family} +\pgfkeys{/csv head/.is family} + +\def\csvset{\pgfqkeys{/csv}} +\def\csvheadset{\pgfqkeys{/csv head}} + +\csvset{% + file/.gstore in=\csv@filename,% + column names reset/.code={\gdef\csv@columnnames{}},% + column names/.code={% + \toks0=\expandafter{\csv@columnnames}% + \def\temp{#1}\toks1=\expandafter{\temp}% + \xdef\csv@columnnames{\the\toks0,\the\toks1}% + }, + command/.gstore in=\csv@body, + check column count/.code={\ifthenelse{\equal{#1}{true}}{% + \global\let\csv@opt@checkcolumncount=\csv@checkcolumncount}{% + \global\let\csv@opt@checkcolumncount=\csv@nocheckcolumncount}}, + check column count/.default=true, + on column count error/.gstore in=\csv@columncounterror, + head/.code={\ifthenelse{\equal{#1}{true}}{% + \global\let\csv@opt@processheadline=\csv@processheadline% + \pgfkeysalso{check column count}}{% + \global\let\csv@opt@processheadline=\csv@empty% + \pgfkeysalso{check column count=false,late after head=}}}, + head/.default=true, + column count/.gstore in=\csv@columncount, + filter/.code={% + \def\temp{#1}\toks@=\expandafter{\temp}% + \xdef\csv@iffilter{\noexpand\ifthenelse{\the\toks@}}}, + nofilter/.code={\gdef\csv@iffilter##1##2{##1}}, + before filter/.gstore in=\csv@prefiltercommand, + before first line/.gstore in=\csv@prefirstline, + before line/.code={\gdef\csv@preline{#1}\pgfkeysalso{before first line=#1}}, + after line/.gstore in=\csv@postline, + late after last line/.gstore in=\csv@latepostlastline, + late after line/.code={\gdef\csv@latepostline{#1}\pgfkeysalso{late after last line=#1}}, + after head/.gstore in=\csv@posthead, + late after head/.gstore in=\csv@lateposthead, + before reading/.gstore in=\csv@prereading, + after reading/.gstore in=\csv@postreading, + before table/.gstore in=\csv@pretable, + after table/.gstore in=\csv@posttable, + table head/.gstore in=\csv@tablehead, + table foot/.gstore in=\csv@tablefoot, + % + % default for reset + default/.style={ + file=unknown.csv, + command=\csvline, + column names reset, + head, + on column count error=, + nofilter, + before filter=, + before line=, + after line=, + late after line=, + late after last line=, + after head=, + late after head=, + before reading=, + after reading=, + before table=, + after table=, + table head=, + table foot= + }, + default, + % + % styles + every csv/.style={}, + nohead/.style={head=false}, + nocheckcolumncount/.style={checkcolumncount=false}, + warn on column count error/.style={on column count error={\csv@warning{>\thecsvcol< instead of >\csv@columncount< columns for input line >\thecsvinputline< of file >\csv@filename<}}}, + filter equal/.style 2 args={filter=\equal{#1}{#2}}, + filter not equal/.style 2 args={filter=\not\equal{#1}{#2}}, + tabular/.style={ + before reading=\csv@pretable\begin{tabular}{#1}\csv@tablehead, + after reading=\csv@tablefoot\end{tabular}\csv@posttable, + late after line=\\}, + centered tabular/.style={ + before reading=\begin{center}\csv@pretable\begin{tabular}{#1}\csv@tablehead, + after reading=\csv@tablefoot\end{tabular}\csv@posttable\end{center}, + late after line=\\}, + longtable/.style={ + before reading=\csv@pretable\begin{longtable}{#1}\csv@tablehead, + after reading=\csv@tablefoot\end{longtable}\csv@posttable, + late after line=\\}, + autotabular/.style={ + file=#1, + after head=\csv@pretable\begin{tabular}{|*{\csv@columncount}{l|}}\csv@tablehead, + table head=\hline\csvlinetotablerow\\\hline, + late after line=\\, + table foot=\\\hline, + late after last line=\csv@tablefoot\end{tabular}\csv@posttable, + command=\csvlinetotablerow}, + autolongtable/.style={ + file=#1, + after head=\csv@pretable\begin{longtable}{|*{\csv@columncount}{l|}}\csv@tablehead, + table head=\hline\csvlinetotablerow\\\hline\endhead\hline\endfoot, + late after line=\\, + late after last line=\csv@tablefoot\end{longtable}\csv@posttable, + command=\csvlinetotablerow}, + tabbing/.style={ + before reading=\csv@pretable\begin{tabbing}\csv@tablehead, + after reading=\csv@tablefoot\end{tabbing}\csv@posttable, + late after line=\\, + late after last line=}, + centered tabbing/.style={ + before reading=\begin{center}\csv@pretable\begin{tabbing}\csv@tablehead, + after reading=\csv@tablefoot\end{tabbing}\csv@posttable\end{center}, + late after line=\\, + late after last line=} +} + +\def\csvautotabular#1{\csvloop{autotabular={#1}}} + +\def\csvautolongtable#1{\csvloop{autolongtable={#1}}} + +\def\csvstyle#1#2{\csvset{#1/.style={#2}}} + +\def\csvnames#1#2{\csvset{#1/.style={column names={#2}}}} + -- cgit v1.2.3