ความสูงของบรรทัดที่มีอักขระ Unicode


23

อักขระ Unicode บางตัวทำให้บรรทัดที่แสดงนั้นมีขนาดใหญ่มาก ตัวอย่างเช่นสำเนียงหลุมศพ "̀" เพิ่มพื้นที่ประมาณ 2.5 บรรทัดด้านบนและด้านล่าง ตัวละครอื่น ๆ ที่ทำให้เกิดพฤติกรรมนี้รวมถึงตัวอักษรกรีก "ϕ" (พี) หรือเซ็ตย่อยเท่ากับ "⫅" อักขระอื่น ๆ เช่น maps-to "⤇" เพิ่มเพียงประมาณ 0.5 บรรทัดในแต่ละด้าน

ฉันพบปัญหานี้เมื่ออ่านแหล่งที่มาjulia-mode.elซึ่งมีอักขระดังกล่าวจำนวนมากสำหรับการทดแทน LaTeX

ทำไมถึงเกิดขึ้นและสามารถแก้ไขได้?

แก้ไข: ฉันใช้ Ubuntu 14.04 LTS กับ Emacs 24.3.1 ตามค่าเริ่มต้นฉันใช้แบบอักษร "Ubuntu Mono 13" แต่บางครั้งก็ใช้แบบอักษรอื่นเพื่อแสดงอักขระ ผมได้ติดตั้งแพคเกจที่ไม่มีการจัดการอย่างชัดเจน Unicode emacs -Qและแก้ไขปัญหานี้คือสามารถทำซ้ำได้โดยใช้คำสั่ง


3
นี่อาจเกี่ยวข้องกับแบบอักษรที่คุณติดตั้ง การใช้แบบอักษรที่มี Unicode รองรับในตัว (เช่น DejaVu Sans Mono) อาจช่วยได้
Chris

โปรดแก้ไขคำถามของคุณและเพิ่มข้อมูลเกี่ยวกับระบบปฏิบัติการเวอร์ชั่น Emacs และแบบอักษรที่คุณใช้สำหรับ Emacs
Lunaryorn

นอกจากนี้ยังพูดถึงว่าคุณใช้แพคเกจ / คำสั่งใด ๆ เพื่อติดตั้ง Unicode หรือคุณเพียงแค่ใช้สิ่งที่ออกมาจากกล่อง
Malabarba

เห็นด้วยกับแบบอักษร: ฉันใช้ DejaVu Sans Mono และแสดงอักขระ unicode โดยไม่มีความแตกต่างที่มองเห็นได้ในระยะห่างบรรทัดแนวตั้ง
ด่าน

ฉันติดตั้ง DejaVu Sans Mono จริงๆและใช้สำหรับตัวละครบางตัวเช่น "ϛ" ดังนั้นจึงดูเหมือนว่าจะเลือกแบบอักษรที่แตกต่างกันสำหรับพีนั่นคือ "xft: -unknown-Latin Modern Math-Normal-Normal-Normal- -17- - - - - * - 0-iso10646-1"
Patrick Steele

คำตอบ:


7

ปัญหานี้เกิดขึ้นเนื่องจาก Emacs ใช้แบบอักษรที่แตกต่างกันสำหรับส่วนต่าง ๆ ของชุดอักขระ Unicode C-u C-x =คุณสามารถตรวจสอบสิ่งที่ตัวอักษรที่จะถูกใช้โดยการวางเคอร์เซอร์บนตัวอักษรและกด ตัวอย่างเช่นด้วยการกำหนดค่าของฉันผ่านตัวละคร ASCII ที่ฉันได้รับnil:-apple-Consolas-medium-normal-normal-*-14-*-*-*-m-0-iso10646-1 (#x88)แต่เหนือ⧺ฉันได้รับnil:-apple-Symbola-medium-normal-normal-*-14-*-*-*-p-0-iso10646-1 (#xCE1)(กล่าวอีกนัยหนึ่งก็คือการใช้ Consolas สำหรับ ASCII และ Symbola สำหรับตัวละครพิเศษบางตัว) แบบอักษรที่แตกต่างกันมีความสูงที่แตกต่างกันและ Emacs จะให้พื้นที่เพียงพอในความสูงของบรรทัดเสมอเพื่อแสดงแบบอักษรที่สูงที่สุด โดยค่าเริ่มต้น Emacs จะพยายามใช้แบบอักษรที่ขึ้นกับระบบที่ใช้งานได้ แต่สิ่งนี้มักจะนำไปสู่ผลลัพธ์ที่น่าเกลียด

วิธีแก้ปัญหาที่ฉันพบกับปัญหาความสูงของบรรทัดนั้นค่อนข้างน่ารำคาญ แต่ฉันต้องผ่านตัวอักษรที่เป็นปัญหาที่ฉันค้นหาและใช้set-fontset-fontเพื่อตั้งค่าให้เป็นแบบอักษร / ขนาดที่ไม่ส่งผลกระทบต่อความสูงของบรรทัด รหัสการทำเช่นนี้มีอยู่ในการกำหนดค่าของฉันแต่มันน่าเกลียดและยังไม่สมบูรณ์ หากใครมีวิธีแก้ปัญหาที่ดีกว่าฉันจะสนใจฟังมัน


1
ฉันคิดว่าวิธีที่ง่ายกว่าอาจใช้Unicode แบบอักษรตามคำตอบของฉัน มันเหมาะกับคุณไหม
คิริลล์

@ คิริล: ยูนิโค้ด - ฟอนต์ดูน่าสนใจจริงๆ แต่ฉันไม่แน่ใจว่ามันจะแก้ปัญหานี้ได้โดยไม่ต้องปรับแต่งอย่างมีนัยสำคัญ (ฉันไม่ได้ลองเลยดังนั้นฉันอาจจะผิด) ปัญหารูทคือฟอนต์ที่แตกต่างกันที่มีขนาดเท่ากันมีความสูงของเส้นต่างกันดังนั้นแต่ละฟอนต์จะต้องมีการปรับแต่งจนกว่ามันจะมีความสูงของบรรทัดเดียวกัน (โดยประมาณ) unicode-fonts ดูเหมือนจะทำให้ปรับขนาดตัวอักษรได้ง่าย
shosti

ใช่ฉันคิดว่ามันเป็นเรื่องจริง แต่มันทำให้ง่ายต่อการเลือกแบบอักษรสำหรับบล็อกทั้งหมดของตัวละครดังนั้นคุณไม่จำเป็นต้องค้นหาตัวอักษรแต่ละตัวด้วยตนเองอย่างสมบูรณ์
คิริลล์

6

ฉันใช้โหมด agda พร้อมสัญลักษณ์ทางคณิตศาสตร์จำนวนมากและมีปัญหาเดียวกัน เคยเป็นทางออกที่แท้จริงเพียงอย่างเดียวคือ @shosti แนะนำ: การปรับแต่งการแมปแบบอักษร ในกรณีของฉันฉันต้องปิดการใช้งานแบบอักษรจำนวนมากเพราะแม้ว่าฉันจะมีแบบอักษรที่ติดตั้งด้วย glyphs ที่กำหนดไว้ emacs มักจะเลือกผิด (การแสดงกล่อง) ดูเหมือนว่าจะแย่ลงใน OSX แต่ฉันก็เห็นมันบน Linux ด้วย ดังนั้นการติดตั้งแบบอักษรที่ถูกต้องจึงไม่เพียงพอ

สิ่งที่ฉันทำตอนนี้คือใช้แพ็คเกจunicode-fonts ที่ยอดเยี่ยมของ Roland Walker (ฉันขอแนะนำให้ติดตั้งผ่าน MELPA) ปัญหานี้ได้หมดไปอย่างสิ้นเชิง

ฉันใส่สิ่งนี้ลงในไฟล์ init ของฉัน:

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

ฉันใช้ PragmataPro เป็นค่าเริ่มต้น แต่ตัวอักษรอื่น ๆ ที่มีความครอบคลุมที่ดีจะทำงานได้เช่นกันและคุณสามารถกำหนดสิ่งต่าง ๆ เพิ่มเติมด้วยแพ็คเกจหากจำเป็น


4

ฉันแล้วก็ปัญหานี้ในคำถามที่ไม่มีคำตอบที่แตกต่างกันที่นี่ ฉันคาดหวังว่าแบบอักษรที่แตกต่างกันในขนาดเดียวกันจะมีความสูงเท่ากัน แต่นี่ไม่ได้เป็นเช่นนั้นดังนั้นฉันจะแสดงวิธีการเฉพาะกิจของฉันเพื่อแก้ไขปัญหานี้

ทิ้งสำเนียงไว้และเน้นเฉพาะตัวอักษรธรรมดาเท่านั้นแบบอักษรที่แตกต่างกันจำเป็นต้องแสดงตัวอักษรที่แตกต่างกันทั้งหมดเพียงเพราะแบบอักษรบางตัวตัดบล็อกอักขระทั้งหมดที่มีอยู่ในแบบอักษรอื่น ๆ เพื่อให้แน่ใจว่าอักขระที่ผิดปกติ (เช่น "𝚫") มีแบบอักษรอย่างน้อยหนึ่งตัวให้ติดตั้งแบบอักษรเช่น 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..2bff1d400..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)

เมื่อฉันลองสิ่งนี้มันไม่ได้ผลนัก (รายงานข้อผิดพลาดของฉันอยู่ที่นี่ ) แต่นี่ก็เป็นแนวทางที่เป็นไปได้เช่นกัน


คำแนะนำเกี่ยวกับset-fontset-fontดูเหมือนเป็นสิ่งเดียวที่จำเป็นจริง ฉันมีเพียงการ EVAL เช่น(set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")ในการสร้างกรอบ ( window-setup-hook; จะทำให้มันทำงานด้วยemacs --daemon) และการติดตั้งแพคเกจttf-ancient-fonts ที่มี Symbola ภายใต้ Debian
nberth

2

นี่เป็นข้อผิดพลาด มันได้รับการแก้ไขในลำตัว ปัญหาเกิดจากข้อมูลความสูงของบรรทัดที่ไม่ถูกต้องในฟอนต์ TeX ซึ่งเป็นแบบที่ Emacs ล้มเหลวหากไม่สามารถค้นหาตัวอักษรได้

เธรดบั๊กบน emacs-bugมีข้อมูลมากขึ้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.