- Questo topic ha 17 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 16 anni fa da
Stemby.
-
CreatoreTopic
-
29 Agosto 2010 alle 10:33 #48851::
Buongiorno,
ho bisogno di definire un comando con una sintassi di questo tipo:
`
\nomecomando{par1}{par2}[par3][par4]{testo}
`In pratica, con numerosi parametri di cui alcuni opzionali ed altri no. Non son riuscito a capire se la cosa sia possibile usando \newcommand; altrimenti come fare?
Grazie!
Carlo
-
CreatoreTopic
-
AutoreRisposte
-
-
29 Agosto 2010 alle 12:42 #48852::
Buongiorno,
ho bisogno di definire un comando con una sintassi di questo tipo:
`
\nomecomando{par1}{par2}[par3][par4]{testo}
`In pratica, con numerosi parametri di cui alcuni opzionali ed altri no. Non son riuscito a capire se la cosa sia possibile usando \newcommand; altrimenti come fare?
Non è semplicissimo, ma nemmeno terribile. Dovresti essere più preciso, soprattutto riguardo all’assenza di uno degli argomenti opzionali: che dovrebbe succedere specificando uno solo dei due opzionali, per esempio?
Ciao
Enrico
-
29 Agosto 2010 alle 14:52 #48853::
Ciao Enrico,
che piacere risentirti.Dovresti essere più preciso, soprattutto riguardo all’assenza di uno degli argomenti opzionali: che dovrebbe succedere specificando uno solo dei due opzionali, per esempio?
In realtà non lo so esattamente, dovrei provare. Comunque quei 2 paramentri opzionali sono [ampiezza] e [c|l|r|s] del comando \makebox (il mio comando dovrà passare quei 2 paramentri direttamente al comando \makebox), quindi… quel che succede col comando \makebox.
Su IRC mi hanno suggerito:
* http://www.texdev.net/2010/05/23/from-newcommand-to-newdocumentcommand/
* http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=keycommandSicuramente tu hai esperienze in merito, e quindi saprai consigliarmi la strada migliore.
Grazie!
-
29 Agosto 2010 alle 15:13 #48854::
Ciao Enrico,
che piacere risentirti.Dovresti essere più preciso, soprattutto riguardo all’assenza di uno degli argomenti opzionali: che dovrebbe succedere specificando uno solo dei due opzionali, per esempio?
In realtà non lo so esattamente, dovrei provare. Comunque quei 2 paramentri opzionali sono [ampiezza] e [c|l|r|s] del comando \makebox (il mio comando dovrà passare quei 2 paramentri direttamente al comando \makebox), quindi… quel che succede col comando \makebox.
Su IRC mi hanno suggerito:
* http://www.texdev.net/2010/05/23/from-newcommand-to-newdocumentcommand/
* http://tug.ctan.org/cgi-bin/ctanPackageInformation.py?id=keycommandSicuramente tu hai esperienze in merito, e quindi saprai consigliarmi la strada migliore.
Il primo suggerimento è molto interessante, ma si tratta di usare la nuova sintassi di LaTeX3. Il secondo pacchetto permette di definire comandi che passano gli argomenti nella forma “chiave=valore”: piiù facili da usare per l’utente finale; se solo Chervet scrivesse decentemente le sue documentazioni! 🙁
`\newkeycommand{\mymakebox}[width=\width,align=c][1]{%
\makebox[\commandkey{width}][\commandkey{align}]{#1}}`
definisce essenzialmente la stessa cosa di \makebox, ma con sintassi diversa: per esempio
`\mymakebox[width=10cm,align=s]{x y z}`
equivale a \makebox[10cm]{x y z].Ciao
Enrico
-
29 Agosto 2010 alle 15:21 #48855::
Il primo suggerimento è molto interessante, ma si tratta di usare la nuova sintassi di LaTeX3.
mmm, è un problema? Per l’utente finale, per il programmatore o per entrambi? (LaTeX3 lo conosco solo di nome…)
`\newkeycommand{\mymakebox}[width=\width,align=c][1]{%
\makebox[\commandkey{width}][\commandkey{align}]{#1}}`
definisce essenzialmente la stessa cosa di \makebox, ma con sintassi diversa: per esempio
`\mymakebox[width=10cm,align=s]{x y z}`
equivale a \makebox[10cm]{x y z].Ok, grazie. Non è esattamente quello che speravo, ma al limite me lo faccio andare bene. Forse allora al posto di quel pacchetto potrei usare xkeyval, che devo già caricare per altri motivi.
Mi sembra di capire che l’unico modo per arrivare al comando che pensavo è usando comandi TeX per definire il tutto, giusto?
Ciao!
Carlo
-
29 Agosto 2010 alle 15:24 #48856::
Il primo suggerimento è molto interessante, ma si tratta di usare la nuova sintassi di LaTeX3.
mmm, è un problema? Per l’utente finale, per il programmatore o per entrambi? (LaTeX3 lo conosco solo di nome…)
La documentazione di xparse è difficilina, ma non incomprensibile.
`\newkeycommand{\mymakebox}[width=\width,align=c][1]{%
\makebox[\commandkey{width}][\commandkey{align}]{#1}}`
definisce essenzialmente la stessa cosa di \makebox, ma con sintassi diversa: per esempio
`\mymakebox[width=10cm,align=s]{x y z}`
equivale a \makebox[10cm][s]{x y z].Ok, grazie. Non è esattamente quello che speravo, ma al limite me lo faccio andare bene.
Mi sembra di capire che l’alternativa è usare comandi TeX per definire il tutto, giusto?
Se non spieghi che cosa vuoi fare, che pretendi? 🙂
Ciao
Enrico
-
29 Agosto 2010 alle 15:28 #48857::
Se non spieghi che cosa vuoi fare, che pretendi? 🙂
Va bene… non si riescono a mantenere segreti, in questo forum 🙄
😀
In pratica vorrei avere a disposizione questi 2 comandi:
`
\makecolorbox{colore}[ampiezza][c|l|r|s]{testo}\framecolorbox{colore_cornice}{colore_sfondo}[ampiezza][c|l|r|s]{testo}
`
Ho scelto una sintassi che sia la più simile possibile a quella degli altri *box esistenti.
-
29 Agosto 2010 alle 17:08 #48858::
Se non spieghi che cosa vuoi fare, che pretendi? 🙂
Va bene… non si riescono a mantenere segreti, in questo forum 🙄
😀
In pratica vorrei avere a disposizione questi 2 comandi:
`
\makecolorbox{colore}[ampiezza][c|l|r|s]{testo}\framecolorbox{colore_cornice}{colore_sfondo}[ampiezza][c|l|r|s]{testo}
`
Ho scelto una sintassi che sia la più simile possibile a quella degli altri *box esistenti.Ecco come si può fare con xparse:
`\documentclass[a4paper]{article}
\usepackage{color,xparse}
\DeclareDocumentCommand\makecolorbox{o m O{\width} O{c} m}{%
\IfNoValueTF{#1}{\colorbox{#2}}{\colorbox[#1]{#2}}%
{\makebox[#3][#4]{#5}}}\DeclareDocumentCommand\framecolorbox{o m m O{\width} O{c} m}{%
\IfNoValueTF{#1}{\fcolorbox{#2}{#3}}{\fcolorbox[#1]{#2}{#3}}%
{\makebox[#4][#5]{#6}}}\begin{document}
\makecolorbox{green}{Abc}\makecolorbox{green}[3cm]{Abc}
\makecolorbox{green}[3cm][l]{Abc}
\makecolorbox[rgb]{0,0,1}{Abc}
\makecolorbox[rgb]{0,0,1}[3cm]{Abc}
\makecolorbox[rgb]{0,0,1}[3cm][l]{Abc}
\framecolorbox{green}{red}{Abc}
\framecolorbox{green}{red}[3cm]{Abc}
\framecolorbox{green}{red}[3cm][l]{Abc}
\framecolorbox[rgb]{0,0,1}{1,0,0}{Abc}
\framecolorbox[rgb]{0,0,1}{1,0,0}[3cm]{Abc}
\framecolorbox[rgb]{0,0,1}{1,0,0}[3cm][l]{Abc}
\end{document}`
Davvero potente.Ciao
Enrico
-
29 Agosto 2010 alle 17:39 #48859
-
29 Agosto 2010 alle 17:52 #48860::
Grazie!
Non è però normale, questo risultato, vero?
No, a me viene come previsto. Controlla di aver copiato correttamente.
Ciao
Enrico
-
29 Agosto 2010 alle 20:54 #48861
-
29 Agosto 2010 alle 21:08 #48862::
Solo una cosina: al comando \framecolorbox bisogna con ogni probabilità togliere 2 volte \fboxrule come larghezza, e ad entrambi i comandi 2*\fboxsep.[EDIT]
Ecco il codice patchato:
`
\RequirePackage{color,xparse,calc}
\DeclareDocumentCommand\makecolorbox{o m O{\width} O{c} m}{%
\IfNoValueTF{#1}{\colorbox{#2}}{\colorbox[#1]{#2}}%
{\makebox[#3-2\fboxsep][#4]{#5}}}
\DeclareDocumentCommand\framecolorbox{o m m O{\width} O{c} m}{%
\IfNoValueTF{#1}{\fcolorbox{#2}{#3}}{\fcolorbox[#1]{#2}{#3}}%
{\makebox[#4-2\fboxsep-2\fboxrule][#5]{#6}}}
`Grazie ancora!
-
29 Agosto 2010 alle 21:13 #48863
-
29 Agosto 2010 alle 21:16 #48864
-
29 Agosto 2010 alle 21:26 #48865::
Prova
`
\framecolorbox{black}{red}[\columnwidth]{prova}
\\
\makecolorbox{red}[\columnwidth]{prova}
`
col codice patchato che ho postato poco sopra, e vedrai che viene giusto al pixel.Avresti lo stesso problema con \framebox[\columnwidth]{abc}; si sa che \framebox (come \fcolorbox) aggiunge i bordi all’esterno. Quegli aggiustamenti vanno fatti nella dimensione passata come argomento; naturalmente puoi definirti i comandi come vuoi, ma in generale è meglio se comandi simili hanno comportamenti simili.
Ciao
Enrico
-
29 Agosto 2010 alle 21:32 #48866
-
29 Agosto 2010 alle 21:50 #48867::
Avresti lo stesso problema con \framebox[\columnwidth]{abc}
No…
Questo è il codice (con i comandi ridefiniti da me):
`
\framecolorbox{black}{red}[\columnwidth]{prova}
\\
\makecolorbox{red}[\columnwidth]{prova}
\\
\framebox[\columnwidth]{abc}
`Come risulta dalla documentazione di color (grfguide.pdf), \colorbox aggiunge \fboxsep alle dimensioni (sopra, sotto, a destra e a sinistra). E ci sono ottimi motivi per farlo. Poi decidi tu.
Ciao
Enrico
-
31 Agosto 2010 alle 21:54 #48868
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.