LaTeX: Opakované piktogramy

19.06 | 17:56 | Richard | Richard

Miniblog o tom, ako rýchlo vkladať opakované obrázky alebo piktogramy do dokumentu.

1. Motivácia

Práve prekladám jeden návod k stroju, ktorý sme dodali do Srbska. Návod mám v slovenčine, písaný ešte v OpenOffice. Naštastie, nechcú po mne predklad do srbčiny, postačí im aj anglická verzia.

Všetci, ktorí robia kompikované dokumenty v *Office, vedia, že často pri posune nejakého obrázka sa "rozhádže" čast dokumentu, aj keď je obrázok napríklad prichytený k odstavcu. A tiež, že práca s dlhými tabuľkami je neveľmi príjemná. Alebo rozdelenie na virtuálne stránky (niečo ako dva stĺpce).

Ostatne to vtipne demonštruje obrázok nižšie - čo sa stane, ak užívateľ Word-u presunie obrázok 😃.

Obr. 0: Trefná ukážka vytvoreného zmätku pri presune obrázka v text. procesore


Takže je jasné, že dokument spravím v LaTeX-u. A tiež som vedel, že niektoré obrázky sa častokrát opakujú - rôzne bezpečnostné piktogramy podľa normy ISO 7010.

 

2. Ako na to?

Obrázky sa vkladajú v LaTeX-u pomocou príkazu \\ \includegraphics[width=<šírka>]{<cesta_k_príkazu>}


Ja osobne síce píšem LaTeX-ové dokumenty v org móde pre GNU Emacs, ale ten dokáže príkazy LaTeX-u i značky org navzájom kombinovať.


Takže som si vytvoril súbor my-icons.tex, ktorý (napríklad, pre poriadok) v preambule LaTeX alebo org dokumentu tzv. "nainkludujem" pomocou príkazu:
\include{<cesta_k_súboru>/my-icons.tex}


Samotný my-icons.tex vyzerá nasledovne:

\newcommand{\icoSafe}[2]{%
  \ifx\relax#2\relax %
    \def\secondargument{6ex}%
  \else
    \def\secondargument{#2}%
  \fi %
 \ifstrequal{#1}{VYKR}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_M001.pdf}}{}%
 \ifstrequal{#1}{MANUAL}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_M002.pdf}}{}%
 \ifstrequal{#1}{VYBUCH}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W002.pdf}}{}%
 \ifstrequal{#1}{BLESK}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W012.pdf}}{}%
 \ifstrequal{#1}{RESTART}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W018.pdf}}{}%
 \ifstrequal{#1}{STLAC}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W024.pdf}}{}%
 \ifstrequal{#1}{VTIAH}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W025.pdf}}{}%
 \includegraphics[width=\secondargument]{\path}%
}

\newcommand{\icoSafeMargin}[1]{%
 \ifstrequal{#1}{VYKR}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_M001.pdf}}{}%
 \ifstrequal{#1}{MANUAL}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_M002.pdf}}{}%
 \ifstrequal{#1}{VYBUCH}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W002.pdf}}{}%
 \ifstrequal{#1}{BLESK}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W012.pdf}}{}%
 \ifstrequal{#1}{RESTART}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W018.pdf}}{}%
 \ifstrequal{#1}{STLAC}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W024.pdf}}{}%
 \ifstrequal{#1}{VTIAH}{\def\path{~/.emacs.d/org-headers/ico/safety/ISO_7010_W025.pdf}}{}%
 \marginpar{\includegraphics[width=\marginparwidth]{\path}}%
}

Použitie je jednoduché:

Ak chcem vložiť piktogram do textu, zadám napríklad \icoSafe{VYBUCH}{}.


To vloží obrázok ISO_7010_W002.pdf (čo je len sólo vektorový malý obrázok, hoci uložený v PDF) s veľkosťou 6ex (6-násobok výšky písmena x).

Ak požadujem inú výšku, tak to zadám ako druhý parameter príkazu, napríklad:
\icoSafe{VYBUCH}{6cm}.


Analogicky funguje aj príkaz \icoSafeMargin. Tento vkladá obrázok na okraj textu.


Môže to vyzerať hoci aj takto:

Obr. 1: Vložené piktogramy - vľavo v tzv. minipage, vpravo až na okraji stránky


Je to veľmi rýchle a efektívne.


Ak by mal niekto záujem o tie piktogramy, stiahol som ich z https://github.com/BenSt099/isosafety.

 

3. Iné použitie

Zo srdca nemám rád situáciu, keď potrebujem do textu nejaký symbol, miniobrázok. A ten sa náchadza v nejakom fonte. A dostať font do pdflatex-u nie je úplne triviálne (musí byť v určitej adresárovej štruktúre a namapovaný v databáze(-ach)). Áno, LuaLaTeX či XeTeX to majú jednoduchšie, tam fungujú ttf fonty, ale aj tu máme problém - chceme len jeden či dva symboly, a predsa musíme mať stiahnutý celý súbor s fontami.
A čo ak je to malý obrázok, ktorý sa tiež opakuje?


Použijeme podobné riešenie. Ja osobne to robím takto (ako príklad použijem font fontawesome5 (ktorý ale mám aj nainštalovaný v LaTeX-u, ale nemám lepší poruke na ukážku):

Postup

Využijeme renderovanú stránku v PDF, v ktorej je font použitý. V LaTeX-u je dobrým zvykom, že takáto stránka s opisom fontu existuje. No ak takú nemáme, tak si znak vložíme napr. v *Office a spravíme si z neho PDF.


V programe Inkscape si PDF stránku naimportujeme do prázdneho dokumentu (Súbor→Importovať).

Obr. 2: Naimportovaná PDF stránka so znakmi


Označíme si (natiahnutím obdĺžnika) príslušný znak a zvolíme Export, pričom si zvolíme vektorový formát (SVG, PDF).


A hotovo, máme "ukradnutý znak".

Obr. 3: A vyexportovanie zvoleného znaku do iného súboru


A tento znak si niekam uložíme. Ja potom používam na vkladanie takýto kód:

\newcommand{\ico}[2]{%
  \ifx\relax#2\relax %
    \def\secondargument{1.5ex}%
  \else
    \def\secondargument{#2}%
  \fi %
 \ifstrequal{#1}{GNU}{\def\path{~/.emacs.d/org-headers/ico/gnu.png}}{}%
 \ifstrequal{#1}{CH1}{\def\path{~/.emacs.d/org-headers/ico/ch1.pdf}}{}%
 \ifstrequal{#1}{CH2}{\def\path{~/.emacs.d/org-headers/ico/ch2.svg}}{}%
 \ifstrequal{#1}{CHCK}{\def\path{~/.emacs.d/org-headers/ico/check.pdf}}{}%
 \includegraphics[width=\secondargument]{\path}%
}

Ako sa dá vyčítať z ukážky, ak zadáme napríklad:
\ico{GNU}{}, tak nám to vloží hlavu pakoňa priamo do textu. Ak má príkaz nulový 2. argument, tak jeho výška je rovná výške práve použitého textu. Ale dá sa samozrejme i nastaviť iná…


Jednoduchý príklad a jeho výstup:

Tu je vložená \ico{GNU}{} vo veľkosti textu.

Funguje to aj ak \Huge je text a \ico{GNU}{} väčší.
\normalsize

A tu \ico{GNU}{2cm} vo veľkosti 2 cm.

Obr. 4: Vložený obrázok príkazom v tele textu

 

4. Záver

Tvorba textov pomocou značkovacích jazykov je na začiatku trochu obtiažnejšia. Ale neskôr sa ukazuje ich sila a to, že robia to, čo užívateľ chce.
Vo väčšine prípadov 😉.