使用标记列表构建的表格内容中的行(规则)和 \multicolumn

使用标记列表构建的表格内容中的行(规则)和 \multicolumn

基于我在这里提出的第一个问题的 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,这样\multicolumntoken 就不会被 扩展。然后,虽然我不能 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}

相关内容