设计可防止表格中出现 \hline 的命令?

设计可防止表格中出现 \hline 的命令?

我正在尝试设计一个自定义tabular的环境,其具有以下特点(其中包括): -所有表格行之间
都有自动功能; - 为用户提供一个命令,比如,当输入\hline
\nohline一开始行,阻止\hline输入上述内容。

例如

\begin{mytabular}
a & b \\ c & d \\ \nohline e & f
\end{mytabular}

应该相当于

\begin{tabular}
\hline a & b \\ \hline c & d \\ e & f
\end{tabular}

(请注意,我确实希望宏\nohline以这种方式运行,原因不在这里讨论 - 本质上:与已编写代码的兼容性和样式表的可替代性。另外,我知道这很难做到,这就是我首先来到 TeX.SX 的原因 - 如果这只是“使用这样或那样的包”的问题,那么我可以自己处理!所以,如果您只能说“我不喜欢这个问题”,那么请继续下一个问题。谢谢。)

\noalign我尝试了一下\everycr:我的基本想法是这样的

\def\everycr{\futurelet\token\oneline}
\def\oneline{\ifx\token\nohline\else\hline\fi}
\def\nohline{}

问题在于,\noalign在 的扩展中找到的\hline必须紧跟在\cr 在词汇层面,因此\futurelet不会被丢弃,从而引发“放错位置\noalign”的错误。

\noalign{还有其他方法可以使...块的内容}依赖于宏的存在\nohline吗?

答案1

这是使用大批包裹。

\documentclass{article}
\usepackage{array}

\makeatletter
\let\realarraycr\@arraycr% save original
\newcommand\mytabularnewline{\realarraycr\myhline\global\let\myhline\hline}
\newcommand\nohline{\global\let\myhline\relax}% \myhline does nothing
\newenvironment{mytabular}[1]{%
   \let\@arraycr\mytabularnewline% hijack \@arraycr
   \let\myhline\hline% 
   \tabular{#1}\myhline% start a tabular environment
   }{\endtabular}
\makeatother

\begin{document}

  \begin{mytabular}{cc}
    a & b \\  \nohline c & d \\ e & f \\
  \end{mytabular}

\end{document}

包在或环境中每行末尾array调用。其想法是劫持并更改它,以便在每行末尾使用 。默认情况下,与 相同,但将其更改为。\@arrayrtabulararray\@arraycr\myhline\myhline\hline\nohline\relax

输出如下:

在此处输入图片描述

tabular由于我在后台使用环境,因此mytabular环境采用一个指定列数及其对齐方式的参数。

如果不加载包,做类似的事情可能并不困难array

答案2

在这里回答我自己的问题。一个解决方案(肮脏的)是:

  • 首先扫描行首的标记,
  • 一旦完成,如果我们必须绘制一个\hline,那么我们重新发出一个新的\cr以返回到行首,并添加一个新的\noalign以插入一些负垂直粘连以返回到先前的位置(我认为这里-\normalbaselineskip是正确的量)。

以下是对我有用的示例代码。请注意,由于colortbl已加载包(我必须拥有它),因此这会产生一些细微的变化:即\CT@everycr替换\everycr,并且我还必须保留\CT@row@color

\documentclass{article}
\usepackage{colortbl,booktabs,lipsum}

\makeatletter
\def\fakenoalign#1{%
  \global\CT@everycr{}%
  \cr\noalign{\vskip-\normalbaselineskip}#1%
  \global\CT@everycr{\futurenonspacelet\token\oneline}%
}
\def\oneline{%
  \ifx\token\merge\relax\else
  \ifx\token\header\fakenoalign\toprule \else
  \ifx\token\end\fakenoalign{\bottomrule\noalign{\vskip-\normalbaselineskip}} 
  \else
  \fakenoalign\midrule\fi\fi\fi
\ignorespaces}
\def\makeunique#1{\def#1{\let#1#1\ignorespaces}\ignorespaces}

\newenvironment{tableau}{%
  \let\CT@row@color\relax
  \makeunique\header
  \makeunique\merge
  \global\CT@everycr{\futurenonspacelet\token\oneline}%
  \begin{tabular}%
}{\global\CT@everycr{}\end{tabular}%
  \CT@everycr{\noalign{\global\let\CT@row@color\relax}\the\everycr}%
}
\makeatother


\begin{document}

\lipsum[1]
\begin{tableau}{ll}
\header 1&2\\ a&b\\\merge c&d\\
\end{tableau}
\lipsum[1]
\begin{tabular}{ll}
\toprule 1 & 2\\ \midrule a & b\\ c & d\\\bottomrule
\end{tabular}
\lipsum[1]
\end{document}

相关内容