xparse 可选参数导致 tikz 出现错误

xparse 可选参数导致 tikz 出现错误

我正在尝试为 B 树创建一些简单的宏,其中一个宏应该根据它获得的参数数量创建一个多部分节点 tikz。因此,我使用了gxparse 中的参数说明符,但 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 将边绘制到实际的节点形状中。

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}

在此处输入图片描述

相关内容