Nuovo comando con argomenti opzionali

  • Creatore
    Topic
  • #91695
    Up
    0
    Down
    ::


    Ciao a tutti,

    ho una domanda relativa all’uso di [tt]NewDocumentCommand[/tt] messo a disposizione dal pacchetto [tt]xparse.[/tt] Supponiamo di definire un nuovo comando come questo:
    `\documentclass{memoir}

    \usepackage{xparse}
    \NewDocumentCommand{\nuovoComando}{O{0} O{1} m}{#1 – #2 – #3}

    \begin{document}

    \nuovoComando[primo][secondo]{terzo}

    \end{document}`
    C’è modo di richiamarlo modificando il valore predefinito soltanto del secondo argomento opzionale? Ho guardato la documentazione del pacchetto, ma non ho capito molto.

    Grazie mille e buona giornata,
    Marco.

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

      Marco87″ post=91232Ciao a tutti,

      ho una domanda relativa all’uso di [tt]NewDocumentCommand[/tt] messo a disposizione dal pacchetto [tt]xparse.[/tt] Supponiamo di definire un nuovo comando come questo:
      `\documentclass{memoir}

      \usepackage{xparse}
      \NewDocumentCommand{\nuovoComando}{O{0} O{1} m}{#1 – #2 – #3}

      \begin{document}

      \nuovoComando[primo][secondo]{terzo}

      \end{document}`
      C’è modo di richiamarlo modificando il valore predefinito soltanto del secondo argomento opzionale? Ho guardato la documentazione del pacchetto, ma non ho capito molto.

      Grazie mille e buona giornata,
      Marco.

      No, ovviamente. Se vuoi due argomenti facoltativi “indipendenti”, l’unico modo è di specificarne uno prima e uno dopo l’argomento obbligatorio.

      Ciao
      Enrico

    • #91697
      Up
      0
      Down
      ::


      Ciao Enrico,

      grazie della risposta. Speravo che ci fosse la possibilità di fare qualcosa di simile all’assegnare una sorta di ID agli argomenti opzionali, così da poterne modificare uno non con un criterio di posizione ma di ID identificativo. Secondo me non sarebbe un brutta cosa se un giorno fosse possibile far questo.

      Comunque grazie ancora e ciao,
      Marco.

    • #91698
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Leggiti la documentazione di xkeyval; nella pagina 2 c’è la maotivazione dell’uso delle opzioni con “chiave=valore”. Secondo me risolve il tuo problema; avresti un solo campo opzionale dentro al quale puoi specificare ognuno con la sua chiave quanti valori vuoi; la chiave, in ssstanza rappresent ‘ID di ciascun valore opzionale. Direi che \NewDocumentCommand e la tecnica delle opzioni specificate con chiave=valore siano complementari, nessuna delle due esclude quell’altra, ma il vantaggio di usare l’una o l’altra dipendo da cosa si vuol fare.

      • #91699
        Up
        0
        Down
        ::


        Anche secondo me la soluzione ideale è usare opzioni “chiave-valore”. Un esempio con pgfkeys:`
        \documentclass{memoir}
        \usepackage{pgfkeys,pdftexcmds}
        \pgfkeys{/mio cmd/.cd,
        primo/.store in=\primo,
        primo={},
        secondo/.store in=\secondo,
        secondo={}
        }

        \makeatletter
        \newcommand{\ncomando}[2][]{
        {% da notare il gruppo
        \pgfkeys{/mio cmd/.cd,#1}
        \ifnum\pdf@strcmp{\primo}{}=\z@%
        \ifnum\pdf@strcmp{\secondo}{}=\z@%
        #2
        \else
        \secondo\ – #2
        \fi%
        \else%
        \ifnum\pdf@strcmp{\secondo}{}=\z@%
        \primo\ – #2
        \else%
        \primo\ – \secondo\ – #2
        \fi%
        \fi%
        }% end gruppo
        }
        \makeatother

        \begin{document}
        \ncomando{terzo}

        \ncomando[primo=primo]{terzo}

        \ncomando{terzo} % funziona perché primo è locale quindi la precedente definizione non viene propagata

        \ncomando[secondo=secondo]{terzo}

        \ncomando[primo=primo, secondo=secondo]{terzo}

        \ncomando[secondo=secondo, primo=primo]{terzo}

        \end{document}
        ` Il risultato:

        [attachment=891]ScreenShot2014-01-20at3.23.57PM.png[/attachment]

        Ciao
        Claudio

        Attachments:
        You must be logged in to view attached files.
      • #91700
        Up
        0
        Down
        ::


        Ecco una soluzione con l3keys

        `\documentclass{article}
        \usepackage{xparse}

        \ExplSyntaxOn

        \keys_define:nn { marcolxxxvii/qualcosa }
        {
        primo .tl_set:N = \l_marcolxxxvii_primo_tl,
        primo .initial:n = PRIMO,
        secondo .tl_set:N = \l_marcolxxxvii_secondo_tl,
        secondo .initial:n = SECONDO,
        }

        \NewDocumentCommand{\nuovoComando}{ O{} m }
        {
        \group_begin:
        \marcolxxxvii_nuovocomando_keys:nn { #1 } { #2 }
        \group_end:
        }
        \NewDocumentCommand{\nuovoComandoOpt{ O{PRIMO} O{SECONDO} m }
        {
        \marcolxxxvii_nuovocomando:nnn { #1 } { #2 } { #3 }
        }

        \cs_new_protected:Npn \marcolxxxvii_nuovocomando_keys:nn #1 #2
        {
        \keys_set:nn { marcolxxxvii/qualcosa } { #1 }
        \marcolxxxvii_nuovocomando:VVn \l_marcolxxxvii_primo_tl \l_marcolxxxvii_secondo_tl { #2 }
        }
        \cs_new_protected:Npn \marcolxxxvii_nuovocomando:nnn #1 #2 #3
        {% gli spazi sono ignorati, per avere uno spazio si usa ~
        #1 ~ – ~ #2 ~ – ~ #3
        }
        \cs_generate_variant:Nn \marcolxxxvii_nuovocomando:nnn { VV }

        \ExplSyntaxOff

        \begin{document}
        \nuovoComando{terzo}

        \nuovoComando[primo=primo]{terzo}

        \nuovoComando{terzo} % funziona perché primo è locale quindi la precedente definizione non viene propagata

        \nuovoComando[secondo=secondo]{terzo}

        \nuovoComando[primo=primo, secondo=secondo]{terzo}

        \nuovoComando[secondo=secondo, primo=primo]{terzo}

        \end{document}`

        Ho lasciato anche la versione con gli argomenti facoltativi, per mostrare come si possono avere anche interfacce diverse dallo stesso comando interno.

        Ciao
        Enrico

      • #91701
        Up
        0
        Down
        ::


        Ciao,

        ringrazio moltissimo tutti. Ammetto che non mi è affatto chiaro né l’uso di [tt]xkeyval,[/tt] né quello di [tt]pgfkeys[/tt] e di [tt]l3keys;[/tt] insomma, nessuna delle soluzioni proposte. Al momento no credo sarei capace di generalizzare quanto avete scritto a un caso diverso. Comunque, riguarderò i vostri codici anche alla luce della documentazione per provare a capirli e saperli quindi usare anche in casi diversi.

        Grazie mille ancora e buona serata!
        Marco.

      • #91702
        Up
        0
        Down
        ::


        Scusate, so che sembrerò scemo ma non posso fare a meno di esprimere tutto il mio stupore dopo aver letto questa discussione (che tra l’altro coincidenza avrei aperto io una settimana fa e non l’ho fatto perché mi sono detto: “dai… puoi farne a meno”)

        M che siete?! Certe cose non si fanno, la gente normale ci resta male a guardare alieni tra loro che si comportano normalmente…non siamo ancora pronti per questo!…vabbé…sappiate che a giochi fatti quando il mio susseguirsi delle giornate sarà scandito dalla routine del lavoro quotidiano (e non vedo l’ora) parte del mio tempo libero la dedicherò a divenire un alieno pure io 🙂 intanto leggo, mi sconvolgo, faccio facce ebeti davanti al monitor del mio computer e..taccio 🙂

        Un abbraccio 🙂

        Corrado.

      • #91703
        Up
        0
        Down
        ::


        Ciao Corrado,

        intanto, complimenti per la simpatia! 😀

        In effetti, l’argomento “chiavi” (in ognuna delle “versioni” proposte dai due Claudio o da Enrico) non è facile da fare proprio, almeno per me. Nelle guide che si citano spesso in questo forum non se ne parla (se non del tutto, quasi). Se un giorno diverrai un “alieno” come hai detto tu, fai un pensierino a scrivere qualcosa che aiuti anche chi non è “alieno” a capire quest’argomento. 😀

        È un vero peccato che le soluzioni siano così complicate. Insomma, è un peccato che chi ha pensato a creare uno strumento per creare nuovi comandi che prevedessero argomenti opzionali, non pensò che il criterio in base alla posizione fosse piuttosto limitativo (in realtà, a pensarci bene, questo fatto non è legato all’ “opzionalità” dell’argomento). Come conseguenza si hanno soluzioni che appaiono impegnative dal punto di vista del codice (il codice di cfiandra è indubbiamente complicato in relazione al risultato da ottenere; si pensi al caso in cui gli argomenti siano una decina), oppure difficili da capire come quella di Enrico (che non mi sembra complicata in sé; semplicemente manca la documentazione leggibile per chi, come dice Dork, non è un “alieno”).

        Per questo credo che scriverò agli autori del pacchetto [tt]xparse[/tt] per chiedere loro della possibilità di implementare questo nuovo strumento di identificazione degli argomenti di un comando.

        Buona serata a tutti!
        Marco.

      • #91704
        Up
        0
        Down
        ::


        In entrambi gli esempi, l’uso delle chiavi in sé non è la parte più complicata. Il vero nocciolo della questione era come “stampare” gli elementi tenendo conto dei vari spazi, ossia il livello “applicazione”. Parlando del mio esempio, ecco perché sono serviti quei controlli (suggeritimi da Enrico qui) per verificare la presenza di uno, due o tre argomenti. Il pseudo-codice é più o meno questo:`
        SE primo non c'é
        SE secondo non c'é
        INSERISCI “#2”
        ALTRIMENTI
        INSERISCI “secondo – #2” % notate gli spazi
        FINE
        ALTRIMENTI
        SE secondo non c'é
        INSERISCI “primo – #2” % notate gli spazi
        ALTRIMENTI
        INSERISCI “primo – secondo – #2” % notate gli spazi
        FINE
        FINE
        ` Non mi sembra complicato! Ovviamente è tutto dipeso dall’applicazione “stampa gli argomenti che ci sono”; applicazioni diverse hanno complessità diverse.

        Per Marco: La documentazione di LaTeX3 è ampia, ma bisogna andarci bene a fondo; è parecchio tempo che mi ci vorrei cimentare e tuttavia un po’ per pigrizia, un po’ perché con qualche acrobazia ci si aggiusta lo stesso, la mia unica esperienza rimane la lettura di “LaTeX3 Interfaces” (texdoc interface3) in aereoporto…

        Ciao
        Claudio

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

    Go to top