[Risolto] Anomalia pacchetto subfig

  • Creatore
    Topic
  • #32276
    Up
    0
    Down
    ::


    Buona sera

    Dispongo di due figure, una quadrata, una rettangolare con base maggiore dell’altezza.
    Le vorrei affiancare e per questo mi sono rivolto al pacchetto subfig.
    Utilizzando la sintassi standard
    `\begin{figure}%
    \centering
    \subfloat[didascalia1]{\includegraphics[width=.45\textwidth]{figura grande}} \hfill%
    \subfloat[didascalia2]{\includegraphics[width=.45\textwidth]{figura piccola}}
    \caption{dida comune}
    \end{figure}`
    ottengo le figure affiancate ma con la figura piccola allineata in basso come la figura grande, con un ampio spazio bianco sopra.

    La documentazione del pacchetto subfig (questa) alle pagine 44-45-46 mostra un esempio che fa esattamente al caso mio (figura 96).

    Io, però, ho semplicemente copiato il codice suggerito e l’ho riempito con i miei campi, così:
    `\newsavebox{\tempbox}
    \begin{figure}%
    \centering
    \sbox{\tempbox}{\includegraphics[width=.45\columnwidth]{scarico_2}}%
    \subfloat[Big figure]{\usebox{\tempbox}}%
    \qquad
    \subfloat[Small figure]{\vbox to \ht\tempbox{\vfil\includegraphics[width=.45\columnwidth]{controforza}\vfil}}%
    \caption{Two more sub-floats.}
    \label{fig:vertcenter}
    \end{figure}`
    e… le figure finiscono una sotto l’altra anziché affiancarsi (la figura bassa è però correttamente contenuta in una “scatola” alta come l’altra figura).
    Ho provato a sostituire \qquad con \hfill ma non è cambiato nulla. Tra l’altro, come si vede, ho impostato la laghezza di ciascuna figura al 45% della larghezza del testo, quindi lo spazio fisico per affiancarle dovrebbe esserci…
    L’unico tentativo che ha avuto un mezzo successo è stato togliere \qquad e \hfill, lasciando cioè
    `\subfloat[]{}%
    \subfloat[]{}`
    e ottengo le figure correttamente affiancate con le didascalie allineate in basso, ma se la figura 1 è giustamente allineata a sinistra con il testo, la figura 2 è mooolto spostata a destra, finisce fuori dai margini fin quasi a limite pagina lasciando uno spazio orizzontale enorme tra sè stessa e la figura 1…

    spero di essere stato chiaro.

    Per la cronaca, nel mio prembolo c’è, tra l’altro:
    `\documentclass[a4paper,titlepage,oneside,12pt]{article}

    \usepackage{graphicx}
    \usepackage[font=small]{caption}
    \usepackage[a4paper,top=3cm,bottom=3cm,left=3.5cm,right=3.5cm,]{geometry}
    \usepackage{floatrow,subfig}`

Visualizzazione 12 filoni di risposte
  • Autore
    Risposte
    • #32277
      Up
      0
      Down
      ::

      Buona sera

      Dispongo di due figure, una quadrata, una rettangolare con base maggiore dell’altezza.
      Le vorrei affiancare e per questo mi sono rivolto al pacchetto subfig.
      Utilizzando la sintassi standard
      `\begin{figure}%
      \centering
      \subfloat[didascalia1]{\includegraphics[width=.45\textwidth]{figura grande}} \hfill%
      \subfloat[didascalia2]{\includegraphics[width=.45\textwidth]{figura piccola}}
      \caption{dida comune}
      \end{figure}`
      ottengo le figure affiancate ma con la figura piccola allineata in basso come la figura grande, con un ampio spazio bianco sopra.

      La documentazione del pacchetto subfig (questa) alle pagine 44-45-46 mostra un esempio che fa esattamente al caso mio (figura 96).

      Io, però, ho semplicemente copiato il codice suggerito e l’ho riempito con i miei campi, così:
      `\newsavebox{\tempbox}
      \begin{figure}%
      \centering
      \sbox{\tempbox}{\includegraphics[width=.45\columnwidth]{scarico_2}}%
      \subfloat[Big figure]{\usebox{\tempbox}}%
      \qquad
      \subfloat[Small figure]{\vbox to \ht\tempbox{\vfil\includegraphics[width=.45\columnwidth]{controforza}\vfil}}%
      \caption{Two more sub-floats.}
      \label{fig:vertcenter}
      \end{figure}`
      e… le figure finiscono una sotto l’altra anziché affiancarsi (la figura bassa è però correttamente contenuta in una “scatola” alta come l’altra figura).
      Ho provato a sostituire \qquad con \hfill ma non è cambiato nulla. Tra l’altro, come si vede, ho impostato la laghezza di ciascuna figura al 45% della larghezza del testo, quindi lo spazio fisico per affiancarle dovrebbe esserci…
      L’unico tentativo che ha avuto un mezzo successo è stato togliere \qquad e \hfill, lasciando cioè
      `\subfloat[]{}%
      \subfloat[]{}`
      e ottengo le figure correttamente affiancate con le didascalie allineate in basso, ma se la figura 1 è giustamente allineata a sinistra con il testo, la figura 2 è mooolto spostata a destra, finisce fuori dai margini fin quasi a limite pagina lasciando uno spazio orizzontale enorme tra sè stessa e la figura 1…

      spero di essere stato chiaro.

      Per la cronaca, nel mio prembolo c’è, tra l’altro:
      `\documentclass[a4paper,titlepage,oneside,12pt]{article}

      \usepackage{graphicx}
      \usepackage[font=small]{caption}
      \usepackage[a4paper,top=3cm,bottom=3cm,left=3.5cm,right=3.5cm,]{geometry}
      \usepackage{floatrow,subfig}`

      La documentazione trascura un fatto piuttosto importante: che il “…figure code…” va inserito in una \hbox:
      `\subfloat[Small figure]{\vbox to \ht\tempbox{
      \vfil
      \hbox{\includegraphics[width=.45\columnwidth]{controforza}}
      \vfil}}`
      Naturalmente tutta questa roba va più utilmente messa nel preambolo:
      `\newdimen\templen
      \newcommand{\measure}[1]{{\sbox0{#1}\global\templen=\ht0 }}
      \newcommand{\adjustheight}[1]{\vbox to\templen{\vfil\hbox{#1}\vfil}}`
      Il tuo codice per le figure diventerebbe
      `\begin{figure}
      \centering
      \measure{\includegraphics[width=.45\columnwidth]{scarico_2}}%
      \subfloat[Big figure]{\includegraphics[width=.45\columnwidth]{scarico_2}}%
      \qquad
      \subfloat[Small figure]{\adjust{\includegraphics[width=.45\columnwidth]{controforza}}}
      \caption{Two more sub-floats.}
      \label{fig:vertcenter}
      \end{figure}`
      Dentro \measure puoi mettere qualsiasi cosa, non necessariamente il codice per la figura più grande, e puoi usare \adjust anche per più sottofigure.

      Ciao
      Enrico

    • #32278
      Up
      0
      Down
      ::

      La documentazione trascura un fatto piuttosto importante: che il “…figure code…” va inserito in una \hbox:
      Codice:
      \subfloat[Small figure]{\vbox to \ht\tempbox{
      \vfil
      \hbox{\includegraphics[width=.45\columnwidth]{controforza}}
      \vfil}}

      Perfetto, così funziona alla grande, ovviamente a meno della piccola svista:

      `\newcommand{\adjustheight}[1]{\vbox to\templen{\vfil\hbox{#1}\vfil}}`

      che poi diventa

      `\subfloat[Small figure]{\adjust{\includegraphics[width=.45\columnwidth]{controforza}}} `

      Grazie mille.

      GG

    • #32279
      Up
      0
      Down
      ::


      Vorrei affiancare due immagini in modo che:
      -le proporzioni delle immagini siano rispettate,
      -le due immagini abbiano la stessa altezza.
      L’idea è di misurare le proporzioni delle immagini e scalarle in modo da rispettare queste condizioni.

      Il 90% di quello che mi serve è già nel codice scritto da Enrico, ma non so nulla di programmazione in TeX/LaTeX. Mi chiedevo se qualcuno volesse aiutarmi.

      Supponiamo di avere l’immagine i1 di dimensioni 200×100 e i2 di dimensioni 300×300. Grossomodo, si dovrebbe assegnare a i2 uno spazio orizzontale pari a x e a i1 uno spazio orrizontale pari a 2x, considerando anche un eventuale spazio divisorio s.

      Si potrebbe inizialmente misurare la dimensione delle due immagini secondo la formula:
      propSum = largh(i1) / alt(i1) + largh(i2) / alt(i2)
      propSum = 200/100 + 300/300 = 3
      `\newcommand{\measure}[2]{{\sbox0{#1} \sbox1{#2} \global\propSum= (\wd0 / \ht0 + \wd1 / \ht1)}} `

      Poi quando si inseriscono le immagini, si potrebbe calcolare la larghezza delle immagini come:
      width(i1) = (( largh(i1) / alt(i1) ) / propSum – s) * \columnwidth
      width(i1) = ((200/100) / 3 – s) * \columnwidth = (0.66 – s) * \columnwidth
      `\newcommand{\includegraphicsWd}[1]{{\sbox0{#1} \includegraphics[width=( (\wd0 / \ht0) / \propSum – 0.05)\linewidth]{#1} }} `

      Il problema è che non ho assolutamente idea di come si sommino o dividano le dimensioni in latex.
      Più in generale, ci sono modi migliori per ottenere il risultato che vorrei?

      Grazie,

      Paolo

    • #32280
      Up
      0
      Down
      ::

      Vorrei affiancare due immagini in modo che:
      -le proporzioni delle immagini siano rispettate,
      -le due immagini abbiano la stessa altezza.
      L’idea è di misurare le proporzioni delle immagini e scalarle in modo da rispettare queste condizioni.

      Il 90% di quello che mi serve è già nel codice scritto da Enrico, ma non so nulla di programmazione in TeX/LaTeX. Mi chiedevo se qualcuno volesse aiutarmi.

      Supponiamo di avere l’immagine i1 di dimensioni 200×100 e i2 di dimensioni 300×300. Grossomodo, si dovrebbe assegnare a i2 uno spazio orizzontale pari a x e a i1 uno spazio orrizontale pari a 2x, considerando anche un eventuale spazio divisorio s.

      Si potrebbe inizialmente misurare la dimensione delle due immagini secondo la formula:
      propSum = largh(i1) / alt(i1) + largh(i2) / alt(i2)
      propSum = 200/100 + 300/300 = 3
      `\newcommand{\measure}[2]{{\sbox0{#1} \sbox1{#2} \global\propSum= (\wd0 / \ht0 + \wd1 / \ht1)}} `

      Poi quando si inseriscono le immagini, si potrebbe calcolare la larghezza delle immagini come:
      width(i1) = (( largh(i1) / alt(i1) ) / propSum – s) * \columnwidth
      width(i1) = ((200/100) / 3 – s) * \columnwidth = (0.66 – s) * \columnwidth
      `\newcommand{\includegraphicsWd}[1]{{\sbox0{#1} \includegraphics[width=( (\wd0 / \ht0) / \propSum – 0.05)\linewidth]{#1} }} `

      Il problema è che non ho assolutamente idea di come si sommino o dividano le dimensioni in latex.
      Più in generale, ci sono modi migliori per ottenere il risultato che vorrei?

      Due immagini, che vuoi ridurre all’altezza della più piccola:
      `\newdimen\tempheight
      \newbox\imageA
      \newbox\imageB
      \def\reductionratio{1}
      \newcommand{\twoimages}[2]{%
      \sbox\imageA{\includegraphics{#1}}%
      \sbox\imageB{\includegraphics{#2}}%
      \ifdim\ht\imageA>\ht\imageB
      \tempheight=\ht\imageB
      \else
      \tempheight=\ht\imageA
      \fi
      \sbox\imageA{\includegraphics[height=\tempheight]{#1}}%
      \sbox\imageB{\includegraphics[height=\tempheight]{#2}}%
      \tempheight=\dimexpr\wd\imageA+\wd\imageB+2em\relax
      \ifdim\tempheight>\columnwidth\calculateratio\fi
      \scalebox{\reductionratio}{\box\imageA}\hfill
      \scalebox{\reductionratio}{\box\imageB}}
      \def\calculateratio{\edef\reductionratio{0.%
      \number\numexpr\number\dimexpr\columnwidth\relax/
      \number\dimexpr.01\tempheight\relax}}`
      1) Calcolo la minima altezza e compongo le due immagini in due box, scalate in modo che siano a quella minima altezza.
      2) Vedo se ci stanno su una riga con 2em di spazio tra loro.
      3) Se non ci stanno, calcolo un fattore di scala perché ci stiano.

      \twoimages{Immagine1}{Immagine2}

      Ciao
      Enrico

    • #32281
      Up
      0
      Down
      ::


      Grazie mille Enrico!
      Ci sarebbero un paio di correzioni che farei:
      `\newdimen\tempheight
      \newbox\imageA
      \newbox\imageB
      \def\reductionratio{1}
      \newcommand{\twoimages}[2]{%
      \sbox\imageA{\includegraphics{#1}}%
      \sbox\imageB{\includegraphics{#2}}%
      \ifdim\ht\imageA>\ht\imageB
      \tempheight=\ht\imageB
      \else
      \tempheight=\ht\imageA
      \fi
      \sbox\imageA{\includegraphics[height=\tempheight]{#1}}%
      \sbox\imageB{\includegraphics[height=\tempheight]{#2}}%
      \tempheight=\dimexpr\wd\imageA+\wd\imageB\relax
      \ifdim\tempheight>.98\columnwidth\calculateratio\fi
      \scalebox{\reductionratio}{\box\imageA} \hfill
      \scalebox{\reductionratio}{\box\imageB}}
      \def\calculateratio{\edef\reductionratio{0.%
      \number\numexpr\number\dimexpr.98\columnwidth\relax/
      \number\dimexpr.01\tempheight\relax}}`
      La prima correzione è una semplice svista, le successive sono per evitare che il 2em di spaziatura venga scalato anch’esso, ottenendo una spaziatura troppo piccola nel caso di grandi immagini.

      In realtà, avrei bisogno ancora di aiuto. Pensavo di includere gli \includegraphics in \parbox per ottenere due immagini affiancate, non logicamente correlate (quindi non subfig), con rispettive didascalie. La tecnica è spiegata nell’introduzione del manuale di subfig. Tutti i calcoli nel post precedente erano quindi indirizzati anche a fornire il parametro giusto al parbox. Come si potrebbe fare in questo caso?

      Ti ringrazio ancora per la disponibilità.

      Paolo

    • #32282
      Up
      0
      Down
      ::

      Grazie mille Enrico!
      Ci sarebbero un paio di correzioni che farei:
      `\newdimen\tempheight
      \newbox\imageA
      \newbox\imageB
      \def\reductionratio{1}
      \newcommand{\twoimages}[2]{%
      \sbox\imageA{\includegraphics{#1}}%
      \sbox\imageB{\includegraphics{#2}}%
      \ifdim\ht\imageA>\ht\imageB
      \tempheight=\ht\imageB
      \else
      \tempheight=\ht\imageA
      \fi
      \sbox\imageA{\includegraphics[height=\tempheight]{#1}}%
      \sbox\imageB{\includegraphics[height=\tempheight]{#2}}%
      \tempheight=\dimexpr\wd\imageA+\wd\imageB\relax
      \ifdim\tempheight>.98\columnwidth\calculateratio\fi
      \scalebox{\reductionratio}{\box\imageA} \hfill
      \scalebox{\reductionratio}{\box\imageB}}
      \def\calculateratio{\edef\reductionratio{0.%
      \number\numexpr\number\dimexpr.98\columnwidth\relax/
      \number\dimexpr.01\tempheight\relax}}`
      La prima correzione è una semplice svista, le successive sono per evitare che il 2em di spaziatura venga scalato anch’esso, ottenendo una spaziatura troppo piccola nel caso di grandi immagini.

      In realtà, avrei bisogno ancora di aiuto. Pensavo di includere gli \includegraphics in \parbox per ottenere due immagini affiancate, non logicamente correlate (quindi non subfig), con rispettive didascalie. La tecnica è spiegata nell’introduzione del manuale di subfig. Tutti i calcoli nel post precedente erano quindi indirizzati anche a fornire il parametro giusto al parbox. Come si potrebbe fare in questo caso?

      `\documentclass[a4paper]{article}
      \usepackage{graphicx}

      \newdimen\tempheight
      \newbox\imageA
      \newbox\imageB
      \def\reductionratio{1}
      \newcommand{\computefortwoimages}[2]{%
      \sbox\imageA{\includegraphics{#1}}%
      \sbox\imageB{\includegraphics{#2}}%
      \ifdim\ht\imageA>\ht\imageB
      \tempheight=\ht\imageB
      \else
      \tempheight=\ht\imageA
      \fi
      \sbox\imageA{\includegraphics[height=\tempheight]{#1}}%
      \sbox\imageB{\includegraphics[height=\tempheight]{#2}}}
      \def\computeratio{\edef\reductionratio{0.%
      \number\numexpr\number\dimexpr.98\columnwidth\relax/\number\dimexpr.01\tempheight\relax}}

      \newcommand{\twoimages}[2]{%
      \computefortwoimages{#1}{#2}%
      \tempheight=\dimexpr\wd\imageA+\wd\imageB\relax
      \ifdim\tempheight>.98\columnwidth\computeratio\fi
      \scalebox{\reductionratio}{\box\imageA}\hfill
      \scalebox{\reductionratio}{\box\imageB}}

      \newcommand{\twofigures}[4]{%
      % #1=file esterno (sinistra)
      % #2=\caption[…]{…}\label{…}
      % #3=file esterno (destra)
      % #4=\caption[…]{…}\label{…}
      \computefortwoimages{#1}{#3}%
      \tempheight=\dimexpr\wd\imageA+\wd\imageB\relax
      \ifdim\tempheight>.98\columnwidth\computeratio\fi
      \hbox to\hsize{%
      \vtop{\parindent=0pt\hsize=\reductionratio\wd\imageA
      \scalebox{\reductionratio}{\box\imageA}#2}%
      \hfill
      \vtop{\parindent=0pt\hsize=\reductionratio\wd\imageB
      \scalebox{\reductionratio}{\box\imageB}#4}%
      }%
      }

      \begin{document}
      \begin{center}
      \twoimages{try}{duck}
      \end{center}
      \begin{center}
      \twoimages{efield-dipole}{pgf-apple}
      \end{center}

      \begin{figure}
      \twofigures{try}{\caption[abc]{Didascalia}}
      {duck}{\caption{Questa paperella porta una didascalia molto lunga e vediamo che succede}}
      \end{figure}
      \end{document}`
      Sostituisci i nomi dei file grafici per fare le tue prove.

      Ciao
      Enrico

    • #32283
      Up
      0
      Down
      ::


      Credo che \twofigures non funzioni correttamente. Nel mio caso, posiziona la prima immagine correttamente, la prima didascalia dove dovrebbe apparire la seconda didascalia, e le seconda immagine e le seconda didascalia non appaiono proprio. La seconda immagine non appare neppure lasciando vuoti i parametri #2 e #4. :S

    • #32284
      Up
      0
      Down
      ::

      Credo che \twofigures non funzioni correttamente. Nel mio caso, posiziona la prima immagine correttamente, la prima didascalia dove dovrebbe apparire la seconda didascalia, e le seconda immagine e le seconda didascalia non appaiono proprio. La seconda immagine non appare neppure lasciando vuoti i parametri #2 e #4. :S

      Ho riportato l’intero documento .tex proprio perché ci fosse un esempio. A me funziona correttamente. Ecco qui il risultato.

      Ciao
      Enrico

    • #32285
      Up
      0
      Down
      ::


      Per qualche ragione a me non funziona. Non saprei davvero qual è il problema.
      Qui riporto il file tex, il pdf e le immagini usate. Uso pdflatex e texlive 2010.

    • #32286
      Up
      0
      Down
      ::

      Per qualche ragione a me non funziona. Non saprei davvero qual è il problema.
      Qui riporto il file tex, il pdf e le immagini usate. Uso pdflatex e texlive 2010.

      Vero.
      `\newcommand{\twofigures}[4]{%
      % #1=file esterno (sinistra)
      % #2=\caption[…]{…}\label{…}
      % #3=file esterno (destra)
      % #4=\caption[…]{…}\label{…}
      \computefortwoimages{#1}{#3}%
      \tempheight=\dimexpr\wd\imageA+\wd\imageB\relax
      \ifdim\tempheight>.95\columnwidth\computeratio\fi
      \hbox to\hsize{%
      \vtop{\parindent=0pt\hsize=\reductionratio\wd\imageA
      \scalebox{\reductionratio}{\box\imageA}#2}%
      \hfill
      \vtop{\parindent=0pt\hsize=\reductionratio\wd\imageB
      \scalebox{\reductionratio}{\box\imageB}#4}%
      }%
      }`
      Ciao
      Enrico

    • #32287
      Up
      0
      Down
      ::


      Mi spiace disturbare ancora, ma il codice sembra avere qualche incompatibilità con il pacchetto caption. 😳
      Caricando il pacchetto nell’esempio le didascalie hanno seri problemi di posizione e lunghezza.

    • #32288
      Up
      0
      Down
      ::

      Mi spiace disturbare ancora, ma il codice sembra avere qualche incompatibilità con il pacchetto caption. 😳
      Caricando il pacchetto nell’esempio le didascalie hanno seri problemi di posizione e lunghezza.

      Sostituisci la definizione di \twofigures con questo codice:
      `\newcommand{\twofigures}[4]{%
      % #1=file esterno (sinistra)
      % #2=\caption[…]{…}\label{…}
      % #3=file esterno (destra)
      % #4=\caption[…]{…}\label{…}
      \computefortwoimages{#1}{#3}%
      \tempheight=\dimexpr\wd\imageA+\wd\imageB\relax
      \ifdim\tempheight>.95\columnwidth\computeratio\fi
      \hbox to\hsize{\boxfigure\imageA{#2}%
      \hfill\boxfigure\imageB{#4}}%
      }
      \newcommand\boxfigure[2]{\begin{minipage}[t]{\reductionratio\wd#1}
      \scalebox{\reductionratio}{\box#1}#2\end{minipage}}`
      Ciao
      Enrico

    • #32289
      Up
      0
      Down
      ::


      Funziona benissimo!
      Grazie mille!

      Paolo

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

Go to top