Eliminare quel dannato spazio spurio dopo \ProsodicMarksOn

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


      Carissimi, innanzitutto buona Festa! 🙂

      Questo è un documento “abbastanza” minimo.
      `\documentclass{scrreprt}
      \usepackage[writefile]{listings}
      \usepackage{classicthesis-ldpkg}
      \usepackage{classicthesis}
      \usepackage[latin,italian]{babel}
      \languageattribute{latin}{withprosodicmarks}
      \usepackage{arsclassica}

      \lstset{language=[LaTeX]Tex,
      showstringspaces=false,
      breaklines=true,
      frame=lines,
      }

      \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=false,%
      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}
      \dots testo in italiano.

      \begin{otherlanguage*}{latin}
      Gallia est omnis divisa in
      partes tres, quarum unam
      incolunt Belgae, aliam
      Aquitani, tertiam qui ipsorum
      lingua Celtae, nostra Galli
      appellantur.
      \end{otherlanguage*}
      \end{sidebyside}

      \begin{sidebyside}
      \begin{otherlanguage*}{latin}
      \ProsodicMarksOn
      ros^a \\
      ros=a
      \end{otherlanguage*}
      \end{sidebyside}

      \begin{sidebyside}
      \begin{otherlanguage*}{latin}
      \ProsodicMarksOn
      Galli^a est omn^is divis^a in
      part=es tr=es, qu=arum un^am
      inc^olunt Belgae, ali^am
      Aquitan=i, terti^am qu=i
      ips=orum lingu=a Celtae,
      nostr=a Gall=i appell=antur.
      \end{otherlanguage*}
      \end{sidebyside}

      \end{document}`
      Come vedete, la dichiarazione \ProsodicMarksOn introduce dopo di sé un fastidioso spazio spurio, che vorrei eliminare, facendo sì che il secondo e il terzo esempio non abbiano alcun rientro (proprio come il primo, che mi va benissimo).

      Mi va bene anche uno sporco trucco: che so, ridefinire localmente \ProsodicMarksOn in modo da curarlo, oppure anche ridefinire sidebyside in modo che il problema venga mascherato.

      Grazie mille,
      L.

    Visualizzazione 5 filoni di risposte
    • Autore
      Risposte
      • #57237
        Up
        0
        Down
        ::

        Carissimi, innanzitutto buona Festa! 🙂

        Questo è un documento “abbastanza” minimo.
        `\documentclass{scrreprt}
        \usepackage[writefile]{listings}
        \usepackage{classicthesis-ldpkg}
        \usepackage{classicthesis}
        \usepackage[latin,italian]{babel}
        \languageattribute{latin}{withprosodicmarks}
        \usepackage{arsclassica}

        \lstset{language=[LaTeX]Tex,
        showstringspaces=false,
        breaklines=true,
        frame=lines,
        }

        \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=false,%
        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}
        \dots testo in italiano.

        \begin{otherlanguage*}{latin}
        Gallia est omnis divisa in
        partes tres, quarum unam
        incolunt Belgae, aliam
        Aquitani, tertiam qui ipsorum
        lingua Celtae, nostra Galli
        appellantur.
        \end{otherlanguage*}
        \end{sidebyside}

        \begin{sidebyside}
        \begin{otherlanguage*}{latin}
        \ProsodicMarksOn
        ros^a \\
        ros=a
        \end{otherlanguage*}
        \end{sidebyside}

        \begin{sidebyside}
        \begin{otherlanguage*}{latin}
        \ProsodicMarksOn
        Galli^a est omn^is divis^a in
        part=es tr=es, qu=arum un^am
        inc^olunt Belgae, ali^am
        Aquitan=i, terti^am qu=i
        ips=orum lingu=a Celtae,
        nostr=a Gall=i appell=antur.
        \end{otherlanguage*}
        \end{sidebyside}

        \end{document}`
        Come vedete, la dichiarazione \ProsodicMarksOn introduce dopo di sé un fastidioso spazio spurio, che vorrei eliminare, facendo sì che il secondo e il terzo esempio non abbiano alcun rientro (proprio come il primo, che mi va benissimo).

        Mi va bene anche uno sporco trucco: che so, ridefinire localmente \ProsodicMarksOn in modo da curarlo, oppure anche ridefinire sidebyside in modo che il problema venga mascherato.

        Grazie mille,
        L.

        Ne abbiamo già discusso a lungo. Non mi pare un’ottima idea quella di consigliare un metodo che ha parecchi limiti, ora che siamo in tempi di Unicode. Naturalmente ti rendi conto che chi non ha la correzione di babel.def non avrà il risultato sperato.

        Sperando che babel.def venga corretto al più presto, ecco l’inganno per far funzionare \ProsodicMarksOn in sidebyside:
        `\lstnewenvironment{sidebyside}{%
        \addto\extraslatin{\preto\ProsodicMarksOn{\unskip}}
        \global\let\lst@intname\@empty
        …`
        Ciao
        Enrico

      • #57238
        Up
        0
        Down
        ::

        Ne abbiamo già discusso a lungo. Non mi pare un’ottima idea quella di consigliare un metodo che ha parecchi limiti, ora che siamo in tempi di Unicode. Naturalmente ti rendi conto che chi non ha la correzione di babel.def non avrà il risultato sperato.

        Sperando che babel.def venga corretto al più presto, ecco l’inganno per far funzionare \ProsodicMarksOn in sidebyside:
        `\lstnewenvironment{sidebyside}{%
        \addto\extraslatin{\preto\ProsodicMarksOn{\unskip}}
        \global\let\lst@intname\@empty
        …`
        Ciao
        Enrico

        Mi correggo: non è affatto necessaria una correzione. Il comportamento è esattamente quello che ci si aspetta: confronta con
        `testo in italiano\begin{otherlanguage*}{latin}
        \ProsodicMarksOn
        Gallia
        \end{otherlanguage*}`
        e vedrai il tuo bello spazio fra la o e la G. Ce ne saranno due se metti uno spazio prima di \begin{otherlanguage*}.

        La soluzione è di mettere \ProsodicMarksOn sempre accanto a \begin{otherlanguage*} (oppure di usare %):
        `\begin{otherlanguage*}{latin}\ProsodicMarksOn
        Gallia …`
        oppure
        `\begin{otherlanguage*}{latin}%
        \ProsodicMarksOn
        Gallia …`
        Ciao
        Enrico

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

          La soluzione è di mettere \ProsodicMarksOn sempre accanto a \begin{otherlanguage*} (oppure di usare %):
          `\begin{otherlanguage*}{latin}\ProsodicMarksOn
          Gallia …`
          oppure
          `\begin{otherlanguage*}{latin}%
          \ProsodicMarksOn
          Gallia …`

          No. Prova a mettere questo
          `\begin{sidebyside}
          \begin{otherlanguage*}{latin}%
          \ProsodicMarksOn
          ros^a \\
          ros=a
          \end{otherlanguage*}
          \end{sidebyside}
          `nel mio esempio precedente e a compilare: lo spazio spurio rimane. 🙁

          Invece aggiumgere
          `\addto\extraslatin{\preto\ProsodicMarksOn{\unskip}} `
          a sidebyside come hai proposto risolve! 🙂

          Grazie mille Enrico! 🙂

          Ciao,
          L.

        • #57240
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Lorenzo, capisco la tua posizione in merito al fatto che il sistema TeX dovrebbe essere privo di difetti e non debba obbligare l’utente a correggere a mano i piccoli difetti che si presentano qua e là.

            Ma il problema tuo, secondo me, ma posso sbagliarmi, dipende dal fatto che dimentichi che in modo orizzontale gli spazi o i fine riga dopo una graffa chiusa sono significativi; la soluzione di Enrico va in quella direzione; naturalmente se tu metti l’ambiente foreign language dentro l’ambiente sidebyside, la graffa che chiude sidebyside è seguita da un fine riga e questo si presenta come uno spazio spurio. Hai provato, sulla falsa riga del suggerimetno di Enrico a dare i comandi seguenti?
            `
            \begin{sidebyside}%
            \begin{otherlanguage*}{latin}%
            \ProsodicMarksOn
            ros^a \\
            ros=a
            \end{otherlanguage*}
            \end{sidebyside}
            `

            Io non ho provato (pura pigrizia: non ho voglia di andare a cercare quale pacchetto definisca l’ambiente sidebyside…), ma qualcosa mi fa pensare che quello commento in rosso risolva il problema.

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


              Caro Claudio hai proprio ragione: mettere quel percento subito dopo l’apertura di sidebyside (è un ambiente ad hoc, la definizione la trovi riportata all’inizio di questo topic) risolve.

              Si tratta, per la verità, dell’unico caso in tutta l’Arte in cui è stato necessario farlo. Di sicuro, qualche grattacapo quel \ProsodicMarksOn lo dà.

              Mettere le mani su babel? Non discuto sull’efficacia della “soluzione”: solo, non è una cosa che consiglierei ai miei venticinque lettori… 😉

              Grazie mille,
              L.

            • #57242
              OldClaudio
              Partecipante
                Up
                0
                Down
                ::


                Può darsi che \ProsodicMarksOn dia dei grattacapi, ma non è colpa sua, è colpa di babel.def.

                Certo potrei modificare \ProsodicaMarksOn/Off in modo da fargli eliminare gli spazi che lo precedono, ma potrebbe essere una cura peggiore del male. La cura è correggere babel.doef e ricordarsi dei mettere sempre uno % dopo una graffa chiusa, visto che in modo verticale non da nessun fastidio e in modo orizzontale toglie lo spazio significativo dopo ogni graffa chiusa. Ti assicuro che io ho dovuto mettere quel % molte, molte volte anche usando ambienti standard, senza maldestri interventi miei. Forse a te è capitato solo in quel punto, ma la cosa capita più spesso di quanto tu non creda.

                Ciao
                Claudio

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

            Go to top