我想创建一个新的命令来制作表格,命令中的参数将填充表格

我想创建一个新的命令来制作表格,命令中的参数将填充表格

为了制作扑克牌,我需要制作一个 5 x 5 单元格的表格。第一行和第一列始终相同。但其他单元格取决于扑克牌。

因此,最好给出如下命令:\test{3,1,6,1,2,2,3,2,4,3,4,3,5,7,5,4} 来生成表格。

\documentclass{article}
\begin{document}

\newcommand\test[3][]%
{\begin{table}
\begin{tabular}{ c | c | c | c | c }
\hline
 & lente & zomer & herfst & winter \\ 
\hline 
B & 3 & 1 & 6 & 1 \\ 
G & 2 & 2 & #2 & #3 \\ 
D & 4 & 3 & 4 & 3 \\ 
S & 5 & 7 & 5 & 4 \\ 
\hline
\end{tabular}
\end{table}
 }

\test{4}{6} 
\end{document}

我可以使用更多参数来实现这一点,但为什么我必须为只有 2 个值设置 3 个选项?因此我进行了测试:

\newcommand\test[1][]%

\test{4}    

但没用。是什么原因导致的这个问题?谢谢 在此处输入图片描述

答案1

您可能只是误解了命令的构造方式。

\newcommand{<cmd>}[<num>]{<stuff>}

<cmd>创建带有强制参数的宏<num>。因此,\newcommand{\test}[2]{<stuff>}将在引用为和的\test{<first>}{<second>}地方使用。如果您使用<first>#1<stuff><second>#2

\newcommand{<cmd>}[<num>][<something>]{<stuff>}

然后<cmd><num>-1强制的参数,以及单一,可选参数。因此,\newcommand{\test}[2][something]{<stuff>}可以以以下两种方式使用

\test{else} % <------- Single mandatory argument; optional argument will
            %          default to "something". That is, #1={something},
            %          #2={else}.
\test[someone]{else} % Optional + mandatory argument. #1={someone},
                     % #2={else}.

有关命令定义的更多信息,请参阅带有和不带有可选参数的不同命令定义

在你的具体情况下,你需要

\newcommand\test[2]%
  {\begin{tabular}{ c | c | c | c | c }
     \hline
     & lente & zomer & herfst & winter \\ 
     \hline 
     B & 3 & 1 & 6 & 1 \\ 
     G & 2 & 2 & #1 & #2 \\ 
     D & 4 & 3 & 4 & 3 \\ 
     S & 5 & 7 & 5 & 4 \\ 
     \hline
   \end{tabular}%
 }

不需要table浮动环境(就我所知)。另外,考虑使用booktabs为了整洁地tabular表示。

答案2

对于只有 16 个位置的情况,一些蛮力就足够了;对于更长的数据集,更巧妙地拆分列表才是最佳方法。在示例中,我展示了“短”版本和较长版本以供比较。

\documentclass{article}
\usepackage{booktabs}
\usepackage{xparse}

\ExplSyntaxOn
\NewDocumentCommand{\cards}{ m }
 {
  \arne_card_distribution:n { #1 }
 }

\cs_new_protected:Nn \arne_card_distribution:n
 {
  \begin{tabular}{ *{5}{c} }
  \toprule
  & lente & zomer & herfst & winter \\
  \cmidrule{2-5}
  B & \clist_item:nn { #1 } { 1 }
    & \clist_item:nn { #1 } { 2 }
    & \clist_item:nn { #1 } { 3 }
    & \clist_item:nn { #1 } { 4 } \\
  G & \clist_item:nn { #1 } { 5 }
    & \clist_item:nn { #1 } { 6 }
    & \clist_item:nn { #1 } { 7 }
    & \clist_item:nn { #1 } { 8 } \\
  D & \clist_item:nn { #1 } { 9 }
    & \clist_item:nn { #1 } { 10 }
    & \clist_item:nn { #1 } { 11 }
    & \clist_item:nn { #1 } { 12 } \\
  S & \clist_item:nn { #1 } { 13 }
    & \clist_item:nn { #1 } { 14 }
    & \clist_item:nn { #1 } { 15 }
    & \clist_item:nn { #1 } { 16 } \\
  \bottomrule
  \end{tabular}
 }
\ExplSyntaxOff

\begin{document}

\cards{3,1,6,1,2,2,3,2,4,3,4,3,5,7,5,4}

\bigskip

\begin{tabular}{ c | c | c | c | c }
\hline
 & lente & zomer & herfst & winter \\ 
\hline 
B & 3 & 1 & 6 & 1 \\ 
G & 2 & 2 & 3 & 2 \\ 
D & 4 & 3 & 4 & 3 \\ 
S & 5 & 7 & 5 & 4 \\ 
\hline
\end{tabular}

\end{document}

如果您不喜欢这种booktabs方式,那么提供必要的更改应该很容易。

在此处输入图片描述

相关内容