![如何将宏扩展为表格头?](https://linux22.com/image/235100/%E5%A6%82%E4%BD%95%E5%B0%86%E5%AE%8F%E6%89%A9%E5%B1%95%E4%B8%BA%E8%A1%A8%E6%A0%BC%E5%A4%B4%EF%BC%9F.png)
我希望能够定义一个可以在表格定义中使用的宏。我该怎么做?
这不起作用:
\documentclass{article}
\begin{document}
\gdef\buildtabularhead{|||}
\begin{tabular}{\buildtabularhead}
1 & 2 &3\\
\end{tabular}
\end{document}
答案1
这可能不切实际,但它是一个很好的演示,\expandafter
并解决了包中表格序言中的宏问题array
。
\documentclass{article}
\usepackage{array}
\begin{document}
\def\buildtabularhead{|c|c|c|}
\expandafter\tabular\expandafter{\buildtabularhead}
1 & 2 &3\\
\endtabular
\end{document}
两个\expandafter
s 确保宏\buildtabularhead
被展开前LaTeX 知道它应该期待一个前言。还请注意,我必须使用...tabular
而不是\begin{tabular}
... 。在内部,前者与后者的作用相同,但用一个组包围它并进行重要的检查,包括正确的嵌套(参见 source2e 第 54.1 节)。\end{tabular}
\tabular
\endtabular
答案2
最好使用包将其定义为新的列类型array
:
\documentclass{article}
\usepackage{array}
\newcolumntype{L}{|l|l|l|}
\begin{document}
\begin{tabular}{L}
1 & 2 &3\\
\end{tabular}
\end{document}
答案3
我的答案很不雅,但我在阅读该array
包的文档时找到了下面的解决方案。特别是,这是从*
那里如何定义列说明符中获得的启发。
这个想法是引入新的列类型\expand
(\newcolumntype
设置大部分必要的成分),然后重新定义\NC@rewrite@\expand
以扩展下一个标记\expandafter
,然后继续array
当时正在执行的操作(即查找用户定义的列类型并用其定义替换它们)。
\documentclass{article}
\usepackage{array}
\makeatletter
\newcolumntype{\expand}{}
\long\@namedef{NC@rewrite@\string\expand}{\expandafter\NC@find}
\makeatother
\begin{document}
\def\mypream{c|*{2}{c|||}}
\begin{tabular}{c\expand\mypream cc}
a & b & d &e & f & apsdoi \\
cde & def & erasd &arp & sefoi & wp
\end{tabular}
\end{document}
答案4
您用作示例的列定义无效。它仅指定行,没有实际的列。如果您将其更改为类似内容,它\gdef\buildtabularhead{|c|c|c|}
会按预期工作。