Melhoria de código para figura PSTricks

Melhoria de código para figura PSTricks

Considere o seguinte exemplo.

Código

\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}

Saída

insira a descrição da imagem aqui

Pergunta

Tenho certeza de que o código pode ser melhorado/otimizado. Como faço isso?


Atualização 1

Tentei simplificar a criação dos dezesseis \pnodes, mas quando eles são substituídos pelas quatro linhas comentadas no código abaixo, não consigo compilar.

\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}

Responder1

não faz sentido para mim usar nós onde apenas coordenadas são necessárias. Defina uma unidade como múltiplo de 60, então você pode simplesmente usar 1,2,3,... independentemente da sua configuração de comprimento/unidade:

\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}

insira a descrição da imagem aqui

e o mesmo com a definição de um elemento que é então movido e girado:

\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}

e se você preferir a configuração por meio de um comando, use

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

Responder2

PSTricks orientados a objetos:

insira a descrição da imagem aqui

\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}

Animação:

insira a descrição da imagem aqui

\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}

informação relacionada