这个 TeX 宏有什么问题

这个 TeX 宏有什么问题

仍在努力学习这些宏。有人能告诉我为什么这不起作用吗?

该宏\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}

在此处输入图片描述

请注意以下几点:

  1. 你必须\noexpand\cmidrule\edef

  2. 使用\g@addto@macro是一种更经济的方式,可以向无参数宏添加标记

  3. 使用@诸如“\@mycline\MC这更好”之类的命令可能会破坏一些已经存在的宏

  4. 使用\noalign确保工作在“任何对齐单元之外”完成

答案2

之后\\(除其他内容外,还扩展到\cr结束表格行的基元,TeX 向前看仅使用扩展要查看表格单元格是否需要特殊处理,具体来说,它会查找\noalign \spanomit。一旦找到不属于这些之一的不可扩展标记,它就会停止并正常处理单元格。

因此,如果您将其放在\mycline一行的开头,它将扩展一个级别,然后看到的下一个标记是\xdef不可扩展的,因此在此之后不可能有任何跨越条目(这是\cline \cmidrule \multicolumn和其他类似构造所需要的)。

如果您查看这些内容在表格包中是如何编码的,您会发现它们要么必须纯粹通过扩展来工作(因此没有\xdefforeach等),要么必须启动\noalign,在的本地范围内进行所有计算,然后在完成\noalign后全局插入可扩展命令以跨越列。\noalign

相关内容