ฉันแล้วก็ปัญหานี้ในคำถามที่ไม่มีคำตอบที่แตกต่างกันที่นี่ ฉันคาดหวังว่าแบบอักษรที่แตกต่างกันในขนาดเดียวกันจะมีความสูงเท่ากัน แต่นี่ไม่ได้เป็นเช่นนั้นดังนั้นฉันจะแสดงวิธีการเฉพาะกิจของฉันเพื่อแก้ไขปัญหานี้
ทิ้งสำเนียงไว้และเน้นเฉพาะตัวอักษรธรรมดาเท่านั้นแบบอักษรที่แตกต่างกันจำเป็นต้องแสดงตัวอักษรที่แตกต่างกันทั้งหมดเพียงเพราะแบบอักษรบางตัวตัดบล็อกอักขระทั้งหมดที่มีอยู่ในแบบอักษรอื่น ๆ เพื่อให้แน่ใจว่าอักขระที่ผิดปกติ (เช่น "𝚫") มีแบบอักษรอย่างน้อยหนึ่งตัวให้ติดตั้งแบบอักษรเช่น Symbola และดูรายการแบบอักษรใน readme ของแพคเกจunicode-fonts
หากคุณติดตั้งแพคเกจunicode-fonts
และแบบอักษรที่ดีจำนวนมากควรสนับสนุนตัวละครทุกตัว แต่บางตัวจะมีความสูงที่แสดงผิดใน emacs
สมมติว่าโมนาโกมีความสูงไม่ถูกต้อง แต่ Symbola ดูเหมือนจะมีความสูงที่ถูกต้องสำหรับสัญลักษณ์ทางคณิตศาสตร์ (เช่น SUBSET OF OR เท่ากับ TO ⊆; ใช้C-x 8 RETหรือinsert-char
เพื่อทดสอบอักขระที่แตกต่างกัน) ในกรณีของฉันการใช้โมนาโกสัญลักษณ์ Noto Sans และสัญลักษณ์ Apple นั้นไม่เพียงพอ หนึ่งตัวอักษรที่ดีสำหรับฉันคือ DejaVu Sans Mono
สิ่งแรกคือการที่คุณสามารถห้ามunicode-fonts
จากการใช้โมนาโกโดยเพิ่มไปunicode-fonts-skip-fonts
; แบบอักษรใดก็ตามที่เลือกถัดไปอาจมีความสูงที่เหมาะสม หรือคุณสามารถบอกได้ว่าunicode-fonts
จะใช้ตัวอักษรเฉพาะสำหรับบล็อก Unicode (เช่นผู้ประกอบการทางคณิตศาสตร์; นี่คือรายการของบล็อกทั้งหมด ) unicode-fonts-block-font-mapping
โดยการปรับเปลี่ยนรายการของ
set-fontset-font
ประการที่สองคือที่คุณสามารถทำด้วยตนเองนี้สำหรับการตั้งค่าที่แม่นยำมากของตัวละครโดยใช้ หาก Symbola เป็นแบบอักษรที่ดีสำหรับสัญลักษณ์ทางคณิตศาสตร์ (ในกรณีนี้คือช่วง0x2100..0x23ff
) สิ่งต่อไปนี้ควรใช้:
(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"))))
ช่วงอื่น ๆ ฉันต้องการที่จะแก้ไขตัวเองได้2000..206f
, 27c0..27ff
, ,2900..2bff
1d400..1d7ff
ในที่สุดก็ไม่จำเป็นต้องค้นหาอักขระที่กำหนดค่าผิดพลาดด้วยตนเอง สมมติว่าunicode-fonts
มีการติดตั้งฟังก์ชั่นต่อไปนี้จะสร้างรายการของตัวละครทั้งหมดที่มีความสูงไม่ถูกต้อง:
(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))))
ตัวอย่างเช่น:
M-: (debug-unicode-heights 'all-math)
แล้ว
M-: (debug-unicode-heights 'all-greek)
จะแสดงสัญลักษณ์ทางคณิตศาสตร์ที่ไม่ดีทั้งหมด จากนั้นคุณสามารถตรวจสอบแบบอักษรที่พวกเขาจะแสดงด้วยและเปลี่ยนมัน
ฉันมี OS X 10.9.5 ดังนั้นการตั้งค่าแบบอักษรของฉันอาจแตกต่างจากของคุณ มันไม่จำเป็นต้องติดตั้งunicode-fonts
; เป็นไปได้ที่จะระบุตัวเลือกแบบอักษรที่คุณต้องการด้วยตนเองset-fontset-font
เมื่อใดก็ตามที่คุณพบว่าตัวเลือกเริ่มต้นของ emacs ทำงานได้ไม่ดี
ป.ล.มีทางเลือกอื่นคือ: เมื่อแบบอักษรใหญ่เกินไป / เล็กเกินไปคุณสามารถเพิ่มรายการface-font-rescale-alist
เพื่อบอก emacs ให้คูณขนาดของแบบอักษรนั้นด้วยการคูณด้วยปัจจัยพูด, 0.95, ดังนี้:
(add-to-list 'face-font-rescale-alist (cons (font-spec :family "STIXGeneral") 0.95) t)
เมื่อฉันลองสิ่งนี้มันไม่ได้ผลนัก (รายงานข้อผิดพลาดของฉันอยู่ที่นี่ ) แต่นี่ก็เป็นแนวทางที่เป็นไปได้เช่นกัน