Helvetica Neue: Integrating with Linux
First, this post is not sponsored by anyone and has no links or ads that make me any money. Let's go!
I grew quite a bit of a sympathy for Helvetica fonts recently and
ended up buying
font Helvetica Neue
a few days ago eventually.
While buying and then integrating the font into my Linux setup I learned a few things… that I would like to share with you.
Buying process + choices I had to make
Precisely I bought bundle "Neue Helvetica Pro Basic Family", 8 weights, each italic and not italic, desktop license 1-5 computers, Pro OpenType TTF, 20% discount from a promo code from signing up for their newsletter prior to buying, totaling at 141.85 Euro including VAT.
I picked Helvetica Neue
over
other Helveticas
because it seemed like one of the more modern options fit for 2020.
Also I had seen it work very well before
(with content of The Futur in particular), and
it was not an experiment (like Helvetica Now
would have been),
and it was more affordable than some of the other options.
I picked OpenType TTF over OpenType CFF for the desktop download because in my local prior experiments, TTF fonts rendering looked different and better. I should not pay twice to get both formats though, that's not cool.
Out of all the font-selling websites run by Monotype with close to identical offerings — fontshop.com, fonts.com, linotype.com, myfonts.com — I went for FontShop for buying because I liked the arty feeling about the site and because they allow experimenting with a font prior to buying in a more fun way than the others.
What that go me was 16 .ttf
files:
HelveticaNeueLTPro-It.ttf
HelveticaNeueLTPro-UltLtIt.ttf
HelveticaNeueLTPro-UltLt.ttf
HelveticaNeueLTPro-Roman.ttf
HelveticaNeueLTPro-Lt.ttf
HelveticaNeueLTPro-Md.ttf
HelveticaNeueLTPro-Hv.ttf
HelveticaNeueLTPro-HvIt.ttf
HelveticaNeueLTPro-Blk.ttf
HelveticaNeueLTPro-BdIt.ttf
HelveticaNeueLTPro-Bd.ttf
HelveticaNeueLTPro-Th.ttf
HelveticaNeueLTPro-ThIt.ttf
HelveticaNeueLTPro-LtIt.ttf
HelveticaNeueLTPro-MdIt.ttf
HelveticaNeueLTPro-BlkIt.ttf
Installation
Installing them was easy:
-
create a folder like
~/.local/share/fonts/Monotype_Imaging/TrueType/Helvetica_Neue_LT_Pro/
, -
put the 16
.tff
files in, and -
ran
fc-cache
to update the Fontconfig cache.
Integrating with Linux more
But I wanted a bit more. I often saw website refer to plain Helvetica —
e.g. through CSS like font-family: [..],Helvetica,Arial,sans-serif,[..];
—
and I wanted browser to use my Helvetica Neue for that. Also, I wanted
change the default choice for sans-serif
to Helvetica Neue, at least to see
how it would feel for a few days. To summarize I wanted:
-
to map
Helvetica
toHelvetica Neue
for all applications and -
to set
Helvetica Neue
as the defaultsans-serif
font for all applications.
Took me a few takes to get that right but looking back it's actually not that hard.
Tool fc-match
helped me understand where I was at.
When I started out,
sans-serif
mapped to Liberation Sans
and
Helvetica
mapped to TeX Gyre Heros
as can be seen here:
# fc-match Helvetica texgyreheros-regular.otf: "TeX Gyre Heros" "Regular" # fc-match sans-serif LiberationSans-Regular.ttf: "Liberation Sans" "Regular"
Those mappings are configured
in .conf
files below /etc/fonts/
and also ~/.config/fontconfig/
.
So I learned from the existing .conf
files I found, put two more files
into ~/.config/fontconfig/
, one per task, and ran fc-cache
again.
This is how I named my files:
-
~/.config/fontconfig/conf.d/01-helvetica-neue-aliases.conf
-
~/.config/fontconfig/conf.d/02-neue-helvetica-default-sans-serif.conf
Let's a have a closer look at their content.
To make Helvetica Neue
win over TeX Gyre Heros
I came up with this:
# cat ~/.config/fontconfig/conf.d/01-helvetica-neue-aliases.conf <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <description> Serve Helvetica Neue when asked for Helvetica </description> <!-- needs binding="same" to win over TeX Gyre Heros --> <alias binding="same"> <family>Helvetica</family> <prefer> <family>Helvetica Neue LT Pro</family> </prefer> </alias> </fontconfig>
Mapping sans-serif
to Helvetica Neue
was similar, slightly easier:
# cat ~/.config/fontconfig/conf.d/02-neue-helvetica-default-sans-serif.conf <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <description> Make Helvetica Neue the default sans-serif </description> <alias> <family>sans-serif</family> <prefer> <family>Helvetica Neue LT Pro</family> </prefer> </alias> </fontconfig>
Using fc-match
, it was easy to verify those files worked:
# fc-match Helvetica HelveticaNeueLTPro-Roman.ttf: "Helvetica Neue LT Pro" "Regular" # fc-match sans-serif HelveticaNeueLTPro-Roman.ttf: "Helvetica Neue LT Pro" "Regular"
During my experiments, I played with a downloaded copy of
Web Font Specimen
to make sure that both Firefox and Chromium were doing what I expected.
(I had one of the <prefer>
tags be an <accept>
earlier and that made
Firefox and Chromium behave differently — I still need to figure out why,
but use of <prefer>
fixed things for me.)
I also got curious in which order fc-cache
process the .conf
files,
in particular how user config and system config would blend together.
Why not just spy on fc-cache
while it does the work… using strace
.
I'll trim this down a bit to the interesting part:
# strace -F -efile fc-cache |& fgrep openat \ | grep -Eo '"[^"]+\.conf"' | sed 's,",,g' | nl 1 /etc/fonts/fonts.conf 2 /etc/fonts/conf.avail/10-hinting-slight.conf 3 /etc/fonts/conf.avail/10-scale-bitmap-fonts.conf 4 /etc/fonts/conf.avail/20-unhint-small-vera.conf [..] 10 /etc/fonts/conf.avail/50-user.conf 11 /home/user/.config/fontconfig/conf.d/01-helvetica-neue-aliases.conf 12 /home/user/.config/fontconfig/conf.d/02-neue-helvetica-default-sans-serif.conf 13 /home/user/.config/fontconfig/fonts.conf 14 /etc/fonts/conf.avail/51-local.conf [..] 51 /etc/fonts/conf.avail/70-yes-bitmaps.conf
So that's where fonts.conf
and user config come in.
It's controlled by 50-user.conf
, cut down to the interesting bits:
# cat /etc/fonts/conf.avail/50-user.conf <?xml version="1.0"?> <!DOCTYPE fontconfig SYSTEM "fonts.dtd"> <fontconfig> <description>Load per-user customization files</description> <!-- Load per-user customization files where stored on XDG Base Directory specification compliant places. it should be usually: $HOME/.config/fontconfig/conf.d $HOME/.config/fontconfig/fonts.conf --> <include ignore_missing="yes" prefix="xdg">fontconfig/conf.d</include> <include ignore_missing="yes" prefix="xdg">fontconfig/fonts.conf</include> </fontconfig>
My personal summary
-
I'm very happy to have desktop access to
Helvetica Neue
now, e.g. for use with future presentation slides. -
I will probably revert back to
Liberation Sans
orDejaVu Sans
for asans-serif
default though, will see. -
Mapping or re-mapping fonts on Linux is not that hard.
-
Fontconfig configuration can be adjusted without root permissions by putting a small XML file into directory
~/.config/fontconfig/conf.d/
. -
Tools
fc-cache
andfc-match
are the Fontconfig commands needed to get user fonts and configuration to work. -
Font Manager is great for browsing and previewing installed fonts on a Linux System.
-
Googling for differences between OpenType TFF and OpenType CFF for quite a while did not help me making the choice easier. Converting one font TTF-to-CFF and another CFF-to-TFF using FontForge and comparing results did.
Enough fonts for me today.
Best, Sebastian