Perfezionare sidebyside

  • Creatore
    Topic
  • #44002
    lorenzo.pantieri
    Partecipante
      Up
      0
      Down
      ::


      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?

      Grazie mille,
      L.

    Visualizzazione 2 filoni di risposte
    • Autore
      Risposte
      • #44003
        Up
        0
        Down
        ::

        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

      • #44004
        lorenzo.pantieri
        Partecipante
          Up
          0
          Down
          ::

          Naturalmente ottieni il risultato voluto semplicemente scrivendo “breaklines=false” nella definizione dell’ambiente sidebyside. Sono certo che avessi già valutato e scartato questa soluzione. 🙂

          Alla fine, ho fatto così! Ora è necessario spezzare a mano tutte le righe nel sorgente (pena disastri tipografici), ma l’effetto collaterale della riga in più è sparito…

          Grazie mille,
          L.

        • #44005
          Up
          0
          Down
          ::

          Naturalmente ottieni il risultato voluto semplicemente scrivendo “breaklines=false” nella definizione dell’ambiente sidebyside. Sono certo che avessi già valutato e scartato questa soluzione. 🙂

          Alla fine, ho fatto così! Ora è necessario spezzare a mano tutte le righe nel sorgente (pena disastri tipografici), ma l’effetto collaterale della riga in più è sparito…

          Purtroppo oggetti tipografici come “sidebyside” sono molto complicati da gestire in modo automatico: è complicato comporre il codice in colonne strette, come sa bene chi ha esperienza di articoli su riviste come TUGboat o ArsTeXnica (non è una critica al formato scelto, anche se a me la doppia colonna piace molto poco, ma è inevitabile se si vuole un formato di pagina A4 o simile).

          Ciao
          Enrico

      Visualizzazione 2 filoni di risposte
      • Devi essere connesso per rispondere a questo topic.

      Go to top