Interpretazione di codice da TeX in practice

  • Creatore
    Topic
  • #101593
    Up
    0
    Down
    ::


    Carissimi arieccoci qua che tento di capire il fantastico mondo del TeX con palesi difficoltà.
    Chiedo allora a voi lumi su questo stralcio di codice esercizio preso da TeX in practice.Li ho acquistati tutti e 4 e debbo dire che sono una vera miniera.
    Vi riporto il codice della macro denominata \DoLoop.

    `\catcode`\@ = 11
    \newcount\@DoLoopNesting
    \@DoLoopNesting = 0
    \newcount\@DoLoopLimit
    \newcount\@DoLoopLimitTwo
    \newcount\@DoLoopLimitThree
    \def\DoLoop #1#2#3#4#5{%
    \global\advance\@DoLoopNesting by 1
    \ifnum\@DoLoopNesting > 3
    \errmessage{\string\DoLoop: nesting beyond three levels
    is not supported.}%
    \fi
    \ifnum #3 = 0
    \errmessage{\string\DoLoop: step value (parameter 3) is 0!}%
    \else
    \ifcase\@DoLoopNesting
    \or
    \@DoLoop{#1}{#2}{#3}{#4}{#5}%
    {\@DoLoopLimit}{\DoLoopBody}%
    \or
    \@DoLoop{#1}{#2}{#3}{#4}{#5}%
    {\@DoLoopLimitTwo}{\DoLoopBodyTwo}%
    \or
    \@DoLoop{#1}{#2}{#3}{#4}{#5}%
    {\@DoLoopLimitThree}{\DoLoopBodyThree}%
    \fi
    \fi
    \global\advance\@DoLoopNesting by -1
    }
    \def\@DoLoop #1#2#3#4#5#6#7{%
    \ifnum #3 > 0
    #6 = #4%
    \advance#6 by 1
    #1 = #2%
    \@DoLoopBodyPositive{#1}{#3}{#5}%
    {#6}{#7}%
    \else
    #6 = #4%
    \advance#6 by -1
    #1 = #2%
    \@DoLoopBodyNegative{#1}{#3}{#5}%
    {#6}{#7}%
    \fi
    \@DoLoopIterate{#7}%
    }
    \def\@DoLoopBodyPositive #1#2#3#4#5{%
    \def #5{%
    \ifnum #1 < #4\relax #3% \advance #1 by #2% }% } \def\@DoLoopBodyNegative #1#2#3#4#5{% \def #5{% \ifnum #1 > #4\relax
    #3%
    \advance #1 by #2%
    }%
    }
    \def\@DoLoopIterate #1{%
    #1\relax
    \def\@DoLoopNext{\@DoLoopIterate{#1}}%
    \else
    \def\@DoLoopNext{\relax}%
    \fi
    \@DoLoopNext
    }
    \catcode`\@ = 12`

    Non mi sono chiare due cose:

    1- l’else nella iterazione (a quale \if si riferisce l’\else nel \DoLoopIterate)?
    2 – il limite fissato del nesting.

    Rispetto al punto 2 – non riesco a capire cosa voglia significare questo “annidamento”.la macro viene usata addirittura con 6 loop quindi non parliamo del limite di cicli.
    A seguire il secondo stralcio di codice

    `\catcode`\@ = 11
    \newif\if@InRange
    \def\InRangeConditional #1#2#3{%
    TT\fi
    \@InRangetrue
    \ifnum #1<#2\relax \@InRangefalse \fi \ifnum #1>#3\relax
    \@InRangefalse
    \fi
    \if@InRange
    }

    \def\CheckRange #1#2#3#4{%
    \ifnum #1 < #2\relax \errmessage{Value \number#1 \space out of range #2..#3: #4}% \fi \ifnum #1>#3\relax
    \errmessage{Value \number#1 \space out of range #2..#3: #4}%
    \fi
    }
    \def\CheckZeroOneRange #1#2{%
    \CheckRange{#1}{0}{1}{#2}%
    }
    \catcode`\@ = 12`
    Di questo non riesco ad afferrare il motivo per il quale viene inserito alla fine della macro \InRangeConditional l’if \if@InRange.
    Non so come ringraziarvi per l’aiuto e mi scuso in anticipo se fosse poco chiaro il post.
    Grazie ancora
    Alessandro

Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #101594
      Up
      0
      Down
      ::


      Mi dispiace, ma proprio non ho voglia di mettermi a studiare il ciclo. Invece la domanda sul condizionale è più facile:`\if\InRangeConditional{}{}{}`
      dà come risultato, se eseguito (non solo espanso), un condizionale che sarà [tt]\iftrue[/tt] o [tt]\iffalse[/tt] a seconda del fatto che il primo numero sia oppure no nell’intervallo definito dagli altri due. Pensaci bene… 🙂

      Ciao.


      Gustavo

    • #101595
      Up
      0
      Down
      ::


      Ciao Gustavo e grazie per la delucidazione.
      Corretto tutto ma…perchè alla fine della def ho ancora la chiamata alla control sequence \if@Inrange?
      E’ come se rifacessi ancora il test alla fine della def..o sbaglio?
      Grazie ancora
      Alessandro

    • #101596
      Up
      0
      Down
      ::


      Signor gustavo,
      ci sono arrivato!
      Praticamente l’\if@In…alla fine della \def farà in modo che si segua uno dei rami “esterni” dell’\if “esterno” appunto…ossia quello prima dell’\InRangeConditional.Corretto?
      Speriamo di si 🙂
      Ed adesso cerco di capire il loop…che mi pare molto molto complesso 🙂
      Grazie ancora
      Ale.

    • #101597
      Up
      0
      Down
      ::

      IL_MAGO_GANDALF” post=101396Signor gustavo,

      No, per carità: non comiciamo con i «signor», proprio qui, poi… 🙂 «Gustavo» o «@letteracdp» vanno benissimo!

      IL_MAGO_GANDALF” post=101396ci sono arrivato!
      Praticamente l'[tt]\if@In…[/tt] alla fine della \def farà in modo che si segua uno dei rami “esterni” dell’\if “esterno” appunto…ossia quello prima dell’\InRangeConditional.Corretto?
      Speriamo di si 🙂

      No. 😉 L’[tt]\if[/tt] che precede [tt]\InRangeConditional[/tt] sparisce, perché viene chiuso da [tt]TT\fi[/tt]. Quello che succede è che un costrutto come
      `\if\InRangeConditional{1}{2}{3}
      Testo se in range.
      \else
      Testo se fuori range.
      \fi`
      diventa
      `\if@InRange
      Testo se in range.
      \else
      Testo se fuori range.
      \fi`
      solo che nel frattempo [tt]\if@InRange[/tt] è stato reso uguale o a [tt]\iftrue[/tt], o a [tt]\iffalse[/tt], a seconda del fatto che il primo numero sia o no nell’intervallo definito dagli altri due. Per esempio, nel nostro caso è stato eseguito il corpo del condizionale
      `\ifnum #1<#2\relax \@InRangefalse \fi ` perché [tt]#1[/tt] valeva uno e [tt]#2[/tt] valeva due; la macro [tt]\@InRangefalse[/tt] si espande in`\let \if@InRange \iffalse`che rende appunto [tt]\if@InRange[/tt] equivalente a [tt]\iffalse[/tt].

      IL_MAGO_GANDALF” post=101396Ed adesso cerco di capire il loop…che mi pare molto molto complesso 🙂
      […]

      Buono studio! 🙂

      Ciao.


      Gustavo

    • #101598
      Up
      0
      Down
      ::


      Grazie Gustavo!
      Ho anche studiato l’altra macro ed ho capito a cosa occorre l’\else and \fi a cui non riuscivo a dare una radice :-).
      Semplicemente a chiudere un \or del costrutto \ifcase.
      Tutto risolto.
      Grazie ancora!
      Alessandro

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

Go to top