5

This is a copy available from Till Tantau.

\documentclass{standalone}

\usepackage{tikz}
%\usetikzlibrary{trees,snakes}
\usepackage{verbatim}

\begin{document}
\pagestyle{empty}

\begin{comment}
:Title: A picture for Karl's students
:Slug: tutorial
:Tags: Manual

This example is from the tutorial: A picture for Karl's students.

| Author: Till Tantau
| Source: The PGF/TikZ manual


\end{comment}

\begin{tikzpicture}[scale=3,cap=round]
  % Local definitions
  \def\costhirty{0.8660256}

  % Colors
  \colorlet{anglecolor}{green!50!black}
  \colorlet{sincolor}{red}
  \colorlet{tancolor}{orange!80!black}
  \colorlet{coscolor}{blue}

  % Styles
  \tikzstyle{axes}=[]
  \tikzstyle{important line}=[very thick]
  \tikzstyle{information text}=[rounded corners,fill=red!10,inner sep=1ex]

  % The graphic
  \draw[style=help lines,step=0.5cm] (-1.4,-1.4) grid (1.4,1.4);

  \draw (0,0) circle (1cm);

  \begin{scope}[style=axes]
    \draw[->] (-1.5,0) -- (1.5,0) node[right] {$x$};
    \draw[->] (0,-1.5) -- (0,1.5) node[above] {$y$};

    \foreach \x/\xtext in {-1, -.5/-\frac{1}{2}, 1}
      \draw[xshift=\x cm] (0pt,1pt) -- (0pt,-1pt) node[below,fill=white]
            {$\xtext$};

    \foreach \y/\ytext in {-1, -.5/-\frac{1}{2}, .5/\frac{1}{2}, 1}
      \draw[yshift=\y cm] (1pt,0pt) -- (-1pt,0pt) node[left,fill=white]
            {$\ytext$};
  \end{scope}

  \filldraw[fill=green!20,draw=anglecolor] (0,0) -- (3mm,0pt) arc(0:30:3mm);
  \draw (15:2mm) node[anglecolor] {$\alpha$};

  \draw[style=important line,sincolor]
    (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} +(0,-.5);

  \draw[style=important line,coscolor]
    (0,0) -- node[below=2pt,fill=white] {$\cos \alpha$} (\costhirty,0);

  \draw[style=important line,tancolor] (1,0) --
    node [right=1pt,fill=white]
    {
      $\displaystyle \tan \alpha \color{black}=
      \frac{{\color{sincolor}\sin \alpha}}{\color{coscolor}\cos \alpha}$
    } (intersection of 0,0--30:1cm and 1,0--1,1) coordinate (t);

  \draw (0,0) -- (t);

  \draw[xshift=1.85cm] node [right,text width=6cm,style=information text]
    {
      The {\color{anglecolor} angle $\alpha$} is $30^\circ$ in the
      example ($\pi/6$ in radians). The {\color{sincolor}sine of
        $\alpha$}, which is the height of the red line, is
      \[
      {\color{sincolor} \sin \alpha} = 1/2.
      \]
      By the Theorem of Pythagoras we have ${\color{coscolor}\cos^2 \alpha} +
      {\color{sincolor}\sin^2\alpha} =1$. Thus the length of the blue
      line, which is the {\color{coscolor}cosine of $\alpha$}, must be
      \[
      {\color{coscolor}\cos\alpha} = \sqrt{1 - 1/4} = \textstyle
      \frac{1}{2} \sqrt 3.
      \]%
      This shows that {\color{tancolor}$\tan \alpha$}, which is the
      height of the orange line, is
      \[
      {\color{tancolor}\tan\alpha} = \frac{{\color{sincolor}\sin
          \alpha}}{\color{coscolor}\cos \alpha} = 1/\sqrt 3.
      \]%
    };
\end{tikzpicture}

\end{document}

In line 27, there is a cosine value of 30 degrees.

enter image description here

And in line 89, we have the same information, but in fractional form.

enter image description here

The question is as follows:

Is there any way I can attach the two information so that by changing any of these values I can change the other one automatically?

My intention is to ensure that these two information are compatible. I need to make sure these two lines have the same information.

There is no need for the line to be fractional. Can be numerical as in line 27. but I would like to change only one line and the other to change by itself.

enter image description here

LCarvalho
  • 1,611

2 Answers2

4

You can define a two-pronged macro whose expansion depends on a conditional which is set to true in nodes.

I also used xfp and \fpeval to avoid doing the computation myself.

\documentclass{standalone}

\usepackage{tikz}
%\usetikzlibrary{trees,snakes}
\usepackage{verbatim,xfp}

\newcommand{\definemathexpr}[3]{%
  % #1 is a macro name
  % #2 is the textual representation
  % #3 is the value
  \newcommand{#1}{\iftextual#2\else#3\fi}%
}
\newif\iftextual

\begin{document}
\pagestyle{empty}

\begin{comment}
:Title: A picture for Karl's students
:Slug: tutorial
:Tags: Manual

This example is from the tutorial: A picture for Karl's students.

| Author: Till Tantau
| Source: The PGF/TikZ manual


\end{comment}

\begin{tikzpicture}[scale=3,cap=round,every node/.code=\textualtrue]
  % Local definitions
  \definemathexpr\costhirty{\frac{1}{2}\sqrt{3}}{\fpeval{cosd(30)}}

  % Colors
  \colorlet{anglecolor}{green!50!black}
  \colorlet{sincolor}{red}
  \colorlet{tancolor}{orange!80!black}
  \colorlet{coscolor}{blue}

  % Styles
  \tikzstyle{axes}=[]
  \tikzstyle{important line}=[very thick]
  \tikzstyle{information text}=[rounded corners,fill=red!10,inner sep=1ex]

  % The graphic
  \draw[style=help lines,step=0.5cm] (-1.4,-1.4) grid (1.4,1.4);

  \draw (0,0) circle (1cm);

  \begin{scope}[style=axes]
    \draw[->] (-1.5,0) -- (1.5,0) node[right] {$x$};
    \draw[->] (0,-1.5) -- (0,1.5) node[above] {$y$};

    \foreach \x/\xtext in {-1, -.5/-\frac{1}{2}, 1}
      \draw[xshift=\x cm] (0pt,1pt) -- (0pt,-1pt) node[below,fill=white]
            {$\xtext$};

    \foreach \y/\ytext in {-1, -.5/-\frac{1}{2}, .5/\frac{1}{2}, 1}
      \draw[yshift=\y cm] (1pt,0pt) -- (-1pt,0pt) node[left,fill=white]
            {$\ytext$};
  \end{scope}

  \filldraw[fill=green!20,draw=anglecolor] (0,0) -- (3mm,0pt) arc(0:30:3mm);
  \draw (15:2mm) node[anglecolor] {$\alpha$};

  \draw[style=important line,sincolor]
    (30:1cm) -- node[left=1pt,fill=white] {$\sin \alpha$} +(0,-.5);

  \draw[style=important line,coscolor]
    (0,0) -- node[below=2pt,fill=white] {$\cos \alpha$} (\costhirty,0);

  \draw[style=important line,tancolor] (1,0) --
    node [right=1pt,fill=white]
    {
      $\displaystyle \tan \alpha \color{black}=
      \frac{{\color{sincolor}\sin \alpha}}{\color{coscolor}\cos \alpha}$
    } (intersection of 0,0--30:1cm and 1,0--1,1) coordinate (t);

  \draw (0,0) -- (t);

  \draw[xshift=1.85cm] node [right,text width=6cm,style=information text]
    {
      The {\color{anglecolor} angle $\alpha$} is $30^\circ$ in the
      example ($\pi/6$ in radians). The {\color{sincolor}sine of
        $\alpha$}, which is the height of the red line, is
      \[
      {\color{sincolor} \sin \alpha} = 1/2.
      \]
      By the Theorem of Pythagoras we have ${\color{coscolor}\cos^2 \alpha} +
      {\color{sincolor}\sin^2\alpha} =1$. Thus the length of the blue
      line, which is the {\color{coscolor}cosine of $\alpha$}, must be
      \[
      {\color{coscolor}\cos\alpha} = \sqrt{1 - 1/4} = \textstyle
      \costhirty.
      \]%
      This shows that {\color{tancolor}$\tan \alpha$}, which is the
      height of the orange line, is
      \[
      {\color{tancolor}\tan\alpha} = \frac{{\color{sincolor}\sin
          \alpha}}{\color{coscolor}\cos \alpha} = 1/\sqrt 3.
      \]%
    };
\end{tikzpicture}

\end{document}
egreg
  • 1,121,712
3

By defining some macros you can make the drawing depend on the value of a single macro. So if you change the \Angle in the code below, coordinates are calculated accordingly, lines drawn to where they're supposed to go, and the correct numbers are printed. This way you only get decimal numbers though.

\documentclass[border=5mm]{standalone}
\usepackage{xfp}
\usepackage{tikz}
\usetikzlibrary{intersections}
\usepackage{verbatim}

\begin{document}
\pagestyle{empty}

\begin{comment}
:Title: A picture for Karl's students
:Slug: tutorial
:Tags: Manual

This example is from the tutorial: A picture for Karl's students.

| Author: Till Tantau
| Source: The PGF/TikZ manual
\end{comment}

\begin{tikzpicture}[
   scale=3,
   cap=round,
   axes/.style={},
   important line/.style={very thick},
   information text/.style={rounded corners,fill=red!10,inner sep=1ex},
   /pgf/number format/precision=3
   ]

  % define angle
  \newcommand\Angle{30}
  % calculate sine, cosine and tangent
  \newcommand{\SINE}{\fpeval{sind(\Angle)}}
  \newcommand{\COS}{\fpeval{cosd(\Angle)}}
  \newcommand{\TAN}{\fpeval{\SINE/\COS}}
  % determine position for sin/cos/tan nodes
  \pgfmathsetmacro{\LeftRight}{ifthenelse(\COS<0,"left","right")}
  \pgfmathsetmacro{\RightLeft}{ifthenelse(\COS<0,"right","left")}
  \pgfmathsetmacro{\AboveBelow}{ifthenelse(\SINE<0,"above","below")}

  % Colors
  \colorlet{anglecolor}{green!50!black}
  \colorlet{sincolor}{red}
  \colorlet{tancolor}{orange!80!black}
  \colorlet{coscolor}{blue}

  % The graphic
  \draw[style=help lines,step=0.5cm] (-1.4,-1.4) grid (1.4,1.4);

  \draw (0,0) circle (1cm);

  \begin{scope}[style=axes]
    \draw[->] (-1.5,0) -- (1.5,0) node[right] {$x$};
    \draw[->] (0,-1.5) -- (0,1.5) node[above] {$y$};

    \foreach \x/\xtext in {-1, -.5/-\frac{1}{2}, 1}
      \draw[xshift=\x cm] (0pt,1pt) -- (0pt,-1pt) node[below,fill=white]
            {$\xtext$};

    \foreach \y/\ytext in {-1, -.5/-\frac{1}{2}, .5/\frac{1}{2}, 1}
      \draw[yshift=\y cm] (1pt,0pt) -- (-1pt,0pt) node[left,fill=white]
            {$\ytext$};
  \end{scope}

  % use \Angle instead of 30 in coordinates
  \filldraw[fill=green!20,draw=anglecolor] (0,0) -- (3mm,0pt) arc(0:\Angle:3mm);
  \draw (\Angle/2:2mm) node[anglecolor] {$\alpha$};

  \draw[style=important line,sincolor]
    (\Angle:1cm |- 0,0) -- node[\RightLeft,fill=white] {$\sin \alpha$} (\Angle:1cm);

  \draw[style=important line,coscolor]
    (0,0) -- node[\AboveBelow,fill=white] {$\cos \alpha$} (\COS,0);

  % sign returns the sign of the number (i.e. -1, 0 or 1)
  % note that when a coordinate contains (), as in sign(\COS),
  % you need to put braces around it like I've done here,
  % otherwise the parser will be confused by the )
  \draw[style=important line,tancolor] ({sign(\COS)},0) --
    node [\LeftRight,fill=white]
    {
      $\displaystyle \tan \alpha \color{black}=
      \frac{{\color{sincolor}\sin \alpha}}{\color{coscolor}\cos \alpha}$
    } ({sign(\COS)},{\TAN*sign(\COS)}) coordinate (t);

  \draw (0,0) -- (t);

  \draw[xshift=1.85cm] node [right,text width=6cm,style=information text]
    {
      The {\color{anglecolor} angle $\alpha$} is $\Angle^\circ$ in the
      example. The {\color{sincolor}sine of
        $\alpha$}, which is the height of the red line, is
      \[
      % use \pgfmathprintnumber to reduce the number of decimals
      {\color{sincolor} \sin \alpha} = \pgfmathprintnumber{\SINE}.
      \]
      By the Theorem of Pythagoras we have ${\color{coscolor}\cos^2 \alpha} +
      {\color{sincolor}\sin^2\alpha} =1$. Thus the length of the blue
      line, which is the {\color{coscolor}cosine of $\alpha$}, must be
      \[
      {\color{coscolor}\cos\alpha} = \sqrt{1 - \pgfmathprintnumber{\fpeval{(\SINE)^2}}} = \pgfmathprintnumber{\fpeval{abs(\COS)}}.
      \]%
      This shows that {\color{tancolor}$\tan \alpha$}, which is the
      height of the orange line, is
      \[
      {\color{tancolor}\tan\alpha} = \frac{{\color{sincolor}\sin
          \alpha}}{\color{coscolor}\cos \alpha} = \pgfmathprintnumber{\TAN}.
      \]%
    };
\end{tikzpicture}

\end{document}

With \newcommand\Angle{30}:

enter image description here

Torbjørn T.
  • 206,688