在右侧添加标签

在右侧添加标签

如下图所示,我想将标签对齐,1470 = 1400 + 70就像这样1470:见红色箭头。任何节点都需要此功能,而不仅仅是根节点,并且需要一个自动过程。

在此处输入图片描述

这是想要的对齐。

在此处输入图片描述

这是使用的 MWE。

\documentclass[12pt]{article}

\usepackage{forest}

\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}

\begin{document}

\begin{forest}
    for tree={math content}
    [{1470 = 1400 + 70}
        [7]
        [210
            [7]
            [30
                [3]
                [10
                    [2]
                    [5]
                ]
            ]
        ]
    ]
\end{forest}

\end{document}

答案1

虽然我已经用过mathtools\mathrlap之前与森林,我相信有一个使用纯 TikZ 的解决方案,它也可以相应地更新边界框。

在右侧添加标签

...节点,以便它们的基线对齐。

这种使用inner xsep=0pt可能会导致文本周围出现不幸的填充(取决于边缘):


\documentclass[12pt]{article}
\usepackage{forest}
\forestset{mathrlap/.style={inner xsep=0pt,label={[anchor=text]base east:${}#1$}}}
\begin{document}
\begin{forest}
for tree={math content}
[1470, mathrlap={= 1400 + 70}
[7] [210 [7] [30 [3] [10 [2] [5] ] ] ]]
\end{forest}
\end{document}

在文本右侧添加标签

...节点,以便它们的基线对齐,我们不必更改任何inner xseps。

通用锚点text right位于基线处文本(而非节点)的右边界。这可保持父节点不变。

PGF 附带的所有[需要引用](单部分)形状的文本框都位于形状的中间。

考虑原始rectangle形状的锚点。请记住,节点的坐标系的原点位于文本锚点处。锚点的底部、中间和中心位于文本框的水平中心。要获得文本的正确坐标,我们只需将X基础锚点及其值(应为 0pt)。

在此处输入图片描述


Forestmath content将树节点的内容放入 中\ensuremath。我看不出有什么好办法可以将 Forest 挂content format在标签中,这就是为什么我明确使用$标签和 的原因mathrlap。(Mathtools 的宏还会根据使用位置确保正确设置字体大小,\mathrlap但这里没有这样做。)

\documentclass[12pt]{article}
\usepackage{forest}
\makeatletter
\pgfdeclaregenericanchor{text right}{%
  \pgf@sh@reanchor{#1}{base}%
  \multiply\pgf@x by 2
}
\makeatother
\tikzset{
  mathrlap/.style={label={[anchor=text,       every mathrlap/.try]text right: {${}#1$}}},
  mathllap/.style={label={[anchor=text right, every mathllap/.try]text:       {$#1{}$}}},
  rlap/.style    ={label={[anchor=text,       every rlap/.try]    text right: {#1}}},
  llap/.style    ={label={[anchor=text right, every llap/.try]    text:       {#1}}}}
% forest keys so forest/label gets used
\forestset{/utils/temp/.style={#1/.style={/tikz/#1={##1}}},/utils/temp/.list={mathrlap,mathllap,rlap,llap}}

\begin{document}
\begin{forest}
for tree={math content}
[1470, mathrlap={= 1400 + 70}
[7] [210 [7] [30 [3] [10 [2] [5] ] ] ]]
\end{forest}
\end{document}

“不居中”的矩形

这是我所想的形状:uncentered rectangle
可以通过加载ext.shapes.uncenteredrectangle我的库来使用它tikz-ext包裹(至少需要 v0.4.1)。

最简单的使用方法是

[{1470 \nodepart{three}= 1400 + 70}, uncentered rectangle]

但由于math content不适用于多部分形状,因此您需要“取消数学运算”该\nodepart宏:

[{1470 $\nodepart{right}$ {}= 1400 + 70}, uncentered rectangle]

这在语义上是荒谬的,这就是为什么我建议不要math content在该节点上使用:

[{1470 \nodepart{right}$ {}= 1400 + 70$}, uncentered rectangle, plain content]

mathlrap但与之前一样,我们可以只使用一个math align right键来设置节点的内容,而不必考虑太多。

[,math align right={1470 = 1400 + 70}]

或带星号的版本

[{1470 = 1400 + 70}, math align right*]

forest也允许测试内容=并自动应用math align right*密钥(这是我在下面的代码中所使用的)。

按照我的设置方式,它不允许另一个节点具有,=math align left我确信无论如何都有办法通过正确的键和样式组合来做到这一点。


形状的定义允许其中心锚点(包括中间、底部、北和南)随时改变。(anchor=base由 使用forest。)

这意味着我们可以根据一个中心放置节点,但通过设置/pgf/uncentered rectangle centerleft、或 ,text将边连接到另一个中心。默认值为,即节点部分名称为 的主要中间部分的中心。rightrealtexttext

代码(数学内容)

\documentclass[12pt,tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{ext.shapes.uncenteredrectangle}
\forestset{
  auto align right/.style={if in content={=}{math align right*}{}},
  math align left*/.style={math align left/.expanded=\forestov{content}},
  math align right*/.style={math align right/.expanded=\forestov{content}},
  math align/.style={
    shape=uncentered rectangle, uncentered rectangle center=text, % default
    plain content}, % disable math content because of multiple node parts
  math align right/.style args={#1=#2}{math align,content={$#1$\nodepart{right}${}=#2$}},
  math align left/.style args={#1=#2}{math align, content={$#2$\nodepart{left}$#1={}$}}}
\begin{document}
\begin{forest}
    for tree={math content}, delay={for tree=auto align right}
    [{1470 = 1400 + 70}
        [7]
        [{210 = 200 + 10}
            [7]
            [{30 = 30 + 0}
                [3]
                [{10 = 2 \cdot 5}
                    [2]
                    % conflicts with auto align right ☹ 
                    % [{1 + 1 = 2}, math align left*]
                    [5]
                ]
            ]
        ]
    ]
\end{forest}
\end{document}

代码(在 处拆分:,无输出)

\documentclass[12pt,tikz]{standalone}
\usepackage{forest}
\usetikzlibrary{ext.shapes.uncenteredrectangle}
\forestset{
  auto split colon/.style={if in content={:}{
    split colon/.expanded=\forestov{content}}{}},
  split colon/.style args={#1:#2}{
    plain content, uncentered rectangle,
    content={#1\nodepart{right}\null#2}}}
\begin{document}
\begin{forest}
  for tree={math content}, delay={for tree=auto split colon}
  [1470 : some text % space before : gets gobbled up
    [7]
    [210 : some other text
      [7]
      [30 : % (nothing in the right side, all spaces get gobbles)
        [3]
        [10 : $2 \cdot 5$
          [2]
          [5]
        ]
      ]
    ]
  ]
\end{forest}
\end{document}

输出(数学内容)

在此处输入图片描述

答案2

以下是如何在 的帮助下做到这一点mathtools

\documentclass[12pt]{article}
\usepackage[T1]{fontenc}
\usepackage{mathtools}
\usepackage{forest}

\begin{document}

\begin{forest}
    for tree={math content}
    [1470 \mathrlap{{}= 1400 + 70}  % <---
        [7]
        [210
            [7]
            [30
                [3]
                [10
                    [2]
                    [5]
                ]
            ]
        ]
    ]
\end{forest}
\end{document}

在此处输入图片描述

相关内容