在 Tikz 中垂直对齐文本

在 Tikz 中垂直对齐文本

我需要知道在 TIKZ 中处理垂直对齐的正确方法。让我详细说明一个例子:

\documentclass{article}
\usepackage{amsmath,tikz}
\begin{document}
\begin{tikzpicture}
          \node (A1) at (0,4) {($\overset{\surd}{1}$ \indent 2)};
          \node (B1) at (0,3) {($\overset{\surd}{3}$ \indent 4)};

          \node (A) at (2,4) {$\phi_1$} ;
          \node (B) at (2,3) {$\phi_2$} ;

          \draw [->, line width=1pt] (A) -- (A1)
        node [near start, above]
            {
                \footnotesize{R1}
            };

            \node (A2) at (6,4) {$7^1$ \indent $8^1$ \indent $3^1$ \indent $4^1$\indent $\parallel$ 2};
            \node (B2) at (6,3) {$1^3$ \indent $2^3$ \indent $5^3$ \indent $6^3$\indent $\parallel$ 4};

            %fake caption
            \node at (8,4.5) {fake};

\end{tikzpicture}

结果是:
代码输出

我只是想知道是否有任何方法可以将线条强制放到底线中,以便$\phi_1$左侧对齐?我应该使用幻影来做到这一点,还是有我不知道的更好的方法?
下一点是关于右上角的“假”这个词。我希望它位于“2”上方,但我已将其作为节点放置。我可以使用“2”上方\overset{fake}{\overline{2}}的“假”,但它会将线推到左边,这不是我想要的。正如您可能已经猜到的那样,我还需要在“假”和“2”之间划一条线,我应该使用吗\overline{2}

答案1

我假设您使用的是amsmath\overset为了正确对齐,请将 a[every node/.style = {anchor = base}]作为 的参数{tikzpicture},并且为了使箭头起作用\phi,您应该将其目标更改为(A-|A1.east)(这指定了从 A 开始的水平线与通过 A1.east 的垂直线相交的点,这会产生一个漂亮的扁平箭头)。

对于你的第二个问题,我建议你放弃当前的方法并使用一些 TikZ 库。特别是,你应该使用chains轻松地将节点排成一行,并按你喜欢的间距排列,并将positioning“假”放在正确的位置。一旦你这样做了,你就可以使用命令\draw来获取你想要的线条。

我也习惯了scopes简化代码。它允许我使用括号{...}代替\begin{scope}...\end{scope}。(如果您不知道:TikZ 中的范围允许您传递在本地生效的可选参数。)最终代码:

\documentclass{article}
\usepackage{amsmath,tikz}
\usetikzlibrary{chains, scopes, positioning}
\begin{document}
\begin{tikzpicture}
 [every node/.style = {anchor = base}]
      \node (A1) at (0,4) {($\overset{\surd}{1}$ \quad 2)};
      \node (B1) at (0,3) {($\overset{\surd}{3}$ \quad 4)};

      \node (A) at (2,4) {$\phi_1$} ;
      \node (B) at (2,3) {$\phi_2$} ;

      \draw [->, line width=1pt] (A) -- (A-|A1.east)
       node [near start, above]
        {
            \footnotesize{R1}
        };

      { [start chain, every node/.append style = on chain, node distance = 1em]
       \node at (4,4) {$7^1$};
       \node {$8^1$}; \node {$3^1$}; \node {$4^1$}; \node {$\parallel$};
       \node (two) {$2$};
      }
      { [start chain, every node/.append style = on chain, node distance = 1em]
       \node at (4,3) {$1^3$};
       \node {$2^3$}; \node {$5^3$}; \node {$6^3$}; \node {$\parallel$}; \node {$4$};
      }

      \node (fake) [above = 1ex of two.north] {fake};
      \draw (fake.south east) -- (fake.south west);

      \end{tikzpicture}
\end{document}

答案2

精确的问题讨论手册(您也可以在 bash 中阅读texdoc pgf)在“3 教程:Hagen 的 Petri 网”(第 37 页)和“5 教程:将图表放入链中”(第 56 页)中。那里讨论了两种放置方法:

  • 3.8 使用相对位置放置节点- 工作原理如下。您可以使用

    \node (waiting) {};
    \node (critical) [below of waiting] {};
    \node (leave critical) [right of waiting] {};
    

    放置第一个节点,并将每个后续节点相对于第一个节点或您命名的任何其他节点进行定位。

  • 5.3 使用矩阵对齐节点- 以这种方式完成

    \matrix[row sep=1mm,column sep=5mm] {
    % First row:
    & & & & \node [terminal] {+}; & \\
    % Second row:
    \node [nonterminal] {unsigned integer}; &
    \node [terminal] {.}; &
    \node [terminal] {digit};  &
    \node [terminal] {E}; &
                          &
    \node [nonterminal] {unsigned integer}; \\
    % Third row:
    & & & & \node [terminal] {-}; & \\
    };
    

    实际上,您可以在矩阵中添加节点,就像在表中添加值一样 - 因此行和列的成员会适当对齐。结合row sepcolumn sep并将矩阵中的原子留空,您可以修改矩阵中特定项目之间的空间。

相关内容