动态创建新的数组列类型

动态创建新的数组列类型

我正在评估 toks 寄存器的各种用途 - 它们对我来说仍然很新。我正在使用它们按列构建表。在此期间,我遇到了一个我未能找到解决方案的问题。请考虑以下示例:

\documentclass{article}
\usepackage{array}
\usepackage{longtable}

\newtoks\toksFormat
\newtoks\toksLine

\toksFormat = {lcr}
\toksLine   = {first & second & third}

\begin{document}

  % this works
  \newcolumntype{X}{clr}
  \begin{longtable}{|X|}
    \hline
    \the\toksLine \tabularnewline
    \hline
  \end{longtable}

  % this doesn't
  \newcolumntype{X}{\the\toksFormat}
  \begin{longtable}{|X|}
    \hline
    \the\toksLine \tabularnewline
    \hline
  \end{longtable}

\end{document}

正如软件包文档array所述,我们非常小心地不去评估序言。我想这就是导致第二个表中出现错误消息的原因:

! Package array Error:  Illegal pream-token (\the): `c' used.

我不确定这是否是个array问题,它可能只是一些我(还)不知道的简单的 TeX 魔法。是否有可能\the\toksFormat在调用中强制扩展\newcolumntype

答案1

\edef\tmp{\noexpand\newcolumntype{X}{\the\toksFormat}}
\tmp

但在这里使用寄存器确实没有什么好处。

答案2

是的,你必须扩展。这里有几个技巧(我#{从 Heiko Oberdiek 那里学到了一个)。

\documentclass{article}
\usepackage{array}

\makeatletter
\def\enewcolumntype#1#2#{\@enewcolumntype{#1}{#2}}
\def\@enewcolumntype#1#2#3{%
  \begingroup\edef\x{\endgroup
    \unexpanded{\newcolumntype{#1}#2}{#3}}\x
}
\makeatother

\newtoks\toksFormat
\newtoks\toksLine

\toksFormat = {lcr}
\toksLine   = {first & second & third}

\begin{document}

\enewcolumntype{X}{\the\toksFormat}
\begin{tabular}{|X|}
\hline
\the\toksLine \tabularnewline
\hline
\end{tabular}

\toksFormat = {lp{#1}r}

\enewcolumntype{X}[1]{\the\toksFormat}
\begin{tabular}{|X{5cm}|}
\hline
\the\toksLine \tabularnewline
\hline
\end{tabular}

\end{document}

在此处输入图片描述

相关内容