
Was mache ich:
Ich möchte ein Bild zeichnen (wie unten gezeigt), um die Kontraktion einiger Intervalle zu Knoten in einer Linie zu veranschaulichen.
Zuerst definiere ich ein newcommand
Intervall (also \op) mit drei Argumenten: Startpunkt, Endpunkt und Name. Dann wird eine Linie (oder eine Kette) gezeichnet. Schließlich werden das Intervall und der entsprechende Knoten in der Linie verbunden. Der gesamte Code lautet: (Notiz:Sie können den freigegebenen Code auch unterGemeinsam genutztes Latexbevor eine Antwort akzeptiert wird.)
\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}
Was ich machen will; was ich vorhabe zu tun:
Wie Sie sehen, habe ich im letzten Schritt (Intervall und entsprechenden Knoten in der Linie verbinden) die Koordinaten der Start- und Endpunkte jedes Intervalls fest codiert, wie \draw [cedge] (0,2) to (a); \draw [cedge] (2,2) to (a);
. Das ist sicherlich mühsam und fehleranfällig. Daher
Gibt es für mich eine elegante Möglichkeit, die beiden Punkte (als Argumente von
newcommand
) jedes Intervalls ohne Festcode zu referenzieren?
Antwort1
Sie können in Ihrem \op
Befehl jede Grenze Ihres Intervalls benennen (mit #3
als Teil des Namens).
\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}