Загрузить шрифт из каталога пакета с помощью fontspec

Загрузить шрифт из каталога пакета с помощью fontspec

Я работаю над пакетом LaTeX (на самом деле это класс документа), который я хочу сделать доступным для установки другими в их каталоге texmf. В этом пакете я настраиваю конфигурацию по умолчанию для команды \lstset с заданным шрифтом. Если я, например, хочу использовать Droid Sans Mono в качестве шрифта, следующая команда сработает, если шрифт установлен в системе:

\newfontfamily\listingsfont[Scale=0.85]{Droid Sans Mono}
\lstset {
    basicstyle=\footnotesize\listingsfont
}

Однако, если шрифт не установлен в системе, это, конечно, не сработает. Из-за этого я хотел бы распространять шрифт вместе с пакетом LaTeX. Я протестировал опцию Path fontspec

\newfontfamily\listingsfont[Path=/home/username/texmf/tex/latex/mypackage/,Scale=0.85]{Droid Sans Mono}

что работает отлично, за исключением того, что мне нужно заранее знать имя пользователя.

Есть ли способ указать пути относительно моего пакета в fontspec? Или получить путь к домашнему каталогу?

(Большинство пользователей этого пакета будут использовать Ubuntu в качестве основной ОС).

решение1

Здесь следует учесть ряд моментов.

  1. При загрузке шрифтов, хранящихся в texmf-tree, следует использовать имена файлов, а не имена шрифтов, поскольку имена шрифтов не работают на всех ОС из коробки. Поэтому используйте \newfontfamily\listingsfont[Scale=0.85]{droidsansmono.ttf}вместо \newfontfamily\listingsfont[Scale=0.85]{Droid Sans Mono}.
  2. шрифты должны находиться в fontsпапке дерева texmf — fonts\opentypeдля otf-fonts и fonts\truetypeдля ttf. Даже если вы найдете способ сохранить шрифт рядом с вашим пакетом: большая система, такая как дистрибутив TeX, может работать только в том случае, если все будут придерживаться некоторых стандартов.

  3. Редко имеет смысл распространять шрифт автоматически вместе с классом или пакетами. Есть исключения, когда у вас есть полный контроль над шрифтом, если он действительно особенный и может использоваться только с классом, или если он не бесплатный. Но в случае Droid Sans Mono уже есть пакет с этим шрифтом и CTAN, и добавление второй версии в дерево texmf может только создать проблемы. Например, xelatex не любит, если в пути поиска есть более одной версии шрифта.

Поэтому, если вы опасаетесь, что у некоторых ваших пользователей нет шрифта, Droid Sans Monoкоторый есть в CTAN: попросите их обновить свою TeX-систему или установить шрифт вручную из CTAN.

Если вам действительно необходимо распространять шрифт вместе с пакетом, попросите пользователей установить их в правильные папки (если вы распространяете свой пакет через CTAN, они позаботятся об этом).

решение2

Посмотрите на класс документа "novel". Возможно, он есть в вашем дистрибутиве TeXlive 2016, а если нет, то в CTAN. Класс включает собственный пользовательский шрифт, который устанавливается в соответствующее место (fonts/opentype/novel/) при установке пакета (который на самом деле является классом документа).

Работает, если установлен через tlmgr (установщик дистрибутива). Также работает, если загружен как TDS и установлен в каталоге TEXMF-LOCAL. Обратите внимание, что в некоторых случаях может потребоваться пересборка luatex-cache.

Обратите внимание, что пользовательский шрифт не загружается "из каталога пакета". Вместо этого установленный пакет помещает шрифт в соответствующий каталог, где шрифты должны быть. Делает это автоматически.

Когда я начал создавать этот класс документа, я представлял себе, что сделаю именно то, что вы просили в вопросе: поместить шрифт туда, где находится файл пакета *.sty. Но это не так-то просто сделать, и на самом деле это не нужно, так как установщик пакета также может установить шрифт.

EDIT: Недавно fontspecдобавлена ​​возможность определять, найден ли шрифт, и предпринимать различные действия в зависимости от того, есть ли шрифт. Таким образом, можно написать макрос, который запрашивает шрифт A, но использует B, если A не найден, или использует C, если ни A, ни B, и, наконец, останавливается с сообщением, если ни один из них не найден. См. последнюю fontspecдокументацию.

Связанный контент