Вопрос

Я попытался сжать 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. (Обратите внимание на двойное пространство между «названным» и «IS»). Если я вручную расширим второй tchild Я тоже получаю рабочий документ. Есть идеи, что здесь идет не так?

\begin{tikzpicture}
    \node{0} [grow'=right]
        \tchild{0}{1}{}
        \tchild{1}{0}{};
\end{tikzpicture}
Это было полезно?

Решение

РЕДАКТИРОВАТЬ: Для некоторых действительно классных (и работающих) примеров Perltex с тикзом см. Это Статья буксира!

Я полагаю, что это связано с тем, что синтаксис изображения тикза гораздо более свободный, чем латекс в целом. Я вижу, что в PGFManual при размещении команд Tikz в макрос, макрос содержит среду Tikzpicture (см., Например, стр. 223 pgfmanual.pdf, то есть первая страница раздела библиотеки (iv)).

Я знаю, что я становлюсь побитым рекордом, но для определения сложных макросов я рекомендую использовать Perltex, если это вообще возможно. Это позволяет определить гораздо более сложные макросы, и это также позволяет избежать некоторых беспорядков расширения.

РЕДАКТИРОВАТЬ: ниже (см. Старое) не работало, потому что полная команда Tikz должна быть возвращена макросом Perltex, с этой целью я высмеивал эту версию. Новое дерево команд принимает три аргумента имени корня, аргументы корневого узла, а затем три команды, которые вы первоначально имели, однако настраивались по -другому. Каждый ребенок разделен толстой кишкой (:) и три оригинальных команда разделены запятыми (,). Возможно, легче увидеть сам код. Снова команда компиляции такая же, как и в старом.

\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 не позволил Perltex сделать достаточно команды Tikz. Преобразование хэша Perl в дерево тикза может быть очень крутым проектом. В любом случае, вот это. Обратите внимание, что вы составляете это с 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}).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top