PSTricks의 라벨이 겹치는 경우

PSTricks의 라벨이 겹치는 경우

다음 예를 고려하십시오.

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

스크린샷

질문

볼 수 있듯이 28°라벨은 녹색 쐐기의 "상단"에 인쇄되어 있지 않습니다. (물론 다른 브랜드도 마찬가지입니다.)

라벨이 항상 "위"에 인쇄되도록 하려면 어떻게 해야 합니까?

답변1

일부 매개변수만 수정하면 다음과 같습니다.

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

여기에 이미지 설명을 입력하세요

추가됨\uput: 의 정의에서 (2 대신) 의 첫 번째 인수로 값 5.3을 사용하면 \andelB큰 원 외부에 레이블이 표시됩니다. (이 경우 \textcolor{white}검은색 섹터를 제거하는 것을 잊지 마세요):

여기에 이미지 설명을 입력하세요

답변2

필수 인수는 \uput{<distance>}배치할 콘텐츠를 배치할 문제의 지점으로부터의 거리를 정의합니다. 매크로 8pt에서 사용하고 있습니다 \andelB... 이것을 다음과 같이 더 큰 것으로 늘립니다 25pt.

여기에 이미지 설명을 입력하세요

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

답변3

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

여기에 이미지 설명을 입력하세요

그러나 \psChart모든 계산을 매크로로 수행하도록 속일 수 있습니다.

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

여기에 이미지 설명을 입력하세요

답변4

그냥 재미로: Ti케이Z 대안. 숫자와 색상 목록만 지정하면 됩니다.

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

코드가 나머지 작업을 수행합니다. 레이블 색상은 RGB 색상 모델을 기반으로 채우기 색상을 보완하도록 선택됩니다. (다른 색상 모델이 더 좋아 보이거나 다르게 보일 수도 있습니다.) 이렇게 하면 라벨과 내부 호가 표시됩니다. 애니메이션은 \def\istart{4}코드에서와 같이 슬라이드 4( )에서 시작됩니다.

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

여기에 이미지 설명을 입력하세요

레이블을 중앙에 더 가깝게 이동하면 쐐기가 레이어에 그려지기 때문에 쐐기에 의해 레이블이 겹쳐 칠해지지 않습니다 background.

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

여기에 이미지 설명을 입력하세요

여기서는 색상 모델을 사용했습니다 cmy. 물론, x\mapsto 1-x에 대한 것 보다 더 나은 매핑이 있을 가능성이 높습니다 x\in\{c,m,y\}. 그러나 그 결과는 IMHO가 잘 읽을 수 있습니다.

관련 정보