
Eu gostaria de conseguir isso:
Tentei usar ifthenelse
inside foreach
mas recebo um erro: Missing number, treated as zero. <to be read again> = l.9 }
.Aquiesdd diz que " \ifthenelse
é um código LaTeX" normal ". Portanto, você não pode usar este comando dentro de uma especificação de caminho TikZ." No entanto, não sei como resolver esse problema. Aqui está o meu código:
\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}
Responder1
Você certamente pode usar \ifthenelse
, mas
- o teste compara apenas números inteiros
- ele usa um único
=
- quando o TikZ chega a 1,6, ele realmente o vê como 1,59998
Use números inteiros, então:
\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}
Responder2
Uma abordagem alternativa seria a \ifnum
construção padrão combinada com \pgfmathparse
. Observe que como 1.6 é flutuante, você deve fornecer uma tolerância. Um simples \pgfmathparse{\y == 1.6 ? int(1) : int(0)}
não funcionaria.
Aqui está a solução completa:
\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}
Responder3
A xintexpr
solução obrigatória. Desta vez poupo vocês do \xintFor
, pois \foreach
é muito venerável.
Não sei como \foreach
expandir primeiro o argumento da lista, por isso tenho que recorrer primeiro ao dispositivo do TikZ
manual com uma \mylist
definição.
O método aqui é para situações mais complicadas onde as operações de ponto fixo devem ser exatas.
\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}