我正在尝试用树表示一些矩阵。矩阵的节点越高,我希望字体越大(节点越低,字体越小)。我想出了(在 TikzEdt 中)
begin{tikzpicture} [
level 1/.style={level distance=3cm,sibling distance =10cm},
level 2/.style={level distance=3cm,sibling distance =1.5cm},
level 3/.style={level distance=1.5cm,sibling distance =0.8cm},
every node/.style = {shape=rectangle, rounded corners, draw, align=center}
]
\node {\Huge1 0 0\\\Huge 0 1 0\\\Huge0 0 1}
child { node {\LARGE1 0 0\\\LARGE1 1 0\\\LARGE1 1 1}
child { node {\Large1 0 0\\\Large2 1 0\\\Large3 2 1} }
child { node {1 0 0\\2 0 1\\3 1 2} }
child { node {0 1 0\\1 2 0\\2 3 1} }
child { node {0 0 1\\1 0 2\\2 1 3} }
child { node {0 1 0\\0 2 1\\1 3 2} }
child { node [font=\fontsize{140}{120}\selectfont] {0 0 1\\0 1 2\\1 2 3} }
} ;
\end{tikzpicture}
这使
可以看出,除了 baselineskip 之外,\Huge、\LARGE 和 \Large 都可以使用,但我想自己选择字体,我在上一个矩阵中尝试过。可以看出,baselineskip {120} 可以工作,但 fontsize {140} 没有达到预期的效果。
我的 TikzEdt 序言是
\documentclass{article}
\usepackage{tikz,amsmath, amssymb,bm,color}
\usepackage[margin=0cm,nohead]{geometry}
\usepackage[active,tightpage]{preview}
%\usepackage{tikz-qtree}
\usepackage[linguistics]{forest}
\usepackage{anyfontsize}
\usetikzlibrary{shapes,arrows,arrows.meta}
\usetikzlibrary{calc,graph}
%\usetikzlibrary{graphdrawing,graphdrawing.trees}
\usepackage{relsize}
我的最后一个解决方案是
\begin{document}
\begin{forest}
matrices,
scale fonts=from 45pt to 15pt,
[1&0&0\\0&1&0\\0&0&1,l sep=1cm
[1&0&0\\1&1&0\\1&1&1
[1&0&0\\2&1&0\\3&2&1]
[1&0&0\\2&0&1\\3&1&2]
[0&1&0\\1&2&0\\2&3&1]
[0&0&1\\1&0&2\\2&1&3]
[0&1&0\\0&2&1\\1&3&2]
[0&0&1\\0&1&2\\1&2&3]
]
[1&0&0\\1&0&1\\1&1&1 ,l*=3.5
[1&0&0\\2&1&1\\3&2&1]
[1&0&0\\2&1&1\\3&1&2]
[0&1&0\\1&2&1\\2&3&1]
[0&0&1\\1&1&2\\2&1&3]
[0&1&0\\1&2&1\\1&3&2]
[0&0&1\\1&1&2\\1&2&3]
]
[0&1&0\\1&1&0\\1&1&1 ,l*=6
[1&1&0\\2&1&0\\3&2&1]
[1&0&1\\2&0&1\\3&1&2]
[1&1&0\\1&2&0\\2&3&1]
[1&0&1\\1&0&2\\2&1&3]
[0&1&1\\0&2&1\\1&3&2]
[0&1&1\\0&1&2\\1&2&3]
]
[0&0&1\\1&0&1\\1&1&1 ,l*=6
[1&1&1\\2&1&1\\3&2&1]
[1&1&1\\2&1&1\\3&1&2]
[1&1&1\\1&2&1\\2&3&1]
[1&1&1\\1&1&2\\2&1&3]
[1&1&1\\1&2&1\\1&3&2]
[1&1&1\\1&1&2\\1&2&3]
]
[0&1&0\\0&1&1\\1&1&1 ,l*=3.5
[1&1&0\\2&2&1\\3&2&1]
[1&0&1\\2&1&2\\3&1&2]
[1&1&0\\2&2&1\\2&3&1]
[1&0&1\\2&1&2\\2&1&3]
[0&1&1\\1&2&2\\1&3&2]
[0&1&1\\1&2&2\\1&2&3]
]
[0&0&1\\0&1&1\\1&1&1
[1&1&1\\2&2&1\\3&2&1]
[1&1&1\\2&1&2\\3&1&2]
[1&1&1\\2&2&1\\2&3&1]
[1&1&1\\2&1&2\\2&1&3]
[1&1&1\\1&2&2\\1&3&2]
[1&1&1\\1&2&2\\1&2&3]
]
]
\end{forest}
\end{document}
答案1
这是一个使用的解决方案forest
。(我不知道 TikZEdt 是什么。)
这会将特定字体大小附加到树的特定级别。我还创建了一个命令来简化矩阵的输入:输入逗号分隔的三元组列表,它会将它们转换为矩阵。
\mfmt{100,010,111}
这是一个完整的例子。
\documentclass{article}
\usepackage{lmodern}
\usepackage[T1]{fontenc}
\usepackage{etoolbox}
\usepackage[linguistics]{forest}
\newcommand*{\enormous}{\fontsize{40}{40}\selectfont}
\forestset{node fonts/.style={
for tree={draw,rounded corners,inner sep=.2em},
where level=0{font=\enormous}
{if level=1{font=\large}
{if level=2{font=\normalsize}
{if level=3{font=\tiny}
{font=\footnotesize}}}}}}
\newcounter{rowcount}
\newcommand*{\addrow}[1]{%
\stepcounter{rowcount}%
\ifnum\value{rowcount}<3\scan{#1}\\%
\else\scan{#1}\fi}
\newcommand{\mfmt}[1]
{\setcounter{rowcount}{0}%
\forcsvlist\addrow{#1}%
\vspace*{-.5ex}}
% This code adapted from https://tex.stackexchange.com/a/233227/2693
\newcommand*\scan[1]{\scanA#1\end}
\newcommand*\scanA[1]{\ifx\end#1\else
\ifx#1,\relax\else%
\space#1\space% <- The processing over one token is here
\fi
\expandafter \scanA \fi
}
\begin{document}
\begin{forest}node fonts
[\mfmt{100,010,001} [\mfmt{001,010,111} ] [\mfmt{001,010,111} ] [\mfmt{001,010,111} ] [\mfmt{010,111,000} [\mfmt{000,111,010} ] [\mfmt{000,111,010} [\mfmt{000,111,010} ] [\mfmt{000,111,010} ] [\mfmt{000,111,010} ] ] [\mfmt{000,111,010} ]]]
\end{forest}
\end{document}
答案2
这是另一个 Forest 版本,它按比例缩放每个级别的字体。启用树的matrices
样式。将内容包装在环境中。在两个给定维度之间缩放字体。例如,将使根使用,最后一级的叶子使用,所有其他节点使用介于两者之间的适当字体。显然,这需要可缩放的字体。matrix
matrix
smallmatrix
scale fonts=from <dimension at root> to <dimension at greatest level>
scale fonts=from 40pt to 10pt
40pt
10pt
这样做的好处是,您可以增加或减少级别数,并且缩放比例会自动调整,但您仍然可以完全控制树中最小和最大的字体。
lmodern
如果您使用诸如(pah!)之类的字体包,请\tlstyle
从定义中删除,否则您将收到错误。
请注意,您实际上不需要特殊的宏来将 或类似的环境包装tabular
在array
节点内容周围。 Forest 已经包含了此功能。 (实际上,每次您说 时都会使用它align=<something>
。)
以下是Alan Munn 的回答。
\documentclass[border=10pt]{standalone}
\usepackage{cfr-lm}
\usepackage[linguistics]{forest}
\usepackage{amsmath}
\forestset{
matrices/.style={
for tree={
matrix,
draw,
rounded corners,
},
},
matrix/.style={
content format={%
\ensuremath{\noexpand\begin{smallmatrix}\forestoption{content}\noexpand\end{smallmatrix}}%
},
},
declare count register={total levels},
declare dimen register={level incr},
level incr'=0pt,
total levels'=0,
scale fonts/.style args={from #1 to #2}{
before typesetting nodes={
total levels/.max={>O{level}}{tree},
level incr/.process={Rn+dw2+n+d{total levels}{#2-#1}{##2/##1}},
for tree={
font/.process={ORw2+nw+dw{level}{level incr}{##1*##2}{##1+#1}{\tlstyle\fontsize{##1}{##1}\selectfont}}
},
},
},
}
\begin{document}
\begin{forest}
matrices,
scale fonts=from 40pt to 10pt,
[1&0&0\\0&1&0\\0&0&1
[0&0&1\\0&1&0\\1&1&1]
[0&0&1\\0&1&0\\1&1&1]
[0&0&1\\0&1&0\\1&1&1]
[0&1&0\\1&1&1\\0&0&0
[0&0&0\\1&1&1\\0&1&0]
[0&0&0\\1&1&1\\0&1&0
[0&0&0\\1&1&1\\0&1&0]
[0&0&0\\1&1&1\\0&1&0]
[0&0&0\\1&1&1\\0&1&0]
]
[0&0&0\\1&1&1\\0&1&0]
]
]
\end{forest}
\end{document}
编辑
这是一个使用 Alan 的答案中的逗号拆分方法的版本,但在 Forest 中实现了它。
\documentclass[border=10pt]{standalone}
\usepackage{cfr-lm}
\usepackage[linguistics]{forest}
\usepackage{amsmath}
\forestset{
matrices/.style={
for tree={
matrix,
draw,
rounded corners,
},
},
matrix/.style={
content format={%
\ensuremath{\noexpand\begin{smallmatrix}\forestoption{content}\noexpand\end{smallmatrix}}%
},
},
declare count register={total levels},
declare dimen register={level incr},
level incr'=0pt,
total levels'=0,
scale fonts/.style args={from #1 to #2}{
before typesetting nodes={
total levels/.max={>O{level}}{tree},
level incr/.process={Rn+dw2+n+d{total levels}{#2-#1}{##2/##1}},
for tree={
font/.process={ORw2+nw+dw{level}{level incr}{##1*##2}{##1+#1}{\tlstyle\fontsize{##1}{##1}\selectfont}}
},
},
},
add row/.style={
if rows={}{rows=#1}{rows+=\\#1}
},
declare autowrapped toks={rows}{},
auto matrices/.style={
matrices,
before typesetting nodes={
for tree={
split option={content}{,}{add row},
content/.option=rows,
},
},
},
}
\begin{document}
\begin{forest}
auto matrices,
scale fonts=from 40pt to 10pt,
[{1&0&0,0&1&0,0&0&1}
[{0&0&1,0&1&0,1&1&1}]
[{0&0&1,0&1&0,1&1&1}]
[{0&0&1,0&1&0,1&1&1}]
[{0&1&0,1&1&1,0&0&0}
[{0&0&0,1&1&1,0&1&0}]
[{0&0&0,1&1&1,0&1&0}
[{0&0&0,1&1&1,0&1&0}]
[{0&0&0,1&1&1,0&1&0}]
[{0&0&0,1&1&1,0&1&0}]
]
[{0&0&0,1&1&1,0&1&0}]
]
]
\end{forest}
\end{document}
输出如上。