我正在使用自定义命令来格式化文档中的所有表格。有些表格除了样式之外还共享其他属性,例如列定义和标题,这就是为什么这个答案激励我进一步减少重复代码。
将标题数据插入表命令不会导致任何问题,而对于插入列定义,我必须在插入之前找出如何扩展列定义。\expandafter
解决了该问题。
现在,我想将以命令形式给出的参数和以文字形式给出的其他参数(例如表的数据)组合起来。如果包含列定义的待扩展命令恰好是第一个参数,那么这可以正常工作。如果相反文字是第一个参数,我需要做什么?如何绕过\expandafter
一对花括号而不是命令?
\documentclass{article}
\usepackage{booktabs}
\begin{document}
\newcommand{\colDef}{{cc}}
\newcommand{\tableBody}{a & b\\}
\newcommand{\myTabA}[2]{%
\begin{tabular}{#1}
1 & 2\\\midrule
#2
\end{tabular}
}
%same command with #1 and #2 switched
\newcommand{\myTabB}[2]{%
\begin{tabular}{#2}
1 & 2\\\midrule
#1
\end{tabular}
}
%draw table A
\expandafter\myTabA\colDef{\tableBody}
\expandafter\myTabA\colDef{c & d\\}
%draw table B
\expandafter\myTabB\expandafter\tableBody\colDef
%produces error
%\expandafter\myTabB\expandafter{c & d\\}\colDef
\end{document}
答案1
etextools 包提供了一些用于执行此操作的工具,例如
\ExpandNextTwo{code}{arg 1}{arg 2}
如下所示:
\documentclass{article}
\usepackage{booktabs}
\usepackage{etextools}
\begin{document}
\newcommand{\colDef}{{cc}}
\newcommand{\tableBody}{a & b\\}
\newcommand{\myTabA}[2]{%
\begin{tabular}{#1}
1 & 2\\\midrule
#2
\end{tabular}
}
%same command with #1 and #2 switched
\newcommand{\myTabB}[2]{%
\begin{tabular}{#2}
1 & 2\\\midrule
#1
\end{tabular}
}
%draw table A
\expandafter\myTabA\colDef{\tableBody}
\expandafter\myTabA\colDef{c & d\\}
%draw table B
\expandafter\myTabB\expandafter\tableBody\colDef
% no longer produces error
\ExpandNextTwo{\myTabB}{c & d\\} \colDef
\end{document}
答案2
将扩展控制推送到宏中会更简单,因此它总是扩展一次的第一个标记,那么您在文档中#2
就不需要了。\expandafter
\documentclass{article}
\usepackage{booktabs}
\begin{document}
\newcommand{\colDef}{{cc}}
\newcommand{\tableBody}{a & b\\}
\newcommand{\myTabA}[2]{%
\begin{tabular}{#1}
1 & 2\\\midrule
#2
\end{tabular}
}
%same command with #1 and #2 switched
\newcommand{\myTabB}[2]{%
\def\temp{\begin{tabular}}%
\expandafter\temp\expandafter{#2}
1 & 2\\\midrule
#1
\end{tabular}
}
%draw table A
\expandafter\myTabA\colDef{\tableBody}
\expandafter\myTabA\colDef{c & d\\}
%draw table B
\myTabB\tableBody\colDef
%produces error (not now!)
\myTabB{c & d\\}\colDef
\end{document}
答案3
我最终使用了etextools
表格定义中的一个命令,从而从所有答案中得出。
\newcommand{\myTabB}[2]{%
\expandnext{
\begin{tabular}}{#2}
1 & 2\\\midrule
#1
\end{tabular}
}