包含 B 的 A 大小的盒子

包含 B 的 A 大小的盒子

我经常想做的一件事是在我的文档中放置一个框,其大小与某些文本 A 相同,且包含某些其他文本 B。例如,我有两个tikz节点,一个包含 $n$,另一个包含 $n+1$,并且我希望它们的大小相同(但不能大于必要的大小,正如我通过指定 a 所获得的那样minimum width)。

phantom如果我希望文本 B 右对齐或左对齐,我可以使用和mathrlap/的组合来实现mathllap。但是,如果我希望它居中,我看不出有什么简单的方法可以做到这一点。

某些包中是否有简单的命令可以执行此操作?这看起来像是一项常见任务。

最小例子:我想改变 $n$ 的边界框,使得两个圆大小相同(并且 $n$ 仍然位于圆的中心)。

\documentclass{standalone}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
 \node[circle,draw=black] (A) {$n$};
 \node[circle,draw=black] (B) [right of=A] {$n+1$};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案1

至于让两个圆圈大小相同,这是我的建议。它基本上将 覆盖$n$在 的幻影上$n+1$

\documentclass{standalone}
\usepackage{stackengine}[2013-09-11]
\def\stacktype{L}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}[node distance=1.2cm]
 \node[circle,draw=black] (A) {\stackon[0pt]{\phantom{$n+1$}}{$n$}};
 \node[circle,draw=black] (B) [right of=A] {$n+1$};
\end{tikzpicture}
\end{document}

在此处输入图片描述

答案2

首先拥有n+1节点可能有助于直接获取节点的大小,但您可以使用的有限width("<text>")函数pgfmath来获取文本宽度。然后您可以将其居中。我说的有限是指,如果您的文本是复杂的 TeX 宏,它通常无法正确理解或扩展,因此需要额外的保护。然而,对于简单的文本来说,它非常方便。

\documentclass[tikz]{standalone}
\usetikzlibrary{positioning}
\begin{document}
\begin{tikzpicture}
 \node[circle,draw=black,align=center,text width={width("$n+1$")}] (A) {$n$};
 \node[circle,draw=black] (B) [right=0 of A] {$n+1$};
\end{tikzpicture}
\end{document}

在此处输入图片描述

最后,如果你想知道为什么of=语法可能不是一个好主意,这里解释了一个小麻烦

PGF/TikZ 中“right of=”和“right=of”之间的区别

答案3

这是一个更肮脏的解决方案:

  1. 轻松扩展到多个节点(无需手动记录哪个节点最大)
  2. 区分宽度、高度和深度(最宽的节点不一定是最高的!),并且
  3. 对齐所有节点的文本基线。

您必须将其添加到您的序言中:

\makeatletter
\newbox\eq@box
\newdimen\eq@w
\newdimen\eq@h
\newdimen\eq@d
\def\rb{\eq@w=0pt\eq@h=0pt\eq@d=0pt}
\def\sb#1{%
  \setbox\eq@box\vbox{\hbox{#1}}%
  \ifnum\eq@w<\wd\eq@box \eq@w=\wd\eq@box \fi%
  \ifnum\eq@h<\ht\eq@box \eq@h=\ht\eq@box \fi%
  \ifnum\eq@d<\dp\eq@box \eq@d=\dp\eq@box \fi%
}
\def\ub#1{\raisebox{0pt}[\eq@h][\eq@d]{\makebox[\eq@w][c]{#1}}}
\makeatother

然后您只需使用以下三个命令:

  1. \rb用于重置盒子
  2. \sb{t}t用于声明稍后节点中会有文本
  3. \ub{t}t在节点中实际使用文本

这是您的示例:

\begin{tikzpicture}[node distance=1.5cm]
 \rb\sb{$n$}\sb{$n+1$}
 \node[circle,draw=black] (A) {\ub{$n$}};
 \node[circle,draw=black] (B) [right of=A] {\ub{$n+1$}};
\end{tikzpicture}

示例 1

这里还有一个可能会向您展示与您想出的其他解决方案的区别。

\begin{tikzpicture}[node distance=3cm]
 \rb
 \sb{$a_1+a$}
 \sb{$a_{a_2}+a^b$}
 \sb{$a_{a_{a_3}}+a^{b^{c^d}}$}
 \sb{$a_{a_{a_4}}+a^{b^{c^{d^e}}}$}
 \node[circle,draw=black] (P1) [below of=A] {\ub{$a_1+a$}};
 \node[circle,draw=black] (P2) [right of=P1] {\ub{$a_{a_2}+a^b$}};
 \node[circle,draw=black] (P3) [right of=P2] {\ub{$a_{a_{a_3}}+a^{b^{c^d}}$}};
 \node[circle,draw=black] (P4) [right of=P3] {\ub{$a_{a_{a_4}}+a^{b^{c^{d^e}}}$}};
\end{tikzpicture}

示例 2

相关内容