我正在尝试设计一个自定义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
调用。其想法是劫持并更改它,以便在每行末尾使用 。默认情况下,与 相同,但将其更改为。\@arrayr
tabular
array
\@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}