% -*- coding: utf-8 -*- % !TEX program = lualatex \documentclass[oneside]{book} \usepackage[a4paper,margin=2.5cm]{geometry} \usepackage{codehigh} % https://ctan.org/pkg/codehigh \usepackage{tabularray} \usepackage{array,multirow,amsmath} \usepackage{chemmacros,environ} \usepackage[firstpage=true]{background} \backgroundsetup{contents={}} \UseTblrLibrary{booktabs,diagbox,siunitx,varwidth} \usepackage{hyperref} \hypersetup{ colorlinks=true, urlcolor=blue3, linkcolor=blue3, } \usepackage{tcolorbox} \tcbset{sharp corners, boxrule=0.5pt, colback=red9} \usepackage{float} %\usepackage{enumerate} \setcounter{tocdepth}{1} \newcommand*{\K}[1]{\texttt{#1}} \newcommand*{\V}[1]{\texttt{#1}} \newcommand*{\None}{$\times$} \NewTblrEnviron{newtblr} \SetTblrOuter[newtblr]{long} \SetTblrInner[newtblr]{ hlines = {white}, column{1,2} = {co=1}, colsep = 5pt, row{odd} = {brown8}, row{even} = {gray8}, row{1} = {fg=white, bg=purple2, font=\bfseries\sffamily}, } \NewTblrEnviron{spectblr} \SetTblrOuter[spectblr]{long} \SetTblrInner[spectblr]{ hlines = {white}, column{2} = {co=1}, colsep = 5pt, row{odd} = {brown8}, row{even} = {gray8}, row{1} = {fg=white, bg=purple2, font=\bfseries\sffamily}, rowhead = 1, } \newcommand{\mywarning}[1]{% \begin{tcolorbox} The interfaces in this #1 should be seen as \textcolor{red3}{\bfseries experimental} and are likely to change in future releases, if necessary. Don’t use them in important documents. \end{tcolorbox} } \renewcommand*{\thefootnote}{*} \newcommand*{\myversion}{2021N} \newcommand*{\mylpad}[1]{\ifnum#1<10 0\the#1\else\the#1\fi} \colorlet{highback}{azure9} \CodeHigh{language=latex/table,style/main=highback,style/code=highback} \NewCodeHighEnv{code}{style/main=gray9,style/code=gray9} \NewCodeHighEnv{demo}{style/main=gray9,style/code=gray9,demo} %\CodeHigh{lite} \begin{document} \savegeometry{standard} \newgeometry{left=0pt,right=0pt} \begin{titlepage} \backgroundsetup{ scale = 1, angle = 0, opacity = 1, %color = black, contents = { \begin{tblr}{ width = \paperwidth, columns = {1}, rows= {4em}, cell{odd}{odd} = {gray9}, cell{even}{even} = {gray9}, } & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ & & & & & & & & & & & & & & \\ \end{tblr} } } \noindent \begin{tblr}{ colspec = {rX}, colsep = 8mm, hlines = {2pt, white}, row{odd} = {azure8}, row{even} = {gray8}, row{1} = {6em,azure2,fg=white,font=\LARGE\bfseries\sffamily}, row{2-Z} = {3em,font=\Large}, } Tabularray & Typeset Tabulars and Arrays with \LaTeX3 \\ Author & Jianrui Lyu (tolvjr@163.com) \\ Version & \myversion\ (\the\year-\mylpad\month-\mylpad\day) \\ Code & \url{https://github.com/lvjr/tabularray} \\ Code & \url{https://bitbucket.org/lvjr/tabularray} \\ Forum & \url{https://github.com/lvjr/tabularray/discussions} \\ Forum & \url{https://tex.stackexchange.com/questions/tagged/tabularray} \\ Issue & \url{https://github.com/lvjr/tabularray/issues} \\ \end{tblr} \begin{codehigh}[boxsep=4mm] \begin{tblr}{ colspec = {rX}, colsep = 8mm, hlines = {2pt, white}, row{odd} = {azure8}, row{even} = {gray8}, row{1} = {6em,azure2,fg=white,font=\LARGE\bfseries\sffamily}, row{2-Z} = {3em,font=\Large}, } Tabularray & Typeset Tabulars and Arrays with \LaTeX3 \\ Author & Jianrui Lyu (tolvjr@163.com) \\ Version & \myversion\ (\the\year-\mylpad\month-\mylpad\day) \\ Code & \url{https://github.com/lvjr/tabularray} \\ Code & \url{https://bitbucket.org/lvjr/tabularray} \\ Forum & \url{https://github.com/lvjr/tabularray/discussions} \\ Forum & \url{https://tex.stackexchange.com/questions/tagged/tabularray} \\ Issue & \url{https://github.com/lvjr/tabularray/issues} \\ \end{tblr} \end{codehigh} \end{titlepage} \loadgeometry{standard} \tableofcontents \chapter{Overview of Features} \section{Vertical Space} After loading \verb!tabularray! package in the preamble, we can use \verb!tblr! environments to typeset tabulars and arrays. The name \verb!tblr! is short for \verb!tabularray! or \verb!top-bottom-left-right!. The following is our first example: \begin{demo} \begin{tabular}{lccr} \hline Alpha & Beta & Gamma & Delta \\ \hline Epsilon & Zeta & Eta & Theta \\ \hline Iota & Kappa & Lambda & Mu \\ \hline \end{tabular} \end{demo} \begin{demohigh} \begin{tblr}{lccr} \hline Alpha & Beta & Gamma & Delta \\ \hline Epsilon & Zeta & Eta & Theta \\ \hline Iota & Kappa & Lambda & Mu \\ \hline \end{tblr} \end{demohigh} You may notice that there is extra space above and below the table rows with \verb!tblr! envirenment. This space makes the table look better. If you don't like it, you could use \verb!\SetTblrInner! command: \begin{demohigh} \SetTblrInner{rowsep=0pt} \begin{tblr}{lccr} \hline Alpha & Beta & Gamma & Delta \\ \hline Epsilon & Zeta & Eta & Theta \\ \hline Iota & Kappa & Lambda & Mu \\ \hline \end{tblr} \end{demohigh} But in many cases, this rowsep is useful: \begin{demo} $\begin{array}{rrr} \hline \dfrac{2}{3} & \dfrac{2}{3} & \dfrac{1}{3} \\ \dfrac{2}{3} & -\dfrac{1}{3} & -\dfrac{2}{3} \\ \dfrac{1}{3} & -\dfrac{2}{3} & \dfrac{2}{3} \\ \hline \end{array}$ \end{demo} \begin{demohigh} $\begin{tblr}{rrr} \hline \dfrac{2}{3} & \dfrac{2}{3} & \dfrac{1}{3} \\ \dfrac{2}{3} & -\dfrac{1}{3} & -\dfrac{2}{3} \\ \dfrac{1}{3} & -\dfrac{2}{3} & \dfrac{2}{3} \\ \hline \end{tblr}$ \end{demohigh} Note that you can use \verb!tblr! in both text and math modes. \section{Multiline Cells} It's quite easy to write multiline cells without fixing the column width in \verb!tblr! environments: just enclose the cell text with braces and use \verb!\\! to break lines: \begin{demohigh} \begin{tblr}{|l|c|r|} \hline Left & {Center \\ Cent \\ C} & {Right \\ R} \\ \hline {L \\ Left} & {C \\ Cent \\ Center} & R \\ \hline \end{tblr} \end{demohigh} \section{Cell Alignment} From time to time, you may want to specify the horizontal and vertical alignment of cells at the same time. \verb!Tabularray! package provides a \verb!Q! column for this (In fact, \verb!Q! column is the only primitive column, other columns are defined as \verb!Q! columns with some options): \begin{demohigh} \begin{tblr}{|Q[l,t]|Q[c,m]|Q[r,b]|} \hline {Top Baseline \\ Left Left} & Middle Center & {Right Right \\ Bottom Baseline} \\ \hline \end{tblr} \end{demohigh} Note that you can use more meaningful \verb!t! instead of \verb!p! for top baseline alignment. For some users who are familiar with word processors, these \verb!t! and \verb!b! columns are counter-intuitive. In \verb!tabularray! package, there are another two column types \verb!h! and \verb!f!, which will align cell text at the head and the foot, respectively: \begin{demohigh} \begin{tblr}{Q[h,4em]Q[t,4em]Q[m,4em]Q[b,4em]Q[f,4em]} \hline {row\\head} & {top\\line} & {middle} & {line\\bottom} & {row\\foot} \\ \hline {row\\head} & {top\\line} & {11\\22\\mid\\44\\55} & {line\\bottom} & {row\\foot} \\ \hline \end{tblr} \end{demohigh} \section{Multirow Cells} The above \verb!h! and \verb!f! alignments are necessary when we write multirow cells with \verb!\SetCell! command in \verb!tabularray!. \begin{demo} \begin{tabular}{|l|l|l|l|} \hline \multirow[t]{4}{1.5cm}{Multirow Cell One} & Alpha & \multirow[b]{4}{1.5cm}{Multirow Cell Two} & Alpha \\ & Beta & & Beta \\ & Gamma & & Gamma \\ & Delta & & Delta \\ \hline \end{tabular} \end{demo} \begin{demohigh} \begin{tblr}{|l|l|l|l|} \hline \SetCell[r=4]{h,1.5cm} Multirow Cell One & Alpha & \SetCell[r=4]{f,1.5cm} Multirow Cell Two & Alpha \\ & Beta & & Beta \\ & Gamma & & Gamma \\ & Delta & & Delta \\ \hline \end{tblr} \end{demohigh} Note that you don't need to load \verb!multirow! package first, since \verb!tabularray! doesn't depend on it. Furthermore, \verb!tabularray! will always typeset decent multirow cells. First, it will set correct vertical middle alignment, even though some rows have large height: \begin{demo} \begin{tabular}{|l|m{4em}|} \hline \multirow[c]{4}{1.5cm}{Multirow} & Alpha \\ & Beta \\ & Gamma \\ & Delta Delta Delta \\ \hline \end{tabular} \end{demo} \begin{demohigh} \begin{tblr}{|l|m{4em}|} \hline \SetCell[r=4]{m,1.5cm} Multirow & Alpha \\ & Beta \\ & Gamma \\ & Delta Delta Delta \\ \hline \end{tblr} \end{demohigh} Second, it will enlarge row heights if the multirow cells have large height, therefore it always avoids vertical overflow: \begin{demo} \begin{tabular}{|l|m{4em}|} \hline \multirow[c]{2}{1cm}{Line \\ Line \\ Line \\ Line} & Alpha \\ \cline{2-2} & Beta \\ \hline \end{tabular} \end{demo} \begin{demohigh} \begin{tblr}{|l|m{4em}|} \hline \SetCell[r=2]{m,1cm} {Line \\ Line \\ Line \\ Line} & Alpha \\ \cline{2} & Beta \\ \hline \end{tblr} \end{demohigh} \section{Multi Rows and Columns} It was a hard job to typeset cells with multiple rows and multiple columns. For example: \begin{demo} \begin{tabular}{|c|c|c|c|c|} \hline \multirow{2}{*}{2 Rows} & \multicolumn{2}{c|}{2 Columns} & \multicolumn{2}{c|}{\multirow{2}{*}{2 Rows 2 Columns}} \\ \cline{2-3}   & 2-2 & 2-3 & \multicolumn{2}{c|}{} \\ \hline 3-1 & 3-2 & 3-3 & 3-4 & 3-5 \\ \hline \end{tabular} \end{demo} With \verb!tabularray! package, you can set spanned cells with \verb!\SetCell! command: within the optional argument of \verb!\SetCell! command, option \verb!r! is for rowspan number, and \verb!c! for colspan number; within the mandatory argument of it, horizontal and vertical alignment options are accepted. Therefore it's much simpler to typeset spanned cells: \begin{demohigh} \begin{tblr}{|c|c|c|c|c|} \hline \SetCell[r=2]{c} 2 Rows & \SetCell[c=2]{c} 2 Columns & & \SetCell[r=2,c=2]{c} 2 Rows 2 Columns & \\ \hline   & 2-2 & 2-3 & & \\ \hline 3-1 & 3-2 & 3-3 & 3-4 & 3-5 \\ \hline \end{tblr} \end{demohigh} Using \verb!\multicolumn! command, the omitted cells \textcolor{red3}{must} be removed. On the contrary, using \verb!\multirow! command, the omitted cells \textcolor{red3}{must not} be removed. \verb!\SetCell! command behaves the same as \verb!\multirow! command in this aspect. With \verb!tblr! environment, any \verb!\hline! segments inside a spanned cell will be ignored, therefore we're free to use \verb!\hline! in the above example. Also, any omitted cell will definitely be ignored when typesetting, no matter it's empty or not. With this feature, we could put row and column numbers into the omitted cells, which will help us to locate cells when the tables are rather complex: \begin{demohigh} \begin{tblr}{|ll|c|rr|} \hline \SetCell[r=3,c=2]{h} r=3 c=2 & 1-2 & \SetCell[r=2,c=3]{r} r=2 c=3 & 1-4 & 1-5 \\ 2-1 & 2-2 & 2-3 & 2-4 & 2-5 \\ \hline 3-1 & 3-2 & MIDDLE & \SetCell[r=3,c=2]{f} r=3 c=2 & 3-5 \\ \hline \SetCell[r=2,c=3]{l} r=2 c=3 & 4-2 & 4-3 & 4-4 & 4-5 \\ 5-1 & 5-2 & 5-3 & 5-4 & 5-5 \\ \hline \end{tblr} \end{demohigh} \section{Column Types} \verb!Tabularray! package supports all normal column types, as well as the extendable \verb!X! column type, which first occurred in \verb!tabularx! package and was largely improved by \verb!tabu! package: \begin{demohigh} \begin{tblr}{|X[2,l]|X[3,l]|X[1,r]|X[r]|} \hline Alpha & Beta & Gamma & Delta \\ \hline \end{tblr} \end{demohigh} Also, \verb!X! columns with negative coefficients are possible: \begin{demohigh} \begin{tblr}{|X[2,l]|X[3,l]|X[-1,r]|X[r]|} \hline Alpha & Beta & Gamma & Delta \\ \hline \end{tblr} \end{demohigh} We need the width to typeset a table with \verb!X! columns. If unset, the default is \verb!\linewidth!. To change the width, we have to first put all column specifications into \verb!colspec={...}!: \begin{demohigh} \begin{tblr}{width=0.8\linewidth,colspec={|X[2,l]|X[3,l]|X[-1,r]|X[r]|}} \hline Alpha & Beta & Gamma & Delta \\ \hline \end{tblr} \end{demohigh} You can define new column types with \verb!\NewColumnType! command. For example, in \verb!tabularray! package, \verb!b! and \verb!X! columns are defined as special \verb!Q! columns: \begin{codehigh} \NewColumnType{b}[1]{Q[b,wd=#1]} \NewColumnType{X}[1][]{Q[co=1,#1]} \end{codehigh} \section{Row Types} Now that we have column types and \verb!colspec! option, you may ask for row types and \verb!rowspec! option. Yes, they are here: \begin{demohigh} \begin{tblr}{colspec={Q[l]Q[c]Q[r]},rowspec={|Q[t]|Q[m]|Q[b]|}} {Alpha \\ Alpha} & Beta & Gamma \\ Delta & Epsilon & {Zeta \\ Zeta} \\ Eta & {Theta \\ Theta} & Iota \\ \end{tblr} \end{demohigh} Same as column types, \verb!Q! is the only primitive row type, and other row types are defined as \verb!Q! types with different options. It's better to specify horizontal alignment in \verb!colspec!, and vertical alignment in \verb!rowspec!, respectively. Inside \verb!rowspec!, \verb!|! is the hline type. Therefore we need not to write \verb!\hline! commnad, which makes table code cleaner. \section{Hlines and Vlines} Hlines and vlines have been improved too. You can specify the widths and styles of them: \begin{demohigh} \begin{tblr}{|l|[dotted]|[2pt]c|r|[solid]|[dashed]|} \hline One & Two & Three \\ \hline\hline[dotted]\hline Four & Five & Six \\ \hline[dashed]\hline[1pt] Seven & Eight & Nine \\ \hline \end{tblr} \end{demohigh} \section{Colorful Tables} To add colors to your tables, you need to load \verb!xcolor! package first. \verb!Tabularray! package will also load \verb!ninecolors! package for proper color contrast. First you can specify background option for \verb!Q! rows/columns inside \verb!rowspec!/\verb!colspec!: \begin{demohigh} \begin{tblr}{colspec={lcr},rowspec={|Q[cyan7]|Q[azure7]|Q[blue7]|}} Alpha & Beta & Gamma \\ Epsilon & Zeta & Eta \\ Iota & Kappa & Lambda \\ \end{tblr} \end{demohigh} \begin{demohigh} \begin{tblr}{colspec={Q[l,brown7]Q[c,yellow7]Q[r,olive7]},rowspec={|Q|Q|Q|}} Alpha & Beta & Gamma \\ Epsilon & Zeta & Eta \\ Iota & Kappa & Lambda \\ \end{tblr} \end{demohigh} Also you can use \verb!\SetRow! or \verb!\SetColumn! command to specify row or column colors: \begin{demohigh} \begin{tblr}{colspec={lcr},rowspec={|Q|Q|Q|}} \SetRow{cyan7} Alpha & Beta & Gamma \\ \SetRow{azure7} Epsilon & Zeta & Eta \\ \SetRow{blue7} Iota & Kappa & Lambda \\ \end{tblr} \end{demohigh} \begin{demohigh} \begin{tblr}{colspec={lcr},rowspec={|Q|Q|Q|}} \SetColumn{brown7} Alpha & \SetColumn{yellow7} Beta & \SetColumn{olive7} Gamma \\ Epsilon & Zeta & Eta \\ Iota & Kappa & Lambda \\ \end{tblr} \end{demohigh} Hlines and vlines can also have colors: \begin{demohigh} \begin{tblr}{colspec={lcr},rowspec={|[2pt,green7]Q|[teal7]Q|[green7]Q|[3pt,teal7]}} Alpha & Beta & Gamma \\ Epsilon & Zeta & Eta \\ Iota & Kappa & Lambda \\ \end{tblr} \end{demohigh} \begin{demohigh} \begin{tblr}{colspec={|[2pt,violet5]l|[2pt,magenta5]c|[2pt,purple5]r|[2pt,red5]}} Alpha & Beta & Gamma \\ Epsilon & Zeta & Eta \\ Iota & Kappa & Lambda \\ \end{tblr} \end{demohigh} \chapter{Basic Interfaces} \section{Old and New Interfaces} With \verb!tabularray! package, you can change the styles of tables via old interfaces or new interfaces. The old interfaces consist of some table commands inside the table contents. Same as \verb!tabular! and \verb!array! environments, all table commands \textcolor{red3}{must} be put at the beginning of the cell text. Also, new table commands \textcolor{red3}{must} be defined with \verb!\NewTableCommand!. The new interfaces consist of some options inside the mandatory argument, hence totally separating the styles and the contents of tables. \begin{newtblr}[ caption = {Old Interfaces and New Interfaces}, label = {key:interface}, ]{verb} Old Interfaces & New Interfaces \\ \verb!\SetHlines! & \K{hlines} \\ \verb!\SetHline!, \verb!\hline!, \verb!\cline! & \K{hline}, \K{rowspec} \\ \verb!\SetVlines! & \K{vlines} \\ \verb!\SetVline!, \verb!\vline!, \verb!\rline! & \K{vline}, \K{colspec} \\ \verb!\SetCells! & \K{cells} \\ \verb!\SetCell! & \K{cell} \\ \verb!\SetRows! & \K{rows} \\ \verb!\SetRow! & \K{row}, \K{rowspec} \\ \verb!\SetColumns! & \K{columns} \\ \verb!\SetColumn! & \K{column}, \K{colspec} \\ \end{newtblr} \section{Hlines and Vlines} All available keys for hlines and vlines are described in Table \ref{key:hline} and Table \ref{key:vline}. \begin{spectblr}[ caption = {Keys for Hlines}, label = {key:hline}, remark{Note} = {In most cases, you can omit the underlined key names and write only their values.} ]{} Key & Description and Values & Initial Value \\ \underline{\K{dash}} & dash style: \V{solid}, \V{dashed} or \V{dotted} & \V{solid} \\ \K{text} & replace hline with text (like \V{!} specifier in \K{rowspec}) & \None \\ \underline{\K{wd}} & rule width dimension & \V{0.4pt} \\ \underline{\K{fg}} & rule color name & \None \\ \K{leftpos} & crossing or trimming position at the left side & \V{1} \\ \K{rightpos} & crossing or trimming position at the right side & \V{1} \\ \K{abovespace} & set \V{belowsep} of previous row (see Table \ref{key:row}) & \V{2pt} \\ \K{belowspace} & set \V{abovesep} of current row (see Table \ref{key:row}) & \V{2pt} \\ \K{abovespace+} & increase \V{belowsep} of previous row & \None \\ \K{belowspace+} & increase \V{abovesep} of current row & \None \\ \end{spectblr} \vspace{-2em} \begin{spectblr}[ caption = {Keys for Vlines}, label = {key:vline}, remark{Note} = {In most cases, you can omit the underlined key names and write only their values.} ]{} Key & Description and Values & Initial Value \\ \underline{\K{dash}} & dash style: \V{solid}, \V{dashed} or \V{dotted} & \V{solid} \\ \K{text} & replace vline with text (like \V{!} specifier in \K{colspec}) & \None \\ \underline{\K{wd}} & rule width dimension & \V{0.4pt} \\ \underline{\K{fg}} & rule color name & \None \\ \K{abovepos} & crossing or trimming position at the above side & \V{0} \\ \K{belowpos} & crossing or trimming position at the below side & \V{0} \\ \end{spectblr} \subsection{Hlines and Vlines in New Interfaces} Options \verb!hlines! and \verb!vlines! are for setting all hlines and vlines, respectively. With empty value, all hlines/vlines will be solid. \begin{demohigh} \begin{tblr}{hlines,vlines} Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} With values inside one pair of braces, all hlines/vlines will be styled. \begin{demohigh} \begin{tblr}{ hlines = {1pt,solid}, vlines = {red3,dashed}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} Another pair of braces before will select segments in all hlines/vlines. \begin{demohigh} \begin{tblr}{ vlines = {1,3,5}{dashed}, vlines = {2,4,6}{solid}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ Nu & Xi & Omicron & Pi \\ Rho & Sigma & Tau & Upsilon \\ Phi & Chi & Psi & Omega \\ \end{tblr} \end{demohigh} The above example can be simplified with \verb!odd! and \verb!even! values. (More child selectors can be defined with \verb!\NewChildSelector! command. Advanced users could read the source code for this.) \begin{demohigh} \begin{tblr}{ vlines = {odd}{dashed}, vlines = {even}{solid}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ Nu & Xi & Omicron & Pi \\ Rho & Sigma & Tau & Upsilon \\ Phi & Chi & Psi & Omega \\ \end{tblr} \end{demohigh} Another pair of braces before will draw more hlines/vlines (in which \verb!-! stands for all line segments). \begin{demohigh} \begin{tblr}{ hlines = {1}{-}{dashed}, hlines = {2}{-}{solid}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} Note that you \underline{must} use indexes in order: first 1, then 2, etc. Options \verb!hline{i}! and \verb!vline{j}! are for setting some hlines and vlines, respectively. Their values are the same as options \verb!hlines! and \verb!vlines!: \begin{demohigh} \begin{tblr}{ hline{1,7} = {1pt,solid}, hline{3-5} = {blue3,dashed}, vline{1,5} = {3-4}{dotted}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ Nu & Xi & Omicron & Pi \\ Rho & Sigma & Tau & Upsilon \\ Phi & Chi & Psi & Omega \\ \end{tblr} \end{demohigh} You can use \verb!X!, \verb!Y!, \verb!Z! to denote the last three childs, respectively. It is especially useful when you are writing long tables: \begin{demohigh} \begin{tblr}{ hline{1,Z} = {2pt}, hline{2,Y} = {1pt}, hline{3-X} = {dashed}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ Nu & Xi & Omicron & Pi \\ Rho & Sigma & Tau & Upsilon \\ Phi & Chi & Psi & Omega \\ \end{tblr} \end{demohigh} Now we show the usage of \verb!text! key by the following example% \footnote{Code from \url{https://tex.stackexchange.com/questions/603023/tabularray-and-tabularx-column-separator}.}: \begin{demohigh} \begin{tblr}{ vlines, hlines, colspec = {lX[c]X[c]X[c]X[c]}, vline{2} = {1}{text=\clap{:}}, vline{3} = {1}{text=\clap{\ch{+}}}, vline{4} = {1}{text=\clap{\ch{->}}}, vline{5} = {1}{text=\clap{\ch{+}}}, } Equation & \ch{CH4} & \ch{2 O2} & \ch{CO2} & \ch{2 H2O} \\ Initial & $n_1$ & $n_2$ & 0 & 0 \\ Final & $n_1-x$ & $n_2-2x$ & $x$ & $2x$ \\ \end{tblr} \end{demohigh} You need to load \verb!chemmacros! package for the \verb!\ch! command. The \verb!leftpos! and \verb!rightpos! keys specify crossing or trimming positions for hlines. The possible values for them are decimal numbers between \verb!-1! and \verb!1!. Their initial values are \verb!1!. \begin{center} \begin{tblr}{width=0.5\textwidth,colspec={rX[l]},hlines} -1 & the hline is trimmed by \V{colsep} \\ 0 & the hline only touches the first vline \\ 1 & the hline touches all the vlines \\ \end{tblr} \end{center} The \verb!abovepos! and \verb!belowpos! keys for vlines have similar meanings. But their initial values are \verb!0!. \begin{center} \begin{tblr}{width=0.5\textwidth,colspec={rX[l]},hlines} -1 & the vline is trimmed by \V{rowsep} \\ 0 & the vline only touches the first hline \\ 1 & the vline touches all the hlines \\ \end{tblr} \end{center} Here is an example for these four keys: \begin{demohigh} \begin{tblr}{ hline{1,4} = {1}{-}{}, hline{1,4} = {2}{-}{}, hline{2,3} = {1}{-}{leftpos = -1, rightpos = -1}, hline{2,3} = {2}{-}{leftpos = -1, rightpos = -1}, vline{1,4} = {abovepos = 1, belowpos = 1}, } Alpha & Beta & Gamma \\ Epsilon & Zeta & Eta \\ Iota & Kappa & Lambda \\ \end{tblr} \end{demohigh} \subsection{Hlines and Vlines in Old Interfaces} The \verb!\hline! command has an optional argument which accepts key-value options. The available keys are described in Table \ref{key:hline}. \begin{demohigh} \begin{tblr}{llll} \hline Alpha & Beta & Gamma & Delta \\ \hline[dashed] Epsilon & Zeta & Eta & Theta \\ \hline[dotted] Iota & Kappa & Lambda & Mu \\ \hline[2pt,blue5] \end{tblr} \end{demohigh} The \verb!\cline! command also has an optional argument which is the same as \verb!\hline!. \begin{demohigh} \begin{tblr}{llll} \cline{1-4} Alpha & Beta & Gamma & Delta \\ \cline[dashed]{1,3} Epsilon & Zeta & Eta & Theta \\ \cline[dashed]{2,4} Iota & Kappa & Lambda & Mu \\ \cline[2pt,blue5]{-} \end{tblr} \end{demohigh} You can use child selectors in the mandatory argument of \verb!\cline!. \begin{demohigh} \begin{tblr}{llll} \cline{1-4} Alpha & Beta & Gamma & Delta \\ \cline[dashed]{odd} Epsilon & Zeta & Eta & Theta \\ \cline[dashed]{even} Iota & Kappa & Lambda & Mu \\ \cline[2pt,blue5]{-} \end{tblr} \end{demohigh} Commands \verb!\SetHline! combines the usages of \verb!\hline! and \verb!\cline!: \begin{demohigh} \begin{tblr}{llll} \SetHline{1-3}{blue5,1pt} Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \SetHline{2-4}{teal5,1pt} \end{tblr} \end{demohigh} \begin{demohigh} \begin{tblr}{llll} \SetHline[1]{1-3}{blue5,1pt} \SetHline[2]{1-3}{azure5,1pt} Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \SetHline[1]{2-4}{teal5,1pt} \SetHline[2]{2-4}{green5,1pt} \end{tblr} \end{demohigh} In fact, table command \verb!\SetHline[]{}{}! at the beginning of row \verb!i! is the same as table option \verb!hline{i}={}{}{}!. Also, table command \verb!\SetHlines[]{}{}! at the beginning of some row is the same as table option \verb!hlines={}{}{}!. The usages of table commands \verb!\vline!, \verb!\rline!, \verb!\SetVline!, \verb!\SetVlines! are similar to those of \verb!\hline!, \verb!\cline!, \verb!\SetHline!, \verb!\SetHlines!, respectively. But normally you don't need to use them. \section{Cells and Spancells} All available keys for cells are described in Table \ref{key:cell} and Table \ref{key:cellspan}. \begin{spectblr}[ caption = {Keys for the Content of Cells}, label = {key:cell}, remark{Note} = {In most cases, you can omit the underlined key names and write only their values.} ]{} Key & Description and Values & Initial Value \\ \underline{\K{halign}} & horizontal alignment: \V{l} (left), \V{c} (center), \V{r} (right) or \V{j} (justify) & \V{l} \\ \underline{\K{valign}} & vertical alignment: \V{t} (top), \V{m} (middle), \V{b} (bottom), \V{h} (head) or \V{f} (foot) & \V{t} \\ \underline{\K{wd}} & width dimension & \None \\ \underline{\K{bg}} & background color name & \None \\ \K{fg} & foreground color name & \None \\ \K{font} & font commands & \None \\ \K{preto} & prepend text to the cell & \None \\ \K{appto} & append text to the cell & \None \\ \K{cmd} & execute command for the cell text & \None \\ \end{spectblr} \vspace{-2em} \begin{spectblr}[ caption = {Keys for Multispan of Cells}, label = {key:cellspan}, ]{} Key & Description and Values & Initial Value \\ \K{r} & number of rows the cell spans & 1 \\ \K{c} & number of columns the cell spans & 1 \\ \end{spectblr} \subsection{Cells and Spancells in New Interfaces} Option \verb!cells! is for setting all cells. \nopagebreak \begin{demohigh} \begin{tblr}{hlines={white},cells={c,blue7}} Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ Nu & Xi & Omicron & Pi \\ \end{tblr} \end{demohigh} Option \verb!cell{i}{j}! is for setting some cells. \begin{demohigh} \begin{tblr}{ hlines = {white}, vlines = {white}, cell{1,6}{odd} = {teal7}, cell{1,6}{even} = {green7}, cell{2,4}{1,4} = {red7}, cell{3,5}{1,4} = {purple7}, cell{2}{2} = {r=4,c=2}{c,azure7}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ Nu & Xi & Omicron & Pi \\ Rho & Sigma & Tau & Upsilon \\ Phi & Chi & Psi & Omega \\ \end{tblr} \end{demohigh} \subsection{Cells and Spancells in Old Interfaces} The \verb!\SetCell! command has a mandatory argument for setting the styles of current cell. The available keys are described in Table \ref{key:cell}. \begin{demohigh} \begin{tblr}{llll} \hline[1pt] Alpha & \SetCell{bg=teal2,fg=white} Beta & Gamma \\ \hline Epsilon & Zeta & \SetCell{r,font=\scshape} Eta \\ \hline Iota & Kappa & Lambda \\ \hline[1pt] \end{tblr} \end{demohigh} The \verb!\SetCell! command also has an optional argument for setting the multispan of current cell. The available keys are described in Table \ref{key:cellspan}. \begin{demohigh} \begin{tblr}{|X|X|X|X|X|X|} \hline Alpha & Beta & Gamma & Delta & Epsilon & Zeta \\ \hline \SetCell[c=2]{c} Eta & 2-2 & \SetCell[c=2]{c} Iota & 2-4 & \SetCell[c=2]{c} Lambda & 2-6 \\ \hline \SetCell[c=3]{c} Nu & 3-2 & 3-3 & \SetCell[c=3]{c} Pi & 3-5 & 3-6 \\ \hline \SetCell[c=6]{c} Tau & 4-2 & 4-3 & 4-4 & 4-5 & 4-6 \\ \hline \end{tblr} \end{demohigh} \begin{demohigh} \begin{tblr}{|X|X|X|X|X|X|} \hline Alpha & Beta & Gamma & Delta & Epsilon & Zeta \\ \hline \SetCell[r=2]{m} Eta & Theta & Iota & Kappa & Lambda & \SetCell[r=2]{m} Mu \\ \hline Nu & Xi & Omicron & Pi & Rho & Sigma \\ \hline \end{tblr} \end{demohigh} In fact, table command \verb!\SetCell[]{}! at the beginning of cell at row \verb!i! and column \verb!j! is the same as table option \verb!cell{i}{j}={}{}!. Also, table command \verb!\SetCells[]{}! at the beginning of some cell is the same as table option \verb!cells={}{}!. \section{Rows and Columns} All available keys for rows and columns are described in Table \ref{key:row} and Table \ref{key:column}. \begin{spectblr}[ caption = {Keys for Rows}, label = {key:row}, remark{Note} = {In most cases, you can omit the underlined key names and write only their values.} ]{} Key & Description and Values & Initial Value \\ \underline{\K{halign}} & horizontal alignment: \V{l} (left), \V{c} (center), or \V{r} (right) & \V{l} \\ \underline{\K{valign}} & vertical alignment: \V{t} (top), \V{m} (middle), \V{b} (bottom), \V{h} (head) or \V{f} (foot) & \V{t} \\ \underline{\K{ht}} & height dimension & \None \\ \underline{\K{bg}} & background color name & \None \\ \K{fg} & foreground color name & \None \\ \K{font} & font commands & \None \\ \K{abovesep} & set vertical space above the row & \V{2pt} \\ \K{abovesep+} & increase vertical space above the row & \None \\ \K{belowsep} & set vertical space below the row & \V{2pt} \\ \K{belowsep+} & increase vertical space below the row & \None \\ \K{rowsep} & set vertical space above and below the row & \V{2pt} \\ \K{rowsep+} & increase vertical space above and below the row & \None \\ \K{preto} & prepend text to every cell (like \V{>} specifier in \K{rowspec}) & \None \\ \K{appto} & append text to every cell (like \V{<} specifier in \K{rowspec}) & \None \\ \K{cmd} & execute command for every cell text & \None \\ \end{spectblr} \vspace{-2em} \begin{spectblr}[ caption = {Keys for Columns}, label = {key:column}, remark{Note} = {In most cases, you can omit the underlined key names and write only their values.} ]{} Key & Description and Values & Initial Value \\ \underline{\K{halign}} & horizontal alignment: \V{l} (left), \V{c} (center), or \V{r} (right) & \V{l} \\ \underline{\K{valign}} & vertical alignment: \V{t} (top), \V{m} (middle), \V{b} (bottom), \V{h} (head) or \V{f} (foot) & \V{t} \\ \underline{\K{wd}} & width dimension & \None \\ \underline{\K{co}} & coefficient for the extendable column (\V{X} column) & \None \\ \underline{\K{bg}} & background color name & \None \\ \K{fg} & foreground color name & \None \\ \K{font} & font commands & \None \\ \K{leftsep} & set horizontal space to the left of the column & \V{6pt} \\ \K{leftsep+} & increase horizontal space to the left of the column & \None \\ \K{rightsep} & set horizontal space to the right of the column & \V{6pt} \\ \K{rightsep+} & increase horizontal space to the right of the column & \None \\ \K{colsep} & set horizontal space to both sides of the column & \V{6pt} \\ \K{colsep+} & increase horizontal space to both sides of the column & \None \\ \K{preto} & prepend text to every cell (like \V{>} specifier in \K{colspec}) & \None \\ \K{appto} & append text to every cell (like \V{<} specifier in \K{colspec}) & \None \\ \K{cmd} & execute command for every cell text & \None \\ \end{spectblr} \subsection{Rows and Columns in New Interfaces} Options \verb!rows! and \verb!columns! are for setting all rows and columns, respectively. \nopagebreak \begin{demohigh} \begin{tblr}{ hlines, vlines, rows = {7mm}, columns = {15mm,c}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} Options \verb!row{i}! and \verb!column{j}! are for setting some rows and columns, respectively. \begin{demohigh} \begin{tblr}{ hlines = {1pt,white}, row{odd} = {blue7}, row{even} = {azure7}, column{1} = {purple7,c}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ Nu & Xi & Omicron & Pi \\ Rho & Sigma & Tau & Upsilon \\ Phi & Chi & Psi & Omega \\ \end{tblr} \end{demohigh} The following example demonstrates the usages of \verb!bg!, \verb!fg! and \verb!font! keys. \nopagebreak \begin{demohigh} \begin{tblr}{ row{odd} = {bg=azure8}, row{1} = {bg=azure3, fg=white, font=\sffamily}, } Alpha & Beta & Gamma \\ Delta & Epsilon & Zeta \\ Eta & Theta & Iota \\ Kappa & Lambda & Mu \\ Nu Xi Omicron & Pi Rho Sigma & Tau Upsilon Phi \\ \end{tblr} \end{demohigh} The following example demonstrates the usages of \verb!abovesep!, \verb!belowsep!, \verb!leftsep!, \verb!rightsep! keys. %\nopagebreak \begin{demohigh} \begin{tblr}{ hlines, vlines, rows = {abovesep=1pt,belowsep=5pt}, columns = {leftsep=1pt,rightsep=5pt}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} The following example shows that we can replace \verb!\\[dimen]! with \verb!belowsep+! key. \begin{demohigh} \begin{tblr}{ hlines, row{2} = {belowsep+=5pt}, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} \subsection{Rows and Columns in Old Interfaces} The \verb!\SetRow! command has a mandatory argument for setting the styles of current row. The available keys are described in Table \ref{key:row}. \begin{demohigh} \begin{tblr}{llll} \hline[1pt] \SetRow{azure8} Alpha & Beta & Gamma & Delta \\ \hline \SetRow{blue8,c} Epsilon & Zeta & Eta & Theta \\ \hline \SetRow{violet8} Iota & Kappa & Lambda & Mu \\ \hline[1pt] \end{tblr} \end{demohigh} In fact, table command \verb!\SetRow{}! at the beginning of row \verb!i! is the same as table option \verb!row{i}={}!. Also, table command \verb!\SetRows{}! at the beginning of some row is the same as table option \verb!rows={}!. The usages of table commands \verb!\SetColumn! and \verb!\SetColumns! are similar to those of \verb!\SetRow! and \verb!\SetRows!, respectively. But normally you don't need to use them. \section{Colspec and Rowspec} Options \verb!colspec!/\verb!rowspec! are for setting column/row specifications with column/row type specifiers. \subsection{Colspec and Width} Option \verb!width! are for setting the width of the table with extendable columns. The following example demonstrates the usage of \verb!width! option. \nopagebreak \begin{demohigh} \begin{tblr}{width=0.8\textwidth, colspec={|l|X[2]|X[3]|X[-1]|}} Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} \subsection{Column Types} The \verb!tabularray! package has only one type of primitive column: the \verb!Q! column. Other types of columns are defined as \verb!Q! columns with some keys. \begin{codehigh} \NewColumnType{l}{Q[l]} \NewColumnType{c}{Q[c]} \NewColumnType{r}{Q[r]} \NewColumnType{t}[1]{Q[t,wd=#1]} \NewColumnType{m}[1]{Q[m,wd=#1]} \NewColumnType{b}[1]{Q[b,wd=#1]} \NewColumnType{h}[1]{Q[h,wd=#1]} \NewColumnType{f}[1]{Q[f,wd=#1]} \NewColumnType{X}[1][]{Q[co=1,#1]} \end{codehigh} \begin{demohigh} \begin{tblr}{|t{15mm}|m{15mm}|b{20mm}|} Alpha & Beta & {Gamma\\Gamma} \\ Epsilon & Zeta & {Eta\\Eta} \\ Iota & Kappa & {Lambda\\Lambda} \\ \end{tblr} \end{demohigh} Any new column type must be defined with \verb!\NewColumnType! command. It can have an optional argument when it's defined. \subsection{Row Types} The \verb!tabularray! package has only one type of primitive row: the \verb!Q! row. Other types of rows are defined as \verb!Q! rows with some keys. \begin{codehigh} \NewRowType{l}{Q[l]} \NewRowType{c}{Q[c]} \NewRowType{r}{Q[r]} \NewRowType{t}[1]{Q[t,ht=#1]} \NewRowType{m}[1]{Q[m,ht=#1]} \NewRowType{b}[1]{Q[b,ht=#1]} \NewRowType{h}[1]{Q[h,ht=#1]} \NewRowType{f}[1]{Q[f,ht=#1]} \end{codehigh} \begin{demohigh} \begin{tblr}{rowspec={|t{12mm}|m{10mm}|b{10mm}|}} Alpha & Beta & {Gamma\\Gamma} \\ Epsilon & Zeta & {Eta\\Eta} \\ Iota & Kappa & {Lambda\\Lambda} \\ \end{tblr} \end{demohigh} Any new row type must be defined with \verb!\NewRowType! command. It can have an optional argument when it's defined. \chapter{Extra Interfaces} \section{Table Specifications} All available keys for the whole table are described in Table \ref{key:table}. \begin{spectblr}[ caption = {Keys for the Whole Table}, label = {key:table}, ]{} Key & Description and Values & Initial Value \\ \K{rulesep} & space between two hlines or vlines & \V{2pt} \\ \K{stretch} & stretch ratio for struts added to cell text & \V{1} \\ \K{abovesep} & set vertical space above every row & \V{2pt} \\ \K{belowsep} & set vertical space below every row & \V{2pt} \\ \K{rowsep} & set vertical space above and below every row & \V{2pt} \\ \K{leftsep} & set horizontal space to the left of every column & \V{6pt} \\ \K{rightsep} & set horizontal space to the right of every column & \V{6pt} \\ \K{colsep} & set horizontal space to both sides of every column & \V{6pt} \\ \K{hspan} & horizontal span algorithm: \V{default}, \V{even}, or \V{minimal} & \V{default} \\ \K{vspan} & vertical span algorithm: \V{default} or \V{even} & \V{default} \\ \end{spectblr} The following example shows that we can replace \verb!\doublerulesep! parameter with \verb!rulesep! key. \nopagebreak \begin{demohigh} \begin{tblr}{ colspec={||llll||},rowspec={|QQQ|},rulesep=4pt, } Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} The following example shows that we can replace \verb!\arraystretch! parameter with \verb!stretch! key. \begin{demohigh} \begin{tblr}{hlines,stretch=1.5} Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} The following example uses \verb!rowsep! and \verb!colsep! keys to set padding for all rows and columns. \nopagebreak \begin{demohigh} \SetTblrInner{rowsep=2pt,colsep=2pt} \begin{tblr}{hlines,vlines} Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{tblr} \end{demohigh} With \verb!hspan=default! or \verb!hspan=even!, \verb!tabularray! package will compute column widths from span widths. But with \verb!hspan=minimal!, it will compute span widths from column widths. The following examples show the results from different \verb!hspan! values. \begin{demohigh} \SetTblrInner{hlines, vlines, hspan=default} \begin{tblr}{cell{2}{1}={c=2}{l},cell{3}{1}={c=3}{l},cell{4}{2}={c=2}{l}} 111 111 & 222 222 & 333 333 \\ 12 Multi Columns Multi Columns 12 & & 333 \\ 13 Multi Columns Multi Columns Multi Columns 13 & & \\ 111 & 23 Multi Columns Multi Columns 23 & \\ \end{tblr} \end{demohigh} \begin{demohigh} \SetTblrInner{hlines, vlines, hspan=even} \begin{tblr}{cell{2}{1}={c=2}{l},cell{3}{1}={c=3}{l},cell{4}{2}={c=2}{l}} 111 111 & 222 222 & 333 333 \\ 12 Multi Columns Multi Columns 12 & & 333 \\ 13 Multi Columns Multi Columns Multi Columns 13 & & \\ 111 & 23 Multi Columns Multi Columns 23 & \\ \end{tblr} \end{demohigh} \begin{demohigh} \SetTblrInner{hlines, vlines, hspan=minimal} \begin{tblr}{cell{2}{1}={c=2}{l},cell{3}{1}={c=3}{l},cell{4}{2}={c=2}{l}} 111 111 & 222 222 & 333 333 \\ 12 Multi Columns Multi Columns 12 & & 333 \\ 13 Multi Columns Multi Columns Multi Columns 13 & & \\ 111 & 23 Multi Columns Multi Columns 23 & \\ \end{tblr} \end{demohigh} The following examples show the results from different \verb!vspan! values. \nopagebreak \begin{demohigh} \SetTblrInner{hlines, vlines, vspan=default} \begin{tblr}{column{2}={3.25cm}, cell{2}{2}={r=3}{l}} Column1 & Column2 \\ Row1 & Long text that needs multiple lines. Long text that needs multiple lines. Long text that needs multiple lines. \\ Row2 & \\ Row3 & \\ Row4 & Short text \\ \end{tblr} \end{demohigh} \begin{demohigh} \SetTblrInner{hlines, vlines, vspan=even} \begin{tblr}{column{2}={3.25cm}, cell{2}{2}={r=3}{l}} Column1 & Column2 \\ Row1 & Long text that needs multiple lines. Long text that needs multiple lines. Long text that needs multiple lines. \\ Row2 & \\ Row3 & \\ Row4 & Short text \\ \end{tblr} \end{demohigh} \section{Default Specifications} \verb!Tabularray! package provides \verb!\SetTblrInner! and \verb!\SetTblrOuter! commands for you to change the default inner and outer specifications of tables. Inner specifications are all specifications written in the mandatory argument of the \verb!tblr! environment, while outer specifications are all specifications written in the optional argument of the \verb!tblr! environment. At this time, most of the outer specifications are used for long tables (see Chapter \ref{chap:long}). In the below example, the first line draws all hlines and vlines for all tables created afterwards, while the second line makes all tables created afterwards vertically align at bottom. \begin{codehigh} \SetTblrInner{hlines,vlines} \SetTblrOuter{valign=b} \end{codehigh} You can define new \verb!tabularray! environments using \verb!\NewTblrEnviron! command: \begin{demohigh} \NewTblrEnviron{mytblr} \SetTblrInner[mytblr]{hlines,vlines} \SetTblrOuter[mytblr]{valign=b} Text \begin{mytblr}{cccc} Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \end{mytblr} Text \end{demohigh} If not giving the optional argument to \verb!\SetTblrInner! or \verb!\SetTblrOuter! command, we set the default specifications for \verb!tblr! environment. And different tabularray environments could have different default specifications. \section{New Table Commands} All commands which change the specifications of tables \textcolor{red3}{must} be defined with \verb!\NewTableCommand!. The following example demonstrates how to define a new table command: \begin{demohigh} \NewTableCommand\myhline{\hline[0.1em,red5]} \begin{tblr}{llll} \myhline Alpha & Beta & Gamma & Delta \\ Epsilon & Zeta & Eta & Theta \\ Iota & Kappa & Lambda & Mu \\ \myhline \end{tblr} \end{demohigh} \section{Expand Macros First} \verb!Tabularray! need to see every \verb!&! and \verb!\\! when splitting the table body with \verb!l3regex!. And you can not put cell text inside any table command defined with \verb!\NewTableCommand!. But you could use outer specification \verb!expand! to make \verb!tabularray! expand every occurrence of a specified macro \underline{once} before splitting the table body: \begin{demohigh} \def\tblrbody{ \hline 20 & 30 & 40 \\ 50 & 60 & 70 \\ \hline } \begin{tblr}[expand=\tblrbody]{ccc} \hline AA & BB & CC \\ \tblrbody DD & EE & FF \\ \tblrbody GG & HH & II \\ \hline \end{tblr} \end{demohigh} With this \verb!expand! option, you can also use \verb!environ! package to define a new environment based on \verb!tblr! environment: \begin{demohigh} \NewEnviron{fancytblr}{ Before Text \begin{tblr}[expand=\BODY]{hlines} \BODY \end{tblr} After Text } \begin{fancytblr} One & Two & Three \\ Four & Five & Six \\ Seven & Eight & Nine \\ \end{fancytblr} \end{demohigh} \section{Use Verbatim Commands} With inner specification \verb!verb!, you can write \verb!\verb! commands in the cell text: \begin{demohigh} \begin{tblr}{hlines,verb} 20 & 30 & \verb!\hello{world}!40 \\ 50 & \verb!\hello!60 & 70 \\ \end{tblr} \end{demohigh} \section{Counters and Lengths} Counters \verb!rownum!, \verb!colnum!, \verb!rowcount!, \verb!colcount! can be used in cell text: \nopagebreak \begin{demohigh} \begin{tblr}{hlines} Cell[\arabic{rownum}][\arabic{colnum}] & Cell[\arabic{rownum}][\arabic{colnum}] & Cell[\arabic{rownum}][\arabic{colnum}] & Cell[\arabic{rownum}][\arabic{colnum}] \\ Row=\arabic{rowcount}, Col=\arabic{colcount} & Row=\arabic{rowcount}, Col=\arabic{colcount} & Row=\arabic{rowcount}, Col=\arabic{colcount} & Row=\arabic{rowcount}, Col=\arabic{colcount} \\ Cell[\arabic{rownum}][\arabic{colnum}] & Cell[\arabic{rownum}][\arabic{colnum}] & Cell[\arabic{rownum}][\arabic{colnum}] & Cell[\arabic{rownum}][\arabic{colnum}] \\ \end{tblr} \end{demohigh} Also, lengths \verb!\leftsep!, \verb!\rightsep!, \verb!\abovesep!, \verb!\belowsep! can be used in cell text. \section{Tracing Tabularray} To trace internal data behind \verb!tblr! environment, you can use \verb!\SetTblrTracing! command. For example, \verb!\SetTblrTracing{all}! will turn on all tracings, and \verb!\SetTblrTracing{none}! will turn off all tracings. \verb!\SetTblrTracing{+row,+column}! will only tracing row and column data. All tracing messages will be written to the log files. \chapter{Use Long Tables} \label{chap:long} \mywarning{chapter} \section{A Simple Example} In fact, to make a decent long table with header and footer, it is better to separate header/footer as \underline{table head/foot} (which includes caption, footnotes, continuation text) and \underline{row head/foot} (which includes some rows of the table that should appear in every page). By this approach, alternating row colors should work as expected. \NewTblrTheme{fancy}{ \SetTblrStyle{firsthead}{font=\bfseries} \SetTblrStyle{firstfoot}{fg=blue2} \SetTblrStyle{middlefoot}{\itshape} \SetTblrStyle{caption-tag}{red2} } \begin{longtblr}[ theme = fancy, caption = {A Long Long Long Long Long Long Long Table}, entry = {Short Caption}, label = {tblr:test}, note{a} = {It is the first footnote.}, note{$\dag$} = {It is the second long long long long long long footnote.}, remark{Note} = {Some general note. Some general note. Some general note.}, remark{Source} = {Made up by myself. Made up by myself. Made up by myself.}, ]{ colspec = {XXX}, width = 0.85\linewidth, rowhead = 2, rowfoot = 1, row{odd} = {gray9}, row{even} = {brown9}, row{1-2} = {purple7}, row{Z} = {blue7}, } \hline Head & Head & Head \\ \hline Head & Head & Head \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta\TblrNote{a} & Eta \\ \hline Iota & Kappa\TblrNote{$\dag$} & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ %\hline % Alpha & Beta & Gamma \\ %\hline % Epsilon & Zeta & Eta \\ %\hline % Iota & Kappa & Lambda \\ %\hline % Nu & Xi & Omicron \\ %\hline % Rho & Sigma & Tau \\ %\hline % Phi & Chi & Psi \\ \hline Foot & Foot & Foot \\ \hline \end{longtblr} As you can see in the above example, the appearance of long tables of \verb!tabularray! package is similar to that of \verb!threeparttable! and \verb!threeparttablex! packages. We support table footnotes, but not page footnotes in \verb!tabularray! package. \newpage The source code for the above long table is shown below. It is mainly self-explanatory. \begin{codehigh} \NewTblrTheme{fancy}{ \SetTblrStyle{firsthead}{font=\bfseries} \SetTblrStyle{firstfoot}{fg=blue2} \SetTblrStyle{middlefoot}{\itshape} \SetTblrStyle{caption-tag}{red2} } \begin{longtblr}[ theme = fancy, caption = {A Long Long Long Long Long Long Long Table}, entry = {Short Caption}, label = {tblr:test}, note{a} = {It is the first footnote.}, note{$\dag$} = {It is the second long long long long long long footnote.}, remark{Note} = {Some general note. Some general note. Some general note.}, remark{Source} = {Made up by myself. Made up by myself. Made up by myself.}, ]{ colspec = {XXX}, width = 0.85\linewidth, rowhead = 2, rowfoot = 1, row{odd} = {gray9}, row{even} = {brown9}, row{1-2} = {purple7}, row{Z} = {blue7}, } \hline Head & Head & Head \\ \hline Head & Head & Head \\ \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta\TblrNote{a} & Eta \\ \hline Iota & Kappa\TblrNote{$\dag$} & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline ...... \hline Alpha & Beta & Gamma \\ \hline Epsilon & Zeta & Eta \\ \hline Iota & Kappa & Lambda \\ \hline Nu & Xi & Omicron \\ \hline Rho & Sigma & Tau \\ \hline Phi & Chi & Psi \\ \hline Foot & Foot & Foot \\ \hline \end{longtblr} \end{codehigh} As you can see in the above code, we typeset long tables with \verb!longtblr! environemnt. And we can totally separate contents and styles of long tables with \verb!tabularray! package. Row head and row foot consist of some lines of the table and should appear in every page. Their options are inner specifications and should be put in the mandatory argument of the \verb!longtblr! environment. In the above example, We set \verb!rowhead=2! and \verb!rowfoot=1!. \begin{spectblr}[ caption = {Inner Specifications for Row Heads and Row Foots} ]{} Key Nama & Key Description & Initial Value \\ \V{rowhead} & number of the first rows of the table appear in every page & \V{0} \\ \V{rowfoot} & number of the last rows of the table appear in every page & \V{0} \\ \end{spectblr} Table head and table foot consist of the caption, continuation text, footnotes and remarks. Their options are outer specifications and should be put in the optional argument of the \verb!longtblr! environment. \begin{spectblr}[ caption = {Outer Specifications for Table Heads and Table Foots} ]{verb} Key Nama & Key Description & Initial Value \\ \V{headsep} & vertical space between table head and table body & \V{6pt} \\ \V{footsep} & vertical space between table foot and table body & \V{6pt} \\ \V{presep} & vertical space between table head and the above text & \verb!1.5\bigskipamount! \\ \V{postsep} & vertical space between table foot and the below text & \verb!1.5\bigskipamount! \\ \V{theme} & table theme (including settings for templates and styles) & \None \\ \V{caption} & table caption & \None \\ \V{entry} & short table caption to be put in List of Tables & \None \\ \V{label} & table label & \None \\ \V{note\{\}} & table note with \V{} as tag & \None \\ \V{remark\{\}} & table remark with \V{} as tag & \None \\ \end{spectblr} If you write \verb!entry=none!, \verb!tabularray! package will not add an entry in List of Tables. Therefore \verb!caption=text,entry=none! is similar to \verb!\caption[]{text}! in \verb!longtable!. If you write \verb!label=none!, \verb!tabularray! package will not step \verb!table! counter, and set the \verb!caption-tag! and \verb!caption-sep! elements (see below) to empty. Therefore \verb!caption=text,entry=none,label=none! is similar to \verb!\caption*{text}! in \verb!longtable!, except for the counter. \section{Customize Templates} \subsection{Overview of Templates} The template system for table heads and table foots in \verb!tabularray! is largely inspired by \verb!beamer!, \verb!caption! and \verb!longtable! packages. For elements in Table \ref{tblr:element}, you can use \verb!\DefTblrTemplate! to define and modify templates, and use \verb!\SetTblrTemplate! to choose default templates. In defining templates, you can include other templates with \verb!\UseTblrTemplate! and \verb!\ExpTblrTemplate! commands. \begin{spectblr}[ caption = {Elements for Table Heads and Table Foots}, label = {tblr:element}, ]{} Element Name & Element Description and Default Template \\ \V{contfoot-text}& continuation text in the foot, normally ``Continued on next page'' \\ \V{contfoot} & continuation paragraph in the foot, normally including \V{contfoot-text} template \\ \V{conthead-text}& continuation text in the head, normally ``(Continued)'' \\ \V{conthead} & continuation paragraph in the head, normally including \V{conthead-text} template \\ \V{caption-tag} & caption tag, normally like ``Table 4.2'' \\ \V{caption-sep} & caption separator, normally like ``:\quad'' \\ \V{caption-text} & caption text, normally using user provided value \\ \V{caption} & including \V{caption-tag} + \V{caption-sep} + \V{caption-text} \\ \V{note-tag} & note tag, normally using user provided value \\ \V{note-sep} & note separator, normally like ``\enskip'' \\ \V{note-text} & note tag, normally using user provided value \\ \V{note} & including \V{note-tag} + \V{note-sep} + \V{note-text} \\ \V{remark-tag} & remark tag, normally using user provided value \\ \V{remark-sep} & remark separator, normally like ``:\enskip'' \\ \V{remark-text} & remark text, normally using user provided value\\ \V{remark} & including \V{remark-tag} + \V{remark-sep} + \V{remark-text} \\ \V{firsthead} & table head on the first page, normally including \V{caption} template \\ \V{middlehead} & table head on middle pages, normally including \V{caption} and \V{conthead} templates \\ \V{lasthead} & table head on the last page, normally including \V{caption} and \V{conthead} templates \\ \V{head} & setting all of \V{firsthead}, \V{middlehead} and \V{lasthead} \\ \V{firstfoot} & table foot on the first page, normally including \V{contfoot} template \\ \V{middlefoot} & table foot on middle pages, normally including \V{contfoot} template \\ \V{lastfoot} & table foot on the last page, normally including \V{note} and \V{remark} templates \\ \V{foot} & setting all of \V{firstfoot}, \V{middlefoot} and \V{lastfoot} \\ \end{spectblr} An element which only includes short text is called a \underline{sub element}. Normally there is one \verb!-! in the name of a sub element. An element which includes one or more paragraphs is called a \underline{main element}. Normally there isn't any \verb!-! in the name of a main element. For each of the above elements, two templates \verb!normal! and \verb!empty! are always defined. You can select one of them with \verb!\SetTblrTemplate! command. \subsection{Continuation Templates} Let us have a look at the code for defining templates of continuation text first: \begin{codehigh} \DefTblrTemplate{contfoot-text}{normal}{Continued on next page} \SetTblrTemplate{contfoot-text}{normal} \DefTblrTemplate{conthead-text}{normal}{(Continued)} \SetTblrTemplate{conthead-text}{normal} \end{codehigh} In the above code, command \verb!\DefTblrTemplate! defines the templates with name \verb!normal!, and then command \verb!\SetTblrTemplate! sets the templates with name \verb!normal! as default. The \verb!normal! template is always defined and set as default for any element in \verb!tabularray!. Therefore you had better use another name when defining new templates. If you use \verb!default! as template name in \verb!\DefTblrTemplate!, you define and set it as default at the same time. Therefore the above code can be written in another way: \begin{codehigh} \DefTblrTemplate{contfoot-text}{default}{Continued on next page} \DefTblrTemplate{conthead-text}{default}{(Continued)} \end{codehigh} You may modify the code to customize continuation text to fit your needs. The templates for \verb!contfoot! and \verb!conthead! normally include the templates of their sub elements with \verb!\UseTblrTemplate! commands. But you can also handle user settings such as horizontal alignment here. \begin{codehigh} \DefTblrTemplate{contfoot}{default}{\UseTblrTemplate{contfoot-text}{default}} \DefTblrTemplate{conthead}{default}{\UseTblrTemplate{conthead-text}{default}} \end{codehigh} \subsection{Caption Templates} Normally a caption consists of three parts, and their templates are defined with the follow code: \begin{codehigh} \DefTblrTemplate{caption-tag}{default}{Table\hspace{0.25em}\thetable} \DefTblrTemplate{caption-sep}{default}{:\enskip} \DefTblrTemplate{caption-text}{default}{\InsertTblrText{caption}} \end{codehigh} The command \verb!\InsertTblrText{caption}! inserts the value of \verb!caption! key, which you could write in the optional argument of \verb!longtblr! environment. The \verb!caption! template normally includes three sub templates with \verb!\UseTblrTemplate! commands: The \verb!caption! template will be used in \verb!firsthead! template. \begin{codehigh} \DefTblrTemplate{caption}{default}{ \UseTblrTemplate{caption-tag}{default} \UseTblrTemplate{caption-sep}{default} \UseTblrTemplate{caption-text}{default} } \end{codehigh} Furthermore \verb!capcont! template includes \verb!conthead! template as well. The \verb!capcont! template will be used in \verb!middlehead! and \verb!lasthead! templates. \begin{codehigh} \DefTblrTemplate{capcont}{default}{ \UseTblrTemplate{caption-tag}{default} \UseTblrTemplate{caption-sep}{default} \UseTblrTemplate{caption-text}{default} \UseTblrTemplate{conthead}{default} } \end{codehigh} \subsection{Note and Remark Templates} The templates for table notes can be defined like this: \begin{codehigh} \DefTblrTemplate{note-tag}{default}{\textsuperscript{\InsertTblrNoteTag}} \DefTblrTemplate{note-sep}{default}{\space} \DefTblrTemplate{note-text}{default}{\InsertTblrNoteText} \end{codehigh} \begin{codehigh} \DefTblrTemplate{note}{default}{ \MapTblrNotes{ \noindent \UseTblrTemplate{note-tag}{default} \UseTblrTemplate{note-sep}{default} \UseTblrTemplate{note-text}{default} \par } } \end{codehigh} The \verb!\MapTblrNotes! command loops for all table notes, which are written in the optional argument of \verb!longtblr! environment. Inside the loop, you can use \verb!\InsertTblrNoteTag! and \verb!\InsertTblrNoteText! commands to insert current note tag and note text, respectively. The definition of remark templates are similar to note templates. \nopagebreak \begin{codehigh} \DefTblrTemplate{remark-tag}{default}{\InsertTblrRemarkTag} \DefTblrTemplate{remark-sep}{default}{:\space} \DefTblrTemplate{remark-text}{default}{\InsertTblrRemarkText} \end{codehigh} \begin{codehigh} \DefTblrTemplate{remark}{default}{ \MapTblrRemarks{ \noindent \UseTblrTemplate{remark-tag}{default} \UseTblrTemplate{remark-sep}{default} \UseTblrTemplate{remark-text}{default} \par } } \end{codehigh} \subsection{Head and Foot Templates} The templates for table heads and foots are defined as including other templates: \begin{codehigh} \DefTblrTemplate{firsthead}{default}{ \UseTblrTemplate{caption}{default} } \DefTblrTemplate{middlehead,lasthead}{default}{ \UseTblrTemplate{capcont}{default} } \DefTblrTemplate{firstfoot,middlefoot}{default}{ \UseTblrTemplate{contfoot}{default} } \DefTblrTemplate{lastfoot}{default}{ \UseTblrTemplate{note}{default} \UseTblrTemplate{remark}{default} } \end{codehigh} Note that you can define the same template for multiple elements in \verb!\DefTblrTemplate! command. \section{Change Styles} All available keys for template elements are described in Table \ref{key:element}. \begin{spectblr}[ caption = {Keys for the Styles of Elements}, label = {key:element}, remark{Note} = {In most cases, you can omit the underlined key names and write only their values. The keys \K{halign}, \K{indent} and \K{hang} are only for main templates.} ]{} Key Name & Key Description \\ \underline{\K{fg}} & foreground color \\ \underline{\K{font}} & font commands \\ \underline{\K{halign}} & horizontal alignment: \V{l} (left), \V{c} (center), or \V{r} (right) \\ \K{indent} & parindent value \\ \K{hang} & hangindent value \\ \end{spectblr} You may change the styles of elements with \verb!\SetTblrStyle! command: \begin{codehigh} \SetTblrStyle{firsthead}{font=\bfseries} \SetTblrStyle{firstfoot}{fg=blue2} \SetTblrStyle{middlefoot}{\itshape} \SetTblrStyle{caption-tag}{red2} \end{codehigh} When you write \verb!\UseTblrTemplate{element}{default}! in defining a template, beside including template code of the \verb!element!, the foreground color and font commands of the \verb!element! will be set up automatically. In contrast, \verb!\ExpTblrTemplate{element}{default}! will only include template code. \section{Define Themes} You may define your own themes for table heads and foots with \verb!\NewTblrTheme! command. a theme consists of some template and style settings. For example: \nopagebreak \begin{codehigh} \NewTblrTheme{fancy}{ \DefTblrTemplate{conthead}{default}{[Continued]} \SetTblrStyle{firsthead}{font=\bfseries} \SetTblrStyle{firstfoot}{fg=blue2} \SetTblrStyle{middlefoot}{\itshape} \SetTblrStyle{caption-tag}{red2} } \end{codehigh} After defining the theme \verb!fancy!, you can use it by writing \verb!theme=fancy! in the optional argument of \verb!longtblr! environment. \section{Control Page Breaks} Just like \verb!longtable! package, inside \verb!longtblr! environment, you can use \verb!\\*! or \verb!\nopagebreak! to prohibit a page break, and use \verb!\pagebreak! to force a page break. \section{Floatable Tall Tables} There is also a \verb!talltblr! environment as an alternative to \verb!threeparttable! environment. It can not cross multiple pages, but it can be put inside \verb!table! environment. \begin{demohigh} TEXT\begin{talltblr}[ caption = {Long Long Long Long Tabular}, entry = {Short Caption}, label = {tblr:tall}, note{a} = {It is the first footnote.}, note{$\dag$} = {It is the second long long long long long long footnote.}, ]{ colspec = {XXX}, width = 0.5\linewidth, hlines, } Alpha & Beta & Gamma \\ Epsilon & Zeta & Eta\TblrNote{a} \\ Iota & Kappa & Lambda\TblrNote{$\dag$} \\ \end{talltblr}TEXT \end{demohigh} \chapter{Use Some Libraries} The \verb!tabularray! package emulates or fixes some commands in other packages. To avoid potential conflict, you need to enable them with \verb!\UseTblrLibrary! command. \section{Library \texttt{booktabs}} With \verb!\UseTblrLibrary{booktabs}! in the preamble of the document, \verb!tabularray! will load \verb!booktabs! package, and define \verb!\toprule!, \verb!\midrule!, \verb!\bottomrule! and \verb!\cmidrule! inside \verb!tblr! environment. \begin{demohigh} \begin{tblr}{llll} \toprule Alpha & Beta & Gamma & Delta \\ \midrule Epsilon & Zeta & Eta & Theta \\ \cmidrule{1-3} Iota & Kappa & Lambda & Mu \\ \cmidrule{2-4} Nu & Xi & Omicron & Pi \\ \bottomrule \end{tblr} \end{demohigh} Just like \verb!\hline! and \verb!\cline! commands, you can also specify rule width and color in the optional argument of any of these commands. \begin{demohigh} \begin{tblr}{llll} \toprule[2pt,purple3] Alpha & Beta & Gamma & Delta \\ \midrule[blue3] Epsilon & Zeta & Eta & Theta \\ \cmidrule[azure3]{2-3} Iota & Kappa & Lambda & Mu \\ \bottomrule[2pt,purple3] \end{tblr} \end{demohigh} If you need more than one cmidrules, you can use \verb!\cmidrulemore! command. \begin{demohigh} \begin{tblr}{llll} \toprule Alpha & Beta & Gamma & Delta \\ \cmidrule{1-3} \cmidrulemore{2-4} Epsilon & Zeta & Eta & Theta \\ \cmidrule{1-3} \morecmidrules \cmidrule{2-4} Iota & Kappa & Lambda & Mu \\ \bottomrule \end{tblr} \end{demohigh} From version \verb!2021N!, trim options (\verb!l!, \verb!r!, \verb!lr!) for \verb!\cmidrule! command are also supported. \begin{demohigh} \begin{tblr}{llll} \toprule Alpha & Beta & Gamma & Delta \\ \cmidrule[lr]{1-2} \cmidrule[lr=-0.4]{3-4} Epsilon & Zeta & Eta & Theta \\ \cmidrule[r]{1-2} \cmidrule[l]{3-4} Iota & Kappa & Lambda & Mu \\ \bottomrule \end{tblr} \end{demohigh} Note that you need to put \verb!l!, \verb!r! or \verb!lr! option into the \underline{\color{red3}square brackets}. and the possible values are decimal numbers between \verb!-1! and \verb!0!, where \verb!-1! means trimming the whole colsep, and \verb!0! means no trimming. The default value is \verb!-0.8!, which makes similar result as \verb!booktabs! package does. There is also a \verb!booktabs! environment for you. With this environment, the default \verb!rowsep=0pt!, but extra vertical space will be added by \verb!\toprule!, \verb!\midrule!, \verb!\bottomrule! and \verb!\cmidrule! commands. The sizes of vertical space are determined by \verb!\aboverulesep! and \verb!\belowrulesep! dimensions. \begin{demohigh} \begin{booktabs}{ colspec = lcccc, cell{1}{1} = {r=2}{}, cell{1}{2,4} = {c=2}{}, } \toprule Sample & I & & II & \\ \cmidrule[lr]{2-3} \cmidrule[lr]{4-5} & A & B & C & D \\ \midrule S1 & 5 & 6 & 7 & 8 \\ S2 & 6 & 7 & 8 & 5 \\ S3 & 7 & 8 & 5 & 6 \\ \bottomrule \end{booktabs} \end{demohigh} % S4 & 8 & 5 & 6 & 7 \\ You can also use \verb!\specialrule! command. The second argument sets \verb!belowsep! of previous row, and the third argument sets \verb!abovesep! of current row, \begin{demohigh} \begin{booktabs}{row{2}={olive9}} \toprule Alpha & Beta & Gamma & Delta \\ \specialrule{0.5pt}{4pt}{6pt} Epsilon & Zeta & Eta & Theta \\ \specialrule{0.8pt,blue3}{3pt}{2pt} Iota & Kappa & Lambda & Mu \\ \bottomrule \end{booktabs} \end{demohigh} At last, there is also an \verb!\addlinespace! command. You can specify the size of vertical space to be added in its optional argument, and the default size is \verb!0.5em!. This command adds one half of the space to \verb!belowsep! of previous row, and the other half to \verb!abovesep! of current row. \begin{demohigh} \begin{booktabs}{row{2}={olive9}} \toprule Alpha & Beta & Gamma & Delta \\ \addlinespace Epsilon & Zeta & Eta & Theta \\ \addlinespace[1em] Iota & Kappa & Lambda & Mu \\ \bottomrule \end{booktabs} \end{demohigh} \section{Library \texttt{diagbox}} When writing \verb!\UseTblrLibrary{diagbox}! in the preamble of the document, \verb!tabularray! package loads \verb!diagbox! package, and you can use \verb!\diagbox! and \verb!\diagboxthree! commands inside \verb!tblr! environment. \begin{demohigh} \begin{tblr}{hlines,vlines} \diagbox{Aa}{Pp} & Beta & Gamma \\ Epsilon & Zeta & Eta \\ Iota & Kappa & Lambda \\ \end{tblr} \end{demohigh} \begin{demohigh} \begin{tblr}{hlines,vlines} \diagboxthree{Aa}{Pp}{Hh} & Beta & Gamma \\ Epsilon & Zeta & Eta \\ Iota & Kappa & Lambda \\ \end{tblr} \end{demohigh} You can also use \verb!\diagbox! and \verb!\diagboxthree! commands in math mode. \nopagebreak \begin{demohigh} $\begin{tblr}{|c|cc|} \hline \diagbox{X_1}{X_2} & 0 & 1 \\ \hline 0 & 0.1 & 0.2 \\ 1 & 0.3 & 0.4 \\ \hline \end{tblr}$ \end{demohigh} \section{Library \texttt{siunitx}} When writing \verb!\UseTblrLibrary{siunitx}! in the preamble of the document, \verb!tabularray! package loads \verb!siunitx! package, and defines \verb!S! column as \verb!Q! column with \verb!si! key. \begin{demohigh} \begin{tblr}{ hlines, vlines, colspec={S[table-format=3.2]S[table-format=3.2]}, } {{{Head}}} & {{{Head}}} \\ 111 & 111 \\ 2.1 & 2.2 \\ 33.11 & 33.22 \\ \end{tblr} \end{demohigh} \begin{demohigh} \begin{tblr}{ hlines, vlines, colspec={Q[si={table-format=3.2},c]Q[si={table-format=3.2},c]} } {{{Head}}} & {{{Head}}} \\ 111 & 111 \\ 2.1 & 2.2 \\ 33.11 & 33.22 \\ \end{tblr} \end{demohigh} Note that you need to use \underline{\color{red3}triple} pairs of braces to guard non-numeric cells. Also you must use \verb!l!, \verb!c! or \verb!r! to set horizontal alignment for non-numeric cells: \nopagebreak \begin{demohigh} \begin{tblr}{ hlines, vlines, columns={6em}, colspec={ Q[si={table-format=3.2,table-number-alignment=left},l,blue7] Q[si={table-format=3.2,table-number-alignment=center},c,teal7] Q[si={table-format=3.2,table-number-alignment=right},r,purple7] } } {{{Head}}} & {{{Head}}} & {{{Head}}} \\ 111 & 111 & 111 \\ 2.1 & 2.2 & 2.3 \\ 33.11 & 33.22 & 33.33 \\ \end{tblr} \end{demohigh} Both \verb!S! and \verb!s! columns are supported. In fact, These two columns are defined as follows: \begin{codehigh} \NewColumnType{S}[1][]{Q[si={##1},c]} \NewColumnType{s}[1][]{Q[si={##1},c,cmd=\TblrUnit]} \end{codehigh} \section{Library \texttt{varwidth}} To build a nice table, \verb!tabularray! need to measure the widths of cells. By default, it uses \verb!\hbox! to measure the sizes. This causes an error if a cell contains some vertical material, such as lists or display maths. With \verb!\UseTblrLibrary{varwidth}! in the preamble of the document, \verb!tabularray! loads \verb!varwidth! package, and adds a new inner specification \verb!measure! for tables. After setting \verb!measure=vbox!, it will use \verb!\vbox! to measure cell widths. \begin{demohigh} \begin{tblr}{measure=vbox} \hline Text Text Text Text Text Text Text \begin{itemize} \item List List List List List List \item List List List List List List List \end{itemize} Text Text Text Text Text Text Text \\ \hline \end{tblr} \end{demohigh} \chapter{The Source Code} %\CodeHigh{lite} \dochighinput[language=latex/latex3]{tabularray.sty} \end{document}