diff options
author | Karl Berry <karl@freefriends.org> | 2020-04-11 22:50:13 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2020-04-11 22:50:13 +0000 |
commit | c1aac14d5d1d32826a5e68a5dfc59a05b4f1e989 (patch) | |
tree | 392e9406033af8730fff8eb6c6496edd7b4728c6 /Master/texmf-dist/tex | |
parent | 3243e3fe2fabf32acfb3a87d9167523ba1b4781c (diff) |
keyvaltable (5apr20)
git-svn-id: svn://tug.org/texlive/trunk@54677 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex')
-rw-r--r-- | Master/texmf-dist/tex/latex/keyvaltable/keyvaltable.sty | 387 |
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}}% |