Allineare colonne verticali di numeri sul punto decimale


9

Ho scritto questo post in Emacs. Per rendere belli i tavoli, ho deciso di regolare la spaziatura in modo che i decimali si allineino in modo ordinato. Il formato originale dal database era simile al seguente:

emacs                11505 227          3.6       3.3         1.9         68.9          93.5        68         
vi                   1087  289          11.1      6.9         2.9         71.7          96.2        9          
wolfram-mathematica  2993  360          4         2.2         1.9         66.7          92.5        51         

È abbastanza vicino, ma voglio che le colonne siano giustificate e che tutte le cifre siano allineate. La quarta colonna dovrebbe apparire come:

 3.6
11.1
 4

Ho giocato con i comandi align e non sono riuscito a trovare un modo per allineare automaticamente la tabella sul punto decimale (opzionale). Per qualche motivo, queste istruzioni non riescono ad allineare nulla:

Le figure possono anche essere allineate rispetto al punto decimale, usando M-- M-x align.

Risposte:


8

Innanzitutto, devi essere sicuro che il buffer sia in modalità Testo :

M-x text-mode

Una volta in modalità testo, C-- M-x align(che invoca la text-dollar-figureregola di allineamento), il primo decimale verrà allineato verticalmente. Ma non riesce ad allineare la seconda colonna decimale. Inoltre non riesce ad allineare numeri che non hanno un punto decimale esplicito (come il punteggio medio di wolfram-matematica di 4). Per risolvere questo problema, ti consigliamo di regolare il valore della regola in align-rules-list:

(text-dollar-figure
  (regexp . "\\$?\\(\\s-+[0-9]+\\)\\.?")
  (modes . align-text-modes)
  (repeat . t)
  (spacing . 2)
  (justify . t)
  (run-if lambda nil
      (eq '- current-prefix-arg)))

Questo fa alcune cose:

  • Il regexp ora consente un periodo di trascinamento opzionale.
  • Attivando la ripetizione, ogni istanza di un numero viene allineata.
  • Ho aggiunto 2 spazi anziché solo uno per leggibilità.

Il risultato:

emacs                11505  227   3.6  3.3  1.9  68.9  93.5   68         
vi                    1087  289  11.1  6.9  2.9  71.7  96.2    9          
wolfram-mathematica   2993  360   4    2.2  1.9  66.7  92.5   51         

Un metodo più o meno equivalente consiste nel definire una funzione che chiama align-regexp:

(defun align-decimal (start end)
    "Align a table of numbers on (optional) decimal points."
    (interactive "r")
    (align-regexp start end "\\(\\s-*\\)\\$?\\(\\s-+[0-9]+\\)\\.?"
                  -2 0 t))

In questo caso, ho impostato il groupsparametro su un numero negativo per attivare la giustificazione corretta e spacingsu 0 per preservare il più possibile la spaziatura originale.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.