Fonts
Foreword
The bulk of Fedora software relies on OpenType compliance and was tested against compliant fonts.
Unfortunately, most font makers feel the OpenType specification is a document written by “software people” for “software people”. They spurn its recommendations. They can not be relied upon to release fonts in a software-friendly state, nor to fix the resulting problems, nor to provide useful advice.
To enable the packaging of fonts by non experts, Checklist provides a list of sanity rules. Most are short unambiguous one liners, easy to understand and apply. Do read this list, even if it feels long. Unless your upstream is a model of discipline, you WILL need it. Avoid [Exceptions] if you do not feel ambitious – here be dragons.
Once you sorted what to package using the checklist, the rpm-specific part of fonts packaging is simple:
-
take our spec templates,
-
fill in the blanks with descriptions and the file lists resulting from the sorting.
Fedora automation will do the rest.
Tooling provides in-depth documentation of those templates, and other operational tips. The operational tips are useful. The spec templates documentation, not so much. The templates are commented and will usually be self-explanatory.
Lastly, Rationale provides some help, in case a third party attempts to confuse you. A lot of upstreams are dead set against applying OpenType recommendations. They will provide elaborate argumentation, on why the common rule does not apply to them.
Checklist
Legal
-
Font files MUST comply with our https://docs.fedoraproject.org/en-US/legal/license-approval/#_licenses_allowed_for_fonts.
-
Trademark uses MUST be authorized by their owners,
-
trademarks may occur in font naming or font content (logos…).
-
-
Registered names or trademarks MUST NOT prevent downstream modifications,
-
requiring a rename on significant modification is acceptable.
-
Packaging unit: an ideal font family
Because fonts upstreams are, on average, extremely messy, a large part of packaging fonts involves sorting files and fixing font file metadata to produce the consistent and reliable font catalog expected by applications and users.
Font family
A font family is composed of font files, that share a single design, and differ ONLY in:
Those parameters correspond to the default axes of OpenType variable fonts. |
-
Packagers MUST apply the definition provided in this section to determine font family boundaries,
-
it takes precedence over application support concerns, over upstream and packager habits and practices.
-
See also the Fontconfig section.
Font file formats
OpenType: one standard, five formats
OpenType uses an SFNT container around bitmaps ( |
-
Other font formats MUST be converted to OpenType,
-
except for fonts, intended to be used in the console (NOT a terminal emulator): see Bitmap console fonts.
-
-
Font packages MUST NOT contain font files in non OpenType formats.
Font packages
A font package, is an installation (RPM) package, containing OpenType font files. It MAY be produced by a source (SRPM) package, that also produces other (font or non-font) packages. Other kinds of font packages are out of scope for this document. |
-
A font family MUST NOT be packaged in multiple or mixed OpenType formats,
-
except for variable font data,
-
except when mixing is required, to achieve full symbol (glyph) coverage,
-
except as an application workaround; see Packaging a font family in multiple OpenType formats; application support.
-
-
Both variable and non-variable OpenType font files, SHOULD be packaged, for a given font family.
-
OpenType format mixing SHOULD be justified in a comment within the
spec
file. -
OpenType collection formats SHOULD be avoided.
Fontconfig
-
Font packages SHOULD include the fontconfig files, that define the selection and substitution rules applying to their font files,
-
written by the packager if upstream does not provide them.
-
-
Fontconfig rules MUST rewrite
family
andstyle
when they are not compliant with OpenType WWS rules:-
family
MUST NOT contain Weight, Width or Slope attributes (ideal WWS family name, Name ID 21), -
style
MUST contain only Weight, Width or Slope attributes (ideal WWS subfamily name, Name ID 22), -
Name ID 21 & 22 fields may exist or not in the packaged font files, and may be correct or not. The packager MUST set the correct value at the fontconfig level if the value fontconfig extracts from font files is incorrect.
-
-
Fontconfig rules MUST rewrite
family
to remove format attributes when they exist,-
for example:
OT
,TT
,Variable
,Graphite
,G
, etc, -
except when Packaging a font family in multiple OpenType formats; application support; in that case the removal MUST only be done for the font package providing the default format.
-
-
Fontconfig rules MUST rewrite
family
to remove coverage attributes when they exist,-
for example:
Math
,Emoji
,Color Emoji
,Hebrew
,Arabic
,Thai
,LGC
, etc, -
except when several font files provide the same coverage, requiring a qualifier to distinguish between them; in that case the removal MUST be done for the default file, and other files MUST be treated as parts of separate font families.
-
-
Fontconfig rules MUST rewrite
fullname
to<family> <style>
if it has a different value,-
either natively or as a result of previous rewrites,
-
except for the default style, usually
Regular
, for whichfullname
=<family>
.
-
-
Fontconfig rules MUST rewrite
fontversion
when several font files provide the samefullname
and have overlapping coverage,-
either natively or as a result of previous rewrites,
-
fontconfig will merge the result, higher
fontversion
taking precedence over lower, -
therefore,
fontversion
MUST be set by the packager, to define the correct ordering.
-
-
Fontconfig rules SHOULD define the generic family, a font contributes to,
-
a single generic family: the packager MUST choose,
-
using the correct priority: lower takes precedence over higher.
-
-
Fontconfig rules SHOULD list what other font families, the provided font family can substitute for.
-
typically, anterior namings, known forks, alternatives with the same font metrics…
-
also, the reused fonts families when Assembling different-family font packages: partial designs.
-
-
Fontconfig rules SHOULD define the font families, that can be used to complete the font family,
-
in all cases: at least the generic family and the substitutes defined before,
-
generic family last in completion order.
-
-
Packagers SHOULD attempt upstreaming those fixes,
-
make the font naming correct in the upstream font files,
-
contribute the other fontconfig rules upstream, so they are distributed with the font files.
-
-
Packagers SHOULD consult the fontconfig maintainer and mailing list when in doubt,
-
to get guidance and identify real-world tricky cases that call for fontconfig evolutions.
-
See also the Tooling section for fontconfig syntax guidance.
Source (SRPM) package break-up
-
Separate source archives MUST be packaged in separate
spec
files,-
except when those contain parts of the same font family and upstream coordinates their release.
-
-
spec
files SHOULD track a single font family,-
except when distinct font families are only released upstream in a common archive.
-
-
Packagers SHOULD ask upstream to split unrelated font families in separate versioned source archives,
-
and package font families from their actual respective upstreams when they are bundled with other material in a third party project.
-
Installation (RPM) package break-up: font packages
-
Packagers MUST ship each font family in a single dedicated font package,
-
all the files that, after fontconfig fixing,
-
share the same
family
value:family
=<common family>
-
or differ only in optical sizing:
family
=<common family> <optical sizing attribute>
,
-
-
except when released as un-coordinated sources, that are easier to track in separate
spec
files, -
except for huge families, that consume a lot of storage space; huge font families MAY be broken up in coverage-specific font packages,
-
-
Font packages MUST limit themsemselves to OpenType font files and their associated fontconfig, appstream, legal and documentation files,
-
for reasonable non-bulky interpretations of documentation files.
-
See also the Tooling section.
Other upstream files
Support for other font systems, for specific applications, non-OpenType font formats, bulky documentation, TEX, CSS, or JSON files… MUST be split in separate non-font packages, that SHOULD install outside For compatibility reasons, OpenType font files MAY be exposed outside |
Building
-
Packagers SHOULD build font files from sources,
-
whenever their prefered modification format is not the packaged OpenType format
-
and if the required toolchain is available as free software under Linux
-
Dependencies in font packages
-
Font packages MAY require or supplement other font packages, when they contain the same font family,
-
as defined in Assembling same-family font packages.
-
-
Font packages SHOULD recommend other font packages, when they contain a reused font family,
-
as defined in Assembling different-family font packages: partial designs.
-
-
Font packages SHOULD suggest other font packages, when they contain a better version of the same font family,
-
better: more complete coverage, later enhanced fork, canonical version of the design…
-
-
Font packages MAY suggest or enhance font packages, containing other font families,
-
this should be used sparsely, to avoid imposing packager preferences on users.
-
-
Font packages SHOULD depend on the basic font support package set, defined in the font packaging templates and macros.
-
Except for the preceding, font packages MUST NOT depend, in any form, on any other package.
Dependencies to font packages in other packages
-
Non-font packages MAY suggest or recommend font packages,
-
the weakest
Suggests
form is preferred overRecommends
, except in presence of strong pre-existing user habits.
-
-
Non-font packages SHOULD use the
font()
namespace to depend on font packages. -
Non-font packages SHOULD NOT require specific font packages, and leave font selection to end-users,
-
except when the packaged software actually relies on those specific font packages,
-
except for convenience font metapackages, as defined in Assembling different-family font packages: font metapackages.
-
-
Non-font packages SHOULD require
font(:lang=en)
when they fail in the absence of system fonts,-
hardcoding specific font families is not future-proof.
-
-
Non-font packages MAY require font packages by name, when relying on specific on-disk font file paths,
-
ie when software is not
fontconfig
-aware, -
however, there is no obligation for font packagers to keep those paths stable between releases. Font file formats are flexible, making any on-disk file layout temporary. Converting applications to fontconfig use is best.
-
Assembling different-family font packages: partial designs
Font reuse and font extension
Because font creation is hard work, font designers will often publish partial new designs:
|
When packaging such a partial design:
-
The font package containing the new font family SHOULD recommend the package containing the original font family,
-
only the core package of the original font family in case of Assembling same-family font packages.
-
-
Re-use recommendations SHOULD use the
font()
namespace.
Assembling different-family font packages: font metapackages
-
Packagers MAY provide convenience font metapackages,
-
for example, when an upstream releases a collection of font families, intended to be used together,
-
a common case is matched serif, sans-serif and monospaced font families.
-
-
Font metapackages MUST NOT use the same naming conventions as actual font packages,
-
they MUST NOT be named
<something>-fonts
, -
they MAY be named
<something>-fonts-all
.
-
-
Font metapackages MUST require, recommend or suggest separate font packages, that conform to this document,
-
Font metapackages SHOULD use the
font()
namespace to require, recommend or suggest actual font packages, -
Font metapackages SHOULD NOT contain any other file, except for documentation.
Exceções
Bitmap console fonts
-
Bitmap console fonts MAY be packaged in a legacy font format, understood by kbd.
-
Bitmap console fonts MUST be installed in
/lib/kbd/consolefonts/
not/usr/share/fonts
. -
Bitmap console font packages SHOULD be named
<something>-fonts-console
not<something>-fonts
.
Console fonts
As long as kbd and systemd-vconsole can not use the same file formats as the rest of the system, bitmap console fonts are effectively private kbd resources. They will be ignored in the rest of this document. It does not apply to them. |
Assembling same-family font packages
-
A font family MUST NOT be split over several font packages, unless one of the exceptions listed above applies.
When a font family is split over a set of several font packages:
-
Involved packagers MUST choose a core font package.
-
This core package SHOULD contain the font files, necessary to provide a minimal scope of the font family.
-
This core package MAY contain fontconfig rules, for all the font files composinng the font family,
-
fontconfig ignores rules that do not match installed files.
-
-
This core package MUST be named as if it contained the whole font family.
-
This core package MUST NOT require any other package in the set.
-
The other packages of the set MUST require, directly or indirectly, this core package.
-
The other packages of the set MUST supplement, directly or indirectly, this core package.
-
The other packages of the set MUST NOT use the
font()
namespace to require or supplement other parts of the set,-
Splitting a font family interacts badly with
font()
auto-provides.
-
-
All the packages involved in an indirect require or supplement chain MUST be part of the set.
Packaging a font family in multiple OpenType formats; application support
-
Packagers MUST make a reasonable effort, to get applications that do not support all OpenType formats, fixed upstream.
-
If that fails, as a last ressort, packagers MAY request a FESCo exemption, to package a limited number of font families in multiple OpenType formats.
-
Packagers MUST ensure that the resulting additional font data, is separated in distinct font packages,
-
that the average Fedora user can install those font families in a single format,
-
that he is not left wondering, which package to install.
-
Tooling
Creating font packages by hand can be extremely repetitive, error-prone and labor-intensive. Therefore, fonts packaging is heavily automated. It relies on numerous macros and variables to define what goes where.
Those macros and variables are defined in the fonts-rpm-macros
package. The fonts-rpm-templates
package contains spec
and fontconfig
templates, corresponding to common fonts packaging needs.
Fontconfig
The fonts-rpm-templates
package contains fontconfig
templates, corresponding to common fonts packaging needs.
Using fontconfig, you can help users and software make sense of broken font files.
On brokenness and interoperability
Fixing may imply behaviour differences, with entities that chose another mitigation strategy. The root cause of those differences is the upstream release of files in a broken state. Producing daring glyph shapes is the designer prerogative. That artistic license does not extend to flouting technical conventions, software relies on. Upstream should always be given the chance to fix its files. If it does not care about our needs, fixing downstream is second best. Inflicting intact breakage on our users is always worst. |
Some applications
-
The Foo project releases
Foo Narrow Oblique
. Because the font maker remembers early font formats only allowed 4-style family grouping (Name ID 1 and 2), it declares it asfamily: Foo Narrow
andstyle: Oblique
. The fontconfig rules forFoo Narrow Oblique
MUST rewrite it to the recommended WWS-compliantfamily: Foo
andstyle: Narrow Oblique
(Name ID 16/17 or 21/22). -
The Foo project releases the
Universal Foo
wide-coverage font family. To allow installing only part of this family, it splits it inUniversal Foo
,Universal Foo Hebrew
andUniversal Foo Thai
. The fontconfig rules forUniversal Foo
MUST rewrite thefamily
(and thereforefullname
) for allUniversal Foo Hebrew
andUniversal Foo Thai
font files, so they declareUniversal Foo
instead. Fontconfig will present the result as a single wide-encoding family to applications, even if the files remain split on-disk, even if all of them are not installed. -
The Foo project releases
Foo Sans
. The fontconfig rules forFoo Sans
SHOULD declare any missing glyph can be taken from thesans-serif
generic font family. -
The GNOME project releases the
Bitstream Vera
set of font families; later theDejaVu
project forks and extends those fonts. The fontconfig rules forDejaVu Sans
SHOULD declare it can be substituted forBitstream Vera Sans
. -
Microsoft ships Windows with the
Arial
font family. Due to its long and wide availability,Arial
is now used in many documents. However it can not be included in Free Desktop systems for licensing reasons. Red Hat commissions anArial
substitute,Liberation Sans
, for use on Linux. Google commissions anotherArial
substiture,Arimo
, for use on ChromeOS. The fontconfig rules forLiberation Sans
SHOULD declare it can be substituted for bothArial
andArimo
.
Style naming
The OpenType specification, the CSS specification and the fontconfig manual document the canonical mappings of style keywords.
Those mappings are not absolute. The addition of variable capabilities enabled the creation of new keywords and axes values, including in non variable font files.
Nevertheless, the OpenType specification requires correlating the new capabilities with the traditional keyword scale:
-
an axis step, with a value, close to one of the specification keywords, SHOULD be named with this keyword,
-
a slight deviation from the canonical keyword value, for design reasons, is expected and accepted.
-
-
an axis step, SHOULD NOT be named with a keyword, when its value differs greatly from the keyword canonical value,
-
font files that define new intermediary steps should also define new keywords.
-
Additionnally:
-
axis keywords SHOULD NOT use whitespace, due to software processing constraints,
-
SemiCondensed
is a good keyword;Semi Condensed
— not.
-
-
keywords SHOULD be assembled in
width weight slant
order in style names, for historical reasons,-
with the default
Regular
ommited except when alone.
-
Checking results
To verify the metadata of font files installed by a package named ${pkg}
:
fc-scan -f \
"%{family[0]};%{style[0]};%{fullname[0]};%{width};%{weight};%{slant};%{fontversion};%{file}\n" \
/usr/share/fonts/${pkg} | sort -t ';' -k1,1d -k4,4n -k5,5n -k6,6n -k2,2d -k7,7dr \
| uniq | column --separator ';' -t
Accanthis ADF Std Regular AccanthisADFStd-Regular 100 80 0 131400 /usr/share/fonts/adf-accanthis-fonts/AccanthisADFStd-Regular.otf Accanthis ADF Std Italic AccanthisADFStd-Italic 100 80 100 131400 /usr/share/fonts/adf-accanthis-fonts/AccanthisADFStd-Italic.otf Accanthis ADF Std Bold AccanthisADFStd-Bold 100 200 0 131400 /usr/share/fonts/adf-accanthis-fonts/AccanthisADFStd-Bold.otf Accanthis ADF Std Bold Italic AccanthisADFStd-BoldItalic 100 200 100 131400 /usr/share/fonts/adf-accanthis-fonts/AccanthisADFStd-BoldItalic.otf Dai Banna SIL Book Regular Dai Banna SIL Book 100 80 0 144179 /usr/share/fonts/sil-dai-banna-fonts/DBSILBR.ttf Dai Banna SIL Book Italic Dai Banna SIL Book Italic 100 80 100 144179 /usr/share/fonts/sil-dai-banna-fonts/DBSILBO.ttf Dai Banna SIL Book Bold Dai Banna SIL Book Bold 100 200 0 144179 /usr/share/fonts/sil-dai-banna-fonts/DBSILBB.ttf Dai Banna SIL Book Bold Italic Dai Banna SIL Book Bold Italic 100 200 100 144179 /usr/share/fonts/sil-dai-banna-fonts/DBSILBC.ttf Dai Banna SIL Light Regular Dai Banna SIL Light 100 80 0 144179 /usr/share/fonts/sil-dai-banna-fonts/DBSILLR.ttf Dai Banna SIL Light Italic Dai Banna SIL Light Italic 100 80 100 144179 /usr/share/fonts/sil-dai-banna-fonts/DBSILLO.ttf Dai Banna SIL Light Bold Dai Banna SIL Light Bold 100 200 0 144179 /usr/share/fonts/sil-dai-banna-fonts/DBSILLB.ttf Dai Banna SIL Light Bold Italic Dai Banna SIL Light Bold Italic 100 200 100 144179 /usr/share/fonts/sil-dai-banna-fonts/DBSILLC.ttf IBM Plex Sans Thin IBM Plex Sans Thin 100 0 0 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Thin.otf IBM Plex Sans Thin Italic IBM Plex Sans Thin Italic 100 0 100 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-ThinItalic.otf IBM Plex Sans ExtraLight IBM Plex Sans ExtraLight 100 40 0 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-ExtraLight.otf IBM Plex Sans ExtraLight Italic IBM Plex Sans ExtraLight Italic 100 40 100 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-ExtraLightItalic.otf IBM Plex Sans Light IBM Plex Sans Light 100 50 0 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Light.otf IBM Plex Sans Light Italic IBM Plex Sans Light Italic 100 50 100 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-LightItalic.otf IBM Plex Sans Regular IBM Plex Sans 100 80 0 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Regular.otf IBM Plex Sans Italic IBM Plex Sans Italic 100 80 100 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Italic.otf IBM Plex Sans Text IBM Plex Sans Text 100 90 0 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Text.otf IBM Plex Sans Text Italic IBM Plex Sans Text Italic 100 90 100 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-TextItalic.otf IBM Plex Sans Medium IBM Plex Sans Medium 100 100 0 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Medium.otf IBM Plex Sans Medium Italic IBM Plex Sans Medium Italic 100 100 100 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-MediumItalic.otf IBM Plex Sans SemiBold IBM Plex Sans SemiBold 100 180 0 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-SemiBold.otf IBM Plex Sans SemiBold Italic IBM Plex Sans SemiBold Italic 100 180 100 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-SemiBoldItalic.otf IBM Plex Sans Bold IBM Plex Sans Bold 100 200 0 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Bold.otf IBM Plex Sans Bold Italic IBM Plex Sans Bold Italic 100 200 100 196673 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-BoldItalic.otf IBM Plex Sans Arabic Thin IBM Plex Sans Arabic Thin 100 0 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Thin.otf IBM Plex Sans Arabic ExtraLight IBM Plex Sans Arabic ExtraLight 100 40 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-ExtraLight.otf IBM Plex Sans Arabic Light IBM Plex Sans Arabic Light 100 50 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Light.otf IBM Plex Sans Arabic Regular IBM Plex Sans Arabic 100 80 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Regular.otf IBM Plex Sans Arabic Text IBM Plex Sans Arabic Text 100 90 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Text.otf IBM Plex Sans Arabic Medium IBM Plex Sans Arabic Medium 100 100 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Medium.otf IBM Plex Sans Arabic SemiBold IBM Plex Sans Arabic SemiBold 100 180 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-SemiBold.otf IBM Plex Sans Arabic Bold IBM Plex Sans Arabic Bold 100 200 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Bold.otf IBM Plex Sans Condensed Thin IBM Plex Sans Condensed Thin 75 0 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Thin.otf IBM Plex Sans Condensed Thin Italic IBM Plex Sans Condensed Thin Italic 75 0 100 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-ThinItalic.otf IBM Plex Sans Condensed ExtraLight IBM Plex Sans Condensed ExtraLight 75 40 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-ExtraLight.otf IBM Plex Sans Condensed ExtraLight Italic IBM Plex Sans Condensed ExtraLight Italic 75 40 100 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-ExtraLightItalic.otf IBM Plex Sans Condensed Light IBM Plex Sans Condensed Light 75 50 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Light.otf IBM Plex Sans Condensed Light Italic IBM Plex Sans Condensed Light Italic 75 50 100 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-LightItalic.otf IBM Plex Sans Condensed Regular IBM Plex Sans Condensed 75 80 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Regular.otf IBM Plex Sans Condensed Italic IBM Plex Sans Condensed Italic 75 80 100 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Italic.otf IBM Plex Sans Condensed Text IBM Plex Sans Condensed Text 75 90 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Text.otf IBM Plex Sans Condensed Text Italic IBM Plex Sans Condensed Text Italic 75 90 100 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-TextItalic.otf IBM Plex Sans Condensed Medium IBM Plex Sans Condensed Medium 75 100 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Medium.otf IBM Plex Sans Condensed Medium Italic IBM Plex Sans Condensed Medium Italic 75 100 100 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-MediumItalic.otf IBM Plex Sans Condensed SemiBold IBM Plex Sans Condensed SemiBold 75 180 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-SemiBold.otf IBM Plex Sans Condensed SemiBold Italic IBM Plex Sans Condensed SemiBold Italic 75 180 100 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-SemiBoldItalic.otf IBM Plex Sans Condensed Bold IBM Plex Sans Condensed Bold 75 200 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Bold.otf IBM Plex Sans Condensed Bold Italic IBM Plex Sans Condensed Bold Italic 75 200 100 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-BoldItalic.otf IBM Plex Sans Devanagari Thin IBM Plex Sans Devanagari Thin 100 0 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Thin.otf IBM Plex Sans Devanagari ExtraLight IBM Plex Sans Devanagari ExtraLight 100 40 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-ExtraLight.otf IBM Plex Sans Devanagari Light IBM Plex Sans Devanagari Light 100 50 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Light.otf IBM Plex Sans Devanagari Regular IBM Plex Sans Devanagari 100 80 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Regular.otf IBM Plex Sans Devanagari Text IBM Plex Sans Devanagari Text 100 90 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Text.otf IBM Plex Sans Devanagari Medium IBM Plex Sans Devanagari Medium 100 100 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Medium.otf IBM Plex Sans Devanagari SemiBold IBM Plex Sans Devanagari SemiBold 100 180 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-SemiBold.otf IBM Plex Sans Devanagari Bold IBM Plex Sans Devanagari Bold 100 200 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Bold.otf IBM Plex Sans Hebrew Thin IBM Plex Sans Hebrew Thin 100 0 0 65667 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Thin.otf IBM Plex Sans Hebrew ExtraLight IBM Plex Sans Hebrew ExtraLight 100 40 0 65667 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-ExtraLight.otf IBM Plex Sans Hebrew Light IBM Plex Sans Hebrew Light 100 50 0 65667 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Light.otf IBM Plex Sans Hebrew Regular IBM Plex Sans Hebrew 100 80 0 65667 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Regular.otf IBM Plex Sans Hebrew Text IBM Plex Sans Hebrew Text 100 90 0 65667 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Text.otf IBM Plex Sans Hebrew Medium IBM Plex Sans Hebrew Medium 100 100 0 65667 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Medium.otf IBM Plex Sans Hebrew SemiBold IBM Plex Sans Hebrew SemiBold 100 180 0 65667 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-SemiBold.otf IBM Plex Sans Hebrew Bold IBM Plex Sans Hebrew Bold 100 200 0 65667 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Bold.otf IBM Plex Sans Thai Thin IBM Plex Sans Thai Thin 100 0 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Thin.otf IBM Plex Sans Thai ExtraLight IBM Plex Sans Thai ExtraLight 100 40 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-ExtraLight.otf IBM Plex Sans Thai Light IBM Plex Sans Thai Light 100 50 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Light.otf IBM Plex Sans Thai Regular IBM Plex Sans Thai 100 80 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Regular.otf IBM Plex Sans Thai Text IBM Plex Sans Thai Text 100 90 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Text.otf IBM Plex Sans Thai Medium IBM Plex Sans Thai Medium 100 100 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Medium.otf IBM Plex Sans Thai SemiBold IBM Plex Sans Thai SemiBold 100 180 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-SemiBold.otf IBM Plex Sans Thai Bold IBM Plex Sans Thai Bold 100 200 0 65601 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Bold.otf IBM Plex Sans Var IBM Plex Sans Var Regular [85 100] [0 200] 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var IBM Plex Sans Var Italic [85 100] [0 200] 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Thin Condensed IBM Plex Sans Var Thin Condensed 85 0 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Thin Condensed Italic IBM Plex Sans Var Thin Condensed Italic 85 0 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var ExtraLight Condensed IBM Plex Sans Var ExtraLight Condensed 85 40 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var ExtraLight Condensed Italic IBM Plex Sans Var ExtraLight Condensed Italic 85 40 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Light Condensed IBM Plex Sans Var Light Condensed 85 50 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Light Condensed Italic IBM Plex Sans Var Light Condensed Italic 85 50 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Condensed IBM Plex Sans Var Condensed 85 80 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Condensed Italic IBM Plex Sans Var Condensed Italic 85 80 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Text Condensed IBM Plex Sans Var Text Condensed 85 90 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Text Condensed Italic IBM Plex Sans Var Text Condensed Italic 85 90 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Medium Condensed IBM Plex Sans Var Medium Condensed 85 100 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Medium Condensed Italic IBM Plex Sans Var Medium Condensed Italic 85 100 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var SemiBold Condensed IBM Plex Sans Var SemiBold Condensed 85 180 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var SemiBold Condensed Italic IBM Plex Sans Var SemiBold Condensed Italic 85 180 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Bold Condensed IBM Plex Sans Var Bold Condensed 85 200 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Bold Condensed Italic IBM Plex Sans Var Bold Condensed Italic 85 200 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Thin IBM Plex Sans Var Thin 100 0 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Thin Italic IBM Plex Sans Var Thin Italic 100 0 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var ExtraLight IBM Plex Sans Var ExtraLight 100 40 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var ExtraLight Italic IBM Plex Sans Var ExtraLight Italic 100 40 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Light IBM Plex Sans Var Light 100 50 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Light Italic IBM Plex Sans Var Light Italic 100 50 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Regular IBM Plex Sans Var Regular 100 80 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Italic IBM Plex Sans Var Italic 100 80 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Text IBM Plex Sans Var Text 100 90 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Text Italic IBM Plex Sans Var Text Italic 100 90 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Medium IBM Plex Sans Var Medium 100 100 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Medium Italic IBM Plex Sans Var Medium Italic 100 100 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var SemiBold IBM Plex Sans Var SemiBold 100 180 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var SemiBold Italic IBM Plex Sans Var SemiBold Italic 100 180 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf IBM Plex Sans Var Bold IBM Plex Sans Var Bold 100 200 0 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf IBM Plex Sans Var Bold Italic IBM Plex Sans Var Bold Italic 100 200 100 65536 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf …
Accanthis ADF Std Regular Accanthis ADF Std 100 80 0 131400 /usr/share/fonts/adf-accanthis-fonts/AccanthisADFStd-Regular.otf
Accanthis ADF Std Italic Accanthis ADF Std Italic 100 80 100 131400 /usr/share/fonts/adf-accanthis-fonts/AccanthisADFStd-Italic.otf
Accanthis ADF Std Bold Accanthis ADF Std Bold 100 200 0 131400 /usr/share/fonts/adf-accanthis-fonts/AccanthisADFStd-Bold.otf
Accanthis ADF Std Bold Italic Accanthis ADF Std Bold Italic 100 200 100 131400 /usr/share/fonts/adf-accanthis-fonts/AccanthisADFStd-BoldItalic.otf
Dai Banna SIL Light Dai Banna SIL Light 100 50 0 1 /usr/share/fonts/sil-dai-banna-fonts/DBSILLR.ttf
Dai Banna SIL Light Italic Dai Banna SIL Light Italic 100 80 100 1 /usr/share/fonts/sil-dai-banna-fonts/DBSILLO.ttf
Dai Banna SIL Medium Italic Dai Banna SIL Medium Italic 100 80 100 2 /usr/share/fonts/sil-dai-banna-fonts/DBSILBO.ttf
Dai Banna SIL Medium Dai Banna SIL Medium 100 100 0 2 /usr/share/fonts/sil-dai-banna-fonts/DBSILBR.ttf
Dai Banna SIL Medium Dai Banna SIL Medium 100 100 0 1 /usr/share/fonts/sil-dai-banna-fonts/DBSILLB.ttf
Dai Banna SIL Black Italic Dai Banna SIL Black Italic 100 200 100 2 /usr/share/fonts/sil-dai-banna-fonts/DBSILBC.ttf
Dai Banna SIL Medium Italic Dai Banna SIL Medium Italic 100 200 100 1 /usr/share/fonts/sil-dai-banna-fonts/DBSILLC.ttf
Dai Banna SIL Black Dai Banna SIL Black 100 210 0 2 /usr/share/fonts/sil-dai-banna-fonts/DBSILBB.ttf
IBM Plex Sans IBM Plex Sans [85 100] [0 200] 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans IBM Plex Sans [85 100] [0 200] 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans SemiCondensed Thin IBM Plex Sans SemiCondensed Thin 85 0 0 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Thin.otf
IBM Plex Sans SemiCondensed Thin IBM Plex Sans SemiCondensed Thin 85 0 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans SemiCondensed Thin Italic IBM Plex Sans SemiCondensed Thin Italic 85 0 100 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-ThinItalic.otf
IBM Plex Sans SemiCondensed Thin Italic IBM Plex Sans SemiCondensed Thin Italic 85 0 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans SemiCondensed ExtraLight IBM Plex Sans SemiCondensed ExtraLight 85 40 0 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-ExtraLight.otf
IBM Plex Sans SemiCondensed ExtraLight IBM Plex Sans SemiCondensed ExtraLight 85 40 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans SemiCondensed ExtraLight Italic IBM Plex Sans SemiCondensed ExtraLight Italic 85 40 100 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-ExtraLightItalic.otf
IBM Plex Sans SemiCondensed ExtraLight Italic IBM Plex Sans SemiCondensed ExtraLight Italic 85 40 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans SemiCondensed Light IBM Plex Sans SemiCondensed Light 85 50 0 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Light.otf
IBM Plex Sans SemiCondensed Light IBM Plex Sans SemiCondensed Light 85 50 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans SemiCondensed Light Italic IBM Plex Sans SemiCondensed Light Italic 85 50 100 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-LightItalic.otf
IBM Plex Sans SemiCondensed Light Italic IBM Plex Sans SemiCondensed Light Italic 85 50 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans SemiCondensed IBM Plex Sans SemiCondensed 85 80 0 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Regular.otf
IBM Plex Sans SemiCondensed IBM Plex Sans SemiCondensed 85 80 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans SemiCondensed Italic IBM Plex Sans SemiCondensed Italic 85 80 100 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Italic.otf
IBM Plex Sans SemiCondensed Italic IBM Plex Sans SemiCondensed Italic 85 80 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans SemiCondensed Text IBM Plex Sans SemiCondensed Text 85 90 0 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Text.otf
IBM Plex Sans SemiCondensed Text IBM Plex Sans SemiCondensed Text 85 90 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans SemiCondensed Text Italic IBM Plex Sans SemiCondensed Text Italic 85 90 100 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-TextItalic.otf
IBM Plex Sans SemiCondensed Text Italic IBM Plex Sans SemiCondensed Text Italic 85 90 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans SemiCondensed Medium IBM Plex Sans SemiCondensed Medium 85 100 0 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Medium.otf
IBM Plex Sans SemiCondensed Medium IBM Plex Sans SemiCondensed Medium 85 100 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans SemiCondensed Medium Italic IBM Plex Sans SemiCondensed Medium Italic 85 100 100 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-MediumItalic.otf
IBM Plex Sans SemiCondensed Medium Italic IBM Plex Sans SemiCondensed Medium Italic 85 100 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans SemiCondensed SemiBold IBM Plex Sans SemiCondensed SemiBold 85 180 0 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-SemiBold.otf
IBM Plex Sans SemiCondensed SemiBold IBM Plex Sans SemiCondensed SemiBold 85 180 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans SemiCondensed SemiBold Italic IBM Plex Sans SemiCondensed SemiBold Italic 85 180 100 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-SemiBoldItalic.otf
IBM Plex Sans SemiCondensed SemiBold Italic IBM Plex Sans SemiCondensed SemiBold Italic 85 180 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans SemiCondensed Bold IBM Plex Sans SemiCondensed Bold 85 200 0 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-Bold.otf
IBM Plex Sans SemiCondensed Bold IBM Plex Sans SemiCondensed Bold 85 200 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans SemiCondensed Bold Italic IBM Plex Sans SemiCondensed Bold Italic 85 200 100 6 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansCondensed-BoldItalic.otf
IBM Plex Sans SemiCondensed Bold Italic IBM Plex Sans SemiCondensed Bold Italic 85 200 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans Thin IBM Plex Sans Thin 100 0 0 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Thin.otf
IBM Plex Sans Thin IBM Plex Sans Thin 100 0 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans Thin IBM Plex Sans Thin 100 0 0 4 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Thin.otf
IBM Plex Sans Thin IBM Plex Sans Thin 100 0 0 3 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Thin.otf
IBM Plex Sans Thin IBM Plex Sans Thin 100 0 0 2 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Thin.otf
IBM Plex Sans Thin IBM Plex Sans Thin 100 0 0 1 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Thin.otf
IBM Plex Sans Thin Italic IBM Plex Sans Thin Italic 100 0 100 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-ThinItalic.otf
IBM Plex Sans Thin Italic IBM Plex Sans Thin Italic 100 0 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans ExtraLight IBM Plex Sans ExtraLight 100 40 0 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-ExtraLight.otf
IBM Plex Sans ExtraLight IBM Plex Sans ExtraLight 100 40 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans ExtraLight IBM Plex Sans ExtraLight 100 40 0 4 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-ExtraLight.otf
IBM Plex Sans ExtraLight IBM Plex Sans ExtraLight 100 40 0 3 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-ExtraLight.otf
IBM Plex Sans ExtraLight IBM Plex Sans ExtraLight 100 40 0 2 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-ExtraLight.otf
IBM Plex Sans ExtraLight IBM Plex Sans ExtraLight 100 40 0 1 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-ExtraLight.otf
IBM Plex Sans ExtraLight Italic IBM Plex Sans ExtraLight Italic 100 40 100 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-ExtraLightItalic.otf
IBM Plex Sans ExtraLight Italic IBM Plex Sans ExtraLight Italic 100 40 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans Light IBM Plex Sans Light 100 50 0 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Light.otf
IBM Plex Sans Light IBM Plex Sans Light 100 50 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans Light IBM Plex Sans Light 100 50 0 4 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Light.otf
IBM Plex Sans Light IBM Plex Sans Light 100 50 0 3 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Light.otf
IBM Plex Sans Light IBM Plex Sans Light 100 50 0 2 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Light.otf
IBM Plex Sans Light IBM Plex Sans Light 100 50 0 1 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Light.otf
IBM Plex Sans Light Italic IBM Plex Sans Light Italic 100 50 100 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-LightItalic.otf
IBM Plex Sans Light Italic IBM Plex Sans Light Italic 100 50 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans Regular IBM Plex Sans 100 80 0 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Regular.otf
IBM Plex Sans Regular IBM Plex Sans 100 80 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans Regular IBM Plex Sans 100 80 0 4 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Regular.otf
IBM Plex Sans Regular IBM Plex Sans 100 80 0 3 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Regular.otf
IBM Plex Sans Regular IBM Plex Sans 100 80 0 2 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Regular.otf
IBM Plex Sans Regular IBM Plex Sans 100 80 0 1 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Regular.otf
IBM Plex Sans Italic IBM Plex Sans Italic 100 80 100 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Italic.otf
IBM Plex Sans Italic IBM Plex Sans Italic 100 80 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans Text IBM Plex Sans Text 100 90 0 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Text.otf
IBM Plex Sans Text IBM Plex Sans Text 100 90 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans Text IBM Plex Sans Text 100 90 0 4 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Text.otf
IBM Plex Sans Text IBM Plex Sans Text 100 90 0 3 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Text.otf
IBM Plex Sans Text IBM Plex Sans Text 100 90 0 2 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Text.otf
IBM Plex Sans Text IBM Plex Sans Text 100 90 0 1 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Text.otf
IBM Plex Sans Text Italic IBM Plex Sans Text Italic 100 90 100 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-TextItalic.otf
IBM Plex Sans Text Italic IBM Plex Sans Text Italic 100 90 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans Medium IBM Plex Sans Medium 100 100 0 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Medium.otf
IBM Plex Sans Medium IBM Plex Sans Medium 100 100 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans Medium IBM Plex Sans Medium 100 100 0 4 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Medium.otf
IBM Plex Sans Medium IBM Plex Sans Medium 100 100 0 3 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Medium.otf
IBM Plex Sans Medium IBM Plex Sans Medium 100 100 0 2 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Medium.otf
IBM Plex Sans Medium IBM Plex Sans Medium 100 100 0 1 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Medium.otf
IBM Plex Sans Medium Italic IBM Plex Sans Medium Italic 100 100 100 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-MediumItalic.otf
IBM Plex Sans Medium Italic IBM Plex Sans Medium Italic 100 100 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans SemiBold IBM Plex Sans SemiBold 100 180 0 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-SemiBold.otf
IBM Plex Sans SemiBold IBM Plex Sans SemiBold 100 180 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans SemiBold IBM Plex Sans SemiBold 100 180 0 4 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-SemiBold.otf
IBM Plex Sans SemiBold IBM Plex Sans SemiBold 100 180 0 3 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-SemiBold.otf
IBM Plex Sans SemiBold IBM Plex Sans SemiBold 100 180 0 2 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-SemiBold.otf
IBM Plex Sans SemiBold IBM Plex Sans SemiBold 100 180 0 1 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-SemiBold.otf
IBM Plex Sans SemiBold Italic IBM Plex Sans SemiBold Italic 100 180 100 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-SemiBoldItalic.otf
IBM Plex Sans SemiBold Italic IBM Plex Sans SemiBold Italic 100 180 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
IBM Plex Sans Bold IBM Plex Sans Bold 100 200 0 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-Bold.otf
IBM Plex Sans Bold IBM Plex Sans Bold 100 200 0 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Roman.ttf
IBM Plex Sans Bold IBM Plex Sans Bold 100 200 0 4 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansArabic-Bold.otf
IBM Plex Sans Bold IBM Plex Sans Bold 100 200 0 3 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansHebrew-Bold.otf
IBM Plex Sans Bold IBM Plex Sans Bold 100 200 0 2 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansThai-Bold.otf
IBM Plex Sans Bold IBM Plex Sans Bold 100 200 0 1 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansDevanagari-Bold.otf
IBM Plex Sans Bold Italic IBM Plex Sans Bold Italic 100 200 100 7 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSans-BoldItalic.otf
IBM Plex Sans Bold Italic IBM Plex Sans Bold Italic 100 200 100 5 /usr/share/fonts/ibm-plex-sans-fonts/IBMPlexSansVar-Italic.ttf
…
Spec template documentation
The fonts-rpm-templates
package contains spec
templates, corresponding to common fonts packaging needs.
Packaging a single font family
This is the simplest packaging pattern, when upstream releases:
-
a single font family,
-
conforming to this guideline’s definition of a font family,
-
in a single dedicated source archive,
-
without any specific difficulty.
Macros and variables
Declaration ordering
Changing the proposed line order will more often than not result in a Be aware that this particular order was selected after reworking a large pool of test files, to maximize commonalities, and reduce divergence between packaging situations. Reordering may still work but the result will be harder to review, refactor, and copy in other |
SRPM generic declarations
This pattern starts with a block of traditional spec
declarations:
Version:
Release:
URL:
Shared font declarations
Then it declares elements, that will be shared by all the packaged font families. Here, we only process one of those, but the block will be at the same place in the other patterns.
%{foundry} |
an optional upstream identifier, when upstream publishes multiple font families, with consistent QA rules. Font families released by the same upstream will usually play well with one another. Marking them as such helps users choose good font package sets.
|
%{fontlicense} |
the identifier of the font family license, according to our licensing rules. |
Those identifiers are followed by variables, containing:
-
lists of space-separated shell globs,
-
matching the files associated with the font family,
-
as they exist in the build root at the end of the
%build
stage.
%{fontlicenses} |
the font family legal files |
%{fontdocs} |
the font family documentation files |
%{fontdocsex} |
exclusions from the |
%global foundry SIL
%global fontlicense OFL-1.1
%global fontlicenses OFL.txt
%global fontdocs *.txt
%global fontdocsex %{fontlicenses}
Family-specific font declarations
This is followed by a family-specific declaration block.
%{fontfamily} |
the human-friendly font family name, whitespace included, restricted to the Basic Latin Unicode block. |
%{fontsummary} |
the generated font package summary. It must be less than 80 columns in length. |
This block contains its own shell glob lists.
%{fonts} |
the font family font files |
%{fontconfs} |
the font family fontconfig files |
Followed by:
%{fontdescription} |
a multi-line description block for the generated package. Each line should be less than 80 columns in length. |
%global fontfamily Andika
%global fontsummary SIL Andika, a font family for literacy and beginning readers
%global fonts *.ttf
%global fontconfs %{SOURCE10}
%global fontdescription %{expand:
Andika is a sans serif, Unicode-compliant font family designed especially for
literacy use, taking into account the needs of beginning readers. The focus is
on clear, easy-to-perceive letterforms that will not be readily confused with
one another.}
Source declarations
Then package sources are declared the usual way.
Source:
Source10: [number]-%{fontpkgname}.conf
Keeping fontconfig file names in sync with the package name is a good idea. Take a look at the templates in fonts-rpm-templates
for information on how to write good fontconfig files and choose the correct priority [number]
.
Font package names
Font package names will be automatically computed from the previous declarations, and put into the |
Remainer of the spec file
All those declarations are used and processed in the rest of the spec
file by the following macros:
%fontpkg |
generate font package headers |
%fontbuild |
perform font-related steps, at the end of the |
%fontinstall |
perform font-related steps, at the end of the |
%fontcheck |
perform font-related steps, at the end of the |
%fontfiles |
generate font package |
%fontpkg
%prep
%setup
%build
%fontbuild
%install
%fontinstall
%check
%fontcheck
%fontfiles
%changelog
Annotated spec template
Putting it all together:
# Packaging template: basic single-family fonts packaging.
#
# SPDX-License-Identifier: MIT
#
# This template documents the minimal set of spec declarations, necessary to
# package a single font family, from a single dedicated source archive.
#
# It is part of the following set of packaging templates:
# “fonts-0-simple”: basic single-family fonts packaging
# “fonts-1-full”: less common patterns for single-family fonts packaging
# “fonts-2-multi”: multi-family fonts packaging
# “fonts-3-sub”: packaging fonts, released as part of something else
#
# A font family is composed of font files, that share a single design, and
# differ ONLY in:
# — Weight Bold, Black…
# – Width∕Stretch Narrow, Condensed, Expanded…
# — Slope/Slant Italic, Oblique
# Optical sizing Caption…
#
# Those parameters correspond to the default axes of OpenType variable fonts:
# https://docs.microsoft.com/en-us/typography/opentype/spec/dvaraxisreg#registered-axis-tags
# The variable fonts model is an extension of the WWS model described in the
# WPF Font Selection Model whitepaper (2007):
# https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Components.PostAttachments/00/02/24/90/36/WPF%20Font%20Selection%20Model.pdf
#
# Do not rely on the naming upstream chose, to define family boundaries, it
# will often be wrong.
#
# Declaration order is chosen to limit divergence between those templates, and
# simplify cut and pasting.
#
Version:
Release:
URL:
# The identifier of the entity, that released the font family.
%global foundry
# The font family license identifier. Adjust as necessary. The OFL is our
# recommended font license.
%global fontlicense OFL
#
# The following directives are lists of space-separated shell globs
# – matching files associated with the font family,
# – as they exist in the build root,
# — at the end of the %build stage:
# – legal files (licensing…)
%global fontlicenses OFL.txt
# – documentation files
%global fontdocs *.txt
# – exclusions from the ”fontdocs” list
%global fontdocsex %{fontlicenses}
# The human-friendly font family name, whitespace included, restricted to the
# the Basic Latin Unicode block.
%global fontfamily
%global fontsummary
#
# More shell glob lists:
# – font family files
%global fonts *.otf
# – fontconfig files
%global fontconfs %{SOURCE10}
#
# A multi-line description block for the generated package.
%global fontdescription %{expand:
}
Source0:
# Adjust as necessary. Keeping the filename in sync with the package name is a good idea.
# See the fontconfig templates in fonts-rpm-templates for information on how to
# write good fontconfig files and choose the correct priority [number].
Source10: [number]-%{fontpkgname}.conf
%fontpkg
%prep
%setup
%build
%fontbuild
%install
%fontinstall
%check
%fontcheck
%fontfiles
%changelog
Packaging a single font family (advanced)
Sometimes, packaging a font family requires a little more work, with the associated automation. You may need to complete the previous pattern.
Macros and variables
Shared font declarations
One more shell glob list:
%{fontlicensesex} |
exclusions from the %{fontlicenses} list |
Family-specific font declarations
%{fontpkgheader} |
multi-line container for package header directives |
%global fontfamily PT Sans
%global fontsummary PT Sans, a grotesque pan-Cyrillic font family
%global fontpkgheader %{expand:
Obsoletes: paratype-pt-sans-caption-fonts < %{version}-%{release}
}
%global fonts PTS*.ttf PTN*.ttf PTC*.ttf
%global fontconfs %{SOURCE10}
%global fontdescription %{expand:
The PT Sans family was developed as part of the “Public Types of Russian
Federation” project. This project aims at enabling the peoples of Russia to
read and write their native languages, using free/libre fonts. It is
dedicated to the 300-year anniversary of the Russian civil type invented by
Peter the Great from 1708 to 1710, and was realized with financial support
from the Russian Federal Agency for Press and Mass Communications.}
… and more shell glob lists:
%{fontsex} |
exclusions from the %{fonts} list |
%{fontconfsex} |
exclusions from the %{fontconfs} list |
%{fontappstreams} |
the font family appstream files, if any; those files are generated automatically if not specified |
%{fontappstreamsex} |
exclusions from the %{fontappstreams} list |
Remainer of the spec file
Bulky documentation can be split in a separate subpackage
%package doc
Summary: %{name} optional documentation files
BuildArch: noarch
%description doc
This package provides optional documentation files shipped with %{name}.
[…]
%files doc
%license OFL.txt
%doc *.pdf
Text files published for other systems may need recoding.
%linuxtext |
allows converting upstream files to UTF-8 and Unix end of lines if necessary. It takes the following optional arguments:
|
Annotated spec template
Putting it all together:
# Packaging template: less common patterns for single-family fonts packaging.
#
# SPDX-License-Identifier: MIT
#
# This template documents less common spec declarations, used when packaging a
# single font family, from a single dedicated source archive.
#
# It is part of the following set of packaging templates:
# “fonts-0-simple”: basic single-family fonts packaging
# “fonts-1-full”: less common patterns for single-family fonts packaging
# “fonts-2-multi”: multi-family fonts packaging
# “fonts-3-sub”: packaging fonts, released as part of something else
#
Version:
Release:
URL:
%global foundry
%global fontlicense OFL
#
# The following directives are lists of space-separated shell globs
# – matching files associated with the font family,
# – as they exist in the build root,
# — at the end of the %build stage:
# – legal files (licensing…)
%global fontlicenses OFL.txt
# – exclusions from the “fontlicenses” list
%global fontlicensesex
# – documentation files
%global fontdocs
# – exclusions from the “fontdocs” list
%global fontdocsex %{fontlicenses}
%global fontfamily
%global fontsummary
# A container for additional subpackage declarations.
%global fontpkgheader %{expand:
Obsoletes:
}
#
# More shell glob lists:
# – font family files
%global fonts
# – exclusions from the “fonts” list)
%global fontsex
# – fontconfig files
%global fontconfs %{SOURCE10}
# – exclusions from the “fontconfs” list
%global fontconfsex
# – appstream files, if any (generated automatically otherwise)
%global fontappstreams
# – exclusions from the “fontappstreams” list
%global fontappstreamsex
#
%global fontdescription %{expand:
}
Source0:
Source10: [number]-%{fontpkgname}.conf
%fontpkg
# Font creators love to bundle bulky documentation files, that show off their
# font (typically, as pdf specimens). Split those files in a dedicated optional
# doc package.
%package doc
Summary: %{name} optional documentation files
BuildArch: noarch
%description doc
This package provides optional documentation files shipped with %{name}.
%prep
%setup
# Convert upstream files to UTF-8 and Unix end of lines if necessary
# Optional arguments:
# -e [encoding] source OS encoding (auto-detected otherwise)
# -n do not recode files, only adjust folding and end of lines
%linuxtext *.txt
%build
%fontbuild
%install
%fontinstall
%check
%fontcheck
%fontfiles
%files doc
%license OFL.txt
%doc *.pdf
%changelog
Packaging multiple font families
Those patterns can be extended the following way, when packaging multiple font families, from a project named after the main packaged family.
Macros and variables
Shared font declarations
%{foundry}
, %{fontlicense}
, %{fontlicensex}
, %{fontdocs}
and %{fontdocsex}
are applied to all font families,
-
unless overriden by the same variable, suffixed with a specific block number
-
for example
%{fontdocs2}
A variable, can be used to share a description block:
%global common_description %{expand:
IBM wanted Plex to be a distinctive, yet timeless workhorse — an alternative to
its previous corporate font family, “Helvetica Neue”, for this new era. The
Grotesque style was the perfect fit. Not only do Grotesque font families
balance human and rational elements, the Grotesque style also came about during
the Industrial Age, when IBM was born.}
[…]
%global fontfamily1 Plex Sans
%global fontsummary1 IBM Plex Sans, the new grotesque IBM corporate font family
%global fontpkgheader1 %{expand:
Suggests: font(ibmplexsansmono)
}
%global fonts1 IBM-Plex-{Sans,Sans-*,Arabic}/fonts/complete/otf/*otf
%global fontsex1 IBM-Plex-Sans-Thai-Looped/fonts/complete/otf/*otf
%global fontconfs1 %{SOURCE11} 65-%{fontpkgname1}.conf
%global fontdescription1 %{expand:
%{common_description}
This package provides the grotesque sans-serif variable-width IBM Plex Sans,
the main font family of the Plex set.}
%global fontfamily2 Plex Mono
%global fontsummary2 IBM Plex Mono, the monospace grotesque coding font family of the Plex set
%global fonts2 IBM-Plex-Mono/fonts/complete/otf/*otf
%global fontconfs2 %{SOURCE12}
%global fontdescription2 %{expand:
%{common_description}
This package provides the grotesque sans-serif fixed-width IBM Plex Mono, a
little something for developers, because monospace does not need to be monotone.}
Family-specific font declarations
-
each font family is declared in a separate family-specific block,
-
each block is identified by a number, suffixed to the corresponding block variables,
-
for example
%{fontfamily1}
-
-
the zero-suffix block is used to generate SRPM metadata,
-
all the zero-suffix variables are aliased to no-suffix variables of the same name, and vice versa.
Packaging macros
-
%fontpkg
,%fontbuild
,%fontinstall
,%fontcheck
and%fontfiles
accept the following arguments:-
-a
process everything -
-z [number]
process the[number]
declaration block
-
-
if no flag is specified they will only process the zero/no-suffix block
-
consequently, packaging multiple font families will usually require the
-a
option
-
%{\fontmetapkg} |
generate font package headers. Optional arguments (usually unnecessary):
|
%fontmetapkg -z 1,2,3
%global lgcmetasummary All the font packages, generated from %{name}, Latin-Greek-Cyrillic subset
%global lgcmetadescription %{expand:
This metapackage installs all the font packages, generated from the %{name}
source package, in a version restricted to coverage of Latin, Greek and
Cyrillic.
}
%fontmetapkg -n dejavu-lgc-fonts-all -s lgcmetasummary -d lgcmetadescription -z 4,5,6
Annotated spec template
Putting it all together:
# Packaging template: multi-family fonts packaging.
#
# SPDX-License-Identifier: MIT
#
# This template documents spec declarations, used when packaging multiple font
# families, from a single dedicated source archive. The source rpm is named
# after the first (main) font family). Look up “fonts-3-sub” when the source
# rpm needs to be named some other way.
#
# It is part of the following set of packaging templates:
# “fonts-0-simple”: basic single-family fonts packaging
# “fonts-1-full”: less common patterns for single-family fonts packaging
# “fonts-2-multi”: multi-family fonts packaging
# “fonts-3-sub”: packaging fonts, released as part of something else
#
Version:
Release:
URL:
# The following declarations will be aliased to [variable]0 and reused for all
# generated *-fonts packages unless overriden by a specific [variable][number]
# declaration.
%global foundry
%global fontlicense
%global fontlicenses
%global fontlicensesex
%global fontdocs
%global fontdocsex %{fontlicenses}
# A text block that can be reused as part of the description of each generated
# subpackage.
%global common_description %{expand:
}
# Declaration for the subpackage containing the first font family. Also used as
# source rpm info. All the [variable]0 declarations are equivalent and aliased
# to [variable].
%global fontfamily0
%global fontsummary0
%global fontpkgheader0 %{expand:
}
%global fonts0
%global fontsex0
%global fontconfs0 %{SOURCE10}
%global fontconfsex0
%global fontappstreams0
%global fontappstreamsex0
%global fontdescription0 %{expand:
%{common_description}
Additional text…}
# Declaration for the subpackage containing the second font family.
%global fontfamily1
%global fontsummary1
%global fontpkgheader1 %{expand:
}
%global fonts1
%global fontsex1
%global fontconfs1 %{SOURCE11}
%global fontconfsex1
%global fontappstreams1
%global fontappstreamsex1
%global fontdescription1 %{expand:
%{common_description}
Other Additional text…}
#
# Continue as necessary…
Source0:
Source10: [number]-%{fontpkgname0}.conf
Source11: [number]-%{fontpkgname1}.conf
# “fontpkg” will generate the font subpackage headers corresponding to the
# elements declared above.
# “fontpkg” accepts the following selection arguments:
# – “-a” process everything
# – “-z [number]” process a specific declaration block
# If no flag is specified it will only process the zero/nosuffix block.
%fontpkg -a
# “fontmetapkg” will generate a font meta(sub)package header for all the font
# subpackages generated in this spec. Optional arguments:
# – “-n [name]” use [name] as metapackage name
# – “-s [variable]” use the content of [variable] as metapackage summary
# – “-d [variable]” use the content of [variable] as metapackage description
# – “-z [numbers]” restrict metapackaging to [numbers] comma-separated list
# of font package suffixes
%fontmetapkg
%package doc
Summary: %{name} optional documentation files
BuildArch: noarch
%description doc
This package provides optional documentation files shipped with %{name}.
%prep
%setup
%linuxtext *.txt
%build
# “fontbuild” accepts the usual selection arguments:
# – “-a” process everything
# – “-z [number]” process a specific declaration block
# If no flag is specified it will only process the zero/nosuffix block.
%fontbuild -a
%install
# “fontinstall” accepts the usual selection arguments:
# – “-a” process everything
# – “-z [number]” process a specific declaration block
# If no flag is specified it will only process the zero/nosuffix block.
%fontinstall -a
%check
# “fontcheck” accepts the usual selection arguments:
# – “-a” process everything
# – “-z [number]” process a specific declaration block
# If no flag is specified it will only process the zero/nosuffix block.
%fontcheck -a
# “fontfiles” accepts the usual selection arguments:
# – “-a” process everything
# – “-z [number]” process a specific declaration block
# If no flag is specified it will only process the zero/nosuffix block
%fontfiles -a
%files doc
%license
%doc
%changelog
Packaging font families, released as part of something else
The last pattern concerns the packaging one or several font families from a source rpm which is not named after the first packaged font family:
-
either because the project name differs from the main font family name,
-
or when the source archive and rpm are used to package more than fonts.
It is almost identical to the previous one.
Annotated spec template
Putting it all together:
# Packaging template: packaging fonts, released as part of something else
#
# SPDX-License-Identifier: MIT
#
# This template documents spec declarations, used when packaging one or several
# font families from a source rpm which is not named after the first packaged
# font family:
# – either because the project name differs from the main font family name
# – or when the source archive and rpm are used to package more than fonts.
#
# It is part of the following set of packaging templates:
# “fonts-0-simple”: basic single-family fonts packaging
# “fonts-1-full”: less common patterns for single-family fonts packaging
# “fonts-2-multi”: multi-family fonts packaging
# “fonts-3-sub”: packaging fonts, released as part of something else
#
# The packaging style is identical to the one documented in “fonts-2-multi”,
# EXCEPT it should not use the zero/nosuffix declaration block, as this block
# will attempt to generate source rpm declarations by default.
#
# Usually appropriate for fonts-only packages
BuildArch: noarch
Version:
Release:
License:
URL:
%global foundry
# If different from the main License
%global fontlicense
%global fontlicenses
%global fontlicensesex
%global fontdocs
%global fontdocsex %{fontlicenses}
%global common_description %{expand:
}
%global fontfamily1
%global fontsummary1
%global fontpkgheader1 %{expand:
}
%global fonts1
%global fontsex1
%global fontconfs1 %{SOURCE11}
%global fontconfsex1
%global fontappstreams1
%global fontappstreamsex1
%global fontdescription1 %{expand:
%{common_description}
Additional text…}
%global fontfamily2
%global fontsummary2
%global fontpkgheader2 %{expand:
}
%global fonts2
%global fontsex2
%global fontconfs2 %{SOURCE12}
%global fontconfsex2
%global fontappstreams2
%global fontappstreamsex2
%global fontdescription2 %{expand:
%{common_description}
Other Additional text…}
#
# Continue as necessary…
Source0:
Source11: [number]-%{fontpkgname1}.conf
Source12: [number]-%{fontpkgname2}.conf
Name:
Summary:
%description
%wordwrap -v common_description
%fontpkg -a
%fontmetapkg
%package doc
Summary: %{name} optional documentation files
BuildArch: noarch
%description doc
This package provides optional documentation files shipped with %{name}.
%prep
%setup
%linuxtext *.txt
%build
%fontbuild -a
%install
%fontinstall -a
%check
%fontcheck -a
%fontfiles -a
%files doc
%license
%doc
%changelog
Rationale
Legal
Fonts are subject to specific copyright, trademark and patent laws. Reading our fonts legal page is recommended.
Packaging unit: an ideal font family
Font upstreams will often deviate from the OpenType model in their naming:
-
because mistakes happen,
-
because font formats are complex, with a long history, and a huge amount of legacy compability bagage,
-
because upstreams may focus on the artistic side of font creation, to the detriment of its technical side,
-
because upstreams may attempt to workaround problems in the legacy proprietary applications available on their platform of choice,
-
because upstreams may be dormant, and miss changes in the OpenType specification, or use font creation tools that have still not implemented those changes.
Those deviations occur in upstream file names and upstream font file metadata. Upstream choices in those elements can not be relied upon to define useful and consistent font family boundaries.
Shared font files, are no place to workaround application-specific problems. Fedora must apply the OpenType standard strictly, to enable the leveraging by Free Desktop applications, of the application capabilities this standard was designed to unlock. One can always find bits of code not updated to take into account decades-old changes in font standards. Waiting on this code to be fixed is being last, not First.
Font file formats
OpenType highlights
Variable fonts
Application support for variable fonts is sparse right now. They can not replace older OpenType formats yet.
TT versus CFF
-
OpenType TT boasts hinting capabilities, but hinting is labor-intensive and does not scale to large-encoding fonts. In practice modern TT fonts are hinted using automated processes similar to the auto-hinter present in freetype.
-
OpenType CFF lacks hinting but uses the excellent rasterizer Adobe contributed to freetype, achieving similar results.
-
Low-resolution rendering is increasingly irrelevant with the replacement of 96dpi screens by 4K+ HiDPI hardware.
Therefore, don’t use hinting as a format selection criterium, unless you’re sure a human actually proofed the result on a modern renderer, at the screen pixel densities exercised by Fedora users.
Choose the OpenType format best supported upstream, typically the one produced by upstream’s preferred font creation toolchain. For historical reasons the math behind OpenType TT and OpenType CFF differs, converting from one to the other may introduce corner cases problems.
Collections
While collection formats save some storage space, they introduce a high level of complexity packaging and application-side, make it impossible to install font families separately, and create a user-unfriendly environment.
Avoid packaging *.ttc
and *.otc
files unless left no choice by upstream.
Legacy deprecated formats
Legacy formats are too limited to handle Unicode-level coverage, fail to declare their encoding, do not permit the kind of style selection expected in modern fonts, do not provide human-friendly naming layers, etc. They’re full of quirks and a source of (security) bugs in applications.
In 2006, at the first Text Layout summit, all the major Free Desktop players agreed to converge on a unified text layout engine, built around the HarfBuzz project and the OpenType format. As a result, modern Free Desktop applications and libraries no longer support other formats.
Use tools like fontforge or fonttosfnt (provided by xorg-x11-font-utils) to convert legacy fonts to an OpenType format. Get it done upstream or script it within the %build
section of your spec
file.
Like any other format conversion it will need some proofing. That’s why packaging fonts in a single correct format is a requisite for reliable text rendering.
Web fonts
Due to the limitations of the browsers that existed at the time, and due to the fear foundries had of widespread font piracy, initial support for web fonts used a hodgepole of obscure, broken and incomplete font formats (svg
, eot
, woff
, etc).
All major browsers have been fixed long ago to accept OpenType fonts.
Do not package web fonts except in OpenType format. If your upstream still religiously cargo-cults other formats in its CSS files, get those fixed.
The only remotely useful web font format is woff
. Its advantages compared to OpenType are marginal at best on a well-configured web server. The sole remaining reason for woff
existence is to serve as a light form of DRM for proprietary fonts (Normal applications do not read woff
files). That concern does not apply to Fedora. Fedora wants to share. Any so-called web font can be useful in other parts of the distribution. That requires distributing fonts in a common generic format.
Postscript fonts
The OpenType CFF outline format is derived from the one used in Postscript. It was designed by Adobe to permit lossless conversion of legacy Postscript fonts. The SFNT container used by OpenType is vastly more capable than the original PostScript format.
Therefore, there’s no risk, and lots of advantages, in converting Postscript fonts. If their upstream does not want to bother, do not bother packaging the result.
X11 core fonts
Once upon a time every Linux GUI application used the so-called Core fonts server-side X11 backend [1]. It was riddled with problems. The FLOSS developers finally gave up on it, declared it legacy and broken by design, and moved to client-side font handling (fontconfig). Nowadays almost no modern Linux GUI application uses the Core fonts backend. Few (if any) people are willing to fix its remaining bugs.
Therefore, unless your font has previously been registered in Core fonts, and the problems triggered by this font hopefully fixed, you SHOULD NOT declare it there. This is especially true of fonts in modern OpenType formats.
The users of this legacy backend won’t thank you for destabilizing it with new fonts. They value stability. Otherwise they’d have moved to fontconfig like everyone else a long time ago.
Fontconfig
Free Desktop systems rely on multiple upstreams to provide their fonts. They are heavily dependent on fontconfig to present a consistent user-friendly font pool in applications. High quality fontconfig rules are indispensable to permit easy substitution of font families, and to mask upstream messiness.
Applying strict WWS rules helps applications identify all the parts of a font family, and makes selectors like bolder possible.
Removing format attributes from family
prevents breakage, when the technical format shipped by the distribution changes after an update. Because font technology continues to improve, format changes are bound to happen sooner or later. Applications can still request font format information via the fontconfig API if they need to.
Removing coverage attributes from family
enables merging all matching files in a single synthetic family. That is more user friendly, and prevents breakage when upstream decides to split the font family over different lines. Because creating a wide-coverage font family is a hard, long-term endeavour — Unicode is not finalized yet — such changes are common.
The other decisions are just choosing good defaults for the font family. While fontconfig can take a guess at those, its guess will never be as accurate as packager decisions. Packagers can ask upstream for clarifications. Fontconfig can not.
Remember that a lot of upstream naming decisions are taken to accomodate systems, that are missing an automatic font substition / font merging layer. The format and coverage information in family
names is intended to help manual selection of font files. Our guidelines ask packagers to convert those to information fontconfig understands. Free Desktop systems can do a lot more, as long as the information provided to fontconfig is correct.
Source (SRPM) package break-up
As noted in the Packaging Guidelines, Fedora packages should make every effort to avoid having multiple, separate, upstream projects bundled together in a single package. This applies equally to font packages.
Multi-source packages are difficult to maintain and confusing to users.
Installation (RPM) package break-up: font packages
Once all the preceding has been done, a font package should only contain:
-
OpenType font files,
-
in a single OpenType format,
-
baring coverage constrains.
-
-
with WWS-compliant
style
values, -
sharing the same
family
value,-
except for optical sizing atttibutes, which are appended to the common
family
root.
-
-
fontconfig files,
-
appstream files,
-
legal files,
-
documentation files.
Building
Building from source ensures it will be possible to modify the font when problems are reported and upstream is not responsive. Sometimes that means working with upstream to sanitize its build processes.
Packaging a font family in multiple OpenType formats; application support
Fonts are comparatively bulky. Shipping fonts in multiple formats makes the situation worse on user systems, mirrors and live images. Every font family that ships in multiple formats, consumes space that could be used by another font package, enhancing the user experience.
Because applications will make different choices in presence of multiple formats for the same font family, because different formats use different rasterization engines, because format conversions can introduce artefacts, shipping multiple formats reduces the effectiveness of Fedora QA.
Most applications in Fedora support indifferently all OpenType formats,
Most fonts in Fedora are only available in a single OpenType format,
Rendering text in all the locales supported by Fedora requires using multiple fonts in multiple formats,
Therefore packaging a font family in multiple OpenType formats should only be done as a limited exception.
Want to help? Learn how to contribute to Fedora Docs ›