% Kale Ewasiuk (kalekje@gmail.com) % 2022-02-27 % Copyright (C) 2021-2022 Kale Ewasiuk % % Permission is hereby granted, free of charge, to any person obtaining a copy % of this software and associated documentation files (the "Software"), to deal % in the Software without restriction, including without limitation the rights % to use, copy, modify, merge, publish, distribute, sublicense, and/or sell % copies of the Software, and to permit persons to whom the Software is % furnished to do so, subject to the following conditions: % % The above copyright notice and this permission notice shall be included in % all copies or substantial portions of the Software. % % THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF % ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED % TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A % PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT % SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR % ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN % ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, % OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE % OR OTHER DEALINGS IN THE SOFTWARE. \NeedsTeXFormat{LaTeX2e} \ProvidesPackage{lutabulartools}[2022-02-27] \RequirePackage{booktabs} \RequirePackage{multirow} \RequirePackage{makecell} \RequirePackage{xparse} \RequirePackage{array} \RequirePackage{xcolor} \RequirePackage{colortbl} \RequirePackage{luacode} \RequirePackage[pl,extras]{penlight} % NEEDED \luadirect{lutabt = require('lutabulartools')} \newcolumntype{\ltt@ltrim}{@{}} \newcolumntype{\ltt@rtrim}{@{}} \DeclareOption{notrim}{ \newcolumntype{\ltt@ltrim}{} \newcolumntype{\ltt@rtrim}{} } %% adapted from % https://tex.stackexchange.com/questions/182953/add-midrule-every-5-lines-automatically %% https://tex.stackexchange.com/questions/145084/what-is-the-function-of-noalign \def\midruleXstep{5} \def\midruleXrule{\gmidrule} \newcounter{midruleX} \newcommand*{\midruleX}{% \aftergroup\aftergroup\aftergroup\midruleXaux } \newif\ifmidruleX \newcommand*{\midruleXaux}{% \noalign{% \stepcounter{midruleX}% \ifnum\value{midruleX}=\midruleXstep % \global\midruleXtrue \resetmidruleX% \else \global\midruleXfalse \fi } \ifmidruleX\midruleXrule\fi } \newcommand*{\resetmidruleX}{\setcounter{midruleX}{0}} %%% todo maybe put noalign in here \resetmidruleX %%%% %%% gray midrule and gray cmidrule \aboverulesep=0.0ex \belowrulesep=0.5ex \providecommand{\gmidrule}{\arrayrulecolor{lightgray}\specialrule{\lightrulewidth}{0.5\aboverulesep}{0.5\belowrulesep}\arrayrulecolor{black}} \cmidrulewidth=\lightrulewidth %%% use gcmidrule for a gray "c" midrule % Copy \cmidrule from % http://mirrors.ctan.org/macros/latex/contrib/booktabs/booktabs.dtx % and modify it for insertion of \arrayrulecolor{lightgray} at the start, % and \arrayrulecolor{black} at the end \def\oldgcmidrule{\arrayrulecolor{lightgray}% Switch colour to lightgray \noalign{\ifnum0=`}\fi \@ifnextchar[{\@gcmidrule}{\@gcmidrule[\cmidrulewidth]}} \def\@gcmidrule[#1]{\@ifnextchar({\@@gcmidrule[#1]}{\@@gcmidrule[#1]()}} \def\@@gcmidrule[#1](#2)#3{\@@@gcmidrule[#3]{#1}{#2}} \def\@@@gcmidrule[#1-#2]#3#4{\global\@cmidla#1\relax \global\advance\@cmidla\m@ne \ifnum\@cmidla>0\global\let\@gtempa\@cmidrulea\else \global\let\@gtempa\@cmidruleb\fi \global\@cmidlb#2\relax \global\advance\@cmidlb-\@cmidla \global\@thisrulewidth=#3 \@setrulekerning{#4} \ifnum\@lastruleclass=\z@\vskip 0.5\aboverulesep\fi \ifnum0=`{\fi}\@gtempa \noalign{\ifnum0=`}\fi\futurenonspacelet\@tempa\@xgcmidrule} \def\@xgcmidrule{% \ifx\@tempa\gcmidrule \vskip-\@thisrulewidth \global\@lastruleclass=\@ne \else \ifx\@tempa\morecmidrules \vskip \cmidrulesep \global\@lastruleclass=\@ne\else \vskip 0.5\belowrulesep \global\@lastruleclass=\z@ \fi\fi \ifnum0=`{\fi} \arrayrulecolor{black}}% Switch colour back to black %%% \let\oldcmidrule\cmidrule % improve cmidrule. Can reference column number from back with a +, eg, {3+-2+} means third to second last \RenewExpandableDocumentCommand{\cmidrule}{ O{} D(){} m }{% \luadirect{lutabt.make1cmidrule( \luastringN{#1}, \luastring{#2}, \luastring{#3}, 'oldcmidrule') }% } \NewExpandableDocumentCommand{\cmidrules}{ O{} D(){} m }{% supports comma in {} \luadirect{lutabt.makecmidrules( \luastringN{#1}, \luastring{#2}, \luastring{#3}, 'cmidrule') }% } \NewExpandableDocumentCommand{\gcmidrule}{ O{} D(){} m }{% \luadirect{lutabt.make1cmidrule( \luastringN{#1}, \luastring{#2}, \luastring{#3}, 'oldgcmidrule') }% } \NewExpandableDocumentCommand{\gcmidrules}{ O{} D(){} m }{% supports comma in {}, rl can be passed as well \luadirect{lutabt.makecmidrules( \luastringN{#1}, \luastring{#2}, \luastring{#3}, 'gcmidrule') }% } \let\oldtabular\tabular \RenewExpandableDocumentCommand{\tabular}{ O{c} m }{% \luadirect{lutabt.set_col_spec(\luastringN{#2})}% \oldtabular[#1]{\ltt@ltrim#2\ltt@rtrim}% } \expandafter\let\expandafter\oldtabulars\csname tabular*\endcsname \expandafter\let\expandafter\endoldtabulars\csname endtabular*\endcsname \RenewDocumentEnvironment{tabular*}{ m O{c} m }{% \luadirect{lutabt.set_col_spec(\luastringN{#3})}% \begin{oldtabulars}{#1}[#2]{\ltt@ltrim#3\ltt@rtrim}% }{% \end{oldtabulars}% } %%% NOTE tabularx uses tabular*, NO NEED TO CHANGE TABULARX! %s0,spec,mcspec,pre,content % Magic Cell \NewExpandableDocumentCommand{\MC}{ s O{} D(){} D<>{} m }{% % Magic cell *wraps with {} but automatically checks for SI column, % [column spec] (mult-column spec override) {cell content} \luadirect{lutabt.MagicCell( \luastring{#1}, \luastring{#2}, \luastringN{#3}, \luastringN{#4}, \luastringN{#5} )}} \NewDocumentCommand{\setMCrepl}{m m}{\luadirect{ lutabt.col_replaces.#1 = '#2' }} \NewDocumentCommand{\setMChordef}{ m m}{\luadirect{ lutabt.col_hor_repl.#1 = '#2' }} \NewDocumentCommand{\setMCverdef}{ m m}{\luadirect{ lutabt.col_ver_repl.#1 = '#2' }} \NewDocumentCommand{\addMCsicol}{ m }{\luadirect{ lutabt.SI_cols[\string##lutabt.SI_cols+1] = '#1' }} \ProcessOptions %%% OLD STUFF, %% before I had a fall-back for counting columns (just calculate current column on last column once) %% and kept track of row numbers. I felt that this wasn't needed, so I've removed. %\newcommand{\TabColNum}{\luadirect{tex.print(lutabt.get_TabColNum())}} % prints the current column number of tabular %\newcommand{\NumTabCols}{\luadirect{tex.print(lutabt.NumTabCols)}} % prints the total num columns of tabular %\newcounter{RowNumCnt} %\setcounter{RowNumCnt}{1} % \setcounter{RowNumCnt}{1}% % \luadirect{lutabt.NumTabColsMX = 0}% fall back if calc doesnt work for some reason % \setcounter{RowNumCnt}{1}% % \luadirect{lutabt.NumTabColsMX = 0}% fall back if calc doesnt work for some reason %\DeclareOption{notrimx}{ % \global\newcolumntype{\ltt@ltrim}{!{\stepcounter{RowNumCnt}}} %% \global\newcolumntype{\ltt@rtrim}{!{\luadirect{lutabt.get_TabColNum()}}} %} %\DeclareOption{trimx}{ % \newcolumntype{\ltt@ltrim}{@{\stepcounter{RowNumCnt}}} %% \newcolumntype{\ltt@rtrim}{@{\luadirect{lutabt.get_TabColNum()}}} %}