Jak zrobić czcionkę o stałej szerokości?

14

Załóżmy, że mam czcionkę w popularnym formacie (skromnie .ttf, .otfitp) i mam prawa go modyfikować. W tej chwili jest to normalna czcionka z różnymi czcionkami (glifami?) O różnych szerokościach i odstępach. W jaki sposób mógłbym zamienić tę czcionkę na czcionkę o stałej szerokości (np. Wszystkie znaki mają takie same wymiary itp.)?

Jeśli to możliwe, czy są jakieś zautomatyzowane narzędzia, które mogą pomóc ci zgadnąć? (Wyniki nie muszą być idealne .) Czcionka może być duża (wiele znaków), a jej edytowanie może być uciążliwe.

Wszelkie sugestie dotyczące problemu są mile widziane! :)


Zastrzeżenie: Przepraszam, jeśli jest to uważane za proste howto , ale Google ma bardzo mało informacji na ten temat, a dla programisty, który nie zajmuje się grafiką ani czcionkami, z pewnością nie jest to proste . Przepraszam również, jeśli moja terminologia jest wyłączona ...: P

Miguel
źródło
Jakiego oprogramowania czcionek używasz, jeśli w ogóle? Fontlab? Fontforge?
thomasrutter

Odpowiedzi:

12

Jeśli nie masz jeszcze żadnego oprogramowania do edycji czcionek, dobrą wiadomością jest to, że Fontforge jest darmowym i otwartym oprogramowaniem. Zła wiadomość jest taka, że ​​ma stosunkowo wysoką krzywą uczenia się i nieco nietypowy interfejs użytkownika.

Zasadniczo, aby czcionkę można było uznać za monospace, każdy glif musi mieć tę samą szerokość, aż do dokładnie takiej samej liczby jednostek. Obejmuje to nawet glify, które zwykle powinny mieć zerową szerokość lub określoną szerokość (na przykład spacje em, myślniki em itp.).

Zobacz wpis FAQ „Jak oznaczyć czcionkę jako monospaced?”

Aby faktycznie edytować szerokość wszystkich glifów jednocześnie, możesz po prostu przejść do menu „Metryki” -> „Ustaw szerokość” w menu, ale nie spodziewałbym się, że zadziała dla wszystkich znaków. Prawdopodobnie będziesz musiał ręcznie edytować wszystkie szerokie znaki, takie jak „W”, „M”, „@” itd., Aby nie nakładały się na siebie. A łączenie znaków diakrytycznych (akcentów przeznaczonych do „łączenia” z literami w czasie renderowania) może popsuć wszystkie ich pozycje (co jest trudne do przetestowania, jeśli jesteś Amerykaninem / Anglikiem i prawie nigdy ich nie używasz).

Osoba, która wie, jak tworzyć i edytować czcionki, byłaby w stanie wykonać to zadanie, ale nadal nie byłoby to proste.

thomasrutter
źródło
Mam to samo pytanie o konwersję czcionki do monospace. Rozumiem, że duszenie byłoby złe. Tak naprawdę szukam narzędzia, które 1) znajdzie najszerszy glif, 2) następnie zamiast rozciągać glify, chciałbym, aby były wyśrodkowane na polu o tej szerokości. Czy nie ma na to narzędzia?
NJRandy
@thomasrutter w przypadku GNU Unifont? (czcionka bitmapowa, gdzie glif to 8 16 lub 16 16)
user2284570
Świetna odpowiedź. Edytowanie bezpośrednio z interfejsu FontForge nie działało jednak dla mnie (pozostało zamrożone przez wiele godzin, zanim go zabiłem). Zamiast tego użyłem powiązań Pythona. Moim celem było użycie czcionki monospacified jako rezerwowej, więc złe kerning i krwawienie nie były dużymi problemami. Opisałem to wszystko w osobnej odpowiedzi.
Clément,
1
Kiedy uczyłem się po raz pierwszy, zrobiłem wiele czcionek mono, edytując darmowe czcionki. Jak każde narzędzie do automatyzacji, powinien to być tylko punkt wyjścia: należy odpowiednio dostosować wyniki. Odkryłem, że Fontographer ma najszybszą krzywą uczenia się. Wybierz glify, przejdź do Set Widthpod Metricsmenu rozwijanego: ustawić wszystkie glify do jednej średniej szerokości (zmiana później w razie potrzeby), a wreszcie wybrać Equalise Sidebearingsrównież pod Metricsmenu, aby wyśrodkować glify w EM-kwadratowy. Oczywiście: przestudiuj, jak inni przezwyciężyli trudności związane z projektowaniem udanych czcionek o stałej szerokości.
Moscarda,
7

thomasrutter oferuje więcej technicznych odpowiedzi; Pokażę ci kilka zasad typografii, aby zniechęcić cię do robienia tego, co chcesz robić, chyba że naprawdę musisz.

Przybliż „i” i „m” w Consolas lub Courier, a następnie Corbel lub Verdana. Zauważ, jak różne muszą być litery, aby monospace działało. Aby poprawnie przekonwertować czcionkę na monospace, potrzeba dużo wiedzy i pracy. Ogólny pomysł rozciągania czcionek w ogóle jest odrzucany przez każdego projektanta wartego swojej soli, dlatego nawet przejście z normalnego do skondensowanego wariantu wymaga przerysowania wszystkich glifów.

Spójrz więc na Consolas vs. Corbel tutaj i zobacz, jak po powiększeniu możesz spojrzeć na 1) odstępy między literami, 2) spójność grubości obrysu i 3) jak każda litera pasuje do pudełka. Spójrz na twarz o stałej szerokości (pierwsza) w porównaniu do twarzy o zmiennej odległości (druga), a następnie zobacz trzecią i czwartą, aby zobaczyć, co się stanie, gdy spróbujesz rozciągnąć i spację, aby ją wyrównać. Po czwarte, sprawiłem, że Pani skurczyła się do 75%, aby dostać się do pudełka, ale teraz są znacznie szczuplejsze niż Is. będzie to zauważalne, gdy zostanie użyte.

Porównanie czcionek monospace i zmiennych przestrzeni

Krótko mówiąc: nie zadzieraj z czcionkami; są o wiele groźniejsze, niż można się było spodziewać!

Brendan
źródło
2
Tak, rozciąganie szerokich glifów, takich jak M, nie jest wystarczającym rozwiązaniem z dokładnie tego powodu, dla którego podkreśla Brendan: pionowe pociągnięcia stają się węższe niż inne litery i wygląda to źle. Musisz ręcznie edytować glify, wybierając punkty kontrolne i przesuwając je. Mam nadzieję, że daje to PO pewien pomysł, w jaki sposób robienie tego dobrze (lub ładnie) nie jest małym zadaniem. Zwłaszcza jeśli chcesz mieć dość przyzwoity zasięg glifów.
thomasrutter
@Brendan Myślę, że powinno być inaczej w przypadku czcionki bitmapowej, w której występują tylko dwie szerokości glifów (w moim przypadku glify mają szerokość 8 lub 16 pikseli)
user2284570
+1; nierealne jest mieć nadzieję na pełne automatyczne tłumaczenie. Jednak w ograniczonych kontekstach to, co pokazałeś na trzecim obrazku, faktycznie działa dobrze: jeśli chcesz zaimportować brakujące operatory matematyczne do czcionki o stałej szerokości, to rozwiązanie będzie wyglądać raczej dobrze (zamieściłem oprogramowanie, aby to zrobić jako osobną odpowiedź).
Clément,
@Brendan Nie zgadzam się. problem ze wszystkimi twoimi przykładami polega na tym, że nie zastosowałeś tej samej transformacji do wszystkich glifów
symbiont
6

Natknąłem się na ten problem, próbując edytować kod źródłowy przy użyciu symboli Unicode. W tym kontekście większość kodu źródłowego jest wyświetlana w jednej czcionce o stałej szerokości, a kilka symboli, które nie są objęte tą czcionką, ostatecznie psuje wyrównanie.

Chociaż prawdą jest, że „monospacifying” pełna czcionka przyniesie okropne wyniki (kerning, szerokości obrysu i ogólny balans zostaną całkowicie pomieszane), importowanie tylko kilku symboli z czcionki o zmiennej szerokości do czcionki o jednolitej przestrzeni daje przyzwoite wyniki. Poniższa animacja pokazuje użycie Consolas + Symbola jako awaryjne, w porównaniu do użycia Consolas + monospacified wersja Symbola:

przed i po monospacyfikacji

Jest to bezużyteczne w przypadku zaawansowanej typografii, ale jest to dobry kompromis, jeśli chcesz używać symboli w kodzie źródłowym bez rujnowania wcięć. Istnieje jednak kilka zastrzeżeń:

  • Szerokie postacie będą krwawić trochę na sąsiednie pola (choć można je nieco zmniejszyć, aby złagodzić problem)
  • Kerning będzie zły (niezbyt duży problem, ponieważ jest to tylko awaria)

Uruchomiłem projekt GitHub, aby automatycznie obsługiwać tego rodzaju transformacje czcionek. Zawiera wstępnie wygenerowane czcionki i kod wykorzystujący wiązania Python dla fontforge.

Zobacz także to pytanie emacs.se .

Łaskawy
źródło
-1

W edytorze tekstu I: (1) utworzyłem tabelę; (2) podzielone na kolumny - jedna kolumna na każdą literę; (3) wyśrodkował litery; oraz (4) uczyniły wszystkie granice, wewnętrznymi i zewnętrznymi niewidocznymi.

użytkownik56627
źródło
1
To nie odpowiada na pytanie. Nie pomaga stworzyć czcionki i brzmi jak strata czasu.
Moscarda,