Operatori unari alla C++ sui contatori TeX

  • Creatore
    Topic
  • #42950
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Volendo scrivere un comando che incrementi un contatore TeX con la sintassi C++ (o Java), basta scrivere il seguente codice:`\documentclass{minimal}
      \newcount\mycnt

      \def\op#1++{%
      \expandafter\advance\csname #1\endcsname by 1}

      \begin{document}
      \op mycnt++
      \op mycnt++
      \op mycnt++

      \the\mycnt
      \end{document}`

      Come vedete il comando \op è un comando delimitato con il doppio ++ ed il suo nome sta per operator.
      Il comando \op tuttavia accetta solo l’incremento, ma è possibile modificarlo:
      Occorre che l’operatore di incremento o decremento sia reso variabile (++ oppure –).
      Per non vincolare il numero dei caratteri del nome del contatore, un alternativa è quella di utilizzare un ulteriore delimitatore fisso: per esempio l’uguale:

      \op mycnt=++
      \op mycnt=–

      Ecco il codice:
      `\documentclass{minimal}

      \newcount\mycnt

      \def\pluschar{+}
      \def\minuschar{-}
      \def\op#1=#2#3{%
      \def\tmp{#2}\def\tmpii{#3}
      \ifx\tmp\tmpii
      \ifx\tmp\pluschar
      \expandafter\advance\csname #1\endcsname by 1
      \else
      \ifx\tmp\minuschar
      \expandafter\advance\csname #1\endcsname by -1
      \else
      ERRORE: operatore non riconosciuto.
      \fi
      \fi
      \else
      ERRORE: simboli non uguali.
      \fi}

      \begin{document}
      \op mycnt=++
      \op mycnt=++
      \op mycnt=++
      \the\mycnt

      \op mycnt=–
      \op mycnt=–
      \the\mycnt
      \end{document}`

      L’ideale sarebbe una sintassi di questo tipo:
      `\newcount\xmycnt
      \mycnt++
      \mycnt–`

      ovvero operare con comandi che sembrano nomi di contatori utilizzandone uno vero con un prefisso dietro le quinte:`\documentclass{minimal}

      \def\pluschar{+}
      \def\minuschar{-}
      \def\newMagicCounter#1{%
      \expandafter\newcount\csname x#1\endcsname
      \expandafter\def\csname #1\endcsname##1##2{%
      \def\tmp{##1}\def\tmpi{##2}
      \ifx\tmp\tmpi
      \ifx\tmp\pluschar
      \expandafter\advance\csname x#1\endcsname by 1
      \else
      \ifx\tmp\minuschar
      \expandafter\advance\csname x#1\endcsname by -1
      \else
      errore: operatore non riconosciuto
      \fi
      \fi
      \else
      errore: operatore disaccoppiato
      \fi
      }
      }

      \begin{document}
      \newMagicCounter{mycnt}

      \mycnt++
      \mycnt++
      \mycnt++
      \mycnt++
      \the\xmycnt

      \mycnt–
      \mycnt–
      \the\xmycnt
      \end{document}`

      Vorrei chiedervi adesso due cose:
      1 – trovate che la cosa sia simpatica?
      2 – (più TeXnicamente) questo codice potrebbe nascondere degli effetti collaterali?
      3 – si potrebbero implementare anche gli altri operatori tipo \mycnt=+6 ma è molto più difficile!!

      Ciao. Alla prossima.

    Visualizzazione 8 filoni di risposte
    • Autore
      Risposte
      • #42951
        Up
        0
        Down
        ::

        Volendo scrivere un comando che incrementi un contatore TeX con la sintassi C++ (o Java), basta scrivere il seguente codice:`\documentclass{minimal}
        \newcount\mycnt

        \def\op#1++{%
        \expandafter\advance\csname #1\endcsname by 1}

        \begin{document}
        \op mycnt++
        \op mycnt++
        \op mycnt++

        \the\mycnt
        \end{document}`

        Come vedete il comando \op è un comando delimitato con il doppio ++ ed il suo nome sta per operator.
        Il comando \op tuttavia accetta solo l’incremento, ma è possibile modificarlo:
        Occorre che l’operatore di incremento o decremento sia reso variabile (++ oppure –).
        Per non vincolare il numero dei caratteri del nome del contatore, un alternativa è quella di utilizzare un ulteriore delimitatore fisso: per esempio l’uguale:

        \op mycnt=++
        \op mycnt=–

        Ecco il codice:
        `\documentclass{minimal}

        \newcount\mycnt

        \def\pluschar{+}
        \def\minuschar{-}
        \def\op#1=#2#3{%
        \def\tmp{#2}\def\tmpii{#3}
        \ifx\tmp\tmpii
        \ifx\tmp\pluschar
        \expandafter\advance\csname #1\endcsname by 1
        \else
        \ifx\tmp\minuschar
        \expandafter\advance\csname #1\endcsname by -1
        \else
        ERRORE: operatore non riconosciuto.
        \fi
        \fi
        \else
        ERRORE: simboli non uguali.
        \fi}

        \begin{document}
        \op mycnt=++
        \op mycnt=++
        \op mycnt=++
        \the\mycnt

        \op mycnt=–
        \op mycnt=–
        \the\mycnt
        \end{document}`

        L’ideale sarebbe una sintassi di questo tipo:
        `\newcount\xmycnt
        \mycnt++
        \mycnt–`

        ovvero operare con comandi che sembrano nomi di contatori utilizzandone uno vero con un prefisso dietro le quinte:`\documentclass{minimal}

        \def\pluschar{+}
        \def\minuschar{-}
        \def\newMagicCounter#1{%
        \expandafter\newcount\csname x#1\endcsname
        \expandafter\def\csname #1\endcsname##1##2{%
        \def\tmp{##1}\def\tmpi{##2}
        \ifx\tmp\tmpi
        \ifx\tmp\pluschar
        \expandafter\advance\csname x#1\endcsname by 1
        \else
        \ifx\tmp\minuschar
        \expandafter\advance\csname x#1\endcsname by -1
        \else
        errore: operatore non riconosciuto
        \fi
        \fi
        \else
        errore: operatore disaccoppiato
        \fi
        }
        }

        \begin{document}
        \newMagicCounter{mycnt}

        \mycnt++
        \mycnt++
        \mycnt++
        \mycnt++
        \the\xmycnt

        \mycnt–
        \mycnt–
        \the\xmycnt
        \end{document}`

        Vorrei chiedervi adesso due cose:
        1 – trovate che la cosa sia simpatica?
        2 – (più TeXnicamente) questo codice potrebbe nascondere degli effetti collaterali?
        3 – si potrebbero implementare anche gli altri operatori tipo \mycnt=+6 ma è molto più difficile!!

        Ciao. Alla prossima.

        Prova questo:
        `\documentclass{minimal}

        \makeatletter
        \newcount\@mycount

        % Check if the following token is +
        \def\mycount{\@ifnextchar+{\check@forplus}{\check@forother}}
        % If it is check whether the next one is a + (we need to gobble the former +)
        \def\check@forplus#1{\@ifnextchar+{\@advanceone}{\@advancemany}}
        % Check for a – instead of a +
        \def\check@forother{\@ifnextchar-{\check@forminus}{\@adverror}}
        % If we had -, check for the next token
        \def\check@forminus#1{\@ifnextchar-{\@advanceminusone}{\@advanceminusmany}}
        % In case we have ++, gobble the second + and advance by 1
        \def\@advanceone#1{\advance\@mycount\@ne}
        % In case we have –, gobble the second – and advance by -1
        \def\@advanceminusone#1{\advance\@mycount\m@ne}
        % In case we have only one + or -, they should be followed by a number
        \def\@advancemany{\advance\@mycount}
        \def\@advanceminusmany{\advance\@mycount-}
        % Throw an error if we have neither + nor – after \mycount
        \def\@adverror{\errmessage{Wrong syntax}}

        \def\Show{\showthe\@mycount}
        \makeatother

        \begin{document}
        \mycount++
        \Show

        \mycount–
        \Show

        \mycount+6
        \Show

        \mycount-6
        \Show

        \end{document}`
        Ciao
        Enrico

      • #42952
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::


          Interessante l’uso di \@ifnextchar.

          Al comando non si da alcun argomento, mentre si esegue il parsing dei caratteri che lo seguono, rendendo così molto flessibile la gestione della sintassi.
          Sto già consultando più attentamente la tua guida introtex sull’argomento!

          Grazie Enrico.

        • #42953
          Up
          0
          Down
          ::

          Interessante l’uso di \@ifnextchar.

          Al comando non si da alcun argomento, mentre si esegue il parsing dei caratteri che lo seguono, rendendo così molto flessibile la gestione della sintassi.
          Sto già consultando più attentamente la tua guida introtex sull’argomento!

          Grazie Enrico.

          Ma funziona? L’ho scritto mentre sto facendo la migrazione dal vetusto e glorioso G4 al nuovo fiammante Mac Pro con Xeon 🙂 🙂

          Fra poco di nuovo operativo anche con TeX Live 2009.

          Ciao
          Enrico

        • #42954
          Up
          0
          Down
          ::


          Ma allora ti è arrivato!
          Congratulazioni! Innaffialo per me 😀

          Ciao
          Tommaso

        • #42955
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            Interessante l’uso di \@ifnextchar.

            Al comando non si da alcun argomento, mentre si esegue il parsing dei caratteri che lo seguono, rendendo così molto flessibile la gestione della sintassi.
            Sto già consultando più attentamente la tua guida introtex sull’argomento!

            Grazie Enrico.

            Ma funziona? L’ho scritto mentre sto facendo la migrazione dal vetusto e glorioso G4 al nuovo fiammante Mac Pro con Xeon 🙂 🙂

            Fra poco di nuovo operativo anche con TeX Live 2009.

            Ciao
            Enrico

            Funzionare, non funziona.
            Ma dipende da dettagli secondari come un nome sbagliato, ed il comando \showthe che sembra funzionare solo con i nomi dei contatori in stile \count12.

            Il concetto è quello che conta comunque. Grazie.
            Ps. congratulation for the your new pc.
            Bye

          • #42956
            Up
            0
            Down
            ::

            [quote]Interessante l’uso di \@ifnextchar.

            Al comando non si da alcun argomento, mentre si esegue il parsing dei caratteri che lo seguono, rendendo così molto flessibile la gestione della sintassi.
            Sto già consultando più attentamente la tua guida introtex sull’argomento!

            Grazie Enrico.

            Ma funziona? L’ho scritto mentre sto facendo la migrazione dal vetusto e glorioso G4 al nuovo fiammante Mac Pro con Xeon 🙂 🙂

            Fra poco di nuovo operativo anche con TeX Live 2009.

            Ciao
            Enrico

            Funzionare, non funziona.
            Ma dipende da dettagli secondari come un nome sbagliato, ed il comando \showthe che sembra funzionare solo con i nomi dei contatori in stile \count12.

            Il concetto è quello che conta comunque. Grazie.
            Ps. congratulation for the your new pc.
            Bye[/quote]
            Ho corretto dove si doveva correggere: erano tutti “mycount” dove tu avevi “mycnt”. Prossima versione: un comando generico per definire contatori di questo tipo.

            PS: funziona con le modifiche apportate; e funziona anche il nuovo Mac! Fatta la migrazione, ho esattamente tutto come prima (compreso il casino sul Desktop). 🙂

            Ciao
            Enrico

          • #42957
            robitex
            Amministratore del forum
              Up
              0
              Down
              ::

              Ho corretto dove si doveva correggere: erano tutti “mycount” dove tu avevi “mycnt”. Prossima versione: un comando generico per definire contatori di questo tipo.

              PS: funziona con le modifiche apportate; e funziona anche il nuovo Mac! Fatta la migrazione, ho esattamente tutto come prima (compreso il casino sul Desktop). 🙂

              Continua ad esserci l’errore:`\Show ->\showthe \@mycount

              l.29 \Show`

              Attendo comunque sviluppi!!!

            • #42958
              Up
              0
              Down
              ::

              Ho corretto dove si doveva correggere: erano tutti “mycount” dove tu avevi “mycnt”. Prossima versione: un comando generico per definire contatori di questo tipo.

              PS: funziona con le modifiche apportate; e funziona anche il nuovo Mac! Fatta la migrazione, ho esattamente tutto come prima (compreso il casino sul Desktop). 🙂

              Continua ad esserci l’errore:`\Show ->\showthe \@mycount

              l.29 \Show`

              Attendo comunque sviluppi!!!

              No, non è un errore: è il comportamento normale di \showthe. Quando si deve eseguire un debugging è a volte utile conoscere il valore che TeX ha assegnato a un registro o il significato di un comando; per questo ci sono \showthe e \show, che interrompono la composizione per dare modo di inserire qualcosa, per esempio altri \show.

              Ciao
              Enrico

            • #42959
              robitex
              Amministratore del forum
                Up
                0
                Down
                ::

                [quote]Ho corretto dove si doveva correggere: erano tutti “mycount” dove tu avevi “mycnt”. Prossima versione: un comando generico per definire contatori di questo tipo.

                PS: funziona con le modifiche apportate; e funziona anche il nuovo Mac! Fatta la migrazione, ho esattamente tutto come prima (compreso il casino sul Desktop). 🙂

                Continua ad esserci l’errore:`\Show ->\showthe \@mycount

                l.29 \Show`

                Attendo comunque sviluppi!!!

                No, non è un errore: è il comportamento normale di \showthe. Quando si deve eseguire un debugging è a volte utile conoscere il valore che TeX ha assegnato a un registro o il significato di un comando; per questo ci sono \showthe e \show, che interrompono la composizione per dare modo di inserire qualcosa, per esempio altri \show.

                Ciao
                Enrico[/quote]

                Buono a sapersi.
                No, perché il compilatore mi da un exit code di 1 quindi un errore di compilazione.
                Ciao.

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

            Go to top