Incompleto \ifodd; todo el texto fue ignorado después de la línea

Incompleto \ifodd; todo el texto fue ignorado después de la línea

Tengo muchos problemas al usar \ifodd. Quiero hacer un patrón de líneas finas y gruesas alternadas, he probado varias formas pero ninguna funciona.

Con esta estructura


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

Yo he tratado


\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: quiero aprender a usar \ifodd bucles internos

Respuesta1

Hay varios problemas con su código. El primero es el uso de una clase de documento "independiente" con un nodo ubicado relativamente a la esquina de la página actual (pero para el modo independiente, la dimensión de la página no es fija). Esto da como resultado un error de "dimensión demasiado grande" (comente la línea que comienza con \drawy obtendrá un documento muy grande: 12,13 cm de ancho y575,84 centímetros¡altura!)

Así que primero reemplazamosser únicoporartículo.

Problema menor (sin bloqueo), las coordenadas "aux3" y "aux4" no se utilizan, así que lo borramos.

El segundo problema está en la sintaxis de la línea \draw["\ifodd \x line width=1pt \else line width=2pt \fi" ]([.

Primero, olvide las comillas ", es una sintaxis incorrecta.

En segundo lugar, si lo intentas después de eliminar el archivo ", \ifodd \x line width=1pt \else line width=2pt \fitodavía no funciona.

Pero \ifodd \x red\else blue\fiobras.

De hecho, si agregas llaves alrededorcódigo verdaderoycódigo falso, ya que \ifodd \x{line width=1pt}\else{line width=2pt}\fiobtienes mensajes de error comoNo conozco la clave '/tikz/line width=2pt' y la voy a ignorar.entonces tikZ ver line width=1ptcomollave, no comollave=valor.

El problema parece estar relacionado con el personaje =, pero no encuentro una explicación en el TeXbook ni en TeX by Topic para "protegerlos", pero probablemente no he buscado la palabra buena para encontrar la explicación.

Una solución es generar "=" de la prueba condicional.

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

Sin llave alrededor 1pt, tienes el error.Error matemático del paquete PGF: función desconocida `pt' (en 'pt').

Nota:Mejor que usar brace around 1pt, podemos usar \spaceBetween \ifodd \xy 1pt(gracias a Skillmon, en los comentarios de la pregunta).

Editar:También puede usarlo directamente \ipara la prueba y para la dimensión del desplazamiento horizontal (para que pueda suprimir [evaluate =\i as \x using int(\i)]y reemplazar xshift=\x mm,en xshift=\i mm,el \drawcomando).

Código corregido (también modifiqué las dimensiones yshiften el comando de dibujo, por lo que las líneas están centradas 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}

Salida (izquierda: el documento completo, derecha: un zoom):

ingrese la descripción de la imagen aquí

Respuesta2

No puede haber condicionales que incluyan las opciones.

No estoy seguro de por qué lo defines \xde esa manera, como\i esun número entero.

Es más simple que eso: 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}

ingrese la descripción de la imagen aquí

Como señaló Qrrbrbirlbel en los comentarios, puede hacer más simplemente

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

omitiendo la \pgfmathifhenelselínea.

O puedes usar expl3:

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

en el preámbulo y

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

en el cuerpo del tikzpicture.

información relacionada