Гатовае рашэнне 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

Дадаць каментар