Hotové riešenie markdown2pdf so zdrojovým kódom pre Linux

Úvod

Markdown je skvelý spôsob, ako napísať malý článok, a niekedy aj dostatočne rozsiahly text, s jednoduchým formátovaním vo forme kurzívy a tučného písma. Markdown je tiež dobrý na písanie článkov s údajmi zo zdrojového kódu. Niekedy však chcete bez strát a tancovania s bubnom previesť ho na bežný, dobre formátovaný PDF súbor, a aby neboli problémy pri konverzii, aké som mal ja — nemôžete písať po rusky v komentároch zdrojového kódu, príliš dlhé riadky sa nepresúvajú, ale sú orezané a iné drobné problémy. Tento návod rýchlo nastaví prevodník md2pdf ani veľmi nevenujúc pozornosť tomu, ako to funguje. Skript na viac-menej automatickú inštaláciu je nižšie v príslušnej časti.

Môj príklad TeX šablóny na konverziu používa balík písiem PSCyr, ktorý zahŕňa podporu Microsoft písiem, konkrétne Times New Roman. Takéto boli požiadavky na diplom podľa GOST. Ak viete, môžete šablónu prispôsobiť svojim potrebám. V mojom návode sa však bude musieť najprv trochu babrať s nastavením PSCyr v TexLive. Nastavenie prebieha v distribúcii Linux Mint Mate, pre iné distribúcie možno bude potrebné pohľadať štandardné adresáre balíka TexLive pre vašu systém.

Inštalácia TexLive

Samozrejme, môžete nainštalovať len potrebné časti tohto balíka. Ale osobne som mal otvorene lenivosť hľadať minimálne potrebnú pracovnú inštaláciu. Aby všetko presne fungovalo, nainštalujeme celý balík TexLive. Nazýva sa texlive-full a má o niečo viac ako 2 gigabajty, majte tento fakt na pamäti. Vykonajte príkaz:

user@hostname:~$ sudo apt install texlive-full -y

Po dosť dlhšej inštalácii môžeme prejsť k nasledujúcemu bodu.

Inštalácia konvertora Pandoc

Pandoc je balík Linuxu, ktorý umožňuje prevádzať niektoré textové formáty na iné. Má veľa zaujímavých funkcií, s ktorými sa môžete oboznámiť sami na internete. Nás však zaujíma iba možnosť prevodu markdown súboru na PDF. Skontrolujeme, či je Pandoc nainštalovaný, a ak nie, nainštalujeme ho. Napríklad takto:

user@hostname:~$ dpkg -s pandoc

Ak je v výstupe napísané, že nie je nainštalovaný — inštalujeme:

user@hostname:~$ sudo apt install pandoc -y

Inštalácia balíka PSCyr pre TexLive

Na začiatok je potrebné stiahnuť PSCyr. Zatiaľ je ešte dostupný na tomto odkaze, ak na čas čítania článku nie je z nejakého dôvodu k dispozícii, nezúfajte, dá sa ľahko nájsť spolu s inštrukciami na inštaláciu, ak napíšete do Googlu niečo ako „Inštalácia PsCyr texlive“. Ak je však dostupný, tak je to pre vás jednoduchšie, stiahnite si ho a predpokladajme, že ste rozbalili archív do domácej zložky, takže cesta k zložke obsiahnutej v archíve vyzerá ako ~\/PSCyr. Takže otvoríme Terminál a postupne vykonáme príkazy:

user@hostname:~$ cd
user@hostname:~$ mkdir .\/PSCyr\/fonts\/map .\/PSCyr\/fonts\/enc
user@hostname:~$ cp .\/PSCyr\/dvips\/pscyr\/*.map .\/PSCyr\/fonts\/map\/
user@hostname:~$ cp .\/PSCyr\/dvips\/pscyr\/*.enc .\/PSCyr\/fonts\/enc\/
user@hostname:~$ echo "fadr6t AdvertisementPSCyr "T2AEncoding ReEncodeFont"" > .\/PSCyr\/fonts\/map\/pscyr.map

Potom zistíme, kde sa nachádza lokálny adresár texmf. Vykonáme príkaz:

user@hostname:~$ kpsewhich -expand-var='$TEXMFLOCAL'

Pravdepodobne tento adresár máte — /usr/local/share/texmf/, a potom vykonáme:

user@hostname:~$ sudo cp -R .\/PSCyr\/* \/usr\/local\/share\/texmf\/

Alebo sa nemusíte trápiť a vykonať príkaz, ktorý skopíruje do zložky texmf kdekoľvek bola:

user@hostname:~$ sudo cp -R .\/PSCyr\/* $(kpsewhich -expand-var='$TEXMFLOCAL')

Písma PSCyr sú nainštalované, pripojte ich v TexLive:

user@hostname:~$ sudo texhash
user@hostname:~$ updmap --enable Map=pscyr.map
user@hostname:~$ sudo mktexlsr

LaTeX šablóna pre konverziu md2pdf

Nebudem opisovať, ako presne je táto šablóna nastavená, a jednoducho ju uvediem pod spoilerom bez ďalších vysvetlení. Stačí povedať, že je nastavená celkom dobre, aspoň pokiaľ ide o spracovanie textov s množstvom zdrojového kódu. Ak vám nevyhovujú veľkosti odsadení, medzi riadkovými intervalmi, absencia číslovania kapitol a podkapitol, tak podľa mňa je to celkom ľahké nájsť otázku na internete „ako v Latex urobiť…“ a ďalej podľa potreby. Ak je to úplne nejasné, píšte do komentárov, pokúsim sa preniknúť do svojich nastavovacích parametrov z pred štyroch rokov a vysvetliť, ktorá časť šablóny za čo zodpovedá. Zatiaľ popíšem, ako som to urobil ja na svojom PC, a vy si to môžete zopakovať alebo prispôsobiť podľa seba.

Vytvorte súbor template.tex v adresári /usr/share/texlive/:

user@hostname:~$ sudo touch \/usr\/share\/texlive\/template.tex

Nastavíme mu práva na čítanie:

user@hostname:~$ sudo chmod 444 \/usr\/share\/texlive\/template.tex

otvoríme ako root a vložíme doň obsah skrytý pod spoilerom nižšie:

user@hostname:~$ sudo nano \/usr\/share\/texlive\/template.tex

Obsah šablóny \/usr\/share\/texlive\/template.tex

documentclass[oneside,final,14pt]{extreport}
usepackage{extsizes}
usepackage{pscyr}
renewcommand{rmdefault}{ftm}
usepackage[T2A]{fontenc}
usepackage[utf8]{inputenc}
usepackage{amsmath}
usepackage{mathtext}
usepackage{multirow}
usepackage{listings}
usepackage{ucs}
usepackage{hhline}
usepackage{tabularx}
usepackage{booktabs}
usepackage{longtable}
usepackage{titlesec}
usepackage{hyperref}
usepackage{graphicx}
usepackage{setspace}
usepackage[center,it,labelsep=period]{caption}
usepackage[english,russian,ukrainian]{babel}
usepackage{vmargin}
newcommand{specialcell}[2][c]{%
    begin{tabular}[#1]{@{}c@{}}#2end{tabular}}
setpapersize{A4}
setmarginsrb {1cm}{1cm}{1cm}{1cm}{0pt}{0mm}{0pt}{13mm}
usepackage{indentfirst}
setlengthparindent{1cm}
renewcommand{baselinestretch}{1}
renewcommandthechapter{}
renewcommandthesection{}
renewcommandthesubsection{}
renewcommandthesubsubsection{}
titleformat
{chapter} % command
{bfseriesnormalsizecentering} % format
{thechapter} % label
{0.5ex} % sep
{
    centering
}
[
vspace{-1.5ex}
] % after-code
titleformat
{section}
[block]
{normalfontbfseries}
{thesection}{0.5em}{}
sloppy
letoldenumerateenumerate
renewcommand{enumerate}{
  oldenumerate
  setlength{itemsep}{1pt}
  setlength{parskip}{0pt}
  setlength{parsep}{0pt}
}
letolditemizeitemize
renewcommand{itemize}{
  olditemize
  setlength{itemsep}{1pt}
  setlength{parskip}{0pt}
  setlength{parsep}{0pt}
}
providecommand{tightlist}{%
  setlength{itemsep}{0pt}setlength{parskip}{0pt}}

titlespacing{subsubsection}{parindent}{3mm}{3mm}
titlespacing{subsection}{parindent}{3mm}{3mm}
usepackage{color}

lstset{
    basicstyle=footnotesizettfamily,
    inputencoding=utf8,
    extendedchars=true,
    showspaces=false,
    keepspaces=true
    showstringspaces=false,
    showtabs=false,
    tabsize=4,
    captionpos=b,
    breaklines=true,
    breakatwhitespace=true,
    breakautoindent=true,
    linewidth=textwidth
}

begin{document}
$if(title)$
maketitle
$endif$
$if(abstract)$
begin{abstract}
$abstract$
end{abstract}
$endif$

$for(include-before)$
$include-before$

$endfor$
$if(toc)$
{
$if(colorlinks)$
hypersetup{linkcolor=$if(toccolor)$$toccolor$$else$black$endif$}
$endif$
setcounter{tocdepth}{$toc-depth$}
tableofcontents
}
$endif$
$if(lot)$
listoftables
$endif$
$if(lof)$
listoffigures
$endif$
$body$

$if(natbib)$
$if(bibliography)$
$if(biblio-title)$
$if(book-class)$
renewcommandbibname{$biblio-title$}
$else$
renewcommandrefname{$biblio-title$}
$endif$
$endif$
bibliography{$for(bibliography)$$bibliography$$sep$,$endfor$}

$endif$
$endif$
$if(biblatex)$
printbibliography$if(biblio-title)$[title=$biblio-title$]$endif$

$endif$
$for(include-after)$
$include-after$

$endfor$
end{document}

Ukladáme súbor /usr/share/texlive/template.tex a napíšeme skript, ktorý bude konvertovať Markdown súbor do PDF, pričom v tej istej zložke sa vytvorí súbor s názvom Markdown súboru s príponou .pdf, teda po konverzii filename.md v zložke sa objaví filename.md.pdf. Skript nazveme md2pdf a umiestnime ho na cestu /usr/bin. Postupne vykonáme príkazy:

user@hostname:~$ cd
user@hostname:~$ touch md2pdf
user@hostname:~$ echo "#!\/bin\/bash" > md2pdf
user@hostname:~$ echo "pandoc --output=$1.pdf --from=markdown_github --latex-engine=pdflatex --listings --template=\/usr\/share\/texlive\/template.tex $1" >> md2pdf
user@hostname:~$ sudo cp md2pdf \/usr\/bin\/ 
user@hostname:~$ sudo chmod 111 \/usr\/bin\/md2pdf

Na 4. riadku je vlastne uvedený príkaz na konverziu. Všimnite si —from=markdown_github. GitHub verzia Markdown je spätne kompatibilná s originálnym Markdown, takže ak je váš text napísaný v ňom, nemusíte sa obávať. Ak je však váš MD súbor napísaný v špecifickom dialekte Markdown, prečítajte si manuál k Pandoc (man pandoc), uistite sa, že vaša implementácia ich podporuje, a upravte /usr/bin/md2pdf podľa potreby.

Skript pre relatívne automatickú inštaláciu

Ak nechcete vôbec nič nastavovať a máte distribúciu podobnú Ubuntu, môžete sa pokúsiť vytvoriť skript s obsahom skrytým pod spoilerom, a pravdepodobne sa všetko nainštaluje samo; jediné, čo potrebujete, je, aby ste si sami skopírovali TeX šablónu, ktorú nájdete vyššie. Otvorte terminál a vykonajte:

user@hostname:~$ cd
user@hostname:~$ touch installmd2pdf.sh

Potom ho vyplňte nasledujúcim obsahom:

Obsah skriptu $HOME/installmd2pdf.sh

#!/bin/bash
cd /tmp
sudo apt install texlive-full pandoc -y
wget http://blog.harrix.org/wp-content/uploads/2013/02/PSCyr.zip
unzip -qq PSCyr.zip
cd
mkdir ./PSCyr/fonts/map ./PSCyr/fonts/enc
cp ./PSCyr/dvips/pscyr/*.map ./PSCyr/fonts/map/
cp ./PSCyr/dvips/pscyr/*.enc ./PSCyr/fonts/enc/
echo "fadr6t AdvertisementPSCyr "T2AEncoding ReEncodeFont"" > ./PSCyr/fonts/map/pscyr.map
sudo cp -R ./PSCyr/* $(kpsewhich -expand-var='$TEXMFLOCAL')
sudo texhash
updmap --enable Map=pscyr.map
sudo mktexlsr
sudo touch /usr/share/texlive/template.tex
touch md2pdf
echo "#!/bin/bash" > md2pdf
echo "pandoc --output=$1.pdf --from=markdown_github --latex-engine=pdflatex --listings --template=/usr/share/texlive/template.tex $1" >> md2pdf
sudo cp md2pdf /usr/bin/
sudo chmod 111 /usr/bin/md2pdf

Spustite ho pomocou príkazu:

user@hostname:~$ sudo bash $HOME/installmd2pdf.sh

Nezabúdajte, že /usr/share/texlive/template.tex je potrebné vyplniť obsah uvedený v časti „LaTeX šablóna pre konverziu md2pdf“.

Použitie md2pdf

Jednoducho otvorte priečinok so súborom Markdown (some_file.md) v termináli a vykonajte príkaz:

user@hostname:~$ md2pdf some_file.md

Výsledkom bude v priečinku súbor some_file.md.pdf.

Záver

Na základe opísanej metódy sa dá vytvoriť akýkoľvek štýl PDF súborov, rovnako je možné konvertovať namiesto md aj iné formáty, všetky podporované Pandoc. Dúfam, že tento návod raz pomôže trom a pol ľuďom.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster