[RISOLTO] pspicture più larga di \textwidth

  • Creatore
    Topic
  • #103298
    Up
    0
    Down
    ::


    ciao a tutti
    come dice il titolo devo fare una pspicture che occupi la parte del testo (\textwidht) e delle note (marginpar)
    sono in classe book e ovviamente le pagine cambiano se pari o dispari
    ho trovato questo post però per l’ambiente figure (non lo sto usando, la mia immagine è solo dentro un \begin{center} e \begin{pspicture})

    http://www.guit.sssup.it/phpbb/viewtopic.php?t=9826&start=0&postdays=0&postorder=asc&highlight=

    e questo per le tabelle:

    http://www.guit.sssup.it/phpbb/viewtopic.php?t=9408

    scusate un po’ di pigrizia (lo ammetto) ma questo codice mi sembra arabo
    (so che qualcuno mi risponderà che potrei imparare al posto di fastidiare, ma davvero non ho il tempo e non faccio un uso esagerato di latex tale da giustificare certi investimenti di tempo)

    vorrei capire da dove parto per risolvere il problema della mia pspicture

    ciao e grazie

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #103299
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Il tuo problema non è banale, quindi devi avere pazienza e se quelle due vecchie discussioni ti possono essere utili usale, altrimenti posso mandarti altro codice arabo o cinese con il quale risolvere il problema.
        La cosa diventa più facile se metti la tua pspicture in una figure flottante a cui apporrai la didascalia e un label per riferirti a quella figura con un “… mostrato nella figura~\ref{fig:pspicturelarga}…”
        la soluzione dunque è questa:`\begin{figure}
        \makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+marginparwidth]{\begin{pspicture}…\end{pspicure}}}
        \caption{…}\label{fig:…}
        \endf{figure}`
        Funziona così: ci sono due scatole: quella più esterna è larga esattamente \textwidth e contiene un’altra scatola larga quanto la somma della giustezza del teso più lo spazio fra il testo e le note marignali più la larghezza delle note marginali questa seconda scatola contiene la pspicture; per farla sbordare fuori del margine destro o sinistro, la scatola esterna deve contenere la scatola che contiene la figura accostata a siinstra se la pagina è disperi e a destra se la pagina è pari ecco quindi che nel suo secondo argomento facoltativo c’è il test sul numero della pagina per cui se il numero di pagina è dispari, specifica il codice di posizionamento l altrimenti lo specifica r.

        Nota questo test sul numero di pagina può essere fatto solo se l’oggetto è flottante: il numero di pagina viene fissato solo nel momento in cui l’oggetto flottante viene messo in una pagina e questa viene accodata al file di uscita.

        Data la natura asincrona fra la composizione del testo e la costruzione della pagina che viene inviata al file di uscita il numero di pagina non è noto quando venisse compilato un ambiente center che contenesse la pspicture; quindi il test sul numero di pagina sarebbe verosimilmente errato. Questo problema si può risolvere con la definizione di label di servizio a cui viene assegnato un valore quando quella pagina vien inviata all’uscita: ricompilando l’etichetta del label contiene il numero della pagina e se ne può controllare la parità solo alla seconda passata. le macro da usare sono molto particolari e potrebbero apparire “arabo” o “cinese” e di difficile modifica se non se ne ha completa padronanza.
        Esistono classi, come memoir che dispongono di una interfaccia utente, di macro a disposizione dell’utente che permettono di fare queste acrobazie, nascondendo all’utente finale quello che sta sotto il cofano. Non so se hai voglia di usare memoir. In ogni caso le sue macro utente sono descritte nel paragrafo 18.12 della documentazione di memoir.

      • #103300
        Up
        0
        Down
        ::


        molte grazie per la risposta esaustiva

        il codice non fa bene i suoi conti, però

        ho provato ad usarlo, ma la figura risulta corretta solo nella pagina dispari, mentre che nelle pari non inverte come vorrei

        ti mando il codice di un mini fai che ho usato per prova disegnando un rettangolo

        `
        \documentclass[10pt,twoside,fleqn]{book}
        % \documentclass[10pt,twoside,fleqn,openany]{book}
        \usepackage[letterpaper,includehead,includefoot,inner=2cm,outer=1cm,bottom=2cm,top=2cm, marginparwidth=5cm, marginparsep=0.5cm, includemp]{geometry}

        %Con geometry puoi dare `\newgeometry` e `\restoregeometry`. Il manuale è abbastanza chiaro.

        \usepackage{pspicture}
        \usepackage{pst-all}
        \usepackage{pst-fill}

        \usepackage{lipsum}

        \begin{document}

        \begin{figure}
        \makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{
        \begin{pspicture}(0,-5)(18,5) %la figura è in (-10.5,0)(8,-5)
        \psframe(0,-5)(18,5)
        \end{pspicture}
        }}
        % \caption{…}\label{fig:…}
        \end{figure}

        \lipsum[1]

        \begin{figure}
        \makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{
        \begin{pspicture}(0,-5)(18,5) %la figura è in (-10.5,0)(8,-5)
        \psframe(0,-5)(18,5)
        \end{pspicture}
        }}
        % \caption{…}\label{fig:…}
        \end{figure}

        \lipsum[1]

        \begin{figure}
        \makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{
        \begin{pspicture}(0,-5)(18,5) %la figura è in (-10.5,0)(8,-5)
        \psframe(0,-5)(18,5)
        \end{pspicture}
        }}
        % \caption{…}\label{fig:…}
        \end{figure}

        \lipsum[1]

        \begin{figure}
        \makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{
        \begin{pspicture}(0,-5)(18,5) %la figura è in (-10.5,0)(8,-5)
        \psframe(0,-5)(18,5)
        \end{pspicture}
        }}
        % \caption{…}\label{fig:…}
        \end{figure}

        \lipsum[1]
        \end{document}
        `

        ma se provi a compilare vedrai che non fa questo calcolo di pari o dispari
        (o lo fa, ma il risultato non cambia)

        ho provato anche a compilare più volte (per vedere se doveva fare calcoli…) ma il risultato non cambia

        hai qualche idea?
        grazie anticipatamente

      • #103301
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Sì, non è che non funzioni, è che se dalla pagina precedente ci sono ancora figure in coda il meccanismo asincrono di comporre le pagine le piazza, come se appartenessero alla pagina precedente; se fai delle figure più grandi e e specifichi che le vuoi solo al top della pagina, )per esempio, il problema non si pone. Il seguente esempio deriva dal tuo Ho dovuto togliere le figure postscript perché a me dava un errore su un certo comando non definito (la mia installazione è stata aggiornata tre giorni fa, quindi direi che non ho vecchi file …)
          Ho usato il semplice ambinete picture epr mettere il rettangolo e la cosa viene benissimo.` \documentclass[10pt,twoside,fleqn]{book}
          % \documentclass[10pt,twoside,fleqn,openany]{book}
          \usepackage[letterpaper,includehead,includefoot,inner=2cm,outer=1cm,bottom=2cm,top=2cm, marginparwidth=5cm, marginparsep=0.5cm, includemp]{geometry}

          %Con geometry puoi dare `\newgeometry` e `\restoregeometry`. Il manuale è abbastanza chiaro.

          %\usepackage{pspicture}
          %\usepackage{pst-all}
          %\usepackage{pst-fill}

          \usepackage{lipsum}

          \begin{document}

          \unitlength=1cm

          \begin{figure}[t]
          \makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{%
          \begin{picture}(18,10)
          \put(0,0){\framebox(18,10)}
          \end{picture}
          }}
          % \caption{…}\label{fig:…}
          \end{figure}

          \lipsum[1-4]

          \begin{figure}[t]
          \makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{%
          \begin{picture}(18,10) %la figura è in (-10.5,0)(8,-5)
          \put(0,0){\framebox(18,10)}
          \end{picture}
          }}
          % \caption{…}\label{fig:…}
          \end{figure}

          \lipsum[1-4]

          \begin{figure}[t]
          \makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{%
          \begin{picture}(18,10) %la figura è in (-10.5,0)(8,-5)
          \put(0,0){\framebox(18,10)}
          \end{picture}
          }}
          % \caption{…}\label{fig:…}
          \end{figure}

          \lipsum[1-4]

          \begin{figure}[t]
          \makebox[\textwidth][\ifodd\value{page}l\else r\fi]{\makebox[\dimexpr\textwidth+\marginparsep+\marginparwidth]{%
          \begin{picture}(18,10) %la figura è in (-10.5,0)(8,-5)
          \put(0,0){\framebox(18,10)}
          \end{picture}
          }}
          % \caption{…}\label{fig:…}
          \end{figure}

          \lipsum[1-4]
          \end{document}
          `

        • #103302
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Qui c’è un’altra soluzione molto più complessa, ma che non dovrebbe soffrire dei problemi della soluzione che ti ho dato precedentemente.`\documentclass{article}

            \usepackage{kantlipsum}

            \makeatletter
            \newcommand*\sedispari[1]{%
            \edef\LRfig{\the\c@page}\ifcsname r@#1\endcsname
            \edef\LRfig@{\csname r@#1\endcsname}
            \edef\LRfig{\expandafter\@secondoftwo\LRfig@}\fi
            \toks@=\expandafter{\LRfig}
            \edef\RLfig{\ifodd\the\toks@ l\else r\fi}}

            \begin{document}\errorcontextlines=9
            \kant[1-4]
            \unitlength=1cm

            \begin{figure}\sedispari{fig:primafigura}
            \makebox[\textwidth][\RLfig]{%
            \begin{picture}(14,3)
            \put(0,0){\framebox(14,3){}}
            \end{picture}}
            \caption{Prima figura}\label{fig:primafigura}
            \end{figure}

            \kant[5-6]

            \begin{figure}\sedispari{fig:secondafigura}
            \makebox[\textwidth][\RLfig]{%
            \begin{picture}(14,3)
            \put(0,0){\framebox(14,3){}}
            \end{picture}}
            \caption{Seconda figura}\label{fig:secondafigura}
            \end{figure}

            \kant[7]

            \begin{figure}\sedispari{fig:terzafigura}
            \makebox[\textwidth][\RLfig]{%
            \begin{picture}(14,3)
            \put(0,0){\framebox(14,3){}}
            \end{picture}}
            \caption{Terza figura}\label{fig:terzafigura}
            \end{figure}

            \end{document}`

            È leggermente più laboriosa, ma funziona bene come vedi dall’esempio minimo che ti allego.
            Funziona così:
            1) il comando \sedispari vuole come argomento lo stesso label che specifichi dopo \caption o altro label a tuo piacimento che sia messo alla fine dell’ambiente flottante; se metti sempre le didascalie soto all’oggetto mostrato, non ci sono problemi; se invece, come con le tabelle, metti la didascalia prima della tabella, o metti il label dopo tabular, o dopo tabular metti un label di tua scelta da ripetere nell’argomento di \sedispari, che invece deve stare comunque all’inizio dell’ambiente flottante.
            2) \sedispari cerca di indovinare la parità della pagina alla prima compilazione, ma comunque ne prende il valore esatto alla seconda compilazione.
            3) A seconda della parità della pagina viene definito un significato per \LRfig, che viene usato coma codice di allineamento della macro \makebox.
            4) Inserisci l’oggetto largo dentro una \makebox larga quanto \textwidth, ma specificano l’allineamento mediante \LRfig.
            5) Compili due volte (non occorre farlo quando la figura è già stata esaminata in compilazioni precedenti) e il tuo oggetto largo si trova collocato al punto giusto.

            La complicazione della definizione della macro \sedispari dipende dal fatto che quanto il comando \label scrive nel file aux è bene nascosto dentro macro il cui nome è ottenuto dal nome dell’etichetta fornita a \label aggiungendoci opportuni prefissi.

            È possibile che la macro \sedispari non funzioni correttamente se il tuo file usa hyperref. Non ho fatto questo collaudo; eventualmente fammelo sapere affinché ti possa dare una macro che funzioni correttamente anche con la presenza di hyperref.

          • #103303
            Up
            0
            Down
            ::


            per il momento ho un po’ di problemi

            prendo un po’ di tempo e poi dirò se riesco

            intanto grazie

          • #103304
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              Intanto io ho collaudato con hyperef e le macro che ti ho invito non funzionano. Nel frattempo ho anche cambiato noi ed altro. quindi prima di allegarti il nuovo set di macro con l’esempio di applicazione anche per le tabelle, aspetto iltuo “via libera”.

              Per ora bisogna solo vedere se funziona bene con qualsiasi oggetto, per esempio con le tue psfigure.

            • #103305
              Up
              0
              Down
              ::


              mi sembra che la prima delle due soluzioni sia buona per me.

              nel senso che mi sembra che faccia confusione se metto molte immagini “larghe” una in fila all’altra, ma se ne metto una ogni tanto (3-4 pagine) mi sembra che non faccia confusione

              la seconda maniera non mi funzionava appunto per le pspicture

              molte grazie

              ciao

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

          Go to top