[quote]Ragazzi,
Mi serve un piccolo favore. Io vorrei cambiare lo stile della caption. Vorrei mettere una linea sotto alla testa della caption.
Ad esempio invece di avere la normale caption vorrei
|1cm| Figura 3: dida
——————–cioè con un rule che oltre a stare sotto Figura 3, sfori di un centimetro nel margine di sinistra.
Purtroppo un mio prof. mi ha chiesto lo stesso layout del libro Microwave Engineering, che è chiaramente scritto in latex. Che ci posso fare.
Qualcosa come questo?
`\makeatletter
\def\line@under@label#1#2{%
\dimen@=#1 \advance\dimen@ 1cm
\vtop{\hbox{\strut#2}\nointerlineskip
\hbox to #1{\hss\vrule width \dimen@ height 0.4pt}\vss}}
\long\def\@makecaption#1#2{%\small
\vskip\abovecaptionskip
\sbox0{#1:\enspace}%
\hangindent\wd0 \hangafter1
\sbox2{#1:}%
\leavevmode\line@under@label{\wd2}{#1:}\enspace #2\par
\vskip\belowcaptionskip}
\makeatother`
Se vuoi un font più piccolo (cosa che ti consiglio), togli il % davanti a \small.Avanzo una birra. 😀
Ciao
Enrico[corr]Due spazi sono diventati \enspace, è meglio perché si evita che lo spazio dopo i due punti possa “ingrandirsi” durante l’impaginazione.[/corr]
Ma come cavolo fai!! 😀 😀 😀 [/quote]
Adesso vediamo di capire come funziona la faccenda. La prima cosa da sapere è che il comando \@makelabel è responsabile della composizione della didascalia. Prende due argomenti passati da \caption: il primo è “\figurename
A questo punto decidiamo che il testo della didascalia sia un paragrafo che abbia il margine sinistro alla fine dell’etichetta seguita da due punti e uno spazio. Per fare questo misuro la lunghezza necessaria:
`\sbox0{#1:\enspace}`
cioè nel registro box 0 metto una scatola contenente l’etichetta, i due punti e uno spazio fisso di mezzo em. Posso accedere alla sua lunghezza con la dimensione \wd0. Perciò compongo il paragrafo (che è l’intera didascalia) con rientro di \wd0 dopo la prima riga:
`\hangindent\wd0 \hangafter 1`
Prima di comporre il paragrafo, misuro l’etichetta (si potrebbe fare meglio, forse, ma così funziona) con i due punti, con lo stesso sistema di prima. Mi serve per passare la lunghezza a un’altra macro, che compone l’etichetta con la linea sotto.
La macro si chiama \line@under@label, che ha due argomenti: una dimensione e un testo. Compongo il tutto in una \vtop (che assomiglia a \parbox[t], cioè risulterà con il punto di riferimento alla stessa altezza della linea di base della prima riga). Questa \vtop contiene due scatole orizzontali: la prima è l’etichetta con i due punti. Segue il comando per non inserire interlinea (\nointerlineskip) e poi la seconda scatola orizzontale, che contiene la linea; ancora segue \vss, in modo che la seconda scatola non influisca sulla profondità della \vtop.
Come costruisco la linea? Con una \hbox di ampiezza uguale a quella del primo argomento (che poi è la lunghezza dell’etichetta con i due punti). Però voglio che la linea sia un centimetro più lunga. Quindi dico che il registro dimensionale \dimen@ sia quella lunghezza più un centimetro.
Il problema è di comporre la linea in modo che sbordi a sinistra, ma “invisibilmente”. Se x è l’ampiezza dell’etichetta e y quella della linea, ciò si ottiene dicendo
`\hbox to
La scatola sarà vista come di lunghezza x, ma contiene una linea di lunghezza y che sborda a sinistra (\hss dice: aggiungi tutto lo spazio, positivo o negativo, che serve).
Ultima cosa: comporre la didascalia. Dico \leavevmode, per cominciare il paragrafo (\caption ha già detto che qui non c’è rientro \parindent), compongo l’etichetta con la linea sottostante, lascio mezzo em di spazio e scrivo il testo della didascalia:
`\leavevmode\line@under@label{\wd2}{#1:}\enspace #2\par`
In testa e in coda al tutto ho messo le spaziature verticali usuali (\abovecaptionskip e \belowcaptionskip).
Unica limitazione: non puoi usare didascalie che siano più di un paragrafo. Se devi “andare a capo” nella didascalia, userai \\.
Ciao
Enrico