Starý WORD ten ťa už unavil nakoniec
…parafrázovaním Apollinaira k náhrade textového procesora.
Ako inak, pomocou GNU Emacs.
1 Ech, tie číslovania…
Priamo k veci - dostali sa ku mne na kontrolu nejaké kúpne zmluvy, ktoré mali kvantum kapitol, podkapitol, odsekov, všetko bolo číslované, vytvárané v MS WORD-e. A v niektorých číslovaniach nesedel font ani rez písma. No čo, takto som to nemohol nechať, a tak som to začal meniť, ale označiť viac rôznych úrovní číslovania naraz vo Writeri mi akosi nešlo, zmena štýlov nepomáhala…
No bez naťahovania - nejako som to spravil, ale som sa s tým zahral až až.
A ľutoval som, že som to nedostal v plaintexte, markdowne či ASCIIdoc-u.
Preto som sa rozhodol, že opíšem svoj spôsob vytvárania textových dokumentov, bez textového procesora či Latexu. Možno to bude niekoho inšpirovať. Tak ako mňa inšpiroval k tomuto príspevku aj Mirec v zápise https://linuxos.sk/blog/mirecove-dristy/detail/ako-publikujem-clanky/.
A pomôžeme si i Apollinairom, vo forme ukážok.
2 Potrebné nástroje
- GNU Emacs s Org módom (ten je zväčša pribalený k Emacsu),
- wkhtmltopdf - renderer html súborov do PDF,
- mupdf alebo iný ľahký prehliadač PDF.
Takže žiadny Latex. Viem, že org má i exporty do latexu, ale k tomu sú potrebné dodatočné knižnice; pričom plná inštalácia môže mať i 6 GB (ak chceme podporu všetkého možného).
Už z toho je jasné, že princíp je nasledovný:
- tvorba textového (plain) dokumentu v Org móde,
- vytvorenie CSS šablóny,
- export do html,
- prehnanie html cez wkhtmltopdf,
- a zobrazenie…
Samozrejme, nie sústavou príkazov, ale len šikovnými funkciami v eLisp-e.
3 Org mód pre GNU Emacs
O Org móde existuje kvantum dokumentov, návodov i rozšírení (napr. rýchly cheatsheet). Pre naše potreby nám ale stačí vedieť, že umožňuje, okrem iného, tvorbu štruktúrovaných a formátovaných textov. Nebudeme strácať čas opisom jeho využitia na vedenie agendy, osobnej wiki či „literárneho“ programovania.
Proste opíšem, čo z neho využívam pre túto činnosť (aj keď ho používam i vo väčšom rozsahu).
3.1 Takže začnime s hlavičkou
Hlavička nášho súboru je sústava parametrov a makier zabalená medzi :HEADER SETTINGS: a :END:. Takto definovaný drawer sa neexportuje, a dá sa vizuálne zbaliť, aby nám nezavadzal a nerozptyľoval nás.
:HEADER_SETTINGS: #+OPTIONS: toc:nil #+OPTIONS: author:t email:t creator:nil timestamp:nil html-postamble:nil #+AUTHOR: Richard #+EMAIL: @ #+HTML_HEAD: <link rel="stylesheet" type="text/css" href="../css/konzola.css" /> #+MACRO: color @@html:<font color="$1">$2</font>@@ #+MACRO: big @@html:<font size="$1">$2</font>@@ #+MACRO: center @@html:<center>$1</center>@@ #+TITLE: Starý WORD, ten ťa už unavil nakoniec :END:
Len v skratke uvediem, že +OPTIONS: toc definuje, či sa bude exportovať aj obsah vytvorený zo štruktúrovaných úrovní. HTML_HEAD pridáva, čo len chcem, do hlavičky vyexportovaného html súboru, takže v mojom prípade cestu k CSS súboru, nech to nejako vyzerá.
MACRO poznáme z kdejakých programovacích jazykov - aj tu robí to isté. Vytvorí kvázi funkciu, ktorá sa "rozbalí" pri exporte; konkrétne makro
{{{big(32, Poriadne veľký text)}}}
vloží do html súboru toto
<font size="32">Poriadne veľký text</font>
3.2 Úrovne textu (kapitoly)
…sa definujú pomocu znaku *. Úrovne sa dajú povyšovať, ponižovať, presúvať, baliť (vizuálne) či expandovať. Tým i veľmi dlhý text je stále prehľadný. Takže konkrétne:
* Tvorba - Alkoholy - Kaligramy - Tiréziove prsníky ** Alkoholy Obsahujú slávnu báseň /Pásmo/
Vyrenderované to môže vyzerať takto (font Iosevka Term):
3.3 Fonty, rezy, číslovanie, odrážky
Fonty sú definované pre každú úroveň v CSS súbore, napr.
body { font-family: "Iosevka Term"; padding:1em; margin:auto; background:#ffffff; font-size: 22px; } h1, h2, h3, h4, h5, h6 { font-weight: bold; } h1 { color: #000000; font-size: 40px; }
Samozrejme, pomocou spomínaného makra je možné robiť i CSS-ku protivenstvá:
#+MACRO: color @@html:<font color="$1">$2</font>@@
alebo priamo vložením do textu
@@html:<font color="red">ČERVENÁ</font> text@@
Špecialitou je vkladanie kódu alebo formátovaného textu, ktoré sa robí direktívou:
#+BEGIN_SRC #+END_SRC
pričom #+BEGIN_ SRC môže mať podobu
#+BEGIN_SRC emacs-lisp #+BEGIN_SRC ruby #+BEGIN_SRC python … alebo aj #+BEGIN_SRC verse
Takže jedna z najkrajších pasáži Apollinairovho pásma uzavretá v direktíve verse:
Si v krčme pri Prahe a sedíš na terase Máš ruku na stole a tešíš sa jej kráse A miesto aby si opísal rozprávku pozoruješ nemo Chrobáka čo si v ruži zdriemol
Spomínaný blok sa dá rýchlo vložiť pomocou <s.
Rezy sa pri editácii, podobne ako v markdowne, definujú uzatvorením textu to znakov:
znak | rez |
---|---|
* | tučný |
_ | podčiarknutý |
= | preškrtnutý |
~ | kód |
^ | horný index |
_ | dolný index |
Prípadne ich kombináciou, takže toto spraví príšernosť:
*/_Tučný šikmý a podčiarknutý text súčasne. Nevkus z dôb počiatkov WYSIWYG editorov ☺_/*
Tučný šikmý a podčiarknutý text súčasne. Nevkus z dôb počiatkov WYSIWYG editorov ☺
Odrážky sa definujú znakom + alebo -.
Číslovanie neprekvapivo číslicami. Viac: https://orgmode.org/manual/Plain-Lists.html
Len na okraj, číslovať sa dá od ľubovoľného čísla, alebo automaticky pokračovať v predchádzajúcom číslovaní.
3.4 Tabuľky
…hmmm, tak toto je obrovská sila org módu. Pomocou niekoľkých znakov sa dajú tabuľky vytvárať, pričom sa dynamicky mení veľkostí buniek podľa vloženého obsahu, alebo podľa zadanej šírky. Jednoduché vkladanie riadkov, stĺpcov, zlučovanie i delenie buniek. Formátovanie čísel. A - najväčšia sila - možnosť vkladania vzorcov, odkazov na iné tabuľky…
Malá ukážka:
| p.č. | dielo | rok | |------+-----------+------| | 1 | Pásmo | 1912 | | 2 | Alkoholy | 1913 | | 3 | Kaligramy | 1918 |
a jej vyrenderovanie (samozrejme, všetko závisí od CSS):
Viac napovie video, kde vidno, ako sa tie tabuľky tvoria, dynamicky upravujú a pod: https://www.youtube.com/watch?v=5vGGgfs0q3k
Malá ukázka práce so vzorcami:
#+TBLNAME: Tabuľka so vzorcami | p.č. | ozn. | nákup | predaj | zisk | |------+------+-------+--------+------| | 1.0 | A | 1500 | 1600 | 100 | | 2.0 | B | 2200 | 2530 | 330 | |------+------+-------+--------+------| | TOT | | 3700 | 4130 | 430 | #+TBLFM: $5=$4-$3;%.0f :: @>$3=vsum(@2..@-1);%.0f :: @>$4=vsum(@2..@-1);%.0f #+TBLFM: @>$5=vsum(@2..@-1);%.0f
Riadky sa označujú pomocou @, stĺpce pomocou $, ale funguje i zápis v štýle B3
Ak by sme sa stratili, pomocou C-c } je možné zobraziť čísla riadkov a stĺpcov.
Toľko hádam stačí, ostatne tento článok chce len ukázať možnosti, a teda nie je návodom.
3.5 Obrázky, odkazy
Vložiť obrázok sa dá zadaním jeho cesty, napr.:
https://famme.sk/blog-obr/stary_word/02-kaligram.jpg
Čo spraví nasledovné:
Pomocou #+CAPTION: je možné zadať jeho opis, pričom sa môže i automaticky číslovať.
Hyperlinky sa vkladajú napríklad C-c C-l, pričom sme vyzvaní k zadaniu typu a cesty a následne k ich opisu. Samozrejme, ide to aj vložením html kódu.
Alebo v štýle markdownu:
[[https://famme.sk/blog-obr/stary_word/index.html][Nejaký link]]
4 Export
Samotný org dokáže natívne exportovať do html, odt či čistého textu.
Na Latex potrebuje dodatočné inštalované programy, na obrázku viditeľný slimhtml je dodatočné rozšírenie, ak výsledný generovaný html kód má byť jednoduchší. Na obrázku vidno rozdiely:
Kedže v Emacse platí, že všetko je príkaz, šikovným reťazením si v eLisp-e spravíme jednoduchú funkciu:
01 (defun make-pdf-from-org (&optional arg) 02 "Make PDF and display it" 03 (interactive) 04 (org-html-export-to-html) 05 (setq fnazov (file-name-sans-extension (buffer-name))) 06 (setq flist (format "%s" fnazov)) 07 (shell-command (concat "sed -i 's/Poznámky/Poznámky/g' " (dired-replace-in-string "[(|)]" "" flist) ".html")) 08 (shell-command (concat "sed -i 's/Obrázok/Obrázok/g' " (dired-replace-in-string "[(|)]" "" flist) ".html")) 09 (shell-command (concat "wkhtmltopdf " (dired-replace-in-string "[(|)]" "" flist) ".html out.pdf")) 10 (shell-command (concat "mupdf out.pdf >/dev/null 2>&1 &")) 11 (kill-buffer "*Shell Command Output*") 12 (delete-other-windows))
Stručný opis:
riadok | funkcia |
---|---|
01 | definovanie názvu |
02 | a opis pre vstavanú nápovedu |
03 | funkcia má byť volateľná aj z menu M-x |
04 | zavoláme funkciu ORG-u, ktorá nám vygeneruje html |
05 | zistíme názov bufferu (okna) s v ktorom sme spustili našu funkciu |
06 | a prevedieme ho na reťazec |
07 | pomocou sed-u nahradíme text "Poznámky" za "Poznámky" |
08 | a podobne "Obrázok" → "Obrázok" |
09 | zavoláme program "wkhtmltopdf" a vytvoríme súbor "out.pdf" |
10 | ktorý si zobrazíme |
11 | zavrieme buffer s výstupom shellu |
12 | a zväčšíme si naše editačné okno naspäť na plnú veľkosť |
A ešte si zadefinujeme klávesovú skratku:
(global-set-key [f9] 'make-pdf-from-org)
Zrejme by sme si namiesto sed-u mohli vymyslieť funkciu priamo v eLisp-e, čo je motivácia na zlepšenie ☺.
V princípe ide o to, že vygenerovaný html kód ma v prípade použitia poznámok pod čiarou či automatického číslovania obrázkov tento anglický názov (Poznámky resp. Obrázok).
Iným riešením by bolo modifikovať samotný eLisp-ový kód org-u (prepísať samotné reťazce), a následne ho preložiť.
Nie je to zásadný problém.
5 Záver
GNU Emacs poskytuje úžasné možnosti a už aj samotná editácia textu, aj bez kdejakých pridaných barličiek, je potešením. Keď potom človek zablúdi do nejakého *officu, cíti sa, ako keby mal jednu ruku priviazanú za chrbtom.
A toto je spôsob, ako si užívať jeho prednosti, aj keď sa vyžaduje formátovaný text. Napr. ja mám spravených množstvo obchodných ponúk, osobnú wiki či evidenciu záväzkov a pohľadávok.
Hm, nakoniec sme toho Apollinaria až tak nevyužili, hlavne preto, že som pri písaní okresal pôvodný rozsah. Opisovať samotný Emacs alebo org, na to treba veľa času a blogov. A hlavne - takých na webe niekoľko existuje.
Samotný zdrojový text tohto príspevku (v org) je k dispozícii tu: org súbor
A export do pdf tu out.pdf
Pre pridávanie komentárov sa musíte prihlásiť.
tolik prace a pritom... a co to vlastne robi...?
mimochodom to vystupne pdf je des.
No vidíš, a mne sa to pdfko páči, taký retro strojový štýl,,,
Za ten retroface môže Iosevka Term a absencia farieb, keď čiernu nebudeme vydávať za farbu :)
Tiež sa mi to páči.
Po použití iného CSS môže byť výstup takýto:
out2.pdf
alebo
out3.pdf
Alebo úplne iný, podľa fantázie a vkusu.
Paráda a už máte v Emacse aj editor :)
Výborne sa to číta, už teraz sa teším na ďalší blog.
Keby len editor, ale aj (kvázi) textový procesor.
RMS by bol/je šťastný.
Pre mňa je podstatné automatické doplňovanie.
Natrafil som na auto-complete a company-mode, čo používaš ty a prečo? A ako dobre/zle to funguje?
Používam auto-complete. Jediné nastavenia tam mám tieto:
Funguje to dobre - ak považujeme za dobre, že doplňuje iba z predtým zadaných slov.
Existuje tiež spôsob pridania slovníkov
A používam ho preto, že som ho používal od začiatku, vtedy company-mode ešte nebol (ten bol až od Emacsu v. 24).
Ale zrejme jedno či druhé je o tom istom.
Ja teraz dosť drtím Python, používaš autocomplete s nejakým programátorským jazykom, že sa vie pozrieť aj do modulov a doplní syntax?
Ja programujem v C, bash, Wiring (toto hodne pre IndustrialShields PLC), občas tcl/tk.
Auto-complete do modulov pozrieť nevie. Možno nejaké iné rozšírenie.
Ja mám na svoje veci porobené snippety (používam Yas-Snippet).
Posledné jednoúčelové IDE, ktoré som používal pred Emacsom, bol Lazarus, a áno, ten bol v tomto super - nahral sa modul a už predikoval syntax a údajové typy).
Heh na Lazarus si pamätám, tak som naň mrkol a stále sa vyvíja. OK na ten Emacs ešte mrknem aké su k nemu rozšírenia.
Hej, kdejaký vyhľadávač nájde dosť info k Emacsu a pythonu.
Taký Brainfuck až taký populárny nie je.
Ja používam jedi. Na pure python moduly funguje celkom dobre.
Jj, ten mi tiež vypadol z vyhľadávača emacs-jedi, dík.