[RISOLTO] problema con ifnum

  • Creatore
    Topic
  • #106205
    Up
    0
    Down
    ::


    Avevo già usato il comando \ifnum in un altro disegno, ma oggi mi sorge un problema allego il minimo compilabile e riporto poi l’errore

    `\documentclass[a4paper,11pt]{book}
    \usepackage{graphicx}
    \usepackage[utf8]{inputenc}
    \usepackage[T1]{fontenc}
    \usepackage{tikz}

    \usetikzlibrary{plotmarks,arrows.meta,calc,intersections,through,backgrounds,bending}
    \usetikzlibrary{positioning,patterns,decorations.markings}

    \begin{document}
    \begin{tikzpicture}[y=0.4cm]
    \coordinate (A) at (0,0);
    \coordinate (B) at (9,0);
    \coordinate (PS) at (2,4);
    \coordinate (PD) at (7,4);
    \coordinate (L) at (0.75,1.5);
    \coordinate (R) at (8.25,1.5);
    \draw[thin] (A)–(B);
    \draw[thick] (A)–(PS) (PD)–(B);
    \draw[name path= AL, help lines, color=gray] (PS) parabola bend (4.5,3) (PD);
    \draw[name path= BA, help lines, color=gray] (L) parabola bend (4.5,2.25) (R);
    \foreach \x in {2.5,3,…,6.5}{\path[name path=VE] (\x,0)–(\x,4.5);
    \path [name intersections={of=VE and BA, by=C}];
    \path [name intersections={of=VE and AL, by=D}];
    \ifnum\x=2.5
    \draw[thick] (L)–(C) (PS)–(D) (C)–(D);
    \coordinate (BM1) at (C);
    \coordinate (AM1) at (D);
    \fi
    \ifnum\x=6.5
    \draw[thick] (BM1)–(C)–(R) (AM1)–(D)–(PD) (C)–(D);
    \else
    \draw[thick] (BM1)–(C) (AM1)–(D) (C)–(D);
    \coordinate (BM1) at (C);
    \coordinate (AM1) at (D);
    \fi};
    \end{tikzpicture}

    \end{document}`

    E mi dice

    ABD: EveryShipout initializing macros
    ! Missing = inserted for \ifnum.

    .
    l.44 \fi}
    ;
    ?

Visualizzazione 5 filoni di risposte
  • Autore
    Risposte
    • #106206
      Up
      0
      Down
      ::

      schwarz89it” post=106292Avevo già usato il comando \ifnum in un altro disegno, ma oggi mi sorge un problema allego il minimo compilabile e riporto poi l’errore

      `\documentclass[a4paper,11pt]{book}
      \usepackage{graphicx}
      \usepackage[utf8]{inputenc}
      \usepackage[T1]{fontenc}
      \usepackage{tikz}

      \usetikzlibrary{plotmarks,arrows.meta,calc,intersections,through,backgrounds,bending}
      \usetikzlibrary{positioning,patterns,decorations.markings}

      \begin{document}
      \begin{tikzpicture}[y=0.4cm]
      \coordinate (A) at (0,0);
      \coordinate (B) at (9,0);
      \coordinate (PS) at (2,4);
      \coordinate (PD) at (7,4);
      \coordinate (L) at (0.75,1.5);
      \coordinate (R) at (8.25,1.5);
      \draw[thin] (A)–(B);
      \draw[thick] (A)–(PS) (PD)–(B);
      \draw[name path= AL, help lines, color=gray] (PS) parabola bend (4.5,3) (PD);
      \draw[name path= BA, help lines, color=gray] (L) parabola bend (4.5,2.25) (R);
      \foreach \x in {2.5,3,…,6.5}{\path[name path=VE] (\x,0)–(\x,4.5);
      \path [name intersections={of=VE and BA, by=C}];
      \path [name intersections={of=VE and AL, by=D}];
      \ifnum\x=2.5
      \draw[thick] (L)–(C) (PS)–(D) (C)–(D);
      \coordinate (BM1) at (C);
      \coordinate (AM1) at (D);
      \fi
      \ifnum\x=6.5
      \draw[thick] (BM1)–(C)–(R) (AM1)–(D)–(PD) (C)–(D);
      \else
      \draw[thick] (BM1)–(C) (AM1)–(D) (C)–(D);
      \coordinate (BM1) at (C);
      \coordinate (AM1) at (D);
      \fi};
      \end{tikzpicture}

      \end{document}`

      E mi dice

      ABD: EveryShipout initializing macros
      ! Missing = inserted for \ifnum.

      .
      l.44 \fi}
      ;
      ?

      Il problema è che [tt]\ifnum[/tt] può essere usato per confronti con numeri interi, numeri di pagina per esempio. In questo caso invece puoi usare la funzione pgfmathequal e poi verificare se il risultato è vero o falso:`\foreach \x in {2.5,3,…,6.5}{\path[name path=VE] (\x,0)–(\x,4.5);
      \path [name intersections={of=VE and BA, by=C}];
      \path [name intersections={of=VE and AL, by=D}];
      \pgfmathequal{\x}{2.5}
      \if\pgfmathresult=1
      \draw[thick] (L)–(C) (PS)–(D) (C)–(D);
      \coordinate (BM1) at (C);
      \coordinate (AM1) at (D);
      \fi
      \pgfmathequal{\x}{6.5}
      \if\pgfmathresult=1
      \draw[thick] (BM1)–(C)–(R) (AM1)–(D)–(PD) (C)–(D);
      \else
      \draw[thick] (BM1)–(C) (AM1)–(D) (C)–(D);
      \coordinate (BM1) at (C);
      \coordinate (AM1) at (D);
      \fi
      };` Il codice non funziona perché BM1 e AM1 non sono mai stati definiti prima 😉 Infatti, se li definisci quando testi se \x vale 2.5, poi non sono definiti quando \x vale 6.5. Ti conviene spostare `\coordinate (BM1) at (C);
      \coordinate (AM1) at (D);` fuori dal ciclo.

      Ciao
      Claudio

    • #106207
      Up
      0
      Down
      ::


      Ti ringrazio per la dritta, non ricordavo più il problema dei numeri interi.
      Per quanto riguarda i punti BM1 e AM1 dovrò pensare a qualche altra soluzione, perché mi servono e pensavo che rimanessero in memoria una volta definiti anche uscendo dal ciclo. ora provo a modificare il ciclo in modo da lasciarli.
      Sfrutterò la libreria calc e aumenterò un po’ i calcoli.

    • #106208
      Up
      0
      Down
      ::

      schwarz89it” post=106294Ti ringrazio per la dritta, non ricordavo più il problema dei numeri interi.
      Per quanto riguarda i punti BM1 e AM1 dovrò pensare a qualche altra soluzione, perché mi servono e pensavo che rimanessero in memoria una volta definiti anche uscendo dal ciclo. ora provo a modificare il ciclo in modo da lasciarli.

      Abbi pazienza, ho scritto di fretta: fuori dal condizionale, non dal ciclo: `
      \foreach \x in {2.5,3,…,6.5}{\path[name path=VE] (\x,0)–(\x,4.5);
      \path [name intersections={of=VE and BA, by=C}];
      \path [name intersections={of=VE and AL, by=D}];
      % nuovo posto per le coordinate
      \coordinate (BM1) at (C);
      \coordinate (AM1) at (D);
      \pgfmathequal{\x}{2.5}
      \if\pgfmathresult=1
      \draw[thick] (L)–(C) (PS)–(D) (C)–(D);
      \fi
      \pgfmathequal{\x}{6.5}
      \if\pgfmathresult=1
      \draw[thick] (BM1)–(C)–(R) (AM1)–(D)–(PD) (C)–(D);
      \else
      \draw[thick] (BM1)–(C) (AM1)–(D) (C)–(D);
      \coordinate (BM1) at (C);
      \coordinate (AM1) at (D);
      \fi
      ` Ciao
      Claudio

    • #106209
      Up
      0
      Down
      ::


      Tranquillo grazie per la modifica, è sicuramente più efficiente di quello che avevo in mente io.

    • #106210
      Up
      0
      Down
      ::


      Ho fatto delle prove e in realtà comunque si deve usare ifnum
      questo è il risultato finale
      `\begin{tikzpicture}[y=0.4cm]
      \coordinate (A) at (0,0);
      \coordinate (B) at (9,0);
      \coordinate (PS) at (2,4);
      \coordinate (PD) at (7,4);
      \coordinate (L) at (0.75,1.5);
      \coordinate (R) at (8.25,1.5);
      \draw[thin] (A)–(B);
      \draw[thick] (A)–(PS) (PD)–(B);
      \path[name path= AL, help lines, color=gray] (PS) parabola bend (4.5,3) (PD);
      \path[name path= BA, help lines, color=gray] (L) parabola bend (4.5,2.25) (R);
      \foreach \x in {2.5,3,…,6.5}{\path[name path=VE] (\x,0)–(\x,4.5);
      \path[name path=VEM]($(\x,0)+(-0.5,0)$)–($(\x,4.5)+(-0.5,0)$);
      \path [name intersections={of=VE and BA, by=C}];
      \path [name intersections={of=VE and AL, by=D}];
      \path [name intersections={of=VEM and BA, by=BM1}];
      \path [name intersections={of=VEM and AL, by=AM1}];
      \pgfmathequal{\x}{2.5}
      \ifnum\pgfmathresult=1
      \draw[thick] (A)–(BM1)–(C) (PS)–(D) (C)–(D);
      \fi
      \pgfmathequal{\x}{6.5}
      \ifnum\pgfmathresult=1
      \path[name path=U] ($(\x,0)+(0.5,0)$)–($(\x,4.5)+(0.5,0)$);
      \path[name intersections={of=U and BA, by=UL}];
      \draw[thick] (BM1)–(C)–(UL)–(B) (AM1)–(D)–(PD) (C)–(D);
      \else
      \draw[thick] (C)–(D) (BM1)–(C) (AM1)–(D);
      \fi
      };
      \end{tikzpicture}`

    • #106211
      Up
      0
      Down
      ::

      schwarz89it” post=106299Ho fatto delle prove e in realtà comunque si deve usare ifnum

      Ottimo che hai risolto. Si, come dicevo in un messaggio precedente, devi usare [tt]\ifnum[tt], ma non puoi fare confronti con numeri decimali.

      Ciao
      Claudio

Visualizzazione 5 filoni di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top