Fertige Lösung markdown2pdf mit Quellcode für Linux

Vorwort

Markdown ist eine großartige Möglichkeit, einen kurzen Artikel oder manchmal auch einen umfangreichen Text mit einfacher Formatierung wie Kursivschrift und fetter Schrift zu schreiben. Auch für das Verfassen von Artikeln, die Quellcode enthalten, ist Markdown gut geeignet. Manchmal möchte man ihn jedoch ohne Verluste und ohne viel Aufwand in eine reguläre, gut formatierte PDF-Datei umwandeln, und um Probleme bei der Konvertierung zu vermeiden, wie sie mir manchmal begegnet sind – es ist nicht möglich, auf Russisch in den Kommentaren des Quellcodes zu schreiben, zu lange Zeilen werden abgeschnitten und es gibt andere kleine Probleme. Die Anleitung hilft dabei, den Konverter schnell einzurichten. md2pdf ohne zu sehr in die Funktionsweise einzugehen. Das Skript für eine mehr oder weniger automatische Installation befindet sich im entsprechenden Abschnitt.

Mein Beispiel für eine TeX-Vorlage zur Konvertierung verwendet das Schriftartenpaket PSCyr, das die Unterstützung von Microsoft-Schriften beinhaltet, nämlich Times New Roman. Solche Anforderungen gab es für das Diplom gemäß GOST. Wenn Sie es können, können Sie die Vorlage an Ihre Bedürfnisse anpassen. In meiner Anleitung müssen Sie jedoch zuerst ein wenig mit der PSCyr-Einstellung in TexLive herumexperimentieren. Die Einrichtung erfolgt in der Linux Mint Mate-Distribution; für andere Distributionen müssen Sie möglicherweise die Standardordner des TexLive-Pakets für Ihr System googeln.

Installation von TexLive

Natürlich können Sie nur die benötigten Teile dieses Pakets installieren. Aber persönlich war ich ehrlich gesagt zu faul, um die minimal notwendige Arbeitsinstallation zu suchen. Damit alles reibungslos funktioniert, installieren wir das gesamte TexLive-Paket. Es heißt texlive-full und hat ein Gewicht von etwas mehr als 2 Gigabyte, beachten Sie diesen Fakt. Führen Sie den Befehl aus:

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

Nach einer recht langen Installation können wir zum nächsten Punkt übergehen.

Installation des Pandoc-Konverters

Pandoc ist ein Paket für Linux, das es ermöglicht, einige Textformate in andere zu konvertieren. Es gibt viele interessante Möglichkeiten, mit denen Sie sich im Internet selbst vertraut machen können. Uns interessiert jedoch nur die Möglichkeit, eine Markdown-Datei in PDF zu konvertieren. Lassen Sie uns überprüfen, ob Pandoc installiert ist, und falls nicht, installieren wir es. Zum Beispiel so:

benutzer@hostname:~$ dpkg -s pandoc

Wenn in der Ausgabe steht, dass es nicht installiert ist, installieren wir es:

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

Installation des PSCyr-Pakets für TexLive

Zunächst muss PSCyr heruntergeladen werden. Bis jetzt ist es noch hier verfügbar. dem Link, wenn der Artikel zum Zeitpunkt des Lesens aus irgendeinem Grund nicht verfügbar ist, verzweifeln Sie nicht, es ist nicht schwer, ihn zusammen mit der Installationsanleitung zu finden, indem Sie in Google etwas wie „Installation PsCyr texlive“ eingeben. Wenn er jedoch verfügbar ist, ist es für Sie einfacher, laden Sie ihn herunter und wir gehen davon aus, dass Sie das Archiv in das Home-Verzeichnis entpackt haben, und somit sieht der Pfad zu dem Verzeichnis, das im Archiv enthalten ist, so aus ~\/PSCyr. Dann öffnen wir das Terminal und führen die Befehle nacheinander aus:

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

Dann erfahren wir, wo sich das lokale Verzeichnis texmf. Führen Sie den Befehl aus:

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

Wahrscheinlich ist dieses Verzeichnis bei Ihnen — /usr/local/share/texmf/, und dann führen wir aus:

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

Oder Sie können es sich auch einfach machen und den Befehl ausführen, der in den Ordner kopiert texmf wo auch immer es sich befindet:

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

Die PSCyr-Schriften sind installiert, schließen wir sie in TexLive ein:

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

LaTeX-Vorlage zur Konvertierung von md2pdf

Ich werde nicht beschreiben, wie genau diese Vorlage konfiguriert ist, sondern sie einfach im Spoiler ohne besondere Erläuterungen bereitstellen. Genug zu sagen, dass sie recht gut konfiguriert ist, zumindest was die Verarbeitung von Texten mit viel Quellcode betrifft. Wenn Sie mit den Abständen, Zeilenhöhen, dem Fehlen von Abschnitts- und Unterabschnittsnummerierungen nicht zufrieden sind, dann ist es meiner Meinung nach ganz leicht, die Frage im Internet zu googeln: „Wie macht man in Latex…“ und dann hängt es von Ihrem Bedarf ab. Wenn etwas unklar ist, schreiben Sie in die Kommentare, ich werde versuchen, mich in meine vor vier Jahren vorgenommenen Einstellungen einzuarbeiten und zu erläutern, welche Zeile der Vorlage wofür verantwortlich ist. In der Zwischenzeit werde ich aufschreiben, wie ich es auf meinem PC gemacht habe und Sie können es wiederholen oder nach Ihren Bedürfnissen anpassen.

Erstellen Sie eine Datei template.tex im Verzeichnis /usr/share/texlive/:

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

Setzen Sie ihm die Leserechte:

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

öffnen Sie es als Root und fügen Sie den Inhalt ein, der im Spoiler darunter verborgen ist:

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

Inhalt der Vorlage \/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}

Datei speichern /usr/share/texlive/template.tex und ein Skript schreiben, das eine Markdown-Datei in ein PDF konvertiert und im selben Verzeichnis eine PDF-Datei erstellt, die den Namen der Markdown-Datei mit der Endung .pdf ergänzt, also nach der Konvertierung filename.md im Verzeichnis erscheinen filename.md.pdf. Wir nennen das Skript md2pdf und legen es in den Pfad /usr/bin. Führen wir die Befehle nacheinander aus:

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

In der vierten Zeile ist tatsächlich der Befehl zur Konvertierung angegeben. Beachten Sie —from=markdown_github. Die GitHub-Version von Markdown ist rückwärtskompatibel mit dem ursprünglichen Markdown, sodass Sie sich keine Sorgen machen müssen, wenn Ihr Text darin verfasst ist. Wenn Ihre MD-Datei jedoch in einem spezifischen Dialekt von Markdown geschrieben ist, lesen Sie das Handbuch zu Pandoc (man pandoc), stellen Sie sicher, dass Ihre Implementierung unterstützt wird, und passen Sie sie gegebenenfalls an. /usr/bin/md2pdf falls nötig.

Ein Skript für eine mehr oder weniger automatische Installation.

Wenn Sie nicht wirklich etwas konfigurieren möchten und eine Ubuntu-ähnliche Distribution haben, können Sie versuchen, ein Skript mit dem Inhalt unter dem Spoiler zu erstellen, und es wird wahrscheinlich alles selbst installiert; einzig das TeX-Template, das oben unter dem Spoiler bereitgestellt wird, müssen Sie selbst an die richtige Stelle kopieren. Öffnen Sie das Terminal und führen Sie aus:

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

Fügen Sie dann folgenden Inhalt ein:

Inhalt des Skripts $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

Führen Sie es mit dem Befehl aus:

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

Vergessen Sie nicht, dass /usr/share/texlive/template.tex die angegebene in Abschnitt „LaTeX-Vorlage zur Konvertierung von md2pdf“ mit Inhalt gefüllt werden muss.

Verwendung von md2pdf

Öffnen Sie einfach den Ordner mit der Markdown-Datei (some_file.md) im Terminal und führen Sie den Befehl aus:

user@hostname:~$ md2pdf some_file.md

Infolgedessen erscheint eine Datei im Ordner. some_file.md.pdf.

Fazit

Basierend auf der beschriebenen Methode können Sie jeden beliebigen Stil von PDF-Dateien erstellen. Außerdem können andere Formate anstelle von md konvertiert werden, alle von Pandoc unterstützten. Ich hoffe, dass diese Anleitung eines Tages wenigstens dreieinhalb Personen nützlich sein wird.

Quelle: habr.com

60GB SSD 8Gb DDR4