ifthenelse in TikZ: funktioniert nicht

ifthenelse in TikZ: funktioniert nicht

Ich möchte mir folgendes zulegen:

Bildbeschreibung hier eingeben

Ich habe versucht, es ifthenelse„inside“ zu verwenden foreach, aber ich erhalte eine Fehlermeldung: Missing number, treated as zero. <to be read again> = l.9 }.Hieresdd sagt: „ \ifthenelseist „normaler“ LaTeX-Code. Daher können Sie diesen Befehl nicht innerhalb einer TikZ-Pfadspezifikation verwenden.“ Ich weiß jedoch nicht, wie ich das Problem beheben kann. Hier ist mein Code:

\documentclass[border=0.2cm]{standalone}
\usepackage{tikz}
\usepackage{ifthen}

\begin{document}
\begin{tikzpicture}
\foreach \y in {0,0.2,0.4,...,1.6}{
    \ifthenelse{\y==1.6}{\draw [thin,-latex] (-0.8,1.6) -- (-0.3,1.6) node [above,midway] {U};}{\draw [thin,-latex] (-0.8,\y) -- (-0.3,\y);}
}
\end{tikzpicture}
\end{document}

Antwort1

Sie können sicherlich verwenden \ifthenelse, aber

  1. Der Test vergleicht nur Integer
  2. Es wird ein einziges=
  3. wenn TikZ auf 1,6 kommt, sieht es es tatsächlich als 1,59998

Verwenden Sie ganze Zahlen und dann:

\documentclass[border=0.2cm]{standalone}
\usepackage{tikz}
\usepackage{ifthen}

\begin{document}
\begin{tikzpicture}
\foreach \y in {0,2,4,...,16}{
  \ifthenelse{\y = 16}
    {\draw [thin,-latex] (-0.8,1.6) -- (-0.3,1.6) node [above,midway] {U}}
    {\draw [thin,-latex] (-0.8,\y/10) -- (-0.3,\y/10)}
  ;
}
\end{tikzpicture}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

Ein alternativer Ansatz wäre die Standardkonstruktion \ifnumin Kombination mit \pgfmathparse. Beachten Sie, dass Sie eine Toleranz angeben müssen, da 1,6 ein Float ist. Eine einfache \pgfmathparse{\y == 1.6 ? int(1) : int(0)}würde nicht funktionieren.

Hier ist die komplette Lösung:

\documentclass[border=0.2cm]{standalone}
\usepackage{tikz}

\begin{document}
\begin{tikzpicture}
\foreach \y in {0,0.2,0.4,...,1.6}{
    \pgfmathparse{abs(\y - 1.6) < 0.001 ? int(1) : int(0)}
    \ifnum\pgfmathresult=1 
        \draw [thin,-latex] (-0.8,\y) -- (-0.3,\y) node [above,midway] {U};
    \else
        \draw [thin,-latex] (-0.8,\y) -- (-0.3,\y);
    \fi
}
\end{tikzpicture}
\end{document}

Antwort3

Die obligatorische xintexprLösung. Dieses Mal erspare ich euch das \xintFor, da \foreaches zu ehrwürdig ist.

Ich weiß nicht, wie ich sagen kann, \foreachdass zuerst das Listenargument erweitert werden soll, daher muss ich zunächst auf das Gerät TikZmit einer Definition aus dem Handbuch zurückgreifen \mylist.

Die hier beschriebene Methode ist für kompliziertere Situationen gedacht, in denen Festkommaoperationen exakt sein müssen.

\documentclass[border=0.2cm]{standalone}
\usepackage{tikz}
\usepackage{xintexpr}
\begin{document}
\begin{tikzpicture}
\edef\mylist{\xinttheiexpr [1] 0..[+0.2]..1.6\relax}% 
% (The [1] is to tell it to use fixed point notation 
% with one digit after decimal mark, and this expands to 
% 0, 0.2, 0.4, 0.6, 0.8, 1.0, 1.2, 1.4, 1.6 )
% 
\foreach \y in \mylist
{%
  \xintifboolexpr{\y = 1.6}
    {\draw [thin,-latex] (-0.8,1.6) -- (-0.3,1.6) node [above,midway] {U}}
    {\draw [thin,-latex] (-0.8,\y) -- (-0.3,\y)}
  ;
}
\end{tikzpicture}
\end{document}

verwandte Informationen