newcommand

  • Questo topic ha 8 risposte, 4 partecipanti ed è stato aggiornato l'ultima volta 12 anni fa da egreg9.
  • Creatore
    Topic
  • #96003
    claudio
    Partecipante
      Up
      0
      Down
      ::


      con il caldo e le ferie quasi finite mi è venuta la balzana idea di l’operatore mcd
      in modo che avesse tre comportamenti distinti
      a seconda del numero degli argomenti
      se ho tre numeri deve scrivere mcd(1,2,3)
      se ho due numeri mcd(1,2)
      se non ho nessun numero mcd
      ho scritto questo codice
      che funziona male ed è poco efficiente

      `
      \documentclass[parskip]{scrartcl}
      \usepackage{amsmath}
      \usepackage{xifthen}
      \DeclareMathOperator{\mcdo}{mcd}

      %\newcommand{\mcd}[3]{\ifthenelse{\NOT\isempty{#3}}{\mcdo{(#1,#2,#3)}}{\mcdo(#1,#2)}}
      \newcommand{\mcd}[4][]{
      \ifthenelse{\NOT\isempty{#4}}{\mcdo(#2,#3,#4)} %
      {\ifthenelse{\NOT\isempty{#3}}{then clause}{\mcdo}}}

      \begin{document}
      $\mcd{1}{2}{3}{4}$

      $\mcd{1}{2}{}$

      $\mcd{1}{}{}$

      \end{document}
      `
      come scrivere la definizione giusta?

    Visualizzazione 7 filoni di risposte
    • Autore
      Risposte
      • #96004
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Bon il linguaggio L3 non dovrebe essere troppo difficille. Ma io no lo so usare bene, quindi preferirei usare gli argomenti delimitati e una solo argomento per \modo per esempio scrivi `$\modo{a;b;c}$` e una macro ausiliaria esamina la lista con gli argomenti veri separati dai punti e virgola. con gli argomenti veri costruisce la lista vera da dare in pasto a \mod )perché ovviamente non può ridefinire un macro che chiama se stessa ripetutamente per ottenere quello che vuoi; questa macro ausiliaria esegue poi \mod se e solo se la lista vera NON è vuota.

          Non ti do il codice che puoi costruire facilmente con l’articolo sugli argomenti delimitati che ho scritto su ArsTeXnica alcuni anni fa.

          Ma in più mi domando a che cosa ti serva una macro siffatta, quando \mcd definito come un normale operatore e con gli argomenti separati da virgole con spazi funziona da solo come si deve; scrivere `\usepackage{amsmath}
          \DeclareMathOperator{\mcd}{mcd}

          \[\mcd{6, 12, 72} = 6\]` fa quel che vuoi senza problemi.

        • #96005
          claudio
          Partecipante
            Up
            0
            Down
            ::


            probabilmente non serve a nulla 🙂 diciamo che ho la giornata libera una bella tosse e non posso uscire di casa

          • #96006
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              Allora divertiti con la lettura dell’articolo sugli argomenti delimitati; impari certamente cose nuove e magari riesci anche a creare il comando che vuoi tu.

            • #96007
              Up
              0
              Down
              ::

              claudio” post=95591con il caldo e le ferie quasi finite mi è venuta la balzana idea di l’operatore mcd
              in modo che avesse tre comportamenti distinti
              a seconda del numero degli argomenti
              se ho tre numeri deve scrivere mcd(1,2,3)
              se ho due numeri mcd(1,2)
              se non ho nessun numero mcd
              ho scritto questo codice
              che funziona male ed è poco efficiente

              `
              \documentclass[parskip]{scrartcl}
              \usepackage{amsmath}
              \usepackage{xifthen}
              \DeclareMathOperator{\mcdo}{mcd}

              %\newcommand{\mcd}[3]{\ifthenelse{\NOT\isempty{#3}}{\mcdo{(#1,#2,#3)}}{\mcdo(#1,#2)}}
              \newcommand{\mcd}[4][]{
              \ifthenelse{\NOT\isempty{#4}}{\mcdo(#2,#3,#4)} %
              {\ifthenelse{\NOT\isempty{#3}}{then clause}{\mcdo}}}

              \begin{document}
              $\mcd{1}{2}{3}{4}$

              $\mcd{1}{2}{}$

              $\mcd{1}{}{}$

              \end{document}
              `
              come scrivere la definizione giusta?

              Non è più semplice scrivere
              `\mcd(1,2,3)`
              e non preoccuparsi troppo?

              Se proprio vuoi, ti suggerisco
              `\documentclass{article}
              \usepackage{amsmath,xparse}
              \DeclareMathOperator{\mcdop}{mcd}
              \ExplSyntaxOn
              \NewDocumentCommand{\mcd}{d()}
              {
              \mcdop
              \IfValueT{#1}{\claudio_mcd_arg:n { #1 } }
              }
              \cs_new_protected:Npn \claudio_mcd_arg:n #1
              {
              \seq_set_split:Nnn \l_claudio_mcd_arg_seq { ; } { #1 }
              ( \seq_use:Nn \l_claudio_mcd_arg_seq { , } )
              }
              \seq_new:N \l_claudio_mcd_arg_seq
              \ExplSyntaxOff

              \begin{document}
              $\mcd(a;b;c)$
              \end{document}`
              Ci trovi qualche vantaggio?

              Ciao
              Enrico

            • #96008
              claudio
              Partecipante
                Up
                0
                Down
                ::


                il vantaggio era quello di capire come funzionavano le cose.
                Una scusa per capire come funzionavano i comandi.
                La tua definizione funziona con 4 numeri?
                perché?

                claudio

              • #96009
                Up
                0
                Down
                ::

                claudio” post=95603il vantaggio era quello di capire come funzionavano le cose.
                Una scusa per capire come funzionavano i comandi.
                La tua definizione funziona con 4 numeri?
                perché?

                Funziona con qualsiasi stringa di parti separate da punto e virgola; la funzione separa le varie parti e le rimette insieme separate da virgole.

                Ciao
                Enrico

              • #96010
                Up
                0
                Down
                ::


                @egreg Scusa ho provato a compilare il tuo codice, ma mi restituisce l’errore che [tt]\seq_set_split:Nn[/tt] non esiste come comando. Se lo correggo con [tt]\seq_set_split:Nnn[/tt] compila perfettamente. È una svista oppure c’è qualcosa che non quadra sul mio computer? Grazie per l’attenzione. 😀

              • #96011
                Up
                0
                Down
                ::

                skevin93″ post=95650@egreg Scusa ho provato a compilare il tuo codice, ma mi restituisce l’errore che [tt]\seq_set_split:Nn[/tt] non esiste come comando. Se lo correggo con [tt]\seq_set_split:Nnn[/tt] compila perfettamente. È una svista oppure c’è qualcosa che non quadra sul mio computer? Grazie per l’attenzione. 😀

                Errore di sbaglio fu. 😉

                Ciao
                Enrico

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

            Go to top