我尝试使用以下tikzpicture
压缩newcommand
:
\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 Error: No shape named is known.
(注意“named”和“is”之间的双重空格)。如果我手动展开第二个tchild
,我也会收到一份工作文件。任何想法在这里出了什么问题?
\begin{tikzpicture}
\node{0} [grow'=right]
\tchild{0}{1}{}
\tchild{1}{0}{};
\end{tikzpicture}
答案 0 :(得分:0)
编辑:对于一些非常酷(和工作)的PerlTeX与TikZ的例子,请看TUGboat article!
我认为这是因为TikZ图片的语法通常比LaTeX更自由。我可以看到,在将tikz命令放入宏时,在pgfmanual中,宏包含tikzpicture环境(参见例如pgfmanual.pdf的第223页,这是库部分(IV)的第一页)。
我知道我会成为一个破纪录但是为了定义复杂的宏,我建议尽可能使用PerlTeX。这允许定义更复杂的宏,并且还允许避免一些扩展后的混乱。
编辑:下面(参见OLD)不起作用,因为PerlTeX宏必须返回一个完整的TikZ命令,为此我模拟了这个版本。新命令树采用三个参数:根名称,根节点参数,然后是您最初使用的三个命令,但设置方式不同。每个子节点用冒号(:)分隔,三个原始命令用逗号(,)分隔。也许它更容易看到代码本身。再次编译命令与OLD中的相同。
\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}
--- END OLD ---
所有这一切,也许你的问题是你如何对待可选的#3,也许如果你真的做了那个可选而不是定义并且空了它会更好地工作(即\ tchild [] {0} {1})