我正在尝试定义一个简化表格构建的命令。我希望最后一个条目前面自动出现一条水平线。我尝试做一个最小的工作示例,它工作了(令人惊讶),但它在我更复杂的代码中不起作用。
\documentclass{article}
\usepackage{xparse}
%%% Works
\newcommand{\foo}[2]{#1 & #2\\}
\newcommand{\foolast}[2]{\hline
#1 & #2}
\newcounter{premn}
\setcounter{premn}{0}
%%% Does not work if \hline is present
\newcommand{\premform}{\arabic}
\NewDocumentCommand{\preml}{O{\premform{premn}} m o}{%
\IfNoValueTF{#3}%
{%
\refstepcounter{premn}%
(#1) & #2 & \\
}
{%
\refstepcounter{premn}%
(#1) & #2 & #3\\
}
}
\NewDocumentCommand{\conl}{O{\premform{premn}} m o}{%
\IfNoValueTF{#3}%
{%\hline
\refstepcounter{premn}%
(#1) & #2 & %
\setcounter{premn}{0}%
\ignorespaces%
}
{%\hline
\refstepcounter{premn}%
(#1) & #2 & #3 %
\setcounter{premn}{0}%
\ignorespaces%
}
}
%%% MWE
\begin{document}
\begin{tabular}{ll}
\foo{a}{b}
\foolast{a}{b}
\end{tabular}
\begin{tabular}{lll}
\preml{a}
\conl{b}
\end{tabular}
\end{document}
我确信这个问题一定有答案,但这超出了我的知识范围。
答案1
在该包的帮助下,tabularray
您可以访问每个表行的行号,还可以确保在最后一行上方自动绘制一条水平线:
\documentclass{article}
\usepackage{tabularray}
\begin{document}
\begin{tblr}{colspec={>{(\arabic{rownum})\enspace}ll}, hline{Y}}
a & b \\
a & b \\
a & b \\
a & b \\
a & b \\
a & b \\
\end{tblr}
\end{document}
答案2
您可以{NiceTabular}
使用nicematrix
和 Tikz 来实现这一点。
\documentclass{article}
\usepackage{nicematrix,tikz}
\begin{document}
\begin{NiceTabular}
[code-after = { \tikz \draw (\arabic{iRow}-|1) -- (\arabic{iRow}-|last) ; } ]
{>{(\arabic{iRow})\enspace}ll}
a & b \\
a & b \\
a & b \\
a & b \\
a & b \\
a & b \\
\end{NiceTabular}
\end{document}
您需要多次编译(因为nicematrix
在后台使用 PGF/Tikz 节点)。