Tikz 树

Tikz 树

我最近问过如何在角色之间建立关联线,我愿意接受各种建议。不幸的是,我没能理解给出的大多数答案。我可能应该强调,这些建议需要用解释/评论来“简化”,以便我能理解它们(这样我就可以修改它们并在以后重复使用它们)。我喜欢一些pstricks衍生产品的输出,例如pst-asrhttps://tex.stackexchange.com/a/139694/9077) 和pst-nodehttps://tex.stackexchange.com/a/139726/9077),但我不太懂代码,而且由于pst-asrpst-node手册对我来说就像推理小说一样,所以我甚至在开始之前就卡住了。

因此,我TikZ现在会坚持使用,主要是因为该手册对我来说或多或少是可以理解的,而且我TikZ之前已经使用过一点。

以下是我根据 Alan Munn 的回答那里已经存在一些问题:

  1. “asta”这个词中字符之间的间距不均匀。我希望字符之间的距离与在普通文本中输入单词时相同。

  2. 单词“asta”中的两行长度不等。它们的长度应该是相同的。

  3. 单词“asta”中的两行连接不顺畅。手册第 140 页提到了这个问题TikZ,但没有解释,只是说“欣赏差异”(我确实欣赏)。

  4. “asta”一词中的 H 应该位于两个锚点之间,而不是直接位于第二个锚点上方。

如果这些问题无法通过 解决TikZ,我很乐意改用pst-asrpst-node之类的东西。如果是这样,这次我应该坚持解释代码,否则就不值得你付出努力。由于我无法理解pst-asr或 的手册pst-node,我需要依靠你们的解释……

梅威瑟:

\documentclass{article}
\usepackage{tikz}
    \usetikzlibrary{matrix}
\begin{document}
\begin{tikzpicture}
    \matrix (mymatrix) % assign matrix name in ()
        [
            matrix of nodes,
            nodes = {inner sep = 0pt, outer sep = 1pt}
            % 'inner sep' sets the space around the node, i.e. between nodes
            % 'outer sep' sets the space between the node and the anchor that lines will be drawn from/to
        ]
    % create matrix of nodes: each node has the name 'matrix name'-'row number'-'column number'
    {
        & H &\\
        [2ex] % distance between rows
        a & s & a\\
    };
    \draw (mymatrix-1-2) -- (mymatrix-2-2); % draw line (--) from row1/column2 to row2/column2
\end{tikzpicture}
\begin{tikzpicture}
    \matrix (mymatrix2)
        [
            matrix of nodes,
            nodes = {inner sep = 0pt, outer sep = 1pt}
        ]
    {
        & & H &\\
        [2ex]
        a & s & t & a\\
    };
    \draw (mymatrix2-1-3.south) -- (mymatrix2-2-2.north);
     % south anchor = in the middle at the bottom of the node
     % north anchor = in the middle at the top of the node
    \draw (mymatrix2-1-3) -- (mymatrix2-2-3);
\end{tikzpicture}
\end{document}

在此处输入图片描述


编辑:Alenanno 的建议

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}
    [
        every node/.style = % set style of all nodes
            {
                minimum height = 4mm, % set minimum height of node (the higher, the further away from the node the lines will be drawn)
                text height = 1mm, % set height of text in node? How can the text be 1mm high?
                text depth = 0ex % depth?? What does this do?
            },
        level 1/.style = % set style for the highest level in the tree
            {
                level distance = 7mm, % set distance between levels in the tree
                sibling distance = 2mm % set distance between nodes within a level
            },
        edge from parent/.style = % set style for the connection between parents and children???
            {
                draw,
                edge from parent path = % set the edges for parent node and child node
                    {(\tikzparentnode.south) -- (\tikzchildnode.north)} % south/north = in the middle at the bottom/top of the node
            },
        abs/.style = % ??
            {edge from parent/.style = {draw = none}} % ??
    ]

\node{H} % the text of parent node
    child[abs]  {node{a}}
    child       {node{s}} 
    child[abs]  {node{a}}
;

\node[xshift = 2cm]{H} % shift all points in this node on the x-axis (to avoid pictures to overlap)
    child[abs]  {node{a}}
    child       {node{s}} 
    child       {node{t}}
    child[abs]  {node{a}}
;
\end{tikzpicture}
\end{document}

这难道不会总是放在H单词的中间吗?如果我只想H分支到单词的前两个字符或类似的东西怎么办?

答案1

Tikz 树

这是使用 Tikz 更新的解决方案。我设法解决了一个之前让我选择常规树的特殊问题,即“阿斯塔”造成了与其他字母对齐的问题。

腹肌风格说abs/.style={edge from parent/.style={draw=none}}

基本上,具有此选项的每个子节点都不会显示来自其父节点的边。如您所见,它显示draw=none以下内容,每当您看到时child[abs],该子节点就不会显示该线。

因此:child[abs]在您不希望出现线条的地方书写,并在[abs]您希望出现线条的地方保留空白。

顺便一提,腹肌只是缩写缺席的。我只是选择了一个词来表示这个,但是你可以写任何内容作为关键字,除了可能已经存在于 Latex 中的命令可能会产生问题(我认为当这种情况发生时它会抛出一个错误)。

tikz 树图像

\documentclass{article}
\usepackage{tikz}

\begin{document}

\begin{tikzpicture}[every node/.style={minimum height=4mm,text height=1mm,text depth=0ex},
    level 1/.style={level distance=9mm,sibling distance=2mm},
    edge from parent/.style={draw, edge from parent path={(\tikzparentnode.south) -- (\tikzchildnode.north)}},
    abs/.style={edge from parent/.style={draw=none}}
]

\node {H}
child[abs] { node {a}}
child { node {s}} 
child[abs] { node {a}}
;

\node[xshift=2cm] {H}
child[abs] { node {a}}
child { node {s}} 
child { node {t}}
child[abs] { node {a}}
;
\end{tikzpicture}
\end{document}

普通树木

我尝试了另一种方法,使用了语法树。如果你做一棵简单的树,从父节点到其子节点的线条都是等长的。我减少了字母之间的间距,你可以更改该代码以使其看起来更好,但我不知道是否会有什么问题并且看起来很糟糕。

我考虑过使用 Tikz 树,但是您需要输入更多代码(如果您更喜欢这种方法,请告诉我)。

普通树木看起来是这样的:

普通树木图像

\documentclass{article}
\usepackage[a4paper]{geometry}
\usepackage{qtree}

\begin{document}    
    \qtreecenterfalse

    \Tree [.\raisebox{-.3cm}{H} !\qsetw{-1mm} a !\qsetw{-1mm} s !\qsetw{-1mm} a ] \hskip .5cm
    \Tree [.\raisebox{-.3cm}{H} !\qsetw{-1mm} a !\qsetw{-1mm} s !\qsetw{-1mm} t !\qsetw{-1mm} a ]

\end{document}

相关内容