Starý WORD ten ťa už unavil nakoniec

13.05 | 12:09 | Richard | Richard

…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

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ý:

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:

znakrez
*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:

riadokfunkcia
01definovanie názvu
02a opis pre vstavanú nápovedu
03funkcia má byť volateľná aj z menu M-x
04zavoláme funkciu ORG-u, ktorá nám vygeneruje html
05zistíme názov bufferu (okna) s v ktorom sme spustili našu funkciu
06a prevedieme ho na reťazec
07pomocou sed-u nahradíme text "Poznámky" za "Poznámky"
08a podobne "Obrázok" → "Obrázok"
09zavoláme program "wkhtmltopdf" a vytvoríme súbor "out.pdf"
10ktorý si zobrazíme
11zavrieme buffer s výstupom shellu
12a 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

    • RE: Starý WORD ten ťa už unavil nakoniec 13.05 | 15:35
      Avatar samalama   Návštevník

      tolik prace a pritom... a co to vlastne robi...?

    • RE: Starý WORD ten ťa už unavil nakoniec 13.05 | 18:40
      Avatar okl   Návštevník

      mimochodom to vystupne pdf je des.

      • RE: Starý WORD ten ťa už unavil nakoniec 13.05 | 19:33
        Avatar Pavel KDE neon, Q4OS TDE  Administrátor

        No vidíš, a mne sa to pdfko páči, taký retro strojový štýl,,,

        • RE: Starý WORD ten ťa už unavil nakoniec 13.05 | 21:31
          Avatar bedňa LegacyIce-antiX  Administrátor

          Za ten retroface môže Iosevka Term a absencia farieb, keď čiernu nebudeme vydávať za farbu :)

          Tiež sa mi to páči.

          Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
          • RE: Starý WORD ten ťa už unavil nakoniec 14.05 | 12:27
            Avatar Richard Antix  Používateľ

            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.

    • RE: Starý WORD ten ťa už unavil nakoniec 13.05 | 21:34
      Avatar bedňa LegacyIce-antiX  Administrátor

      Paráda a už máte v Emacse aj editor :)

      Výborne sa to číta, už teraz sa teším na ďalší blog.

      Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
      • RE: Starý WORD ten ťa už unavil nakoniec 14.05 | 12:29
        Avatar Richard Antix  Používateľ

        Keby len editor, ale aj (kvázi) textový procesor.

        RMS by bol/je šťastný.

        • RE: Starý WORD ten ťa už unavil nakoniec 15.05 | 12:24
          Avatar bedňa LegacyIce-antiX  Administrátor

          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?

          Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
          • RE: Starý WORD ten ťa už unavil nakoniec 15.05 | 18:32
            Avatar Richard Antix  Používateľ

            Používam auto-complete. Jediné nastavenia tam mám tieto:

            (setq ac-auto-start 3)
            (setq ac-sources '(ac-source-dictionary ac-source-words-in-same-mode-buffers))

            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

            (add-to-list 'ac-dictionary-directories "~/.emacs.d/elisp/ac-dict")

            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.

            • RE: Starý WORD ten ťa už unavil nakoniec 15.05 | 19:11
              Avatar bedňa LegacyIce-antiX  Administrátor

              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?

              Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
              • RE: Starý WORD ten ťa už unavil nakoniec 16.05 | 09:47
                Avatar Richard Antix  Používateľ

                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).

                • RE: Starý WORD ten ťa už unavil nakoniec 16.05 | 15:12
                  Avatar bedňa LegacyIce-antiX  Administrátor

                  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.

                  Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
                  • RE: Starý WORD ten ťa už unavil nakoniec 16.05 | 17:47
                    Avatar Richard Antix  Používateľ

                    Hej, kdejaký vyhľadávač nájde dosť info k Emacsu a pythonu.

                    Taký Brainfuck až taký populárny nie je.

                     

              • RE: Starý WORD ten ťa už unavil nakoniec 17.05 | 12:15
                Avatar Miroslav Bendík Gentoo  Administrátor

                Ja používam jedi. Na pure python moduly funguje celkom dobre.

                • RE: Starý WORD ten ťa už unavil nakoniec 17.05 | 12:50
                  Avatar bedňa LegacyIce-antiX  Administrátor

                  Jj, ten mi tiež vypadol z vyhľadávača emacs-jedi, dík.

                  Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org