%% %% This is file `keyvaltable.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% keyvaltable.dtx (with options: `package') %% %% Copyright (C) 2016-2018 by Richard Grewe %% %% This file may be distributed and/or modified under the conditions of %% the LaTeX Project Public License, either version 1.2 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.2 or later is part of all distributions of LaTeX version %% 1999/12/01 or later. %% \NeedsTeXFormat{LaTeX2e}[1999/12/01] \ProvidesPackage{keyvaltable} [2019/05/11 v2.0 Package for filling tables using key-value lists] \RequirePackage{etoolbox} \RequirePackage{xkeyval} \RequirePackage{trimspaces} \PassOptionsToPackage{table}{xcolor} \RequirePackage{xcolor} \RequirePackage{booktabs} \DeclareListParser{\kvt@dossvlist}{;} \DeclareListParser*{\kvt@forpsvlist}{+} \DeclareListParser{\kvt@dobrklist}{\\} \newcommand\kvt@error[2]{\PackageError{keyvaltable}{#1}{#2}} \newcommand\kvt@warn[1]{\PackageWarning{keyvaltable}{#1}} \newcommand\kvt@setkeys[2]{\setkeys[kvt]{#2}{#1}} \newcommand\kvt@setcmdkeys[2]{% \expandafter\kvt@setkeys\expandafter{#1}{#2}} \newcommand\kvt@setcskeys[2]{% \expandafter\kvt@setcmdkeys\expandafter{\csname #1\endcsname}{#2}} \newcommand\kvt@colsetkeys[2]{\setkeys[KeyValTable]{#1}{#2}} \newcommand\kvt@colsetcmdkeys[2]{% \expandafter\kvt@colsetkeys\expandafter{#1}{#2}} \newcommand\kvt@colsetcskeys[2]{% \expandafter\kvt@colsetcmdkeys\expandafter{\csname #1\endcsname}{#2}} \newcommand\kvtStrutted[2][\@firstofone]{% \strut#1{#2}\ifhmode\expandafter\strut\fi} \newcommand\kvtSet[1]{% \kvt@setkeys{#1}{global,Table,Column}% \ifdefvoid\kvt@@presetqueue{} {\kvt@@presetqueue\undef\kvt@@presetqueue}} \newcommand\kvt@lazypreset[2]{% \appto\kvt@@presetqueue{\presetkeys[kvt]{#1}{#2}{}}} \newcommand\kvt@keysetter[5]{% \ifdefvoid{#1} {\kvt@lazypreset{#2}{#3=#4}} {#5}} \newcommand\kvtTableOpt[1]{\csname cmdkvt@Table@#1\endcsname} \define@cmdkey[kvt]{Table}{rowbg}{} \define@cmdkey[kvt]{Table}{headbg}{} \define@boolkey[kvt]{Table}{norowbg}[true]{% \kvt@setkeys{rowbg={}}{Table}} \define@key[kvt]{Table}{nobg}[true]{% \kvt@setkeys{rowbg={},headbg={}}{Table}} \define@cmdkey[kvt]{Table}{headalign}{} \define@cmdkey[kvt]{Table}{headformat}{} \define@cmdkey[kvt]{Table}{width}{} \define@boolkey[kvt]{Table}{showhead}{} \define@boolkey[kvt]{Table}{showrules}{} \define@cmdkey[kvt]{Table}{caption}{} \define@cmdkey[kvt]{Table}{label}{} \define@choicekey[kvt]{Table}{shape} {multipage,onepage,tabular,longtable,tabularx,xltabular,tabu,longtabu} {\csdef{cmdkvt@Table@shape}{#1}} \define@key[kvt]{Column}{default}{\kvt@colkeysetter{default}{#1}} \define@key[kvt]{Column}{format}{\kvt@colkeysetter{format}{#1}} \define@key[kvt]{Column}{align}{\kvt@colkeysetter{align}{#1}} \define@key[kvt]{Column}{head}{\kvt@colkeysetter{head}{#1}} \define@boolkey[kvt]{Column}{hidden}[true]{% \kvt@colkeysetter{hidden}{#1}} \newcommand\kvt@colkeysetter[2]{% \kvt@keysetter{\kvt@@column}{Column}{#1}{#2}{% \csdef{kvt@col@#1@\kvt@@column}{#2}}} \newcommand\kvt@def@globalopt[2]{% \define@key[kvt]{global}{#1/#2}{\kvt@lazypreset{#1}{#2={##1}}}} \newcommand\kvt@def@globalopts[2]{% \forcsvlist{\kvt@def@globalopt{#1}}{#2}} \define@cmdkey[kvt]{ColGroup}{span}{% \csdef{kvt@colgrp@span@\kvt@@colgrp}{#1}} \define@cmdkey[kvt]{ColGroup}{align}{% \csdef{kvt@colgrp@align@\kvt@@colgrp}{#1}} \define@cmdkey[kvt]{ColGroup}{format}{% \csdef{kvt@colgrp@format@\kvt@@colgrp}{#1}} \kvt@def@globalopts{ColGroup}{align, format} \define@cmdkey[kvt]{Layout}{headers}{% \expandafter\kvt@parseheadrows\expandafter{\kvt@@tname}{#1}} \define@cmdkey[kvt]{Layout}{colgroups}{% \expandafter\kvt@parsecolgroups\expandafter{\kvt@@tname}{#1}} \define@key[kvt]{HeadCell}{head}{% \csdef{kvt@@hdcell@head@\kvt@@hdcell}{#1}} \define@key[kvt]{HeadCell}{align}{% \csdef{kvt@@hdcell@align@\kvt@@hdcell}{#1}} \kvt@def@globalopts{HeadCell}{align} \define@cmdkey[kvt]{Row}{bg}{} \define@boolkey[kvt]{Row}{hidden}[true]{} \define@cmdkey[kvt]{Row}{below}{} \define@cmdkey[kvt]{Row}{above}{} \define@key[kvt]{Row}{around}{% \kvt@setkeys{below={#1},above={#1}}{Row}} \define@key[kvt]{Row}{style}{\kvt@UseRowStyles{#1}} \define@boolkey[kvt]{Row}{uncounted}[true]{} \define@boolkey[kvt]{Row}{expand}[true]{} \define@boolkey[kvt]{Row}{expandonce}[true]{} \kvt@def@globalopts{Row}{ bg,hidden,below,above,around,style,uncounted, expand,expandonce} \kvtSet{% rowbg=white..black!10, headbg=black!14, showhead=true, showrules=true, headformat=\@firstofone, headalign=, shape=multipage, width=\linewidth, caption={}, label={}, default=, format=\kvtStrutted, align=l, head=, hidden=false, Row/bg={}, Row/hidden=false, Row/above={}, Row/below={}, Row/uncounted=false, Row/expand=false, Row/expandonce=false, ColGroup/align=c, ColGroup/format=\kvtStrutted, HeadCell/align=c, } \newcommand\NewKeyValTable[3][]{% \@ifnextchar[%] {\kvt@NewKeyValTable{#1}{#2}{#3}}% {\kvt@NewKeyValTable{#1}{#2}{#3}[]}} \def\kvt@NewKeyValTable#1#2#3[#4]{% \ifinlist{#2}{\kvt@alltables} {\kvt@error{Table type with name '#2' already defined} {Check '#2' for typos and check other uses of \string\NewKeyValTable}}{}% \csdef{kvt@options@#2}{#1}% \csdef{kvt@headings@#2}{}% \csedef{kvt@alignments@#2}{p{0pt}\expandonce\kvt@HackIntercolSpace}% \csdef{kvt@allcolumns@#2}{}% \csdef{kvt@displaycols@#2}{}% \csdef{kvt@rowcount@#2}{0}% \csdef{kvt@rows@#2}{}% \csdef{kvt@headings@#2}{\kvt@defaultheader} \listadd\kvt@alltables{#2}% \def\do##1{% \kvt@parsecolspec{#2}##1::\@undefined}% \kvt@dossvlist{#3}% \csdef{kvt@headrowcount@#2}{1}% \csappto{kvt@headings@#2}{{\@nil}}% \kvt@parselayout{#4}{#2}% } \def\kvt@parsecolspec#1#2:#3:#4\@undefined{% \def\kvt@@column{#2}% \trim@spaces@in\kvt@@column \expandafter\kvt@parsecolspec@i\expandafter{\kvt@@column}{#1}{#3}} \newcommand\kvt@parsecolspec@i[3]{\kvt@parsecolspec@ii{#2}{#1}{#3}} \newcommand\kvt@parsecolspec@ii[3]{% \def\kvt@@column{#1@#2}% \ifinlistcs{#2}{kvt@allcolumns@#1} {\kvt@error{Column name '#2' declared more than once in table type '#1'}{Check '#2' for typos; column names declared so far:% \forlistcsloop{ }{kvt@allcolumns@#1}}}{}% \listcsadd{kvt@allcolumns@#1}{#2}% \kvt@setkeys{#3}{Column}% \ifcsstring{kvt@col@hidden@#1@#2}{true}{}{% \cseappto{kvt@alignments@#1}{\csexpandonce{kvt@col@align@#1@#2}}% \ifcsvoid{kvt@col@head@#1@#2}% {\csappto{kvt@headings@#1}{{#2}}}% {\cseappto{kvt@headings@#1}{{\csexpandonce{kvt@col@head@#1@#2}}}}% \listcsadd{kvt@displaycols@#1}{#2}% }% \define@cmdkey[KeyValTable]{#1}{#2}[]{}% \define@key[KeyValTable]{#1}{#2*}{% \csdef{cmdKeyValTable@#1@#2}{##1}% \csdef{kvt@@noformat@#1@#2}{1}}% \presetkeys[KeyValTable]{#1}{#2}{}% \undef\kvt@@column} \newcommand\kvt@defaultheader{% \noexpand\kvt@rowcolorornot{\cmdkvt@Table@headbg}% \kvt@defaultheader@i} \newcommand\kvt@defaultheader@i[1]{% \kvt@ifnil{#1}{\noexpand\tabularnewline}{% \unexpanded{&}% \ifdefvoid\cmdkvt@Table@headalign {\expandonce\cmdkvt@Table@headformat{\unexpanded{#1}}} {\noexpand\multicolumn{1}{\expandonce\cmdkvt@Table@headalign} {\expandonce\cmdkvt@Table@headformat{\unexpanded{#1}}}}% \kvt@defaultheader@i}} \newcommand\kvt@ifnil[1]{% \ifx\@nil#1\relax \expandafter\@firstoftwo\else \expandafter\@secondoftwo\fi} \newcommand\kvt@HackIntercolSpace{% @{\hspace{-.5\arrayrulewidth}}} \newcommand\kvt@alltables{} \newcommand\kvt@parselayout[2]{% \def\kvt@@tname{#2}% \kvt@setkeys{#1}{Layout}% \undef\kvt@@tname} \newcommand\kvt@parsecolgroups[2]{% \begingroup \def\kvt@@result{}% \def\do##1{\kvt@parsecolgroup{#1}##1::\@undefined}% \kvt@dossvlist{#2}% \expandafter\endgroup\kvt@@result} \def\kvt@parsecolgroup#1#2:#3:#4\@undefined{% \ifinlistcs{#2}{kvt@allcolumns@#1}{\kvt@error {Name `#2' cannot be used for a column group in table type `#1', as it is already used for a column} {Check the \string\NewKeyValTable{#1} for the names of known columns and check `#2' for a typo.}}{}% \ifinlistcs{#2}{kvt@grpcolkeys@#1}{\kvt@error {Name `#2' is used twice in table type `#1'} {Check the \string\NewKeyValTable{#1} for typos in the names of columns groups.}}{}% \def\kvt@@colgrp{#2}% \kvt@setkeys{#3}{ColGroup}% \kvt@checkcolgroupcs{kvt@colgrp@span@\kvt@@colgrp}{#1}{#2}% \eappto\kvt@@result{% \noexpand\define@cmdkey[KeyValTable]{#1}{#2}{% \ifdefvoid\kvt@@colgrp@first{}{% \noexpand\setkeys[KeyValTable]{#1}{% \expandonce\kvt@@colgrp@first*=\noexpand\multicolumn {\expandonce\kvt@@colgrp@n}% {\csexpandonce{kvt@colgrp@align@#2}}% {\csexpandonce{kvt@colgrp@format@#2}{\unexpanded{##1}}}}% }% }% \noexpand\listcsadd{kvt@grpcolkeys@#1}{#2}}} \newcommand\kvt@checkcolgroup[3]{% \def\kvt@@psvdo##1{% \ifinlistcs{##1}{kvt@allcolumns@#2}{}{\kvt@error {Column `##1' referenced in column group `#3' not known in table type `#2'} {Check the \string\NewKeyValTable{#2} for the names of known columns and check `##1' for a typo.}}% \ifcsvoid{kvt@@incolgrp@##1}{}{\kvt@error {Column `##1' used more than once in column group `#3' of table type `#2'} {Check `##1' for a typo.}}% \csdef{kvt@@incolgrp@##1}{#2}% }\kvt@forpsvlist{\kvt@@psvdo}{#1}% \def\kvt@@colgrp@n{0}% \let\kvt@@colgrp@first\relax \def\kvt@@status{0}% \def\kvt@@coldo##1{% \ifcsvoid{kvt@@incolgrp@##1} {\expandafter\ifcase\kvt@@status \or \def\kvt@@status{2}\fi}% {\expandafter\ifcase\kvt@@status \def\kvt@@status{1}\def\kvt@@colgrp@first{##1}% \or\or \kvt@error{Column group `\kvt@@colgrp' must consist of only consecutive columns, but it is not}% {Compare `\string\kvt@@curgrp' to the column ordering as specified in `\string\NewKeyValTable{#1}'}% \fi \edef\kvt@@colgrp@n{\the\numexpr\kvt@@colgrp@n+1\relax}}% }\forlistcsloop{\kvt@@coldo}{kvt@displaycols@#2}} \newcommand\kvt@checkcolgroupcs[3]{% \expandafter\expandafter\expandafter \kvt@checkcolgroup \expandafter\expandafter\expandafter{\csname #1\endcsname}{#2}{#3}} \newcommand\kvt@parseheadrows[2]{% \ifstrempty{#2}{}{\kvt@parseheadrows@i{#2}{#1}}} \newcommand\kvt@parseheadrows@i[2]{% \csdef{kvt@@custheadrows@#2}{}% \csdef{kvt@headrowcount@#2}{0}% \begingroup \def\kvt@@parseheadrows{}% \def\do##1{% \def\kvt@@tmp{##1}\trim@post@space@in\kvt@@tmp% \expandafter\ifstrequal\expandafter{\kvt@@tmp}{::} {\appto\kvt@@parseheadrows{% \cseappto{kvt@@custheadrows@#2}{% \csexpandonce{kvt@headings@#2}}}} {\appto\kvt@@parseheadrows{\kvt@parseheadrow{#2}{##1}}}% \appto\kvt@@parseheadrows{\csedef{kvt@headrowcount@#2}{% \the\numexpr\csuse{kvt@headrowcount@#2}+1\relax}}% }\kvt@dobrklist{#1}% \expandafter\endgroup\kvt@@parseheadrows \csletcs{kvt@headings@#2}{kvt@@custheadrows@#2}} \newcommand\kvt@parseheadrow[2]{% \begingroup \def\do##1{\kvt@parsehdcolspec{#1}##1::\@undefined}% \kvt@dossvlist{#2}% \let\kvt@@tmpgrphd\@empty \kvt@@span\z@ \undef\kvt@@curhd \undef\kvt@@lasthd \def\do##1{\letcs\kvt@@curhd{kvt@@hdcellof@##1}% \ifdefequal\kvt@@curhd\kvt@@lasthd {\advance\kvt@@span\@ne}% {\ifnum\kvt@@span>\z@ \expandafter\kvt@concludecolumn\fi \ifdefvoid\kvt@@curhd{}{\ifcsdef{kvt@@hdcelldone@\kvt@@curhd}{% \kvt@error{Header cell `\kvt@@curhd' must consist of only consecutive columns, but it is not}% {Compare `\string\kvt@@curhd' to the column ordering as specified in `\string\NewKeyValTable{#1}'}}{}}% \kvt@@span\@ne \let\kvt@@lasthd\kvt@@curhd}% }\dolistcsloop{kvt@displaycols@#1}% \kvt@concludecolumn \appto\kvt@@tmpgrphd{\tabularnewline}% \edef\do{\noexpand\csappto{kvt@@custheadrows@#1}{% \unexpanded{\noexpand\kvt@rowcolorornot{\cmdkvt@Table@headbg}}% \noexpand\unexpanded{\expandonce{\kvt@@tmpgrphd}}}}% \expandafter\endgroup\do} \newcommand\kvt@rowcolorornot[1]{\ifstrempty{#1}{}{\rowcolor{#1}}} \newcount\kvt@@span \newcommand\kvt@concludecolumn{% \ifdefequal\kvt@@tmpgrphd\@empty {\let\kvt@@extraalign\kvt@HackIntercolSpace} {\let\kvt@@extraalign\@empty}% \appto\kvt@@tmpgrphd{&}% \ifdefvoid\kvt@@lasthd{}{% \eappto\kvt@@tmpgrphd{\noexpand\multicolumn {\the\kvt@@span} {\expandonce\kvt@@extraalign \csexpandonce{kvt@@hdcell@align@\kvt@@lasthd}} {\csexpandonce{kvt@@hdcell@head@\kvt@@lasthd}}}% \cslet{kvt@@hdcelldone@\kvt@@lasthd}{\@ne}}} \def\kvt@parsehdcolspec#1#2:#3:#4\@undefined{% \def\kvt@@colreg##1{% \ifinlistcs{##1}{kvt@allcolumns@#1}{} {\kvt@error{Column `##1', referenced in header cell `#2', not known in table type `#1'}{Check the \string\NewKeyValTable{#1} for the names of known columns and check `##1' for a typo.}}% \ifcsmacro{kvt@@hdcellof@##1} {\kvt@error{Column `##1' used in more than one header cell} {Check the fourth, optional argument of \string\NewKeyValTable and eliminate multiple occurrences of column `##1'.}} {\csdef{kvt@@hdcellof@##1}{#2}}% }\kvt@forpsvlist{\kvt@@colreg}{#2}% \def\kvt@@hdcell{#2}% \kvt@setkeys{#3}{HeadCell}} \newcounter{kvtRow} \newcounter{kvtTypeRow} \newcounter{kvtTotalRow} \setcounter{kvtTotalRow}{0} \newcommand\kvtLabel[3][]{% \setcounter{kvt@LabelCtr}{\value{#2}}% \addtocounter{kvt@LabelCtr}{-1}% \refstepcounter{kvt@LabelCtr}% \ifstrempty{#3}{}{% \ifstrempty{#1}{\label{#3}}{\label[#1]{#3}}}% \csuse{the#2}} \newcounter{kvt@LabelCtr} \newenvironment{KeyValTable}[2][]{% \def\Row{\kvt@AddKeyValRow {\noalign\bgroup}{\expandafter\egroup\kvt@@row}{#2}}% \kvt@SetOptions{#2}{#1}% \csuse{kvt@StartTable@\cmdkvt@Table@shape}{#2}% }{% \csuse{kvt@EndTable@\cmdkvt@Table@shape}} \AfterEndEnvironment{KeyValTable}{% \csdef{kvt@rowcount@\kvt@@recenttable}{\thekvtTypeRow}} \newcommand\kvt@SetOptions[2]{% \begingroup\edef\kvt@@do{\endgroup\noexpand% \kvt@setkeys{\csexpandonce{kvt@options@#1},\unexpanded{#2}}{Table}% }\kvt@@do} \newcommand\kvt@StartTabularlike[2]{% \gdef\kvt@@recenttable{#2}% \metatblAtEnd{#1}{\kvt@@endhook}\let\kvt@@endhook\relax% \ifbool{kvt@Table@showrules} {\def\kvt@@rule##1{\csuse{##1rule}}} {\def\kvt@@rule##1{}}% \appto\kvt@@endhook{\kvt@@rule{bottom}} \ifdefempty\cmdkvt@Table@caption{}{% \metatblHasCaption{#1} {\appto\kvt@@endhook{\rowcolor{white}% \caption{\cmdkvt@Table@caption}}% \ifdefempty\cmdkvt@Table@label{}{% \appto\kvt@@endhook{\expandafter% \label\expandafter{\cmdkvt@Table@label}}}} {\kvt@warn{Caption lost, table environment '#1' does not support captions.}}}% \setcounter{kvtRow}{0}% \setcounter{kvtTypeRow}{\csuse{kvt@rowcount@#2}}% \begingroup\edef\kvt@@do{\endgroup \metatblIsTabu{#1}{}{\noexpand\kvt@dottedrowcolors {\ifbool{kvt@Table@showhead} {\the\numexpr\csuse{kvt@headrowcount@#2}+1\relax} {1}}% {\expandonce\cmdkvt@Table@rowbg}}% \expandafter\noexpand\csname #1\endcsname \metatblHasWidth{#1} {\metatblIsTabu{#1} {to \expandonce\cmdkvt@Table@width} {{\expandonce\cmdkvt@Table@width}}} {}% {\csexpandonce{kvt@alignments@#2}}% \noexpand\kvt@@rule{top}% \ifbool{kvt@Table@showhead} {\csuse{kvt@headings@#2}\noexpand\kvt@@rule{mid}} {}% \metatblIsTabu{#1} {\noexpand\kvt@taburowcolors{\expandonce\cmdkvt@Table@rowbg}}{}% \metatblIsLong{#1}{\noexpand\endhead}{}% }\kvt@@do} \newcommand\kvt@dottedrowcolors[2]{% \ifstrempty{#2}{}{\kvt@dottedrowcolors@i{#1}#2\@nil}} \def\kvt@dottedrowcolors@i#1#2..#3\@nil{% \ifnumodd{#1} {\rowcolors{#1}{#2}{#3}} {\rowcolors{#1}{#3}{#2}}} \newcommand\kvt@taburowcolors[1]{% \ifstrempty{#1}{}{\taburowcolors{#1}}} \newcommand\kvt@DefineStdTabEnv{\@dblarg\kvt@DefineStdTabEnv@i} \newcommand\kvt@DefineStdTabEnv@i[2][]{% \expandafter\newcommand\csname kvt@StartTable@#1\endcsname[1]{% \kvt@StartTabularlike{#2}{##1}}% \csedef{kvt@EndTable@#1}{% \expandafter\noexpand\csname end#2\endcsname}} \newcommand\kvt@DefineDualTabEnv[3]{% \expandafter\newcommand\csname kvt@StartTable@#1\endcsname[1]{% \kvt@ifhasXcolumns{##1} {\csedef{kvt@EndTable@#1}{% \expandafter\noexpand\csname end#3\endcsname}% \kvt@StartTabularlike{#3}{##1}% }{\csedef{kvt@EndTable@#1}{% \expandafter\noexpand\csname end#2\endcsname}% \kvt@StartTabularlike{#2}{##1}}}} \newcommand\kvt@ifhasXcolumns[1]{% \expandafter\expandafter\expandafter\metatbl@ifhasXcolumns \expandafter\expandafter\expandafter{% \csname kvt@alignments@#1\endcsname}} \kvt@DefineStdTabEnv{tabular} \kvt@DefineStdTabEnv{longtable} \kvt@DefineStdTabEnv{tabularx} \kvt@DefineStdTabEnv{xltabular} \kvt@DefineStdTabEnv{tabu} \kvt@DefineStdTabEnv{longtabu} \define@boolkey[metatbl]{EnvProp}{isLong}{\metatbl@boolprop{isLong}{#1}} \define@boolkey[metatbl]{EnvProp}{isTabu}{\metatbl@boolprop{isTabu}{#1}} \define@boolkey[metatbl]{EnvProp}{hasWidth}{% \metatbl@boolprop{hasWidth}{#1}} \define@boolkey[metatbl]{EnvProp}{hasCaption}{% \metatbl@boolprop{hasCaption}{#1}} \define@cmdkey[metatbl]{EnvProp}{packages}{\metatbl@setprop{pkg}{#1}} \define@key[metatbl]{EnvProp}{atEnd}{\metatbl@setprop[1]{atEnd}{#1}} \newrobustcmd\metatblRegisterEnv[2]{% \edef\metatbl@@envname{#1}% \setkeys[metatbl]{EnvProp}{#2}} \newcommand\metatbl@setprop[3][0]{% \expandafter\newcommand \csname metatbl@EnvProp@#2@\metatbl@@envname\endcsname[#1]{#3}} \newcommand\metatbl@boolprop[2]{% \providebool{metatbl@EnvProp@#1@\metatbl@@envname}% \setbool{metatbl@EnvProp@#1@\metatbl@@envname}{#2}} \newcommand\metatblIsLong[1]{\ifbool{metatbl@EnvProp@isLong@#1}} \newcommand\metatblIsTabu[1]{\ifbool{metatbl@EnvProp@isTabu@#1}} \newcommand\metatblHasWidth[1]{\ifbool{metatbl@EnvProp@hasWidth@#1}} \newcommand\metatblHasCaption[1]{\ifbool{metatbl@EnvProp@hasCaption@#1}} \newcommand\metatblUsePackage[1]{% \def\do##1{\metatbl@csnamearg\usepackage{metatbl@EnvProp@pkg@##1}}% \docsvlist{#1}} \newcommand\metatblRequire[1]{% \def\do##1{\metatbl@csnamearg\RequirePackage{metatbl@EnvProp@pkg@##1}}% \docsvlist{#1}} \newcommand\metatblAtEnd[2]{% #1=env-name, #2=code \csname metatbl@EnvProp@atEnd@#1\endcsname{#2}} \newcommand\metatbl@csnamearg[2]{% \expandafter\expandafter\expandafter#1% \expandafter\expandafter\expandafter{\csname#2\endcsname}} \metatblRegisterEnv{tabular}{% isLong=false, hasWidth=false, isTabu=false, hasCaption=false, packages={}, atEnd={\preto\endtabular{#1}}, } \metatblRegisterEnv{tabularx}{% isLong=false, hasWidth=true, isTabu=false, hasCaption=false, packages=tabularx, atEnd={% \preto\TX@endtabularx{\toks@\expandafter{\the\toks@#1}}% \preto\XLT@i@TX@endtabularx{\toks@\expandafter{\the\toks@#1}}}, } \metatblRegisterEnv{longtable}{% isLong=true, hasWidth=false, isTabu=false, hasCaption=true, packages={longtable}, atEnd={\preto\endlongtable{#1}}, } \metatblRegisterEnv{xltabular}{% isLong=true, hasWidth=true, isTabu=false, hasCaption=true, packages=xltabular, atEnd={\preto\XLT@ii@TX@endtabularx{\toks@\expandafter{\the\toks@#1}}}, } \metatblRegisterEnv{tabu}{% isLong=false, hasWidth=true, isTabu=true, hasCaption=false, packages={tabu}, atEnd={\preto\endtabular{#1}}, } \metatblRegisterEnv{longtabu}{% isLong=true, hasWidth=true, isTabu=true, hasCaption=true, packages={tabu,longtable}, atEnd={\preto\endlongtable{#1}}, } \newrobustcmd\metatbl@ifhasXcolumns[1]{% \begingroup \def\metatbl@@branch{\@secondoftwo}% \def\NC@rewrite@X{\def\metatbl@@branch{\@firstoftwo}\NC@find}% \@mkpream{#1}% \expandafter\endgroup\metatbl@@branch} \newcommand\kvt@AddKeyValRow[3]{% #1% \@ifnextchar[%] {\kvt@AddKeyValRow@i{#2}{#3}} {\kvt@AddKeyValRow@i{#2}{#3}[]}} \def\kvt@AddKeyValRow@i#1#2[#3]#4{% \kvt@setkeys{#3}{Row}% \ifbool{kvt@Row@hidden} {\let\kvt@@row\@empty #1} {\kvt@AddKeyValRow@ii{#1}{#2}{#4}}} \def\kvt@AddKeyValRow@ii#1#2#3{% \setkeys[KeyValTable]{#2}{#3}% \def\kvt@@row{}% \ifdefvoid\cmdkvt@Row@above{}{% \eappto\kvt@@row{\noexpand\noalign{\noexpand\vspace{% \expandonce\cmdkvt@Row@above}}}}% \ifdefvoid\cmdkvt@Row@bg{}{% \eappto\kvt@@row{\noexpand\rowcolor{\expandonce\cmdkvt@Row@bg}}}% \ifbool{kvt@Row@uncounted}{}{% \appto\kvt@@row{\noalign{\kvt@stepcounters}}}% \kvt@@span=0\relax \def\do##1{% \ifcsvoid{cmdKeyValTable@#2@##1} {\letcs\kvt@@cell{kvt@col@default@#2@##1}} {\letcs\kvt@@cell{cmdKeyValTable@#2@##1}% \ifbool{kvt@Row@expandonce} {\expandafter\let\expandafter\kvt@@cell\kvt@@cell}{}% \ifbool{kvt@Row@expand} {\protected@edef\kvt@@cell{\kvt@@cell}}{}}% \ifcsvoid{kvt@@noformat@#2@##1} {\edef\kvt@@formatter{\expandonce{\csname kvt@col@format@#2@##1\endcsname}}}% {\def\kvt@@formatter{\@firstofone}}% \edef\kvt@@fmtcell{\expandonce\kvt@@formatter{% \expandonce\kvt@@cell}}% \csundef{kvt@@noformat@#2@##1}% \ifnumgreater\kvt@@span{0} {\advance\kvt@@span\m@ne \ifstrempty\kvt@@cell{\def\kvt@@fmtcell{}}{}} {\appto\kvt@@row{&}}% \expandafter\kvt@CheckMulticolumn\kvt@@cell \relax\relax\relax\relax\@undefined \expandafter\appto\expandafter\kvt@@row\expandafter{\kvt@@fmtcell}% }\dolistcsloop{kvt@displaycols@#2}% \appto\kvt@@row{\tabularnewline}% \ifdefvoid\cmdkvt@Row@below{}{% \eappto\kvt@@row{\noexpand\noalign{\noexpand\vspace{% \expandonce\cmdkvt@Row@below}}}}% #1} \newcommand\kvt@stepcounters[1][1]{% \addtocounter{kvtRow}{#1}% \addtocounter{kvtTypeRow}{#1}% \addtocounter{kvtTotalRow}{#1}} \def\kvt@CheckMulticolumn#1#2#3#4\@undefined{% \ifx#1\multicolumn \kvt@@span=#2\relax \advance\kvt@@span\m@ne \edef\kvt@@fmtcell{\unexpanded{\multicolumn{#2}{#3}}% {\expandonce\kvt@@formatter{\expandonce{#4}}}}% \fi} \newcommand\kvtNewRowStyle[2]{% \ifcsundef{kvt@@rowstyle@#1} {\csdef{kvt@@rowstyle@#1}{#2}} {\kvt@error{Row style '#1' is already defined}{Use \string\kvtRenewRowStyle\space to change an existing style.}}} \newcommand\kvtRenewRowStyle[2]{% \ifcsundef{kvt@@rowstyle@#1} {\kvt@error{Row style '#1' is not defined} {Use \string\kvtNewRowStyle\space to define a new row style.}} {\csdef{kvt@@rowstyle@#1}{#2}}} \newcommand\kvt@UseRowStyle[1]{% \ifcsundef{kvt@@rowstyle@#1} {\kvt@error{Row style '#1' is not defined} {Use \string\kvtNewRowStyle\space to define a new row style.}} {\kvt@setcskeys{kvt@@rowstyle@#1}{Row}}} \newcommand\kvt@UseRowStyles[1]{% \kvt@xkv@disablepreset[kvt]{Row}{% \forcsvlist\kvt@UseRowStyle{#1}}} \newcommand\kvt@xkv@disablepreset[3][KV]{% \ifnumgreater{\XKV@depth}{1} {#3} {\kvt@xkv@savepreset{#1}{#2}{h}% \kvt@xkv@savepreset{#1}{#2}{t}% #3% \kvt@xkv@restorepreset{#1}{#2}{h}% \kvt@xkv@restorepreset{#1}{#2}{t}}} \newcommand\kvt@xkv@savepreset[3]{% \csletcs{kvt@@saved@preset#3}{XKV@#1@#2@preset#3}% \csundef{XKV@#1@#2@preset#3}} \newcommand\kvt@xkv@restorepreset[3]{% \csletcs{XKV@#1@#2@preset#3}{kvt@@saved@preset#3}} \newcommand\NewCollectedTable[2]{% \ifcsvoid{kvt@@tnameof@#1} {\csgdef{kvt@@tnameof@#1}{#2}} {\kvt@error{Name '#1' for a row collection is already defined} {Check for other \string\NewCollectedTable{#1}.}}} \newcommand\CollectRow[3][]{% \ifcsvoid{kvt@@tnameof@#2} {\kvt@error{No row collection with name '#2' defined} {Use \string\NewCollectedTable in the preamble to define it.}} {% \begingroup \kvt@setkeys{#1}{Row}% \kvt@colsetcskeys{kvt@@tnameof@#2}{#3}% \endgroup \kvt@protected@write\@auxout{\string\kvt@RecordedRow{#1}{#2}{% \kvt@coldefaults{#2}% #3}}% }} \newcommand\kvt@protected@write[2]{\protected@write{#1} {\def\do##1{\def##1{\string##1}}% \dolistloop{\kvt@@writeprotected@cmds}% \forlistloop{\kvt@writeprotect@fmt}{\kvt@@numberformatters}} {#2}} \newcommand\kvt@writeprotect@fmt[1]{% \csletcs{kvt@@fmt@#1}{#1}% \csdef{#1}##1{% \ifcsdef{kvt@@c@##1} {\expandafter\string\csname#1\endcsname{##1}} {\csname kvt@@fmt@#1\endcsname{##1}}}} \newcommand\kvtDeclareTableMacros[1]{% \forcsvlist{\listadd\kvt@@writeprotected@cmds}{#1}} \newcommand\kvt@@writeprotected@cmds{} \newcommand\kvtDeclareTableCounters[1]{% \def\do##1{\cslet{kvt@@c@##1}\@ne}% \docsvlist{#1}} \newcommand\kvtDeclareCtrFormatters[1]{% \def\do##1{\listeadd\kvt@@numberformatters{% \expandafter\@gobble\string##1}}% \docsvlist{#1}} \newcommand\kvt@@numberformatters{} \kvtDeclareTableMacros{\thekvtRow,\thekvtTypeRow,\thekvtTotalRow} \kvtDeclareTableCounters{kvtRow,kvtTypeRow,kvtTotalRow} \kvtDeclareCtrFormatters{\arabic,\alph,\Alph,\roman,\Roman,\fnsymbol} \newcommand\kvt@coldefaults[1]{% \kvt@coldefaults@i{\csuse{kvt@@tnameof@#1}}} \newcommand\kvt@coldefaults@i[1]{% \forlistcsloop{\kvt@coldefault{#1}}{kvt@displaycols@#1}} \newcommand\kvt@coldefault[2]{\ifcsvoid{kvt@col@default@#1@#2}{}{% #2={\csuse{kvt@col@default@#1@#2}},}} \newcommand\kvt@RecordedRow[3]{% \csgappto{kvt@@rowsof@#2}{\Row[{#1}]{#3}}} \newcommand\ShowCollectedTable[2][]{% \ifcsvoid{kvt@@tnameof@#2} {\kvt@error{No row collection with name '#2' defined} {Use \string\NewCollectedTable in the preamble to define it.}} {\ifcsvoid{kvt@@rowsof@#2} {\kvt@warn{No row data available for name '#2'. A LaTeX rerun might be needed^^M for the row data to be available}% \kvt@tableofcname{#2}{#1}{???\tabularnewline}}% {\kvt@tableofcname{#2}{#1}{\csuse{kvt@@rowsof@#2}}}}} \newcommand\kvt@tableof[3]{% \begin{KeyValTable}[{#2}]{#1}% #3% \end{KeyValTable}} \newcommand\kvt@tableofcname[1]{\expandafter \kvt@tableofcname@i\expandafter{\csname kvt@@tnameof@#1\endcsname}} \newcommand\kvt@tableofcname@i[1]{\expandafter \kvt@tableof\expandafter{#1}} \newcommand\ShowKeyValTableFile[3][]{% \IfFileExists{#3} {\begin{KeyValTable}[{#1}]{#2}\@@input#3 \end{KeyValTable}}% {\kvt@error{No KeyValTable file '#3'} {Check whether the file really exists or whether there is a typo in the argument '#3'}}} \newcommand\ShowKeyValTable[2][]{% \begin{KeyValTable}[#1]{#2}% \csuse{kvt@rows@#2}% \end{KeyValTable}% \csdef{kvt@rows@#2}{}} \newcommand\AddKeyValRow[1]{% \kvt@AddKeyValRow {\begingroup} {\csxappto{kvt@rows@#1}{\expandonce{\kvt@@row}}\endgroup} {#1}} \newenvironment{KeyValTableContent}[1]{% \def\Row{\AddKeyValRow{#1}}}{}% \define@cmdkey[kvt]{PackageOptions}[kvt@@pkg@]{compat}{} \ExecuteOptionsX[kvt]{% compat=2.0, } \ProcessOptionsX[kvt]\relax \newcommand\kvt@IfVersion[2]{% \ifdimcomp{\kvt@@pkg@compat pt}{#1}{#2pt}} \kvt@IfVersion{<}{2.0}{% \metatblRequire{tabu,longtabu} \kvt@DefineStdTabEnv[onepage]{tabu} \kvt@DefineStdTabEnv[multipage]{longtabu} }{% \metatblRequire{tabularx,longtable,xltabular} \kvt@DefineDualTabEnv{onepage}{tabular}{tabularx} \kvt@DefineDualTabEnv{multipage}{longtable}{xltabular} } \kvt@IfVersion{<}{2.0}{% \let\kvt@parselayout=\kvt@parseheadrows }{} \endinput %% %% End of file `keyvaltable.sty'.