![如何在(tikz)环境之前保持基于基线的距离?](https://linux22.com/image/440093/%E5%A6%82%E4%BD%95%E5%9C%A8%EF%BC%88tikz%EF%BC%89%E7%8E%AF%E5%A2%83%E4%B9%8B%E5%89%8D%E4%BF%9D%E6%8C%81%E5%9F%BA%E4%BA%8E%E5%9F%BA%E7%BA%BF%E7%9A%84%E8%B7%9D%E7%A6%BB%EF%BC%9F.png)
我有一个环境(tikzpicture
),它试图占据等于当前行高/基线跳过的倍数的高度(我需要它是像素完美的,因此在多列设置中,基线在图像之前/之后的所有列中匹配)。
固定的 tikz 高度本身似乎有效,但环境本身不会保持与前一段的正确基线间距。如果字母延伸到基线以下(例如“g”),则与前一个基线的间隙与不延伸字符时不同。
如何确保环境与上一段保持基于基线的自动距离?我的文档中多次使用此环境,因此我不想根据前面的内容手动添加修复。
梅威瑟:
\documentclass[openany]{book}
\usepackage{tikz}
\begin{document}
Test g.
\begin{tikzpicture}[y=\baselineskip]
\draw (0, 0) -- (0, 4);
\end{tikzpicture}
Test
\begin{tikzpicture}[y=\baselineskip]
\draw (0, 0) -- (0, 4);
\end{tikzpicture}
Test
\end{document}
答案1
这与 tikz 无关,但与 TeX 如何创建段落有关。Latex 使用橡胶长度\baselineskip
来设置行之间的距离(\parskip
如果是段落的开头,则为加号)。但是如果你添加 tikzpicture 或其他使行更高的框,那么,如果行之间的距离太近,小于 \lineskiplimit,那么 TeX 将使用 \lineskip 作为行间粘合符(看这里),并且此行间粘连考虑到深度上一行。
一个例子:
\documentclass[openany]{book}
\usepackage{tikz}
\setlength{\fboxsep}{-0.5pt}
\setlength{\fboxrule}{0.5pt}
%\setlength{\lineskip}{0cm}
%\setlength{\parskip}{1pt}
\newcommand{\tikzmark}[1]{\tikz[overlay, remember picture, baseline={(#1.base)}]
\node[inner sep=0pt, line width=0pt] (#1) {\phantom{Tg}};}
\begin{document}
\fbox{Test}\fbox{g} \tikzmark{A}
\fbox{%
\begin{tikzpicture}[y=\baselineskip]
\draw (0, 0) -- (1, 4);
\end{tikzpicture}} \tikzmark{B}
\fbox{Test} \tikzmark{C}
\fbox{\begin{tikzpicture}[y=\baselineskip]
\draw (0, 0) -- (1, 4);
\end{tikzpicture}}
\fbox{Test} \tikzmark{D}
\fbox{Test}\fbox{g} \tikzmark{D2}
\fbox{Test} \tikzmark{D3}
\fbox{Test}
\begin{tikzpicture}[overlay, remember picture, font=\tiny]
\draw[red] (A.south) -- node[right] {lineskip} ++(down:\lineskip);
\draw[red, transform canvas={xshift=-0.43cm}] (B.base) -- node[right] {baselineskip} ++(down:\baselineskip);
\draw[red] (C.base) -- node[right] {lineskip} ++(down:\lineskip);
\draw[red] (D.base) -- node[right] {baselineskip} ++(down:\baselineskip);
\draw[red] (D2.base) -- node[right] {baselineskip} ++(down:\baselineskip);
\draw[red] (D3.base) -- node[right] {baselineskip} ++(down:\baselineskip);
\end{tikzpicture}
\end{document}
您可以尝试从上一行中删除深度(看这里):
\documentclass[openany]{book}
\usepackage{tikz}
\setlength{\fboxsep}{-0.5pt}
\setlength{\fboxrule}{0.5pt}
%\setlength{\lineskip}{0cm}
%\setlength{\parskip}{1pt}
\newcommand{\tikzmark}[1]{\tikz[overlay, remember picture, baseline={(#1.base)}]
\node[inner sep=0pt, line width=0pt] (#1) {\phantom{Tg}};}
\newcommand{\zerodepth}[1]{\raisebox{0pt}[\height][0pt]{#1}}
\begin{document}
\fbox{Test}\fbox{\zerodepth{g}}
\fbox{%
\begin{tikzpicture}[y=\baselineskip]
\draw (0, 0) -- (1, 4);
\end{tikzpicture}}
\fbox{Test}
\fbox{\begin{tikzpicture}[y=\baselineskip]
\draw (0, 0) -- (1, 4);
\end{tikzpicture}}
\end{document}
但此解决方案不适用于整个段落。
编辑:另一个选项是\strut
在段落行末尾添加一个 tikz 图片。