Codeverbesserung für PSTricks-Abbildung

Codeverbesserung für PSTricks-Abbildung

Betrachten Sie das folgende Beispiel.

Code

\documentclass{article}

\usepackage{pstricks-add}

\begin{document}

\def\laengde{60 }
\psset{unit=0.04}
\begin{pspicture}(260,260)
\pnode(0,0){P1}
\pnode(!0 \laengde){P2}
\pnode(!0 2 \laengde mul){P3}
\pnode(!0 3 \laengde mul){P4}
\pnode(!0 4 \laengde mul){P5}
\pnode(!\laengde 4 \laengde mul){P6}
\pnode(!2 \laengde mul 4 \laengde mul){P7}
\pnode(!3 \laengde mul 4 \laengde mul){P8}
\pnode(!4 \laengde mul 4 \laengde mul){P9}
\pnode(!4 \laengde mul 3 \laengde mul){P10}
\pnode(!4 \laengde mul 2 \laengde mul){P11}
\pnode(!4 \laengde mul \laengde){P12}
\pnode(!4 \laengde mul 0){P13}
\pnode(!3 \laengde mul 0){P14}
\pnode(!2 \laengde mul 0){P15}
\pnode(!\laengde 0){P16}
\psline(P1)(P2)
\psarc(P3){\laengde}{270}{90}
\psline(P4)(P5)(P6)
\psarc(P7){\laengde}{180}{0}
\psline(P8)(P9)(P10)
\psarc(P11){\laengde}{90}{270}
\psline(P12)(P13)(P14)
\psarc(P15){\laengde}{0}{180}
\psline(P16)(P1)
\pspolygon(P3)(P7)(P11)(P15)
\multido{\iA=5+1,\iB=6+1}{8}{%
  \pcline[offset=12pt]{|<->|}(P\iA)(P\iB)
  \ncput*[nrot=:U]{\laengde}
}
\end{pspicture}

\end{document}

Ausgabe

Bildbeschreibung hier eingeben

Frage

Ich bin ziemlich sicher, dass der Code verbessert/optimiert werden kann. Wie mache ich das?


Aktualisierung 1

Ich habe versucht, die Erstellung der sechzehn zu vereinfachen \pnodes, aber wenn sie im folgenden Code durch die vier auskommentierten Zeilen ersetzt werden, kann ich sie nicht kompilieren.

\documentclass{article}

\usepackage{pstricks-add}

\begin{document}

\def\laengde{60 }
\psset{unit=0.04}
\begin{pspicture}(260,260)
%\multido{\iA=1+1}{4}{\pnode(!0 \iA \laengde mul){P\iA}}
\pnode(!0 1 \laengde mul){P1}
\pnode(!0 2 \laengde mul){P2}
\pnode(!0 3 \laengde mul){P3}
\pnode(!0 4 \laengde mul){P4}
%\multido{\iB=1+1,\iC=5+1}{4}{\pnode(!\iB \laengde mul 4 \laengde mul){P\iC}}
\pnode(!1 \laengde mul 4 \laengde mul){P5}
\pnode(!2 \laengde mul 4 \laengde mul){P6}
\pnode(!3 \laengde mul 4 \laengde mul){P7}
\pnode(!4 \laengde mul 4 \laengde mul){P8}
%\multido{\iD=0+-1,\iE=9+1}{4}{\pnode(!4 \laengde mul \iD \laengde mul){P\iE}}
\pnode(!4 \laengde mul 3 \laengde mul){P9}
\pnode(!4 \laengde mul 2 \laengde mul){P10}
\pnode(!4 \laengde mul 1 \laengde mul){P11}
\pnode(!4 \laengde mul 0 \laengde mul){P12}
%\multido{\iF=0+-1,\iG=9+1}{4}{\pnode(!\iF \laengde mul 0){P\iG}}
\pnode(!3 \laengde mul 0){P13}
\pnode(!2 \laengde mul 0){P14}
\pnode(!1 \laengde mul 0){P15}
\pnode(!0 \laengde mul 0){P16}
\psline(P16)(P1)
\psarc(P2){\laengde}{270}{90}
\psline(P3)(P4)(P5)
\psarc(P6){\laengde}{180}{0}
\psline(P7)(P8)(P9)
\psarc(P10){\laengde}{90}{270}
\psline(P11)(P12)(P13)
\psarc(P14){\laengde}{0}{180}
\psline(P15)(P16)
\pspolygon(P2)(P6)(P10)(P14)
\multido{\iH=4+1,\iI=5+1}{8}{%
  \pcline[offset=12pt]{|<->|}(P\iH)(P\iI)
  \ncput*[nrot=:U]{\laengde}
}
\end{pspicture}

\end{document}

Antwort1

es macht für mich keinen Sinn, Knoten zu verwenden, bei denen nur Koordinaten benötigt werden. Definieren Sie eine Einheit als Vielfaches von 60, dann können Sie einfach 1,2,3,... verwenden, unabhängig von Ihrer Längen-/Einheiteneinstellung:

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

\psset{unit=60pt}
\begin{pspicture}(-2,-2)(2,2)
\pspolygon(-2,0)(0,2)(2,0)(0,-2)
\psline(-2,1)(-2,2)(-1,2)
\psarc(0,2){1}{180}{0}
\psline(1,2)(2,2)(2,1)
\psarc(2,0){1}{90}{270}
\psline(2,-1)(2,-2)(1,-2)
\psarc(0,-2){1}{0}{180}
\psline(-1,-2)(-2,-2)(-2,-1)
\psarc(-2,0){1}{270}{90}
\multido{\iA=-2+1}{4}{%
  \pcline[offset=12pt]{|<->|}(\iA,2)(!\iA\space 1 add 2) \ncput*[nrot=:U]{60}
  \pcline[offset=-12pt]{|<->|}(2,\iA)(!2 \iA\space 1 add)\ncput*[nrot=:U]{60}}
\end{pspicture}

\end{document}

Bildbeschreibung hier eingeben

und dasselbe gilt für die Definition eines Elements, das dann verschoben und gedreht wird:

\documentclass{article}
\usepackage{pstricks-add}

\def\Element{%
  \psline(-2,2)(-1,2)\psarc(0,2){1}{180}{0}\psline(1,2)(2,2)
  \psline(-1,1)(0,2)(1,1)}
\begin{document}

\psset{unit=60pt}
\begin{pspicture}(-2,-2)(2,2)
\multido{\iA=-90+90,\iB=-2+1}{4}{%
  \rput{\iA}(0,0){\Element}
  \pcline[offset=12pt]{|<->|}(\iB,2)(!\iB\space 1 add 2) \ncput*[nrot=:U]{60}
  \pcline[offset=-12pt]{|<->|}(2,\iB)(!2 \iB\space 1 add)\ncput*[nrot=:U]{60}}
\end{pspicture}

\end{document}

und wenn Sie die Einstellung über einen Befehl bevorzugen, dann verwenden Sie

\def\laengde{60}
\psset{unit=\laengde pt}

Antwort2

Objektorientierte PSTricks:

Bildbeschreibung hier eingeben

\documentclass[pstricks,border={12pt 12pt 24pt 24pt}]{standalone}
\usepackage{pst-node}
\usepackage{multido}

\def\Atom
{
    \psarcn(0,0){2}{0}{-90}
    \psline(2,0)(4,0)
    \psline(2,-2)
}

\def\Molecule(#1)#2%!
{
    \rput{#2}(#1)
    {
        \Atom
        \psscalebox{-1 1}{\Atom}%!
    }
}


\def\Label
{
    \pcline[offset=12pt]{|<*->|*}(0,0)(2,0)
    \ncput*{60}
}

\begin{document}

\begin{pspicture}(-4,-4)(4,4)
    \multido{\i=90+90}{4}{\Molecule(4;\i){!\i\space 90 sub}}
    \multirput(-4,4)(2,0){4}{\Label}
    \multirput{-90}(4,4)(0,-2){4}{\Label}
\end{pspicture}

\end{document}

Animation:

Bildbeschreibung hier eingeben

\documentclass{beamer}

\usepackage{pst-node}
\usepackage{multido}

\usepackage[active,tightpage]{preview}
\PreviewEnvironment{pspicture}
\renewcommand{\PreviewBbAdjust}{-12pt -12pt 24pt 24pt}

\def\Atom
{%!
    \only<+->{\psarcn(0,0){2}{0}{-90}}%!
    \only<+->{\psline(2,0)(4,0)}%!
    \only<+->{\psline(2,-2)}%!
}

\def\Molecule(#1)#2%!
{
    \rput{#2}(#1)
    {
        \Atom
        \psscalebox{-1 1}{\Atom}%!
    }
}


\def\Label
{%!
    \only<+->{\pcline[offset=12pt]{|<*->|*}(0,0)(2,0)}%!
    \only<+->{\ncput*{60}}%!
}

\begin{document}
\begin{frame}
\begin{pspicture}(-4,-4)(4,4)
    \multido{\i=90+90}{4}{\Molecule(4;\i){!\i\space 90 sub}}
    \multido{\i=-4+2}{4}{\rput(\i,4){\Label}}
    \multido{\i=4+-2}{4}{\rput{-90}(4,\i){\Label}}
\end{pspicture}
\end{frame}
\end{document}

verwandte Informationen