giustificare in un makebox a seconda del numero di pagina

  • Creatore
    Topic
  • #45561
    Up
    0
    Down
    ::


    Salve a tutti.
    Sottopongo il modo in cui ho posizionato una figura all’interno di un mio documento.
    La figura appare così:

    Il codice per ottenere questa disposizione è il seguente:
    `
    % preambolo
    \usepackage[innercaption,wide]{sidecap}

    % …

    \begin{SCfigure}[0.8][t]
    \makebox[0.70\textwidth][r]{
    \includegraphics[width=0.84\textwidth]{immagine.pdf}
    }
    \caption{\finalhyphendemerits=1000
    Volo in richiamata. Il valore del fattore di carico normale $f_{z_\mathrm{A}}$
    è determinato prevalentemente dal rapporto fra la portanza e il peso, se si trascura
    il contributo della spinta: $T\sin(\alpha_\mathrm{B} + \mu_T)\approx 0$.}
    \end{SCfigure}
    `

    Questa disposizione della didascalia, ottenuta con il pacchetto sidecap mi permette di sfruttare lo spazio dei margini del testo e al, tempo stesso, di risparmiare qualche riga.
    Come si vede, l’immagine possiede degli ampi spazi bianchi nella parte inferiore, sia da un lato che dall’altro. Grazie a questa caratteristica ho potuto sovrapporre il testo della didascalia al riquadro dell’immagine ottenendo un effetto abbastanza gradevole senza stravolgere il layout.
    L’effetto di ottiene racchiudendo l’immagine, che è larga 0.84\textwidth, in una scatola di minore larghezza, 0.70\textwidth, e giustificandola a destra passando il parametro r alla macro makebox.

    La mia domanda è la seguente: essendo un documento twoside, come posso rendere la giustificazione del contenuto della scatola ‘sensibile’ al numero di pagina?

    In altre parole, se dovessi aggiungere contenuti al mio documento potrebbe capitare che l’oggetto flottante venga posizionato dal compositore nella pagina successiva, che in questo caso non sarebbe più una oddpage.
    Dovrebbe essere possibile usare il pacchetto changepage e rimpiazzare il parametro r passato a makebox con un codice TeX che passi r o l a seconda se si tratti di pagina recto o verso.

    Qualcuno può darmi suggerimenti?

    Ciao e grazie,
    Agostino

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #45562
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Agostino, non ho sottomano la soluzione che ho implementato tempo fa; ma visto che siamo nel forum dico come risolsi il problema:

        1) ho cercato nel file latex.ltx (il file sorgente del formato LaTeX) la definizione di \pageref: essa preleva il secondo elemento di 2 o di 5 argomenti (2 normalmente, 5 se viene usato hyperref) che contiene il numero della pagina
        2) uso la macro di servizio che usa \pageref adeguatamente sottoposta ad un \if (precisamente \@ifpackageloaded) per sapere se devo prendere il secondo di 2 o il secondo di 5 argomenti.
        3) prelevo il numero di pagina dal label della figura (magari bisogna far girare pdflatex due volte per essere sicuri che il valore della pagina sia aggiornato) e lo carico in un contatore;
        4) uso il comando condizionale \ifodd per sapere se il numero di pagina è pari o dispari e poi mi comporto in modo corrispondente, cioè creo la scatola \makebox con l’opzione di posizionamento r o l a seconda della aprità del numero di pagina.

        Ovviamente la ricrca su latex.ltx serve solo per sapere come si chiama la macro di servizio; tutto il resto va programmato nel solito file di macro personali.

      • #45563
        Up
        0
        Down
        ::

        Agostino, non ho sottomano la soluzione che ho implementato tempo fa; ma visto che siamo nel forum dico come risolsi il problema:

        1) ho cercato nel file latex.ltx (il file sorgente del formato LaTeX) la definizione di \pageref: essa preleva il secondo elemento di 2 o di 5 argomenti (2 normalmente, 5 se viene usato hyperref) che contiene il numero della pagina
        2) uso la macro di servizio che usa \pageref adeguatamente sottoposta ad un \if (precisamente \@ifpackageloaded) per sapere se devo prendere il secondo di 2 o il secondo di 5 argomenti.
        3) prelevo il numero di pagina dal label della figura (magari bisogna far girare pdflatex due volte per essere sicuri che il valore della pagina sia aggiornato) e lo carico in un contatore;
        4) uso il comando condizionale \ifodd per sapere se il numero di pagina è pari o dispari e poi mi comporto in modo corrispondente, cioè creo la scatola \makebox con l’opzione di posizionamento r o l a seconda della aprità del numero di pagina.

        Ovviamente la ricrca su latex.ltx serve solo per sapere come si chiama la macro di servizio; tutto il resto va programmato nel solito file di macro personali.

        Aggiungo che questo è uno dei casi in cui ifthen è utile, perché è in grado di gestire \isodd{\pageref{}} anche se l’etichetta non è ancora registrata nel file .aux

        In questo caso consiglierei di definire un’etichetta “invisibile”, in modo che non si debba richiamare quella affibbiata alla didascalia e il tutto sia automatico:
        `\newcounter{dancingfigure}
        \newenvironment{dancingfigure}[1][tbp]
        {\refstepcounter{dancingfigure}%
        \edef\temp{\noexpand\label{DF@\arabic{dancingfigure}}}\temp
        \ifthenelse{\isodd{\pageref{DF@\arabic{dancingfigure}}}}
        {\odddancingfigure}{\evendancingfigure}
        \begin{SCfigure}[0.8][#1]}
        {\end{SCfigure}}
        \newcommand{\odddancingfigure}{\def\positioning{r}}
        \newcommand{\evendancingfigure}{\def\positioning{l}}
        \newcommand{\dancinginclude}[2][]{%
        \makebox[0.7\textwidth][\positioning]{%
        \includegraphics[width=0.84\textwidth,#1]{#2}}}

        \begin{dancingfigure}[tp]
        \dancinginclude{immagine}
        \caption{didascalia}
        \end{dancingfigure}`
        Durante la preparazione del testo le figure potrebbero venire messe in modo sbagliato, ma quando si finisce e si compila fino a risolvere i riferimenti incrociati, tutto va a posto.

        Meglio non usare poi etichette esplicite come \label{DF@1}. 🙂

        Ciao
        Enrico

      • #45564
        Up
        0
        Down
        ::


        Grazie, Claudio ed Enrico, per la risposta.
        Ho provato la soluzione di Enrico e funziona perfettamente per i miei scopi.
        Ho notato che quando l’oggetto flottante viene posizionato abbastanza lontano dal punto nel codice in cui viene inserito l’ambiente dancingfigure, il posizionamento dell’immagine all’interno di \makebox fallisce. In quei casi sono costretto a ‘forzare’ l’inserimento della figura con la macro \afterpage. Ma ritengo questo comportamento abbastanza ‘fisiologico’.

        Ho generalizzato l’ambiente dancingfigure e la macro \includedancing suggeriti da Enrico in modo che accettino altri parametri. Ciò fornisce la possibilità all’utente di apportare aggiustamenti alle varie dimensioni in gioco. Ho anche aggiunto la possibilità di ‘sollevare’ il contenuto di \makebox.
        L’esempio seguente mostra un caso tipico:

        Il codice da inserire nel preambolo è il seguente:
        `
        \newcounter{dancingfigure}
        \newenvironment{dancingfigure}[2][]
        {\refstepcounter{dancingfigure}%
        \edef\temp{\noexpand\label{DF@\arabic{dancingfigure}}}\temp
        \ifthenelse{\isodd{\pageref{DF@\arabic{dancingfigure}}}}
        {\odddancingfigure}{\evendancingfigure}
        \begin{SCfigure}[#2][#1]}
        {\end{SCfigure}}
        \newcommand{\odddancingfigure}{\def\positioning{r}}
        \newcommand{\evendancingfigure}{\def\positioning{l}}
        \newcommand{\dancinginclude}[5]{% all mandatory parameters
        \makebox[#1][\positioning]{%
        \raisebox{#5}{%
        \includegraphics[width=#2,#3]{#4}}}}

        `

        Un esempio d’uso è il seguente:
        `
        \begin{dancingfigure}%
        [t]% position on the page
        {1.7}% sidecaption with, in terms of box width
        \dancinginclude%
        {0.58\textwidth}% box width
        {0.84\textwidth}% image width (inside box)
        {}% additional option in includegraphics
        {immagine.pdf}
        {4.0em}% raise the image of this amount
        \caption{\finalhyphendemerits=1000
        Coppie inerziali in presenza di accelerazione angolare $\dot{r}$ e di una
        velocità angolare $\vec{\Omega}$ di componenti $(p,q,r)$ rispetto agli
        assi centrali d'inerzia del velivolo.
        Le masse concentrate del sistema equivalente disposte lungo gli assi $\xi$ ed $\eta$
        sono soggette a forze d'inerzia centrifuge dovute alla proiezione
        $\vec{\Omega}_{\!\xi\eta}$ di $\vec{\Omega}$ nel piano $\xi\eta$.
        }%
        \label{fig:AC:Coppie:Inerziali:OmXY}%
        \end{dancingfigure}

        `

        Come si vede dall’esempio, la scatola che contiene l’immagine ha larghezza w=0.58\textwidth. La larghezza della didascalia è pari a 1.7w. L’immagine ha invece larghezza w’=0.84\textwidth, è inserita nella scatola ed è giustificata a destra (perché in questo caso siamo in una oddpage).
        Infine, il contenuto della scatola viene sollevato di una quantità h=4em attraverso la macro \raisebox.

        Ciao,
        Agostino

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

    Go to top