如下图所示,我想将标签对齐,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 xsep
s。
有通用锚点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 center
为left
、或 ,text
将边连接到另一个中心。默认值为,即节点部分名称为 的主要中间部分的中心。right
real
text
text
代码(数学内容)
\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}