Re: Newenvironment e afterpage

#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

    Go to top