Listings e direttive C++

  • Creatore
    Topic
  • #16128
    Up
    0
    Down
    ::


    Il seguente documento fa uso di listings per includere un listato in C++:
    `\documentclass{report}
    \usepackage[dvipsnames,svgnames]{xcolor}
    \usepackage{listings}
    \definecolor{veryLightGrey}{rgb}{0.9629411,0.9629411,0.9629411}

    \lstset{language=C++,
    alsolanguage=[ANSI]C,
    backgroundcolor=\color{veryLightGrey},
    keywordstyle=\color{RoyalBlue},
    directivestyle=\color{Red}\tiny,
    %keywordsprefix={\#},
    %morekeywords={\#include},
    %moredirectives={include},
    numbersep=8pt,
    basicstyle=\small\sffamily,
    commentstyle=\color{Green}\small\sffamily,
    stringstyle=\sffamily,
    showstringspaces=false,
    breaklines=true,
    frame=none}

    \begin{document}
    \begin{lstlisting}
    // Include headers
    #include “Epetra_MpiComm.h”

    // Main driver
    int main( int argv, char *argv[]) {

    // MPI initialisation
    MPI_Init(&argc, &argv);

    // Instantiate the communciator
    Epetra_MpiComm Comm(MPI_COMM_WORLD);

    // MPI finalisation
    MPI_Finalize();

    }
    \end{lstlisting}
    \end{document}`
    Oltre a chiedere dei consigli sull’aspetto estetico (sono molto scettico e inesperto sull’uso dei colori e listati come questo saranno frequenti nella mia tesi), volevo farvi notare che la direttiva #include non è riconosciuta né come parola chiave, né come direttiva. Scartabellando i sorgenti di listings, ho visto che il linguaggio [ANSI]C riconosce “include” come una direttiva e quindi, con il codice che ho scritto, dovrebbe apparire \tiny ed in rosso (questo è solo per prova, non vi preoccupate! Non lo userei mai in fase finale).

    Come si nota dalle opzioni commentate di \lstset, ho provato senza successo con
    `moredirectives=include`
    Successivamente, ho pensato che almeno potevo farlo passare come una parola chiave, e perciò ho provato
    `keywordsprefix={\#}`
    che mi restituisce #include invece di #include. Infine, se provo con
    `morekeywords={\#include}`
    ottengo #include, tutto in nero.

    Avete qualche idea?

    Grazie

    Daniele

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #16129
      DMW
        Up
        0
        Down
        ::


        non è keywordsprefix={\#}, ma alsoletter:
        `
        \lstset{language=C++,
        alsolanguage=[ANSI]C,
        backgroundcolor=\color{veryLightGrey},
        keywordstyle=\color{RoyalBlue},
        directivestyle=\color{Red}\tiny,
        alsoletter={\#},
        morekeywords={\#include},
        %moredirectives={\#include},
        numbersep=8pt,
        basicstyle=\small\sffamily,
        commentstyle=\color{Green}\small\sffamily,
        stringstyle=\sffamily,
        showstringspaces=false,
        breaklines=true,
        frame=none}
        `

        Il problema è che l’opzione directivestyle non ha effetto e non so perché.

      • #16130
        Up
        0
        Down
        ::


        Intanto grazie per il suggerimento. Nel peggiore dei casi, potrei far passare #include come una “parola chiave secondaria” e differenziarla perciò dalle altre parole chiave.

        Ciao

        Daniele

      • #16131
        Up
        0
        Down
        ::


        Questo codice fa quello che desidero, anche se in modo truffaldino.
        `\documentclass{report}
        \usepackage[dvipsnames,svgnames]{xcolor}
        \usepackage{listings}
        \definecolor{veryLightGrey}{rgb}{0.9629411,0.9629411,0.9629411}

        \lstset{language=C++,
        alsolanguage=[ANSI]C,
        backgroundcolor=\color{veryLightGrey},
        keywordstyle=\color{RoyalBlue},
        keywordstyle=[2]\color{Red},
        alsoletter={[2]\#},
        morekeywords={[2]\#include},
        numbersep=8pt,
        basicstyle=\small\sffamily,
        commentstyle=\color{Green}\small\sffamily,
        stringstyle=\sffamily,
        showstringspaces=false,
        breaklines=true,
        frame=none}

        \begin{document}
        \begin{lstlisting}
        // Include headers
        #include “Epetra_MpiComm.h”

        // Main driver
        int main( int argv, char *argv[]) {

        // MPI initialisation
        MPI_Init(&argc, &argv);

        // Instantiate the communciator
        Epetra_MpiComm Comm(MPI_COMM_WORLD);

        // MPI finalisation
        MPI_Finalize();

        }
        \end{lstlisting}
        \end{document}`
        Ciao

        Daniele

      • #16132
        DMW
          Up
          0
          Down
          ::

          Intanto grazie per il suggerimento. Nel peggiore dei casi, potrei far passare #include come una “parola chiave secondaria” e differenziarla perciò dalle altre parole chiave.

          Ciao

          Daniele

          Metto la soluzione per completezza. Comunque bisognerebbe far presente il problema all’autore del pacchetto.

          `
          \lstset{language=C++,
          alsolanguage=[ANSI]C,
          backgroundcolor=\color{veryLightGrey},alsoletter={\#},
          classoffset=0,
          %morekeywords={\#include},
          keywordstyle=\color{RoyalBlue},
          classoffset=1,
          morekeywords={\#include},
          keywordstyle=\color{Red},
          classoffset=0
          numbersep=8pt,
          basicstyle=\small\sffamily,
          commentstyle=\color{Green}\small\sffamily,
          stringstyle=\sffamily,
          showstringspaces=false,
          breaklines=true,
          frame=none}`

          Ciao

          Andrea

        • #16133
          Up
          0
          Down
          ::


          C’è una ragione precisa per cui usi
          `classoffset`
          anziché
          `morekeywords=[2]…`
          e simili? Ho mandato un bug report all’autore del pacchetto.

          Grazie mille!

          Daniele

        • #16134
          DMW
            Up
            0
            Down
            ::

            C’è una ragione precisa per cui usi
            `classoffset`
            anziché
            `morekeywords=[2]…`
            e simili? Ho mandato un bug report all’autore del pacchetto.

            Grazie mille!

            Daniele

            No, è la stessa cosa.

            Infatti a pag. 29 della documentazione puoi leggere “the optional argument is the class number…” E poi fa l’esempio con classoffset, che ho usato poco tempo fa in un documento.

            Anzi, il tuo modo è più snello.

            Ciao

            Andrea

          • #16135
            Up
            0
            Down
            ::


            Grazie ancora, vi farò sapere quando e se l’autore di listings si farà vivo.

            Ciao

            Daniele

          • #16136
            Up
            0
            Down
            ::


            Riprendo questo vecchio topic per dire che non ho ricevuto alcuna notizia da parte dell’autore del pacchetto.

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

        Go to top