PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PSTricks Zeichnung in einem Gitter wiederholen



ooze
09-07-2010, 17:41
Hallo,
ich habe neulich erst mit PSTricks begonnen und habe jetzt ein Problem, welches sich zwar mit ensprechendem Aufwand manuell lösen ließe, ich aber glaube, dass es dafür vielleicht eine elegantere Methode gibt. Zunächst das Minimalbeispiel:



\documentclass[fontsize=12pt,%
a4paper]%
{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{microtype} %besserer Blocksatz
\usepackage[on]{auto-pst-pdf}
\usepackage{pst-slpe}
\usepackage{pstricks-add}%
\usepackage{amssymb,amsmath,amsthm,amstext}

\begin{document}

\begin{figure}[htbp]
\centering
\framebox[\textwidth]
{
\scalebox{1}
{
\begin{pspicture}(13,5)
%\psgrid[subgriddiv=1,griddots=10]

% Elementarzelle (2D)
\dotnode(9,4){fusspunkt}
\pnode(11,4){spitze a}
\dotnode(11,4){}
\dotnode(8.8,3){spitze b}
\dotnode(10.8,3){diagonalpunkt}

% Elementarzelle: Verbindung b
\ncline[linewidth=2pt,arrowinset=0]{->}{fusspunkt}{spitze a}
\naput{$b$}
% Elementarzelle: Verbindung a
\ncline[linewidth=2pt,arrowinset=0]{->}{fusspunkt}{spitze b}
\nbput{$a$}

\ncline[linewidth=.5pt,linestyle=dashed]{-}{spitze a}{diagonalpunkt}
\ncline[linewidth=.5pt,linestyle=dashed]{-}{spitze b}{diagonalpunkt}
%\rnode[0]{A}{\pscircle[fillstyle=solid](10,4){2mm}}
%\rnode[0]{B}{\pscircle[fillstyle=solid](11,3.7){1.5mm}}
%\rnode[0]{C}{\pscircle[fillstyle=solid](11.2,3.2){1mm}}
\cnode[fillstyle=solid,linewidth=1.5pt](9,4){2mm}{A}
\cnode[fillstyle=solid](10,3.7){1.5mm}{B}
\cnode[fillstyle=solid,fillcolor=black](10.2,3.2){1mm}{C}
\ncline[linewidth=.5pt]{-}{A}{B}
\ncline[linewidth=.5pt]{-}{B}{C}
% Elementarzelle: Legende
\cnode[fillstyle=solid,linewidth=1.5pt](12.5,4){1.85mm}{}
\uput[0](12.5,4){A}
\cnode[fillstyle=solid](12.5,3.5){1.45mm}{}
\uput[0](12.5,3.5){B}
\cnode[fillstyle=solid,fillcolor=black](12.5,3){1mm}{}
\uput[0](12.5,3){C}

% Beschriftung
\uput[u](3.5,1){Gitter}
\uput[u](10,1){Elementarzelle und Basis}


% Gittergeraden
%\psline[linestyle=dashed,linecolor=gray](-1,3)(10,3)
%\psline[linestyle=dashed,linecolor=gray](6,0)(7.2,6)
% Beschriftung Gittergeraden
\pnode(9.5,3){horizontal}
\pnode(6.1,0.5){vertikal}
%Reihe 1 (oben)
\pnode(1,5){Punkt 11}
\dotnode(1,5){Punkt 11not}
\uput[135](1,5){0}
\dotnode(3,5){Punkt 12}
\dotnode(5,5){Punkt 13}
\dotnode(7,5){Punkt 14}

%Reihe 2
\dotnode(0.8,4){Punkt 21}
\dotnode(2.8,4){Punkt 22}
\dotnode(4.8,4){Punkt 23}
\dotnode(6.8,4){Punkt 24}

%Reihe 3
\dotnode(0.6,3){Punkt 31}
\dotnode(2.6,3){Punkt 32}
\dotnode(4.6,3){Punkt 33}
\dotnode(6.6,3){Punkt 34}

%Reihe 4
\dotnode(0.4,2){Punkt 41}
\dotnode(2.4,2){Punkt 42}
\dotnode(4.4,2){Punkt 43}
\dotnode(6.4,2){Punkt 44}

%Reihe 5

% Gitterlinien
\ncline[linewidth=.5pt,linestyle=dashed]{-}{Punkt 41}{Punkt 44}
\ncline[linewidth=.5pt,linestyle=dashed]{-}{Punkt 31}{Punkt 34}
\ncline[linewidth=.5pt,linestyle=dashed]{-}{Punkt 21}{Punkt 24}
\ncline[linewidth=.5pt,linestyle=dashed]{-}{Punkt 11}{Punkt 14}
%
\ncline[linewidth=.5pt,linestyle=dashed]{-}{Punkt 41}{Punkt 11}
\ncline[linewidth=.5pt,linestyle=dashed]{-}{Punkt 42}{Punkt 12}
\ncline[linewidth=.5pt,linestyle=dashed]{-}{Punkt 43}{Punkt 13}
\ncline[linewidth=.5pt,linestyle=dashed]{-}{Punkt 44}{Punkt 14}
%Verbinung a
\ncline[linewidth=2pt,arrowinset=0]{->}{Punkt 11}{Punkt 21}
\nbput{$a$}
%Verbindung b
\ncline[linewidth=2pt,arrowinset=0]{->}{Punkt 11}{Punkt 12}
\naput{$b$}

\end{pspicture}
} %framebox zu
} %scalebox zu
\caption{Raumgitter, Elementarzelle und Basis (zweidimensionale Darstelleung)}
\label{fig:kristallstruktur}
\end{figure}

\end{document}


Was ich nun möchte ist, dass die "Basis" (das sind die drei Kreise innerhalb der "Elementarzelle") sich entlang der Gitterstruktur wiederholen. Also im Prinzip nochmal das "Gitter" wie links, nur eben mit den drei Kreisen in jedem Feld. Das könnte ich natürlich händisch machen, der Aufwand wär aber recht groß, und bevor ich damit anfange wollte ich mal wissen ob man das nicht irgendwie schlauer angehen könnte.

Freue mich über alle Antworten.

PS: Das Minimalbeispiel ist bei mir so wie's da steht lauffähig und sollte eine Abbildung produzieren.

Grooze,
ooze

ooze
09-07-2010, 18:07
Ich werde wohl noch häufiger auf Probleme dieser Art stoßen. Gibt es eine Möglichkeit sich eine beliebige PSTricks Zeichnung zu definieren und diese Zeichnung dann einfach so wie sie ist an einer bestimmten Stelle im Koordinatensystem zu platzieren? So, dass PSTricks die ganze Translation der Koordinaten übernimmt? Das ist nämlich ziemlich anstrengend, das immer per Hand zu machen.

mechanicus
09-07-2010, 18:17
Hi,

dein Minimalbeispiel funktioniert nicht :confused:

Gruß
Marco

ooze
09-07-2010, 18:22
Hi,
dein Minimalbeispiel funktioniert nicht :confused:

An was liegts? Bei mir geht es, ich verwende pdflatex. Das Ergebnis gibts nun auch hier als PDF (http://cl.ly/d833b6144ce8ff3327de/content).

Edit: Damit das Minimalbeispiel funktioniert muss pdflatex mit --shell-escape aufgerufen werden, also:

pdflatex --shell-escape minimalbeispiel.texdas ist wohl eine Konsequenz aus dem auto-pst-pdf Paket.

mechanicus
09-07-2010, 18:55
Hi,

du hast cnode nicht richtig verwendet. Zudem kenn ich den Befehl bs nicht?

Hier mal eine Alternative:

\documentclass[fontsize=12pt,%
a4paper]%
{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{microtype} %besserer Blocksatz
\usepackage[on]{auto-pst-pdf}
\usepackage{pst-slpe}
\usepackage{pstricks-add}%
\usepackage{amssymb,amsmath,amsthm,amstext}
\newcommand*\bs[1]{#1}
\begin{document}

\begin{figure}[htbp]
\centering


\begin{pspicture}(13,5)
%\psgrid
%%Gitter
\psset{arrowinset=0,arrowscale=1.25}
\pstilt{80}{
\psframe[linestyle=dashed](1,1)(7,4)
\psline[linestyle=dashed](3,1)(3,4)
\psline[linestyle=dashed](5,1)(5,4)
\psline[linestyle=dashed](1,2)(7,2)
\psline[linestyle=dashed](1,3)(7,3)
\multido{\iA=1+2}{4}{%
\multido{\iB=1+1}{4}{%
\psdot(\iA,\iB)
}
}
\psline[linewidth=1.5\pslinewidth]{<->}(1,3)(1,4)(3,4)
\uput[90](2,4){$b$}
\uput[180](1,3.5){$a$}
\uput[135](1,4){$0$}
}
\pstilt{80}{
%Elementarzelle
\pnode(10,2){A}
\pnode(12,2){B}
\pnode(12,3){C}
\pnode(10,3){D}
\psline[linestyle=dashed](A)(B)(C)(D)(A)
\psforeach{\sA}{A,B,C,D}{\psdot(\sA)}
\psline[linewidth=1.75\pslinewidth]{<->}(A)(D)(C)
\pscircle[linewidth=1.6\pslinewidth,fillstyle=solid](D){1.85mm}
\pnode(11,2.6){i1}
\pnode(11.4,2.2){i2}
\psline(D)(i1)(i2)
\pscircle[linewidth=1.6\pslinewidth,fillstyle=solid](D){1.85mm}
\pscircle[fillstyle=solid](i1){1.45mm}
\pscircle*[fillstyle=solid](i2){1mm}
\psset{linestyle=none,shortput=tablr}
\ncline{C}{D}^{$b$}
\ncline{D}{A}<{$a$}
}
\end{pspicture}
\caption{Raumgitter, Elementarzelle und Basis (zweidimensionale Darstelleung)}
\label{fig:kristallstruktur}
\end{figure}
\end{document}

PS: Ich kenne das Paket auto-pst-pdf ;)

Gruß
Marco

Karlo
09-07-2010, 19:21
Hallo,

hatte auch Problem das Beispiel zum Laufen zu bringen....
Wie wäre es mit nen kleinen Macro... in etwa so:



\documentclass{scrreprt}
\usepackage{pstricks,pstricks-add}


\newcommand{\dreiknoten}[6]{
\cnode[fillstyle=solid,linewidth=1.5pt](#1,#2){2mm}{A}
\cnode[fillstyle=solid](#3,#4){1.5mm}{B}
\cnode[fillstyle=solid,fillcolor=black](#5,#6){1mm}{C}

\ncline[linewidth=.5pt]{-}{A}{B}
\ncline[linewidth=.5pt]{-}{B}{C}
}

\begin{document}
\begin{pspicture}(13,5)


\dreiknoten{9}{4}{10}{3.7}{10.3}{3.2}
\dreiknoten{8}{3}{9}{2.7}{9.2}{2.2}

\end{pspicture}
\end{document}


lg
karlo


edit:
hatte gerade noch eine andere Idee, da die relative Position der Kreise ja gleich bleibt:



\documentclass{scrreprt}
\usepackage{pstricks,pstricks-add}

\newcommand{\dreiknoten}[2]{
\rput(#1,#2){
\cnode[fillstyle=solid,linewidth=1.5pt](0,0){2mm}{A}
\cnode[fillstyle=solid](1 ,-0.3){1.5mm}{B}
\cnode[fillstyle=solid,fillcolor=black](1.3,-0.8){1mm}{C}

\ncline[linewidth=.5pt]{-}{A}{B}
\ncline[linewidth=.5pt]{-}{B}{C}
}
}

\begin{document}
\begin{pspicture}(13,5)


\dreiknoten{9}{4}
\dreiknoten{8}{3}

\end{pspicture}
\end{document}

ooze
09-07-2010, 22:41
Vielen Dank erstmal für deine Mühe, ... ich habe Stunden an diesen Bildchen gesessen mit viel trial & error.


Hi,

du hast cnode nicht richtig verwendet. Zudem kenn ich den Befehl bs nicht?

ah, was hab ich bei cnode denn falsch gemacht? Habe es genau so verwendet wie in pstricks-doc.pdf beschrieben: \cnode*[par](x,y){radius}{name}. Ok den Befehl \bs hatte ich versehentlich drin gelassen, komischerweise geht das bei mir trotzdem obwohl es nicht gehen dürfte, hatte es natürlich vorher getestet. Sorry. Habe das ursprüngliche Minimalbeispiel nochmal dahingehend korrigiert.



Hier mal eine Alternative:

\documentclass[fontsize=12pt,%
a4paper]%
{scrreprt}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{microtype} %besserer Blocksatz
\usepackage[on]{auto-pst-pdf}
\usepackage{pst-slpe}
\usepackage{pstricks-add}%
\usepackage{amssymb,amsmath,amsthm,amstext}
\newcommand*\bs[1]{#1}
\begin{document}

\begin{figure}[htbp]
\centering


\begin{pspicture}(13,5)
%\psgrid
%%Gitter
\psset{arrowinset=0,arrowscale=1.25}
\pstilt{80}{
\psframe[linestyle=dashed](1,1)(7,4)
\psline[linestyle=dashed](3,1)(3,4)
\psline[linestyle=dashed](5,1)(5,4)
\psline[linestyle=dashed](1,2)(7,2)
\psline[linestyle=dashed](1,3)(7,3)
\multido{\iA=1+2}{4}{%
\multido{\iB=1+1}{4}{%
\psdot(\iA,\iB)
}
}
\psline[linewidth=1.5\pslinewidth]{<->}(1,3)(1,4)(3,4)
\uput[90](2,4){$b$}
\uput[180](1,3.5){$a$}
\uput[135](1,4){$0$}
}
\pstilt{80}{
%Elementarzelle
\pnode(10,2){A}
\pnode(12,2){B}
\pnode(12,3){C}
\pnode(10,3){D}
\psline[linestyle=dashed](A)(B)(C)(D)(A)
\psforeach{\sA}{A,B,C,D}{\psdot(\sA)}
\psline[linewidth=1.75\pslinewidth]{<->}(A)(D)(C)
\pscircle[linewidth=1.6\pslinewidth,fillstyle=solid](D){1.85mm}
\pnode(11,2.6){i1}
\pnode(11.4,2.2){i2}
\psline(D)(i1)(i2)
\pscircle[linewidth=1.6\pslinewidth,fillstyle=solid](D){1.85mm}
\pscircle[fillstyle=solid](i1){1.45mm}
\pscircle*[fillstyle=solid](i2){1mm}
\psset{linestyle=none,shortput=tablr}
\ncline{C}{D}^{$b$}
\ncline{D}{A}<{$a$}
}
\end{pspicture}
\caption{Raumgitter, Elementarzelle und Basis (zweidimensionale Darstelleung)}
\label{fig:kristallstruktur}
\end{figure}
\end{document}

Einige Befehle verstehe ich nicht. Wie funktioniert \multido? Das hört sich irgendwie nach dem an was ich suche :).

\psline kann anscheinend auch nodes verbinden? Das steht soweit ich es sehe nicht in der Dokumentation (die wohl ziemlich veraltet ist). Naja am Montag bekomm ich den PSTricks Wälzer von Voss aus der Bibliothek ...

\pstilt ist eine nette Idee, hat aber den unangenehmen Nebeneffekt, dass auch die runden Sachen getiltet werden, kein Beinbruch aber nicht wirklich schön.

mechanicus
09-07-2010, 22:56
Vielen Dank erstmal für deine Mühe, ... ich habe Stunden an diesen Bildchen gesessen mit viel trial & error.

Aller Anfang ist schwer. Und ich bin mir sicher, dass es noch einfacher geht :D



ah, was hab ich bei cnode denn falsch gemacht? Habe es genau so verwendet wie in pstricks-doc.pdf beschrieben: \cnode*[par](x,y){radius}{name}.

Du hast aber keinen Knotennamen vergeben. Das führt zu Fehlern.



Wie funktioniert \multido? Das hört sich irgendwie nach dem an was ich suche :).

multido ist eine Schleifenanweisung. Es gibt auch das gleichnamige Paket, dass die Dokumentation enthält.



\psline kann anscheinend auch nodes verbinden?

psline verbindet Punkte. Wie du die Punkte eingibst, ist aber dir überlassen. psline hat aber den Vorteil, dass du mehrere Knotenverbindungen (Punkte) auf einmal verbinden kannst. ncline nimmt nur zwei.



Das steht soweit ich es sehe nicht in der Dokumentation (die wohl ziemlich veraltet ist).

Kommt auf die Doku an :-)
pstricks besteht ja bekanntlich aus mehreren Paketen und diese sind sehr aktuell :-)



Naja am Montag bekomm ich den PSTricks Wälzer von Voss aus der Bibliothek ...

Schönes Buch. ich empfehle wirklich von Anfang an zu lesen, um diverse Feinheiten direkt zu erwischen. Natürlich kann man über die Reihenfolge diverse Kapitel diskutieren, aber es lohnt sich zumindest mal, diese gelesen zu haben. Ein Hinweis. Das Buch ersetzt aber nicht die Dokumentation eines Paketes. Viele Sachen sind im Laufe der Zeit dazugekommen und natürlich kann man so ein Werk ständig aktualisieren.



\pstilt ist eine nette Idee, hat aber den unangenehmen Nebeneffekt, dass auch die runden Sachen getiltet werden, kein Beinbruch aber nicht wirklich schön.
Das geht auch anders :-)

Gruß
Marco

ooze
09-07-2010, 23:19
edit:
hatte gerade noch eine andere Idee, da die relative Position der Kreise ja gleich bleibt:



\documentclass{scrreprt}
\usepackage{pstricks,pstricks-add}

\newcommand{\dreiknoten}[2]{
\rput(#1,#2){
\cnode[fillstyle=solid,linewidth=1.5pt](0,0){2mm}{A}
\cnode[fillstyle=solid](1 ,-0.3){1.5mm}{B}
\cnode[fillstyle=solid,fillcolor=black](1.3,-0.8){1mm}{C}

\ncline[linewidth=.5pt]{-}{A}{B}
\ncline[linewidth=.5pt]{-}{B}{C}
}
}

\begin{document}
\begin{pspicture}(13,5)


\dreiknoten{9}{4}
\dreiknoten{8}{3}

\end{pspicture}
\end{document}


Vielen Dank! Das sieht sehr gut aus und hilft mir erstmal weiter. Könnte man den Befehl auch noch so umbiegen, dass er nur ein Argument, nämlich die Bezeichnung eines Punktes ( ... \pnode)... braucht? Also in etwa so:

\pnode(5,5){Mittelpunkt}
\dreipunkte{Mittelpunkt}

mechanicus
10-07-2010, 10:50
Hi,


\documentclass{scrreprt}

\usepackage[on]{auto-pst-pdf}
\usepackage{pstricks}
\usepackage{pst-node}
\usepackage{pstricks-add}%
\newcommand*\bs[1]{#1}
\makeatletter
\def\Raumgitter(#1,#2)(#3,#4)#5#6{%
\pnodes{R@G}(#1,#2)(#3,#4)
\pst@cnta=#5%wie oft in x
\pst@cntb=#6%wie oft in y
\multido{\rA=0+2}{\pst@cnta}{%wie oft in x
\multido{\rC=0+1}{\pst@cntb}{%wie oft in y
\psline[linestyle=dashed,arrows=*-*]%
(!\psGetNodeCenter{R@G0} R@G0.x \rA\space add \rC\space #3 #1 neg add mul add R@G0.y \rC\space add)%
(!\psGetNodeCenter{R@G1} R@G1.x \rA\space add \rC\space #3 #1 neg add mul add R@G1.y \rC\space add)
}
}
\advance \pst@cnta by -1
\advance \pst@cntb by 1
%Vertikaler Verlauf
\multido{\rA=0+2}{\pst@cnta}{%wie oft in x
\multido{\rC=0+1}{\pst@cntb}{%wie oft in y
\psline[linestyle=dashed]%
(!\psGetNodeCenter{R@G0} R@G0.x \rA\space add \rC\space #3 #1 neg add mul add R@G0.y \rC\space add)
(!\psGetNodeCenter{R@G0} R@G0.x \rA\space add \rC\space #3 #1 neg add mul add 2 add R@G0.y \rC\space add)
}
}
}
\makeatother
\begin{document}
\begin{pspicture}(13,5)
\Raumgitter(1,1)(1.25,2){5}{3}
\end{pspicture}
\end{document}

Hier mal mit der Funktion Raumgitter:
Eingabeparameter:
Raumgitter: (x1,y1)(x2,y2){X}{Y}
(x1,y1) untere Ecke des ersten Gitters links unten
(x1,y1) obere Ecke des ersten Gitters links oben
{X}{Y} wie oft in jede Richtung


Das ist aber wirklich Spielerei :D

Gruß
Marco