summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2019-08-10 21:19:47 +0000
committerKarl Berry <karl@freefriends.org>2019-08-10 21:19:47 +0000
commit65095863d32b4d7913f92aa73919ae9f3b95604d (patch)
treedfd40ea7ed1e0b194c2d2a30d533208a24397a4c /Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty
parentbbb53f06c6f48d4c675d250829032e09f4065a86 (diff)
csvmerge (10aug19)
git-svn-id: svn://tug.org/texlive/trunk@51857 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty')
-rw-r--r--Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty300
1 files changed, 300 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty b/Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty
new file mode 100644
index 00000000000..06d97971930
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/csvmerge/csvmerge.sty
@@ -0,0 +1,300 @@
+%%
+%% This is file `csvmerge.sty',
+%% generated with the docstrip utility.
+%%
+%% The original source files were:
+%%
+%% csvmerge.dtx (with options: `package')
+%% This is a generated file. Copyright (C) 2019 by Laurence R Taylor
+%% This file 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.
+\NeedsTeXFormat{LaTeX2e}[2005/12/01]
+\ProvidesPackage{csvmerge}
+ [2019/07/17 v1.0 merges TeX code with csv data]
+
+\RequirePackage{stringstrings}
+\RequirePackage{trimspaces}
+\RequirePackage{etoolbox}
+
+\DeclareOption*{\xdef\@LRT@CO{\CurrentOption}}
+\ProcessOptions\relax
+
+\makeatletter
+
+\newcommand{\@LRT@mergeFields}[1]{%
+\gdef\@LRT@csv{}%
+\gdef\@LRT@tex{}%
+\gdef\@LRT@tmp{}%
+\setcounter{\@LRT@macroPrefix Row}{2}\relax%
+\gdef\@LRT@csvBlankLine{}%
+\@LRT@getFilePaths#1=@%
+\if@LRT@empty{\@LRT@csv}{\@LRT@missingArgumentMessage{csv}}{}%
+\if@LRT@empty{\@LRT@tex}{\@LRT@missingArgumentMessage{tex}}{}%
+\if@LRT@empty{\@LRT@tmp}%
+{\global\let\@LRT@Input\@LRT@streaming}%
+{\global\let\@LRT@Input\@LRT@storage}%
+\if@LRT@empty{\@LRT@tmp}{}{%
+\immediate\openout\@lrt@tmpFile=\@LRT@tmp\relax}%
+\@LRT@mergeData%
+\if@LRT@empty{\@LRT@tmp}{}{\immediate\closeout\@lrt@tmpFile\relax}%
+}
+
+\gdef\@LRT@macroPrefix{@LRT@@}
+
+\def\@LRT@Field#1{%
+\csname\@LRT@macroPrefix#1\endcsname%
+}
+
+\long\gdef\@LRT@ifFieldEmpty#1#2#3{\ifbool{\@LRT@macroPrefix#1}{#2}{#3}}
+
+{{%
+\gdef\@LRT@setDelimitersCommaQuote{
+\gdef\@LRT@fieldDelimiterBack{,}
+\gdef\@LRT@getFieldDelimited##1,{\@LRT@getFirstArg{##1}}
+\gdef\@LRT@textDelimiterFront{"}
+\gdef\@LRT@getTextDelimited"##1",{\@LRT@getFirstArg{##1}}
+\gdef\@LRT@blankFieldItem{,}
+\gdef\@LRT@catcodes{}
+}%
+}}
+
+{{\catcode`\^^I12\relax%
+\gdef\@LRT@setDelimitersTabQuote{
+\gdef\@LRT@fieldDelimiterBack{^^I}
+\gdef\@LRT@getFieldDelimited##1^^I{\@LRT@getFirstArg{##1}}
+\gdef\@LRT@textDelimiterFront{"}
+\gdef\@LRT@getTextDelimited"##1"^^I{\@LRT@getFirstArg{##1}}
+\gdef\@LRT@blankFieldItem{}
+\gdef\@LRT@catcodes{\catcode`\^^I12\relax}
+}%
+}}
+
+\expandafter\gdef\csname1238LRTLRTsvbneLRT\endcsname{@LRT@}
+\makeatother
+\expandafter\gdef\csname\csname1238LRTLRTsvbneLRT\endcsname
+makeMePublic\endcsname\@LRT@#1\becomes#2{\global\letcs{#2}{@LRT@#1}}%
+\makeatletter
+
+\xdef\@LRT@Row{\noexpand\number\noexpand\value{\@LRT@macroPrefix Row}}
+
+\newcommand{\if@LRT@empty}[3]{\ifthenelse{\equal{#1}{}}{#2}{#3}}
+
+\gdef\@LRT@fieldName#1{%
+\caselower[q]{#1}%
+\convertchar[q]{\thestring}{ }{}%
+\convertchar[q]{\thestring}{,}{}%
+\xdef\@LRT@TheString{\thestring}%
+}
+
+\gdef\@LRT@getFilePaths#1=#2@{%
+\xdef\@LRT@hashKey{\trim@spaces{#1}}%
+\if@LRT@empty{\@LRT@hashKey}{}{
+\def\@LRT@test{tex}\ifthenelse{\equal{\@LRT@hashKey}{\@LRT@test}}{}%
+{\def\@LRT@test{csv}\ifthenelse{\equal{\@LRT@hashKey}{\@LRT@test}}{}%
+{\def\@LRT@test{tmp}\ifthenelse{\equal{\@LRT@hashKey}{\@LRT@test}}{}%
+{\@LRT@unknownArgumentMessage{#1}}}}%
+\@LRT@extractKeyValue#2@%
+\expandafter\@LRT@getFilePaths\@LRT@doWeStillHaveStuffToDo @}}
+
+\def\@LRT@extractKeyValue#1#2@{%
+\edef\@LRT@hashValue{\trim@spaces{#1}}%
+\xdef\@LRT@doWeStillHaveStuffToDo{\trim@spaces{#2}}%
+\expandafter\xdef\csname @LRT@\@LRT@hashKey\endcsname{\@LRT@hashValue}%
+}
+
+\newcommand{\@LRT@SecondifFieldEmpty}[3]{%
+\edef\@LRT@fieldValue{#1}%
+\ifx\@LRT@fieldValue\@empty\relax{#2}\else{#3}\fi\relax}
+
+\gdef\@LRT@getCommaFieldDelimited#1,{\@LRT@getFirstArg{#1}}
+
+\newcounter{\@LRT@macroPrefix Row}
+
+\newread\@lrt@csvFile%
+\newread\@lrt@texFile%
+\newwrite\@lrt@tmpFile%
+
+\gdef\@LRT@justProcessedMessage{%
+\immediate\typeout{}%
+\immediate\typeout{Just processed row %
+\@LRT@Row\space of the data file.}%
+\immediate\typeout{}%
+\stepcounter{\@LRT@macroPrefix Row}\relax%
+}
+
+\gdef\@LRT@failedToOpenMessage#1{%
+\immediate\typeout{}%
+\immediate\typeout{File #1 failed to open.}%
+\immediate\typeout{}\fi%
+\end{document}%
+}
+
+\gdef\@LRT@NoMoreDataMessage{%
+\immediate\typeout{No more data.}%
+\immediate\typeout{}%
+}
+
+\gdef\@LRT@missingArgumentMessage#1{
+\immediate\typeout{}%
+\immediate\typeout{I was never given a path to the #1 file.}%
+\immediate\typeout{}%
+\end{document}%
+}
+
+\gdef\@LRT@unknownArgumentMessage#1{
+\immediate\typeout{}%
+\immediate\typeout{I do not recognize an argument of type #1.}%
+\immediate\typeout{}%
+}
+
+\gdef\@LRT@streaming{\input{\@LRT@tex}}
+
+\gdef\@LRT@catcodeMagic{%
+\catcode`\^^M9\relax%
+\catcode`\#12\relax
+\catcode`\$12\relax
+\catcode`\&12\relax
+\catcode`\^12\relax
+\catcode`\_12\relax
+\catcode`\%12\relax
+}
+
+\gdef\@LRT@texNotAtEOF#1{%
+\ifeof\@lrt@texFile{\global\booltrue{@LRT@texEOF}}\else{#1}\fi%
+}
+
+\gdef\@LRT@storage{{%
+\@LRT@catcodeMagic%
+\openin\@lrt@texFile=\@LRT@tex\relax%
+\@LRT@texNotAtEOF{\global\boolfalse{@LRT@texEOF}}%
+\unlessboolexpr{bool{@LRT@texEOF}}{%
+\read\@lrt@texFile to \@LRT@preItem%
+\@LRT@texNotAtEOF{%
+\immediate\write\@lrt@tmpFile{\@LRT@preItem}\relax}%
+}{}%
+\immediate\closein\@lrt@texFile%
+}}
+
+\gdef\@LRT@dataLineIterator{%
+\expandafter\@ifnextchar\@LRT@textDelimiterFront%
+{\@LRT@getTextDelimited}{\@LRT@getFieldDelimited}}
+
+\gdef\@LRT@getFirstArg#1{\gdef\@LRT@firstArg{#1}\@LRT@getSecondArg}
+\gdef\@LRT@getSecondArg#1@{\gdef\@LRT@restArg{#1}}
+
+\gdef\@LRT@getLOFirstArg#1{\gdef\@LRT@ffirstArg{#1}\@LRT@getLOSecondArg}
+\gdef\@LRT@getLOSecondArg#1@{\gdef\@LRT@frestArg{#1}}
+
+\gdef\@LRT@fieldNameIterator#1,{\@LRT@getLOFirstArg{#1}}
+
+\providebool{@LRT@iterator}
+\gdef\@LRT@setFirstLineAndBlankLine#1{%
+\gdef\@lrt@firstline{}%
+\gdef\@LRT@csvBlankLine{}
+\edef\@LRT@restArg{#1\@LRT@fieldDelimiterBack}
+\booltrue{@LRT@iterator}%
+\whileboolexpr{bool{@LRT@iterator}}{%
+\expandafter\@LRT@dataLineIterator\@LRT@restArg @%
+\@LRT@fieldName{\@LRT@firstArg}%
+\xdef\@lrt@firstline{\@lrt@firstline\@LRT@TheString,}%
+\if@LRT@empty{\@LRT@restArg}%
+{\boolfalse{@LRT@iterator}}{\booltrue{@LRT@iterator}}%
+\ifboolexpr{bool{@LRT@iterator}}%
+{\xdef\@LRT@csvBlankLine{\@LRT@csvBlankLine\@LRT@blankFieldItem}}{}%
+}{}%
+}
+
+\gdef\@LRT@getAndProcessNextLine{%
+\unlessboolexpr{bool{@LRT@csvEOF}}{%
+{{%
+\@LRT@catcodeMagic%
+\@LRT@catcodes
+\read\@lrt@csvFile to\@LRT@x@nextLine%
+\ifeof\@lrt@csvFile\relax{\global\booltrue{@LRT@csvEOF}}\else%
+{\global\boolfalse{@LRT@csvEOF}}\fi%
+\xdef\@LRT@nextLine{\@LRT@x@nextLine}%
+}}%
+{{%
+\if@LRT@empty{\@LRT@nextLine}%
+{\global\let\@LRT@next\@LRT@exitGetAndProcessNextLine\relax}%
+{\ifx\@LRT@csvBlankLine\@LRT@nextLine\relax%
+{\global\let\@LRT@next\@LRT@exitGetAndProcessNextLine\relax}\else%
+{\global\let\@LRT@next\@LRT@repeatGetAndProcessNextLine\relax}\fi}%
+\@LRT@next%
+}}%
+}{}%
+}
+
+\gdef\@LRT@exitGetAndProcessNextLine{%
+\closein\@lrt@csvFile\relax\global\booltrue{@LRT@csvEOF}}
+
+\gdef\@LRT@repeatGetAndProcessNextLine{%
+\@LRT@processNextLine{\@LRT@nextLine\@LRT@fieldDelimiterBack}}
+
+\gdef\@LRT@setMacrosForOneEntry#1#2{%
+\expandafter\xdef\csname\@LRT@macroPrefix#1\endcsname{#2}%
+\@LRT@SecondifFieldEmpty{#2}%
+{\global\booltrue{\@LRT@macroPrefix#1}}%
+{\global\boolfalse{\@LRT@macroPrefix#1}}%
+}
+
+\gdef\@LRT@processNextLine#1{%
+\edef\@LRT@restArg{#1}%
+\edef\@LRT@frestArg{\@lrt@firstline}%
+\booltrue{@LRT@iterator}%
+\whileboolexpr{bool{@LRT@iterator}}{%
+\expandafter\@LRT@fieldNameIterator\@LRT@frestArg @%
+\edef\@LRT@restArgA{\@LRT@restArg\@LRT@fieldDelimiterBack}
+\expandafter\@LRT@dataLineIterator\@LRT@restArgA @%
+\@LRT@setMacrosForOneEntry{\@LRT@ffirstArg}{\@LRT@firstArg}%
+\if@LRT@empty{\@LRT@frestArg}%
+{\boolfalse{@LRT@iterator}}{\booltrue{@LRT@iterator}}%
+}{}%
+\@LRT@Input\relax%
+\@LRT@justProcessedMessage%
+}
+
+\gdef\@LRT@mergeData{%
+\providebool{@LRT@texEOF}%
+\immediate\openin\@lrt@csvFile=\@LRT@csv\relax%
+\providebool{@LRT@csvEOF}%
+\boolfalse{@LRT@csvEOF}%
+\ifeof\@lrt@csvFile\@LRT@failedToOpenMessage{\@LRT@csv}\fi%
+{{\@LRT@catcodes
+\read\@lrt@csvFile to\@lrt@firstlineX%
+\@LRT@setFirstLineAndBlankLine{\@lrt@firstlineX}
+}}%
+\booltrue{@LRT@iterator}
+\edef\@LRT@restArg{\@lrt@firstline}%
+\whileboolexpr{bool{@LRT@iterator}}{%
+\expandafter\@LRT@getCommaFieldDelimited\@LRT@restArg @%
+\providebool{\@LRT@macroPrefix\@LRT@firstArg}%
+\if@LRT@empty{\@LRT@restArg}%
+{\boolfalse{@LRT@iterator}}{\booltrue{@LRT@iterator}}%
+}{}%
+\@LRT@getAndProcessNextLine%
+\@LRT@NoMoreDataMessage%
+}
+
+\gdef\@LRT@weirdOption#1{\@ifundefined{@LRT@CO}%
+{\global\csletcs{#1}{@LRT@#1}}{{\global\csletcs{\@LRT@CO #1}{@LRT@#1}}}%
+}
+
+\@LRT@weirdOption{mergeFields}%
+\@LRT@weirdOption{Field}%
+\@LRT@weirdOption{ifFieldEmpty}%
+\@LRT@weirdOption{setDelimitersCommaQuote}%
+\@LRT@weirdOption{setDelimitersTabQuote}%
+\@LRT@weirdOption{makeMePublic}%
+
+\@LRT@setDelimitersCommaQuote
+
+\makeatother
+\endinput
+%%
+%% End of file `csvmerge.sty'.