PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : pstricks: Shape definieren



Spindoctor
16-05-2008, 13:13
Hallo!

Eine kleine Frage an pstricks-Experten.

Nach einem Anfall von Größenwahnsinn möchte ich jetzt Referatsunterlagen mit LaTeX und pstricks erstellen.

Um das ganze zu illustrieren, möchte ich einige kleine Grafiken machen, in denen ich bestimmte shapes immer wieder brauche. So zum Beispiel ein Strichmännchen mit einem Buchstaben im Kopf, dass an verschiedenen Stellen auftaucht. Wie kann ich ein Strichmännchen als Shape definieren, so, dass ich es an unterschiedlichen Stellen einfügen kann und den Buchstaben im Kopf als Parameter übergeben kann?

Wenn mir jemand den Namen eines passenden Befehls sagen könnte (optimalerweise noch eine URL dazu), kann ich mir wahrscheinlich den Rest selber zusammensuchen.

Und - bevor ich dafür extra einen neuen Thread starte: gibt es bereits vorgefertigte Makros zum durchstreichen in pstricks, oder mach ich das manuell?

voss
16-05-2008, 13:35
Nach einem Anfall von Größenwahnsinn möchte ich jetzt Referatsunterlagen mit LaTeX und pstricks erstellen.

man sollte sich immer hohe Ziele stecken ... :D



Um das ganze zu illustrieren, möchte ich einige kleine Grafiken machen, in denen ich bestimmte shapes immer wieder brauche. So zum Beispiel ein Strichmännchen mit einem Buchstaben im Kopf, dass an verschiedenen Stellen auftaucht. Wie kann ich ein Strichmännchen als Shape definieren, so, dass ich es an unterschiedlichen Stellen einfügen kann und den Buchstaben im Kopf als Parameter übergeben kann?

Wenn mir jemand den Namen eines passenden Befehls sagen könnte (optimalerweise noch eine URL dazu), kann ich mir wahrscheinlich den Rest selber zusammensuchen.

Und - bevor ich dafür extra einen neuen Thread starte: gibt es bereits vorgefertigte Makros zum durchstreichen in pstricks, oder mach ich das manuell?


\listfiles
\documentclass[a4paper]{article}
\usepackage{pstricks}

\makeatletter
\def\Strichmann{\@ifnextchar[\Strichmann@i{\Strichmann[1]}}
\def\Strichmann@i[#1]#2{%
\begingroup\psscalebox{#1}{\psset{linewidth=2pt}%
\pspicture(1,3)
\psline(0,2)(0.5,1.5)(1,2)\psline(0,0)(0.5,1)(1,0)
\psline(0.5,1)(0.5,2.5)
\pscircle*(0.5,2.5){0.4}
\rput(0.5,2.5){\color{white}{\Large\textbf{#2}}}
\endpspicture}\endgroup}
\makeatother
\begin{document}

\Strichmann{A} \Strichmann[0.5]{B} \Strichmann[1.234]{c}

\end{document}

Herbert

Sabrina.Dankers
16-05-2008, 13:42
Hey,

ihr macht echt coole Sachen. Ich hab mich ja bisher wenig mit pstricks beschäftigt. Brauchte bisher auch immer nur so kleine Zeichnungen die ich noch gut mit pictex machen konnte, aber pstricks scheint mir echt mächtig zu sein.

@Herbert: Woher weißt du eigentlich immer die ganzen Sachen? Jahrelange Erfahrung? Ich such mich immer halbtot und dann kommt der Herbert und weiß sofort eine Lösung.

Spindoctor
16-05-2008, 13:52
Zunächst mal DANKE, Herbert!

Aber wenn ich das richtig als fertiges Beispiel deute (was ja mehr ist als ich zu hoffen wagte), dann wills bei mir nicht kompilieren.


Es gibt 42 Fehler (wenn ich nur Strichmann A drinnenlasse, immerhin noch 14), die alle mit ! Undefined control sequence. anfangen.

Und da ich das leider alles noch nicht wirklich durchschau, kann ich auch keinen Fehler finden :(

Wo muss ich denn nachlesen, wenn ich sowas machen will?

@ Sabrina
Mir kommts eher so vor: Herbert macht die coolen Sachen. Auch localghost. Ich versuch mit ihren Problemlösungen und ein wenig mit den Manuals selbst was kreatives zu basteln. Danke jdfs. für das Kompliment.

Sabrina.Dankers
16-05-2008, 13:59
Ich hab Herberts Beispiel ausprobiert und bei mir läuft es fehlerfrei.

Spindoctor
16-05-2008, 14:12
aha. interessant. Bei mir läuft der ps-Durchgang auch fehlerfrei, wie ich sehe. Erst beim übersetzen nach pdf will er nicht mehr...
Verwende TeXnicCenter mit dem script von localghost (von hier: http://www.mrunix.de/forums/showthread.php?t=47812)...

voss
16-05-2008, 14:15
aha. interessant. Bei mir läuft der ps-Durchgang auch fehlerfrei, wie ich sehe. Erst beim übersetzen nach pdf will er nicht mehr...
Verwende TeXnicCenter mit dem script von localghost (von hier: http://www.mrunix.de/forums/showthread.php?t=47812)...

c:\Programme\gs\gs8.00\lib\ps2pdf.bat

ist das denn der richtige Pfad bei dir? gs8.00 ist ziemlich alt.

Sonst kann man irgendwo unter TeXnicCenter alles einstellen.
Hier ist auch ein Ausgabeprofil, was man über Bearbeiten->Profile (oder so)
importieren kann:
http://texnik.dante.de/cgi-bin/mainFAQ.cgi?file=gui/TeXnikCenter#ps2pdf (ganz unten)

Herbert

Spindoctor
16-05-2008, 14:32
das hab ich umgestellt.
Aber ich bin mittlerweile draufgekommen:

Mit folgenden Änderungen war es lauffähig:

\listfiles
\documentclass[a4paper]{article}
\usepackage{pstricks}
\usepackage{pst-pdf}

\makeatletter
\def\Strichmann{\@ifnextchar[\Strichmann@i{\Strichmann[1]}}
\def\Strichmann@i[#1]#2{%
\begingroup\psscalebox{#1}{\psset{linewidth=2pt}%
\pspicture(1,3)
\psline(0,2)(0.5,1.5)(1,2)\psline(0,0)(0.5,1)(1,0)
\psline(0.5,1)(0.5,2.5)
\pscircle*(0.5,2.5){0.4}
\rput(0.5,2.5){\color{white}{\Large\textbf{#2}}}
\endpspicture}\endgroup}
\makeatother
\begin{document}

\begin{pspicture}(0,0)(10,10)
\rput(5,5){\Strichmann{A}}
\Strichmann[0.5]{B} \Strichmann[1.234]{c}
\end{pspicture}

\end{document}

Danke nochmal dafür.

Das Blaue ist mein Versuch, die Strichmännchen in meinem pspicture-Rahmen zu verschieben. Gibt es dafür vielleicht eine elegantere Lösung, wie ich das gleich in der Definition des Befehls \Strichmann machen kann?

Spindoctor
16-05-2008, 14:55
Ich glaub ich habs hinbekommen

\listfiles
\documentclass[a4paper]{article}
\usepackage{pstricks}
\usepackage{pst-pdf}

\makeatletter
\def\Strichmann{\@ifnextchar[\Strichmann@i{\Strichmann[1]}}
\def\Strichmann@i[#1]#2(#3,#4){%
\rput(#3,#4){%
\begingroup\psscalebox{#1}{\psset{linewidth=2pt}%
\pspicture(1,3)
\psline(0,2)(0.5,1.5)(1,2)\psline(0,0)(0.5,1)(1,0)
\psline(0.5,1)(0.5,2.5)
\pscircle*(0.5,2.5){0.4}
\rput(0.5,2.5){\color{white}{\Large\textbf{#2}}}
\endpspicture}\endgroup
}%
}
\makeatother
\begin{document}

\begin{pspicture}(0,0)(10,10)
\Strichmann{A}(2,2)
\end{pspicture}

\end{document}
Eigentlich schaffbar, man muss sich nur traun...

voss
16-05-2008, 15:16
Ich glaub ich habs hinbekommen

\listfiles
\documentclass[a4paper]{article}
\usepackage{pstricks}
\usepackage{pst-pdf}

\makeatletter
\def\Strichmann{\@ifnextchar[\Strichmann@i{\Strichmann[1]}}
\def\Strichmann@i[#1]#2(#3,#4){%
\rput(#3,#4){%
\begingroup\psscalebox{#1}{\psset{linewidth=2pt}%
\pspicture(1,3)
\psline(0,2)(0.5,1.5)(1,2)\psline(0,0)(0.5,1)(1,0)
\psline(0.5,1)(0.5,2.5)
\pscircle*(0.5,2.5){0.4}
\rput(0.5,2.5){\color{white}{\Large\textbf{#2}}}
\endpspicture}\endgroup
}%
}
\makeatother
\begin{document}

\begin{pspicture}(0,0)(10,10)
\Strichmann{A}(2,2)
\end{pspicture}

\end{document}
Eigentlich schaffbar, man muss sich nur traun...
so ist es ...

MAch mal \endgroup%

PSTricks versucht zwar alles mögliche, um die sogenannten trailing spaces
abzufangen, aber manchmal wundert man sich wieder, warum etwas nach
rechts verschoben ist. Weiterhin ist vielleicht ein \rput[lb]/..
sinnvoll, weil man dann immer die linke untere Ecke als Bezugspunkt hat.

pst-pdf brauchst du nur, wenn du am Ende definitiv einen pdflatex-Lauf brauchst.
Der Vorteil ist eben dieser, aber der Nachteil, dass du genau darauf achten musst,
dass deine PSTricks-Zeichnungen in pspicture-Umgebungen eingebettet suind und
dass du das spezielle Skript ps4pdf anwendest, was du ja machst. Die andere
Variante mit einfachem dvi->ps->pdf klappt imemr, man muss auf nichts achten,
hat aber keinen echten pdflatex-Lauf. Was heir allerdings uninteressant ist.

Auf http.//PSTricks.tug.org findest du viele Beispiele für alles mögliche ...

Herbert

Spindoctor
16-05-2008, 17:42
Danke!

Hab nach \endgroup# gesetzt.

Ich versuch gerade, Dein Strichmann Beispiel mit anderen simplen Definitionen nachzuvollziehen.

Mit einem "richtig" Häckchen hats schon geklappt

\makeatletter
\def\Haken{%
\begingroup{\psset{unit=1em,linewidth=2pt}%
\pspicture(1,1)
\psline(0,0.4)(0.4,0)(1,0.8)
\endpspicture}\endgroup%
}
\makeatother
Jetzt versuch ich mich gerade an einem in beide Richtungen durchgestrichenem circlenode.

Das gelingt mir bislang noch nicht. Zunächst habe ich versucht, nur einen circlenode zu machen.

\makeatletter
\def\Kreis@#1{%
\begingroup{\psset{unit=1em,linewidth=2pt}%
\pspicture(1,1)
\circlenode[linewidth=2pt]{k#1}{{\textbf{#1}}}
\endpspicture}\endgroup%
}
\makeatotherLeider funktioniert das auch nicht so.

Soweit ich das überblicke, unterscheidet sich mein circlenode von Deinem Strichmännchen in der Syntax jedoch nur durch

\def\Strichmann{\@ifnextchar[\Strichmann@i{\Strichmann[1]}}leider erschließt sich mir aber noch nicht die Funktion dieser Zeile.

Was macht die denn?

Wie ich am besten kompiliere schau ich mir am Schluß an.
Werde mir die pstricks Seite nochmal genau durchlesen.

voss
16-05-2008, 18:30
Jetzt versuch ich mich gerade an einem in beide Richtungen durchgestrichenem circlenode.

Das gelingt mir bislang noch nicht. Zunächst habe ich versucht, nur einen circlenode zu machen.

\makeatletter
\def\Kreis@#1{%
\begingroup{\psset{unit=1em,linewidth=2pt}%
\pspicture(1,1)
\circlenode[linewidth=2pt]{k#1}{{\textbf{#1}}}
\endpspicture}\endgroup%
}
\makeatotherLeider funktioniert das auch nicht so.

Soweit ich das überblicke, unterscheidet sich mein circlenode von Deinem Strichmännchen in der Syntax jedoch nur durch

\def\Strichmann{\@ifnextchar[\Strichmann@i{\Strichmann[1]}}leider erschließt sich mir aber noch nicht die Funktion dieser Zeile.

Was macht die denn?

Wie ich am besten kompiliere schau ich mir am Schluß an.
Werde mir die pstricks Seite nochmal genau durchlesen.

du musst am besten objektorientiert denken. Wenn du etwas als \pst@object
definierst, dann nimmt dir PSTricks das EInlesen eventueller Paraneter
automatisch ab.


\documentclass{article}
\usepackage{pstricks}
\makeatletter
\def\psHaken{\pst@object{psHaken}}% Lies Optionen ein und mache mit @i weiter
\def\psHaken@i{%
\pst@killglue% Leerzeichen beseitigen
\begingroup% halte alles folgende lokal
\addbefore@par{unit=1em,linewidth=2pt,linejoin=1}% Standard setzen
% wird vor die Userliste gesetzt, kann daher durch den User ersetzt werden
\use@par% aktiviere alle Parametersetzungen
\pspicture(1,1)\psline(0,0.4)(0.4,0)(1,0.8)\endpsp icture%
\endgroup}
\makeatother

\begin{document}

\psHaken \psHaken[linecolor=red] \psHaken[linecolor=red,linestyle=dashed]
\psHaken[linewidth=1pt]

\end{document}

Auf diese Weise kannst du immer alle vorhanden PSTricks-Optionen nutzen.

Herbert

Spindoctor
16-05-2008, 23:08
Danke.

Habs jetzt mit der ersten Methode, Makros zu definieren, geschafft.

Hier meine Definitionen:

\makeatletter
\def\Strichmann{\@ifnextchar[\Strichmann@i{\Strichmann[1]}}
\def\Strichmann@i[#1]#2(#3,#4){%
\rput(#3,#4){%
\begingroup\psscalebox{#1}{\psset{linewidth=2pt}%
\pspicture(1,3)
\psline{c-c}(0,2)(0.5,1.5)(1,2)\psline{c-c}(0,0)(0.5,1)(1,0)
\psline{c-c}(0.5,1)(0.5,2.5)
\pscircle*(0.5,2.5){0.4}
\rput(0.5,2.5){\color{white}{\Large\textbf{#2}}}
\endpspicture}\endgroup%
}%
}
\makeatother

\makeatletter
\def\Haken{%
\begingroup{~\psset{unit=1em,linewidth=2pt}%
\pspicture(1,1)
\psline(0,0.4)(0.4,0)(1,0.8)
\endpspicture~}\endgroup%
}
\makeatother

\makeatletter
\def\Kreis#1{%
\begingroup{~\psset{linewidth=2pt}%
\pspicture(1,1)
\cnodeput[linewidth=2pt](0.5,0.5){k#1}{{\textbf{#1}}}
\endpspicture~}\endgroup%
}
\makeatotherDoch wie so oft bringt die Lösung des einen Problems schon das nächste (http://www.mrunix.de/forums/showthread.php?t=58698)hervor :)

Zumindest habe ich das Prinzip des Definierens jetzt halbwegs verstanden.
Ist ein substanzieller Unterschied zwischen \newcommand, \def und \pst@object?

voss
17-05-2008, 07:11
Zumindest habe ich das Prinzip des Definierens jetzt halbwegs verstanden.
Ist ein substanzieller Unterschied zwischen \newcommand, \def und \pst@object?

\newcommand ist die korrekte LaTeX-Syntax für die Definition
eines neuen Befehls. \def ist die TeX-Syntax und muss imemr dann
herhalten, wenn man etwas "TeXnischer" programmiert. \def überschreibt
gnadenlos bestehende Befehle, wohingegen \newcommand sagt; geht nicht,
den Befehl gibt es schon. \pst@object ist ein reines mit \def definiertes
PSTricks-Makro, welches automatisch die optionalen Argumente in [...]
einliest und sie in \pst@par speichert und dann automatisch mit dem
selben Befehlsnamen um @i ergänzt weitermacht.

Herbert

Spindoctor
17-05-2008, 10:55
verstehe.

Danke!