我试了几个分号,但不知道把它们放在哪里。我知道放在节点最末端就可以了,但当我尝试把它放在那里时却不起作用。我是新手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
- 函数。在 之后:
,紧接着是一系列字母。这里有多少个字母,告诉您命令应采用多少个参数。这个命令需要五个参数。字母本身是设置如何处理输入的不同方式,涉及扩展,使用 会更容易expl3
。TF
这里是 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}
输出结果如下:
这种方法的优点是,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}
需要使用它。(事实上,如果有的话,这样做更简单。)