
다음 예를 고려하십시오.
\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가 잘 읽을 수 있습니다.