2010-11-07 3 views
3

Я пытался сжать tikzpicture используя следующие newcommand:Использование макросов с tikzpictures?

\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

Edit: Для некоторых действительно здорово (и рабочих) примеров PerlTeX с TikZ увидеть эту TUGboat article!

Я считаю, что это связано с тем, что синтаксис изображения TikZ является гораздо более свободной формой, чем LaTeX в целом. Я вижу, что в pgfmanual при вводе команд tikz в макрос макрос содержит среду tikzpicture (см., Например, стр. 223 из pgfmanual.pdf, это первая страница раздела Библиотеки (IV)).

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

Редактировать: ниже (см. OLD) не работает, потому что полная макрос TikZ должна быть возвращена макросом PerlTeX, с этой целью я издевался над этой версией. Новое дерево команд принимает три аргумента: имя корня, аргументы корневого узла, а затем три команды, которые вы изначально использовали, однако настроены по-разному. Каждый ребенок разделяется двоеточием (:), и три исходные команды разделяются запятыми (,). Возможно, его легче увидеть сам код. Снова команда компиляции такая же, как и в 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} 

--- НАЧАТЬ 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} 

--- КОНЕЦ OLD ---

Все, что сказал, может быть, ваша проблема в том, как вы лечите опциональный # 3, может быть, если вы действительно сделали, что необязательный, а не определенный и пустой, он будет работать лучше (т. е. \ tchild [] {0} {1}).

+0

Ухм, так что вы сталкиваетесь с той же проблемой с вашим первым подходом? Ваше решение в основном сводится к тому, чтобы «\ node» в макросе тоже. Это должно быть возможно и без perltex. Однако мне не удалось собрать его. –

+0

Да, я согласен с тем, что вам кажется, что вы можете поместить часть команды TikZ в макрос, но, похоже, это не работает. Да, в вашем случае я не уверен, что PerlTeX поможет вам, пока вы не попадете в большое количество узлов, и в этом случае PerlTeX или PgfFor оба получат вам необходимую функциональность. –