
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 \draw
y 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 \fi
todavía no funciona.
Pero \ifodd \x red\else blue\fi
obras.
De hecho, si agregas llaves alrededorcódigo verdaderoycódigo falso, ya que \ifodd \x{line width=1pt}\else{line width=2pt}\fi
obtienes mensajes de error comoNo conozco la clave '/tikz/line width=2pt' y la voy a ignorar.entonces tikZ ver line width=1pt
comollave, 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\fi
obras.
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 \space
Between \ifodd \x
y 1pt
(gracias a Skillmon, en los comentarios de la pregunta).
Editar:También puede usarlo directamente \i
para 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 \draw
comando).
Código corregido (también modifiqué las dimensiones yshift
en 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):
Respuesta2
No puede haber condicionales que incluyan las opciones.
No estoy seguro de por qué lo defines \x
de 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}
Como señaló Qrrbrbirlbel en los comentarios, puede hacer más simplemente
\draw[line width=isodd(\i) ? 1pt : 2pt]
omitiendo la \pgfmathifhenelse
lí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
.