Latex 将宏与tikzpictures一起使用?

Latex 将宏与tikzpictures一起使用?,latex,macros,tikz,Latex,Macros,Tikz,我尝试使用以下newcommand压缩一张tikzpicture: \newcommand{\tchild}[3]{ child { node{#2} #3 edge from parent node[above]{#1} } } %intended usage: \tchild{edge label}{vertex label}{child nodes} 如果我把它应用到下面的例子中,我会得到一个工作文档。但是,对于下面给出的示例,pdflatex给出了一个Package pgf错误:没有命

我尝试使用以下
newcommand
压缩一张
tikzpicture

\newcommand{\tchild}[3]{ child { node{#2} #3 edge from parent node[above]{#1} } }
%intended usage: \tchild{edge label}{vertex label}{child nodes}
如果我把它应用到下面的例子中,我会得到一个工作文档。但是,对于下面给出的示例,
pdflatex
给出了一个
Package pgf错误:没有命名的形状。
(注意“命名”和“是”之间的双空格)。如果我手动展开第二个
tchild
,我也会得到一个工作文档。你知道这里出了什么问题吗

\begin{tikzpicture}
    \node{0} [grow'=right]
        \tchild{0}{1}{}
        \tchild{1}{0}{};
\end{tikzpicture}

编辑:对于一些真正酷(和工作)的例子PerlTeX与TikZ看到这个

我相信这是因为TikZ图片的语法比一般的LaTeX更自由。我可以看到,在pgfmanual中将tikz命令放入宏时,宏包含tikzpicture环境(例如,请参见pgfmanual.pdf的第223页,即库部分(IV)的第一页)

我知道我会打破记录,但对于定义复杂的宏,我建议尽可能使用PerlTeX。这允许定义更复杂的宏,还允许避免一些expandafter混乱

编辑:由于PerlTeX宏必须返回完整的TikZ命令,所以下面的(请参阅旧版本)不起作用,为此,我模拟了这个版本。新的命令树采用三个参数:根名称、根节点参数,然后是您最初使用的三个命令,但是设置不同。每个子命令用冒号(:)分隔,三个原始命令用逗号(,)分隔。也许更容易看到代码本身。同样,编译命令与旧命令相同

\documentclass{article}
\usepackage{perltex}

\usepackage{tikz}

\perlnewcommand{\tree}[3]{ 
  my ($root,$root_opts,$children) = @_;
  my @children = split(/\:/, $children);

  my $return = '';

  $return .= sprintf( "\\node{%s} \[%s\]\n", $root,$root_opts);

  foreach my $child (@children) {
    my ($edge, $vertex, $child_nodes) = split(/,/, $child);
    $child_nodes ||= '';
    $return .= sprintf("child { node{%s} %s edge from parent node[above]{%s} }\n",$vertex,$child_nodes,$edge);
  }
  $return .= "\;\n"; 
  return $return;
}

\begin{document}
\begin{tikzpicture}
%    \node{0} [grow'=right]
%      child { node{1}  edge from parent node[above]{0} }
%     child { node{0}  edge from parent node[above]{1} };
  \tree{0}{grow'=right}{0,1:1,0}
\end{tikzpicture}
\end{document}
---变老---

我曾尝试将一些东西拼凑在一起,但它没有编译(可能是因为我从未使用TikZ制作过树)。也就是说,也许问题在于PerlTeX没有充分利用TikZ命令。将perl哈希转换为TikZ树可能是一个非常酷的项目。反正在这儿。请注意,您可以使用perltex--latex=pdflatex text.tex编译它:

\documentclass{article}
\usepackage{perltex}

\usepackage{tikz}

\perlnewcommand{\tchild}[3]{ 

  my ($edge, $vertex, $child) = @_;

  $child ||= '';

  my $return = 'child { node{' . $vertex . '} ' . $child . ' edge from parent node[above]{' . $edge . '} }';

  return $return;
}

\begin{document}
\begin{tikzpicture}
    \node{0} [grow'=right]
        \tchild{0}{1}{}
        \tchild{1}{0}{}
    ;
\end{tikzpicture}
\end{document}
---老去---


综上所述,也许你的问题是你如何处理可选的#3,也许如果你真的将它设置为可选的而不是定义为空的,它会工作得更好(例如,\tchild[]{0}{1})。

Uhm,那么你的第一种方法正好遇到了同样的问题?您的解决方案基本上归结为将
\node
也放在宏中。这在没有perltex的情况下也是可能的。不过我没能把它编译好。是的,我同意你应该能够把TikZ命令的一部分放到宏中,但它似乎不起作用。是的,在你的情况下,我不确定PerlTeX是否会有帮助,直到你进入大量的节点,在这种情况下,PerlTeX或PgfFor都会为你提供你想要的功能。