我正在尝试为 B 树创建一些简单的宏,其中一个宏应该根据它获得的参数数量创建一个多部分节点 tikz。因此,我使用了g
xparse 中的参数说明符,但 tikz 总是显示以下错误:
Package tikz Error: Giving up on this path. Did you forget a semicolon?. ;
Package tikz Error: Giving up on this path. Did you forget a semicolon?. ;
Undefined control sequence. ;
g
当将s 替换为s时,宏可以完美地工作,m
但是随后就无法区分具有例如 4 个段(其中两个为空)和 2 个段节点(全部已填充)的多部分节点。
一个有点最小的工作示例:
\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{trees,shapes.multipart}
\NewDocumentCommand\test{m g}{
{#1 \IfValueT{#2}{B}}
}
\NewDocumentCommand\leaf{m m}{
node[leaf]{#1 \nodepart{two} #2}
}
\NewDocumentCommand\leafOptional{m g}{
node[leaf]{#1 \IfValueT{#2}{\nodepart{two} #2}}
}
\tikzset{
btree/.style={
nodes={rectangle split,rectangle split horizontal=true,draw},
leaf/.style={
rectangle split allocate boxes=2,
rectangle split parts=2,
rectangle split part fill=white}
},
}
\begin{document}
\test{a}\\ % this works
\test{a}{something}\\ % as does this
\begin{tikzpicture}[btree]
\node (root) {test}
child {\leaf{5}{}}
child {\leafOptional{5}} % however this fails
child {\leafOptional{5}{}} % and so does this
child {node[leaf]{1}}
;
\end{tikzpicture}
\end{document}
我已经找到了这个问题TikZ 路径不适用于 xparse 生成的宏这似乎是一个类似的问题,但我无法使用,\DeclareDocumentCommand
因为它不允许使用g
/G
参数说明符
附加值
根据@PhelypeOleinik 的评论,我更改了要使用的代码\NewExpandableDocumentCommand
和参数说明符o o o m
,但是当传递多个可选参数时,这导致 tikz 无法确定正确的节点边界框,并且 tikz 将边绘制到实际的节点形状中。
\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{trees,shapes.multipart}
\NewExpandableDocumentCommand\leaf{o o o m}{
node[leaf]{
6\nodepart{two}8\nodepart{three}2\nodepart{four}#4
}
}
\tikzset{
btree/.style={
nodes={rectangle split,rectangle split horizontal=true,draw},
level 1/.style={sibling distance=\textwidth/4},
leaf/.style={rectangle split allocate boxes=4}
},
}
\begin{document}
\begin{tikzpicture}[btree]
\node (root) {test}
child {\leaf{5}}
child {\leaf[a]{5}}
child {\leaf[a][b]{5}}
child {\leaf[a][b][c]{5}}
;
\end{tikzpicture}
\end{document}
添加leaf/.style={..., rectangle split part fill=white}
似乎可以解决症状但不能解决根本原因——有任何可能的解决方案可以将其与透明节点一起使用吗?
答案1
我发现使用node[leaf] {\leaf ...}
方法:
\documentclass{article}
\usepackage{tikz}
\usepackage{xparse}
\usetikzlibrary{trees,shapes.multipart}
\NewExpandableDocumentCommand\leaf{o o o m}{
6\nodepart{two}8\nodepart{three}2\nodepart{four}#4
}
\tikzset{
btree/.style={
nodes={rectangle split,rectangle split horizontal=true,draw},
level 1/.style={sibling distance=\textwidth/4},
leaf/.style={rectangle split allocate boxes=4}
}
}
\begin{document}
\begin{tikzpicture}[btree]
\node (root) {test}
child { node[leaf]{\leaf{5}} }
child { node[leaf]{\leaf[a]{5}} }
child { node[leaf]{\leaf[a][b]{5}} }
child { node[leaf]{\leaf[a][b][c]{5}} }
;
\end{tikzpicture}
\end{document}