Scrivere % su un file esterno

  • Creatore
    Topic
  • #100202
    strolego
    Partecipante
      Up
      0
      Down
      ::


      Vorrei scrivere su un file esterno una frase commentata come ” % questo è un commento”

      se scrivo
      `
      \documentclass[italian]{article}
      \usepackage[utf8]{inputenc}
      \usepackage[T1]{fontenc}
      \newwrite\provas
      \begin{document}
      prova di scrittura
      \immediate\openout\provas=provasc.tex
      \catcode`\%=12
      \immediate\write\provas{\string % questo è un commento}
      \catcode`\%=14
      \immediate\closeout\provas
      % questo non esce in stampa
      \immediate\closeout\provas
      \end{document}
      `

      funziona tutto e nel file provasc.tex c’è
      `% questo è un commento`

      Ma se cerco di fare la stessa cosa all’interno di un ambiente si blocca tutto

      `
      \documentclass[italian]{article}
      \usepackage[utf8]{inputenc}
      \usepackage[T1]{fontenc}
      \newwrite\provas

      \newenvironment{esempio}{\textbf{Esempio}
      \catcode`\%=12
      \immediate\write\provas{\string % questo è un commento}
      \catcode`\%=14
      }
      {}

      \begin{document}
      prova di scrittura
      \immediate\openout\provas=provasc.tex
      \begin{esempio}
      ciao
      % questo non esce
      \end{esempio}
      \immediate\closeout\provas
      \end{document}
      `

      L’errore che ottengo è proprio all’interno dell’ambiente poiché la compilazione si arresta con questo messaggio
      `
      Runaway argument?
      {\textbf {Esempio} \catcode `\%=12 \immediate \write \provas {\string \ETC.
      ! File ended while scanning use of \@newenv.
      `

      e lo stesso succede anche se non uso l’ambiente “esempio” nel documento, ma semplicemente definendolo

      Qualcuno sa dirmi cosa sbaglio?
      Grazie
      Salvatore

    Visualizzazione 3 filoni di risposte
    • Autore
      Risposte
      • #100203
        Up
        0
        Down
        ::


        È molto semplice: quando definisci un ambiente, i comandi che compongono la definizione vengono meramente memorizzati nella definizione stessa macro definita, e non eseguiti. Quindi il tuo`\catcode`\%=12`non venendo eseguito, non cambia il \catcode di %; alla riga successiva, il % continua a essere un carattere di commento, cosicché il compilatore legge
        `\immediate\write\provas{\string `
        ed ecco qui ciò che causa il runaway argument.

        Devi cambiare il \catcode di % prima di definire l’ambiente, e ristabilirlo subito dopo aver completato la definizione.

        Ciao.


        Gustavo

      • #100204
        strolego
        Partecipante
          Up
          0
          Down
          ::


          Grazie mille

          Salvatore

        • #100205
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::



            @Strolego
            , la spiegazione di Gustavo è corretta, ma secondo me è sbagliato l’approccio.

            I pacchetti listings e fancyvrb ti permettono di scrivere su un file esterno in modo verbatim e ti permettono di rileggere quello che hai scritto.

            Listings ha dei problemini con i caratteri non ASCII; invece fancyvrb funziona benissimo anche con XeLaTeX e LuaLatex che devono avere tutto quanto registrato su disco con la codifica utf8, però con pdflatex mi pare che richieda una configurazione speciale che non ricordo se sia documentata chiaramente e che ora non ho sottomano.

            Il concetto è questo: non ha sneso creare un ambiente epr scrivere una frase che è codificate dentro l’ambiente stesso; fancyverb ti mette a disposizione il comando \VerbatimOut che richiede come argomento il nome del file dove scrivere quel che ti pare in modo verbatim, e \endVerbatimOut che chiude il testo introdotto dopo l’altro comando e che vuoi riscrivere.

            Il problema è riscrivere i testo che hai scritto verbatim nel file suddetto: se lo devi riscrivere verbatim nel documento, importi il file con \verbatiminput che ha per argomento il nme del file; se invece lo vioi comporre nel documento come se fosse del testo di un file esterno, allora lo devi incldere con il semplice \input. In questo secondo caso il segno % deve essere stato registrato come se lo scrivessi direttamente nel file sorgente del documento, quindi in una delle varie maniere con le quali si scrivoo i caratteri specili, la più semplice delle quali è \%. Non hai nessun bisogno di cambiare i codici di categoria perché ci pensano i comandi di fancyvrb (leggine la documentazione; si possono fare molte cose con questo pacchetto). Esempio`…
            \usepackage{fancyvrb}

            \begin{document}

            \VerbatmOut{prova.tex}
            \% questa è una frase che contiene un percento
            \endVerbatimOut

            \input{prova}

            \end{document}`Con questo codice il testo salvato in prova.tex viene immesso nel documento composto con il suo bravo percento scritto come siamo abituati a leggerlo.

          • #100206
            strolego
            Partecipante
              Up
              0
              Down
              ::


              Grazie. penso sia la soluzione più comoda nel mio caso

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

          Go to top