Gotowe rozwiązanie markdown2pdf z kodem źródłowym dla systemu Linux

Przedmowa

Markdown to świetny sposób na napisanie krótkiego artykułu, a czasem całkiem sporo tekstu, z prostą kursywą i pogrubionym formatowaniem. Markdown jest również dobry do pisania artykułów z dołączonym kodem źródłowym. Ale czasami chce się bezstratnie, zatańczyć z tamburynem, żeby go wyprzedzić do zwykłego, dobrze sformatowanego PDF-a i żeby nie było problemów podczas konwersji, które np. miałem - nie da się pisać po rosyjsku w komentarze kodu źródłowego, zbyt długie linie nie są przenoszone, ale obcinane i inne drobne problemy. Instrukcja pozwoli szybko skonfigurować konwerter md2pdf bez zrozumienia, jak to naprawdę działa. Skrypt do mniej lub bardziej automatycznej instalacji znajduje się poniżej w odpowiedniej sekcji.

Mój przykładowy szablon TeX do konwersji wykorzystuje pakiet czcionek PSCyr, który obejmuje obsługę czcionek Microsoft, a mianowicie Times New Roman. Były takie wymagania dotyczące dyplomu według GOST. Jeśli wiesz jak, możesz zmodyfikować szablon do swoich potrzeb. Zgodnie z moimi instrukcjami najpierw będziesz musiał pobawić się ustawieniem PSCyr w TexLive. Konfiguracja odbywa się w dystrybucji Linux Mint Mate, w przypadku innych dystrybucji może być konieczne wyszukanie w Google standardowych folderów pakietów TexLive dla twojego systemu.

Instalacja TexLive

Oczywiście możesz zainstalować tylko niezbędne części tego pakietu. Ale osobiście byłem szczerze mówiąc zbyt leniwy, aby szukać minimalnej niezbędnej działającej instalacji. Aby upewnić się, że wszystko działa, zainstaluj cały pakiet TexLive. Nazywa się to texlive-full i waży nieco ponad 2 gigabajty, należy o tym pamiętać. Wykonujemy polecenie:

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

Po wystarczająco długiej instalacji możesz przejść do następnego elementu.

Instalowanie konwertera Pandoc

Pandoc to pakiet Linuksa, który umożliwia konwersję niektórych formatów tekstowych na inne. Ma wiele ciekawych funkcji, które możesz znaleźć w Internecie. Interesuje nas tylko możliwość konwersji pliku przeceny do formatu PDF. Sprawdź, czy Pandoc jest zainstalowany, a jeśli nie, zainstaluj go. Na przykład tak:

user@hostname:~$ dpkg -s pandoc

Jeśli wynik mówi, że nie jest zainstalowany, zainstaluj:

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

Instalowanie pakietu PSCyr dla TexLive

Najpierw musisz pobrać PSCyr. Na razie jest jeszcze dostępny pod tym adresem powiązanie, jeśli z jakiegoś powodu nie jest dostępny w momencie czytania artykułu, nie rozpaczaj, łatwo go znaleźć wraz z instrukcją instalacji, wpisując coś w rodzaju „Instalowanie PsCyr texlive” w Google. Jeśli jest dostępne, to jest dla ciebie łatwiejsze, pobierz i przyjmiemy, że rozpakowałeś archiwum do folderu domowego i stąd ścieżka do folderu zawartego w archiwum wygląda tak ~/PSCyr. Następnie przejdź do terminala i wykonaj kolejno następujące polecenia:

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

Następnie dowiedz się, gdzie znajduje się katalog lokalny tekstmf. Wykonujemy polecenie:

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

Najprawdopodobniej masz ten katalog - /usr/local/share/texmf/, a następnie robimy:

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

Cóż, albo nie możesz zawracać sobie głowy i uruchomić polecenia, które skopiuje do folderu tekstmf gdziekolwiek ona jest:

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

Czcionki PSCyr zainstalowane, połącz się z TexLive:

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

Szablon LaTeX do konwersji md2pdf

Nie będę opisywał dokładnie, jak skonfigurowany jest ten szablon, i po prostu podam go pod spoilerem bez większego wyjaśnienia. Dość powiedzieć, że jest dobrze skonfigurowany, przynajmniej jeśli chodzi o obsługę tekstów z dużą ilością kodu źródłowego. Jeśli nie jesteś zadowolony z wielkości wcięć, odstępów między wierszami, braku numeracji sekcji i podrozdziałów, to moim zdaniem dość łatwo jest wpisać w google pytanie „jak to zrobić w Latexie…” i wtedy twoja potrzeba. Jeśli w ogóle nie jest to jasne, piszcie w komentarzach, postaram się zagłębić we własne ustawienia sprzed 4 lat i opisać, która linijka szablonu za co odpowiada. W międzyczasie napiszę, jak to zrobiłem na moim komputerze, a ty możesz to powtórzyć lub zmodyfikować dla siebie.

Utwórz plik szablon.tex w katalogu /usr/share/texlive/:

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

Nadaj mu uprawnienia do odczytu:

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

otwórz go pod rootem i wklej do niego zawartość ukrytą pod spoilerem poniżej:

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

Zawartość szablonu /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}

Zapisz plik /usr/share/texlive/template.tex i napisać skrypt, który przekonwertuje plik Makrdown do PDF, tworząc w tym samym folderze plik o nazwie plik Markdown z przedrostkiem .pdf, czyli po konwersji nazwa_pliku.md pojawi się w folderze. nazwapliku.md.pdf. Nazwijmy skrypt md2pdf i postawić na drogę / usr / bin. Wykonajmy kolejno polecenia:

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

Czwarta linia faktycznie zawiera polecenie konwersji. Zwróć uwagę na --from=markdown_github. Wersja Markdown na GitHubie jest wstecznie kompatybilna z oryginalnym Markdownem, więc jeśli Twój tekst jest w niej zapisany, nie musisz się martwić. Jeśli twój plik MD jest napisany w określonym dialekcie Markdown, przeczytaj podręcznik Pandoc (man pandoc), upewnij się, że twoja implementacja jest przez nią obsługiwana, i dostosuj /usr/bin/md2pdf Jeśli to konieczne.

Skrypt do mniej lub bardziej automatycznej instalacji

Jeśli tak naprawdę nie chcesz nic konfigurować, a masz dystrybucję podobną do Ubuntu, możesz spróbować utworzyć skrypt z zawartością ukrytą pod spoilerem i najprawdopodobniej wszystko samo się zainstaluje, jedyne, co jest, to skopiuj szablon TeX opublikowany pod spoilerem powyżej tam, gdzie potrzebujesz. Otwórz Terminal i uruchom:

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

Następnie wypełnij go następującą treścią:

Zawartość skryptu $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

Uruchom go za pomocą polecenia:

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

Nie zapomnij tego /usr/share/texlive/template.tex należy wypełnić zgodnie z sekcją „Szablon LaTeX do konwersji md2pdf" treść.

Za pomocą md2pdf

Po prostu otwórz folder z plikiem Markdown (jakiś_plik.md) w Terminalu i uruchom polecenie:

user@hostname:~$ md2pdf some_file.md

W rezultacie plik pojawi się w folderze jakiś_plik.md.pdf.

wniosek

W oparciu o opisaną metodę można zbudować dowolny styl plików PDF, można także konwertować inne formaty zamiast md, dowolne obsługiwane przez Pandoc. Śmiem mieć nadzieję, że pewnego dnia ta instrukcja przyda się 3 i pół osobom.

Źródło: www.habr.com

Dodaj komentarz