Как заставить Firefox использовать шрифты MS TrueType для Helvetica, Times и т. Д.?

8373
Jonik

Я использую (Windows) шрифты TrueType на своей рабочей станции Ubuntu ( подробности ), и я в основном доволен тем, как выглядят шрифты, как в настольных приложениях, так и в Интернете (используя Firefox).

Однако на некоторых веб-страницах, таких как эта, шрифты полностью отстойны:

Скриншот

Я нашел причину быть Helveticaв CSS для этого сайта:

font-family: Helvetica,Arial,Tahoma,sans-serif; 

Когда, используя Firebug, я удаляю Helvetica из этого списка, он использует Arial и снова выглядит элегантно:

альтернативный текст

У меня вопрос, как сделать так, чтобы веб-страницы, которые используют Helvetica (или Times, или другие подобные шрифты), выглядели автоматически? Другими словами, как сопоставить семейства шрифтов Times и Helvetica значениям по умолчанию с засечками и без засечек (в моем случае это были бы Times New Roman и Arial соответственно)?

Я заинтересован в любом решении, которое заставляет Firefox использовать шрифты MS TrueType в этом сценарии, независимо от того, основано ли оно на настройке контуров шрифтов Ubuntu или пользовательских правилах CSS в Firefox (или что-то еще, о чем я сейчас не имею понятия).

Обновление : теперь я полностью решил проблему - этот ответ описывает, что мне нужно было сделать.

7
Подождите, есть улучшение? Josh Hunt 15 лет назад 0
Определенно да. Но я думаю, какие шрифты предпочитают люди, варьируется от одного человека к другому. Сравните, например, два скриншота в http://superuser.com/questions/19824/better-ubuntu-fonts Jonik 15 лет назад 0
Извините, я просто самодовольный пользователь Mac, еще раз. http://imgur.com/dYFBQ.png Josh Hunt 15 лет назад 0
Ничего себе, с обоими снимками экрана я не мог точно сказать, действительно ли это Helvetica или Arial, хотя строчная буква A, кажется, подтверждает это ... Я прочитал в ссылочных деталях, что вам не нравится сглаживание для маленького шрифта размеры, так что я не буду начинать. ;-) Arjan 15 лет назад 0
Просто чтобы вы знали, это шрифт постскриптума "Nimbus Sans L", который там плохо растеризован. sgm 14 лет назад 0
Растровое изображение Helvetica выглядит намного лучше: http://yfrog.com/hqsampp sgm 14 лет назад 0
@sgm, на мой взгляд, шрифт на скриншоте по-прежнему выглядит довольно плохо по сравнению с Arial :) В любом случае, я думаю, что у меня есть решение (см. комментарии к моему ответу), и я проверю это, когда вернусь на моя рабочая машина. Jonik 14 лет назад 0
Да, я согласен, что это все еще немного грязно, и может выдержать некоторые изменения. sgm 14 лет назад 0

5 ответов на вопрос

6
Jonik

Изменить : я полностью обновил этот ответ после получения некоторых прорывных советов от коллеги.

Вот что я вставил /etc/fonts/local.conf(внутри <fontconfig>элемента):

<!-- Replace Helvetica with Arial --> <match target="pattern"> <test qual="any" name="family"> <string>Helvetica</string> </test> <edit name="family" mode="assign" binding="strong"> <string>Arial</string> </edit> </match>  

Аналогично для Times -> Times New Roman. (См. Мое полное local.conf здесь .) Ключ должен был использовать binding = "strong" для <edit>элемента. (Кроме того, использование режима «assign_replace» вместо «assign» приводит к чему-то похожему, за исключением того, что это становится слишком агрессивным: также Verdana заменяется на Arial).

Изменения в конфигурации шрифта вступают в силу немедленно. Помимо тестирования в Firefox, вы можете проверить, что он работает так:

$ fc-match helvetica Arial.ttf: "Arial" "Normal" 

Если вы столкнетесь с проблемами, то лучшая помощь рядом: man fonts-conf. (Хотя даже с документацией работа системы шрифтов казалась мне несколько сложной или громоздкой.) Вы также можете попытаться «отладить» то, что действительно происходит, с помощью такой команды:

FC_DEBUG=4 fc-match helvetica 

Кроме того, FC_DEBUG=1024 fc-match helveticaотображается список файлов конфигурации, которые влияют на сопоставление шрифтов.

1
DisgruntledGoat

У меня была похожая проблема в Opera, решением которой было отключение «Core X Fonts» в конфиге. Я бы посоветовал посмотреть, есть ли подобная опция в Firefox.

Другие опции:

  • Убедитесь, что у вас определенно не установлен шрифт «Helvetica», подобные вещи случались со мной несколько раз. IIRC проблемные шрифты были в папках 100dpiи 75dpiв папке системных шрифтов ( /usr/local/share/fontsя думаю). Я просто полностью переместил эти папки.
  • Проверьте значения по умолчанию в разделе « Система»> «Установки»> «Внешний вид»> «Шрифты» .
  • Проверьте настройки Firefox по умолчанию в разделе « Настройки»> «Содержимое» .

Если вы вносите изменения в основные папки, вам нужно перестроить кэш шрифтов с помощью:

sudo fc-cache -f -v 
Ах, я не заметил этого раньше. Что вы подразумеваете под отключением шрифтов Core X * в конфигурации * - где именно? Кроме того, что такое Система> Настройки> Шрифт? Инструмент настройки шрифта Gnome? Я использую KDE в своей Ubuntu, но у меня тоже есть Gnome. Если бы вы могли дать имена команд для их запуска, это было бы наиболее полезным. Jonik 15 лет назад 0
В Opera это `opera: config`, но в Firefox это` about: config`. Введите это в адресную строку, вы можете получить предупреждение о драконах; D, но продолжить. Есть поле фильтра - я предлагаю поискать «шрифт» и посмотреть, какие варианты вы получаете. DisgruntledGoat 15 лет назад 0
Исправил мой ответ, это * Система> Настройки> Внешний вид> Шрифты * в Ubuntu. Убедитесь, что каждый из перечисленных шрифтов (Приложение / Документ / и т. Д.) Соответствует. Я также рекомендовал бы выбрать «Subpixel smoothing» для лучшего вида. DisgruntledGoat 15 лет назад 0
+1 для восстановления кэша шрифтов и сглаживания субпикселей. Swoogan 13 лет назад 0
0
ukanth

Greasemonkey будет одним из решений вашего вопроса. Установите это дополнение, и вы сможете настраивать веб-страницы и изменять шрифты.

и один пример сценария, который меняет шрифт на Helvita

// ==UserScript== // @name Google Reader Font in Helvetica and enlarged // @version 1.0 // @creator Joe // @description Changes the font family and size from Google Reader page // @namespace userscripts.org // @include https://www.google.com/reader/* // @include http://www.google.com/reader/*  // ==/UserScript==  function addGlobalStyle(css) { var head, style; head = document.getElementsByTagName('head')[0]; if (!head) { return; } style = document.createElement('style'); style.type = 'text/css'; style.innerHTML = css; head.appendChild(style); }  addGlobalStyle('.entry-body'); addGlobalStyle('A.entry-title-link '); 
Хм, я думаю, вы поняли это неправильно: я хочу ** убрать любые определения Helvetica или Times ** (или заменить их на sans-serif и serif) Jonik 15 лет назад 0
Это пример, который он показывает вам, как изменить шрифт, так что вам просто нужно изменить скрипт в соответствии с вашими потребностями admintech 15 лет назад 0
Правильно ... ну, к счастью, я нашел более простой способ - не нужно никакого хакерства CSS: http://superuser.com/questions/54216/how-to-get-firefox-to-use-ms-truetype-fonts-for- Helvetica раза-и т.д. / 54224 # 54224 Jonik 15 лет назад 0
0
alpha1

Просто интересно, не могли бы вы использовать локальные шрифты и @font face css?

Хм, не уверен, что именно вы имеете в виду, но я уже нашел то, что мне было нужно: http://superuser.com/questions/54216/how-to-get-firefox-to-use-ms-truetype-fonts-for-helvetica -times-etc / 54224 # 54224 Это очень простое общесистемное решение. Jonik 14 лет назад 0
@font face CSS. Это была просто идея, которая пришла мне в голову, я мог бы поиграть с ней. Вы можете использовать @ font-face, чтобы FF использовал шрифты с вашего собственного сайта, и, возможно, даже локальный, изменив стандартную FF CSS (google @ font-face, чтобы узнать больше) alpha1 14 лет назад 0
0
BANED4NOREASON

Вам нужно добавить «Грант» к этому сценарию в любом случае ...

Greasemonkey 1.0 добавляет специальный императив блока метаданных: @grant.

If a script does not specify any @grant values, Greasemonkey 1.0-1.9 will attempt to auto-detect the right settings. From GreaseMonkey 2.0, @grant none is assumed by default, if no other values are specified.[1] If a script specifies any values (or they were auto detected), then it will be provided with only those API methods that it declares. The valid values are unsafeWindow, and the names of those GM_ prefixed values that you wish your script to be granted access to. Otherwise the script will be granted no special API privileges, and thus run without the security constraints Greasemonkey scripts have traditionally had. If you want your script to operate in this mode, you should explicitly declare @grant none. 

Примеры

Для сценариев (более половины, когда они учитывались в последний раз) характерно вообще не использовать никаких специальных API. Для таких сценариев явный запрос на отсутствие специальных привилегий означает, что сценарий будет выполняться непосредственно на странице содержимого. Это означает отсутствие изолированной программной среды безопасности и ее ограничений, поэтому доступ к переменным на странице просто работает, вызов функций и чтение их результатов также работает. Для этого просто:

// ==UserScript== // @name Grant None Example (can be omitted since GM 2.0) // @include http* // @grant none // ==/UserScript== console.log('This script grants no special privileges, so it runs without security limitations.'); 

Если вы используете один из API Greasemonkey, вам следует явно попросить предоставить его вашему сценарию:

// ==UserScript== // @name Grant Some Example // @include http* // @grant GM_getValue // @grant GM_setValue // ==/UserScript==  var counter = GM_getValue('counter', 0); console.log('This script has been run ' + counter + ' times.'); GM_setValue('counter', ++counter); 

В этом случае скрипт запрашивает доступ к обоим GM_getValueи по GM_setValueодному в каждой @grantстроке. Укажите имя любого API Greasemonkey, которому будет предоставлен доступ к нему. (Все сценарии всегда получают GM_infoбез специального запроса.) Временно, это также будет работать:

// ==UserScript== // @name Grant Legacy Example // @include http* // ==/UserScript==  var counter = GM_getValue('counter', 0); console.log('This script has been run ' + counter + ' times.'); GM_setValue('counter', ++counter); 

Этот пример будет работать в Greasemonkey версии 1.0. Когда строк @grant нет, Greasemonkey пытается определить, какие API используются, и действует так, как если бы эти строки @grant были указаны. Это обнаружение может не сработать в определенных случаях, особенно при eval()использовании.

Из-за этого все скрипты, написанные до @grant, должны продолжать работать, но вы должны изменить свои скрипты, указав @grant при первой возможности, чтобы они не сломались в будущем. Уровень совместимости

Многие из API Greasemonkey были продублированы веб-стандартами, такими как DOM Storage. Если вы ожидаете, что ваш скрипт будет работать только в одном домене, вы можете использовать @grant none и его повышенную совместимость без каких-либо недостатков. Просто используйте библиотеку @require для эмуляции API Greasemonkey с помощью стандартных функций браузера:

// ==UserScript== // @name Grant None Example, With Shim // @include http://www.example.com/* // @grant none // @require https://gist.githubusercontent.com/arantius/3123124/raw/grant-none-shim.js // ==/UserScript==  var counter = GM_getValue('counter', 0); console.log('This script has been run ' + counter + ' times.'); GM_setValue('counter', ++counter); 

Этот сценарий будет работать так же, как в примере выше, за исключением того, что грант без ограничений обеспечивает эмуляцию API со стандартными функциями браузера. Когда слой совместимости shim работает достаточно хорошо для вашего сценария, это лучшее из обоих миров. Объем

В случае отсутствия разрешения пользовательский сценарий по-прежнему имеет собственную глобальную область, отличную от глобальной области страницы содержимого. Это означает, что верхний уровень var x = 1;не будет виден для области содержимого и, следовательно, не будет разбивать страницу (т. Е. Если это зависит от переменной x, имеющей другое значение). Чтобы записать значения в область содержимого, выполните window.x = 1;.

Если у вас @requireверсия jQuery, она будет неявно присваиваться window.$и window.jQuery. Если страница, на которой вы работаете, зависит от другой версии jQuery, это может привести к поломке страницы. Чтобы обойти эту проблему, в любом месте на верхнем уровне вашего скрипта выполните:

this.$ = this.jQuery = jQuery.noConflict(true); 

Этот код сохранит ссылку jQuery (в эту глобальную область действия скрипта при запуске в режиме предоставления без), удалив ее из окна (глобальная область содержимого) и восстановив все, что там изначально хранилось.