Использование макросов с tikzpictures? - PullRequest
4 голосов
/ 07 ноября 2010

Я попытался сжать 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}

1 Ответ

0 голосов
/ 08 ноября 2010

Edit: некоторые действительно классные (и работающие) примеры PerlTeX с TikZ см. В этой статье TUGboat !

Я полагаю, это связано с тем, что синтаксис изображения TikZ намного более свободен, чем LaTeX в целом. Я вижу, что в pgfmanual при помещении команд tikz в макрос макрос содержит среду tikzpicture (см., Например, страницу 223 файла pgfmanual.pdf, то есть первой страницы раздела «Библиотеки» (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}) .

...