Ciao a tutti. Per comporre codici “fianco a fianco” uso l’ambiente ad hoc sidebyside, che ha un difetto: se una riga di codice sorgente contiene tanti caratteri quanti ne può contenere, viene creata (sempre nel sorgente) una riga vuota inutile in più. Un esempio:
`\documentclass[10pt]{scrreprt}\usepackage[writefile]{listings}
\usepackage{classicthesis-ldpkg}
\usepackage[beramono]{classicthesis}\lstset{language=[LaTeX]Tex,
keywordstyle=\color{RoyalBlue},
basicstyle=\normalfont\ttfamily,
showstringspaces=false,
breaklines=true,
frame=lines,
flexiblecolumns=true
}\lstset{extendedchars}
\makeatletter
\lstnewenvironment{sidebyside}{%
\global\let\lst@intname\@empty
\setbox\z@=\hbox\bgroup
\setkeys{lst}{columns=fullflexible,%
linewidth=0.45\linewidth,keepspaces=true,%
breaklines=true,%
breakindent=0pt,%
boxpos=t,%
basicstyle=\small\ttfamily
}%
\lst@BeginAlsoWriteFile{\jobname.tmp}%
}{%
\lst@EndWriteFile\egroup
\begin{center}%
\begin{minipage}{0.45\linewidth}%
\hbox to\linewidth{\box\z@\hss}
\end{minipage}%
\qquad
\begin{minipage}{0.45\linewidth}%
\setkeys{lst}{frame=none}%
\leavevmode \catcode`\^^M=5\relax
\small\input{\jobname.tmp}%
\end{minipage}%
\end{center}%
}
\makeatother\begin{document}
\begin{sidebyside}
L'espressione che segue
\textit{è in \textbf{neretto
corsivo}}, ma questa
\textsc{non è in
\textit{maiuscoletto corsivo}}.
\end{sidebyside}
\end{document}`
Come si può perfezionare la definizione dell’ambiente, in modo da eliminare la riga vuota superflua?
Non c’è un metodo automatico perché il problema è causato da un overfull: l’ampiezza dell’ultima riga nell’esempio è leggermente maggiore di .45\linewidth, precisamente 142.76527pt contro 140.39905pt. Non viene segnalato, immagino che listings lo faccia di proposito. Quindi ti propongo una soluzione “manuale”: metti nella definizione, al posto ovvio,
`\lstnewenvironment{sidebyside}[1][0]{%
\edef\sbs@len{\number\numexpr45+#1\relax}%
\global\let\lst@intname\@empty
\setbox\z@=\hbox\bgroup
\setkeys{lst}{columns=fullflexible,%
linewidth=0.\sbs@len\linewidth,keepspaces=true,%
breaklines=true,% `
Quando ti accorgi di un problema di quel tipo, puoi scrivere
`\begin{sidebyside}[1]`
che aumenterà a 0.46 la frazione usata di \linewidth e, nel caso specifico, è sufficiente.
La posizione della parte di destra (cioè l’esempio compilato) rimane la stessa. Non userei più di 2 o 3 nell’argomento facoltativo.
Si potrebbe forse arrivare a un controllo più fine usando “\numexpr450+#1”: nel caso dell’esempio, in effetti, basterebbe 0.458\linewidth invece di 0.46\linewidth. Non mi pare sia il caso di andare a un livello di dettaglio così elevato.
Naturalmente ottieni il risultato voluto semplicemente scrivendo “breaklines=false” nella definizione dell’ambiente sidebyside. Sono certo che avessi già valutato e scartato questa soluzione. 🙂
Ciao
Enrico