Έτοιμη λύση markdown2pdf με πηγαίο κώδικα για Linux

πρόλογος

Το Markdown είναι ένας πολύ καλός τρόπος για να γράψετε ένα σύντομο άρθρο, και μερικές φορές πολύ κείμενο, με απλή πλάγια και έντονη μορφοποίηση. Το Markdown είναι επίσης καλό για τη σύνταξη άρθρων με τον πηγαίο κώδικα. Αλλά μερικές φορές θέλετε να χορέψετε χωρίς απώλεια, να χορέψετε με ένα ντέφι για να το προσπεράσετε σε ένα κανονικό, καλοσχηματισμένο αρχείο PDF και για να μην υπάρχουν προβλήματα κατά τη μετατροπή, που, για παράδειγμα, είχα - δεν μπορείτε να γράψετε στα ρωσικά σε τα σχόλια του πηγαίου κώδικα, οι πολύ μεγάλες γραμμές δεν μεταφέρονται, αλλά κόβονται και άλλα μικροπροβλήματα. Η οδηγία θα σας επιτρέψει να ρυθμίσετε γρήγορα τον μετατροπέα md2pdf χωρίς να καταλαβαίνω πραγματικά πώς λειτουργεί. Το σενάριο για μια περισσότερο ή λιγότερο αυτόματη εγκατάσταση βρίσκεται παρακάτω στην κατάλληλη ενότητα.

Το δείγμα μου προτύπου TeX για μετατροπή χρησιμοποιεί το πακέτο γραμματοσειρών PSCyr, το οποίο περιλαμβάνει υποστήριξη για γραμματοσειρές της Microsoft, συγκεκριμένα Times New Roman. Υπήρχαν τέτοιες απαιτήσεις για δίπλωμα σύμφωνα με το GOST. Εάν ξέρετε πώς, μπορείτε να τροποποιήσετε το πρότυπο ώστε να ταιριάζει στις ανάγκες σας. Στις δικές μου οδηγίες, θα πρέπει πρώτα να χαζέψετε τη ρύθμιση PSCyr στο TexLive. Η ρύθμιση γίνεται στη διανομή Linux Mint Mate, για άλλες διανομές ίσως χρειαστεί να αναζητήσετε στο google τους τυπικούς φακέλους πακέτων TexLive για το σύστημά σας.

Εγκατάσταση του TexLive

Φυσικά, μπορείτε να εγκαταστήσετε μόνο τα απαραίτητα μέρη αυτού του πακέτου. Αλλά προσωπικά, ήμουν ειλικρινά πολύ τεμπέλης για να αναζητήσω την ελάχιστη απαραίτητη εγκατάσταση εργασίας. Για να βεβαιωθείτε ότι όλα λειτουργούν, εγκαταστήστε ολόκληρο το πακέτο TexLive. Ονομάζεται texlive-γεμάτη και ζυγίζει λίγο περισσότερο από 2 gigabyte, έχετε υπόψη σας αυτό το γεγονός. Εκτελούμε την εντολή:

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

Μετά από μια αρκετά μεγάλη εγκατάσταση, μπορείτε να προχωρήσετε στο επόμενο στοιχείο.

Εγκατάσταση του μετατροπέα Pandoc

Το Pandoc είναι ένα πακέτο Linux που σας επιτρέπει να μετατρέψετε ορισμένες μορφές κειμένου σε άλλες. Έχει πολλά ενδιαφέροντα χαρακτηριστικά που μπορείτε να βρείτε στο Διαδίκτυο. Μας ενδιαφέρει μόνο η δυνατότητα μετατροπής ενός αρχείου σήμανσης σε PDF. Ελέγξτε εάν το Pandoc είναι εγκατεστημένο και αν όχι, εγκαταστήστε το. Για παράδειγμα όπως αυτό:

user@hostname:~$ dpkg -s pandoc

Εάν η έξοδος λέει ότι δεν είναι εγκατεστημένο, εγκαταστήστε:

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

Εγκατάσταση του πακέτου PSCyr για το TexLive

Πρώτα πρέπει να κατεβάσετε το PSCyr. Προς το παρόν είναι ακόμα διαθέσιμο σε αυτό σύνδεσμος, εάν τη στιγμή που διαβάζετε το άρθρο δεν είναι διαθέσιμο για κάποιο λόγο, μην απελπίζεστε, είναι εύκολο να το βρείτε μαζί με τις οδηγίες εγκατάστασης πληκτρολογώντας κάτι σαν «Εγκατάσταση PsCyr texlive» στο Google. Εάν είναι διαθέσιμο, τότε είναι πιο εύκολο για εσάς, κάντε λήψη και θα υποθέσουμε ότι έχετε αποσυσκευάσει το αρχείο στον αρχικό σας φάκελο και έτσι η διαδρομή προς το φάκελο που περιέχεται στο αρχείο μοιάζει με ~/PSCyr. Στη συνέχεια, μεταβείτε στο Terminal και εκτελέστε τις ακόλουθες εντολές με τη σειρά:

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

Στη συνέχεια, μάθετε πού βρίσκεται ο τοπικός κατάλογος textmf. Εκτελούμε την εντολή:

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

Πιθανότατα έχετε αυτόν τον κατάλογο - /usr/local/share/texmf/, και μετά κάνουμε:

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

Λοιπόν, ή δεν μπορείτε να ασχοληθείτε και να εκτελέσετε μια εντολή που θα αντιγράψει σε έναν φάκελο textmf όπου κι αν είναι:

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

Δεν θα περιγράψω ακριβώς πώς έχει ρυθμιστεί αυτό το πρότυπο και απλά θα το δώσω κάτω από το spoiler χωρίς πολλές εξηγήσεις. Αρκεί να πούμε ότι είναι καλά διαμορφωμένο, τουλάχιστον όσον αφορά τον τρόπο με τον οποίο χειρίζεται κείμενα με πολύ πηγαίο κώδικα. Εάν δεν είστε ικανοποιημένοι με το μέγεθος των εσοχών, την απόσταση γραμμών, την έλλειψη αρίθμησης ενοτήτων και υποενοτήτων, τότε κατά τη γνώμη μου είναι πολύ εύκολο να ψάξετε στο google την ερώτηση στο Διαδίκτυο "πώς να το κάνετε στο Latex ..." και τότε η ανάγκη σου. Εάν δεν είναι καθόλου ξεκάθαρο, γράψτε στα σχόλια, θα προσπαθήσω να εμβαθύνω στις δικές μου ρυθμίσεις πριν από 4 χρόνια και να περιγράψω ποια γραμμή του προτύπου είναι υπεύθυνη για τι. Εν τω μεταξύ, θα γράψω πώς το έκανα στον υπολογιστή μου και είστε ελεύθεροι να το επαναλάβετε ή να το τροποποιήσετε μόνοι σας.

Δημιουργήστε ένα αρχείο πρότυπο.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, δηλαδή μετά τη μετατροπή όνομα αρχείου.md θα εμφανιστεί στο φάκελο. όνομα αρχείου.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, μπορείτε να δοκιμάσετε να δημιουργήσετε ένα σενάριο με τα περιεχόμενα κρυμμένα κάτω από το spoiler και πιθανότατα όλα θα εγκατασταθούν μόνα τους, το μόνο πράγμα είναι να αντιγράψετε το πρότυπο TeX αναρτήθηκε κάτω από το spoiler παραπάνω όπου χρειάζεται. Ανοίξτε το Terminal και εκτελέστε:

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) στο Terminal και εκτελέστε την εντολή:

user@hostname:~$ md2pdf some_file.md

Ως αποτέλεσμα, ένα αρχείο θα εμφανιστεί στο φάκελο some_file.md.pdf.

Συμπέρασμα

Με βάση την περιγραφόμενη μέθοδο, μπορείτε να δημιουργήσετε οποιοδήποτε στυλ αρχείων PDF, μπορείτε επίσης να μετατρέψετε άλλες μορφές αντί για md, όσες υποστηρίζονται από το Pandoc. Τολμώ να ελπίζω ότι μια μέρα αυτή η οδηγία θα είναι χρήσιμη σε 3 άτομα.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο