을 사용하여 삼각값 테이블을 만들고 싶었습니다 pgfmath
. 다만 정밀도가 좀 떨어져요. 내부적으로 이를 개선할 수 있는 방법이 있나요 TikZ
?
이것은 제가 방금 게시한 비슷한 질문과 관련이 있습니다.Expl3을 사용하여 반올림된 숫자 끝에 0을 채울 수 있는 방법이 있습니까?
현재 작업 예는 다음과 같습니다.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc,fixedpointarithmetic}
\def\mynum{0}
\def\myvoffset{0pt}
\usepackage[margin=0.5in]{geometry}
\begin{document}
Using \texttt{TikZ}
\begin{tikzpicture}[/pgf/number format/.cd,fixed,precision=4,verbatim]
\coordinate(UL) at (0,0);
\node at (UL) {Degrees};
\node[anchor=west] at ($(UL.west)+(1cm,0)$) {$\sin$};
\node[anchor=west] at ($(UL.west)+(2.75cm,0)$) {$\cos$};
\node[anchor=west] at ($(UL.west)+(4.50cm,0)$) {$\tan$};
\foreach \myn in {1,2,3,...,45}
{
\pgfmathparse{int(mod(\myn-1,5))}
\ifnum\pgfmathresult=0\relax
\xdef\myvoffset{\dimexpr\myvoffset+1.350\baselineskip}%%
\else
\xdef\myvoffset{\dimexpr\myvoffset+1.00\baselineskip}%%
\fi
\coordinate (DEG/\myn) at ($(UL.west)-(0,\myvoffset)$);
\coordinate (DEG/S/\myn) at ($(DEG/\myn)+(1cm,0)$);
\coordinate (DEG/C/\myn) at ($(DEG/S/\myn)+(1.75cm,0)$);
\coordinate (DEG/T/\myn) at ($(DEG/C/\myn)+(1.75cm,0)$);
\node[anchor=east] at (DEG/\myn) {$\myn^\circ$};
\pgfmathparse{sin(\myn)} \node[anchor=west] at (DEG/S/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
\pgfmathparse{cos(\myn)} \node[anchor=west] at (DEG/C/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
\pgfmathparse{tan(\myn)} \node[anchor=west] at (DEG/T/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
}
\end{tikzpicture}
\end{document}
답변1
나는 모른다 pgfmath
; 다음 과 expl3
같이 테이블을 컴파일할 수 있습니다.
\documentclass{article}
\usepackage[margin=1cm]{geometry}
\usepackage{array,siunitx}
\sisetup{
add-decimal-zero,
round-precision=5,
round-mode=places,
round-integer-to-decimal,
group-digits=false,
detect-all,
}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand{\trigtable}{ }
{
\__aellett_do_trig:
\begin{tabular}{r *{3}{ >{\ttfamily}r }}
& \multicolumn{1}{c}{$\sin$}
& \multicolumn{1}{c}{$\cos$}
& \multicolumn{1}{c}{$\tan$}
\\
\tl_use:N \l__aellett_body_tl
\end{tabular}
}
\tl_new:N \l__aellett_body_tl
\cs_new:Npn \aellett_compute:nn #1 #2
{
\num { \fp_to_decimal:n { \fp_eval:n { round ( #1(#2) , 5 ) } } }
}
\cs_new_protected:Npn \__aellett_do_trig:
{
\tl_clear:N \l__aellett_body_tl
\int_step_inline:nnnn { 1 } { 1 } { 89 }
{
\tl_put_right:Nn \l__aellett_body_tl { $##1^\circ$ & }
\tl_put_right:Nx \l__aellett_body_tl
{
\aellett_compute:nn { sind } { ##1 } &
\aellett_compute:nn { cosd } { ##1 } &
\aellett_compute:nn { tand } { ##1 }
}
\int_compare:nTF { \int_mod:nn { ##1 } { 5 } == 0 }
{
\tl_put_right:Nn \l__aellett_body_tl { \\[1ex] }
}
{
\tl_put_right:Nn \l__aellett_body_tl { \\ }
}
}
% 90 degrees
\tl_put_right:Nx \l__aellett_body_tl
{
$90^\circ$ &
\aellett_compute:nn { sind } { 90 } &
\aellett_compute:nn { cosd } { 90 } &
---
}
}
\ExplSyntaxOff
\begin{document}
\tiny
\trigtable
\end{document}
시작은 다음과 같습니다.
그리고 89도에서 무슨 일이 일어나는지 보여주기 위해 끝이 있습니다.
bc
89도 탄젠트에 대한 값 반환과 비교하기 위해 5자리 숫자를 사용했습니다 .
57.28996163075942465214
답변2
로 옵션을 확장하세요 fixed zerofill
.
\documentclass{article}
\pagestyle{empty}
\usepackage{tikz}
\usetikzlibrary{calc,fixedpointarithmetic}
\def\mynum{0}
\def\myvoffset{0pt}
\usepackage[margin=0.5in]{geometry}
\begin{document}
%Using \texttt{TikZ}
\begin{tikzpicture}[/pgf/number format/.cd,fixed,precision=4,verbatim, fixed zerofill]
\coordinate(UL) at (0,0);
\node at (UL) {Degrees};
\node[anchor=west] at ($(UL.west)+(1cm,0)$) {$\sin$};
\node[anchor=west] at ($(UL.west)+(2.75cm,0)$) {$\cos$};
\node[anchor=west] at ($(UL.west)+(4.50cm,0)$) {$\tan$};
\foreach \myn in {1,2,3,...,45}
{
\pgfmathparse{int(mod(\myn-1,5))}
\ifnum\pgfmathresult=0\relax
\xdef\myvoffset{\dimexpr\myvoffset+1.350\baselineskip}%%
\else
\xdef\myvoffset{\dimexpr\myvoffset+1.00\baselineskip}%%
\fi
\coordinate (DEG/\myn) at ($(UL.west)-(0,\myvoffset)$);
\coordinate (DEG/S/\myn) at ($(DEG/\myn)+(1cm,0)$);
\coordinate (DEG/C/\myn) at ($(DEG/S/\myn)+(1.75cm,0)$);
\coordinate (DEG/T/\myn) at ($(DEG/C/\myn)+(1.75cm,0)$);
\node[anchor=east] at (DEG/\myn) {$\myn^\circ$};
\pgfmathparse{sin(\myn)} \node[anchor=west] at (DEG/S/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
\pgfmathparse{cos(\myn)} \node[anchor=west] at (DEG/C/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
\pgfmathparse{tan(\myn)} \node[anchor=west] at (DEG/T/\myn) {\texttt{\pgfmathprintnumber{\pgfmathresult}}};
}
\end{tikzpicture}
\end{document}
답변3
표준 TeX 연산을 사용하면 정밀도가 매우 제한됩니다. 보다 정확한 결과가 필요한 경우 외부 프로그램이나 luatex와 같은 TeX 확장을 사용해야 할 수도 있습니다.
내 패키지 사용계산자Tikz에서 얻은 결과와 비슷한 결과를 얻었습니다.
\documentclass{article}
\usepackage{calculator}
\usepackage{ifthen}
\begin{document}
\newcounter{angle}
\newcommand{\trigfunctions}[1]{%
#1^{\mathrm{o}} &
\DEGREESSIN{#1}{\sine}
\ROUND[4]{\sine}{\sine}
\sine &
\DEGREESCOS{#1}{\cosine}
\ROUND[4]{\cosine}{\cosine}
\cosine &
\DEGREESTAN{#1}{\tangent}
\ROUND[4]{\tangent}{\tangent}
\tangent&
\DEGREESCOT{#1}{\cotangent}
\ROUND[4]{\cotangent}{\cotangent}
\cotangent \\}
\small
\[
\begin{array}{*{5}{r}}
\multicolumn{1}{c}{\alpha} & \multicolumn{1}{c}{\sin\alpha} &
\multicolumn{1}{c}{\cos \alpha} &
\multicolumn{1}{c}{\tan\alpha} &
\multicolumn{1}{c}{\cot\alpha} \\
\whiledo{\value{angle}<45}{\stepcounter{angle}\trigfunctions{\theangle}}
\end{array}
\]
\end{document}