\whileboolexpr 命令在表中生成一个额外的行

\whileboolexpr 命令在表中生成一个额外的行

我使用包\whileboolexpr中的命令etoolbox生成了一个表。但是有一个多余的不需要的行。以下代码有什么问题? 在此处输入图片描述

\documentclass[12pt]{article}

\usepackage{etoolbox}

\begin{document}

\newcounter{row}
\newcounter{rowcount}
\newcommand{\myand}{&}

\newcommand{\mylines}{%
  \setcounter{rowcount}{0}%
  \whileboolexpr{
      test{\ifnumless{\value{rowcount}}{\value{row}}}
  }{%
      \stepcounter{rowcount}%
      Number \myand 1 \myand 2 \myand 3 \\ \hline
  }%
}

\newcommand{\mytable}[1]{
  \setcounter{row}{#1}%
  \begin{tabular}{|c|*{3}{c|}}
    \hline
    \mylines
  \end{tabular}%
}

\mytable{4}

\end{document}

答案1

正如 egreg 所说,LaTeX 在意识到表格已完成之前就开始了下一个单元格。我意识到你的实际应用程序更复杂,但实现 MWE 的一个真正有效的方法是\prg_replicate:nn使用LaTeX3生产:

在此处输入图片描述

代码如下:

\documentclass{article}
\usepackage{expl3}
\ExplSyntaxOn
\newcommand\mytable[1]{%
  \begin{tabular}{|c|*{3}{c|}}\hline
    \prg_replicate:nn {#1} {Number &1&2&3\\\hline}
  \end{tabular}%
}
\ExplSyntaxOff
\begin{document}

  \mytable{4}

\end{document}

编辑

鉴于以下评论,这里有一个更通用的方法,可能更接近所需的方法。它产生

在此处输入图片描述

从输入

  \mytable{
    {\one  &1&2&3},
    {\two  &4&6},
    {\three&1},
    {\four &1&2&2}
  }

其中\one,,\two...是一些随机宏。

\mytable宏接受以逗号分隔的表格行列表。默认情况下,表格有四列,但可以使用可选参数进行更改,例如,\mytable[6]{...}给出一个有六列的表格。这里有一个明显的问题,即“悬空” \hlines。这很容易修复,但由于 OP 没有详细说明实际需要什么,因此如果没有更多信息,就很难做到这一点。出于在书签手动我会删除垂直规则并使用\toprule\bottomrule作为顶部和底部规则,这将解决这个问题并产生:

在此处输入图片描述

代码如下:

\documentclass{article}
\usepackage{expl3}
\usepackage{booktabs}

\ExplSyntaxOn
\clist_new:N \l_table_clist
\newcommand\mytable[2][4]{
  \clist_set:Nn \l_table_clist {#2}
  \begin{tabular}{*{#1}{c}}\toprule
    \clist_use:Nn \l_table_clist {\\\hline}
    \\\bottomrule
  \end{tabular}%
}
\ExplSyntaxOff

\begin{document}

  \newcommand\one{One}
  \newcommand\two{Two}
  \newcommand\three{Three}
  \newcommand\four{Four}
  \mytable{
    {\one&1&2&3},
    {\two& 4&6},
    {\three& 1},
    {\four&1&2&2}
  }

\end{document}

答案2

我每周(有人说是每天)\xintFor的锻炼。

\documentclass[12pt]{article}

\usepackage{xinttools}

\newcommand{\mytable}[1]{
  \begin{tabular}{|c|*{3}{c|}}
    \hline
    \xintFor* ##1 in {\xintSeq{1}{#1}}:
    {%
      Number & 1 & 2 & 3 \\ \hline
    }%
  \end{tabular}%
}

\begin{document}

\mytable{4}

\end{document}

在此处输入图片描述

答案3

您可以生成行代码外部tabular

在此处输入图片描述

\documentclass{article}

\usepackage{etoolbox}

\begin{document}

\newcounter{row}
\newcommand{\myand}{&}

\makeatletter
\newcommand{\mylines}[1]{%
  \setcounter{row}{#1}%
  \def\@mylines{}%
  \whileboolexpr{%
      test{\ifnumless{0}{\value{row}}}%
  }{%
      \addtocounter{row}{-1}%
      \xdef\@mylines{\@mylines \hline
        Number \myand 1 \myand 2 \myand 3 \\
      }%
  }%
}

\newcommand{\mytable}[1]{%
  {\let\hline\relax % Avoid expansion of \hline in \xdef
   \let\\\relax % Avoid expansion of \\ in \xdef
   \mylines{#1}}% This generates \@mylines
  \begin{tabular}{ | c | *{3}{c|} }
    \@mylines \hline % Print \@mylines
  \end{tabular}%
}
\makeatother

\mytable{4}

\end{document}

相关内容