Maple Mono — czcionka programistyczna z ligaturami i zmiennymi wagami
Większość czcionek programistycznych pobiera się i instaluje. Maple Mono można sobie zbudować: z własną wysokością wiersza, własnym przypisaniem grubości i wybranym zestawem ligatur wypalonym na stałe. To odpowiedź na problem, o którym rzadko się mówi.
Wybór czcionki do kodu wygląda na sprawę gustu i w dużej mierze nią jest. Ale jest w tej dziedzinie problem techniczny, o którym mówi się rzadko, a który zna każdy, kto próbował włączyć w swoim terminalu wariant znaku albo wyłączyć konkretną ligaturę.
Nowoczesne czcionki mają mechanizm zwany cechami OpenType — przełączniki włączające alternatywny kształt zera, inny kształt małpy, wybraną grupę ligatur. Kłopot polega na tym, że ogromna część narzędzi, w których piszemy kod, nie daje żadnego sposobu na przestawienie tych przełączników. Edytor bywa łaskawy, terminal zwykle nie. Zostajesz z tym, co autor uznał za domyślne.
Maple Mono podchodzi do tego inaczej niż konkurencja: pozwala zbudować sobie własny plik czcionki, z wybranymi cechami wypalonymi na stałe. I to jest w tym projekcie najciekawsze — nie zaokrąglone narożniki, choć są ładne.
Stan projektu, czyli lekcja z czytania gałęzi
subframe7536/maple-font ma 28 787 gwiazdek, 1183 forki i tylko 36 otwartych zgłoszeń — przy takiej popularności to liczba, która mówi o porządku w projekcie. Licencja to SIL Open Font License 1.1, a historia sięga kwietnia 2022.
Ale sprawdzenie, czy projekt żyje, wymaga tu uwagi, bo pierwsze spojrzenie wprowadza w błąd. Ostatnie stabilne wydanie, v7.9, jest z 5 grudnia 2025 — czyli sprzed dziewięciu miesięcy. Gałąź domyślna nazywa się v7 i ma od czerwca ledwie pięć commitów. Kto na tym poprzestanie, uzna projekt za zwalniający.
A wystarczyło przeczytać pierwszą linię pliku README na tej gałęzi, gdzie stoi wprost: ta gałąź została zamrożona jako obraz wersji 7, a wersja 8 rozwija się na gałęzi variable. Zajrzałem tam — ponad sto commitów od początku lipca, ostatni z dnia poprzedzającego powstanie tego tekstu. Projekt nie zwalnia, tylko pracuje obok gałęzi domyślnej.
Praktyczny stan rzeczy jest więc taki: wersja stabilna to v7.9, wersja 8 jest w wydaniach przedpremierowych od sierpnia 2026 (dwa dotąd), a jej README ostrzega, że nie jest jeszcze oficjalnie wydana i do produkcji należy używać siódemki. Gałąź main to z kolei relikt wersji 6. Cztery gałęzie, trzy generacje — warto wiedzieć, po co się sięga.
Co jest w środku
Zanim przejdę do budowania własnej odmiany, krótko o tym, co daje gotowa paczka:
- Format zmienny — grubość regulowana bezstopniowo, z dopracowanymi osobno glifami odmiany pochyłej. Kursywa nie jest tu pochyleniem prostego kroju, ale ma własne, płynne kształty liter
f i j k l x y. - Zaokrąglone kształty i przeprojektowane znaki
@ $ % & Qoraz strzałka. - Ligatury w dużej liczbie, wraz z wariantami znaków i zestawami stylistycznymi.
- Ikony Nerd Fonts wbudowane — bez osobnego łatania czcionki. O samym projekcie Nerd Fonts pisałem osobno; tutaj jego glify są już w środku, zgodnie z jego regułami nazewnictwa.
- Szeroki zakres Uniodu — znaki rysowania ramek, brajl, operatory matematyczne, symbole szachowe i karciane, a także symbole postępu i statusu dla terminala.
W wykazie zakresu wersji 8 znalazłem przy tym pozycję, która mnie rozbawiła i jednocześnie dobrze pokazuje, jak blisko autor śledzi to, w czym ludzie faktycznie pracują: wśród obsługiwanych znaków są wskaźniki ładowania używane przez Claude Code. Trudno o lepszy dowód, że ktoś patrzy na własny terminal, a nie na tabelę Uniodu.
Chiński, japoński i koreański w proporcji 2:1
Jest w tej czcionce cecha, która dla części zespołów będzie argumentem rozstrzygającym: znaki CJK mają dokładnie dwukrotną szerokość znaków łacińskich. Dzięki temu tabele w Markdownie i wielojęzyczne wydruki nie rozjeżdżają się w pionie — a każdy, kto próbował wyrównać tabelę zawierającą chińskie znaki, wie, jak rzadka to właściwość.
Wersja 8 rozszerzyła ten obszar znacznie: obsługuje uproszczony i tradycyjny chiński, japoński oraz — to nowość — koreański. Ciekawostka techniczna: każda lokalizacja czerpie glify z innego projektu źródłowego, dobranego pod dany zestaw znaków. To nie jeden zaokrąglony krój rozciągnięty na wszystko, ale cztery różne, dopasowane osobno.
Cena jest podana uczciwie i trzeba ją znać: odstępy między znakami CJK są większe niż w typowych krojach dla tych języków. To bezpośrednia konsekwencja proporcji 2:1 i albo się na nią zgadzasz, albo wybierasz inny krój. Warianty CJK nie są przy tym budowane domyślnie — trzeba je jawnie włączyć, a wersja 7 nie oferuje dla nich formatu zmiennego.
Budowanie własnej odmiany
Teraz część, dla której warto ten projekt zapamiętać. Repozytorium zawiera skrypt budujący w Pythonie i plik konfiguracyjny, a przez nie da się przestawić rzeczy, których w gotowej czcionce nikt nie przestawia.
Trzy tryby obsługi cech OpenType rozwiązują dokładnie ten problem, od którego zacząłem. Zamiast liczyć, że twój terminal pozwoli włączyć wariant znaku, wybierasz przy budowaniu: wymuś te cechy na stałe, usuń je tak, by nie dały się włączyć nawet ręcznie, albo zostaw zachowanie domyślne. Efektem jest plik czcionki, który wygląda tak, jak chcesz, w każdym narzędziu — bo nie ma już nic do przestawiania.
Własna wysokość wiersza to drugi przypadek tego samego rodzaju. Domyślna wynosi 1, ale można podać własną, a wynik liczony jest z rozpiętości kroju. Jeśli używasz narzędzia bez ustawienia interlinii — a takich jest więcej, niż się wydaje — to jedyna droga, by ją zmienić.
Własne przypisanie grubości to rozwiązanie problemu, o którym rzadko się mówi wprost: czasem krój jest po prostu o pół kroku za ciężki na twoim ekranie. Tutaj można obniżyć odmianę zwykłą z wartości 400 na 350 i zbudować sobie czcionkę o cieńszej „normalności", zamiast szukać kompromisu między zwykłą a cienką.
Trzy tryby szerokości znaku — domyślny, węższy i najwęższy — pozwalają upakować więcej kolumn bez zmiany kroju. Ligatury nieskończonych strzałek, wzorowane na rozwiązaniach z Fira Code i Cascadia Code, można wyłączyć jednym przełącznikiem. Własne odwzorowanie punktów kodowych pozwala podstawić istniejący glif pod inny punkt Uniodu, gdy jakieś narzędzie oczekuje znaku spod konkretnego adresu.
A dla tych, którym to nie wystarczy: cechy OpenType definiuje się tu programistycznie, w modułach Pythona wczytywanych przy budowaniu — z możliwością podania własnych plików źródłowych składni cech. Autor odnotowuje przy tym, że większość czcionek nie pozwala na definiowanie własnych cech, i ma rację; to naprawdę rzadkie.
Jest jeszcze jedna kategoria, o której warto wiedzieć, bo w gotowych czcionkach nie występuje: ligatury etykiet statusu. Chodzi o zamianę krótkich, umownych napisów w kodzie na zwarte znaczniki — a skoro cechy definiuje się tu w Pythonie, listę takich etykiet możesz sobie dopisać. Dla zespołu mającego własne konwencje w komentarzach to droga do tego, by wyglądały one w edytorze jak element języka, a nie jak przypadkowy tekst.
Skąd to wziąć
Nie trzeba niczego budować, żeby zacząć — i to jest ważne, bo cała powyższa sekcja mogła zabrzmieć, jakby wymagała pracy. Gotowe paczki leżą w wydaniach, a poza tym czcionka jest w menedżerach pakietów: Scoop na Windowsie, Homebrew na macOS, AUR na Archu i NixPkgs. To zwykle jedna komenda i koniec.
Do zastosowań internetowych są gotowe sieci dostawcze, w tym Fontsource — czyli droga znana każdemu, kto podłączał czcionkę do projektu frontendowego przez pakiet npm. Warianty CJK mają własne, osobne źródła dostawcze, przygotowane pod ruch azjatycki.
Przy pobieraniu z wydań przyda się natomiast chwila uwagi. Wydanie wersji 8 zawiera 177 plików, wersji 7 — osiemdziesiąt osiem. Różnią się formatem, zestawem znaków, obecnością ikon i trybem szerokości. Projekt ma na wybór osobną stronę pomocniczą i szczerze polecam ją przeczytać, bo pomyłka na tym etapie oznacza czcionkę bez ikon albo bez odmiany pochyłej — i pół godziny szukania przyczyny.
Ustawienie, które ratuje wdrożenie zespołowe
Osobno wyróżniam rzecz, o której warto wiedzieć, zanim ktoś w zespole odrzuci tę czcionkę po jednym spojrzeniu.
Domyślny rysunek Maple Mono jest wyrazisty i — cytując autora — spersonalizowany, co nie każdemu przypadnie do gustu. Dlatego istnieje preset budowania „normal", dający glify zbliżone do JetBrains Mono, z zerem przekreślonym ukośnikiem zamiast kropki w środku.
To jest bardzo dojrzałe posunięcie: autor przyjmuje, że jego własny gust jest gustem, a nie standardem, i daje wariant dla ludzi, którzy chcą zaokrąglonych narożników i ikon, ale bez charakterystycznych kształtów. W zespole, gdzie czcionka wchodzi do wspólnego pliku ustawień, to często różnica między zgodą a odmową.
Pułapki w jednym miejscu
- Gałąź domyślna
v7jest zamrożona. Rozwój idzie na gałęzivariable, amainto wersja 6. Ocena „projekt zwalnia" po commitach na gałęzi domyślnej będzie tu błędna. - Wersja 8 nie jest wydana. Dwa wydania przedpremierowe i jawne ostrzeżenie w README, by do stabilnych zastosowań używać siódemki.
- Odwrócona semantyka zera. Domyślnie zero jest przekreślone, a włączenie cechy
zerodaje kropkę — czyli odwrotnie niż każe standard. Jest osobny przełącznik przywracający normalne zachowanie, ale trzeba o nim wiedzieć, bo inaczej wynik zaskoczy. - Zwężenie odstępów CJK psuje rozpoznawanie stałej szerokości. Opcja jest dostępna i przydatna, ale po jej użyciu narzędzia mogą przestać uznawać czcionkę za maszynową — a część edytorów odmówi wtedy jej użycia w widoku kodu.
- Warianty CJK nie budują się domyślnie i pobierają glify bazowe z osobnego wydania.
- Odstępy CJK są szersze niż w typowych krojach dla tych języków. To cena proporcji 2:1.
- Ikony Nerd Fonts mają trzy tryby szerokości. Domyślnie zajmują szerokość jednego znaku łacińskiego; osobne przełączniki dają warianty maszynowy i proporcjonalny. Dobór niewłaściwego psuje wyrównanie w wierszu statusu.
- Własne argumenty łatki Nerd Fonts wymagają FontForge zainstalowanego w systemie, czasem wraz z jego wiązaniem do Pythona.
- Warianty CJK dziedziczą po czcionkach innych autorów. Przed komercyjnym rozprowadzaniem sprawdź licencje projektów źródłowych, bo są to osobne dzieła, każde z własnym plikiem licencji.
- Wybór pliku z wydania wymaga uwagi — wydanie wersji 8 ma 177 plików, wersji 7 osiemdziesiąt osiem. Projekt ma na to osobną stronę pomocniczą i warto ją przeczytać, zamiast losować.
Podsumowanie
Maple Mono jest czcionką, po którą warto sięgnąć z dwóch różnych powodów. Pierwszy jest estetyczny: zaokrąglone kształty, przemyślana kursywa i wbudowane ikony bez łatania. Drugi jest inżynierski i moim zdaniem ważniejszy — to jedna z niewielu czcionek, którą można skonfigurować u siebie, zamiast dopasowywać się do decyzji autora.
- Format zmienny z osobno dopracowaną odmianą pochyłą.
- Trzy tryby cech OpenType, które wypalają twoje wybory w pliku — także dla narzędzi bez żadnych ustawień typograficznych.
- Własna wysokość wiersza, grubości i szerokość znaku ustawiane przy budowaniu.
- Ikony Nerd Fonts w środku, w trzech trybach szerokości.
- Proporcja 2:1 dla CJK w czterech lokalizacjach, każda z własnego źródła.
- Preset zbliżony do JetBrains Mono dla zespołów, którym domyślny rysunek jest zbyt wyrazisty.
- 36 otwartych zgłoszeń przy prawie trzydziestu tysiącach gwiazdek.
Licencja to SIL Open Font License 1.1 i przy czcionce jest to licencja właściwa, ale rządzi się własnymi zasadami, innymi niż te znane z oprogramowania. Wolno używać jej komercyjnie, osadzać w dokumentach i aplikacjach, hostować na własnym serwerze jako czcionkę internetową i rozprowadzać razem z produktem. Obowiązki są dwa i o oba łatwo się potknąć: plik licencji musi podróżować z plikami czcionki, a każda odmiana, którą sam zbudujesz i rozpowszechnisz, pozostaje pod tą samą licencją. OFL zabrania też sprzedawania samej czcionki jako produktu — sprzedaż produktu, który ją zawiera, jest w porządku.
Jedna rzecz warta odnotowania dla porządku, bo w świecie czcionek bywa uciążliwa: OFL pozwala autorom zastrzec nazwę kroju, co zmusza każdego, kto zmodyfikuje czcionkę, do wydania jej pod inną nazwą. Sprawdziłem plik licencji w tym repozytorium — autor Maple Mono z tego zastrzeżenia nie skorzystał. Nazwa nie jest zastrzeżona, więc własna odmiana zbudowana z tych źródeł nie wymaga przechrzczenia. Przy projekcie, którego cała siła polega na budowaniu własnych wariantów, jest to decyzja spójna — i warto docenić, że autor pomyślał o tym, czego jego użytkownicy będą naprawdę potrzebować.