Frage

Ich habe versucht, eine tikzpicture mit dem folgenden newcommand zu komprimieren:

\newcommand{\tchild}[3]{ child { node{#2} #3 edge from parent node[above]{#1} } }
%intended usage: \tchild{edge label}{vertex label}{child nodes}

Wenn ich es auf das folgende Beispiel gelten, erhalte ich ein Arbeitsdokument. Jedoch Mit dem folgende Beispiel pdflatex gegeben ergibt eine Package pgf Error: No shape named is known. (man beachte die doppelten Leerzeichen zwischen „Namen“ und „ist“). Wenn ich manuell den zweiten tchild erweitern erhalte ich ein Arbeitsdokument, auch. Irgendwelche Ideen, was hier schief geht?

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

Lösung

Edit: Für einige wirklich cool (und arbeiten) Beispiele für Perltex mit TikZ sehen diese TUGboat Artikel !

Ich glaube, dies auf die Tatsache zurückzuführen ist, dass die Syntax eines TikZ Bildes viel mehr Freiform als LaTeX ist in der Regel. Ich kann das in der pgfmanual sehen, wenn tikz Befehle in ein Makro setzen, das Makro die tikzpicture Umgebung enthält (siehe zum Beispiel Seite 223 von pgfmanual.pdf, dass die erste Seite des Bibliotheken Abschnitt (IV)).

Ich weiß, dass ich eine kaputte Schallplatte zu sein, aber für komplizierte Makros definieren, empfehle ich Perltex, wenn überhaupt möglich. Dies ermöglicht eine weitaus komplizierter Makros definiert werden, und es können auch einige der expandafter Chaos vermieden werden.

Edit: Die unten (siehe ALT) hat nicht funktioniert, weil ein voller TikZ Befehl vom Perltex Makro zurückgegeben werden muss, zu diesem Zweck mir diese Version verspottet. Der neue Befehlsbaum nimmt drei Argumente des Root-Namen, der Wurzelknoten arguements und dann die drei Befehle, die Sie ursprünglich anders haben jedoch Setup. Jedes Kind wird durch einen Doppelpunkt (:) getrennt und die drei ursprünglichen Befehle werden durch Komma (,) getrennt. Vielleicht ist es einfacher, sich um den Code zu sehen. Wieder das Kompilieren Befehl ist der gleiche wie in 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}

--- BEGIN OLD ---

Ich habe versucht, etwas zusammen zu hacken, obwohl, ist es nicht (wahrscheinlich aufgrund der Tatsache, dass ich nie TikZ verwendet habe Bäume zu machen) zu kompilieren. Wie gesagt, vielleicht ist das Problem nicht im Stich gelassen Perltex genug tun, um der TikZ Befehl. ein Perl-Hash zu einem TikZ Baum Umwandlung könnte ein sehr cooles Projekt. Auf jeden Fall ist es hier. Beachten Sie, dass Sie kompilieren es mit 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 ---

Alles, was gesagt, vielleicht Ihr Problem ist, wie Sie die optionale # 3 behandeln, vielleicht, wenn Sie wirklich gemacht, dass optional und nicht definiert und leeren würde es besser funktionieren (dh \ TKINDER [] {0} {1}) .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top