编辑

编辑

我正在尝试用树表示一些矩阵。矩阵的节点越高,我希望字体越大(节点越低,字体越小)。我想出了(在 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样式。将内容包装在环境中。在两个给定维度之间缩放字体。例如,将使根使用,最后一级的叶子使用,所有其他节点使用介于两者之间的适当字体。显然,这需要可缩放的字体。matrixmatrixsmallmatrixscale fonts=from <dimension at root> to <dimension at greatest level>scale fonts=from 40pt to 10pt40pt10pt

这样做的好处是,您可以增加或减少级别数,并且缩放比例会自动调整,但您仍然可以完全控制树中最小和最大的字体。

lmodern如果您使用诸如(pah!)之类的字体包,请\tlstyle从定义中删除,否则您将收到错误。

请注意,您实际上不需要特殊的宏来将 或类似的环境包装tabulararray节点内容周围。 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}

输出如上。

相关内容