arrowtype / recursive

Recursive Mono & Sans is a variable font family for code & UI
https://recursive.design
SIL Open Font License 1.1
3.29k stars 53 forks source link

Add a serif setting #218

Closed chriskirknielsen closed 5 years ago

chriskirknielsen commented 5 years ago

Hi! Recursive looks like a dream font to me when thinking of performance on the web.

The sans and mono versions look great, but I feel like this font could be improved further with a serif setting. I obviously don't know how this could be achieved without a major rework, but thought I'd throw it out there. EDIT: As mentioned in this tweet, forking this to swap out the casual setting for a serif one might be an idea.

I feel this is already kind of there with the MONO setting set just above 0.5 but it's not a true serif. If the mono version's serifs could be used without monospacing, that would be a great start.

I know building a static font file is enough of a pain as it is, so I can't imagine the time it takes to build variable fonts, thus, feel free to tell me if this idea is an unreasonable amount of extra work.

Best, Chris

arrowtype commented 5 years ago

Hey Chris, thanks for leaving an issue, thanks for the idea, and thanks for being thoughtful with your writing! It's definitely a cool thought, and one that is fun to consider as something that might be possible to add in the long run.

I know building a static font file is enough of a pain as it is, so I can't imagine the time it takes to build variable fonts, thus, feel free to tell me if this idea is an unreasonable amount of extra work.

This is the main thing stopping me from adding a serif variation to this family.

I'm not sure of how much you've drawn with bezier curves, but I'll try to explain in a way that might be understandable by others who come across this post, as well.

It takes a lot of time, effort, and acquired skill to draw a single font well. Letters are all created from bezier curves, which take some getting used to, and all letters in a font must be stylistically harmonious with all the others, and given the right proportions and margins to look good in text.

To make a variable font, there is a significant additional challenge: the drawings for every glyph must match in several ways, so that the drawings can be interpolated to create in-between drawings.

For a simplified example, if this font had only a single weight (ExtraBold), with the Slant axis, the two drawings required for the letter m would be like this:

image

(This is a screenshot from RoboFont, the software I have used to draw Recursive.)

Several things must match for interpolation to work well (or at all, often):

However, to make the full five-axis Recursive VF, there are 24 compatible drawings for every glyph. So, that looks more like this:

image

(That is a screenshot from Prepolator, a useful RoboFont extension that makes it easier to match contour order and start point location.)

To add an alternate shape such as the m.italic with its "outstroke" tail, we have to repeat the process with 24 additional drawings:

image

This process varies somewhat for different letters. The uppercase and a few of the lowercase don't have any italic alternates. Any glyphs that look good with a "normal" width of 600 units it the Sans styles are only drawn 12 times, then copied over to the Sans masters:

image

Of course, that still requires some scripts to copy glyphs, and scripts to check that things haven't gotten out of order.

Other glyphs, like the i, require 24 compatible drawings (for the Sans shape), plus 24 compatible drawings for i.italic and and i.mono alternates, plus all of the diacritics based on i need alternates, too (though, luckily these diacritics can be built from scripting and components). So, all in all, under the hood the i must have 24 drawings for dotlessi, 24 for dotlessi.italic, and 24 for dotlessi.mono, and then scripts put these together with accents like the dotaccentcomb and all the rest. In one of the 24 masters, then, the i looks something like this:

image

Then, these alternates are connected to axis conditions via rules in the designspace. You can see the current ones here: https://github.com/arrowtype/recursive/blob/7fa1884493cb3b24709153b6058844083b8e47d8/src/masters/recursive-MONO_CASL_wght_slnt_ital--full_gsub.designspace#L28-L628.

All that is to say, if we wanted to add alternates like m.serif to make a slab-serif version of Recursive, we could do it in one of two ways:

It would probably require different alternate glyphs to be added for almost every uppercase and lowercase letter, all figures, and probably for quite a few symbols if we were being perfectionists about it.

I hope I've explained that clearly enough ... it has taken me time to wrap my head around all this, plus a healthy dose of good advice from people who are much smarter and more experienced than me. So, if it doesn't make sense, it's probably because it just takes some time working with these tools to grock it all.

With that said, this would be at least a few months of work, and add significantly to the overall complexity of the project. There are a few things that I am more keen on that a serif axis:

arrowtype commented 5 years ago

I'm closing this for now, but I appreciate the question, as it gave me a useful chance to document a response to similar questions that will no doubt come up in the future. :) It definitely would be a cool option to add, but is currently not feasible.

That said, I hope you still find Recursive useful, @chriskirknielsen! If you do find yourself wanting a serif font for code, a couple I love are Input Mono, by DJR and Array Mono, by JTD Type.

Cheers!

chriskirknielsen commented 5 years ago

@arrowtype Talk about a deep dive! Thank you so much for taking the time to walk me through all of this, it's really fascinating! I truly appreciate all this insight.

I'm sure I can live without a serif axis for a little while longer — it does look like a lot of work more than "just" showing the mono version's of serifs!

arrowtype commented 5 years ago

It was a good opportunity to answer a question that will no doubt come up more in the future! Thanks again for asking.

One extra thing I should have included: if you (or anyone else) do find a specific need for a serif style, you wouldn’t necessarily have to make it work for the entire system – you could alter a specific instance, or even just a few letters. The OFL license allows you to freely do almost anything with these sources and fonts, so long as the resulting fonts also carry the OFL license. (That is, you could make a single-weight serif version and call it “ChrisKirkNielsen Serif” or whatever else, so long as you share it freely and don’t try to seek it under a proprietary license on myfonts, etc.)

demoy commented 3 years ago

@arrowtype in lieu of your interest in a blackletter companion for Recursive over plain serifs: I find that Texturina ( https://github.com/Omnibus-Type/Texturina) already compliments recursives letter-forms and is a variable font on Google Fonts.

Ofc more blackletters to google fonts few that I know of, is not unwelcomed

arrowtype commented 3 years ago

Texturina is a nice one! I can see how that would go nicely with Recursive. Thanks for pointing that one out!

For what it’s worth, I think that font pairing is mostly about finding good fonts, and using them together, but with usually with enough contrast to make them each serve a specific role. So, for example, Recursive could work for code samples within a site otherwise set in Inter. Currently, my blog uses Recursive along with Name Sans (a commercial font). Or, I just made a presentation using Newsreader and Recursive, and it looked nice! And, there are near-infinite other good possibilities.