Готове рішення 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. Поки що він доступний за цією за посиланнямЯкщо на момент прочитання статті вона з якихось причин не доступна, не впадайте у відчай, його нескладно знайти разом з інструкцією по установці, набравши в Гуглі щось на зразок «Установка 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-річної давності в розписати, який рядок шаблону за що відповідає. Поки ж, я розпишу, як зробив я у себе на ПК, а ви вільні повторити або модифікувати під себе.

Створюємо файл 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,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}

Зберігаємо файл /usr/share/texlive/template.tex і пишемо скрипт який конвертуватиме Makrdown файл у 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

Додати коментар або відгук