Re: L’arte di scrivere dati numerici con LaTeX

#47213
Up
0
Down
::

Ovvero: “Le gioie di siunitx
————————————–

Ciao a tutti. Sono alle prese con il pacchetto siunitx: mi piace moltissimo, perché concentra funzioni di altri pacchetti (come numprint, icomma e dcolumn) e si propone come la soluzione definitiva per la scrittura di dati numerici.

Delle colonne S di siunitx c’è però qualcosa che mi sfugge. Da quanto ho capito, quando maneggia una colonna S, siunitx di default mettre il separatore decimale al centro della colonna. Questo, secondo me, produce risultati non sempre adeguati. Per esempio:
`\documentclass{article}
\usepackage[italian]{babel}
\usepackage[osf]{mathpazo}
\usepackage[mode=math]{siunitx}
\usepackage{booktabs}
\sisetup{decimalsymbol=comma}

\begin{document}

\begin{tabular}{SSSSS}
\toprule
$B$ & $P_u$ & $u_u$ & $\beta$ & $G_f$ \\
{(m)} & {(kg)} & {(m)} & & {(Pa)} \\
\midrule
5 & 269,8 & 0,000674 & 1,79 & 0,04089 \\
10 & 421,0 & 0,001035 & 3,59 & 0,04089 \\
20 & 640,2 & 0,001565 & 7,18 & 0,04089 \\
\bottomrule
\end{tabular}

\end{document}
`
Se si prova a compilare, si vede una voragine tra le seconda e la terza colonna.

Per rimediare si può dare l’opzione abnumalign=center che, da quanto ho capito, centra tutto il numero, ma a condizione che se ne specifichi manualmente il “formato” come ..

`\begin{tabular}{S[tabnumalign=center]%
S[tabnumalign=center,tabformat=3.1]%
S[tabnumalign=center,tabformat=1.6]%
S[tabnumalign=center,tabformat=1.2]%
S[tabnumalign=center,tabformat=1.5]}
\toprule
$B$ & $P_u$ & $u_u$ & $\beta$ & $G_f$ \\
{(m)} & {(kg)} & {(m)} & & {(Pa)} \\
\midrule
5 & 269,8 & 0,000674 & 1,79 & 0,04089 \\
10 & 421,0 & 0,001035 & 3,59 & 0,04089 \\
20 & 640,2 & 0,001565 & 7,18 & 0,04089 \\
\bottomrule
\end{tabular}
`
Ora il risultato è ottimo, ma specificare manualmente il formato di ciascuna colonna è scomodo: non dovrebbe pensarci il pacchetto automaticamente?

Attribuisci a TeX doti di chiaroveggenza che non può avere. Non conosco il funzionamento dettagliato di siunitx, ma a quanto pare lo spazio riservato alla parte intera coincide con quello riservato alla parte decimale e questo spiega le “voragini”.

Soluzione: come in tutti gli aspetti della composizione tipografica, non si può avere un automatismo sempre, soprattutto nelle tabelle che vanno esaminate a una a una per trovarne i difetti e risolverli. Ma qui non è difficile: chi scrive la tabella sa qual è il formato dei dati.

Il fatto è che se non specifico il formato e mi limito semplicemente a dare tabnumalign=center come opzione globale
`\sisetup{tabnumalign=center}

\begin{tabular}{SSSSS}
\toprule
$B$ & $P_u$ & $u_u$ & $\beta$ & $G_f$ \\
{(m)} & {(kg)} & {(m)} & & {(Pa)} \\
\midrule
5 & 269,8 & 0,000674 & 1,79 & 0,04089 \\
10 & 421,0 & 0,001035 & 3,59 & 0,04089 \\
20 & 640,2 & 0,001565 & 7,18 & 0,04089 \\
\bottomrule
\end{tabular}`
il risultato è inaccettabile (alcune colonne sbordano e si sovrappongono).

Un altro mistero: provate a sostituire nella tabella precedente $D$ al posto di $B$: siunitx dà un errore:
`! Package siunitx Error: Invalid number format `D'.

See the siunitx package documentation for explanation.
Type H for immediate help.

l.12 $D$ &
$P_u$ & $u_u$ & $\beta$ & $G_f$ \\
?
`
Neppure mettere $D$ tra graffe risolve. Un bug?

Non è un bug; nelle colonne di tipo S vanno numeri. Ciò che non lo è può funzionare oppure no, dipende se entra in conflitto con il funzionamento interno della specifica dei numeri (d oppure D sono riservati per varie notazioni, mi pare). Ovviamente la soluzione è \multicolumn{1}{c}{…}

Purtroppo la revisione dell’Arte cade in un brutto periodo: siunitx ha fatto la transizione alla versione 2 che non è pienamente compatibile con la 1; occorre specificare
`\usepackage[load-configurations=version-1]{siunitx}`
se si ha un documento preparato per la versione 1. Noioso, forse, ma la versione 2 è davvero molto più potente e configurabile della precedente e vale la pena passare alla nuova.

Nella documentazione della versione 2 c’è la tabella riassuntiva con le corrispondenze fra vecchie opzioni e nuove. Secondo me è meglio usare la 2.

Ciao
Enrico

Go to top