仍在努力学习这些宏。有人能告诉我为什么这不起作用吗?
该宏\mycline{n-n}
应该扩展为\cmidrule{1-1} ... \cmidrule{n-n}
,但是在下面的代码中我收到多个错误。
\documentclass{article}
\usepackage{pgfplotstable}
\usepackage{booktabs}
\def\mycline(#1-#2){
\xdef\MC{}%
\foreach \a in {#1,...,#2}{%
\toks0=\expandafter{\MC}%
\def\temp{\cmidrule\expandafter{\a\expandafter-\a}}%
\xdef\MC{\the\toks0 \temp}%
}
\MC
}
\begin{document}
\begin{tabular}{llll}
1&2&3&4\\ \mycline{1-3}
5&6&7&8\\
\end{tabular}
\end{document}
答案1
正如约瑟夫所说,没有必要说
\cmidrule{1-1}\cmidrule{2-2}\cmidrule{3-3}
因为效果和说
\cmidrule{1-3}
如果你想使用“缩短”功能\cmidrule
并生成
\cmidrule(lr){1-1}\cmidrule(lr){2-2}\cmidrule(lr){3-3}
然后您可以在 a 中进行计算\noalign
并给出结果:
\documentclass{article}
\usepackage{pgffor}
\usepackage{booktabs}
\makeatletter
\def\mycline(#1-#2){\noalign{
\gdef\@mycline{}%
\foreach \a in {#1,...,#2}{%
\edef\@tempa{\noexpand\cmidrule(lr){\a-\a}}%
\expandafter\g@addto@macro\expandafter\@mycline\expandafter{\@tempa}%
}}
\@mycline
}
% the macro
\begin{document}
\begin{tabular}{llll}
1&2&3&4\\ \mycline(1-3)
5&6&7&8\\
\end{tabular}
\end{document}
请注意以下几点:
你必须
\noexpand\cmidrule
说\edef
使用
\g@addto@macro
是一种更经济的方式,可以向无参数宏添加标记使用
@
诸如“\@mycline
比\MC
这更好”之类的命令可能会破坏一些已经存在的宏使用
\noalign
确保工作在“任何对齐单元之外”完成
答案2
之后\\
(除其他内容外,还扩展到\cr
结束表格行的基元,TeX 向前看仅使用扩展要查看表格单元格是否需要特殊处理,具体来说,它会查找\noalign
\span
或omit
。一旦找到不属于这些之一的不可扩展标记,它就会停止并正常处理单元格。
因此,如果您将其放在\mycline
一行的开头,它将扩展一个级别,然后看到的下一个标记是\xdef
不可扩展的,因此在此之后不可能有任何跨越条目(这是\cline
\cmidrule
\multicolumn
和其他类似构造所需要的)。
如果您查看这些内容在表格包中是如何编码的,您会发现它们要么必须纯粹通过扩展来工作(因此没有\xdef
或foreach
等),要么必须启动\noalign
,在的本地范围内进行所有计算,然后在完成\noalign
后全局插入可扩展命令以跨越列。\noalign