![如何将 TikZ 内联节点的标签与外部文本对齐?](https://linux22.com/image/432749/%E5%A6%82%E4%BD%95%E5%B0%86%20TikZ%20%E5%86%85%E8%81%94%E8%8A%82%E7%82%B9%E7%9A%84%E6%A0%87%E7%AD%BE%E4%B8%8E%E5%A4%96%E9%83%A8%E6%96%87%E6%9C%AC%E5%AF%B9%E9%BD%90%EF%BC%9F.png)
我该如何节点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}
我记得它是关于baseline
或overlay
...的一些事情
我猜这会与现有问题重复,但此刻我甚至找不到更好的词来进行搜索。
答案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}