- Questo topic ha 0 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 10 anni fa da .
-
Topic
-
Ciao a tutti.
Sto cercando di capire come funziona il codice TeX seguente che usa il pacchetto luamplib (pacchetto LuaTeX per generare figure Metapost con la libreria interna mplib) per creare una scatola orizzontale di certe dimensioni:
`
\ifx\mplibscratchbox\undefined \newbox\mplibscratchbox \fi
\def\mplibstarttoPDF#1#2#3#4{%
\hbox\bgroup
\xdef\MPllx{#1}\xdef\MPlly{#2}%
\xdef\MPurx{#3}\xdef\MPury{#4}%
\xdef\MPwidth{\the\dimexpr#3bp-#1bp\relax}%
\xdef\MPheight{\the\dimexpr#4bp-#2bp\relax}%
\parskip0pt%
\leftskip0pt%
\parindent0pt%
\everypar{}%
\setbox\mplibscratchbox\vbox\bgroup
\noindent
}
\def\mplibstoptoPDF{%
\egroup %
\setbox\mplibscratchbox\hbox %
{\hskip-\MPllx bp%
\raise-\MPlly bp%
\box\mplibscratchbox}%
\setbox\mplibscratchbox\vbox to \MPheight
{\vfill
\hsize\MPwidth
\wd\mplibscratchbox0pt%
\ht\mplibscratchbox0pt%
\dp\mplibscratchbox0pt%
\box\mplibscratchbox}%
\wd\mplibscratchbox\MPwidth
\ht\mplibscratchbox\MPheight
\box\mplibscratchbox
\egroup
}
`Un minimo di elaborazione consente di semplificare il codice dove si definisce una scatola hbox attraverso ben 4 passaggi.
Nei primi 3 passaggi c’é sempre l’uso del registro box all’interno di un setbox.
Il codice da me semplificato è il seguente:
`
\newbox\mpbox
\hbox{
% set some dimensions
…
\setbox\mpbox\vbox{% passaggio 1
\noindent
% insert here graphic material
…
}
\setbox\mpbox\hbox % passaggio 2
{\hskip-\MPllx bp%
\raise-\MPlly bp%
\box\mpbox
}%
\setbox\mpbox\vbox to \MPheight {% passaggio 3
\vfill
\hsize\MPwidth
\wd\mpbox0pt%
\ht\mpbox0pt%
\dp\mpbox0pt%
\box\mpbox
}%
% passaggio 4
\wd\mpbox\MPwidth
\ht\mpbox\MPheight
\box\mpbox
}
`Adesso i 4 passaggi si riconoscono meglio:
1 – dopo aver impostato alcune dimensioni creo una scatola verticale \vbox con il materiale grafico generato da Metapost (semplifichiamo) che dobbiamo pensare come un punto privo di dimensioni ed è questo lo scopo: creare una scatola per un contenuto di dimensioni nulle di cui si conosce il bounding box.Quello che non capisco è: perché un vbox e non un hbox?
2 – creo un hbox inserendo il vbox precedente in un punto traslato che rappresenta l’angolo inferiore sinistro. Qui OK.
3 – creo una vbox di altezza e larghezza data e inserendo il box precedente in basso.
Perché ancora una vbox? Non posso semplicemente saltare al passaggio 4?
4 – imposto le dimensioni della hbox finale espandendovi il vbox precedente. Questo passaggio si riferisce all’hbox di apertura.
Potreste aiutarmi a capire questa sequenza?
Non posso semplificare i passaggi?
Grazie.
R.
- Devi essere connesso per rispondere a questo topic.