Неполный \ifodd; весь текст после строки был проигнорирован

Неполный \ifodd; весь текст после строки был проигнорирован

У меня возникли большие проблемы с использованием \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 \x1pt

Редактировать:Вы также можете напрямую использовать \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.

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