PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Tikz: Variablen einzeln definieren



Barny.G
16-05-2012, 09:46
Hallo liebe Leute,

ich möchte gern eine sehr flexible Grafik erstellen und dabei zur Änderung des Gesamtbildes ausschließlich einige (wenige) Variablen ändern müssen.

Irgendwie habe ich mir das wahrscheinlich zu einfach vorgestellt:

\documentclass{scrreprt}
\usepackage[ngerman]{babel}
\usepackage[latin1]{inputenc}
\usepackage{graphicx}
\usepackage{float}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage{mathrsfs}
\usepackage{tikz}
\usetikzlibrary{shapes,arrows,positioning,calc,fit ,intersections}

\begin{document}
\begin{figure}
\beginpgfgraphicnamed{Modell}
\begin{center}
\begin{tikzpicture}[scale=1]

\coordinate[] (Ovl) at (0,0); %\coordinate[label=left:$vl$]
\coordinate[] (Ohl) at ($(Ovl)+(45:5)$);
\coordinate[] (Ovr) at ($(Ovl)+(0:10)$);
\coordinate[] (Ohr) at ($(Ovr)+(45:5)$);

\coordinate[label=left:$Tx$] (Tx) at ($(Ovl)+(5,0)+(45:2.5)$);

\def \sd1{5}
\sd2{2}
\sd3{4}

\fill[red] (Tx) circle (2pt);
\draw (Ovl) -- (Ohl) -- (Ohr) -- (Ovr) -- cycle;

\draw (Ovl) -- (-90:\sd1);
\draw (Ohl) -- (-90:\sd2);

\end{tikzpicture}
\end{center}
\endpgfgraphicnamed
\end{figure}
\end{document}

Speziell geht es mir um den Teil des codes mit

\def \sd1{5}
\sd2{2}
\sd3{4}

Woher kommen die Fehler? (doesn't match its definition)
Wenn man die Definitionen \sd2 und \sd3 weglässt und dafür auch noch bei \draw (Ohl) ... \sd2 gegen \sd1 austauscht, dann wird die Linie nach vorn gezeichnet. Warum?


Möglicherweise geht es einfach so nicht. Allerdings denke ich, es liegt an meinem Unvermögen, da es bisher immer eine Lösung gab ;)

Kann "jemand" mir helfen?

Schöne Grüße

Thomas

bobmalaria
16-05-2012, 10:50
hi,

\def ist aehnlich wie newcommand. also \newcommand{\sda}{5} wuerde eine 5 ausgeben wenn man \sda aufruft. \def\sda{5} sollte auch eine 5 ausgeben. im anschlussist der befehl beendet. d.h. dein \sdb und \sdc sind schlicht undefiniert. du musst also jedes mal \def davorsetzen um auch diese befehle zu definieren.

gruss

Barny.G
16-05-2012, 11:14
Moin moin,

schön, dass Du wieder online bist! Also der Tip mit "\newcommand" hat echt geholfen, denn die \def einzeln aufzuschreiben, das hatte ich schon probiert. Und es hat(te) nicht zu einem Erfolg geführt. Aber so geht's.

Für alle Anderen:
Frage 2) ist recht einfach zu beantworten. Der (falsche) code lautete:

\draw (Ohl) -- (-90:\sd2);
damit auch wirklich an die Koordinate von "Ohl" die Linie angehangen wird, muß der code

\draw (Ohl) --++(-90:\sdb);
lauten. Die Zahl habe ich durch einen Buchstaben ersetzt, da Tikz mit der Kombination scheinbar nicht klargekommen ist...

Schöne Grüße

Thomas

cgnieder
16-05-2012, 12:00
Also der Tip mit "\newcommand" hat echt geholfen, denn die \def einzeln aufzuschreiben, das hatte ich schon probiert. Und es hat(te) nicht zu einem Erfolg geführt. Aber so geht's.
Verstehe ich nicht... das hier funktioniert einwandfrei:

\begin{tikzpicture}[scale=1]

\coordinate[] (Ovl) at (0,0); %\coordinate[label=left:$vl$]
\coordinate[] (Ohl) at ($(Ovl)+(45:5)$);
\coordinate[] (Ovr) at ($(Ovl)+(0:10)$);
\coordinate[] (Ohr) at ($(Ovr)+(45:5)$);

\coordinate[label=left:$Tx$] (Tx) at ($(Ovl)+(5,0)+(45:2.5)$);

\def\sda{5}
\def\sdb{2}
\def\sdc{4}

\fill[red] (Tx) circle (2pt);
\draw (Ovl) -- (Ohl) -- (Ohr) -- (Ovr) -- cycle;

\draw (Ovl) -- (-90:\sda);
\draw (Ohl) -- (-90:\sdb);

\end{tikzpicture}


Die Zahl habe ich durch einen Buchstaben ersetzt, da Tikz mit der Kombination scheinbar nicht klargekommen ist

Das liegt nicht an TikZ. Befehlsnahmen können nur Buchstaben, also Zeichen mit dem catcode 11, enthalten, oder nur aus einem anderen Zeichen bestehen. Zahlen sind andere Zeichen (catcode 12).

\def\eins{1} \eins % nur Buchstaben
\def\1{eins} \1 % ein anderes Zeichen

Gruß

Barny.G
16-05-2012, 13:14
Oh-Ha!

Da lag das wohl nicht an meinem \def sondern tatsächlich an der Zahl nach der Variablen?

Prima - wieder was dazugelernt!


Danke :)

cgnieder
16-05-2012, 22:09
In etwa schon. Mit \def kann man schon definierte Befehle nach Belieben überschreiben und Argument mit festen Begrenzern usw. definieren. Wenn Du also folgendes machst:

\def \sd1{5}
\sd2{2}
\sd3{4}
dann definierst Du \sd, dem der Begrenzer 1 folgen muss. Danach rufst Du mit \sd2{2} den Befehl mit dem falschen Begrenzer (=2) auf und schreibst danach {2}. Das verursacht den Fehler

Use of \sd doesn't match its definition \sd2.

Wenn Du folgendes machst:

\def\sd1{5}
\def\sd2{2}
\def\sd3{4}
dann überschreibst Du mit jeder Zeile die zuvor definierte Version von \sd und zuletzt ist es so definiert, dass ihm eine 3 folgen muss.

Damit kann man zum Beispiel auch Befehle wie diesen definieren:

\def\fancycmd(#1){do sth with #1}
% Aufruf:
\fancycmd(bla)

Gruß

Barny.G
17-05-2012, 19:37
Hallo,

vielen Dank für die ausführliche Information!! :D:D

Beste Grüße

Thomas