
У меня возникли большие проблемы с использованием \ifodd
. Я хочу сделать узор из чередующихся толстых и тонких линий, я пробовал несколько способов, но ни один из них не работает.
С этой структурой
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\begin{document}
\begin{tikzpicture}[remember picture,overlay,shorten >= -10pt]
\coordinate (aux1) at ([xshift=-25mm, yshift=-30mm]current page.north east);
\coordinate (aux2) at ([xshift=-25mm, yshift=30mm]current page.south east);
\coordinate (aux3) at ([xshift=25mm, yshift=-30mm]current page.north west);
\coordinate (aux4) at ([xshift=25mm, yshift=30mm]current page.south west);
\begin{scope}[black]
\foreach \i [evaluate =\i as \x using int(\i)] in {0, ..., 4}{
\draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([
xshift=\x mm,
yshift=-65mm
]aux1)
--
([
xshift=\x mm,
yshift=10mm]
aux2);
}
\end{scope}
\end{tikzpicture}
\end{document}
я пытался
\foreach \x in {0, ..., 4}{
\draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([
}
\foreach \x in {0, ..., 4}{
\draw["\ifodd \num{\x} line width=1pt \else line width=2pt \fi" ]([
}
\foreach \x in {0, ..., 4}{
\draw["\ifodd \value{\x} line width=1pt \else line width=2pt \fi" ]([
}
\foreach \i [evaluate =\i as \x using int(\i)] in {0, ..., 4}{
\draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([
}
Примечание: Я хочу узнать, как использовать \ifodd внутри циклов.
решение1
В вашем коде есть несколько проблем. Первая — использование класса документа «standalone» с узлом, расположенным относительно угла текущей страницы (но для standalone размер страницы не фиксирован). Это приводит к ошибке «dimension too large» (закомментируйте строку, начинающуюся с\draw
и вы получите очень большой документ: ширина 12,13 см и575,84 смвысота!)
Итак, сначала мы заменимавтономныйкстатья.
Небольшая проблема (неблокируемая), координаты «aux3» и «aux4» не используются, поэтому мы их стираем.
Вторая проблема связана с синтаксисом строки \draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([
.
Во-первых, забудьте про кавычки "
, это неправильный синтаксис.
Во-вторых, если вы попробуете после удаления "
, \ifodd \x line width=1pt \else line width=2pt \fi
все равно не получится.
Но \ifodd \x red\else blue\fi
работает.
На самом деле, если вы добавите скобки вокругнастоящий кодиложный код, так как \ifodd \x{line width=1pt}\else{line width=2pt}\fi
вы получаете сообщения об ошибках, такие какЯ не знаю ключа '/tikz/line width=2pt' и собираюсь его проигнорировать.Так ТикZ см line width=1pt
. какключ, не какключ"="ценить.
Проблема, похоже, связана с персонажем =
, но я не нашел объяснения ни в TeXbook, ни в TeX по теме для «защиты» их, но, вероятно, я не искал подходящего слова, чтобы найти объяснение.
Решением является вывод «=» из условной проверки.
line width=\ifodd \x {1pt} \else 2pt\fi
работает.
Без скобок 1pt
у вас будет ошибкаОшибка вычисления пакета PGF: неизвестная функция `pt' (в `pt').
Примечание:Лучше использовать скобки « между» и «и» 1pt
, чем «вокруг» (спасибо Skillmon в комментариях к вопросу).\space
\ifodd \x
1pt
Редактировать:Вы также можете напрямую использовать \i
для теста и для измерения горизонтального сдвига (чтобы можно было подавить [evaluate =\i as \x using int(\i)]
и заменить xshift=\x mm,
на xshift=\i mm,
в \draw
команде).
Исправленный код (я также изменил размеры yshift
в команде рисования, чтобы линии были вертикально отцентрированы):
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\begin{document}
\begin{tikzpicture}[remember picture,overlay]
\coordinate (aux1) at ([xshift=-25mm, yshift=-30mm]current page.north east);
\coordinate (aux2) at ([xshift=-25mm, yshift=30mm]current page.south east);
\begin{scope}[black]
\foreach \i in {0, ..., 4}{
\draw[line width=\ifodd \i\space 1pt\else 2pt\fi]([
xshift=\i mm,
yshift=0mm
]aux1)
--
([
xshift=\i mm,
yshift=0mm]
aux2);
}
\end{scope}
\end{tikzpicture}
\end{document}
Вывод (слева: весь документ, справа: его увеличенное изображение):
решение2
Условные операторы не могут включать в себя опции.
Я не уверен, почему вы \x
так определяете, как\i
являетсяцелое число.
Все гораздо проще: используйте \pgfmathifthenelse
.
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning,calc}
\begin{document}
\begin{tikzpicture}[
% remember picture,
% overlay,
shorten >= -10pt
]
\coordinate (aux1) at ([xshift=-25mm, yshift=-30mm]current page.north east);
\coordinate (aux2) at ([xshift=-25mm, yshift=30mm]current page.south east);
\coordinate (aux3) at ([xshift=25mm, yshift=-30mm]current page.north west);
\coordinate (aux4) at ([xshift=25mm, yshift=30mm]current page.south west);
\begin{scope}[black]
\foreach \i in {0, ..., 4}{
\pgfmathifthenelse{isodd(\i)}{1}{2}
\draw[line width=\pgfmathresult pt]
([xshift=\i mm,yshift=-65mm]aux1)
--
([xshift=\i mm,yshift=10mm]aux2);
}
\end{scope}
\end{tikzpicture}
\end{document}
Как отметил Qrrbrbirlbel в комментариях, можно сделать проще
\draw[line width=isodd(\i) ? 1pt : 2pt]
пропуская \pgfmathifhenelse
строку.
Или вы можете использовать expl3
:
\ExplSyntaxOn
\NewExpandableDocumentCommand{\isoddTF}{mmm}
{
\int_if_odd:nTF { #1 } { #2 } { #3 }
}
\ExplSyntaxOff
в преамбуле и
\draw[line width=\isoddTF{\i}{1pt}{2pt}]
в теле tikzpicture
.