Pracujeme s TeX4ht

Michal Hoftich

21. listopadu 2013

Obsah

1 Úvod
2 Proč TeX4ht?
 2.1 Na co konfigurace?
3 Proč
4 Čeština
5 Konfigurace balíčků
Odkazy

1 Úvod

V článku na Abclinuxu.cz pan Olšák (2013) popisuje konverzi TEXového souboru na html. Pod článkem se rozeběhla zajímavá debata nejen o nejlepším způsobu konverze (La)TEXu, ale také obecně o tom jestli má smysl psát dokumenty v TEXu, nebo spíše v nělterém značkovacím jazyce, ať již je to některý dialekt xml, nebo třeba Markdown.

Protože mám jisté zkušenosti s používáním TeX4ht1, rozhodl jsem se vytvořit krátký článek o jeho používání s češtinou a kódováním utf-8. V článku také ukážu použití některých balíčků, například biblatex, glossaries, nebo minted.

Zdrojové kódy tohoto článku jsou dostupné na Githubu.

2 Proč TeX4ht?

TeX4ht se vyvíjí od druhé poloviny 90. let, v podstatě jako dílo jediného autora, Eitana Gurariho. Tento autor bohužel před několika lety zemřel a v současnosti patrně není nikdo, kdo by se v kódu plně orientoval a vývoj mírně řečeno stagnuje.

Na druhou stranu, v současnosti je nejlepším konvertorem z LATEXu a poskytuje funkční infrastrukturu pro konfigurací libovolných maker. V současnosti je na tvůrcích balíčků nebo jejich uživatelích, aby poskytovali tyto konfigurace, není v reálných silách současných správců, aby tvořili konfigurace pro všechny balíčky.

2.1 Na co konfigurace?

Bez konfigurací bychom nezískali logické značkování, postprocesor tex4ht sice vytvoří výstupní soubory, ale ty by obsahovaly jen vizuální formátování získané z dvi souboru, bez jakékoliv logické struktury (nadpisy, seznamy, odkazy).

Proto TeX4ht obsahuje mechanismus .4ht souborů, které jsou automaticky nahrávané spolu s balíčkem téhož jména a kde jsou umístěné redefinice některých maker, aby bylo možné je konfigurovat. Více informací v sekci 5

3 Proč

4 Čeština

Mejme hypotetický článek pro XeLATEX, který se budeme snažit přeložit s TeX4ht:

  \documentclass{article}
  \usepackage{fontspec}
  \setmainfont{Linux Libertine O}
  \begin{document}
  Příliš žluťoučký kůň úpěl \textit{ďábelské ódy}.
  Vyzkoušíme si také ligatury: grafika, finance, ffi.
  
  \end{document}

TeX4ht obsahuje množství skriptů pro překlad dokumentů. Nejběžnější je htlatex, který překládá dokument čístým LATEXem. Protože máš dokument je určený pro XeLATEX, můžeme zkusit variantu tohoto skriptu, htxelatex.

  htxelatex priklad1

Kompilace se zastaví s chybovou hláškou

! LaTeX Error: Command ‘\acute’ already defined in ‘’.

To nám naznačuje, že něco není v pořádku. Podobných hlášek se objeví více, můžete zmáčkout klávesu r a enter pro pokračování kompilace bez přerušení. Kompilační skripty překládají dokument 3×. Je to kvůli správnému fungování odkazů, TeX4ht ukládá při každém průchodu informace o odkazech do pomocných souborů, tento mechanismus funguje podobně jako \label - \ref mechanismus v LATEXu.

Po třech průchodech LATEXem přichází zpracování výstupního dvi souboru postprocesorem tex4ht. Zde vidíme další chybovou hlášku:

(--- xdv font = [/home/mint/.fonts/LinLibertine_R.otf] (not implemented) ---)  
--- warning --- Couldn’t find font ‘[/home/mint/.fonts/LinLibertine_R.otf].ht

Naneštěstí, chyba v postprocesoru tex4ht znemožňuje použití opentype fontů, pokud si otevřete výsledný html soubor priklad1.html, neobjeví se žádný text. Chybové hlášky při překladu LATEXem byly způsobené balíčkem fontspec. Jak řešit tuto situaci? Máme v zásadě dvě možnosti:

  1. Upravit náš dokument tak, aby nepoužíval fontspec a opentype fonty při běhu TeX4ht
  2. Použít experimentální verzi balíčku fontspec. Ukázkový dokument.

Druhá možnost je lehce experimentální, ukážeme si tedy první.

TeX4ht se snaží, jak je to jenom možné, aby autor nemusel upravovat zdrojové kódy dokumentů. Někdy je to ale jediná možnost, jak zabránit načtení balíčků, které zprůsobují problémy při kompilaci s TeX4ht.

Pro zjištění, jestli je dokument kompilován s TeX4ht, můžeme použít konstrukci:

  \ifdefined\HCode
     Kod urceny pro TeX4ht
  \else
     Kod urceny pro prevod do PDF
  \fi

Makro \HCode je definováno TeX4ht a slouží k vkládání XML kódů do dokumentu.

Nyní náš dokument vypadá takto:

  \documentclass{article}
  \ifdefined\HCode
  \usepackage[utf8]{inputenc}
  \usepackage[T1]{fontenc}
  \else
  \usepackage{fontspec}
  \setmainfont{Linux Libertine O}
  \fi
  \begin{document}
  Příliš žluťoučký kůň úpěl \textit{ďábelské ódy}.
  Vyzkoušíme si také ligatury: grafika, finance, ffi.
  
  \end{document}

Místo htxelatexu nyní můžeme použít obyčejný htlatex, protože dokument neobsahuje žádná makra vyžadující ke svému běhu XeTEX.

  htlatex priklad2

Text výsledného dokumentu vypadá takto:

Příliš žlutoučký kůň úpěl  
<span class="ecti-1000">&#x010F;</span><span  
class="ecti-1000">ábelsk</span><span  
class="ecti-1000">é </span><span  
class="ecti-1000">ódy</span>. Vyzkou&#353;íme si také ligatury: grafika,  
finance, ffi.

Jak je vidět, není výsledek úplně hezký, některé akcentované znaky byly nahrazené html entitami, ostatní jsou v kódování latin-2.

TeX4ht umí dokument uložit v kódování utf-8, jen je třeba přidat několik parametrů:

htlatex priklad2 "xhtml, charset=utf-8" " -cunihtf -utf8"

Tento ošklivý příkaz se skládá ze tří částí:

priklad2
Název souboru
"xhtml, charset=utf-8"
parametry pro baliček TeX4ht. První parametr označuje document type dokumentu, nebo konfigurační soubor (o těch si povíme více později), charset=utf-8 určuje, jaké kódování bude uvedenév html souboru. Tato volba ovšem nezaručuje, že soubor v kódování utf8 skutečně bude!

Kompletní seznam možných parametrů je možné najít na blogu CV Radhakrishnana.

" -cunihtf -utf8"
parametry pro program tex4ht, určují, že bude výsledný soubor uložen v kódování utf8. Všimněte si mezery za uvozovkou, musí tam být.

Text nyní vypadá takto:

Příliš žluťoučký kůň úpěl <span  
class="ecti-1000">ď</span><span  
class="ecti-1000">ábelsk</span><span  
class="ecti-1000">é </span><span  
class="ecti-1000">ódy</span>. Vyzkoušíme si také ligatury: grafika,  
finance, ffi.

Tím jsme vyřešili problém s kódováním znaků, ale stále jsou tu další problémy. Některá slova jsou rozdělená mezi několik elementů <span> a text obsahuje ligatury2.

Tyto dva problémy nění snadné vyřešit čistě jenom v prostředí TeX4ht, což byl jeden z důvodů, proč jsem vytvořil make4ht. S pomocí tohoto nástroje můžete jednak zjednodušit předávání argumentů htlatexu, a můžete využít různé filtry, které umožňují vyčistit vygenerované soubory od nadbytečných elementů <span> nebo ligatur.

Vytvoříme si make soubor, se stejným názvem jako TEXový dokument, jenom s příponou .mk4. V našem případě priklad3.mk4:

  local filter= require "make4ht-filter"
  local process = filter{"cleanspan""fixligatures"}
  Make:match("html$",process)

V tomto případě využíváme pouze filtry. Build soubory pro make4ht jsou skripty v jazyce LUA, takže můžeme využít standardních funkcí jako je require pro nahrání knihovny make4ht-filter. Tato knihovna vrací funkci, která vytváří další filtrovací funkce. V našem případě vytváříme filtrovací funkci process, která obsahuje dva filtry – cleanspan pro sloučení nadbytečných elementů <span> a fixligatures pro rozdělení ligatur. S pomocí funkce Make:match pak aplikujeme tuto filtrovací funkci na všechny vygenerované soubory s příponou html. Další dostupné filtry a funkce make4ht jsou popsané na stránkách projektu.

Překlad dokumentu je podstatně jednodušší:

make4ht -u priklad3

A výsledek:

  <!--l. 10--><p class="noindent" >Příliš žluťoučký kůň úpěl <span class="ecti-1000">ďábelské ódy</span>. Vyzkoušíme si také ligatury: grafika,
  finance, ffi.
  </p>

5 Konfigurace balíčků

Odkazy

Olšák, Petr (2013). „TeX – 5 (příklad makra pro generování HTML)“. In: AbcLinuxu.cz. URL: http://www.abclinuxu.cz/clanky/tex-5-priklad-makra-pro-generovani-html.

1Tvořím jednoduchý build systém make4ht a od něj odvozený tex4ebook pro přímou konverzi TeXu do formátů pro čtečky e-booků

2To z technických důvodů není ve výpisu vidět, ale můžete se podívat sami: priklad2.html