2016-05-24

LaTeX -> EPS, PNG, SVG

Czasami zachodzi potrzeba wyeksportowania pewnych elementów stworzonych w LaTeX-u (np. formuł matematycznych lub grafik wykonanych za pomocą pakietu tikz) do formatów graficznych takich jak EPS, PNG, SVG. Po co? Najczęściej po to, aby umieścić je na stronie WWW (chociaż do umieszczania formuł matematycznych na stroniach WWW polecam MathJAX) lub zaimportować do innego programu. Poniżej zamieszczam opis sposobu jak wychodząc z jednego pliku TeX otrzymać wiele plików EPS, PNG, SVG.

Krok 1 – przygotowanie pliku LaTeX-owego – nazwijmy go roboczo plik.tex. Ważnym jest aby każdy element, który ma w wyniku dać plik graficzny, znajdował się na oddzielnej stroni PDF-a powstałego po kompilacji. Jeśli w pliku TeX znajdują się tylko elementy do przetworzenia, możemy w kodzie oddzielić je po prostu za pomocą \newpage; na przykład:

\documentclass[12pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}

\pagestyle{empty}

\begin{document}

$$a^2 = b^2 + c^2$$

\newpage

$$E = m c^2$$

\newpage

\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}

\end{document}

Możemy też użyć pakietu preview, który, gdy aktywny (parametr active), z wyjsciowego PDF-a wycina nam wszystko z wyjątkiem zdefiniowanych środowisk – w poniższym przykładzie są to eksponowane środowiska matematyczne (czyli $$…$$, displaymath, equation; użyty parametr displaymath) oraz środowisko tikzpicture (użyte polecenie \PreviewEnvironment{tikzpicture}).

\documentclass[12pt]{article}
\usepackage[utf8x]{inputenc}
\usepackage[T1]{fontenc}
\usepackage{tikz}
\usepackage[active,displaymath]{preview}
\PreviewEnvironment{tikzpicture}

\begin{document}

To jest ważny wzór
$$a^2 = b^2 + c^2$$
Ten wzór też jest ważny
$$E = m c^2$$
ale ten $x^2=1$ już nie.

A to taki tam obrazek

\begin{tikzpicture}
\draw[->] (0,0) -- (1,1);
\end{tikzpicture}

\end{document}

Plik plik.tex kompilujemy do pliku plik.pdf, który będzie bazą dla następnych operacji.

Krok 2 – skrypt bash – nazwijmy go roboczo skrypt.sh.

#!/bin/bash

pdfcrop $1
mv `basename $1 .pdf`-crop.pdf $1
pdftk $1 burst
rm doc_data.txt

for i in pg_*.pdf
do
j=`basename $i .pdf`
pdftops -eps $i $j.eps
convert -density 150 -background transparent $i $j.png
pdf2svg $i $j.svg
rm $i
done

Skrypt uruchamiamy podając jako parametr nazwę utworzonego wcześniej pliku PDF:

./skrypt.sh plik.pdf

Co robi powyższy skrypt? Objaśnienie linia po linii:
  • pdfcrop $1 — przycina ładnie każdą stronę pliku plik.pdf (aby usunąć nadmiarowe marginesy wokół np. równań) i zapisuje wynik do pliku plik-crop.pdf
  • mv `basename $1 .pdf`-crop.pdf $1 — zmienia nazwę pliku plik-crop.pdf na plik.pdf
  • pdftk $1 burst — dzieli plik plik.pdf na pliki zawierające po jednej stronie; powstają wtedy pliki pg_0001.pdf, pg_0002.pdf, itd.
  • rm doc_data.txt — ponieważ pdftk tworzy nam niepotrzebny plik doc_data.txt — usuwamy go
  • for i in pg_*.pdf — tu mamy początek pętli po wszystkich plikach pg_0001.pdf, pg_0002.pdf, itd.
  • j=`basename $i .pdf` — wyodrębniamy rdzeń nazwy bez rozszerzenia, który będzie potrzebny przy nazywaniu następnych plików
  • pdftops -eps $i $j.eps — konwertujemy pliki pg_0001.pdf, pg_0002.pdf, itd. do plików pg_0001.eps, pg_0002.eps, itd. (uwaga! zamiast pdftops można też użyć ghostscripta jak kto woli)
  • convert -density 150 -background transparent $i $j.png — konwertujemy pliki pg_0001.pdf, pg_0002.pdf, itd. do plików pg_0001.png, pg_0002.png, itd. (parametry konwersji: przezroczyste tło i dpi=150)
  • pdf2svg $i $j.svg — konwertujemy pliki pg_0001.pdf, pg_0002.pdf, itd. do plików pg_0001.svg, pg_0002.svg, itd.
  • rm $i — usuwamy niepotrzebne już teraz pliki pg_0001.pdf, pg_0002.pdf, itd.

That's all folks!

Brak komentarzy:

Publikowanie komentarza