Como referenciar os argumentos definidos em um “novo comando”?

Como referenciar os argumentos definidos em um “novo comando”?

O que estou fazendo:
Quero fazer um desenho (como mostrado abaixo) para ilustrar a contração de alguns intervalos em nós em uma linha.
Intervalos

Primeiro, defino um newcommandintervalo for (ou seja, \op) com três argumentos: ponto inicial, ponto final e o nome. Então, uma linha (ou corrente) é desenhada. Por fim, o intervalo e seu nó correspondente na linha são conectados. Todo o código é: (Observação:você também pode ler e modificar o código compartilhado emCompartilhadoLatexantes que qualquer resposta seja aceita.)

\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{tikz}
\usetikzlibrary{calc, chains}

\title{Reference Arguments in Newcommand}
\author{hengxin}
\date{31 December 2013}

\begin{document}
\begin{tikzpicture}[]

% new command: inverval
\newcommand{\op}[3] % #1: start point; #2: end point; #3: interval name
{
  \coordinate (start) at #1;    % start point
  \coordinate (end) at #2;  % end point
  \coordinate (mid) at ($0.5*#1 + 0.5*#2 + (0,0.8cm)$);

  \draw[ultra thick, blue, |-|] (start) -- (end); % draw the interval
  \node (#3) [font = \huge] at (mid) {#3};  % attach the operation name
}

% define three intervals
\op{(0,2)}{(2,2)}{$a$};
\op{(4,3)}{(6,3)}{$b$};
\op{(7,2)}{(10,2)}{$c$};

% contract them into single nodes in a line (or a chain)
\begin{scope}[font = \huge, start chain = schedule, node distance = 3.0cm, every     join/.style = {very thick, ->, red}]
  \foreach \opi in {a, b, c}
    \node (\opi) [circle, draw, on chain, join, label = {[] below : $\opi$}] {};
\end{scope}

% connect interval and its corresponding node in the line
\begin{scope}[cedge/.style = {->, dashed, draw, thick}]
  \draw [cedge] (0,2) to (a);
  \draw [cedge] (2,2) to (a);

  \draw [cedge] (4,3) to (b);
  \draw [cedge] (6,3) to (b);

  \draw [cedge] (7,2) to (c);
  \draw [cedge] (10,2) to (c);
\end{scope}

\end{tikzpicture}
\end{document}

O que eu quero fazer:
Como você pode ver, na última etapa (conectando o intervalo e seu nó correspondente na linha), codifiquei as coordenadas dos pontos iniciais e finais de cada intervalo, como \draw [cedge] (0,2) to (a); \draw [cedge] (2,2) to (a);. Certamente é tedioso e sujeito a erros. Portanto,

Existe alguma maneira elegante de fazer referência aos dois pontos (como argumentos de newcommand) de cada intervalo sem código rígido?

Responder1

No seu \opcomando, você pode nomear cada limite do seu intervalo (usando #3como parte do nome).

\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{calc, chains}
\begin{document}
\begin{tikzpicture}
  % new command: inverval
  \newcommand{\op}[3]{ % #1: start point; #2: end point; #3: operation name
    \coordinate (start #3) at #1;   % start point
    \coordinate (end #3) at #2; % end point

    \draw[ultra thick, blue, |-|] (start #3) -- (end #3) % draw the interval
    node[pos=.5,above=8mm,font=\huge, text=black] {$#3$}; % attach the operation name
  }
  % define three intervals
  \op{(0,2)}{(2,2)}{a};
  \op{(4,3)}{(6,3)}{b};
  \op{(7,2)}{(10,2)}{c};
  % contract them into single nodes in a line (or a chain)
  \begin{scope}[font=\huge, start chain=schedule, node distance=3.0cm,
    every join/.style={very thick, ->, red}]
    \foreach \opi in {a, b, c} {
      \node [circle,draw,on chain,join,label={[]below:$\opi$}] (\opi) {};
    }
  \end{scope}
  % connect interval and its corresponding node in the line
  \begin{scope}[cedge/.style = {->, dashed, draw, thick}]
    \foreach \interval in {a,b,c}{
      \draw [cedge] (start \interval) to (\interval);
      \draw [cedge] (end \interval) to (\interval);
    }
  \end{scope}
\end{tikzpicture}
\end{document}

informação relacionada