유니 코드 문자가있는 줄 높이


23

일부 유니 코드 문자로 인해 표시되는 행이 상당히 커집니다. 예를 들어, 억음 악센트 "̀"는 위와 아래에 약 2.5 줄의 공간을 추가합니다. 이 문제를 일으키는 다른 문자로는 그리스 문자 "ϕ"(phi) 또는 부분 집합이 동일한 "⫅"가 있습니다. "⤇"에 대한 맵과 같은 다른 문자는 양쪽에 약 0.5 줄만 추가합니다.

julia-mode.elLaTeX 대체를 위해 많은 문자가 포함 된 소스를 읽을 때이 문제가 발생했습니다 .

왜 이런 일이 발생하며 고칠 수 있습니까?

편집 : 나는 Emacs 24.3.1과 함께 Ubuntu 14.04 LTS를 사용하고 있습니다. 기본적으로 "Ubuntu Mono 13"글꼴을 사용하지만 다른 글꼴을 사용하여 문자를 표시하는 경우가 있습니다. 유니 코드를 명시 적으로 관리하기위한 패키지를 설치하지 않았으며이 문제는 명령을 사용하여 재현 할 수 emacs -Q있습니다.


3
이것은 설치 한 글꼴과 관련이있을 수 있습니다. 적절한 유니 코드 지원 기능이 내장 된 글꼴 (예 : DejaVu Sans Mono)을 사용하면 도움이 될 수 있습니다.
Chris

질문을 편집하고 OS, Emacs 버전 및 Emacs에 사용하는 글꼴에 대한 정보를 추가하십시오.
lunaryorn

패키지 / 명령을 사용하여 유니 코드를 설정하는지 여부도 언급하십시오. 또는 상자에서 나온 것을 사용하고 있습니다.
Malabarba

글꼴에 동의하십시오 : DejaVu Sans Mono를 사용하고 유니 코드 문자는 세로 줄 간격에 눈에 띄는 차이없이 렌더링됩니다.
Dan

실제로 DejaVu Sans Mono가 설치되어 있으며 "ϛ"와 같은 일부 문자에 사용됩니다. 그것은 즉 피에 다른 글꼴, 선택 것으로 보인다 "그래서 xft : -unknown 라틴 현대 수학 - 정상 - 정상 - 정상 -을 -17- - - - * - 0 ISO10646-1".
Patrick Steele

답변:


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에는 Consolas를 사용하고 일부 특수 문자에는 Symbola를 사용합니다). 글꼴마다 높이가 다르므로 Emacs는 항상 줄 높이에 가장 큰 글꼴을 표시하기에 충분한 공간을 제공합니다. 기본적으로 Emacs는 작동하는 시스템 의존적 글꼴을 사용하려고 시도하지만, 종종 추악한 결과를 초래합니다.

줄 높이 문제에 대해 찾은 해결책은 불행히도 다소 성가신 것입니다. 문제가 발생한 문자를 찾아서 set-fontset-font줄 높이에 영향을 미치지 않는 글꼴 / 크기로 설정하는 데 사용 합니다. 이 작업을 수행하는 코드는 내 구성 에서 사용할 수 있지만 추악하고 여전히 완벽하지는 않습니다. 누구든지 더 나은 솔루션을 가지고 있다면 그것을 듣고 싶습니다.


1
내 대답에서와 같이 더 간단한 접근법은 unicode-fonts 를 사용하는 것일 수 있습니다 . 그게 당신을 위해 작동합니까?
Kirill

@ 키릴 : 유니 코드 글꼴은 정말 흥미롭게 보이지만 크게 조정하지 않고이 특정 문제를 해결할지 확신하지 못합니다 (시도하지 않았으므로 잘못 될 수 있습니다). 근본적인 문제는 크기가 같은 글꼴마다 줄 높이가 다르기 때문에 각 줄의 글꼴 높이가 같아 질 때까지 조정해야합니다. 유니 코드 글꼴은 글꼴 크기를 쉽게 조정할 수있는 것처럼 보이지 않습니다.
shosti

예, 사실이라고 생각하지만 전체 문자 블록의 글꼴을 쉽게 선택할 수 있으므로 개별 문자를 직접 수동으로 검색 할 필요가 없습니다.
Kirill

6

나는 많은 수학적 기호와 함께 agda 모드를 사용하며 같은 문제가 있습니다. @shosti가 제안한 것처럼 글꼴 매핑을 사용자 정의하는 것이 유일한 해결책이었습니다. 필자의 경우 특정 글리프가 정의 된 글꼴을 설치했지만 emacs가 종종 잘못된 글꼴을 선택하기 때문에 여러 글꼴을 비활성화해야했습니다 (상자 표시). OSX에서는 더 나빠 보였지만 Linux에서도 보았습니다. 따라서 올바른 글꼴을 설치하는 것만으로는 충분하지 않습니다.

내가 지금하는 일은 롤랜드 워커의 우수한 유니 코드 글꼴 패키지를 사용하는 것입니다. MELPA를 통해 설치하는 것이 좋습니다. 이렇게하면 문제가 완전히 해결되었습니다.

나는 이것을 init 파일에 넣었다.

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

기본적으로 PragmataPro를 사용하지만 적용 범위가 좋은 다른 글꼴도 작동하며 필요한 경우 패키지를 사용하여 추가로 사용자 정의 할 수 있습니다.


4

나는 이미 다른 답이없는 질문이 문제가 있었다 여기 . 같은 크기의 다른 글꼴의 높이는 같을 것으로 예상되지만 그렇지 않은 것 같으므로이 문제를 해결하기위한 임시 접근 방식을 보여 드리겠습니다.

악센트를 남기고 일반 문자에만 집중하면 일부 글꼴은 다른 글꼴에있는 전체 문자 블록을 생략하기 때문에 다른 모든 문자를 표시하기 위해 다른 글꼴이 필요합니다. 흔하지 않은 문자 (예 : "𝚫")에 하나 이상의 글꼴이 포함되도록하려면 Symbola와 같은 글꼴을 설치하고 유니 코드 글꼴 패키지 의 읽어보기에서 글꼴 목록을 확인하십시오 .

패키지 unicode-fonts와 여러 가지 좋은 글꼴 을 설치하면 모든 문자가 지원되지만 일부는 emacs에서 높이가 잘못 표시됩니다.

모나코의 높이가 올바르지 않지만 Symbola는 수학 기호 (예 : SUBSET OF OR EQUAL TO ⊆; C-x 8 RET또는 insert-char다른 문자 사용 또는 테스트)에 대해 올바른 높이를 갖는 것으로 나타납니다 . 필자의 경우, Monaco, Noto Sans Symbols 및 Apple Symbols를 사용하지 않는 것으로 충분했습니다. 저에게 좋은 글꼴은 DejaVu Sans Mono였습니다.

첫 번째는 unicode-fontsMonaco를 추가하여 사용하지 못하게 할 수 있다는 것입니다 unicode-fonts-skip-fonts. 다음에 선택한 글꼴은 올바른 높이를 가질 수 있습니다. 또는 의 항목을 수정하여 unicode-fonts유니 코드 블록 (예 : 수학 연산자와 같이 여기에 모든 블록 목록이 있음 )에 특정 글꼴을 사용하도록 지시 할 수 있습니다 unicode-fonts-block-font-mapping.

두 번째는를 사용하여 매우 정확한 문자 집합을 위해이 작업을 쉽게 수동으로 수행 할 수 있다는 것 set-fontset-font입니다. Symbola가 수학 기호 (이 경우 range 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-fontemacs의 기본 선택이 제대로 작동하지 않을 때마다 원하는 글꼴 선택을 전체적으로 수동으로 지정할 수 있습니다.

추신 대안이 있습니다 : 폰트가 지속적으로 너무 크거나 작을 때, face-font-rescale-alist이멕스에게 폰트의 크기에 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 데비안 아래 Symbola가 포함 된 패키지 설치해야했습니다 .
nberth

2

이것은 버그입니다. 트렁크에 고정되어 있습니다. 이 문제는 TeX 글꼴의 잘못된 줄 높이 정보로 인해 발생합니다.이 글꼴은 문자를 찾을 수없는 경우 Emacs가 다시 사용하는 글꼴입니다.

emacs-bug의 버그 스레드 에는 더 많은 정보가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.