基于我在这里提出的第一个问题的 MWE(使用标记列表构建表格内容时单元格中的额外空间),我想添加多列内容和 \toprule(\midrule、\bottomrule 等),但以下代码不起作用。我怀疑这是我对扩展理解不够的问题。我需要如何更改 \myrow 和 \myline 的定义?
\documentclass{article}
\usepackage{booktabs}
\makeatletter
\newtoks\@tabtoks
\newcommand\addtabtoks[1]{\global\@tabtoks\expandafter{\the\@tabtoks#1}}
\newcommand\eaddtabtoks[1]{\edef\mytmp{#1}\expandafter\addtabtoks\expandafter{\mytmp}}
\newcommand*\resettabtoks{\global\@tabtoks{}}
\newcommand*\printtabtoks{\the\@tabtoks}
\makeatother
\newcommand{\topic}[2]{%
\eaddtabtoks{Col 1 & Col 2 & Col 3 & #1 & #2}%
\addtabtoks{\\}%
\ignorespaces
}
\newcommand{\myline}{%
\addtabtoks{\toprule}%
}
\newcommand{\myrow}[1]{%
\eaddtabtoks{\multicolumn{5}{c}{#1}}
\addtabtoks{\\}%
\ignorespaces
}
\newenvironment{mytabular}{%
\resettabtoks
\noindent
\tabular{llrrl}
}{%
\printtabtoks
\endtabular
}
\begin{document}
\begin{mytabular}
\myrow{all five}
\myline
\topic{1.1}{LaTeX}
\topic{1.2}{causes}
\topic{1.3}{me}
\topic{1.4}{lots}
\topic{1.5}{of}
\topic{1.6}{frustration}
\end{mytabular}
\end{document}
答案1
我做了两件事。我\multicolumn
以 为前缀\noexpand
,这样\multicolumn
token 就不会被 扩展。然后,虽然我不能 100% 确定为什么这是必要的,但我认为这是最安全的方法,我在环境的关闭端\eaddtabtoks
执行了 complete 。tabular
我对此的必要性进行假设是,正如最初提出的,Cell(1,1) 有很多非打印计算,后面跟着一个\multicolumn
。我重新设计的方式是,所有这些非打印计算都在tabular
开始之前发生。我猜\multicolumn
必须作为单元格的第一个标记出现,否则会受到所有初步计算的影响(注意:我所说的计算是确定要添加哪些标记\@tabtoks
以及创建)。我认为可以通过尝试使用我的工作解决方案来证明这一理论,通过在标记前添加看似无害的\@tabtoks
来更改定义。它以完全相同的方式中断,这似乎表明不能在非打印计算之前进行。\myrow
\relax
\multicolumn
\multicolumn
另外,我发现你需要%
在行尾加上一个\multicolumn
。
\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{booktabs}
\makeatletter
\newtoks\@tabtoks
\newcommand\addtabtoks[1]{\global\@tabtoks\expandafter{\the\@tabtoks#1}}
\newcommand\eaddtabtoks[1]{\edef\mytmp{#1}\expandafter\addtabtoks\expandafter{\mytmp}}
\newcommand*\resettabtoks{\global\@tabtoks{}}
\newcommand*\printtabtoks{\the\@tabtoks}
\newcommand{\topic}[2]{%
\eaddtabtoks{Col 1 & Col 2 & Col 3 & #1 & #2}%
\addtabtoks{\\}%
\ignorespaces
}
\newcommand{\myline}{%
\addtabtoks{\toprule}%
}
\newcommand{\myrow}[1]{%
\eaddtabtoks{\noexpand\multicolumn{5}{c}{#1}}%
\addtabtoks{\\}%
\ignorespaces
}
\newenvironment{mytabular}{%
\resettabtoks
\noindent
}{%
\begin{tabular}{llrrl}
\printtabtoks
\end{tabular}
}
\makeatother
\begin{document}
\begin{mytabular}
\myrow{all five}
\myline
\topic{1.1}{LaTeX}
\topic{1.2}{causes}
\topic{1.3}{me}
\topic{1.4}{lots}
\topic{1.5}{of}
\topic{1.6}{frustration}
\end{mytabular}
\end{document}
作为后续,请注意, (出现在和\eaddtabtoks
的定义中)的两个调用都可以更改为[非扩展] (如果您消除我插入的)。这是因为和已经作为实际参数标记插入。可能还有其他原因(未在 MWE 中显示)导致您更愿意扩展或不扩展和的参数,但总的来说,我认为\topic
\myrow
\addtabtoks
\noexpand
#1
#2
\topic
\myrow
不是提前扩大规模更为安全。
这是一个破坏版本\eaddtabtoks
但适用于该\addtabtoks
版本的示例:
\newcounter{step}
\begin{mytabular}
\myrow{all five}
\myline
\topic{1.\thestep}{LaTeX\stepcounter{step}}
\topic{1.\thestep}{causes\stepcounter{step}}
\topic{1.\thestep}{me\stepcounter{step}}
\topic{1.\thestep}{lots\stepcounter{step}}
\topic{1.\thestep}{of\stepcounter{step}}
\topic{1.\thestep}{frustration\stepcounter{step}}
\end{mytabular}