垂直居中多个 TikZ 图片,保留基线高度

垂直居中多个 TikZ 图片,保留基线高度

我经常需要在使用 TikZ 绘制的图片之间写出方程式。但是,为了正确显示它们,我有两个要求:任何共同特征都必须在同一水平线上,并且整个图表必须相对于分隔它们的任何 = 符号垂直居中。

这是我想要的效果的图片: 在此处输入图片描述 这是我想要的效果的图片想要,但很容易实现: 在此处输入图片描述

当然,对于特定的图表,只需几行代码即可获得我想要的效果。但理想情况下,我会指定标签的位置 - 可能通过将图表的基线设置为标签 A - 然后其余的事情应该会自动发生。

我可以通过多种方式手动实现这一点:例如,增加较小图表的边界框的大小,以人为地强制其具有与较大图表相同的高度;或者手动将图像的基线设置为我想要与 = 符号的基线对齐的点。但这两种方法都很繁琐,而且都不能抵御图表未来的变化。

以下是生成上面第二幅图像的代码:

\documentclass{article}
\usepackage{tikz}
\usepackage{amsmath}
\begin{document}
\[
\begin{aligned}
\begin{tikzpicture}
\draw (0,0)
    node [above] {$A$}
    to [out=down, in=down] (1,0)
    node [above] {$A^*$};
\end{tikzpicture}
\end{aligned}
=
\begin{aligned}
\begin{tikzpicture}
\draw (0,0)
    node [above] {$A$}
    to [out=down, in=up] (1,-1)
    to [out=down, in=down] (0,-1)
    to [out=up, in=down] (1,0)
    node [above] {$A^*$};
\end{tikzpicture}
\end{aligned}
\]
\end{document}

答案1

再试一次。我的基本想法是列出整个方程式,然后映射到该列表,以便 tikz 图片被\vcenter添加到最高的一堆中,而普通数学对象则按原样传递。请注意,我还没有对此进行(太多)测试:

\catcode`@=11
\input lambda.sty
\input tikz

\def\Unravel#1{#1\Unravel@{}}
\def\Unravel@#1{#1\Foldr\Spaceize{}}
\def\Spaceize#1#2{ #1#2}

\newdimen\tallest
\newcount\index

\def\TypesetThem#1{%
  \advance\index by 1
  \TeXif{\ifodd\index }{\vcenter to\tallest{\hbox{$#1$}\vss}}{#1}}

\def\FindTallest#1{%
  \setbox0\vbox{\hbox{$#1$}}%
  \ifdim\dimexpr\ht0+\dp0>\tallest\tallest=\dimexpr\ht0+\dp0\fi}

\def\SameHeight#1{%
  \index=0
  \tallest=0pt
  \Unravel{\Map\FindTallest{#1}}
  \Unravel{\Map\TypesetThem{#1}}}

\def\MyTikZList{\Listize[
  {\tikz\draw (0,0)
    node[above] {$A$}
    to[out=down,in=down] (1,0)
    node[above] {$A^*$};},
  =,
  {\tikz\draw (0,0)
    node[above] {$A$}
    to[out=down,in=up] (1,-1)
    to[out=down,in=down] (0,-1)
    to[out=up,in=down] (1,0)
    node[above] {$A^*$};},
  +,
  {\tikz\draw (0,0)
    node[above] {$A$}
    to[out=down,in=up] (1,-1)
    to[out=down,in=down] (0,-1)
    to[out=up,in=down] (1,0)
    node[above] {$A^*$};},
  -,
  {\tikz\draw (0,0)
    node[above] {$A$}
    to[out=down,in=down] (1,0)
    node[above] {$A^*$};},
  ]}

$$
  \SameHeight\MyTikZList
$$

\bye

tikz 图片需要分组。

在此处输入图片描述

答案2

这不是最佳解决方案,但需要的手动调整并不多。

\documentclass{article}
\usepackage{tikz}
\usepackage{amsmath}
\usetikzlibrary{calc}
\begin{document}

An entangled equation and required meaningless text just to justify this sentence length. 
\begin{equation}
\begin{tikzpicture}[baseline=(current bounding box.center)]
\node (A) at (0,0) {\tikz{\draw (0,0)
    node [above] {$A$}
    to [out=down, in=down] (1,0)
    node [above] {$A^*$};}};
\node[anchor=north west] (B) at ($(A.north east)+(1em,0)$) {
\tikz{\draw (0,0)
    node [above] {$A$}
    to [out=down, in=up] (1,-1)
    to [out=down, in=down] (0,-1)
    to [out=up, in=down] (1,0)
    node [above] {$A^*$};
}
};
\node[left] (equa) at (B.west) {=};
\end{tikzpicture}
\end{equation}
\end{document}

基本上,您通过节点绘制等式的两个不同边,然后从它们的上限对齐它们,并在中间挤压一个等号。

在此处输入图片描述

答案3

怎么样\raisebox{-\height/2}{<tikz code>}

在此处输入图片描述

\begin{equation}
    \raisebox{-\height/2}{\begin{tikzpicture}
    \draw (0,0)
        node [above] {$A$}
        to [out=down, in=down] (1,0)
        node [above] {$A^*$};
    \end{tikzpicture}}
    = \raisebox{-\height/2}{\begin{tikzpicture}
    \draw (0,0)
        node [above] {$A$}
        to [out=down, in=up] (1,-1)
        to [out=down, in=down] (0,-1)
        to [out=up, in=down] (1,0)
        node [above] {$A^*$};
    \end{tikzpicture}}
\end{equation}

它并不是完全多功能的,也就是说,它不允许对齐不同TikZ图片中的共同特征,但它确实可以管理垂直对齐(这可能是所有其他偶然发现这篇文章的人所寻找的)。

相关内容