我在表格环境中的单元格内放置了一个标签,列类型为“p”。如果包含 hyperref,单元格将包含不必要的垂直空间,从而扰乱格式。如果不包含 hyperref,格式是正确的。
我猜这与描述的问题有关这里和这里但我无法根据自己的情况调整这些问题的解决方案。如何在不放弃 hyperref 的情况下获得正确的间距?
\documentclass{article}
\usepackage{hyperref}
\newcounter{foo}
\renewcommand{\thefoo}{T\arabic{foo}}
\newcommand{\foofoo}{\refstepcounter{foo}\textbf{\thefoo}}
\begin{document}
\begin{tabular}{|p{5mm}|p{80mm}|} \hline
\foofoo\label{foo:jeez} & Jeez \\\hline
& Words words wordsWords words wordsWords words words\\\hline
\end{tabular}
\end{document}
使用 hyperref:
没有超链接:
(第二个示例的代码与上面相同,但 hyperref 注释掉了。)
答案1
列类型的单元格的垂直参考位置p
是单元格最顶部元素的参考位置,例如:
- 最上面一行的基线,
- 最高规则的基线,
- 在垂直空间上方,
- 某个东西的位置 (\label,
\special
,\write
, ...)
\refstepcounter
还使用 创建一个锚点hyperref
。这是由 whatsits(例如\special
)内部实现的。因此,此锚点 whatsit 与下一个单元格顶线的基线对齐。
原则上,您不希望锚点位于行中。此时,尚不清楚下一个单元格的高度是多少(可能有一张大图像,...)。最好将锚点放在不对齐的位置前\noalign
该行开始。这可以在新行开始之前通过以下方式实现:
\noalign{\refstepcounter{foo}}
\label
但是,这也构成了一个组,所依赖的内部命令随后会丢失。因此,\label
也必须在此处进行。并且\label
还创建了一个 whatsit,即对文件的写入请求.aux
。
\noalign{\refstepcounter{foo}\label{foo:jeez}}
\textbf{\thefoo}
完整示例:
\documentclass{article}
\usepackage{booktabs}
\usepackage[colorlinks]{hyperref}
\newcounter{foo}
\renewcommand{\thefoo}{T\arabic{foo}}
\begin{document}
\begin{tabular}{p{5mm}p{80mm}}
\toprule
\noalign{\refstepcounter{foo}\label{foo:jeez}}
\textbf{\thefoo}
& Jeez \\
& Words words wordsWords words wordsWords words words\\
\bottomrule
\end{tabular}
\medskip
Link to \ref{foo:jeez}.
\end{document}
答案2
添加一些内容来开始本段,例如
\documentclass{article}
\usepackage{hyperref}
\newcounter{foo}
\renewcommand{\thefoo}{T\arabic{foo}}
\newcommand{\foofoo}{\leavevmode\refstepcounter{foo}\textbf{\thefoo}}
\begin{document}
\begin{tabular}{|p{5mm}|p{80mm}|} \hline
\foofoo\label{foo:jeez} & Jeez \\\hline
& Words words wordsWords words wordsWords words words\\\hline
\end{tabular}
\end{document}