Estrazione di un argomento da un comando

  • Creatore
    Topic
  • #44709
    strolego
    Partecipante
      Up
      0
      Down
      ::


      Supponiamo di avere un comando con un argomento
      `\newcommand{\cmd}[1]{qualcosa #1}`
      Vorrei definire un nuovo comando `\newcommand{\foo}[1]{
      se #1 è \cmd{arg} esegui \bar{arg}
      altrimenti esegui \bar{#1}
      }`

      E’ possibile? (sempre che sia stato sufficientemente chiaro)

      Grazie
      Flavio

    Visualizzazione 10 filoni di risposte
    • Autore
      Risposte
      • #44710
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::

          Supponiamo di avere un comando con un argomento
          `\newcommand{\cmd}[1]{qualcosa #1}`
          Vorrei definire un nuovo comando `\newcommand{\foo}[1]{
          se #1 è \cmd{arg} esegui \bar{arg}
          altrimenti esegui \bar{#1}
          }`

          E’ possibile? (sempre che sia stato sufficientemente chiaro)

          Grazie
          Flavio

          Di base dovresti chiarire se l’argomento è un numero od una stringa qualsiasi. Se è un numero è abbastanza semplice memorizzarlo in un contatore TeX ed utilizzare il condizionale \ifnum nel secondo comando.
          Se invece è una stringa di caratteri potresti memorizzare in una macro il valore dell’argomento e confrontarlo poi con una funzione del pacchetto xstring che offre comandi per il confronto di stringhe.

          Dovresti essere un po’ più esplicito sulla tua idea.
          Bye

        • #44711
          Up
          0
          Down
          ::

          Supponiamo di avere un comando con un argomento
          `\newcommand{\cmd}[1]{qualcosa #1}`
          Vorrei definire un nuovo comando `\newcommand{\foo}[1]{
          se #1 è \cmd{arg} esegui \bar{arg}
          altrimenti esegui \bar{#1}
          }`

          E’ possibile? (sempre che sia stato sufficientemente chiaro)

          `\newcommand{\foo}[1][arg]{\bar{#1}}`
          In questo caso \foo ti dà \bar{arg}, mentre \foo[xyz] dà \bar{xyz}.

          Ma forse non è quello che chiedi; solo che, come dice robitex, non si capisce molto bene.

          Ciao
          Enrico

        • #44712
          strolego
          Partecipante
            Up
            0
            Down
            ::


            Avete ragione, sono stato veramente poco chiaro.

            Ho comunque nel frattempo risolto per altra via il mio problema e quindi non vi disturbo ulteriormente.

            Grazie
            Flavio

          • #44713
            Up
            0
            Down
            ::

            Avete ragione, sono stato veramente poco chiaro.

            Ho comunque nel frattempo risolto per altra via il mio problema e quindi non vi disturbo ulteriormente.

            Be’, se ci vuoi fare partecipi non ci offendiamo. 🙂 Magari troviamo un modo migliore di sistemare la cosa.

            Ciao
            Enrico

          • #44714
            strolego
            Partecipante
              Up
              0
              Down
              ::


              La soluzione non è generale ma si riferisce esclusivamente al mio problema.

              Il mio problema era quello di formattare delle espressioni valutate usando fp in modo appropriato se queste si presentano come esponenti o come coefficienti (sullo stile dei comandi efmt e cfmt del pacchetto rangen)

              Io ho un comando (\FPsv{arg}) che calcola con fp l’argomento e stampa il risultato
              `\FPsv{#1} è definito come \FPeval\tmp{round(#1:0)}\tmp` e volevo applicare la formattazione sia a stringhe con questo comando sia a stringhe più semplici (contenenti un solo valore)

              Inoltre ho altri comandi che permettono di semplificare frazioni numeriche che hanno a numeratore e a denominatore espressioni valutabili con fp; questi comandi permettono la formattazione per coefficienti ed esponenti.
              I comandi sono \sempli{#1}{#2} che fornisce la frazione semplificata, \semplix{#1}{#2} che fornisce òa razione semplificata, la stringa vuota se il risultato è 1, il segno meno se il risultato è -1 e \esempli{#1}{#2} analogo per gli esponenti.

              La mia soluzione consiste nell’usare questi comandi con denominatore 1: volevo farla automatizzata, ma non ci sono riuscito.

              La mia idea era: creo un comando \coef per formattare i coefficienti con un argomento: se l’argomento è un’espressione \semplix il comando non fa nulla, se l’argomento è un’espressione valutabile da fp (ad esempio \a dove \a è un valore numerico assegnato) il comando restituisce \semplix{a}{1}, se l’espressione è \FPv{arg} il comando doveva estrarre arg e calcolare \semplix{arg}{1}.

              Spero che si capisca tutto perché ho la tendenza a dare per scontate troppe cose del codice che scrivo.

              Grazie
              Flavio

            • #44715
              Up
              0
              Down
              ::

              La soluzione non è generale ma si riferisce esclusivamente al mio problema.

              Il mio problema era quello di formattare delle espressioni valutate usando fp in modo appropriato se queste si presentano come esponenti o come coefficienti (sullo stile dei comandi efmt e cfmt del pacchetto rangen)

              Io ho un comando (\FPsv{arg}) che calcola con fp l’argomento e stampa il risultato
              `\FPsv{#1} è definito come \FPeval\tmp{round(#1:0)}\tmp` e volevo applicare la formattazione sia a stringhe con questo comando sia a stringhe più semplici (contenenti un solo valore)

              Inoltre ho altri comandi che permettono di semplificare frazioni numeriche che hanno a numeratore e a denominatore espressioni valutabili con fp; questi comandi permettono la formattazione per coefficienti ed esponenti.
              I comandi sono \sempli{#1}{#2} che fornisce la frazione semplificata, \semplix{#1}{#2} che fornisce òa razione semplificata, la stringa vuota se il risultato è 1, il segno meno se il risultato è -1 e \esempli{#1}{#2} analogo per gli esponenti.

              La mia soluzione consiste nell’usare questi comandi con denominatore 1: volevo farla automatizzata, ma non ci sono riuscito.

              La mia idea era: creo un comando \coef per formattare i coefficienti con un argomento: se l’argomento è un’espressione \semplix il comando non fa nulla, se l’argomento è un’espressione valutabile da fp (ad esempio \a dove \a è un valore numerico assegnato) il comando restituisce \semplix{a}{1}, se l’espressione è \FPv{arg} il comando doveva estrarre arg e calcolare \semplix{arg}{1}.

              Spero che si capisca tutto perché ho la tendenza a dare per scontate troppe cose del codice che scrivo.

              Sì, dai troppo per scontato. Nemmeno un esempietto d’uso? Non è che scrivendo “arg” si capisca che cosa intendi metterci.

              Ciao
              Enrico

            • #44716
              strolego
              Partecipante
                Up
                0
                Down
                ::


                Scusa. 😳 😳 😳

                `\FPsv[5+2] -> 7
                \FPeval\a{6*5} \a -> 30.00000
                \FPeval{a-6+a/10} -> 27
                \sempli{a-10}{40} ->1/2
                \sempli{a-10}{5} -> 4
                \semplix{a-10}{20} ->
                \semplix{10-a}{20} -> –
                \esempli{a-10}{20} ->
                \esempli{10-a}{20} -> -1
                `
                così che
                `\semplix{a-10}{20} x ->x
                x^{\esempli{a-10}{20}} -> x
                \semplix{10-a}{20} x -> -x
                x^{\esempli{10-a}{20}} -> x^{-1}
                `

                \FPsv \sempli, ecc. accettano come argomento(i) qualsiasi espressione che fp può calcolare (numerica o con parametri)

                Se vuoi il codice di \sempli, \semplix, posso postarlo.

                Spero di essere stato più chiaro ora

              • #44717
                Up
                0
                Down
                ::

                Scusa. 😳 😳 😳

                `\FPsv[5+2] -> 7
                \FPeval\a{6*5} \a -> 30.00000
                \FPeval{a-6+a/10} -> 27
                \sempli{a-10}{40} ->1/2
                \sempli{a-10}{5} -> 4
                \semplix{a-10}{20} ->
                \semplix{10-a}{20} -> –
                \esempli{a-10}{20} ->
                \esempli{10-a}{20} -> -1
                `
                così che
                `\semplix{a-10}{20} x ->x
                x^{\esempli{a-10}{20}} -> x
                \semplix{10-a}{20} x -> -x
                x^{\esempli{10-a}{20}} -> x^{-1}
                `

                \FPsv \sempli, ecc. accettano come argomento(i) qualsiasi espressione che fp può calcolare (numerica o con parametri)

                Se vuoi il codice di \sempli, \semplix, posso postarlo.

                Spero di essere stato più chiaro ora

                Continuo a non capire. I tuoi numeri sono interi? Che intendi con “frazione semplificata”? Che trovi il massimo comun divisore tra numeratore e denominatore?

                Ciao
                Enrico

              • #44718
                strolego
                Partecipante
                  Up
                  0
                  Down
                  ::

                  Continuo a non capire. I tuoi numeri sono interi? Che intendi con “frazione semplificata”? Che trovi il massimo comun divisore tra numeratore e denominatore?

                  In questo contesto i numeri sono tutti interi (ho un altra versione in cui si possono aggiungere cifre decimali)

                  Con “frazione semplificata” intendo proprio l’operazione di semplificazione da scuola primaria per cui calcolo il massimo comun divisore e divido

                  \sempli{24}{36}->\frac{2}{3} ecc.

                  Grazie

                • #44719
                  Up
                  0
                  Down
                  ::

                  Continuo a non capire. I tuoi numeri sono interi? Che intendi con “frazione semplificata”? Che trovi il massimo comun divisore tra numeratore e denominatore?

                  In questo contesto i numeri sono tutti interi (ho un altra versione in cui si possono aggiungere cifre decimali)

                  Con “frazione semplificata” intendo proprio l’operazione di semplificazione da scuola primaria per cui calcolo il massimo comun divisore e divido

                  \sempli{24}{36}->\frac{2}{3} ecc.

                  Grazie

                  A questo punto dovrei vedere le macro che usi, ma ho una certa paura. 🙂 Si può sapere che ci vuoi fare?

                  Ciao
                  Enrico

                • #44720
                  strolego
                  Partecipante
                    Up
                    0
                    Down
                    ::


                    Le macro mi servono per la formattazione di esercizi e risposte nei temi d’esame.

                    Le macro sono queste (tremo al pensiero del giudizio)

                    `%% Comando di base

                    \newcommand{\@sempli}[2]{\FPeval\segnofrac{round(#1:0)*round(#2:0)}%%
                    \FPeval\zott{round(abs(#1):0)}\FPset\pra{\zott}\FPeval\zott{round(abs(#2):0)}\FPset\prb{\zott}%%
                    \FPeval\num{max(\pra,\prb)}\FPeval\den{min(\pra,\prb)}\FPset\resto{\den}\whiledo{\resto>0}
                    {\FPset\restoold{\resto}\FPeval\resto{round((\num-trunc((\num)/\den:0)*(\den)):0)}
                    \FPset\num{\den}\FPset\den{\resto}}\FPeval\num{round((\pra/\restoold):0)}\FPeval\den{round((\prb/\restoold):0)}
                    \FPifneg\segnofrac{-}\else{}\fi\ifthenelse{\den=1}{\ifthenelse{\num=1}{1}{\num}}{\frac{\num}{\den}}}

                    %% il comando \sempli
                    \newcommand{\sempli}{\@sempli}

                    %% il comando \semplix (per i coefficienti)
                    \newcommand{\semplix}[2]{
                    \FPeval\t@mpa{round(#1:0)}\FPeval\t@mpb{round(#2:0)}
                    \ifthenelse{\t@mpa=\t@mpb}{}
                    {\ifthenelse{\t@mpa=-\t@mpb}{-}
                    {\@sempli{#1}{#2}}
                    }
                    }

                    %%% comando \esempli (per gli esponenti)

                    \newcommand{\esempli}[2]{
                    \FPeval\t@mpa{round(#1:0)}\FPeval\t@mpb{round(#2:0)}
                    \ifthenelse{\t@mpa=\t@mpb}{}
                    {\ifthenelse{\t@mpa=-\t@mpb}{-1}
                    {\@sempli{#1}{#2}}
                    }
                    }
                    `

                    Grazie della collaborazione

                    Flavio

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

                Go to top