我有以下内容,
\documentclass[margin=0.1cm, varwidth]{standalone}
\ExplSyntaxOn
\NewDocumentCommand\tbl{mmm} {
\begin{table}[hbtp]
\begin{tabular}{ ||*{5}{c|}| } \hline
#2
\end{tabular}
\caption{#1}\label{#3}
\end{table}
}
\ExplSyntaxOff
\begin{document}
\tbl{Symbols table.}{
This & That & Who & What & Why \\ \hline
1 & 2 & 3 & 4 & 5 \\ \hline
1 & 2 & 3 & 4 & 5 \\ \hline
}{symb}
\end{document}
它可以工作,但请注意,目前我已经在命令中对列数进行了硬编码,即{ ||*{5}{c|}| }
。可以使用 以某种方式动态计算吗#2
?也许计算“&”符号加一?
答案1
如果你放弃双垂直规则,这很容易:
\documentclass{article}
\NewDocumentCommand\tbl{mmm}{%
\begin{table}[hbtp]
\centering
\begin{tabular}{ |*{100}{c|} } \hline
#2
\end{tabular}
\caption{#1}\label{#3}
\end{table}
}
\begin{document}
\tbl{Symbols table.}{
This & That & Who & What & Why \\ \hline
1 & 2 & 3 & 4 & 5 \\ \hline
1 & 2 & 3 & 4 & 5 \\ \hline
}{symb}
\tbl{Symbols table.}{
This & That & Who & What \\ \hline
1 & 2 & 3 & 4 \\ \hline
1 & 2 & 3 & 4 \\ \hline
}{symb2}
\end{document}
只需指定大量的列。
但是,语法是错误的:标签确实很难看清,应该是一个可选参数。当然,假设这样做比输入整个要好\begin{table}...\end{table}
(我认为不是)。
如果您喜欢垂直规则并且非常喜欢双线规则,那么您必须预处理表体才能找到列数。
\documentclass{article}
\ExplSyntaxOn
\NewDocumentCommand\tbl{mom}
{
\begin{table}[hbtp]
\centering
\scribe_tbl:n { #3 }
\caption{#1}
\IfValueT{#2}{\label{#2}}
\end{table}
}
\seq_new:N \l__scribe_tbl_body_seq
\seq_new:N \l__scribe_tbl_row_seq
\int_new:N \l__scribe_tbl_cols_int
\cs_new_protected:Nn \scribe_tbl:n
{
\seq_set_split:Nnn \l__scribe_tbl_body_seq { \\ } { #1 }
\seq_pop_right:NN \l__scribe_tbl_body_seq \l_tmpa_tl
\tl_if_empty:NF \l_tmpa_tl { \seq_put_right:NV \l__scribe_tbl_body_seq \l_tmpa_tl }
\int_zero:N \l__scribe_tbl_cols_int
\seq_map_inline:Nn \l__scribe_tbl_body_seq
{
\seq_set_split:Nnn \l__scribe_tbl_row_seq { & } { ##1 }
\int_set:Nn \l__scribe_tbl_cols_int
{
\int_max:nn { \l__scribe_tbl_cols_int } { \seq_count:N \l__scribe_tbl_row_seq }
}
}
\begin{tabular}{ ||*{\l__scribe_tbl_cols_int}{c|}| }
\hline
\seq_use:Nn \l__scribe_tbl_body_seq { \\ \hline }
\\ \hline
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\tbl{Symbols table.}[symb]{
This & That & Who & What & Why \\
1 & 2 & 3 & 4 & 5 \\
1 & 2 & 3 & 4 & 5 \\
}
\tbl{Symbols table.}[symb2]{
This & That & Who & What \\
1 & 2 & 3 & 4 \\
1 & 2 & 3 & 4
}
\end{document}
您会发现,您还可以简化输入,避免使用所有\hline
命令。但是,输出在印刷上当然是有争议的。
大家都喜欢
答案2
这是一个{NiceTabular}
使用 的解决方案nicematrix
。
\documentclass{article}
\usepackage{nicematrix,tikz}
\NewDocumentCommand\tbl{mmm}{%
\begin{table}[hbtp]
\centering
\begin{NiceTabular}{ |*{20}{c|} } \hline
#2
\CodeAfter
\begin{tikzpicture}
\draw ([xshift=2pt]1-|1) -- ([xshift=2pt]last-|1) ;
\draw ([xshift=-2pt]1-|last) -- ([xshift=-2pt]last-|last) ;
\end{tikzpicture}
\end{NiceTabular}
\caption{#1}\label{#3}
\end{table}
}
\begin{document}
\tbl{Symbols table.}{
This & That & Who & What & Why \\ \hline
1 & 2 & 3 & 4 & 5 \\ \hline
1 & 2 & 3 & 4 & 5 \\ \hline
}{symb}
\tbl{Symbols table.}{
This & That & Who & What \\ \hline
1 & 2 & 3 & 4 \\ \hline
1 & 2 & 3 & 4 \\ \hline
}{symb2}
\end{document}
您需要多次编译(因为nicematrix
在后台使用 PGF/Tikz 节点)。