Regolare in automatico le dimensioni immagine

  • Creatore
    Topic
  • #54565
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Ciao,
      ho elaborato il seguente codice che inserisce un immagine con il seguente criterio: se una dimensione (larghezza od altezza) supera una certa percentuale dello spazio disponibile (80% larghezza testo, 50% altezza testo), inserisce l’immagine adattandola a quel limite altrimenti inserisce l’immagine nelle sue dimensioni naturali.

      Il comando si chiama \insertimage e vuole come argomento obbligatorio il nome del file immagine da inserire, nel formato compatibile con il compilatore utilizzato (pdf, png, jpg per pdflatex e eps per latex).

      In alcune situazioni può essere utile, se non altro come esempio di utilizzo di condizionali e registri dimensionali TeX (e non LaTeX).

      Ecco il codice:
      `
      \documentclass{minimal}

      \newdimen\x
      \newdimen\y

      \newbox\imgbox

      \newcommand{\insertimage}[1]{%
      \setbox\imgbox=\hbox{\includegraphics{#1}}%
      \x=\wd\imgbox
      \y=\ht\imgbox
      \ifdim\x<\y \ifdim\y>0.5\textheight
      \includegraphics[height=0.5\textheight]{#1}
      \else
      \includegraphics{#1}
      \fi
      \else
      \ifdim\x>0.8\columnwidth
      \includegraphics[width=0.8\columnwidth]{#1}
      \else
      \includegraphics{#1}
      \fi
      \fi
      }
      \begin{document}
      \begin{figure}
      \centering
      \insertimage{filename}
      \caption{Figure description}
      \end{figure}
      \end{document}
      `

      A voi i commenti. Grazie!
      Un miglioramento potrebbe essere quello di racchiudere in un gruppo la prima definizione della scatola così da liberarne la memoria una volta memorizzate nelle variabili \x ed \y le dimensioni. Si può fare?

      Tutto il codice compreso un esempio, è spiegato nella guida alla programmazione di Enrico (scaricabile dal suo sito).
      Bye

    Visualizzazione 3 filoni di risposte
    • Autore
      Risposte
      • #54566
        Up
        0
        Down
        ::

        Ciao,
        ho elaborato il seguente codice che inserisce un immagine con il seguente criterio: se una dimensione (larghezza od altezza) supera una certa percentuale dello spazio disponibile (80% larghezza testo, 50% altezza testo), inserisce l’immagine adattandola a quel limite altrimenti inserisce l’immagine nelle sue dimensioni naturali.

        Il comando si chiama \insertimage e vuole come argomento obbligatorio il nome del file immagine da inserire, nel formato compatibile con il compilatore utilizzato (pdf, png, jpg per pdflatex e eps per latex).

        In alcune situazioni può essere utile, se non altro come esempio di utilizzo di condizionali e registri dimensionali TeX (e non LaTeX).

        Ecco il codice:
        `
        \documentclass{minimal}

        \newdimen\x
        \newdimen\y

        \newbox\imgbox

        \newcommand{\insertimage}[1]{%
        \setbox\imgbox=\hbox{\includegraphics{#1}}%
        \x=\wd\imgbox
        \y=\ht\imgbox
        \ifdim\x<\y \ifdim\y>0.5\textheight
        \includegraphics[height=0.5\textheight]{#1}
        \else
        \includegraphics{#1}
        \fi
        \else
        \ifdim\x>0.8\columnwidth
        \includegraphics[width=0.8\columnwidth]{#1}
        \else
        \includegraphics{#1}
        \fi
        \fi
        }
        \begin{document}
        \begin{figure}
        \centering
        \insertimage{filename}
        \caption{Figure description}
        \end{figure}
        \end{document}
        `

        A voi i commenti. Grazie!
        Un miglioramento potrebbe essere quello di racchiudere in un gruppo la prima definizione della scatola così da liberarne la memoria una volta memorizzate nelle variabili \x ed \y le dimensioni. Si può fare?

        Tutto il codice compreso un esempio, è spiegato nella guida alla programmazione di Enrico (scaricabile dal suo sito).
        Bye

        `\newcommand{\insertimage}[1]{%
        \sbox8{\includegraphics{#1}}%
        \ifdim\wd8<\ht8 \ifdim\ht8>0.5\textheight
        \includegraphics[height=0.5\textheight]{#1}
        \else
        \includegraphics{#1}
        \fi
        \else
        \ifdim\wd8>0.8\columnwidth
        \includegraphics[width=0.8\columnwidth]{#1}
        \else
        \includegraphics{#1}
        \fi
        \fi
        }`
        Non vedo perché usare tre registri. Probabilmente il codice si può ottimizzare con un paio di \expandafter, ma non ne vedo la necessità.

        Ciao
        Enrico

      • #54567
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          E perché non usare i comandi e le opzioni standard? per esempio:
          `
          \begin{figure}
          \centering
          \inclidegraphics[width=0.8\textwidth,height=0.5\textheight,keepaspectratio]{miafigura}
          \caption{…}
          \label{…}
          \end{figure}
          `
          Se questo non funziona, allora non ho capito il problema.

        • #54568
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            E perché non usare i comandi e le opzioni standard? per esempio:
            `
            \begin{figure}
            \centering
            \inclidegraphics[width=0.8\textwidth,height=0.5\textheight,keepaspectratio]{miafigura}
            \caption{…}
            \label{…}
            \end{figure}
            `
            Se questo non funziona, allora non ho capito il problema.


            @OldClaudio

            Si, usare le opzioni si ottiene quasi lo stesso risultato perché con keepaspectratio e quei parametri dimensionali la figura avrebbe o larghezza 0.8\textwidth oppure altezza 0.5\textheight, mentre nel codice con i condizionali, se una figura ha dimensioni naturali inferiori a quei rapporti di pagina, viene inserita così com’è senza alterazioni di scala.

            @Egreg
            Ho visto che con il registro box numero 8 hai fatto a meno di definire le due dimensioni.
            Uhm. Immagino che il box8 possa essere lasciato in balia degli eventi senza preoccuparsi di eliminarlo dalla memoria.

            Grazie per i vostri interventi.
            Alla prossima.

          • #54569
            robitex
            Amministratore del forum
              Up
              0
              Down
              ::

              `\newcommand{\insertimage}[1]{%
              \sbox8{\includegraphics{#1}}%
              \ifdim\wd8<\ht8 \ifdim\ht8>0.5\textheight
              \includegraphics[height=0.5\textheight]{#1}
              \else
              \includegraphics{#1}
              \fi
              \else
              \ifdim\wd8>0.8\columnwidth
              \includegraphics[width=0.8\columnwidth]{#1}
              \else
              \includegraphics{#1}
              \fi
              \fi
              }`
              Non vedo perché usare tre registri. Probabilmente il codice si può ottimizzare con un paio di \expandafter, ma non ne vedo la necessità.

              Ciao
              Enrico

              Recentemente ho scritto codice utilizzando etex e quindi abituandomi all’idea che usare registri a volontà sia cosa normale. Ma alla fine ho scelto di utilizzare la soluzione “box8”.

              Aggiungo che ho pensato di utilizzare un comando simile a \insertimage per compilare al volo sorgenti LaTeX generati da script, nell’intento di rendere il più piccolo possibile il numero degli “interventi manuali”.

              Lo script elaborando un file html ricava le informazioni di quello che corrisponde all’inserimento delle figure. All’inizio il codice LaTeX prodotto, era il classico inserimento di oggetto ‘figure’ senza l’utilizzo di scalature dell’immagine, e questo comportava per ciascuna l’intervento manuale di correzione.
              Per migliorare la situazione, avevo due strade: la prima era quella di forzare ulteriormente il codice dello script per ottenere l’inserimento corretto, la seconda è quella di lasciar fare il lavoro a LaTeX.

              Grazie

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

          Go to top