使用 tikz-pgf 的帕斯卡三角形:缺少分号

使用 tikz-pgf 的帕斯卡三角形:缺少分号

我试了几个分号,但不知道把它们放在哪里。我知道放在节点最末端就可以了,但当我尝试把它放在那里时却不起作用。我是新手pgfplots。有人能帮我吗?

\documentclass{article}
\usepackage{tikz}
\usepackage{amsmath}

\newcommand{\binomtree}[2]{
    \newcounter{one}
    \newcounter{two}
    \setcounter{one}{#1}
    \setcounter{two}{#2}
    \addtocounter{one}{-1}
    \addtocounter{two}{-1}
    \node[circle,draw](z){$\binom{#1}{#2}$}
        \ifnum#1<1%
            child[missing]{}
        \else
            child{\binomtree{\value{one}}{\value{two}}}
        \fi
        \ifnum#2<1%
            child[missing]{}
        \else
            child{\binomtree{\value{one}}{#2}}
        \fi
}

\begin{document}

\begin{tikzpicture}
\binomtree{7}{5}
\end{tikzpicture}

\end{document}

编辑:我按照评论说的做了,但又遇到了新的问题,即它无法将给定的数字识别为数字。

解释一下:我试图想象二元组的递归求解就像它呈现的那样帕斯卡三角形

\newcommand{\resttree}[2]{
    \setcounter{one}{#1}
    \setcounter{two}{#2}
    \addtocounter{one}{-1}
    \addtocounter{two}{-1}
    node[circle,draw](#1#2){$\binom{#1}{#2}$};
        \ifnum#1<1%
            child[missing]{}
        \else
            child{\resttree{\value{one}}{\value{two}}}
        \fi
        \ifnum#2<1%
            child[missing]{}
        \else
            child{\resttree{\value{one}}{#2}}
        \fi;
}
\newcommand{\binomtree}[2]{
    \newcounter{one}
    \newcounter{two}
    \setcounter{one}{#1}
    \setcounter{two}{#2}
    \addtocounter{one}{-1}
    \addtocounter{two}{-1}
    \node[circle,draw](#1#2){$\binom{#1}{#2}$};
        \ifnum#1<1%
            child[missing]{}
        \else
            child{\resttree{\value{one}}{\value{two}}}
        \fi
        \ifnum#2<1%
            child[missing]{}
        \else
            child{\resttree{\value{one}}{#2}}
        \fi;
}

答案1

以下是关于如何使用 完成此操作的建议expl3。您可以\doBinom{8}根据需要使用并设置数字。它还可以使用 解决二元运算\solveBinom{7}{5},请查看输出。

解释3

expl3使用来自 LaTeX3 项目的一些开发代码,但它被认为非常稳定。语法可能看起来有点不同,一开始可能有点吓人,但使用一段时间后就会变得非常合乎逻辑。命名方案可能是与常规 LaTeX 最不同的地方,因此确实需要一些解释。命令本身与您可能从大多数其他现代语言中看到的非常相似。

命名方案

命名方案在的文档中得到了很好的解释expl3,该文档很简短,如果您有兴趣,值得一读。

我将在这里对我使用过的一些代码进行非常简短的解释。命令本身在文章底部的完整代码中进行了进一步的注释。

在下面的代码中,只有几个函数,都是针对整数的。这些函数以命令的描述开头\int_,后面跟着命令的描述。例如

\int_compare:nNnTF {#1} < {#2} {true} {false}

是一个compare- 函数。在 之后:,紧接着是一系列字母。这里有多少个字母,告诉您命令应采用多少个参数。这个命令需要五个参数。字母本身是设置如何处理输入的不同方式,涉及扩展,使用 会更容易expl3TF这里是 True 和 False 代码。n是带括号的参数, N是不带括号的参数。这有点简化,请参阅文档。

对于变量,命名方案非常相似。

\l_tmpa_int

\l表示它是一个局部变量,与全局变量不同。_tmpa是描述,_int是变量的类型,整数。通常,变量以及 newexpl3函数也会使用模块名称,但我在这里只使用了一个临时变量。

输出

在此处输入图片描述

代码

\documentclass[11pt]{article}
\usepackage{xparse}
\usepackage{mathtools}
\usepackage{subcaption}
\ExplSyntaxOn

% Prints a complete row of binoms
\NewDocumentCommand{\doBinomRow}{mO{0}o}{
    % Specify a command which takes the following input:
    % #1: Mandatory ( m ), the row, n-number
    % #2: Optional, with default value 0 ( O{0} ). Starting k-number
    % #3: Optional ( o ). Ending k-number
    \int_set:Nn \l_tmpb_int {#2}% Set counter to value of #2(default is 0}
    \int_do_until:nNnn {\l_tmpb_int} > {\IfNoValueTF{#3}{#1}{#3}} { % repeat until counter is as high as #1, or #3 if specified.
        \( \binom{ #1 }{ \int_use:N \l_tmpb_int } \) % Print the binom, with value from #1 and counter
        \int_incr:N \l_tmpb_int % increase the counter
        }

    }

% Prints all rows to n-number binom
\newcommand{\doBinom}[1]{
    % Specify a command which takes the following input:
    % #1: Mandatory. the row, n-number to print to.
    \int_zero:N \l_tmpa_int % set counter to zero
    \int_do_until:nNnn {\l_tmpa_int} > {#1} { % repeat command until counter is as high as #1
        \doBinomRow{\int_use:N \l_tmpa_int } % Send row to print
        \int_incr:N \l_tmpa_int\\ % Increase the counter
        }
    }
% Solves a binom
\newcommand{\solveBinom}[2]{
    % Specify a command which takes the following input:
    % #1: Mandatory. n-number to solve
    % #2: Mandatory. k-number to solve
    \int_zero:N \l_tmpa_int% set counter to zero
    \int_do_until:nNnn {\l_tmpa_int} > 
    {\int_compare:nNnTF {#1} < {#2} {#1} {#2}} { % repeat command until counter is as high as #1 or #2, just to be safe so we don't print negative values in case user types an odd value.
        \doBinomRow{ \int_eval:n {#1-\l_tmpa_int} }[ \int_eval:n {#2 -\l_tmpa_int } ][#2] % Print the row, with decreasing n-number and starting k-number for each row.
        \int_incr:N \l_tmpa_int\\ %Increase the counter.
        }
    }

\ExplSyntaxOff
\begin{document}
\begin{figure}[hbt]
  \begin{minipage}[b]{7cm}
    \centering
    \doBinomRow{8}\\
    \doBinomRow{8}[3]\\
    \doBinomRow{8}[3][6]\\[4ex]
    \subcaption{Some different ways to input a row}
\end{minipage}\hfill%
  \begin{minipage}[b]{7cm}
    \centering
    \doBinom{5}
    \subcaption{Printing a stack of binoms }
\end{minipage}\vspace*{4ex}
  \begin{minipage}[b]{7cm}
    \centering
    \doBinomRow{7}[5][5]\\
    \doBinomRow{6}[4][5]\\
    \doBinomRow{5}[3][5]\\
    \doBinomRow{4}[2][5]\\
    \doBinomRow{3}[1][5]\\
    \doBinomRow{2}[0][5]\\
    \subcaption{Solving a binom manually}
\end{minipage}\hfill%
  \begin{minipage}[b]{7cm}
    \centering
    \solveBinom{7}{5}
    \subcaption{Solving a binom automatically}
\end{minipage}%
\end{figure}


\end{document}

答案2

对于较大的值,x键可能必须改变:

\documentclass[varwidth,border=5]{standalone}
\usepackage{tikz,amsmath}
\tikzset{pics/binom/.style={code={
  \foreach \k [evaluate={\i=int(\k-1);}] in {1,...,#1}
    \foreach \j in {0,...,\i}
      \node at (-\i/2+\j, -\i) {$\binom{\i}{\j}$};
}}}
\begin{document}
\centering
\foreach \n in {1, 3, ..., 11}{
  \tikz\pic [x=1.75em, y=1.5em] at (0, -\n*2.5) {binom=\n};
  \\[1em]}
\end{document}

在此处输入图片描述

答案3

以下是 Forest 的解决方案:

\documentclass[border=10pt,tikz,multi]{standalone}
\usepackage{amsmath,forest}
\forestset{%
  declare count register={nint},
  declare count register={kint},
  declare count={kinth}{0},
  nint'=-1,
  kint'=-1,
  binom tree/.style args={#1:#2}{%
    if nint={-1}{
      nint'=#1,
    }{},
    if kint={-1}{
      kint'=#2,
    }{},
    kinth'=#2,
    content={\binom{#1}{#2}},
    math content,
    if={((nint)>level())&&((kint)>level())}{%
      delay={%
        if={(n()==1)||(level()==0)}{%
          prepend={%
            [, binom tree/.wrap 2 pgfmath args={##1:##2}{int(#1-1)}{int(#2-1)}]
          },
        }{%
          prepend={%
            [, phantom]
          },
        },
          append={%
            [, binom tree/.wrap pgfmath arg={##1:#2}{int(#1-1)}]
          },
      },
    }{},
    for tree={%
      no edge,
      l sep=0pt,
      inner sep=0pt,
    },
    before typesetting nodes={%
      for tree={%
        tier/.option=level,
      }
    },
    before computing xy={%
      for tree={%
        l'=\baselineskip,
      },
    },
    before drawing tree={%
      where level=0{}{%
        x/.pgfmath={x("!r")+((kinth()-(kint)+level()/2)*15pt)}
      },
    }
  },
}
\newcommand*\binomtree[2]{%
  \Forest{[, binom tree={#1:#2}]}%
}
\begin{document}
\begin{forest}
  [, binom tree={7:5}
  ]
\end{forest}
\begin{forest}
  [, binom tree={5:4}
  ]
\end{forest}
\binomtree{6}{3}
\binomtree{6}{5}
\end{document}

\binomtree{}{}只是一个方便的包装器,可以省去forest每次调用环境的麻烦。因此,上面的前两个例子也可以写成

\binomtree{7}{5}
\binomtree{5}{4}

输出结果如下:

7:5

5:4

6:3

6:5

这种方法的优点是,forest如果您愿意的话,您可以通过使用环境版本访问 Forest 和 TikZ 的所有用于注释树的功能。

例如,假设我们想将树的层级标记为 0、1、2 等等。此外,我们想突出显示从树的根到对应于 的终点的“路径” \binom{2}{3}。那么我们可以说

\begin{forest}
  before drawing tree={%
    where={kinth()==(kint)}{%
      tikz+/.wrap pgfmath arg={%
        \node [anchor=east] at ([xshift=-20pt]!rF.west |- .center) {#1:};
      }{level()},
    }{},
  },
  before typesetting nodes={%
    where content={\binom{2}{3}}{%
      for current and ancestors={red},
    }{},
  }
  [, binom tree={7:5}]
\end{forest}

注释示例

尽管我创建了binom tree语法#1:#2,但您可以根据{#1}{#2}需要使用它。(事实上,如果有的话,这样做更简单。)

相关内容