我想知道如何将具有空表格单元格的行高最小化为零,或者以另一种形式提出问题:如何使行的最小高度为零,这样它就会准确地占据我在该行的表格单元格中传递的任何内容的高度,无论它有多小。
我知道语法\\[...]
,但在那里输入(实际上是减去)的正确长度是多少(因为它显然取决于字体高度)?有人能告诉我如何在类似表格的环境中构建默认高度吗,这样我就可以使用这个公式通过 填写相应的负长度\\[...]
?
或者是否有一个技巧可以删除单元格中的“默认”支柱(这是我理解它是如何完成的,但我可能错了,因为所有这些数组包如何构造远远超出了\halign
我目前的理解),所以它会折叠到我放在那里的任何东西(例如高度为 2 pt 左右的规则)?
因为可以理解地表达了对示例的期望,所以我将尝试更好地解释什么和为什么,并提供一些示例代码来演示我想要实现的目标,以及如何结合给出的解决方案来实现这一点唐纳德·阿瑟诺。
最初的需求是排版一个表格,其中包含和弦及其允许的张力、弱和声和强和声以及避免音符。如果您不明白我在说什么,没关系,只要想想元素周期表,它对颜色和单元格周围非常有选择性的边框也有类似的需求,只是在我的情况下,我还想改变边框粗细和边框颜色(是的,我知道 booktabs.sty - 您只需相信我,那里的印刷注释根本不适用于我的情况。)
我所呈现的是不是我的最终产品,但仍然是一个综合的例子,包含了我尝试过的内容和我当前状态的演变(这里给出了关于我展示的 4 种不同方法/演变步骤的注释)。
首先是代码
\documentclass[10pt]{article}
\usepackage{array}
\usepackage[table]{xcolor}
\usepackage{ehhline} % Important: this needs version >= 1.1
\usepackage{lipsum}
%%% just some shortcuts to make live easier
\definecolor{lred}{rgb}{1,0.85,0.85}
\definecolor{lgreen}{rgb}{0.85,1,0.85}
\definecolor{lblue}{rgb}{0.85,0.85,1}
\definecolor{lgray}{rgb}{0.85,0.85,0.85}
%%% define the thickness of inner lines
\def\irw{3pt}
\def\rrh{-\dimexpr\arraystretch\normalbaselineskip-\irw\relax} % used in example 4
% To make it possible to read the \\hhlines below
% w/o wanting to shoot yourself in the head:
\newcommand\arc[1]{\arrayrulecolor{#1}}
% Shortcut used for solution with !{...} of \ehhline: A coloured rule segment
\newcommand\crs[2]{\leaders\hbox{\textcolor{#1}{\rule{0.1pt}{#2}}}\hfil}
\begin{document}
\begin{center}\Large
\begin{tabular}{| >{\columncolor{lred}}c>{\columncolor{lgreen}}c
>{\columncolor{lblue}}c >{\columncolor{lgray}}c |}
\hline
{\normalsize I} & & & \\
\hhline{|~>{\arc{red}}--~>{\arc{black}}|}
& \multicolumn{1}{!{\color{red}\vline} >{\cellcolor{lgreen}}c}{+}
& \multicolumn{1}{>{\cellcolor{lblue}}c !{\color{red}\vline}}{+}
& \\
\hhline{|~>{\arc{red}}--~>{\arc{black}}|}
{\normalsize II} & & & \\
\hhline{>{\arc{black}}|>{\arc{lred}}->{\arc{red}}-->{\arc{lgray}}->{\arc{black}}|}
& \multicolumn{1}{!{\color{red}\vrule width \irw} >{\cellcolor{lgreen}}c}{+}
& \multicolumn{1}{>{\cellcolor{lblue}}c !{\color{red}\vrule width \irw}}{+}
& \\
\hhline{>{\arc{black}}|>{\arc{lred}}->{\arc{red}}-->{\arc{lgray}}->{\arc{black}}|}
{\normalsize III} & & & \\
\hhline{|!{\crs{lred}{\irw}}!{\crs{red}{\irw}}!{\crs{red}{\irw}}!{\crs{lgray}{\irw}}|}
& \multicolumn{1}{!{\color{red}\vrule width \irw}>{\cellcolor{lgreen}}c}{+}
& \multicolumn{1}{>{\cellcolor{lblue}}c!{\color{red}\vrule width \irw}}{+}
& \\
\hhline{|!{\crs{lred}{\irw}}!{\crs{red}{\irw}}!{\crs{red}{\irw}}!{\crs{lgray}{\irw}}|}
{\normalsize IV} & & & \\
& \multicolumn{2}{>{\cellcolor{red}}c}{} & \\[\rrh]
& \multicolumn{1}{!{\color{red}\vrule width \irw}>{\cellcolor{lgreen}}c}{+}
& \multicolumn{1}{>{\cellcolor{lblue}}c!{\color{red}\vrule width \irw}}{+}
& \\
& \multicolumn{2}{>{\cellcolor{red}}c}{} & \\[\rrh]
& & & \\
\hline
\end{tabular}
\end{center}
\end{document}
结果如下:
评论:
I) 这是最简单的方法\hhline
。特点是可怕的空白,没有规则段应该存在。也没有增加厚度。
II) 在任何地方使用正确着色的线段\hhline
并放置粗通\vstruts
孔\multicolumn{1}...
有助于部分实现这一点,但我认为用这种方法无法使水平部分变粗。而且我已经感觉到它变得混乱,并且需要付出过多的努力才能正确处理空白。
III)在. 工作中使用ehhline.sty
和(我认为右侧的小缺失部分是 pdf 查看器缩放的产物)。感觉就像要付出极大的努力才能达到结果,如果没有定义的快捷键,它将完全无法阅读。\leaders
\hhline
附带问题:有人知道比在这里将细小的规则粘在一起更优雅的方法吗\leaders
(参见我的代码中的定义\crs
)?我怎么能直接输入一那里有正确大小的规则吗?有什么方法可以计算出列宽吗?
IV) 为了尽量减少工作量,我考虑将\hline
垂直线和相关线全部跳过,而是将其构建为常规单元格。这就是问题所在。只要跳过适当的距离并增加厚度,它就可以正常工作。
所以我现在有两种可能的方法,但不幸的是它们还不能解决所有的情况。我需要在一个表格中用不同宽度。显然,III) 和 IV) 都假设每行水平边框的厚度相同。因此,我试图停止使用单元格本身作为规则,而是仅使用单元格作为背景颜色,并再次坚持边框的规则(对于顶部边框,需要在底部对齐,对于底部边框,需要在顶部对齐)。但这里我又回到了上面的问题:我需要一种方法将计算出的列宽和所需厚度的彩色规则插入到包含边框的单元格中。这对我来说目前尚未解决。
答案1
提供的示例是一个简单的表格,其中有额外的空白行,但你想折叠它。例如,我发现很容易检测到一个完全空白的行
hello & world \\
\\
并抑制它(完全忽略该行),但它不会折叠类似
hello & world \\
& \\
无论如何,这个不完整的答案之所以被输入为答案,是因为你对明确间距的要求很简单,但答案却有些模糊
\\[-\arraystretch\normalbaselineskip]
(\baselineskip
制作表格时为零。)
哦,是的,如果你只是想避免隐藏支柱强制执行的明显跳行,在整个表格中,只需将拉伸设置为零
\renewcommand\arraystretch{0}
答案2
简单地说,当您在设置的位置内\strut
使用时,请不要使用:\halign
\vbox
\offinterlineskip
\vbox{\offinterlineskip\halign{&\ \hfil#\hfil\cr
abc & de \cr
xx & vv \cr
Ayv \cr
}}
\bye
如果您明确想要使用 LaTeXtabular
环境,只需\strut
在本地停用即可:
\documentclass{article}
\begin{document}
{\setbox\strutbox=\null
\begin{tabular}{cc}
abc & de \\
xx & vv \\
Ayv
\end{tabular}
}
\end{document}
您的示例并未显示问题的所有复杂性。因此,我没有显示完整的答案。我不确定您提到的所有复杂事物是否都明确需要。我的答案不使用\halign
。当我知道为什么要使用它时,我就可以更正此答案(可能与\halign
用法有关)。我的示例显示了如何在 TeX 原始级别执行此操作(颜色来自为纯 TeX 设计的 OPmac 或 OpTeX 包)。
\input opmac
\newdimen\colw \colw=20pt
\newdimen\irw \irw=3pt
\def\rulestrut{height.6\colw depth.25\colw}
\def\varth#1{\ifcase#1 .4pt\or \irw\fi}
\def\colfram#1#2{\vbox{\Red\hrule height\varth#1\vtop{%
\hbox to2\colw{\vrule \rulestrut width\varth#2\hss
\vrule width\varth#2}%
\hrule height\varth#1}}}
\def\redframe#1#2#3#4{\hbox{\rlap{\colfram#1#2}%
\typosize[14/]
\hbox to\colw{\hss\kern#2\irw#3\hss}\hbox to\colw{\hss#4\kern#2\irw\hss}}}
\def\row#1#2{\hbox to3.5\colw{%
{\LiRed\rule\LiGreen\rule\LiBlue\rule\LiGrey\vrule width.5\colw}%
\kern-3.5\colw
\vrule \rulestrut width0pt
\hbox to\colw{\hss #1\hss}#2\hss}\nointerlineskip
}
\def\rule{\vrule width\colw}
\def\LiRed {\setrgbcolor{1 0.85 0.85}}
\def\LiGreen {\setrgbcolor{0.85 1 0.85}}
\def\LiBlue {\setrgbcolor{0.85 0.85 1}}
\def\LiGrey {\setrgbcolor{0.85 0.85 0.85}}
\localcolor
\frame{\vbox{
\row {I} {}
\row {} {\redframe 00++}
\row {II} {}
\row {} {\redframe 10++}
\row {III} {}
\row {} {\redframe 11++}
\row {IV} {}
}}
\bye
注意宏的概念必须尊重它们的用法。当我们想要创建结果时,我们不能深入到表格环境中的复杂代码中。