LaTeX na jekyll blogu bez javascriptu
[Edit]Existuje nepřeberné množství možností, jak implementovat deriváty u na Vaši webovou stránku. Vyzkoušel jsem jich mnoho, ale bohužel žádná z nich nesplňovala mých 10 požadavků:
- Podporuje
- Implementovatelné do Jekyllu
- Nevyužívá JavaScript na straně klienta
- Nenačítá žádné externí zdroje
- Využívá pouze OpenSource software
- Je možné používat
$$
notaci - Rozlišuje Inline a Display režimy
- Pokud post neobsahuje žádné matematické výroky, tak stránka zbytečně nenačítá k tomu potřebné zdroje
- Nahlásí chyby v latexovém výroku už při renderování
- Možnost nastavit a používat globální macra
Řešení
Napsat vlastní Jekyll plug-in, který pomocí KaTeXu, vyrenderuje LaTeXové výrazy na matematické výroky. Využitím Jekyllovských hook eventů mohu upravit vyrenderované HTML před jeho uložením. Ve vyrenderovaném HTML pomocí regexů najdu LaTeXové výroky a nahradím je vyrederovanými.
Tutorial
1) Reference
Stáhněte si nejnovější verzi KaTeXu. Jediné soubory co budete potřebovat jsou katex.min.css
a katex.min.js
. katex.min.js
ale stačí jen lokálně, a nemusí být na serveru vůbec nahraný). Proto doporučuji přidat do _config.yml
exclude pravidlo:
Každý post obsahující LaTeXové výroky, musí ve svém headru obsahovat následující kód:
Pokud chcete LaTeX použít ve vašem postu, stačí nastavit v front matter postu:
nebo globálně v _config.yml
. Globální nastevení ale nedoporučuji pokud Vaše stránka neobsahuje matematické výrazy v každém postu, protože by zbytečně načítala k tomu potřebné zdroje.
2) Instalace execjs gemu
Lokální instalace
Pokud je Váše Jekyllová stránka sestavená jako Ruby Gem, stačí Vám přidat závislost gem 'execjs'
do Vašeho Gemfile
. Pak už jen stačí spustit bundle update
v kořenové složce Vaší Jekyllové stránky.
Globální instalace
Ta je poněkud jednodušší. Stačí nainstalovat gem execjs
následujícím příkazem:
3) Jekyll plug-in
Ve složce _plugins/
vytvořte .rb
soubor do ve kterém napíšeme náš plugin. Můj se jmenuje katex.rb
. Samotný kód pluginu je:
Jediné co musíte udělat je nastavit proměnou PATH_TO_JS
na cestu k souboru katex.min.js
.
Příklady použití
Oba režimy mají stejnou notaci. O tom který se použije rozhoduje Kramdown. Latexový výraz, který bude na samostatném řádku se vyrenderuje v Display režimu a všechny ostatní v inline režimu.
Pokud Kramdown narazí na samostatný breakline znak uprostřed textu, smaže ho a celý text slije do jednoho odstavce. Proto pokud chcete opravdu zalomit řádek, musíte použít dva breakline znaky.
Inline režim
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse et molestie quam.
Display režim
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Suspendisse et molestie quam.
Macra
Pro nastavení globálních macer, stačí v _config.yml
vytvořit list definic:
V tomto příkladě jsme nastavili:
\RR
na\NN
na\ZZ
na
Známé chyby
- Regex nedetekuje všechny výroky - SOLVED - Kramdown občas přidal do výroku
CDATA
tag, který obsahoval break line znak. Opraveno odstraněnímCDATA
tagu před renderováním. - Načítání macer ignoruje
--config
option - SOLVED - Místo přímého načítání ze souboru (Jekyll.configuration({})["latex-macros"]
) načítám z Jekyllovké cache (site.config["latex-macros"]
). - Latexový výrok musí být na jeden řádek, aby byl regexem detekován - SOLVED - opraveno multiline flagem (
/m
) - Exejs je velmi pomalý (cca 350 výroků za minutu)
- Pokud Latexový výrok zalomíte tak aby jako první znak na řádku bylo
+
nebo-
, Kramdown vytvoří list
Poděkování
Chtěl bych poděkovat mému dobrému kamarádovi Tomáši Slámovi za článek Typesetting math with LaTeX in Jekyll, který byl pro ten můj důležitým zdrojem.