Uscire da listings, comando \meta

  • Questo topic ha 20 risposte, 7 partecipanti ed è stato aggiornato l'ultima volta 16 anni fa da Stemby.
  • Creatore
    Topic
  • #22159
    lorenzo.pantieri
    Partecipante
      Up
      0
      Down
      ::


      Ciao a tutti. Ho definito un comando che metta le opzioni dei pacchetti tra parentesi ad angolo:
      `\newcommand{\meta}{$\langle$\textit{#1}$\rangle$}`
      Mi chiedevo innanzitutto se questo comando e’ corretto. E poi, soprattutto: come si puo’ usarlo all’interno di un ambiente lstlisting e di un comando \lstinline?

      Grazie di cuore!

      L.

    Visualizzazione 19 filoni di risposte
    • Autore
      Risposte
      • #22160
        Up
        0
        Down
        ::


        Prova a compilare questo codice: il segreto è nel settare esacpechar. Guarda la guida per sicurezza.

        `\documentclass{minimal}

        \usepackage{listings}
        \usepackage{amsmath}

        \lstset{language=\(\)tex,
        escapechar=£}

        \newcommand{\meta}[1]{$\langle$\textit{#1}$\rangle$}

        \begin{document}
        \begin{lstlisting}
        Ora il tuo comando non viene interpretato \meta{prova}
        \end{lstlisting}
        \begin{lstlisting}
        Ora il tuo comando viene interpretato £\meta{prova}£
        \end{lstlisting}
        \end{document}
        `

        Ciao

        Daniele

      • #22161
        DMW
          Up
          0
          Down
          ::


          Piccolo consiglio,

          Di solito è meglio usare più caratteri. Può capitare, comunque cosa molto remota, di dover usare il carattere £. Meglio definire una sequenza di due caratteri che difficilmente possa servire tipo ?* o !*. Quindi scivere
          `\lstset{language=\(\)tex,
          escapechar={?*}}`
          racchiudendo il carattere tra graffe e di usare ?*\meta{prova}?* al posto di £\meta{prova}£.

          Volendo si possono usare due caratteri diversi (o sequenze di caratteri diverse) con escapeinside.

          Ciao

          Andrea

        • #22162
          Up
          0
          Down
          ::

          Piccolo consiglio,

          Di solito è meglio usare più caratteri. Può capitare, comunque cosa molto remota, di dover usare il carattere £. Meglio definire una sequenza di due caratteri che difficilmente possa servire tipo ?* o !*. Quindi scivere
          `\lstset{language=\(\)tex,
          escapechar={?*}}`
          racchiudendo il carattere tra graffe e di usare ?*\meta{prova}?* al posto di £\meta{prova}£.

          Ciao

          Andrea

          Grazie Andrea per l’osservazione. Sottoscrivo e aggiungo, per gli amanti del feticcio, che si possono definire delimitatori di apertura e chiusura. Mi spiego meglio: con il suggerimento di Andrea i delimitatori di apertura e chiusura coincidono, sono ambedue ?*. Se si volessero ottenere delimitatori simmetrici del tipo
          `?* \meta{prova}*? piuttosto che ?* \meta{prova}?*`
          si potrebbe impostare
          `\lstset{language=\(\)tex,
          escapeinside={?*}{*?}}`

          Credo che listings sia proprio un bel pacchetto.

          Ciao

          Daniele

        • #22163
          DMW
            Up
            0
            Down
            ::


            Esatto 😀 😀

            Ciao

            Andrea

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


              Mitici Daniele e Andrea!

              Appena posso provo il codice e riferisco!

              Per ora un mega ringraziamento ad entrambi…

              P.S. Concordo con Daniele sulla potenza di listings!

              A presto,
              L.

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


                Allora ragazzi, ho seguito il vostro suggerimento e funziona benissmo!

                C’e’ pero’ un problemino: il sistema proposto non funziona dentro il comando \lstinline.

                Ci sono rimasto male, come ci rimango male tutte le volte che LaTeX fa una cosa che non mi aspetto (o ne fa una che non mi aspetto). Insomma, una cosa come
                `\lstinline!\comando[?*\meta{…}*?]{…}!`
                non si puo’ scrivere, mentre nell’ambiente lstlisting funziona benissimo.

                Naturalmente, la soluzione e’ usare piu’ volte il comando \lstinline:
                `\lstinline!\comando[!\meta{…}\lstinline!]{…}!`
                pero’ non mi sembra molto belllo.

                Due cose:
                1. Perche’ succede questo?
                2. Quella che ho proposto e’ davvero la soluzione migliore?

                Grazie ancora,
                L.

              • #22166
                Up
                0
                Down
                ::

                Allora ragazzi, ho seguito il vostro suggerimento e funziona benissmo!

                C’e’ pero’ un problemino: il sistema proposto non funziona dentro il comando \lstinline.

                Ci sono rimasto male, come ci rimango male tutte le volte che LaTeX fa una cosa che non mi aspetto (o ne fa una che non mi aspetto). Insomma, una cosa come
                `\lstinline!\comando[?*\meta{…}*?]{…}!`
                non si puo’ scrivere, mentre nell’ambiente lstlisting funziona benissimo.

                Naturalmente, la soluzione e’ usare piu’ volte il comando \lstinline:
                `\lstinline!\comando[!\meta{…}\lstinline!]{…}!`
                pero’ non mi sembra molto belllo.

                Due cose:
                1. Perche’ succede questo?
                2. Quella che ho proposto e’ davvero la soluzione migliore?

                1. Suppongo che le chiavi escapechar e escapeinside non funzionino in \lstinline. Ma un trucco c’è:
                `\newcommand{\meta}[1]{\ensuremath\langle\textit{#1}\ensuremath\rangle}
                \lstinline[mathescape]!\comando{$\meta{dimen}$}!`

                2. Che cos’ha che non va?

                Ciao
                Enrico

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

                  2. Che cos’ha che non va?

                  Mi sembra un po’ goffa, tutto qui. In fin dei conti, la ”linea” di codice da inserire e’ una sola. Nel modo che ho indicato, invece, e’ necessario entrare e uscire dal comando lisinline a ripetizione (magari piu’ volte, se un comando ha diverse opzioni).

                  Provo subito il tuo codice!

                  Grazie mille,
                  L..

                • #22168
                  Up
                  0
                  Down
                  ::

                  2. Che cos’ha che non va?

                  Mi sembra un po’ goffa, tutto qui. In fin dei conti, la ”linea” di codice da inserire e’ [i]una[/i] sola. Nel modo che ho indicato, invece, e’ necessario entrare e uscire dal comando lisinline a ripetizione (magari piu’ volte, se un comando ha diverse opzioni).

                  Che ci vuoi fare? Modificare un ambiente verbatim è molto più semplice che modificare un comando verbatim: tipicamente un ambiente verbatim è letto riga per riga, un comando verbatim invece deve essere delimitato in qualche modo e questo rende difficili, se non impossibili, certi trucchi. Sinceramente non so come funzioni listings, in particolare il comando \lstinline: la documentazione non è affatto chiara su quali chiavi si possano usare nell’argomento opzionale; sono infatti un po’ sorpreso che mathescape funzioni e escapechar no.

                  Prova a chiedere all’autore.

                  Ciao
                  Enrico

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

                    Che ci vuoi fare? Modificare un ambiente verbatim è molto più semplice che modificare un comando verbatim: tipicamente un ambiente verbatim è letto riga per riga, un comando verbatim invece deve essere delimitato in qualche modo e questo rende difficili, se non impossibili, certi trucchi.

                    Spiegazione chiarssima!

                    Grazie di cuore,
                    Lorenzo

                  • #22170
                    Stemby
                    Partecipante
                      Up
                      0
                      Down
                      ::


                      Scusate se riapro questa discussione dopo un’eternità, ma per la rete non ho trovato niente di meglio…

                      Vedendo l’abitudine di indicare in questo modo i pezzi di codice da sostituire negli esempi, (ad esempio nell’Arte, ma anche nella stessa guida di listings) credevo che ci fosse qualcosa di già predisposto, invece sembra di no 😯

                      Sto allora facendo qualche prova, iniziando dal codice più semplice, ma
                      `\documentclass{minimal}

                      \usepackage{listings}
                      \usepackage{amsmath}

                      \lstset{language=\(\)tex,
                      escapechar=£}

                      \newcommand{\meta}[1]{$\langle$\textit{#1}$\rangle$}

                      \begin{document}
                      \begin{lstlisting}
                      Ora il tuo comando non viene interpretato \meta{prova}
                      \end{lstlisting}
                      \begin{lstlisting}
                      Ora il tuo comando viene interpretato £\meta{prova}£
                      \end{lstlisting}
                      \end{document}
                      `
                      risulta essere incompatibile con
                      `
                      \usepackage[utf8x]{inputenc}
                      `

                      Esiste una soluzione?

                      Ciao!

                      Carlo

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


                        Nessun problema, qui, neppure con utf8x.

                        Ciao,
                        L.

                      • #22172
                        Stemby
                        Partecipante
                          Up
                          0
                          Down
                          ::


                          Stranissimo…

                          Questo esattamente il sorgente:
                          `
                          \documentclass{minimal}

                          \usepackage[uft8x]{inputenc}
                          \usepackage{listings}

                          \lstset{language=\(\)tex,
                          escapechar=£}

                          \newcommand{\meta}[1]{$\langle$\textit{#1}$\rangle$}

                          \begin{document}
                          \begin{lstlisting}
                          Ora il tuo comando non viene interpretato \meta{prova}
                          \end{lstlisting}
                          \begin{lstlisting}
                          Ora il tuo comando viene interpretato £\meta{prova}£
                          \end{lstlisting}
                          \end{document}

                          `

                          e questo l’output di pdflatex:
                          `
                          $ pdflatex test.tex
                          This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian)
                          restricted \write18 enabled.
                          entering extended mode
                          (./test.tex
                          LaTeX2e <2009/09/24>
                          Babel and hyphenation patterns for english, usenglishmax, dumylang, noh
                          yphenation, farsi, arabic, croatian, bulgarian, ukrainian, russian, czech, slov
                          ak, danish, dutch, finnish, french, basque, ngerman, german, german-x-2009-06-1
                          9, ngerman-x-2009-06-19, ibycus, monogreek, greek, ancientgreek, hungarian, san
                          skrit, italian, latin, latvian, lithuanian, mongolian2a, mongolian, bokmal, nyn
                          orsk, romanian, irish, coptic, serbian, turkish, welsh, esperanto, uppersorbian
                          , estonian, indonesian, interlingua, icelandic, kurmanji, slovenian, polish, po
                          rtuguese, spanish, galician, catalan, swedish, ukenglish, pinyin, loaded.
                          (/usr/share/texmf-texlive/tex/latex/base/minimal.cls
                          Document Class: minimal 2001/05/25 Standard LaTeX minimal class
                          ) (/usr/share/texmf-texlive/tex/latex/base/inputenc.sty

                          ! LaTeX Error: File `uft8x.def' not found.

                          Type X to quit or to proceed,
                          or enter new name. (Default extension: def)

                          Enter file name:

                          `
                          Nessun problema invece se commento la riga con inputenc.

                          Tutto ciò su Debian Squeeze.

                        • #22173
                          Up
                          0
                          Down
                          ::

                          Stranissimo…

                          Questo esattamente il sorgente:
                          `
                          \documentclass{minimal}

                          \usepackage[uft8x]{inputenc}
                          \usepackage{listings}

                          \lstset{language=\(\)tex,
                          escapechar=£}

                          \newcommand{\meta}[1]{$\langle$\textit{#1}$\rangle$}

                          \begin{document}
                          \begin{lstlisting}
                          Ora il tuo comando non viene interpretato \meta{prova}
                          \end{lstlisting}
                          \begin{lstlisting}
                          Ora il tuo comando viene interpretato £\meta{prova}£
                          \end{lstlisting}
                          \end{document}

                          `

                          e questo l’output di pdflatex:
                          `
                          $ pdflatex test.tex
                          This is pdfTeX, Version 3.1415926-1.40.10 (TeX Live 2009/Debian)
                          restricted \write18 enabled.
                          entering extended mode
                          (./test.tex
                          LaTeX2e <2009/09/24>
                          Babel and hyphenation patterns for english, usenglishmax, dumylang, noh
                          yphenation, farsi, arabic, croatian, bulgarian, ukrainian, russian, czech, slov
                          ak, danish, dutch, finnish, french, basque, ngerman, german, german-x-2009-06-1
                          9, ngerman-x-2009-06-19, ibycus, monogreek, greek, ancientgreek, hungarian, san
                          skrit, italian, latin, latvian, lithuanian, mongolian2a, mongolian, bokmal, nyn
                          orsk, romanian, irish, coptic, serbian, turkish, welsh, esperanto, uppersorbian
                          , estonian, indonesian, interlingua, icelandic, kurmanji, slovenian, polish, po
                          rtuguese, spanish, galician, catalan, swedish, ukenglish, pinyin, loaded.
                          (/usr/share/texmf-texlive/tex/latex/base/minimal.cls
                          Document Class: minimal 2001/05/25 Standard LaTeX minimal class
                          ) (/usr/share/texmf-texlive/tex/latex/base/inputenc.sty

                          ! LaTeX Error: File `uft8x.def' not found.

                          Type X to quit or to proceed,
                          or enter new name. (Default extension: def)

                          Enter file name:

                          `
                          Nessun problema invece se commento la riga con inputenc.

                          Tutto ciò su Debian Squeeze.

                          Sembra un problema con “utf8x” inveche che con listings.
                          Hai provato con un documento minimale che contenga solo la chiamata al pacchetto inputenc?

                          😉
                          LuCa

                        • #22174
                          Up
                          0
                          Down
                          ::


                          Ovviamente il problema sta nel fatto che l’opzione è “utf8x” e non “uft8x”

                          Resta il fatto che il pacchetto listings non è compatibile con codifiche multibyte tipo utf-8. Ho trovato questo pacchetto che cerca di mettere una pezza ma non l’ho provato…

                          😉
                          LuCa

                        • #22175
                          Stemby
                          Partecipante
                            Up
                            0
                            Down
                            ::


                            `
                            \usepackage[uft8x]{inputenc}
                            `

                            Trovato il problema: ho scritto uft8x al posto di utf8x… 😳

                            Scusate…

                            EDIT:

                            @Bistek
                            : ho visto solo ora il tuo messaggio. Adesso leggo tutto bene, grazie!

                            RIEDIT:
                            Dalla documentazione:

                            Workarounds are not provided for
                            • \lstinline
                            • Environment lstlisting.

                            cosa serve, allora?

                            Adesso vedo se riesco a fare a meno di quel pacchetto e usare direttamente listings, che magari nel frattemo è stato patchato, visto che Lorenzo dice che gli funziona tutto: indagherò. Grazie comunque!

                          • #22176
                            Stemby
                            Partecipante
                              Up
                              0
                              Down
                              ::


                              Allora, confermo che listings non digerisce caratteri UTF-8, come le lettere accentate.

                              Non ci sono problemi ad usarli al di fuori degli ambienti lstlisting, mentre mettendoli all’interno il compilatore dà errore.

                              Vedrò se riesco ad evitare il loro uso, comunque la cosa è abbastanza incredibile.


                              @Lorenzo
                              : credo che una nota sul problema andrebbe aggiunta nell’Arte, dato che UTF-8 è la codifica abituale per tutti gli utenti GNU/Linux.

                              Grazie ancora!

                              Carlo

                            • #22177
                              Up
                              0
                              Down
                              ::

                              […]
                              RIEDIT:
                              Dalla documentazione:

                              Workarounds are not provided for
                              • \lstinline
                              • Environment lstlisting.

                              cosa serve, allora?[…]

                              Dalla documentazione:

                              Package listings does not support les with multi-byte encodings such as
                              UTF-8. In case of \lstinputlisting a simple workaround is possible if an
                              one-byte encoding exists that the le can be converted to.

                              Quando includo del codice di solito l’ho usato 😉 e pertanto è salvato in qualche file di testo da qualche parte nell’hard disk. Pertanto, invece di copia-incollare penso sia più comodo usare il comando “\lstinputlisting”, che si occupa di caricare il file esterno.

                              In caso di aggiornamento del codice originale la successiva compilazione aggiorna anche il pdf, non c’è il rischio di perdersi nella revisione delle varie versioni.

                              Il pacchetto che ti ho indicato permette l’utilizzo della codifica Utf-8 con questo comando.

                              😉
                              LuCa

                            • #22178
                              OldClaudio
                              Partecipante
                                Up
                                0
                                Down
                                ::


                                Mah! Il messaggio d’errore dice chiaramente:
                                `
                                ! LaTeX Error: File `uft8x.def' not found.
                                `
                                che vuol dire esattamente quello che c’è scritto, cioè che il motore di compilazione (il programma pdflatex, probabilmente) non riesce a trovare il file uft8x.def

                                O il file manca del tutto dal disco, oppure il file c’è, ma il filename database non è aggiornato, oppure il file c’è e il filename database è aggiornato, ma quel file non si trova nella cartella giusta in relazione al percorso su cui vengono cercati i file.

                              • #22179
                                Stemby
                                Partecipante
                                  Up
                                  0
                                  Down
                                  ::

                                  Mah! Il messaggio d’errore dice chiaramente:
                                  `
                                  ! LaTeX Error: File `uft8x.def' not found.
                                  `
                                  che vuol dire esattamente quello che c’è scritto, cioè che il motore di compilazione (il programma pdflatex, probabilmente) non riesce a trovare il file uft8x.def

                                  O il file manca del tutto dal disco

                                  Sì, come già detto sopra è così: non riusciva a trovarlo perché… non esiste! Si trattava infatti di un mio errore di battitura, avendo scritto uft8x al posto di utf8x.

                                  Comunque ora il problema era un altro: l’incompatibilità del pacchetto con la codifica UTF8. Qui però non ci posso far niente, tranne scegliere dei caratteri ASCII per le sequenze di apertura e chiusura. Credo che metterò ^| per aprire e |^ per chiudere.

                                  Ciao!

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

                              Go to top