自动表格单元格切换

自动表格单元格切换

现在我想通过计数自动切换列和行。我已经将问题归结为对齐字符&

\newcounter{myRow}
\newcounter{myCol}[myRow]
\setcounter{myRow}{1}
\setcounter{myCol}{1}

\newcommand{\testcell}{%
  \fbox{\themyRow, \themyCol}%
  \ifnum\value{myCol}<3%
    &%
  \else%
    \refstepcounter{myRow}%
    \tabularnewline%
  \fi%
  \refstepcounter{myCol}%
}

\newcommand{\testcelltwo}{%
  \fbox{\themyRow, \themyCol}%
  \ifnum\value{myCol}<3%
%     &% (This is the only difference to \testcell)
  \else%
    \refstepcounter{myRow}%
    \tabularnewline%
  \fi%
  \refstepcounter{myCol}%
}

\begin{document}%
  % This raises "incomplete ifnum" errors and looks broken
  \begin{tabular}{lll}
    \testcell \testcell \testcell \testcell \testcell \testcell
  \end{tabular} \par
  % This works fine
  \begin{tabular}{lll}
    \testcelltwo & \testcelltwo & \testcelltwo \testcelltwo & \testcelltwo & \testcelltwo
  \end{tabular}
\end{document}

如何解决这个问题?通常的资料只是试图教我如何正确使用表格环境。

答案1

当条件已经结束时,您必须发出&or ;通常的技巧是使用and 。\tabularnewline\@firstoftwo\@secondoftwo

\documentclass{article}
\newcounter{myRow}
\newcounter{myCol}[myRow]
\setcounter{myRow}{1}
\setcounter{myCol}{1}

\makeatletter
\newcommand{\testcell}{%
  \fbox{\themyRow, \themyCol}%
  \ifnum\value{myCol}<3
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {&\refstepcounter{myCol}}%
  {\refstepcounter{myRow}\tabularnewline\refstepcounter{myCol}}%
}
\makeatother

\begin{document}
\begin{tabular}{lll}
\testcell \testcell \testcell \testcell \testcell \testcell
\end{tabular}
\end{document}

在此处输入图片描述

%注意:的定义中的一个\testcell是多余的。练习:哪一个?


关于这个技巧的一些说明。如果条件为真,\ifnum则比较所需的标记将被删除,留下

\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi
{&\refstepcounter{myCol}}{\refstepcounter{myRow}\tabularnewline\refstepcounter{myCol}}

在输入流中。现在\expandafter扩展\else,在吞噬了包括匹配的 在内的所有内容后,其扩展为空\fi,剩下

\@firstoftwo{&\refstepcounter{myCol}}{\refstepcounter{myRow}\tabularnewline\refstepcounter{myCol}}

然后变成

&\refstepcounter{myCol}

如果条件为假,则比较的标记将被删除,但会连同直到和包括在内的所有内容一起删除\else,因此在输入流中我们有

\expandafter\@secondoftwo\fi
{&\refstepcounter{myCol}}{\refstepcounter{myRow}\tabularnewline\refstepcounter{myCol}}

现在\expandafter展开\fi,其展开式为空,剩下

\@secondoftwo{&\refstepcounter{myCol}}{\refstepcounter{myRow}\tabularnewline\refstepcounter{myCol}}

进而

\refstepcounter{myRow}\tabularnewline\refstepcounter{myCol}

如预期的。

老实说,%定义中还有其他多余的,但这只是因为我们在 中tabular,所以省略它们不够通用。多余的是%后面两个括号组之间的\fi,因为 TeX 在查找未分隔的参数时会丢弃空格。

相关内容