如何在表规范中使用命令,并且仍然支持数组包?

如何在表规范中使用命令,并且仍然支持数组包?

对于一个包,我想编写创建表的代码,其中表的确切类型是可配置的(tabular,,,...longtabletabularx[更新:David 正确地指出,像这样的格式tabularx将更难以可配置的方式使用,因为它们需要更多的参数]),其中列数由程序决定(因此表格规范如是l|l计算的;细节在这里并不重要)。以下简单代码适用于 LaTeX 表格:

\def\mytablespec{l|l}
\def\mytabletype{tabular}
\begin{\mytabletype}{\mytablespec}
1 & 2 \\\hline
3 & 4 \\
\end{\mytabletype}

但是,如果array加载了该包,代码就会失败并出现错误

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

问题是array没有扩展表规格。可以按如下方式强制执行此操作:

\def\mytablespec{l|l}
\expandafter\tabular\expandafter{\mytablespec}
1 & 2 \\\hline
3 & 4 \\
\endtabular

无论有没有array包,此代码都可以工作。但是,此代码不再使用命令来定义表类型。我没能\expandafter与结合使用\begin{\mytabletype}...\end{\mytabletype}。但是,下面的代码似乎有效:

\expandafter\csname\expandafter\mytabletype\expandafter\endcsname\expandafter{\mytablespec}
1 & 2 \\\hline
3 & 4 \\
\csname end\mytabletype\endcsname

[更新:David 指出,以下更简单的版本也有效:

\csname\mytabletype\expandafter\endcsname\expandafter{\mytablespec}
1 & 2 \\\hline
3 & 4 \\
\csname end\mytabletype\endcsname

]

除了相当丑陋之外,这还假设像tabular和 这样的环境longtable总是提供两个相应的命令,例如\tabular\endtabular。这似乎对于许多软件包都是这种情况,但我找不到是否有普遍的原因。

这是解决这个问题的正确方法吗?有没有更干净/更简单的解决方案?通常,如果array加载,表格的行为会发生很大变化(它还会以不兼容的方式修改表格宽度计算);有没有更通用的方法可以使软件包对这些事情具有鲁棒性?

答案1

你有足够多\expandafter的东西

\csname\mytabletype\expandafter\csname\expandafter{\mytablespec}

适用于这种 \mytabletype tabular情况,尽管我不确定您的实际代码如何应对不同的参数结构,特别是tabular{ *xy} 采取了宽度参数tabular*并且longtable不采取。

不必担心其他更改的最佳方法array是添加\RequirePackage{array}array自 1993 年 2e 问世以来,该软件包一直是核心 LaTeX 发行版的一部分,它不属于格式的唯一原因是为了避免影响为 LaTeX 2.09 编写的表格,但这不应影响使用正在构建的新软件包的文档。

相关内容