我正在尝试组装一个在整个文档中多次出现的表。它总是由一些固定的列组成,后面跟着一组出现在一个表中但在另一个表中不需要的列。有人告诉我,使用 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}