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