Chiều cao dòng với các ký tự unicode


23

Một số ký tự Unicode khiến dòng chúng được hiển thị trên khá lớn. Ví dụ, một dấu trọng âm "" thêm khoảng 2,5 dòng không gian bên trên và bên dưới nó. Các ký tự khác gây ra hành vi này bao gồm chữ cái Hy Lạp "" (phi) hoặc tập hợp con bằng "". Các ký tự khác như ánh xạ - đến "to" chỉ thêm khoảng 0,5 dòng ở hai bên.

Tôi gặp vấn đề này khi đọc nguồn julia-mode.elchứa một số lượng lớn các ký tự như vậy để thay thế LaTeX.

Tại sao điều này xảy ra, và nó có thể được sửa chữa?

Chỉnh sửa: Tôi đang sử dụng Ubuntu 14.04 LTS với Emacs 24.3.1. Theo mặc định, tôi sử dụng phông chữ "Ubuntu Mono 13" nhưng các phông chữ khác đôi khi được sử dụng để hiển thị các ký tự. Tôi đã cài đặt không có gói nào để quản lý rõ ràng unicode và vấn đề này có thể tái tạo bằng lệnh emacs -Q.


3
Điều này có lẽ liên quan đến các phông chữ bạn đã cài đặt. Sử dụng một phông chữ với sự hỗ trợ Unicode tốt được tích hợp (ví dụ DejaVu Sans Mono) có thể giúp ích.
Chris

Vui lòng chỉnh sửa câu hỏi của bạn và thêm thông tin về HĐH, phiên bản Emacs của bạn và phông chữ bạn sử dụng cho Emacs.
lunaryorn

Cũng đề cập đến việc bạn có sử dụng bất kỳ gói / lệnh nào để thiết lập unicode hay không. Hoặc bạn chỉ đang sử dụng bất cứ thứ gì ra khỏi hộp.
Malabarba

Đồng ý về phông chữ: Tôi sử dụng DejaVu Sans Mono và các ký tự unicode hiển thị mà không có bất kỳ sự khác biệt rõ ràng nào về khoảng cách dòng dọc.
Dân

Tôi thực sự đã cài đặt DejaVu Sans Mono và nó được sử dụng cho một số ký tự, ví dụ: "". Vì vậy, nó dường như đang chọn một phông chữ khác cho Phi, cụ thể là "xft: -unknown-Latin Modern Math-normal-normal- normal- -17- - - - * - 0-iso10646-1".
Patrick Steele

Câu trả lời:


7

Điều này xảy ra vì Emacs sử dụng các phông chữ khác nhau cho các phần khác nhau của bộ ký tự Unicode. Bạn có thể xác minh phông chữ nào đang được sử dụng bằng cách định vị con trỏ trên một ký tự và nhấn C-u C-x =. Chẳng hạn, với cấu hình của tôi qua một ký tự ASCII tôi nhận được nil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88), nhưng qua tôi nhận được nil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(nói cách khác, đó là sử dụng Consolas cho ASCII và Symbola cho một số ký tự đặc biệt). Các phông chữ khác nhau có chiều cao khác nhau và Emacs sẽ luôn cung cấp đủ không gian trong chiều cao dòng để hiển thị phông chữ cao nhất. Theo mặc định, Emacs sẽ cố gắng sử dụng các phông chữ phụ thuộc hệ thống hoạt động, nhưng điều này thường dẫn đến kết quả xấu.

Thật không may, giải pháp mà tôi đã tìm thấy cho vấn đề về chiều cao của dòng rất khó chịu: Tôi xem qua các ký tự có vấn đề tôi tìm và sử dụng set-fontset-fontđể đặt chúng thành phông chữ / kích thước không ảnh hưởng đến chiều cao của dòng. Mã để làm điều này có sẵn trong cấu hình của tôi , nhưng nó xấu và vẫn không hoàn hảo. Nếu bất cứ ai có một giải pháp tốt hơn tôi sẽ muốn nghe nó.


1
Tôi nghĩ rằng một cách tiếp cận đơn giản hơn có thể là sử dụng phông chữ unicode , như trong câu trả lời của tôi; điều đó có làm việc cho bạn không?
Kirill

@Kirill: phông chữ unicode trông thực sự thú vị, nhưng tôi không chắc nó sẽ giải quyết vấn đề cụ thể này mà không cần chỉnh sửa đáng kể (Tôi đã không thử nó, vì vậy tôi có thể sai). Vấn đề gốc là các phông chữ khác nhau có cùng kích thước có chiều cao dòng khác nhau, vì vậy mỗi phông chữ phải được điều chỉnh cho đến khi nó có (xấp xỉ) cùng một chiều cao dòng. unicode-font không giống như nó giúp dễ dàng điều chỉnh kích thước phông chữ.
shosti

Vâng, tôi nghĩ điều đó đúng, nhưng nó giúp bạn dễ dàng chọn phông chữ cho toàn bộ các khối ký tự, vì vậy bạn không cần phải tự mình tìm kiếm thông qua từng ký tự.
Kirill

6

Tôi sử dụng chế độ agda với rất nhiều ký hiệu toán học và đã có cùng một vấn đề. Được sử dụng là giải pháp thực sự duy nhất là như @shosti gợi ý: tùy chỉnh ánh xạ phông chữ. Trong trường hợp của tôi, tôi đã phải vô hiệu hóa một số phông chữ vì mặc dù tôi đã cài đặt phông chữ với các glyph cụ thể được xác định, các emacs thường sẽ chọn sai một phông chữ (hiển thị các hộp). Có vẻ tệ hơn trên OSX nhưng tôi cũng đã thấy nó trên Linux. Vì vậy, chỉ cần cài đặt đúng phông chữ là không đủ.

Những gì tôi làm bây giờ là sử dụng gói phông chữ unicode tuyệt vời của Roland Walker . (Tôi sẽ khuyên bạn nên cài đặt nó thông qua MELPA.) Điều này đã loại bỏ hoàn toàn vấn đề.

Tôi đặt cái này trong tập tin init của tôi:

(unicode-fonts-setup)
(set-frame-font "PragmataPro 12")

Tôi sử dụng PragmataPro theo mặc định nhưng bất kỳ phông chữ nào khác có độ bao phủ tốt cũng sẽ hoạt động và bạn có thể tùy chỉnh mọi thứ hơn nữa với gói nếu cần.


4

Tôi đã có vấn đề này trong một câu hỏi chưa được trả lời khác ở đây . Tôi hy vọng các phông chữ khác nhau có cùng kích thước sẽ có cùng độ cao, nhưng dường như điều này không đúng, vì vậy tôi sẽ chỉ ra cách tiếp cận đặc biệt của mình để khắc phục điều này.

Bỏ các điểm nhấn sang một bên và chỉ tập trung vào các ký tự đơn giản, các phông chữ khác nhau là cần thiết để hiển thị tất cả các ký tự khác nhau đơn giản vì một số phông chữ bỏ qua toàn bộ các khối ký tự có trong các phông chữ khác. Để đảm bảo rằng các ký tự không phổ biến (chẳng hạn như "") có ít nhất một phông chữ cho chúng, hãy cài đặt một phông chữ như Symbola và xem danh sách các phông chữ trong readme của gói phông chữ unicode .

Nếu bạn cài đặt gói unicode-fontsvà một số phông chữ tốt, tất cả các ký tự sẽ được hỗ trợ, nhưng một số sẽ có chiều cao hiển thị sai trong emacs.

Giả sử rằng Monaco có độ cao không chính xác, nhưng Symbola dường như có độ cao chính xác cho các ký hiệu toán học (chẳng hạn như SUBSET OF ORALAL TO ⊆; sử dụng C-x 8 REThoặc insert-charđể kiểm tra các ký tự khác nhau.). Trong trường hợp của tôi, không sử dụng Biểu tượng của Monaco, Biểu tượng Noto Sans và Biểu tượng Apple là đủ; một phông chữ tốt cho tôi là DejaVu Sans Mono.

Điều đầu tiên là bạn có thể cấm unicode-fontssử dụng Monaco bằng cách thêm nó vào unicode-fonts-skip-fonts; bất cứ phông chữ nào nó chọn tiếp theo có thể có chiều cao phù hợp. Ngoài ra, bạn có thể yêu unicode-fontscầu sử dụng một phông chữ cụ thể cho khối Unicode (chẳng hạn như Toán tử toán học; đây là danh sách tất cả các khối ) bằng cách sửa đổi mục nhập unicode-fonts-block-font-mapping.

Thứ hai là bạn có thể dễ dàng làm điều này bằng tay cho một bộ ký tự rất chính xác bằng cách sử dụng set-fontset-font. Nếu Symbola là một phông chữ tốt cho các ký hiệu toán học (trong trường hợp này là phạm vi 0x2100..0x23ff), thì những điều sau đây sẽ hoạt động:

(set-fontset-font t '(#x2100 . #x23ff)
  ;; this should throw an error if there is no such font
  (font-xlfd-name (find-font (font-spec :family "Symbola"))))

Phạm vi khác tôi cần phải thay đổi bản thân mình là 2000..206f, 27c0..27ff, 2900..2bff, 1d400..1d7ff.

Cuối cùng, không cần thiết phải tìm kiếm các ký tự được cấu hình sai bằng tay. Giả sử đã unicode-fontsđược cài đặt, chức năng sau đây sẽ tạo danh sách tất cả các ký tự có độ cao không chính xác:

(defun debug-unicode-heights (&optional block-name)
  "Find all characters in a given block that have incorrect heights.

BLOCK-NAME can be anything that
`unicode-fonts-debug-insert-block' accepts, such as `'all-math',
or a string naming a Unicode block."
  (interactive "sBlock name:")
  (unless block-name (setq block-name 'all-math))
  (let ((buffer (generate-new-buffer (format "debug-unicode-heights:%s" block-name)))
        expected-height
        bad-characters)
    (pop-to-buffer buffer)
    (with-current-buffer buffer
      (unicode-fonts-debug-insert-block block-name)
      (goto-char (point-min))
      (setq expected-height (line-pixel-height))
      ;; (message "Expected height %d" expected-height)
      (while (< (point) (point-max))
        (if (or (= (line-pixel-height) expected-height)
                ;; Some characters are invalid, they have no name
                ;; (their name is just their hex code), and their
                ;; heights do not matter to us.
                (looking-at-p "^.[^\"]*\"#"))
            (delete-region (line-beginning-position)
                           (1+ (line-end-position)))
          (push (char-after (line-beginning-position)) bad-characters)
          (forward-line))))
    ;; (display-message-or-buffer buffer)
    (apply #'string (reverse bad-characters))))

Ví dụ:

M-: (debug-unicode-heights 'all-math)

và sau đó

M-: (debug-unicode-heights 'all-greek)

sẽ hiển thị tất cả các biểu tượng toán học xấu. Sau đó, bạn có thể kiểm tra xem chúng được hiển thị với phông chữ nào và thay đổi nó.

Tôi có OS X 10.9.5, vì vậy cài đặt phông chữ của tôi có thể khác với cài đặt của bạn. Không cần thiết phải cài đặt unicode-fonts; có thể chỉ định thủ công các lựa chọn phông chữ ưa thích của bạn hoàn toàn thông qua set-fontset-fontbất cứ khi nào bạn thấy các lựa chọn mặc định của emacs không hoạt động tốt.

PS Có một cách khác: khi một phông chữ luôn quá lớn / nhỏ, bạn có thể thêm một mục face-font-rescale-alistđể nói với emacs luôn nhân kích thước của phông chữ đó với hệ số 0,95, như vậy:

(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)

Khi tôi thử điều này, nó không hoạt động tốt (báo cáo lỗi của tôi ở đây ), nhưng đây cũng là một cách tiếp cận có thể.


Những lời khuyên về set-fontset-fontdường như chỉ có một yêu cầu thực sự. Tôi chỉ phải đánh giá, ví dụ, (set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")về tạo khung ( window-setup-hookđể làm cho nó hoạt động emacs --daemon) và cài đặt gói ttf-ancient-fonts có Symbola trong Debian .
nberth

2

Đây là một lỗi; nó được cố định trong thân cây. Vấn đề được gây ra bởi thông tin chiều cao dòng xấu trên phông chữ TeX, đó là những thông tin mà Emacs rơi vào nếu không tìm thấy ký tự.

Các chủ đề lỗi trên emacs-bug có nhiều thông tin hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.