summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/keyvaltable
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2020-04-11 22:50:13 +0000
committerKarl Berry <karl@freefriends.org>2020-04-11 22:50:13 +0000
commitc1aac14d5d1d32826a5e68a5dfc59a05b4f1e989 (patch)
tree392e9406033af8730fff8eb6c6496edd7b4728c6 /Master/texmf-dist/tex/latex/keyvaltable
parent3243e3fe2fabf32acfb3a87d9167523ba1b4781c (diff)
keyvaltable (5apr20)
git-svn-id: svn://tug.org/texlive/trunk@54677 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/keyvaltable')
-rw-r--r--Master/texmf-dist/tex/latex/keyvaltable/keyvaltable.sty387
1 files changed, 254 insertions, 133 deletions
diff --git a/Master/texmf-dist/tex/latex/keyvaltable/keyvaltable.sty b/Master/texmf-dist/tex/latex/keyvaltable/keyvaltable.sty
index 2101d3a66ed..8ea0356c378 100644
--- a/Master/texmf-dist/tex/latex/keyvaltable/keyvaltable.sty
+++ b/Master/texmf-dist/tex/latex/keyvaltable/keyvaltable.sty
@@ -20,16 +20,31 @@
%%
\NeedsTeXFormat{LaTeX2e}[1999/12/01]
\ProvidesPackage{keyvaltable}
- [2020/02/19 v2.1 Package for filling tables using key-value lists]
+ [2020/04/05 v2.2 Package for filling tables using key-value lists]
+
\RequirePackage{etoolbox}
\RequirePackage{xkeyval}
\RequirePackage{trimspaces}
\PassOptionsToPackage{table}{xcolor}
\RequirePackage{xcolor}
\RequirePackage{booktabs}
+\newcommand\kvt@DeclareTrimListParser{%
+ \@ifstar{\kvt@DeclareTrimListParser@i{*}}
+ {\kvt@DeclareTrimListParser@i{}}}
+\newcommand\kvt@DeclareTrimListParser@i[3]{%
+ \DeclareListParser#1{#2}{#3}\expandafter
+ \patchcmd\csname etb@lst@\expandafter\@gobble\string#2\endcsname
+ {\etb@listitem}{\kvt@etb@listitem}{}
+ {\kvt@warn{Failed to patch a command defined by the etoolbox
+ package, possibly because etoolbox internals have changed.
+ You might encounter superfluous spaces.}}}
+\newcommand\kvt@etb@listitem[2]{%
+ \expandafter\expandafter\expandafter\kvt@etb@listitem@i
+ \expandafter\expandafter\expandafter{\trim@post@space@noexp{#2}}{#1}}
+\newcommand\kvt@etb@listitem@i[2]{\etb@listitem{#2}{#1}}
\DeclareListParser{\kvt@dossvlist}{;}
-\DeclareListParser*{\kvt@forpsvlist}{+}
-\DeclareListParser{\kvt@dobrklist}{\\}
+\kvt@DeclareTrimListParser*{\kvt@forpsvlist}{+}
+\kvt@DeclareTrimListParser{\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}}
@@ -64,12 +79,13 @@
\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}{captionpos}{t,b}
+ {\csdef{cmdkvt@Table@captionpos}{#1}}
\define@choicekey[kvt]{Table}{valign}{t,c,b}
{\csdef{cmdkvt@Table@valign}{#1}}
\define@choicekey[kvt]{Table}{halign}{l,c,r}
{\csdef{cmdkvt@Table@halign}{#1}}
+\define@key[kvt]{Table}{style}{\kvt@UseTableStyles{#1}}
\define@boolkey[kvt]{Table}{norowbg}[true]{%
\kvt@setkeys{rowbg={}}{Table}}
\define@boolkey[kvt]{Table}{nobg}[true]{%
@@ -78,9 +94,36 @@
\ifbool{#1}
{\kvt@setkeys{showrules=false}{Table}}
{\kvt@setkeys{showrules=true}{Table}}}
-\define@choicekey[kvt]{Table}{shape}
- {multipage,onepage,tabular,longtable,tabularx,xltabular,tabu,longtabu}
+\define@key[kvt]{Table}{backend}{\ifinlist{#1}{\kvt@@tablebackends}
{\csdef{cmdkvt@Table@shape}{#1}}
+ {\kvt@error{Table backend '#1' not known}
+ {Check for misspellings in '#1'}}}
+\define@key[kvt]{Table}{shape}{\ifinlist{#1}{\kvt@@tableshapes}
+ {\csdef{cmdkvt@Table@shape}{#1}}
+ {\ifinlist{#1}{\kvt@@tablebackends}
+ {\kvt@warn{Using a backend ('#1') as shape is deprecated.
+ Use the 'backend' option instead.}%
+ \csdef{cmdkvt@Table@shape}{#1}}
+ {\kvt@error{Table shape '#1' not known}
+ {Check for misspellings in '#1'}}}}
+\define@cmdkey[kvt]{TableEnv}{caption}{}
+\define@cmdkey[kvt]{TableEnv}{caption/lot}{}
+\define@cmdkey[kvt]{TableEnv}{caption/alt}{}
+\define@cmdkey[kvt]{TableEnv}{label}{}
+\define@boolkey[kvt]{TableEnv}{resume}[true]{%
+ \ifbool{#1}{\ifundef\kvt@@rowcountlast
+ {\kvt@error{No previous table whose counter could be resumed.}
+ {Check whether the "resume" is intentional and whether a
+ previously existing predecessor table has disappeared.}}{}}{}}
+\define@boolkey[kvt]{TableEnv}{resume*}[true]{%
+ \ifbool{#1}
+ {\ifundef\kvt@@lastenvopt
+ {\kvt@error{No previous table whose options could be resume*'d.}
+ {Check whether the "resume*" is intentional and whether a
+ previously existing predecessor table has disappeared.}}{}%
+ \kvt@setcmdkeys\kvt@@lastenvopt{Table}%
+ \kvt@setkeys{resume}{TableEnv}}
+ {}}
\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}}
@@ -135,7 +178,7 @@
\kvt@def@globalopts{Row}{
bg,hidden,below,above,around,style,uncounted,
expand,expandonce}
-\kvtSet{%
+\AtEndOfPackage{\kvtSet{%
rowbg=white..black!10,
headbg=black!14,
showhead=true,
@@ -144,7 +187,7 @@
headalign=,
shape=multipage,
width=\linewidth,
- caption={}, label={},
+ captionpos=b,
default=,
format=\kvtStrutted,
align=l,
@@ -160,7 +203,7 @@
ColGroup/align=c,
ColGroup/format=\kvtStrutted,
HeadCell/align=c,
-}
+}}
\newcommand\NewKeyValTable[3][]{%
\@ifnextchar[%]
{\kvt@NewKeyValTable{#1}{#2}{#3}}%
@@ -187,6 +230,7 @@
\kvt@parselayout{#4}{#2}%
}
\def\kvt@parsecolspec#1#2:#3:#4\@undefined{%
+ \kvt@checkcolspecempty{#4}{column}{#2}%
\def\kvt@@column{#2}%
\trim@spaces@in\kvt@@column
\expandafter\kvt@parsecolspec@i\expandafter{\kvt@@column}{#1}{#3}}
@@ -239,6 +283,7 @@
\kvt@dossvlist{#2}%
\expandafter\endgroup\kvt@@result}
\def\kvt@parsecolgroup#1#2:#3:#4\@undefined{%
+ \kvt@checkcolspecempty{#4}{column group}{#2}%
\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}
@@ -264,6 +309,11 @@
}%
}}%
\listcsadd{kvt@grpcolkeys@#1}{#2}}
+\newcommand\kvt@checkcolspecempty[3]{%
+ \ifstrempty{#1}{}{\ifstrequal{#1}{:}{}{\kvt@error
+ {Too many ':' in definition of #2 '#3'}
+ {Check whether there is an accidental ':' that should actually be
+ a ',' or ';'.}}}}
\newcommand\kvt@checkcolgroup[3]{%
\def\kvt@@psvdo##1{%
\ifinlistcs{##1}{kvt@allcolumns@#2}{}{\kvt@error
@@ -307,8 +357,7 @@
\begingroup
\def\kvt@@parseheadrows{}%
\def\do##1{%
- \def\kvt@@tmp{##1}\trim@post@space@in\kvt@@tmp%
- \expandafter\ifstrequal\expandafter{\kvt@@tmp}{::}
+ \ifstrequal{##1}{::}
{\appto\kvt@@parseheadrows{%
\cseappto{kvt@@custheadrows@#2}{%
\csexpandonce{kvt@headings@#2}}}}
@@ -329,7 +378,7 @@
\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
+ {\ifnum\kvt@@span>\z@ \expandafter\kvt@concludehdcolumn\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}%
@@ -337,23 +386,28 @@
specified in `\string\NewKeyValTable{#1}'}}{}}%
\kvt@@span\@ne \let\kvt@@lasthd\kvt@@curhd}%
}\dolistcsloop{kvt@displaycols@#1}%
- \kvt@concludecolumn
+ \kvt@concludehdcolumn
\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}}}
+\newcommand\kvt@rowcolorcmdornot[1]{\ifdefvoid{#1}{}{%
+ \expandafter\rowcolor\expandafter{#1}}}
+\newcount\kvt@@bodyrow
\newcount\kvt@@span
-\newcommand\kvt@concludecolumn{%
+\newcommand\kvt@concludehdcolumn{%
\kvt@@switchcol
\ifdefvoid\kvt@@lasthd{}{%
\eappto\kvt@@tmpgrphd{\noexpand\multicolumn
{\the\kvt@@span}
{\csexpandonce{kvt@@hdcell@align@\kvt@@lasthd}}
- {\csexpandonce{kvt@@hdcell@head@\kvt@@lasthd}}}%
+ {\noexpand\cmdkvt@Table@headformat
+ {\csexpandonce{kvt@@hdcell@head@\kvt@@lasthd}}}}%
\cslet{kvt@@hdcelldone@\kvt@@lasthd}{\@ne}}}
\def\kvt@parsehdcolspec#1#2:#3:#4\@undefined{%
+ \kvt@checkcolspecempty{#4}{header cell}{#2}%
\def\kvt@@colreg##1{%
\ifinlistcs{##1}{kvt@allcolumns@#1}{}
{\kvt@error{Column `##1', referenced in header cell `#2', not
@@ -383,102 +437,15 @@
\def\Row{\kvt@AddKeyValRow
{\noalign\bgroup}{\expandafter\egroup\kvt@@row}{#2}}%
\kvt@SetOptions{#2}{#1}%
+ \ifbool{kvt@TableEnv@resume*}{}
+ {\gdef\kvt@@lastenvopt{#1}}%
\csuse{kvt@StartTable@\cmdkvt@Table@shape}{#2}%
}{%
\csuse{kvt@EndTable@\cmdkvt@Table@shape}}
-\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}}
- \appto\kvt@@endhook{%
- \noalign{\csxdef{kvt@rowcount@#2}{\thekvtTypeRow}}}%
- \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.}}}%
- \ifdefvoid{\cmdkvt@Table@valign}{}{\metatblCanVAlign{#1}{}
- {\undef{\cmdkvt@Table@valign}%
- \kvt@warn{Table environment '#1' of table '#2'
- does not support the vertical alignment option (valign).
- Ignoring the option}}}%
- \ifdefvoid{\cmdkvt@Table@halign}{}{\metatblCanHAlign{#1}{}
- {\undef{\cmdkvt@Table@halign}%
- \kvt@warn{Table environment '#1' of table '#2'
- does not support the horizontal alignment option (halign).
- Ignoring the option}}}%
- \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
- \ifdefvoid{\cmdkvt@Table@halign}{}
- {\metatblIsTabu{#1}{}{[\cmdkvt@Table@halign]}}%
- \metatblHasWidth{#1}
- {\metatblIsTabu{#1}
- {to \expandonce\cmdkvt@Table@width}
- {{\expandonce\cmdkvt@Table@width}}}
- {}%
- \ifdefvoid{\cmdkvt@Table@valign}{}{[\cmdkvt@Table@valign]}%
- \ifdefvoid{\cmdkvt@Table@halign}{}
- {\metatblIsTabu{#1}{[\cmdkvt@Table@halign]}{}}%
- {\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}
+\newcommand\kvt@SetOptions[2]{\expandafter
+ \kvt@SetOptions@i\expandafter{\csname kvt@options@#1\endcsname}{#2}}
+\newcommand\kvt@SetOptions@i[2]{\expandafter
+ \kvt@setkeys\expandafter{#1,#2}{Table,TableEnv}}
\define@boolkey[metatbl]{EnvProp}{isLong}{\metatbl@boolprop{isLong}{#1}}
\define@boolkey[metatbl]{EnvProp}{isTabu}{\metatbl@boolprop{isTabu}{#1}}
\define@boolkey[metatbl]{EnvProp}{hasWidth}{%
@@ -493,6 +460,7 @@
\define@key[metatbl]{EnvProp}{atEnd}{\metatbl@setprop[1]{atEnd}{#1}}
\newrobustcmd\metatblRegisterEnv[2]{%
\edef\metatbl@@envname{#1}%
+ \csdef{metatbl@@registered@#1}{true}%
\setkeys[metatbl]{EnvProp}{#2}}
\newcommand\metatbl@setprop[3][0]{%
\expandafter\newcommand
@@ -500,6 +468,7 @@
\newcommand\metatbl@boolprop[2]{%
\providebool{metatbl@EnvProp@#1@\metatbl@@envname}%
\setbool{metatbl@EnvProp@#1@\metatbl@@envname}{#2}}
+\newcommand\metatblRegistered[1]{\ifcsdef{metatbl@@registered@#1}}
\newcommand\metatblIsLong[1]{\ifbool{metatbl@EnvProp@isLong@#1}}
\newcommand\metatblIsTabu[1]{\ifbool{metatbl@EnvProp@isTabu@#1}}
\newcommand\metatblHasWidth[1]{\ifbool{metatbl@EnvProp@hasWidth@#1}}
@@ -514,7 +483,7 @@
\def\do##1{%
\metatbl@csnamearg\RequirePackage{metatbl@EnvProp@pkg@##1}}%
\docsvlist{#1}}
-\newcommand\metatblAtEnd[2]{% #1=env-name, #2=code
+\newcommand\metatblAtEnd[2]{%
\csname metatbl@EnvProp@atEnd@#1\endcsname{#2}}
\newcommand\metatbl@csnamearg[2]{%
\expandafter\expandafter\expandafter#1%
@@ -563,6 +532,148 @@
\def\NC@rewrite@X{\def\metatbl@@branch{\@firstoftwo}\NC@find l}%
\@mkpream{#1}%
\expandafter\endgroup\metatbl@@branch}
+\newcommand\kvt@StartTabularlike[2]{%
+ \metatblAtEnd{#1}{\kvt@@endhook}%
+ \let\kvt@@endhook\@empty
+ \let\kvt@@prehook\@empty
+ \ifbool{kvt@Table@showrules}
+ {\def\kvt@@rule##1{\csuse{##1rule}}}
+ {\def\kvt@@rule##1{}}%
+ \appto\kvt@@prehook{\kvt@@rule{top}}%
+ \appto\kvt@@endhook{\kvt@@rule{bottom}}%
+ \appto\kvt@@endhook{\noalign{%
+ \csxdef{kvt@rowcount@#2}{\thekvtTypeRow}%
+ \csxdef{kvt@@rowcountlast}{\thekvtRow}}}%
+ \ifdefvoid\cmdkvt@TableEnv@caption
+ {\let\kvt@@caption@main\@empty
+ \let\kvt@@caption@alt\@empty}
+ {\metatblHasCaption{#1}
+ {\edef\kvt@@caption@main{%
+ \csexpandonce{kvt@caption@\cmdkvt@Table@captionpos}%
+ \ifcsvoid{cmdkvt@TableEnv@caption/lot}{}
+ {[{\csexpandonce{cmdkvt@TableEnv@caption/lot}}]}%
+ {\expandonce\cmdkvt@TableEnv@caption
+ \ifdefvoid\cmdkvt@TableEnv@label{}{%
+ \noexpand\label{\expandonce\cmdkvt@TableEnv@label}}}%
+ \noexpand\\}%
+ \ifcsvoid{cmdkvt@TableEnv@caption/alt}
+ {\def\kvt@@caption@alt{}}
+ {\edef\kvt@@caption@alt{%
+ \csexpandonce{kvt@caption@\cmdkvt@Table@captionpos}[]%
+ {\csexpandonce{cmdkvt@TableEnv@caption/alt}}%
+ \noexpand\\}}%
+ }{\kvt@error
+ {Caption lost, table backend '#1' does not support captions}
+ {Consider placing the KeyValTable environment inside a 'table'
+ environment and use the \string\caption\space macro inside.}}}%
+ \ifdefstring{\cmdkvt@Table@captionpos}{t}
+ {\let\kvt@@caption@headmain\kvt@@caption@main\let\kvt@@caption@footmain\@empty
+ \let\kvt@@caption@headalt\kvt@@caption@alt \let\kvt@@caption@footalt\@empty}
+ {\let\kvt@@caption@footmain\kvt@@caption@main\let\kvt@@caption@headmain\@empty
+ \let\kvt@@caption@footalt\kvt@@caption@alt \let\kvt@@caption@headalt\@empty}%
+ \ifbool{kvt@Table@showhead}
+ {\eappto\kvt@@prehook{\csuse{kvt@headings@#2}\noexpand\kvt@@rule{mid}}}
+ {}%
+ \ifdefvoid{\cmdkvt@Table@valign}{}{\metatblCanVAlign{#1}{}
+ {\undef{\cmdkvt@Table@valign}%
+ \kvt@warn{Table environment '#1' of table '#2'
+ does not support the vertical alignment option (valign).
+ Ignoring the option}}}%
+ \ifdefvoid{\cmdkvt@Table@halign}{}{\metatblCanHAlign{#1}{}
+ {\undef{\cmdkvt@Table@halign}%
+ \kvt@warn{Table environment '#1' of table '#2'
+ does not support the horizontal alignment option (halign).
+ Ignoring the option}}}%
+ \global\kvt@@bodyrow=0\relax
+ \ifbool{kvt@TableEnv@resume}
+ {\setcounter{kvtRow}{\csuse{kvt@@rowcountlast}}}
+ {\setcounter{kvtRow}{0}}%
+ \setcounter{kvtTypeRow}{\csuse{kvt@rowcount@#2}}%
+ \expandafter\kvt@setrowcolors\expandafter{\cmdkvt@Table@rowbg}%
+ \begingroup\edef\kvt@@do{\endgroup
+ \expandafter\noexpand\csname #1\endcsname
+ \ifdefvoid{\cmdkvt@Table@halign}{}
+ {\metatblIsTabu{#1}{}{[\cmdkvt@Table@halign]}}%
+ \metatblHasWidth{#1}
+ {\metatblIsTabu{#1}
+ {to \expandonce\cmdkvt@Table@width}
+ {{\expandonce\cmdkvt@Table@width}}}
+ {}%
+ \ifdefvoid{\cmdkvt@Table@valign}{}{[\cmdkvt@Table@valign]}%
+ \ifdefvoid{\cmdkvt@Table@halign}{}
+ {\metatblIsTabu{#1}{[\cmdkvt@Table@halign]}{}}%
+ {\csexpandonce{kvt@alignments@#2}}%
+ \expandonce\kvt@@caption@headmain
+ \expandonce\kvt@@prehook
+ \metatblIsLong{#1}{%
+ \noexpand\endfirsthead
+ \expandonce\kvt@@caption@headalt
+ \expandonce\kvt@@prehook
+ \noexpand\endhead}{}%
+ \expandonce\kvt@@caption@footmain
+ \metatblIsLong{#1}{%
+ \noexpand\endlastfoot
+ \expandonce\kvt@@caption@footalt
+ \noexpand\endfoot}{}%
+ }\kvt@@do}
+\newcommand\kvt@caption@t{\caption}
+\newcommand\kvt@caption@b{%
+ \noalign{\parbox{0pt}{\vskip\baselineskip}}%
+ \caption}
+\newcommand\kvt@setrowcolors[1]{%
+ \ifstrempty{#1}{}{\kvt@setrowcolors@i#1\@nil}}
+\def\kvt@setrowcolors@i#1..#2\@nil{%
+ \def\kvt@@bgcolor@odd{#1}%
+ \def\kvt@@bgcolor@even{#2}}
+\newcommand\kvt@userowcolors{\ifnumodd{\the\kvt@@bodyrow}
+ {\kvt@rowcolorcmdornot{\kvt@@bgcolor@odd}}
+ {\kvt@rowcolorcmdornot{\kvt@@bgcolor@even}}}
+\newcommand\kvt@RegisterBackend[1]{%
+ \ifinlist{#1}{\kvt@@tablebackends}
+ {\kvt@error{Backend '#1' already registered}
+ {Internal error. Check use of \string\kvt@RegisterBackend.}}
+ {\kvt@CheckMetatblEnv{#1}%
+ \listadd{\kvt@@tablebackends}{#1}%
+ \kvt@DefineStdTabEnv{#1}{#1}}}
+\newcommand\kvt@RegisterShape[3]{%
+ \ifinlist{#1}{\kvt@@tableshapes}
+ {\kvt@error{Shape '#1' already registered}
+ {Internal error. Check use of \string\kvt@RegisterShape.}}
+ {\kvt@CheckMetatblEnv{#2}\kvt@CheckMetatblEnv{#3}%
+ \listadd{\kvt@@tableshapes}{#1}%
+ \ifstrequal{#2}{#3}
+ {\kvt@DefineStdTabEnv{#1}{#2}}
+ {\kvt@DefineDualTabEnv{#1}{#2}{#3}}}}
+\newcommand\kvt@CheckMetatblEnv[1]{\metatblRegistered{#1}{}
+ {\kvt@error{Environment '#1' not supported by keyvaltable}
+ {Check \string\metatblRegisterEnv\space for how to make it
+ supported.}}}
+\newcommand\kvt@@tablebackends{}
+\newcommand\kvt@@tableshapes{}
+\newcommand\kvt@DefineStdTabEnv[2]{%
+ \csdef{kvt@StartTable@#1}##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@RegisterBackend{tabular}
+\kvt@RegisterBackend{longtable}
+\kvt@RegisterBackend{tabularx}
+\kvt@RegisterBackend{xltabular}
+\kvt@RegisterBackend{tabu}
+\kvt@RegisterBackend{longtabu}
\newcommand\kvt@AddKeyValRow[3]{%
#1%
\@ifnextchar[%]
@@ -579,10 +690,12 @@
\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}}}%
+ \appto\kvt@@row{\noalign{\global\advance\kvt@@bodyrow\@ne}}%
\ifbool{kvt@Row@uncounted}{}{%
\appto\kvt@@row{\noalign{\kvt@stepcounters}}}%
+ \ifdefvoid\cmdkvt@Row@bg
+ {\appto\kvt@@row{\kvt@userowcolors}}
+ {\eappto\kvt@@row{\noexpand\rowcolor{\expandonce\cmdkvt@Row@bg}}}%
\ifdefvoid\cmdkvt@Row@align
{\let\kvt@@rowmkmulticolumn\@empty}
{\edef\kvt@@rowmkmulticolumn{%
@@ -668,24 +781,32 @@
\kvt@@span=#2\relax \advance\kvt@@span\m@ne
\def\kvt@@cell{#3}%
\def\kvt@@mkmulticolumn{\multicolumn{#2}{#1}}}
-\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\kvtNewRowStyle{\kvt@NewStyle{row}{\kvtRenewRowStyle}}
+\newcommand\kvtRenewRowStyle{\kvt@RenewStyle{row}{\kvtNewRowStyle}}
+\newcommand\kvtNewTableStyle{\kvt@NewStyle{table}{\kvtRenewTableStyle}}
+\newcommand\kvtRenewTableStyle{\kvt@RenewStyle{table}{\kvtNewTableStyle}}
+\newcommand\kvt@NewStyle[4]{%
+ \ifcsundef{kvt@@#1style@#3}
+ {\csdef{kvt@@#1style@#3}{#4}}
+ {\kvt@error{The #1 style '#3' is already defined}{Use
+ \string#2\space to change an existing style.}}}
+\newcommand\kvt@RenewStyle[4]{%
+ \ifcsundef{kvt@@#1style@#3}
+ {\kvt@error{A #1 style '#3' is not defined}
+ {Use \string#2\space to define a new #1 style.}}
+ {\csdef{kvt@@#1style@#3}{#4}}}
\newcommand\kvt@UseRowStyles[1]{%
- \kvt@xkv@disablepreset[kvt]{Row}{%
- \forcsvlist\kvt@UseRowStyle{#1}}}
+ \kvt@UseStyles{row}{Row}{\kvt@NewRowStyle}{#1}}
+\newcommand\kvt@UseTableStyles[1]{%
+ \kvt@UseStyles{table}{Table}{\kvt@NewTableStyle}{#1}}
+\newcommand\kvt@UseStyle[4]{%
+ \ifcsundef{kvt@@#1style@#4}
+ {\kvt@error{A #1 style '#4' is not defined}
+ {Use \string#3\space to define a new #1 style.}}
+ {\kvt@setcskeys{kvt@@#1style@#4}{#2}}}
+\newcommand\kvt@UseStyles[4]{%
+ \kvt@xkv@disablepreset[kvt]{#2}{%
+ \forcsvlist{\kvt@UseStyle{#1}{#2}{#3}}{#4}}}
\newcommand\kvt@xkv@disablepreset[3][KV]{%
\ifnumgreater{\XKV@depth}{1}
{#3}
@@ -795,12 +916,12 @@
\ifdimcomp{\kvt@@pkg@compat pt}{#1}{#2pt}}
\kvt@IfVersion{<}{2.0}{%
\metatblRequire{tabu,longtabu}
- \kvt@DefineStdTabEnv[onepage]{tabu}
- \kvt@DefineStdTabEnv[multipage]{longtabu}
+ \kvt@RegisterShape{onepage}{tabu}{tabu}
+ \kvt@RegisterShape{multipage}{longtabu}{longtabu}
}{%
\metatblRequire{tabularx,longtable,xltabular}
- \kvt@DefineDualTabEnv{onepage}{tabular}{tabularx}
- \kvt@DefineDualTabEnv{multipage}{longtable}{xltabular}
+ \kvt@RegisterShape{onepage}{tabular}{tabularx}
+ \kvt@RegisterShape{multipage}{longtable}{xltabular}
}
\kvt@IfVersion{<}{2.0}{%
\renewcommand\kvt@parselayout[2]{\kvt@parseheadrows{#2}{#1}}%