Newsgroup: it.comp.software.tex
Titolo: Problemino con newenvironment

Non riesco a capire cosa ci sia di sbagliato in questo codice:
\documentclass[a4paper,ngerman,utf8]{memoir}
\usepackage{babel}
\usepackage{inputenc}
\usepackage[T1]{fontenc}
\newenvironment{mytable}[1]{
\begin{table}[htb]
\begin{center}
\begin{tabular}{rl}
}{
\end{tabular}
\caption{#1}
\end{center}
\end{table}
}
\begin{document}
\chapter{Fondamentali} 
\section{Verb}
\begin{mytable}{prova}
a & b \\
c & d \\
\end{mytable}
\end{document}
Qualcuno puň aiutarmi? Grazie
-- 
Andrea Bergia

 
Vedi se in questo modo può andar bene lo stesso:
\newenvironment{mytable}[1]
{
\begin{table}[htb]
\begin{center}
\caption{#1}
\begin{tabular}{rl}
}
{
\end{tabular}
\end{center}
\end{table}
}
Se possibile, in newenvironment, passa gli argomenti nella prima parte.
-- 
Simone Sollena
ICQ: #147054457    LU: #391947  LM: #292854
http://cerchietto.wordpress.com

 Se possibile, in newenvironment, passa gli argomenti nella prima parte.
Così funziona, pertanto cambio la domanda: perché?
-- 
Andrea Bergia

 
Non so perché newenvironment funzioni in questo modo.
Sono riuscito a risponderti solo perché proprio ieri, cercando su 
google, avevo letto di un problema simile, in un vecchio thread su 
questo stesso gruppo. Ecco il link:
http://tinyurl.com/2e82cm


 Qualcuno può aiutarmi? Grazie
C'è di sbagliato che vuoi usare uno degli argomenti nella parte di 
chiusura dell'ambiente. Simone ti ha già segnalato una lunga discussione
dove spiegavo come fare. Nel tuo caso la soluzione è semplice:
\newenvironment{mytable}[1][htb]
  {\begin{table}[#1]\centering}
  {\end{table}}
Da usare così:
\begin{mytable}
\begin{tabular}{...}
...
\end{tabular}
\caption{...}\label{...}
\end{mytable}
Non guadagni quasi nulla in numero di caratteri con la tua definizione;
scrivendo il codice esplicitamente, per esempio, puoi andare in cerca di
tutti i testi di didascalie tramite \caption. Se invece ti definisci
mytable e myfigure, devi fare ricerche multiple.
Occhio a \centering, non \begin{center}...\end{center}, negli ambienti
figure e table.
Ciao
Enrico

 figure e table.
Grazie!
-- 
Andrea Bergia

 Ok, grazie. Ma perché questa limitazione?
\newenvironment prende tre argomenti obbligatori e due opzionali:
\newenvironment{<nome>}[<n>][<default>]{<inizio>}{<fine>}
dove <nome> è il nome dell'ambiente da definire, <n> il numero di 
argomenti, [<default>] il valore da assegnare al primo argomento che
è, in questo caso, opzionale; <inizio> e <fine> sono ciò che deve essere
eseguito all'apertura e alla chiusura dell'ambiente.
Di fatto questo comando esegue due definizioni, più o meno equivalenti a
\newcommand{\<nome>}[<n>][<default>]{<inizio>}
\newcommand{\end<nome>}{<fine>}
Il comando \begin{<nome>} esegue alcuni compiti di routine e poi chiama
esegue \<nome>; il comando \end{<nome>} esegue certi compiti di routine
e poi chiama \end<nome>.
Vedi bene adesso che non è possibile definire \end<nome> con argomenti;
quindi, senza il trucco di definirsi comandi appositi, non è possibile
passarne alla parte di chiusura. Può darsi che si possa fare, con un
codice più complicato nel nucleo di LaTeX, ma così è adesso e non ci si 
può fare molto.
La tecnica per superare la limitazione è nota:
\newcommand{\pippoinner}{}
\newenvironment{pippo}[1]
  {\renewcommand{\pippoinner}{#1}...}
  {...\pippoinner...}
In altre parole, dove vorresti usare #1 nella parte di chiusura,
usi \pippoinner.
Ciao
Enrico

 usi \pippoinner.
Se ho capito bene, questo significa che LaTeX valuta il \renewcommand
*ogni volta* che eseguo \begin{pippo}{pluto}? 
Come al solito, grazie mille delle lunghe spiegazioni.
-- 
Andrea Bergia

 *ogni volta* che eseguo \begin{pippo}{pluto}? 
Certo. Che c'è di male? TeX non si offende e non rallenta se non di
qualche paio di cicli di clock. Se vuoi puoi anche annidare un ambiente
"pippo" dentro l'altro, il meccanismo dei gruppi farà da sé:
% ora \pippoinner vale ""
\begin{pippo}{pluto}
% ora \pippoinner vale "pluto"
...
\begin{pippo}{paperino}
% ora \pippoinner vale "paperino"
...
\end{pippo}
% ora \pippoinner vale "pluto"
...
\end{pippo}
% ora \pippoinner vale ""
Ci sono decine di comandi che cambiano molte volte di significato
(tramite \def o \let, che non sono così diversi da \renewcommand quanto
a efficienza); potrebbe stupirti sapere che molto spesso \par non ha il
suo significato primitivo.
Per esempio, appena cominci una lista (itemize, enumerate, eccetera), 
\par assume il seguente significato:
\if@newlist 
  \advance \par@deathcycles \@ne
  \ifnum \par@deathcycles >\@m 
    \@noitemerr{\@@par}%
  \fi
\else
  {\@@par}%
\fi
Ciao
Enrico

 Certo. Che c'č di male? 
Niente di male, anzi, č molto interessante come approccio. Ho chiesto
conferma in quanto č inusuale rispetto a quello che fanno gli altri
linguaggi di programmazione - o meglio, un comando non lo pensavo come
una variabile, mentre a quanto pare lo č.
Grazie dellle delucidazioni.
-- 
Andrea Bergia