如何在(tikz)环境之前保持基于基线的距离?

如何在(tikz)环境之前保持基于基线的距离?

我有一个环境(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 图片。

相关内容