![垂直居中多个 TikZ 图片,保留基线高度](https://linux22.com/image/245420/%E5%9E%82%E7%9B%B4%E5%B1%85%E4%B8%AD%E5%A4%9A%E4%B8%AA%20TikZ%20%E5%9B%BE%E7%89%87%EF%BC%8C%E4%BF%9D%E7%95%99%E5%9F%BA%E7%BA%BF%E9%AB%98%E5%BA%A6.png)
我经常需要在使用 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
图片中的共同特征,但它确实可以管理垂直对齐(这可能是所有其他偶然发现这篇文章的人所寻找的)。