- Questo topic ha 9 risposte, 5 partecipanti ed è stato aggiornato l'ultima volta 12 anni, 7 mesi fa da
cfiandra.
-
CreatoreTopic
-
20 Gennaio 2014 alle 12:33 #91695::
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.
-
CreatoreTopic
-
AutoreRisposte
-
-
20 Gennaio 2014 alle 12:43 #91696::
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
-
20 Gennaio 2014 alle 12:47 #91697::
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.
-
20 Gennaio 2014 alle 13:18 #91698::
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.
-
20 Gennaio 2014 alle 13:24 #91699::
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. -
20 Gennaio 2014 alle 15:16 #91700::
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
-
20 Gennaio 2014 alle 18:42 #91701::
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.
-
21 Gennaio 2014 alle 17:50 #91702::
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.
-
21 Gennaio 2014 alle 18:45 #91703::
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.
-
22 Gennaio 2014 alle 14:59 #91704::
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
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.