我经常想做的一件事是在我的文档中放置一个框,其大小与某些文本 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=
语法可能不是一个好主意,这里解释了一个小麻烦
答案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
然后您只需使用以下三个命令:
\rb
用于重置盒子\sb{t}
t
用于声明稍后节点中会有文本\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}
这里还有一个可能会向您展示与您想出的其他解决方案的区别。
\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}