Separare il contenuto di una vbox con un ciclo while

  • Creatore
    Topic
  • #56388
    Up
    0
    Down
    ::


    Salve a tutti.

    Ho la necessità di conservare un testo all’interno di un registro \vbox per poterne controllare le dimensioni. Voglio separare il contenuto della \vbox con il comando \vsplit in modo da spezzettarlo in tante \vbox di assegnata altezza.

    Per fare ciò ho definito un nuovo comando nel codice seguente:
    `\documentclass{minimal}
    \usepackage{ifthen}
    \usepackage{lipsum}

    \newlength{\larghezza}
    \setlength{\larghezza}{8cm}
    \newlength{\altezza}
    \setlength{\altezza}{4cm}
    \newbox\mybox
    \newbox\myboxa

    \newcommand\Separa[1]{
    \setbox\mybox=\vbox{\hsize=\larghezza #1}
    \whiledo{\ht\box\mybox >\altezza}{
    \setbox\myboxa=\vsplit\mybox to \altezza
    \box\myboxa\par\hrule
    }
    \box\mybox\par\hrule
    }

    \begin{document}
    \Separa{\lipsum[1-4]}
    \end{document}
    `
    La compilazione con pdflatex restituisce l’errore:
    `! Missing number, treated as zero.

    \box
    l.22 \Separa{\lipsum[1-4]}
    `
    Cosa non funziona?

    Grazie,
    Agostino

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


      Rispondo a me stesso, avendo individuato il solito errore di distrazione:
      Il comando \ht determina l’altezza del registro box \mybox. L’uso corretto del comando è:
      `\ht\mybox`

    • #56390
      Up
      0
      Down
      ::

      Salve a tutti.

      Ho la necessità di conservare un testo all’interno di un registro \vbox per poterne controllare le dimensioni. Voglio separare il contenuto della \vbox con il comando \vsplit in modo da spezzettarlo in tante \vbox di assegnata altezza.

      Per fare ciò ho definito un nuovo comando nel codice seguente:
      `\documentclass{minimal}
      \usepackage{ifthen}
      \usepackage{lipsum}

      \newlength{\larghezza}
      \setlength{\larghezza}{8cm}
      \newlength{\altezza}
      \setlength{\altezza}{4cm}
      \newbox\mybox
      \newbox\myboxa

      \newcommand\Separa[1]{
      \setbox\mybox=\vbox{\hsize=\larghezza #1}
      \whiledo{\ht\box\mybox >\altezza}{
      \setbox\myboxa=\vsplit\mybox to \altezza
      \box\myboxa\par\hrule
      }
      \box\mybox\par\hrule
      }

      \begin{document}
      \Separa{\lipsum[1-4]}
      \end{document}
      `
      La compilazione con pdflatex restituisce l’errore:
      `! Missing number, treated as zero.

      \box
      l.22 \Separa{\lipsum[1-4]}
      `
      Cosa non funziona?

      A parte l’errore di \ht\box, non è molto sensato dividere in pezzi che non hanno come altezza un numero intero di righe. Se vuoi che i vari pezzi siano ben composti verticalmente e che abbiano per altezza la migliore approssimazione a quella desiderata, puoi fare così:
      `\newcommand\Separa[1]{%
      \par\begingroup\vbadness=10000
      \setbox\mybox=\vbox{\hsize=\larghezza #1}
      \loop\ifdim\ht\mybox > \altezza
      \setbox\myboxa=\vsplit\mybox to \altezza
      \vbox{\unvbox\myboxa}\hrule
      \repeat
      \vbox{\unvbox\mybox}\hrule\endgroup
      }`
      Un paio di commenti. Metto tutto in un gruppo per poter dare un valore a \vbadness che eviti gli inevitabili messaggi di “Underfull \vbox”; il primo \par mette TeX in modo verticale e non c’è più bisogno di dare \par in seguito: un comando \box, \vbox o \hbox in modo verticale non fa entrare in modo orizzontale. Poi divido in pezzi alti \altezza con \vsplit (uso il metodo \loop che mi piace di più, ma è solo preferenza personale). Invece di \box\myboxa che causa problemi di riempimento (tipicamente sarà una “Underfull \vbox”), eseguo \unvbox\myboxa in una \vbox.

      Ciao
      Enrico

    • #56391
      Up
      0
      Down
      ::


      Grazie Enrico.
      Come si potrebbe integrare questa tua soluzione a quella proposta in questo post:
      http://www.guit.sssup.it/phpBB2/viewtopic.php?p=55230#55230 ?
      In quella situazione si ha la necessità di effettuare prima un parsing con conseguente formattazione delle righe e successivamente una suddivizione del contenuto in scatole di altezza assegnata.

      Ciao,
      Agostino

    • #56392
      Up
      0
      Down
      ::

      Grazie Enrico.
      Come si potrebbe integrare questa tua soluzione a quella proposta in questo post:
      http://www.guit.sssup.it/phpBB2/viewtopic.php?p=55230#55230 ?
      In quella situazione si ha la necessità di effettuare prima un parsing con conseguente formattazione delle righe e successivamente una suddivizione del contenuto in scatole di altezza assegnata.

      Ciao,
      Agostino

      Trovo che il tuo modo di operare su serie di indirizzi sia completamente da ripensare. Molto meglio qualcosa come
      `\begin{addresses}
      \address{Servizio Politiche per i Minori, l'Infanzia e l'Adolescenza\\
      Ufficio interventi integrativi\\
      Rosaria Dinevoli}
      \address{Municipalità 1 – Organi Politici\\
      Commissioni Consiliari: segreteria e conferenza dei Presidenti\\
      Eugenio Izzo Aiazzone}
      \address{Direttore della I Municipalità Chiaia — San Ferdinando — Posillipo\\
      Segreteria della direzione}
      \address{Servizio Archivi Storici\\
      Referente visite guidate, Real Casa Santa dell'Annunziata: ramo esposti\\
      Lucia Renzulli}
      \end{addresses}`
      Sarebbe così molto più facile ridefinire \addresses, \endaddresses e \address per vari scopi. Dal momento che i tuoi indirizzi hanno numeri di righe diversi direi che spezzare a tronconi fissati sia da escludere.

      La macro \address potrebbe anche avere un argomento opzionale
      `\address[archivistorici]{Servizio Archivi Storici\\
      Referente visite guidate, Real Casa Santa dell'Annunziata: ramo esposti\\
      Lucia Renzulli}`
      in modo che si potrebbe dire
      `\useaddress{archivistorici}`
      Lascio le definizioni come facile esercizio al lettore. 🙂

      Ciao
      Enrico

    • #56393
      Up
      0
      Down
      ::


      Caro Enrico,
      voglio seguire il tuo autorevole consiglio. Potresti indicarmi cosa iniziare a leggere per poter definire un ambiente come quello che proponi?
      Mi sembra di capire che l’ambiente debba assomigliare a thebibliography con all’interno i suoi bibitem. In quale file trovo la loro definizione? In alternativa dove posso guardare: nei tuoi appunti, nel LaTeX Companion, nell’Arte o nella Guida GuIT?

      Grazie,
      Agostino

    • #56394
      Up
      0
      Down
      ::

      Caro Enrico,
      voglio seguire il tuo autorevole consiglio. Potresti indicarmi cosa iniziare a leggere per poter definire un ambiente come quello che proponi?
      Mi sembra di capire che l’ambiente debba assomigliare a thebibliography con all’interno i suoi bibitem. In quale file trovo la loro definizione? In alternativa dove posso guardare: nei tuoi appunti, nel LaTeX Companion, nell’Arte o nella Guida GuIT?

      Negli Appunti guarda dove si parla delle liste. Questa sarebbe una “lista di liste”.

      L’idea è di memorizzare il contenuto dell’ambiente dentro alcune macro e poi elaborarle alla bisogna. L’ambiente stesso può eventualmente ricevere diverse definizioni. Vediamo un caso velocemente:
      `\begin{addresses}
      \address{politicheminori}{Servizio Politiche per i Minori, l'Infanzia e l'Adolescenza\\
      Ufficio interventi integrativi\\
      Rosaria Dinevoli}
      \address{organipolitici}{Municipalità 1 – Organi Politici\\
      Commissioni Consiliari: segreteria e conferenza dei Presidenti\\
      Eugenio Izzo Aiazzone}
      \address{munic-chiaia}{Direttore della I Municipalità Chiaia — San Ferdinando — Posillipo\\
      Segreteria della direzione}
      \address{archivistorici}{Servizio Archivi Storici\\
      Referente visite guidate, Real Casa Santa dell'Annunziata: ramo esposti\\
      Lucia Renzulli}
      \end{addresses}`
      Vediamo un possibile modo di usare la faccenda.
      `\makeatletter
      \newenvironment{addresses}
      {\newcommand{\address}[2]{\global\@namedef{addr@#1}{#2}}
      {}
      \makeatother`
      Quando LaTeX legge l’ambiente addresses definisce una macro per ciascun comando \address che incontra, la quale si espande all’indirizzo. Come la possiamo usare?
      `\makeatletter
      \newcommand{\useaddress}[2][]{%
      #1\expandafter\format@address\csname addr@#1\endcsname}
      \makeatother`
      La si chiamerà con
      `\useaddress[\TO]{politicheminori}\\
      \useaddress{archivistorici}\\[6pt]
      \useaddress[\EPC]{munic-chiaia}\\
      \useaddress{organipolitici}`
      Naturalmente occorre definire \format@address e questo può essere fatto in modo analogo a quello che abbiamo visto nell’altro filone. Il modo più semplice è di scrivere semplicemente l’indirizzo senza alcun formato:
      `\makeatletter
      \def\format@address#1{#1}
      \makeatother`
      I comandi \TO e \EPC sono quasi ovvi.

      Ciao
      Enrico

    • #56395
      Up
      0
      Down
      ::


      Grazie Enrico.
      Proverò a elaborare questa soluzione.

      Ciao,
      Agostino

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

Go to top