Etiquetas superpuestas en PSTricks

Etiquetas superpuestas en PSTricks

Considere el siguiente ejemplo.

\documentclass{beamer}

\usepackage[locale = DE]{siunitx}
\usepackage{xfp}
\usepackage{etoolbox}
\usepackage{pstricks-add}
\usepackage{tikz}

\psset{dimen = m}

% data
\def\bredde{4.5}
\def\start{0}
\def\eleverNul{4}
\def\eleverEn{2}
\def\eleverTo{5}
\def\eleverTre{7}
\def\eleverFire{5}
\def\eleverFem{3}
% beregninger
\newcommand*\eleverSumNul{\eleverNul}
\newcommand*\eleverSumEn{\fpeval{\eleverSumNul+\eleverEn}}
\newcommand*\eleverSumTo{\fpeval{\eleverSumEn+\eleverTo}}
\newcommand*\eleverSumTre{\fpeval{\eleverSumTo+\eleverTre}}
\newcommand*\eleverSumFire{\fpeval{\eleverSumTre+\eleverFire}}
\newcommand*\eleverSumFem{\fpeval{\eleverSumFire+\eleverFem}}
\newcommand*\eleverTotal{\fpeval{\eleverSumFem}}
\def\andelB[#1]#2#3#4{%
  \pswedge[fillstyle = solid, fillcolor = #1]%
     {\radius}{\fpeval{round(#2/\eleverTotal*360,9)}}{\fpeval{round(#3/\eleverTotal*360,9)}}
  \ifstrequal{#1}{black}%
    {\psarc[linecolor = white]%
       (0,0){0.5}{\fpeval{round(#2/\eleverTotal*360,9)}}{\fpeval{round(#3/\eleverTotal*360,9)}}
     \uput{8pt}[\fpeval{round((#2+#3)/\eleverTotal*180,9)}]%
       (0,0){\textcolor{white}{\footnotesize\SI{\fpeval{round((#3-#2)/\eleverTotal*360)}}{\degree}}}}
    {\psarc%
       (0,0){0.5}{\fpeval{round(#2/\eleverTotal*360,9)}}{\fpeval{round(#3/\eleverTotal*360,9)}}
     \uput{8pt}[\fpeval{round((#2+#3)/\eleverTotal*180,9)}]%
       (0,0){\footnotesize\SI{\fpeval{round((#3-#2)/\eleverTotal*360)}}{\degree}}}%
}


\begin{document}

\begin{frame}{Opgave~$7$}
\begin{center}
\psset{
  unit = 0.4,
  linejoin = 1
}
\def\radius{5}
  \begin{pspicture}(\fpeval{-(\radius+0.1)},\fpeval{-(\radius+0.1)})%
                   (\fpeval{+(\radius+0.1)},\fpeval{+(\radius+0.1)})
    \visible<4->{%
      \pscircle(0,0){\radius}
      \multido{\r = 0+\fpeval{round(360/\eleverTotal,9)}}{\eleverTotal}{%
      \psRelLine[angle = \r](0,0)(\fpeval{\radius+0.1},0){1}{EndNode}
      \psRelLine[angle = \r, linecolor = white, linewidth = 2\pslinewidth]%
        (0,0)(\fpeval{\radius-0.1},0){1}{EndNode}}}
    \visible<5->{\andelB[yellow!70]{\start}{\eleverSumNul}}
    \visible<6->{\andelB[red!70]{\eleverSumNul}{\eleverSumEn}}
    \visible<7->{\andelB[green!80]{\eleverSumEn}{\eleverSumTo}}
    \visible<8->{\andelB[orange!80]{\eleverSumTo}{\eleverSumTre}}
    \visible<9->{\andelB[blue!70!white]{\eleverSumTre}{\eleverSumFire}}
    \visible<10->{\andelB[black]{\eleverSumFire}{\eleverSumFem}}
  \end{pspicture}
\end{center}
\end{frame}

\end{document}

captura de pantalla

Pregunta

Como puede verse, la 28°etiqueta no está impresa "encima" de la cuña verde. (Por supuesto, es lo mismo que las otras etiquetas).

¿Cómo me aseguro de que las etiquetas estén siempre impresas "encima"?

Respuesta1

Con solo una modificación de algunos parámetros:

    \documentclass{beamer}

    \usepackage[locale = DE]{siunitx}
    \usepackage{xfp}
    \usepackage{etoolbox}
    \usepackage{pstricks-add}
    \usepackage{tikz}

    \psset{dimen = m}

    % data
    \def\bredde{4.5}
    \def\start{0}
    \def\eleverNul{4}
    \def\eleverEn{2}
    \def\eleverTo{5}
    \def\eleverTre{7}
    \def\eleverFire{5}
    \def\eleverFem{3}
    % beregninger
    \newcommand*\eleverSumNul{\eleverNul}
    \newcommand*\eleverSumEn{\fpeval{\eleverSumNul+\eleverEn}}
    \newcommand*\eleverSumTo{\fpeval{\eleverSumEn+\eleverTo}}
    \newcommand*\eleverSumTre{\fpeval{\eleverSumTo+\eleverTre}}
    \newcommand*\eleverSumFire{\fpeval{\eleverSumTre+\eleverFire}}
    \newcommand*\eleverSumFem{\fpeval{\eleverSumFire+\eleverFem}}
    \newcommand*\eleverTotal{\fpeval{\eleverSumFem}}
    \def\andelB[#1]#2#3#4{%
      \pswedge[fillstyle = solid, fillcolor = #1]%
         {\radius}{\fpeval{round(#2/\eleverTotal*360,9)}}{\fpeval{round(#3/\eleverTotal*360,9)}}
      \ifstrequal{#1}{black}%
        {\psarc[linecolor = white]%
           (0,0){1.5}{\fpeval{round(#2/\eleverTotal*360,9)}}{\fpeval{round(#3/\eleverTotal*360,9)}}%
         \uput{2}[\fpeval{round((#2+#3)/\eleverTotal*180,9)}]%8pt
           (0,0){\textcolor{white}{\footnotesize\SI{\fpeval{round((#3-#2)/\eleverTotal*360)}}{\degree}}}}
        {\psarc%
           (0,0){1.5}{\fpeval{round(#2/\eleverTotal*360,9)}}{\fpeval{round(#3/\eleverTotal*360,9)}}%
    %\def\r{}
         \uput{2}[\fpeval{round((#2+#3)/\eleverTotal*180,9)}]%
           (0,0){\footnotesize\SI{\fpeval{round((#3-#2)/\eleverTotal*360)}}{\degree}}}%
    }


    \begin{document}

    \begin{frame}{Opgave~$7$}
    \begin{center}
    \psset{
      unit = 0.4,
      linejoin = 1
    }
    \def\radius{5}
      \begin{pspicture}(\fpeval{-(\radius+0.1)},\fpeval{-(\radius+0.1)})%
                       (\fpeval{+(\radius+0.1)},\fpeval{+(\radius+0.1)})
        \visible<4->{%
          \pscircle(0,0){\radius}
          \multido{\r = 0+\fpeval{round(360/\eleverTotal,9)}}{\eleverTotal}{%
          \psRelLine[angle = \r](0,0)(\fpeval{\radius+0.1},0){1}{EndNode}
          \psRelLine[angle = \r, linecolor = white, linewidth = 2\pslinewidth]%
            (0,0)(\fpeval{\radius-0.1},0){1}{EndNode}}}
        \visible<5->{\andelB[yellow!70]{\start}{\eleverSumNul}}
        \visible<6->{\andelB[red!70]{\eleverSumNul}{\eleverSumEn}}
        \visible<7->{\andelB[green!80]{\eleverSumEn}{\eleverSumTo}}
        \visible<8->{\andelB[orange!80]{\eleverSumTo}{\eleverSumTre}}
        \visible<9->{\andelB[blue!70!white]{\eleverSumTre}{\eleverSumFire}}
        \visible<10->{\andelB[black]{\eleverSumFire}{\eleverSumFem}}
      \end{pspicture}
    \end{center}
    \end{frame}

    \end{document} 

ingrese la descripción de la imagen aquí

Agregado: Usando el valor 5.3 como primer argumento de \uput(en lugar de 2) en la definición de \andelB, obtendrás una etiqueta fuera del círculo grande. (En este caso, no olvides eliminar \textcolor{white}para el sector negro):

ingrese la descripción de la imagen aquí

Respuesta2

El argumento obligatorio para \uput{<distance>}define la distancia desde el punto en cuestión donde colocará el contenido a colocar. Estás usando 8pten tu \andelBmacro... aumenta esto a algo más grande, como 25pt:

ingrese la descripción de la imagen aquí

\def\andelB[#1]#2#3#4{%
  \pswedge[fillstyle = solid, fillcolor = #1]%
     {\radius}{\fpeval{round(#2/\eleverTotal*360,9)}}{\fpeval{round(#3/\eleverTotal*360,9)}}
  \ifstrequal{#1}{black}%
    {\psarc[linecolor = white]%
       (0,0){0.5}{\fpeval{round(#2/\eleverTotal*360,9)}}{\fpeval{round(#3/\eleverTotal*360,9)}}
     \uput{25pt}[\fpeval{round((#2+#3)/\eleverTotal*180,9)}]%
       (0,0){\textcolor{white}{\footnotesize\SI{\fpeval{round((#3-#2)/\eleverTotal*360)}}{\degree}}}}
    {\psarc%
       (0,0){0.5}{\fpeval{round(#2/\eleverTotal*360,9)}}{\fpeval{round(#3/\eleverTotal*360,9)}}
     \uput{25pt}[\fpeval{round((#2+#3)/\eleverTotal*180,9)}]%
       (0,0){\footnotesize\SI{\fpeval{round((#3-#2)/\eleverTotal*360)}}{\degree}}}%
}

Respuesta3

\psset{
  unit = 0.4,opacity=0.5,
  linejoin = 1
}

ingrese la descripción de la imagen aquí

Sin embargo, puedes engañarte \psCharty dejar que todos los cálculos los realice la macro:

\documentclass{beamer}
\usepackage{pstricks-add}
\newcounter{temp}
\def\Chart{\psChart{55,28,69,97,69,42}{}{4}}
\begin{document}

\begin{frame}{Opgave~$7$}
\begin{center}
\begin{pspicture}(-3,-3)(3,3)
\visible<1->{%
  \psset{userColor={yellow!70,white,white,white,white,white}}\Chart
  \rput(psChartI1){55}}
\visible<2->{%
  \psset{userColor={yellow!70,red!70,white,white,white,white}}\Chart
  \rput(psChartI1){55}\rput(psChartI2){28}}
\visible<3->{%
  \psset{userColor={yellow!70,red!70,green!80,white,white,white}}\Chart
  \rput(psChartI1){55}\rput(psChartI2){28}\rput(psChartI3){69}}
\visible<4->{%
  \setcounter{temp}{0}%
  \psset{userColor={yellow!70,red!70,green!80,orange!80,white,white}}\Chart
  \psforeach{\iA}{55,28,69,97}{\stepcounter{temp}\rput(psChartI\thetemp){\iA}}}
\visible<5->{%
  \setcounter{temp}{0}%
  \psset{userColor={yellow!70,red!70,green!80,orange!80,blue!70!white,white}}\Chart
  \psforeach{\iA}{55,28,69,97,69}{\stepcounter{temp}\rput(psChartI\thetemp){\iA}}}
\visible<6>{%
  \setcounter{temp}{0}%
  \psset{userColor={yellow!70,red!70,green!80,orange!80,blue!70!white,black}}\Chart
  \psforeach{\iA}{55,28,69,97,69}{\stepcounter{temp}\rput(psChartI\thetemp){\iA}}
  \rput(psChartI6){\color{white}42}}
\pscircle{4}
\degrees[26]\multido{\iA=0+1}{26}{\psline(4;\iA)(4.1;\iA)}
\end{pspicture}
\end{center}
\end{frame}

\end{document}

ingrese la descripción de la imagen aquí

Respuesta4

Sólo por diversión: un TikAlternativa Z. Sólo necesitas especificar las listas de números y colores,

\def\LstNums{4,2,5,7,5,3}
\def\LstColors{"yellow!70","red!70","green!80","orange!80","blue!70!white","black"}

y el código hará el resto. Los colores de la etiqueta se eligen de forma complementaria al color de relleno, según el modelo de color RGB. (Es muy posible que otros modelos de color se vean mejores o diferentes). De esta manera, las etiquetas y los arcos internos son visibles. La animación comienza en la diapositiva 4 ( \def\istart{4}), como en su código.

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{overlay-beamer-styles,backgrounds}
% from https://tex.stackexchange.com/a/283618
\newcommand{\convertdirectly}[3][hsb]{\begingroup%
  \extractcolorspecs{#2}{\modelcmd}{\colorcmd}%
  \convertcolorspec{\modelcmd}{\colorcmd}{#1}{\tmp}%
  \aftergroupdef#3\tmp}
\begin{document}

\begin{frame}[t]
\frametitle{Opgave~$7$}
\begin{center}
\begin{tikzpicture}[declare function={R=3;}]
 \def\istart{4}
 \def\LstNums{4,2,5,7,5,3}
 \def\LstColors{"yellow!70","red!70","green!80","orange!80","blue!70!white","black"}
 \def\mysum{0}
 \foreach \X [remember=\mysum as \mysum]in \LstNums
 {\pgfmathsetmacro{\mysum}{\mysum+\X}
 \xdef\pgfmathresult{\mysum}}
 \edef\mytotal{\pgfmathresult}
 \pgfmathtruncatemacro{\mydim}{dim(\LstNums)-1}
 \draw[thick,visible on=<\istart->] circle[radius=R*1cm]
 foreach \X in {0,10,...,350} {(\X:R) -- (\X:R+0.05)};
 \def\mysum{0}
 \foreach \X [remember=\mysum as \mysum] in {0,...,\mydim}
 {\pgfmathsetmacro{\mypercentage}{{\LstNums}[\X]/\mytotal}
  \pgfmathsetmacro{\mycolor}{{\LstColors}[\X]}
   \begin{scope}[on background layer]
   \draw[visible on=<\the\numexpr\istart+1+\X\relax->,fill=\mycolor]
    (0,0) -- (\mysum:R) arc(\mysum:\mysum+\mypercentage*360:R) --cycle;
  \end{scope}   
  \convertdirectly[RGB]{\mycolor}{\currRGB}
  \pgfmathtruncatemacro{\currR}{255-{\currRGB}[0]}
  \pgfmathtruncatemacro{\currG}{255-{\currRGB}[1]}
  \pgfmathtruncatemacro{\currB}{255-{\currRGB}[2]}
  \definecolor{tmp}{RGB}{\currR,\currG,\currB}
  \draw[visible on=<\the\numexpr\istart+1+\X\relax->,color=tmp,thick] 
   (\mysum:0.2*R) arc(\mysum:\mysum+\mypercentage*360:0.2*R)
   (\mysum+\mypercentage*180:0.6*R) node
   {$\pgfmathparse{int(360*\mypercentage+0.5)}\pgfmathresult^\circ$};
  \pgfmathsetmacro{\mysum}{\mysum+{\LstNums}[\X]*360/\mytotal} 
 }
\end{tikzpicture}
\end{center}
\end{frame}
\end{document}

ingrese la descripción de la imagen aquí

Si acerca las etiquetas al centro, las cuñas no las pintarán demasiado, ya que las cuñas se dibujan en la backgroundcapa.

\PassOptionsToPackage{cmyk}{xcolor}
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{overlay-beamer-styles,backgrounds}
% from https://tex.stackexchange.com/a/283618
\newcommand{\convertdirectly}[3][hsb]{\begingroup%
  \extractcolorspecs{#2}{\modelcmd}{\colorcmd}%
  \convertcolorspec{\modelcmd}{\colorcmd}{#1}{\tmp}%
  \aftergroupdef#3\tmp}
\begin{document}

\begin{frame}[t]
\frametitle{Opgave~$7$}
\begin{center}
\begin{tikzpicture}[declare function={R=3;}]
 \def\istart{4}
 \def\LstNums{4,2,5,7,5,3}
 \def\LstColors{"yellow!70","red!70","green!80","orange!80","blue!70!white","black"}
 \def\mysum{0}
 \foreach \X [remember=\mysum as \mysum]in \LstNums
 {\pgfmathsetmacro{\mysum}{\mysum+\X}
 \xdef\pgfmathresult{\mysum}}
 \edef\mytotal{\pgfmathresult}
 \pgfmathtruncatemacro{\mydim}{dim(\LstNums)-1}
 \draw[thick,visible on=<\istart->] circle[radius=R*1cm]
 foreach \X in {0,10,...,350} {(\X:R) -- (\X:R+0.05)};
 \def\mysum{0}
 \foreach \X [remember=\mysum as \mysum] in {0,...,\mydim}
 {\pgfmathsetmacro{\mypercentage}{{\LstNums}[\X]/\mytotal}
  \pgfmathsetmacro{\mycolor}{{\LstColors}[\X]}
   \begin{scope}[on background layer]
   \draw[visible on=<\the\numexpr\istart+1+\X\relax->,fill=\mycolor]
    (0,0) -- (\mysum:R) arc(\mysum:\mysum+\mypercentage*360:R) --cycle;
  \end{scope}   
  \convertdirectly[cmy]{\mycolor}{\currhsb}
  \pgfmathsetmacro{\currc}{1-{\currhsb}[0]}
  \pgfmathsetmacro{\currm}{1-{\currhsb}[1]}
  \pgfmathsetmacro{\curry}{1-{\currhsb}[2]}
  \definecolor{tmp}{cmy}{\currc,\currm,\curry}
  \draw[visible on=<\the\numexpr\istart+1+\X\relax->,color=tmp,thick] 
   (\mysum:0.2*R) arc(\mysum:\mysum+\mypercentage*360:0.2*R)
   node[midway,circle,inner sep=1pt,anchor=180+\mysum+\mypercentage*180]
   {$\pgfmathparse{int(360*\mypercentage+0.5)}\pgfmathresult^\circ$};
  \pgfmathsetmacro{\mysum}{\mysum+{\LstNums}[\X]*360/\mytotal} 
 }
\end{tikzpicture}
\end{center}
\end{frame}
\end{document}

ingrese la descripción de la imagen aquí

Aquí utilicé el cmymodelo de color. Por supuesto, es muy posible que existan mejores asignaciones que x\mapsto 1-xpara x\in\{c,m,y\}. Sin embargo, el resultado es, en mi humilde opinión, bien legible.

información relacionada