Die Elektronen von oben sollen in dem Kasten von unten entlang der gestrichelten Linie äquidistant angeordnet werden, das heißt der Abstand vom ersten (linken) Elektron zur linken Kastenwand soll genauso groß sein, wie der Abstand zum zweiten Elektron, soll genaus so groß sein wie ..., soll genau so groß sein, wie der Abstand des letzten Elektrons zur rechten Kastenwand. Die Größe des Kastens ist fix und die richtigen Positionen sollen nicht von Hand angegeben werden müssen.

\documentclass{article}
\usepackage{pstricks}
\begin{document}

\begin{pspicture}[showgrid=true](0,0)(6,3)
  \cput[framesep=0pt](1,3){\tiny$-$}
  \cput[framesep=0pt](2,3){\tiny$-$}
  \cput[framesep=0pt](3,3){\tiny$-$}
  \cput[framesep=0pt](4,3){\tiny$-$}
  \cput[framesep=0pt](5,3){\tiny$-$}
  \psframe(1,0)(5,2)
  \psline[linestyle=dashed](1,1)(5,1)
\end{pspicture}
\end{document}

alt text

Am liebsten möchte ich einen Befehl, dem ich Startpunkt, Endpunkt, Objekt, Anzahl der Objekte, (optional) Abstand zum Startpunkt und (optional) Abstand zum Endpunkt übergeben kann und der die die Abstände der Objekte untereinander dann selbst bestimmt.

Hinweis: Die Elektronen muss man dazu eventuell durch

\pscirclebox[framesep=0pt]{\tiny$-$}

darstellen, ich bin aber auch für alternative Darstellungen offen, bei den Punkten habe ich leider nichts geeignetes gefunden.

gefragt 05 Sep '13, 22:08

Frink's gravatar image

Frink
1254510
Akzeptiert-Rate: 0%

bearbeitet 06 Sep '13, 11:46

Thorsten's gravatar image

Thorsten
1.6k325


Gleich vorweg: Mit TikZ würde ich das ganz anders machen. Bei der PSTricks-Familie kenne ich weder die Mittel der Mathematik noch die um Dinge (Nodes) entlang eines Pfades (\path) anzuordnen. Es folgt eine eTeX-unterstütze Umrechnung von Startpunkt, Endpunkt und Anzahl der Objekte in Startpunkt und „Deltapunkt“.

Das Macro \multiDoAlongLine versteht folgende Syntax

\multiDoAlongLine(<Startpunkt>)(<Endpunkt>){<Anzahl der Objekte>}{<Objekt>}

bzw.

\multiDoAlongLine*(<Startpunkt>)(<Endpunkt>){<Anzahl der Objekte>}{<Objekt>}

Bei der Version ohne Asterisk wird jeweils ein Objekt auf <Startpunkt> und <Endpunkt> gesetzt, bei der mit Asterisk werden quasi <Anzahl der Objekte> + 2 Objekte gesetzt, nur dass das erste und letzte eben nicht exisitert. (Das sorgt also dafür, dass zwischen Startpunkt und erstem Objekt sowie zwischen letztem Objekt und Endpunkt ebenfalls ein Abstand ist.)

Ich habe zum Verständnis dieses Unterschieds noch eine +- sowie eine ?-Reihe eingebaut.

Code

% arara: latex
% arara: dvips
% arara: ps2pdf
\documentclass[pstricks]{standalone}
%\usepackage{pstricks}
\makeatletter
\def\multiDoAlongLine{%
  \@ifstar{\@multiDoAlongLine{1}}{\@multiDoAlongLine{-1}}}
\def\@multiDoAlongLine#1(#2,#3)(#4,#5)#6#7{%
  \edef\@tempa{\the\dimexpr(#4pt-#2pt)/(#6+#1)\relax}%
  \edef\@tempb{\the\dimexpr(#5pt-#3pt)/(#6+#1)\relax}%
  \@tempdima\@tempa\relax
  \@tempdimb\@tempb\relax
  \edef\@tempc{(\strip@pt\@tempdima, \strip@pt\@tempdimb)}%
  \ifnum#1=1
    \edef\@tempa{\the\dimexpr\@tempa+#2pt\relax}%
    \edef\@tempb{\the\dimexpr\@tempb+#3pt\relax}%
    \@tempdima\@tempa\relax
    \@tempdimb\@tempb\relax
    \edef\@tempa{(\strip@pt\@tempdima, \strip@pt\@tempdimb)\@tempc}\relax
  \else
    \edef\@tempa{(#2,#3)\@tempc}%
  \fi
  \expandafter\multirput\@tempa{#6}{#7}%
}
\makeatother
\begin{document}

\begin{pspicture}[showgrid=true](0,0)(6,3.25)
  \multiDoAlongLine(1,3)(5,3){5}{\cput[framesep=0pt](0,0){\tiny$-$}}
  \psframe(1,0)(5,2)
%  \psline[linestyle=dashed](1,1)(5,1)
  \multiDoAlongLine*(1,1)(5,1){5}{\cput[framesep=0pt](0,0){\tiny$-$}}
  \multiDoAlongLine(1,.5)(5,.5){7}{\cput[framesep=0pt](0,0){\tiny$+$}}
  \multiDoAlongLine*(0,2.5)(6,2.5){5}{\cput[framesep=0pt](0,0){\tiny?}}
\end{pspicture}
\end{document}

Resultat

alt text

TikZ

\documentclass[tikz]{standalone}
\usetikzlibrary{backgrounds,calc}
\tikzset{
  declare function={
   alongLineWoPadding(\i,\n)=(\i-1)/(\n-1);
   alongLineWPadding(\i,\n)=\i/(\n+1);}}
\begin{document}
\begin{tikzpicture}[
  gridded,
  background grid/.append style={densely dotted},
  thick,
  electron/.style={draw, shape=circle, inner sep=+0pt, font={\tiny$-$}, outer sep=+2pt}]
\node[draw, minimum width=4cm, minimum height=2cm, outer sep=+0pt] at (3,1) (r) {};
\foreach \cnt in {1, ..., 5}
  \node[electron, yshift=2cm]
    at ($(r.west)!alongLineWoPadding(\cnt,5)!(r.east)$) (e\cnt) {};

\foreach \cnt in {1, ..., 5}
  \node[electron]
    at ($(r.west)!alongLineWPadding(\cnt,5)!(r.east)$) (e\cnt') {}
    (e\cnt) edge[thin, ->] (e\cnt');
\end{tikzpicture}
\end{document}
Permanenter link

beantwortet 05 Sep '13, 23:22

Qrrbrbirlbel's gravatar image

Qrrbrbirlbel
2.9k3815
Akzeptiert-Rate: 53%

bearbeitet 05 Sep '13, 23:36

@Qrrbrbirlbel: Cool man, hast du das jetzt extra für mich geschrieben? Vielen Dank!

(05 Sep '13, 23:40) Frink

könnte man auch leicht für Elektronen erweitern:

\documentclass[pstricks]{standalone}
%\usepackage{pstricks}
\makeatletter
\def\pstSymbols{\pst@object{pstSymbols}}% geht auch für "schiefe" Linien
\def\pstSymbols@i(#1,#2)(#3,#4)#5{{% alles lokal halten
  \addbefore@par{linestyle=symbol,symbolFont=Symbol,
                 symbolStep=\dimexpr(#3cm-#1cm)/#5\relax}
  \use@par\psline(#1,#2)(#3,#4)}}
\makeatother
\begin{document}

\begin{pspicture}[showgrid=true](0,0)(6,3.25)
  \psframe(1,0)(5,2)
  \pstSymbols[symbol=305](0,2.5)(6,2.5){9}% oktal 305=197=C5 im Symbol-Zeichensatz
  \pstSymbols[symbol=305](1,1.5)(5,1.5){3}
  \pstSymbols[symbol=305](1,0.5)(5,0.5){8}
\end{pspicture}
\end{document}
Permanenter link

beantwortet 06 Sep '13, 12:17

Herbert's gravatar image

Herbert
5.1k34
Akzeptiert-Rate: 31%

bearbeitet 06 Sep '13, 23:18

1

@Herbert: Im Code ist hinter \def\pstSymbols@i(#1,#2)(#3,#4)#5{ eine öffnende Klammer zu viel, oder?

(06 Sep '13, 15:11) esdd
2

Nein, die am Ende war aber verloren gegangen.

(06 Sep '13, 15:54) Herbert
1

sicher funktioniert es, aber es ist dann nicht zwingend lokal, was in dem Makro passiert. Deshalb immer {{...}} oder {\begingroup ... \endgroup}

(06 Sep '13, 16:23) Herbert

Man kann in PS-Tricks auch normale LaTeX-Befehle wie \makebox verwenden. \makebox kennt als Option für die Anordnung des Inhalts auch s für stretch. Dabei wir der Inhalt gleichmäßig verteilt, wozu die Wortzwischenräume entsprechend gedehnt werden:

\documentclass{article}
\usepackage{pstricks}
\newcommand\elektron{\pscirclebox[framesep=0pt]{\tiny $-$}}

\begin{document}

\begin{pspicture}[showgrid=true](0,0)(6,3)
  \cput[framesep=0pt](1,3){\tiny$-$}
  \cput[framesep=0pt](2,3){\tiny$-$}
  \cput[framesep=0pt](3,3){\tiny$-$}
  \cput[framesep=0pt](4,3){\tiny$-$}
  \cput[framesep=0pt](5,3){\tiny$-$}
  \psframe(1,0)(5,2)
  \rput[l](1,1.5){\makebox[4\psxunit][s]{\elektron\ \elektron\ \elektron\
      \elektron\ \elektron}}
  \psline[linestyle=dashed](1,1)(5,1)t
\end{pspicture}
\end{document}

Das Ergibt dann:

primitive Lösung

Und wenn man am Anfang und Ende auch noch einen Wortabstand einfügt:

\documentclass{article}
\usepackage{pstricks}
\usepackage{auto-pst-pdf}
\newcommand\elektron{\pscirclebox[framesep=0pt]{\tiny $-$}}

\begin{document}

\begin{pspicture}[showgrid=true](0,0)(6,3)
  \cput[framesep=0pt](1,3){\tiny$-$}
  \cput[framesep=0pt](2,3){\tiny$-$}
  \cput[framesep=0pt](3,3){\tiny$-$}
  \cput[framesep=0pt](4,3){\tiny$-$}
  \cput[framesep=0pt](5,3){\tiny$-$}
  \psframe(1,0)(5,2)
  \rput[l](1,1.5){\makebox[4\psxunit][s]{\ \elektron\ \elektron\ \elektron\
      \elektron\ \elektron\ }}
  \psline[linestyle=dashed](1,1)(5,1)t
\end{pspicture}
\end{document}

klappt es auch mit dem Abstand zum Rand der Box:

mit Abstand zum Rand

Die Anweisung \rput hat übrigens auch ein Winkelargument, das man verwenden kann, wenn die Gerade nicht horizontal, verläuft.

Permanenter link

beantwortet 06 Sep '13, 12:18

saputello's gravatar image

saputello
11.1k174365
Akzeptiert-Rate: 51%

bearbeitet 08 Sep '13, 11:10

1

@saputello: In aktuellen PS-Tricks Versionen funktioniert auch \foreach. Damit könnte man sich so etwas wie

\def\pstSymbolsFill(#1,#2)#3#4#5{%
  \put(#1,#2){\makebox[\dimexpr(#3\psxunit-#1\psxunit)][s]{%
    \ \foreach \i in {1,...,#4}{#5\ }}}}

definieren und dann im Dokument kürzer \pstSymbolsFill(1,1.5){5}{5}{\elektron} schreiben. Allerdings ist mir nicht klar, ob sich die Symbole mit \makebox zum Beispiel auch zwischen den Punkten (1,2) und (4,3) verteilen lassen.

(06 Sep '13, 15:12) esdd

Es macht nicht sonderlich viel Sinn den \put-Befehl anstelle von \rput zu benutzen.

(06 Sep '13, 16:08) Herbert

@Herbert Bei \rput muss ich noch ein optionales [l] mit angeben oder die Startkoordinaten anders wählen. Aber ich bin im Gegensatz zu Dir sicher nicht der PS-Tricks-Experte. Also habe ich die Beispiele entsprechend Deines Wunsches angepasst.

@esdd: Könnte man, aber ich denke, dass es in der jetzigen Form leichter verständlich ist.

(08 Sep '13, 11:13) saputello
Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×41
×10

gestellte Frage: 05 Sep '13, 22:08

Frage wurde gesehen: 12,725 Mal

zuletzt geändert: 08 Sep '13, 11:13