- Questo topic ha 18 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 16 anni, 2 mesi fa da
egreg9.
-
CreatoreTopic
-
3 Aprile 2008 alle 15:16 #23387::
Vorrei creare un comando che accetta opzioni, come per esempio il \makebox.
Nella sintassi di \newcommand è prevista la possibilità di inserire un valore di default ma non la possibilità di fornire oltre al valore principale anche più opzioni in grado di modificare il comportamento.Per fare un esempio, vorrei poter disporre nel corpo del documento di un comando tipo:
`
\destinatario[e p.c.]{Egregio \textbf{Destinatario Lettera}}
`
Come potrei fare?
Grazie.
-
CreatoreTopic
-
AutoreRisposte
-
-
3 Aprile 2008 alle 16:05 #23388::
Vorrei creare un comando che accetta opzioni, come per esempio il \makebox.
Nella sintassi di \newcommand è prevista la possibilità di inserire un valore di default ma non la possibilità di fornire oltre al valore principale anche più opzioni in grado di modificare il comportamento.Per fare un esempio, vorrei poter disporre nel corpo del documento di un comando tipo:
`
\destinatario[e p.c.]{Egregio \textbf{Destinatario Lettera}}
`Non è molto chiaro quello che desideri. Puoi essere meno laconico?
Ciao
Enrico
-
4 Aprile 2008 alle 7:32 #23389::
Scusate, mi esprimo diversamente:vorrei conoscere il modo di costruire nuovi comandi LaTeX a cui poter inviare un argomento opzionale.
Nelle definizioni con \newcommand ciò non mi sembra possibile.Per esempio, ammettiamo di voler costruire un nuovo comando per inserire la firma al termine di una lettera. Tale firma sia composta su due righe, la prima contenente il testo del ruolo e la seconda il testo del nominativo. Eccone un frammento di possibile codice:
`\newcommand{\stileruolo}[1]{{\fontfamily{ptm}\selectfont\textsc{#1}}}
\newcommand{\stilenominativo}[1]{#1}%definizione dei comandi per le firme della lettera **********************
\newcommand{\firma}[2]{%
\begin{tabular}{*{2}{p{8cm}}}
& \makebox[8cm][c]{\stileruolo{#1}}\\
& \makebox[8cm][c]{\stilenominativo{#2}}\\
\end{tabular}\vspace*{0.62cm}}`Un esempio di utilizzo del comando è questo:
\firma{Il Direttore}{Dott. Paperino Paolo}Bene, ma adesso vorrei poter inserire l’opzione: una sigla ad inizio della prima riga.
La sigla è un breve testo di riferimento che potrebbe esserci oppure no.Il comando completo dovrebbe quindi essere questo:
\firma[/MD/MF]{Il Direttore}{Dott. Paperino Paolo}che aggiungerebbe la sigla all’inizio della stessa linea di paragrafo del
in uno stile da stabilire (probabilmente a caratteri un poco più piccoli del normale). In realtà il problema delle firme alla fine della lettera è più complesso poiché vi sono i seguenti casi:
1 – firma unica sulla destra con o senza sigla
2 – firma doppia una a sinistra ed una a destra con o senza sigla
3 – firma tripla ovvero una firma doppia con sottostante firma centraleSto lavorando infatti, ad un modello di lettera aziendale che dovrebbe sfociare in un pacchetto molto semplice, così da superare oltre che naturalmente in qualità, anche in efficienza il lavoro che si fa con il file MS Word ufficiale “carta intestata.doc”.
[OT]Scrivere una lettera aziendale con LaTeX è una vera follia, ma come dice Edoardo Bennato in “L’isola che non c’è” :
E ti prendono in giro
se continui a cercarla,
ma non darti per vinto perché
chi ci ha già rinunciato
e ti ride alle spalle
forse è ancora più pazzo di te![OT]Grazie (scusate l’OT).
-
4 Aprile 2008 alle 8:04 #23390::
Scusate, mi esprimo diversamente:
vorrei conoscere il modo di costruire nuovi comandi LaTeX a cui poter inviare un argomento opzionale.
Nelle definizioni con \newcommand ciò non mi sembra possibile.Per esempio, ammettiamo di voler costruire un nuovo comando per inserire la firma al termine di una lettera. Tale firma sia composta su due righe, la prima contenente il testo del ruolo e la seconda il testo del nominativo. Eccone un frammento di possibile codice:
`\newcommand{\stileruolo}[1]{{\fontfamily{ptm}\selectfont\textsc{#1}}}
\newcommand{\stilenominativo}[1]{#1}%definizione dei comandi per le firme della lettera **********************
\newcommand{\firma}[2]{%
\begin{tabular}{*{2}{p{8cm}}}
& \makebox[8cm][c]{\stileruolo{#1}}\\
& \makebox[8cm][c]{\stilenominativo{#2}}\\
\end{tabular}\vspace*{0.62cm}}`Un esempio di utilizzo del comando è questo:
\firma{Il Direttore}{Dott. Paperino Paolo}Bene, ma adesso vorrei poter inserire l’opzione: una sigla ad inizio della prima riga.
La sigla è un breve testo di riferimento che potrebbe esserci oppure no.Il comando completo dovrebbe quindi essere questo:
\firma[/MD/MF]{Il Direttore}{Dott. Paperino Paolo}che aggiungerebbe la sigla all’inizio della stessa linea di paragrafo del
in uno stile da stabilire (probabilmente a caratteri un poco più piccoli del normale). In realtà il problema delle firme alla fine della lettera è più complesso poiché vi sono i seguenti casi:
1 – firma unica sulla destra con o senza sigla
2 – firma doppia una a sinistra ed una a destra con o senza sigla
3 – firma tripla ovvero una firma doppia con sottostante firma centraleSto lavorando infatti, ad un modello di lettera aziendale che dovrebbe sfociare in un pacchetto molto semplice, così da superare oltre che naturalmente in qualità, anche in efficienza il lavoro che si fa con il file MS Word ufficiale “carta intestata.doc”.
Non è affatto chiaro dove debba andare quella fantomatica sigla, né perché ti contorci tanto con quel tabular:
`\newcommand{\firma}[3][]{\hspace*{8cm}%
\makebox[8cm][c]{%
\begin{tabular}{c}
\stileruolo{#2}\\
\stilenominativo{#3}
\end{tabular}%
}
}`
Questo comando non fa nulla con l’argomento opzionale. Fa’ un esempio di dove lo vuoi con precisione e se ne riparla.Ma ce li hai sedici centimetri di giustezza? Se vuoi che la firma sia allineata al margine destro, non occorre fare conti per sistemarla.
Ciao
Enrico
-
4 Aprile 2008 alle 8:58 #23391::
Questo comando non fa nulla con l’argomento opzionale. Fa’ un esempio di dove lo vuoi con precisione e se ne riparla.
EnricoBe, certo che non ha nulla dell’argomento opzionale per il semplice fatto che non so come renderlo opzionale ed è l’argomento di questo topic.
Il comando con la sigla “fissa” potrebbe essere:
`\newcommand{\firma}[3]{%
\begin{tabular}{*{2}{p{8cm}}}%
\makebox[8cm][l]{\small{#1}} & \makebox[8cm][c]{\stileruolo{#2}}\\%
& \makebox[8cm][c]{\stilenominativo{#3}}\\%
\end{tabular}\vspace*{0.62cm}}`Da utilizzare in caso di assenza di sigla così:
`\firma{}{Il Direttore}{Dott. Paperino Paolo}`
e non così:
`\firma{Il Direttore}{Dott. Paperino Paolo}`Ma ce li hai sedici centimetri di giustezza? Se vuoi che la firma sia allineata al margine destro, non occorre fare conti per sistemarla.
Come argomento secondario, ti preciso che il tabular mi serve per ottenere i due testi,
e , centrati sullo stesso asse che è spostato verso destra nella pagina.
Pagina che è larga complessivamente circa 512pt, la stessa del modello in word (il corpo della lettera naturalmente è più stretto vedi: http://www.guit.sssup.it/phpbb/viewtopic.php?t=4085&highlight=myquote).Ciao.
-
4 Aprile 2008 alle 9:21 #23392::
Completamento:Nel caso di firma doppia uso:
`\newcommand{\firmadoppia}[4]{%
\begin{tabular}{*{2}{p{8cm}}}%
\makebox[8cm][c]{\stileruolo{#1}} & \makebox[8cm][c]{\stileruolo{#3}}\\%
\makebox[8cm][c]{\stilenominativo{#2}} & \makebox[8cm][c]{\stilenominativo{#4}}\\%
\end{tabular}\vspace*{0.62cm}}`Per la firma centrata (che è alla fine del documento per cui non compare più il \vspace per garantire lo spazio della firma vera e propria):
`\newcommand{\firmacentrata}[2]{%
\begin{center}
\stileruolo{#1}\par
\stilenominativo{#2}
\end{center}}`
-
4 Aprile 2008 alle 10:33 #23393::
Chiedo scusa egreg9,
ho letto velocemente il tuo messaggio e ho interpretato male.Comunque ho capito che invece con \newcommand si può fare però con un solo argomento opzionale (il primo).
Ho semplificato il comando inserendo la tabella di centraggio nel box e non viceversa (concordo che questa soluzione è più semplice).
Ecco il risultato:
`\newcommand{\firma}[3][]{%
\makebox[8cm][l]{\small{#1}}%
\makebox[8cm][c]{
\begin{tabular}{c}
\stileruolo{#2}\\
\stilenominativo{#3}\\
\end{tabular}
}\vspace*{0.62cm}
}`
da usare così:
`\firma[\DF\GH]{Il Ruolo}{Dott. Nome Cognome}`
o così`\firma{Il Ruolo}{Dott. Nome Cognome}`
Grazie.
-
4 Aprile 2008 alle 12:07 #23394::
Questo comando non fa nulla con l’argomento opzionale. Fa’ un esempio di dove lo vuoi con precisione e se ne riparla.
EnricoBe, certo che non ha nulla dell’argomento opzionale per il semplice fatto che non so come renderlo opzionale ed è l’argomento di questo topic.
Sintassi:
`\newcommand[][ ]{ }`
Nella seconda coppia di parentesi quadre va il valore di default dell’argomento opzionale, al quale ci si riferisce come al parametro #1.Adesso proviamo a scrivere un codice per te.
`\newcommand{\stileruolo}[1]{{\fontfamily{ptm}\selectfont\textsc{#1}}}
\newcommand{\stilenominativo}[1]{#1}
\newcommand{\firmabox}[1]{\makebox[.333\textwidth]{\hss#1\hss}}\newcommand{\componifirma}[2]{%
\begin{tabular}[t]{@{}c@{}}
\firmabox{\stileruolo{#1}}\\
\firmabox{\stilenominativo{#2}}
\end{tabular}}
\newcommand{\firmadoppia}[5][]{\par
\hbox to\hsize{%
\rlap{#1}\hfil\componifirma{#2}{#3}\hfil\componifirma{#4}{#5}}}
\newcommand{\firma}[3][]{\firmadoppia[#1]{}{}{#2}{#3}}
\newcommand\firmatripla[7][]{\firmadoppia[#1]{#2}{#3}{#4}{#5}
\medskip
\hbox to\hsize{\hfill\componifirma{#6}{#7}\hspace{.25\textwidth}}}`
Ho pensato di dividere la giustezza in sei parti; nella prima, ma senza che si occupi spazio (\rlap} va la sigletta opzionale; poi due parti dedicate alla firma di sinistra, una parte vuota e per finire le due dedicate alla firma di destra (che diventa l’unica con il comando \firma).La terza firma sta a metà fra le altre due (un po’ di aritmetica dice che deve stare a un quarto della giustezza dal margine destro.
Puoi aggiustare le spaziature verticali a piacere.
\firmabox è definito in modo che se per caso il nome o la carica sono più grandi dello spazio riservato (un terzo della giustezza), non fa nulla. Ma se un nome è davvero troppo lungo, andrà a sovrapporsi con il margine o con l’altra firma.
Ciao
Enrico
-
7 Aprile 2008 alle 7:24 #23395::
Bene grazie,
ci lavorerò un po’ su, anche per capire il funzionamento dei comandi TeX da te usati nell’ultimo codice.Nel frattempo vorrei tornare al problema dei parametri opzionali:
A volte non riesco a vedere alla prima la sintassi dei comandi. Solo con tentativi e approfondimenti ulteriori riesco a chiarirmi il codice, questa volta di \newcommand.Nella sintassi infatti non mi era chiaro se l’argomento opzionale possa essere utilizzato specificandolo tra parentesi quadre oppure graffe.
Io l’avevo inteso con le parentesi graffe e questo non raggiungeva l’obiettivo che mi ero preposto:
`\nuovocomando[opzione]{testo per il secondo argomento del comando}`
Chiarito il caso di una sola opzione per \newcommand, rimane il problema multiplo, ovvero implementare un comando con più opzioni, preferibilmente da specificare in ordine singolo tra parentesi quadre, così:
`\nuovocomando[opzione1][opzione2]…[opzionen]{testo di input al comando}`Per esempio, vorrei che il comando \firma avesse l’ulteriore opzione [lineabase] con funzionamento si/no, per disegnare una \rule di appoggio della firma autografa centrata ed alla distanza guista.
`\firma[\fj\fp][lineabase]{Ruolo}{Nome}`[OT] a migliore spiegazione:
Avrei almeno un’altra dozzina di argomenti da approfondire per giungere ad un codice soddisfacente, ma dovrò prima impiegare tempo per costruire una semplice e razionale “interfaccia” da esporre all’utente che dovrà essere solo successivamente implementata.
Per esempio, le lettere in mail merge, la possibilità di specificare più indirizzi, la possibilità di abbreviare con semplici comandi i nomi dei firmatari con rispettivo ruolo (che può cambiare di volta in volta), l’aspetto della prima pagina della lettera rispetto a quello delle successive, far si che il codice compia dei tentativi per raccogliere la lettera in un unica pagina, gestione della formula di saluto, nuovo environment per la lista degli allegati alla lettera, automatizzare la costruzione di certe tabelle economiche, ecc.
Il più interessante problema mi sembra quello delle lettere multiple (si lo sò esiste il pacchetto envlab), e quello relativo a come l’utente possa fornire le informazioni dei destinatari.
Già che ho messo a dura prova la vostra pazienza, vi accenno ad un altra idea che vorrei sviluppare: un pacchetto per la compilazione di etichette complesse progettabili liberamente dall’utente.Grazie.
-
7 Aprile 2008 alle 11:32 #23396::
Bene grazie,
ci lavorerò un po’ su, anche per capire il funzionamento dei comandi TeX da te usati nell’ultimo codice.Nel frattempo vorrei tornare al problema dei parametri opzionali:
A volte non riesco a vedere alla prima la sintassi dei comandi. Solo con tentativi e approfondimenti ulteriori riesco a chiarirmi il codice, questa volta di \newcommand.Nella sintassi infatti non mi era chiaro se l’argomento opzionale possa essere utilizzato specificandolo tra parentesi quadre oppure graffe.
Io l’avevo inteso con le parentesi graffe e questo non raggiungeva l’obiettivo che mi ero preposto:
`\nuovocomando[opzione]{testo per il secondo argomento del comando}`
Chiarito il caso di una sola opzione per \newcommand, rimane il problema multiplo, ovvero implementare un comando con più opzioni, preferibilmente da specificare in ordine singolo tra parentesi quadre, così:
`\nuovocomando[opzione1][opzione2]…[opzionen]{testo di input al comando}`Non funziona: se l’opzione1 non c’è, come fai? A quel punto dovresti sempre mettere tutte le coppie di quadre, che non ha molto senso.
Guarda la macro \makebox: ha due argomenti opzionali, ma il secondo ha senso solo se c’è il primo. Nel tuo caso questo andrebbe a pallino.
Per questo tipo di situazioni bisogna ricorrere al sistema “chiave=valore” come per le opzioni a \includegraphics. Il pacchetto da usare è keyval oppure xkeyval.
Rimando a dopo, adesso devo fuggire al treno. 👿
Ciao
Enrico
-
7 Aprile 2008 alle 21:30 #23397::
Rimando a dopo, adesso devo fuggire al treno. 👿
Eccomi qui. Adesso vediamo un po’ di cose: come ti ho detto, più argomenti opzionali sono da escludere. La sintassi preferibile è
`\firma{Il Direttore Galattico}{Lupo de Lupis}
\firma[sigla=/ab/cd]{Il Direttore Galattico}{Lupo de Lupis}
\firma[sigla=/ab/cd,lineabase]{Il Direttore Galattico}{Lupo de Lupis}
\firma[lineabase]{Il Direttore Galattico}{Lupo de Lupis}`
e dovrebbe essere chiaro ciò che si intende; per \firmadoppia e \firmatripla basta aggiungere gli opportuni argomenti opzionali. Ecco il codice, occorre il pacchetto xkeyval (basta anche keyval, ma conviene usare il più potente):
`\usepackage{xkeyval}\newcommand{\stileruolo}[1]{{\fontfamily{ptm}\selectfont\textsc{#1}}}
\newcommand{\stilenominativo}[1]{#1}
\newcommand{\firmabox}[1]{\makebox[.333\textwidth]{\hss#1\hss}}\newcommand{\componifirma}[2]{%
\begin{tabular}[t]{@{}c@{}}
\firmabox{\stileruolo{#1}}\\
\firmabox{\stilenominativo{#2}}
\iflineabase\\\rule{0pt}{1cm}\rule{.333\textwidth}{0.4pt}\fi
\end{tabular}}\makeatletter
\newif\iflineabase
\def\sigla{}
\define@key{firma}{sigla}{\def\sigla{#1}}
\define@key{firma}{lineabase}[true]{\lineabasetrue}
\makeatother\newcommand{\firmadoppia}[5][]{\setkeys{firma}{#1}\par
\hbox to\hsize{%
\rlap{\sigla}\hfil
\ifsingola\expandafter\phantom\fi
{\componifirma{#2}{#3}}\hfil\componifirma{#4}{#5}}}\newcommand{\firma}[3][]{\firmadoppia[#1]{}{}{#2}{#3}}
\newcommand\firmatripla[7][]{\firmadoppia[#1]{#2}{#3}{#4}{#5}
\medskip
\hbox to\hsize{\hfill\componifirma{#6}{#7}\hspace{.25\textwidth}}}`
Non ci sono grandi differenze da quello di prima. L’unica cosa è modificare dove si pone la sigla, che viene definita tramite la chiave. Ho anche aggiunto il condizionale che è normalmente falso (quindi la linea non viene composta). Se viene data l’opzione “lineabase” invece il condizionale diventa vero e la linea esce.Dopo tutto non è così difficile. Se hai altre opzioni si tratta di capire come realizzarle.
C’è solo un altro bieco trucco: se la firma è singola e si deve comporre la linea di base, occorre evitare che venga anche quella sulla prima; con quel \phantom si ottiene ciò che si vuole: il comando \firma attiva lo switch \ifsingola; se questo è vero entra in azione \phantom che vede il \componifirma relativo alla prima firma come argomento. Se invece siamo con \singolafalse, come è usuale, la coppia di graffe non fa male.
Non che il tutto mi piaccia tantissimo, probabilmente bisognerebbe ripensare alla faccenda da capo. Ma è un punto di partenza per capire come funziona l’interfaccia “chiave=valore”.
Ciao
Enrico
-
8 Aprile 2008 alle 7:02 #23398::
grazie mille per il codice,direi che ne posso trarre due conclusioni:
la prima è che la fretta non si sposa bene con LaTeX ed amici (ed infatti tra l’altro non mi sono accorto dei problemi impliciti al comando con più di una opzione).la seconda è questa: è utile se non indispensabile conoscere i comandi di TeX quando si pensa di scrivere codice di pacchetto, almeno a giudicare dall’esempio dei vari comandi \firma.
per tornare al problema delle firme userò questa strategia:
1 studio del pacchetto xkeyval/keyval;
2 lavorare alla comprensione del codice TeX incluso nell’esempio;
3 sperimentare il {\centering \parbox{ruolo \par nominativo}} in sostituzione del tabular.… una domanda,
ma conviene sostituire l’istruzione TeX \def per la definizione dei comandi con una forma equivalente in LaTeX?
-
8 Aprile 2008 alle 8:35 #23399::
… una domanda,
ma conviene sostituire l’istruzione TeX \def per la definizione dei comandi con una forma equivalente in LaTeX?A volte sì a volte no. Per le macro che hanno un argomento opzionale è di sicuro più comodo \newcommand; in altri casi uso \def senza troppo preoccuparmi, forse sbagliando. In genere è meglio usare \newcommand per i comandi a livello utente le cui definizioni vadano nel preambolo. Per il resto è più che altro questione di gusti.
Ciao
Enrico
-
20 Giugno 2010 alle 18:49 #23400
-
20 Giugno 2010 alle 19:19 #23401::
Ho provato a usare il codice di egreg, ma non compila (miktex 2.8 su windows XP).
Se commento la linea \ifsingola\expandafter\phantom\fi riesco a compilare, ma se ho selezionato l’opzione lineabase il comando esegue la linea anche per la prima firma.
Dov’è l’errore?Non ho errori; effettivamente l’opzione lineabase così com’è non funziona. 🙁 Occorre sostituire l’ovvia riga con
`\define@key{firma}{lineabase}[false]{\@nameuse{lineabase#1}}`
e chiamare l’opzione come “lineabase=true” se vuoi la riga.Ciao
Enrico
-
21 Giugno 2010 alle 6:32 #23402
-
21 Giugno 2010 alle 9:03 #23403::
Come prima, se non commento la linea contenente \ifseingola non riesco a compilare e se lo faccio mi rimane la linea sotto la prima firma…
Ma dov’è definito \ifsingola?Evidentemente è saltata dal copia-incolla: subito dopo \makeatletter metti \newif\ifsingola.
`\documentclass[a4paper,draft]{article}
\usepackage{lipsum,calc,xkeyval}\newcommand{\stileruolo}[1]{{\fontfamily{ptm}\selectfont\textsc{#1}}}
\newcommand{\stilenominativo}[1]{#1}
\newcommand{\firmabox}[1]{\makebox[.333\textwidth]{\hss#1\hss}}\newcommand{\componifirma}[2]{%
\begin{tabular}[t]{@{}c@{}}
\firmabox{\stileruolo{#1}}\\
\firmabox{\stilenominativo{#2}}
\iflineabase\\\rule{0pt}{1cm}\rule{.333\textwidth}{0.4pt}\fi
\end{tabular}}\makeatletter
\newif\ifsingola
\newif\iflineabase
\def\sigla{}
\define@key{firma}{sigla}{\def\sigla{#1}}
\define@key{firma}{lineabase}[false]{\@nameuse{lineabase#1}}
\makeatother\newcommand{\firmadoppia}[5][]{\setkeys{firma}{#1}\par
% \expandafter\show\csname iflineabase\endcsname % per debug
\hbox to\hsize{%
\rlap{\sigla}\hfil
\ifsingola\expandafter\phantom\fi
{\componifirma{#2}{#3}}\hfil\componifirma{#4}{#5}}}\newcommand{\firma}[3][]{\singolatrue\firmadoppia[#1]{}{}{#2}{#3}}
\newcommand\firmatripla[7][]{\firmadoppia[#1]{#2}{#3}{#4}{#5}
\medskip
\hbox to\hsize{\hfill\componifirma{#6}{#7}\hspace{.25\textwidth}}}\begin{document}
\firmatripla[lineabase=true]
{Il Direttore Galattico}{Dott. Paperino Paolo}
{Il Direttore}{Dott. Paperino Paolo}
{Il Direttore}{Dott. Paperino Paolo}\firmadoppia
{Il Direttore}{Dott. Paperino Paolo}
{Il Direttore}{Dott. Paperino Paolo}\firma
{Il Direttore}{Dott. Paperino Paolo}\firma{Il Direttore Galattico}{Lupo de Lupis}
\firma[sigla=/ab/cd]{Il Direttore Galattico}{Lupo de Lupis}
\firma[sigla=/ab/cd,lineabase]{Il Direttore Galattico}{Lupo de Lupis}
\firma[lineabase=true]{Il Direttore Galattico}{Lupo de Lupis}\end{document}`
Ciao
Enrico
-
21 Giugno 2010 alle 10:29 #23404
-
21 Giugno 2010 alle 10:47 #23405
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.