5

tikzpicture次を使用して圧縮しようとしましたnewcommand

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

これを次の例に適用すると、作業ドキュメントが得られます。ただし、以下の例でpdflatexPackage pgf Error: No shape named is known.(「named」と「is」の間の二重スペースに注意してください) が得られます。2 番目を手動で展開するtchildと、作業ドキュメントも取得されます。ここで何がうまくいかないのですか?

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

1 に答える 1

0

編集:TikZを使用したPerlTeXのいくつかの本当にクールな(そして機能する)例については、このTUGboatの記事を参照してください!

これは、TikZ画像の構文が一般的なLaTeXよりもはるかに自由形式であるという事実によるものだと思います。pgfmanualでtikzコマンドをマクロに入れると、マクロにtikzpicture環境が含まれていることがわかります(たとえば、ライブラリセクション(IV)の最初のページであるpgfmanual.pdfの223ページを参照)。

壊れたレコードになることはわかっていますが、複雑なマクロを定義する場合は、可能であればPerlTeXを使用することをお勧めします。これにより、はるかに複雑なマクロを定義でき、expandafterの混乱の一部を回避することもできます。

編集:PerlTeXマクロによって完全なTikZコマンドを返す必要があるため、以下(OLDを参照)は機能しませんでした。この目的のために、このバージョンをモックアップしました。新しいコマンドツリーは、ルート名、ルートノード引数、そして元々持っていた3つのコマンドの3つの引数を取りますが、設定は異なります。各子はコロン(:)で区切られ、3つの元のコマンドはコンマ(、)で区切られます。おそらく、コード自体を見る方が簡単です。この場合も、コンパイルコマンドは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 ---

私は何かを一緒にハックしようとしましたが、コンパイルされていません(おそらく、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})。

于 2010-11-08T01:33:29.790 に答える