\toks 寄存器扩展问题 - 或者是它?

\toks 寄存器扩展问题 - 或者是它?

我正在尝试组装一个在整个文档中多次出现的表。它总是由一些固定的列组成,后面跟着一组出现在一个表中但在另一个表中不需要的列。有人告诉我,使用 toks 寄存器来做这件事是个好主意。我从来没有听说过这些,所以我试图弄清楚如何在我的情况下使用它们。(顺便说一句,有没有关于这些东西的好的在线文档?)从各种例子中,我拼凑出了这段代码:

\documentclass{article}

\newtoks\toksA
\newtoks\toksB
\newtoks\toksC
\newtoks\toksD

\newcommand*{\leadingcolumns}{
\toksA={ foo & bar }
\toksB={ Foo & Bar }
\toksC={ fOo & bAr }
\toksD={ foO & baR }
}

\newcommand*{\numbercolumn}{
\toksA=\expandafter{\the\toksA & 1 }
\toksB=\expandafter{\the\toksB & 2 }
\toksC=\expandafter{\the\toksC & 3 }
\toksD=\expandafter{\the\toksD & 4 }
}

\newcommand*{\charactercolumn}{
\toksA=\expandafter{\the\toksA & W }
\toksB=\expandafter{\the\toksB & X }
\toksC=\expandafter{\the\toksC & Y }
\toksD=\expandafter{\the\toksD & Z }
}

\newcommand{\printtable}{
\the\toksA \tabularnewline
\the\toksB \tabularnewline
\the\toksC \tabularnewline
\the\toksD \tabularnewline
}

\begin{document}

all columns:

\begin{tabular}{llll}
  \leadingcolumns
  \charactercolumn
  \numbercolumn
  \printtable
\end{tabular}

characters only:

\begin{tabular}{lll}
  \leadingcolumns
  \charactercolumn
  \printtable
\end{tabular}

numbers only:

\begin{tabular}{lll}
  \leadingcolumns
  \numbercolumn
  \printtable
\end{tabular}

\end{document}

虽然这基本上满足了我的要求,但它只打印出每个表的第一行。我做错了什么?

答案1

您正在分配表的第一个单元格中的寄存器,该单元格是本地组。在这里使用寄存器实际上不会比使用宏获得任何好处,但是如果您想这样做,则需要在表之前分配它们(就像您使用宏一样):

\documentclass{article}

\newtoks\toksA
\newtoks\toksB
\newtoks\toksC
\newtoks\toksD

\newcommand*{\leadingcolumns}{
\toksA={ foo & bar }
\toksB={ Foo & Bar }
\toksC={ fOo & bAr }
\toksD={ foO & baR }
}

\newcommand*{\numbercolumn}{
\toksA=\expandafter{\the\toksA & 1 }
\toksB=\expandafter{\the\toksB & 2 }
\toksC=\expandafter{\the\toksC & 3 }
\toksD=\expandafter{\the\toksD & 4 }
}

\newcommand*{\charactercolumn}{
\toksA=\expandafter{\the\toksA & W }
\toksB=\expandafter{\the\toksB & X }
\toksC=\expandafter{\the\toksC & Y }
\toksD=\expandafter{\the\toksD & Z }
}

\newcommand{\printtable}{
\the\toksA \tabularnewline
\the\toksB \tabularnewline
\the\toksC \tabularnewline
\the\toksD \tabularnewline
}

\begin{document}

all columns:


  \leadingcolumns
  \charactercolumn
  \numbercolumn
\begin{tabular}{llll}
  \printtable
\end{tabular}

characters only:

  \leadingcolumns
  \charactercolumn
\begin{tabular}{lll}
  \printtable
\end{tabular}

numbers only:

  \leadingcolumns
  \numbercolumn
\begin{tabular}{lll}
  \printtable
\end{tabular}

\end{document}

相关内容