если в противном случае внутри TikZ: не работает

если в противном случае внутри TikZ: не работает

Я хотел бы получить это:

введите описание изображения здесь

Я попробовал использовать ifthenelseinside foreach, но получаю ошибку: Missing number, treated as zero. <to be read again> = l.9 }.Здесьesdd говорит: « \ifthenelseЭто «нормальный» код LaTeX. Поэтому вы не можете использовать эту команду внутри спецификации пути TikZ». Однако я не знаю, как исправить эту проблему. Вот мой код:

\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}

решение1

Вы, конечно, можете использовать \ifthenelse, но

  1. тест сравнивает только целые числа
  2. он использует один=
  3. когда TikZ доходит до 1.6, на самом деле он видит его как 1.59998

Используйте целые числа, тогда:

\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}

введите описание изображения здесь

решение2

Альтернативным подходом будет стандартная \ifnumконструкция, объединенная с \pgfmathparse. Обратите внимание, что поскольку 1.6 — это число с плавающей точкой, необходимо указать допуск. Простой вариант \pgfmathparse{\y == 1.6 ? int(1) : int(0)}не сработает.

Вот полное решение:

\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}

решение3

Обязательное xintexprрешение. На этот раз я избавлю вас от \xintFor, так как \foreachэто слишком почтеннно.

Я не знаю, как указать, \foreachчто сначала нужно развернуть его аргумент списка, поэтому мне приходится прибегать к приему из TikZруководства с \mylistопределением в первую очередь.

Представленный здесь метод предназначен для более сложных ситуаций, где операции с фиксированной точкой должны быть точными.

\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}

Связанный контент