\ifodd incompleto; todo o texto foi ignorado após a linha

\ifodd incompleto; todo o texto foi ignorado após a linha

Estou tendo muitos problemas ao usar o \ifodd. Quero fazer um padrão alternando linhas grossas e finas, já tentei de várias maneiras mas nenhuma delas funciona.

Com esta estrutura


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

eu tentei


\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" ]([
}

Nota: quero aprender como usar \ifodd dentro de loops

Responder1

Existem vários problemas com seu código. O primeiro é o uso da classe de documento "autônomo" com o nó posicionado relativamente ao canto da página atual (mas para o autônomo, a dimensão da página não é fixa). Isso resulta em um erro de "dimensão muito grande" (comente a linha que começa com \draw, e você obterá um documento muito grande: 12,13 cm de largura e575,84 centímetrosaltura!)

Então, primeiro, substituímosestar sozinhoporartigo.

Problema menor (sem bloqueio), as coordenadas "aux3" e "aux4" não são usadas, então apagamos.

O segundo problema é com a sintaxe da linha \draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([.

Primeiro, esqueça as aspas ", é uma sintaxe errada.

Em segundo lugar, se você tentar depois de remover o ", \ifodd \x line width=1pt \else line width=2pt \fiainda não funcionará.

Mas \ifodd \x red\else blue\fifunciona.

Na verdade, se você adicionar colchetes ao redorcódigo verdadeiroecódigo falso, pois \ifodd \x{line width=1pt}\else{line width=2pt}\fivocê obtém mensagens de erro comoNão conheço a chave '/tikz/line width=2pt' e vou ignorá-la.Então TikZ ver line width=1ptcomochave, não comochave=valor.

O problema parece relacionado ao personagem, =mas não encontrei uma explicação no TeXbook nem no TeX by Topic para "protegê-los", mas provavelmente não procurei a palavra boa para encontrar a explicação.

Uma solução é gerar "=" do teste condicional.

line width=\ifodd \x {1pt} \else 2pt\fifunciona.

Sem suporte por perto 1pt, você tem o erroErro matemático do pacote PGF: Função desconhecida `pt' (em 'pt').

Observação:Melhor do que usar brace around 1pt, podemos usar \spaceentre \ifodd \xe 1pt(graças ao Skillmon, nos comentários da pergunta).

Editar:Você também pode usar diretamente \ipara o teste e para a dimensão do deslocamento horizontal (para poder suprimir [evaluate =\i as \x using int(\i)]e substituir xshift=\x mm,no xshift=\i mm,comando \draw).

Código corrigido (também modifiquei as dimensões yshiftno comando desenhar, para que as linhas fiquem centralizadas verticalmente):

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

Saída (esquerda: todo o documento, direita: zoom):

insira a descrição da imagem aqui

Responder2

Você não pode ter condicionais envolvendo as opções.

Não sei por que você define \xdessa forma, como\i éum número inteiro.

É mais simples que isso: use \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}

insira a descrição da imagem aqui

Conforme observado por Qrrbrbirlbel nos comentários, você pode fazer de forma mais simples

      \draw[line width=isodd(\i) ? 1pt : 2pt]

omitindo a \pgfmathifhenelselinha.

Ou você pode usar expl3:

\ExplSyntaxOn
\NewExpandableDocumentCommand{\isoddTF}{mmm}
 {
  \int_if_odd:nTF { #1 } { #2 } { #3 }
 }
\ExplSyntaxOff

no preâmbulo e

     \draw[line width=\isoddTF{\i}{1pt}{2pt}]

no corpo do tikzpicture.

informação relacionada