Tikz in a box.

  • Creatore
    Topic
  • #37119
    Up
    0
    Down
    ::


    Buongiorno.
    Sto componendo un articolo con classicthesis (twoside, notitlepage) e, naturalmente, non ho toccato i margini predefiniti.
    In prima pagina riporto un disegno, tracciato con il pacchetto tikz, molto largo (qualche centimetro in più della giustezza del testo) e molto basso (4cm tutto compreso); riscalare il disegno è da escludersi, perché comporterebbe la sovrapposizione delle numerose annotazioni testuali presenti nel disegno stesso (che, ovviamente, non verrebbero riscalate).
    Inserendo tale disegno nel classico ambiente figure:
    `\begin{figure}
    \centering
    \begin{tikzpicture}
    disegno
    \end{tikzpicture}
    \end{figure}`
    proprio a causa della larghezza maggiore della \textwidth, esso viene, in pratica, allineato a sinistra, sforando a destra (ovefull hbox) e portandosi molto vicino al limite del foglio, mentre sul lato sinistro rimangono i diversi centimetri “vuoti” che costituiscono il margine della pagina.

    Posizionare il disegno in verticale con il pacchetto rotating mi sembra (oltre che bruttino) un inutile spreco di carta, ché una pagina risulterebbe quasi completamente bianca, a meno del disegno che, in questo caso, sarebbe alto e stretto.

    La soluzione che pensavo di attuare, allora, consiterebbe nel centrare orizzontalmente il disegno rispetto al foglio (anziché rispetto alla colonna di testo), anche forte del fatto che la prima pagina è “da sola”, ovvero non ha “a fianco” un’altra pagina in cui la disposizione del testo è perfettamente bilanciata da classicthesis, e il risultato “non simmetrico” balzerebbe meno all’occhio.

    Il mio problema, evidentemente, è che non so come fare ad allineare orizzontalmente una figura rispetto al centro della carta anziché rispetto al centro della colonna di testo.

    Sperando di essere stato sufficientemente chiaro,
    vi ringrazio

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #37120
      Up
      0
      Down
      ::


      Prova con
      `\begin{figure}
      \makebox[\linewidth][c]{
      \begin{tikzpicture}
      disegno
      \end{tikzpicture}
      }
      \end{figure}`

      o variazioni sul tema. Quello che metti nella \makebox sforerà in maniera simmetrica a destra e a sinistra rispetto alla colonna del testo.
      Per centrare invece rispetto al foglio devi usare un pacchetto apposito, changepage.

      Ciao ciao.
      Fra

    • #37121
      Up
      0
      Down
      ::

      Buongiorno.
      Sto componendo un articolo con classicthesis (twoside, notitlepage) e, naturalmente, non ho toccato i margini predefiniti.
      In prima pagina riporto un disegno, tracciato con il pacchetto tikz, molto largo (qualche centimetro in più della giustezza del testo) e molto basso (4cm tutto compreso); riscalare il disegno è da escludersi, perché comporterebbe la sovrapposizione delle numerose annotazioni testuali presenti nel disegno stesso (che, ovviamente, non verrebbero riscalate).
      Inserendo tale disegno nel classico ambiente figure:
      `\begin{figure}
      \centering
      \begin{tikzpicture}
      disegno
      \end{tikzpicture}
      \end{figure}`
      proprio a causa della larghezza maggiore della \textwidth, esso viene, in pratica, allineato a sinistra, sforando a destra (ovefull hbox) e portandosi molto vicino al limite del foglio, mentre sul lato sinistro rimangono i diversi centimetri “vuoti” che costituiscono il margine della pagina.

      Posizionare il disegno in verticale con il pacchetto rotating mi sembra (oltre che bruttino) un inutile spreco di carta, ché una pagina risulterebbe quasi completamente bianca, a meno del disegno che, in questo caso, sarebbe alto e stretto.

      La soluzione che pensavo di attuare, allora, consiterebbe nel centrare orizzontalmente il disegno rispetto al foglio (anziché rispetto alla colonna di testo), anche forte del fatto che la prima pagina è “da sola”, ovvero non ha “a fianco” un’altra pagina in cui la disposizione del testo è perfettamente bilanciata da classicthesis, e il risultato “non simmetrico” balzerebbe meno all’occhio.

      Il mio problema, evidentemente, è che non so come fare ad allineare orizzontalmente una figura rispetto al centro della carta anziché rispetto al centro della colonna di testo.

      Sperando di essere stato sufficientemente chiaro,
      vi ringrazio

      Il margine destro è molto grande, con le impostazioni normali di ClassicThesis. Potrebbe andare così?
      `\usepackage{calc}

      \begin{figure}[!h]
      \raggedright
      \makebox[0pt][l]{%
      \resizebox{\textwidth+\marginparsep+\marginparwidth}{!}{%
      \begin{tikzpicture}
      disegno
      \end{tikzpicture}}}
      \end{figure}`
      Verrebbe occupato solo il margine destro. Naturalmente devi essere sicuro che la figura vada nella prima pagina, un caso in cui !h può essere indicato. Se la figura non ha didascalia, l’ambiente figure può ovviamente essere omesso e sostituito da un ambiente flushleft (niente \raggedright, mi raccomando).

      Ciao
      Enrico

    • #37122
      Up
      0
      Down
      ::

      Il margine destro è molto grande, con le impostazioni normali di ClassicThesis. Potrebbe andare così?
      `\usepackage{calc}

      \begin{figure}[!h]
      \raggedright
      \makebox[0pt][l]{%
      \resizebox{\textwidth+\marginparsep+\marginparwidth}{!}{%
      \begin{tikzpicture}
      disegno
      \end{tikzpicture}}}
      \end{figure}`
      Verrebbe occupato solo il margine destro. Naturalmente devi essere sicuro che la figura vada nella prima pagina, un caso in cui !h può essere indicato. Se la figura non ha didascalia, l’ambiente figure può ovviamente essere omesso e sostituito da un ambiente flushleft (niente \raggedright, mi raccomando).

      Ciao
      Enrico

      Buongiorno e grazie ad entrambi per l’attenzione.
      Ci ho messo parecchio a capire cosa stessi facendo eseguendo i comandi suggeriti (non sono per nulla pratico nel maneggiare le scatole), ma finalmente penso di esserci arrivato.
      Metto la mia figura tikz in una scatola e imposto la larghezza della scatola pari alla larghezza del testo + qualche cosa ma non troppo (a proposito, cosa sono \marginparsep e \marginparwidth?), ovvero riscalo la figura nel suo complesso, lettere comprese (violando, se vogliamo, il punto di forza di tikz, che garantisce che ogni carattere usato al suo interno sia omogeneo, in termini di grandezza, rispetto al resto del testo).
      Dopo di che, questa scatola la allineo a sinistra come il testo e, a patto di trovarmi in una pagina dispari – come la prima, sono certo che l’immagine sforerà nel margine destro, che è molto ampio.
      Giusto?

      Insomma, sarebbe stata la stessa identica cosa se avessi salvato il mio disegno in pdf e l’avessi inserito con \includegraphics con l’opzione width = somma di quei comandi che non conosco. Giusto?

      Se è così, prima di aggiungere un [risolto] nell’oggetto del primo messaggio, sarebbe forse il caso di cambiare l’oggetto stesso: non sto cambiando l’allineamento orizzontale delle figure, ma sto “manipolando un’immagine tikz come un disegno esterno”, giusto?

      Grazie ancora…
      GG

    • #37123
      Up
      0
      Down
      ::

      Il margine destro è molto grande, con le impostazioni normali di ClassicThesis. Potrebbe andare così?
      `\usepackage{calc}

      \begin{figure}[!h]
      \raggedright
      \makebox[0pt][l]{%
      \resizebox{\textwidth+\marginparsep+\marginparwidth}{!}{%
      \begin{tikzpicture}
      disegno
      \end{tikzpicture}}}
      \end{figure}`
      Verrebbe occupato solo il margine destro. Naturalmente devi essere sicuro che la figura vada nella prima pagina, un caso in cui !h può essere indicato. Se la figura non ha didascalia, l’ambiente figure può ovviamente essere omesso e sostituito da un ambiente flushleft (niente \raggedright, mi raccomando).

      Ciao
      Enrico

      Buongiorno e grazie ad entrambi per l’attenzione.
      Ci ho messo parecchio a capire cosa stessi facendo eseguendo i comandi suggeriti (non sono per nulla pratico nel maneggiare le scatole), ma finalmente penso di esserci arrivato.
      Metto la mia figura tikz in una scatola e imposto la larghezza della scatola pari alla larghezza del testo + qualche cosa ma non troppo (a proposito, cosa sono \marginparsep e \marginparwidth?), ovvero riscalo la figura nel suo complesso, lettere comprese (violando, se vogliamo, il punto di forza di tikz, che garantisce che ogni carattere usato al suo interno sia omogeneo, in termini di grandezza, rispetto al resto del testo).
      Dopo di che, questa scatola la allineo a sinistra come il testo e, a patto di trovarmi in una pagina dispari – come la prima, sono certo che l’immagine sforerà nel margine destro, che è molto ampio.
      Giusto?

      Insomma, sarebbe stata la stessa identica cosa se avessi salvato il mio disegno in pdf e l’avessi inserito con \includegraphics con l’opzione width = somma di quei comandi che non conosco. Giusto?

      Se è così, prima di aggiungere un [risolto] nell’oggetto del primo messaggio, sarebbe forse il caso di cambiare l’oggetto stesso: non sto cambiando l’allineamento orizzontale delle figure, ma sto “manipolando un’immagine tikz come un disegno esterno”, giusto?

      Uno dei punti di forza di tikz è di usare gli stessi font del documento. Ma non è vietato adoperarli a corpi diversi, per esigenze di impaginazione. Altro punto di forza è che non richiede inclusioni di file esterni.

      La costruzione che ti propongo è di mettere il disegno prima di tutto in una box che rimpicciolisci proporzionalmente fino a che la sua larghezza sia come la giustezza (larghezza delle righe di testo) aumentata dello spazio riservato alle note marginali (\marginparwidth) e di quello di separazione fra testo e note marginali (\marginparsep).

      Questa box viene poi inserita in un’altra la cui ampiezza è zero, così LaTeX non si lamenterà di “Overfull \hbox”: la figura “sfora”, ma in realtà non occupa spazio orizzontale.

      Se per caso la figura casca in una pagina pari, basta cambiare \raggedright in \raggedleft e l’argomento opzionale [l] in [r]. Ovviamente va fatto quando il testo è definitivissimissimo.

      Ciao
      Enrico

    • #37124
      Up
      0
      Down
      ::

      Uno dei punti di forza di tikz è di usare gli stessi font del documento. Ma non è vietato adoperarli a corpi diversi, per esigenze di impaginazione. Altro punto di forza è che non richiede inclusioni di file esterni.

      La costruzione che ti propongo è di mettere il disegno prima di tutto in una box che rimpicciolisci proporzionalmente fino a che la sua larghezza sia come la giustezza (larghezza delle righe di testo) aumentata dello spazio riservato alle note marginali (\marginparwidth) e di quello di separazione fra testo e note marginali (\marginparsep).

      Questa box viene poi inserita in un’altra la cui ampiezza è zero, così LaTeX non si lamenterà di “Overfull \hbox”: la figura “sfora”, ma in realtà non occupa spazio orizzontale.

      Se per caso la figura casca in una pagina pari, basta cambiare \raggedright in \raggedleft e l’argomento opzionale [l] in [r]. Ovviamente va fatto quando il testo è definitivissimissimo.

      Ciao
      Enrico

      Buonasera.
      La soluzione che Enrico mi ha gentilmente proposto si è rivelata molto più utile del previsto. Infatti, sempre con il solito classicthesis, mi sono trovato ad utilizzare (abbastanza intensamente) il pacchetto schemabloc, che a sua volta sfrutta tikz, ma che NON ammette nemmeno l’opzione scale, così che più volte ho usato la magia qui sopra suggerita anche solo per stare dentro \textwidth.

      Ora vi chiedo: e se volessi combinare i box con subfigure?

      Mi spiego meglio: due immagini sono concettualmente legate, e vorrei posizionarle l’una sotto l’altra in due subfloat. Una delle due immagini (la prima) è il solito disegno tikz troppo largo. Ho provato ad adattare la soluzione di prima: ho tolto
      `\makebox[0pt][l]{`
      che, se non sbaglio, serve “solo” per far sì che LaTeX non produca overfull hbox (anche se, in realtà, mi manca il significato di “l”), ma che dava enormi problemi con la didascalia (a), definita come opzione di subfloat.
      La figura (per ora) cade in una pagina pari, quindi ho messo raggedleft
      A seguire, ho ripetuto il classico centering, giacché la seconda figura è più stretta della giustezza del testo.

      Quello che ne risulta è:

      `\begin{figure}%
      {\raggedleft%
      \subfloat[Disegno largo.\label{fig:uno}]{%
      \resizebox{\textwidth+\marginparsep+\marginparwidth}{!}{%
      \input{fig/disegnotikz}}}}\\
      {\centering%
      \subfloat[Disegno stretto.\label{fig:due}]{%
      \resizebox{.8\textwidth}{!}{%
      \input{fig/due}}}}%
      \caption{Due disegni.}%
      \label{fig:disegno}%
      \end{figure}`

      Il problema è che il secondo disegno, più stretto della giustezza, è allineato con il margine sinistro, anziché centrato; il primo disegno, che nel mio intento dovrebbe allinearsi a destra e sporgere nel margine sinistro (si trova in una pagina pari, per ora), si allinea con il margine sinistro e sporge a destra.
      Mettere raggedright non cambia le cose.
      L’unica che, come niente fosse, si allinea bella bella al centro della colonna di testo è la didascalia generale.

      Grazie!

    • #37125
      Up
      0
      Down
      ::

      Uno dei punti di forza di tikz è di usare gli stessi font del documento. Ma non è vietato adoperarli a corpi diversi, per esigenze di impaginazione. Altro punto di forza è che non richiede inclusioni di file esterni.

      La costruzione che ti propongo è di mettere il disegno prima di tutto in una box che rimpicciolisci proporzionalmente fino a che la sua larghezza sia come la giustezza (larghezza delle righe di testo) aumentata dello spazio riservato alle note marginali (\marginparwidth) e di quello di separazione fra testo e note marginali (\marginparsep).

      Questa box viene poi inserita in un’altra la cui ampiezza è zero, così LaTeX non si lamenterà di “Overfull \hbox”: la figura “sfora”, ma in realtà non occupa spazio orizzontale.

      Se per caso la figura casca in una pagina pari, basta cambiare \raggedright in \raggedleft e l’argomento opzionale [l] in [r]. Ovviamente va fatto quando il testo è definitivissimissimo.

      Ciao
      Enrico

      Buonasera.
      La soluzione che Enrico mi ha gentilmente proposto si è rivelata molto più utile del previsto. Infatti, sempre con il solito classicthesis, mi sono trovato ad utilizzare (abbastanza intensamente) il pacchetto schemabloc, che a sua volta sfrutta tikz, ma che NON ammette nemmeno l’opzione scale, così che più volte ho usato la magia qui sopra suggerita anche solo per stare dentro \textwidth.

      Ora vi chiedo: e se volessi combinare i box con subfigure?

      Mi spiego meglio: due immagini sono concettualmente legate, e vorrei posizionarle l’una sotto l’altra in due subfloat. Una delle due immagini (la prima) è il solito disegno tikz troppo largo. Ho provato ad adattare la soluzione di prima: ho tolto
      `\makebox[0pt][l]{`
      che, se non sbaglio, serve “solo” per far sì che LaTeX non produca overfull hbox (anche se, in realtà, mi manca il significato di “l”), ma che dava enormi problemi con la didascalia (a), definita come opzione di subfloat.
      La figura (per ora) cade in una pagina pari, quindi ho messo raggedleft
      A seguire, ho ripetuto il classico centering, giacché la seconda figura è più stretta della giustezza del testo.

      Quello che ne risulta è:

      `\begin{figure}%
      {\raggedleft%
      \subfloat[Disegno largo.\label{fig:uno}]{%
      \resizebox{\textwidth+\marginparsep+\marginparwidth}{!}{%
      \input{fig/disegnotikz}}}}\\
      {\centering%
      \subfloat[Disegno stretto.\label{fig:due}]{%
      \resizebox{.8\textwidth}{!}{%
      \input{fig/due}}}%
      \caption{Due disegni.}%
      \label{fig:disegno}%
      \end{figure}`

      Il problema è che il secondo disegno, più stretto della giustezza, è allineato con il margine sinistro, anziché centrato; il primo disegno, che nel mio intento dovrebbe allinearsi a destra e sporgere nel margine sinistro (si trova in una pagina pari, per ora), si allinea con il margine sinistro e sporge a destra.
      Mettere raggedright non cambia le cose.
      L’unica che, come niente fosse, si allinea bella bella al centro della colonna di testo è la didascalia generale.

      Se cambi le carte in tavola non vale! 🙂
      `\begin{figure}
      \centering
      \subfloat[Disegno largo.\label{fig:uno}]{%
      \makebox[\textwidth][l]{%
      \resizebox{\textwidth+\marginparsep+\marginparwidth}{!}{%
      \input{fig/disegnotikz}}}}}\\
      \subfloat[Disegno stretto.\label{fig:due}]{%
      \resizebox{.8\textwidth}{!}{%
      \input{fig/due}}}}%
      \caption{Due disegni.}
      \label{fig:disegno}
      \end{figure}`
      Spiegazione: \makebox[][]{testo} costruisce una box che ha ampiezza ; il materiale dentro la box è allineato secondo la specifica , con “l” viene spinto verso il bordo sinistro. Che poi effettivamente occupi più spazio di è ignorato.

      Quando si ripensa a una soluzione, se ne trova spesso una migliore. 🙂 Con \makebox[\textwidth][l]{…} puoi usare \centering. Per far sbordare a destra usi “l”, per l’opposto usi “r”.

      Ciao
      Enrico

      Tolte due graffe che erano in più, secondo le indicazioni del messaggio successivo dell’OP

    • #37126
      Up
      0
      Down
      ::

      Se cambi le carte in tavola non vale! 🙂
      `\begin{figure}
      \centering
      \subfloat[Disegno largo.\label{fig:uno}]{%
      \makebox[\textwidth][l]{%
      \resizebox{\textwidth+\marginparsep+\marginparwidth}{!}{%
      \input{fig/disegnotikz}}}}}\\
      \subfloat[Disegno stretto.\label{fig:due}]{%
      \resizebox{.8\textwidth}{!}{%
      \input{fig/due}}}}%
      \caption{Due disegni.}
      \label{fig:disegno}
      \end{figure}`
      Spiegazione: \makebox[][]{testo} costruisce una box che ha ampiezza ; il materiale dentro la box è allineato secondo la specifica , con “l” viene spinto verso il bordo sinistro. Che poi effettivamente occupi più spazio di è ignorato.

      Quando si ripensa a una soluzione, se ne trova spesso una migliore. 🙂 Con \makebox[\textwidth][l]{…} puoi usare \centering. Per far sbordare a destra usi “l”, per l’opposto usi “r”.

      Ciao
      Enrico

      [OT]
      Purtroppo, oggi si abusa delle parole.
      Se qui scrivessi solo:

      Perfetto!

      non riuscirei ad esprimere il significato pieno di quello che intendo dire.
      Quindi, non posso che citare dal dizionario (© 2009 De Agostini Scuola Spa – Garzanti Linguistica):

      perfetto
      Fonetica e sillabazione: [per-fèt-to]
      Etimologia: Dal lat. perfe°ctu(m), part. pass. di perfice°re ‘compiere’, comp. di pe°r, indicante compimento, e face°re ‘fare’
      Definizione:
      agg.
      1 compiuto in tutte le sue parti, completo; che non manca di alcuna qualità propria della sua natura;
      2 che è senza difetti; ottimo, eccellente

      Ora che ho chiarito cosa intendo per “perfetto”, posso finalmente scriverlo, chiaro e tondo. [/OT]

      Perfetto.

      E… Grazie!

      P.S. Per i posteri: nell’ultimo codice sono scappate un paio di parentesi chiuse in più, che vanno tolte.

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

Go to top