Вирівняйте вертикальні стовпці чисел у десятковій точці


9

Я написав цю публікацію в Emacs. Для того, щоб таблиці виглядали красиво, я вирішив відрегулювати міжряддя так, щоб десятичники були акуратно розташовані. Оригінальний формат із бази даних виглядав приблизно так:

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         

Це досить близько, але я хочу, щоб стовпці були виправданими, і всі цифри вишикувалися. Четвертий стовпець повинен виглядати так:

 3.6
11.1
 4

Я розігрувався з командами вирівнювання і не міг знайти спосіб автоматичного вирівнювання таблиці за (необов'язково) десятковим знаком. Чомусь ці інструкції взагалі нічого не вирівнюють:

Цифри також можна вишикувати щодо десяткової крапки, використовуючи M-- M-x align.

Відповіді:


8

По-перше, ви повинні бути впевнені, що буфер знаходиться в текстовому режимі :

M-x text-mode

Опинившись у текстовому режимі C-- M-x align(який викликає text-dollar-figureправило вирівнювання), вирівняйте перший десятковий вертикально. Але це не вдається вирівняти другий десятковий стовпець. Плюс не вдається вирівняти числа, які не мають явного десяткового знаку (наприклад, середня оцінка вольфрама-математики 4). Щоб виправити це, вам потрібно скорегувати значення правила в 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)))

Це робить кілька речей:

  • Тепер регулярне вираження дозволяє передбачати необов'язковий період.
  • Увімкнувши повтор, кожен екземпляр числа вирівнюється.
  • Я додав 2 пробіли, а не лише один для читабельності.

Результат:

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         

Більш-менш еквівалентним методом є визначення функції, яка викликає 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))

У цьому випадку я встановлюю groupsпараметр на від’ємне число, щоб увімкнути правильне обгрунтування та spacing0, щоб максимально зберегти початковий інтервал.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.