[risolto] Newenvironment per landascape e afterpage

  • Creatore
    Topic
  • #79057
    Andrea
    Partecipante
      Up
      0
      Down
      ::


      Ciao a tutti,
      ho la necessità di inserire molti oggetti flottanti (grafici di [tt]pgfplots[/tt]) ruotati in formato landscape. Inizialmente ho utilizzato il pacchetto [tt]rotating[/tt] con l’opzione [tt]figuresright[/tt], includendo quindi il grafico con l’ambiente [tt]sidewaysfigure[/tt].

      Mi è stato poi fatto notare che per facilitare la lettura a schermo sarebbe meglio ruotare la visualizzazione di queste pagine. Sono quindi passato al pacchetto [tt]pdflscape[/tt] e l’ambiente [tt]landscape[/tt]:
      `
      \begin{landscape}
      \begin{figure}
      \input{my_file}
      \caption{Consumi elettrici dell'impianto di condizionamento}
      \label{fig:label}
      \end{figure}
      \end{landscape}
      `
      in questo modo però l’ambiente [tt]landscape[/tt] inserisce un [tt]\clearpage[/tt] per cui interrompe il flusso del testo.

      La soluzione è stata quindi usare [tt]\afterpage[/tt]:
      `
      \afterpage{\begin{landscape}
      \begin{figure}
      \input{my_file}
      \caption{Consumi elettrici dell'impianto di condizionamento}
      \label{fig:label}
      \end{figure}
      \end{landscape}}
      `

      Il risultato è quello voluto. Ora vorrei creare un ambiente (e non un comando) che mi permettesse si ottenere l’effetto de codice precedente; qualcosa del tipo:
      `
      \begin{mylscape}
      \input{my_file}
      \caption{Consumi elettrici dell'impianto di condizionamento}
      \label{fig:label}
      \end{mylscape}
      `
      solo che non capisco come inserire [tt]\afterpage[/tt] all’interno di [tt]\newenvironment[/tt].

      C’è qualcuno che può aiutarmi?

      Grazie in anticipo

      Andrea

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

        Iovem” post=78191Ciao a tutti,
        ho la necessità di inserire molti oggetti flottanti (grafici di [tt]pgfplots[/tt]) ruotati in formato landscape. Inizialmente ho utilizzato il pacchetto [tt]rotating[/tt] con l’opzione [tt]figuresright[/tt], includendo quindi il grafico con l’ambiente [tt]sidewaysfigure[/tt].

        Mi è stato poi fatto notare che per facilitare la lettura a schermo sarebbe meglio ruotare la visualizzazione di queste pagine. Sono quindi passato al pacchetto [tt]pdflscape[/tt] e l’ambiente [tt]landscape[/tt]:
        `
        \begin{landscape}
        \begin{figure}
        \input{my_file}
        \caption{Consumi elettrici dell'impianto di condizionamento}
        \label{fig:label}
        \end{figure}
        \end{landscape}
        `
        in questo modo però l’ambiente [tt]landscape[/tt] inserisce un [tt]\clearpage[/tt] per cui interrompe il flusso del testo.

        La soluzione è stata quindi usare [tt]\afterpage[/tt]:
        `
        \afterpage{\begin{landscape}
        \begin{figure}
        \input{my_file}
        \caption{Consumi elettrici dell'impianto di condizionamento}
        \label{fig:label}
        \end{figure}
        \end{landscape}}
        `

        Il risultato è quello voluto. Ora vorrei creare un ambiente (e non un comando) che mi permettesse si ottenere l’effetto de codice precedente; qualcosa del tipo:
        `
        \begin{mylscape}
        \input{my_file}
        \caption{Consumi elettrici dell'impianto di condizionamento}
        \label{fig:label}
        \end{mylscape}
        `
        solo che non capisco come inserire [tt]\afterpage[/tt] all’interno di [tt]\newenvironment[/tt].

        C’è qualcuno che può aiutarmi?

        Grazie in anticipo

        Andrea

        Proverei così:
        `\usepackage{environ}
        \NewEnviron{mylscape}{%
        \def\tempmylscape{\begin{landscape}\begin{figure}}%
        \expandafter\expandafter\expandafter\afterpage
        \expandafter\expandafter\expandafter{\expandafter\tempmylscape\BODY\end{figure}\end{landscape}}%
        }`
        Con environ e [tt]\NewEnviron[/tt] l’ambiente [tt]mylscape[/tt] mette in [tt]\BODY[/tt] il contenuto dell’ambiente stesso. Ma prima di passarlo a [tt]\afterpage[/tt] dobbiamo espanderlo, perché un semplice
        `\afterpage{\begin{landscape}\begin{figure}\BODY\end{figure}\end{landscape}}`
        non funzionerebbe: il significato di [tt]\BODY[/tt] sparisce quando l’ambiente è terminato. Con un giudizioso uso di qualche [tt]\expandafter[/tt] (solo sette :)) si otterrà il risultato desiderato.

        Ciao
        Enrico

      • #79059
        Andrea
        Partecipante
          Up
          0
          Down
          ::


          Perfetto, (ovviamente) funziona. Pensavo fosse un problema più banale, ma ovviamente la banalità è relativa.

          Ti ringrazio molto.

          Andrea

        • #79060
          Andrea
          Partecipante
            Up
            0
            Down
            ::

            egreg9″ post=78193

            Ciao a tutti,
            ho la necessità di inserire molti oggetti flottanti (grafici di [tt]pgfplots[/tt]) ruotati in formato landscape. Inizialmente ho utilizzato il pacchetto [tt]rotating[/tt] con l’opzione [tt]figuresright[/tt], includendo quindi il grafico con l’ambiente [tt]sidewaysfigure[/tt].

            Mi è stato poi fatto notare che per facilitare la lettura a schermo sarebbe meglio ruotare la visualizzazione di queste pagine. Sono quindi passato al pacchetto [tt]pdflscape[/tt] e l’ambiente [tt]landscape[/tt]:
            `
            \begin{landscape}
            \begin{figure}
            \input{my_file}
            \caption{Consumi elettrici dell'impianto di condizionamento}
            \label{fig:label}
            \end{figure}
            \end{landscape}
            `
            in questo modo però l’ambiente [tt]landscape[/tt] inserisce un [tt]\clearpage[/tt] per cui interrompe il flusso del testo.

            La soluzione è stata quindi usare [tt]\afterpage[/tt]:
            `
            \afterpage{\begin{landscape}
            \begin{figure}
            \input{my_file}
            \caption{Consumi elettrici dell'impianto di condizionamento}
            \label{fig:label}
            \end{figure}
            \end{landscape}}
            `

            Il risultato è quello voluto. Ora vorrei creare un ambiente (e non un comando) che mi permettesse si ottenere l’effetto de codice precedente; qualcosa del tipo:
            `
            \begin{mylscape}
            \input{my_file}
            \caption{Consumi elettrici dell'impianto di condizionamento}
            \label{fig:label}
            \end{mylscape}
            `
            solo che non capisco come inserire [tt]\afterpage[/tt] all’interno di [tt]\newenvironment[/tt].

            C’è qualcuno che può aiutarmi?

            Grazie in anticipo

            Andrea

            Proverei così:
            `\usepackage{environ}
            \NewEnviron{mylscape}{%
            \def\tempmylscape{\begin{landscape}\begin{figure}}%
            \expandafter\expandafter\expandafter\afterpage
            \expandafter\expandafter\expandafter{\expandafter\tempmylscape\BODY\end{figure}\end{landscape}}%
            }`
            Con environ e [tt]\NewEnviron[/tt] l’ambiente [tt]mylscape[/tt] mette in [tt]\BODY[/tt] il contenuto dell’ambiente stesso. Ma prima di passarlo a [tt]\afterpage[/tt] dobbiamo espanderlo, perché un semplice
            `\afterpage{\begin{landscape}\begin{figure}\BODY\end{figure}\end{landscape}}`
            non funzionerebbe: il significato di [tt]\BODY[/tt] sparisce quando l’ambiente è terminato. Con un giudizioso uso di qualche [tt]\expandafter[/tt] (solo sette :)) si otterrà il risultato desiderato.

            Ciao
            Enrico

            Ho cantato vittoria troppo presto. Se abilito l’esternalizzazione di [tt]tikz[/tt], il nuovo ambiente ruota solo la pagina, ma non la figura esternalizzata.

            Un esempio minimale:
            `
            \documentclass[a4paper]{book}

            \usepackage{lmodern}

            \usepackage[T1]{fontenc}
            \usepackage{textcomp} %Gradi e altri simboli
            \usepackage[utf8]{inputenc}

            \usepackage{afterpage} %Svuota coda figura \afterpage{\clearpage}
            \usepackage{environ} %Nuovi ambienti
            \usepackage{lipsum} %Testo casuale
            \usepackage{pdflscape} %Rotazione visualizz pagine
            \usepackage[figuresright]{rotating} %Rotazione figure
            \usepackage{tikz,pgfplots} %Disegno e grafici in LaTeX

            \usetikzlibrary{external}

            %Definisce nuovo comando per input tile tikz
            \makeatletter
            \newcommand{\useexternalfile}[1]{%
            \tikzsetnextfilename{#1-output}%
            \input{\tikzexternal@filenameprefix#1.tex}}
            \makeatother

            %Figure ruotate
            \NewEnviron{mylscape}{%
            \def\tempmylscape{\begin{landscape}\begin{figure}\centering}%
            \expandafter\expandafter\expandafter\afterpage
            \expandafter\expandafter\expandafter %
            {\expandafter\tempmylscape\BODY\end{figure}\end{landscape}}%
            }

            \tikzexternalize %Esternalizzazione

            % INIZIO DOCUMENTO
            %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
            \begin{document}

            \tikzsetexternalprefix{./Immagini/cap1/}
            \chapter{Primo}
            \lipsum

            \begin{mylscape}
            \useexternalfile{prova}
            \caption{Una figura di prova}
            \label{fig:my_fig}
            \end{mylscape}

            \lipsum

            \end{document}
            `

            Dove il file [tt]prova.tex[/tt] è:
            `
            \begin{tikzpicture}[]
            \draw[ultra thick,red] (0,0) rectangle (19,11);
            \end{tikzpicture}
            `

            La figura in [tt]tikz[/tt] viene inserita con [tt]\useexternalfile[/tt] definito in modo da tenere in conto il fatto che il file da inserire è annidato all’interno di sottocartelle nella directory principale ([tt]./Immagini/cap1/[/tt]). Lo stesso comando gestisce anche il prefissi in modo che quando viene attivata la libreria [tt]external[/tt] il file generato venga posizionato nella stessa sotto-cartella del file iniziale.

            E’ quindi possibile adattare il nuovo ambiente in modo che posizioni in landscape anche il file esternalizzato?

            Grazie in anticipo

            Andrea

          • #79061
            Up
            0
            Down
            ::


            Per favore, modifica il tuo esempio in modo che non faccia alcun riferimento ad altre directory.

            Ciao
            Enrico

          • #79062
            Andrea
            Partecipante
              Up
              0
              Down
              ::

              egreg9″ post=78252Per favore, modifica il tuo esempio in modo che non faccia alcun riferimento ad altre directory.

              Ciao
              Enrico

              Ecco qui:
              `
              \documentclass[a4paper]{book}

              \usepackage{lmodern}

              \usepackage[T1]{fontenc}
              \usepackage{textcomp} %Gradi e altri simboli
              \usepackage[utf8]{inputenc}

              %In ordine alfabetico
              \usepackage{afterpage} %Svuota coda figura \afterpage{\clearpage}
              \usepackage{environ} %Nuovi ambienti
              \usepackage{lipsum} %Testo casuale
              \usepackage{pdflscape} %Rotazione visualizz pagine
              \usepackage[figuresright]{rotating} %Rotazione figure
              \usepackage{tikz,pgfplots} %Disegno e grafici in LaTeX

              \usetikzlibrary{external}

              %Definisce nuovo comando per input tile tikz
              \makeatletter
              \newcommand{\useexternalfile}[1]{%
              \tikzsetnextfilename{#1-output}%
              \input{\tikzexternal@filenameprefix#1.tex}}
              \makeatother

              %Figure ruotate
              \NewEnviron{mylscape}{%
              \def\tempmylscape{\begin{landscape}\begin{figure}\centering}%
              \expandafter\expandafter\expandafter\afterpage
              \expandafter\expandafter\expandafter %
              {\expandafter\tempmylscape\BODY\end{figure}\end{landscape}}%
              }

              \tikzexternalize %Esternalizzazione

              % INIZIO DOCUMENTO
              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
              \begin{document}

              \tikzsetexternalprefix{}
              \chapter{Primo}
              \lipsum

              \begin{mylscape}
              % \useexternalfile{prova}
              \begin{tikzpicture}[]
              \draw[ultra thick,red] (0,0) rectangle (19,11);
              \end{tikzpicture}
              \caption{Una figura di prova}
              \label{fig:my_fig}
              \end{mylscape}

              \lipsum

              \end{document}
              `

              eliminando il commento da [tt]\useexternalfile{prova}[/tt], si può metter il contenuto di [tt]tikzpicture[/tt] in un file [tt]prova.tex[/tt] nella directory principale.

            • #79063
              Up
              0
              Down
              ::

              Iovem” post=78253

              Per favore, modifica il tuo esempio in modo che non faccia alcun riferimento ad altre directory.

              Ciao
              Enrico

              Ecco qui:
              `
              \documentclass[a4paper]{book}

              \usepackage{lmodern}

              \usepackage[T1]{fontenc}
              \usepackage{textcomp} %Gradi e altri simboli
              \usepackage[utf8]{inputenc}

              %In ordine alfabetico
              \usepackage{afterpage} %Svuota coda figura \afterpage{\clearpage}
              \usepackage{environ} %Nuovi ambienti
              \usepackage{lipsum} %Testo casuale
              \usepackage{pdflscape} %Rotazione visualizz pagine
              \usepackage[figuresright]{rotating} %Rotazione figure
              \usepackage{tikz,pgfplots} %Disegno e grafici in LaTeX

              \usetikzlibrary{external}

              %Definisce nuovo comando per input tile tikz
              \makeatletter
              \newcommand{\useexternalfile}[1]{%
              \tikzsetnextfilename{#1-output}%
              \input{\tikzexternal@filenameprefix#1.tex}}
              \makeatother

              %Figure ruotate
              \NewEnviron{mylscape}{%
              \def\tempmylscape{\begin{landscape}\begin{figure}\centering}%
              \expandafter\expandafter\expandafter\afterpage
              \expandafter\expandafter\expandafter %
              {\expandafter\tempmylscape\BODY\end{figure}\end{landscape}}%
              }

              \tikzexternalize %Esternalizzazione

              % INIZIO DOCUMENTO
              %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
              \begin{document}

              \tikzsetexternalprefix{}
              \chapter{Primo}
              \lipsum

              \begin{mylscape}
              % \useexternalfile{prova}
              \begin{tikzpicture}[]
              \draw[ultra thick,red] (0,0) rectangle (19,11);
              \end{tikzpicture}
              \caption{Una figura di prova}
              \label{fig:my_fig}
              \end{mylscape}

              \lipsum

              \end{document}
              `

              eliminando il commento da [tt]\useexternalfile{prova}[/tt], si può metter il contenuto di [tt]tikzpicture[/tt] in un file [tt]prova.tex[/tt] nella directory principale.

              Il problema non dipende dall’ambiente [tt]mylscape[/tt] né da [tt]\afterpage[/tt]; immagino che occorra aggiungere un’impostazione a TikZ perché ruoti la figura.

              Se infatti provi con
              `\begin{landscape}
              \begin{figure}
              \centering
              % \useexternalfile{prova}
              \begin{tikzpicture}[]
              \draw[ultra thick,red] (0,0) rectangle (19,11);
              \end{tikzpicture}
              \caption{Una figura di prova}
              \label{fig:my_fig}
              \end{figure}
              \end{landscape}`
              ottieni lo stesso risultato.

              Ciao
              Enrico

            • #79064
              Andrea
              Partecipante
                Up
                0
                Down
                ::


                Magari ho capito male io, ma una cosa del tipo:
                `
                \begin{landscape}
                \begin{figure}
                \centering
                % \useexternalfile{prova}
                \begin{tikzpicture}[rotate=90]
                \draw[ultra thick,red] (0,0) rectangle (19,11);
                \end{tikzpicture}
                \caption{Una figura di prova}
                \label{fig:my_fig}
                \end{figure}
                \end{landscape}
                `
                risolve il problema solo quando [tt]\tikzexternalize[/tt] è attivo, mentre quando è disattivo ho lo stesso problema di prima… In pratica inverto solo la situazione.

                intendevi qualcosa di diverso con “aggiungere un’impostazione a TikZ perché ruoti la figura”?

              • #79065
                Andrea
                Partecipante
                  Up
                  0
                  Down
                  ::

                  egreg9″ post=78257
                  Il problema non dipende dall’ambiente [tt]mylscape[/tt] né da [tt]\afterpage[/tt]; immagino che occorra aggiungere un’impostazione a TikZ perché ruoti la figura.

                  Avevi ragione, sembra essere un baco di [tt]tikz[/tt], a quanto pere ben documentato. Ho risolto caricando
                  `
                  \usepackage[pdftex]{lscape}
                  `
                  invece di [tt]pdflscape[/tt], insieme dall’ambiente che hai suggerito, e tutto pare funzionare.

                  Grazie di tutto

                  Andrea

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

              Go to top