Überarbeitungsverlauf[Zurück]
Klicke auf Einblenden/Ausblenden von Überarbeitungen 3
noch eine for-Schleife

02 Mär '14, 13:26

stefan's gravatar image

stefan
18.4k163148

Sowas geht mit `\foreach`, auch mit mehreren Variablen. Da hier kein testbares Komplettbeispiel in der Frage ist, arbeite ich mit meinem Beispiel zur vorangehenden Frage. Dort kann ich die Zwischenlinien vereinfachen: \foreach \x / \y in {E/F, G/H, I/J} \path [name path global/.expanded=\x--\y] (\x) -- (\y); Die Syntax erkennt man ja. Es geht auch mit 3 und mehr Variablen. Das eingefügte `global/.expanded` ist eine Weg, damit man Pfadnamen in der Schleife bestimmen kann - normalerweise nicht nötig. Entsprechend für die Schnittpunkte: \foreach \schnitt / \punkt in {E--F and G--H/K, E--F and I--J/L} { \path [name intersections/.expanded = {of=\schnitt, by=\punkt}]; \node at (\punkt) {\punkt}; } Auch hier: mit `intersections/.expanded={...}` erreiche ich, dass erst `{...}` expandiert wird, d.h. die Makros darin (meine Schleifenvariablen) intern mit `\edef` ausgewertet werden, bevor die Zuweisung `intersections={...}` erfolgt. Der Trick ist wie gesagt bei einfachem `\foreach` meist nicht nötig. nötig, hier weil es innerhalb von Optionen passiert. Ein compilierbares Testbeispiel damit, der vorigen verlinkten Frage entsprechend: entsprechend - am Beginn sieht man nochmal die einfache Form der `\foreach`-Schleife: \documentclass{article} \usepackage{tikz} \usetikzlibrary{calc,intersections} \begin{document} \begin{tikzpicture}[every node/.append style={text depth=0.25ex, rectangle, rounded corners, minimum width=3em, minimum height=4ex, draw}] % Eckpunkte \node (A) at (0,4) {A}; \node (B) at (5,4) {B}; \node (C) at (5,0) {C}; \node (D) at (2,0) {D}; \foreach \punkt / \x / \y in {A/0/4, B/5/4, C/5/0, D/2/0} \node (\punkt) at (\x,\y) {\punkt}; % Mittelpunkte obere und untere Seite \node (E) at ($ (A) !.5! (B) $) {E}; \node (F) at ($ (D) !.5! (C) $) {F}; % Dritteln linke Seite und sechte Seite \node (G) at ($ (A) !.3333! (D) $) {G}; \node (H) at ($ (B) !.3333! (C) $) {H}; \node (I) at ($ (A) !.6666! (D) $) {I}; \node (J) at ($ (B) !.6666! (C) $) {J}; % Zwischenlinien definieren \foreach \x / \y in {E/F, G/H, I/J} \path [name path global/.expanded=\x--\y] (\x) -- (\y); % Schnittpunkte der Zwischenlinien für die restlichen Gitterpunkte \foreach \schnitt / \punkt in {E--F and G--H/K, E--F and I--J/L} { \path [name intersections/.expanded = {of=\schnitt, by=\punkt}]; \node at (\punkt) {\punkt}; } \end{tikzpicture} \end{document} Der Gewinn durch die `\foreach`-Schleifen zeigt sich dann, wenn, wie eingangs der Frage geschrieben, es sehr viele wiederholte Aufrufe gibt.
Klicke auf Einblenden/Ausblenden von Überarbeitungen 2
Lösung erweitert

02 Mär '14, 12:36

stefan's gravatar image

stefan
18.4k163148

Sowas geht mit `\foreach`, auch mit mehreren Variablen. Da hier kein testbares Komplettbeispiel in der Frage ist, kann arbeite ich nur ein funktionierendes mit meinem Beispiel zur vorangehenden Frage bringen. Frage. Dort hätte kann ich die Zwischenlinien so vereinfacht: vereinfachen: \foreach \x / \y in {E/F, G/H, I/J} \path [name path global/.expanded=\x--\y] (\x) -- (\y); Die Syntax erkennt man ja. Es geht auch mit 3 und mehr Variablen. Das eingefügte `global/.expanded` ist eine Weg, damit man Pfadnamen in der Schleife bestimmen kann - normalerweise nicht nötig. Evtl. hat noch jemand einen Vorschlag, Entsprechend für die Schnittpunkte: \foreach \schnitt / \punkt in {E--F and G--H/K, E--F and I--J/L} { \path [name intersections/.expanded = {of=\schnitt, by=\punkt}]; \node at (\punkt) {\punkt}; } Auch hier: mit `intersections/.expanded={...}` erreiche ich, dass erst `{...}` expandiert wird, d.h. die Makros darin (meine Schleifenvariablen) intern mit `\edef` ausgewertet werden, bevor die Zuweisung `intersections={...}` erfolgt. Der Trick ist wie gesagt bei einfachem `\foreach` meist nicht nötig. Ein compilierbares Testbeispiel damit, der direkt zum obigen passt. Bei meinen direkten Versuchen kriegte ich ein `\inaccessible` - hier sieht vorigen verlinkten Frage entsprechend: \documentclass{article} \usepackage{tikz} \usetikzlibrary{calc,intersections} \begin{document} \begin{tikzpicture}[every node/.append style={text depth=0.25ex, rectangle, rounded corners, minimum width=3em, minimum height=4ex, draw}] % Eckpunkte \node (A) at (0,4) {A}; \node (B) at (5,4) {B}; \node (C) at (5,0) {C}; \node (D) at (2,0) {D}; % Mittelpunkte obere und untere Seite \node (E) at ($ (A) !.5! (B) $) {E}; \node (F) at ($ (D) !.5! (C) $) {F}; % Dritteln linke Seite und sechte Seite \node (G) at ($ (A) !.3333! (D) $) {G}; \node (H) at ($ (B) !.3333! (C) $) {H}; \node (I) at ($ (A) !.6666! (D) $) {I}; \node (J) at ($ (B) !.6666! (C) $) {J}; % Zwischenlinien definieren \foreach \x / \y in {E/F, G/H, I/J} \path [name path global/.expanded=\x--\y] (\x) -- (\y); % Schnittpunkte der Zwischenlinien für die restlichen Gitterpunkte \foreach \schnitt / \punkt in {E--F and G--H/K, E--F and I--J/L} { \path [name intersections/.expanded = {of=\schnitt, by=\punkt}]; \node at (\punkt) {\punkt}; } \end{tikzpicture} \end{document} Der Gewinn durch die `\foreach`-Schleifen zeigt sich dann, wenn, wie eingangs der Frage geschrieben, es etwas komplizierter aus mit der Syntax, für eine einfache Schleife.sehr viele wiederholte Aufrufe gibt.
Klicke auf Einblenden/Ausblenden von Überarbeitungen 1

02 Mär '14, 10:57

stefan's gravatar image

stefan
18.4k163148