यूनिकोड वर्णों के साथ लाइन की ऊँचाई


23

कुछ यूनिकोड वर्णों के कारण वे रेखा प्रदर्शित होती है जो काफी बड़ी होती हैं। उदाहरण के लिए, एक गंभीर उच्चारण "̀" इसके ऊपर और नीचे अंतरिक्ष की लगभग 2.5 लाइनें जोड़ता है। इस व्यवहार का कारण बनने वाले अन्य वर्णों में ग्रीक अक्षर "(" (phi) या उप-समतुल्य "⫅" शामिल हैं। अन्य वर्ण जैसे मानचित्र-से "-" दोनों तरफ केवल 0.5 रेखाएँ जोड़ते हैं।

जब julia-mode.elलेटेक्स प्रतिस्थापन के लिए इस तरह के पात्रों की एक बड़ी संख्या शामिल है के स्रोत को पढ़ते हुए मैं इस समस्या में भाग गया ।

ऐसा क्यों होता है, और क्या इसे ठीक किया जा सकता है?

संपादित करें: मैं 24.3.1 Emacs के साथ Ubuntu 14.04 LTS का उपयोग कर रहा हूं। डिफ़ॉल्ट रूप से मैं "उबंटू मोनो 13" फ़ॉन्ट का उपयोग करता हूं लेकिन अन्य फोंट कभी-कभी पात्रों को प्रदर्शित करने के लिए उपयोग किए जाते हैं। मैंने यूनिकोड को स्पष्ट रूप से प्रबंधित करने के लिए कोई पैकेज स्थापित नहीं किया है, और यह समस्या कमांड का उपयोग करके प्रतिलिपि प्रस्तुत करने योग्य है emacs -Q


3
यह संभवतः आपके द्वारा इंस्टॉल किए गए फोंट से संबंधित है। (जैसे DejaVu Sans मोनो) में निर्मित सभ्य यूनिकोड समर्थन वाले फ़ॉन्ट का उपयोग करने से मदद मिल सकती है।
क्रिस

कृपया अपने प्रश्न को संपादित करें और अपने OS, अपने Emacs संस्करण और Emacs के लिए उपयोग किए जाने वाले फोंट के बारे में जानकारी जोड़ें।
17

यह भी उल्लेख करें कि क्या आप यूनिकोड सेटअप करने के लिए किसी पैकेज / कमांड का उपयोग करते हैं। या आप जो कुछ भी बॉक्स से बाहर आया है उसका उपयोग कर रहे हैं।
मालाबार

फ़ॉन्ट पर सहमत: मैं DejaVu Sans मोनो का उपयोग करता हूं और यूनिकोड वर्ण ऊर्ध्वाधर रेखा रिक्ति में किसी भी दृश्य अंतर के बिना प्रस्तुत करता है।
दान

मेरे पास वास्तव में डीज़ावु संस मोनो स्थापित है, और इसका उपयोग कुछ पात्रों के लिए किया जाता है, जैसे "ϛ"। तो यह फी के लिए एक अलग फॉन्ट, अर्थात् का चयन किया जा रहा है "Xft: -unknown-लैटिन आधुनिक गणित सामान्य सामान्य-normal- -17- - - - * - 0-iso10646-1"।
पैट्रिक स्टील

जवाबों:


7

यह इसलिए होता है क्योंकि Emacs यूनिकोड वर्ण सेट के विभिन्न भागों के लिए विभिन्न फोंट का उपयोग करता है। आप यह सत्यापित कर सकते हैं कि किसी चरित्र पर कर्सर रखकर और दबाकर किस फ़ॉन्ट का उपयोग किया जा रहा है 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)(दूसरे शब्दों में, यह कुछ विशेष वर्णों के लिए ASCII और सिंबोला के लिए कंसोल का उपयोग कर रहा है)। अलग-अलग फॉन्ट में अलग-अलग ऊंचाइयां होती हैं, और Emacs हमेशा सबसे ऊंचे फॉन्ट को प्रदर्शित करने के लिए लाइन की ऊंचाई में पर्याप्त जगह देंगे। डिफ़ॉल्ट रूप से, Emacs सिस्टम-निर्भर फ़ॉन्ट का उपयोग करने की कोशिश करेंगे जो काम करते हैं, लेकिन यह अक्सर बदसूरत परिणामों की ओर जाता है।

लाइन ऊंचाई की समस्या के लिए मैंने जो समाधान पाया है वह दुर्भाग्य से परेशान है: मैं समस्याग्रस्त पात्रों के माध्यम से जाता हूं जो मुझे लगता है और set-fontset-fontउन्हें फ़ॉन्ट / आकार पर सेट करने के लिए उपयोग करता है जो लाइन की ऊंचाई को प्रभावित नहीं करता है। ऐसा करने का कोड मेरे कॉन्फ़िगरेशन में उपलब्ध है , लेकिन यह बदसूरत है और अभी भी सही नहीं है। अगर किसी के पास कोई बेहतर उपाय है तो मैं उसे सुनने में दिलचस्पी लूंगा।


1
मुझे लगता है कि यूनिकोड-फोंट का उपयोग करने के लिए एक सरल दृष्टिकोण हो सकता है , जैसा कि मेरे उत्तर में है; क्या ये तुम्हारे लिए कारगर है?
किरिल

@Kirill: यूनिकोड-फोंट वास्तव में दिलचस्प लगता है, लेकिन मुझे यकीन नहीं है कि यह महत्वपूर्ण ट्वीकिंग के बिना इस विशिष्ट मुद्दे को हल करेगा (मैंने इसे आज़माया नहीं है, इसलिए मैं गलत हो सकता हूं)। मूल समस्या यह है कि एक ही आकार के अलग-अलग फॉन्ट में अलग-अलग लाइन हाइट होती है, इसलिए प्रत्येक फॉन्ट को तब तक ट्विट करना पड़ता है जब तक कि इसमें (लगभग) एक ही लाइन की ऊंचाई न हो। यूनिकोड-फोंट ऐसा नहीं लगता है कि यह फ़ॉन्ट आकारों को आसान बनाता है।
४४ को शास्त्री

हां, मुझे लगता है कि यह सच है, लेकिन इससे वर्णों के पूरे ब्लॉक के लिए फोंट का चयन करना आसान हो जाता है, इसलिए आपको व्यक्तिगत पात्रों को पूरी तरह से मैन्युअल रूप से खोजने की आवश्यकता नहीं है।
किरिल

6

मैं बहुत सारे गणितीय प्रतीकों के साथ एग्डा-मोड का उपयोग करता हूं और एक ही समस्या थी। एकमात्र वास्तविक समाधान हुआ करता था जैसा @shosti बताता है: फ़ॉन्ट मैपिंग को अनुकूलित करना। मेरे मामले में, मुझे कई फोंट को अक्षम करना पड़ा क्योंकि भले ही मैंने विशेष रूप से परिभाषित ग्लिफ़्स के साथ फोंट स्थापित किए थे, एमएसीएस अक्सर गलत एक (बक्से प्रदर्शित) का चयन करेगा। OSX पर खराब होने लगा, लेकिन मैंने इसे लिनक्स पर भी देखा है। तो बस सही फोंट स्थापित पर्याप्त नहीं था।

अब मैं क्या करता हूं रोलाण्ड वाकर के उत्कृष्ट यूनिकोड-फोंट पैकेज का उपयोग करें। (मैं MELPA के माध्यम से इसे स्थापित करने की सिफारिश करूंगा।) इसने इस मुद्दे को पूरी तरह से समाप्त कर दिया है।

मैंने इसे अपनी इनिट फ़ाइल में डाला:

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

मैं डिफ़ॉल्ट रूप से PragmataPro का उपयोग करता हूं, लेकिन अच्छी कवरेज वाला कोई अन्य फ़ॉन्ट भी काम करेगा और आप जरूरत पड़ने पर पैकेज के साथ चीजों को और भी अनुकूलित कर सकते हैं।


4

मैं पहले से ही एक अलग अनुत्तरित सवाल में इस समस्या थी यहाँ । मैं एक ही आकार के लिए एक ही आकार में विभिन्न फोंट की उम्मीद करूंगा, लेकिन यह मामला प्रतीत नहीं होता है, इसलिए मैं इसे ठीक करने के लिए अपना तदर्थ दृष्टिकोण दिखाऊंगा।

एक तरफ उच्चारण छोड़ना, और केवल सादे पात्रों पर ध्यान केंद्रित करना, अलग-अलग फ़ॉन्ट सभी विभिन्न वर्णों को केवल इसलिए प्रदर्शित करना आवश्यक है क्योंकि कुछ फ़ॉन्ट वर्णों के पूरे ब्लॉक को छोड़ देते हैं जो अन्य फ़ॉन्ट में मौजूद हैं। यह सुनिश्चित करने के लिए कि असामान्य अक्षर (जैसे ")") में उनके लिए कम से कम एक फ़ॉन्ट है, एक फ़ॉन्ट जैसे सिम्बोला स्थापित करें, और यूनिकोड-फोंट पैकेज की रीडमी में फ़ॉन्ट की सूची देखें ।

यदि आप पैकेज unicode-fontsऔर कई अच्छे फोंट स्थापित करते हैं, तो सभी वर्णों का समर्थन किया जाना चाहिए, लेकिन कुछ में गलत तरीके से प्रदर्शित ऊंचाइयां होंगी।

मान लीजिए कि मोनाको में गलत ऊंचाइयां हैं, लेकिन सिंबोला गणितीय प्रतीकों के लिए सही ऊंचाइयों को प्रकट करता है (जैसे कि BS SUQUET OF OR EQUAL TO use; का उपयोग करना C-x 8 RETया insert-charविभिन्न पात्रों का परीक्षण करना।)। मेरे मामले में, मोनाको, नोटो सैंस सिंबल्स और एप्पल सिंबल का उपयोग करना पर्याप्त नहीं था; मेरे लिए एक अच्छा फ़ॉन्ट DejaVu Sans मोनो था।

पहली बात यह है कि आप unicode-fontsइसे जोड़कर मोनाको का उपयोग करने से मना कर सकते हैं unicode-fonts-skip-fonts; इसके बाद जो भी फॉन्ट का चयन करेगा उसकी सही ऊंचाई हो सकती है। वैकल्पिक रूप से, आप unicode-fontsएक यूनिकोड ब्लॉक के लिए एक विशिष्ट फ़ॉन्ट का उपयोग करना बता सकते हैं (जैसे गणितीय ऑपरेटर; यहां एक प्रविष्टि को संशोधित करके सभी ब्लॉकों की सूची है ) unicode-fonts-block-font-mapping

दूसरा यह है कि आप इसे आसानी से उपयोग करके वर्णों के बहुत सटीक सेट के लिए मैन्युअल रूप से कर सकते हैं set-fontset-font। यदि सिम्बोला गणितीय प्रतीकों के लिए एक अच्छा फ़ॉन्ट है (इस मामले में सीमा 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 की डिफ़ॉल्ट पसंद अच्छी तरह से काम नहीं करती है, तो अपने पसंदीदा फ़ॉन्ट विकल्पों को मैन्युअल रूप से निर्दिष्ट करना संभव है ।

PS एक विकल्प है: जब एक फ़ॉन्ट लगातार बहुत बड़ा / छोटा होता है, तो आप face-font-rescale-alistEmacs को हमेशा एक गुणक द्वारा उस फ़ॉन्ट के आकार को गुणा करने के लिए एक प्रविष्टि जोड़ सकते हैं , कहते हैं, 0.95, जैसे:

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

जब मैंने यह कोशिश की, तो यह बिल्कुल सही नहीं था (मेरी बग रिपोर्ट यहाँ है ), लेकिन यह भी एक संभव तरीका है।


के बारे में सलाह set-fontset-fontकेवल एक ही वास्तव में आवश्यक लगता है। मुझे केवल निर्माण करना था, उदाहरण के लिए, (set-fontset-font t '(#x1d400 . #x1d7ff) "Symbola")फ्रेम निर्माण पर ( window-setup-hook, इसके साथ काम करने के लिए emacs --daemon), और ttf-ancient-fonts सिबियन के तहत सिंबोला की विशेषता वाले पैकेज को स्थापित करना ।
nberth

2

यह एक बग है; यह ट्रंक में तय हो गया है। मुद्दा TeX फोंट पर खराब लाइन ऊंचाई की जानकारी के कारण होता है, जो ऐसा होता है कि Emacs वापस गिर जाता है अगर यह एक चरित्र नहीं पा सकता है।

इमैक-बग पर बग थ्रेड में बहुत अधिक जानकारी है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.