Готово решение markdown2pdf с изходен код за Linux

Предговор

Markdown е прекрасен начин за написване на кратка статия, а понякога и достатъчно обемист текст, с несложен формат като курсив и удебелен шрифт. Също така Markdown е полезен за писане на статии, включващи изходен код. Но понякога искаме без загуби, и без усложнения да го конвертираме в обикновен, добре оформен PDF файл, и за да няма проблеми при конвертирането, каквито, например, имах аз — не може да се пише на руски в коментарите на изходния код, твърде дългите редове не се пренасят, а се отрязват и други дребни проблеми. Инструкцията ще позволи бързо да настроите конвертора md2pdf не особено разбирам как работи. Скрипт за по-автоматизирана инсталация по-долу в съответния раздел.

Моят пример TeX шаблон за конвертиране използва пакета шрифтове PSCyr, който включва поддръжка на Microsoft шрифтове, а именно Times New Roman. Такива бяха изискванията за дипломата по ГОСТ. Ако можете, можете да модифицирате шаблона според вашите нужди. В моята инструкция ще се наложи предварително да се поморочите с настройката на PSCyr в TexLive. Настройката се извършва в дистрибуцията Linux Mint Mate, за другите дистрибуции, може би, ще трябва да потърсите стандартните папки на пакета TexLive за вашата система.

Инсталация на TexLive

Разбира се, можете да инсталирате само необходимите части от този пакет. Но личната ми причина е, че ме мързеше да търся минимално необходимата работеща инсталация. За да работи всичко безпроблемно, инсталираме целия пакет TexLive. Неговото име е texlive-full и тежи малко над 2 гигабайта, имайте това в предвид. Изпълняваме командата:

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

След достатъчно дълга инсталация можем да преминем към следващия пункт.

Инсталация на конвертора Pandoc

Pandoc — пакет за Linux, който позволява преобразуване на някои текстови формати в други. В него има много интересни възможности, с които можете да се запознаете сами в интернет. Нас ни интересува само възможността за преобразуване на markdown файл в PDF. Нека проверим дали Pandoc е инсталиран и ако не е, да го инсталираме. Например така:

user@hostname:~$ dpkg -s pandoc

Ако в изхода пише, че не е инсталиран — инсталираме:

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

Инсталация на пакета PSCyr за TexLive

Първо трябва да изтеглим PSCyr. Все още е наличен по този връзката, ако по някаква причина статията не е достъпна в момента на четене, не се отчайвайте, не е трудно да я намерите заедно с инструкциите за инсталиране, като напишете в Google нещо подобно на „Инсталация на PsCyr texlive“. Ако е налична, е по-лесно за вас, изтеглете я и да предположим, че сте разархивирали архива в домашната си папка, така че пътят към папката, съдържаща се в архива, изглежда като ~\/PSCyr. След това отиваме в Терминала и последователно изпълняваме командите:

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

Следващата стъпка е да разберем къде се намира локалният каталог texmf. Изпълняваме командата:

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

Вероятно този каталог при вас е — /usr/local/share/texmf/, и след това изпълняваме:

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

Или можем да не се занимаваме и да изпълним команда, която да копира в папката texmf без значение къде е тя:

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

Шрифтовете PSCyr са инсталирани, свързваме ги в TexLive:

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

LaTeX шаблон за конвертиране md2pdf

Няма да описвам как точно е настроен този шаблон и просто ще го предоставя под спойлера без особени обяснения. Достатъчно е да се каже, че е настроен доста добре, поне що се отнася до начина, по който обработва текстове с множество изходен код. Ако не сте доволни от размерите на отстъпите, междустрочните интервали, отсъствието на номерация на разделите и подразделите, на мое мнение, е достатъчно лесно да се намери в интернет, като зададете въпрос „как в LaTeX да направя…“ и след това вашата необходимост. Ако нещо не е ясно, пишете в коментарите, ще се опитам да се задълбоча в собствените си настройки отпреди 4 години и да опиша коя редица от шаблона за какво отговаря. Досега ще опиша как направих аз на своя PC, а вие можете да го повторите или модифицирате по свой вкус.

Създайте файл template.tex в директорията /usr/share/texlive/:

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

Задаваме му права за четене:

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

откриваме под рут и вмъкваме в него съдържанието, скрито под спойлера по-долу:

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

Съдържанието на шаблона \/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,bulgarian,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}

Запазваме файла /usr/share/texlive/template.tex и пишем скрипт, който ще конвертира Markdown файл в PDF, създавайки в същата папка файл с името на Markdown файла с приставка .pdf, тоест след конвертиране filename.md в папката ще се появи filename.md.pdf. Скриптът ще наречем md2pdf и ще го поставим по пътя /usr/bin. Ще изпълним последователно командите:

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

В 4-та редица всъщност е посочена командата за конвертиране. Обърнете внимание на —from=markdown_github. GitHub версия Markdown е обратно съвместима с оригиналния Markdown, така че ако текстът ви е написан на него, не е необходимо да се тревожите. Ако вашият MD файл е написан на специфичен диалект на Markdown, прочетете ръководството за Pandoc (man pandoc), уверете се, че вашата реализация го поддържа, и го коригирайте /usr/bin/md2pdf при необходимост.

Скрипт за относително автоматична инсталация

Ако не ви се иска да настройвате нещо абсолютно, и имате дистрибуция с Ubuntu-подобен вариант, можете да опитате да създадете скрипт с съдържанието, скрито под спойлер, и вероятно всичко ще се инсталира само, единственото, което трябва да направите е да копирате TeX шаблона, публикуван под спойлера по-горе, на нужното място. Отворете Терминала и изпълнете:

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

След това запълнете него със следното съдържание:

Съдържание на скрипта $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

Стартирайте го с командата:

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

Не забравяйте, че /usr/share/texlive/template.tex трябва да запълните указанията в раздел „LaTeX шаблон за конвертиране md2pdf“ с посоченото съдържание.

Използване на md2pdf

Просто отворете папката с Markdown файл (some_file.md) в Терминала и изпълнете командата:

user@hostname:~$ md2pdf some_file.md

В резултат на това в папката ще се появи файл some_file.md.pdf.

Заключение

На основата на описания метод може да се създаде какъвто и да е стил на PDF файлове, също така можете да конвертирате вместо md и други формати, всякакви поддържани от Pandoc. Надявам се, че веднъж това ръководство ще бъде от полза за 3 и половина души.

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster