如何将 TikZ 内联节点的标签与外部文本对齐?

如何将 TikZ 内联节点的标签与外部文本对齐?

(几年前我就知道这些东西,但现在……)

我该如何节点a节点b对齐文本? 哦,矩形实际上应该fill被绘制并位于文本的“后面”。

\documentclass{article}

\usepackage{tikz}
\usetikzlibrary{positioning}

\begin{document}
Text \tikz{
\node[inner sep=0pt,outer xsep=0pt,outer ysep=3pt] (a) {node a};
\node[inner sep=0pt,outer xsep=0pt,outer ysep=3pt,right=of a] (b) {node b};
% other nodes
\draw (a.south west) rectangle (b.north east);
}
\end{document}

我记得它是关于baselineoverlay...的一些事情

我猜这会与现有问题重复,但此刻我甚至找不到更好的词来进行搜索。

答案1

在将节点与外部文本对齐时,需要考虑两件事。一是将 TikZ 图片与文本正确定位,二是将节点正确定位在图片内。可以将第一个视为绝对图片的位置,第二个是相对的该图片内节点的位置。

这里的关键概念是base节点的锚点。这是一个锚点(或者说是一组锚点),它们与节点文本的基线垂直对齐。这既需要用于定位图片相对于外部文本的位置,也需要用于定位节点相对于彼此的位置。

要定位图片,使得特定节点的基线位于文本基线上,请使用baseline=(node.base)TikZ 图片环境(或\tikz命令)上的键。

要定位单个节点,请确保将anchor设置为锚点之一base,并且位置与用于定位它的节点的锚点一致base。确保这种情况发生的快速方法是使用positioning库和base right=of <node>键(或者left,当然)。

下面是一些代码来演示这一点。它还使用了来自将选项传递给预操作内部创建的范围轻松地将节点放置在图层上,使用fit库可以轻松放置填充的矩形在后面放置的节点。我将它们全部放入fit以确保所有上升和下降都被考虑在内。这不是绝对必要的 - 第一个、最后一个、最高、最深就足够了。

\documentclass[border=10pt]{standalone}
%\url{https://tex.stackexchange.com/q/594856/86}

\usepackage{tikz}
\usetikzlibrary{positioning,fit}


\pgfdeclarelayer{back}
\pgfdeclarelayer{front}
\pgfsetlayers{back,main,front}

\makeatletter
\pgfkeys{%
  /tikz/on layer/.code={
    \pgfonlayer{#1}\begingroup
    \aftergroup\endpgfonlayer
    \aftergroup\endgroup
  },
  /tikz/node on layer/.code={
    \gdef\node@@on@layer{%
      \setbox\tikz@tempbox=\hbox\bgroup\pgfonlayer{#1}\unhbox\tikz@tempbox\endpgfonlayer\egroup}
    \aftergroup\node@on@layer
  },
}

\def\node@on@layer{\aftergroup\node@@on@layer}

\makeatother


\begin{document}
Text before \tikz[baseline=(a.base)]{
  \node[inner sep=0pt,outer xsep=0pt,outer ysep=3pt] (a) {node a};
  \foreach[remember=\k as \pk (initially a)] \k in {b,c,p,q,A,M} {
    \node[inner sep=0pt,outer xsep=0pt,outer ysep=3pt,base right=of \pk] (\k) {node \k};
  }
  \node[draw,fill=yellow,node on layer=back,fit={(a) (b) (c) (p) (q) (A) (M)}] {};
} Text afterwards
\end{document}

它看起来是这样的:

所有节点都与基线对齐

答案2

在此处输入图片描述

正如评论中所说,使用基线选项进行对齐,并使用图层将填充的矩形作为背景。

对于baseline=value,该值取决于节点的外部ysep值。

代码

\documentclass[12pt, a5paper]{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\pgfdeclarelayer{background}
\pgfsetlayers{background, main}

\tikzset{
  ab/.style={inner sep=0pt, outer xsep=0pt, outer ysep=3pt}
}

\begin{document}
\section*{Using baseline for figures and text alignment}

Text
\begin{tikzpicture}[baseline=-4pt]
  \node[ab] (a) {node a};
  \node[ab, right=of a]
  (b) {node b};
  
  \begin{pgfonlayer}{background}
    \draw[fill=yellow] (a.south west) rectangle (b.north east);
  \end{pgfonlayer}
\end{tikzpicture}
and more text.
\end{document}

答案3

另一种结构是tcolorbox

\documentclass{article}

\usepackage[most]{tcolorbox}

\newtcbox{mytcbox}[1][]{
    on line, size=fbox, colback=yellow!30, sharp corners}
    
\begin{document}
Text \mytcbox{node a\hspace{1cm}node p\hspace{5mm}node h} some more text
\end{document}

在此处输入图片描述

相关内容