Re: Problema con un comando con numero variabile di argomenti

#84643
Up
0
Down
::

Amedeo” post=84057Buon pomeriggio a tutti, raccogliendo spunti da diversi contributi in rete ho composto un comando che accetta un numero variabile di argomenti per comporre una tabella di dati:

`\documentclass{book}
\begin{document}
\makeatletter
\newcommand{\McsAggiornamenti}{%
\chapter*{Aggiornamenti\markboth{Aggiornamenti}{}}
\begin{center}
\begin{tabular}{|p{0.2\textwidth}|p{0.5\textwidth}|p{0.2\textwidth}|}
\hline
\rule{0pt}{12pt}%
Data & Descrizione intervento & Autore\\
\hline
\@McsAggiornamentii % inizia la ricorsione
}
\newcommand\@McsAggiornamentii{\@ifnextchar\stopaggiornamenti{\@McsFineAggiornamenti}{\@McsAggiornamentiii}}
\newcommand\@McsAggiornamentiii[3]{%
\rule{0pt}{12pt}%
{#1} & {#2} & {#3}\\
\hline
\@McsAggiornamentii % reinizia la ricorsione
}
\newcommand\@McsFineAggiornamenti[1]{% l'argomento è \stopaggiornamenti
\end{tabular}
\end{center}
}
\makeatother

\McsAggiornamenti
{Gennaio 2013}{Bla bla bla bla}{A. Verdi}
{Febbraio 2013}{Bla bla bla bla Bla bla bla bla}{A. Rossi}
\stopaggiornamenti

\end{document}`

Il problema è che alla chiusura della tabella viene prodotta una riga extra vuota dovuta, ho pensato, alla presenza dell’argomento \stopaggiornamenti che non viene “consumato”.

C’è modo di consumare l’argomento oppure un modo migliore di gestire l’esigenza?

Grazie

gA

Eviterei questo tipo di approccio. Meglio costruirsi la tabella un pezzo alla volta.
`\documentclass{book}
\usepackage{xparse,booktabs,calc,tabularx}

\ExplSyntaxOn
\NewDocumentCommand{\McsAggiornamento}{m}
{
\keys_set:nn {mcsaggiornamenti} { #1 }
\amedeo_aggiorna:
}
\NewDocumentCommand{\StampaAggiornamenti}{ }
{
\begin{center}
\begin{tabular}{
p{.3\textwidth-2\tabcolsep}
p{.5\textwidth-2\tabcolsep}
p{.2\textwidth-2\tabcolsep}
}
\toprule
Data & Descrizione~intervento & Autore\\
\midrule
\tl_use:N \l_amedeo_aggiornamenti_tl
\bottomrule
\end{tabular}
\end{center}
\tl_clear:N \l_amedeo_aggiornamenti_tl
}

\tl_new:N \l_amedeo_aggiornamenti_tl
\keys_define:nn {mcsaggiornamenti}
{
data .tl_set:N = \l__amedeo_data_tl,
descr .tl_set:N = \l__amedeo_descr_tl,
autore .tl_set:N = \l__amedeo_autore_tl,
}
\cs_new_protected:Npn \amedeo_aggiorna:
{
\tl_put_right:NV \l_amedeo_aggiornamenti_tl \l__amedeo_data_tl
\tl_put_right:Nn \l_amedeo_aggiornamenti_tl {&}
\tl_put_right:NV \l_amedeo_aggiornamenti_tl \l__amedeo_descr_tl
\tl_put_right:Nn \l_amedeo_aggiornamenti_tl {&}
\tl_put_right:NV \l_amedeo_aggiornamenti_tl \l__amedeo_autore_tl
\tl_put_right:Nn \l_amedeo_aggiornamenti_tl {\\}
}
\ExplSyntaxOff

\begin{document}
\chapter*{Aggiornamenti\markboth{Aggiornamenti}{}}

\McsAggiornamento{
data =Gennaio 2013,
autore=A. Verdi,
descr =Bla bla bla bla,
}
\McsAggiornamento{
autore=A. Rossi,
data =Febbraio 2013,
descr =Bla bla bla bla Bla bla bla bla,
}

\StampaAggiornamenti

\end{document}`
Ogni aggiornamento ha il suo posto ed è più facile maneggiarli. Non occorre nemmeno un ordine preciso nei dati, visto che si usa una coppia “chiave-valore”.

Ciao
Enrico

Go to top