Ricapitoliamo. La sintassi del comando \lstnewenvironment è la seguente (copiata pari pari dalla doc. di listings):
`\lstnewenvironment
{}[ ][ ]
{}
{}`
Allora, il primo parametro opzionale di \lstnewenvironment, [], rappresenta -se ho ben capito- il numero di argomenti dell’ambiente così definito. In assenza del secondo parametro, [ ], tale numero indica il numero di argomenti obbligatori dell’ambiente . Il secondo parametro opzionale, [
], rappresenta invece il numero di argomenti che può avere l’ambiente . Se vuoto, l’ambiente può anche essere invocato senza alcun argomento. In realtà, sono in alto mare, e non ci sto capendo molto. Per tradurre al meglio quell'[
] (“argomenti opzionali predefiniti?” Boh…) devo capirci di più. Insomma, rem tene, verba sequentur. E io qui la “rem” non la “tengo” affatto… 😳 😥
La sintassi è identica a quella di \newenvironment. Davvero, lo giuro sul mio onore (citazione da Don Giovanni, musica di W. A. Mozart, libretto di L. Da Ponte, naturalmente).
Il comando \lstnewenvironment ha due argomenti opzionali e due argomenti obbligatori. Il primo argomento opzionale indica il numero di argomenti che avrà l’ambiente che si sta definendo. Se compare il secondo argomento opzionale, l’ambiente che si sta definendo avrà un argomento opzionale, il cui valore di default è proprio il contenuto del secondo argomento opzionale a \lstnewenvironment. Vediamo alcuni esempi; in ognuno do la definizione e i modi di uso.
(1) Ambiente per codice Pascal con didascalia obbligatoria, nessuna possibilità di modificare le opzioni predefinite
`\lstnewenvironment{pascalx}[1]
{\lstset{language=pascal,caption={#1}}{}
\begin{pascalx}{Codice importante}
program …
\end{pascalx}`
(2) Ambiente per codice Pascal con didascalia obbligatoria, e possibilità di modificare le opzioni predefinite
`\lstnewenvironment{pascaly}[2][]
{\lstset{language=pascal,caption={#2},#1}{}
\begin{pascaly}{Codice importante}
program …
\end{pascaly}
\begin{pascaly}[float]{Codice importante}
program …
\end{pascaly}`
A differenza del caso precedente, con l’argomento opzionale puoi aggiungere opzioni da valutare in \lstset; nella definizione (ma solo nella parte “start”) puoi riferirti all’argomento opzionale con #1, agli argomenti obbligatori con #2 e seguenti (se ce n’è più di uno).
Con la prima chiamata l’argomento sostituito al parametro #1 è vuoto, perché questo è il valore di default. Con la seconda chiamata fra le chiavi valutate in \lstset c’è anche “float”.
(3) Ambiente per codice Pascal con didascalia “facoltativa”, senza possibilità di modificare le opzioni predefinite
`\lstnewenvironment{pascalz}[1][Codice Pascal]
{\lstset{language=pascal,caption={#1}}{}
\begin{pascalz}
program …
\end{pascalz}
\begin{pascalz}[Codice Pascal importante]
program …
\end{pascalz}`
Nel primo esempio di uso la didascalia sarà quella “standard”, cioè “Codice Pascal”; nel secondo invece la didascalia sarà “Codice Pascal importante”.
Noto solo ora che nell’Arte manca proprio la parte della descrizione di \newcommand e \newenvironment relativa alla definizione di comandi e ambienti con argomento opzionale. Mi pare una mancanza significativa; c’è perfino sulla “(mica tanto) breve introduzione”.
Ciao
Enrico