有没有办法动态计算列数?

有没有办法动态计算列数?

我有以下内容,

\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 节点)。

上述代码的输出

相关内容