edison23

Zápisky šíleného jazykového editora

Vlastní fonty v LaTeXu

Datum: 2014-11-10
Kategorie: Návody CS
Štítky: latex

Obsah


Tenhle článek o sázení v Latexu (Luatexu, Xetexu, Texu, whatever) píši z posice člověka, který sice už pár věcí nasázel a byl nucen pár problémů řešit, ale rozhodně se nepovažuje za odborníka (spíše za značného laika, kterému dost věcí okolo TeXu přijde jako temná magie). Proto budu velmi rád, když mě na nepřesnosti upozorníte.

Nuže, úkol byl následující: vysázet presentaci na předmět o staré češtině, která bude obsahovat texty ve staré češtině. Bylo mi jasné, že to nepůjde asi jen tak, protože se v textech vyskytují znaky jako ь, ǫ a ʃ. Ale šlo to.

TL;DR:

\documentclass{beamer}
\usefonttheme{serif}
\usepackage{fontspec}
\setmainfont{ubuntu}
\setsansfont{code2000}
\begin{document}
    \begin{frame}
        \item akjdnak f 2438г0 ěčá{\sf ěýhčýáí}šě лфгк ь, {\sf ǫ a ʃ} 
    \end{frame}
\end{document}

Pokud nevíte, proč co kde jak, čtěte dál.

Vzhledem k tomu, že mě zkoumání této problematiky stálo několik hodin, pokusím se o popis pracovního postupu, který generacím příštím snad usnadní trochu práce.

Nejprve se vykašlete na LaTeX a jeho pdfcslatex a nainstalujte si Luatex, ten vám totiž umožní do zdrojového souboru vkládat obskurní znaky jak jsou. Kompilovat dokumenty teď budete přes lualatex.

A teď ta důležitá obecná rada. LaTeX evidentne neumí jakékoliv substituce fontů, jako to dělá třeba MS Word, když používáte font, který nemá všechny znaky, které v textu máte. Proto je velmi důležité, abyste ve svém texovském dokumentu používali font, který ideálně má všechny znaky, které potřebujete. Základní font v modulu Beamer (presentace) toho moc nemá (narazil jsem už u jerů vzatých z azbuky). Základem celého snažení je tedy najít font, který obsahuje všechny znaky, které potřebujete. Pokud se vám něco takového podařilo, doporučuji si ušetřit zdraví a přesunout se do sekce Level:Foolproof. Až pokud vám to nebude fungovat (zjistíte, že font ve skutečnosti nemá všechno), přesuňte se do Level:Insane.

Pokud font, kterým chcete mít dokument vysázen, neobsahuje znaky, které potřebujete, nezbývá, než vysázet jen ty konkrétní znaky fontem, který je obsahuje. Tady se váš osud dělí na ten, kde si mírně zaděláte systém dalším fontem, a ten, kde se upíšete temné magii. Choose wisely.

Level:Insane

Začnu tou složitější metodou, tedy případ, že font v systému nainstalovaný mít nechcete nebo nemůžete, a přesto ho v TeXu potřebujete použít. Tady nastupuje ona temná magie, které absolutně nerozumím, ale fungovala mi. Návod v originále zde.

Co budete potřebovat:

  • Font typu TrueType (*.ttf). Udělejte si od něj kopii pojmenovanou custom.ttf (ano, ten název je důležitý, s jiným ten skritp fungovat nebude, pokud si to nepřepíšete) a umistěte ji do své složky, kde vytváříte svůj dokument/presentaci/whatever.
  • Program ttf2tfm (je distribuován s LateXem, takže byste ho snad měli mít)
  • Soubory T1-WGL4.enc (stáhnout) a t1custom.fd (stáhnout).

Co musíte udělat:

V terminálu vlezte do složky se svým dokumentem a zadejte:

ttf2tfm custom.ttf -p T1-WGL4.enc

Do záhlaví svého zdrojového souboru v TeXu vložte:

\newcommand\customfont[1]{{\usefont{T1}{custom}{m}{n}#1}}

Vždy, když budete chtít třeba blah blah ve vlastním fontu, použijte:

\customfont{blah blah}

Level:Foolproof

A teď ten způsob, který vyžaduje, abyste font měli nainstalovaný v systému, ale možná po jeho aplikaci budete stále disponovat alespoň zbytkovými fragmenty svého někdejšího rozumu.

Poté, co si nainstalujete potřebné fonty do OS, zjistěte, jak se pro aplikace jmenují (nejjednoduší je otevřít nějaký rich-textový editor a v něm se podívat, jak se ten font hlásí). Potom ve svém texovském zdroji použijte balíček fontspec (\usepackage{fontspec}). Pokud používáte Beamer na slidy, budete ho muset přesvědčit, že chce používat serifové písmo, tedy mu říci \usethemefont{serif}. Don’t ask me why.

Teď, abyste mohli v presentaci použít více písem, budete muset jedno nastavit jako main (to, které chcete používat víc, tedy jako hlavní) a jedno např. jako sans. Tzn. např. \setmainfont{Droid Sans} a setsansfont{code2000}. Teď se vám slidy budou sázet Droidem, a když narazíte na písmenko, které Droid neumí, řeknete TeXu, že používáte sans, tedy {\sf text fontem code2000}.

Jednoduché, že? A pro jistotu ještě jednou ukázkový kód:

\documentclass{beamer}
\usefonttheme{serif}
\usepackage{fontspec}
\setmainfont{ubuntu}
\setsansfont{code2000}
\begin{document}
  \begin{frame}
    \item akjdnak f 2438г0 ěčá{\sf ěýhčýáí}šě лфгк ь, {\sf ǫ a ʃ} 
  \end{frame}
\end{document}